简介
向来都是自己手码makefile,自我感觉还是挺方便的,应该是跨平台开发还是比较少,学习automake主要还是因为最近使用开源软件编译安装过程出现问题,发现自己的makefile真有点落伍了,还是得跟上社区大神们的步伐,不进则退.
configure.ac
configure.ac是Automake的必备文件,其中我们需要手动修改,添加一部分宏定义,一般来说为AM_INIT_AUTOMAKE
及AC_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
命令自动产生的规则后;
此语句告诉automake四件事
- 不止一个子目录包含
Makefile.am
文件需要处理 - 这些被空格分割的目录需要被按顺序处理
- 这些目录中的生成目标需要被递归处理
- 这些目录将会被当作项目的一部分
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文件,可以如下实现:
还有一些由特殊意义的前缀,和安装路径没有关系
-
check
表示该程序只是用于test,不会被安装.如果用户不使用`make check`则该程序不会被编译
-
noinst
该前缀表示该程序会被编译,不会被安装;一般用于编译中间产物,比如一些静态库
-
EXTRA
该前缀表明该程序会以传统的方式编译
超级前缀
一些程序(primary)允许超级前缀,来指明不同的行为
-
dist
当执行make dist时,该程序或文件会被包含在压缩包中,一般被用来修饰哪些一般不会被包含在压缩包中的文件
- nodist
- nobase
例如
则Template.h
会被安装在/usr(/local)/include
中
Produce sources
在src/Makefile.am
的第二行是Template_SOURCES = Template.cpp
,该变量罗列了编译Template.cpp
所涉及到的源文件
有时会使用EXTRA
前缀,它可以指定额外的可能被使用的源文件,编译时是否使用由AC_SUBST
变量控制