|
|
|
# CPack Example: User-selectable Installation Components
|
|
|
|
#
|
|
|
|
# In this example, we have a simple library (mylib) with an example
|
|
|
|
# application (mylibapp). We create a binary installer (a CPack Generator)
|
|
|
|
# which supports CPack components.
|
|
|
|
|
|
|
|
cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
|
|
|
|
project(CPackComponentsDEB VERSION 1.0.3)
|
|
|
|
|
|
|
|
# Use GNUInstallDirs in order to enforce lib64 if needed
|
|
|
|
include(GNUInstallDirs)
|
|
|
|
|
|
|
|
# Create the mylib library
|
|
|
|
add_library(mylib mylib.cpp)
|
|
|
|
|
|
|
|
# Create the mylibapp application
|
|
|
|
add_executable(mylibapp mylibapp.cpp)
|
|
|
|
target_link_libraries(mylibapp mylib)
|
|
|
|
|
|
|
|
# Duplicate of mylibapp application
|
|
|
|
# which won't be put in any component (?mistake?)
|
|
|
|
add_executable(mylibapp2 mylibapp.cpp)
|
|
|
|
target_link_libraries(mylibapp2 mylib)
|
|
|
|
|
|
|
|
# Create installation targets. Note that we put each kind of file
|
|
|
|
# into a different component via COMPONENT. These components will
|
|
|
|
# be used to create the installation components.
|
|
|
|
install(TARGETS mylib
|
|
|
|
ARCHIVE
|
|
|
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
|
|
COMPONENT libraries)
|
|
|
|
|
|
|
|
install(TARGETS mylibapp
|
|
|
|
RUNTIME
|
|
|
|
DESTINATION bin
|
|
|
|
COMPONENT applications)
|
|
|
|
|
|
|
|
install(FILES mylib.h
|
|
|
|
DESTINATION include
|
|
|
|
COMPONENT headers)
|
|
|
|
|
|
|
|
# CPack boilerplate for this project
|
|
|
|
set(CPACK_PACKAGE_NAME "MyLib")
|
|
|
|
set(CPACK_PACKAGE_CONTACT "None")
|
|
|
|
set(CPACK_PACKAGE_VENDOR "CMake.org")
|
|
|
|
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "MyLib - CPack Component Installation Example")
|
|
|
|
set(CPACK_PACKAGE_INSTALL_DIRECTORY "CPack Component Example")
|
|
|
|
set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/license.txt)
|
|
|
|
|
|
|
|
# Tell CPack all of the components to install. The "ALL"
|
|
|
|
# refers to the fact that this is the set of components that
|
|
|
|
# will be included when CPack is instructed to put everything
|
|
|
|
# into the binary installer (the default behavior).
|
|
|
|
set(CPACK_COMPONENTS_ALL applications libraries headers)
|
|
|
|
|
|
|
|
# Set the displayed names for each of the components to install.
|
|
|
|
# These will be displayed in the list of components inside the installer.
|
|
|
|
set(CPACK_COMPONENT_APPLICATIONS_DISPLAY_NAME "MyLib Application")
|
|
|
|
set(CPACK_COMPONENT_LIBRARIES_DISPLAY_NAME "Libraries")
|
|
|
|
set(CPACK_COMPONENT_HEADERS_DISPLAY_NAME "C++ Headers")
|
|
|
|
|
|
|
|
# Provide descriptions for each of the components to install.
|
|
|
|
# When the user hovers the mouse over the name of a component,
|
|
|
|
# the description will be shown in the "Description" box in the
|
|
|
|
# installer. If no descriptions are provided, the "Description"
|
|
|
|
# box will be removed.
|
|
|
|
set(CPACK_COMPONENT_APPLICATIONS_DESCRIPTION
|
|
|
|
"An extremely useful application that makes use of MyLib")
|
|
|
|
set(CPACK_COMPONENT_LIBRARIES_DESCRIPTION
|
|
|
|
"Static libraries used to build programs with MyLib")
|
|
|
|
set(CPACK_COMPONENT_HEADERS_DESCRIPTION
|
|
|
|
"C/C++ header files for use with MyLib")
|
|
|
|
|
|
|
|
# It doesn't make sense to install the headers without the libraries
|
|
|
|
# (because you could never use the headers!), so make the headers component
|
|
|
|
# depend on the libraries component.
|
|
|
|
set(CPACK_COMPONENT_HEADERS_DEPENDS libraries)
|
|
|
|
|
|
|
|
# creates preinst/prerm scripts with specific permissions. Those permissions
|
|
|
|
# (especially executable) should be in the final archive
|
|
|
|
find_program(CHMOD_PROG chmod)
|
|
|
|
if(CHMOD_PROG)
|
|
|
|
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/preinst "echo default_preinst")
|
|
|
|
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/prerm "echo default_prerm")
|
|
|
|
|
|
|
|
# Those should have 755 permission normally. We mess it up to see if
|
|
|
|
# CPACK_DEBIAN_APPLICATIONS_PACKAGE_CONTROL_STRICT_PERMISSION is able to fix
|
|
|
|
# it.
|
|
|
|
execute_process(COMMAND ${CHMOD_PROG} 640 ${CMAKE_CURRENT_BINARY_DIR}/preinst)
|
|
|
|
execute_process(COMMAND ${CHMOD_PROG} 640 ${CMAKE_CURRENT_BINARY_DIR}/prerm)
|
|
|
|
|
|
|
|
set(CPACK_DEBIAN_APPLICATIONS_PACKAGE_CONTROL_EXTRA
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/preinst;${CMAKE_CURRENT_BINARY_DIR}/prerm")
|
|
|
|
|
|
|
|
set(CPACK_DEBIAN_APPLICATIONS_PACKAGE_CONTROL_STRICT_PERMISSION TRUE)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
# creates a symbolic link and a directory. Those should not be hashed.
|
|
|
|
# warning: relocation of the symlink is not supported (symlinks with relative
|
|
|
|
# paths)
|
|
|
|
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink mylibapp symtest)
|
|
|
|
install(FILES ${CPackComponentsDEB_BINARY_DIR}/symtest
|
|
|
|
DESTINATION bin
|
|
|
|
COMPONENT applications)
|
|
|
|
|
|
|
|
if(EXISTS "./dirtest")
|
|
|
|
execute_process(COMMAND ${CMAKE_COMMAND} -E rm -rf ./dirtest)
|
|
|
|
endif()
|
|
|
|
# NOTE: directory left empty on purpose
|
|
|
|
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ./dirtest)
|
|
|
|
# NOTE: we should not add the trailing "/" to dirtest
|
|
|
|
install(DIRECTORY ${CPackComponentsDEB_BINARY_DIR}/dirtest
|
|
|
|
DESTINATION bin/
|
|
|
|
COMPONENT applications)
|
|
|
|
|
|
|
|
# We may use the CPack specific config file in order
|
|
|
|
# to tailor CPack behavior on a CPack generator specific way
|
|
|
|
# (Behavior would be different for RPM or TGZ or DEB ...)
|
|
|
|
if (NOT DEFINED CPackDEBConfiguration)
|
|
|
|
message(FATAL_ERROR "CPackDEBConfiguration should be defined")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
# Setup project specific CPack-time CPack Config file.
|
|
|
|
configure_file(${CPackComponentsDEB_SOURCE_DIR}/MyLibCPackConfig-${CPackDEBConfiguration}.cmake.in
|
|
|
|
${CPackComponentsDEB_BINARY_DIR}/MyLibCPackConfig-${CPackDEBConfiguration}.cmake
|
|
|
|
@ONLY)
|
|
|
|
set(CPACK_PROJECT_CONFIG_FILE ${CPackComponentsDEB_BINARY_DIR}/MyLibCPackConfig-${CPackDEBConfiguration}.cmake)
|
|
|
|
|
|
|
|
# set CPACK_DEBIAN_FILE_NAME to use default package name format
|
|
|
|
set(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT")
|
|
|
|
|
|
|
|
# Include CPack to introduce the appropriate targets
|
|
|
|
include(CPack)
|