2012-07-24 96 views
2

我試圖使它在每個子目錄(存儲在變量SUBDIRS中)中的一個文件塊(conf.py)被刪除。該文本塊位於標籤#--Begin#--End內。查看下面的代碼示例。爲了整潔並且不需要額外的shell腳本從makefile中運行,我想在makefile中使用sed命令,但是在這樣做時遇到了麻煩。我無法在任何其他論壇帖子中找到此解決方案,因此會非常感激地收到任何幫助。在Makefile中使用sed

.PHONY $(SUBDIRS) 
SUBDIRS = (list of all subdirectories that contain a relevant conf.py) 
$(SUBDIRS): 
    sed '/#--Begin/,/#--End/d' Docs/[email protected]/conf.py 

由於此命令沒有任何反應。

謝謝!

回答

5

在將命令合併到makefile中之前,您應該在命令行上測試sed命令。按照書面的說法,它會刪除您希望刪除的行,然後將結果導向stdout。要修改到位的文件,你應該使用-i

sed -i -e '/#--Begin/,/#--End/d' Docs/[email protected]/conf.py 

有可能是其他問題。您沒有向我們展示真正的生成文件(.PHONY $(SUBDIRS)不合法,因此您沒有粘貼正在運行的生成文件),但可能規則甚至沒有按照您認爲應該執行的方式執行。試試這個:

$(SUBDIRS): 
    @echo attempting to act on [email protected] 
    @ls Docs/[email protected]/conf.py 

得到這個試圖引進sed命令之前工作完美

+0

謝謝。這令人沮喪。添加-i選項是所有需要的 – user1488804 2012-07-25 10:08:23

5

您的規則爲其目標使用SUBDIRS列表。讓看看這些是否存在,這當然是他們做的。他們不依賴於其他任何東西,所以他們是最新的,所以Make不需要做任何事情。

有兩種方法可以解決這個問題。一種是使用Phony Target 強制執行命令每次運行時:

.PHONY: $(SUBDIRS) 
$(SUBDIRS): 
    sed ..... 

另外就是給文件不同的名稱,如的編輯和未經編輯的版本conf.pyconf.py.in,使第一取決於第二次使用Pattern Rule

$(SUBDIRS): Docs/%/conf.py: Docs/%/conf.py.in 
    sed '/#--Begin/,/#--End/d' $< >[email protected] 

這是更好的,因爲每當輸入文件改變它就會自動運行。

+0

道歉不包括'.PHONY'的第一位。事實上,在發佈之前,我確實已經有了這個。該問題已更新,以包括此 – user1488804 2012-07-24 16:38:33