CMake 和 VisualStudio:在解决方案资源管理器中分组文件

CMake and VisualStudio: Group files in solution explorer

为了完成一个项目的长时间编码会话,我想测试我的 CPP 项目是否可以按 OS 的排列进行编译。

我一直在Win10中工作。编译正常。
我试过 Raspberry Pi。编译正常。 我将项目的单独副本重新下载到 Win10 客户端 运行 cmake-gui,然后打开项目:解决方案资源管理器中的文件夹结构全部消失。

所以我开始四处挖掘,显然这个结构保存在 CMakeLists.txt 中,命令 source_group。因此,我开始向我的 cmake 列表中添加更多 source_groupings,但出于某种原因,我的分组不会被采用。

示例:
source_group("game\entitysystem" FILES ${entitysystem_SRC}) // Existing grouping source_group("game\entitysystem\components" FILES ${components_SRC}) // My new grouping

我的 glob 是这样的:

file(GLOB components_SRC "game/components/*.h" "game/components/*.cpp" )

file(GLOB entitysystem_SRC "game/entitysystem/*.h" "game/entitysystem/*.cpp" )

我相信我的 GLOB 是正确的,因为新的项目克隆编译得很好。只是 Visual Studio 的解决方案资源管理器中新结构的每一部分似乎都丢失了。是的,我已经清除了Cmake的缓存并重新生成了项目。不改变它。

原始结构:

克隆的项目结构:

编辑:

我在 source_group 中确实犯了一个错误,因为它不应该将组件放在实体系统下,但是,为什么 Visual Studio 中没有创建任何过滤器?

首先,确保您正在设置 set_property(GLOBAL PROPERTY USE_FOLDERS ON)

其次,不建议使用GLOB收集源文件列表。来自 file(GLOB 文档:

We do not recommend using GLOB to collect a list of source files from your source tree. If no CMakeLists.txt file changes when a source is added or removed then the generated build system cannot know when to ask CMake to regenerate.

列出项目文件的推荐方法是手动将它们添加到 CMakeLists.txt。

如果您仍想 GLOB,您似乎想在源代码树中镜像目录结构。您可以在定义库或可执行文件的每个地方使用这样的宏来自动为您排序:

foreach(FILE ${SRCS}) 
    # Get the directory of the source file
    get_filename_component(PARENT_DIR "${FILE}" DIRECTORY)

    # Remove common directory prefix to make the group
    string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" GROUP "${PARENT_DIR}")

    # Make sure we are using windows slashes
    string(REPLACE "/" "\" GROUP "${GROUP}")

    # Group into "Source Files" and "Header Files"
    if ("${FILE}" MATCHES ".*\.cpp")
       set(GROUP "Source Files${GROUP}")
    elseif("${FILE}" MATCHES ".*\.h")
       set(GROUP "Header Files${GROUP}")
    endif()

    source_group("${GROUP}" FILES "${FILE}")
endforeach()