Search code examples
makefilewarnings

Make file warning, overriding commands for target


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:

  1. Any way to ignore the warnings
  2. Am i doing things right? What changes are needed?

Solution

  • 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)