Gnu make 我需要一个Makefile.am规则来更新include文件
我有一个Gnu make 我需要一个Makefile.am规则来更新include文件,gnu-make,autotools,automake,Gnu Make,Autotools,Automake,我有一个Makefile.am,看起来像这样: bin_PROGRAMS = prog AM_CFLAGS = $(prog_CFLAGS) prog_SOURCES = \ data.h \ src1.c \ src2.c \ ... src30.c data.h文件有时由update\u data.plperl脚本根据特定条件进行更新。我尝试将此添加到Makefile.am的末尾: .PHONY: data.h data.h: perl
Makefile.am
,看起来像这样:
bin_PROGRAMS = prog
AM_CFLAGS = $(prog_CFLAGS)
prog_SOURCES = \
data.h \
src1.c \
src2.c \
...
src30.c
data.h
文件有时由update\u data.pl
perl脚本根据特定条件进行更新。我尝试将此添加到Makefile.am的末尾:
.PHONY: data.h
data.h:
perl update_data.pl
但脚本从未运行过。我确信我遗漏了一些简单的东西,但我就是想不出来。因为您已经有了一个data.h
文件,并且它不依赖于任何东西,make
认为没有什么可以做的来更新它
没有什么好办法告诉make
始终重新创建文件。如果您想在更新脚本时重新生成它,可以让它依赖于update_data.pl
文件。或者,如果它正在解析和转换数据文件,则可以让它依赖于数据文件(以及脚本)
但是,如果您的构建不是封闭的,并且内容依赖于make
不知道的东西,那么就没有好的方法来解决您的问题。我正在做类似的事情,根据当前的git分支、HEAD commit、tree dirty状态,用一些定义来更新头文件
可能会有一些未被发现的角落案例,但对我来说很有效。愿它给你一些启示
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
注:
- 永远不会创建戳记文件,因此此规则将始终保持不变
执行“全部生成”(但不是“生成我的程序”)
git info.h
只有在实际更改时才会被触摸。这
避免仅由更新的时间戳git info.h
内容没有任何变化
- 为了在git info.h
发生更改时减少重建工作量,我
仅包括从单个文件生成的git info.h
标题
常规Cmyu程序\u源代码
source文件git info.C
然后定义一些全局的charfoo[]=foo代码>符号
然后将链接到最终的可执行文件
git info.o
文件将自动依赖于git info.h
,
这将在标头更改时导致重建
这就是我最终让它工作的方式。使用$(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
它从不运行,因为它没有先决条件,并且文件存在,因此make从不认为它过时。通过比较文件上上次修改的时间使其生效。因此,您必须(a)每次重建它,或者(b)找出一个或多个其他文件,如果更改,则意味着需要更新此标头。但是,将其标记为。正如OP所做的那样,虚假的,应该会导致每次重建它,而不管它是否已经存在,@madcascient?不,请参阅。“虚假目标不应是真实目标文件的先决条件;如果是,则每次make更新该文件时都将运行其配方。只要虚假目标永远不是真实目标的先决条件,则只有当虚假目标是指定目标时才会执行虚假目标配方。”是,。phony
将执行此操作。不知怎么的,我没有注意到。奇怪的是,一定是隐蔽处失明了。但是,只有当它被列为要构建的某个目标的先决条件时,才会重建它。我不知道automake生成的输出将如何处理prog\u SOURCES
,但是如果它过滤掉.h
文件,并且不会将它们作为任何目标的先决条件,因为make希望依赖项生成来管理头,那么它就不会被重建。您可能必须在.am
文件中将其明确标记为先决条件。您可以将$(shell)
内容移动到GNUmakefile中。在中,哪个包含Makefile
,然后执行dummy:=$(shell…
。然后configure
可以通过AC\u CONFIG\u文件([GNUmakefile])
生成GNUmakefile
。然后,每当您运行GNU make时,$(shell…
东西都会工作。这就是$(shell…
工作的地方。对于非GNU make,只有正常的automakeMakefile
s将处于活动状态。