【发布时间】:2020-07-18 23:54:51
【问题描述】:
我有一个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
但脚本永远不会运行。我确定我遗漏了一些简单的东西,但我就是想不通。
【问题讨论】:
-
它永远不会运行,因为它没有先决条件,并且文件存在,所以它永远不会被 make 认为是过时的。通过比较文件的最后修改时间来制作作品。因此,您必须(a)每次都重新构建它,或者(b)找出一个或多个其他文件,如果更改,则意味着需要更新此标头。
-
但是,正如 OP 所做的那样,将其标记为
.PHONY,应该会导致它每次都被重建,无论它是否已经存在,@MadScientist 不应该吗? -
不,请参阅gnu.org/software/make/manual/html_node/Phony-Targets.html。 “虚假目标不应该是真实目标文件的先决条件;如果是,则每次 make 更新该文件时都会运行其配方。只要虚假目标绝不是真实目标的先决条件,虚假目标只有当虚假目标是指定目标时才会执行目标配方。”
-
是的,
.PHONY会这样做。不知怎的,我没有注意到这一点。奇怪,一定是就地避难失明。但是,只有当它被列为要构建的某些目标的先决条件时,它才会被重建。我不知道自动生成的输出会对prog_SOURCES做什么,但如果它过滤掉.h文件,并且不会将它们作为任何目标的先决条件,因为make 期望依赖生成来管理标题,然后它不会被重建。您可能必须在.am文件中明确将其标记为先决条件。
标签: gnu-make autotools automake