2010-07-24 80 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模式,因为它具有良好的搜索功能并保存缓冲区。