Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gnu make 我需要一个Makefile.am规则来更新include文件_Gnu Make_Autotools_Automake - Fatal编程技术网

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
标题 常规C
myu程序\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,只有正常的automake
    Makefile
    s将处于活动状态。