2012-01-20 32 views
2

我在尋找以下行爲:如何在不同的目標之間明確運行'make clean'?

# make debug (project is rebuilt. this works fine.) 
# make debug (project is not rebuilt because no changes have been made.) 
# make release (this is a different target than the currently-built one. I want 'make clean' to run before the release target is built) 
# make release (project is not rebuilt because no changes have been made.) 

謝謝。

+0

我認爲最好的設置是把所產生的所有文件'make'(目標文件,庫文件,可執行文件等)變成一個目標特定的目錄。這消除了部分構建混淆的可能性。 – NPE

+0

我們沒有獨立的構建目錄。這是不可能的,因爲我們下游的進程希望總是在給定的絕對路徑上找到我們的可執行文件。 – iraxef

+1

你的意思是你怎麼能在目標之間隱式地運行'make clean'?明確地做到這一點是微不足道的;只需運行該命令。 :) –

回答

1

有趣的問題。我可以想出這樣做的唯一方法是從外部記錄最近的目標(例如,將它回顯到一個文件),然後檢查它是否與當前目標相同或不同。如果它們相同,只需運行常規構建過程;如果它們不同,則首先運行make clean

我對此做了第一次嘗試,以說明過程(未經測試)。

 
debug release: 
ifneq ($(MAKECMDGOALS),$(shell cat last_target.txt)) 
    $(MAKE) clean 
endif 
    @echo [email protected] > last_target.txt 
    [regular build commands] 

這假定兩個目標具有相同的配方(對於某些變量具有不同的設置)。如果他們有不同的配方,顯然必須在兩個配方中插入條件部分和回顯命令。

+0

謝謝你的建議。我最終選擇了這種變體,它似乎正在做我正在尋找的東西。此外,它給了我每個目標的控制權。例如,我們的構建系統在最後的構建步驟中進行「測試」。我的第一個實現在'make debug'和'make test'之間做了一個'乾淨',這打破了真正運行已經構建的測試的能力。按照目標控制,我從測試目標中刪除了這個「乾淨的」邏輯。 – iraxef

0

您可能已經擁有或應該具有獨立的DEBUG和RELEASE目錄。它們應該是分開的,因爲所有中介和可執行文件都是不同的。然後,在每個目錄中都有單獨的make目標/上下文是很簡單的,用'全局'來選擇合適的make文件並從那裏繼續。

+0

我們沒有單獨的構建目錄。這是不可能的,因爲我們下游的進程希望總是在給定的絕對路徑上找到我們的可執行文件。 – iraxef

+0

生成完成後,生成過程不能將生成的可執行文件複製到預期的位置嗎?這將使你的構建與它們分離,並且還有助於避免混合調試/發佈。 – Ioan

+0

我們在我們的Windows版本上完成了這項工作,我同意它在Linux上很好,但由於受到外部約束,此時無法完成。 – iraxef

0

爲了詳細闡述我的評論,我認爲最好的設置是爲不同的構建選項設置不同的輸出目錄。在你的情況下,會有一個輸出目錄debug和一個輸出目錄release。這個想法是,構建過程中生成的所有文件(對象文件,庫,可執行文件等)都被放置到特定於目標的目錄中。

這將完全從make debug解耦make release,並且將eleminate的部分的可能性建立混錯。

+0

這將是最好的方法,但由於外部限制,目前無法完成。感謝您的反饋。 – iraxef

0

推測debugrelease目標會生成相同的文件,但具有不同的標誌。有一篇名爲Rebuilding when CPPFLAGS changes的Make文章介紹瞭如何讓gmake做你需要的。

另外,您可以切換到ElectricMake,一個使用gmake兼容化妝實現了許多改進,在標準使用gmake,包括了臺賬功能,它允許在最多最新考慮的命令行參數/編譯器標誌檢查,所以你得到你所描述的只是行爲來實現該功能:

emake --emake-ledger=command debug ;# builds everything with debug flags 
emake --emake-ledger=command debug ;# does nothing 
emake --emake-ledger=command release ;# rebuilds everything with release flags 
emake --emake-ledger=command release ;# does nothing 

(免責聲明:我ElectricMake的建築師)

+0

感謝您的反饋。 – iraxef

相關問題