2012-08-09 65 views
1

作爲構建過程的一部分我需要使用m4處理一些文件。這些文件以'.in'爲擴展名,不僅位於頂級目錄中,而且位於子目錄中。 我使用find找到它們並在shell循環中處理它們。在makefile中使用m4處理文件

是否有一些makefile語法魔術來編寫更簡單的規則來處理它們將輸出保存到與輸入文件相同的目錄中的文件(剝離'.in'擴展名)?

這是我在我的Makefile現在:

PROCESS_FILES=$(shell find . -name \*.in) 
WORK_FILES=$(subst .in,,$(PROCESS_FILES)) 



$(WORK_FILES): $(PROCESS_FILES) 
    for file in $(PROCESS_FILES); \ 
    do \ 
     m4 $$file > $${file%.*};\ 
    done 
+0

答案可能是的,但我們中的一些人對m4並不熟悉。你可以顯示你現在使用的(最小)makefile嗎? – Beta 2012-08-09 11:12:42

+0

嗨,我添加了我當前生成文件的相關部分 – jira 2012-08-09 12:03:45

回答

3

你可以寫一組規則的文件後綴.in轉換成文件,而該後綴。

在經典的符號,這將是這樣的:

# Not functional — see discussion 
.SUFFIXES: .in  # Add .in as a suffix 

M4  = m4 
M4FLAGS = 
M4SCRIPT = xyz.m4 

.in: 
    ${M4} ${M4FLAGS} ${M4SCRIPT} $< > $* 

這增加.in作爲一個公認的後綴,並說,你轉換了.in爲後綴的文件的文件,而無需使用指定的命令它由三個宏組成。 $<是擴展名爲.in的文件的名稱; $*是沒有擴展名的文件的名稱。

不幸的是,該符號僅適用於要轉換的文件具有名稱,例如xyz.in並需要轉換爲xyz。它不適用於需要將xyz.h.in轉換爲xyz.h的情況。

這將有可能以指定後綴.h.in.h,但隨後與.h.in.h:make的兩次啓動之間的轉換規則就會犯糊塗。

然而,GNU使具有用於限定可容納該後綴規則的替代符號:

.SUFFIXES: .h.in .h  # Add .h.in and .h as suffixes 

M4  = m4 
M4FLAGS = 
M4SCRIPT = xyz.m4 

%.h: %.h.in 
    ${M4} ${M4FLAGS} ${M4SCRIPT} $< > $*.h 

%.h: %.h.in線能夠處理具有後綴與兩個點。唯一令人討厭的是,對於每個擴展,如.c.in.y.in.mk.in,您必須提供類似的映射。

(測試在Mac OS X 10.7.4。如果makefile文件是xyz.mk,你可以創建一個空文件xyz.h.in,然後運行make -n -f xyz.mk xyz.h,你會看到構建將運行命令m4 xyz.m4 xyz.h.in > xyz.h。)

+0

感謝Jonathan,這對我非常有用。 – jira 2012-08-09 12:14:11

0

如果你有一個源文件path/to/file.in,從%.in使%的規則,並在輸出文件path/to/file的依賴,這應該是所有你需要。

也許你想用find的輸出來表達你的依賴關係。在GNU中這很容易;在其他方言,也許你想生成和包括像find -name '*.in' | sed 's/\.in$//' >make.dep