获取规范的系统类型 下列的宏使得configure脚本可以获得系统类型它们运行shell脚本configguess以确定用户在命令行中没有给出的它们需要的关于主机目标和创建类型的所有值它们运行configsub对用户给出的任何别名进行规范化如果你使用这些宏你必须把这两个shell脚本与你的源代码一同发布关于 AC_CONFIG_AUX_DIR的信息你可以通过该宏设置configure查找这些脚本的目录请参见 创建输出文件如果你没有使用这些宏中的任意一个configure 就忽略任何传递给它的`host`target和`build选项 宏 AC_CANONICAL_SYSTEM 检测系统类型并把输出变量设置成规范的系统类型关于该宏设置变量的细节参见系统类型变量 宏 AC_CANONICAL_HOST 只执行AC_CANONICAL_SYSTEM中关于主机类型功能的子集对于不是编译工具链(compiler toolchain)一部分的程序这就是所需要的全部功能 宏 AC_VALIDATE_CACHED_SYSTEM_TUPLE (cmd) 如果缓存文件与当前主机目标和创建系统类型不一致就执行cmd或者打印一个缺省的错误消息 系统类型变量 在调用了AC_CANONICAL_SYSTEM之后下列输出变量包含了系统类型信息在调用了AC_CANONICAL_HOST 之后只设置了下列host变量 buildhosttarget 规范系统名称 build_aliashost_aliastarget_alias 如果使用了configguess就是用户指定的名称或者规范名称 build_cpubuild_vendorbuild_os host_cpuhost_vendorhost_os target_cputarget_vendortarget_os 为方便而提供的规范名称的独立部分 使用系统类型 你将如何使用规范的系统类型?通常你在`configurein中的一个或多个case语句中使用它来选择系统特定的C文件而后把那些使用基于系统名的文件名的文件连接到诸如`hosth或`targetc的普通的文件上case语句模型允许使用shell通配符对多种情况进行编组就像下面的片断 case $target in i*mach* | i*gnu*) obj_format=aout emulation=mach bfd_gas=yes ;; i*bout) obj_format=bout ;; esac 宏 AC_LINK_FILES (sourcedest) 使得AC_OUTPUT把每个存在文件的source连接到对应连接名dest如果可能创建一个符号连接否则就创建硬连接dest和source应该是相对于顶层源代码目录或者创建目录的相对路径可以多次调用本宏 例如下列调用 AC_LINK_FILES(config/${machine}h config/${obj_format}hhosth objecth) 在当前目录中创建`hosth它是一个到`srcdir/config/${machine}h的连接并且创建`objecth它是一个到`srcdir/config/${obj_format}h的连接 你还可以使用主机系统类型以寻找交叉编译工具关于完成该任务的宏AC_CHECK_TOOL的信息参见对普通程序和文件的检查 站点配置 configure脚本支持几种本地配置决策方式它们是用户指明外部软件的位置包括或除去可选的特征以修改过的名称安装的程序以及为configure选项设置缺省值的手段 与外部软件一起工作 有些软件包需要或者可选地使用其它已经安装的软件包用户可以把命令行选项传递给configure 以指明使用那个外部软件选项采用下列形式之一 withpackage[=arg] withoutpackage 例如`withgnuld的意思是使用GNU连接器而不是任何其它连接器`withx的意思是使用X Window系统 用户可以给出包名加`=加参数的命令行参数`no是关于包的缺省参数它表示不使用包既不是`yes又不是`no的参数将包含其它包的名字或者版本号以便更精确地指定本程序可以与之协同工作的包如果没有给出参数`withoutpackage的缺省参数为`yes `withoutpackage等价于`withpackage=no configure脚本并不对它们不支持的`withpackage选项发出警告本特征允许顶层目录中的configure脚本配置一个包含多个包的源代码树在包支持不同的选项的时候不会因为给出了只有一部分包支持的选项而导致不必要的错误消息一个不幸的副作用是选项的拼写错误就不能被检查出来了迄今为止还没有处理该问题的更好办法 对于每个可能使用的外部软件包`configurein都应该调用AC_ARG_WITH以检测 configure的用户是否要求使用它确定在缺省状态下是使用还是不使用每个包以及那个参数是合法的是你的任务 宏 AC_ARG_WITH (packagehelpstring [actionifgiven [actionifnotgiven]]) 如果用户以选项`withpackage或者`withoutpackage调用 configure就运行shell命令actionifgiven如果两个选项都没有给出就运行shell命令 actionifnotgiven名字package给出了本程序应该与之协同工作的其它软件包它应该仅仅由字母数字和破折号(dashes)组成 shell命令actionifgiven可以通过shell变量withval得到选项的参数该变量的值实际上就是把 shell变量with_package的值中的所有`字符替换为`_而得的如果你愿意可以使用变量with_package 参数helpstring是对选项的描述它看起来应该像 withreadlinesupport fancy command line editing 如果需要给出更多的细节helpstring可能多于一行只要确保`configure help中的列的排列就可以了不要在求助字符串中使用tab你将需要用`[和`]包围它以生成前导空格 宏 AC_WITH (packageactionifgiven [actionifnotgiven]) 这是不支持求助字符串的AC_ARG_WITH的过时版本 选择包选项 如果软件包含有可选的编译时(compiletime)特征用户就可以在调用configure时使用命令行选项来指明是否编译它们选项采用如下形式之一 enablefeature[=arg] disablefeature 这些选项允许用户选择可选的选项进行创建和安装`enablefeature选项永远不要使特征的行为变得不同或者导致一个特征代替另一个特征它们只应该导致程序的一部分被创建而另一部分不创建 用户可以通过在特征名之后添加`=和参数来给出参数给出参数`no表示 不能使用该特征一个带有参数的特征看起来就像`enabledebug=stabs如果没有给出参数它的缺省值就是`yes`disablefeature等价于 `enablefeature=no configure脚本并不对它们所不支持的`enablefeature选项发出警告本特征允许顶层目录中的configure脚本配置一个包含多个包的源代码树在包支持不同的选项的时候不会因为给出了只有一部分包支持的选项而导致不必要的错误消息一个不幸的副作用是选项的拼写错误就不能被检查出来了迄今为止还没有处理该问题的更好办法 对于每个可选的特征`configurein都应该调用AC_ARG_ENABLE以检测configure 的用户是否要求把该特征包含进来确定在缺省情况下每个特征是否被包含进来以及那些选项是合法的是你的任务 宏 AC_ARG_ENABLE (featurehelpstring [actionifgiven [actionifnotgiven]]) 如果用户以选项`enablefeature或者`disablefeature调用 configure就运行shell命令actionifgiven如果两个选项都没有给出就运行shell命令 actionifnotgiven名称feature表示可选的用户级功能它应该仅仅由字母数字和破折号(dashes)组成 shell命令可以通过访问shell变量enableval来得到选项的参数该变量的值实际上就是把shell变量 enable_feature的值中所有的`字符替换成`_而得到的如果你愿意可以使用变量enable_featurehelpstring参数类似于 AC_ARG_WITH中相应的参数(参见与外部软件一起工作) 宏 AC_ENABLE (featureactionifgiven [actionifnotgiven]) 这是不支持求助字符串的AC_ARG_ENABLE的过时版本 配置站点细节 有些软件包需要复杂的与站点相关(sitespecific)的信息例如用于某种服务公司名称和email联系地址的主名(host names)因为有些配置脚本是通过Metaconfig方式交互地询问这些信息生成的人们有时对于按非交互方式由Autoconf生成配置脚本如何获取这些信息感到困惑 这些站点配置信息应该被储存在一个仅仅由用户而不是程序编辑的文件中文件的位置既可以基于 prefix变量也可以是一个标准的位置比如说用户的home目录它甚至可能通过一个环境变量给出程序应该在运行时而不是在编译时检查那个文件运行时配置对于用户来说更为方便并且使得配置过程比在配置时获取这些信息要简单关于存放数据文件的地点的详细信息参见GNU编码标准中的 `为安装目录而提供的变量 在安装的时候改变程序的名称 Autoconf支持在安装程序的时候修改程序的名称为了使用这些变换`configurein必须调用宏 AC_ARG_PROGRAM 宏 AC_ARG_PROGRAM 把对被安装的程序的名称进行替换的sed命令序列存入输出变量program_transform_name中 如果把下列任意选项传递给了configure程序名就据此进行变换否则如果已经调用了AC_CANONICAL_SYSTEM并且`target的值给出了与主机类型(用`host给出的或者是在configsub中设置的缺省值)不同的类型就把末尾附加了破折号的目标类型作为前缀否则就不进行程序名变换 转换选项 |