创建目录层次结构,独立构建子目录



我目前正在处理一个不太理想的CMake设置,我正在努力纠正。顶级的cmakelistmain .txt包含编译器设置,包括目录、宏等,所有项目都依赖和使用这些设置。我的源代码树包含许多项目,但我在这里缩小了它。

src/ 
  CMakeListsMain.txt  
  project1/  
    -->CMakeLists.txt  
  project2/  
    -->CMakeLists.txt  
  headers/
    -->source headers for every project  

例如cmakelistmain .txt看起来像这样,但更复杂:

MACRO(USE_BOOST target)  
   target_link_libraries(${target} boost_thread-mt boost_filesystem-mt boost_regex-mt boost_system-mt)  
ENDMACRO(USE_BOOST)  
MACRO(USE_PTHREAD target)  
   target_link_libraries(${target} pthread)  
ENDMACRO(USE_PTHREAD)
add_subdirectory(project1)
add_subdirectory(project2)

项目1和项目2都使用了顶层的宏和其他设置CMakeListsTop.txt

以前,如果我想构建一个项目,CMake将不得不在每个目录上运行,这是不好的。

我的问题是,如果我想单独构建每个项目,我如何访问这些宏和其他设置。目前,我已经抽象出的宏到一个不同的文件,并已包括该文件在每个项目的CMakeLists.txt。这样做,我还必须使用绝对路径来引用源树中的头文件,而不是使用CMAKE_SOURCE_DIR/headers

如果没有得到批准,我真的不能改变源代码树的布局,但是有没有更简单的方法来做到这一点,或者我忽略了什么?

添加此宏

MACRO(ADD_PROJECT PROJECT)
  IF(${PROJECT} OR ALL)
    add_subdirectory(${PROJECT})
  ENDIF()
ENDMACRO()

到顶级CMakeLists.txt中,并将所有出现的add_subdirectory替换为

ADD_PROJECT(project1)
ADD_PROJECT(project2)

等等。现在您可以通过调用cmake来构建任何单个项目,标记-Dproject1=1等,或者使用-DALL=1来构建整个项目。

您可以将宏和设置移到模块中。然后,你可以将模块包装在一个包含保护中,以确保它只执行一次,并从每个需要独立构建的CMakeLists.txt中包含它。

对于您的示例,模块文件看起来像:
IF(NOT DEFINED MAIN_SETTINGS_INCLUDED)
   SET(MAIN_SETTINGS_INCLUDED ON)
   MACRO(USE_BOOST target)  
       target_link_libraries(${target} boost_thread-mt boost_filesystem-mt boost_regex-mt boost_system-mt)  
   ENDMACRO(USE_BOOST)  
   MACRO(USE_PTHREAD target)  
       target_link_libraries(${target} pthread)  
   ENDMACRO(USE_PTHREAD)
ENDIF()

最新更新