一、如何通过autotools创建MakeFile?
大家参考例解 autoconf 和 automake 生成 Makefile 文件这篇文章,写的比较完整了,本篇将在此文章基础上搭建一个可以自动安装的工程模板,同时参考了网络上其他一些文章的介绍,特此献丑;该工程模板是在基于ACE快速搭建轻量级应用程序编程框架(第二版)的基础上构建;具体步骤如下:
1) 运行autoscan命令
2) 将configure.scan 文件重命名为configure.in,并修改configure.in文件
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_INIT(ffcs_acceptor_connector, 1.0, huangjf@ffcs.cn)
### AC_CONFIG_SRCDIR宏通过侦测所指定的源码文件是否存在,来确定源码目录的有效性 ###
AC_CONFIG_SRCDIR([src/app_main.h])
### 这个宏是必须的,它描述了我们将要生成的软件包的名字及其版本号 ###
### 当你使用make dist命令时,它会给你生成一个类似[ffcs_acceptor_connector-1.0.tar.gz]的软件发行包,其中就有对应的软件包的名字和版本号 ###
AM_INIT_AUTOMAKE(ffcs_acceptor_connector, 1.0)
### 把缺省的安装前缀设置成prefix,而不是`/usr/local' ###
AC_PREFIX_DEFAULT([`pwd`])
# Checks for build environment
AC_CANONICAL_HOST
# Checks for environment
AC_MSG_CHECKING([existence of ORACLE_HOME variable])
if test -z "$ORACLE_HOME"; then
AC_MSG_RESULT(fail)
AC_MSG_ERROR([ORACLE_HOME not defined, you MUST install ORACLE or set ORACLE_HOME if already installed]);
else
AC_MSG_RESULT(yes)
fi
AC_MSG_CHECKING([existence of ACE_ROOT variable])
if test -z "$ACE_ROOT"; then
AC_MSG_RESULT(fail)
AC_MSG_ERROR([ACE_ROOT not defined, you MUST install ACE or set ACE_ROOT if already installed]);
else
AC_MSG_RESULT(yes)
fi
AC_MSG_CHECKING([existence of POCO_BASE variable])
if test -z "$POCO_BASE"; then
AC_MSG_RESULT(fail)
AC_MSG_ERROR([POCO_BASE not defined, you MUST install POCO C++ library or set POCO_BASE if already installed]);
else
AC_MSG_RESULT(yes)
fi
AC_MSG_CHECKING([existence of SSL_ROOT variable])
if test -z "$SSL_ROOT"; then
AC_MSG_RESULT(fail)
AC_MSG_ERROR([SSL_ROOT not defined, you MUST install OpenSSL library or set SSL_ROOT if already installed]);
else
AC_MSG_RESULT(yes)
fi
# Checks for programs.
AC_PROG_CC
AC_PROG_CPP
AC_PROG_CXX
AC_PROG_CXXCPP
AC_PROG_CC_C_O
AC_PROG_AWK
AC_PROG_INSTALL
# Checks for libraries.
# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([stdlib.h sys/timeb.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_STRUCT_TM
AC_TYPE_SIZE_T
AC_HEADER_STDBOOL
# Checks for library functions.
AC_FUNC_MKTIME
AC_FUNC_ERROR_AT_LINE
AC_CHECK_FUNCS([ftime gettimeofday isascii memset mkdir rmdir strncasecmp strpbrk strtol])
# Substitutions
case "$host" in
*-*-linux*)
AC_SUBST(L_CPPFLAGS, ["-Wall -pipe -fomit-frame-pointer -fmessage-length=0"])
AC_SUBST(L_LDFLAGS, ["-L/usr/local/lib"])
AC_SUBST(L_LIBS, ["-lpthread -lgcc_s -lresolv -lnsl -lrt -ldl -lm -lssl -lcrypto"])
AC_SUBST(HOST_OS, [LINUX])
AC_SUBST(PROC, ["proc"])
AC_SUBST(PROC_CPPFLAGS, ["DEF_SQLCODE=YES parse=none sqlcheck=full threads=yes sys_include=$ORACLE_HOME/precomp/public,/usr/include"])
AC_SUBST(PROC_LDFLAGS, ["-L$ORACLE_HOME/lib"])
AC_SUBST(PROC_LIBS, ["-lclntsh `cat $ORACLE_HOME/lib/sysliblist`"])
;;
*-*-solaris*)
AC_SUBST(L_CPPFLAGS, ["-Wall -pipe -fomit-frame-pointer -fmessage-length=0 -D_REENTRANT -DACE_HAS_TIME_T_LONG_MISMATCH"])
AC_SUBST(L_LDFLAGS, ["-L/usr/local/lib"])
AC_SUBST(L_LIBS, ["-lpthread -lgcc_s -lresolv -lnsl -lrt -ldl -lm -lssl -lcrypto -lposix4"])
AC_SUBST(HOST_OS, [SUNOS])
AC_SUBST(PROC, ["proc"])
AC_SUBST(PROC_CPPFLAGS, ["DEF_SQLCODE=YES parse=none sqlcheck=full threads=yes sys_include=$ORACLE_HOME/precomp/public,/usr/include"])
AC_SUBST(PROC_LDFLAGS, ["-L$ORACLE_HOME/lib"])
AC_SUBST(PROC_LIBS, ["-lclntsh `cat $ORACLE_HOME/lib/sysliblist`"])
;;
*-*-aix*)
AC_SUBST(L_CPPFLAGS, ["-q32 -fomit-frame-pointer -fmessage-length=0 -qnotempinc -qrtti=all -brtl -D_REENTRANT -D_THREAD_SAFE"])
AC_SUBST(L_LDFLAGS, ["-L/usr/vacpp/lib"])
AC_SUBST(L_LIBS, ["-lpthread -ldl -lC_r -lc_r -lm -lssl -lcrypto"])
AC_SUBST(HOST_OS, [AIX])
AC_SUBST(PROC, ["proc"])
AC_SUBST(PROC_CPPFLAGS, ["DEF_SQLCODE=YES parse=none sqlcheck=full threads=yes sys_include=$ORACLE_HOME/precomp/public,/usr/include"])
AC_SUBST(PROC_LDFLAGS, ["-L$ORACLE_HOME/lib32"])
AC_SUBST(PROC_LIBS, ["-lclntsh `cat $ORACLE_HOME/lib32/sysliblist`"])
;;
*-*-hpux*)
AC_SUBST(L_CPPFLAGS, ["-AA +DD32 -DHP_UX -mt -DACE_HAS_THREADS -D__ACE_INLINE__ -D_HPUX_SOURCE -DHPUX_VERS=1131 -I/opt/aCC/include_std -D_REENTRANT -D_THREAD_SAFE"])
AC_SUBST(L_LDFLAGS, ["-L/usr/local/lib"])
AC_SUBST(L_LIBS, ["-lstd_v2 -lssl -lcrypto"])
AC_SUBST(HOST_OS, [HP_UNIX])
AC_SUBST(PROC, ["proc"])
AC_SUBST(PROC_CPPFLAGS, ["DEF_SQLCODE=YES parse=none sqlcheck=full threads=yes sys_include=$ORACLE_HOME/precomp/public,/usr/include"])
AC_SUBST(PROC_LDFLAGS, ["-L$ORACLE_HOME/lib32"])
AC_SUBST(PROC_LIBS, ["-lclntsh `cat $ORACLE_HOME/lib32/sysliblist`"])
;;
# === ================================== ===
*)
AC_MSG_ERROR([Unsupported OS <$host>]);
esac
AC_CONFIG_FILES([Makefile src/proc/Makefile src/Makefile])
AC_OUTPUT
3) 在工程目录下新建Makefile.am文件,并在src和src\proc目录下也新建Makefile.am文件
Makefile.am
## Process this file with automake to produce Makefile.in
MISC = $(top_srcdir)/src/ffcs_db_proc.pc \
$(top_srcdir)/bin/start.sh \
$(top_srcdir)/bin/stop.sh \
$(top_srcdir)/config/config.cfg \
$(top_srcdir)/docs/ReadMe.txt
EXTRA_DIST = $(MISC)
SUBDIRS = src/proc src
### AUTOMAKE_OPTIONS = foreign
Makefile.amsrc\Makefile.am
## Process this file with automake to produce Makefile.in\
srcdir = @srcdir@
VPATH = @srcdir@
AM_CPPFLAGS = @L_CPPFLAGS@ -D@HOST_OS@
AM_LDFLAGS = @L_LDFLAGS@ -L$(SSL_ROOT)/lib -L$(ACE_ROOT)/lib -L$(POCO_BASE)/lib @PROC_LDFLAGS@ @PROC_LIBS@
INC = STL.h \
app_main.h \
ffcs_common.h \
ffcs_logger.h \
ffcs_config.h \
ffcs_db_proc.h \
ffcs_ftp_client.h \
TaskDefined.h
SRC = ffcs_common.cpp \
ffcs_logger.cpp \
ffcs_config.cpp \
ffcs_db_proc.cpp \
ffcs_ftp_client.cpp \
TaskServer.cpp \
TaskClient.cpp \
TaskRecv.cpp \
TaskSend.cpp \
main.cpp
INCLUDES = -I$(SSL_ROOT)/include -I$(ACE_ROOT) -I$(POCO_BASE)/Foundation/include -I$(POCO_BASE)/XML/include -I$(POCO_BASE)/Util/include -I$(POCO_BASE)/Net/include -I$(POCO_BASE)/Zip/include
LDADD = @L_LIBS@ -lACE -lPocoFoundationd -lPocoNetd -lPocoZipd -lPocoXMLd -lPocoUtild
bin_PROGRAMS = ffcs_acceptor_connector
ffcs_acceptor_connector_SOURCES = $(INC) $(SRC)
src\proc\Makefile.am
## Process this file with automake to produce Makefile.in\
PROCC:
$(PROC) $(PROC_CPPFLAGS) iname=$(top_srcdir)/src/ffcs_db_proc.pc code=cpp oname=$(top_srcdir)/src/ffcs_db_proc.cpp
rm -f $(top_srcdir)/src/ffcs_db_proc.lis
dist-hook:
rm -rf `find $(top_srcdir) -name .svn`
all: dist-hook PROCC
然后在工程目录下新建NEWS、 README、 ChangeLog 、AUTHORS、install-sh等文件(也可以从其他工程拷贝一份,当然有些内容需要修改成描述本工程的)
4) 运行aclocal命令
5) 运行autoconf命令
6) 运行automake -a命令
7) 运行./confiugre脚本
8)执行gmake && gmake install编译并安装
也可以将上述步骤写成shell脚本:
build.sh
#!/bin/sh
chmod +x ./bin/start.sh ./bin/stop.sh
aclocal
autoconf
automake -a
./configure
gmake clean
gmake
gmake install
gmake dist
mkdir release
mv *.tar.gz ./release
注:gmake dist命令会生成*.tar.gz文件,该文件可以用于程序的安装;
工程目录如下: