AutoTools使用

合集下载

automake的教程

automake的教程

转一个automake的教程2008年06月24日星期二下午 03:03使用 GNU autotools 改造一个软件项目本文不是一篇规范的教程,而是用一个软件项目作为例子,演示使用 GNU autotools 进行软件管理的思路和过程目录· 示例项目· 软件布局· Makefile 分析· GNU 的软件风格· 准备 autotools· 改造文件布局· autoscan· configure.ac 的基本结构· Makefile 文件的产生· 编写 Makefile.am软件根目录 Makefile.amsrc/Makefile.amdata/Makefile.amdocs/Makefile.amfonts/Makefile.amimages/Makefile.ammusic/Makefile.amsound/Makefile.am· 运行 autotools· SDL 库的侦测· 软件使用的数据文件· configure 选项· autotools 脚本· 使用 configure 产生的 Makefile· 最终的 configure.ac 文件· 结束语示例项目这里借用了 Wei Mingzhi <whistler_wmz@> 开发的麻将游戏来进行演示,在此,先对他表示感谢!示例软件下载:软件布局将下载的软件包解压到一个目录$ cd ~/work$ tar xjf mahjong.tar.bz2可以看到这是一个典型的 Windows 风格的软件项目布局,在 mahjong 目录下放着程序的源码,程序运行时使用的数据文件放在子目录下面作者还提供了一个 Makefile,一个 DOS 风格的 !play.bat 批处理文件,一个编译好的mj.exe 可执行文件在 Win32 平台上运行 !play.bat 就可以直接运行程序在Unix/Linux 系统上,进入 mahjong 目录,键入 make 命令,如果一切顺利的话,将生成 mj 可执行文件,然后在命令行上运行 ./mj 程序,也可以启动麻将游戏对于一个 Windows 程序来讲,该软件布局可以说非常清晰明了但在 Unix/Linux 系统上,执行 make 命令就可能遇到问题:编译找不到头文件,或者连接找不到库文件而在make 成功以后,运行麻将程序必须先进入该 majiong 目录,才能执行程序如果要像其他的程序一样,可以在任意目录使用,就要专门为这一个程序修改 PATH 环境变量,或者再写一个启动脚本,并将它复制到 /usr/bin 这样的目录下Makefile 分析1 #2 # Copyright (c) 2005, Wei Mingzhi. All rights reserved.3 #4 # Use, redistributions and modifications of this file is5 # unrestricted provided the above copyright notice is6 # preserved.7 #89 OBJ = \10 bot.o config.o game.o general.o hand.o ini.o main.o \11 player.o text.o tile.o util.o1213 HEADERS = \14 bot.h game.h general.h hand.h ini.h main.h player.h \15 tile.h1617 CC = gcc18 CXX = g++1920 TARGET = mj2122 BASEFLAGS = -g3 -D_DEBUG=123 #BASEFLAGS = -s -O32425 CFLAGS = ${BASEFLAGS} `sdl-config --cflags`26 LDFLAGS = ${BASEFLAGS} `sdl-config --libs` -lSDL_image -lSDL_mixer -lSDL_ttf2728 all: ${TARGET}2930 ${TARGET}: ${OBJ}31 ${CXX} ${LDFLAGS} -o ${TARGET} ${OBJ}3233 clean:34 rm -f *.o ${TARGET}3536 distclean:37 rm -f *.o ${TARGET}3839 %.o: %.cpp ${HEADERS}40 ${CXX} ${CFLAGS} -c $< -o $@4142 %.o: %.c ${HEADERS}43 ${CC} ${CFLAGS} -c $< -o $@Makefile 很清楚:第 20 行定义 TARGET 变量为 mj,第 28 行表明 make 默认的 target也就是生成 `mj';第 22 行加入编译时的调试信息;第 2526 行使用了sdl-config 工具侦测 SDL 开发库编译链接信息,在 26 行还指明需要连接SDL_imageSDL_mixser 和SDL_ttf 库GNU 的软件风格一个标准的 GNU 软件,编译安装都是使用下面三个步骤:$ ./configure$ make$ make installconfigure 脚本运行时可以侦测系统的环境,确定软件安装目录,然后生成Makefile 文件make 调用系统中的编译器进行编译和连接make install 将软件安装到设定的目录用户执行 configure 时可以通过它的命令行参数指定自己所需的编译选项,比如安装目录通过 --prefix=PREFIX 设置,如果不指定,缺省情况下 PREFIX 是 /usr/local 默认安装时,执行文件安装到 /usr/local/bin 目录,库安装到 /usr/local/lib 目录,数据文件安装到 /usr/local/share 目录由于 GNU 的软件风格方便易用,通用性好,可移植性高,现在大多数 Unix/Linux 系统上的自由软件都采用这种方式分发软件准备 autotoolsGNU autotools 主要包含三个软件: autoconf,automake 和 libtool当前流行的有新旧两个版本,本例采用的是新版本,分别对应的是: autoconf 2.59, automake 1.9.6和 libtool 1.5.18很多 linux 发行版都会默认安装这几个工具本例是在 NetBSD 下进行操作,安装这几个软件包是通过 pkgsrc,它们在 pkgsrc 目录为 devel/autoconfdevel/automake 和devel/libtool改造文件布局原来软件的根目录下面放的是程序的源码,按照 GNU 的习惯,将它们放到 src 子目录,根目录留给 configure 这类文件使用,其他的数据文件保持不变,仍然放在各自的子目录先创建一个目录 majiang,然后根据需要将 mahjong 目录下的文件复制过来由于是为Unix/Linux 系统进行改写,原目录里的 win32 相关文件就不用复制到新目录$ cd ~/work/majiang$ lsdata/ docs/ fonts/ images/ music/ sound/ src/autoscanautoconf 软件包里面的 autoscan 工具可以扫描工作目录,生成一个configure.ac 的模板文件 configure.scan$ cd ~/work/majiang$ autoscanautoscan 命令在当前目录生成的 configure.scan 文件内容为:1 # -*- Autoconf -*-2 # Process this file with autoconf to produce a configure script. 34 AC_PREREQ(2.59)5 AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)6 AC_CONFIG_SRCDIR([src/bot.h])7 AC_CONFIG_HEADER([config.h])89 # Checks for programs.10 AC_PROG_CXX11 AC_PROG_CC1213 # Checks for libraries.1415 # Checks for header files.16 AC_HEADER_STDC17 AC_CHECK_HEADERS([limits.h malloc.h stdlib.h string.h unistd.h])1819 # Checks for typedefs, structures, and compiler characteristics.20 AC_HEADER_STDBOOL21 AC_C_CONST22 AC_C_INLINE2324 # Checks for library functions.25 AC_FUNC_MALLOC26 AC_FUNC_REALLOC27 AC_CHECK_FUNCS([memset strcasecmp strchr strdup])28 AC_OUTPUT# 号开始的行是注释,其他都是 m4 宏命令将它改名为 configure.ac,然后在此基础上进行修改configure.ac 的基本结构configure.ac 文件是 autoconf 的输入文件,经过 autoconf 处理,展开里面的 m4 宏,输出的是 configure 脚本第 4 行声明本文件要求的 autoconf 版本,因为本例使用了新版本 2.59,所以在此注明第 5 行 AC_INIT 宏用来定义软件的名称和版本等信息,本例写成:AC_INIT(majiang, 1.0)这里省略了 BUG-REPORT-ADDRESS 参数,它是可选项,一般写成作者的邮件地址第 6 行 AC_CONFIG_SRCDIR 宏通过侦测所指定的源码文件是否存在,来确定源码目录的有效性可以选择源码目录中的任何一个文件作为代表,比如将 autoscan 选择的bot.h文件改成 main.cpp:AC_CONFIG_SRCDIR([src/main.cpp])宏参数中使用 `[ ]',是为了表明其中的字符串是一个整体第 7 行的 AC_CONFIG_HEADER 宏用于生成 config.h 文件,里面存放configure 脚本侦测到的信息如果程序需要使用其中的定义,就在源码中加入#include <config.h>其他的一些宏是标准的侦测过程,可以保留不动configure.ac 文件要求 AC_INIT 宏必须放在开头位置,AC_OUTPUT 放在文件末,中间用来检测编译环境的各种宏没有特别的先后次序要求,由宏之间相互关系决定Makefile 文件的产生前面 configure.ac 里面的宏,主要作用是侦测系统,并没有编译相关的设置因为这些信息是写在 Makefile.am 里面,然后用 automake 工具转换成 Makefile.in,configure脚本执行时再读取 Makefile.in,并与侦测信息一起写到 Makefile 文件在 autotools 的命名习惯中,后缀 ac 的文件是 autoconf 的输入文件,后缀am 的文件是 automake 的输入文件,后缀 in 的文件是 configure 的输入文件autoconf 旧版本中 configure.in 等同于 configure.ac,虽然新版本也可以识别,但它不符合命名规则,所以新版本的文件应该使用 ac 后缀简单的 Makefile.in 可以手动编写,如果使用 automake 产生,需要在configure.ac里面加入 AM_INIT_AUTOMAKE 宏进行声明要输出 Makefile,还需要在 configure.ac 中使用 AC_CONFIG_FILES 宏指明该宏并不是只处理 Makefile,而是将 FILE.in 文件转换为 FILE 文件因为 make 可以遍历子目录,如果子目录中存在 Makefile,也将同时处理在本例中 src 目录下是源码,其他是数据文件,可以使用单独一个 Makefile 放在根目录下面,也可以用多个Makefile由于每个子目录的 Makefile 只处理本目录的文件,分工明确,是模块化的方法,推荐使用因此在 configure.ac 里面增加下面的宏,表示软件根目录和子目录中都需要生成Makefile 文件:AC_CONFIG_FILES([Makefilesrc/Makefiledata/Makefiledocs/Makefilefonts/Makefileimages/Makefilemusic/Makefilesound/Makefile])编写 Makefile.am软件根目录 Makefile.am由于该目录下面保存的是与 autotools 相关的文件,没有需要编译安装的文件,所以只注明需要进一步处理的子目录信息:SUBDIRS = src data docs fonts images music soundsrc/Makefile.am此目录里是源代码,最终生成 mj 可执行文件,在其 Makefile.am 中写入bin_PROGRAMS = mjmj_SOURCES = bot.h \bot.cpp \config.cpp \game.h \game.cpp \general.h \general.cpp \hand.h \hand.cpp \ini.h \ini.cpp \main.h \main.cpp \player.h \player.cpp \text.cpp \tile.h \tile.cpp \util.cppam 文件里变量通过命名判断其含义,保留的字符串间用下划线分隔bin_PROGRAMS 表示列出二进制的程序,值为多个空格分开的程序列表,这里仅有一个 mjmj_SOURCES 列出的是组成 mj 程序的文件,文件比较多的时候,每个文件写成一行容易看清楚data/Makefile.am本目录的文件是 mj 运行时读取的数据,它的 Makefile.am 可以这样写mjdatadir = $(pkgdatadir)/datamjdata_DATA = mj.ini titles.txtEXTRA_DIST = $(mjdata_DATA)因为 datadir 是保留的关键字,所以用 mjdatadir 代替,pkgdatadir 指向$prefix/share/FULL-PACKAGE-NAME 目录,因为在 AC_INIT 中已经声明FULL-PACKAGE-NAME 为majiang,pkgdatadir 就等于 $prefix/share/majiang 目录其中 mjdatadir 让 data 目录下的文件安装到 $prefix/share/majiang/data 目录里面mjdata_DATA 列出此目录下需要安装的文件,然后用 EXTRA_DIST 变量注明余下几个子目录都与 data 目录类似docs/Makefile.amdocsdir = $(pkgdatadir)/docsdocs_DATA = gkai00mp.txt gpl.html readme.txtEXTRA_DIST = $(docs_DATA)fonts/Makefile.amfontsdir = $(pkgdatadir)/fontsfonts_DATA = brush.ttf gkai00mp.ttfEXTRA_DIST = $(fonts_DATA)images/Makefile.amimagesdir = $(pkgdatadir)/imagesimages_DATA = bgame.jpg \mjgirl1a.jpg \mjgirl2a.jpg \mjgirl3a.jpg \mjgirl4a.jpg \tiles.jpg \electron.jpg \mjgirl1b.jpg \mjgirl2b.jpg \mjgirl3b.jpg \mjgirl4b.jpg \gameover.jpg \mjgirl1c.jpg \mjgirl2c.jpg \mjgirl3c.jpg \mjgirl4c.jpgEXTRA_DIST = $(images_DATA) music/Makefile.ammusicdir = $(pkgdatadir)/music music_DATA = bet.ogg \ bonus.ogg \music.ogg \musicb.ogg \musice.ogg \win.ogg \bgame.ogg \gameover.ogg \music1.ogg \musicc.ogg \musicp.oggEXTRA_DIST = $(music_DATA) sound/Makefile.amsounddir = $(pkgdatadir)/sound sound_DATA = boom.wav \ding.wav \discard.wav \discard2.wav \flash.wav \snd1.wav \snd2.wav \snd3.wav \EXTRA_DIST = $(sound_DATA)运行 autotools准备好 configure.ac 和 Makefile.am,就可以用 autotools 的命令处理这些文件开始可能会出现错误,不过没关系,可以按照错误信息的提示逐步进行修正首先要使用的是 aclocal 命令,它根据 configure.ac 的定义,将需要使用的m4 宏定义复制到 aclocal.m4 里面缺省时,搜索 m4 宏是从 autoconf 的安装目录和系统的aclocal 目录如果需要使用其他路径下的宏,可以通过命令行的 -I 选项指定接着使用 autoheader 命令,它负责生成 config.h.in 文件,这里面的 C 语言宏定义也是通过解析 configure.ac 产生下来运行 automake 命令处理 Makefile.am,生成 Makefile.inGNU 对自己发布的软件有严格的规范,比如必须附带许可证声明文件 COPYING 等等,否则 automake 执行时会报错automake 提供了三种软件等级: foreigngnu 和 gnits,让用户选择采用,默认等级为 gnu本例使用 foreign 等级,它只检测必须的文件有一些必需的脚本文件可以从 automake 软件包里复制过来,在执行时使用 --add-missing 选项可以让automake 自动添加,默认方式是采用符号链接,如加上 --copy 选项则可以使用复制方式本例中,automake 的命令如下:$ automake --foreign --add-missing --copy最后,使用 autoconf 命令生成 configure 脚本文件SDL 库的侦测这个麻将游戏是基于 SDL 库开发的,一般系统默认不会安装,因此 configure 脚本的一个任务就是检查用户的系统中是否有该软件包autoconf 提供了很多宏可以实现侦测功能,但首先应该查看 SDL 软件包是否已应的宏通过 pkgsrc 的工具可以看到:$ pkg_info -L SDL|grep m4/usr/pkg/share/aclocal/sdl.m4即 SDL 软件包提供了一个 sdl.m4 宏,放在系统的 aclocal 目录下在这个宏文件的注释中说明了使用的方法:dnlAM_PATH_SDL([MINIMUM-VERSION,[ACTION-IF-FOUND[,ACTION-IF-NOT-FOUND]]] )dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS也就是说在 configure.ac 里面调用 AM_PATH_SDL 宏,就可以侦测 SDL找到SDL 库以后,该宏还输出 SDL_CFLAGS 和 SDL_LIBS 编译连接选项,它们实际上就是调用`sdl-config --cflags` 和 `sdl-config --libs`于是在 configure.ac 里面加入 AM_PATH_SDL 宏# Checks for libraries.SDL_VERSION=1.2.0AM_PATH_SDL($SDL_VERSION,:,AC_MSG_ERROR([*** SDL version $SDL_VERSION not found!]))当前 SDL 的版本为 1.2.9,于是 MINIMUM-VERSION 就设为 1.2.0如果在系统中侦测到需要的库,没什么额外的操作,假如没有找到,则给出错误信息AM_PATH_SDL 输出 SDL_CFLAGS 和 SDL_LIBS 编译参数,需要添加到src/Makefile.am 里面:mj_CPPFLAGS = @SDL_CFLAGS@mj_LDFLAGS = @SDL_LIBS@用 `@' 包围的变量会在 configure 执行时被替换从 mahjong 的 Makefile 中看到,这个软件还要使用 SDL_imageSDL_mixser 和SDL_ttf 库,但它们不属于 SDL 软件包,需要另外安装由于这些库在 sdl.m4 中也没有进行侦测,所以自己要写一些脚本autotools 提供了一个 AC_CHECK_LIB 宏可以用来检测库,现在就使用它来检测这几个SDL 库该宏的语法为:AC_CHECK_LIB (LIBRARY, FUNCTION, [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], [OTHER-LIBRARIES])第一个参数是库名,第二个参数是库中的一个函数,第三个参数是检测到以后进行的动作,第四个参数是未检测到以后的动作,第五个参数是其他的库对于 SDL_imageSDL_mixer 和 SDL_ttf 对应的使用方法如下:# Check for SDL_image libraryAC_CHECK_LIB(SDL_image, IMG_LoadPNG_RW, , AC_MSG_ERROR([*** Unable to find SDL_image libary with PNG support(/projects/SDL_image/)]), `sdl-config --libs`)# Check for SDL_mixer libraryAC_CHECK_LIB(SDL_mixer, Mix_LoadOGG_RW, , AC_MSG_ERROR([*** Unable to find SDL_mixer libary with OGG support(/projects/SDL_mixer/)]), `sdl-config --libs`)# Check for SDL_ttf libraryAC_CHECK_LIB(SDL_ttf, TTF_OpenFont, , AC_MSG_ERROR([*** Unable to find SDL_ttf libary(/projects/SDL_ttf/)]), `sdl-config --libs`)软件使用的数据文件原来 mj 读取数据是从执行时目录的子目录中读取,但现在将数据放到$prefix/share/majiang 目录下,需要通过一种途径让程序可以知道数据文件被安放的位置要达到这个目的有很多方法,这里采用最直接的一种:将数据文件安装目录变量通过CPPFLAGS 编译参数传递给程序于是修改 src/Makefile.am 的 CPPFLAGS:mj_CPPFLAGS = @SDL_CFLAGS@ -DDATA_DIR=\"${datadir}/majiang\"相应地修改 src 目录下的源码,在读取数据文件的地方,将读取的路径改成DATA_DIR里对应的子目录例如,原先 config.cpp 中是:void LoadCfg(){cfg.Load("data/mj.ini");}现改成:void LoadCfg(){char ini_file[260];sprintf(ini_file, "%s/data/mj.ini", DATA_DIR);cfg.Load(ini_file);}configure 选项原来 mahjong 的 Makefile 第 22 行定义了 debug 调试选项,虽然也可以照样放到 src/Makefile.am 的 CPPFLAGS 里面实现,但 autotools 提供了一种更灵活的机制configure 脚本可以通过选项来设置编译参数,现增加一个 --enable-debug 选项,需要DEBUG 时,在命令行上加上它来打开,默认则关闭这项功能是使用 AC_ARG_ENABLE 宏实现:AC_ARG_ENABLE (FEATURE, HELP-STRING, [ACTION-IF-GIVEN],[ACTION-IF-NOT-GIVEN])其中 FEATURE 是名称,HELP_STRING 为说明信息,在使用 ./configure --help 时可以看到最后两个分别对应打开和关闭时的操作现在将 DEBUG 功能加入 configure.ac:AC_ARG_ENABLE(debug,[ --enable-debug turn on debug],CXXFLAGS="$CXXFLAGS -g3 -D_DEBUG=1")autotools 脚本每次修改了 configure.ac 或 Makefile.am 等 autotools 输入文件后都需要再次运行aclocalautomakeautoconf 这些命令,为了方便起见,可以将他们放到一个shell脚本里面,例如:#! /bin/shset -xaclocalautoheaderautomake --foreign --add-missing --copyautoconf将上面内容保存到 autogen.sh 文件,并修改文件属性为 755每次需要重新生成configure 脚本时,执行 ./autogen.sh 即可使用 configure 产生的 Makefile现在执行 ./autogen.sh 得到的 configure 脚本已经可以正常工作了,进入~/work/majiang 目录,执行 ./configure,可以看到它检查系统的过程,包括 SDL 和SDL_image 等库的侦测结果使用 ./configure --help 可以看到 autotools 提供的帮助信息configure 执行的完毕,输出软件根目录和几个子目录下面的 Makefile 文件这些Makefile 有几个常用的 target:· make all不加任何 target,默认就是 all,作用是编译软件· make install安装软件包,如果安装到系统目录,需要 root 权限· make clean清除编译产生的目标文件· make distclean可以同时清除编译的结果和 configure 输出的文件· make tags生成 etags 使用的 TAGS 文件· make dist生成软件发布包,为 tar.gz 格式的压缩包,文件名由软件包名和版本组成最终的 configure.ac 文件# -*- Autoconf -*-# Process this file with autoconf to produce a configure script.AC_PREREQ(2.59)AC_INIT([majiang], [1.0])AC_CONFIG_SRCDIR([src/main.cpp])AC_CONFIG_HEADER([config.h])AC_CANONICAL_HOSTAC_CANONICAL_TARGETAM_INIT_AUTOMAKE# Checks for programs.AC_PROG_CXXAC_PROG_CCAC_LANG(C++)# Checks for libraries.SDL_VERSION=1.2.0AM_PATH_SDL($SDL_VERSION,:,AC_MSG_ERROR([*** SDL version $SDL_VERSION not found!]))# Check for SDL_image libraryAC_CHECK_LIB(SDL_image, IMG_LoadPNG_RW, , AC_MSG_ERROR([*** Unable to find SDL_image libary with PNG support(/projects/SDL_image/)]), `sdl-config --libs`)# Check for SDL_mixer libraryAC_CHECK_LIB(SDL_mixer, Mix_LoadOGG_RW, , AC_MSG_ERROR([*** Unable to find SDL_mixer libary with OGG support(/projects/SDL_mixer/)]), `sdl-config --libs`)# Check for SDL_ttf libraryAC_CHECK_LIB(SDL_ttf, TTF_OpenFont, , AC_MSG_ERROR([*** Unable to find SDL_ttf libary(/projects/SDL_ttf/)]), `sdl-config --libs`)# Checks for header files.AC_HEADER_STDCAC_CHECK_HEADERS([limits.h malloc.h stdlib.h string.h unistd.h])# Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOLAC_C_CONSTAC_C_INLINE# Checks for library functions.AC_FUNC_MALLOCAC_FUNC_REALLOCAC_CHECK_FUNCS([memset strcasecmp strchr strdup])AC_ARG_ENABLE(debug,[ --enable-debug turn on debug],CXXFLAGS="$CXXFLAGS -g3 -D_DEBUG=1")AC_CONFIG_FILES([Makefilesrc/Makefiledata/Makefiledocs/Makefilefonts/Makefileimages/Makefilemusic/Makefilesound/Makefile])AC_OUTPUT结束语GNU 的很多工具经常给人一种感觉: 功能很强大,但也很难学autotools 可以说是这类工具的一个典型,它需要用户对 shellmake软件编译m4 宏语言,以及Unix/Linux操作系统各方面知识都有一定的了解使用时又要 autoconf automakelibtool 多个工具相互配合^1,如果要给软件增加国际化功能,还要再了解和掌握 gettextpo 等工具和规则与学习其他知识一样,所谓难,其实是不了解,不熟悉本文通过一个范例演示使用autotools 的过程,是让不了解的人熟悉这个工具但真正的理解,还需要将它运用到自己的软件项目当中,不断地实践,不断地思考和总结脚注... 多个工具相互配合^1由于本例软件中没有生成库文件,所以没有涉及 libtool 工具的使用。

autoreconf 源码编译

autoreconf 源码编译

autoreconf 源码编译1. 什么是 autoreconf?autoreconf 是一个用于自动化生成 GNU Autotools 构建系统所需文件的工具。

GNU Autotools 是一套用于自动化构建和配置软件的工具集,包括 Autoconf、Automake 和 Libtool。

使用 autoreconf 可以简化软件的构建过程,减少手动配置的工作量。

2. autoreconf 的作用在编译源码之前,通常需要先进行一系列的配置操作,例如生成 Makefile、检查编译环境等。

而 autoreconf 的作用就是根据项目中的 configure.ac 文件自动生成这些配置文件和脚本,从而简化了整个配置过程。

具体来说,autoreconf 会读取 configure.ac 文件,并根据其中的宏定义和规则生成以下文件:•configure:一个脚本文件,用于检查系统环境和生成 Makefile。

•aclocal.m4:包含所有宏定义的文件。

•Makefile.in:包含 Makefile 的模板。

•config.h.in:包含预处理器常量和宏定义的模板。

•stamp-h.in:在第一次运行 configure 时创建,用于标记是否需要重新生成 config.h。

通过自动生成这些文件,autoreconf 大大简化了软件构建过程中繁琐的手动配置步骤。

3. autoreconf 的使用方法要使用 autoreconf,首先需要确保系统中已经安装了 GNU Autotools 工具集。

