Chinaunix首页 | 论坛 | 博客
  • 博客访问: 68802
  • 博文数量: 30
  • 博客积分: 1260
  • 博客等级: 中尉
  • 技术积分: 285
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-03 12:27
文章分类

全部博文(30)

文章存档

2010年(30)

我的朋友

分类: C/C++

2010-07-01 12:27:31

Makefile是一系列由目标(Target)、关连(Dependencies)及动作组成的规则集,Make将根据这些规则集来决定如何编译(Compile)各连结(Link)程序等。
 
Make主要预定义的变量:
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建目期晚
$* 不包含扩展名的目标文件名称
$@ 目标的完整名称
$^ 所有的依赖文件,以空格分开,不包含重复的依赖文件
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
GNU Make参考文档如此复杂跟无趣,让人很难有兴趣深入了解这些规则的内在实施,所幸的是,我们还有automake跟autoconf,这些工具可以帮助工程人员建立符合GNU Make规则的Makefile。
 
网络中有不少文章对此有过介绍,如以下文章,以范例的方式,由简而入对Makefile的自动产生过程进行的分析:http://linux.chinaunix.net/techdoc/develop/2007/07/24/963504.shtml
 
在这里,我重写这些步骤,记录于此,方便查找
  1. 创建hello目录,创建以下hello文件于此目录

    #include <stdio.h>

    int main()
    {
        printf("Hello, World.\n");

        return 0;
    }

  2. 执行autoscan,这将产生configure.in的雏形文件configure.scan,我们将其改名为configure.in,并修改如下:

    # -*- 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([hello.c])

     

    # Checks for programs.

    # 这个宏是必须的,它描述了我们将要生成的软件包的名字及其版本.

    # PACKAGE是软件包的名字,VERSION是版本号。当你使用make dist命令时

    # 它会给你生成一个类似helloworld-1.0.tar.gz的软件发行包,其中就有对

    # 应的软件包的名字和版本号。

    AM_INIT_AUTOMAKE(hello,1.0)


    # Checks for programs.

    # 这个宏将检查系统所用的C编译器。
    AC_PROG_CC

    # Checks for libraries.
    # Checks for header files.
    # Checks for typedefs, structures, and compiler characteristics.
    # Checks for library functions.

    # 这个宏是我们要输出的Makefile的名字
    AC_OUTPUT(Makefile)

  3. 执行 aclocal 和 autoconf ,分别会产生 aclocal.m4 及 configure 两个档案
  4. 创建Makefile.am,内容如下

    # 这个是automake的选项。在执行automake时,它会检查目录下是否存在标准# GNU软件包中应具备的各种文件,例如AUTHORS、ChangeLog、NEWS等文件。# 我们将其设置成foreign时,automake会改用一般软件包的标准来检查。

    AUTOMAKE_OPTIONS= foreign

    # 这个是指定我们所要产生的可执行文件的文件名。

    # 如果你要产生多个可执行文件,那么在各个名字间用空格隔开
    bin_PROGRAMS= hello

    # 这个是指定产生“helloworld”时所需要的源代码。如果它用到了多个源文# 件,那么请使用空格符号将它们隔开。比如需要helloworld.h,

    # helloworld.c那么请写成helloworld_SOURCES= helloworld.h

    # helloworld.c。
    hello_SOURCES= hello.c

  5. 执行 automake --add-missing ,Automake 会根据 Makefile.am 档产生一些档案,包含最重要的 Makefile.in

"--add-missing"的意思是add missing standard files to package

最后执行./configure即可生成Makefile.以上所述内容可大体上帮助我们建立一简单的Makefile,但如果要建立更复杂的Makefile则需要深入autoconf及automake的使用方法,或参考其它开源代码中的configure.in及Makefile.am文件




阅读(833) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~