Makefile - das ultimative Makefile für jedes Projekt



  • Hier wird eine Makefile vorgestellt (benötigt GNU/Make), die man in den meisten Projekten einfach benutzen kann, man muss nur folgende Variablen anpassen:

    TARGET Name des erzeugten Binarys
    CXXFLAGS hier werden die Flags eingetragen, die dem Compiler überreicht werden.
    LIBS hier werden die Flags eingetragen, die beim linken übergeben werden.
    EXT hier wird die Endung der C++-Code-Dateien angegeben

    Für umfangreichere Anpassungen empfiehlt sich ein Blick in das GNU/Make Handbuch.

    ⚠ Bitte darauf achten, dass die Zeilen mit Tabs und nicht mit Spaces eingerückt sind. ⚠

    TARGET   := ./program
    CXXFLAGS := -g -Wextra -Wall -Wno-long-long -pedantic-errors -std=c++98 
    CXX      := g++ 
    LIBS     := 
    EXT      := cpp 
    BUILDDIR := build
    
    override BUILDDIR := $(strip $(BUILDDIR))
    SOURCES  := $(wildcard *.$(EXT)) 
    OBJECTS  := $(patsubst %.$(EXT), $(BUILDDIR)/%.o, $(SOURCES)) 
    DEPS     := $(patsubst %.$(EXT), $(BUILDDIR)/%.dep, $(SOURCES)) 
    
    .PHONY: all
    all: $(TARGET) 
    
    $(TARGET): $(OBJECTS) $(DEPS) 
    	$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS) 
    
    ifneq ($(MAKECMDGOALS), clean) 
    -include $(DEPS) 
    endif 
    
    $(OBJECTS): $(BUILDDIR)/%.o: %.$(EXT) $(BUILDDIR)/%.dep $(BUILDDIR)/.tag
    	$(CXX) $(CXXFLAGS) -c $< -o $@ 
    
    $(DEPS): $(BUILDDIR)/%.dep: %.$(EXT) $(BUILDDIR)/.tag
    	mkdir -p $(dir $(@))
    	$(CXX) $(CXXFLAGS) -MM $< -MT $@ -MT $(<:.$(EXT)=.o) -o $@ 
    
    %.tag:
    	mkdir -p $(dir $(@))
    	touch $@
    
    .PHONY: clean 
    clean: 
    	$(RM) -r $(BUILDDIR)
    

    Danke an volkard, der das Makefile entworfen hat, als auch an ponto, MrN und denis (aka DrGreenthumb), die fleißig Korrekturen und Verbesserungen beigetragen haben.

    Unter Beachtung folgender Hinweise könnte das Makefile noch verbessert werden: http://make.paulandlesley.org/autodep.html

    Update: Das ultimative Makefile kommt nun auch mit mehreren Codeverzeichnissen klar.

    2012-06-28: $(RM) anstelle rm -f

    alter Thread


Anmelden zum Antworten