我需要 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
我有一个 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 常规 Cmy_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