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

时间:2014-08-07 22:21:51

标签: c++ cmake

我目前正在处理一个不太理想的CMake设置,我正在努力纠正。顶级CMakeListsMain.txt包含所有项目依赖和使用的编译器设置,包括目录,宏等。我的源代码树包含许多项目,但我已将其缩减到此处。

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

例如,CMakeListsMain.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

如果没有获得批准,我无法真正更改源代码树的布局,但是有更简单的方法可以做到这一点或我忽略的事情吗?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:1)

添加此宏

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

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

ADD_PROJECT(project1)
ADD_PROJECT(project2)

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