将cmake组件安装到不同的目录中

时间:2018-01-16 18:05:19

标签: cmake

假设我有一些可执行文件的组件安装规则:

install(TARGETS foo1 DESTINATION bin COMPONENT foo-utils)
install(TARGETS foo2 DESTINATION bin COMPONENT foo-utils)
install(TARGETS foo3 DESTINATION bin COMPONENT foo-utils)

现在,我有自己的可执行文件,我希望其安装规则也安装所有foo-utils安装规则 - 但我希望它们不是bin,而是让它们去其他地方。

add_executable(special ...)
# more options
add_dependencies(special foo1 foo2 foo3)
install(TARGETS special DESTINATION package/bin COMPONENT special)
add_custom_target(package-special
    DEPENDS special
    COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=special -P "${CMAKE_BINARY_DIR}/cmake_install.cmake"
    COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=foo-utils -P "${CMAKE_BINARY_DIR}/cmake_install.cmake"
     )

这很有用,除了构建package-special产生:

$ tree install
install
├── bin
│   ├── foo1
│   ├── foo2
│   └── foo3
└── package
    └── bin
        └── special

如何制作:

$ tree install
install
└── package
    └── bin
        ├── foo1
        ├── foo2
        ├── foo3
        └── special

我将有多个不同的special取决于foo-utils,我希望每个package-specialfoo-utils安装到另一个目录中。 foo-utils也在specials的单独项目中,因此我无法install(TARGETS ...) foo-utils

1 个答案:

答案 0 :(得分:2)

cmake_install.cmake使用默认安装前缀(如果尚不存在)。

# Set the install prefix
if(NOT DEFINED CMAKE_INSTALL_PREFIX)
  set(CMAKE_INSTALL_PREFIX "/usr/local")
endif()

因此,您可以在调用foo-utils安装命令的脚本之前指定一个值。

add_custom_target(package-special
    DEPENDS special
    COMMAND "${CMAKE_COMMAND}" 
            -DCMAKE_INSTALL_COMPONENT=special 
            -P "${CMAKE_BINARY_DIR}/cmake_install.cmake"
    COMMAND "${CMAKE_COMMAND}" 
            -DCMAKE_INSTALL_COMPONENT=foo-utils 
            -DCMAKE_INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX}/package/bin" # <-- here
            -P "${CMAKE_BINARY_DIR}/cmake_install.cmake"
     )