Automake系列

1.例如要安装的目录是conf,conf将安装在实际软件包的目录下,
那么我们在Makefile.am文件里面定义如下:
confdir = $(prefix)/conf
conf_DATA = ./conf/hell1.conf  ./conf/hello2.conf

第二行指名的是在这个目录里面要安装哪些文件.
2.如果要安装到实际软件包的etc目录下,可使用
sysconf_DATA = ./conf/hell1.conf  ./conf/hello2.conf

 

configure.in(1)

   • 是configure脚本的输入文件,为了解决在不同unix变种之间移植程序的问题:库名可能不同,应用程序名可能不同,结构和常量的定义可能不同……
   • configure脚本完成autoconf与automake的初始化工作,为不同的平台定义相应的宏,检测并指定适当的程序名、库名、结构和常量名等等,指定要为哪些目录输出Makefile文件。总之,为编译程序做好一切准备工作。


configure.in(2)

configure.in的八股文
   • 基本初始化部分:包括AC_INIT (必须第一个出现), AM_INIT_AUTOMAKE(程序包名,版本号), AC_CONFIG_HEADER
   • 可选宏:如AC_ARG_ENABLE
   • 检测某些程序的存在性
   • 检查程序用到的库


configure.in(3)

   • 检查某些头文件是否存在。
   • 检查Typedefs and structures。
   • 检查Functions。
   • 指定在哪些目录输出Makefile。
          Seems troublesome, mmm? Don’t worry, autoscan will do most of the work for you.

Makefile.am(1)

   • 一种比Makefile更高层次的规则。只指定要生成什么目标,它由什么源文件生成,要安装到什么目录。
   • Just simple and stupid! 
   • 可执行文件:
bin_PROGRAMS = foo
foo_SOURCES = foo1.c foo1.h foo2.c
foo_LDADD = foo3.o -lm foo4.a
foo_LDFLAGS = -L<lib_path>
foo_DEPENDENCIES =


Makefile.am(2)

   • 对静态库:
lib_LIBRARIES = libfoo.a
foo_a_SOURCES =
foo_a_LDADD = 
foo_a_LIBADD =
foo_a_LDFLAGS =
只在make时做静态连接用,不安装的库:
noinst_LIBRARIES = libfoo.a
……
   • 对头文件:include_HEADERS = foo.h
   • 对数据文件:data_DATA = data1 data2

 

Makefile.am(3)

   • 全局变量(对所有目标都适用)
INCLUDES = -I/dir1 -I/dir2
LDFLAGS = -L/dir1 -L/dir2
LDADD = foo.o foo.a -lfoo
EXTRA_DIST = file1 file2 源程序和一些默认的文件自动打入.tar.gz包,其它文件若要进入.tar.gz包可以用这种办法,比如配置文件, 数据文件等等。
SUBDIRS = dir1 dir2 在处理本目录之前要递归处理哪些子目录


Makefile.am(4)


   • 标准安装路径
$(prefix) = /usr/local 是所有安装目录的默认前缀,可以通过./configure --prefix=<new_prefix>的方法覆盖。
其它的预定义目录如:bindir = $(prefix)/bin, libdir = $(prefix)/lib, datadir = $(prefix)/share, sysconfdir = $(prefix)/etc, …
   • 想定义一个新的安装路径?比如config, 可定义
confdir = $(prefix)/config,  然后conf_DATA = file1 file2,则file1, file2会作为数据文件安装到$(prefix)/config目录下。

 

Makefile.am(5)

   • 尽量用相对路径引用源程序的位置,以下两个变量是预定义好的:
    $(top_srcdir)无论在哪个目录层次,该变量定义了包含src目录的目录位置,用于引用源程序;
    $(top_builddir)定义了生成目标文件上最上层目录,用于引用.o等编译出来的目标文件。
    ……


Makefile.am to Makefile

   • Automake takes a (relatively) simple file called Makefile.am and
   • Creates a (relatively) complicated file called Makefile
   • Notes:
      Makefile.am is 85 lines (mostly boilerplate).
      Makefile (generated) is 672 lines


configure’s Gifts

   • configure脚本生成的Makefile中已经带了很多常用的目标如:check, all, install, uninstall, clean, dist, distcheck, distclean, tags, maintainerclean.
    If configure or make did it, make distclean undoes it.
    If make did it, make clean undoes it.
    If make install did it, make uninstall undoes it.
    If you did it, make maintainer-clean undoes it.


libtool简介

   • 生成各种程序库的方便工具。
   • 提供一个统一的接口,程序员不用关心各种烦人的底层细节:不同的平台的库可能要求不同的后缀,不同平台对库的安装方法不同,有些平台不支持动态库等等。
   • 生成高层次的库,称为libtool library,后缀是.la。用它连接时,默认产生动态连接库,也可以用-static参数指定生成静态连接库。
   • 既可单独使用又可与automake和autoconf一起使用更加强大、方便。

 

使用libtool

   • 在configure.in文件中加上AC_PROG_LIBTOOL宏,如果原来有AC_PROG_RANLIB宏,删去它。
   • 在Makefile.am文件中:
      lib_LTLIBRARIES = libshell.la
      libshell_la_SOURCES = object.c subr.c symbol.c
      与原来的写法非常相似!
   • .la库只能连入.lo(使用libtool生成的目标文件)
       libshell_la_LDADD = xmalloc.lo @LTLIBOBJS@
   • 传入库的版本号:
       libshell_la_LDFLAGS = -version-info 1:0:1
   • 与其它目标文件连接时用LDFLAGS指定连接的方式(默认是动态方式):-static, --all-static指定静态连接。


小结

   • Autoconf:根据用户提供的configure.in文件,生成一个名为configure的脚本。该脚本可以搜集有关移植性的平台相关信息,这些信息被用来生成Makefiles,配置头文件和其它平台相关的文件。
   • Automake:根据用户提供的一个高层次的生成规则Makefile.am,生成Makefile文件的模板Makefile.in。Automake生成的Makefiles符合GNU的Makefile标准,用户无需再手工编写Makefile文件。
   • Libtool:生成内存位置无关的代码且让共享库在不同平台间移植成为可能。它可以不依赖autoconf和automake单独运行,另一方面,automake和libtool可以无缝地集成使用。

#################################################################################

#################################################################################

autoscan
    autoscan.log
    configure.scan
    mv configure.scan configure.in
        AM_INIT_AUTOMAKE
        AC_PROG_LIBTOOL

aclocal
    autom4te.cache
    aclocal.m4

autoconf
    configure

libtoolize -c -f
    config.guess
    config.sub
    ltmain.sh

autoheader
    config.h.in


automake --add-missing

    install-sh -> /usr/share/automake-1.9/install-sh
    missing -> /usr/share/automake-1.9/missing
    depcomp -> /usr/share/automake-1.9/depcomp
    INSTALL -> /usr/share/automake-1.9/INSTALL
    COPYING -> /usr/share/automake-1.9/COPYING

    makefile.in

touch NEWS AUTHORS ChangeLog README

CXX="ccache distcc" ./configure --prefix=(make install 的安装目录)

    libtool

    config.status

make

make install

make dist

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值