2013-04-03 46 views
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 

回答

0

不能IFEQ等使用,因为这些都是预处理声明:它们被执行的生成文件在读取

在传统的化妆是没有办法做你想要什么,除了通过脚本和文件,就像你所做的一样。如果你愿意成为GNU特定的,并且要求GNU版本足够支持$(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 
+0

完美。谢谢。 – Photon