Makefile.am

/usr/local/bin/automake
 
/usr/local/share/aclocal-1.14
 
 
autoconf-2.68.tar.bz2、automake-1.11.1.tar.bz2、m4-1.4.14.tar.bz2

Makefile.am,是一个文件也好,是一种技术也罢,其它文件里面写的东西很简单,但是你要按照规则去写,就像Makefile文件一样,所以不要觉得Makefile.am文件很神秘,它和Makefile文件一样,只不过是一种比Makefile文件抽象程序更高的编译规则文件。 你在使用的时候,只要指定想生成什么目录,它用什么源码生成,编译的时候依赖哪些库,要安装到什么目录等等,接下来的工作全部交给automake 和 autoconf (关于这两个怎么工作的,我前面博客里有简单的写),一般情况下,它的规则也是很简单的。

   下面一张图中,列出了可执行文件、静态库、头文件和数据文件,四种书写Makefile.am文件的一般规则。如我在前面说automake和autoconf用法时,写的那个Makefile.am文件就两句话:

bin_PROGRAMS = autotest       // 指明编译的应用程序名称。
    autotest_SOURCE = autotest.c  // 指明编译的源文件。



基本格式

    

 

     对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。

可用全局变量
    

 

    这些全局变量,上面的所有编译项里面都可以用。

基本相对路径
    

 

    在编写Makefile.am文件时,尽可能的用相对路径,要不在不同的地方编译,安装可能是到不同的目录了,
   

标准安装路径

   默认安装路径为:$(prefix) = /usr/local,可以通过./configure --prefix=的方法来覆盖。
其它的预定义目录还包括:bindir = $(prefix)/bin, libdir = $(prefix)/lib, datadir = $(prefix)/share, sysconfdir = $(prefix)/etc等等。

定义一个新的安装路径文件目录

    如果你想在安装目录下再建一个目录,这个时候,可以这样操作。
    比如你想新建一个 test 目录。可定义testdir = $(prefix)/test, 然后test_DATA =test1 test2,则test1,test2会作为数据文件安装到$(prefix)/test目录下。

    比如,我在我的实际工程的顶级目录的Makefile.am中,添加如下两行,

datadir = ${prefix}/data
            data_DATA = package // 结果是 在我的安装目录下,出现一个data目录,目录下有一个文件package



编译库文件
   如果你的程序目录下有一个lib目录,可以这样在该目录下写Makefile.am

noinst_LIBRARIES=libswap.a
            libswap_a_SOURCES=swap.c
            INCLUDES=-I$(top_srcdir)/src/include   // 包含文件,注意 -I的使用。


            swapincludedir=$(includedir)/swap
            swapinclude_HEADERS=$(top_srcdir)/src/include/swap.h


   最后两行的意思是将swap.h安装到${prefix}/include/swap目录下。举个实际应用的例子,我的一个库文件的头文件,名称叫做serverd.h,
                  serverdincludedir=$(includedir)/serverd
                   serverdinclude_HEADERS=$(top_srcdir)/serverd/serverd.h
   这个也是放在顶级目录里的,这两行能够使得在安装目录下的include目录下建立一个serverd目录,然后把serverd.h放进去。

编译安装程序

    有前面的一些基础,下面直接写这个

noinst_PROGRAMS=autotest
     autotest_SOURCES=autotest.c
     autotest_LDADD=$(top_srcdir)/src/.....A.o $(top_srcdir)/src/lib/libswap.a  // 包含的库目录

公司的项目既使用手写的makefile,也使用automake,没有统一的规定,一直是把别人的makefile文件拿过来,改改再用。最近有空,仔细了解了一下makefile和automake,发现makefile写起来麻烦,automake简单多了,于是将automake的用法整理了一下,作为以后的参考

 

整个过程的步骤如下:
1. 在存放源代码的目录下执行autoscan命令生成configure.scan文件。
2. 将configure.scan文件改名为configure.in或者configure.ac,并对其默认配置进行修改。
3. 执行aclocal、autoconf两个命令,分别生成aclocal.m4、configure文件。
4. 执行autoheader命令,分别生成config.h.in文件。
5. 创建一个名为Makefile.am的文件,并输入相应的内容。
6. 执行automake --add-missing,它根据Makefile.am文件,生成Makefile.in。
7. 执行./configure脚本文件,它根据Makefile.in文件,生成最终的Makefile文件。
通过以上步骤,在源代码所在目录下自动生成了Makefile文件。

如下图所示

 

 

 

 

如果觉得上面的步骤太多,也可以使用autoreconf工具,它会按照顺序调用上面的工具,步骤如下
1. 在存放源代码的目录下执行autoscan命令生成configure.scan文件。
2. 将configure.scan文件改名为configure.in,并对其默认配置进行修改。
3. 创建一个名为Makefile.am的文件,并输入相应的内容。
4. 执行autoreconf --install,它根据Makefile.am,configure.in文件,生成Makefile.in,configure,config.h.in。
5. 执行./configure脚本文件,它根据Makefile.in文件,生成最终的Makefile文件。

如下图所示

 

 

 

 

上面介绍了生成Makefile的整个流程,其中包括两个关键的文件,configure.in和Makefile.am,这两个文件都需要人工编写,下面给出一个简单的示例,详细的解释目前写不出来,等有一定的经验之后再写

 

Configure.in文件:

 

Cpp代码  

1. # Process this file with Autoconf to produce a configure script.   
2. AC_INIT(Main.cpp)       #指定main函数所在的文件  
3. AM_INIT_AUTOMAKE(hello, 1.0)    #指定程序名称和版本  
4. # Checks for programs.  
5. #检查可用的编译器  
6. AC_PROG_CC          #C语言编译器  
7. AC_PROG_CPP         #C++编译器  
8. AC_PROG_CXX  
9. # Checks for libraries.   
10. # Checks for header files.   
11. # Checks for typedefs, structures, and compiler characteristics.   
12. # Checks for library functions.   
13. AC_OUTPUT(Makefile)

 

Makefile.am文件:

Cpp代码  

1. bin_PROGRAMS = hello                # 生成的可执行文件名称.   
2. hello_SOURCES = Main.cpp A.h A.cpp B.h B.cpp    # 程序依赖的源文件


1.输入命令:wget http://ftp.gnu.org/gnu/automake/automake-1.14.1.tar.gz下载autoconf安装包

 

2.解压缩automake-1.14.1.tar.gz ,输入命令:tar -zxvf automake-1.14.1.tar.gz -C /opt/

 

3.进入解压缩后的目录automake-1.14.1,输入命令:cd /opt/automake-1.14.1

 

4.输入命令:./bootstrap.sh

 

5.配置编译环境,输入命令:./configure

 

6.编译并安装automake,输入俩命令:make ;  make install

 

7.检查是否安装成功,输入命令:automake --version

————————————————

 

 

学习automake

man  automake
info automake
 
/usr/local/share/aclocal-1.14
PREFIX/share/doc/automake/amhello-1.0.tar.gz
 
 
The GNU Coding Standards also specify a hierarchy of variables to denote
installation directories.  Some of these are:
 
Directory variable   Default value
-------------------------------------------------------
'prefix'             '/usr/local'
      '${prefix}'
        '${exec_prefix}/bin'
        '${exec_prefix}/lib'
    ...
      '${prefix}/include'
      '${prefix}/share'
        '${datarootdir}'
        '${datarootdir}/man'
        '${datarootdir}/info'
        '${datarootdir}/doc/${PACKAGE}'