我想检查Makefile中是否存在文件,如果不存在则运行配方,并在创建文件后停止运行,否则继续使用存在的文件并执行更多配方。我认为最好用我的Makefile中的示例来说明:
GEN_C_FILES: GEN_C_FLS
$(shell cat $(DESIGN_TOP).c.tmp c_template.c.tmp > $(DESIGN_TOP).c )
$(DESIGN_TOP).c:
$(MAKE) GEN_C_FILES
@(echo $(DESIGN_TOP).c created and modify it to suit the design before running COMPILE)
exit 1
COMPILE: $(DESIGN_TOP).c
@(echo bsub -I compile_script-batch $(DESIGN_TOP).c -log $(DESIGN_TOP).log)
@(bsub -I compile_script -batch $(DESIGN_TOP).c -log $(DESIGN_TOP).log)
我可以完成我想要的,但是退出会产生一条错误消息。如果要执行$(DESIGN_TOP).c的配方,但是如果不执行该配方,则我希望它退出,因此该文件存在,因此不需要生成该文件,其余的COMPILE目标应通过在bsub上运行编译来完成。有没有更好的方法来完成此操作而又不会在退出时产生错误?谢谢
运行make COMPILE
时无法使其按需运行。使make停止在构建过程的中间并且不再继续进行的唯一方法是失败。但是,相反,您可以首先更改make想要构建的内容,例如:
GOAL = $(if $(wildcard $(DESIGN_TOP).c),COMPILE,$(DESIGN_TOP).c)
all: $(GOAL)
$(DESIGN_TOP).c:
cat $(DESIGN_TOP).c.tmp c_template.c.tmp > $@
@echo $@ created and modify it to suit the design
COMPILE: $(DESIGN_TOP).c
bsub -I compile_script -batch $< -log $(DESIGN_TOP).log
现在,如果您运行make
或make all
并且源文件不存在,则all
的先决条件将是源文件,而没有别的,因此它将被构建,然后make将停止。
如果源文件确实存在,则all
的先决条件将是COMPILE
并将被构建。