configure原理

2019-03-02 23:43|来源: 网路

一、必要性

作为源代码发行的软件,希望在尽可能多的环境上可以运行,这些环境包括了操作系统的类型,硬件系统、开发环境的不同的方面;另一方面,在Linux系统中没有一种统一的位置可以确定系统中是否支持某种功能,例如:无 法确认这个系统是否安装了gcc工具,它的位置在哪里,该操作系统是否支持mmap功能、甚至是环境是大端字节序还是小端字节序等属性,所以需要通过执行 configure来动态的尝试确定源代码构建和运行环境需要的属性情况。最重要的目的是替换Makefile中的指定变量

二、各种配置文件说明

configure.ac 该文件为autoconfigure文件使用的一个文件,该文件用来生成configure文件,这个文件一般是开发者维护,我们安装该软件的时候只需要执行configure就可以,这个configure.ac我们一般不用理会

configure 这个是我们需要监测环境的主要入口文件,使用该文件可以生成Makefile文件,它会替换Makefile中需要替换的变量。

config.guess 这个是在构建环境上运行的一个脚本,它用来猜测构建机的配置环境,因为这个脚本是在构建机上运行,所以它可以动态执行uname等命令来获得构建机的环境,所以我们一般不要指定这个变量,从而让脚本自动获得。

config.sub 这个是将host target build变量正则化的一个脚本,它的sub就是substitute的缩写。因为用户提供的build可能并不符合脚本正规的四元组或者三元组的结构,所以这个脚本将它转换为标准的格式,从而可以进行格式化处理。

config.log   该文件在执行configure文件时动态生成,其中包含了一些行号信息,表示一个文件在哪一行执行,以及执行的什么命令,从而可以知道测试是在哪个位置中完成的。

congfigure.status  这是一个脚本文件,该脚本可以执行,运行该脚本可以生成一个当前相同的配置,从而避免再次执行configure这个比较庞大的代码。也就是config.log生成的是文本文件,而config.status生成的则是命令脚本文件。

config.cache 这个同样是一个动态生成的脚本,用来加快配置速度,如果一个配置选项在之前已经测试过,这个值会保存在这个文件中,当再次执行configure的时候会首先从这个脚本中读取缓存的配置文件,并在输出中显示cached,从而表示是一个缓冲输出

三、主要功能实现

1、config.sub

它主要是将配置环境转换为三元组或者四元组。其核心代码为

# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
# Here we must recognize all the valid KERNEL-OS combinations.
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
case $maybe_os in
  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
  knetbsd*-gnu* | netbsd*-gnu* | \
  kopensolaris*-gnu* | \
  storm-chaos* | os2-emx* | rtmk-nova*)
    os=-$maybe_os所有最后两项是 KERNEL-OS类型的配置输出落入该分支。例如powerpc-linux-gnu,其它的执行下面的一个分支
    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
    ;;
  *)
    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
    if [ $basic_machine != $1 ]
    then os=`echo $1 | sed 's/.*-/-/'`最后一个-为OS类型,之前的所有均为机器类型。例如powerpc-linux,powerpc-IBM-linux
    else os=; fi
    ;;
esac

2、configure中对环境的替换

ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
  as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
$as_echo "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error "invalid value of canonical build" "$LINENO" 5;;
esac
build=$ac_cv_build
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_build
shift
build_cpu=$1
build_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
build_os=$*

这些变量一般是底层的Makefile需要替换的变量,并根据这些变量定义一些宏值,或者执行一些特殊配置。

3、cache文件的使用和处理

可以通过命令行中 --cache-file=来进行设置

  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
    cache_file=$ac_optarg ;;

…………

if test -r "$cache_file"; then
  # Some versions of bash will fail to source /dev/null (special
  # files actually), so we avoid doing that.
  if test -f "$cache_file"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
