1 year ago

#201985

test-img

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

Accepted video resources