Makefile.am编写语法

时间:2021-03-11 19:08:18

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

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

    bin_PROGRAMS = autotest       // 指明编译的应用程序名称(可以安装)。  不可安装更换为:noinst_PROGRAMS = autotes  

    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  // 包含的库目录