$as_echo "$as_me: loading cache $cache_file" >&6;}
    case $cache_file in
      [\\/]* | ?:[\\/]* ) . "$cache_file";;
      *)                      . "./$cache_file";; 执行cache文件
    esac
  fi
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
$as_echo "$as_me: creating cache $cache_file" >&6;}
  >$cache_file
fi

其中cache文件中变量的值统一以 ac_av_前缀开始,这个约定大家要注意一下,其中分别代表AutoConfigure AutoValue

4、config.status

从configure可以看出,在该文件的最后,很多的代码都是用来项这个文件添加内容的,所以也就是说这个文件的内容是M4动态生成的,我们知道的作用就好了,该文件通过CONFIG_STATUS 变量进行引用。从使用上看,我们也可以定义同名的宏覆盖这个文件名。

5、config.log的使用

cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.

It was created by $as_me, which was
generated by GNU Autoconf 2.64.  Invocation command line was

  $ $0 $@

_ACEOF
exec 5>>config.log

直接把文件的第五项文件描述符定向到config.log,从而之后所有项5号文件描述符输出的内容都将会放在config.log文件中。

6、其它使用的一些命令

sed 的 t 命令,这个在configure的最后有使用。根据说明文档,它的作用是前面的一个sed的substitute命令如果成功的话,就跳转到t后面的标 签,这个主要是为了进行递归处理,如果一个变量替换之后还需要替换,那么就可以使用这个命令。它常用在匹配的环境中,例如() @@等。这个可以认为是最为原始的一个条件跳转,configure中使用的是 t  t ,其中 t也是一个label的位置

b 命令这个是一个无条件跳转,一般在一个匹配条件之后或者一个无条件跳转,如果不指定label,则跳转到文件结束。

; 这个是为了支持一行可以有多个sed命令而设置的命令,就像cmd中的&和bash中的;一样。

expr 命令,这 个是Linux下的一个标准命令,它可以进行简单的算数运算,重要的是它还可以进行字符串的匹配运算,这一点是通常的算数表达式不具备的特征。在bash 的源代码中哟一个expr.c,但是注意这个不是一个bash的内置命令,它只是给bash的eval调用的一个工具文件


转自:http://www.cnblogs.com/pysery/archive/2012/06/17/2552680

相关问答

