老白学编程- “autotools” 的碎片记忆

我怕爱的太早我们不能终老 提交于 2020-04-06 02:56:16

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

  1. AC_PREREQ 宏声明本文要求的 autoconf 版本
  2. AC_INIT 宏用来定义软件的名称、版本等信息、作者的E-mail等
  3. AC_CONFIG_SCRDIR 宏用来侦测所指定的源码文件是否存在, 来确定源码目录的有效性
  4. AC_CONFIG_HEADER 宏用于生成config.h文件,以便 autoheader 命令使用。
  5. AC_PROG_CC 指定编译器。
  6. 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:

  1. configure.ac
  2. aclocal.m4
  3. acsite.m4

autoheader

使用 autoheader 命令生成 config.h.in 文件。

M4

m4是一个通用的宏处理器,是POSIX标准中的一部分。 感觉也就autotool用,别的地方没咋见过,先放过。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!