BCM VOIP 應用程序編譯分析

VOIP應用程序源碼分佈:

  1. Vodsl(VOIP應用程序) -- userspace/private/apps/vodsl  
  2.   |_bos(系統適配層)-- xChange/dslx_common/xchg_common  
  3.   |_endpoint(驅動適配層)-- userspace/private/apps/vodsl/endpoint  
  4.   |_voip(主程序)  
  5.   |_prov(配置、調試接口及sip程序main)--userspace/private/apps/vodsl/voip/prov  
  6.   |_pstn(FXO相關業務)--userspace/private/apps/vodsl/voip/pstn  
  7.   |_rtp(RTP相關處理)--userspace/private/apps/vodsl/voip/rtp  
  8.   |_util(輔助模塊,如防火牆控制、日誌等)--userspace/private/apps/vodsl/voip/util  
  9.   |_sip(sip協議產品目錄)--userspace/private/apps/vodsl/voip/sip  
  10.       |_codec(編碼列表相關)-- xChange/dslx_common/voice_res_gw/codec  
  11.       |_callctrl(MT5協議棧適配層)—  
  12. xChange/dslx_common/prot_callctrl/stacks/callctrl  
  13.       |_callmgr(呼叫管理模塊)-- xChange/dslx_common/prot_callctrl/apps/vrg  
  14.       |_sip_mx(MT5協議棧,無源碼,庫路徑爲)—  
  15. userspace/private/apps/vodsl/voip/sip/sip_mx/lib  


 

VOIP應用程序編譯分析:

一、根目錄Makefile

all: prebuild_checksall_postcheck1

 

all_postcheck1:  profile_saved_check sanity_check \

    create_install kernelbuild modbuild kernelbuildlite \

    userspace  gdbserver vodsl dectd hosttools buildimage

 

vodsl: sanity_check

         //這裏BUILD_VODSLprofile裏定義爲BUILD_VODSL=dynamic

         $(MAKE) -C $(BUILD_DIR)/userspace/private/apps/vodsl $(BUILD_VODSL)

 

二、userspace/private/apps/vodsl的Makefile

dynamic: $(PROGRAM_NAME) install dectfwucp

 

$(PROGRAM_NAME):subdirs $(OBJS)

         ……   //這裏依賴SUBDIRS各子目錄的.o目標文件生成vodsl主程序

 

OBJS = $(foreach obj,$(SUBDIRS),$(obj)/$(obj).o)

 

subdirs: $(patsubst %, _dir_%, $(SUBDIRS))

 

//這裏TGT爲空

//通過profilemake.voice結合,查到目前SUBDIRS包含endpoint  bos  voip

$(patsubst %, _dir_%, $(SUBDIRS)) :

         $(MAKE) -C $(patsubst _dir_%, %, $@) $(TGT)

 

三、userspace/private/apps/vodsl/endpoint的Makefile

endpoint.o: $(OBJS)

    ……    //生成endpoint.o

 

OBJS = endpoint_user.o endpoint_test.o

 

四、userspace/private/apps/vodsl/bos的Makefile

