我目前正在处理一个不太理想的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
。
如果没有获得批准,我无法真正更改源代码树的布局,但是有更简单的方法可以做到这一点或我忽略的事情吗?
答案 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
调用整个项目来构建任何单个项目。