Makefile.am 语法

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

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

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

基本格式

    Makefile.am 语法_第1张图片
     对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。

可用全局变量
    Makefile.am 语法_第2张图片
    这些全局变量,上面的所有编译项里面都可以用。

基本相对路径
    Makefile.am 语法_第3张图片
    在编写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文件。

如下图所示


Makefile.am 语法_第4张图片
 

 

如果觉得上面的步骤太多,也可以使用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.am 语法_第5张图片
 

 

上面介绍了生成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    # 程序依赖的源文件  

 



你可能感兴趣的:(库,&&,makefile)