2013-04-15 36 views
0

考慮使用makefile,它可以使用文件中列出的生成線來生成一些文件。例如,使用第一行的文件001,使用第二行的002等。Gnu make:使用文件內容作爲配方

該文件可以更改(它有它自己的依賴關係,但這並不會改變)。 如果此文件中的某些行發生更改,則應重新創建適當的文件。但其他文件不應該。

我找到的解決方案是這樣的:對於每個文件都有標誌文件,其內容是上一次生成的行。在用生成線重新生成文件之後,我檢查了所有這個文件,並在線更改後刪除它們。因此,對已刪除文件具有依賴性的文件將被重新制作,而其他文件則不會。但是如果使用msys-make,這個工作速度太慢。

你可以推薦任何其他解決方案,它不需要額外的文件系統和可執行文件運行。

+0

您的問題陳述不明確。這個文件的格式是什麼,它是如何指定依賴關係來拾取的? – Daniel

回答

0

如果我正確理解你的描述,你所描述的是一個Makefile,它依賴於另一個功能上是Makefile的文件,但由於未知原因使用了不同的格式。

將該文件轉換爲Makefile格式,並將include轉換爲原始的Makefile。 (如果您使用的是GNU Make。)

+0

將其轉換爲makefile格式並不能解決問題。問題在於,如果考慮到配方變化,就像makefile一樣。可以通過一些簡單的方式做到嗎? –

+0

@ user2281791 GNU Make的include會自動爲你做。閱讀手冊。 – reinierpost

+0

配方更改不會導致目標的重新制作。 –

0

我們有什麼可能與您的問題類似。我們有XML文件,說foobar.xml其中包含依賴關係foobar.out

<files> 
    <file>a</file> 
    <file>b</file> 
    <file>c</file> 
</files> 

我們決定堅持這個簡單的佈局,所以我們並不需要解析XML。我們使用makepp(因爲我們厭倦了gmake,不知道更改後的命令等依賴項)。這給了我們內建的&sed命令(表達式實際上是Perl編程,但正如你看到的,你不需要太多)。下面是我們做了三種線三個簡單的換人:

%.d: %.xml 
    &sed 's!<files>!$(stem).out: \\! || s!<file>(.+)</file>!$$1 \\! || s!</files>!!' \ 
     $(input) -o $(output) 

include foobar.d 

這就產生foobar.d我們則包括:

foobar.out: \ 
    a \ 
    b \ 
    c \ 

#1在這裏吞下最後一個空行,這避免了對擔心後面的反斜槓。