您的位置:首页 > 其它

asterisk1.8 Makefile分析 (1)

2014-02-27 16:25 417 查看
为了观查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文件。

下面我们先看看$(SUBDIRS)的依赖目标

在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: