zoukankan      html  css  js  c++  java
  • Makefile笔记

    一个简单的Makefile描述规则组成:

    TARGET...:PREREQUISITES...

      COMMANDS...

      ...

    target:规则的目标。通常是程序中间或者最后要生成的文件名,也可以是伪目标。

    prerequisites:规则的依赖。生成规则目标所需要的文件名列表。通常一个目标依赖于一个或者多个文件。

    commands:规则的命令行,每条占一行,必须以[TAB]开头。

    GNUMake的执行过程:

      第一阶段:读取所有的makefile文件(包括“MAKEFILE”变量指定的,提示符“include”指定的,以及命令行选项“-f或--file”指定的makefile文件),内建所有的变量,明确规则和隐含规则,并建立所有目标和依赖关系结构链表。

      第二阶段:根据第一阶段已经建立的依赖关系结构链表决定哪些目标需要更新,并使用对应的规则来重建这些目标。

     目录搜寻:自动搜索依赖文件

    1.一般搜索:

      特殊变量VPATH指定依赖文件的搜索路径。用冒号或者空格隔开,当前目录永远是第一搜索目录。

      例:VPATH=src:../headers

     2.选择性搜索:

      为不同类型的文件指定不同的搜索目录,关键字为vpath。使用方法:

      1). vpath PATTERN DIR  #指定模式PATTERN的搜索目录为DIR

      2). vpath PATTERN    #清楚模式PATTERN的文件设置的搜索路径,PATTERN为空则清除所有。

      例:  vpath %.h ../headers  #%匹配一个或多个字符

    变量:

    1.在规则中,通配符会被自动展开。但在变量的定义和使用函数时不会。这种情况下需要通配符有效,要用到函数“wildcard”

     用法:$(wildcard PATTERN...);

     在Makefile中,它被展开成已存在的,空格分割的,匹配此模式的所有文件列表。

     如:$(patsubst %.c,%.o,$(wildcard *.c))

     将获得一个列表,为上述列表所有.c文件替换为.o文件。

    2.变量取值:

     immediate=deferred  (递归展开)

     immediate?=deferred  #如果变量已经被定义过则不做任何操作

     immediate:=deferred  (直接展开)

     immediate+=deferred or immediate (变量追加,以空格分割)

     当变量使用+=时,如果此前这个变量是一个简单变量(使用:=定义的),则认为它是立即展开的,其他情况都被认为是延后展开的变量。

    3.自动化变量:

    $@ :代表规则中的目标文件名。

    $<: 规则的第一个依赖文件名。

    $^: 规则的所有依赖文件列表,空格分割。

    $?: 所有比目标文件更新的依赖文件列表。

    $(@D):目标文件的目录部分(不含最后一个反斜线)。

    $(@F):目标文件的实际文件名。

    $*: 在模式规则和静态模式规则中,代表“茎”,即%所代表的部分(若干文件名中存在目录,茎也将其包括)。

      

    静态模式规则:

      存在多个目标,并且不同目标可以根据目标文件的名字来自动构造出依赖文件。要求依赖文件类似。

    语法:

    TARGETS..:TARGET-PATTERN:PREREQ-PATTERNS..

      COMMANDS

      ...

    其中TARGETS为一系列目标文件。

    TARGET-PATTERN为目标模式。

    PREREQ-PATTERNS为依赖模式。

      从目标模式的目标名字中抽取一部分字符串(茎),并使用茎替代依赖模式中相应部分来产生对应目标的依赖文件。常用模式字符为%。

    在使用静态模式规则时,指定目标必须和目标模式相匹配,否则会出错。

    例:

    objects=foo.o bar.o

    $(objects):%.o:%.c

      $(cc) -c $< -o $@

     

    命令:

    ·多行命令由多个独立的shell去执行。

    ·较长行可用反斜线分解为多行。

    ·规则中命令在运行结束后,make会检测命令执行的返回状态,如果返回成功,则往下执行;如果出错,则会放弃对当前规则的执行。在命令前加-可以忽略错误。

    ·命令的执行默认回显,在命令前加@则不回显。

    ·默认情况下,make执行Makefile中第一个规则(终极目标)。

    函数:

      函数的调用方法为:

      $(Function Argv) 或 ${Function Argv} ,当有多个参数时,用逗号隔开。

    常用文本处理函数:

    ·模式替换

      $(patsubst PATTERN,REP,TEXT)

      将TEXT中以空格分开的单词列表,符合模式PATTERN的替换为REP,可用%代表一个单词中的若干字符。返回新的列表。

    ·字符串操作

      $(strip STRING)

        去掉STRING中开头和结尾的空格。

      $(filter PATTERN...,TEXT)

        过滤掉字符列表中所有不符合模式的单词,多个模式用逗号分隔。$(filter-out ...)与之相反。

    ·文件名处理

      $(dir NAMES...)  取目录

      $(notdir NAMES...) 取文件名 

      $(suffix NAMES...) 取后缀

      $(addsuffix SUFFIX,NAMES) 加后缀

      $(wildcard PATTERN) 列出当前目录下所有符合模式的文件名。

    隐含规则:

      依赖于make中的后缀列表.SUFFIXES(一个特殊目标)。

    .SUFFIXES:  #删除所有已定义的可识别后缀

    .SUFFIXES:.c .o   #重新定义

  • 相关阅读:
    12迭代器
    11(2)Vector(向量)
    11(1) LinkList ---链表
    11集合(Collection<E>) Arraylist
    10异常
    乘法计算过程的模拟
    10 Date详解
    详细的OA系统学习
    8 math类
    Java开发中的23种设计模式详解
  • 原文地址:https://www.cnblogs.com/pannengzhi/p/4395464.html
Copyright © 2011-2022 走看看