views:

29

answers:

2

I'm not sure if it's gmake or gcc that I don't understand here.

I'm using the -MM and -MD options to generate dependency rules for the Unit Testing framework I'm using. Specifically:

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

-include $(TEST_DEP_FILES)

When I run make, after all binaries are linked (properly), I see the following extra (unexplained) line before make exits

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

From whence is that rm command coming? The only place - anywhere - that I have an rm command in my makefile is in the clean directive

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

Any ideas?

+2  A: 

make will automatically create intermediate files if necessary to chain two rules together, but it will delete them at the end of the build. You can use the .PRECIOUS special target to prevent it from removing them

Michael Mrozek
Or .SECONDARY ...
reinierpost
@rei Ah, yes. I knew `.SECONDARY` forced make to treat files as intermediates, but I didn't realize it also stopped make from deleting them
Michael Mrozek
A: 

One helpful option for debugging these kind of problems is the -n switch:

make -n {TARGET}

It will show you the commands it would run but won't actually run them. This lets you see what rules are firing but doesn't give you all the extra output that makes it difficult to diagnose the problem.

The -d debug flag can also be useful but be sure to run it in a context where you can scroll around easily, you'll be getting a lot of output. I usually use emacs shell mode as it has good searching functionality and saves the buffer.

Paul Rubel