在外部条件(如环境更改)下重建的Makefile

在外部条件(如环境更改)下重建的Makefile,makefile,gnu-make,Makefile,Gnu Make,如果外部条件发生变化,我想重建一个程序 在本例中,条件是当天的日期,以下是我的程序: #include <stdio.h> #define STRINGIZE(x) #x #define STRINGIZE_VALUE_OF(x) STRINGIZE(x) int main(int argc, char *argv[]) { printf("%s", STRINGIZE_VALUE_OF(condition)); } 我试图修改Makefile,如下所示: condit

如果外部条件发生变化,我想重建一个程序

在本例中,条件是当天的日期,以下是我的程序:

#include <stdio.h>

#define STRINGIZE(x) #x
#define STRINGIZE_VALUE_OF(x) STRINGIZE(x)

int main(int argc, char *argv[])
{
    printf("%s", STRINGIZE_VALUE_OF(condition));
}
我试图修改Makefile,如下所示:

condition != date +"%m-%d-%y" | perl -pe chomp

$(shell \
    if [ ! -f CONDITION] || [ "$(condition)" != "$$(cat CONDITION | perl -pe chomp)" ]; \
    then \
    echo "$(condition)" > CONDITION; \
    fi \
)   

all: foo

foo: foo.c | CONDITION
   gcc -Dcondition="$(condition)" $< -o $@
条件!=日期+%m-%d-%y“| perl-pe chomp
美元(壳牌)\
如果[!-f条件]|[“$(条件)”!=“$(cat条件| perl-pe chomp)”\
然后\
回显“$(条件)”>条件\
fi\
)   
所有人:富
foo:foo.c |条件
gcc-Dcondition=“$(条件)”$<-o$@
不幸的是,它不起作用。我猜是因为
make
在执行
$(shell)
例程之前计算文件是否有更改

如何使用
make
实现此功能

编辑
诀窍是不要调用子makefile

我发现了一些东西。诀窍是,如果条件为真,则将目标标记为
.PHONY

condition != date +"%m-%d-%y" | perl -pe chomp

need_rebuild != \
    if [ ! -f CONDITION ] || [ "$(condition)" != "$$(cat CONDITION | perl -pe chomp)" ]; \
    then \
    echo "$(condition)" > CONDITION; \
    echo YES; \
    fi

ifeq ($(need_rebuild),YES)
    $(info Rebuild Needed)
    .PHONY: foo
endif

all: foo

foo: foo.c | CONDITION
    gcc -Dcondition="$(condition)" $< -o $@
条件!=日期+%m-%d-%y“| perl-pe chomp
需要重建!=\
如果[!-f条件]|[“$(条件)”!=“$(cat条件| perl-pe chomp)”\
然后\
回显“$(条件)”>条件\
回声是\
fi
ifeq($(需要重建),是)
$(需要重建信息)
.冒牌货:福
恩迪夫
所有人:富
foo:foo.c |条件
gcc-Dcondition=“$(条件)”$<-o$@

我发现了一些东西。诀窍是,如果条件为真,则将目标标记为
.PHONY

condition != date +"%m-%d-%y" | perl -pe chomp

need_rebuild != \
    if [ ! -f CONDITION ] || [ "$(condition)" != "$$(cat CONDITION | perl -pe chomp)" ]; \
    then \
    echo "$(condition)" > CONDITION; \
    echo YES; \
    fi

ifeq ($(need_rebuild),YES)
    $(info Rebuild Needed)
    .PHONY: foo
endif

all: foo

foo: foo.c | CONDITION
    gcc -Dcondition="$(condition)" $< -o $@
条件!=日期+%m-%d-%y“| perl-pe chomp
需要重建!=\
如果[!-f条件]|[“$(条件)”!=“$(cat条件| perl-pe chomp)”\
然后\
回显“$(条件)”>条件\
回声是\
fi
ifeq($(需要重建),是)
$(需要重建信息)
.冒牌货:福
恩迪夫
所有人:富
foo:foo.c |条件
gcc-Dcondition=“$(条件)”$<-o$@

这里要做的事情是不是战斗,而是使用它

condition != date +"%m-%d-%y"

all: foo

foo: foo.c CONDITION
        gcc -Dcondition="$(condition)" $< -o $@

CONDITION: FORCE
        [ -f $@ ] && [ "$(condition)" = "$$(cat $@)" ] || echo '$(condition)' > $@

FORCE: ;
条件!=日期+%m-%d-%y
所有人:富
foo:foo.c条件
gcc-Dcondition=“$(条件)”$<-o$@
条件:强制
[-f$@]&&&[“$(条件)”=“$(cat$@)”]| | echo'$(条件)>$@
部队:;

这里要做的事情是不是战斗,而是使用它

condition != date +"%m-%d-%y"

all: foo

foo: foo.c CONDITION
        gcc -Dcondition="$(condition)" $< -o $@

CONDITION: FORCE
        [ -f $@ ] && [ "$(condition)" = "$$(cat $@)" ] || echo '$(condition)' > $@

FORCE: ;
条件!=日期+%m-%d-%y
所有人:富
foo:foo.c条件
gcc-Dcondition=“$(条件)”$<-o$@
条件:强制
[-f$@]&&&[“$(条件)”=“$(cat$@)”]| | echo'$(条件)>$@
部队:;

另一种方法是将条件转换为文件时间戳,然后使目标依赖于该条件文件

每当条件的计算结果为
true
时,就会为条件文件分配一个新的时间戳,从而重新生成依赖它的所有目标。必须通过
$(shell)
命令更改该文件的时间戳

例如


另一种方法是将条件转换为文件时间戳,然后使目标依赖于该条件文件

每当条件的计算结果为
true
时,就会为条件文件分配一个新的时间戳,从而重新生成依赖它的所有目标。必须通过
$(shell)
命令更改该文件的时间戳

例如


.PHONY
可能适用于此,但不是正确的解决方案。使用一个临时文件作为条件“戳记”文件,当需要更新条件时,您只需触摸该文件。是的,但问题仍然是一样的,当您触摸您的
戳记文件时,
make
已经确定了
stamp
是否是最新的。否,如果您使用正常的make流程而不是在游戏中使用它们。
。PHONY
可能适用于此,但不是正确的解决方案。使用一个临时文件作为条件“戳记”文件,当需要更新条件时,您只需触摸该文件。是的,但问题仍然是一样的,当您触摸您的
戳记文件时,
make
已确定
stamp
是否为最新版本否,而不是您是否使用正常的make流程,而不是在游戏中处理这些流程。这与OP最初尝试的有何区别?只是OP尝试了一个仅限订单的prereq吗?这与OP最初尝试的有什么不同?只是因为OP试了一个只需预请求的订单吗?哦,哈。这只是一个默认的目标问题。将
all:foo
移动到
CONDITION
上方。编辑。哦,哈。这只是一个默认的目标问题。将
all:foo
移动到
CONDITION
上方。编辑。