4.7 KiB
CMake and Conan based build environment
Prerequisites
Building boxes requires two tools to be installed:
- Conan, a package manager for C/C++, is used to resolve required library and tool dependencies
- libunistring
- pcre2
- ncurses (official Conan 2 version should be available soon, see below)
- flex (library and tool)
- bison (tool)
- cmocka (for testing)
- CMake is used for building.
Make sure that a C compiler and the tools for the underlying build environment (e.g., GNU Make or Ninja) are installed.
If Conan is used for the first time, start with the creation of a default profile:
conan profile detect
Note that testing is currently only available in Linux or MSYS!
Building boxes
It is recommended to use the generated presets for building. For a debug build, follow these steps:
export BUILD_TYPE="Debug"
export BUILD_PRESET="conan-debug"
conan install . --output-folder=./build/${BUILD_TYPE} \
--settings build_type=${BUILD_TYPE} \
--build missing
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON --preset ${BUILD_PRESET}
cmake --build --preset ${BUILD_PRESET}
ctest --verbose --preset ${BUILD_PRESET}
Release build is similar:
export BUILD_TYPE="Release"
export BUILD_PRESET="conan-release"
conan install . --output-folder=./build/${BUILD_TYPE} \
--settings build_type=${BUILD_TYPE} \
--build missing
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON --preset ${BUILD_PRESET}
cmake --build --preset ${BUILD_PRESET}
ctest --verbose --preset ${BUILD_PRESET}
Of course the "classic" way works, too:
export BUILD_TYPE="Debug"
conan install . --output-folder=./build/${BUILD_TYPE} \
--settings build_type=${BUILD_TYPE} \
--build missing
cmake -S ./ -B ./build/${BUILD_TYPE} \
-DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake
cmake --build ./build/${BUILD_TYPE} \
--config ${BUILD_TYPE}
ctest --test-dir ./build/${BUILD_TYPE} --verbose
Installing boxes
First start with providing the Conan packages like described in the building boxes section. Then you
can do the following to install the boxes
:
...
export INSTALL_DIR="./dist"
cmake -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} --preset ${BUILD_PRESET}
cmake --build --preset ${BUILD_PRESET} --target install
${INSTALL_DIR}/bin/boxes --help
Packaging boxes
The installation process is used for packaging. So the same prerequisites as for installing boxes have to be fulfilled. To create boxes packages, do the following:
...
cmake -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} --preset ${BUILD_PRESET}
cmake --build --preset ${BUILD_PRESET} --target package
Notes
ncurses
The Conan ncurses
is in the last steps of being migrated from version 1 to version 2 (you can
track the status). Unfortunately this means, that it cannot
be used right out-of-the-box, and needs to be created into the local Conan cache manually first. Fortunately, it is
rather easy to do this by following these steps:
# Create a directory where the recipes files are stored
mkdir -p ncurses
pushd ncurses
# Download the required files
curl -LO https://raw.githubusercontent.com/valgur/conan-center-index/migrate/ncurses/recipes/ncurses/all/conandata.yml
curl -LO https://raw.githubusercontent.com/valgur/conan-center-index/migrate/ncurses/recipes/ncurses/all/conanfile.py
mkdir -p cmake
pushd cmake
curl -LO https://raw.githubusercontent.com/valgur/conan-center-index/migrate/ncurses/recipes/ncurses/all/cmake/conan-official-ncurses-targets.cmake
popd
# Build the package
conan create . --version 6.4 --settings build_type=Debug --build missing
conan create . --version 6.4 --settings build_type=Release --build missing
popd
Terminal issues
There may occur terminal issues originating from ncurses. In case boxes
is telling you something like terminals database is inaccessible
, try to set the following environment variables:
# On Linux and MacOS
export TERMINFO=/usr/share/terminfo
# On WSL2 (Windows)
export TERMINFO=/lib/terminfo
# In case it is still not working, try (or another term like `xterm` or `xterm-color`)
export TERM=xterm-256color
Finally, note that if boxes: Can't find config file.
the configuration file must be provided in an environment
variable or as command line parameter:
# boxes-config as parameter
echo "hello, world" | boxes -f boxes-config
# boxes-config as environment variable
export BOXES=boxes-config
echo "hello, world" | boxes