自动生成Makefile

请参考http://blog.csdn.net/zpx037/article/details/6451946


一、     概述

为了更好的制作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.inaclocal.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等脚本,这样会出乱子滴。



请参考http://blog.sina.com.cn/s/blog_a12c6e2d0100ycpp.html

1、建目录

  在你的工作目录下建一个helloworld目录,我们用它来存放helloworld程序及相关文件,如在/home/my/build下:

$ mkdir helloword
$ cd helloworld

  2、 helloworld.c

  然后用你自己最喜欢的编辑器写一个hellowrold.c文件,如命令:vi helloworld.c。使用下面的代码作为helloworld.c的内容。

int main(int argc, char** argv)
{
printf("Hello, Linux World!\n");
return 0;
}

  完成后保存退出。

  现在在helloworld目录下就应该有一个你自己写的helloworld.c了。

  3、生成configure

  我们使用autoscan命令来帮助我们根据目录下的源代码生成一个configure.in的模板文件。

  命令:

$ autoscan
$ ls
configure.scan helloworld.c

  执行后在hellowrold目录下会生成一个文件:configure.scan,我们可以拿它作为configure.in的蓝本。

  现在将configure.scan改名为configure.in,并且编辑它,按下面的内容修改,去掉无关的语句:

============================configure.in内容开始=========================================
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_INIT(helloworld.c)
AM_INIT_AUTOMAKE(helloworld, 1.0)

# 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(Makefile)
============================configure.in内容结束=========================================

  然后执行命令aclocal和autoconf,分别会产生aclocal.m4及configure两个文件:

$ aclocal
$ls
aclocal.m4 configure.in helloworld.c
$ autoconf
$ ls
aclocal.m4 autom4te.cache configure configure.in helloworld.c


  大家可以看到configure.in内容是一些宏定义,这些宏经autoconf处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。

  autoconf 是用来生成自动配置软件源代码脚本(configure)的工具。configure脚本能独立于autoconf运行,且在运行的过程中,不需要用户的干预。

  要生成configure文件,你必须告诉autoconf如何找到你所用的宏。方式是使用aclocal程序来生成你的aclocal.m4。

  aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal是一个perl 脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。

  autoconf从configure.in这个列举编译软件时所需要各种参数的模板文件中创建configure。

  autoconf需要GNU m4宏处理器来处理aclocal.m4,生成configure脚本。

  m4是一个宏处理器。将输入拷贝到输出,同时将宏展开。宏可以是内嵌的,也可以是用户定义的。除了可以展开宏,m4还有一些内建的函数,用来引用文件,执行命令,整数运算,文本操作,循环等。m4既可以作为编译器的前端,也可以单独作为一个宏处理器。

4、新建Makefile.am

  新建Makefile.am文件,命令:


$ vi Makefile.am


  内容如下:


AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=helloworld
helloworld_SOURCES=helloworld.c


  automake会根据你写的Makefile.am来自动生成Makefile.in。

  Makefile.am中定义的宏和目标,会指导automake生成指定的代码。例如,宏bin_PROGRAMS将导致编译和连接的目标被生成。

  5、运行automake

  命令:


$ automake --add-missing
configure.in: installing `./install-sh'
configure.in: installing `./mkinstalldirs'
configure.in: installing `./missing'
Makefile.am: installing `./depcomp'


  automake会根据Makefile.am文件产生一些文件,包含最重要的Makefile.in。

  6、执行configure生成Makefile


$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
$ ls -l Makefile
-rw-rw-r-- 1 yutao yutao 15035 Oct 15 10:40 Makefile


你可以看到,此时Makefile已经产生出来了。

7、使用Makefile编译代码

$ make
if gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -

DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="helloworld" -DVERSION="1.0"

-I. -I. -g -O2 -MT helloworld.o -MD -MP -MF ".deps/helloworld.Tpo" \
-c -o helloworld.o `test -f 'helloworld.c' || echo './'`helloworld.c; \
then mv -f ".deps/helloworld.Tpo" ".deps/helloworld.Po"; \
else rm -f ".deps/helloworld.Tpo"; exit 1; \
fi
gcc -g -O2 -o helloworld helloworld.o 


  运行helloworld

$ ./helloworld
Hello, Linux World!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值