2010-08-03 31 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

相關問題