Может ли make-файл иметь каталог в качестве цели? - PullRequest
17 голосов
/ 18 июля 2010

Я пытаюсь сказать, что "загрузка репозитория 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, если он существует?«Источник» уже был создан ...

Ответы [ 3 ]

22 голосов
/ 18 июля 2010

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

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

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

bla/f: dir
    cd dir && touch f

dir:
    mkdir dir
12 голосов
/ 16 ноября 2012

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

Что вам нужно - обязательное условие только для заказа .

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

1 голос
/ 18 июля 2010

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

...