Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1746107
  • 博文数量: 1493
  • 博客积分: 38
  • 博客等级: 民兵
  • 技术积分: 5834
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-19 17:28
文章分类

全部博文(1493)

文章存档

2016年(11)

2015年(38)

2014年(137)

2013年(253)

2012年(1054)

2011年(1)

分类: LINUX

2013-02-27 09:37:21

原文地址:Makefile 学习摘要 作者:fengling2222

Makefile.doc 

 

1、    GNU C的字符解析:

扩展后缀名的解析

.c     C语言源代码;            .C .cc    C++语言源代码

.i     与处理后的C源代码           .ii    预处理后的C++源代码

.o     编译后的目标代码         .a, .so     编译后的库代码

Makefile的自动化变量

$@     目标文件名(或集合)       

$<     依赖文件名(或集合)

$%     库中包涵的目标成员文名件(或集合)

$*     目标模式中"%"及其之前的部分 (或集合)

$^     依赖文件名的集合,有重复的只保留一个;

$    所有比目标文件新的依赖文件的集合,不删除重复的目标文件;

$+      依赖文件名集合,不删除重复的目标文件;

$(@D)   表示"$@"的目录部分(不以斜杠作为结尾)

$(@F)   表示"$@"的文件部分,不含目录;相当于函数"$(notdir $@)"

    命令行解析

-o FILE 指定输出文件名; 

-c       只编译不连接;

-Dxx=yy      定义预处理宏xx,其值为yy

-Idirname   dirname下的头文件加到搜索目录中;

-Ldirname   dirname下的库文件加载到搜索目录中;

-static      链接静态库,

-lFOO  :   链接一个libFOO.so的库;

-On      n=0123;指定优化等级为n

-ansi    支持ANSI/ISO C的标准语法;

-pedansi 允许发出ANSI/ISO C标准多列出的所有警告;

-Wall    发出GCC提供的所有警告;

-werror    :   把所有警告变成错误,并终止编译;

-v       显示在编译过程的每一步中用到的命令;

Makefile的伪目标解析

    all       所有目标的目标,其功能一般是编译所有的目标;

    clean     删除所有被make创建的文件;

    install      把目标执行文件拷贝到指定的目标中去;

    print      例出改变过的源文件

    tar        把源程序打包备份一个tar文件

    dist       创建一个压缩文件,一般是把tar文件压成Zgz文件

    TAGS       更新所有的目标,以备完整地重编译使用

    check      一般用来测试makefile的流程

    test      一般用来测试makefile的流程

 

   

 

2、    Makefile

◆ Makefile中的内容:

    显示规则、隐晦规则、变量定义、文件指示、注释

引用其他makefile include ;

例如:include firmware.mk

    ◆ make支持三各通配符:“*”“?”“[...]” %表示模式变量

    需要转义字符“\”输出的符号:%*,?

       要输出”$”字符,需写成“$$”;

 

    ◆ makefile 中的特殊变量或标记:

       .PHONY      指定伪目标        VPATH =   用于表示头文件目录

 

    文件搜索 VPATH vpath ; 目录用分隔;

       VPATH (变量) 搜索目录;

如:VPATH = src:../header:/include 搜索目录src../header, /include 3个目录

       vpath (关键字)为指定模式的文件指定搜索目录;

           用法有3

              1vpath ;

                    为符合模式;的文件指定搜索目录;

                2vpath ;

                清除符合模式;的文件的搜索目录。

             3vpath

                清除所有已被设置好了的文件搜索目录。

           例如:

              vpath %c foo:bar

vpath % blish

表示“.c”结尾的文件,先在foo目录搜索,再在bar目录搜索,最后在blish目录搜索;

    静态模式

       语法:;: ;: ;

            #  目标文件集合 :目标模式集合:依赖模式集合

              ;

            # 执行命令

         例如:

              objects = foo.o bar.o
                 all: $(objects)
                 $(objects): %.o: %.c
                         $(CC) -c $(CFLAGS) $< -o $@

 