在大多数 Linux 发行版中,可以通过包管理器直接安装这些工具。

安装完成后,进入源码目录,在命令行中运行以下命令:autoreconf -i其中,-i参数表示自动运行autoheader、aclocal、automake和autoconf这些工具。

运行 autoreconf 之后,会在当前目录生成 configure 脚本和其他相关文件。

autotools 学习笔记

autotools  学习笔记

autotools 学习笔记1. 样例hello.c#include <stdio.h>main(){printf("hello world!\n");}Makefile.ambin_PROGRAMS=hellohello_SOURCES=hello.cconfigure.inAC_INIT()AM_INIT_AUTOMAKE(hello,1.0)AC_PROG_CCAC_PROG_INSTALLAC_OUTPUT(Makefile)2. 解释需要手动写的文件为Makefile.am和configure.in。

Makefile.am的语言是逻辑性语言,没有详细的执行表述。

仅仅表述了一个关系,通过该关系,执行可以推论出来。

而configer.in的语言是程序性的。

configure.in的每一行都是被执行的命令。

2.1 在configure.in中的命令●AC_INIT初始化configure脚本。

必须用源文件中的一个文件名作为参数。

如何源文件都可以。

●AM_INIT_AUTOMAKE进一步初始化,初始化过程与我们正在使用的automake有关。

如果你手动的写Makef.in 文件,则不需要调用该命令。

用逗号分隔的参数一个是包名,一个是版本号。

●AC_PROG_CC检查哪一个C编译器。

●AC_PROG_INSTALL 检查你的系统是否有一个BSD兼容的安装工具包。

如果没有它使用“install-sh”,如果“install-sh”在你的包的目录根中不存在,automake将安装它。

●AC_OUTPUT讲述配置文件从Makefile.in中产生Makefile2.2 附加的因素⏹如果编译一个库,你的配置文件必须决定如何处理“ranlib”,为此添加AC_PROG_RANLIB命令。

⏹如果你想递归调用在子目录中的makefile文件,配置脚本需要被告知如何去做这个。

你需要添加AC_PROG_MAKE_SET命令。

c语言build的用法

c语言build的用法

C语言build的用法1. 什么是Build在软件开发中,Build(构建)是指将源代码转换为可执行文件或库的过程。

在C语言中,Build通常包括了编译、链接和打包等步骤。

2. 编译过程编译是将源代码转换为机器可执行的中间代码或目标代码的过程。

C语言的编译过程通常分为预处理、编译和汇编三个阶段。

2.1 预处理(Preprocessing)预处理阶段通过预处理器对源文件进行处理,主要完成以下任务:•头文件包含:将#include指令替换为对应头文件的内容。

