用于install()命令的Generator Expression

Man*_*zor 10 cmake

CMake 3.2.2的文档表明,可以使用生成器表达式进行install(<FILES|PROGRAMS> ...)签名.我试图在其他签名中使用生成器表达式install(),但显然它不起作用.我想做这样的事情:

install(TARGETS foo EXPORT fooConfig
        RUNTIME DESTINATION "Bin/$<CONFIG>"
        LIBRARY DESTINATION "Lib/$<CONFIG>"
        ARCHIVE DESTINATION "Lib/$<CONFIG>"
Run Code Online (Sandbox Code Playgroud)

我也尝试install()多次这样调用:

install(TARGETS foo EXPORT fooConfig
        RUNTIME DESTINATION "Bin/Debug" CONFIGURATIONS Debug
        LIBRARY DESTINATION "Lib/Debug" CONFIGURATIONS Debug
        ARCHIVE DESTINATION "Lib/Debug" CONFIGURATIONS Debug
install(TARGETS foo EXPORT fooConfig
        RUNTIME DESTINATION "Bin/Release" CONFIGURATIONS Release
        LIBRARY DESTINATION "Lib/Release" CONFIGURATIONS Release
        ARCHIVE DESTINATION "Lib/Release" CONFIGURATIONS Release
install(TARGETS foo EXPORT fooConfig
        RUNTIME DESTINATION "Bin/MinSizeRel" CONFIGURATIONS MinSizeRel
        LIBRARY DESTINATION "Lib/MinSizeRel" CONFIGURATIONS MinSizeRel
        ARCHIVE DESTINATION "Lib/MinSizeRel" CONFIGURATIONS MinSizeRel
install(TARGETS foo EXPORT fooConfig
        RUNTIME DESTINATION "Bin/RelWithDebInfo" CONFIGURATIONS RelWithDebInfo
        LIBRARY DESTINATION "Lib/RelWithDebInfo" CONFIGURATIONS RelWithDebInfo
        ARCHIVE DESTINATION "Lib/RelWithDebInfo" CONFIGURATIONS RelWithDebInfo
Run Code Online (Sandbox Code Playgroud)

这会导致CMake沿着'fooConfig'中多次导出的Target'foo'行发出错误.

我不能CMAKE_BUILD_TYPE在没有更新CMake缓存并重新运行构建的情况下使用此处.而不是那样,我想使用Visual Studio批量构建功能,它为我构建多个配置.

我也尝试过一点点黑客攻击.我注意到CMake生成的INSTALL项目只是${CMAKE_BINARY_DIR}/cmake_install.cmake用参数调用CMake脚本-DBUILD_TYPE=$(Configuration).所以我尝试了以下方法:

install(TARGETS foo EXPORT fooConfig
        RUNTIME DESTINATION "Bin/\${BUILD_TYPE}"
        LIBRARY DESTINATION "Lib/\${BUILD_TYPE}"
        ARCHIVE DESTINATION "Lib/\${BUILD_TYPE}"
Run Code Online (Sandbox Code Playgroud)

这实际上适用于安装.但是,安装的导出脚本,即install(EXPORT fooConfig DESTINATION .)now 的输出现在也尝试使用${BUILD_TYPE},在用户包含该脚本时未设置...

如果有人知道另一种方法来实现我的目标,请告诉我.

sak*_*kra 9

不幸的是,该install命令仅支持要安装的文件列表的生成器表达式,但不支持目标目录的生成器表达式.

我会建议坚持你的小黑客,但使用CMAKE_INSTALL_CONFIG_NAME而不是CMAKE_BUILD_TYPE,即:

install(TARGETS foo EXPORT fooConfig
        RUNTIME DESTINATION "Bin/\${CMAKE_INSTALL_CONFIG_NAME}"
        LIBRARY DESTINATION "Lib/\${CMAKE_INSTALL_CONFIG_NAME}"
        ARCHIVE DESTINATION "Lib/\${CMAKE_INSTALL_CONFIG_NAME}"
Run Code Online (Sandbox Code Playgroud)

CMAKE_INSTALL_CONFIG_NAME设置为用于在生成的cmake_install.cmake脚本中安装的实际构建配置.

生成的导出脚本(例如fooConfig-debug.cmake)可以通过向安装过程添加补丁脚本来自动修复.patch_export_files.cmake在源目录中生成包含以下内容的文件:

file(GLOB_RECURSE _configFiles "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/fooConfig-*.cmake")
foreach(_configFile ${_configFiles})
    file (READ "${_configFile}" _contents)
    string (REGEX MATCH "configuration \"[A-Za-z]+\"" _configName "${_contents}")
    if (_configName MATCHES "\"([A-Za-z]+)\"")
        message(STATUS "Patching: ${_configFile}")
        string (REPLACE "\${CMAKE_INSTALL_CONFIG_NAME}" "${CMAKE_MATCH_1}" _patchedContents "${_contents}")
        file (WRITE "${_configFile}" "${_patchedContents}")
    endif()
endforeach()
Run Code Online (Sandbox Code Playgroud)

该补丁脚本必须在安装时通过添加运行install(SCRIPT ...后的呼叫install(EXPORT ...:

install(EXPORT fooConfig DESTINATION .)
...
install(SCRIPT patch_export_files.cmake)
Run Code Online (Sandbox Code Playgroud)

修补程序脚本首先从其标题注释中解析生成的导出脚本对其有效的配置,然后将每次使用替换${CMAKE_INSTALL_CONFIG_NAME}为配置名称.