什么是Makefile.am和Makefile.in?


335

这两个文件通常在开源项目中可见。

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

Answers:


381

Makefile.am是一个程序员定义的文件,并且用于通过automake以生成Makefile.in文件(.am代表一个 UTO AKE)。configure通常在源tarball中看到的脚本将使用Makefile.in生成一个Makefile

configure脚本本身是由一个程序员定义的文件生成的,该文件名为configure.acor或configure.in(不建议使用)。我喜欢.ac(为一个反对派ç ONF),因为它从产生它的区别Makefile.in文件和这样我可以有规则,如make dist-clean它运行rm -f *.in。由于它是生成的文件,因此通常不会存储在修订系统(例如Git,SVN,Mercurial或CVS)中,而应该存储在.ac文件中。

阅读有关GNU Autotools的更多信息。阅读makeMakefile第一,然后了解automakeautoconflibtool,等。


3
代表什么.in
Utku

10
.in扩展名意味着它是用于输入消息的输入configure,而不是应使用的最终文件(例如,带有make)。如果您对为什么这看起来“荒谬”复杂感到好奇,请尝试阅读:stackoverflow.com/a/26832773/939557 如今,随着GitHub等成为常见的发行渠道,autoconf的某些假设正在瓦解:人们正在获得直接从源代码控制工具获取源代码,而不使用维护者创建的源代码分发压缩包。
MadScientist

53

简单的例子

无耻地改编自: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

自述文件

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
autoconf_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
为什么要在VCS下保留生成的文件(不仅可以是Git BTW)?
维克多·亚雷玛

@VictorYarema我忘记了为什么得出这个结论!让我知道你是否发现。
西罗Santilli郝海东冠状病六四事件法轮功

19

开发人员运行autoconfautomake

1)autoconf- 创建可交付使用的配置脚本
(安装程序以后将运行该脚本以生成Makefile

2)automake-在数据文件中 创建可运送的Makefile.in
配置将在以后读取以制作Makefile


INSTALLER运行configuremake并且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


输入/输出图

下面的符号大致是:输入->程序->输出

DEVELOPER运行以下命令:

configure.ac - > autoconf的 - > 配置(脚本)---(* AC = 一个反对派ç ONF)
configure.in - > autoconf的 - > 配置(脚本)---(configure.in折旧使用configure.ac。)

Makefile.am - > 的automake - > Makefile.in -----------(。* = 一个 UTO AKE)

安装程序运行以下命令:

Makefile.in - > 配置 - > 生成文件(* = 放文件)

Makefile- > make ---------->(将新软件放入您的下载目录或临时目录中)
Makefile- > make install ->(将新软件放入系统目录中)


autoconf是M4宏的可扩展程序包,该程序包生成shell脚本以自动配置软件源代码包。这些脚本可以使程序包适应许多类UNIX系统,而无需用户手动干预。Autoconf通过以下方式为程序包创建配置脚本:模板文件,以M4宏调用的形式列出了程序包可以使用的操作系统功能。”

automake是一种用于自动生成符合GNU编码标准的Makefile.in文件的工具。Automake需要使用Autoconf。

手册:

免费的在线教程:


例:

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

由此我生成的配置超过41k行代码。

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


16

参考

Makefile.am-自动输入的用户输入文件

configure.in-要自动配置的用户输入文件


autoconf从configure.in生成configure

automake使Makefile.am中的Makefile.in生效

配置从Makefile.in生成Makefile

例如:

$]
configure.in Makefile.in
$] sudo autoconf
configure configure.in Makefile.in ... 
$] sudo ./configure
Makefile Makefile.in

所以当您创建dist时,Makefile.in应该位于tar.gz文件中,对吗?
周克敏
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.