On Sun, Jan 8, 2012 at 9:38 PM, Pelias <[email protected]> wrote: > > I'm new to GNU make so I would like to know if I made any mistakes in the way > I have written my Makefile. > One thing I'm not sure whether to append -DDEBUG/-DNDEBUG to CPPFLAGS or to > CFLAGS. > > # define the variables > > CC = g++ > CFLAGS = -Wall > CPPFLAGS = > LDFLAGS = > DOUT = runme_debug > ROUT = runme > HEADERS = $(wildcard *.hh ) > SOURCES = $(wildcard *.cc ) > DOBJECTS = $(SOURCES:.cc=.do) > OBJECTS = $(SOURCES:.cc=.o) > > # define the rules > > all: $(DOUT) > > release: $(ROUT) > > $(DOUT): CFLAGS += -g > $(DOUT): CPPFLAGS += -DDEBUG=1 > $(DOUT): $(DOBJECTS) > $(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ > > $(ROUT): CPPFLAGS += -DNDEBUG=1 > $(ROUT): $(OBJECTS) > $(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ > > %.o: %.cc $(HEADERS) > $(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $< > > %.do: %.cc $(HEADERS) > $(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $< > > debug: $(DOUT) > ./$(DOUT) > run: release > ./$(ROUT) > test: all > valgrind $(DOUT) > clean: > rm -f *.o > rm -f *.do > rm -f $(DOUT) > rm -f $(ROUT) > My makefile would look similar to the following. It allows you to say `make`, `make debug` and `make release`.
Jeff #default is Debug WANT_DEBUG = 1 DEBUG_GOALS = $(filter $(MAKECMDGOALS), debug) ifneq ($(DEBUG_GOALS),) WANT_DEBUG := 1 endif RELEASE_GOALS = $(filter $(MAKECMDGOALS), release all $(DYNAMIC_LIB) $(STATIC_LIB)) ifneq ($(RELEASE_GOALS),) WANT_DEBUG := 0 WANT_RELEASE := 1 endif ... # libstdc++ debug: http://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode.html ifeq ($(WANT_DEBUG),1) # Whoops, ABI compatibility issues with pre-built DSOs # override CXXFLAGS += -D_GLIBCXX_DEBUG -DDEBUG=1 -g3 -ggdb -O0 override CXXFLAGS += -DDEBUG=1 -g3 -ggdb -O0 endif ifeq ($(WANT_RELEASE),1) override CXXFLAGS += -DNDEBUG=1 -g -O2 endif ... Jeff _______________________________________________ Help-make mailing list [email protected] https://lists.gnu.org/mailman/listinfo/help-make
