Makefile: Избегайте перекомпиляции клонированного репозитория - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь клонировать репозиторий из 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 снова

fatal: целевой путь 'depqbf' уже существует и не является пустым каталогом.

Можно ли клонировать и скомпилировать только если каталог отсутствует.

1 Ответ

0 голосов
/ 23 февраля 2019

процесс компиляции происходит каждый раз, когда я запускаю 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 : -

...