这两个文件在开源项目中经常看到。
它们是用来做什么的,以及它们如何工作的?
Makefile.am
是由程序员定义的文件,供automake
使用以生成Makefile.in
文件(.am
代表automake)。
通常在源代码tarball中看到的configure
脚本将使用Makefile.in
生成Makefile
。
configure
脚本本身是从程序员定义的文件生成的,命名为configure.ac
或configure.in
(已弃用)。我更喜欢.ac
(代表autoconf),因为它能将其与生成的Makefile.in
文件区分开来,这样我就可以有规则,例如make dist-clean
,其中运行rm -f *.in
。由于它是一个生成的文件,通常不会存储在Git、SVN、Mercurial或CVS等版本控制系统中,而是.ac
文件会被存储。
了解更多关于GNU Autotools的内容。
先阅读关于make
和Makefile
的内容,然后了解automake
、autoconf
、libtool
等。
.in
代表什么? - Utku.in
的扩展名表示它是 configure
的输入,需要进行处理,而不是一个应该被使用(例如与 make
一起使用)的最终文件。如果你想知道为什么这似乎“非常”复杂,请阅读:https://dev59.com/Cl8d5IYBdhLWcg3waxzo#26832773 。如今,随着 GitHub 等成为常见的分发渠道,一些 autoconf 的假设正在瓦解:人们直接从源代码控制工具中获取源代码,而不是使用维护者创建的源代码分发 tarball。 - MadScientistMakefile.in
,使用“configure”生成Makefile
。 - daraulMakefile.am
用于生成Makefile.in
,而Makefile.in
则作为输入用于生成Makefile
。 - AstroFloyd简单示例
无耻地从http://www.gnu.org/software/automake/manual/html_node/Creating-amhello.html中适应,并在Ubuntu 14.04 Automake 1.14.1上进行测试。
Makefile.am
SUBDIRS = src
dist_doc_DATA = README.md
README.md
Some doc.
configure.ac
AC_INIT([automake_hello_world], [1.0], [bug-automake@gnu.org])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
Makefile
src/Makefile
])
AC_OUTPUT
src/Makefile.am
bin_PROGRAMS = autotools_hello_world
autotools_hello_world_SOURCES = main.c
src/main.c
#include <config.h>
#include <stdio.h>
int main (void) {
puts ("Hello world from " PACKAGE_STRING);
return 0;
}
使用方法
autoreconf --install
mkdir build
cd build
../configure
make
sudo make install
autotools_hello_world
sudo make uninstall
这会输出:
Hello world from automake_hello_world 1.0
注意事项
autoreconf --install
会生成一些模板文件,应该被 Git 追踪,包括 Makefile.in
。这只需要运行一次。
make install
命令会安装以下内容:
/usr/local/bin
README.md
到 /usr/local/share/doc/automake_hello_world
在GitHub上试一下吧。
autotools_hello_world
而不是autoconf_hello_world
吧? - Cloud Choautoconf
和automake
:configure
、make
和sudo make install
:./configure # Creates Makefile (from Makefile.in).
make # Creates the application (from the Makefile just created).
sudo make install # Installs the application
# Often, by default its files are installed into /usr/local
以下符号表示:输入 --> 程序 --> 输出
开发人员运行以下程序:
configure.ac -> autoconf -> configure(脚本)--- (*.ac = autoconf)
configure.in --> autoconf -> configure (脚本) --- (configure.in
被弃用。请使用configure.ac)
Makefile.am -> automake -> Makefile.in ----------- (*.am = automake)
安装程序运行以下程序:
Makefile.in -> configure -> Makefile (*.in = input文件)
Makefile -> make ----------> (将新软件放入下载或临时目录)
Makefile -> make install -> (将新软件放入系统目录)
"autoconf 是一个可扩展的 M4 宏包,用于生成 shell 脚本来自动配置软件源代码包。这些脚本可以适应许多类 UNIX-like 系统而无需手动用户干预。Autoconf从列出包可以使用的操作系统特性的模板文件中创建一个包的配置脚本,形式为M4宏调用。
"automake 是一个工具,用于自动生成符合 GNU 编码标准的 Makefile.in 文件。Automake 需要使用 Autoconf。
手册:
GNU AutoTools(关于此内容的权威手册)
m4(由 autoconf 使用)
免费在线教程:
用于构建 LibreOffice 的主要 configure.ac 超过 12k 行代码(但子文件夹中还有其他 57 个 configure.ac 文件)。
由此生成的configure超过 41k行代码。
而 Makefile.in 和 Makefile 均仅有 493 行代码。 (但是,子文件夹中还有 768 个 Makefile.in)
Makefile.am -- 一个用于自动化构建的用户输入文件
configure.in -- 一个用于自动配置的用户输入文件
autoconf 从 configure.in 生成 configure
automake 从 Makefile.am 生成 Makefile.in
configure 从 Makefile.in 生成 Makefile
例如:
$]
configure.in Makefile.in
$] sudo autoconf
configure configure.in Makefile.in ...
$] sudo ./configure
Makefile Makefile.in
automake
。他们应该在tarball中有Makefile.in
。 - Darren Ng