Autotools笔记

一、安装Autotools

sudo apt install autoconf automake libtool

它们的官方文档可以在GNU官网上找到:

https://www.gnu.org/software/automake/manual/automake.html

https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf.html

https://www.gnu.org/software/libtool/manual/libtool.html

也可以在Linux命令行使用info命令查看,可能还需要安装autoconf-doc。

二、基本配置流程

首先编写Makefile.am,根目录必须有一个Makefile.am,SUBDIRS声明的子目录下面也必须有,下面列出了常见的Makefile.am语法,更多的语法参见GNU官方文档。

SUBDIRS = dir1 dir2             # 子目录,下边也必须有Makefile.am
EXTRA_DIST = file datadir       # 不参与构建但打包时不能丢弃的文件或目录

# DATA、SCRIPTS需要有dist_前缀否则打包时会被丢弃

dist_noinst_DATA = file         # 不安装的数据文件
dist_data_DATA = file           # 安装到/usr/local/share的数据文件
dist_pkgdata_DATA = file        # 安装到/usr/local/share/pkgname的数据文件
dist_somepath_DATA = file       # 安装到somepathdir = /path/to/dir的数据文件

dist_noinst_SCRIPTS = script.sh # 不安装的脚本
dist_bin_SCRIPTS = script.sh    # 安装到/usr/local/bin的脚本

# 公用头文件的声明方法(私有头文件建议声明为_SOURCES)
# 头文件需要声明,否则打包时会被丢弃

noinst_HEADERS = inc.h          # 不安装的公用头文件
include_HEADERS = inc.h         # 安装到/usr/local/include的公用头文件
pkginclude_HEADERS = inc.h      # 安装到/usr/local/include/pkgname的头文件

# 可执行程序的声明方法

bin_PROGRAMS = prog             # 安装到/usr/local/bin的可执行程序
prog_SOURCES = prog.c prog.h    # prog程序的源代码(包括私有头文件)
prog_CFLAGS = -lm               # prog程序的编译选项(C++是CXXFLAGS)
prog_LIBADD = lib1.a            # prog程序依赖的静态库
prog_LDADD = lib2.la lib3.la    # prog程序依赖的链接源(包括动态-静态库)
EXTRA_prog_DEPENDENCIES = greet # prog程序依赖的附加目标(可以是.PHONY目标)

# 静态库的声明方法

noinst_LIBRARIES = lib1.a       # 不安装的静态库
lib1_a_SOURCES = lib1.c

# 动态-静态库的声明方法(需要Libtool)

lib_LTLIBRARIES = lib2.la       # 安装到/usr/local/lib的动态-静态库
lib2_la_SOURCES = lib2.c

pkglib_LTLIBRARIES = lib3.la    # 安装到/usr/local/lib/pkgname的动态-静态库
lib3_la_SOURCES = lib3.c

# Makefile.am本身就是一个Makefile,因此可以直接当作Makefile编写

.PHONY:greet
greet:
<制表符>echo "Hello, world!"

# 自定义安装目录的方法

imagesdir = $(pkgdatadir)/images     # dir后缀的变量表示目标目录
soundsdir = $(pkgdatadir)/sounds
dist_images_DATA = images/vortex.pgm # 作为安装目标时不带dir后缀
dist_sounds_DATA = sounds/whirl.ogg

编写完所有的Makefile.am后,直接使用autoscan生成configure.scan,然后使用nano configure.scan查看并编辑该文件,进行如下编辑,最后使用mv configure.scan configure.ac改名并替换以前的configure.ac。

AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
# 找到上面一行,并按要求填写包名、版本号、邮箱地址
# 如果使用了LTLIBRARIES动态-静态库,添加这一行启用Libtool
LT_INIT
# 添加这一行启用Automake,foreign表示不检查GNU标准的README等文本
AM_INIT_AUTOMAKE([foreign])

最后,使用autoreconf -fi生成configure脚本和其所需文件,-fi是-f和-i的合并写法,-f表示总是重新生成所有文件,-i表示补齐所需支持脚本。

三、如何清理到./configure之前的状态以及如何打包

清理到./configure之前的状态,可以使用make distclean

./configure以后用make dist打包.tar.gz源码包

使用其它格式打包用make dist-bzip2 dist-xz dist-zip等,打包到文件夹用make distdir

自动打包并检查打包是否有误,可以使用make distcheck,比如有可能遗漏某些东西但是看不出来

 

你可能感兴趣的:(Linux,C/C++)