[hellogcc] Re: [hellogcc] Re: 初稿:gcc configure.ac的注解

  • From: Mingjie Xing <mingjie.xing@xxxxxxxxx>
  • To: hellogcc@xxxxxxxxxxxxx
  • Date: Fri, 17 Aug 2012 15:14:38 +0800

在 2012年8月10日 下午4:25,Yao Qi <qiyaoltc@xxxxxxxxx> 写道:
> 这样怎么往blog上写呀?
>
> 能不能把configure.ac 的片段一起copy进来,这样参照着看,会清楚一些。
>
>
> --
> Yao Qi <qiyaoltc AT gmail DOT com>

恩,我回头把代码贴出来。更新了下内容和形式:

GCC使用configure.ac(通过autoconf)来生成configure文件。顶层目录下的configure.ac有三千多行,用来在配置阶段做各种测试检测,并将结果替换到Makefile.in中,生成最终的Makefile。本文简单介绍了configure.ac中所要做的事请,并没有覆盖所有的细节问题。

1、导出原始的configure参数

这部分代码位于38-64行,用来将configure的参数保存到变量TOPLEVEL_CONFIGURE_ARGUMENTS中,以供子目录的configure使用。

2、一些基本的测试

从66到108行,测试build,host,target系统(这些命令在acx.m4中定义),测试install,ln,sed,awk。

3、确定哪些库和工具将被配置

这部分代码位于112-2036行,这部分代码主要是为了确定哪些库和工具将被配置。首先,定义变量build_libs,
build_tools, host_libs, host_tools,
target_libraries(这里没有使用target_libs,是因为target_libs变量在config-lang.in中已经被定义使用了,参见http://gcc.gnu.org/ml/gcc-patches/2003-06/msg02977.html);,
target_tools,用来列出所有可能需要的库和工具。

然后,定义变量configdirs, target_configdirs,
build_configdirs,用来列出这些库和工具所对应的将要进行配置的源码目录。

然后,定义变量skipdirs和noconfigdirs,用来列出哪些目录将被跳过,或者不进行配置。其中skipdirs中的目录将被隐式的跳过,而noconfigdirs中的目录将会在终端显式的打印出消息,告知这些目录将不被配置。

接下来,就是根据configure的各种选项,来设置skipdirs和noconfigdirs的值。

最后,从configdirs, target_configdirs,
build_configdirs中,移除在skipdirs和noconfigdirs中存在的目录项。并且,移除那些无法进行配置(没有configure文件)的目录。

4、测试flags,复制目录

从2046到2206行,这部分代码设定了CFLAGS_FOR_TARGET,CXXFLAGS_FOR_TARGET,LDFLAGS_FOR_TARGET;并且对选项--with-headers=XXX,--with-libs=XXX做了处理,分别将目录下的内容复制到$(tooldir)/sys-include和$(tooldir)/lib下。

5、设定Makefile片段(frag)

这部分代码位于1074-1107,2226-2280,2871-2882行,用来设定host_makefile_frag,target_makefile_frag,alphaieee_frag,ospace_frag这些makefile片段的值。

6、gdb相关

代码2287-2301行,用来创建.gdbinit文件,方便调试gcc。代码2352-2378行,用来确定gdb是否需要tk/tcl。这里作者提到一个他认为可以进行改进,但又不太确定的地方。

7、去掉Makefile中不需要的目标(target)

这部分代码位于2382-2392,2445-2497,3199-3207行,用来删除掉Makefile(或者Makefile.in)中不需要的目标。Makefile.in文件中有许多@if和@endif包裹的模块。configure.ac中定义了变量extrasub_build,extrasub_host,extrasub_target,它们是根>据build_configdirs,configdirs,target_configdirs的内容而定义的sed语句。

在最后的AC_CONFIG_FILES命令中,将会调用这些sed语句,修改Makefile,对@if语句块进行选择性的删除。

8、设定BUILD_CONFIG变量,以调整顶层makefile

这部分代码位于2401-2443行,根据是否选择了bootstrap,来设定BUILD_CONFIG变量的值。Makefile中会根据该变量的值将config子目录下相应的mk文件包含进来。

9、串行化configure

这部分代码位于2499-2547行,用来实现对串行化configure的支持。

10、对自举(bootstrap)的支持

这部分代码位于3118-3197行,用来设定不同阶段的命令行选项(比如stage1_cflags),指定哪些文件在自举过程中不需要进行比较操作。

祝好
邢明杰

Other related posts:

  • » [hellogcc] Re: [hellogcc] Re: 初稿:gcc configure.ac的注解 - Mingjie Xing