我有一个大型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
文件中手动创建这个列表,但是我会重复工作,代码维护者必须在两个地方修改代码才能生效。
谢谢。
答案 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})