'CPACK: How to separate artifacts per defined COMPONENT
I develop multiple applications in a single repository.
Use CPACK to package each component, but depending on the compression format, it may or may not work as expected.
The expected packaging is: deb, rpm Not packaged as expected: zip, tar.gz, etc.
$ tree . -L 3
.
├── apps
│ ├── CMakeLists.txt // No.1
│ ├── application1
│ │ ├── CMakeLists.txt // No.2
│ │ ├── files
│ │ └── src
│ ├── application2
│ │ ├── CMakeLists.txt // No.3
│ │ ├── files
│ │ └── src
No.1 : Top level CMakeLists.txt
...
# Cpack
set(_fmt TGZ)
if(WIN32)
set(_fmt ZIP)
endif()
set(CPACK_GENERATOR ${_fmt})
set(CPACK_SOURCE_GENERATOR ${_fmt})
set(CPACK_VERBATIM_VARIABLES YES)
set(CPACK_PACKAGE_NAME ${project_name})
set(CPACK_SET_DESTDIR TRUE)
set(CPACK_PACKAGE_RELOCATABLE ON)
set(CPACK_DEB_COMPONENT_INSTALL YES)
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64")
set(CPACK_COMPONENTS_GROUPING ONE_PER_GROUP) // HERE is the setting for packaging per component
cpack_add_component(application1 GROUP application1)
cpack_add_component(application2 GROUP application2)
cpack_add_component_group(application1)
cpack_add_component_group(application2)
...
get_cmake_property(CPACK_COMPONENTS_ALL COMPONENTS)
message(STATUS "CPACK_COMPONENTS_ALL:${CPACK_COMPONENTS_ALL}")
No.2/3 : Application level CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
get_filename_component(PROJECTNAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)
project(${PROJECTNAME} VERSION 1.0.0 LANGUAGES CXX)
add_executable(${PROJECTNAME}
${CMAKE_CURRENT_SOURCE_DIR}/src/main-1.cpp
)
install(
TARGETS
${PROJECTNAME}
DESTINATION bin
COMPONENT
${PROJECTNAME}
)
install(
FILES
${CMAKE_CURRENT_SOURCE_DIR}/files/config1
DESTINATION
etc
COMPONENT
${PROJECTNAME}
)
OUTPUT: CPack recognize each Component
$ cmake ..
...
-- CPACK_COMPONENTS_ALL:application1;application2
...
Next Generate Package: OUTPUT: DEB packaging: Artifact is separated per component
$ cpack -G DEB
CPack: Create package using DEB
CPack: Install projects
CPack: - Run preinstall target for: apps
CPack: - Install project: apps []
CPack: - Install component: application1
CPack: - Install component: application2
CPack: Create package
-- CPACK_DEBIAN_PACKAGE_DEPENDS not set, the package will have no dependencies.
-- CPACK_DEBIAN_PACKAGE_DEPENDS not set, the package will have no dependencies.
CPack: - package: xxx/apps/build/apps-1.0.0-Linux-application1.deb generated.
CPack: - package: xxx/apps/build/apps-1.0.0-Linux-application2.deb generated.
TGZ packaging: Artifact is NOT separated per component
$ cpack -G TGZ
CPack: Create package using TGZ
CPack: Install projects
CPack: - Run preinstall target for: apps
CPack: - Install project: apps []
CPack: Create package
CPack: - package: xxx/apps/build/apps-1.0.0-Linux.tar.gz generated.
I would like to generate general format such like zip and tar.gz. Do you have any idea?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
