Makefile:避免重新编译克隆的存储库

Makefile:避免重新编译克隆的存储库,makefile,directory,gnu-make,Makefile,Directory,Gnu Make,我正在尝试从git克隆一个存储库并在本地编译它。Makefile的相关部分粘贴在下面 BUILDDIR = $(PWD)/build # rest of the Makefile ... all: release release: $(BUILDDIR)/buildr/Makedir $(BUILDDIR)/depqbf $(BUILDDIR)/buildr/Makedir: mkdir -p $(BUILDDIR)/buildr $(BUILDDIR)/depqbf:

我正在尝试从git克隆一个存储库并在本地编译它。Makefile的相关部分粘贴在下面

BUILDDIR = $(PWD)/build 
# rest of the Makefile 
...
all: release 

release: $(BUILDDIR)/buildr/Makedir $(BUILDDIR)/depqbf

$(BUILDDIR)/buildr/Makedir: 
    mkdir -p $(BUILDDIR)/buildr

$(BUILDDIR)/depqbf: 
    cd $(BUILDDIR); rm -rf depqbf; git clone git@github.com:lonsing/depqbf.git 
    cd $(BUILDDIR)/depqbf;./compile.sh
问题是如果我使用rm-rf depqbf,每次运行make时都会发生编译过程

如果我删除它,然后再次执行make

致命:目标路径“depqbf”已存在,并且不是空目录

只有在目录不存在的情况下才能进行克隆和编译

每次运行make时都会发生编译过程

你食谱的目标是:

$(BUILDDIR)/depqbf/depqbf:
    cd $(BUILDDIR); rm -rf depqbf; git clone git@github.com:lonsing/depqbf.git
    cd $(BUILDDIR)/depqbf;./compile.sh
是文件
$(BUILDDIR)/depqbf/depqbf
。如果目标
$(BUILDDIR)/depqbf/depqbf
不存在,则Make是通过运行以下命令来生成目标:

cd $(BUILDDIR); rm -rf depqbf; git clone git@github.com:lonsing/depqbf.git
cd $(BUILDDIR)/depqbf;./compile.sh
但这些命令从未创建名为
$(BUILDDIR)/depqbf/depqbf
的文件。他们 永远不要成为目标

因此,每次Make考虑其将决定必须制定的目标时 运行这些命令

如果您删除rm-rf depqbf,则在尝试目标时:

fatal: destination path 'depqbf' already exists and is not an empty directory.
当然,因为您无法克隆到现有的非空目录中。这是 与配方始终在运行这一事实无关。它总是在运行 因为它从来没有达到它的目标

你的另一个食谱:

$(BUILDDIR)/buildr/Makedir:
    mkdir -p $(BUILDDIR)/buildr
同样的,这是一个永远不会成为目标的人。命令:

mkdir -p $(BUILDDIR)/buildr
永远不会创建文件
$(BUILDDIR)/buildr/Makedir
。我看不出目的 我假设它只是用来创建这个文件的
$(BUILDDIR)/buildr/Makedir
如果由于某种原因它不存在

然后,当且仅当目标不存在时,此生成文件才会尝试生成目标:

Makefile

BUILDDIR := $(PWD)/build

.PHONY: all release

all: release

release: $(BUILDDIR)/buildr/Makedir $(BUILDDIR)/depqbf

$(BUILDDIR)/buildr/Makedir: | $(BUILDDIR)/buildr
    touch $@

$(BUILDDIR)/depqbf: | $(BUILDDIR)
    cd $(dir $@); git clone git@github.com:lonsing/depqbf.git 
    cd $@; ./compile.sh

$(BUILDDIR) $(BUILDDIR)/buildr:
    mkdir -p $@
以下方面的有用参考资料:-


为什么你有
$(BUILDDIR)/depqbf/depqbf
而不是只有
$(BUILDDIR)/depqbf
?那是个错误。让我把它去掉。谢谢你的详细解释。现在很清楚了。