How to build VCMI (macOS)
Contents
Requirements
- C++ toolchain, either of:
- Xcode Command Line Tools:
sudo xcode-select --install
- Xcode IDE: https://developer.apple.com/xcode/
- (not tested) other C++ compilers, e.g. gcc/clang from Homebrew
- Xcode Command Line Tools:
- CMake:
brew install --cask cmake
or get from https://cmake.org/download/ - (optional) Ninja:
brew install ninja
or get from https://github.com/ninja-build/ninja/releases
Obtaining source code
Clone https://github.com/vcmi/vcmi with submodules. Example for command line:
git clone --recurse-submodules https://github.com/vcmi/vcmi.git
Obtaining dependencies
There're 2 ways to get dependencies automatically.
Conan package manager
That's what our CI uses.
- Install Conan
- Execute in Terminal:
conan profile new default --detect
- Download prebuilt libraries from GitHub Releases:
- if you're on an Intel Mac, download file intel.txz and unpack it to
~/.conan
directory. - if you're on an ARM Mac, download file intel-cross-arm.txz and unpack it to
~/.conan
directory. Then follow instructions how to build Qt host tools for ARM, on step 3 copy them to~/.conan/data/qt/5.15.5/_/_/package/SOME_HASH/bin
.
- if you're on an Intel Mac, download file intel.txz and unpack it to
- In Terminal
cd
to the source code directory and run:
USE_CONAN_WITH_ALL_CONFIGS=1 conan install . --install-folder=conan-generated --no-imports --build=never --profile:build=default --profile:host=CI/conan/PROFILE
where conan-generated can be any directory you like (Conan helper files will appear there) and PROFILE must be replaced with:
- if you're on an Intel Mac:
macos-intel
- if you're on an ARM Mac:
macos-arm
Homebrew
- Install Homebrew
- Install dependencies:
brew install boost ffmpeg@4 luajit minizip sdl2 sdl2_image sdl2_mixer sdl2_ttf tbb
- Install Qt dependency in either of the ways (note that you can skip this if you're not going to build Launcher):
-
brew install qt@5
for Qt 5 orbrew install qt
for Qt 6 - using Qt Online Installer - choose Go open source
-
Preparing build environment
This applies only to Xcode-based toolchain. If xcrun -f clang
prints errors, then use either of the following ways:
- select an Xcode instance from Xcode application - Preferences - Locations - Command Line Tools
- use
xcode-select
utility to set Xcode or Xcode Command Line Tools path: for example,sudo xcode-select -s /Library/Developer/CommandLineTools
- set
DEVELOPER_DIR
environment variable pointing to Xcode or Xcode Command Line Tools path: for example,export DEVELOPER_DIR=/Applications/Xcode.app
Configuring project for building
Note that if you wish to use Qt Creator IDE, you should skip this step and configure respective variables inside the IDE.
- In Terminal
cd
to the source code directory - Start assembling CMake invocation: type
cmake -S . -B BUILD_DIR
where BUILD_DIR can be any path, don't press Return - Decide which CMake generator you want to use:
- Makefiles: no extra option needed or pass
-G 'Unix Makefiles'
- Ninja (if you have installed it): pass
-G Ninja
- Xcode IDE (if you have installed it): pass
-G Xcode
- Makefiles: no extra option needed or pass
- If you picked Makefiles or Ninja, pick desired build type - either of Debug / RelWithDebInfo / Release / MinSizeRel - and pass it in
CMAKE_BUILD_TYPE
option, for example:-D CMAKE_BUILD_TYPE=Release
. If you don't pass this option,RelWithDebInfo
will be used. - If you don't want to run tests, pass
-D ENABLE_TEST=OFF
- If you don't want to build Launcher, pass
-D ENABLE_LAUNCHER=OFF
- You can also pass
-Wno-dev
if you're not interested in CMake developer warnings - Next step depends on the dependency manager you have picked:
- Conan: pass
-D CMAKE_TOOLCHAIN_FILE=conan-generated/conan_toolchain.cmake
where conan-generated must be replaced with your name choice at step 4 of #Conan package manager- If you're on an ARM Mac, also pass:
-D ENABLE_ERM=OFF -D ENABLE_LUA=OFF
- If you're on an ARM Mac, also pass:
- Homebrew: pass
-D "CMAKE_PREFIX_PATH=$(brew --prefix ffmpeg@4)"
- if you installed Qt 5 from Homebrew, append to the above option but before the closing quote:
;$(brew --prefix qt@5)
- if you installed Qt from Online Installer, append to the above option but before the closing quote your path to Qt directory, for example:
;/Users/kambala/dev/Qt-libs/5.15.2/Clang64
- example of what you should pass in the first case:
-D "CMAKE_PREFIX_PATH=$(brew --prefix ffmpeg@4);$(brew --prefix qt@5)"
- if you installed Qt 5 from Homebrew, append to the above option but before the closing quote:
- Conan: pass
- now press Return
Building project
You must also install game files to be able to run the built version, see Installation on macOS.
From Xcode IDE
Open VCMI.xcodeproj
from the build directory, select vcmiclient
scheme and hit Run (Cmd+R). To build Launcher, select vcmilauncher
scheme instead.
From command line
cmake --build <path to build directory>
- If using Makefiles generator, you'd want to utilize all your CPU cores by appending
-- -j$(sysctl -n hw.ncpu)
to the above - If using Xcode generator, you can also choose which configuration to build by appending
--config <configuration name>
to the above, for example:--config Debug
Packaging project into DMG file
After building, run cpack
from the build directory. If using Xcode generator, also pass -C <configuration name>
with the same configuration that you used to build the project.
Running VCMI
You can run VCMI from DMG, but it's will also work from your IDE be it Xcode or Qt Creator.
Alternatively you can run binaries directly from "bin" directory:
BUILD_DIR/bin/vcmilauncher BUILD_DIR/bin/vcmiclient BUILD_DIR/bin/vcmiserver
CMake include commands to copy all needed assets from source directory into "bin" on each build. They'll work when you build from Xcode too.
Some useful debugging tips
Anyone who might want to debug builds, but new to macOS could find following commands useful:
# To attach DMG file from command line use hdiutil attach vcmi-1.0.dmg # Detach volume: hdiutil detach /Volumes/vcmi-1.0 # To view dependency paths otool -L /Volumes/vcmi-1.0/VCMI.app/Contents/MacOS/vcmiclient # To display load commands such as LC_RPATH otool -l /Volumes/vcmi-1.0/VCMI.app/Contents/MacOS/vcmiclient
Troubleshooting
In case of troubles you can always consult our CI build scripts or contact the dev team via slack