2010-06-16 30 views
2

我希望在我的GNUmakefile中有一个调用新shell的目标规则,然后用新shell的clean slate调用新make。如何调用一个shell来创建一个新的环境在另一个make中运行make?

这是什么语法?

我试过,但没有奏效:

.PHONY: setup 
setup: 
shell cd myDir; make; cd .. 

它得到以下错误的无限重复:

make[1]: Entering directory `/disk4/home/user/parent' 
shell cd myDir; make; cd .. 
/bin/sh: shell: command not found 
make[1]: Entering directory `/disk4/home/user/parent' 
shell cd myDir; make; cd .. 
/bin/sh: shell: command not found 
[...] 

回答

1

的括号是没有必要的。无论如何,配方中的每一行都在其自己的shell中调用。你的食谱似乎有一个多余的外壳字符串,你的外壳试图执行命令(/ bin/sh(你的外壳,不是),抱怨shell: command not found)。

另外,在这种情况下,make的-C参数很方便。

而且,从shell调用make时,请使用${MAKE}宏。

.PHONY: setup 
setup: 
    unset MAKEFLAGS; ${MAKE} -C myDir 
2
(cd myDir ; make) 

的括号调用一个新的子shell,有自己的“当前目录”。

+0

新的子shell正在继承父项,因为(cd myDir; make)的行为与使用此规则进行设置时从顶部从顶部调用它不同。 – WilliamKF 2010-06-16 01:58:02

+1

是的,它会继承所有导出的变量。如果你想阻止这个,使用'env'。 – 2010-06-16 02:23:22

+0

请详细说明如何使用env。不知何故,它是'env -i'吗? – WilliamKF 2010-06-16 03:54:48

0

这里是什么在起作用:

.PHONY: setup 
setup: 
(cd myDir; env --unset=MAKEFLAGS make) 
相关问题