对 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文件。