•宏替换:将宏定义替换为实际的表达式。

•条件编译:根据条件判断指令(如#ifdef、#ifndef)决定是否编译某段代码。

•去除注释:删除注释内容。

预处理后生成一个没有宏定义和条件编译指令,并且已经包含了所有头文件内容的源文件。

2.2 编译(Compiling)编译阶段将预处理后的源文件翻译成汇编语言或机器码。

这个阶段主要完成以下任务:•词法分析:将源代码分解成一个个单独的词法单元。

•语法分析:根据语法规则构建语法树。

•语义分析:检查代码是否符合语言规范,如类型匹配、变量声明等。

•中间代码生成:将源代码转换为中间代码,如LLVM IR(Intermediate Representation)。

2.3 汇编(Assembling)汇编阶段将汇编语言翻译成机器码。

这个阶段主要完成以下任务:•符号解析:将汇编指令中的符号(如函数名、变量名)与其对应的存储地址关联起来。

•生成可重定位目标文件:将汇编指令翻译成机器码,并生成可重定位目标文件(Object File)。

可重定位目标文件包含了机器码和相关的符号信息。

3. 链接过程链接是将多个目标文件和库文件合并成一个可执行文件或库的过程。

C语言的链接过程通常分为静态链接和动态链接两种方式。

3.1 静态链接(Static Linking)静态链接是在Build过程中将所有依赖的目标文件和库文件合并到最终的可执行文件或库中。

华嵌嵌入式课程

华嵌嵌入式课程

华嵌嵌入式就业班课程大纲(新)Linux基础:第1-4周上(周末班)
C语言基础:第1-6周期间学习
(C实验配42课时左右)
数据结构:第5-9 周学习
(数据结构实验配36课时左右)
ARM开发板实验:第6-8周学习
(ARM实验分为前后两部份,18课时在嵌入式基础课前,12课时在
嵌入式基础课终止时期)
嵌入式基础:第9-12周学习
(配ARM实验的第二部份12课时)高级编程:第7-13周学习
Linux内核:第14-16周学习
Linux驱动:第16-18周学习
注:
从十周围开始,按课程安排插入安博的职业素养课(一周课时左右),简历指导课,模拟面试。

从十五周开始推荐就业。

autotools用法简介

autotools用法简介

GNU AUTOTOOLS 简介1.介绍大部分时候,你从网上下载了一个开放源代码的软件,在解压后,你一般会敲入以下三个命令来编译和安装你的程序:1)./configure2)make3)make install其中,configure脚本分析你的系统以找到合适的工具和库,make是真正用来编译构建软件的工具,make install来安装软件。

