什么是Makefile.am和Makefile.in?

Mas*_*ask 312 automake makefile autotools

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

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

Sea*_*ney 358

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

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

阅读更多GNU Autotools.阅读makeMakefile第一,然后了解automake,autoconf,libtool,等.

  • `.in`扩展名表示它是`configure`的按键输入,而不是应该使用的最终文件(例如`make`).如果你很好奇为什么这看起来"荒谬"复杂,请尝试阅读:/sf/answers/1878294141/这些天GitHub等成为一个共同的分销渠道,一些autoconf的假设正在破裂:人们直接从源代码控制工具获取源代码,而不是使用维护者创建的源代码分发tarball. (8认同)
  • `.in` 代表什么? (4认同)

Cir*_*四事件 48

简单的例子

无耻地改编自: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
Run Code Online (Sandbox Code Playgroud)

README.md

Some doc.
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

SRC/Makefile.am

bin_PROGRAMS = autotools_hello_world
autotools_hello_world_SOURCES = main.c
Run Code Online (Sandbox Code Playgroud)

SRC/main.c中

#include <config.h>
#include <stdio.h>

int main (void) {
  puts ("Hello world from " PACKAGE_STRING);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

用法

autoreconf --install
mkdir build
cd build
../configure
make
sudo make install
autoconf_hello_world
sudo make uninstall
Run Code Online (Sandbox Code Playgroud)

这输出:

Hello world from automake_hello_world 1.0
Run Code Online (Sandbox Code Playgroud)

笔记

  • autoreconf --install生成几个应由Git跟踪的模板文件,包括Makefile.in.它只需要第一次运行.

  • make install 安装:

    • 二进制文件 /usr/local/bin
    • README.md/usr/local/share/doc/automake_hello_world

在GitHub上你可以尝试一下.


小智 16

参考:

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
Run Code Online (Sandbox Code Playgroud)


Ell*_*iew 13

开发者运行这些:

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
Run Code Online (Sandbox Code Playgroud)

INPUTS - > PROGRAMS - > OUTPUTS:

开发者运行这些:

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

Makefile.am - > automake - > Makefile.in -----------(*.am = a uto m ake)

INSTALLER运行这些:

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

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


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

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

手册:


有趣的事实:用于构建LibreOffice
的主要configure.ac是超过12k行代码,(但在子文件夹中还有57个其他configure.ac文件.)
从这里我生成的配置超过41k行代码.
Makefile.inMakefile都只有493行代码.
(但是,子文件夹中还有768个Makefile.in.)