Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

make deleting dependency files

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?

like image 309
Chris Tonkinson Avatar asked Jul 24 '10 18:07

Chris Tonkinson


2 Answers

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

like image 141
Michael Mrozek Avatar answered Oct 22 '22 00:10

Michael Mrozek


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.

like image 28
Paul Rubel Avatar answered Oct 22 '22 00:10

Paul Rubel