процесс компиляции происходит каждый раз, когда я запускаю 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 должна создать цель, выполнив команды:
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
также тот, который никогда не делает его целью.Команда:
mkdir -p $(BUILDDIR)/buildr
никогда не создаст файл $(BUILDDIR)/buildr/Makedir
.Я не вижу цели этого рецепта, поэтому я предполагаю, что он просто должен создать файл $(BUILDDIR)/buildr/Makedir
, если он по какой-то причине не существует.
Тогда этот make-файл попытается создатьцели, если и только если они не существуют:
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 $@
Полезные ссылки в Руководство по GNU Make : -