什么是Makefile.am和Makefile.in?

这两个文件大多在开源项目中看到。

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

Makefile.am是一个程序员定义的文件,由automake用来生成Makefile.in文件( .am代表uto m ake)。 通常在源码包中看到的configure脚本将使用Makefile.in来生成一个Makefile

configure脚本本身是从一个名为configure.acconfigure.in (不build议使用)的程序员定义文件生成的。 我更喜欢.ac (对于uto c onf),因为它将它从生成的Makefile.in文件中区分出来,这样我就可以制定一些规则,如make dist-clean运行rm -f *.in 。 由于它是一个生成的文件,通常不会将其存储在Git,SVN,Mercurial或CVS等版本系统中,而是存储在.ac文件中。

阅读更多关于GNU Autotools 。 先阅读makeMakefile ,然后学习automakeautoconflibtool等。

简单的例子

http://www.gnu.org/software/automake/manual/html_node/Creating-amhello.html无耻地改编,并在Ubuntu 14.04 Automake 1.14.1上testing。

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

在GitHub上为你尝试一下。

参考 :

Makefile.am – 用户input文件automake

configure.in – 用户input文件autoconf


autoconf从configure.in生成configuration

automake从Makefile.am中生成Makefile.in

configuration从Makefile.in生成Makefile

例如:

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