zoukankan      html  css  js  c++  java
  • Makefile基础

    1.规则

    规则定义格式如下

    目标 : 条件1 条件2 ...
        命令1
        命令2
        ...

    隐含规则和模式规则(略)

    2.变量

    Makefile变量像C的宏定义一样,代表一串字符,在取值的地方展开。

    1)两种定义方式

    用'='定义的变量会延迟展开,即在真正需要取值的时候才会展开;用':='定义的变量则是在变量定义时立即展开。

    2)'?='运算符

    '?='是赋值运算符,例如foo ?= $(bar)的意思是:如果foo没有定义过,那么?=相当于=,定义foo的值是$(bar),但不立即展开;如果先前已经定义了foo,则什么也不做,不会给foo重新赋值。

    3)'+='运算符

    '+='运算符可以给变量追加值,比如:

    objects = main.o
    objects += $(foo)
    foo = foo.o bar.o

    objects是用=定义的,+=仍然保持=的特性,objects的值是main.o $(foo)(注意$(foo)前面自动添加一个空格), 但不立即展开,等到后面需要展开$(objects)时会展开成main.o foo.o bar.o。

    再比如:

    objects := main.o
    objects += $(foo)
    foo = foo.o bar.o

    objects是用:=定义的,+=保持:=的特性,objects的值是main.o $(foo),立即展开得到main.o (这时foo还没定义),注意main.o后面的空格仍保留。

    如果变量还没有定义过就直接用+=赋值,那么+=相当于=。

    4)特殊变量:
    $@:取值为规则中的目标
    $<:取值为规则中的第一个条件
    $?:取值为规则中所有比目标新的条件,组成一个列表,以空格分割
    $^:取值为规则中所有条件,组成一个列表,以空格分割

    3.命令

    1)如果make执行的命令前面加了@字符,则不显示命令本身而只显示它的结果。

    2)通常make执行的命令如果出错(该命令的退出状态非0)就立刻终止,不再执行后续命令,但如果命令前面加了-号,即使这条命令出错,make也会继续执行后续命令。通常rm命令和mkdir命令前面要加-号,因为rm要删除的文件可能不存在,mkdir要创建的目录可能已存在,这两个命令都有可能出错,但这种错误是应该忽略的。

  • 相关阅读:
    uva 489 Hangman Judge(水题)
    中国海洋大学第四届朗讯杯高级组 Cash Cow(模拟)
    中国海洋大学第四届朗讯杯高级组 A 2718 Rocky(模拟)
    poj 1039 Pipe(叉乘。。。)
    CodeForces 135 B. Rectangle and Square(判断正方形和 矩形)
    poj 1265 Area( pick 定理 )
    poj 2031 Building a Space Station(prime )
    hdu 4502 吉哥系列故事——临时工计划(dp)
    拉格朗日插值
    [USACO18DEC]The Cow Gathering P
  • 原文地址:https://www.cnblogs.com/codingthings/p/4718400.html
Copyright © 2011-2022 走看看