As part of the makefile i'd like to produce either a debug or release version of the target.
Functionally, everything is working, however, i am getting warnings when running make
12 SRC := $(shell echo src/*.cpp)
13 SRC += $(shell echo $(TEST_ROOT)/*.cpp)
14
15 D_OBJECTS = $(SRC:.cpp=.o) # same objects will need to be built differently
16 R_OBJECTS = $(SRC:.cpp=.o) # same objects will need to be built differently
22 all: $(TARGET)
23
25 $(TARGET): $(D_OBJECTS)
26 $(CC) $(D_OBJECTS) -o $(TARGET)
27
28 $(D_OBJECTS) : %.o: %.cpp # ----- run with debug flags
29 $(CC) $(COMMON_FLAGS) $(DEBUG_FLAGS) -c $< -o $@
30
31 release: $(R_OBJECTS)
32 $(CC) $(R_OBJECTS) -o $(TARGET)
33
34 $(R_OBJECTS) : %.o: %.cpp # ----- run with release flags
35 $(CC) $(COMMON_FLAGS) $(RELEASE_FLAGS) -c $< -o $@
When i make
i get debug version, when i make release
i get release version.
But i also get warnings:
Makefile:35: warning: overriding commands for target `src/Timer.o'
Makefile:29: warning: ignoring old commands for target `src/Timer.o'
Makefile:35: warning: overriding commands for target `test/TimerTest.o'
Makefile:29: warning: ignoring old commands for target `test/TimerTest.o'
With this 2 questions:
One of the most common ways for doing this is to put the release objects and the debug objects in separate subdirectories. That way you don't get redefinitions for the rules for an object, since they will have different names. Something like this:
D_OBJECTS=$(SRC:%.cpp=debug/%.o)
R_OBJECTS=$(SRC:%.cpp=release/%.o)
RTARGET = a.out
DTARGET = a.out.debug
all : dirs $(RTARGET)
debug : dirs $(DTARGET)
dirs :
@mkdir -p debug release
debug/%.o : %.c
$(CC) $(DEBUG_CFLAGS) -o $@ -c $<
release/%.o : %.c
$(CC) $(RELEASE_CFLAGS) -o $@ -c $<
$(DTARGET) : $(D_OBJECTS)
$(CC) $(DEBUG_CFLAGS) -o $@ $(D_OBJECTS)
$(RTARGET) : $(R_OBJECTS)
$(CC) $(RELEASE_CFLAGS) -o $@ $(R_OBJECTS)