1.Makefile中include的做用java
在Makefile使用include關鍵字能夠把別的Makefile包含進來,這很像C語言的#include,被包含的文件會原模原樣的放在當前文件的包含位置。include的語法是: include <filename>; filename能夠是當前操做系統Shell的文件模式(能夠保含路徑和通配符) 在 include前面能夠有一些空字符,可是毫不能是[Tab]鍵開始。include和<filename>;能夠用一個或多個空格隔 開。 舉個例子,你有這樣幾個Makefile:a.mk、b.mk、c.mk,還有一個文件叫foo.make,以及一個變量$(bar),其包含了 e.mk 和f.mk,那麼,下面的語句: include foo.make *.mk $(bar) 等價於: include foo.make a.mk b.mk c.mk e.mk f.mk
2. CFLAGS 和CXXFLAGS 的做用c++
CFLAGS 表示用於 C 編譯器的選項, CXXFLAGS 表示用於 C++ 編譯器的選項。 這兩個變量實際上涵蓋了編譯和彙編兩個步驟。
3. make -f ***.mk $@ TARGET="***" LIBS="***" .... 後面接的變量是作什麼的sql
@make -f $(MKHOME)/mak/mkstand.mak $@ TARGET="$(PRGTARG)" OBJS="$(PRGOBJS)" LIBS="$(PRGLIBS)" DEFS="$(PRGDEFS)" DBNM="$(PRGDBNM)" 中 mkstand.mak後面接的參數 是做爲變量傳入了 mkstand.mak 文件中
4.Makefile裏面 -l 和 -L的區別app
-l-->指定鏈接時指望鏈接的庫的名字 -L-->指定鏈接庫的搜索路徑
5.實際項目makefile分析:ide
5.1頂層makefile分析ui
#目標,目的就爲了執行下面的程序 debug all: debugtuxsvrexec #沒什麼用 release: releasetuxsvrexec #下面的操做,只是爲了要執行other.mk文件而已,並無任何的做用 # DO NOT modify any code below!!! releasedynamic debugdynamic releasestatic debugstatic releaseexec debugexec releasetuxsvrexec debugtuxsvrexec clean: @make -f other.mk $@ @rm -f *.o
make的步驟:spa
make -f other.mk debugtuxsvrexec操作系統
5.2 中間層makefiledebug
PROCURRPATH = $(SRCHOME)/file PRGOBJS = $(PROCURRPATH)/other.o PRGTARG = OTHER PRGLIBS = -ldbsutil -lcnutil -ltxnutil -ldbopr TUXSERVICE = OTHERSVC # used for db2 database PRGDBNM = #!!!!!!注意!!!!!! #若是使用上層的make來執行當前的makefile ,則下面的兩個變量沒有任何意義,使用了上層傳入的變量 #只有當使用make -f other.mk 命令執行當前makefie時,這個變量纔有意義 #緣由? 不清楚。 debug all: debugtuxsvrexec release: releasetuxsvrexec # # DO NOT modify any code below!!! releasedynamic debugdynamic releasestatic debugstatic releaseexec debugexec debugtuxsvrexec releasetuxsvrexec clean: @make -f $(MKHOME)/mak/mkstand.mak $@ TARGET="$(PRGTARG)" OBJS="$(PRGOBJS)" LIBS="$(PRGLIBS)" DEFS="$(PRGDEFS)" DBNM="$(PRGDBNM)" rm -f tp*
make的步驟:調試
make -f /app/tcard/core/src/mak/mkstand.mak debugtuxsvrexec TARGET="OTHER" OBJS="/app/tcard/core/src/file/other.o" LIBS="-ldbsutil -lcnutil -ltxnutil -ldbopr " DEFS="-D__DEBUG__" DBNM=""
5.3底層makefile分析
#|----------------------------------------------------------------------------| #| FILE NAME : mksstand.mak | #| DESCRIPTIONS : Makefile for all kind of platform, for c and pc file, | #| for lib(dynamic & static) and execuatable object | #|----------------------------------------------------------------------------| #頭文件 倒入 include $(MKHOME)/mak/platform.mak include $(MKHOME)/mak/database.mak include $(MKHOME)/mak/tuxedo.mak # environment variables must be define outside of makefile # # $FEHOME : home directory of develop # $CCFLG : compiler options for c source code # $CXXFLG : compiler options for c++ source code # $DLFLG : link options for dynamic library # $SLFLG : link options for static library # $EXFLG : link options for excecuteable object # $DBFLG : debug mode options # $OPFLG : optimize mode options # $DLFIX : suffix of dynamic library # $SLFIX : suffix of static library # $OBJS : c object files list # $LIBS : libs required for executable object # $DEFS : define flag list # $TARGET : target objetc name # $TUXSVCS: tuxedo services name # $TUXRSMN: tuxedo resource manager name # $DBNM : db name (for db2) # commands PC = proc EC = esql DB2 = db2 JAVAC = javac JAVAH = javah RMIC = rmic RM = rm -f CP = cp MV = mv CD = cd ECHO = @echo # paths and flags SYSINCP = /usr/include SYSLIBP = /usr/lib64 JINCP = $(JAVA_HOME)/include JMDINCP = $(JAVA_HOME)/include/$(JAVAMD) XMLINCP = $(APPHOME)/libxml/include/libxml2 XMLLIBP = $(APPHOME)/libxml/lib FEHOME = $(SRCHOME) BINP = $(APPHOME)/bin TUXBINP = $(APPHOME)/bin LIBP = $(APPHOME)/lib LIBX = $(APPHOME)/lib3rd INCP = $(FEHOME)/include INCX = $(FEHOME)/../lib3rd/include CLSP = $(BINP)/classes JLIBP = $(JAVA_HOME)/lib #頭文件路徑 INCPS = -I$(SYSINCP) -I$(INCP) -I$(DBINCP) -I$(TUXINCP) -I$(JINCP) -I$(JMDINCP) -I$(XMLINCP) -I$(INCX) -I. #連接庫 LIBPS = -L$(SYSLIBP) -L$(XLIBP) -L$(LIBP) $(DBLIBP) -L$(TUXLIBP) -L$(XMLLIBP) -L$(LIBX) #表示的是c編譯器的選項 CCFLGS = $(RLFLG) $(CCFLG) $(DEFS) $(TUXDEF) $(DBDEF) $(OSDEF) $(PROCDEF) $(BITDEF) $(INCPS) #表示的是c++編譯器的選項 CXXFLGS = $(RLFLG) $(CXXFLG) $(DEFS) $(TUXDEF) $(DBDEF) $(OSDEF) $(PROCDEF) $(BITDEF) $(INCPS) #在LIBPS 前面加上 -G 編譯器選項,在編譯的時候,產生調試信息) DLFLGS = $(DLFLG) $(LIBPS) EXFLGS = $(EXFLG) $(LIBPS) #生成的動態庫的路徑 DLTARG = $(LIBP)/lib$(TARGET)$(DLFIX) SLTARG = $(LIBP)/lib$(TARGET)$(SLFIX) #生成的可執行文件的路in個 EXTARG = $(BINP)/$(TARGET) #生成的TUXEDO服務的路徑 TUXTARG = $(TUXBINP)/$(TARGET) #執行 生成那個一目標,是由上一層的makefile絕對的 debugdynamic: setdebug $(DLTARG) releasedynamic: setrelease $(DLTARG) debugstatic: setdebug $(SLTARG) releasestatic: setrelease $(SLTARG) debugexec: setdebug $(EXTARG) releaseexec : setrelease $(EXTARG) debugtuxsvrexec: setdebug $(TUXTARG) releasetuxsvrexec : setrelease $(TUXTARG) javaclasses : $(OBJS) $(ECHO) "Finish java package [$(TARGET)]" rmi : $(ECHO) "rmic [$(TARGET)] ..." @$(CD) `dirname $(TARGET)`; \ $(RMIC) `basename $(TARGET)` #預編譯的命令吧 setdebug: $(ECHO) $(DBFLG) > $(FEHOME)/mak/.mak.tmp setrelease: $(ECHO) $(OPFLG) > $(FEHOME)/mak/.mak.tmp $(SLTARG): $(OBJS) $(ECHO) "Linking [$(SLTARG)] ..." #SLINK = ar SLFLG ruc # ar ruc -ldbsutil -lcnutil -ltxnutil -ldbopr(對應other.mk來講) @$(SLINK) $(SLFLG) $@ $(OBJS) @$(RM) $(FEHOME)/mak/.mak.tmp #動態庫編譯過程:此次纔是真正的進行編譯操做 #OBJS 是從上層的makefile文件傳進來的 ***.o $(DLTARG): $(OBJS) $(ECHO) "Linking [$(DLTARG)] ..." #DLINK = ld DLFLGS= -G +連接庫? other.o 連接庫的路徑 -lm -lc 一些db須要的動態庫 #ld -G -ldbsutil -lcnutil -ltxnutil -ldbopr ****.o -L$(SYSLIBP) -L$(XLIBP) -L$(LIBP) $(DBLIBP) -L$(TUXLIBP) #-L$(XMLLIBP) -L$(LIBX) -lm -lc -lclntsh -lclient11 `cat $(ORACLE_HOME)/lib/sysliblist` @$(DLINK) -o $@ $(DLFLGS) $(OBJS) $(LIBPS) $(UXLIBS) $(DBLIBS) # @if [ $(OSTYPE) = aix ]; \ # then \ # $(DLINK) -o $@ $(DLFLGS) $(OBJS) $(LIBS) $(UXLIBS); \ # else \ # $(DLINK) -o `basename $@` $(DLFLGS) $(OBJS) $(LIBS); \ # $(MV) `basename $@` `dirname $@`; \ # fi @$(RM) $(FEHOME)/mak/.mak.tmp $(EXTARG): $(OBJS) @$(ECHO) "Linking [$(EXTARG)] ..." @$(CC) -o $@ $(EXFLGS) $(OBJS) $(LIBS) $(DBLIBS) @$(RM) $(FEHOME)/mak/.mak.tmp #TUXEDO服務編譯過程 #OBJS 是從上層的makefile文件傳進來的 ***.o $(TUXTARG): $(OBJS) $(ECHO) "buildserver [$(TUXTARG)] ..." @CFLAGS="$(EXFLGS)" \ $(TUXBS) -o $@ -f "$(OBJS)" $(TUXSVCS) -s "$(TUXSERVICE)" -f "$(LIBS)" $(TUXRSMN) # implicit .SUFFIXES: .SUFFIXES: .java .class .xc .ec .pc .sqC .sqc .cp .cpp .c .o .xc.o: $(ECHO) "Compiling [$@] ..." @$(RM) $*$(DBFIX) @$(CP) $*.xc $*$(DBFIX) @if [ $(DBTYPE) = ora ]; \ then \ $(PC) lines=yes define=$(DBD) include=$(TUXINCP) include=$(INCP) include=$(JINCP) include=$(JMDINCP) include=$(LIBX) include=`dirname $@` code=ANSI_C iname=$*$(DBFIX); \ $(CC) -o $@ `cat $(FEHOME)/mak/.mak.tmp` $(CCFLGS) -c $*.c; \ $(RM) $*.lis; \ else \ $(EC) -e -ED$(DBD) $(INCPS) $*$(DBFIX); \ $(CC) -o $@ `cat $(FEHOME)/mak/.mak.tmp` $(CCFLGS) -c `basename $*`.c; \ $(RM) `basename $*`.c; \ fi @$(RM) $*$(DBFIX) $*.c .pc.o: $(ECHO) "Compiling [$@] ..." @$(PC) char_map=string lines=yes define=$(DBD) include=$(TUXINCP) include=$(INCP) include=$(JINCP) include=$(XMLINCP) include=$(JMDINCP) include=`dirname $@` code=ANSI_C iname=`basename $*`$(DBFIX) @$(CD) `dirname $@` ; \ ${CC} -o $@ `cat $(FEHOME)/mak/.mak.tmp` $(CCFLGS) -c $*.c @$(RM) $*.lis $*.c .ec.o: $(ECHO) "Compiling [$@] ..." @$(EC) -e -ED$(DBD) $(INCPS) $*$(DBFIX) @$(CD) `dirname $@` ; \ $(CC) -o $@ `cat $(FEHOME)/mak/.mak.tmp` $(CCFLGS) -c `basename $*`.c; \ $(RM) `basename $*`.c .sqc.o: $(ECHO) "Compiling [$@] ..." @$(RM) $*.bnd @$(DB2) connect to $(DBNM) @DB2INCLUDE=$(INCP) \ $(DB2) prep $< bindfile @$(DB2) bind $*.bnd @$(DB2) connect reset @$(DB2) terminate @$(CD) `dirname $@` ; \ $(CC) -o $@ `cat $(FEHOME)/mak/.mak.tmp` $(CCFLGS) -c `basename $*`.c @$(RM) $*.bnd $*.c .sqC.o: $(ECHO) "Compiling [$@] ..." @$(RM) $*.bnd @$(DB2) connect to $(DBNM) @DB2INCLUDE=$(INCP) \ $(DB2) prep $< bindfile @$(DB2) bind $*.bnd @$(DB2) connect reset @$(DB2) terminate @$(CD) `dirname $@` ; \ $(CXX) -o $@ `cat $(FEHOME)/mak/.mak.tmp` $(CCFLGS) -c `basename $*`.C @$(RM) $*.bnd $*.C .cp.o: $(ECHO) "Compiling [$@] ..." $(CPRE) -y $(INCPS) -O $*.c $*.cp @$(CD) `dirname $@` ; \ $(CC) -o $@ `cat $(FEHOME)/mak/.mak.tmp` $(CCFLGS) -c `basename $*`.c @$(RM) $*.c .cpp.o: $(ECHO) "Compiling [$@] ..." @$(CD) `dirname $@` ; \ $(CXX) -o $@ `cat $(FEHOME)/mak/.mak.tmp` $(CXXFLGS) -c `basename $<` .c.o: $(ECHO) "Compiling [$@] ..." @$(CD) `dirname $@`; \ $(CC) -o $@ `cat $(FEHOME)/mak/.mak.tmp` $(CCFLGS) -c `basename $<` .java.class: $(ECHO) "Compiling [$@] ..." @$(CD) `dirname $@`; \ $(JAVAC) `basename $<` # clearing object codes clean: cleanup @$(RM) $(SLTARG) $(DLTARG) $(EXTARG) $(TUXTARG) cleanup: @$(RM) $(OBJS)