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 angegebenFü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