【问题标题】:CMake source_group and generated files interactionCMake source_group 和生成的文件交互
【发布时间】:2021-06-16 00:10:14
【问题描述】:

对于一个项目,我使用add_custom_command 自动生成多个 Fortran 源文件。据我所知,这会导致 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


    【解决方案1】:

    帮助其他可能正在尝试同样事情的人。这是我的解决方法。我找不到使用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
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多