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

CMake:GCC预处理器IMACROS文件更改不会触发重建,gcc,compilation,cmake,preprocessor,compiler-flags,Gcc,Compilation,Cmake,Preprocessor,Compiler Flags,我使用GCC的-imacros选项来设置项目的所有预处理器定义(选项) 在imacros之前,我一直在使用一个原始文件,其中预处理器定义了名称,并在CMAKE中使用了一个正则表达式,我创建了-D列表,以放入CMAKE\u C\u标志 这可以很好地工作,但在文本编辑器中很难看到。为了增强这一点,我改为-imacros CMAKE_C_标志将包含-imacros“配置头的路径” 这很好,但是如果我在配置头中更改了一些配置项,CMAKE不会重新编译文件(看不到更改)。在旧版本中-正如您所料-如果某些-

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

imacros
之前,我一直在使用一个原始文件,其中预处理器定义了名称,并在CMAKE中使用了一个正则表达式,我创建了
-D
列表,以放入
CMAKE\u C\u标志

这可以很好地工作,但在文本编辑器中很难看到。为了增强这一点,我改为
-imacros

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

这很好,但是如果我在配置头中更改了一些配置项,CMAKE不会重新编译文件(看不到更改)。在旧版本中-正如您所料-如果某些
-D
被更改,所有文件都将重新编译

有什么帮助吗?

一个简单的方法 您可以使用源文件属性。但这需要为所有源文件设置如下内容:

设置源文件属性(
${sources}
性质
对象_取决于“配置头的路径”
)
项目中所有源文件的备选方案 CMake正式建议将所有定义放在一个头文件中,该头文件包含在所有源文件中。例如,可以使用从模板生成标题

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

  • 您可以通过以下方法将
    OBJECT\u dependens
    的范围扩展到当前目录中的所有目标及其源文件:

    如果
    继承了
    选项,则当请求的属性未在指定给该命令的范围内设置时,
    get_property()
    命令将链接到下一个更高的范围<代码>目录
    范围链到
    全局
    <代码>目标
    测试
    链接到
    目录

    因此,在您的情况下,这意味着:

    define_属性(
    来源
    属性对象依赖于
    继承
    简要文档“简要文档”
    完整文档“完整文档”
    )
    设置目录属性(
    性质
    对象_取决于“配置头的路径”
    )
    
  • 如果我理解正确,如果您的“配置头”应该/将会更改,您无论如何都必须重新运行CMake。然后,您可以简单地在“配置头”之外添加一个定义,以跟踪头,如下所示:

    文件(时间戳“配置头的路径”\u时间戳)
    添加定义(-DIMACROS\u TIMESTAMP=${\u TIMESTAMP})
    
    现在,每当您的头获得新的时间戳时,所有目标的定义都在更改,构建系统将重建所有源文件


  • 这是一个巨大的项目,不可能。但可能有一个类似的解决方案,使项目依赖于该文件?工程完美!感谢您的时间和CMake:D的推荐版本