为了更好的制作configure与Makefile,我先把制作流程给写在这里,好让大伙都有个心理准备。这里只说流程,不做解释。(附图供参考) 1、autosan命令生成configure.scan文件,这只是个模板,我们重新编辑这个文件,并把它保存为configure.in文件。 2、aclocal命令生成aclocal.m4文件。 3、autoheader命令生成config.h.in。前提是aclocal.m4和configure.in必须生成。 4、autoconf命令生成configure文件(这个文件都很熟悉吧,嘎嘎)。 5、创建并编辑Makefile.am,这个文件在根目录与子目录都应该有的。 6、automake命令生成Makefile.in。 7、./configure命令,根据Makefile.in生成Makefile文件,这个再熟悉不过了吧。 二、 制作 巧妇难做无米之炊,要想完成这次体验,我们还得按规矩一步一步来,源文件得有。首先建个目录Family用来放我们的东西,它下面的东西就多了。源代码什么阿c,阿h啊,都放在src下面,src这个文件夹命名一般都是约定俗成的,我们也不破坏。当然你也可以起其他名字,别搞忘就好。 <Family> |-configure.in |-Makefile.am |-<src> |-wife.c |-daughter.c |-main.c |-wife.h |-daughter.h |-Makefile.am ※说明: 1. configure.in 这是最重要的文档,整个安装过程都靠它来主导。 2. Makefile.am automake会根据它来生成Makefile.in,再由./configure Makefile.in变成最终的Makefile,一般来说在顶级目录和各个子目录都应该有一个Makefile.am 3. wife.c daughter.c main.c wife.h daughter.h 这是我们的源程序。 不用细看,这些文件除了configure.in是用模板创建手动编辑外,其他都是手动创建并编辑的,如果你还木有,动手吧。其实这里边有个小小的经验,也不一定是对的,只是个人的经验,也就是后缀名为in的文件是生成的模板。 $ mkdir –p Family/src $ touch Makefile.am $ cd src $ touch wife.c daughter.c main.c wife.h daughter.h Makefile.am $ cd .. 进入刚创建的Family目录 $ autoscan 该命令产生 configure.scan 和 configure.log两个文件,然后 $ mv configure.scan configure.i n这样configure.in就创建成了。 ※源代码内容: main.c: #include <stdio.h> #include "wife.h" #include "daughter.h" #ifdef HAVE_CONFIG_H #include <config.h> #endif int main(void) { printf( "These are my girls/n"); daughter_say(); wife_say(); return 0; } daughter.c #include <stdio.h> #include "daughter.h" #ifdef HAVE_CONFIG_H #include <config.h> #endif void daughter_say(void) { printf("My Dad ,are you call me ?/n"); } daughter.h #ifndef _DAUGHTER_ #define _DAUGHTER_ void daughter_say(void); #endif wife.c #include <stdio.h> #include "wife.h" #ifdef HAVE_CONFIG_H #include <config.h> #endif void wife_say(void) { printf("My darling ,are you call me ?/n"); } wife.h #ifndef _WIFE_ #define _WIFE_ void wife_say(void); #endif ※制作流程: 第1步:编辑configure.in文件。 上面用autoscan生成的scan后缀的文件改名而成的configure.in文件,我的用autoconf版本是2.66,貌似autoscan自动生成的模板2.61之前与之后的不大一样,这点可以自己参照自己的版本修改,2.61以后的版本这个文件更简单了。 打开看看: # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.66]) AC_INIT([family], [1.0], [804927399@qq.com]) AM_INIT_AUTOMAKE(family,1.0) AC_CONFIG_SRCDIR([src/wife.c]) AC_CONFIG_HEADERS([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_CONFIG_FILES([Makefile src/Makefile]) AC_OUTPUT configure.in 未修改版,简单对上面进行说明: AC_PREREQ([2.66])这个宏是用来检测autoconf的版本的。 AC_INIT()是个初始化宏,括号中内容分别为:要生成的软件名称,版本号,bug报告邮箱 AM_INIT_AUTOMAKE(family,1.0)这个宏是新添加的,不过好像1.8的automake不用添加这个也可以,但是我没有添加的时候在后面make的时候会有“Makefile:15: *** 遗漏分隔符 。 停止。”的问题,而加上则有警告。现在还真有点晕呼呼滴。 AC_CONFIG_SRCDIR([src/wife.c])这个宏是用来检测源码目录的有效性,srcdir就可以看出来,括号里边的文件不一定非得是wife.c,也可以改成其他的。 AC_CONFIG_HEADERS([config.h])这个宏用来生成标准的config.h文件。 接下来的内容就是众多的check了 AC_PROG_CC这个是检测编译器的宏。 我们用的版本不用AC_OUTPUT输出了,还是比较省力的。 第2步:aclocal命令生成aclocal.m4文件 不知为何,我直接用命令: $aclocal 命令总是出错:aclocal aclocal: couldn't open directory `/usr/local/share/aclocal-': 没有那个文件或目录。 最后还是加上绝对路径/usr/bin/aclocal总算是没这个错误,生成aclocal.m4了。 第3步:autoconf命令生成 configure文件 这一步没什么难度,输入命令: $ autoconf 就ok了,autoconf可以根据configure.in和aclocal.m4生成大名鼎鼎的configure,这时候已经可以运行它了,但是会报错,因为Makefile.in还没出现。 那么何为M4呢,M4的名称取自Macro(M后面跟4个字母…)。它和C预处理器里的宏是一个概念(其实,M4和C预处理器都K&R操刀设计的!!),用来处理文本替换。也就是说,M4是bash里的预处理器。 第4步:autoheader命令生成config.h.in $ autoheader通过autoheader命令,我们就可以得到config.h.in这个东东了。有了它,./configure才会生成config.h这个东东,所以不可大意。 autoheader这个工具通常会从“acconfig.h”文件中复制用户附加的符号定义,因此此处没有附加符号定义,所以不需要创建“acconfig.h”文件。 第5步:编辑Makefile.am文件 我们再编译安装源码包的时候都知道./configure可以生成Makefile,殊不知要生成Makefile还全仰仗Makefile.in这个老东西,而这个东西是以in结尾的 ,也是个模板,是由Makefile.am生成的,好了,知道这个来龙去脉了,就着手编写Makefile.am,我们这里Family顶级目录与子目录各有一个,如果还有其他的子目录,理论上也是需要Makefile.am的。我们这就来编辑它: Family/Makefile.am内容如下: AUTOMAKE_OPTIONS = foreign SUBDIRS = src Family/src/Makefile.am内容如下: AUTOMAKE_OPTIONS = foreign bin_PROGRAMS = family family_SOURCES = main.c wife.c daughter.c wife.h daughter.h 其中的AUTOMAKE_OPTIONS为设置automake的选项。由于GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了三种软件等级:foreign、gnu和gnits,让用 户选择采用,默认等级为gnu。在本例使用foreign等级,它只检测必须的文件,而不用检查README啊什么的。 bin_PROGRAMS定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。 family_SOURCES定义“family”这个执行程序所需要的原始文件。如果”family”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原 始文件都列出来,并用空格隔开。如果源文件名字太长,可以加上”/”行连接符换行书写。 第6步:automake --add-missing命令生成config.h.in $ automake –a或者 automake -–add-missing,大功告成! 注意运行automake命令时一定要加参数,否则不会自动生成install.sh,missing等脚本,这样会出乱子滴。 这样,源码安装包就制作成了,用tar打包就可以了,使用的时候用三部曲./configure,make , make install安装即可 转载请保留固定链接: https://linuxeye.com/Linux/896.html |