对于一个项目,我使用
add_custom_command
自动生成多个 Fortran 源文件。据我所知,这会导致 CMake 创建一个 GENERATED
源文件,我可以将其添加到目标(例如库或可执行文件)中。但是,由于该文件在 CMake 编译时不存在,因此 CMake 无法使用 source_group
命令为 IDE (Visual Studio) 分组这些生成的文件。
是否有另一种方法可以达到与
source_group
相同的结果,但我找不到?例如,当将 CMake 与 Qt 结合使用时,您可以设置 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
这会产生以下 Visual Studio 过滤器,
Source Files
|- Non Generated Files
|- b.f90
|- c.f90
|- a.f90
而不是
Source Files
|- Non Generated Files
|- b.f90
|- c.f90
|- Generated Files
|- a.f90
帮助其他可能正在尝试同样事情的人。这是我的解决方法。我找不到使用
add_custom_command
对自动生成的文件进行分组的方法。这留下了一个可能的解决方案。如果您不介意在编译代码时不自动生成文件,则可以使用 execute_process
命令。使用 execute_process
,该命令将在 CMake 创建构建树时运行,而不是在编译源代码时运行。由于文件已经存在,因此可以作为普通源文件添加,并且可以使用 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
虽然不是完整的解决方案,
您可以使用
source_group
的正则表达式变体
source_group("Generated Sources" REGULAR_EXPRESSION ".*GENERATED.*")
只有当可以使用正则表达式过滤掉生成文件时,这才有效,但与正常的
source_group
不同,它似乎能够处理生成的文件(在 Visual Studio 上测试)