为了观查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