#編譯程式名稱
APPNAME = XXX
#編譯程式生成臨時檔案(.o)目錄
OBJDIR = build/
CC = g++
#頭檔案目錄
SYSCLUDE = -I ./include_linux
#程式用到的系統的頭檔案
SYSTEMLIB = -ldl -lz -pthread
#靜态庫檔案
LIBPATH = -L./lib_x86
COMMON_LIB = $(LIBPATH) -lcurl -lssl -lcrypto -lsqlite3 -lcares
#添加工程的cpp檔案,隻支援搜尋一層目錄
#CODEDIR = $(filter-out %/$(OBJDIR),$(shell find $(shell pwd) -maxdepth 2 -type d))
CODEDIR = $(filter-out %/$(OBJDIR),dfdll)
CPPPATH :=$(foreach subpath,$(CODEDIR),$(subpath))
VPATH = $(patsubst -IXXIMWXX,,$(CPPPATH))
#添加工程的頭檔案
HEADDIR = $(filter-out %/$(OBJDIR),$(shell find . -maxdepth 3 -type d))
#各個子目錄下面的cpp檔案
CPPFILES =$(wildcard $(addsuffix /*.cpp,$(CODEDIR)))
#各個子目錄下面的c檔案
CFILES =$(wildcard $(addsuffix /*.c,$(CODEDIR)))
#定義源檔案的關聯關系檔案名(*.d)
DFILES = $(addprefix $(OBJDIR),$(notdir $(CPPFILES:.cpp=.d)))
LIBTYPE = $(shell uname -i)
#定義編譯發行版本(Release)時産生的*.o檔案名
RELEASEOBJ = $(patsubst %.cpp,$(OBJDIR)/%.o,$(notdir $(CPPFILES)))
#定義編譯調試版本(Debug)時産生的*.dbg.o檔案名
DEBUGOBJ = $(patsubst %.cpp,$(OBJDIR)/%.dbg.o,$(notdir $(CPPFILES)))
#無效的目錄替換成下面的字元串
FATALERR=XXIMWXX
#所有的子目錄
INCLUDETMPFLAG:=$(foreach subpath,$(HEADDIR),-I $(subpath))
INCLUDEFLAG = $(patsubst -I$(FATALERR),,)
#指定編譯調試版本(Debug)時的編譯參數
DEBUGFLAG = $(CC) -fPIC -c -w -rdynamic -g -D _DEBUG $(INCLUDEFLAG) $(SYSCLUDE)
#指定編譯發行版本(Release)時的編譯參數
RELEASEFLAG = $(CC) -fPIC -c -w -rdynamic $(INCLUDEFLAG) $(SYSCLUDE)
ifeq ($(LIBTYPE),aarch64)
LIBPATH = -L./lib_arrch
endif
ifeq ($(LIBTYPE),mips64)
LIBPATH = -L./lib_mips
endif
all : Release
Release : $(DFILES)
Release : $(RELEASEOBJ)
Release :
echo Release
$(CC) -shared -fPIC $(CFLAGS) $(BITFLAG) -o $(APPNAME) $(RELEASEOBJ) $(COMMON_LIB) $(SYSTEMLIB) -Wl,-Bsymbolic
Debug : $(DFILES)
Debug : $(DEBUGOBJ)
Debug :
echo Debug
$(CC) -shared -fPIC $(CFLAGS) $(BITFLAG) -o $(APPNAME) $(DEBUGOBJ) $(COMMON_LIB) $(SYSTEMLIB) -Wl,-Bsymbolic
#*.d檔案的産生方法
$(DFILES): $(OBJDIR)%.d : %.cpp
@echo 正在分析檔案:$<; mkdir -p $(OBJDIR);\
$(if $(shell $(CC) -MM $(INCLUDEFLAG) $<),echo $(OBJDIR)/$(shell $(CC) -MM $(INCLUDEFLAG) $<) > $@, $(error 分析檔案:$(patsubst %.d,%.cpp,$@)失敗)); \
echo ' '$(RELEASEFLAG) $< -o $(patsubst %/,$(OBJDIR)/,$(patsubst %.d,%.o,$@)) >>$@; \
echo $(patsubst %.o:,%.dbg.o:,$(OBJDIR)/$(shell $(CC) -MM $(INCLUDEFLAG) $<)) >>$@; \
echo ' '$(DEBUGFLAG) $< -o $(patsubst %/,$(OBJDIR)/,$(patsubst %.d,%.dbg.o,$@)) >>$@
#如果不是要clean的話
ifneq ($(MAKECMDGOALS),clean)
#裝載自動産生的*.d檔案
-include $(DFILES)
endif
#.PHONY:print
#print:
# @echo $(VPATH)
.PHONY:clean
clean:
rm -rf $(APPNAME) *.o *.d *.dbg.o $(OBJDIR)/