在配置时将 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.hpp
与 root
!=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")
我有一个项目具有以下文件结构(过渡到 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")
(来自
仅在 compile-time 时才需要 header,在运行时不需要。
我能得到一些如何实现的提示吗?
编辑: 源三中的目录布局与 #include
指令包含它的方式不同。例如,考虑 #include<projectname/module1a/a.hpp>
。 include_directories
不适用于此 header。 #include<projectname/module1/a.hpp
与 root
!=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")