2015-12-06 48 views
0

下面是我的Makefile的簡化用例。我想要做的是使用這些文件的名稱並創建相應的.d和.hpp文件。但是,由於某種原因,我無法做到這一點。Makefile中xml文件的基本名稱

XML_DATA_FILES := a.xml b.xml c.xml d.xml 

build: 
    @for var in $(XML_DATA_FILES); do \ 
     echo "$(basename $$var)";\ 
     $(eval var1 = $(basename $$var)) \ 
     echo "$(join var1,.hpp)"; \ 
     echo "$(join var1,.d)"; \ 
    done 

當我運行make如下

a.xml 
var1.hpp 
var1.d 
b.xml 
var1.hpp 
var1.d 
c.xml 
var1.hpp 
var1.d 
d.xml 
var1.hpp 
var1.d 

但我要的是a.d, a.hpp等所有四個XML文件的輸入,我得到的輸出。 我已經提到this問題和GNU Manual但它迄今沒有幫助。我可以如何實現這一目標?

+0

爲什麼'$(patsubst%.xml,%.hpp,$(XML_DATA_FILES))'? – keltar

回答

1

這裏有一些問題:)。但是,從根本上說,您不能將像basenameeval這樣的make函數合併到像for這樣的shell循環中,並期望它能夠執行任何有用的操作。 Make始終擴展所有make變量的全部配方,並使用FIRST,然後將整個擴展字符串傳遞給shell運行,然後等待shell完成。

請考慮:運行它的for循環的shell將如何通知當前值var備份以使每次都通過shell循環,以便make可以運行正確的函數等。這是不可能的。

您需要使用只寫 shell結構,以及在整個配方中具有相同值的簡單make變量來編寫整個循環。

但是,這是沒用的作爲一個makefile,因爲你只有一個目標完成所有工作。爲什麼不寫一個shell腳本?沒有必要爲此使用make。如果你想將它寫讓路,你需要申報的對象和先決條件,創造模式的規則,就像這樣:

XML_DATA_FILES := a.xml b.xml c.xml d.xml 

OUTPUTS := $(foreach X,$(XML_DATA_FILES:.xml=),$X.d $X.hpp) 

build: $(OUTPUTS) 

%.d %.hpp: %.xml 
     echo "$*.d $*.hpp" 

當然,因爲你不說什麼真正的命令做我無法確定這是否正確;如果您實際上有兩個不同的命令,一個生成.d文件和一個生成.hpp文件,您應該創建兩個不同的模式規則。

+0

我最終編寫了一個Perl腳本,並提供了xml文件的路徑......並且Perl負責處理所有其他內容.... :) :) :) – Recker