TARGET := test
TYPE := app
DEFINES :=
MACROS :=
SET_PATH :=
INC_PATH := -I.
SRC_PATH := 3rd src
ifeq (ARM,$(filter ARM,$(DEFINES)))
RPATH :=
else
RPATH :=
endif
LDFLAGS := -L.
ifeq (ARM,$(filter ARM,$(DEFINES)))
LDFLAGS +=
else
LDFLAGS +=
endif
LIBS :=
LIB_STATICS :=
ifeq (ARM,$(filter ARM,$(DEFINES)))
LIB_STATICS +=
else
LIB_STATICS +=
endif
CC := g++
AR := ar
ifeq (ARM,$(filter ARM,$(DEFINES)))
CC :=
AR :=
endif
CFLAGS := -g -Wall -O3 -Wl,-rpath=$(RPATH)
CXXFLAGS := -DHAVE_CONFIG_H -std=c++11
BUILD_DIR ?= _build
OBJ_C_DIR ?= $(BUILD_DIR)/object_c
OBJ_CXX_DIR ?= $(BUILD_DIR)/object_cxx
define pwdFiles
$(1) = $(wildcard *)
endef
define searchFiles
$(1) = $(foreach dir,$(1),$(wildcard $(dir)/*))
endef
SHELL = cmd
ifeq (,$(SET_PATH))
SET_PATH := ${CURDIR}
endif
SOURCES := $(filter %.c %.cc %.cpp %.hpp,$(call pwdFiles) $(call searchFiles,$(SRC_PATH)))
DEPENDS_C := $(patsubst %.c,$(OBJ_C_DIR)/%.d,$(filter %.c,$(SOURCES)))
DEPENDS_CC := $(patsubst %.cc,$(OBJ_CXX_DIR)/%.d,$(filter %.cc,$(SOURCES)))
DEPENDS_CPP := $(patsubst %.cpp,$(OBJ_CXX_DIR)/%.d,$(filter %.cpp,$(SOURCES)))
DEPENDS_HPP := $(patsubst %.hpp,$(OBJ_CXX_DIR)/%.d,$(filter %.hpp,$(SOURCES)))
DEPENDS := $(DEPENDS_C) $(DEPENDS_CC) $(DEPENDS_CPP) $(DEPENDS_HPP)
OBJECTS := $(DEPENDS:%.d=%.o)
FLAGS := $(MACROS) $(INC_PATH) $(CFLAGS) $(CXXFLAGS)
ifeq (shared,$(TYPE))
FLAGS += -fpic -shared
TARGET := lib$(TARGET).dll
endif
ifeq (static,$(TYPE))
TARGET := lib$(TARGET).lib
endif
LIB_FLAGS := $(LDFLAGS) $(LIBS) $(LIB_STATICS)
.PHONY: help
help:
$(info Build Help for Target '$(TARGET)':)
$(info * make all -- build project, aborted after an error)
$(info * make clean -- delete files [.d .o] in folder '$(BUILD_DIR)')
$(info * make veryclean -- delete folder '$(BUILD_DIR)')
$(info * make rebuild -- rebuild project)
$(info * make install -- install to the path '$(SET_PATH)')
all: $(TARGET)
$(OBJ_C_DIR)/%.d: %.c
@if not exist $(subst /,\\,$(@D)) (mkdir $(subst /,\\,$(@D)))
@set -e; del /F /Q $@; \
$(CC) -MM $(FLAGS) $< > $@.$$$$; \
sed 's,$(notdir $*)\.o[ :]*,$(OBJ_C_DIR)/$*\.o $@ : ,g' < $@.$$$$ > $@; \
del /F /Q $@.$$$$
$(OBJ_CXX_DIR)/%.d: %.cc
@if not exist $(subst /,\\,$(@D)) (mkdir $(subst /,\\,$(@D)))
@set -e; del /F /Q $@; \
$(CC) -MM $(FLAGS) $< > $@.$$$$; \
sed 's,$(notdir $*)\.o[ :]*,$(OBJ_CXX_DIR)/$*\.o $@ : ,g' < $@.$$$$ > $@; \
del /F /Q $@.$$$$
$(OBJ_CXX_DIR)/%.d: %.cpp
@if not exist $(subst /,\\,$(@D)) (mkdir $(subst /,\\,$(@D)))
@set -e; del /F /Q $@; \
$(CC) -MM $(FLAGS) $< > $@.$$$$; \
sed 's,$(notdir $*)\.o[ :]*,$(OBJ_CXX_DIR)/$*\.o $@ : ,g' < $@.$$$$ > $@; \
del /F /Q $@.$$$$
$(OBJ_CXX_DIR)/%.d: %.hpp
@if not exist $(subst /,\\,$(@D)) (mkdir $(subst /,\\,$(@D)))
@set -e; del /F /Q $@; \
$(CC) -MM $(FLAGS) $< > $@.$$$$; \
sed 's,$(notdir $*)\.o[ :]*,$(OBJ_CXX_DIR)/$*\.o $@ : ,g' < $@.$$$$ > $@; \
del /F /Q $@.$$$$
o_describe:
$(info ========================== Generate .o File ==========================)
$(OBJ_C_DIR)/%.o: %.c
$(info $@)
@if not exist $(subst /,\\,$(@D)) (mkdir $(subst /,\\,$(@D)))
@$(CC) $(FLAGS) -c $< -o $@
$(OBJ_CXX_DIR)/%.o: %.cc
$(info $@)
@if not exist $(subst /,\\,$(@D)) (mkdir $(subst /,\\,$(@D)))
@$(CC) $(FLAGS) -c $< -o $@
$(OBJ_CXX_DIR)/%.o: %.cpp
$(info $@)
@if not exist $(subst /,\\,$(@D)) (mkdir $(subst /,\\,$(@D)))
@$(CC) $(FLAGS) -c $< -o $@
$(OBJ_CXX_DIR)/%.o: %.hpp
$(info $@)
@if not exist $(subst /,\\,$(@D)) (mkdir $(subst /,\\,$(@D)))
@$(CC) $(FLAGS) -c $< -o $@
-include $(DEPENDS)
$(TARGET): o_describe $(OBJECTS)
$(info ======================== Generate Target File ========================)
ifeq (static,$(TYPE))
@$(AR) -r $(BUILD_DIR)/$@ $(OBJECTS)
else
@$(CC) $(FLAGS) -o $(BUILD_DIR)/$@ $(OBJECTS) $(LIB_FLAGS)
endif
$(info Build "$(BUILD_DIR)/$@" OK ...)
clean:
@if exist $(subst /,\\,$(OBJ_C_DIR)) (rd /S /Q $(subst /,\\,$(OBJ_C_DIR)))
@if exist $(subst /,\\,$(OBJ_CXX_DIR)) (rd /S /Q $(subst /,\\,$(OBJ_CXX_DIR)))
$(info Clean OK ...)
veryclean:
@if exist $(subst /,\\,$(BUILD_DIR)) (rd /S /Q $(subst /,\\,$(BUILD_DIR)))
$(info Very Clean OK ...)
rebuild: clean all