Linux AutoMake

来源:互联网 发布:美墨边境 知乎 编辑:程序博客网 时间:2024/05/18 10:38

对于一个UNIX/LinuxC程序员来说,一个比较麻烦的工作就是写自己的Makefile可能你有如下经验:写一个简单的C程序,自己多写几行gcc命令就把程序变成可执行的了;写一个稍微复杂点的程序,源文件个数可能在30个左右,还是写一行行的gcc命令就麻烦了,你可能想到写个makefile,你可能也在这样做着;但你某一天会发现你写的这个Makefile可能不是一个所有 UNIX/Linux类操作系统下通用的Makefile,比如某人下载了你的程序去他自己电脑上可能make不了。

   

这样,你就有必要了解并学会运用autoconfautomake

    

先简单介绍一下这两个工具:
autoconf:是一个用于生成可以自动地配置软件源代码包以适应多种UNIX类系统的shell脚本的工具。由autoconf生成的配置脚本在运行的时候不需要用户的手工干预;通常它们甚至不需要手工给出参数以确定系统的类型。相反,它们对软件包可能需要的各种特征进行独立的测试。在每个测试之前,它们打印一个单行的消息以说明它们正在进行的检测,以使得用户不会因为等待脚本执行完毕而焦躁。因此,它们在混合系统或者从各种常见UNIX变种定制而成的系统中工作的很好。你也省了工作,没必要维护文件以储存由各个UNIX变种、各个发行版本所支持的特征的列表。

automake:是一个从文件Makefile.am自动生成Makefile.in的工具。每个Makefile.am基本上是一系列make的宏定义(make规则也会偶尔出现)生成的Makefile.in,服从GNU Makefile标准。为了生成Makefile.inautomake需要perl。但是由automake创建的发布完全服从GNU标准,并且在创建中不需要perl

   

不罗嗦了,进入正题~

在本文中,我将结合最近的实践经历以及遇到的问题,给大家介绍如何使用autoconfautomake两个工具来帮助我们自动地生成符合自由软件惯例的Makefile,这样就可以象常见的GNU程序一样,只要使用“./configure”“make”“make instal”就可以把程序安装到Linux系统中去了。

   

在开始使用autoconf和automake之前,首先确认你的系统安装有GNU的如下软件:
    1. automake
    2. autoconf
    3. m4
    4. perl
    5. 
如果你需要产生共享库(shared library)则还需要GNU Libtool。

   

介绍方法之前,大家先记下autoconf和automake工作的几个步骤,步骤解释如下:                 

1、由你的源文件通过autoscanf命令生成configure.scan文件,然后修改

configure.scan文件并重命名为configure.in
    2
、由aclocal命令生成
aclocal.m4
    3、由autoconf命令生成configure

注:很重要

如果这里紧接着直接进行第4步:

automake --add-missing:后会出现错误:configure.in:8:required file

   `./config.h.in' not found

紧接着./configure后会出现 config.status: error: cannot find input file:

config.h

解决办法:在automake --add-missing之前执行autoheader就ok了,一般网上的资料

很少有人提到这一步,大家也都是转来转去,所有会导致错误的发生。


    4、编辑一个Makefile.am文件并由automakeautomake --add-missing)命令生成

   Makefile.in文件
    5、./configure命令生成Makefile    (后面有命令介绍)

     

实战:我的源程序结构如下总共两个目录:viaencode/ 、videolib/,
viaencode/下有两个源文件和一个makefile.am文件: encodeapi.c   、viaenc.c 、 Makefile.am
videolib/下有四个头文件: MP4EncApi.h、hw_lib.h、ViaApi.h 、itu.h,以及六个.a库文件:libext_device_ctrl.a 、libhwdec.a、libhwenc.a、libitu.a、libuserdev.a、libvia.a。生成目标程序viaenc要下载到开板中运行。


    按照如下步骤来自动生成Makefile吧:
1进入viaencode/目录,运行autoscan命令,命令如下:
# cd viaencode/
# autoscan
2
ls会发现多了一个configure.scan文件。修改此文件,在AC_INIT宏之后加入AM_INIT_AUTOMAKE(viaenc, 1.0),这里hello是你的软件名称,1.0是版本号,即你的这些源程序编译将生成一个软件viaenc-1.0版。“然后把 configure.scan文件的最后一行AC_OUTPUT宏填写完整变成AC_OUTPUT(Makefile),表明autoconf和 automake最终将生成Makefile文件”,这样的话会出错,因为之前有一句AC_CONFIG_FILES([Makefile]),所以我没变。最后把configure.scan文件改名为configure.in
3运行aclocal命令,ls会发现多了一个aclocal.m4文件。
4然后运行autoconf命令,ls将发现生成了一个可执行的configure命令。

5、执行autoheader,前面已讲过。

6、编辑一个Makefile.am文件,已有,文件内容如下:
    bin_PROGRAMS = viaenc
    viaenc_SOURCES = viaenc.c encodeapi.c
    AM_CFLAGS = -I../videolib
    LDADD = -L../videolib -lvia -litu -lhwdec -lext_device_ctrl -lhwenc -     lpthread -luserdev 

7运行automake --add-missing命令。屏幕提示如下:
automake: configure.in: installing `./install-sh'
automake: configure.in: installing `./mkinstalldirs'
automake: configure.in: installing `./missing'
8、
运行configure命令来生成一个Makefile文件,输入./configure命令即可         9、因为应用程序是要下载到开发版中运行,所以必须修改交叉编译工具。修改Makefile中的CC = gcc,改为指向自己的交叉编译工具,CC=/usr/local/arm/gcc-3.4.4-glibc-2.3.6/bin/arm-linux-gcc。否则会出错!!!

  

运用autoconfautomake的最大好处是,你的程序以源程序方式发布后,其它所有人只需要依次输入./configure ,make,make install命令就可以把你的程序安装在自己的电脑上运行了。所有符合GNU标准的UNIX/Linux都不需要再修改Makefile里的任何字符。

总的来说,程序开发人员只需要写一些简单的含有预定义宏的文件,由autoconf根据一个宏文件生成configure,由automake根据另一个宏文件生成Makefile.in 再使用configure依据Makefile.in来生成一个符合惯例的Makefile