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