Может ли файл makefile иметь каталог как цель?

Я пытаюсь сказать: "загрузка репозитория git будет работать, только если каталог yank/существует. Если каталог yank/не существует, сделайте его"

yank/gist.el/gist.el : yank
    cd yank ; git clone http://github.com/defunkt/gist.el.git 

yank:
    mkdir yank

Я использую makepp - http://makepp.sf.net и я получаю ошибку:

[[email protected] ~/edan/pkg/gist.el] makepp
makepp: Loading makefile `/home/metaperl/edan/pkg/gist.el/Makeppfile'
makepp: Entering directory `/home/metaperl/edan/pkg/gist.el'
mkdir yank
mkdir: cannot create directory `yank': File exists
makepp: error: Failed to build target `/home/metaperl/edan/pkg/gist.el/yank' [1]
makepp: 0 files updated, 0 phony targets built and 1 target failed
[[email protected] ~/edan/pkg/gist.el] 

Но зачем он пытается создать каталог yank, если он существует? "Источник" уже создан ben...

Ответы

Ответ 1

Да, Makefile может иметь каталог как цель.

Ваша проблема может заключаться в том, что cd не делает то, что вы хотите: он выполняет cd, а git clone выполняется в исходном каталоге (тот, который вы cd ed, а не тот вы cd ed до). Это связано с тем, что для каждой команды в Makefile создается дополнительная оболочка. Обходным путем является запуск cd и клонирование как одна команда с оболочкой &&.

Это должно работать:

bla/f: dir
    cd dir && touch f

dir:
    mkdir dir

Ответ 3

Ваш make файл должен делать то, что вы ожидаете. Поскольку yank не имеет зависимости, он не будет переделан, если он существует. Таким образом, это выглядит как ошибка в makepp. Вы можете подтвердить это, попробовав свой make файл с традиционной реализацией make.