### 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)
Makefile
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.