首页 > 解决方案 > CMake source_group 和生成的文件交互

问题描述

对于一个项目,我使用add_custom_command. 据我所知,这会导致 CMake 创建一个GENERATED源文件,我可以将其添加到库或可执行文件等目标中。但是,由于该文件在 CMake 编译时不存在,因此 CMake 无法使用该source_group命令为 IDE (Visual Studio) 对这些生成的文件进行分组。

有没有另一种方法可以达到source_group我找不到的相同结果?例如,当使用带有 Qt 的 CMake 时,您可以设置AUTOGEN_SOURCE_GROUP更改 automoc 和 autorcc 生成文件的源组。

例子。

# Creates a command to generate the 'a.f90' file using 'mytool.exe' and 'a.f90.in'. 
add_custom_command(
    OUTPUT a.f90
    COMMAND mytool.exe a.f90.in
    DEPENDS a.f90.in
)

add_executable(example a.f90 b.f90 c.f90) # Where b.f90 and c.f90 are not generated

source_group("Source Files/Not Generated" FILES "b.f90 c.f90")
source_group("Source Files/Generated" FILES a.f90) # Does nothing

这会产生以下视觉工作室过滤器,

Source Files
|- Non Generated Files
   |- b.f90
   |- c.f90
|- a.f90

代替

Source Files
|- Non Generated Files
   |- b.f90
   |- c.f90
|- Generated Files
   |- a.f90

标签: cmake

解决方案


帮助其他可能正在尝试同样事情的人。这是我的解决方法。我找不到使用add_custom_command. 这留下了一个可能的解决方案。如果您可以在编译代码时不自动生成文件,您可以改用该execute_process命令。当execute_processCMake 创建构建树而不是编译源代码时,将运行该命令。由于文件已经存在,因此可以将其添加为普通源文件,并且可以使用source_group.

例子

# Generates 'a.f90'
execute_process(COMMAND mytool.exe a.f90.in ${CMAKE_CURRENT_BINARY_DIR}/a.f90)

add_executable(main "${CMAKE_CURRENT_BINARY_DIR}/a.f90" b.f90 c.f90)

source_group("Source Files/Not Generated" FILES "b.f90 c.f90")
source_group("Source Files/Generated" FILES a.f90)

有了这个,视觉工作室过滤器看起来像

Source Files
|- Generated
  |- a.f90
|- Not Generated
  |- b.f90
  |- c.f90


推荐阅读