【问题标题】:CMake install header files and maintain directory heirarchyCMake 安装头文件并维护目录层次结构
【发布时间】:2018-01-11 17:27:26
【问题描述】:

使用 cmake 2.8

我想在将头文件从源目录复制到目标目录时维护目录层次结构。比如需要复制的头文件是 abc/1.h, def/2.h 并且它们也应该以相同的顺序直接复制到目的地(通过 CMAKE_INSTALL_PREFIX 设置)

这是我尝试过的,但它只是复制头文件而不是头文件包括父目录名称

set(HEADERS "abc/1.h;def/2.h")
install(FILES ${HEADERS} DESTINATION include)

最终输出应该是dest_directory/abc/1.h和dest_directory/def/2.h。

【问题讨论】:

    标签: cmake


    【解决方案1】:

    如果目录中有很多要安装的文件,可以考虑使用install(DIRECTORY) 命令流安装目录。您可以使用 PATTERNREGEX 选项选择应该安装目录中的哪些文件:

    install(DIRECTORY "${CMAKE_SOURCE_DIR}/" # source directory
            DESTINATION "include" # target directory
            FILES_MATCHING # install only matched files
            PATTERN "*.h" # select header files
    )
    

    有关install(DIRECTORY) 的更多信息,请参阅CMake documentation。此外,它还描述了源目录末尾的“/”含义。

    【讨论】:

    • 在这里找到了完全相同的副本 - stackoverflow.com/questions/20796048/…
    • @infoclogged:在 Stack Overflow 上,answers 不能重复,只有 questions。参考答案解释了与我类似的事情,但是从不同的角度来做,因为问题是不同的。
    • 我实际上指的是这个问题,但在你的帖子之后,我意识到它的不同。谢谢你的提示:)
    • 如果你有一个多级层次目录,我建议使用 CMAKE_CURRENT_SOURCE_DIR。
    【解决方案2】:

    本着问题的精神,我们希望将所有标头安装在 HEADER 变量中,该变量不一定包含给定目录中的所有标头(例如,可能存在依赖于平台的标头)。

    我们使用以下宏解决了这个问题,它实际上会在创建父目录时安装所有提供给FILES 的文件(如果有的话):

    macro(install_with_directory)
        set(optionsArgs "")
        set(oneValueArgs "DESTINATION")
        set(multiValueArgs "FILES")
        cmake_parse_arguments(CAS "${optionsArgs}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
    
        foreach(FILE ${CAS_FILES})
            get_filename_component(DIR ${FILE} DIRECTORY)
            INSTALL(FILES ${FILE} DESTINATION ${CAS_DESTINATION}/${DIR})
        endforeach()
    endmacro(install_with_directory)
    

    【讨论】:

    • 这是个不错的选择!如何使用宏的示例:install_with_directory( DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${CMAKE_PROJECT_NAME}/ FILES ${HEADERS}) with HEADERS 头文件列表及其目录。
    【解决方案3】:

    自己尝试了几次后才找到答案。它需要在多个步骤中完成。

    install(FILES "abc/1.h" DESTINATION "include/abc")
    install(FILES "def/2.h" DESTINATION "include/def")
    

    在复杂的情况下,可以使用正则表达式。请看Regex in CMake install command

    【讨论】:

      猜你喜欢
      • 2012-06-21
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多