将Source的子目录添加到cmake项目中

时间:2012-01-19 22:26:33

标签: cmake

我的项目没有被分成库,但源是在目录树中组织的。我不知道如何告诉cmake进入目录,然后将该目录中的源添加到父目录中定义的项目。我尝试了以下方法:

项目/来源/ CMakelists.txt中的

set(SOURCE
    ${CMAKE_CURRENT_SOURCE_DIR}/unitTest/main.cpp
  )
add_subdirectory("${PROJECT_SOURCE_DIR}/folder1")
add_executable(UnitTestRNG ${SOURCE} ${HEADERS})

然后在project / source / folder1 / CMakeLists.txt中:

set(SOURCE
   ${SOURCE}
   ${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp
   ${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp
)
set(HEADERS
   ${HEADERS}
   ${CMAKE_CURRENT_SOURCE_DIR}/file1.hpp
   ${CMAKE_CURRENT_SOURCE_DIR}/file2.hpp
)

使用一些message()语句,我发现子文件夹将获取SOURCE变量的内容,但是对该变量的新赋值将不会在返回到父CMakeLists.txt时保留

寻找示例并在cmake教程中得出结论:   - 源文件结构通常在项目中是平的   - 如果代码被分成文件夹,通常会将其分成相应的库。

我想知道是否有一些“最佳实践”,我通过尝试这种结构而偏离它。

3 个答案:

答案 0 :(得分:34)

就像arrowdodger的第二部分回答的那样:  在project / source / folder1 / CMakeLists.txt中:

set(SOURCE
   ${SOURCE}
   ${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp
   ${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp
   PARENT_SCOPE
)
set(HEADERS
   ${HEADERS}
   ${CMAKE_CURRENT_SOURCE_DIR}/file1.hpp
   ${CMAKE_CURRENT_SOURCE_DIR}/file2.hpp
   PARENT_SCOPE
)

答案 1 :(得分:4)

您是否只能在project / source / CMakelists.txt中设置所有来源?

无论如何,您需要的是set command上的PARENT_SCOPECACHE选项。

答案 2 :(得分:2)

从CMake 3.1开始,有一种新方法可从子目录添加源:target_sources

假设您都有root_dir和root_dir / sub_dir以及源文件。使用target_sources,您可以执行以下操作:

在root_dir / CMakeLists.txt中定义目标

add_library(some_target main.cpp)
add_subdirectory(sub_dir)

在root_dir / sub_dir / CMakeLists.txt中添加源:

target_sources(some_target PRIVATE more_cool_stuff.cpp)

some_target 现在将同时包含两个源文件。

还可以使用 some_target 在root_dir / sub_dir / CMakeLists.txt中使用其他命令,例如target_compile_definitions,这很方便。

我了解了target_sources here, check it out if you want more explanation and examples