什么是Makefile.am和Makefile.in?

时间:2010-03-28 03:47:16

标签: makefile autotools automake

这两个文件主要出现在开源项目中。

它们是什么,它们如何运作?

4 个答案:

答案 0 :(得分:348)

Makefile.am是程序员定义的文件,automake用于生成Makefile.in文件(.am代表 a uto的 AKE)。 通常在源代码压缩包中看到的configure脚本将使用Makefile.in生成Makefile

configure script本身是由程序员定义的文件生成的,该文件名为configure.acconfigure.in(不建议使用)。我更喜欢.ac(对于 a uto c onf),因为它将其与生成的Makefile.in文件区分开来,这样我就可以拥有如下规则:运行make dist-clean的{​​{1}}。由于它是生成的文件,因此通常不会存储在修订系统(如Git,SVN,Mercurial或CVS)中,而是rm -f *.in文件。

详细了解GNU Autotools。 首先阅读makeMakefile,然后了解automakeautoconflibtool等。

答案 1 :(得分:43)

简单示例

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

On GitHub让你尝试一下。

答案 2 :(得分:14)

reference

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

configure.in - autoconf的用户输入文件

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

答案 3 :(得分:10)

开发商运行这些:

1) autoconf - 创建可发送的配置脚本(安装程序将运行以生成 Makefile
2) automake - 创建可发送的 Makefile.in 配置稍后将读取以生成 Makefile

INSTALLER运行这些:

./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

INPUTS - &gt; 计划 - &gt;输出:

开发商运行这些:

configure.in - &gt; autoconf - &gt; configure (脚本)---(配置。 in 折旧。现在使用configure.ac)
configure.ac - &gt; autoconf - &gt; 配置(脚本)---(*。 ac = a uto c onf)

Makefile.am - &gt; automake - &gt; Makefile.in -----------(*。 am = a uto m ake)

INSTALLER运行这些:

Makefile.in - &gt; 配置 - &gt; Makefile (*。 = 放置文件)

Makefile - &gt; 制作 - &gt; (下载或临时目录中的新软件)
Makefile - &gt; make install - &gt; (将新软件放入系统目录)

Autoconf 是一个可扩展的M4宏包,可生成用于自动配置软件源代码包的shell脚本。这些脚本可以使软件包适应多种类UNIX系统而无需用户手动干预。 Autoconf从模板文件为包创建一个配置脚本,该模板文件以M4宏调用的形式列出了包可以使用的操作系统功能。“

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

<强>手册

有趣的事实:
用于构建LibreOffice的主要 configure.ac 超过12k行代码(但子文件夹中还有57个其他configure.ac文件。)
由此产生的 configure 超过41k行代码 虽然 Makefile.in Makefile 都只有493行代码。
(但是,子文件夹中还有768多个Makefile.in。)