站点配置
与外部软件一起工作
有些软件包需要,或者可选地使用其它已经安装的软件包。用户可以把命令行选项传递给configure 以指明使用那个外部软件。选项采用下列形式之一:
--with-package[=arg]--without-package例如,'--with-gnu-ld'的意思是使用GNU连接器而不是任何其它连接器。'--with-x'的意思是 使用X Window系统。
用户可以给出包名加'='加参数的命令行参数。'no'是关于包的缺省参数 它表示不使用 包。既不是'yes'又不是'no'的参数将包含其它包的名字或者版本号,以便更精确地指定本程序可以 与之协同工作的包。如果没有给出参数,'--without-package'的缺省参数为'yes'。 '--without-package'等价于'--with-package=no'。configure脚本并不对它们不支持的'--with-package'选项发出警告。 本特征允许顶层目录中的configure脚本配置一个包含多个包的源代码树。 在包支持不同的选项的时候,不会因为给出了只有一部分包支持的选项而导致不必要的错误消息。 一个不幸的副作用是选项的拼写错误就不能被检查出来了。迄今为止还没有处理该问题的更好办法。对于每个可能使用的外部软件包,'configure.in'都应该调用AC—ARG—WITH以检测 configure的用户是否要求使用它。确定在缺省状态下,是使用还是不使用每个包,以及那个参数是合法的, 是你的任务。
宏: AC_ARG_WITH package, help—string [, action—if—given [, action—if—not—given]])
如果用户以选项'--with-package'或者'--without-package'调用 configure,就运行shell命令action—if—given。如果两个选项都没有给出,就运行shell命令 action—if—not—given。名字package给出了本程序应该与之协同工作的其它软件包。它应该仅仅由 字母、数字和破折号(dashes)组成。
shell命令action—if—given可以通过shell变鼠withval得到选项的参数,该变鼠的值实际上就是把 shell变鼠with—package的值中的所有'-'字符替换为'—'而得的。 如果你愿意,可以使用变鼠with—package。
参数help—string是对选项的描述,它看起来应该像:
--with-readlinesupport fancy command line editing如果需要给出更多的细节,help—string可能多于一行。只要确保'configure --help'中的列的排列 就可以了。不要在求助字符串中使用tab。你将需要用'['和']'包围它以生成前导空格。
宏: AC_WITH package, action—if—given [, action—if—not—given])
这是不支持求助字符串的AC—ARG—WITH的过时版本。
选择包选项
如果软件包含有可选的编译时(compile—time)特征,用户就可以在调用configure时使用命令行选项来指明 是否编译它们。选项采用如下形式之一:
--enable-feature[=arg]--disable-feature这些选项允许用户选择可选的选项进行创建和安装。'--enable-feature'选项永远不要使特征的行为 变得不同或者导致一个特征代替另一个特征。它们只应该导致程序的一部分被创建而另一部分不创建。用户可以通过在特征名之后添加'='和参数来给出参数。给出参数'no'表示 不能使用该特征。一个带有参数的特征看起来就像'--enable-debug=stabs'。如果没有给出参数, 它的缺省值就是'yes'。'--disable-feature'等价于'--enable-feature=no'。configure脚本并不对它们所不支持的'--enable-feature'选项发出警告。 本特征允许顶层目录中的configure脚本配置一个包含多个包的源代码树。 在包支持不同的选项的时候,不会因为给出了只有一部分包支持的选项而导致不必要的错误消息。 一个不幸的副作用是选项的拼写错误就不能被检查出来了。迄今为止还没有处理该问题的更好办法。对于每个可选的特征,'configure.in'都应该调用AC—ARG—ENABLE以检测configure 的用户是否要求把该特征包含进来。确定在缺省情况下,每个特征是否被包含进来,以及那些选项是合法的,是你的任务。
宏: AC_ARG_ENABLE feature, help—string [, action—if—given [, action—if—not—given]])
如果用户以选项'--enable-feature'或者'--disable-feature'调用 configure,就运行shell命令action—if—given。如果两个选项都没有给出,就运行shell命令 action—if—not—given。名称feature表示可选的用户级功能。它应该仅仅由字母、数字和破折号 (dashes)组成。
shell命令可以通过访问shell变鼠enableval来得到选项的参数,该变鼠的值实际上就是把shell变鼠 enable—feature的值中所有的'-'字符替换成'—'而得到的。 如果你愿意,可以使用变鼠enable—feature。help—string参数类似于 AC—ARG—WITH中相应的参数(参见 与外部软件一起工作 )。
宏: AC_ENABLE feature, action—if—given [, action—if—not—given])
这是不支持求助字符串的AC—ARG—ENABLE的过时版本。
配置站点细节
有些软件包需要复杂的与站点相关(site—specific)的信息。例如用于某种服务、公司名称和email联系地址的主名(host names)。 因为有些配置脚本是通过Metaconfig方式交互地询问这些信息生成的,入们有时对于按非交互方式, 由Autoconf生成配置脚本如何获取这些信息感到困惑。
这些站点配置信息应该被储存在一个仅仅由用户,而不是程序,编辑的文件中。文件的位置既可以基于 prefix变鼠,也可以是一个标准的位置,比如说用户的home目录。它甚至可能通过一个环境变鼠给出。 程序应该在运行时,而不是在编译时,检查那个文件。运行时配置对于用户来说更为方便,并且使得配置过程比 在配置时获取这些信息要简单。关于存放数据文件的地点的详细信息,参见GNU编码标准中的 为安装目录而提供的变鼠 。
在安装的时候改变程序的名称
Autoconf支持在安装程序的时候修改程序的名称。为了使用这些变换,'configure.in'必须调用宏 AC—ARG—PROGRAM。 宏: AC_ARG_PROGRAM
把对被安装的程序的名称进行替换的sed命令序列存入输出变鼠program—transform—name中。
如果把下列任意选项传递给了configure,程序名就据此进行变换。 否则,如果已经调用了AC—CANONICAL—SYSTEM并
且'--target'的值给出了与主机类型 (用'--host'给出的,或者是在config.sub中设置的缺省值)不同的类型,就把末尾附加了 破折号的目标类型作为前缀。否则,就不进行程序名变换。
转换选项
你可以把下列命令行选项传递给configure以指定名称的转换:
--program-prefix=prefix为名称添加前缀prefix
--program-suffix=飞uffix为名称添加后缀suffix
--program-transform-name=expre飞飞ion对名字作sed替换expression。
转换的例子
这些变换对于作为交叉编译开发环境的一部分的程序是有用的。例如,用'--target=i960-vxworks'选项配置的 运行在Sun 4上的交叉汇编器通常以'i960-vxworks-as'为名称进行安装,而不是以'as'为名安装,该名称 将于原来的Sun 4汇编器混淆。
如果你不希望安装在你的系统上的GNU程序遮蔽具有相同名称的其它程序,你可以强行要求程序名以'g'开头。 例如,如果你使
用'--program-prefix=g'来配置GNU diff,那么在你运行'make install' 的时候,它就安装到'/usr/local/bin/gdiff'。
作为更复杂的例子,你可以使用
--program-transform-name='s/A/g/; s/Agg/g/; s/Agless/less/'在源代码树中的大部分程序的名字之前附加'g',已经含有一个'g'的程序,诸如gdb, 和不是GNU程序的程序,比如说less和lesskey,除外。(它假定你有一个包含了设置成使用 这些特征的程序的源代码树。)
同时安装某些程序的多个版本的一种方法是为其中一个程序的名称或为所有程序的名称附加版本号。例如,如果你还希望把 Autoconf版本1保留一段时间,你可以使用'--program-suffix=2'来配置Autoconf第2版,并且以名称
'/usr/local/bin/autoconf2'、'/usr/local/bin/autoheader2'等等来安装程序。转换的规则
下面是如何在'Makefile.in'中使用变鼠program—transform—name:
transform=@program—transform—name@ install: all$(INSTALL—PROGRAM) myprog $(bindir)/'echo myprog sed '$(transform)''uninstall:rm -f $(bindir)/'echo myprog sed '$(transform)''如果你要安装多个程序,你可以通过一个循环来完成:
PROGRAMS=cp ls rm install:for p in $(PROGRAMS); do \$(INSTALL—PROGRAM) $$p $(bindir)/'echo $$p sed '$(transform)''; \ doneuninstall:for p in $(PROGRAMS); do \rm -f $(bindir)/'echo $$p sed '$(transform)''; \ done是否在文档文件中进行变换(Texinfo或者man)是个麻烦的问题 由于名称变换的几个原因,好像不存在完美的答案。 文档对于特定的结构来说并不特殊,并且Texinfo文件与系统文档并不冲突。但它们可能与同一文件的早期版本冲突,而且 man手册有时与系统文档冲突。作为一个折衷,可能最好是对man手册进行名称替换而不对Texinfo手册 进行替换。
设定站点缺省值
Autoconf生成的configure脚本允许你的站点(site)为某些配置值提供缺省值。你可以通过创建 站点范围(site—wide)或者系统范围(system—wide)的初始化文件来达到这个目的。
如果设置了环境变鼠CONFIG—SITE,configure就把它的值作为读入的shell脚本的名称。 否则如果'prefix/share/config.site'存在,它就读入该脚本, 否则如果'prefix/etc/config.site'存在,它就读入该脚本。因此,如果出现冲突, 在机器特定文件中的设置将覆盖那些与机器独立的文件中的设置。站点文件(site files)可以是任意shell脚本,但只能包含某种适于包含在其中的代码。因为configure在它读入所有 站点文件之后读取任何缓存文件,站点文件可以定义一个缺省的缓存文件以便在本系统中运行的所有Autoconf生成的 configure之间共享。如果你在站点文件中设置了缺省缓存文件,那么再在那个站点文件中设置输出变鼠 CC就是个好主意,这是因为缓存文件仅仅对特定的编译器来说是合法 的,但许多系统还有好几个可用的编译器。
你可以在站点文件中检验或者覆盖由命令行选项设置的值 与选项对应的shell变鼠的名称与选项的名字的唯一区别是选项名中所有 的破折号应变换成的下划线。选项'--without-'和'--disable-'是个例外,出现它们就如同出现对应的 '--with-'或者'--enable-'并且把值设置为'no'。因此, '--cache-file=localcache'把变鼠cache—file的值设置为'localcache'
'--enable-warnings=no'或者'--disable-warnings'把变鼠enable—warnings 的值设置为'no' '--prefix=/usr'把变鼠prefix设置为'/usr' 等等。如果你需要为其它输出变鼠设置与缺省值不同的值(你通常不得不在命令行中重复地进行设置),比如说CFLAGS, 站点文件就是进行这种设置的好地方。如果你为prefix或者exec_prefix设置了非缺省值 (你放置站点文件的地方),如果你用环境变鼠CONFIG—SITE给出了站点文件,你就可以在站点文件中设置 这些非缺省值。
你可以在站点文件中设置一些缓存值。如果你正在进行交叉编译,这样做就是有用的,以避免对需要运行测试程序的特征 进行检查。你可以为'prefix/etc/config.site'中的系统正确地设置这些值来“预备缓存(prime cache)"。 为了找到你要设置的缓存变鼠名,可以在受到影响的configure脚本中寻找带有'—cv—'的shell变鼠, 也可以在Autoconf m4源代码中寻找这些宏。缓存文件将十分谨滇而不至于覆盖任何在站点文件中设置的变鼠。类似地,你不应该在站点文件中覆盖命令行选项。 你的代码应该在修改诸如prefix和cache—file的变鼠之前,检查它们的缺省值(就是在 靠近configure开头的地方设置的值)。
下面是一个例子文件'/usr/share/local/gnu/share/config.site'。 (如果没有把CONFIG—SITE设置成其它文件,)命令'configure --prefix=/usr/share/local/gnu' 将读入该文件。
# config.site for configure## Change some defaults.test "$prefix" = NONE && prefix=/usr/share/local/gnu test "$exec—prefix" = NONE && exec—prefix=/usr/local/gnutest "$sharedstatedir" = '${prefix}/com' && sharedstatedir=/var test "$localstatedir" = '${prefix}/var' && localstatedir=/var## Give Autoconf 2.x generated configure scripts a shared default# cache file for feature test results, architecture-specific. if test "$cache—file" = ./config.cache; thencache—file="$prefix/var/config.cache"# A cache file is only valid for one C compiler.CC=gcc fi