不知为什么,看英文资料总是记不住,看过就忘,还是记下来的好. 所以Linux的中文版无论对谁都是很重要的.
通俗地说:
automake 用于 Makefile.am ->Makefile.in
autoconf 用于 configure.ac ->configure
configure 用于 Makfile.in -> Makefile
注: configure.ac 以前也称 configuer.in,但和 Makefile.in 容易混淆.
autoscan 是个很不错的工具,它自动检查当前目录(或者指定的目录)下的源代码,生成
configure.scan 指出哪些功能是需要检测的. configure.scan 可以作为 configure.ac 的模板.附上 autoscan man page的第一段:
Examine source files in the directory tree rooted at SRCDIR, or the
current directory if none is given. Search the source files for common
portability problems, check for incompleteness of `configure.ac', and create a file `configure.scan' which is a preliminary `configure.ac' for that
package.
automake 与 autoconf 的关系很紧密,理由也很简单, autoconf 生成的configure脚本部分功能是替换 Makefile.in 里的变量以生成 Makefile (按 autoconf 文档的说法是:实例化Makfile.in),configure 可以实例化任何文件,一般都是 .in 后缀的。
以下是 SMTH_BBS 顶层目录里的 configure.ac
AC_INIT(smthbbs, 2.0dev, SYSOP@smth.org)
AM_INIT_AUTOMAKE([foreign dist-bzip2]) //configure.ac里用了 automake 的宏
//automake 根据 Makfile.am 生成 Makefile.in
//要读于 configure.ac ,此处 automake初始化
AC_CANONICAL_TARGET
case "${host}" in
i*86-*-freebsd*)
OSTYPE="FREEBSD"
;;
*-*-solaris*)
OSTYPE="SOLARIS"
LIBS="$LIBS -lnsl -lsocket"
;;
*-*-sunos*)
OSTYPE="SUNOS"
LIBS="$LIBS -lnsl -lsocket"
;;
*-*-linux*)
OSTYPE="LINUX"
;;
*-*-cygwin*)
OSTYPE="CYGWIN"
LIBS="$LIBS -lcygipc"
;;
*)
OSTYPE="GENERIC"
;;
esac
CFLAGS="$CFLAGS -D$OSTYPE"
//确保源代码目录的完整性,通过检查当前目录是否包含 config.h.in
AC_CONFIG_SRCDIR([config.h.in])
//生成 config.h 头文件,其它就是实例化 config.h.in
//运行autoheader 命令会根据此指令生成 config.h.in
AM_CONFIG_HEADER(config.h)
//设定 prefix 的默认值
AC_PREFIX_DEFAULT(/home/bbs)
m4_include(config.icc)
// --enable-innbbsd 参数
AC_ARG_ENABLE(innbbsd,
[ --enable-innbbsd
enable innbbsd support(need innbbsd package)],
[
if test "$enableval" = "yes" ; then
if test -d innbbsd; then
//实例化innbbsd 下的 Makfile.in生成 Makefile,
//并运行 linkinnd.sh转链接。
AC_CONFIG_FILES(innbbsd/Makefile
innbbsd/linkinnd.sh)
BBSSUBDIRS="$BBSSUBDIRS innbbsd"
else
AC_MSG_ERROR([can't find innbbsd package,please get it first!])
fi
fi
])
//--enable-ssh 参数
AC_ARG_ENABLE(ssh,
[ --enable-ssh
enable ssh bbsd support(need sshbbsd package)],
[
if test "$enableval" = "yes" ; then
if test -d sshbbsd; then
//在 sshbbsd 目录下运行 configure 命令
//而不是实例化 Makefile. sshbbsd 有相对的独立性
AC_CONFIG_SUBDIRS(sshbbsd)
BBSSUBDIRS="$BBSSUBDIRS sshbbsd"
else
AC_MSG_ERROR([can't find sshbbsd package,please get it first!])
fi
fi
])
if [ test -z "$enable_www" ]; then
enable_www=yes
fi
//--enable-www
AC_ARG_ENABLE(www,
[ --enable-www
enable web support(need bbs2www package)],
[
if test "$enableval" = "yes" ; then
if test -d bbs2www; then
//实例化 bbs2www目录的Makefile 及 config.m4 文件
AC_CONFIG_FILES([bbs2www/Makefile
bbs2www/lib/Makefile
bbs2www/phplib/Makefile
bbs2www/phplib/config.m4])
BBSSUBDIRS="$BBSSUBDIRS bbs2www"
else
AC_MSG_ERROR([can't find bbs2www package,please get it first!])
fi
CONFIG_HAVE_WWW=1
else
CONFIG_HAVE_WWW=0
fi
])
//替换各 *.in 文件中的 @CONFIG_HAVE_WWW@ 变量
AC_SUBST(CONFIG_HAVE_WWW)
AC_SUBST(BBSSUBDIRS)
m4_include(bbs2www.in)
//一些由 autoscan 自动生成的check
# Checks for header files.
AC_HEADER_DIRENT
AC_HEADER_STDC
AC_HEADER_SYS_WAIT
AC_CHECK_HEADERS([arpa/inet.h fcntl.h limits.h malloc.h netdb.h netinet/in.h sgtty.h stdlib.h string.h sys/file.h sys/ioctl.h sys/param.h sys/socket.h sys/time.h termio.h termios.h unistd.h utime.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STAT
AC_C_CONST
AC_C_INLINE
AC_TYPE_MODE_T
AC_TYPE_OFF_T
AC_TYPE_PID_T
AC_TYPE_SIZE_T
AC_HEADER_TIME
AC_STRUCT_TM
AC_CHECK_TYPES([struct utimbuf],[],[],[#include <utime.h>])
AC_CHECK_SIZEOF(int *)
AC_CHECK_SIZEOF(long long int)
AC_CHECK_SIZEOF(long int)
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(int64)
AC_CHECK_SIZEOF(int32)
# Checks for library functions.
AC_CONFIG_LIBOBJ_DIR(lib)
AC_FUNC_ALLOCA
AC_FUNC_FORK
AC_FUNC_GETLOADAVG
AC_PROG_GCC_TRADITIONAL
AC_FUNC_MALLOC
AC_FUNC_MEMCMP
AC_FUNC_MKTIME
AC_FUNC_MMAP
AC_FUNC_SETPGRP
AC_FUNC_SETVBUF_REVERSED
AC_TYPE_SIGNAL
AC_FUNC_STAT
AC_FUNC_STRFTIME
AC_FUNC_UTIME_NULL
AC_FUNC_VPRINTF
AC_CHECK_FUNCS([alarm atexit bzero dup2 ftruncate getcwd gethostbyaddr gethostbyname gethostname inet_ntoa isascii memchr memset mkdir munmap rmdir select socket strcasecmp strcasestr strchr strdup strerror strncasecmp strpbrk strrchr strstr strtol utime memmem flock inet_aton inet_pton isblank])
AC_CHECK_TYPES(bool)
AC_CHECK_TYPES(sig_t,,,[#include <signal.h>])
dnl Select Error language
//--enable-site
AC_ARG_ENABLE(site,
[ --enable-site=sitename
select site special files (see site dir) ],
[
BBSSITE=$enableval
],[BBSSITE="smth"
SITEDIR=site])
if test -f $srcdir/site/$BBSSITE.c; then
SITEDIR=site
else
if test -f $srcdir/sites/$BBSSITE.c; then
SITEDIR=sites
else
AC_MSG_ERROR([ERROR! Unknown site $BBSSITE, see site/])
fi
fi
//替换各 *.in 文件中的@BBSSITE@ 变量
AC_SUBST(BBSSITE)
# Checks for programs.
AC_PROG_CXX
AC_PROG_AWK
AC_PROG_CC
AC_PROG_LIBTOOL
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_MAKE_SET
AC_PROG_RANLIB
AC_PROG_YACC
m4_include(config.lib)
# Checks for libraries.
//作文件的软链接。当 libBBS 及site目录的源文件链入 src 目录
AC_CONFIG_LINKS(libBBS/site.c:$SITEDIR/$BBSSITE.c
libBBS/site.h:$SITEDIR/$BBSSITE.h
src/site.c:$SITEDIR/$BBSSITE.c
src/site.h:$SITEDIR/$BBSSITE.h
libBBS/default.c:$SITEDIR/default.c
libBBS/default.h:$SITEDIR/default.h
src/default.c:$SITEDIR/default.c
src/default.h:$SITEDIR/default.h
)
cd libBBS; for i in *.[[ch]] ; do
AC_CONFIG_LINKS(src/$i:libBBS/$i)
done
cd ..
ORIGIN_LIBTOOL=$LIBTOOL
AC_SUBST(ORIGIN_LIBTOOL)
AC_SUBST(SED)
abssrcdir=`cd $srcdir && pwd`
LIBTOOL="$abssrcdir/wrapper.sh"
//替换 *.in文件中的 @abssrcdir@ 变量
AC_SUBST(abssrcdir)
//实例化
AC_CONFIG_FILES([Makefile
libBBS/Makefile
libsystem/Makefile
rzsz/Makefile
daemon/Makefile
mail2bbs/Makefile
local_utl/Makefile
service/Makefile
service/pip/Makefile
service/worker/Makefile
service/personaldns/Makefile
src/bbsconfig.h
src/Makefile])
AC_CONFIG_FILES(wrapper.sh, chmod +x wrapper.sh)
AC_OUTPUT