Может ли make-файл иметь каталог в качестве цели?

Я пытаюсь сказать, что "загрузка репозитория 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/ и получаю сообщение об ошибке:

[metaperl@andLinux ~/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
[metaperl@andLinux ~/edan/pkg/gist.el] 

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

4 ответа

Решение

Да Makefile может иметь каталог в качестве цели.

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

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

bla/f: dir
    cd dir && touch f

dir:
    mkdir dir

В make-файле имя каталога - это фальшивая цель или "настоящая" цель?

То, что вам нужно, является обязательным условием только для заказа.

Быстрый поиск не обнаружил никаких ссылок на предварительные условия makepp и только для заказа, но он все еще может работать.

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

Однако вы не должны. Когда файл добавляется или удаляется из каталога, его mtime обновляется. Это может привести к странному поведению, заставляя несколько целей, зависящих от одного каталога, неявно перестраиваться друг другом. Поэтому, как правило, вам следует избегать использования каталогов в качестве целей и/или зависимостей.

      all: d/a d/b

d/a d/b: d
  rm -f $@
  touch $@

d:
  mkdir $@

Результат многократного запуска выглядит так...

      $ make
mkdir d
rm -f d/a
touch d/a
rm -f d/b
touch d/b

$ make
rm -f d/a
touch d/a

$ make
rm -f d/b
touch d/b

$ make
rm -f d/a
touch d/a

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

Другие вопросы по тегам