2015-08-30 3 views
3

У меня есть следующее правило в Makefile:Pushd не работает в Makefile

ninja: 
    git clone git://github.com/martine/ninja.git 
    pushd ninja 
    pwd 
    git checkout release 
    ./configure.py --bootstrap 
    popd 

Идея заключается в том, чтобы загрузить и построить ninja как зависимость проекта. Обратите внимание, что команда pwd находится там, чтобы убедиться, что каталог был нажат. Вот вывод он генерирует:

git clone git://github.com/martine/ninja.git 
Cloning into 'ninja'... 
remote: Counting objects: 8646, done. 
remote: Compressing objects: 100% (4/4), done. 
remote: Total 8646 (delta 0), reused 0 (delta 0), pack-reused 8642 
Receiving objects: 100% (8646/8646), 1.88 MiB | 427.00 KiB/s, done. 
Resolving deltas: 100% (6114/6114), done. 
Checking connectivity... done. 
pushd ninja 
~/Desktop/core/ninja ~/Desktop/core 
pwd 
/Users/fratelli/Desktop/core 
git checkout release 
error: pathspec 'release' did not match any file(s) known to git. 
make: *** [ninja] Error 1 

Как вы можете видеть, что директория получить толкнул в стек, но pwd не возвращает правильный каталог. Вот почему после этого checkout. Любые идеи, как это исправить?

+0

Можете ли вы проверить следующий «pushd ninja && pwd»? – higuaro

+0

Он работает! Теперь он терпит неудачу в строке './Configure'. Кажется, что он только меняет каталог на время действия команды. Я предполагаю, что экземпляр оболочки создается для каждой командной строки? –

+0

Этот 'pushd ninja && git checkout release && ./configure.py --bootstrap' работает, но я думаю, что он может быстро запутаться ... –

ответ

4

Каждая строка в целевом рецепте makefile запускается в своем собственном сеансе оболочки. Это не влияет на большинство рецептов, поскольку они работают в каталоге, в котором они нуждаются по умолчанию. Когда они этого не делают, и вам нужно использовать cd или pushd, тогда вам нужно написать все команды в одной строке или сказать, что линии продолжаются.

Для получения более подробной информации и примеров см. Splitting Recipe Lines.

Смежные вопросы