1 year ago
#201985
mentai
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?
c++
cmake
cpack
0 Answers
Your Answer