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作为订单唯一的先决条件可能没有意义。假设它是某种只按顺序执行的依赖关系 以下

我有一个makefile片段:

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
匹配,则始终执行其配方,因为它是虚假目标。
$(目录)
的配方只有在目录不存在时才会运行,因为
$(目录)
目标没有先决条件。我认为在这种情况下,净效应是相同的。