Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake安装头文件并维护目录继承权_Cmake - Fatal编程技术网

CMake安装头文件并维护目录继承权

CMake安装头文件并维护目录继承权,cmake,Cmake,使用cmake 2.8 我希望在将头文件从源目录复制到目标目录时保持目录继承权。例如,需要复制的头文件是 abc/1.h、def/2.h,并且它们也应以相同的顺序直接复制到目标中(通过CMAKE_INSTALL_前缀设置) 这是我尝试过的,但它只是复制头文件,而不是包含父目录名的头文件 set(HEADERS "abc/1.h;def/2.h") install(FILES ${HEADERS} DESTINATION include) 最后的输出应该是dest_directory/abc/1

使用cmake 2.8

我希望在将头文件从源目录复制到目标目录时保持目录继承权。例如,需要复制的头文件是 abc/1.h、def/2.h,并且它们也应以相同的顺序直接复制到目标中(通过CMAKE_INSTALL_前缀设置)

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

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

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

我自己在尝试了几次之后才找到答案。这需要分多个步骤来完成

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

在复杂的情况下,可以使用正则表达式。请参阅

< p>如果在安装目录中有许多文件,可以考虑安装代码:<代码>安装(目录)< /C>命令流。您可以选择目录中应使用模式或正则表达式选项安装的文件:


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

本着问题的精神,我们希望在
HEADER
变量中安装所有头,该变量不一定包括给定目录中的所有头(例如,可能存在平台相关头)

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

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)

在这里找到了一个完全相同的副本-@infocloubled:On Stack Overflow答案不能重复,只能是问题。参考答案解释了类似于我的答案,但从不同的角度出发,因为问题是不同的。我实际上是指这个问题,但在你的帖子之后,我意识到它是不同的。谢谢你的提示:)这是一个很好的选择!如何使用宏的示例:
install\u with_directory(DESTINATION${CMAKE\u install\u PREFIX}/include/${CMAKE\u PROJECT\u NAME}/FILES${HEADERS})
with HEADERS头文件列表及其目录。
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)