Compiling Mudlet
If you just want to use Mudlet, you can skip these steps, and use one of the already ready (pre-compiled) installers ready for download.
Otherwise, hop in for new adventure!
Key contributing information
Clang format is used to automatically format code submissions using the src/.clang-format style. See here how to enable clang-format with Qt Creator - and make sure to specify the 'File' option for the configuration style.
Branches:
development is the development branch where new features can go.
Workflow:
Fork and submit a PR with your changes (Github tutorial).
Here is a list of package versions delivered with different Linux distros. You may want to upgrade these: https://repology.org/project/mudlet/versions
Lua & Luarocks
Mudlet includes a Lua (version 5.1) scripting system for the end-user, which you, as a reader of this Wiki, may already be aware of! If not, you might wish to (after you have got your hands on a working Mudlet) take a look at Mudlet Lua API as that is the recommended place to find out the details of all the functions that Mudlet provides on top of the core Lua functionality.
Some of that ability comes from extra code that is not built-in to Lua but is in the form of external modules either in the form of script (text) files written in the Lua language itself or binary (library) files compiled from (usually but not exclusively 'C') source code. In order to have that functionality Mudlet makes use of several of these modules which can most readily (if not already available as "packages" for a particular Operating System) be obtained as rocks from the public Luarocks collection. Such a rock actually consists of a rockspec file that gives instructions to the Luarocks tool how to obtains the (source) code, compile it on any supported OS into the form that a Lua interpreter (including the one included in each running Mudlet profile) can use, and where and what it will be placed and called when it has been made. After that it should be available to Lua via the require command.
Anyone compiling Mudlet for themselves will find it desirable to ensure they have a usable Luarocks installation and have the lua-yajl module installed before commencing to compile Mudlet itself; this is because a Lua (version 5.1) interpreter and that module are used within the build process of making the executable code that is the Mudlet application.
Compiling
Compiling on Ubuntu
These instructions will get you setup compiling on Ubuntu. Need a hand? Join us on Mudlet's Discord or forums.
Ubuntu 22.04
Following instructions will work on Ubuntu 22.04 as well as all its flavours and derivatives (such as KDE Neon, for example) Important thing is to have Universe repository enabled in your package manager. (on Ubuntu you will have all the repositories that you need already enabled by default.)
1. necessary dependencies
Majority of required dependencies can be obtained from repositories, and can be installed with following command:
sudo apt install ubuntu-restricted-extras qtcreator build-essential git zlib1g-dev libhunspell-dev \ libpcre3-dev libzip-dev libboost-dev libboost-all-dev libyajl-dev libpulse-dev libpugixml-dev \ liblua5.1-0-dev lua-filesystem lua-zip lua-sql-sqlite3 luarocks ccache lua5.1 \ libglu1-mesa-dev mesa-common-dev libglib2.0-dev libgstreamer1.0-dev libqt5opengl5-dev \ qtmultimedia5-dev qttools5-dev qt5keychain-dev libsecret-1-dev \ libqt5texttospeech5-dev qtspeech5-flite-plugin qtspeech5-speechd-plugin \ qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtmultimedia5-dev
Few of required Lua modules are not available in official repositories, so they have to be installed using luarocks
sudo luarocks install lcf sudo luarocks install luautf8 sudo luarocks install lua-yajl sudo luarocks install lrexlib-pcre
2. obtaining the source code
Obtain the latest in-development code with:
git clone --recursive -b development https://github.com/Mudlet/Mudlet.git mkdir Mudlet/build cd Mudlet/build
3. compiling the code
There below are two ways to build with qmake, the first is for general use, the second is for developers:
qmake ../src/mudlet.pro
*OR*
qmake CONFIG+=debug ../src/mudlet.pro
Now finish compiling:
make -j `nproc`
4. installing compiled code
After successful code compilation, next few commands will install resulting binaries, desktop file for menus and appropriate icon.
sudo make install sudo cp ../mudlet.png /usr/share/pixmaps sudo cp ../mudlet.desktop /usr/share/applications
5. optional additional software
One of the major reasons for compiling Mudlet from source is the ability to unlock more features that are not enabled in official AppImage. Manual compilation will resolve the issues with sound by using system provided libraries, as well as enable more detailed theming of Mudlet application itself. However, do take note that Mudlet is a Qt based program, and that theming will not 'just work' in GTK based desktop environments (Gnome, XFCE, MATE, Budgie).
sudo apt install qt5ct
will install a tool for configuration of look and feel of Qt programs inside those desktop environments. Users of Qt based Desktop environments (KDE Plasma, LXQT) can simply use settings provided by environment itself.
Many of Qt widget styles and color schemes are available in official repositories, and will make Mudlet better.
6. Mudlet on Wayland
Mudlet compiled like this will run and work on Wayland, however, there are a few quirks with Keybidings (Numpad may not work as expected). Until that is resolved you may wish to start mudlet with:
QT_QPA_PLATFORM=xcb mudlet
(enter in terminal or simply change the Exec= line in /usr/share/applications/mudlet.desktop)
7. uninstallation
You can reverse the process described in this guide with following command:
sudo rm -fr /usr/bin/mudlet /usr/share/mudlet /usr/share/applications/mudlet.desktop /usr/share/pixmaps/mudlet.png
Other Ubuntu Versions
Most of the installation instructions for 22.04 should work for older versions as well. Of note is the required version of Qt, which is 5.14. If your used version of Ubuntu only supplies older Qt versions, have a look at Stephan Binner's PPAs, which supplies a whole range of packages for different Ubuntu versions. Be sure to read the installation and usage instructions as Qt is installed to /opt and requires sourcing a script to set up.
Compiling on Chrome OS
These instructions will get you setup compiling on Chrome OS. Need a hand? Join us on Mudlet's Discord or forums.
1. Install dependencies
sudo apt install git build-essential qt5-default qtmultimedia5-dev qttools5-dev \ lua5.1 liblua5.1-0-dev libpcre3-dev libboost-dev zlib1g-dev cmake \ libhunspell-dev lua-rex-pcre lua-sql-sqlite3 lua-filesystem lua-zip libyajl-dev \ libzip-dev libglu1-mesa-dev ccache libpugixml-dev mesa-common-dev qtcreator \ libpulse-dev libglib2.0-dev luarocks libboost-all-dev libsecret-1-dev \ ninja-build libsecret-1-dev sudo luarocks install luautf8 sudo luarocks install lua-yajl
3. Get Mudlet source
git clone --recursive https://github.com/Mudlet/Mudlet.git mudlet
4. Create a build directory
cd mudlet mkdir build && cd build
5. Run the following command
cmake .. -G Ninja
then:
ninja
5. Start the application you have just compiled - enjoy
src/mudlet
Note: Did ninja
fail with c++: fatal error: Killed signal terminated program cclplus
? Try again with ninja -j 2
Compiling on macOS
These instructions will get you setup compiling on macOS. Need a hand? Join us on Mudlet's Discord server or forums otherwise.
1. Install prerequisites
Install XCode, command line tools for XCode, and HomeBrew.
Once everything is installed, do:
brew doctor brew update brew install git
2. Get Mudlet source
git clone --recursive https://github.com/Mudlet/Mudlet.git
3. Go to the parent of the mudlet "src" folder and create (if necessary) a build subdirectory (this is so that we can build out of source which keeps the source code clean)
cd Mudlet && mkdir build
3. Setup your environment
./CI/travis.osx.before_install.sh ./CI/travis.osx.install.sh
luarocks config lua_version 5.1 eval `luarocks path --lua-version=5.1`
For the following, one may have to add _DIR="/opt/homebrew/"
such as PCRE_DIR="/opt/homebrew/"
or ZIP_DIR="/opt/homebrew/"
if the installation could not find header files.
luarocks --lua-version=5.1 --lua-dir=`brew --prefix lua@5.1` install lrexlib-pcre PCRE_DIR=`brew --prefix pcre` brew install sqlite luarocks --lua-version=5.1 --lua-dir=`brew --prefix lua@5.1` install luasql-sqlite3 SQLITE_DIR=`brew --prefix sqlite` luarocks --lua-version=5.1 --lua-dir=`brew --prefix lua@5.1` install luautf8 luarocks --lua-version=5.1 --lua-dir=`brew --prefix lua@5.1` install lua-yajl YAJL_LIBDIR=`brew --prefix yajl` luarocks --lua-version=5.1 --lua-dir=`brew --prefix lua@5.1` install luafilesystem luarocks --lua-version=5.1 --lua-dir=`brew --prefix lua@5.1` install lua-zip ZIP_DIR=`brew --prefix libzip`
brew install p7zip export BOOST_ROOT="$(pwd)/../Mudlet/3rdparty/boost" export BOOST_URL="https://sourceforge.net/projects/boost/files/boost/1.72.0/boost_1_72_0.tar.bz2/download" mkdir -p $BOOST_ROOT curl --progress-bar --location --output $BOOST_ROOT/download.tar.bz2 $BOOST_URL 7z -o$BOOST_ROOT x $BOOST_ROOT/download.tar.bz2 -y -bd 7z -o$BOOST_ROOT x $BOOST_ROOT/download.tar -y -bd cd $BOOST_ROOT && cp -r boost_*/* . rm -rf boost_*/* download.tar.bz2 download.tar
OK to answer yes to delete files if prompted for the rm
command above.
4. Run the following commands
cd ../../build cmake ../../Mudlet -DCMAKE_PREFIX_PATH=`brew --prefix qt5` make -j `sysctl -n hw.ncpu`
5. Enjoy
The mudlet.app is now available in src/
for launching:
open src/Mudlet.app
6. Qt Creator setup
No Lua installation is found, despite it existing on your system? Launch Qt Creator by doing open /Applications/Qt Creator.app
(location depends on how you installed it).
Receiving a No rule to make target ... libQt5UiTools_debug.a
error? A workaround is to symlink a file.
Mudlet in Qt Creator is not launching due to dyld: Symbol not found: __cg_jpeg_resync_to_restart
? See here for a workaround.
7. Troubleshooting
If you exhaust all efforts to get YAJL to compile on your local system with homebrew, clone from the YAJL repository then ./configure && sudo make install
.
Compiling on Debian 'Sid'
1. Install required packages from main repo.
sudo apt-get install build-essential git liblua5.1-dev zlib1g-dev libhunspell-dev libpcre3-dev \ libzip-dev libboost-dev libyajl-dev libpulse-dev lua-rex-pcre lua-filesystem lua-zip \ lua-sql-sqlite3 qt5-default qtmultimedia5-dev qttools5-dev luarocks ccache libpugixml-dev
sudo luarocks install luautf8 sudo luarocks install lua-yajl
2. Grab latest Mudlet source.
mkdir ~/projects && cd ~/projects && git clone --recursive https://github.com/Mudlet/Mudlet.git mudlet
3. Build Mudlet.
cd ~/projects/mudlet/src
qmake
make
sudo make install
Compiling on Debian 11 'Bullseye'
1. Install required packages.
sudo apt-get install build-essential git liblua5.1-dev zlib1g-dev libhunspell-dev libpcre3-dev \ libzip-dev libboost-dev libyajl-dev libpulse-dev lua-rex-pcre lua-filesystem lua-zip \ lua-sql-sqlite3 qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtmultimedia5-dev \ qttools5-dev luarocks ccache libpugixml-dev libqt5texttospeech5-dev qtspeech5-flite-plugin \ qtspeech5-speechd-plugin libqt5opengl5-dev ninja-build cmake libsecret-1-dev
sudo luarocks install luautf8 sudo luarocks install lua-yajl
2. Get Mudlet source.
mkdir ~/source && cd ~/source
git clone --recursive https://github.com/Mudlet/Mudlet.git
Note: the line above will check out `development` branch source code, and this might not always be stable. You can check out the latest release source code using this command:
git clone --recursive --branch main https://github.com/Mudlet/Mudlet.git
3. Build Mudlet.
mkdir ~/source/Mudlet/build && cd ~/source/Mudlet/build
qmake ../src/mudlet.pro
make -j `nproc`
sudo make install
After these steps you can run Mudlet by typing:
mudlet
Compiling on Raspberry Pi OS
These instructions will get you compiling and running Mudlet on Raspberry Pi OS (Buster). Need a hand? Join us on Mudlet's Discord or forums.
1.a Install apt dependencies
sudo apt-get update sudo apt-get install build-essential git liblua5.1-dev zlib1g-dev libhunspell-dev libpcre3-dev \ libzip-dev libboost-graph-dev libyajl-dev libpulse-dev lua-rex-pcre lua-filesystem lua-zip \ lua-sql-sqlite3 qt5-default qtmultimedia5-dev qttools5-dev luarocks ccache libpugixml-dev cmake
1.b Install luarocks dependencies
sudo luarocks install luautf8 sudo luarocks install lua-yajl YAJL_LIBDIR=`find /usr -name "libyajl.so" -printf '%h\n'` YAJL_INCDIR=/usr/include
2. Get Mudlet source
mkdir ~/source && cd ~/source git clone --recursive -b development https://github.com/Mudlet/Mudlet.git
3. Create a build directory
cd Mudlet && mkdir build && cd build
4. Run the following commands to build
WITH_UPDATER=NO WITH_3DMAPPER=NO qmake ../src/mudlet.pro
- If you get a response along the lines of:
qmake: could not find a Qt installation of
- then you likely have qtchooser present in your system that allows for both Qt4 and Qt5 (or more than one Qt5 version) and it modifiers qmake and some other Qt development programs to take an additional argument to specify which version to use. In that case you should use:
WITH_UPDATER=NO WITH_3DMAPPER=NO qmake -qt=qt5 ../src/mudlet.pro
THEN:
- For the fastest compile time while still being able to use the system at all (~35min on a RPi4 with 4GB of ram)
make -j $(expr `nproc` - 1)
OR:
- Use this if you have an older Raspberry Pi. Be prepared for it to take a while (over an hour) - it is not recommended to try to more than one compilation task at a time on the older systems with the -j option as they will only have a system memory with enough space for one of some of those tasks:
make
4. Install the application you have just compiled
sudo make install
5. Enjoy!
# mudlet is in the path, can just run it mudlet
Compiling on ArchLinux
Mudlet is available in the Arch User Repository.
To install it use your favourite AUR helper (helper tool will automatically resove dependancies); example using yay :
yay -S mudlet
For more info on this process, visit Arch User Repository - ArchWiki.
Note: For the most recent development version of Mudlet, replace 'mudlet' with 'mudlet-git' in the above commands and proceed as described.
Built in fonts have been disabled, but are available in packages listed as optional dependancies.
Discord support in Mudlet depends on an extrenal library provided by discord-rpc-api, which is also available in AUR, choose whichever variant suits you best.
Compiling on Gentoo
An overlay containing Mudlet is available for compiling Mudlet on Gentoo.
Compiling on Windows
These instructions will get you setup compiling on Windows.
Need a hand? Join us on the Mudlet Discord server or forums.
1. Download Mudlet source code
- Install Github Desktop.
- Clone (instructions) Mudlet's repository to your local drive.
Note: You must use a location on C:\
without any spaces in folder names!
2. Perform a one-time setup
Right-click on setup-windows-sdk.ps1
and select Run with PowerShell
. This will automatically download all of the requires tools (including Python 2) and libraries, set them up for you, build Mudlet, and launch it! If this script exits immediately, please upgrade your PowerShell version first.
Note: Depending on your Internet connection and computer speed, this one-time setup will take 30 minutes or more - so grab a cup of tea or coffee.
During the installation, you'll see the Qt installer window pop-up - this is normal:
The Qt installer might ask you about your data collection preferences - answer as you wish and the automated install will continue:
The installer's final step will be compiling all of the source code, which looks like this:
After it's all done, a Mudlet version ending in "-dev" will launch automatically:
If something didn't work right, you can check out the verbose log that is available at C:\src\verbose_output.log
.
Coding on Mudlet
Open C:\<path to repository>\src\mudlet.pro
in Qt Creator, which resides here: C:\Qt\Tools\QtCreator\bin\qtcreator.exe
. Then enable Debug and Release builds and hit Configure Project:
Press Ctrl+5
and update project settings. Check how many logical processors are available in your system with the Task Manager:
And set this amount in Qt Creator:
Hit run:
Click on Compile Output to see progress on compiling:
When it's all ready, the new Mudlet with your changes will launch. You're all done!
Contributing changes
Once you're all done with your changes, contribute them to Mudlet using a pull request. Thanks for improving open-source!
Uninstalling
To get rid of everything, remove the following folders:
C:\Libraries C:\LuaRocks C:\MinGW C:\Python27 C:\Qt C:\src
Compiling on Github Codespaces
Github Codespaces allow you to code and run Mudlet all from the browser - makes it a lot easier to get started. It also allows you to code Mudlet itself from any computer in the world!
1. Create a new codespace
Create a new Codespace by going to https://github.com/Mudlet/Mudlet using Google Chrome or Microsoft Edge (Firefox at the time of the writing doesn't have working copy/paste). There, click the green "Code" button, select the "Codespaces" tab and click "New codespace".
2. Wait for it to load
This will take a while (~5min) so grab a tea:
3. Connect to the environment
Go to the Ports
section at the bottom and change the Port Privacy of the Open Mudlet port to Public:
Then connect to your online Linux desktop with mudlet
as the password by clicking on the web icon.
In case it can't connect, make sure the port privacy is set to Public
. If it still can't connect, try 4-5 more times - eventually it'll work.
We chose a retro 90's look here to fit with the whole hacking theme, so if you see this you're good 😉
4. Build Mudlet
In Codespaces, hit F7
and select Let CMake guess...
It will then start building Mudlet automatically. Using the Basic instance (only kind available in beta) the first-time build will take ~25min, so take a break here - you've made excellent progress. All follow-up compiles after this will be quicker, by the way.
5. Run Mudlet
Hit the little play button at the bottom of the screen, and Mudlet will now launch in the remote connection tab. Not working? We can help. Otherwise, enjoy!
Note: When the codespace is unused for a while, it will disconnect. It'll never disconnect while you're actively using it. See Github issue for details.
Developing with Docker
Docker is a system designed for more reproducible and isolated builds. A docker setup exists and has been tested using Pop OS! 20.04 (which is derived from Ubuntu 20.04). First, follow the instructions to install both docker and docker-compose.
Clone the development branch
git clone --recursive -b development https://github.com/Mudlet/Mudlet.git cd Mudlet/docker
Make a local copy of the .env.template file:
cp .env.template .env
If you wish to customize things like the number of cores to use for building mudlet, feel free to change the corresponding values in the .env file.
To run Qt-Creator and develop Mudlet, run docker-compose up dev
.
To run Mudlet, run docker-compose up mudlet
. Note: At the moment, the mudlet build will not persist settings past container rebuilds.
Compiling on Windows 7+ (MSYS2 Alternative)
INCOMPLETE, IN PROGRESS
Go to http://www.msys2.org/ to download the 64 bit MSYS2 installer (as of 2020/05/24 32 bit hosts - for compiling software, but not for using code built with it have been deprecated, the last installer for that 32-bit systems is held at: http://repo.msys2.org/distrib/i686/msys2-i686-20200517.exe) and follow the installation instructions (Steps 1 to 8 on that page), these instructions assume that "C:\msys64" or "C:\msys32" is used depending on the bitness of the system it is being installed on.
Install the following packages (using "pacman -S packageName"), the ones with a -i686- in the middle are the ones for 32-bit (i686) targets and -x86_64- are the ones for 64-bit targets - it is possible to install both for building Mudlet for target PCs of both bitnesses on a 64-bit host, it is not clear whether the reverse is true with a 32-bit host. These will pull in a number of other required packages as well (the --needed option prevents the re-installation of packages that have already been installed by MSYS2/Mingw-w64's own setup/installation process) - as some of the packages, e.g. base-devel are actually groups you will be requested to select which members of that group are actually required, it is easiest to just go with the default which is to install ALL of the packages in that group!
- For 32-Bit Mudlet builds:
MSYS user@computer ~ $ pacman -S --needed base-devel git mercurial cvs wget ruby zip p7zip python mingw-w64-i686-toolchain mingw-w64-i686-qt-creator mingw-w64-i686-qt5-multimedia mingw-w64-i686-libzip mingw-w64-i686-pugixml mingw-w64-i686-lua51 mingw-w64-i686-lua51-lpeg mingw-w64-i686-lua51-lsqlite3 mingw-w64-i686-hunspell mingw-w64-i686-boost mingw-w64-i686-yajl mingw-w64-i686-clang mingw-w64-i686-cmake mingw-w64-i686-SDL unzip
- For 64-Bit Mudlet builds:
MSYS user@computer ~ $ pacman -S --needed base-devel git mercurial cvs wget ruby zip p7zip python mingw-w64-x86_64-toolchain mingw-w64-x86_64-qt-creator mingw-w64-x86_64-qt5-multimedia mingw-w64-x86_64-libzip mingw-w64-x86_64-pugixml mingw-w64-x86_64-lua51 mingw-w64-x86_64-lua51-lpeg mingw-w64-x86_64-lua51-lsqlite3 mingw-w64-x86_64-hunspell mingw-w64-x86_64-boost mingw-w64-x86_64-yajl mingw-w64-x86_64-clang mingw-w64-x86_64-cmake mingw-w64-x86_64-SDL unzip
- The *-zziplib libraries are used by the luazip luarock {from the Kepler project} but Mudlet will work perfectly well with the alternative lua-zip {from the brimworks GitHub repository - which also provides the lua-yajl rock} which does not require this library - although it is possible that it might still be pulled into the system as a dependency of another MSYS2 package.
- Note that this will install the MSYS2 builds of the Qt Libraries and Creator IDE - THE ON/OFF-LINE INSTALLER OF THE QT LIBRARIES AND CREATOR VIA DOWNLOADS FROM QT ARE NOT USEFUL IN THIS SETUP!
Attention - Luarocks packages problem Recently the Luarocks project attempted to adopt the MSYS2/Mingw-w64 platform as one it would supported natively and the MSYS2/Mingw-w64 project went and upgraded its luarocks packages to make use of the changes and also on-board other improvements (and the version number increased from 2.4.4-2 to 3.5.0-1) unfortunately this completely broke them and although the issue has been reported (MSYS2 Issue 9037) a fix has not yet materialised. The only way to work around this in the meantime is to download the older package (with wget) and install it manually (with pacman -U): For 32-Bit Mudlet builds: MSYS user@computer ~ $ wget https://repo.msys2.org/mingw/mingw32/mingw-w64-i686-lua51-luarocks-2.4.4-2-any.pkg.tar.zst --2021-07-07 22:19:09-- https://repo.msys2.org/mingw/mingw32/mingw-w64-i686-lua51-luarocks-2.4.4-2-any.pkg.tar.zst Resolving repo.msys2.org (repo.msys2.org)... 178.63.98.68 Connecting to repo.msys2.org (repo.msys2.org)|178.63.98.68|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 97905 (96K) [application/octet-stream] Saving to: ‘mingw-w64-i686-lua51-luarocks-2.4.4-2-any.pkg.tar.zst’ mingw-w64-i686-lua51-luarocks-2.4.4-2- 100%[===========================================================================>] 95.61K --.-KB/s in 0.07s 2021-07-07 22:19:10 (1.43 MB/s) - ‘mingw-w64-i686-lua51-luarocks-2.4.4-2-any.pkg.tar.zst’ saved [97905/97905] MSYS user@computer ~ $ pacman -U mingw-w64-i686-lua51-luarocks-2.4.4-2-any.pkg.tar.zst loading packages... resolving dependencies... looking for conflicting packages... Packages (1) mingw-w64-i686-lua51-luarocks-2.4.4-2 Total Installed Size: 0.46 MiB :: Proceed with installation? [Y/n] y (1/1) checking keys in keyring [#####################################################] 100% (1/1) checking package integrity [#####################################################] 100% (1/1) loading package files [#####################################################] 100% (1/1) checking for file conflicts [#####################################################] 100% (1/1) checking available disk space [#####################################################] 100% :: Processing package changes... (1/1) installing mingw-w64-i686-lua51-luarocks [#####################################################] 100% MSYS user@computer ~
For 64-Bit Mudlet builds: MSYS user@computer ~ $ wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-lua51-luarocks-2.4.4-2-any.pkg.tar.zst --2021-07-07 22:17:32-- https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-lua51-luarocks-2.4.4-2-any.pkg.tar.zst Resolving repo.msys2.org (repo.msys2.org)... 178.63.98.68 Connecting to repo.msys2.org (repo.msys2.org)|178.63.98.68|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 97935 (96K) [application/octet-stream] Saving to: ‘mingw-w64-x86_64-lua51-luarocks-2.4.4-2-any.pkg.tar.zst’ mingw-w64-x86_64-lua51-luarocks-2.4.4- 100%[===========================================================================>] 95.64K --.-KB/s in 0.07s 2021-07-07 22:17:32 (1.28 MB/s) - ‘mingw-w64-x86_64-lua51-luarocks-2.4.4-2-any.pkg.tar.zst’ saved [97935/97935] MSYS user@computer ~ $ pacman -U mingw-w64-x86_64-lua51-luarocks-2.4.4-2-any.pkg.tar.zst loading packages... resolving dependencies... looking for conflicting packages... Packages (1) mingw-w64-x86_64-lua51-luarocks-2.4.4-2 Total Installed Size: 0.46 MiB :: Proceed with installation? [Y/n] y (1/1) checking keys in keyring [#####################################################] 100% (1/1) checking package integrity [#####################################################] 100% (1/1) loading package files [#####################################################] 100% (1/1) checking for file conflicts [#####################################################] 100% (1/1) checking available disk space [#####################################################] 100% :: Processing package changes... (1/1) installing mingw-w64-x86_64-lua51-luarocks [#####################################################] 100% MSYS user@computer ~
Warning for those planning to build both 32 and 64 bit versions If one is planning to build both bitness binaries an additional step is necessary as, by default, the MSYS2/Mingw-w64 luarocks setup seems to place any .lua or .dll modules it builds/installs on a per user (the so-called local basis) into the same directories with the same names. This is no good for two reasons: - It is difficult to work out which bitness a particular module is for and whilst 32-bit modules might work in a 64-bit environment the reverse is definitely not the case
- It confuses the Luarocks package management systems (as effectively there will be two different luarocks systems operated side-by-side)
This can be worked around by:
- Editing the .\etc\luarocks\config-5.1.lua for each bitness so that the rocks_trees table entry for the user key is changed from this in both files:
{ name = [[user]], root = home..[[/.luarocks]] },
to something different for each of them, say, for example, for the the 64-bit one:
{ name = [[user]], root = home..[[/.luarocks-x64]] },
- Then by specifying the rocktree name (user) on the command line when installing or building a luarock with the --tree user argument - note that for some inexplicable reason the --local argument that should do the same thing does not seem to work for these two actions, it is not clear whether this is a MSYS2/Mingw-w64 specific issue or it goes further upstream to Luarocks in general. Thus, in the next step it will be necessary to change from using:
MINGW64 user@computer ~ $ luarocks install --local rockname
to, for the example given:
MINGW64 user@computer ~ $ luarocks install --tree user rockname
where user is the literal string "user" to match the Lua table key in the rock_trees and not, in this case, a representation of the user-name/account of the person performing the action.
From the Windows Start menu start a shell appropriate for the target with the bitness to be built for i.e. "MSYS2 Mingw 32-Bit" or "MSYS2 Mingw 64-Bit". This will likely position the current directory to the root directory of the MSYS2 environment, the text about the prompt line (the one with the "$") will contain three different bits of colored text username@computername; one of MSYS2/MINGW32/MINGW depending on the type of shell you currently in use and / representing the root directory (which will actually be the directory MSYS2 was installed to, for example on the author's system this is "C:/msys64"). Change to the home directory in MYSY by entering "cd" on its own with no argument (it will show up as ~ and it would work out to be, for user to be c:/msys64/home/user or c:/msys32/home/user (if both bitnessess are to be built it will be necessary to repeat the following step twice, one for each and also observe the steps in the above warning) install the following luarocks:
rockname lrexlib-pcre lua-yajl luafilesystem luasql-sqlite3 luautf8 luazip or lua-zip
by using:
MINGW64 user@computer ~ $ luarocks install [--local] rockname
The --local argument is an optional one that causes the luarock and the lua module to be installed on a per-user basis rather than on a system wide one, this may be important if the PC is used by multiple users and more than one of them uses Lua in any form.
Now create somewhere to work on the Mudlet source, assuming that other software coding with other pieces of software will be done, create a sub-directory in the home directory, and then make one just for Mudlet under that:
MINGW64 user@computer ~ $ mkdir ./src MINGW64 user@computer ~ $ mkdir ./src/mudlet
Change to that directory and get the source code:
MINGW64 user@computer ~ $ cd ./src/mudlet MINGW64 user@computer ~/src/mudlet $ git clone git://github.com/Mudlet/Mudlet.git .
If you are planning to contribute to the Mudlet code you will want to visit Github and create your own GitHub repository, you can then push commits (changes to the code) to there and raise a Pull Request for a Mudlet Maker to drag the changes over to the above repository. You will want to add your repository and perhaps those of some other contributors so you can track what they are doing and see/try/experiment with their PRs before they get merged. Therefore you will want to add some other repositories into the mix. The names you use to identify those other repositories will show up in any utility that works with the repository you have just created in the above "clone" operation and can be anything you like but it makes sense to have clear names. So to add "myName", and those of the leading active contributors to the Mudlet codebase you will use:
MINGW64 user@computer ~/src/mudlet $ git remote add Mine https://github.com/myName/Mudlet.git MINGW64 user@computer ~/src/mudlet $ git remote add Vadim https://github.com/vadi2/Mudlet.git MINGW64 user@computer ~/src/mudlet $ git remote add SlySven https://github.com/SlySven/Mudlet.git MINGW64 user@computer ~/src/mudlet $ git remote add Kebap https://github.com/Kebap/Mudlet.git
Now obtain all the versions of the code with:
MINGW64 user@computer ~/src/mudlet $ git fetch --all
This will produce a lot of lines of output the first time and it might take a little while on a slow connection...
{Section missing - it turns out that the default GUI git tools that the author of this section would normally use: "gitk" and "git gui" have some problems in the versions currently supplied from the MSYS2 system - and it was necessary to import them from the set that the Git4Win have patched - see https://github.com/git-for-windows/git/wiki/Install-inside-MSYS2-proper }
Some modifications to the qmake/cmake project files are needed and these are now supported in the main development branch in the upstream {the Mudlet organisation's own GitHub repository} which requires that there is an environmental variable WITH_MAIN_BUILD_SYSTEM and it is set to the (case-insensitive) value NO:
MINGW64 user@computer ~/src/mudlet $ export WITH_MAIN_BUILD_SYSTEM=NO
Also the MINGW_BASE_DIR environmental variable will need to be set to the root directory for the MINGW-W64 installation for the appropriate bitness of the target to be made. For building on a 64-Bit Host {the PC that is compiling the code} to make a 64-Bit application this will likely be C:/msys64/mingw64 and for a 32-Bit application it will probably be C:/msys64/ming32.
- E.g.
MINGW64 user@computer ~/src/mudlet $ export MINGW_BASE_DIR=C:/msys64/mingw64 # To build a 64-Bit Application with a 64-Bit system
- Or:
MINGW32 user@computer ~/src/mudlet $ export MINGW_BASE_DIR=C:/msys64/mingw32 # To build a 32-Bit Application with a 64-Bit system
Now checkout a branch {ideally, if working on solving a new issue, or adding a feature or resolving a bug, one should create a new branch that is a copy of the current, upstream development branch} and then work on it with Qt Creator:
MINGW64 user@computer ~/src/mudlet $ qtcreator &
Load in the mudlet.pro qmake project file in the src subdirectory (e.g. for this example: c:/msys64/home/user/src/mudlet/src/mudlet.pro) and get hacking...
Setting up IDEs
CLion
Qt not detected
If you'd like to use CLion and it is giving the following error:
By not providing "FindQt5Core.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "Qt5Core", but CMake did not find one. ...
You can fix this by setting -DCMAKE_PREFIX_PATH=<your Qt + version + compiler location>
. For example: -DCMAKE_PREFIX_PATH=/media/vadi/SSDer/Programs/Qt/5.15.2/gcc_64/
CLion setup on Windows
After running setup-windows-sdk.ps1
make sure to set Cmake options to:
-DCMAKE_PREFIX_PATH=C:\Qt\Tools\mingw730_32;C:\Qt\5.14.2\mingw73_32 -DBoost_INCLUDE_DIR=C:\Libraries\boost_1_71_0
Directories might vary slightly, when different Qt, Boost or MinGW version will be used.
You will need 32 bit version of MinGW. Set it in the Toolset
field to:
C:\Qt\Tools\mingw730_32
Directory may be slightly different if MinGW version used will change.
Clang Tidy
Ensure that CLion is set to run the project's .clang-tidy checks with the Prefer .clang-tidy files over IDE settings
option:
This helps us catch any issues just a bit earlier.
Clang Format
Ensure that CLion is set to use the .clang-format
formatting style:
This helps keep the look'n'feel of the source code in a consistent manner, even with many people contributing to Mudlet.
Visual Studio Code
To set the path in Visual Studio Code, open settings, search for cmake environment
and set the CMAKE_PREFIX_PATH
to your path, such as /media/vadi/SSDer/Programs/Qt/5.14.1/gcc_64/
:
Clang Tidy
clang-tidy catches common programming issues, run it by selecting 'Analysis' from the command palette (Ctrl+Shift+P by default):
It is also possible check status of analysis and cancel if needed.
Checking memory leaks & other issues (sanitizers)
Besides clang-tidy, it's also possible to enable clang sanitizers to double-check for issues:
- LeakSanitizer for detecting memory leaks
- AddressSanitizer for detecting most issues dealing with memory, such as out of bounds accesses to heap, stack, global and more
- UndefinedBehaviourSanitizer for detecting the use of various features of C/C++ that are explicitly listed as resulting in undefined behaviour (such as using misaligned or null pointer, conversion to, from, or between floating-point types which would overflow the destination, division by zero, etc)
- MemorySanitizer for detecting reading uninitialised memory
- ThreadSanitizer for detecting threading issues
To use the sanitisers, set the USE_SANITIZER
CMake variable to one or several variables (separate by comma): Address
, Memory
, MemoryWithOrigins
, Undefined
, Thread
, or Leak
To use them in VSCode, set the cmake.configureSettings
variable:
Not all sanitisers can be used with each other - in that case the cmake configuration won't allow you to continue.
Qt Creator
Clang Tidy and Clazy
Configure Mudlet-specific checks for clang-tidy and clazy tools help catch any issues early on. See Qt Creator's instructions for setting this up - clang-tidy can use the .clang-tidy
file that's available at the root of the repository, and for clazy enable level0
and level1
checks.
Checking memory leaks & other issues (sanitizers)
Besides clang-tidy, it's also possible to enable clang sanitizers to double-check for issues:
- LeakSanitizer for detecting memory leaks
- AddressSanitizer for detecting most issues dealing with memory, such as out of bounds accesses to heap, stack, global and more
- UndefinedBehaviourSanitizer for detecting the use of various features of C/C++ that are explicitly listed as resulting in undefined behaviour (such as using misaligned or null pointer, conversion to, from, or between floating-point types which would overflow the destination, division by zero, etc)
- MemorySanitizer for detecting reading uninitialised memory
- ThreadSanitizer for detecting threading issues
To use the sanitisers, set the USE_SANITIZER
CMake variable to one or several variables (separate by comma): Address
, Memory
, MemoryWithOrigins
, Undefined
, Thread
, or Leak
To use them in Qt creator, head to Projects
- Build
:
Not all sanitisers can be used with each other - in that case the cmake configuration won't allow you to continue.
Clang Format
Ensure that Qt Creator is set to use the .clang-format
formatting style in the C++ settings. Turn on Format instead of indenting
for Ctrl+I
to format code, and ensure Override Clang Format configuration file
is disabled:
This helps keep the look'n'feel of the source code in a consistent manner, even with many people contributing to Mudlet.
Building with multiple versions of Lua
Mudlet uses Lua 5.1 only, so if you are compiling on a system that also has later versions installed, you might get the following error: ‘LUA_GLOBALSINDEX’ was not declared in this scope
.
To fix this, pass the path to Lua headers explicitly. For CMake: -DLUA_INCLUDE_DIR=/usr/include/lua5.1
(adjust as needed).