automake学习一

简介

向来都是自己手码makefile,自我感觉还是挺方便的,应该是跨平台开发还是比较少,学习automake主要还是因为最近使用开源软件编译安装过程出现问题,发现自己的makefile真有点落伍了,还是得跟上社区大神们的步伐,不进则退.

参考链接

automake官方

autoconf官方

configure.ac

configure.ac是Automake的必备文件,其中我们需要手动修改,添加一部分宏定义,一般来说为AM_INIT_AUTOMAKEAC_CONFIG_FILES;

对于AM_INIT_AUTOMAKE主要涉及如下选项

  • gnits
  • gnu
  • foreign
  • cygnus
  • ansi2knr
  • path/ansi2knr
  • check-news
  • dejagnu
  • dist-bzip2
  • dist-lzma
  • dist-shar
  • dist-zip
  • dist-tarZ
  • filename-length-max=99
  • no-define
  • no-dependecies
  • no-dist
  • no-dist-gzip
  • no-exeext
  • no-installman
  • nostdinc
  • no-texinfo.tex
  • readme-alpha
  • std-options
  • subdir-objects
  • tar-v7
  • tar-ustar
  • tar-pax
  • -W
  • -warnings=

对于AC_CONFIG_FILES

表明我们需要产生哪些makefile,例如

AC_CONFIG_FILES=([Makefile src/Makefile])

Makefile.am

Makefile.am通过autoconf命令会产生Makefile.in文件,这是automake产生config的必要文件

Makefile.am中有两条隐晦规则

  • 定义在Makefile.am文件中的变量,在生成的Makefile.in文件中处于顶部,在autoMake命令自动产生的变量后;
  • 定义在Makefile.am文件中的规则,在生成的Makefile.in文件中处于底部,在autoMake命令自动产生的规则后;
SUBDIR = src 

此语句告诉automake四件事

  1. 不止一个子目录包含Makefile.am文件需要处理
  2. 这些被空格分割的目录需要被按顺序处理
  3. 这些目录中的生成目标需要被递归处理
  4. 这些目录将会被当作项目的一部分
bin_PROGRAMS = TemplateLearn
TemplateLearn_SOURCES = Template.cpp

bin_PROGRAMS = TemplateLearn : 它说明了该Makefile.am的主要目标,通过PROGRAM可知,是个可执行程序,在1.10版本的automake还定义了如下目标:

  • PROGRAMS
  • LIBRARIES
  • LISP
  • PYTHON
  • JAVA
  • SCRIPTS
  • DATA
  • HEADERS
  • MANS
  • TEXINFOS

Prefixs

prefixs引出一系列的目录

  • bindir
  • sbindir
  • libexecdir
  • datarootdir
  • datadir
  • sysconfdir
  • sharedstatedir
  • localstatedir
  • includedir
  • oldincludedir
  • docdir
  • infodir
  • htmldir
  • dvidir
  • pdfdir
  • psdir
  • libdir
  • lispdir
  • localdir
  • mandir
  • manNdir

这些目录变量都会随着prefixs的变化而变化

还有另外3个pkg版本的libdir,includedir,datadir,请自行查阅使用方法

如果以上的安装目录还不够使用,automake提供了机制可以自行定义;在我们的Makefile.am文件中所有以dir结尾的变量,都会被默认为一个有效的安装路径。例如,我们想着data目录下安装一些xml文件,可以如下实现:

xmldir = $(datadir)/xml
xml_DATA = file1.xml file2.xml

还有一些由特殊意义的前缀,和安装路径没有关系

  • check

      表示该程序只是用于test,不会被安装.如果用户不使用`make check`则该程序不会被编译
    
  • noinst

      该前缀表示该程序会被编译,不会被安装;一般用于编译中间产物,比如一些静态库
    
  • EXTRA

      该前缀表明该程序会以传统的方式编译
    

超级前缀

一些程序(primary)允许超级前缀,来指明不同的行为

  • dist

      当执行make dist时,该程序或文件会被包含在压缩包中,一般被用来修饰哪些一般不会被包含在压缩包中的文件
    
  • nodist
  • nobase

例如

dist_Template_SOURCES = file1.c file2.c
nodist_Template_SOURCES = file3.c file4.c
nobase_dist_include_HEADERS = \
	header/Template.h

Template.h会被安装在/usr(/local)/include

Produce sources

src/Makefile.am的第二行是Template_SOURCES = Template.cpp,该变量罗列了编译Template.cpp所涉及到的源文件

有时会使用EXTRA前缀,它可以指定额外的可能被使用的源文件,编译时是否使用由AC_SUBST变量控制

EXTRA_Template_SOURCES = possibly.c