2013-01-08 62 views
1


我想根據xml文件和產品的內容有條件地包含makefile。
我的XML文件(myxml.xml):有條件地包括其他生成文件

<product1> 
    <component1 dirname=dir1 /> 
    <component2 dirname=dir2 /> 
</product1> 
<product2> 
    <component1 dirname=dir1 /> 
    <component3 dirname=dir3 /> 
</product2> 

Dir1中我有一個config.mk文件,該文件是這樣的:它們的所有子目錄

SRC_JS+=dir1/file1.js 
SRC_JS+=dir1/file2.js 
SRC_HTML+=dir1/file3.html 

同爲DIR2和DIR3 makefile目錄。

現在我想根據指定的產品包括某些config.mk文件根據什麼是在XML文件。
所以我的makefile:

myjscode.js: myxml.xml 
    read_dirs.py -p $PRODUCT $< > mydirs.txt 
    while read mydir; do \ 
    include $$mydir/config.mk ; \ 
    done < mydirs.txt; 
    js-compiler $(addprexis --js ,$SRC_JS) -output [email protected] 

可以這樣做? 僅供參考:我正在使用bash,而read_dirs.py腳本輸出一個「每行一個目錄」列表。

回答

0

首先是簡單的部分。 include指令不能位於規則中的命令中。修改read_dirs.py產生這樣的事情(當PRODUCT = 「產品2」):

include dir1/config.mk 
include dir3/config.mk 

然後在你的Makefile:

mydirs.mk: myxml.xml 
    read_dirs.py -p $PRODUCT $< > [email protected] 

include mydirs.mk 

沒有必要爲別的,就靠mydirs.mk;因爲這個makefile includes它,如果必要的話,Make會重建它。

現在很難的部分。我認爲你希望包含makefile的選擇不僅在myxml.xml更改時發生更改,還會在PRODUCT更改時發生更改。但PRODUCT不是一個文件,所以我們有一些選擇。我們可以有一個文件product.mk,其中包含PRODUCT變量。或者,而不是mydirs.mk我們可以爲每個產品有不同的文件。或者我們可以每次強制建造mydirs.mk。這取決於你如何設置PRODUCT以及你的優先級是什麼。

+0

感謝您的幫助! – user1900375

+1

但是...你確定這是工作(第一部分)?據我所見,我首先得到包含文件沒有找到的錯誤(這是正確的,因爲包含文件必須被創建)。 然後構建具有SRC_JS變量先決條件的目標。這會失敗,因爲SRC_JS變量尚未設置。 然後創建包含文件。 此時我期望make文件系統包含創建的包含文件並使用SRC_JS先決條件重新創建目標。不幸的是,事情並非如此。有問題? – user1900375

0
include $(shell read_dirs.py -p $(PRODUCT) myxml.xml|sed s,$$,/config.mk,) 
myjscode.js: myxml.xml 
    js-compiler ...