Makefile.am 语法

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文件:

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

Makefile.am文件:

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

原文链接:https://blog.csdn.net/vevenlcf/article/details/48134313

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值