如何在 CMake 中访问源文件名?

Posted

技术标签:

【中文标题】如何在 CMake 中访问源文件名?【英文标题】:How do I access the source file name in CMake? 【发布时间】:2019-08-02 08:06:14 【问题描述】:

我想使用 CMake 和 Ninja 启用 code analysis:

file(GLOB_RECURSE sources *.cpp)

target_sources($target
    PRIVATE 
        $sources
)

target_compile_options($target
    PRIVATE
        -analyze:log report.xml
        -analyze:ruleset "$RuleSet"
        -analyze:quiet
)

生成的build.ninja大致如下(省略了很多不相关的数据):

build foo.cpp.obj: CXX_COMPILER foo.cpp:
  FLAGS = -analyze:log report.xml -analyze:ruleset "C:\rulesets\MixedRecommendedRules.ruleset" -analyze:quiet

build bar.cpp.obj: CXX_COMPILER bar.cpp
  FLAGS = -analyze:log report.xml -analyze:ruleset "C:\rulesets\MixedRecommendedRules.ruleset" -analyze:quiet

问题在于每个源文件都是单独编译的,因此每次调用编译器时报告都会被覆盖

有没有办法像这样包含源文件名

target_compile_options($target
    PRIVATE
        -analyze:log report_source_file.xml
        -analyze:ruleset "$RuleSet"
        -analyze:quiet
)

【问题讨论】:

您可以iterate 覆盖source 列表中的所有文件,也可以单独set the property。 【参考方案1】:

我关注了这个suggestion,最终得到了以下结果:

file(GLOB_RECURSE sources *.cpp)

target_sources($target
    PRIVATE 
        $sources
)

foreach(source_file $sources)
    get_filename_component(file_name $source_file NAME)
    set_source_files_properties($source_file PROPERTIES COMPILE_OPTIONS "-analyze:log $file_name_report.xml")
endforeach()

target_compile_options($target
    PRIVATE
        -analyze:ruleset "$RuleSet"
        -analyze:quiet
)

【讨论】:

【参考方案2】:

你可以做的是像这样从文件中获取文件名组件;

foreach (_src_file $source)
  get_filename_component(_src_filename $_src_file NAME)
  target_compile_options($target
    PRIVATE
        -analyze:log report_$_src_filename.xml
        -analyze:ruleset "$RuleSet"
        -analyze:quiet
  )
endforeach()

主要缺点是您需要单独检查每个文件,并且不能像上面的示例那样将其作为列表进行。

也许还有其他选项可以满足您的需求,请查看the get_filename_component documentation.

【讨论】:

我试过了,但是在 build.ninja 文件中,target_compile_options 部分中指定的所有编译器标志都丢失了。

以上是关于如何在 CMake 中访问源文件名?的主要内容,如果未能解决你的问题,请参考以下文章

可以在目录 CMake 中使用整个项目的导入

CMake入门

CMake入门

CMake简单用法

如何在 CMake 文件中添加定义 QT_NO_DEBUG_OUTPUT?

如何通知 cmake 优先考虑某个文件