天天看點

linux下系統的makefile編寫

#編譯程式名稱
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)/

           

繼續閱讀