一、如何通过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文件,该文件可以用于程序的安装;
工程目录如下: