Makefile:避免重新编译克隆的存储库
Makefile: Avoid recompilation of a cloned repository
我正在尝试从 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
fatal: destination path 'depqbf' already exists and is not an empty directory.
如果目录不存在,是否可以只克隆和编译。
the compilation process happens everytime I run 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
。你是在告诉 Make,如果目标 $(BUILDDIR)/depqbf/depqbf
不存在,那么Make就是通过运行ning命令来制作目标:
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
,那么当 Make 尝试目标时:
fatal: destination path 'depqbf' already exists and is not an empty directory.
当然,因为您不能克隆到现有的非空目录中。这是
与食谱始终 运行 这一事实无关。它总是 运行
因为它从来没有达到目标。
你的其他食谱:
$(BUILDDIR)/buildr/Makedir:
mkdir -p $(BUILDDIR)/buildr
likewise 是一个永远不会成为目标的人。命令:
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 $@
The GNU Make manual 中的有用参考资料:-
我正在尝试从 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
fatal: destination path 'depqbf' already exists and is not an empty directory.
如果目录不存在,是否可以只克隆和编译。
the compilation process happens everytime I run 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
。你是在告诉 Make,如果目标 $(BUILDDIR)/depqbf/depqbf
不存在,那么Make就是通过运行ning命令来制作目标:
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
,那么当 Make 尝试目标时:
fatal: destination path 'depqbf' already exists and is not an empty directory.
当然,因为您不能克隆到现有的非空目录中。这是 与食谱始终 运行 这一事实无关。它总是 运行 因为它从来没有达到目标。
你的其他食谱:
$(BUILDDIR)/buildr/Makedir:
mkdir -p $(BUILDDIR)/buildr
likewise 是一个永远不会成为目标的人。命令:
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 $@
The GNU Make manual 中的有用参考资料:-