Conan is a package manager for C/C++. We provide prebuilt binary dependencies for some platforms that are used by our CI, but they can also be consumed by users to build VCMI. However, it's not required to use only the prebuilt binaries: you can build them from source as well.
The following platforms are supported and known to work, others might require changes to our conanfile.py or upstream recipes.
pip
like this: pip3 install 'conan<2.0'
conan profile new default --detect
If your platform is not on the list of supported ones or you don't want to use our prebuilt binaries, you can still build dependencies from source or try consuming prebuilt binaries from the central Conan repository - ConanCenter. In this case skip to the next section directly.
Check if your build environment can use the prebuilt binaries: basically, that your compiler version (or Xcode major version) matches the information below. If you're unsure, simply advance to the next step.
Download the binaries archive and unpack it to ~/.conan
directory from https://github.com/vcmi/vcmi-dependencies/releases/latest
~/.conan/data/qt/5.15.x/_/_/package
(5.15.x
is a placeholder) after unpacking the archive and build Qt from source. Alternatively, if you have (or are willing to build) Qt host tools for your platform, then simply replace those in the archive with yours and most probably it would work.Only if you have Apple Silicon Mac and trying to build for macOS or iOS:
~/.conan/data/qt/5.15.x/_/_/export/conanfile.py
(5.15.x
is a placeholder), search for string Designer
(there should be only one match), comment this line and the one above it by inserting #
in the beginning, and save the file.~/.conan/data/qt/5.15.x/_/_/package/SOME_HASH/bin
(5.15.x
and SOME_HASH
are placeholders). Make sure not to copy qt.conf
!Conan needs to generate CMake toolchain file to make dependencies available to CMake. See CMakeDeps
and CMakeToolchain
in the official documentation for details.
In terminal cd
to the VCMI source directory and run the following command. Also check subsections for additional requirements on consuming prebuilt binaries.
conan install . \ --install-folder=conan-generated \ --no-imports \ --build=never \ --profile:build=default \ --profile:host=CI/conan/PROFILE
The highlighted parts can be adjusted:
missing
to build recipes, that are not present in your local cache, from source.default
(your default profile).If you use --build=never
and this command fails, then it means that you can't use prebuilt binaries out of the box. For example, try using --build=missing
instead.
VCMI "recipe" also has some options that you can specify. For example, if you don't care about game videos, you can disable FFmpeg dependency by passing -o with_ffmpeg=False
. If you only want to make release build, you can use GENERATE_ONLY_BUILT_CONFIG=1
environment variable to skip generating files for other configurations (our CI does this).
Note: you can find full reference of this command in the official documentation or by executing conan help install
.
We use custom recipes for some libraries that are provided by the OS. You must additionally pass -o with_apple_system_libs=True
for conan install
to use them.
First, check if binaries for your platform are produced.
You must adjust the above conan install
command:
default
.-o default_options_of_requirements=True
: this disables all custom options of our conanfile.py
to match ConanCenter builds.This subsection describes platform specifics to build libraries from source properly.
compiler.cppstd=11
Conan setting (our profiles already contain it). To use it with another profile, either add this setting to your host profile or pass -s compiler.cppstd=11
on the command line.conan create
for all directories. Don't forget to pass -o with_apple_system_libs=True
to conan install
afterwards.Android has issues loading self-built shared zlib library because binary name is identical to the system one, so we enforce using the OS-provided library. To achieve that, follow below instructions, you only need zlib
directory.
Also, Android requires a few Qt patches. They are needed only for specific use cases, so you may evaluate whether you need them. The patches can be found here. To apply selected patch(es), let Conan finish building dependencies first. Then cd
to qtbase
source directory (e.g. ~/.conan/data/qt/5.15.14/_/_/source/qt5/qtbase
) and run patch -p1 < /path/to/patch
for each patch file (on Windows you'll need some sort of GNU environment like Git Bash to access patch
utility).
cd
to the package directory for that, e.g. ~/.conan/data/qt/5.15.14/_/_/package/SOME_HASH
.After applying patch(es):
cd
to qtbase/src/android/jar
in the build directory, e.g. ~/.conan/data/qt/5.15.14/_/_/build/SOME_HASH/build_folder/qtbase/src/android/jar
.make
qtbase/jar/QtAndroid.jar
from the build directory to the package directory, e.g. ~/.conan/data/qt/5.15.14/_/_/package/SOME_HASH/jar
.Note: if you plan to build Qt from source again, then you don't need to perform the above After applying patch(es) steps after building.
conan create PACKAGE vcmi/CHANNEL
, where PACKAGE
is a directory path in that repository and CHANNEL
is apple for macOS/iOS and android for Android. Do it for each library you need.conan install
to build all dependencies.You must pass the generated toolchain file to CMake invocation.
build-with-conan
preset. If you store Conan generated files in a non-default directory, define the path to the generated toolchain in toolchainFile
field (or CMAKE_TOOLCHAIN_FILE
cache variable) or include CMake presets file generated by Conan.--toolchain
option (available in CMake 3.21+) or CMAKE_TOOLCHAIN_FILE
variable.In these examples only the minimum required amount of options is passed to cmake
invocation, you can pass additional ones as needed.
conan install . \
--install-folder=conan-generated \
--no-imports \
--build=never \
--profile:build=default \
--profile:host=CI/conan/macos-intel \
-o with_apple_system_libs=True
cmake -S . -B build -G Xcode \
--toolchain conan-generated/conan_toolchain.cmake
If you also want to build the missing binaries from source, use --build=missing
instead of --build=never
.
conan install . \
--install-folder=~/my-dir \
--no-imports \
--build=never \
--profile:build=default \
--profile:host=default \
-o default_options_of_requirements=True
cmake -S . -B build \
-D CMAKE_TOOLCHAIN_FILE=~/my-dir/conan_toolchain.cmake
conan install . \
--install-folder=~/my-dir \
--no-imports \
--build=never \
--profile:build=default \
--profile:host=CI/conan/ios-arm64 \
-o with_apple_system_libs=True
cmake --preset ios-conan
CMakeUserPresets.json
file:
{
"version": 3,
"cmakeMinimumRequired": {
"major": 3,
"minor": 21,
"patch": 0
},
"configurePresets": [
{
"name": "ios-conan",
"displayName": "iOS",
"inherits": ["build-with-conan", "ios-device"],
"toolchainFile": "~/my-dir/conan_toolchain.cmake",
"cacheVariables": {
"BUNDLE_IDENTIFIER_PREFIX": "com.YOUR-NAME",
"CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM": "YOUR_TEAM_ID"
}
}
]
}
wsl --install
wsl --install -d Ubuntu
ubuntu
Next steps are identical both in WSL and in real Ubuntu 22.04
sudo pip3 install conan
sudo apt install cmake build-essential
sed -i 's/x86_64-w64-mingw32/i686-w64-mingw32/g' CI/mingw-ubuntu/before-install.sh
sed -i 's/x86-64/i686/g' CI/mingw-ubuntu/before-install.sh
sudo ./CI/mingw-ubuntu/before-install.sh
conan install . \
--install-folder=conan-generated \
--no-imports \
--build=missing \
--profile:build=default \
--profile:host=CI/conan/mingw32-linux \
-c tools.cmake.cmaketoolchain.presets:max_schema_version=2
cmake --preset windows-mingw-conan-linux
cmake --build --preset windows-mingw-conan-linux --target package
After that, you will have functional VCMI installer for 32-bit windows.