发布版本中每个包含了需要被编译或者被安装的文件的目录都应该含有一个文件Makefile.in', configure将利用它在那个目录中创建一个
Makefile’。 为了创建Makefile',configure进行一个简单的变量替换:用configure 为
@variable@’选取的值,在Makefile.in'中对它们进行替换。 按照这种方式被替换到输出文件中的变量被称为输出变量。在configure中,它们是普通 的shell变量。为了让configure把特殊的变量替换到输出文件中,必须把那个变量的名字作为调用 AC_SUBST的参数。其他变量的任何
@variable@’都保持不变。关于 使用AC_SUBST创建输出变量的详情,请参见设定输出变量。
使用configure脚本的软件应该发布文件Makefile.in',而不是
Makefile’; 这样,用户就可以在编译它之前正确地为本地系统进行配置了。
关于应该把哪些东西放入Makefile'的详情,请参见GNU编码标准中的
Makefile惯例’。
预定义输出变量
有些输出变量是由Autoconf宏预定义的。一部分Autoconf宏设置一些附加的输出变量,这些变量在对这些宏的描述 中被说明。关于输出变量的完整列表,参见输出变量索引。下面是每个预 定义变量所包含的内容。关于变量名以dir'结尾的变量,参见GNU编码标准中的
为安装目录而提供的变量’。
变量: bindir
用于安装由用户运行的可执行文件的目录。
变量: configure_input
一个用于说明文件是由configure自动生成的,并且给出了输入文件名的注释。 AC_OUTPUT在它创建的每个`Makefile’文件的开头添加一个包括了这个变量的注释行。 对于其他文件,你应该在每个输入文件开头处的注释中引用这个变量。例如,一个输入shell脚本应该以如下 行开头:
#! /bin/sh
@configure_input@
这一行的存在也提醒了人们在编辑这个文件之后需要用configure进行处理以使用它。
变量: datadir
用于安装只读的与结构无关的数据的目录。
变量: exec_prefix
与结构有关的文件的安装前缀。
变量: includedir
用于安装C头文件的目录。
变量: infodir
用于安装Info格式文档的目录。
变量: libdir
用于安装目标代码库的目录。
变量: libexecdir
用于安装由其他程序运行的可执行文件的目录。
变量: localstatedir
用于安装可以被修改的单机数据的目录。
变量: mandir
用于安装man格式的文档的顶层目录。
变量: oldincludedir
用于安装由非gcc编译器使用的C头文件的目录。
变量: prefix
与结构无关的文件的安装前缀。
变量: sbindir
用于安装由系统管理员运行的可执行文件的目录。
变量: sharedstatedir
用于安装可以修改的、与结构无关的数据的目录。
变量: srcdir
包含了由`Makefile’使用的源代码的目录。
变量: sysconfdir
用于安装只读的单机数据的目录。
变量: top_srcdir
包的顶层源代码目录。在目录的顶层,它与srcdir相同。
变量: CFLAGS
为C编译器提供的调试和优化选项。如果在运行configure时,没有在环境中设置它,就在你 调用AC_PROG_CC的时候设置它的缺省值(如果你没有调用AC_PROG_CC,它就为空)。 configure在编译程序以测试C的特征时,使用本变量。
变量: CPPFLAGS
为C预处理器和编译器提供头文件搜索目录选项(`-Idir’)以及其他各种选项。如果在运行 configure时,在环境中没有设置本变量,缺省值就是空。configure在编译或者预处理 程序以测试C的特征时,使用本变量。
变量: CXXFLAGS
为C++编译器提供的调试和优化选项。如果在运行configure时,没有在环境中设置本变量,那么 就在你调用AC_PROG_CXX时设置它的缺省值(如果你没有调用AC_PROG_CXX,它就为空)。 configure在编译程序以测试C++的特征时,使用本变量。
变量: FFLAGS
为Fortran 77编译器提供的调试和优化选项。如果在运行configure时,在环境中没有设置本变量,那么它的 缺省值就在你调用AC_PROG_F77时被设置(如果你没有调用AC_PROG_F77,它就为空)。 configure在编译程序以测试Fortran 77的特征时,使用本变量。
变量: DEFS
传递给C编译器的-D'选项。如果调用了AC_CONFIG_HEADER,configure就用
-DHAVE_CONFIG_H’代替`@DEFS@’(参见配置头文件)。 在configure进行它的测试时,本变量没有被定义,只有在创建输出文件时候才定义。关于如何检查从前的 测试结果,请参见设定输出变量。
变量: LDFLAGS
为连接器提供的Stripping(`-s’)选项和其他各种选项。如果在运行configure时, 在环境中没有设置本变量,它的缺省值就是空。 configure在连接程序以测试C的特征时使用本变量。
变量: LIBS
传递给连接器的-l'和
-L’选项。
创建目录
你可以支持从一个软件包的一份源代码拷贝中为多种结构同时进行编译的功能。为每种结构生成的目标文件都在 它们自己的目录中储存。
为了支持这个功能,make用变量VPATH来寻找储存在源代码目录中的文件。 GNU make和其他大部分近来的make程序都可以这样做。老版本的make 程序不支持VPATH;在使用它们的时候,源代码必须与目标代码处于同一个目录。
为了支持VPATH,每个`Makefile.in’文件都应该包含下列两行:
srcdir = @srcdir@
VPATH = @srcdir@
不要把VPATH设置成其他变量的值,比如说`VPATH = $(srcdir)’,这是因为 某些版本的make并不对VPATH的值进行变量替换。
在configure生成`Makefile’的时候,它用正确的值对srcdir进行替换。
除非在隐含规则中,不要使用make变量$<,它将被展开成到源代码目录的文件 的路径(通过VPATH找到的)。(诸如.c.o'的隐含规则用于说明如何从
.c’ 文件创建`.o’文件)有些版本的make在隐含规则中不设置$<; 它们被展开成空值。
Makefile'命令行总是应该通过使用前缀
$(srcdir)/‘来引用源代码文件。例如:
time.info: time.texinfo
$(MAKEINFO) $(srcdir)/time.texinfo
自动地重新创建
你可以在包的顶层目录中的Makefile.in'文件中添加如下的规则,以使得在你更新了配置文件之后 可以自动地更新配置信息。这个例子包括了所有可选的文件,例如
aclocal.m4’和那些与配置头文件 有关的文件。从`Makefile.in’规则中忽略所有你的所不需要的文件。
因为VPATH机制的限制,应该包含`${srcdir}/‘前缀。
在重新创建不改变config.h.in'和
config.h’的内容的情况下,就不会改变这两个文件的时间标记 ,因此需要stamp-'文件。这个特征避免了不必要的重新编译工作。你应该把文件
stamp-h.in’ 包含在你的包的发布中,以便make能够把`config.h.in’看作是更新了的文件。在一些 老的BSD系统中,touch或者任何可能导致空文件的命令不会更改时间标记,所以使用诸如echo 之类的命令。
${srcdir}/configure: configure.in aclocal.m4
cd ${srcdir} && autoconf
autoheader might not change config.h.in, so touch a stamp file.
${srcdir}/config.h.in: stamp-h.in
${srcdir}/stamp-h.in: configure.in aclocal.m4 acconfig.h
config.h.top config.h.bot
cd ${srcdir} && autoheader
echo timestamp > ${srcdir}/stamp-h.in
config.h: stamp-h
stamp-h: config.h.in config.status
./config.status
Makefile: Makefile.in config.status
./config.status
config.status: configure
./config.status –recheck
此外,你应该把echo timestamp > stamp-h'作为extra-cmds参数传递给AC_OUTPUT, 以便
config.status’能够确认`config.h’是更新了的。关于AC_OUTPUT的详情,请参见 创建输出文件。
关于处理与配置相关的依赖性问题的更多例子,请参见重新创建一个配置。