autotools配置makefile
教你如何使用automake生成Makefile文件
教你如何使用automake生成Makefile文件引言总所周知,Makefile主要用来组织源码的编译,其语法在此不再迭述。
经分析可发现,源码的组织结构通常有以下3种形式:①、flat:所有文件都处在同一目录所有源文件、头文件以及相关的库文件都处在当前的目录中,不存在任何子目录。
②、shallow:主要源代码处在顶层目录,其他各部分处在子目录主要源文件在当前目录中,而其它一些实现各部分功能的源文件位于各自不同的目录。
③、deep:所有源代码处在子目录,顶层目录存放配置信息所有源文件及自己写的头文件位于当前目录的一个子目录中,而当前目录里没有任何源文件。
使用automake对以上3种源码组织结构的编译过程在某些细节上存在一些差异,但是大概流程是一致的,如下图所示:图1生成Makefile的过程编译过程2.1flat根据引言中对flat源码结构的描述“所有源文件、头文件以及相关的库文件都处在当前的目录中,不存在任何子目录”可知其目录结构如下图所示:图2flat源码结构目录说明:add.c:实现加法运算int my_add(int a,int b){return(a+b);}sub.c:实现减法运算int my_sub(int a,int b){return(a-b);}mul.c:实现乘法运算int my_mul(int a,int b){return(a*b);}div.c:实现除法运算int my_div(int a,int b){return(a/b);}algo.h:头文件声明源码中实现的函数test.c:在主函数中调用以上源文件实现的函数,并展示运算结果编译步骤:①、执行autoscan在目录中执行autoscan命令,会生成文件configure.scan,再将其重命名为configure.in,最后还需要做如下修改。
#autoscan#mv configure.scan configure.in#vim configure.in修改前:图3configure.scan①、将AC_CONFIG_SRCDIR([sub.c])改为AC_CONFIG_SRCDIR([test.c])注:使用有主函数main()的源文件test.c取代sub.c②、将AC_CONFIG_HEADER([config.h])改为AM_CONFIG_HEADER([config.h])③、新增AM_INIT_AUTOMAKE(math, 1.0):其中math是希望生成的可执行程序的名字,1.0表示版本号④、将AC_OUTPUT改为AC_OUTPUT(Makefile):表示要创建的Makefile名修改后:图4configure.in②、配置Makefile.am在当前目录中新建Makefile.am文件,生成可执行文件math,因此其配置内容为:图5Makefile.am③、新建文件在当前目录下新建文件NEWS、README、ChangeLog、AUTHORS文件,内容为空;#touch NEWS#touch README#touch ChangeLog#touch AUTHORS④、生成configure#aclocal——该命令将以configure.in为输入文件,生成aclocal.m4#autoconf——该命令将以configure.in和aclocal.m4为输入文件,生成文件configure#autoheader⑤、生成Makefile.in#automake-a(该命令将以configure.in和Makefile.am为输入文件,生成文件Makefile.in)⑥、执行./configure配置安装程序,并生成Makefile⑦、编译源码经过以上步骤,已经生成了Makefile,此时只需执行make,便可以编译源码,并生成可执行程序了;⑧、运行结果完成以上所有操作之后,在当前目录下就生成了可执行程序math,其最终的运行结果如下图所示:图6flat结果2.2shallow根据引言中对shallow源码结构的描述“主要源文件在当前目录中,而其它一些实现各部分功能的源文件位于各自不同的目录”可知其目录结构如下图所示:图7shallow源码结构目录说明:add/add.c:实现加法运算int my_add(int a,int b){return(a+b);} sub/sub.c:实现减法运算int my_sub(int a,int b){return(a-b);} mul/mul.c:实现乘法运算int my_mul(int a,int b){return(a*b);} div/div.c:实现除法运算int my_div(int a,int b){return(a/b);} incl/algo.h:头文件声明源码中实现的函数test.c:在主函数中调用以上源文件实现的函数,并展示运算结果编译步骤:①、执行autoscan在目录中执行autoscan命令,会生成文件configure.scan,再将其重命名为configure.in,最后还需要做如下修改。
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 学习笔记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命令。
Autotools使用指南
Autotools使用指南Autotools使用指南一、功能&简介:Linux环境下,我们编译程序啥的都是一般用的GCC&&GDB等等工具,直接使用GCC命令进行编译操作。
这种方式一般是适用于程序文件比较少,组织结构比较简单的情况。
但是,当我们程序文件比较的多的时候,或者是程序文件组织结构比较的复杂(例如在程序文件夹中存在文件夹多层嵌套以及复杂引用等),此时我们如果是直接使用GCC一点一点的编译工作量会非常的大,而且万一程序修改了,还要重新的再工作一遍。
为此,我们有了make工具,依靠Makefile辅助文件,我们可以方便的进行工程的管理,以及编译操作。
当程序很复杂的时候,依靠我们去手工的建立、维护Makefile文件是非常的不现实的,不仅很复杂,而且费时费力,还容易出错。
为此,就有了我们的_Autotools_工具,只要输入工程中的目标文件、依赖文件、文件目录等信息就可以自动生成Makefile。
二、Autotools工具包:Autotools工具包的目标就是去方便的帮助我们得到我们需要的Makefile文件。
___Autotools使用流程:___<1>目录树的最高层运行autoscan,生成configure.scan文件;<2>运行aclocal,生成aclocal.m4文件;<3>运行autoconf,生成configure配置脚本;<4>运行autoheader,生成config.h.in文件;<5>手工编写Makefile.am文件;<6>运行automake,生成Makefile.in;<7>运行配置脚本configure,生成Makefile。
三、c源文件同一目录下Autotools的使用:如果你的源文件都放在同一个目录下面。
可以按照以下步骤来实现同一目录下的Autotools工具的使用:1、编写源代码:2、运行autoscan:第一步:我们需要在我们的<项目目录>下执行autoscan命令。
automake简介
在Linux系统下开发一个较大的项目,完全手动建立Makefile是一件费力而又容易出错的工作。
autotools系列工具只需用户输入简单的目标文件、依赖文件、文件目录等就可以比较轻松地生成Makefile了。
这极大地简化了Makefile的编写和维护,作者也是刚体验到其威力,所以将其过程记录下来。
本文以一个简单的hello.c文件进行验证。
准备工作首先需要安装autotools系列工具,包括aclocal、autoscan、automake、autoheader、autoconf等。
如果在centos或redhat系统下可以通过rpm –qa | grep auto来查看各个应用程序,如果没有,直接yum install automake即可安装。
大致流程view sourceprint?1.autoscan #扫面当前目录、源文件,生成configure.scan文件2.aclocal #根据configure.in生成aclocal.m4文件以及autom4te.cache文件夹3.autoconf #根据configure.in和aclocal.m4来产生configure文件4.autoheader #生成配置头文件的模板config.h.in5.touch README NEWS AUTHORS ChangeLog #生成一些声明性文件6.automake --add-missing #生成Makefiel.in和所需要的脚本view sourceprint?1.make2.make install3.make clean4.make dist #制作发布的软件包5.make distcheck #检验完整性并制作软件包详细步骤1. autoscan将生成configure.scan和autoscan.log文件,它会在给定目录及其子目录树中检查源文件,若没有给定目录,就在当前目录及其子目录树中进行检查。
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到这个程序。
如何自动使用
/***如何自动使用autotool工具自动生成makefile**总结:郭勇军*1)首先生成工程目录及其源码文件目录,并在相应的目录中放置文件**2)运行autoscan, 生成configure.scan文件, 将其改名为configure.ac,*并修改第5行的AC_INT中定义的软件名称和版本号,作者联系方式等等,*在configure.scan里面加入 AM_INIT_AUTOMAKE宏, 自动生成*Makefile.in,*要生成项目工程目录和其它目录下的Makefile文件, 必需加入*AM_CONFIG_FILES的宏:*例如: AC_CONFIG_FILES([Makefile*src/Makefile* data/Makefile* docs/Makefile* sound/Makefile])*3)项目工程目录下的Makefile.am文件*该目录下面保存的是与autotools相关的文件, 仅注明目录文件即可.*SUBDIRS = src doc data ....*4)其它目录的Makefile.am*例如: src/Makefile.am*bin_PROGRAMS = mj* mu_SOURCES = bot.h \*bot.cpp \*main.cpp \*...*data/Makefile.am*mjdatadir = $(pkgdatadir)/data*mjdata_DATA = mj.ini titles.txt*EXTRA_DIST = $(mjdata_DATA)**images/Makefile.am*imagesdir = $(pkgdatadir)/images*images_DATA = bgame.jpg \* mjgirl1a.jpg \* ...* mjgirl4c.jpg*EXTRA_DIST = $(images_DATA)** 5)准备好configure.ac和Makefile.am后就可以准备编写下面的脚本(因为每*次修改了configure.ac和Makefile.am后都要分别重新执行脚本中的代码), 用*脚本执行方便.*#autogen.sh*#! /bin/sh*set-x*aclocal//它根据 configure.ac 的定义,将需要使用的 m4 宏定义复制到*aclocal.m4 里面*autoheader//它负责生成 config.h.in 文件*automake --foreign --add-missing --copy //automake 提供了三种软件等级://foreign、gnu 和 gnits,让用户选择采用,默认等级为 gnu。
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等一大堆的文件,这可能要花些功夫。
Autotools系列工具安装
Autotools系列工具安装过程一、VMware Workstation 环境下文件共享;(1)菜单栏“VM”,选择“Settings”,如下图所示:(2)在出现的对话框中单击“options”,然后单击“shared Folders”,在右侧的侧边栏中选择“Always enabled”,然后单击“add”,出现如下对话框,单击“Next”即可;再单击“Browse…”,选择本地磁盘下需共享的目录;通过共享目录的设置,可在VMware环境下访问本地磁盘,将共享文件夹中的文件拷贝(使用cp命令复制即可)到虚拟环境下的Linux 系统中。
二、autotools系列工具安装,autotools系列工具主要包含了aclocal、autoscan、autoconf、autoheader和automake工具,主要是利用这些工具的脚本文件来生成最后的Makefile文件。
这里主要介绍三种格式的软件包安装方式:.tar.gz、tar和tar.bz2 1、对于tar.gz(tgz)包以tar.gz为扩展名的软件包,是用Tar程序打包并用Gzip程序压缩的软件包。
要安装这种软件包,需要先对软件包进行解压缩,使用“tar -zxfv filename.tar.gz”可以对软件包进行解压缩,解压缩所得的文件在以filename为名的目录中。
进入该目录,可以看到解压缩出来的文件了。
具体步骤如下:(1)先解压tar.gz包,执行tar –zxvf filename.tar.gz命令解压;(2)运行cd命令,进入filename目录下;(3)再依次执行:./configure;./make;./make install;(4)这样就完成以tar.gz为扩展名的软件包;2、对于tar包,安装过程如下:(1)执行tar -xvf filename.tar命令解压。
(2)运行cd命令,进入filename目录下;(3)再依次执行:./configure;./make;./make install;(4)这样就完成tar包的安装;3、对于tar.bz2包以tar.bz2 为扩展名的软件包,是用tar程序打包并用bzip2程序进行压缩的软件包。
自动生成makefile
automake 支持三种目录层次:flat、shallow 和deep。
一个flat 包指的是所有文件都在一个目录中的包。
为这类包提供的Makefile.am 不需要SUBDIRS 这个宏。
这类包的一个例子是termutils。
对应咱们程序员来说:就是所有源文件及自己写的头文件都位于当前目录里面,且没有子目录。
一个deep 包指的是所有的源代码都被储存在子目录中的包;顶层目录主要包含配置信息。
GNU cpio 是这类包的一个很好的例子,GNU tar 也是。
deep 包的顶层Makefile.am 将包括宏SUBDIRS,但没有其它定义需要创建的对象的宏。
对应咱们程序员来说:就是所有源文件及自己写的头文件都位于当前目录的一个子目录里面,而当前目录里没有任何源文件。
一个shallow 包指的是主要的源代码储存在顶层目录中,而各个部分(典型的是库)则储存在子目录中的包。
automake 本身就是这类包(GNU make也是如此,它现在已经不使用automake)。
对应咱们程序员来说:就是主要源文件在当前目录里,而其它一些实现各部分功能的源文件各自位于不同目录。
Flat的示例:工作目录为 hello在hello 目里有 main.c text.c text1.c func_head.h1.运行autoscan命令运行结果:autoscan.log configure.scan func_head.h main.c text1.c text.c 多出两个文件。
2.修改configure.scan的文件名为configure.inAC_INIT(main, 1.0, pgpxc@)AM_INIT_AUTOMAKE(main,1.0)AC_OUTPUT(Makefile)3. 运行aclocal,生成一个“aclocal.m4”文件和一个缓冲文件夹autom4te.cache,该文件主要处理本地的宏定义。
autotool工具的使用方式(简单的例子)
autotool⼯具的使⽤⽅式(简单的例⼦)autotool⼯具的使⽤⽅式(简单的例⼦)autotool是⼀种帮助⽤户⾃动管理项⽬⽣成Makefile的⼯具。
有时候⼿动写Makefile可以满⾜⾃⼰的要求,但是随着项⽬增加,代码结构也变得⾮常复杂,这样⼀来⼿动维护每个Makefile就变得⾮常困难。
autotool的存在帮助降低了项⽬维护的难度。
autotool不是某⼀个⼯具,⽽是⼀系列⼯具的混合体。
autoscanaclocalautoconfautoheaderautomake这⼀系列最终⽬的就是⽣成makefile,进⽽帮助项⽬编译。
Makefile.am的作⽤Makefile.am⽂件是整个autotool⾃动⽣成makefile的灵魂,这其中不需要规定多么复杂的逻辑⽣成关系。
这⾥对这个内容进⾏着重介绍。
终极⽬标automake通过Makefile.am来⽣成Makefile.in。
bin_PROGRAMS(*program-list*) a program or programs build in the local directory that should be compiled, linked and installed.noinst_PROGRAMS(*program-list*) a program or programs build in the local directory that should be compiled, linked but not installed.bin_SCRIPTS(*script-list*) a script or scripts build in the local directory that should be installed.man_MANS(*page-list*)man pages that should be installed.lib_LTLIBRARIES(*lib-list*) a library or libraries that should be built using libtool.命名⽅案automake使⽤统⼀的命名规则,此举可以使⼯具明确需要构建的内容。
autotools上手手册
Autotools 上手指南1——autoconf 基本思想 dccmx 于 2011年 一月 7日 发表 | 最后修改于 2011年 一月 10日 要想弄懂Autotools 并使用它,必须先要了解一下M4这个怪物。
那么何为M4呢,M4的名称取自Macro (M 后面跟4个字母…)。
它和C 预处理器里的宏是一个概念(其实,M4和C 预处理器都K&R 操刀设计的!!),用来处理文本替换。
也就是说,M4是bash 里的预处理器。
取自维基的例子:1 2 3 4 5 6 7 8 9 10 11 12 13 divert(-1) This `divert' discards this text. Note that I had to quote the `divert' in the comment so it wouldn't get undiverted. This starts the count at ONE as the incr is a preincrement. define(`H2_COUNT', 0) The define H2_COUNT is redefined every time the H2 macro is used. The dnl deletes everything on the line after it in the output (ie this bit) define(`H2', `define(`H2_COUNT', incr(H2_COUNT))'dnl `<h2>H2_COUNT. $1</h2>') divert(0)dnl diversion to 0 means back to normal dnl removes this line. H2(First Section) H2(Second Section) H2(Conclusion)这段M4宏用m4处理输出的结果就是:1 2 3 <h2>1. First Section</h2><h2>2. Second Section</h2><h2>3. Conclusion</h2>简单说下:1.M4的语法跟C 里面宏的语法差不多,都很像函数,名字加括号。
autotools使用
使用autotools建立Makefile 对于一个较大的项目而言,完全手动建立Makefile是一件费力而又容易出错的工作。
autotools系列工具只需用户输入简单的目标文件、依赖文件、文件目录等就可以比较轻松地生成Makefile了。
现在Linux上的软件开发一般都是用autotools来制作Makefile。
autotools工具主要有:aclocal、autoscan、autoconf、autoheader、automake。
使用autotools 主要就是利用各个工具的脚本文件来生成最后的Makefile。
下面结合实例来介绍具体的流程。
第一步autoscan使用autoscan在给定目录及其子目录树中检查源文件,如果没有给出目录,就在当前目录及其子目录树中进行检查。
最终生成两个文件:configure.scan、autoscan.log[armlinux@lqm autotools-easy]$ tree.|-- main.c|-- mytool1.c|-- mytool1.h|-- mytool2.c`-- mytool2.h0 directories, 5 files执行命令:# autoscan[armlinux@lqm autotools-easy]$ tree.|-- autoscan.log|-- configure.scan|-- main.c|-- mytool1.c|-- mytool1.h|-- mytool2.c`-- mytool2.h0 directories, 7 files其中,configure.scan是configure.in的原型文件。
而configure.in是autoconf的脚本配置文件。
所以下一步的工作就是要对configure.scan进行修改,将其转化为configure.in。
第二步autoconfconfigure.scan文件内容如下:# -*- Autoconf -*-# Process this file with autoconf to produce a configure script.AC_PREREQ(2.57)AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)AC_CONFIG_SRCDIR([main.c])AC_CONFIG_HEADER([config.h])# Checks for programs.AC_PROG_CC# Checks for libraries.# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.AC_OUTPUT说明:1、以“#”号开始的是行为注释。
嵌入式Linux内核模块的配置与编译
嵌入式Linux内核模块的配置与编译一、简介随着 Linux操作系统在嵌入式领域的快速发展,越来越多的人开始投身到这方面的开发中来。
但是,面对庞大的Linux内核源代码,开发者如何开始自己的开发工作,在完成自己的代码后,该如何编译测试,以及如何将自己的代码编译进内核中,所有的这些问题都直接和Linux的驱动的编译以及Linux的内核配置系统相关。
内核模块是一些在操作系统内核需要时载入和执行的代码,它们扩展了操作系统内核的功能却不需要重新启动系统,在不需要时可以被操作系统卸载,又节约了系统的资源占用。
设备驱动程序模块就是一种内核模块,它们可以用来让操作系统正确识别和使用使用安装在系统上的硬件设备。
Linux内核是由分布在全球的Linux爱好者共同开发的,为了方便开发者修改内核,Linux的内核采用了模块化的内核配置系统,从而保证内核扩展的简单与方便。
本文通过一个简单的示例,首先介绍了如何在Linux下编译出一个内核模块,然后介绍了Linux内核中的配置系统,讲述了如何将一个自定义的模块作为系统源码的一部分编译出新的操作系统,注意,在这里我们介绍的内容均在内核2.6.13.2(也是笔者的开发平台的版本)上编译运行通过,在2.6.*的版本上基本上是可以通用的。
二、单独编译内核模块首先,我们先来写一个最简单的内核模块:#include <linux/module.h>#include <linux/kernel.h>#include <linux/errno.h>#define DRIVER_VERSION "v1.0"#define DRIVER_AUTHOR "RF"#define DRIVER_DESC "just for test"MODULE_AUTHOR(DRIVER_AUTHOR);MODULE_DESCRIPTION(DRIVER_DESC);MODULE_LICENSE("GPL");staticintrfmodule_init(void){printk("hello,world:modele_init");return 0;}static void rfmodule_exit(void){printk("hello,world:modele_exit");}module_init (rfmodule_init);module_exit (rfmodule_exit);这个内核模块除了在载入和卸载的时候打印2条信息之外,没有任何其他功能,不过,对于我们这个编译的例子来讲,已经足够了。
autotool
我们得感谢David MacKenzie,要不是他富有远见地发明Autoconf工具,我们现在还得编写和维护冗长、复杂的configure脚本。
在Automake发明之前,Autoconf是单独被使用的。
有很多遗留下来的开源项目并没有完成转换成基于Autotool工具的形式。
所以如果你看到一个开源项目包含了一个名为configure.in和一个手工的Makefile.in文件,你不应该感到奇怪。
Autoconf工作方式---- configure脚本后面我们将会发现,花点时间去只单独使用Autoconf是大有裨益的。
通过这种方式(不使用Automake等其它Autotool工具)我们可以认清被Automake这些后来的工具所隐藏的Autoconf的操作原理。
Autoconf的输入是shell脚本,这可能会让你大跌眼镜!当然这个输入并不是纯shell脚本。
而是一个包含宏的shell脚本,加上一些宏定义文件。
这些宏定义文件一些来自Autoconf工具本身,一些是你或我(当然也有可能是其它人)编写的。
使用的宏语言叫做M4(名字有点搞笑,它其实表示了Macro,即M后面跟了四个字母,类似的词有i18n,表示internationalization,l10n表示localization)。
M4工具是一个通用宏语言处理器,由Brian Kernighan和Dennis Ritchie 在1977年编写的。
某些形式的M4宏语言处理器在几乎所有的Unix和Linux平台上都支持,这也是为什么Autoconf使用它的原因。
Autoconf设计目的就是要能在所有系统上都可以正常使用,而不需要附加的复杂的工具集。
Autoconf只依赖于很少的一些工具,包括m4,sed,在新的2.26版本上需要awk。
大多数Autotool(Autoconf除外)工具需要用到perl处理器。
注意,不要把Autotool的需求依赖和Autotool生成的脚本以及makefiles的需求依赖混淆在一起。
autotools使用
autotools 使⽤关于Autotools 的使⽤我们前⾯的章节中已经讲到了Makefile 的使⽤()。
我们知道在下⾯如果编译⼀个⽐较⼤型的项⽬,我们可以通过Makefile 的⽅式来完成。
但是,我们⼜蛋疼了,Makefile 拥有复杂的语法结构,甚⾄让⼈难以领会,当我们项⽬⾮常⼤的时候,维护Makefile 会成为⼀件⾮常头疼的事情。
于是我们就有了autotools ⼯具,专门⽤来⽣成Makefile ,这个⼯具让我们很⼤程度的降低了开发的难度。
Autotools 并不是⼀个⼯具,⽽是⼀系列⼯具:1. autoscan2. aclocal3. autoconf4. autoheader5. automake记住,这⼀系列⼯具看着复杂,最终的⽬标还是⽣成Makefile⼀般情况下系统中都会默认安装这⼀系列⼯具,如果未安装,则在Centeros 中可以通过下⾯命令安装:c 源⽂件同⼀⽬录下Autotools 的使⽤如果你的源⽂件都放在同⼀个⽬录下⾯,那么使⽤Autotools 的时候会相对简单很多。
⽐较著名的开源软件Memcache 也是放在同⼀⽬录下的,你可以去看下它的源码包。
下⾯会按照步骤来实现同⼀⽬录下的Autotools ⼯具的使⽤。
1. 源代码例⼦⼊⼝⽂件main.csum.h 和sum.cval.h 和val.cget.h 和get.c上⾯这个例⼦,我们在中已经讲解过如何来⼿⼯编写Makefile 编译。
这边的话我们继续使⽤这个例⼦,实现Autotools 的⼯具编译。
[plain]01. sudo yum install automake[cpp]01.#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include "sum.h" #include "get.h" //⼊⼝主函数 int int int int , z); 02. , z); 03. return }[cpp]01. #include <stdio.h> #include <stdlib.h> #include <unistd.h> intintint *y);[cpp]01. #include "sum.h" #include "val.h" intintint return }[cpp]01. #include <stdio.h> #include <stdlib.h> #include <unistd.h> intint *x);[cpp]01. #include "val.h" intint return }[cpp]01. #include <stdio.h> #include <stdlib.h> #include <unistd.h> intintint *y);[cpp]01. #include "get.h" intintint return }2. Autoscan 命令第⼀步,我们需要在我们的项⽬⽬录下执⾏autoscan 命令。
autotool生成 Makefile 的流程
autotool生成Makefile的流程生成流程1) 运行autoscan命令2) 将configure.scan文件重命名为configure.in,并修改configure.in文件3) 在project目录下新建Makefile.am文件,并在core和shell目录下也新建makefile.am文件4) 在project目录下新建NEWS、README、ChangeLog、AUTHORS文件5) 将/usr/share/automake-1.X/目录下的depcomp和complie文件拷贝到本目录下6) 运行aclocal命令,生成m4宏文件7) 运行autoconf命令,生成configure8) 运行automake -a命令,生成makefile.in9) 运行./configure脚本, 读入makefile.in生成makefile安装autotools工具sudo apt-get install autoconf一,四个代码文件init.slcd.caddr.huart.c二,命令:autoscan三,命令:viconfigure.scan mv configure.conf configure.in-*- Autoconf -*-# Process this file with autoconf to produce a configure script.AC_PREREQ([2.65])AC_INIT(lcd,1.0)AM_INIT_AUTOMAKE(lcd,1.0)AC_CONFIG_SRCDIR([uart.c])AC_CONFIG_HEADERS([config.h])# Checks for programs.AC_PROG_CCAM_PROG_AS# Checks for libraries.# Checks for header files.# Checks for typedefs, structures, and compiler characteristics. # Checks for library functions.AC_CONFIG_FILES([Makefile])AC_OUTPUT四,命令:aclocal五,命令:autoconf六,,命令:autoheader七,vi Makefile.amAUTOMAKE_OPTIONS=foreignbin_PROGRAMS=lcdlcd_SOURCES=init.slcd.cuart.caddr.h八,命令:automake --add-missing九,命令:./configure十,命令:make十一,命令:make dist(打包)。
使用 GNU autotools 改造一个软件项目
使用 GNU autotools 改造一个软件项目本文不是一篇规范的教程,而是用一个软件项目作为例子,演示使用 GNU autotools 进行软件管理的思路和过程。
目录• GNU 的软件风格• 准备 autotools• 改造文件布局• autoscan• configure.ac 的基本结构• Makefile 文件的产生• 编写 Makefile.am• 软件根目录 Makefile.am• src/Makefile.am• data/Makefile.am• docs/Makefile.am• fonts/Makefile.am• images/Makefile.am• music/Makefile.am• sound/Makefile.am• 运行 autotools• SDL 库的侦测• 软件使用的数据文件• configure 选项• autotools 脚本• 使用 configure 产生的 Makefile• 最终的 configure.ac 文件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 系统上的自由软件都采用这种方式分发软件。
使用Automake生成Makefile及动态库和静态库的创建
使用Automake生成Makefile及动态库和静态库的创建使用Automake 创建和使用静态库1. 目录结构如下:[c-sharp]view plaincopy1.example2.|——src 目录(存放源代码文件)3. |——hello.c4.|——lib 目录(存放用来生成库的文件)5. |——test.c 用来生成静态库libhello.a6.|——include 目录(存放程序中使用的头文件)7. |——hello.h2. 编写的各个目录下的源文件[c-sharp]view plaincopy1.hello.h 文件2.extern void print(char *);3.test.c 文件4.#include<stdio.h>5.void print(char *msg)6.{7.print(“%s/n”, msg);8.}9.hello.c 文件10.#include “hello.h”11.int main()12.{13.print(“Hello static library!”);//这里用到的是静态库中的函数14.return 0;15.}3. 编写lib/Make 文件[c-sharp]view plaincopy1.noinst_LIBRARIES=libhello.a2.libhello_a_SOURCES=test.c3.AUTOMAKE_OPTIONS=foreign第一行noinst 表示生成的是静态库,不需要make install ,直接制定它的位置和名字就可以使用。
第二行表示用来生成静态库的源文件。
如果要把静态库生成到其他地方,可以在=后面加上路径(建议用绝对路径,并将所要用到的静态库生成在同一个文件夹下,如lib)。
第三行AUTOMAKE_OPTIONS 是Automake 的选项。
Automake 主要是帮助开发 GNU 软件的人员来维护软件,所以在执行Automake 时,会检查目录下是否存在标准GNU 软件中应具备的文件,例如 'NEWS'、'AUTHOR'、 'ChangeLog' 等文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GNU autotools 作用:收集系统配置信息并自动生成Makefiel文件。
开始:
第一步:写好程序(例如hello.c hello.h),调试没错后,新建一个目录(mkdir test)把程序copy 到该目录下
第二步:执行命令:autoscan
第三步:用vi编辑configure.scan,主要修改
不行的话,在第一个修改处,修改完后接着加入下面一句:
AM_INIT__AUTOMAKE(hello,1.0)
第四步:执行命令mv configure.scan configure.in,重名下文件,保存退出
第五步:运行:aclocal,会生成一个aclocal.m4文件
第六步:运行:autoconf,并用ls查看是否生成了cofigure可执行文件
第七步:运行:autoheader,会生成文件config.h.in
第八步:用vi编辑makefile.am文件,编辑如下,编辑完后保存退出AUTOMAKE_OPTION=foreign(注:automake提供三种软件等级:foreign/gnu/gnits,采用foreign等级,它只需检测必须的文件)
bin_PROGRAM=hello(注:bin_PROGRAM定义要产生执行文件名)hello_SOURCES= hello.c hello.h(注:hello_SOURCESD定义“hello”这个执行程序所需要的原始文件)
第九步:运行automake(注:automake 要用的配置文件是makefile.am,运行automake后,就会生成makefile.in), 然后运行automake –a(这步是为了让automake 自动添加一些必需的脚本文件)
第十步:运行:./configure (注:这步主要把makefile.in变成了最终的makefile)
第十一步:运行make ,在目录下生成可执行文件hello.
第十二步:然后运行./hello,查看结果是否正确。
(autotools工具用到这一步你要的效果都可以看到了)
第十三步:make install (——这一步会把程序安装到系统目录去,此时可以直接运行hello.就可以看到结果了
第十四步:再运行make dist (这个作用就会在当前目录下生成一个hello程序的安装压缩包hello-1.0.tar.gz,这个也就是在网上下载比较常见的下载包,不信的话,可以再解压开,然后运行make,然后执行./hello再试下)。