在开放源代码世界,configure脚本获得了广泛的使用,它使从源代码安装软件变得非常容易,本文主要就是介绍如何使用GNU autotools,以便使你能够以上面这种方式来编译和安装你的程序。

2.什么是GNU autotoolsGNU autotools主要包括下面三个工具:Autoconf –这个工具用来生成configure脚本。

就像前面提到的,这个脚本主要用来分析你的系统以找到合适的工具和库。

譬如:你的系统的C编译器是―cc‖还是―gcc‖?Automake –这个工具用来生成Makefiles。

它需要使用到Autoconf提供的信息。

譬如,如果Autoconf检测到你的系统使用―gcc‖,那Makefile就使用gcc作为C编译器。

反之,如果找到―cc‖,那就使用―cc‖。

Libtools –这个工具创建共享库。

它是平台无关的。

3.为―Hello,world‖添加Autoconf1) 创建一个―Hello,world!‖写一个简单的―Hello,world!‖程序hello.c:#include <stdio.h>int main(void){printf ("Hello World.\n");}写一个简单的MakefileMakefileEXEC:=helloall: $(EXEC).PHONY:cleanclean:rm -f hello *.o2) 添加Autoconf现在,我们将添加autoconf到这个程序。

Check-强大的c语言单元测试框架Autotools的机理和解决过程

