MakeFile 學習

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)
相關文章
相關標籤/搜索