1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-14 02:08:27 +08:00

Merge topic 'cpack-install-opts'

26e36111d3 CPack: Implement new variable CPACK_CUSTOM_INSTALL_VARIABLES

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !6141
This commit is contained in:
Craig Scott
2021-05-26 22:53:27 +00:00
committed by Kitware Robot
7 changed files with 81 additions and 0 deletions

View File

@@ -671,6 +671,7 @@ Variables for CPack
/variable/CPACK_ABSOLUTE_DESTINATION_FILES /variable/CPACK_ABSOLUTE_DESTINATION_FILES
/variable/CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY /variable/CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY
/variable/CPACK_CUSTOM_INSTALL_VARIABLES
/variable/CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION /variable/CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION
/variable/CPACK_INCLUDE_TOPLEVEL_DIRECTORY /variable/CPACK_INCLUDE_TOPLEVEL_DIRECTORY
/variable/CPACK_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS /variable/CPACK_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS

View File

@@ -0,0 +1,6 @@
cpack-install-opts
------------------
* The new :variable:`CPACK_CUSTOM_INSTALL_VARIABLES`
can be used to set variables in CPack ``cmake_install.cmake``
invocations.

View File

@@ -0,0 +1,42 @@
CPACK_CUSTOM_INSTALL_VARIABLES
------------------------------
CPack variables (set via e.g. ``cpack -D``, ``CPackConfig.cmake`` or
:variable:`CPACK_PROJECT_CONFIG_FILE` scripts) are not directly visible in
installation scripts. Instead, one can pass a list of ``varName=value``
pairs in the ``CPACK_CUSTOM_INSTALL_VARIABLES`` variable. At install time,
each list item will result in a variable of the specified name (``varName``)
being set to the given ``value``. The ``=`` can be omitted for an empty
``value``.
``CPACK_CUSTOM_INSTALL_VARIABLES`` allows the packaging installation to be
influenced by the user or driving script at CPack runtime without having to
regenerate the install scripts.
Example
"""""""
.. code-block:: cmake
install(FILES large.txt DESTINATION data)
install(CODE [[
if(ENABLE_COMPRESSION)
# "run-compressor" is a fictional tool that produces
# large.txt.xz from large.txt and then removes the input file
execute_process(COMMAND run-compressor $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/large.txt)
endif()
]])
With the above example snippet, :manual:`cpack <cpack(1)>` will by default
run the installation script with ``ENABLE_COMPRESSION`` unset, resulting in
a package containing the uncompressed ``large.txt``. This can be overridden
when invoking :manual:`cpack <cpack(1)>` like so:
.. code-block:: shell
cpack -D "CPACK_CUSTOM_INSTALL_VARIABLES=ENABLE_COMPRESSION=TRUE"
The installation script will then run with ``ENABLE_COMPRESSION`` set to
``TRUE``, resulting in a package containing the compressed ``large.txt.xz``
instead.

View File

@@ -902,6 +902,23 @@ int cmCPackGenerator::InstallCMakeProject(
this->IsOn("CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION")) { this->IsOn("CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION")) {
mf.AddDefinition("CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION", "1"); mf.AddDefinition("CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION", "1");
} }
std::vector<std::string> custom_variables;
this->MakefileMap->GetDefExpandList("CPACK_CUSTOM_INSTALL_VARIABLES",
custom_variables);
for (auto const& custom_variable : custom_variables) {
std::string value;
auto i = custom_variable.find('=');
if (i != std::string::npos) {
value = custom_variable.substr(i + 1);
}
mf.AddDefinition(custom_variable.substr(0, i), value);
}
// do installation // do installation
bool res = mf.ReadListFile(installFile); bool res = mf.ReadListFile(installFile);
// forward definition of CMAKE_ABSOLUTE_DESTINATION_FILES // forward definition of CMAKE_ABSOLUTE_DESTINATION_FILES

View File

@@ -37,6 +37,7 @@ unset(ENVIRONMENT)
run_cpack_test(USER_FILELIST "RPM.USER_FILELIST" false "MONOLITHIC") run_cpack_test(USER_FILELIST "RPM.USER_FILELIST" false "MONOLITHIC")
run_cpack_test(MD5SUMS "DEB.MD5SUMS" false "MONOLITHIC;COMPONENT") run_cpack_test(MD5SUMS "DEB.MD5SUMS" false "MONOLITHIC;COMPONENT")
run_cpack_test_subtests(CPACK_INSTALL_SCRIPTS "singular;plural;both" "ZIP" false "MONOLITHIC") run_cpack_test_subtests(CPACK_INSTALL_SCRIPTS "singular;plural;both" "ZIP" false "MONOLITHIC")
run_cpack_test(CPACK_CUSTOM_INSTALL_VARIABLES "ZIP" false "MONOLITHIC")
run_cpack_test(DEB_PACKAGE_VERSION_BACK_COMPATIBILITY "DEB.DEB_PACKAGE_VERSION_BACK_COMPATIBILITY" false "MONOLITHIC;COMPONENT") run_cpack_test(DEB_PACKAGE_VERSION_BACK_COMPATIBILITY "DEB.DEB_PACKAGE_VERSION_BACK_COMPATIBILITY" false "MONOLITHIC;COMPONENT")
run_cpack_test_subtests(EXTERNAL "none;good;good_multi;bad_major;bad_minor;invalid_good;invalid_bad;stage_and_package" "External" false "MONOLITHIC;COMPONENT") run_cpack_test_subtests(EXTERNAL "none;good;good_multi;bad_major;bad_minor;invalid_good;invalid_bad;stage_and_package" "External" false "MONOLITHIC;COMPONENT")
run_cpack_test_subtests( run_cpack_test_subtests(

View File

@@ -0,0 +1,7 @@
set(EXPECTED_FILES_COUNT "1")
set(EXPECTED_FILE_CONTENT_1_LIST
"/foo"
"/foo/bar.txt"
"/foo/baz.txt"
"/foo/foo.txt"
)

View File

@@ -0,0 +1,7 @@
set(CPACK_CUSTOM_INSTALL_VARIABLES "FOO=foo.txt" "BAR=bar.txt")
install(CODE [[
file(WRITE ${CMAKE_INSTALL_PREFIX}/foo/${FOO})
file(WRITE ${CMAKE_INSTALL_PREFIX}/foo/${BAR})
file(WRITE ${CMAKE_INSTALL_PREFIX}/foo/baz.txt)
]])