创建输出文件。
在`configure.in'的末尾调用本宏一次。参数file...是一个以空格分隔的输出文件的列表;它可能为空。本宏通过从一个输入文件(缺省情况下名为`file.in')中复制,并替换输出变量的值以创建每个给出的`file'。关于使用输出变量的详情,请参见Makefile中的替换。关于创建输出变量的详情,请参见设定输出变量。如果输出文件所在的目录不存在,本宏将创建该目录(但不会创建目录的父目录)。通常,`Makefile'是按照这种方式创建的,但其他文件,例如`.gdbinit',也可以这样创建。
如果调用了AC_CONFIG_HEADER、AC_LINK_FILES或者AC_CONFIG_SUBDIRS,本宏也将创建出现在它们的参数中的文件。
一个典型的对AC_OUTPUT调用如下:
AC_OUTPUT(Makefile src/Makefile man/Makefile X/Imakefile)
你可以通过在file之后添加一个用冒号分隔的输入文件列表以自行设定输入文件名。例如:
AC_OUTPUT(Makefile:templates/top.mk lib/Makefile:templates/lib.mk)
AC_OUTPUT(Makefile:templates/vars.mk:Makefile.in:templates/rules.mk)
这样做可以使得你的文件名能够被MS-DOS接受,或者可以把模板文件(boilerplate)添加到文件的开头或者结尾。
如果你给出了extra-cmds,那么这些命令将被插入到`config.status'中以便在`config.status' 完成了其他的所有处理之后运行extra-cmds。如果给出了init-cmds,它们就被插入 extra-cmds之前,并且在configure中将对它们进行shell变量、命令和反斜线替换。你可以用 init-cmds把变量从configure中传递到extra-cmds。如果调用了 AC_OUTPUT_COMMANDS,在其中给出的命令将紧贴在由本宏给出的命令之前运行。
宏: AC_OUTPUT_COMMANDS (extra-cmds [, init-cmds])
指定在`config.status'末尾运行的附加的shell命令,以及用于初始化来自于configure 的所有变量的shell命令。本宏可以被调用多次。下面是一个不太实际的例子:
fubar=27
AC_OUTPUT_COMMANDS([echo this is extra $fubar, and so on.], fubar=$fubar)
AC_OUTPUT_COMMANDS([echo this is another, extra, bit], [echo init bit])
如果你在子目录中运行make,你应该通过使用make变量MAKE来运行它。 make的大部分版本把MAKE设置成make的程序名以及它所需要的任何选项。(但许多版本并没有把在命令行中设定的变量的值包括进来,因此它们没有被自动地传递。)一些老版本的 make并不设定这个变量。以下的宏使你可以在这些版本上使用它。
宏: AC_PROG_MAKE_SET
如果make预定义了变量MAKE,把输出变量SET_MAKE定义为空。否则,把 SET_MAKE定义成`MAKE=make'。为SET_MAKE调用AC_SUBST。
为了使用这个宏,在每个其他的、运行MAKE的目录中的`Makefile.in'添加一行:
@SET_MAKE@
Makefiles中的替换
发布版本中每个包含了需要被编译或者被安装的文件的目录都应该含有一个文件`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变量$
`Makefile'命令行总是应该通过使用前缀`$(srcdir)/'来引用源代码文件。例如:
time.info: time.texinfo
????$(MAKEINFO) $(srcdir)/time.texinfo
自动地重新创建
你可以在包的顶层目录中的`Makefile.in'文件中添加如下的规则,以使得在你更新了配置文件之后可以自动地更新配置信息。这个例子包括了所有可选的文件,例如`aclocal.m4'和那些与配置头文件有关的文件。从`Makefile.in'规则中忽略所有你的所不需要的文件。