autoscan学习记录
Table of Contents
1 autoscan
1.1 结构
1: ------------- 2: ( autoscan ) 3: ------------- 4: +----------------+ +----------------+ 5: | Source code +--------->+ configure.scan | 6: p +----------------+ +-------+--------+ 7: | 8: | 9: ------- | 10: ( edit )| 11: ------- | ----------- 12: | ( aclocal ) 13: * ----------- 14: +--------------+ +------+------+ +-------------+ 15: | Makefile.am | | configure.in+---------->+ aclocal.m4 | 16: +--------------+ +-------------+ +-------------+ 17: \ / \ / 18: \ ----------- / \ ----------- / 19: \ ( automake ) / \ ( autoconf ) / 20: \ ----------- / \ ----------- / 21: \ / \ / 22: \ / \ / 23: * * * * 24: +--------------+ +--------------+ 25: | Makefile.in | | configure | 26: +--------------+ +--------------+ 27: \ / 28: \ / 29: \ / 30: \ / 31: \ / 32: * * 33: ------------- 34: ( Makefile ) 35: ------------- 36: 37:
1.2 autoscan
autoscan 是用来扫描源代码目录生成configure.scan文件的。autoscan可以用目录名做为参 数,但如果你不使用参数的话,那么autoscan将认为使用的是当前目录。autoscan将扫描你 所指定目录中的源文件,并创建configure.scan文件。
1.2.1 configure.scan
configure.scan包含了系统配置的基本选项,里面都是一些宏定义。我们需要将它改名为 configure.in
生成的configure.scan示例:
1: # -*- Autoconf -*- 2: # Process this file with autoconf to produce a configure script. 3: 4: AC_PREREQ(2.61) 5: AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS) 6: AC_CONFIG_SRCDIR([src/xlayout.h]) 7: AC_CONFIG_HEADER([config.h]) 8: 9: # Checks for programs. 10: AC_PROG_CC 11: 12: # Checks for libraries. 13: 14: # Checks for header files. 15: AC_PATH_X 16: AC_HEADER_STDC 17: AC_CHECK_HEADERS([stdlib.h string.h unistd.h]) 18: 19: # Checks for typedefs, structures, and compiler characteristics. 20: AC_C_CONST 21: 22: # Checks for library functions. 23: 24: AC_CONFIG_FILES([Makefile 25: src/Makefile]) 26: AC_OUTPUT
经修改的configure.in示例:
1: # -*- Autoconf -*- 2: # Process this file with autoconf to produce a configure script. 3: 4: AC_PREREQ(2.61) 5: AC_INIT([xlayout], [0.8], grep@gamil.com) 6: AC_CONFIG_SRCDIR([src/xlayout.h]) 7: AC_CONFIG_HEADER([src/config.h]) 8: AC_CONFIG_FILES([Makefile src/Makefile]) 9: 10: # Checks for programs. 11: AM_INIT_AUTOMAKE([-Wall -Werror foreign]) 12: AC_PROG_CC 13: 14: # Checks for libraries. 15: 16: # Checks for header files. 17: AC_PATH_X 18: AC_HEADER_STDC 19: AC_CHECK_HEADERS([stdlib.h string.h unistd.h]) 20: AC_EGREP_HEADER(ease_multi, ease.h, AC_DEFINE(HAVE_EASE_MULTI, 1, [Define to 1 if you have ease_multi])) 21: 22: # Checks for typedefs, structures, and compiler characteristics. 23: AC_C_CONST 24: 25: # Checks for library functions. 26: AC_CHECK_LIB(ease, ease) 27: AC_CHECK_LIB(X11, XOpenDisplay) 28: AC_CHECK_LIB(Xmu, XmuClientWindow) 29: 30: AC_OUTPUT
1.2.2 aclocal
aclocal是一个perl脚本程序。aclocal根据configure.in文件的内容,自动生成aclocal.m4 文件。 aclocal的定义是:"aclocal - create aclocal.m4 by scanning configure.ac"。
1.2.3 autoconf
autoconf是用来产生configure文件的。configure是一个脚本,它能设置源程序来适应 各种不同的操作系统平台,并且根据不同的系统来产生合适的Makefile,从而可以使你的源 代码能在不同的操作系统平台上被编译出来。
产生了configure.in和aclocal.m4两个宏文件后,我们就可以使用autoconf来产生 configure文件了。
1.2.4 Makefile.am
Makefile.am是用来生成Makefile.in的,需要你手工书写。Makefile.am中定义了一些内 容:
示例:
1: SUBDIRS = src 2: DIST_SUBDIRS = src 3: dist_doc_DATA = README 4: man_MANS = man/xlayout.1 5: EXTRA_DIST = man/xlayout.1 src/xlayout.h
1.2.5 automake
我们使用automake –add-missing来产生Makefile.in。
选项–add-missing的定义是"add missing standard files to package",它会让 automake加入一个标准的软件包所必须的一些文件。
我们用automake产生出来的Makefile.in文件是符合GNU Makefile惯例的,接下来我们只要执 行configure这个shell脚本就可以产生合适的Makefile文件了。
1.2.6 Makefile
在符合GNU Makefiel惯例的Makefile中,包含了一些基本的预先定义的操作:
- make
根据Makefile编译源代码,连接,生成目标文件,可执行文件。
- make clean
清除上次的make命令所产生的object文件(后缀为".o"的文件)及可执行文件。
- make install
将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录。
- make dist
产生发布软件包文件(即distribution package)。这个命令将会将可执行文件及相关文件打 包成一个tar.gz压缩的文件用来作为发布软件的软件包。
它会在当前目录下生成一个名字类似"PACKAGE-VERSION.tar.gz"的文件。PACKAGE和VERSION, 是我们在configure.in中定义的AMINITAUTOMAKE(PACKAGE, VERSION)。
- make distcheck
生成发布软件包并对其进行测试检查,以确定发布包的正确性。这个操作将自动把压缩包文 件解开,然后执行configure命令,并且执行make,来确认编译不出现错误,最后提示你软件 包已经准备好,可以发布了。
- distclean
类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile。