2015年7月28日星期二

今天的苏州




2015年7月14日星期二

linux下使用autoconf生成makefile文件 (--with-boost 和 其他第三方库)

准备好代码后, 可按以下步骤自动生成makefile文件

1) autoscan
会生成一个文件configure.scan

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([util/tsuruoka_maxent.h])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC

# Checks for libraries.

# Checks for header files.
AC_CHECK_HEADERS([stdlib.h string.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_CHECK_HEADER_STDBOOL
AC_C_INLINE
AC_TYPE_SIZE_T

# Checks for library functions.
AC_CHECK_FUNCS([pow sqrt strchr strstr])

AC_CONFIG_FILES([util/maxent-3.0/Makefile])
AC_OUTPUT

2) 将configure.scan改为configure.in, 并修改其内容为:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_CONFIG_MACRO_DIR([m4])
AC_PREREQ([2.69])
AC_INIT([de-reorder], [1.0], [****@gmail.com])
AC_CONFIG_SRCDIR([src/de_reorder_model.cpp])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE

# Checks for programs.
AC_PROG_CXX
AC_PROG_AWK
AC_PROG_CC
AC_PROG_CPP
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_MAKE_SET
AC_PROG_RANLIB
AC_PROG_LIBTOOL

# Checks for libraries.
BOOST_REQUIRE([1.44])
BOOST_PROGRAM_OPTIONS
AC_CHECK_HEADER(dlfcn.h,AC_DEFINE(HAVE_DLFCN_H))
AC_CHECK_LIB(dl, dlopen)
AC_CHECK_HEADERS(zlib.h,
    AC_CHECK_LIB(z, gzread,[
        AC_DEFINE(HAVE_ZLIB,[],[Do we have zlib])
        ZLIBS="$ZLIBS -lz"
    ]))

AM_CONDITIONAL([HAVE_RAPIDJSON], false)
AC_ARG_WITH(rapidjson,
            [AC_HELP_STRING([--with-rapidjson=DIR], [(required) path to rapidjson])],
            [with_rapidjson=$withval],
            [with_rapidjson=no]
           )

# Checks for header files.
AC_CHECK_HEADERS([stdlib.h string.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_CHECK_HEADER_STDBOOL
AC_C_INLINE
AC_TYPE_SIZE_T

# Checks for library functions.
AC_CHECK_FUNCS([pow sqrt strchr strstr])

#BOOST_THREADS
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
LDFLAGS="$LDFLAGS $BOOST_PROGRAM_OPTIONS_LDFLAGS"
# $BOOST_THREAD_LDFLAGS"
LIBS="$LIBS $BOOST_PROGRAM_OPTIONS_LIBS $ZLIBS"
# $BOOST_THREAD_LIBS"

AC_CONFIG_FILES([Makefile
                 src/Makefile
                 util/Makefile
                 util/maxent-3.0/Makefile])

AC_OUTPUT

说明:
a) 
AC_CONFIG_MACRO_DIR([m4])
定义宏的文件夹
b) 
AC_INIT([de-reorder], [1.0], [****@gmail.com])
AC_CONFIG_SRCDIR([src/de_reorder_model.cc])
版本信息
主程序的入口文件
c)
AM_INIT_AUTOMAKE
不清楚, 从其他地方复制过来

d)
# Checks for programs.
AC_PROG_CXX
AC_PROG_AWK
AC_PROG_CC
AC_PROG_CPP
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_MAKE_SET
AC_PROG_RANLIB
AC_PROG_LIBTOOL
不是很清楚, 从其他地方复制过来的

e) 
# Checks for libraries.
BOOST_REQUIRE([1.44])
BOOST_PROGRAM_OPTIONS
AC_CHECK_HEADER(dlfcn.h,AC_DEFINE(HAVE_DLFCN_H))
AC_CHECK_LIB(dl, dlopen)
AC_CHECK_HEADERS(zlib.h,
    AC_CHECK_LIB(z, gzread,[
        AC_DEFINE(HAVE_ZLIB,[],[Do we have zlib])
        ZLIBS="$ZLIBS -lz"
    ]))

AM_CONDITIONAL([HAVE_RAPIDJSON], false)
AC_ARG_WITH(rapidjson,
            [AC_HELP_STRING([--with-rapidjson=DIR], [(required) path to rapidjson])],
            [with_rapidjson=$withval],
            [with_rapidjson=no]
           )
利用到的boost版本信息, 其中的宏BOOST_REQUIRE/BOOST_PROGRAM_OPTIONS等会在boost.m4中定义, boost.m4文件可以到网站上下载得到.  *****新建m4文件夹, 并把boost.m4文件拷贝过去*****
由于该代码只用到BOOST_PROGRAM_OPTIONS, 所以这里只列到BOOST_PROGRAM_OPTIONS. 其他的选项还可以是:
BOOST_FILESYSTEM
BOOST_PROGRAM_OPTIONS
BOOST_SYSTEM
BOOST_REGEX
BOOST_SERIALIZATION
BOOST_TEST
BOOST_THREADS

这里还会用到第三方工具rapidjson, 可以通过--with-rapidjson指定其安装路径

f)

#BOOST_THREADS
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
LDFLAGS="$LDFLAGS $BOOST_PROGRAM_OPTIONS_LDFLAGS"
# $BOOST_THREAD_LDFLAGS"
LIBS="$LIBS $BOOST_PROGRAM_OPTIONS_LIBS $ZLIBS"
# $BOOST_THREAD_LIBS"
将boost的路径添加到CPPFLAGS宏. 同时将boost相关的lib添加到LIBS宏.
(也可以将rapidjson按类似的方法将其路径添加到CPPFLAGS中, 或者在相关的Makefile.am中添加也可以, 见下一步骤)

g)
AC_CONFIG_FILES([Makefile
                 src/Makefile
                 util/Makefile
                 util/maxent-3.0/Makefile])
待生成的多个makefile文件, 每个文件夹下均包含一个.

3) 为每个文件夹下准备Makefile.am文件
注意:根据需要,在Makefile.am下包含路径$(RAPIDJSON_CPPFLAGS), 如:
AM_CPPFLAGS = -W -Wall -I$(top_srcdir) -I$(top_srcdir)/util -I$(RAPIDJSON_CPPFLAGS)
如果该文件夹下的文件有使用到rapidjson库. 

4) aclocal


5) autoreconf -ifv
这步会生成configure文件

6)  ./configure --with-rapidjson=/path/to/rapidjson --with-boost=/path/to/boost

7) make