2010-08-03 624 views
0

我有一个makefile调用一个python脚本,它与makefile位于同一个目录中。它工作得很好。
在生成文件#1:从另一个目录中的makefile调用python脚本

auto: 
    ./myscript.py 

现在,我还有一个Makefile文件,在另一个目录,并希望从中调用第一个生成文件。 在生成文件#2:

target: 
    cd $(DIR); $(MAKE) auto; 

的问题是,在脚本运行时,它运行似乎是在同一个目录的生成文件#2。在标准输出上,在执行make之后和脚本运行之前,我看到“make [3]:离开目录”和到#1的路径。

在一个建议,我试过修改生成文件#2:

target: 
    (cd $DIR; $MAKE auto;) 

但是这解释为 “CD IR; AKE自动”。当我替换DIR和MAKE的括号时,我会得到和以前一样的行为。

我试着修改python脚本,让它假设它是在目录#2中,并给它的路径#1,但行为不会改变。

发生了什么,我该怎么办?

更新: 我下面的评论搞砸代码格式化所以它在这里:

我想这一点,并得到了你的描述基本上是什么。可能与target自动调用“makefile.rules”文件有什么关系?

auto: 
    @echo this is makefile \#1 making [email protected] 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

我不得不羞于承认这个记录,结果是在makefile#1中出现了剪切和粘贴错误。自动目标没有使用正确的标志调用makefile.rules,因此挂起的可执行文件(由myscript.py调用)。我能够用直接命令创建挂起;没有涉及任何makefile或脚本。 在调用myscript.py之前,它留下dir#1的makefile消息是一个红色鲱鱼:该脚本实际上是从dir#1调用的。我不明白,但至少它现在有效。 – jasper77 2010-08-04 18:34:29

回答

0

这很奇怪。首先最容易的部分:

target: 
    (cd $DIR; $MAKE auto;) 

括号无能为力这里,并请解释$DIR$D后加字母“I”和字母“R”。由于变量D没有被定义,所以这会变成'IR'。相同为$MAKE

现在是真正的问题。所写的makefile应该可以工作。你说它在之前的目录#1 脚本运行?我只能建议你先尝试一个更简单的问题。将这个Makefile中#1:

auto: 
    @echo this is makefile \#1 making [email protected] 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脚本运行之前。我建议你评论这些问题,看看问题是否仍然存在。现在讲述这个脚本:它做了什么,你怎么知道它在哪里运行?

+0

我试过了,基本上得到了你所描述的。可能与target自动调用“makefile.rules”文件有什么关系? 汽车: @echo这是$生成文件\#1制作$ @(PWD) FLAG = 1 $(MAKE)-f makefile.rules rulestargetA FLAG = 2 $(MAKE)-f makefile.rules rulestargetB ./myscript.py 为了简单,我省略了这个事实,但现在我想知道。 – jasper77 2010-08-03 21:07:08

+0

dir#1中的makefile如何在同一目录中,在该目录中的代码中调用makefile.rules(实质上是另一个makefile),导致该目录在脚本运行之前退出? – jasper77 2010-08-04 15:15:08

+0

@ jasper77:我没有足够的信息来确定,但我有两个假设:1)“make [3] Leaving directory dir_one”消息来自'auto(自动)规则中的'$(MAKE)'命令(进入和离开消息可能会引起误解,因为目录可能与最后一个进程运行的目录相同)2)脚本可能启动一个进程然后终止,允许Make终止(和“离开”)脚本进程的输出显示。无论如何,它看起来好像你已经解决了这个问题。 – Beta 2010-08-05 02:32:34

相关问题