Autotools 碎片记忆
大部分程序猿包括我都曾经下载并编译过开源的软件,通常有如下步骤:
1. 下载
2. 解压
3. ./configure
4. make
5. make install
但其实我并不清楚,这套路是什么,这个configure怎么来的,这个install要去哪; 研究了GNU build system,由于年龄太大,整理一下碎片以用来记忆,以后好深入学习。
基本概念
makefile 我刚学习完, 但是如果新建工程,很大很大的那种, 手写make还是比较痛苦的,最好是有工具可以搞定。 对于入门的我来说,一张白纸,只知道autotool和cmake,由于许多GNU的库都是autotools,那就开始研究autotools吧。
GNU build system
背景不多说了,自行阅读。 GNU build system
目标
- 打包,主要是打出可移植的包 定义各种宏变量,通过 #if/#else 在程序中判断,采取不同的套路。
- 统一的编译,自动配置 目前,configure 脚本是GNU package 必带的脚本,他用来探测系统的库,工具,然后生成 config.h ,其中包括了各种 #defines;
makefile 中的 target
通常来说,GNU 的 makefile中,有一些标准的targets
- make all : 与 make 一样
- make install: 安装
- make install-strip: 与install 一样,去掉debug的一些符号
- make uninstall: install 的反向操作
- make clean: 清除make过程中的文件,make的反向操作
- make distclean: 清除 configure 创建的任何文件
- make check: 跑测试
- make installcheck: 检查
- make dist: 打包,通常 PACKAGE-VERSION.tar.gz
标准的目录结构
Directory Variable | Default Value |
---|---|
prefix | /usr/local |
exec-prefix | prefix |
bindir | exec-prefix/bin |
libdir | exec-prefix/lib |
includedir | prefix/include |
datarootdir | prefix/share |
datadir | datarootdir |
mandir | datarootdir/man |
infodir | datarootdir/info |
configuration 变量
变量 | 用途 |
---|---|
CC | C 编译 |
CFLAGS | c 编译的 flags |
CXX | C++ 编译 |
CXXFLAGS | c++ 编译的 flags |
LDFLAGS | 链接flags |
CPPFLAGS | 预处理flags |
系列工具
autotools 不是一个工具,他是一系列工具的集合,
工具 | 用途 |
---|---|
autoconf | Create configure from configure.ac |
autoscan | Create config.h.in from configure.ac |
autoreconf | Run all tools in the right order |
autoscan | Scan sources for common portability problems,and related macros missing from configure.ac. |
autoupdate | Update obsolete macros in configure.ac |
ifnames | Gather identifiers from all#if/#ifdef/... directives |
autom4te | The heart of Autoconf. It drives M4 and implements thefeatures used by most of the above tools. Useful forcreating more than justconfigurefiles. |
automake | Create Makefile.ins fromMakefile.ams andconfigure.ac |
aclocal | Scan configure.ac for uses of third-party macros, and gather definitions in aclocal.m4 |
记住这个图:
Hello world
main 代码
1 #include<config.h>
2 #include<stdio.h>
3 int
4 main (void)
5 {
6 puts ("Hello World");
7 puts ("This is " PACKAGE_STRING ".");
8 return 0;
9 }
confure.ac
这是自动化的起点。 运行autoscan ,生成一个configure.scan 文件, 重命名为configure.ac。 ‘#’ 号开始的行是注释,其他都是m4 宏命令。 configure.ac里面的宏的主要作用是侦测系统。如下:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_CONFIG_SRCDIR([src/main.c])
AC_CONFIG_HEADERS([config.h])
# 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_OUTPUT
- AC_PREREQ 宏声明本文要求的 autoconf 版本
- AC_INIT 宏用来定义软件的名称、版本等信息、作者的E-mail等
- AC_CONFIG_SCRDIR 宏用来侦测所指定的源码文件是否存在, 来确定源码目录的有效性
- AC_CONFIG_HEADER 宏用于生成config.h文件,以便 autoheader 命令使用。
- AC_PROG_CC 指定编译器。
- AM_INIT_AUTOMAKE([foreign -Wall -Werror]) , foreign 可以屏蔽一些GNU的规范
其他的先参考一下GNU的文章。 autoconf
autoreconf
autoreconf --install 这个会添加一些默认的文件。 【待补充】
外部包(foreign)得场合,增加了missing,install-sh, INSTALL
Makefile.am
Makefile.am
SUBDIRS = src
src/Makefile.am
bin_PROGRAMS = amhello
amhello_SOURCES = main.c
PROGRAMS : 编译程序 bin : 程序将安装在 bindir hello : 只有一个程序amhello要创建 amhello_SOURCES: 创建amhello需要编译main.c
autoreconf 可以帮助我们做一坨事,现在我们可以分解一下他都做了啥。
aclocal
使用 aclocal 命令,扫描 configure.ac 文件生成 aclocal.m4文件, 该文件主要处理本地的宏定义,它根据已经安装的宏、用户定义宏和 acinclude.m4 文件中的宏将 configure.ac 文件需要的宏集中定义到文件 aclocal.m4 中。
autoconf
使用 autoconf 命令生成 configure 文件。这个命令将 configure.ac 文件中的宏展开,生成 configure 脚本。这个过程可能要用到aclocal.m4中定义的宏。
input:
- configure.ac
- aclocal.m4
- acsite.m4
autoheader
使用 autoheader 命令生成 config.h.in 文件。
M4
m4是一个通用的宏处理器,是POSIX标准中的一部分。 感觉也就autotool用,别的地方没咋见过,先放过。
来源:oschina
链接:https://my.oschina.net/guopei/blog/3215724