简单autoconf 工程的编写

首先,系统中应该安装automake,autoconf,及libtool工具,autoconf功能极大的简化了多源码的工作量

系统中除了源码应该存在三个基本的文件autogen.sh configure.ac makefile.am

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

AC_PREREQ([2.68])
m4_define([pkgmgr_major_version], [0])
m4_define([pkgmgr_minor_version], [8])
m4_define([pkgmgr_micro_version], [0])
m4_define([pkgmgr_version],
          [pkgmgr_major_version.pkgmgr_minor_version.pkgmgr_micro_version])

AC_CONFIG_SRCDIR([install.c])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])
AC_INIT([pkgmgr],
        [pkgmgr_version],
        [http://www.neusoft.com/],
        [pkgmgr],
        [http://www.neusoft.com/])

AC_SUBST([PKGMGR_VERSION_MAJOR], [pkgmgr_major_version])
AC_SUBST([PKGMGR_VERSION_MINOR], [pkgmgr_minor_version])
AC_SUBST([PKGMGR_VERSION_MICRO], [pkgmgr_micro_version])
AC_SUBST([PKGMGR_VERSION], [pkgmgr_version])
# Checks for programs.
AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-bzip2 subdir-objects])

AM_SILENT_RULES([yes])

AC_PROG_CC
AC_PROG_INSTALL

LT_PREREQ([2.2.6])
LT_INIT
PKG_CHECK_MODULES( LIBXML2,         [libxml-2.0] )
PKG_CHECK_MODULES( OPENSSL,         [openssl] )
PKG_CHECK_MODULES( LIBPKGMGR,        [libpkgmgr] )
PKG_CHECK_MODULES( LIBPMINFO,        [libpminfo] )

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

其中,AC_PREREQ是为了检查autoconf的版本,如果autoconf的版本小于所定义的版本,那么会在标准输出输出一个错误信息
AC_CONFIG_SRCDIR来检查源文件来确定所在目录包含这个文件,这只是一种安全监测
AC_CONFIG_HEADERS 会生成一个头文件,此头文件中包含了AC_INIT 和AC_SUBST所定义的宏
AC_INIT 定义了程序的名称、版本、和错误报告地址,一般情况下BUG-REPORT-ADDRESS可以省略,用户可以根据自己的要求进行定制  
AC_SUBST输出一个变量到由configure生成的文件中。具体内容将在后面说明。
AC_OUTPUT列出由configure脚本创建的文件。这些文件都是由带.in后缀的同名文件生成的。例如,src/Makefile是由src/Makefile.in生成的,config.h是由config.h.in生成的。在执行AC_OUTPUT宏时,configure脚本处理包含有两个@符号标志的变量(例如@PACKAGE@)的文件。只有用AC_SUBST输出了变量,它才能识别这些变量(许多在上面讨论过的预先写好的宏都用AC_SUBST定义变量)。
AM_INIT_AUTOMAKE初始化automake。传到这个宏里的参数是要编译的应用程序的名称和版本号(这些参数成为config.h中定义的PACKAGE和VERSION值)。
AM_SILENT_RULES  简而言之编译的时候只输出重要的log,看起来更简洁
AC_PROG_CC 设置默认C编译器
AC_PROG_INSTALL 设置安装的位置,比如make DESTDIR=${SDKTARGETSYSROOT} install
LT_PREREQ 定义libtool工具的版本
LT_INIT 对libtool初始化
PKG_CHECK_MODULES 检测系统 中pkgconfig是否存在指定的.pc文件,如果存在则设置成第一个参数进行代替,同时,可以在Makefile.am中使用
AC_CONFIG_FILES 用来将后缀名为.in的文件生成去掉.in的文件
AC_OUTPUT  生成config.status 并且启动它 在configure.ac 中只生成一次


makefile.am 中则应该是

bin_PROGRAMS = \
        registerInstall
COMMON_CFLAGS =                         \
    $(LIBXML2_CFLAGS)                   \
    $(OPENSSL_CFLAGS)

COMMON_LIBS =                           \
    $(LIBXML2_LIBS)                     \
    $(OPENSSL_LIBS)
registerInstall_SOURCES = install.c cJSON.c  
registerInstall_CFLAGS  = $(DEPENDENCE_MODULES_CFLAGS) $(LIBPKGMGR_CFLAGS) $(LIBPMINFO_CFLAGS)
registerInstall_LDADD   = $(COMMON_LIBS)    $(LIBPKGMGR_LIBS) $(LIBPMINFO_LIBS) 
registerInstallincludedir=$(includedir)/pkgmgr-@PKGMGR_VERSION_MAJOR@
#INCLUDES= -I/home/qiaotsh/target/sysroots/corei7-64-poky-linux/usr/include/pkgmgr-0
bin_PROGRAMS是生成可执行程序的名字
COMMON_CFLAGS 是头文件的编译参数
COMMON_LIBS 是库的编译参数
registerInstall_SOURCES  指定的需要参加编译的源文件
registerInstall_LDADD  指定的所依赖的库

一开始的时候,需要定义一个autogen.sh脚本
#!/bin/sh
autoreconf --verbose --force --install --make || {
    echo "autogen.sh failed";
    exit 1;
}
安装的步骤 则是

./autogen.sh

./configure

make

make install


如果默认想用g++ 来进行编译,需要在configure.ac中添加AC_PROG_CXX ,并且将makefile.am 中关于CFLGAS的都改成CXXFLAGS

//

如果想为代码添加编译开关,需要以下做法

configure.ac

AC_ARG_ENABLE([ev],                                             
              [AS_HELP_STRING([--enable-ev],                    
                              [build for ev(default is no)])],, 
                              enable_ev=no)                     
AM_CONDITIONAL(ENABLE_EV,                                       
               test "x$enable_ev"="xyes")                       

AC_ARG_ENABLE 会在./configure --help时显示出,--enable-ev   build for ev(default is no)

,默认是no,如果指定了--enable_ev,那么enable_ev=yes 成立,则ENABLE_EV会传递到Makefile.am中

Makefile.am

if ENABLE_EV
*_la_CFLAGS += -DUSE_EV

endif

在Makefile.am中判读如果ENABLE_EV被定义,那么会在CFLAGS编译选项中添加-DUSE_EV

则在代码中可以添加#if   USE_EV   #else   #endif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值