2011-03-11 65 views
1

所以我有一個makefile,在那個makefile中是一個規則,它首先執行預編譯轉換並修改源文件,然後將其編譯到合適的目標中。我想知道是否有辦法欺騙/強制讓它認爲源代碼沒有真正修改,所以make只會在用戶修改時重新編譯,而不是在make規則修改源代碼時重新編譯。我試圖使用touch命令在修改後回退修改時間戳,但沒有成功。有沒有人有任何想法?謝謝。makefile修改時間欺騙?

+0

是不是有可能讓你在不改變你的源文件相同的生成文件添加另一個規則?你可以用你提到的規則粘貼一段makefile嗎? – j4x 2011-03-11 19:54:35

+0

什麼情況下應該運行轉換並從而修改源文件? – Beta 2011-03-11 19:55:50

+0

@Beta - make應該在任何時候發現源已經改變並且需要重新編譯的時候執行轉換 – 2011-03-11 20:11:58

回答

1

來完成你想要的一種可能的方式是創建一個次要目標 - 這是一個零長度文件,它就像一個標誌說你是否做了你想做什麼或沒有,有基於該文件進行預編譯轉換的規則。

我想我有一個關於你想要做什麼的問題。爲什麼變換就地,而不是讓轉換創建一箇中間文件,然後進行編譯。

就地轉換可能會有問題,特別是如果轉換過程不是冪等的。

編輯1

根據你的問題,我會說你可以這樣做:

target.flag: target.original-file 
    touch target.save -r target.original-file 
    <do transformation> 
    touch target.original-file -r target.save 
    rm target.save 
    touch target.flag 

使用的「-r」參數觸摸說搶從指定的訪問日期文件。所以你會將原始文件的日期保存在臨時文件中。然後進行轉換,然後使用touch從臨時文件中獲取日期,並將其放回現在轉換後的文件。

+0

或者您可以切換到ANT,它比Make更加優雅和強大。與一些較新的工具相比,製造有點像石刀和熊皮。 – 2011-03-11 20:01:12

+0

你會如何在Ant中做到這一點? – 2011-03-11 20:19:17

+0

轉換必須在適當的位置執行,因爲它是我使用的第三方工具的創可貼,它具有一個錯誤,並且轉換實際上用於修改源,然後再將其檢入源代碼控制。順便說一句,這個轉換是冪等的。 – 2011-03-11 20:23:50

0

如何:

foo.target: foo.source 
    $(TRANSFORM) $< 
    $(COMPILE) $<