Visual Studio IDE中,通过CMake组织源码目录
利用CMake组织代码时,如果通过visual studio IDE打开工程时,在解决方案中,通常会表现出如下的代码树结构:
其对应的CMakeLists内容通常如下:
set(StnConfig_Files
UniConfig.h
UniConfig.cpp
)
if (MSVC)
source_group("StnConfig Files" FILES ${StnConfig_Files})
endif()
add_library(targetname SHARED ${Header_Files} ${Source_Files} ${StnConfig_Files})
当工程文件变多时,我们通常会将不同的文件按需放在指定的文件夹下。同样地,我们也希望在IDE的工程代码树中能以嵌套的组织目录将代码文件呈现出来:
CMake中的 source_group 另一个版本可以满足如上需求:
source_group(TREE <root> [PREFIX <prefix>] [FILES <src>...])
- TREE CMake 会自动检测
<src>
文件路径来确定需要创建的 source groups, 使得工程中的目录结构与实际文件在磁盘上的目录结构保持一致。<src>
文件的路径将被切割成相对于<root>
的路径; - PREFIX 在
<root>
路径中的 Source group 和文件会被放在<prefix>
group 中;
假设我有如下的代码目录:
其对应的CMakeLists内容更改如下:
set(SOURCE_LIST
chap05/hexspinbox/hexspinbox.h
chap05/hexspinbox/hexspinbox.cpp
chap05/iconeditor/iconeditor.h
chap05/iconeditor/iconeditor.cpp
chap06/findfile1/findfiledialog.h
chap06/findfile1/findfiledialog.cpp
)
if (MSVC)
# Create the source groups for source tree with root at CMAKE_CURRENT_SOURCE_DIR.
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCE_LIST})
endif()
add_executable(${targetname} ${Header_Files} ${Source_Files} ${SOURCE_LIST})
Note: ${SOURCE_LIST} 需要在构建 target 的列表里,否则 source_group(TREE …) 不会起作用!
VS IDE中的工程目录如下:
[1]: https://cmake.org/cmake/help/v3.8/command/source_group.html