命令执行:当多个命令写在一行时,需用“;”分隔;

在命令行前加“-”可以忽略命令出错;如: -rm –f *.o

定义命令包:

define cmdname

           commands;

           commands

        endef

    使用命令包时:

        Foo.c:foo.y

           $(cmdname)

 

变量定义:

变量在声明时需要给予初值,而在使用时,需要给在变量名前加上“$”符号,但最好用小括号()或是大括号“{}”把变量给包括起来

1、使用“=”定义变量的值;如: foo = $(bar),其值可以在后面定义;

2、使用“:=”定义变量的值;如: x := foo,其值只能使用已经在前面定义好的;

3、使用“?=”定义变量的值;如: FOO ?= bar,如果FOO没有被定义过,那么变量FOO的值就是“bar”,如果FOO先前被定义过,那么这条语将什么也不做;

其等价于:

ifeq ($(origin FOO), undefined)

       FOO = bar

    endif

    变量值的替换:

        一般替换: “$(var:a=b)”或是“${var:a=b}”

                    如: foo := a.o b.o c.o

                         bar := $(foo:.o=.c)   

        静态模式替换:

            如:foo := a.o b.o c.o
                bar := $(foo:%.o=%.c)

      变量值的追加符号: +=

    使用define endef 换行给变量赋值;定义时不能使用[TAB]键开头;

    条件判断关键字

       1. ifeq (,) … else … endif

       2. ifneq (,) … else … endif

       3. ifdef … else … endif

       4. ifndef … else … endif

    字符串处理函数

       1. 字符串替换函数:$(subst ,,);返回替换后的

       2. 模式字符串替换函数: $(patsubst ,,); 同上

       3. 除去字符串开头和结尾的空字符:$(strip )返回string

       4. 查找字符串: $(findstring ,);返回;

       5. 过滤字符串: $(filter ,),返回过滤的字符串

       6. 反过滤字符串:$(filter-out ,), 返回过滤后的;

       7. 按升序排序:$(sort ) ;按照字符单词的升序排序;

       8. 取单词函数:$(word ,);返回text中取第n个单词;

       9. 取单词串:$(wordlist ,,);返回第se的单词串;

       10. 单词个数统计:$(words ); 返回单词个数

       11. 取首单词:$(firstword );返回第一个单词;

文件名操作函数

    1. 取目录:$(dir );返回文件名序列的目录部分;

    2. 取文件:$(notdir );返回文件名序列的非目录部分;

    3. 取后缀:$(suffix );返回文件名序列的后缀序列;

    4. 取前缀:$(basename );返回文件名序列的前缀序列;

    5. 加后缀:$(addsuffix ,);返回加后缀的序列;

    6. 加前缀:$(addprefix ,);返回加前缀的序列;

    7. 连接:$(join ,);返回list2list1后的字串;

◆ foreach 循环函数

    语法: $(foreach ,,);

含义:把参数中的单词逐一取出放到参数所指定的变量中,然后再执行所包含的表达式;返回执行后的;

例如:names := a b c d
        files := $(foreach n,$(names),$(n).o)

返回值:“a.o b.o c.o d.o”

    ◆ if判断函数 $(if , ,);

    ◆ call函数:

       语法: $(call ,,,...)

        含义:;中的变量会被参数;;;依次取代;

        例如:reverse =  $(1) $(2)

            foo = $(call reverse,a,b)

        返回值:foo的值就是“a b”

    ◆ origin 函数:告知变量的来源

       语法:$(origin )

返回值:“undefined” “default” “environment” “file” “command line” “override” “automatic”

    ◆ shell函数:在makefile中执行shell命令

       语法:$(shell );

    指定makefile编译:如:make -f makefile-tft35

    ◆ makefile中把"%"所匹配的内容叫做"";”茎“可以被传递;

以上学习摘要来自于学习陈浩的《跟我一起写makefile》,在阅读过程中,对其内容做了一些整理,原文件附件;

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