在配置时将 headers 放入构建目录(符号链接)

putting headers into build directory at configure time (symlinks)

我有一个项目具有以下文件结构(过渡到 CMake),源文件和 header 文件位于同一目录中:

root
 +- module1
   +- a.hpp
   +- a.cpp
   +- b.hpp
   +- b.cpp
   + module1a
     +- a.hpp
     +- b.cpp
 +- module2
   +- a.hpp
   +- a.cpp

Header 个文件相互包含为 #include<projectname/module1/a.hpp>。在构建 .cpp 文件之前,如何指示 CMake 将所有 header 作为此结构安装到构建目录中?我简单地查看了 install(DIRECTORY "${CMAKE_SOURCE_DIR}/module1" DESTINATION "projectname/module1" FILES_MATCHING PATTERN "*.hpp")(来自 ),但它确实将那些 header 安装到构建目录中(没有任何反应)。

仅在 compile-time 时才需要 header,在运行时不需要。

我能得到一些如何实现的提示吗?

编辑: 源三中的目录布局与 #include 指令包含它的方式不同。例如,考虑 #include<projectname/module1a/a.hpp>include_directories 不适用于此 header。 #include<projectname/module1/a.hpproot!=projectname 相同。 Header从旧布局到新布局必须copied/symlinked先。

这是将在配置时创建符号链接的解决方案(可能不完美,但有效):

macro(create_symlink target linkname)
    execute_process(
        COMMAND ln -sf "${target}" "${linkname}" 
        RESULT_VARIABLE HEADER_LINK_STATUS
        ERROR_VARIABLE HEADER_LINK_ERROR
    )
    if(NOT "${HEADER_LINK_STATUS}" EQUAL 0)
        message(FATAL_ERROR "Symlinking headers failed:\n${HEADER_LINK_ERROR}")
    endif()
endmacro()

MESSAGE(STATUS "Symlinking headers …")
FILE(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/projectname")
create_symlink("${CMAKE_SOURCE_DIR}/module1" "${CMAKE_BINARY_DIR}/projectname/module1")
create_symlink("${CMAKE_SOURCE_DIR}/module1/module1a" "${CMAKE_BINARY_DIR}/projectname/module1a")
create_symlink("${CMAKE_SOURCE_DIR}/module2" "${CMAKE_BINARY_DIR}/projectname/module2")