CMake:GCC预处理器IMACROS文件更改不会触发重建

时间:2018-04-04 09:34:09

标签: gcc compilation cmake preprocessor compiler-flags

我正在为GCC使用-imacros选项,以便为项目设置所有预处理器定义(选项)。

imacros之前我一直在使用原始文件,预处理器在CMAKE中定义名称和正则表达式,我创建了-D的列表以放入CMAKE_C_FLAGS

这在文本编辑器中看起来很好但很难看。因此,为了加强这一点,我已更改为-imacros

CMAKE_C_FLAGS将包含-imacros“配置标头的路径”

这样可以正常工作,但是如果我在配置头中更改了一些配置项,则CMAKE不会重新编译该文件(看不到更改)。在旧版本中 - 如您所料 - 如果更改了某些-D,则会重新编译所有文件。

任何帮助?

1 个答案:

答案 0 :(得分:1)

一个简单的方法

您可以使用OBJECT_DEPENDS源文件属性。但是需要为所有源文件设置,例如:

 set_source_files_properties(
     ${sources} 
     PROPERTIES 
         OBJECT_DEPENDS "path to configuration header"
 )

项目中所有源文件的替代

官方CMake建议将所有定义放在所有源文件包含的头文件中。标题可以是例如使用configure_file()从模板生成。

但是要使用-imacros编译器标志来遵循您的思路,如果“配置标头的路径”文件发生更改,以下是触发重建所有源文件的两种替代方法:

  1. 您可以使用define_property(... INHERITED ...)OBJECT_DEPENDS的范围扩展到当前目录中的所有目标及其源文件:

      

    如果INHERITED选项,则get_property()命令将在命令的作用域中未设置请求的属性时链接到下一个更高的作用域。 DIRECTORY范围链到GLOBALTARGETSOURCETEST链到DIRECTORY

    因此,在您的情况下,这转换为:

    define_property(
        SOURCE
        PROPERTY OBJECT_DEPENDS 
        INHERITED 
        BRIEF_DOCS "brief-doc"
        FULL_DOCS  "full-doc"
    )
    
    set_directory_properties(
        PROPERTIES 
            OBJECT_DEPENDS "path to configuration header"
    )
    
  2. 如果我理解正确的话,如果你的“配置标题”应该/会改变,你无论如何都要重新运行CMake。然后,您只需在“配置标题”之外添加一个定义,即使用以下内容跟踪标题:

    file(TIMESTAMP "path to configuration header" _timestamp)
    add_definitions(-DIMACROS_TIMESTAMP=${_timestamp})
    

    现在,每当您的标头获得新的时间戳时,所有目标的定义都在变化,您的构建系统将重建所有源文件。