【问题标题】:CMake directory hierarchy, building a sub-directory independentlyCMake目录层次结构,独立构建子目录
【发布时间】:2014-08-07 22:21:50
【问题描述】:

我目前正在处理我正在尝试纠正的不太理想的 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

未经批准,我无法真正更改源代码树的布局,但有没有更简单的方法可以做到这一点或我忽略了什么?

【问题讨论】:

    标签: c++ cmake


    【解决方案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 调用整个项目。

    【讨论】:

      【解决方案2】:

      您可以将宏和设置移出到模块中。然后,您可以将模块包装在包含保护中,以确保它只执行一次,并从需要独立构建的每个 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()
      

      【讨论】:

      • 如果模块只包含宏定义,则不需要使用标头保护来保护模块。顺便说一句,为了避免整个模块缩进,您可以使用return
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      相关资源
      最近更新 更多