cmake实现自动扫描源文件


在使用cmake工具构建项目时,需要向target中添加源文件,比如:add_executable (DesignPattern main.cpp)。这样会产生一个问题,当文件少的时候可以维护,但是,当文件有成百上千时,想要维护就会变得很麻烦。虽然出问题时解决起来应该不算复杂,但如果有自动扫描的方式还是会好很多。下面是一个可以实现自动扫描的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 定义一个全局的list变量 一定要是一个全局变量
set(GLOBAL_LIST "" CACHE INTERNAL "Global list")
# 添加元素到全局list
function(append_to_global_list value)
set(GLOBAL_LIST "${GLOBAL_LIST}" ${value} CACHE INTERNAL "Global list" FORCE)
endfunction()

#findSrc 函数名 通过深度优先的方式,将给定路径中的所有源文件找到
#dirPath 参数
function(findSrc dirPath)
# 设定要遍历的目录,保存到 VAC_INCLUDE_DIR 变量
set(VAC_INCLUDE_DIR ${dirPath})

# 获取指定目录下的所有内容,并将获取到的内容保存到变量 ALL_ITEMS
file(GLOB ALL_ITEMS ${VAC_INCLUDE_DIR}/*)
foreach (ITEM ${ALL_ITEMS})
# 找出.cpp或者.h文件
STRING(FIND ${ITEM} ".cpp" pos1)
STRING(FIND ${ITEM} ".h" pos2)
if (pos1 GREATER -1 OR pos2 GREATER -1)
append_to_global_list(${ITEM})
endif ()
if (IS_DIRECTORY ${ITEM})
findSrc(${ITEM})
endif ()
endforeach ()
endfunction()

# 调用函数
findSrc(${CMAKE_SOURCE_DIR}/Src)


# 在其他地方通过以下命令获取这个list
set(GLOBAL_LIST "${GLOBAL_LIST}" CACHE INTERNAL "Global list" FORCE)

# target 你的工程名称
add_executable (target ${GLOBAL_LIST})

注意,当增加或者删除文件时,需要重新运行cmake文件

完整文件链接:https://gitee.com/liangxi1125/designpatterns/blob/master/CMakeLists.txt