[C++] 你如何強制makefile來重建目標


Answers

-B開關的長形式是--always-make ,告訴make忽略時間戳並製定指定的目標。 這可能會破壞使用make的目的,但它可能是您需要的。

Question

我有一個生成文件,然後調用另一個生成文件。 由於這個makefile調用了更多的makefile,所以它並沒有真正改變。 因此它一直認為該項目是建立和最新的。

dnetdev11 ~ # make
make: `release' is up to date.

我如何強制makefile重建目標?

clean = $(MAKE) -f ~/xxx/xxx_compile.workspace.mak clean


build = svn up ~/xxx                                                       \
        $(clean)                                                                \
        ~/cbp2mak/cbp2mak -C ~/xxx ~/xxx/xxx_compile.workspace        \
        $(MAKE) -f ~/xxx/xxx_compile.workspace.mak $(1)                    \


release:
        $(build )

debug:
        $(build DEBUG=1)

clean:
        $(clean)

install:
        cp ~/xxx/source/xxx_utility/release/xxx_util /usr/local/bin
        cp ~/xxx/source/xxx_utility/release/xxxcore.so /usr/local/lib

注:刪除名稱以保護無辜者

編輯:最終修正版本:

clean = $(MAKE) -f xxx_compile.workspace.mak clean;


build = svn up;                                         \
        $(clean)                                        \
        ./cbp2mak/cbp2mak -C . xxx_compile.workspace;   \
        $(MAKE) -f xxx_compile.workspace.mak    $(1);   \


.PHONY: release debug clean install

release:
        $(call build,)

debug:
        $(call build,DEBUG=1)

clean:
        $(clean)

install:
        cp ./source/xxx_utillity/release/xxx_util /usr/bin
        cp ./dlls/Release/xxxcore.so /usr/lib



如果您不需要保留已經成功編譯的任何輸出

nmake /A 

重建所有




我試過這個,它為我工作

將這些行添加到Makefile中

clean:
    rm *.o output

new: clean
    $(MAKE)     #use variable $(MAKE) instead of make to get recursive make calls

保存並現在打電話

make new 

它會重新編譯一切

發生了什麼?

'new'調用clean'clean'做'rm',它刪除所有擴展名為'.o''new'調用'make'的對象文件。 'make'看到沒有'.o'文件,所以它繼續並再次創建所有'.o'。 那麼鏈接器將所有.o文件鏈接到一個可執行輸出中

祝你好運




其他人建議.PHONY這是絕對正確的。 .PHONY應該用於輸入和輸出之間的日期比較無效的任何規則。 由於你沒有任何形式output: input目標output: input你應該為它們使用.PHONY!

所有這些,你可能應該在你的makefile的頂部為各種文件名定義一些變量,並且定義具有輸入和輸出部分的真正的make規則,這樣你就可以使用make的好處,也就是說你只能實際編譯有必要的事情!

編輯:添加示例。 未經測試,但這是你如何做.PHONY

.PHONY: clean    
clean:
    $(clean)



這種簡單的技術將允許makefile在不需要強制時正常運行。 在makefile結尾創建一個名為force的新目標。 強制目標將觸及默認目標所依賴的文件。 在下面的例子中,我添加了觸摸myprogram.cpp 。 我還添加了一個遞歸調用。 這會在每次輸入make force時導致默認目標被製作。

yourProgram: yourProgram.cpp
       g++ -o yourProgram yourProgram.cpp 

force:
       touch yourProgram.cpp
       make



在我的Linux系統(Centos 6.2)上,當聲明目標.PHONY和在FORCE上創建一個偽依賴關係時,實際上創建一個匹配目標的文件時存在顯著差異。 當文件必須每次都重新生成時,它需要文件上的假依賴性FORCE和假依賴性的.PHONY。

錯誤:

date > $@

對:

FORCE
    date > $@
FORCE:
    .PHONY: FORCE