如何使用 makefile 生成自动头文件

Posted

技术标签:

【中文标题】如何使用 makefile 生成自动头文件【英文标题】:How to generate auto header file with using makefile 【发布时间】:2017-12-01 07:46:39 【问题描述】:

我正在开发一个包含大量源代码的项目。我想在编译项目时使用makefile创建一个包含特定环境变量的头文件,因为项目具有不同的类型。我想在项目中的任何地方使用头文件,因为我不想在编译项目时包含一些代码 sn-ps,反之亦然。我该怎么做?

【问题讨论】:

首先,选择一种语言,C或C++;不要在没有比这个问题中显示的更多理由的情况下对问题进行双重标记。接下来,您打算如何使用环境变量创建标头?如果标头不存在,则运行 shell 脚本?信息何时更改?每次编译?如果是这样,您可能每次都重新编译整个项目。但是,如果您不这样做,您将很容易受到环境中未反映在代码中的更改的影响。您可能会创建一个新标题并将新文件与旧文件(如果存在)进行比较,如果有更改,则将新文件复制到旧文件上。 如果是关于设置#define,将宏值作为命令行参数传递给编译器可能是一个选项,例如`-D MYSETTING=ABC',也是 没错,我想做linux内核autoconf.h文件 autoconf.h 使用了一些非常高级的技巧来避免在每次一些小变量发生更改时重新构建每个文件。如果你想这样做,你必须研究它是如何工作的......另请注意:使用@StephanLechner 的方法,如果你更改了一个变量,它可能不会导致依赖源文件重建(取决于makefile布局...) 【参考方案1】:

这里有一个快速的解决方案。这个想法是生成一个临时的 .h 文件,并且仅在某些内容发生更改时才更新实际的 .h 。这会阻止您每次都进行重建。

 #dummy target that forces another to be run once per make invokation
 .FORCE:

 #target is run once per make
 file.h.gen: .FORCE
      echo "FOO=$(FOO)" > $@
      echo "BAR=$(BAR)" > $@

 #because file.h.gen is always updated, this is run once per make
 file.h : file.h.gen
      rsync --checksum $< $@

请注意,如果您修改 file.h 中的 any 变量,它将需要重建 all 依赖它的文件。如果需要,您可以将 .h 文件分成多个文件以提供更好的粒度。例如,您可以为每个变量创建一个头文件,每个源文件将只包含它感兴趣的变量头。这样您只需要重新构建文件。

【讨论】:

以上是关于如何使用 makefile 生成自动头文件的主要内容,如果未能解决你的问题,请参考以下文章

Makefile中自动生成头文件依赖

如何让 Makefile 自动重建包含修改后的头文件的源文件? (在 C/C++ 中)

如何使用自动工具安装仅头文件的 C++ 库?

如何在makefile中指定头文件目录

如何制作一个makefile文件

makefile自动生成依赖关系 可自动检测头文件变化