Makefile.am 和 Makefile.in 是什么?

441

这两个文件在开源项目中经常看到。

它们是用来做什么的,以及它们如何工作的?


请查看Autotools Mythbuster(https://autotools.info/)。 - undefined
4个回答

474

Makefile.am是由程序员定义的文件,供automake使用以生成Makefile.in文件(.am代表automake)。 通常在源代码tarball中看到的configure脚本将使用Makefile.in生成Makefile

configure脚本本身是从程序员定义的文件生成的,命名为configure.acconfigure.in(已弃用)。我更喜欢.ac(代表autoconf),因为它能将其与生成的Makefile.in文件区分开来,这样我就可以有规则,例如make dist-clean,其中运行rm -f *.in。由于它是一个生成的文件,通常不会存储在Git、SVN、Mercurial或CVS等版本控制系统中,而是.ac文件会被存储。

了解更多关于GNU Autotools的内容。 先阅读关于makeMakefile的内容,然后了解automakeautoconflibtool等。


7
.in代表什么? - Utku
24
.in 的扩展名表示它是 configure 的输入,需要进行处理,而不是一个应该被使用(例如与 make 一起使用)的最终文件。如果你想知道为什么这似乎“非常”复杂,请阅读:https://dev59.com/Cl8d5IYBdhLWcg3waxzo#26832773 。如今,随着 GitHub 等成为常见的分发渠道,一些 autoconf 的假设正在瓦解:人们直接从源代码控制工具中获取源代码,而不是使用维护者创建的源代码分发 tarball。 - MadScientist
这似乎与emacs源代码不符;它有一个Makefile.in,使用“configure”生成Makefile - daraul
@daraul,我认为Makefile.am用于生成Makefile.in,而Makefile.in则作为输入用于生成Makefile - AstroFloyd

81

简单示例

无耻地从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上试一下吧。


1
为什么应该将生成的文件保存在版本控制系统下(这不仅限于Git)? - Victor Yarema
@VictorYarema 我忘记了我为什么得出那个结论!如果你找到了,请告诉我。 - Ciro Santilli OurBigBook.com
1
在你的使用部分,应该是autotools_hello_world而不是autoconf_hello_world吧? - Cloud Cho

47

开发人员运行autoconfautomake

  1. autoconf -- 创建可发布的configure脚本
    (安装程序将稍后运行该脚本以生成Makefile
  1. automake -- 创建可发布的Makefile.in数据文件
    (这些文件稍后由configure读取,以生成Makefile

安装程序运行configuremakesudo 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。

手册:

免费在线教程:


示例:

用于构建 LibreOffice 的主要 configure.ac 超过 12k 行代码(但子文件夹中还有其他 57 个 configure.ac 文件)。

由此生成的configure超过 41k行代码。

Makefile.inMakefile 均仅有 493 行代码。 (但是,子文件夹中还有 768 个 Makefile.in)


21

reference :

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

当您执行“make dist”时,Makefile.in应该包含在tar.gz文件中,对吗? - Kemin Zhou
@KeminZhou 是的。非开发人员不应该运行automake。他们应该在tarball中有Makefile.in - Darren Ng
通常开发者使用Autotools生成configure文件,以供普通用户使用。 - Kemin Zhou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接