pushd在makefile中不起作用

时间:2015-08-30 23:37:31

标签: shell makefile

我在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之后失败的原因。任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:9)

makefile目标配方中的每一行都在其自己的shell会话中运行。这不会影响大多数食谱,因为它们在默认情况下需要在目录中运行。当他们不这样做而您需要使用cdpushd时,您需要在同一行上写下所有命令,或者告诉他们这些行是否继续。

有关详细信息和示例,请参阅Splitting Recipe Lines