现在的位置: 首页 > 综合 > 正文

通过autotools创建MakeFile工程模板 基于ACE快速搭建轻量级应用程序编程框架(第二版)

2013年02月01日 ⁄ 综合 ⁄ 共 6149字 ⁄ 字号 评论关闭

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

 工程目录如下:

【上篇】
【下篇】

抱歉!评论已关闭.