更多
  • 这两门都是计算机专业非常底层的学科 计算机原理是将计算机内部的工作原理,比如二进制的加减乘除、内部通信机制等等,这些对以后的编程学习作用不是很大,但是当你编程过程中,因为某些个十六进制、二进制、数据类型等引起程序无法运行时,你就会明白,平时极少用到的绣花针,在关键时刻,是非常的有用的。 编译原理是讲述机器是如何将高级程序语言转换成机器唯一能懂的机器语言的,以及编译软件是如何工作的。掌握了这些,就好像掌握了武功心法一样,即便所有的编程语言虽然各有各的特点,千变万化,但是万变不离其中,编译原理还是那一套,你掌握 ...
  • 编译原理方面比较好的书有三本,分别是龙书、虎书、鲸书, 这三本书是编译原理方面很权威的三本书,以动物命名是因为他们三本的封面上分别印了这三种动物。 这三本书的全名如下: 1.龙书(Dragon book) 书名是Compilers: Principles,Techniques,and Tools 2.鲸书(Whale book) 书名是:Advanced Compiler Design and Implementation 3.虎书(Tiger book) 书名是:Modern Compiler Imple ...
  • 【水翼船工作原理】   在流体中,流速越大的位置,压强越小。当船在水中高速航行时,水翼船的水翼上表面凸起,他与船体间的水流速度大,压强小。下表面的水流速度小,压强大。因此在水翼的上、下表面存在向上的压力(压强)差,上方压强小于下方压强,产生一个合压强,使其产生一个向上的合力。所以船体被抬高了。从而大大减少水的阻力增加了航行速度。 【水翼船】   水翼船(Hydrofoil)是一种高速船。船身底部有支架,装上水翼。当船的速度逐渐增加,水翼提供的浮力会把船身抬离水面(称为水翼飞航或水翼航行, Foilborne ...
  • 、UPS及其工作原理简介 UPS是英文Uninterruptible Power Supply的缩写,意为“不间断供电电源”,是一种含有储能装置(常见的是蓄电池),以逆变器为主要组成部分的恒压恒频的不间断电源,它可以解决现有电力的断电、低电压、高电压、突波、杂讯等现象,使计算机系统运行更加安全可靠。现在已经被广泛应用计算机、交通、银行、证券、通信、医疗、工业控制等行业,并且正在迅速地走入家庭。 下面,让我们先简单地了解一下UPS的工作原理。 当我们没有使用UPS的时候,PC机、打印机等终端设备 ...
  • 操作系统原理[2022-06-23]

    操作系统理论研究者有时把操作系统分成四大部分:   驱动程序- 最底层的、直接控制和监视各类硬件的部分,它们的职责是隐藏硬件的具体细节,并向其他部分提供一个抽象的、通用的接口。   内核- 操作系统之最内核部分,通常运行在最高特权级,负责提供基础性、结构性的功能。   支承库- (亦作“接口库”)是一系列特殊的程序库,它们指责在于把系统所提供的基本服务包装成应用程序所能够使用的编程接口(API),是最靠近应用程序的部分。例如,GNU C运行期库就属于此类,它把各种操作系统的内部编程接口包装成ANSI C和P ...
  • ipMonitor是一个成熟的网络监视解决方案,允许网络管理者、web站点管理者以及Internet服务提供者监视Internet、企业局域网、TCP/IP LAN上的设备,一旦出现问题,可以通过声音报警、发送消息、e-mail或者第三方的软件收到警告。这是一款功能强大的个人监视产品,花费费用少、操作简单、覆盖范围广。 IpMonitor可以运行在多种Windows操作系统上(XP,2000和2003),它监视的元素包括网络设备、应用、数据库和服务器等。 它能够识别并监视Windows服务器(NT,XP,2 ...
  • 雷达原理详解[2022-12-30]

    雷达(radar)原是“无线电探测与定位”的英文缩写。雷达的基本任务是探测感兴趣的目标,测定有关目标的距离、方问、速度等状态参数。雷达主要由天线、发射机、接收机(包括信号处理机)和显示器等部分组成。   雷达发射机产生足够的电磁能量,经过收发转换开关传送给天线。天线将这些电磁能量辐射至大气中,集中在某一个很窄的方向上形成波束,向前传播。电磁波遇到波束内的目标后,将沿着各个方向产生反射,其中的一部分电磁能量反射回雷达的方向,被雷达天线获取。天线获取的能量经过收发转换开关送到接收机,形成雷达的回波信号。由于在传 ...
  • 《C#高级编程》系列不错,里面有介绍.NET程序的编译原理。当然,也涉及了一些Java、C++、VB等的编译原理,并对它们作了比较,揭示了它们的优缺点。
  • 不一样! 人存原理   是霍金在书中提到了“人存原理”这个概念,其释义为:我们看到的宇宙之所以是这个样子, 那是因为我们的存在。科学工作的一切活动如果脱离了人的存在,就不会有任何意义可言。 人存原理告诉我们,我们对宇宙的认识和描述,都带有我们人类特有的认识能力。我们之所以看到宇宙是这个样子。是因为它如果不是这样的话,我们就不会在这里去观察它。   粗略的讲,人存原理是讲,我们看到的宇宙是这种样子,至少在部分上是因为我们的存在。从整体外观上看,刚好和完全可预见的统一理论的梦想正相反。在同一理论中自然定律是完备 ...
  • http://www.525web.com.cn/knowledge/baidu-promotion-138.htm http://www.ilib.cn/Periodical.Articles/jsjgcyyy/2002/11/jsjgcyyy200211038.html http://www.yko2.com/ecms/article/net/2006-08-04/10.html http://hmingo.bokee.com/