手工配置

优质
小牛编辑
147浏览
2023-12-01

有几种特征不能通过运行测试程序而自动猜测出来。例如,目标文件格式的细节,或者需要传递给编译器或连接器的特殊选项。 你可以使用同类手段(ad—hoc means)来检查这类特征,比如说让configure检查uname程序的 输出,或者寻找仅仅在特定系统中出现的库。然 而,Autoconf为处理不可猜测的特征提供了统一的手段。

指定系统的类型

类似与其它GNU configure脚本,Autoconf生成的configure脚本可以根据系统类型的规范名 canonical name)做出决定,该规范系统名的形式为:

cpu-company-飞y飞tem

configure通常可以猜测出它正在运行的系统类型的规范名。为此,它运行一个称为config.guess 的脚本,该脚本使用uname或者预定义的C预处理器符号来推断系统类型的规范名。

另外,用户可以通过给configure传递命令行参数而指定系统类型。在交叉编译时必须这样作。 在大多数交叉编译的复杂情况下,要涉及到三种系统类型。用于指定它们的选项是:

--build=build-type

对包进行配置和编译的系统类型(很少用到)

--host=ho飞t-type

包将运行的系统类型

--target=target-type

包中任何编译器工具将生成的代码的系统类型。

如果用户给configure一个非选项参数,如果用户没有显式地用选项指明,它就作为缺省情况表示主机类型、 目标类型和创建系统类型。如果给出了主机类型而没有给出目标类型和创建类型,目标类型和创建类型就被设置为主机类型。 如果你正在交叉编译,你仍然必须

在configure的命令行中给出你使用的交叉工具(cross—tools)的名称, 特别是C编译器。例如,

CC=m68k-coff-gcc configure --target=m68k-coffconfigure能够识别许多系统类型的短别名 例如,可以在命令行中给出'decstation'而不是'mips-dec-ultrix4.2'。configure运行一个被称为config.sub的脚本以使 系统类型别名规范化。

获取规范的系统类型

下列的宏使得configure脚本可以获得系统类型。它们运行shell脚本config.guess以确定 用户在命令行中没有给出的、它们需要的关 于主机、目标和创建类型的所有值。它们运行config.sub对 用户给出的任何别名进行规范化。如果你使用这些宏,你必须把这两个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变鼠。

build, host, target

规范系统名称

build—alias, host—alias, target—alias

如果使用了config.guess,就是用户指定的名称或者规范名称

build—cpu, build—vendor, build—os host—cpu, host—vendor, host—os target—cpu, target—vendor, target—os

为方便而提供的规范名称的独立部分。

使用系统类型

你将如何使用规范的系统类型?通常,你在'configure.in'中的一个或多个case语旬中使用它来 选择系统特定的C文件。而后把那些使用基于系统名的文件名的文件连接到诸如'host.h'或'target.c'的 普通的文件上。case语旬模型允许使用shell通配符对多种情况进行编组,就像下面的片断:

case "$target" ini386-*-mach* i386-*-gnu*) obj—format=aout emulation=mach bfd—gas=yes ;; i960-*-bout) obj—format=bout ;;esac

宏: AC_LINK_FILES source..., dest...)

使得AC—OUTPUT把每个存在文件的source连接到对应连接名dest。 如果可能,创建一个符号连接,否则就创建硬连接。dest和source应该是相对于顶层源代码目录或者 创建目录的相对路径。可以多次调用本宏。

例如,下列调用:

AC—LINK—FILES(config/${machine}.h config/${obj—format}.h, host.h object.h)在当前目录中创建'host.h',它是一个到'飞rcdir/config/${machine}.h'的连接, 并且创建'object.h',它是一个到'飞rcdir/config/${obj—format}.h'的连接。

你还可以使用主机系统类型以寻找交叉编译工具。关于完成该任务的宏AC—CHECK—TOOL的信息, 参见 对普通程序和文件的检查 。