Step 12: Packaging Debug and Release¶
Note: This example is valid for single-configuration generators and will not work for multi-configuration generators (e.g. Visual Studio).
By default, CMake's model is that a build directory only contains a single configuration, be it Debug, Release, MinSizeRel, or RelWithDebInfo. It is possible, however, to setup CPack to bundle multiple build directories and construct a package that contains multiple configurations of the same project.
First, we want to ensure that the debug and release builds use different names for the libraries that will be installed. Let's use d as the postfix for the debug libraries.
Set CMAKE_DEBUG_POSTFIX
near the beginning of the top-level
CMakeLists.txt
file:
set(CMAKE_DEBUG_POSTFIX d)
add_library(tutorial_compiler_flags INTERFACE)
And the DEBUG_POSTFIX
property on the tutorial executable:
add_executable(Tutorial tutorial.cxx)
set_target_properties(Tutorial PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})
target_link_libraries(Tutorial PUBLIC MathFunctions tutorial_compiler_flags)
Let's also add version numbering to the MathFunctions
library. In
MathFunctions/CMakeLists.txt
, set the VERSION
and
SOVERSION
properties:
set_property(TARGET MathFunctions PROPERTY VERSION "1.0.0")
set_property(TARGET MathFunctions PROPERTY SOVERSION "1")
From the Step12
directory, create debug
and release
subdirectories. The layout will look like:
- Step12
- debug
- release
Now we need to setup debug and release builds. We can use
CMAKE_BUILD_TYPE
to set the configuration type:
cd debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build .
cd ../release
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build .
Now that both the debug and release builds are complete, we can use a custom
configuration file to package both builds into a single release. In the
Step12
directory, create a file called MultiCPackConfig.cmake
. In this
file, first include the default configuration file that was created by the
cmake
executable.
Next, use the CPACK_INSTALL_CMAKE_PROJECTS
variable to specify which
projects to install. In this case, we want to install both debug and release.
include("release/CPackConfig.cmake")
set(CPACK_INSTALL_CMAKE_PROJECTS
"debug;Tutorial;ALL;/"
"release;Tutorial;ALL;/"
)
From the Step12
directory, run cpack
specifying our
custom configuration file with the config
option:
cpack --config MultiCPackConfig.cmake