我需要 Makefile.am 规则来更新包含文件

I need a Makefile.am rule to update include file

我有一个 Makefile.am 看起来像这样:

bin_PROGRAMS = prog

AM_CFLAGS = $(prog_CFLAGS)

prog_SOURCES = \
    data.h \
    src1.c \
    src2.c \
    ...
    src30.c

data.h 文件有时会根据特定条件由 update_data.pl perl 脚本更新。我尝试将其添加到 Makefile.am:

的末尾
.PHONY: data.h
data.h:
    perl update_data.pl

但脚本从未运行。我确定我遗漏了一些简单的东西,但我就是想不通。

因为您已经有一个 data.h 文件,并且它不依赖于任何东西,make 认为没有什么可以更新它的。

确实没有什么好方法可以让 make 始终重新创建文件。如果你想在更新脚本时重新生成它,你可以让它依赖于 update_data.pl 文件。或者,如果它正在解析和转换数据文件,您可以让它依赖于数据文件(以及脚本)。

但是如果你的构建不是封闭的,并且内容依赖于一些make无法知道的东西,那么就没有好的方法来解决你的问题。

我正在做类似的事情来更新 header 文件,根据当前 git 分支、HEAD 提交、树脏状态进行一些定义。

可能有一些未发现的极端情况,但这对我有用。希望能给你一些启发。

CLEANFILES    += git-info.h
BUILT_SOURCES += git-info.h.stamp
git-info.h.stamp:
        echo "#ifndef GIT_INFO_H" > git-info.h.new
        echo "#define GIT_INFO_H" >> git-info.h.new
        echo "..." >> git-info.h.new
        echo "#endif" >> git-info.h.new
        if test -f git-info.h && cmp git-info.h.new git-info.h; then :; \
        else cat git-info.h.new > git-info.h; fi; \
        rm -f git-info.h.new

备注:

  • 永远不会创建戳记文件,因此此规则将始终有效 在 "make all" 上执行(但不是在 "make my-program" 上执行)。

  • git-info.h 只有在实际发生变化时才会被触及。这个 避免仅由 git-info.h 的更新时间戳引起的重建 内容没有任何变化。

  • 为了在 git-info.h 发生变化时减少重建工作,我 仅包含来自单个生成的 git-info.h header 常规 C my_program_SOURCES 源文件 git-info.c 其中 然后定义一些全局 char foo[] = FOO; 符号 然后将链接到最终的可执行文件。

  • git-info.o文件会自动依赖git-info.h, 这将在 header 更改时导致重建。

这就是我最终让它工作的方式。使用 $(shell) 可能不是最好的方法,但它确实有效。

bin_PROGRAMS = prog

AM_CFLAGS = $(prog_CFLAGS)

update_data := $(shell ./update_data.pl > /dev/tty)

prog_SOURCES = \
    data.h \
    src1.c \
    src2.c \
    ...
    src30.c