Makefile 对目标的仅订单先决条件施加订单
我有一个makefile片段:Makefile 对目标的仅订单先决条件施加订单,makefile,dependencies,gnu-make,target,prerequisites,Makefile,Dependencies,Gnu Make,Target,Prerequisites,我有一个makefile片段: all: $(objects) fresh: all | clean directory directory: ;mkdir -p OutputDirectory clean: ;rm $(objects); rm -rf OutputDirectory 在这里,我想确保当我执行makefresh-clean时,应该通过directory获得成功,然后是all 从语义上讲,clean作为订单唯一的先决条件可能没有意义。假设它是某种只按顺序执行的依赖关系 以下
all: $(objects)
fresh: all | clean directory
directory: ;mkdir -p OutputDirectory
clean: ;rm $(objects); rm -rf OutputDirectory
在这里,我想确保当我执行makefresh
-clean
时,应该通过directory
获得成功,然后是all
从语义上讲,clean
作为订单唯一的先决条件可能没有意义。假设它是某种只按顺序执行的依赖关系
以下链接显示了类似的问题,但适用于正常依赖项:
在
fresh
的配方中,您可以对同一个makefile递归调用make
两次,分别用于创建目录的目标和all
目标:
# At the very beginning of the makefile
CURRENT_MAKEFILE := $(lastword $(MAKEFILE_LIST))
# ...
.PHONY: all clean fresh
directory := OutputDirectory
all: $(objects)
fresh: clean
$(MAKE) -f $(CURRENT_MAKEFILE) $(directory)
$(MAKE) -f $(CURRENT_MAKEFILE) all
$(directory): ;mkdir -p $@
clean: ;rm -f $(objects); rm -rf $(directory)
这样,target
all
前面是target$(目录)
,而target前面又是clean
嗨!IMHO这不是第一次运行后的仅顺序依赖关系,OutputDirectory存在,但在目录内创建新文件时,随着目录时间戳的更改,它会再次创建。请参阅:仅从GNU Make文档订购先决条件。再次创建它是因为目录
是一个虚假目标。但是,如果目标被称为OutputDirectory
(即$(目录)
)的扩展,它对应于您要创建的目录,那么,一旦它被创建,并且只要它存在,$(目录)
的配方就不会再次执行。请参阅@Nikhil$(目录)上的最后一个示例
以上不是唯一的先决条件,但并不相关。如果fresh
匹配,则始终执行其配方,因为它是虚假目标。$(目录)
的配方只有在目录不存在时才会运行,因为$(目录)
目标没有先决条件。我认为在这种情况下,净效应是相同的。