2010-07-24 71 views
10

我不確定是否gmake或gcc,我不明白在這裏。使刪除依賴文件

我正在使用-MM和-MD選項爲我正在使用的單元測試框架生成依賴關係規則。具體做法是:

$(TEST_OBJ_DIR)/%.d: $(TEST_SRC_DIR)/%.cpp 
    @$(CPPC) -MM -MD $< -o [email protected] 
    @sed -i -e 's|\(.*\)\.o:|$(OBJ_DIR)/\1.o $(TEST_OBJ_DIR)/\1.d $(TEST_OBJ_DIR)/\1.o:|' [email protected] 

-include $(TEST_DEP_FILES) 

當我運行make,畢竟二進制文件鏈接(正確),我看到了以下額外的(不明原因)行之前做出口

rm test/obj/dice.d test/obj/regex.o test/obj/inventoryContainer.d test/obj/color-string.d test/obj/dice.o test/obj/inventoryContainer.o test/obj/color-string.o test/obj/regex.d 

從那裏是rm命令來嗎?唯一的地方 - 任何地方 - 我有我的生成文件的rm命令是在乾淨的指令

test-clean: 
    rm -f $(TEST_BIN_FILES) 
    rm -f $(TEST_OBJ_DIR)/*.{a,d,o} 

任何想法?

回答

10

make將自動創建intermediate files,如果需要鏈接兩個規則在一起,但它會在構建結束時刪除它們。您可以使用.PRECIOUS特殊的目標,以防止它刪除這些

+1

或.SECONDARY ... – reinierpost 2010-07-25 16:34:34

+0

@rei啊,是的。我知道'.SECONDARY'強制將文件當作中間文件,但我沒有意識到它也停止了從刪除它們 – 2010-07-25 16:58:22

0

用於調試這些類型的問題的一個有用的選項是-n開關:

make -n {TARGET} 

它會告訴你它會運行命令,但韓元實際上運行它們。這可以讓你看到哪些規則正在觸發,但並不能給你提供所有額外的輸出,從而難以診斷問題。

-d調試標誌也可能很有用,但一定要在可以輕鬆滾動的上下文中運行它,您將獲得大量輸出。我通常使用emacs shell模式,因爲它具有良好的搜索功能並保存緩衝區。