[CMake] Adding files to ARCHIVE packages only in CPack
Bruno Barberi Gnecco
brunobg at corollarium.com
Fri Sep 25 12:13:42 EDT 2015
On 09/25/2015 05:27 AM, Eric Noulard wrote:
>
>
> 2015-09-24 22:42 GMT+02:00 Bruno Barberi Gnecco <brunobg at corollarium.com
> <mailto:brunobg at corollarium.com>>:
>
> How is it possible to add some files only to the ARCHIVE generators with
> CMake/CPack? Apparently components do that, but I can't figure how to say "only add
> component X to generator Y". I did something like this:
>
> In CPackConfig.cmake:
>
> set(CPACK_PROJECT_CONFIG_FILE
> "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/CMakeCPackOptions.cmake")
>
> In CMakeCPackOptions.cmake
>
> IF (CPACK_GENERATOR MATCHES "TGZ")
> install(FILES myextrafile DESTINATION "." COMPONENT static)
> ENDIF()
>
> But I get the following error:
>
> /usr/local/bin/cpack --config ./CPackConfig.cmake
> CMake Error at CMakeModules/CMakeCPackOptions.cmake:4 (install):
> Unknown CMake command "install".
>
> CPack Error: Cannot initialize the generator TGZ
>
> What am I doing wrong? Any other way to run `install()` only for certain
> generators? Thanks
>
>
>
> CMakeCPackOptions.cmake is run when CPack runs a.k.a. "CPack time"
> At that time the CMake language interpreter running is in **scripting mode** (much like
> when you run cmake -P yourscript.cmake)
>
> "install" command is not a scriptable command meaning that is cannot be used
> in such CMake script. The same is true for add_library or add_executable etc...
> This is because those commande are **declarative** they do not act when they are processed
> but they trigger the generation of other commands that will be run when building/installing.
>
> Those "non-scriptable" commands may only be used at "CMake time" i.e. when CMake is
> running for configuring your project.
>
> Using COMPONENT is a possible solution.
>
> When using COMPONENT the variable CPACK_COMPONENTS_ALL controls which components are to be
> shipped by the CPack generator.
> So what you can do in your CPACK_PROJECT_CONFIG_FILE is to selectively set
> CPACK_COMPONENTS_ALL
> to appropriate value:
>
> if ("${CPACK_GENERATOR}" MATCHES "ZIP")
> set(CPACK_COMPONENTS_ALL comp1 com2 extracomp)
> else()
> set(CPACK_COMPONENTS_ALL comp1 com2)
> endif()
>
> And this should work.
>
> More doc references here:
> http://cmake.org/Wiki/CMake:Component_Install_With_CPack
> http://cmake.org/Wiki/CMake:CPackPackageGenerators#Overall_usage_.28common_to_all_generators.29
> http://cmake.org/cmake/help/v3.0/module/CPackComponent.html
> http://cmake.org/cmake/help/v3.0/module/CPack.html?highlight=cpack_project#variable:CPACK_PROJECT_CONFIG_FILE
>
> --
> Eric
Eric,
I appreciate your detailed reply, but I'm still can't make it work. Here's what I did:
CPackConfig.cmake:
SET(CPACK_PROJECT_CONFIG_FILE
"${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/CMakeCPackOptions.cmake")
# SET(CPACK_COMPONENTS_ALL "") commented out
....
install(PROGRAMS "something" DESTINATION "." COMPONENT basic)
install(PROGRAMS "otherthing" DESTINATION "." COMPONENT optional)
CMakeCPackOptions.cmake
IF ("${CPACK_GENERATOR}" MATCHES "TGZ")
set(CPACK_COMPONENTS_ALL basic)
ELSEIF ("${CPACK_GENERATOR}" MATCHES "TBZ2")
set(CPACK_COMPONENTS_ALL basic optional)
ELSE()
SET(CPACK_COMPONENTS_ALL basic)
ENDIF()
Result: all files from all components are added to the packages.
What am I doing wrong? Do you know of some example that I could follow? Thanks.
More information about the CMake
mailing list