第一代构建工具为 make/Makefile,最广受欢迎的构建工具,是对负责于程序猿好奇心、求知欲和长期发展的一代工具,使用非常灵活,便于项目开发。
第二代为 autotools 系列工具,省时间,但是过于傻瓜化,用后变傻瓜,但是有很多项目在用这个;
第三代为 cmake 等系列工具,里边一堆坑,用后变白痴,但是很流行;
下面示例使用 autotools 来从源代码构建一个由9个小文件组成项目,编译出 app,并运行。
1, 示例源文件
文件树:
源文件内容:
2, 验证示例项目的可构建性
使用第一代构建工具 编译项目:
Makefile:
EXE := appall: $(EXE)SRCS := src/addd.c \src/app.c \src/divi.c \src/mult.c \src/subb.cOBJS := $(SRCS:.c=.c.o)INC := -I./include/%.c.o: %.cgcc -c $< -o $@ $(INC)app: $(OBJS)gcc $(OBJS) -o $@.PHONY: clean
clean:-rm $(OBJS) $(EXE)
make -j
./app
运行效果:
3, 使用 autotools 构建示例项目
步骤1, 执行 autoscan
获得 configure.ac 并且作为项目发布源代码的一部分
可以使用 autoscan 的到 configure.ac 初步形态configure.scan:
在项目源代码的顶层目录执行 autoscan:
$ autoscan
$ ls
通过扫描项目文件,生成了两个文件:
autoscan.log 和 configure.scan
如下图:
步骤2,复制产生 configure.ac
从 configure.scan 中出现的信息,可以发现其信息不足以构建这个项目,先遍需要做两个步骤的事儿:
step1,修改 configure.scan 的文件名 为 configure.ac
$ mv configure.scan configure.ac
step2, 修改新文件 configure.ac 中的内容
原内容如上图,修改成为如下内容:
configure.ac
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.AC_PREREQ([2.71])
AC_INIT([app], [0.0.1], hanmeimei@gmail.com)
AM_INIT_AUTOMAKE([foreign -Wall -Werror subdir-objects])
AC_CONFIG_SRCDIR([src/addd.c])
AC_CONFIG_HEADERS([config.h])
#AC_SUBDIRS([src])
# Checks for programs.
AC_PROG_CC# Checks for libraries.# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
步骤3,执行 aclocal
$ aclocal
生成aclocal.m4 文件:
步骤4:创建 Makefile.am 文件:
bin_PROGRAMS = app
#SUBDIRS = src
app_SOURCES = include/addd.h \include/subb.h \include/mult.h \include/divi.h \src/addd.c \src/subb.c \src/mult.c \src/divi.c \src/app.capp_CPPFLAGS = -I include/
步骤5: 执行 autoheader
$ autoheader
步骤6: 为 automake 命令准备文件
automake 被执行的时候,依赖当前文件夹中的好几个文件,如下touch 产生的文件是其中的一部分,还有一部分,可以在执行 automake 时,指定选项 -a,同 --add-missing,来添加其他几个被依赖的文件
$ touch NEWS README AUTHORS ChangeLog
步骤7: 执行 automake -a
结合 configure.ac 从 Makefile.am 生成 Makefile.in
$ automake -a
效果如下:
步骤8: 执行 autoconf
从 configure.ac 生成 configure 脚本
$ autoconf
效果如下:
步骤9: 执行 configure 脚本
执行 configure 脚本,结合上述其他中间文件,生成最终的 Makefile 文件
$ ./configure
效果如下:
步骤10: 执行 make -j
$ make -j
生成app:
执行 app:
4,总结
上述过程中编辑生成的文件 Makefile.ac 和 configure.ac 会跟项目源代码一起发布,这里仅仅展示了其来龙去脉,这两个文件的功能非常强大;
这个小示例仅使用了 autotools的主体功能,还有很多细节上的功能没有用到,可以结合小示例的主题体悟进一步学习掌握,逐步深入其中涉及到的概念。
使用第二代构建系统的开源项目,其构建过程一般是:
step1: 生成 configure,这需要执行 autoconf
step2: 生成 Makefile,这需要执行./configure
step3: 编译: make -j
step4: 安装: make -j install
如果项目中存在configure,也可以省略第一步。