Für kleinere Projekte oder ad hoc Aufgaben in C++ ist es nützlich ein universelles Makefile bei der Hand zu haben. Daher hab ich etwas im Internet recherchiert und aus den folgenden beiden Quellen ein Makefile für meine Zwecke gebaut.

### Start of user configuration ################################

# Name your executable.
TARGET = application

# Additional paths for PKG_CONFIG_PATH.
PKG_CONFIG_PATH =

# Additional libs, flags will be created with pkg-config.
LIBS =

# User flags.
CXXFLAGS =
LDFLAGS =

### End of user configuration ##################################

# Default build type.
TYPE = debug

# Special flags for each build type.
ifeq ($(TYPE),debug)
CXXFLAGS := $(value CXXFLAGS) -O0 -g3
LDFLAGS := $(value LDFLAGS)
endif

ifeq ($(TYPE),profile)
CXXFLAGS := $(value CXXFLAGS) -pg
LDFLAGS := $(value LDFLAGS) -pg
endif

ifeq ($(TYPE),release)
CXXFLAGS := $(value CXXFLAGS) -O3
LDFLAGS := $(value LDFLAGS) -s
endif

# The source, include and object store directory.
SRCDIR = src
INCDIR = include
OBJDIR = .$(TYPE)

# Compiler and compiler options.
CXX = g++
CXXFLAGS := $(value CXXFLAGS) -Wall -I$(INCDIR) -I$(SRCDIR) \
  $(if $(LIBS), $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
  pkg-config --cflags $(LIBS)))

# Linker and linker options.
LD = g++
LDFLAGS := $(value LDFLAGS) $(if $(LIBS),\
  $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
  pkg-config --libs $(LIBS)))

# List of source files.
SRCS := $(foreach FILE,$(shell find $(SRCDIR) -name \
  *.cpp | xargs), $(subst $(SRCDIR)/, , $(FILE)))
# List of object files.
OBJS := $(addprefix $(OBJDIR)/,$(SRCS:.cpp=.o))
# List of dependency files.
DEPS := $(addprefix $(OBJDIR)/,$(SRCS:.cpp=.d))

.PHONY: init clean

$(TARGET): init $(OBJS)
  $(LD) $(LDFLAGS) -fPIC $(OBJS) -o $(TARGET)

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
  $(CXX) -Wp,-MMD,$(OBJDIR)/$*.dd $(CXXFLAGS) -fPIC -c $< -o $@
  @sed -e '1s/^\(.*\)$$/$(subst /,\/,$(dir $@))\1/' \
    $(OBJDIR)/$*.dd > $(OBJDIR)/$*.d
  @rm -f $(OBJDIR)/$*.dd

init:
  @if [ ! -e $(OBJDIR) ]; then mkdir $(OBJDIR); fi;
  @$(foreach DIR,$(sort $(dir $(SRCS))), \
    if [ ! -e $(OBJDIR)/$(DIR) ]; \
    then mkdir $(OBJDIR)/$(DIR); fi; )

clean:
  @rm -f $(TARGET) $(OBJS)

-include $(DEPS)