为了提高项目的可维护性,我们通常会将不同用途的代码文件放到不同的文件夹中,如头文件放到include目录,源文件放到src目录,第三方库放到3rd目录等。

当使用CMake生成Visual Studio工程时,我们亦希望在Visual Studio中能看到这样的文件结构。当然,我们可以使用source_group指令进行添加,但当目录和层级很多时,这样添加起来就显得比较繁琐了,本文介绍一种懒人方法。

函数group_sources用于遍历传入文件并根据文件所在目录添加source_group指令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function(group_sources)
foreach(_source IN ITEMS ${ARGN})
if (IS_ABSOLUTE "${_source}")
file(RELATIVE_PATH _source_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${_source}")
else()
set(_source_rel "${_source}")
endif()

# 获取文件所在目录
get_filename_component(_source_path "${_source_rel}" PATH)

# 替换为Windows路径样式
string(REPLACE "/" "\\" _source_path_msvc "${_source_path}")

source_group("${_source_path_msvc}" FILES "${_source}")
endforeach()
endfunction(group_sources)

函数group_sources支持传入多个参数,使用方法如下:

1
2
3
4
5
file(GLOB_RECURSE HEADER_FILES       ./include/*.hpp ./include/*.h)
file(GLOB_RECURSE SOURCE_FILES ./src/*.cc ./src/*.cpp)

# 安装目录层级对${HEADER_FILES}和${SOURCE_FILES}中的文件进行分组
group_sources(${HEADER_FILES} ${SOURCE_FILES})