autoconf 和automake使用示例

本文详细解析了mde-1.3.0项目中的configure.in文件,介绍了如何利用autoconf和automake宏处理系统类型、编译器检测、Makefile规则等内容。通过AC_PREREQ、AC_INIT、AC_CANONICAL_SYSTEM等宏,实现configure脚本的自动生成,以适应不同的编译需求,如交叉编译和条件编译。同时,讲解了Makefile.am的编写规则,包括可执行文件、静态库、头文件和数据文件的构建,并给出了子目录的构建处理。最后,指导读者如何执行autogen.sh、automake、autoconf等相关命令,生成满足交叉编译需求的Makefile文件。
摘要由CSDN通过智能技术生成

对 mde-1.3.0 中的 configure.in 进行解读

dnl Process this file with autoconf to produce a configure script.
/* dnl 是注释的开头 */
AC_PREREQ(2.13)
/* AC_PREREQ宏声明本文件要求的autoconf版本 */
AC_INIT(mginit/mginit.c)
/* configure.in文件必须在开始所有工作之前调用AC_INIT宏,并且在结束所有工作后调用AC_OUTPUT宏。
而事实上,也只有这两个宏是configure.in文件所必须的。AC_INIT语法如下:
  AC_INIT(unique_file_in_source_dir)
unique_file_in_source_dir是在源代码目录下的一个文件,对AC_INIT的调用在所产生的配置脚本文件
中生成一条shell命令,通过检查unique_file_source_dir是否存在来验证当前目录是否正确。 */

dnl ========================================================================
dnl needed for cross-compiling
AC_CANONICAL_SYSTEM
/* 检测系统类型并把输出变量设置成规范的系统类型,在调用了AC_CANONICAL_SYSTEM之后,下列输出变量包含了系统类型信息。
build,host,target 于是可以在configure 命令行通过 --host=arm_linux 来设置交叉编译
build就是您正在使用的机器,host就是您编译好的程式能够运行的平台,target就是您编译的程式能够处理的平台.这个build和host比较好理解,但是target就不好办了,到底什么意思呢?一般来说,我们平时所说的交差编译用不到他target的,比如./configure --build=i386-linux,--host=arm-linux就能够了, 在386的平台上编译能够运行在arm板的程式.但是,一般我们都是编译程式,而不是编译工具,假如我们编译工具,比如gcc,这个target就有用了.假如我们需要在一个我们的机器上为arm研发板编译一个能够处理mips程式的gcc,那么target就是mips了 */
dnl ========================================================================
dnl Checks for programs.
AC_PROG_MAKE_SET
/* 如果你在子目录中运行make,你应该通过使用make变量MAKE来运行它。 make的大部分版本把MAKE设置成make的程序名以及它所需要的任何选项。(但许多版本并没有把在命令行中设定的变量的值包括进来,因此它们没有被自动地传递。)一些老版本的 make并不设定这个变量。以下的宏使你可以在这些版本上使用它。
宏: AC_PROG_MAKE_SET
如果make预定义了变量MAKE,把输出变量SET_MAKE定义为空。否则,把 SET_MAKE定义成`MAKE=make'。为SET_MAKE调用AC_SUBST。
为了使用这个宏,在每个其他的、运行MAKE的目录中的`Makefile.in'添加一行:
@SET_MAKE@  */

AC_PROG_CC
/* 检查系统可用的C编译器,若源代码是用C写的就需要这个宏。*/

AM_INIT_AUTOMAKE(mde,1.3.0)
/* AM_INIT_AUTOMAKE(PACKAGE,VERSION) 
这个是使用 Automake 所必备的宏,PACKAGE 是所要产生软件套件的名称,VERSION 是版本编号。
make dist 
将程序和相关的文档包装为一个压缩文档以供发布 (distribution) 。执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz 为名称的文件。PACKAGE 和 VERSION 这两个参数是根据 configure.in 文件中 AM_INIT_AUTOMAKE(PACKAGE, VERSION) 的定义。*/

dnl ========================================================================
dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
/* 如果C编译器不能完全支持关键字const,就把const定义成空。有些编译器并不定义 __STDC__,但支持const;有些编译器定义__STDC__,但不能完全支持 const。程序可以假定所有C编译器都支持const,并直接使用它;对于那些不能完全支持const的编译器,`Makefile'或者配置头文件将把const定义为空。*/

dnl ========================================================================
dnl Checks for header files.
AC_HEADER_STDC
/* 如果含有标准C(ANSI C)头文件,就定义STDC_HEADERS。特别地,本宏检查'stdlib.h'、'stdarg.h'、'string.h'和 'float.h';如果系统含有这些头文件,它可能也含有其他的标准C头文件。本宏还检查'string.h'是否定义了memchr (并据此对其他mem函数做出假定),'stdlib.h'是否定义了free(并据此对malloc和其他相关函数做出假定),以及'ctype.h' 宏是否按照标准C的要求而可以用于被设置了高位的字符。*/
AC_HEADER_SYS_WAIT
AC_HEADER_TIME
AC_CHECK_HEADERS(sys/time.h unistd.h)

