CMake - 获取各个子项目的源/头文件列表

时间:2016-10-13 19:31:20

标签: c linux cmake

背景

我有一个大型项目,它利用了几十个子项目:一些来自内部代码库,另一些第三方项目也使用CMake

为了确保常见的编译器选项,我在名为CMake的{​​{1}}中设置了一个宏,该宏仅在内部子项目中运行,自己的CreateDevFlags文件作为第一行代码执行。这确保我不会破坏第三方项目的编译器标志,输出目录覆盖等,并且我自己编写的所有代码都使用相同的选项构建。

此外,每个子项目都有一个简单的代码块,用于定义要编译的源文件:

CMakeLists

目标

我想在" master"中添加一个完整性检查自定义规则/功能。项目根目录下的file(GLOB subproject_1A_SRC "src/*.c" ) file(GLOB subproject_1A_INC "inc/*.h" ) file(GLOB subproject_2B_SRC "src/*.c" "extra_src/*.c" ) file(GLOB subproject_2B_INC "inc/*.h" "extra_details_inc/*.h" ) 文件,它通过代码清理程序运行内部子项目的所有代码(检查换行符,强制执行样式规则等)。

问题

是否有一种琐碎的方式让所有人特别注意到#34; (即:内部)子项目将他们自己的源文件附加到" master"源列表(CMakeLists)和标题(.c)文件(可能通过我创建的宏)?我意识到我可以在主.h文件中手动创建这个列表,但是我会重复工作,代码维护者必须在两个地方修改代码才能生效。

谢谢。

3 个答案:

答案 0 :(得分:1)

一种可能的实现方式是在项目的最高范围内定义一个名为FILE_TRACKER的列表。然后,你可以做类似

的事情
# Create local list to append to
set(LOCAL_LIST ${FILE_TRACKER})

# Append all of your source files, from your local source
foreach(SRC_FILE ${subproject_1A_SRC})
    list(APPEND LOCAL_LIST ${SRC_FILE})
endforeach()

# Append to the upper macro (note: was initially set with FILE_TRACKER)
set(FILE_TRACKER ${LOCAL_LIST} PARENT_SCOPE)

开发人员只需要将他们的源添加到一个列表中,顶级的宏将使用这些文件进行更新。

答案 1 :(得分:0)

我建议你不检查头文件。而是使用dirs作为头文件的路径。如果你这样做,你将自动获得依赖工作而无需自己跟踪它们。

您的清理程序应该能够解析实际代码以查找和阅读包含的标题。

答案 2 :(得分:0)

最后。 the following approach solved my problem:

set(DIR1_SRCS "file1.cpp" PARENT_SCOPE)

然后在./CMakeLists.txt

set(SRCS ${DIR1_SRCS} ${DIR2_SRCS})