bos.o: $(BOSLIBS_SUBDIR)/*.o $(LIB) generic_private_lib_install

 

BOSLIBS_SUBDIR  = lib

$(BOSLIBS_SUBDIR)/*.o:

    //切換到xChange/dslx目錄

    cd $(XCHANGE_DIR)/dslx;

   

    //使用build腳本生成bos庫涉及到的.a靜態庫,build腳本下面單獨分析

    //通過查看  make.voice和profile,各環境變量如下:

    //XCHANGE_BUILD_APP = Bcm6828uni

    //XCHANGE_DSP_APP = all

    // XCHANGE_DSP_APP_EXTENSION = 空

    $(XCHANGE_DIR)/dslx/build -a $(XCHANGE_BUILD_APP)

-d $(XCHANGE_DSP_APP)$(XCHANGE_DSP_APP_EXTENSION)

-t bosu $(XCHANGE_BUILD_EXTRA_CFLAGS);

   

mkdir -p $(CURDIR)/$(BOSLIBS_SUBDIR)

 

//將上面build腳本生成的靜態庫複製到BOSLIBS_SUBDIR下面

for i   in  $(BOSLIBS); do  \

cp $(XCHANGE_DIR)/dslx/lib/LinuxUser/$(XCHANGE_BUILD_APP)/xchg/$$i.a$(CURDIR)/$(BOSLIBS_SUBDIR)/$$i.lib; \

done; \

 

//將BOSLIBS_SUBDIR下面的靜態庫全部解壓開

cd  $(CURDIR)/$(BOSLIBS_SUBDIR); \

for i   in  $(BOSLIBS); do  \

$(AR)   x $$i.lib;      \

done;

 

//將解壓後的.o文件重新鏈接成所需要的目標文件bos.o

$(LD) -G 0 -r $@ -o $(BOSTARGET);

 

build -a Bcm6828uni –d all –tbosu 分析

 

該腳本通過參數解析,最後主要執行如下動作,其中設置如下環境變量:

APPDIR = Bcm6828uni ;

DSPAPP = all

TARGET = bosu

CXC_OS_TYPE = LinuxUser

CXC_LINUX_ARCHITECTURE = MIPS

BOS_LIBS = bos sme str

 

//進入xChange/dslx/apps/Bcm6828uni目錄

cd ${CXC_PROJ_DIR}/dslx/apps/${APPDIR}

 

//執行該目錄下的Makefile,編譯目標爲xchg_common

make verbose=${VERBOSE} dspapp=${DSPAPP} xchg_common

 

xChange/dslx/apps/Bcm6828uni下Makefile分析

 

include cxcApp$(notdir $(CURDIR)).mk //僅僅引用當前目錄下的cxcAppBcm6828uni.mk

 

xChange/dslx/apps/Bcm6828uni下cxcAppBcm6828uni.mk分析

 

//定義DSP庫文件的目錄

 

//引用xChange/dslx/apps/rules/cxcAppRules.mk

include ../rules/cxcAppRules.mk

 

xChange/dslx/apps/rules下cxcAppRules.mk分析

 

//後面用到XCHG_MAKE_TARGETS環境變量

CXC_XCHG_TARGET_LIST :=assert bos containers sme str trace blog

export XCHG_MAKE_TARGETS   := $(CXC_XCHG_TARGET_LIST)

 

//這裏的XCHG_LIB_DIR環境變量比較重要,下面編譯生成的靜態庫就輸出在這裏

//上面引用的靜態庫也是從這裏引用的.

xc xchg_common:

    // XCHG_ROOT = xChange/dslx_common/xchg_common

$(MAKE) -C $(XCHG_ROOT) -f xchg_common.mk \

XCHG_LIB_DIR=$(CXC_BASE_LIB_DIR)/$(CXC_XCHG_OUTPUT_DIR)XCHG_OBJ_DIR=$(CXC_BASE_OBJ_DIR)/$(CXC_XCHG_OUTPUT_DIR)

 

xChange/dslx_common/xchg_common下xchg_common.mk分析

 

//這裏引用了$(XCHG_ROOT)/xchg_common_targets.mk,而xchg_common_targets.mk裏定義

//XCHG_ALL_TARGETS環境變量

include $(XCHG_ROOT)/xchg_common_env.mk

 

XCHG_VALID_TARGETS=$(XCHG_ALL_TARGETS) $(addprefix clean_,$(XCHG_ALL_TARGETS)) $(addprefix audit_,$(XCHG_ALL_TARGETS))

 

//這裏MAKECMDGOALS爲空,所以最終libTargets從XCHG_MAKE_TARGETS中取值

ifeq ($(strip $(filter $(MAKECMDGOALS),${XCHG_VALID_TARGETS})),)

libTargets := $(XCHG_MAKE_TARGETS)

else

xxx

endif

 

//這裏all的目標定義在xChange/dslx_common/xchg_common/rules/xChgRules.mk

all:

 

//引用BOS模塊編譯所需要的各子目錄下的Makefile,其中各子目錄下的Makefile定義了

//各自關鍵的XCHG_LIB_BASE  XCHG_SRC_FILES環境變量

XCHG_MODULE_MAKEFILES :=

$(foreach target,$(libTargets),$(XCHG_DIR_$(target))/$(target).mk)

include $(XCHG_MODULE_MAKEFILES)

 

include $(XCHG_ROOT)/rules/xChgRules.mk

//xChgRules.mk裏定義的all

all:target

 

//當前XCHG_MAKE_TARGETS環境變量值上從上面引用過來的,當前該值爲

//assert bos containers sme str trace blog

//這裏target的依賴規則都是從下面的XCHG_ARCHIVE_TEMPLATE功能宏中定義

target: $(XCHG_MAKE_TARGETS)

 

//調用功能宏XCHG_ARCHIVE_TEMPLATE,該功能宏定義在

//xChange/dslx_common/xchg_common/rules/xChgRules.mk中

//該功能宏的傳入參數依次爲assert bos containers sme str trace blog

$(foreach target,$(libTargets),$(eval $(callXCHG_ARCHIVE_TEMPLATE,$(target))))

 

xChange/dslx_common/xchg_common/rules/xChgRules.mk分析

 

define XCHG_ARCHIVE_TEMPLATE

 

//這裏不同模塊依賴的目標文件,都是從各模塊自身的源文件列表中編譯生成

XCHG_OBJ_FILES_$(1) := $(addprefix $(XCHG_OBJ_DIR)/, $(addsuffix $(XCHG_OBJ_EXT),$(basename $(XCHG_SRC_FILES_$(1)))))

XCHG_DEP_FILES_$(1) := $$(XCHG_OBJ_FILES_$(1):$(XCHG_OBJ_EXT)=.d)

XCHG_PREPROCESSED_FILES_$(1) := $(addsuffix .pp,$(basename $(XCHG_SRC_FILES_$(1))))

 

//該變量內容比較重要,最終生成的各個靜態庫目標文件就是存儲在這裏,這裏調用了

// XCHG_MAKE_LIB_NAME功能宏,該功能宏定義在

//xChange/dslx_common/xchg_common/rules/xChgEnv.mk中,

//注意這裏使用了XCHG_LIB_DIR,即上面在解壓靜態庫時的路徑

//在xChgEnv.mk中定義如下:

//XCHG_MAKE_LIB_NAME =

//$(foreach //libBase,$(1),$(XCHG_LIB_DIR)/$(XCHG_LIB_PREFIX)$(libBase)$(XCHG_LIB_EXT))

XCHG_LIB_NAME_$(1) := $(callXCHG_MAKE_LIB_NAME,$(1))

 

$(1) : XCHG_C_LOCAL_INCLUDE := $$(XCHG_C_LOCAL_INCLUDE_$(1))

$(1) : XCHG_C_LOCAL_DEFS := $$(XCHG_C_LOCAL_DEFS_$(1))

$$(XCHG_DEP_FILES_$(1)) : XCHG_C_LOCAL_INCLUDE := $$(XCHG_C_LOCAL_INCLUDE_$(1))

$$(XCHG_DEP_FILES_$(1)) : XCHG_C_LOCAL_DEFS := $$(XCHG_C_LOCAL_DEFS_$(1))

$$(XCHG_PREPROCESSED_FILES_$(1)) : XCHG_C_LOCAL_INCLUDE := $$(XCHG_C_LOCAL_INCLUDE_$(1))

$$(XCHG_PREPROCESSED_FILES_$(1)) : XCHG_C_LOCAL_DEFS := $$(XCHG_C_LOCAL_DEFS_$(1))

 

//這裏就是上面$(XCHG_MAKE_TARGETS)的所有依賴目標,分別根據各自的源文件,生成對

//應的靜態庫。

$(1) : $$(XCHG_LIB_NAME_$(1))

$$(XCHG_LIB_NAME_$(1)) : $$(XCHG_OBJ_FILES_$(1))

    $(ECHO) 'Creating Archive $$@'

    $(MKDIR) -p $$(@D)

    $(RM) -f $$@

    $(XCHG_ARCHIVE) $(XCHG_ARCHIVE_OPTS)$$@ $$^

    $(ECHO)

 

endef

 

五、userspace/private/apps/vodsl/voip的Makefile

//通過分析make.voice 和 profile,SUBDIRS環境變量的內容如下

SUBDIRS  =  rtp util pstn prov sip

 

OBJS = $(foreach obj,$(SUBDIRS),$(obj)/$(obj).o)

 

//能過各子目錄的.o文件生成voip.o

voip.o: subdirs $(OBJS)

    $(LD) $(EXTRA_LDFLAGS) -r -o $@ $(OBJS)

 

//進入到各子目錄進行編譯

$(patsubst %, _dir_%, $(SUBDIRS)) :

    $(MAKE) -C $(patsubst _dir_%, %, $@) $(TGT)

 

-----------------------------------------------------------------------------

1、userspace/private/apps/vodsl/voip/rtp的Makefile

OBJS = rtpapi.o rtcp.o udp.o

 

rtp.o: $(OBJS)

    $(LD) $(EXTRA_LDFLAGS) -r -o $@ $(OBJS)

 

2、userspace/private/apps/vodsl/voip/util的Makefile

//通過分析make.voice和profile,SUBDIRS環境變量的內容如下

SUBDIRS  = net regexp signal qos firewall map log vodslcmslock feature

OBJS = $(foreach obj,$(SUBDIRS),$(obj)/$(obj).o)

 

util.o: subdirs $(OBJS)

    $(LD) $(EXTRA_LDFLAGS) -r -o $@ $(OBJS)

 

//分別進入各子目錄進行編譯,不細分析。

$(patsubst %, _dir_%, $(SUBDIRS)) :

    $(MAKE) -C $(patsubst _dir_%, %, $@) $(TGT)

 

3、userspace/private/apps/vodsl/voip/pstn的Makefile

OBJS = ccMaps.o ccPstn.o

 

pstn.o: $(OBJS)

    $(LD) $(EXTRA_LDFLAGS) -r -o $@ $(OBJS)

 

4、userspace/private/apps/vodsl/voip/prov的Makefile

//通過分析make.voice和profile,OBJS變量內容如下:

OBJS = endptProv.o endptCmd.o endptProbe.o provisData.o sipCli.o

 

prov.o: $(OBJS)

    $(LD) $(EXTRA_LDFLAGS) -r -o $@ $(OBJS)

 

5、userspace/private/apps/vodsl/voip/sip的Makefile

//通過分析make.voice和profile,SUBDIRS變量內容如下:

SUBDIRS  = codec callctrl callmgr sip_mx

OBJS = $(foreach obj,$(SUBDIRS),$(obj)/$(obj).o)

 

sip.o: subdirs $(OBJS)

    $(LD) $(EXTRA_LDFLAGS) -r -o $@ $(OBJS)

 

//進入各子目錄進行編譯

$(patsubst %, _dir_%, $(SUBDIRS)) :

    $(MAKE) -C $(patsubst _dir_%, %, $@) $(TGT)

 

5.1、userspace/private/apps/vodsl/voip/sip/codec的Makefile

CODECTARGET = codec.o

CODECLIB_DIR  = $(XCHANGE_DIR)/dslx/lib/LinuxKernel/$(XCHANGE_BUILD_APP)/vrg

CODECLIB = codec.a

 

%: force

 

force:

    //使用xChange/dslx/build腳本構造codec模塊相關的靜態庫

    cd $(XCHANGE_DIR)/dslx;

    $(XCHANGE_DIR)/dslx/build -a $(XCHANGE_BUILD_APP)

-d $(XCHANGE_DSP_APP)$(XCHANGE_DSP_APP_EXTENSION) -tcodec $(EXTRA_CFLAGS);

 

//將build腳本構建好的靜態庫複製出來,並解壓,然後將解壓後的.o文件重新生成最

//終所需要的codec.o目標文件

    mkdir -p tmp

    cp -f $(CODECLIB_DIR)/$(CODECLIB) ./tmp/$(CODECTEMP_TARGET)

    cd tmp; $(AR) x $(CODECTEMP_TARGET)

   

    $(LD) $(EXTRA_LDFLAGS) -r -o $(CODECTARGET) tmp/*.o

 

----------------------------------------------------------------------------

build –t codec腳本分析

 

分析了build腳本,codec的編譯非應用層編譯,上面需要的靜態庫是由make modbuild生成

 

5.2、userspace/private/apps/vodsl/voip/sip/callctrl的Makefile

CCTARGET = callctrl.o

CCLIB_DIR  = $(XCHANGE_DIR)/dslx/lib/LinuxUser

CCLIB = libcallctrl.a

 

%: force

 

force:

    //使用xChange/dslx/build腳本構造callctrl模塊相關的靜態庫

    cd $(XCHANGE_DIR)/dslx; \

    $(XCHANGE_DIR)/dslx/build -a $(XCHANGE_BUILD_APP)

-d $(XCHANGE_DSP_APP)$(XCHANGE_DSP_APP_EXTENSION) -tsipcc $(EXTRA_CFLAGS);

 

//將build腳本構建好的靜態庫複製出來,並解壓,然後將解壓後的.o文件重新生成最

//終所需要的callctrl.o目標文件

    mkdir -p tmp

    cp -f $(CCLIB_DIR)/$(CCLIB) ./tmp/$(CCTEMP_TARGET)

    cd tmp;ar x $(CCTEMP_TARGET)

 

    $(LD) $(EXTRA_LDFLAGS) -r -o $(CCTARGET) tmp/*.o

 

----------------------------------------------------------------------------

build –t sipcc腳本分析

 

CXC_OS_TYPE=LinuxUser

CXC_LINUX_ARCHITECTURE=MIPS

 

//進入xChange/dslx/apps/Bcm6828uni目錄

cd ${CXC_PROJ_DIR}/dslx/apps/${APPDIR}

 

//執行該目錄下的Makefile,目標爲callctrl

make verbose=${VERBOSE} dspapp=${DSPAPP} callctrl

 

xChange/dslx/apps/Bcm6828uni下cxcAppBcm6828uni.mk分析

 

//定義DSP庫文件的目錄

 

//引用xChange/dslx/apps/rules/cxcAppRules.mk

include ../rules/cxcAppRules.mk

 

xChange/dslx/apps/rules下cxcAppRules.mk分析

 

//引用了cxcAppEnv.mk,這時定義了關鍵的 CXC_CABLEX_DIR := $(CXC_PROJ_DIR)/dslx

//環境變量,該環境變量最終和下面的XCHG_LIB_DIR合成靜態庫生成的路徑,該路徑與

//上面要引用的靜態庫路徑相同。

include $(CXC_PROJ_DIR)/dslx/apps/rules/cxcAppEnv.mk

 

callctrl:

    //進入xChange/dslx_common/prot_callctrl/build/vrg/dslx目錄下,執行

    // sip_cc.mk

    $(MAKE) -C $(CXC_SIP_CC_DIR)/build/vrg/dslx -f sip_cc.mk

 

xChange/dslx_common/prot_callctrl/build/vrg/dslx/sip_cc.mk分析

 

XCHG_LIB_BASE  := libcallctrl

XCHG_LIB_DIR = $(CXC_CABLEX_DIR)/lib/$(CXC_OS_TYPE)/

XCHG_OBJ_DIR = $(CXC_CABLEX_DIR)/obj/$(CXC_OS_TYPE)/callctrl

 

//比較重要,在下面調用xChgRules.mk時,xChgRules.mk會判斷該宏設置了才進行額外的//默認規則引用

XCHG_RECURSIVE_BUILD=1

 

//引用xChange/dslx_common/prot_callctrl/build/vrg/dslx/sources_sip_cc.mk

//主要定義了SRCDIR_SIP_CC SRCS_SIP_CC 兩個環境變量,包含callctrl的目錄及源

//文件

CALLCTRLLIB_ROOT    := $(CXC_SIP_CC_DIR)

include $(CALLCTRLLIB_ROOT)/build/vrg/dslx/sources_sip_cc.mk

 

export CALLCTRL_SRC = $(SRCS_SIP_CC)

//這裏可以看到callctrl模塊的源碼主要集中在

//xChange\dslx_common\prot_callctrl\stacks\callctrl目錄中

CALLCTRL_SRCDIR = $(addprefix $(CALLCTRLLIB_ROOT)/stacks/callctrl/, $(SRCDIR_SIP_CC))

 

XCHG_SRC_FILES := $(CALLCTRL_SRC)

vpath %.c $(CALLCTRL_SRCDIR)

 

//引用xChange/dslx_common/xchg_common/rules/xChgRules.mk

include $(XCHG_RULES_DIR)/xChgRules.mk

 

xChange/dslx_common/xchg_common/rules/xChgRules.mk分析

 

all: target

 

XCHG_OBJ_FILES = $(addprefix $(XCHG_OBJ_DIR)/,

$(addsuffix $(XCHG_OBJ_EXT),$(basename $(XCHG_SRC_FILES))))

 

//上面已經賦值,纔會進行此分支,額外增加引用規則

ifneq ($(XCHG_LIB_BASE),)

ifeq ($(XCHG_RECURSIVE_BUILD),1)

 

//這裏調用了XCHG_MAKE_LIB_NAME功能宏,該功能宏定義在

//xChange/dslx_common/xchg_common/rules/xChgEnv.mk中,最終將引用

//XCHG_LIB_DIR環境變量組成生成靜態庫輸出的目錄,這個目錄也是最上面

//引用靜態庫的地方。

XCHG_LIB_NAME  := $(callXCHG_MAKE_LIB_NAME,$(XCHG_LIB_BASE))

 

lib: $(XCHG_LIB_NAME)

target: lib

 

//生成最終的靜態庫目標

$(XCHG_LIB_NAME) : $(XCHG_OBJ_FILES)

    $(ECHO) 'Creating Archive $@'

    @$(MKDIR) -p $(@D)

    $(RM) -f $@

    $(XCHG_ARCHIVE) $(XCHG_ARCHIVE_OPTS)$@ $^

 

endif

endif

 

5.3、userspace/private/apps/vodsl/voip/sip/callmgr的Makefile

CALLMGRTARGET = callmgr.o

CALLMGRLIB_DIR  = $(XCHANGE_DIR)/dslx/lib/LinuxUser

CALLMGRLIB = libcallmgr.a

 

%: force

 

force:

    //使用xChange/dslx/build腳本構造sipcmgrcctrl模塊相關的靜態庫

    cd $(XCHANGE_DIR)/dslx;                 \

    $(XCHANGE_DIR)/dslx/build -a $(XCHANGE_BUILD_APP)

-d $(XCHANGE_DSP_APP)$(XCHANGE_DSP_APP_EXTENSION)

-t sipcmgrcctrl $(EXTRA_BUILD_FLAGS) -D IP_SIP -D $(SIP_ALG_BUILD_FLAGS);

   

//將build腳本構建好的靜態庫複製出來,並解壓,然後將解壓後的.o文件重新生成最

//終所需要的callmgr.o目標文件

    mkdir -p tmp

    cp -f $(CALLMGRLIB_DIR)/$(CALLMGRLIB) ./tmp/$(CALLMGRTEMP_TARGET)

    cd tmp; $(AR) x $(CALLMGRTEMP_TARGET)

    $(LD) $(EXTRA_LDFLAGS) -r -o $(CALLMGRTARGET) tmp/*.o

 

-----------------------------------------------------------------------------

build –t sipcmgrcctrl腳本分析

 

CXC_OS_TYPE=LinuxUser

CXC_LINUX_ARCHITECTURE=MIPS

 

//進入xChange/dslx/apps/Bcm6828uni目錄,執行該目錄下的Makefile,目標爲callmgr

cd ${CXC_PROJ_DIR}/dslx/apps/${APPDIR}

make verbose=${VERBOSE} dspapp=${DSPAPP} callmgr

 

------------------------------------------------------------------------------

xChange/dslx/apps/Bcm6828uni下cxcAppBcm6828uni.mk分析

 

//定義DSP庫文件的目錄

 

//引用xChange/dslx/apps/rules/cxcAppRules.mk

include ../rules/cxcAppRules.mk

 

xChange/dslx/apps/rules下cxcAppRules.mk分析

 

//進入xChange/dslx_common/prot_callctrl/build/vrg/dslx目錄下,執行sip_cmgr.mk

callmgr:

    $(MAKE) -C $(CXC_SIP_CMGR_DIR)/build/vrg/dslx -f sip_cmgr.mk

 

xChange/dslx_common/prot_callctrl/build/vrg/dslx/sip_cmgr.mk分析

 

XCHG_LIB_BASE  := libcallmgr

XCHG_LIB_DIR = $(CXC_CABLEX_DIR)/lib/$(CXC_OS_TYPE)/

XCHG_OBJ_DIR = $(CXC_CABLEX_DIR)/obj/$(CXC_OS_TYPE)/callmgr

 

//比較重要,在下面調用xChgRules.mk時,xChgRules.mk會判斷該宏設置了才進行額外的//默認規則引用

XCHG_RECURSIVE_BUILD=1

 

//引用xChange/dslx_common/prot_callctrl/build/vrg/dslx/ sources_sip_cmgr.mk

//主要定義了SRCDIR_SIP_CMGR SRCS_SIP_CMGR 兩個環境變量,包含callmgr的目錄及源

//文件

include $(CALLMGRLIB_ROOT)/build/vrg/dslx/sources_sip_cmgr.mk

 

export CALLMGR_SRC = $(SRCS_SIP_CMGR)

export CALLMGR_SRCDIR = $(addprefix $(CALLMGRLIB_ROOT)/apps/vrg/, $(SRCDIR_SIP_CMGR))

 

XCHG_SRC_FILES := $(CALLMGR_SRC)

vpath %.c $(CALLMGR_SRCDIR)

 

//引用xChange/dslx_common/xchg_common/rules/xChgRules.mk

include $(XCHG_RULES_DIR)/xChgRules.mk

 

-----------------------------------------------------------------------------

xChange/dslx_common/xchg_common/rules/xChgRules.mk分析

 

all: target

 

XCHG_OBJ_FILES = $(addprefix $(XCHG_OBJ_DIR)/, $(addsuffix $(XCHG_OBJ_EXT),$(basename $(XCHG_SRC_FILES))))

 

//上面已經賦值,纔會進行此分支,額外增加引用規則

ifneq ($(XCHG_LIB_BASE),)

ifeq ($(XCHG_RECURSIVE_BUILD),1)

 

//這裏調用了XCHG_MAKE_LIB_NAME功能宏,該功能宏定義在

// xChange/dslx_common/xchg_common/rules/xChgEnv.mk中,最終將引用

// XCHG_LIB_DIR環境變量組成生成靜態庫輸出的目錄,這個目錄也是最上面

//引用靜態庫的地方。

XCHG_LIB_NAME  := $(callXCHG_MAKE_LIB_NAME,$(XCHG_LIB_BASE))

 

lib: $(XCHG_LIB_NAME)

target: lib

 

//生成最終的靜態庫目標

$(XCHG_LIB_NAME) : $(XCHG_OBJ_FILES)

    $(ECHO) 'Creating Archive $@'

    @$(MKDIR) -p $(@D)

    $(RM) -f $@

    $(XCHG_ARCHIVE) $(XCHG_ARCHIVE_OPTS)$@ $^

 

endif

endif

 

5.4、userspace/private/apps/vodsl/voip/sip/sip_mx的Makefile

SIPTARGET = sip_mx.o

SIPSRC_DIR = $(XCHANGE_DIR)/dslx_common/prot_callctrl/stacks/sip_mx

SIPLIB = libsip_mx.a

 

%: force

 

force:

    //查找是否含有協議棧源碼文件,當前項目沒有MT5協議棧原碼,所以不進此分支

    @rm -f $(TMPFILE);

    @find $(SIPSRC_DIR) -name '*.cpp' > $(TMPFILE)

    @if [ -s $(TMPFILE) ];then

        ……

    fi

   

    //直接複製方案商提供的靜態庫

    //CURDIR = userspace/private/apps/vodsl/voip/sip/sip_mx

    cp -f $(CURDIR)/lib/$(SIPLIB) $(CURDIR)/$(SIPTARGET)


轉自:http://blog.csdn.net/liujianfeng1984/article/details/16994603

發佈了9 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章