0

我希望 make 过程仅在执行的第一个目标上有条件地回显在以下 makefile 中,它应该只打印 'a'、'b' 或 'goal'
目前,由于 L 没有被修改,它打印为执行的任何目标。

我已经使用外部临时文件和脚本完成了它,但我想知道如果没有外部文件/脚本是否有可能?

L=1

goal: a b
ifeq ($(L),1)
        @echo goal
        @L=0
endif
        @echo done > goal

a:
ifeq ($(L),1)
        @echo a
        @L=0
endif
        @echo done > a

b:
ifeq ($(L),1)
        @echo b
        @L=0
endif
        @echo done > b
4

1 回答 1

0

您不能使用 ifeq 等,因为这些是预处理器语句:它们在读入 makefile 时执行。

在传统的 make 中,没有办法做你想做的事,除非像你做的那样通过脚本和文件。如果你愿意成为特定的 GNU make,并且需要一个足够新的 GNU make 版本来支持该$(eval ...)功能,那么你可以这样做;就像是:

SHOW := true
goal: a b
        $(if $(SHOW),@echo goal $(eval SHOW :=))
        @echo done > goal
a:
        $(if $(SHOW),@echo a $(eval SHOW :=))
        @echo done > a
b:
        $(if $(SHOW),@echo b $(eval SHOW :=))
        @echo done > b
于 2013-04-03T16:19:14.803 回答