asterisk1.8 Makefile分析 (1)
為了觀查Makefile的輸出,可以對Makefile做如下修改。
1. 將PRINT_DIR和NOISY_BUILD這兩個變量置為yes。
2. 修改Makefile.rules,將ECHO_PREFIX和CMD_PREFIX的賦值都去掉。
3. 將以下關鍵目標的命令前@符號都去掉。
???? makeopts.embed_rules
???? $(MOD_SUBDIRS_EMBED_LDSCRIPT)
???? $(MOD_SUBDIRS_EMBED_LDFLAGS)
???? $(MOD_SUBDIRS_EMBED_LIBS)
???? $(MOD_SUBDIRS)
???? $(OTHER_SUBDIRS)
整個Makefile的第一個目標是? all,也是此Makefile的默認目標并且它是一個偽目標。
all: _all
從這句可以看到,all的依賴是_all,再看_all
_all: .lastclean? makeopts? $(SUBDIRS)? doc/core-en_US.xml
可以看到_all由多個目標組成,這也是Makefile多目標的常用寫法。
下面分別分析這些目標:
1. .lastclean不用管,解壓asterisk源碼包就有這個文件。
2. makeopts也不用管,在執行configure后會自動生成這個文件。這個目標可能是用來檢測configure文件的,但????? configure有錯或者不存在時會停止編譯。這句話在makefile里可以看到,如下
makeopts: configure
?? ?@echo "****"
?? ?@echo "**** The configure script must be executed before running '$(MAKE)'."
?? ?@echo "****?????????????? Please run \"./configure\"."
?? ?@echo "****"
?? ?@exit 1
3. $(SUBDIRS)
???? 將$(SUBDIRS)展開如下:
???? SUBDIRS:=$(OTHER_SUBDIRS) $(MOD_SUBDIRS)
???? MOD_SUBDIRS:=channels pbx apps codecs formats cdr cel bridges funcs tests main res addons
???? OTHER_SUBDIRS:=utils agi
???? 從上面那個名稱可以看出,這些都是asterisk的子目錄,應該是去分別執行這些字目錄下的makefile文件。
??? 在makefile里查詢這個目標的依賴如下:
??? $(SUBDIRS): main/version.c?? include/asterisk/version.h?? include/asterisk/build.h?? include/asterisk/buildopts.h defaults.h makeopts.embed_rules
??? 可以看到目錄$(SUBDIRS)由上面n個目標組成,以下分別分析:
?? 1)? main/version.c
? ? ? ? 查找makefile,這個目標由以下語句生成:
? ? ? ? ?main/version.c: FORCE .lastclean
?? ????????????????? @build_tools/make_version_c > $@.tmp
?? ????????????????? @cmp -s $@.tmp $@ || mv $@.tmp $@
?? ????????????????? @rm -f $@.tmp
?? 2)? include/asterisk/version.h
??????查找makefile,這個目標由以下語句生成:
??????? include/asterisk/version.h: FORCE .lastclean
?? ???????????????? @build_tools/make_version_h > $@.tmp
?? ???????????????? @cmp -s $@.tmp $@ || mv $@.tmp $@
?? ???????????????? @rm -f $@.tmp
?? 3) include/asterisk/build.h
??????????? 查找makefile,這個目標由以下語句生成:
?????? include/asterisk/build.h: .lastclean
?? ??????????????? @build_tools/make_build_h > $@
???? 4) include/asterisk/buildopts.h
?????????? 查找makefile,這個目標由以下語句生成:
????? include/asterisk/buildopts.h: menuselect.makeopts .lastclean
?? ?????????????? @build_tools/make_buildopts_h > $@.tmp
?? ?????????????? @cmp -s $@.tmp $@ || mv $@.tmp $@
?? ?????????????? @rm -f $@.tmp
?? 5) defaults.h
?????? ? 查找makefile,這個目標由以下語句生成:
?????? defaults.h: makeopts .lastclean
?? ?????????????? @build_tools/make_defaults_h > $@.tmp
?? ?????????????? @cmp -s $@.tmp $@ || mv $@.tmp $@
?? ?????????????? @rm -f $@.tmp
??? 6) makeopts.embed_rules
???????查找makefile,這個目標由以下語句生成:
????? makeopts.embed_rules: menuselect.makeopts
?? ?????????? @echo "Generating embedded module rules ..."
?? ?????????? @rm -f $@
?? ?????????? +@$(SUBMAKE) $(MOD_SUBDIRS_EMBED_LDSCRIPT)
?? ?????????? +@$(SUBMAKE) $(MOD_SUBDIRS_EMBED_LDFLAGS)
?? ?????????? +@$(SUBMAKE) $(MOD_SUBDIRS_EMBED_LIBS)
?????? 可以看出這個目標依賴于menuselect.makeopts
4) doc/core-en_US.xml
???? 這個目標看makefile里說明,是用于生成文檔的,應該沒什么用,不管他。
接下來我們主要分析menuselect.makeopts
總結
以上是生活随笔為你收集整理的asterisk1.8 Makefile分析 (1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黄金ETF和纸黄金哪个好?交易手续费对比
- 下一篇: OSG+VS2013+Win7 环境搭建