VOIP應用程序源碼分佈:
- Vodsl(VOIP應用程序) -- userspace/private/apps/vodsl
- |_bos(系統適配層)-- xChange/dslx_common/xchg_common
- |_endpoint(驅動適配層)-- userspace/private/apps/vodsl/endpoint
- |_voip(主程序)
- |_prov(配置、調試接口及sip程序main)--userspace/private/apps/vodsl/voip/prov
- |_pstn(FXO相關業務)--userspace/private/apps/vodsl/voip/pstn
- |_rtp(RTP相關處理)--userspace/private/apps/vodsl/voip/rtp
- |_util(輔助模塊,如防火牆控制、日誌等)--userspace/private/apps/vodsl/voip/util
- |_sip(sip協議產品目錄)--userspace/private/apps/vodsl/voip/sip
- |_codec(編碼列表相關)-- xChange/dslx_common/voice_res_gw/codec
- |_callctrl(MT5協議棧適配層)—
- xChange/dslx_common/prot_callctrl/stacks/callctrl
- |_callmgr(呼叫管理模塊)-- xChange/dslx_common/prot_callctrl/apps/vrg
- |_sip_mx(MT5協議棧,無源碼,庫路徑爲)—
- 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_VODSL在profile裏定義爲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爲空
//通過profile及make.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