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

CMake: GCC preprocessor IMACROS file change does not trigger rebuild

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

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

这工作正常但在文本编辑器中很难看。因此,为了增强这一点,我已更改为 -imacros.

CMAKE_C_FLAGS 将包含 -imacros "path to configuration header"

这工作正常,但如果我更改配置中的某些配置项 header CMAKE 不会重新编译文件(看不到更改)。在旧版本中 - 如您所料 - 如果某些 -D 被更改,所有文件都将被重新编译。

有什么帮助吗?

一个简单的方法

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

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

项目中所有源文件的备选方案

CMake 官方建议将所有定义放在一个 header 文件中,该文件包含在所有源文件中。 header 可以例如使用 configure_file().

从模板生成

但是为了遵循您使用 -imacros 编译器标志的思路,这里有两种替代方法可以在 "path to configuration header" 文件更改时触发所有源文件的重建:

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

    If the INHERITED option then the get_property() command will chain up to the next higher scope when the requested property is not set in the scope given to the command. DIRECTORY scope chains to GLOBAL. TARGET, SOURCE, and TEST chain to 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. 如果我理解正确,如果您的 "configuration header" should/would 更改,您无论如何都必须 re-run CMake。然后你可以简单地在你的 "configuration header" 之外添加一个定义来跟踪 header ,比如:

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

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