2010-09-26 64 views
3

我正在學習makefile的創建過程。sed在makefile中,用法

當前的目標是掃描$(SOURCEDIR).c文件並創建(根據.c文件路徑中的/path/file.c的格式莉莎)一個不錯的$(VPATH)所以我不需要在一個使用遞歸的makefile(又名疼痛。 )。

大氣壓我堅持這一點,在那裏$(SOURCETREE)將是空的$(ECHO)

SOURCES := $(shell find $(SOURCEDIR) -name '*.c') 
SOURCETREE := $(dir $(SOURCES)) 
SOURCETREE := $(shell $(ECHO) $(SOURCETREE) | $(SED) -e "s/[[:space:]]/\n/g" | uniq | $(SED) -e "s/\n/[[:space:]]/g"); 

也許我只是不明白這一點(再遲到了:/)

感謝您的幫助。

注:在bash shell它完美的作品在我的Linux針線(我相應的更換thevariables) 注:我沒有SED親,所以請你做SED的巫術解釋一下,謝謝

+1

我通常更喜歡把'tr'換成'sed'換行到/從空間轉換...'tr'''\ n''更短,IMO更清晰。現在,這不會處理選項卡,但你的輸入不會有他們(除非你有一些*文件名*,在這種情況下,你不希望他們轉換...)。 – dmckee 2010-09-27 03:53:58

回答

5

評論:

  1. 刪除反引號。他們是不必要的; $(shell)函數已經捕獲命令的輸出。

  2. echo/sed/uniq/sed鏈可以被ls/uniq替換。 ls將每行打印一個文件名,所以不需要替換和撤消歌曲和跳舞。

  3. 它看起來像你失去從$(dir)的結果,因爲在你在第三次分配使用$(SOURCES)而非$(SOURCETREE)

結果:

SOURCES := $(shell find $(SOURCEDIR) -name '*.c') 
SOURCETREE := $(dir $(SOURCES)) 
SOURCETREE := $(shell ls $(SOURCETREE) | uniq); 

其實,即使這縮短殼調用是不必要的。 $(sort) function將排序名​​稱列表並刪除重複項。從make的文檔:「順便說一下,由於排序刪除重複的單詞,即使您不關心排序順序,也可以將其用於此目的。」

SOURCES := $(shell find $(SOURCEDIR) -name '*.c') 
SOURCETREE := $(sort $(dir $(SOURCES))) 
+0

不是那麼容易,ls在我的情況下不起作用,因爲源目錄實際上是n-subdirs,因此我使用find。結果是一個空間分離的路徑列表,而uniq只能輕鬆地分解列表。謝謝你注意反引號。雖然你是對的dir輸出丟失了,utput完全不應該是「」(zer0 chars) – drahnr 2010-09-26 23:44:46

+1

對不起,我的回答不清楚。我不是說'find'被刪除。我在前面的幾行中添加了我對上下文的回答。 – 2010-09-26 23:49:09

+0

sorty thingy works,但是我仍然對如何在makefile規則中調用sed感興趣,因爲我可能會在近/遠/遠的將來012b例如std中打開sed。對於VPATH設置,我必須用空格/換行符替換: – drahnr 2010-09-26 23:49:54