我有一个makefile,它调用与makefile位于同一目录下的python脚本。它工作得很好。
在makefile#1中:
auto:
./myscript.py
现在,我在另一个目录中有另一个makefile,并希望从中调用第一个makefile。 在makefile#2中:
target:
cd $(DIR); $(MAKE) auto;
问题是,当脚本运行时,它运行就好像它与makefile#2在同一目录中一样。在stdout上,我看到“make [3]:Leaving directory”和#1的路径,就在执行make之后和脚本运行之前。
根据建议,我尝试将makefile#2修改为:
target:
( cd $DIR; $MAKE auto; )
但这被解释为“cd IR; AKE auto”。当我更换DIR和MAKE周围的括号时,我会得到与以前相同的行为。
我已经尝试修改python脚本,让它假设它在目录#2中并给它一个#1的路径,但行为不会改变。
发生了什么,我该怎么办?
更新: 我在下面的评论搞砸了代码格式,所以就在这里:
我尝试了这个,基本上得到了你所描述的内容。它可能与目标自动调用“makefile.rules”文件这一事实有关吗?
auto:
@echo this is makefile \#1 making $@ in $(PWD)
FLAG=1 $(MAKE) -f makefile.rules rulestargetA
FLAG=2 $(MAKE) -f makefile.rules rulestargetB
./myscript.py
为简单起见,我省略了这个事实,但现在我想知道。
更新2 : 我不明白为什么makefile没有导致myscript.py运行,就好像它位于它所在的目录中一样,但是我一直试图让脚本在从不同的目录调用时正常运行。它打开几个子进程,在每个子进程中运行一个可执行文件,并将每个子进程的stdout保存到文件中。 Python的subprocess.Popen默认传递当前工作目录,该目录是调用脚本的位置,而不是它驻留的位置。我添加了脚本以作为cwd传递到住宅目录中的Popen调用。但是,出于某种原因,当我在自己的目录中运行myscript.py时,它可以工作,但是当我从其他地方(从命令行)调用它时,它会在proc.communicate()中挂起。我应该解决这个python问题,但我仍然想知道为什么外部makefile不能从它自己的目录中调用这个脚本。
答案 0 :(得分:0)
这很奇怪。首先是简单的部分:
target:
( cd $DIR; $MAKE auto; )
括号在此处不执行任何操作,并将$DIR
解释为$D
,后跟字母“I”和字母“R”。由于未定义变量D
,因此这适用于'IR'。与$MAKE
相同。
现在是真正的问题。编写的makefile应该可以工作。你说它在脚本运行之前离开了目录#1 吗?我所能建议的是你首先尝试一个更简单的问题。把它放在Makefile#1中:
auto:
@echo this is makefile \#1 making $@ in $(PWD)
然后使用Makefile#2制作target
。这应该产生
make[1]: Entering directory 'path-to-one'
this is makefile #1 making auto in path-to-one
make[1]: Leaving directory 'path-to-one'
如果这就是它所说的,那么你的脚本会有些麻烦。如果它没有产生这样的结果,那么你根本无法到达Makefile#1,也许你的DIR
不正确。如果它工作但是说它在目录#2中,那么我最好的猜测是你有另一个规则引用Makefile#1。试试实验并告诉我们。
修改:
好吧,这可能解释了如何在脚本运行之前离开目录#1。我建议你注释掉这些行,看看问题是否仍然存在。现在关于这个脚本:它做了什么,你怎么知道它在哪里运行?