好的,這是我的建議。首先,這是一個用bash創建的快速生成器,它可以接受一個「--list」參數,該參數創建一個omake變量來包含要做的事情列表。該生成器被稱爲「generator.txt」,因爲我們將通過將其重命名爲.sh來「製作」它。
#!/bin/bash
if [ "$1" = "--list" ]; then
echo -e 'FILES[] = \n\ta\n\tb\n\tc'
else
echo 1 > a.dot
echo 2 > b.dot
echo 3 > c.dot
fi
然後,OMakefile本身:
.INCLUDE: rules : generator.txt
cp generator.txt generator.sh
chmod 755 generator.sh
./generator.sh
./generator.sh --list > rules
DOTS[] =
$(addsuffix .dot, $(FILES))
SVGS[] =
$(addsuffix .svg, $(FILES))
# rule to turn a .dot into a .svg
%.svg: %.dot
cp $*.dot $*.svg
.DEFAULT: $(SVGS)
.PHONY: clean
clean:
rm -f generator.sh a.* b.* c.* rules
這裏的關鍵是產生從generator.txt的 「規則」 文件,被列入OMakefile。每當generator.txt(我們生成器的源代碼)發生變化時,我們重新生成(生成)生成器,運行它(創建文件a.dot,b.dot,c.dot),最後使用--list運行它以生成我們的包含要生成的文件列表的FILE []變量。
然後,生成DOTS和SVGS變量以及將點轉換爲svg的規則變得微不足道。默認目標取決於svgs的列表,它將按順序構建所有內容。
這種方法的問題在於,構建生成器相當粗糙,因爲我們必須將「INCLUDE」依賴項列表作爲實際文件。儘管如此,這至少應該以正確的順序執行操作。
請注意,如何修改generator.txt(例如,添加另一個要生成的.dot,或者更改生成.dot的內容的方式)會正確強制重新生成generator.sh,然後生成任何生成的文件將被修改。
編輯
我認爲主要的問題是,omake希望能夠開始做任何工作之前生成整個依賴圖。因此,它不能在一些依賴項上構建生成器,然後生成更多的依賴項來處理其輸出。
我想有辦法來解決:
第一種是已經發電機建成在.include指令的一部分,我先說明,這是一個麻煩,因爲你必須將所有生成器構建過程放入該指令中。
第二個是失去一定的靈活性,並將一個輸入作爲一個輸出,例如讓生成器只生成一個包含所有並置輸入的文件。正如你知道你只有一個文件,你可以很容易地設置依賴關係。
第三個,這將是我最喜歡的,是有一個2階段構建系統。在一個子目錄中,你有一個OMakefile生成生成器並輸出文件。在另一個子目錄中,您有另一個OMakefile,它讀取第一個目錄的內容以生成要處理的文件列表,然後運行轉換。然後,在主目錄中,bash腳本在第一個目錄中調用omake,然後在第二個目錄中調用omake。這有希望意味着你可以用一個命令產生所有的東西,而且重建也是最小的:第一個omake只會在輸入發生變化時重新生成文件,第二個omake只會轉換已更改或新的文件。
謝謝。我用INCLUDE試過類似的解決方案。但是,我的發生器程序本身就是一個非常重要的OCaml程序。我沒有意識到INCLUDE deps必須是真實的文件,並試圖將我的程序用作依賴項;這沒有奏效(程序未能建立)。由於OMake缺乏對遞歸構建的支持,我沒有看到直接使用此解決方案的方法。任何建議在這方面? – 2010-04-14 01:22:00