################################################################################ # Contents: makefile with dependency generation # # 26.05.2015 # #------------------------------------------------------------------------------# # makefile for cpp/c bins and libs # # autor Philipp Schoenberger # # ph.schoenberger@googlemail.com # ################################################################################ LIBS = pthread boost_thread boost_system TOP_DIR = $(PWD) SRC_FOLDER = ./src TEST_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 CPPUTEST_LIB = $(CPPUTEST_BUILD)/lib # 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 = $(TOP_DIR)/build/app # Sources SRC_C += $(wildcard $(SRC_FOLDER)/*.c) SRC_CPP += $(wildcard $(SRC_FOLDER)/*.cpp) endif SRC_H += $(wildcard $(INCLUDE_DIR: % = %.h) $(SRC_FOLDER: % = %.h)) SRC_HPP += $(wildcard $(INCLUDE_DIR: % = %.hpp) $(SRC_FOLDER: % = %.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_C = $(patsubst %.c, $(BUILD_DIR)/%.d, $(SRC_C)) DEPS_CPP = $(patsubst %.cpp, $(BUILD_DIR)/%.d, $(SRC_CPP)) 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) DEPS += $(DEPS_C) DEPS += $(DEPS_CPP) #DEPS+=$(DEPS_H) #DEPS+=$(DEPS_HPP) .DEFAULT: all .PHONY: all test CPPUTEST CPPUTEST_COMPILE clean doc all: $(BUILD_DIR) $(BUILD_DIR)/$(OUT_BINARY) doc: doxygen $(TOP_DIR)/doc/doxygenconfig test: CPPUTEST $(BUILD_DIR)/$(OUT_BINARY) $(TEST_DIR) $(BUILD_DIR)/$(OUT_BINARY) -v CPPUTEST: $(CPPUTEST_HOME) $(CPPUTEST_LIB) $(CPPUTEST_LIB): CPPUTEST_COMPILE CPPUTEST_COMPILE: mkdir $(CPPUTEST_BUILD) -p cd $(CPPUTEST_BUILD) && autoreconf .. -i cd $(CPPUTEST_BUILD) && ../configure cd $(CPPUTEST_BUILD) && $(MAKE) $(BUILD_DIR) $(TEST_DIR): echo $(SRC_C) echo $(DEPS) $(Q)echo " [mk] $@" $(Q)mkdir -p $@/src $@/test $@/include 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)