首先,系统中应该安装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