Check-强大的c语言单元测试框架Autotools的机理和解决过程

Check —强大的c语言单元测试框架C 语言的单元测试框架,上WikiPedia可以查到很多。

经过一番比较之后,选定check作为c 语言的单元测试框架。

Check 最主要的优点是对于每一个测试用例的运行都fork 一个子进程,这么做的原因是因为 C 语言的独特性:•其它语言如Java,Python,Ruby等,单元测试出错最多不过是抛出异常• C 语言如果指针操作错误,乱指一气,可是会coredump的。

测试框架因此直接退出,用户是看不到任何返回的,只有郁闷的coredump•Check 的单元测试运行在fork 的子进程中,可以避免测试框架由于coredump 而崩溃,优点显而易见但是在Debian 上安装check,示例代码竟然没有办法编译通过,陷入忙等待,显然是陷入了一个死循环。

Debian 上安装check,部署了下列文件(只列出主要文件):将示例拷贝到工作目录,运行,陷入可怕的死循环!CPU 占用100%:我们在运行autoreconf 时间使用了-v 参数,看到发生死循环是在运行aclocal 命令时。

怎么办呢?着急的用户,看这里将configure.ac 中的如下内容修改为:之后再参照README 中的说明执行就可以了:Autotools 的机理和解决过程为什么出错以及为什么这么做就OK 了呢?如果要说清楚,要了解autoconf, automake, aclocal 等,即autotools 的机理。

