autoscan (autoconf): 扫描源代码以搜寻普通的可移植性问题,比如检查编译器,库,头文件等,生成文件configure.scan,它是configure.ac的一个雏形。
configure.scan
aclocal (automake):根据已经安装的宏,用户定义宏和acinclude.m4文件中的宏将configure.ac文件所需要的宏集中定义到文件 aclocal.m4中。
aclocal.m4
autoheader(autoconf): 根据configure.ac中的某些宏,比如cpp宏定义,运行m4,生成config.h.in
config.h.in
automake: automake将Makefile.am中定义的结构建立Makefile.in,然后configure脚本将生成的Makefile.in文件转换为Makefile。
如果在configure.ac中定义了一些特殊的宏,比如AC_PROG_LIBTOOL,它会调用libtoolize,否则它会自己产生config.guess和config.sub
autoconf:将configure.ac中的宏展开,生成configure脚本。这个过程可能要用到aclocal.m4中定义的宏。
-----------------------------------------------------------------------------------------------------------------------------------------
使用GNU Autotools自动编译项目
工具:
autoscan
aclocal
autoheader
automake
autoconf
手写脚本:
Makefile.am
configure.ac
整体流程
(1)创建src目录,将源码放入src目录中
(2)执行autoscan,生成autoscan.log和configure.scan
(3)更新configure.scan名为configure.ac(或configure.in),手动编辑configure.ac文件
(4)编辑Makefile.am文件
(5)建立autogen.sh文件,将aclocal, autohead, automake, autoconf等命令添加到脚本中
(6)执行autogen.sh
(7)执行生成的configure文件,生成Makefile文件
难点:1、没有说清楚configure.ac编辑到底做什么事情
2、没有说明Makefile.am时生成的还是手动新建的,并且编辑Makefile.am中什么内容,语法格式是什么;
问题:1、执行aclocal没有生成aclocal.m4,只有一个autom4te.cache目录?
因为configure.ac中缺少对AM_INIT_AUTOMAKE宏的引用
-------------------------------------------------------------------
官方文档地址:https://www.gnu.org/software/automake/manual/automake.html
make目录列表:
make all
make install
make install-strip
make uninstall
make clean
make distclean //同时删除configure脚本生成的文件
make check //运行测试套件
make installcheck
make dist //从源码重新生成packge-version.tar.gz文件
标准的目录变量 默认值
prefix /usr/local
exec_prefix ${prefix}
bindir ${exec_prefix}/bin
libdir ${exec_prefix}/lib
includedir ${prefix}/include
datarootdir ${prefix}/share
datadir ${datarootdir}
mandir ${datadir}/man
infodir ${datadir}/info
docdir ${datarootdir}/doc/${PACKAGE}
标准配置变量
CC C编译命令
CFLAGS C编译器选项
CXX C++编译命令
CXXFLAGS C++编译命令选项
LDFLAGS 链接器命令选项
CPPFLAGS C/C++预处理器选项
Makefile.am文件
可执行文件
bin_PROGRAMS=foo
foo_SOURCES=xxx.c
foo_LDADD=
foo_LDFLAGS=
foo_DEPENDENCIES=
静态库
lib_LIBRARIES=libfoo.a
foo_a_SOURCES=
foo_a_LDADD=
foo_a_LIBADD=
foo_a_LDFLAGS=
头文件等,生成文件configure
include_HEADERS=foo.h
数据文件
data_DATA=data1 data2
针对可执行文件和静态库,如果只想编译而不是安装到,使用noinst_PROGRAMS和noinst_LIBRARIES;
全局变量:
INCLUDES: 链接所需要的头文件
LDADD : 链接所需要的库文件
LDFLAGS : 链接所需要的库文件选项标识
EXTRA_DIST
SUBDIRS : 在处理本目录之前要递归处理哪些目录
$(top_srcdir)
$(top_builddir)
编写Makefile.am文件时,尽可能使用相对路径,
案例:
bin_PROGRAMS = hello # 生成的可执行文件名称.
hello_SOURCES = Main.cpp A.h A.cpp B.h B.cpp # 程序依赖的源文件