2010-03-26 23 views
1

我有一個使用OMake構建系統的項目,並且我正在嘗試處理一個相當艱難的角落案例。如何在構建目標列表生成器時處理OMake中未知目標的構建規則

我有一些定義文件和一個工具,可以將這些定義文件和創建GraphViz文件。有兩個問題,但:

  • 每個定義文件可以產生多個圖形,它可以產生的圖形列表編碼在文件中。我的轉儲工具確實有一個-list選項,其中列出了定義文件將生成的所有圖形。
  • 此轉儲工具內置於源代碼樹中。
  • 我想要這個列表在OMakefile中可用,所以我可以使用其他規則將DOT文件轉換爲SVG,並假冒一個目標取決於所有SVG(目標:構建SVG描述的所有圖形)。

如果我只有第一個問題,它會很容易 - 我會運行該工具來構建一個列表,然後使用該列表構建一個調用dumper輸出GraphViz文件的目標。不過,我寧願強迫轉儲工具在需要之前建造。

如果這是make,我只會遞歸運行make來構建轉儲工具。但OMake不允許遞歸調用,並且build函數僅可用於osh

對於這個問題的一個很好的解決方案的任何建議?

回答

1

好的,這是我的建議。首先,這是一個用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只會轉換已更改或新的文件。

+0

謝謝。我用INCLUDE試過類似的解決方案。但是,我的發生器程序本身就是一個非常重要的OCaml程序。我沒有意識到INCLUDE deps必須是真實的文件,並試圖將我的程序用作依賴項;這沒有奏效(程序未能建立)。由於OMake缺乏對遞歸構建的支持,我沒有看到直接使用此解決方案的方法。任何建議在這方面? – 2010-04-14 01:22:00