可以参考王胜的这个博文:《autotools系列工具—-自动生成Makefile》下面是解决过程,其中饶了不少弯路•在遇到这个问题时,首先想到的是生成新的configure.ac 文件,取代示例中的configure.ac 文件•再执行aclocal ,不再死锁,但是也没有任何新文件生成•比较新旧的configure.ac ,发现当注释掉AM_PATH_CHECK() 之后,便不再死锁•AM_PATH_CHECK 是什么呢?我们从check 软件包的部署文件中,我们看到这个文件:/usr/share/aclocal/check.m4•我们打开这个文件(/usr/share/aclocal/check.m4),看到其中只包含了一个宏AM_PATH_CHECK 的宏定义。

autotools

autotools

关于GNU autotools的使用GNU Autotools指的就是下面的五个工具:(1)aclocal(2)autoscan(3)autoconf(4)autoheader(5)automakeAutotools的使用流程第一步:手工编写Makefile.am这个文件第二步:在源代码目录树的最高层运行autoscan。

然后手动修改configure.scan文件,并改名为configure.ac/ configure.in。

第三步:运行aclocal,它会根据configure.ac的内容生成aclocal.m4文件。

第四步:运行autoconf,它根据configure.ac和aclocal.m4的内容生成configure这个配置脚本文件。

第五步:运行automake --add-missing,它根据Makefile.am的内容生成Makefile.in。

第六步:运行configure,它会根据Makefile.in的内容生成Makefile这个文件。

AutoTools 傻瓜入门Makefile固然可以帮助make完成它的使命,但要承认的是,编写Makefile确实不是一件轻松的事,尤其对于一个较大的项目而言更是如此。

那么,有没有一种轻松的手段生成Makefile而同时又能让我们享受make 的优越性呢?本节要讲autotools系列工具正是为此而设的,它只需用户输入简单的目标文件、依赖文件、文件目录等就可以轻松地生成Makefile了,这无疑是广大用户的所希望的。

另外,这些工具还可以完成系统配置信息的收集,从而可以方便地处理各种移植性的问题。

也正是基于此,现在Linux上的软件开发一般都用autotools来制作Makefile。

学习GNU/LINUX开发的编程人员,上手之后不久就会在编译开源软件的时候碰到configure脚本,过段时间还会知道configure脚本是autoconf生成的;但是真正想用起来autoconf,却是要弄明白config.h,configure.in,Makfile.am等一大堆的文件,这可能要花些功夫。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档