dnl ========================================================================
dnl check for libminigui
have_libminigui="no"
AC_CHECK_HEADERS(minigui/common.h, have_libminigui=yes, foo=bar)
/*
AC_CHECK_HEADERS (header-file..., [action-if-found], [action-if-not-found])
If the system header file header-file is usable, execute shell commands action-if-found, otherwise execute action-if-not-found.
*/
dnl ========================================================================
dnl check for lite or threads version of MiniGUI
lite_version="no"
AC_CHECK_DECLS(_LITE_VERSION, lite_version="yes", foo=bar, [#include <minigui/common.h>])
/* AC_CHECK_DECLS (symbols, [action-if-found], [action-if-not-found], [includes = default-includes])  Macro
For each of the symbols (comma-separated list), define HAVE_DECL_symbol (in all capitals) to 1 if symbol is declared, otherwise to 0. If action-if-not-found is given, it is additional shell code to execute when one of the function declarations is needed, otherwise action-if-found is executed.  */
dnl ========================================================================
dnl check for StandAlone version of MiniGUI-Lite
stand_alone="no"
AC_CHECK_DECLS(_STAND_ALONE, stand_alone="yes", foo=bar, [#include <minigui/common.h>])

dnl ========================================================================
dnl check for newgal or oldgal interface.
use_newgal="no"
AC_CHECK_DECLS(_USE_NEWGAL, use_newgal="yes", foo=bar, [#include <minigui/common.h>])

dnl ========================================================================
dnl Write Output

if test "$ac_cv_prog_gcc" = "yes"; then
    CFLAGS="$CFLAGS -Wall -Wstrict-prototypes -pipe"
fi

if test "x$lite_version" = "xyes"; then
    LIBS="$LIBS -lminigui"
else
    CFLAGS="$CFLAGS -D_REENTRANT"
    LIBS="$LIBS -lpthread -lminigui"
fi

AM_CONDITIONAL(LITE_VERSION, test "x$lite_version" = "xyes")
AM_CONDITIONAL(STAND_ALONE, test "x$stand_alone" = "xyes")
AM_CONDITIONAL(USE_NEWGAL, test "x$use_newgal" = "xyes")
/* 宏AM_CONDITIONAL 接受两个参数。
ARG1: the name of a conditional ,
ARG2: a shell statement that is used to determine whether the conditional should be true or false.
该宏定义的 conditional 可以在 Makefile.am 中使用.
 */
AC_OUTPUT(
Makefile
notebook/Makefile
notebook/res/Makefile
tools/Makefile
same/Makefile
same/res/Makefile
bomb/Makefile
bomb/res/Makefile
russia/Makefile
housekeeper/Makefile
housekeeper/res/Makefile
controlpanel/Makefile
controlpanel/res/Makefile
vacs/Makefile
vacs/res/Makefile
gdidemo/Makefile
gdidemo/res/Makefile
fontdemo/Makefile
dlgdemo/Makefile
ctrldemo/Makefile
ctrldemo/res/Makefile
picview/Makefile
picview/res/Makefile
painter/Makefile
mginit/Makefile
mginit/res/Makefile
)

if test "x$have_libminigui" != "xyes"; then
 AC_MSG_WARN([
  MiniGUI is not properly installed on the system. You need MiniGUI-Lite Ver 1.2.6 or later for building this package. Please configure and install MiniGUI-Lite Ver 1.2.6 first.
 ])
fi

/* 在标准错误输出中打印消息 */


Makefile.am是一种比Makefile更高层次的规则。只需指定要生成什么目标,他由什么源文档生成,要安装到什么目录等构成。
下表列出了可执行文档、静态库、头文档和数据文档,四种书写Makefile.am文档个一般格式。
    文件类型   书写格式
可执行文件  bin_PROGRAMS = foo
   foo_SOURCES = xxxx.c
   foo_LDADD =
   foo_LDLFAGS =
静态库   lib_LIBRARIES = libfoo.a
   foo_a_SOURCES =
   foo_a_LDADD =
   foo_a_LIBADD =
头文件   include_HEADERS = foo.h
数据文件  data_DATA = data1 data2

对于可执行文档和静态库类型,假如只想编译,不想安装到系统中,能够用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。


对 mde-1.3.0/Makefile.am 文件的分析

COMMON_SUBDIRS = notebook tools bomb housekeeper same russia controlpanel vacs /
          fontdemo dlgdemo ctrldemo picview

if LITE_VERSION
if STAND_ALONE
LITE_SUBDIRS=
else
LITE_SUBDIRS=mginit
endif
else
LITE_SUBDIRS=
endif

if USE_NEWGAL
NEWGAL_SUBDIRS=gdidemo painter
else
NEWGAL_SUBDIRS=
endif

DIST_SUBDIRS = $(COMMON_SUBDIRS) gdidemo painter mginit
SUBDIRS = $(COMMON_SUBDIRS) $(LITE_SUBDIRS) $(NEWGAL_SUBDIRS)
/* 在处理本目录前需要递归处理的子目录 */
EXTRA_DIST = autogen.sh Version
/* 用make dist 打包时加入EXTRA_DIST定义的文件 */


对 mde-1.3.0/mginit/Makefile.am 分析
SUBDIRS=res

EXTRA_DIST=mginit.rc

noinst_PROGRAMS=mginit

mginit_SOURCES=mginit.c taskbar.c taskbar.h

mginit_LDADD=-lmgext /* 把-lmgext添加到连接行中 */

具体的请参考 autoconf 和 automake 的手册。

 

aclocal
automake --add-missing
autoconf
./configure --prefix=/usr/local/arm/2.95.3/ --host=arm-linux 来配置交叉编译选项
运行以上即可生成满足需要的Makefile文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值