################################################################################ # Contents: makefile with dependency generation # # 26.05.2015 # #------------------------------------------------------------------------------# # makefile for cpp/c bins and libs # # autor Philipp Schoenberger # # ph.schoenberger@googlemail.com # ################################################################################ LIBS = pthread TOP_DIR = $(PWD) TEST_DIR = $(BUILD_DIR)/test INCLUDE_DIR = -I . \ -I ./include # comment this out if you want debug compile info #Q=@ ifeq ($(MAKECMDGOALS),test) GCOV := --coverage CPPUTEST_HOME := $(TOP_DIR)/test/cpputest INCLUDE_DIR += -I$(CPPUTEST_HOME)/include -I. SUPRESS_WARNINGS := -Wno-write-strings CFLAGS_TEST := -DUNIT_TEST $(GCOV) -include $(CPPUTEST_HOME)/include/CppUTest/MemoryLeakDetectorMallocMacros.h CXXFLAGS_TEST := -DUNIT_TEST -include $(CPPUTEST_HOME)/include/CppUTest/MemoryLeakDetectorNewMacros.h $(SUPRESS_WARNINGS) APP_PREFIX := test_ LIBS += CppUTest pthread gcov dl CPPUTEST_BUILD := $(CPPUTEST_HOME)/cpputest_build LIBS_TEST = -L $(CPPUTEST_BUILD)/lib/ TEST_SRC_FOLDER = test BUILD_DIR = $(PWD)/build/test # Sources SRC_C := $(wildcard $(TEST_SRC_FOLDER)/*.c) SRC_H := $(wildcard $(TEST_SRC_FOLDER)/*.h) SRC_CPP := $(wildcard $(TEST_SRC_FOLDER)/*.cpp) SRC_HPP := $(wildcard $(TEST_SRC_FOLDER)/*.hpp) else BUILD_DIR = $(PWD)/build/app # Sources SRC_C := $(wildcard *.c) SRC_CPP := $(wildcard *.cpp) endif SRC_H += $(wildcard *.h) $(wildcard include/*.h) SRC_HPP += $(wildcard *.hpp) OUT_BINARY = $(APP_PREFIX)lwrserv CC = g++ GLOBAL_FLAGS = -g -o2 -ansi -pedantic -DHAVE_SOCKLEN_T $(INCLUDE_DIR) CFLAGS = $(GLOBAL_FLAGS) $(CFLAGS_TEST) CXXFLAGS = $(GLOBAL_FLAGS) $(CFLAGS_TEST) CPPFLAGS = $(GLOBAL_FLAGS) $(CFLAGS_TEST) LDFLAGS = $(patsubst %,-l%,$(LIBS)) $(CFLAGS_TEST) $(LIBS_TEST) # Objects OBJS_C = $(patsubst %.c,$(BUILD_DIR)/%.o,$(SRC_C)) OBJS_CPP = $(patsubst %.cpp,$(BUILD_DIR)/%.o,$(SRC_CPP)) OBJS=$(patsubst %.o,%.o,$(OBJS_C) $(OBJS_CPP)) # Dependencies DEPS_H = $(patsubst %.h,$(BUILD_DIR)/%.d,$(SRC_H)) DEPS_HPP = $(patsubst %.hpp,$(BUILD_DIR)/%.d,$(SRC_HPP)) DEPS=$(OBJS:%.o=%.d) #DEPS+=$(DEPS_H) #DEPS+=$(DEPS_HPP) .DEFAULT: all all: $(BUILD_DIR) $(BUILD_DIR)/$(OUT_BINARY) test: CPPUTEST $(BUILD_DIR)/$(OUT_BINARY) $(TEST_DIR) $(BUILD_DIR)/$(OUT_BINARY) -v CPPUTEST: $(CPPUTEST_HOME) rm $(CPPUTEST_BUILD) -rf && mkdir $(CPPUTEST_BUILD) -p cd $(CPPUTEST_BUILD) && autoreconf .. -i cd $(CPPUTEST_BUILD) && ../configure cd $(CPPUTEST_BUILD) && $(MAKE) $(BUILD_DIR) $(TEST_DIR): $(Q)echo " [mk] $@" $(Q)mkdir -p $@ clean: $(Q)echo " [rm] $(BUILD_DIR)" $(Q)rm -rf $(BUILD_DIR) $(BUILD_DIR)/$(OUT_BINARY): $(BUILD_DIR) $(DEPS) $(DEP_LIBS) $(OBJS) $(Q)echo " [ld] $@" $(Q)( $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) -o $@ ) || exit 1 $(BUILD_DIR)/%.o : %.c $(BUILD_DIR) $(TEST_DIR) $(Q)echo " [CC] $@" $(Q)( $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ ) || exit 1 $(BUILD_DIR)/%.o : %.cpp $(BUILD_DIR) $(TEST_DIR) $(Q)echo " [CXX] $@" $(Q)( $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) $< -o $@ ) || exit 1 $(BUILD_DIR)/%.d: $(BUILD_DIR) $(TEST_DIR) %.c $(Q)echo " [DEP] $@" $(Q)touch $@ $(Q)echo -n "$@ $(patsubst %.d,%.o,$@):" >$@ $(Q)$(CC) -M $(CFLAGS) $(filter %.cpp,$^ ) | sed 's:$*.o\:::' >> $@ $(BUILD_DIR)/%.d: $(BUILD_DIR) $(TEST_DIR) %.cpp $(Q)echo " [DEP] $@" $(Q)touch $@ $(Q)$(CC) -M $(filter-out -g -o0 -o1 -o2 ,$(CPPFLAGS)) $(filter %.cpp,$^) >> $@ #$(Q)echo -n "$@ $(patsubst %.d,%.o,$@): " >$@ -include $(DEPS)