| # Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
| # file Copyright.txt or https://cmake.org/licensing for details. | |
| #[=======================================================================[.rst: | |
| CPackComponent | |
| -------------- | |
| Configure components for binary installers and source packages. | |
| .. only:: html | |
| .. contents:: | |
| Introduction | |
| ^^^^^^^^^^^^ | |
| This module is automatically included by :module:`CPack`. | |
| Certain binary installers (especially the graphical installers) generated | |
| by CPack allow users to select individual application *components* to install. | |
| This module allows developers to configure the packaging of such components. | |
| Contents is assigned to components by the ``COMPONENT`` | |
| argument of CMake's :command:`install` command. Components can be | |
| annotated with user-friendly names and descriptions, inter-component | |
| dependencies, etc., and grouped in various ways to customize the | |
| resulting installer, using the commands described below. | |
| To specify different groupings for different CPack generators use | |
| a CPACK_PROJECT_CONFIG_FILE. | |
| Variables | |
| ^^^^^^^^^ | |
| The following variables influence the component-specific packaging: | |
| .. variable:: CPACK_COMPONENTS_ALL | |
| The list of component to install. | |
| The default value of this variable is computed by CPack and contains all | |
| components defined by the project. The user may set it to only include the | |
| specified components. | |
| Instead of specifying all the desired components, it is possible to obtain a | |
| list of all defined components and then remove the unwanted ones from the | |
| list. The :command:`get_cmake_property` command can be used to obtain the | |
| ``COMPONENTS`` property, then the :command:`list(REMOVE_ITEM)` command can be | |
| used to remove the unwanted ones. For example, to use all defined components | |
| except ``foo`` and ``bar``:: | |
| get_cmake_property(CPACK_COMPONENTS_ALL COMPONENTS) | |
| list(REMOVE_ITEM CPACK_COMPONENTS_ALL "foo" "bar") | |
| .. variable:: CPACK_<GENNAME>_COMPONENT_INSTALL | |
| Enable/Disable component install for CPack generator <GENNAME>. | |
| Each CPack Generator (RPM, DEB, ARCHIVE, NSIS, DMG, etc...) has a legacy | |
| default behavior. e.g. RPM builds monolithic whereas NSIS builds | |
| component. One can change the default behavior by setting this variable to | |
| 0/1 or OFF/ON. | |
| .. variable:: CPACK_COMPONENTS_GROUPING | |
| Specify how components are grouped for multi-package component-aware CPack | |
| generators. | |
| Some generators like RPM or ARCHIVE (TGZ, ZIP, ...) may generate | |
| several packages files when there are components, depending | |
| on the value of this variable: | |
| * ONE_PER_GROUP (default): create one package per component group | |
| * IGNORE : create one package per component (ignore the groups) | |
| * ALL_COMPONENTS_IN_ONE : create a single package with all requested | |
| components | |
| .. variable:: CPACK_COMPONENT_<compName>_DISPLAY_NAME | |
| The name to be displayed for a component. | |
| .. variable:: CPACK_COMPONENT_<compName>_DESCRIPTION | |
| The description of a component. | |
| .. variable:: CPACK_COMPONENT_<compName>_GROUP | |
| The group of a component. | |
| .. variable:: CPACK_COMPONENT_<compName>_DEPENDS | |
| The dependencies (list of components) on which this component depends. | |
| .. variable:: CPACK_COMPONENT_<compName>_HIDDEN | |
| True if this component is hidden from the user. | |
| .. variable:: CPACK_COMPONENT_<compName>_REQUIRED | |
| True if this component is required. | |
| .. variable:: CPACK_COMPONENT_<compName>_DISABLED | |
| True if this component is not selected to be installed by default. | |
| Commands | |
| ^^^^^^^^ | |
| Add component | |
| """"""""""""" | |
| .. command:: cpack_add_component | |
| Describe an installation component. | |
| :: | |
| cpack_add_component(compname | |
| [DISPLAY_NAME name] | |
| [DESCRIPTION description] | |
| [HIDDEN | REQUIRED | DISABLED ] | |
| [GROUP group] | |
| [DEPENDS comp1 comp2 ... ] | |
| [INSTALL_TYPES type1 type2 ... ] | |
| [DOWNLOADED] | |
| [ARCHIVE_FILE filename] | |
| [PLIST filename]) | |
| ``compname`` is the name of an installation component, as defined by the | |
| ``COMPONENT`` argument of one or more CMake :command:`install` commands. | |
| With the ``cpack_add_component`` command one can set a name, a description, | |
| and other attributes of an installation component. | |
| One can also assign a component to a component group. | |
| DISPLAY_NAME is the displayed name of the component, used in graphical | |
| installers to display the component name. This value can be any | |
| string. | |
| DESCRIPTION is an extended description of the component, used in | |
| graphical installers to give the user additional information about the | |
| component. Descriptions can span multiple lines using ``\n`` as the | |
| line separator. Typically, these descriptions should be no more than | |
| a few lines long. | |
| HIDDEN indicates that this component will be hidden in the graphical | |
| installer, so that the user cannot directly change whether it is | |
| installed or not. | |
| REQUIRED indicates that this component is required, and therefore will | |
| always be installed. It will be visible in the graphical installer, | |
| but it cannot be unselected. (Typically, required components are | |
| shown greyed out). | |
| DISABLED indicates that this component should be disabled (unselected) | |
| by default. The user is free to select this component for | |
| installation, unless it is also HIDDEN. | |
| DEPENDS lists the components on which this component depends. If this | |
| component is selected, then each of the components listed must also be | |
| selected. The dependency information is encoded within the installer | |
| itself, so that users cannot install inconsistent sets of components. | |
| GROUP names the component group of which this component is a part. If | |
| not provided, the component will be a standalone component, not part | |
| of any component group. Component groups are described with the | |
| cpack_add_component_group command, detailed below. | |
| INSTALL_TYPES lists the installation types of which this component is | |
| a part. When one of these installations types is selected, this | |
| component will automatically be selected. Installation types are | |
| described with the cpack_add_install_type command, detailed below. | |
| DOWNLOADED indicates that this component should be downloaded | |
| on-the-fly by the installer, rather than packaged in with the | |
| installer itself. For more information, see the | |
| cpack_configure_downloads command. | |
| ARCHIVE_FILE provides a name for the archive file created by CPack to | |
| be used for downloaded components. If not supplied, CPack will create | |
| a file with some name based on CPACK_PACKAGE_FILE_NAME and the name of | |
| the component. See cpack_configure_downloads for more information. | |
| PLIST gives a filename that is passed to pkgbuild with the | |
| ``--component-plist`` argument when using the productbuild generator. | |
| Add component group | |
| """"""""""""""""""" | |
| .. command:: cpack_add_component_group | |
| Describes a group of related CPack installation components. | |
| :: | |
| cpack_add_component_group(groupname | |
| [DISPLAY_NAME name] | |
| [DESCRIPTION description] | |
| [PARENT_GROUP parent] | |
| [EXPANDED] | |
| [BOLD_TITLE]) | |
| The cpack_add_component_group describes a group of installation | |
| components, which will be placed together within the listing of | |
| options. Typically, component groups allow the user to | |
| select/deselect all of the components within a single group via a | |
| single group-level option. Use component groups to reduce the | |
| complexity of installers with many options. groupname is an arbitrary | |
| name used to identify the group in the GROUP argument of the | |
| cpack_add_component command, which is used to place a component in a | |
| group. The name of the group must not conflict with the name of any | |
| component. | |
| DISPLAY_NAME is the displayed name of the component group, used in | |
| graphical installers to display the component group name. This value | |
| can be any string. | |
| DESCRIPTION is an extended description of the component group, used in | |
| graphical installers to give the user additional information about the | |
| components within that group. Descriptions can span multiple lines | |
| using ``\n`` as the line separator. Typically, these descriptions | |
| should be no more than a few lines long. | |
| PARENT_GROUP, if supplied, names the parent group of this group. | |
| Parent groups are used to establish a hierarchy of groups, providing | |
| an arbitrary hierarchy of groups. | |
| EXPANDED indicates that, by default, the group should show up as | |
| "expanded", so that the user immediately sees all of the components | |
| within the group. Otherwise, the group will initially show up as a | |
| single entry. | |
| BOLD_TITLE indicates that the group title should appear in bold, to | |
| call the user's attention to the group. | |
| Add installation type | |
| """"""""""""""""""""" | |
| .. command:: cpack_add_install_type | |
| Add a new installation type containing | |
| a set of predefined component selections to the graphical installer. | |
| :: | |
| cpack_add_install_type(typename | |
| [DISPLAY_NAME name]) | |
| The cpack_add_install_type command identifies a set of preselected | |
| components that represents a common use case for an application. For | |
| example, a "Developer" install type might include an application along | |
| with its header and library files, while an "End user" install type | |
| might just include the application's executable. Each component | |
| identifies itself with one or more install types via the INSTALL_TYPES | |
| argument to cpack_add_component. | |
| DISPLAY_NAME is the displayed name of the install type, which will | |
| typically show up in a drop-down box within a graphical installer. | |
| This value can be any string. | |
| Configure downloads | |
| """"""""""""""""""" | |
| .. command:: cpack_configure_downloads | |
| Configure CPack to download | |
| selected components on-the-fly as part of the installation process. | |
| :: | |
| cpack_configure_downloads(site | |
| [UPLOAD_DIRECTORY dirname] | |
| [ALL] | |
| [ADD_REMOVE|NO_ADD_REMOVE]) | |
| The cpack_configure_downloads command configures installation-time | |
| downloads of selected components. For each downloadable component, | |
| CPack will create an archive containing the contents of that | |
| component, which should be uploaded to the given site. When the user | |
| selects that component for installation, the installer will download | |
| and extract the component in place. This feature is useful for | |
| creating small installers that only download the requested components, | |
| saving bandwidth. Additionally, the installers are small enough that | |
| they will be installed as part of the normal installation process, and | |
| the "Change" button in Windows Add/Remove Programs control panel will | |
| allow one to add or remove parts of the application after the original | |
| installation. On Windows, the downloaded-components functionality | |
| requires the ZipDLL plug-in for NSIS, available at: | |
| :: | |
| http://nsis.sourceforge.net/ZipDLL_plug-in | |
| On macOS, installers that download components on-the-fly can only | |
| be built and installed on system using macOS 10.5 or later. | |
| The site argument is a URL where the archives for downloadable | |
| components will reside, e.g., | |
| https://cmake.org/files/2.6.1/installer/ All of the archives | |
| produced by CPack should be uploaded to that location. | |
| UPLOAD_DIRECTORY is the local directory where CPack will create the | |
| various archives for each of the components. The contents of this | |
| directory should be uploaded to a location accessible by the URL given | |
| in the site argument. If omitted, CPack will use the directory | |
| CPackUploads inside the CMake binary directory to store the generated | |
| archives. | |
| The ALL flag indicates that all components be downloaded. Otherwise, | |
| only those components explicitly marked as DOWNLOADED or that have a | |
| specified ARCHIVE_FILE will be downloaded. Additionally, the ALL | |
| option implies ADD_REMOVE (unless NO_ADD_REMOVE is specified). | |
| ADD_REMOVE indicates that CPack should install a copy of the installer | |
| that can be called from Windows' Add/Remove Programs dialog (via the | |
| "Modify" button) to change the set of installed components. | |
| NO_ADD_REMOVE turns off this behavior. This option is ignored on Mac | |
| OS X. | |
| #]=======================================================================] | |
| # Define var in order to avoid multiple inclusion | |
| if(NOT CPackComponent_CMake_INCLUDED) | |
| set(CPackComponent_CMake_INCLUDED 1) | |
| # Macro that appends a SET command for the given variable name (var) | |
| # to the macro named strvar, but only if the variable named "var" | |
| # has been defined. The string will eventually be appended to a CPack | |
| # configuration file. | |
| macro(cpack_append_variable_set_command var strvar) | |
| if (DEFINED ${var}) | |
| string(APPEND ${strvar} "set(${var}") | |
| foreach(APPENDVAL ${${var}}) | |
| string(APPEND ${strvar} " ${APPENDVAL}") | |
| endforeach() | |
| string(APPEND ${strvar} ")\n") | |
| endif () | |
| endmacro() | |
| # Macro that appends a SET command for the given variable name (var) | |
| # to the macro named strvar, but only if the variable named "var" | |
| # has been defined and is a string. The string will eventually be | |
| # appended to a CPack configuration file. | |
| macro(cpack_append_string_variable_set_command var strvar) | |
| if (DEFINED ${var}) | |
| list(LENGTH ${var} CPACK_APP_VALUE_LEN) | |
| if(${CPACK_APP_VALUE_LEN} EQUAL 1) | |
| string(APPEND ${strvar} "set(${var} \"${${var}}\")\n") | |
| endif() | |
| endif () | |
| endmacro() | |
| # Macro that appends a SET command for the given list variable name (var) | |
| # to the macro named strvar, but only if the variable named "var" | |
| # has been defined. It's like add variable, but wrap each item to quotes. | |
| # The string will eventually be appended to a CPack configuration file. | |
| macro(cpack_append_list_variable_set_command var strvar) | |
| if (DEFINED ${var}) | |
| string(APPEND ${strvar} "set(${var}") | |
| foreach(_val IN LISTS ${var}) | |
| string(APPEND ${strvar} "\n \"${_val}\"") | |
| endforeach() | |
| string(APPEND ${strvar} ")\n") | |
| endif () | |
| endmacro() | |
| # Macro that appends a SET command for the given variable name (var) | |
| # to the macro named strvar, but only if the variable named "var" | |
| # has been set to true. The string will eventually be | |
| # appended to a CPack configuration file. | |
| macro(cpack_append_option_set_command var strvar) | |
| if (${var}) | |
| list(LENGTH ${var} CPACK_APP_VALUE_LEN) | |
| if(${CPACK_APP_VALUE_LEN} EQUAL 1) | |
| string(APPEND ${strvar} "set(${var} TRUE)\n") | |
| endif() | |
| endif () | |
| endmacro() | |
| # Macro that adds a component to the CPack installer | |
| macro(cpack_add_component compname) | |
| string(TOUPPER ${compname} _CPACK_ADDCOMP_UNAME) | |
| cmake_parse_arguments(CPACK_COMPONENT_${_CPACK_ADDCOMP_UNAME} | |
| "HIDDEN;REQUIRED;DISABLED;DOWNLOADED" | |
| "DISPLAY_NAME;DESCRIPTION;GROUP;ARCHIVE_FILE;PLIST" | |
| "DEPENDS;INSTALL_TYPES" | |
| ${ARGN} | |
| ) | |
| if (CPACK_COMPONENT_${_CPACK_ADDCOMP_UNAME}_DOWNLOADED) | |
| set(_CPACK_ADDCOMP_STR "\n# Configuration for downloaded component \"${compname}\"\n") | |
| else () | |
| set(_CPACK_ADDCOMP_STR "\n# Configuration for component \"${compname}\"\n") | |
| endif () | |
| if(NOT CPACK_MONOLITHIC_INSTALL) | |
| # If the user didn't set CPACK_COMPONENTS_ALL explicitly, update the | |
| # value of CPACK_COMPONENTS_ALL in the configuration file. This will | |
| # take care of any components that have been added after the CPack | |
| # moduled was included. | |
| if(NOT CPACK_COMPONENTS_ALL_SET_BY_USER) | |
| get_cmake_property(_CPACK_ADDCOMP_COMPONENTS COMPONENTS) | |
| string(APPEND _CPACK_ADDCOMP_STR "\nSET(CPACK_COMPONENTS_ALL") | |
| foreach(COMP ${_CPACK_ADDCOMP_COMPONENTS}) | |
| string(APPEND _CPACK_ADDCOMP_STR " ${COMP}") | |
| endforeach() | |
| string(APPEND _CPACK_ADDCOMP_STR ")\n") | |
| endif() | |
| endif() | |
| cpack_append_string_variable_set_command( | |
| CPACK_COMPONENT_${_CPACK_ADDCOMP_UNAME}_DISPLAY_NAME | |
| _CPACK_ADDCOMP_STR) | |
| cpack_append_string_variable_set_command( | |
| CPACK_COMPONENT_${_CPACK_ADDCOMP_UNAME}_DESCRIPTION | |
| _CPACK_ADDCOMP_STR) | |
| cpack_append_variable_set_command( | |
| CPACK_COMPONENT_${_CPACK_ADDCOMP_UNAME}_GROUP | |
| _CPACK_ADDCOMP_STR) | |
| cpack_append_variable_set_command( | |
| CPACK_COMPONENT_${_CPACK_ADDCOMP_UNAME}_DEPENDS | |
| _CPACK_ADDCOMP_STR) | |
| cpack_append_variable_set_command( | |
| CPACK_COMPONENT_${_CPACK_ADDCOMP_UNAME}_INSTALL_TYPES | |
| _CPACK_ADDCOMP_STR) | |
| cpack_append_string_variable_set_command( | |
| CPACK_COMPONENT_${_CPACK_ADDCOMP_UNAME}_ARCHIVE_FILE | |
| _CPACK_ADDCOMP_STR) | |
| cpack_append_option_set_command( | |
| CPACK_COMPONENT_${_CPACK_ADDCOMP_UNAME}_HIDDEN | |
| _CPACK_ADDCOMP_STR) | |
| cpack_append_option_set_command( | |
| CPACK_COMPONENT_${_CPACK_ADDCOMP_UNAME}_REQUIRED | |
| _CPACK_ADDCOMP_STR) | |
| cpack_append_option_set_command( | |
| CPACK_COMPONENT_${_CPACK_ADDCOMP_UNAME}_DISABLED | |
| _CPACK_ADDCOMP_STR) | |
| cpack_append_option_set_command( | |
| CPACK_COMPONENT_${_CPACK_ADDCOMP_UNAME}_DOWNLOADED | |
| _CPACK_ADDCOMP_STR) | |
| cpack_append_string_variable_set_command( | |
| CPACK_COMPONENT_${_CPACK_ADDCOMP_UNAME}_PLIST | |
| _CPACK_ADDCOMP_STR) | |
| # Backward compatibility issue. | |
| # Write to config iff the macros is used after CPack.cmake has been | |
| # included, other it's not necessary because the variables | |
| # will be encoded by cpack_encode_variables. | |
| if(CPack_CMake_INCLUDED) | |
| file(APPEND "${CPACK_OUTPUT_CONFIG_FILE}" "${_CPACK_ADDCOMP_STR}") | |
| endif() | |
| endmacro() | |
| # Macro that adds a component group to the CPack installer | |
| macro(cpack_add_component_group grpname) | |
| string(TOUPPER ${grpname} _CPACK_ADDGRP_UNAME) | |
| cmake_parse_arguments(CPACK_COMPONENT_GROUP_${_CPACK_ADDGRP_UNAME} | |
| "EXPANDED;BOLD_TITLE" | |
| "DISPLAY_NAME;DESCRIPTION;PARENT_GROUP" | |
| "" | |
| ${ARGN} | |
| ) | |
| set(_CPACK_ADDGRP_STR "\n# Configuration for component group \"${grpname}\"\n") | |
| cpack_append_string_variable_set_command( | |
| CPACK_COMPONENT_GROUP_${_CPACK_ADDGRP_UNAME}_DISPLAY_NAME | |
| _CPACK_ADDGRP_STR) | |
| cpack_append_string_variable_set_command( | |
| CPACK_COMPONENT_GROUP_${_CPACK_ADDGRP_UNAME}_DESCRIPTION | |
| _CPACK_ADDGRP_STR) | |
| cpack_append_string_variable_set_command( | |
| CPACK_COMPONENT_GROUP_${_CPACK_ADDGRP_UNAME}_PARENT_GROUP | |
| _CPACK_ADDGRP_STR) | |
| cpack_append_option_set_command( | |
| CPACK_COMPONENT_GROUP_${_CPACK_ADDGRP_UNAME}_EXPANDED | |
| _CPACK_ADDGRP_STR) | |
| cpack_append_option_set_command( | |
| CPACK_COMPONENT_GROUP_${_CPACK_ADDGRP_UNAME}_BOLD_TITLE | |
| _CPACK_ADDGRP_STR) | |
| # Backward compatibility issue. | |
| # Write to config iff the macros is used after CPack.cmake has been | |
| # included, other it's not necessary because the variables | |
| # will be encoded by cpack_encode_variables. | |
| if(CPack_CMake_INCLUDED) | |
| file(APPEND "${CPACK_OUTPUT_CONFIG_FILE}" "${_CPACK_ADDGRP_STR}") | |
| endif() | |
| endmacro() | |
| # Macro that adds an installation type to the CPack installer | |
| macro(cpack_add_install_type insttype) | |
| string(TOUPPER ${insttype} _CPACK_INSTTYPE_UNAME) | |
| cmake_parse_arguments(CPACK_INSTALL_TYPE_${_CPACK_INSTTYPE_UNAME} | |
| "" | |
| "DISPLAY_NAME" | |
| "" | |
| ${ARGN} | |
| ) | |
| set(_CPACK_INSTTYPE_STR | |
| "\n# Configuration for installation type \"${insttype}\"\n") | |
| string(APPEND _CPACK_INSTTYPE_STR | |
| "list(APPEND CPACK_ALL_INSTALL_TYPES ${insttype})\n") | |
| cpack_append_string_variable_set_command( | |
| CPACK_INSTALL_TYPE_${_CPACK_INSTTYPE_UNAME}_DISPLAY_NAME | |
| _CPACK_INSTTYPE_STR) | |
| # Backward compatibility issue. | |
| # Write to config iff the macros is used after CPack.cmake has been | |
| # included, other it's not necessary because the variables | |
| # will be encoded by cpack_encode_variables. | |
| if(CPack_CMake_INCLUDED) | |
| file(APPEND "${CPACK_OUTPUT_CONFIG_FILE}" "${_CPACK_INSTTYPE_STR}") | |
| endif() | |
| endmacro() | |
| macro(cpack_configure_downloads site) | |
| cmake_parse_arguments(CPACK_DOWNLOAD | |
| "ALL;ADD_REMOVE;NO_ADD_REMOVE" | |
| "UPLOAD_DIRECTORY" | |
| "" | |
| ${ARGN} | |
| ) | |
| set(CPACK_CONFIG_DL_STR | |
| "\n# Downloaded components configuration\n") | |
| set(CPACK_UPLOAD_DIRECTORY ${CPACK_DOWNLOAD_UPLOAD_DIRECTORY}) | |
| set(CPACK_DOWNLOAD_SITE ${site}) | |
| cpack_append_string_variable_set_command( | |
| CPACK_DOWNLOAD_SITE | |
| CPACK_CONFIG_DL_STR) | |
| cpack_append_string_variable_set_command( | |
| CPACK_UPLOAD_DIRECTORY | |
| CPACK_CONFIG_DL_STR) | |
| cpack_append_option_set_command( | |
| CPACK_DOWNLOAD_ALL | |
| CPACK_CONFIG_DL_STR) | |
| if (${CPACK_DOWNLOAD_ALL} AND NOT ${CPACK_DOWNLOAD_NO_ADD_REMOVE}) | |
| set(CPACK_DOWNLOAD_ADD_REMOVE ON) | |
| endif () | |
| set(CPACK_ADD_REMOVE ${CPACK_DOWNLOAD_ADD_REMOVE}) | |
| cpack_append_option_set_command( | |
| CPACK_ADD_REMOVE | |
| CPACK_CONFIG_DL_STR) | |
| # Backward compatibility issue. | |
| # Write to config iff the macros is used after CPack.cmake has been | |
| # included, other it's not necessary because the variables | |
| # will be encoded by cpack_encode_variables. | |
| if(CPack_CMake_INCLUDED) | |
| file(APPEND "${CPACK_OUTPUT_CONFIG_FILE}" "${CPACK_CONFIG_DL_STR}") | |
| endif() | |
| endmacro() | |
| endif() |