makefile学习之路——变量

在makefile中,支持程序设计语言中变量的概念,所有的变量只代表文本数据。

一、变量的定义和使用

#变量的定义
CC := gcc
TARGET := hello.out

#变量的使用
$(TARGET) : func.o main.o
    $(CC) -o $(TARGET) func.o main.o

二、变量的赋值方式

1. 简单赋值        :=

只针对当前语句的变量有效

2. 递归赋值        =

赋值操作可能影响多个其他变量,所有与目标变量相关的其他变量都将受到影响

3. 条件赋值        ?=

如果变量未定义,使用赋值符号中的值定义变量,如果已定义,赋值无效

4. 追加赋值        +=

原变量值之后加上一个新值,原变量值和新值之间由空格隔开

三、预定义变量

1、自动变量

[email protected]   当前规则中触发命令被执行的目标

$^    当前规则中的所有依赖

$<    当前规则中的第一个依赖

1.1  自动变量的使用

2、特殊变量

这部分根据需要再去查询make手册

四、变量的高级用法

   1、变量值的替换

    1.1 使用指定字符替换变量值中的后缀字符

    1.2 语法格式:$(var:a=b)或${var:a=b}

   2. 变量的模式替换

    2.1 使用%保留变量值中的指定字符,替换其他字符

    2.2 语法格式: $(var:a=b)或${var:a=b}

3. 测试代码

src1 := a.cc b.cc c.cc
obj1 := $(src1:cc=o)

test1 :
	@echo "obj1 => $(obj1)"

src2 := a11b.c a22b.c a33b.c
obj2 := $(src2:a%b.c=x%y)

test2 :
	@echo "obj2 => $(obj2)"

4、规则中的模式替换

示例如下:

可以看成下面的代码

func.o main.o : %.o : %.c
    gcc -o [email protected] -c $^

分别进行匹配过后,就得到了图中的结果

5、变量值的嵌套引用

    5.1 一个变量名之中可以包含对其他变量的引用

    5.2 嵌套引用的本质是使用一个变量表示另外一个变量

6、命令行变量

    6.1 运行make时,在命令行定义变量

6.2 命令行变量默认覆盖makefile中定义的变量

7. override关键字

使用override关键字以后,makefile中定义的变量不会因为make的命令行变量而改变

8、define关键字

定义多行变量时,使用define关键字,同时可以配合override关键字防止变量被覆盖,

define定义的变量等价于使用=定义的变量

9、环境变量

环境变量是操作系统本身的变量,makefile可以直接使用这些变量,但如果在makefile中定义了同名变量,那么将在当前的makefile中覆盖环境变量。运行make时。指定-e选项,可以优先使用环境变量

10、变量在不同makefile之间的传递方式

10.1 直接在外部定义环境变量进行传递

10.2 使用export定义变量进行传递

10.3 定义make命令行变量进行传递

11、目标变量

作用域只在指定目标及连带规则中

var := D.T.Software
new := TDelphi

test : var := test-var
%e : override new := test-new

test : another
	@echo "test :"
	@echo "var => $(var)"
	@echo "new => $(new)"

another :
	@echo "another :"
	@echo "var => $(var)"
	@echo "new => $(new)"

运行结果如下:

由于another和test存在依赖关系,因此,定义的局部变量也会对another生效

12、模式变量

模式变量是目标变量的扩展,可以根据相应的规则,找到符合规则的目标

原文地址:http://blog.51cto.com/12876518/2090889

时间: 2024-08-28 20:09:23

makefile学习之路——变量的相关文章

Makefile学习之路——4

变量的类别有递归扩展变量和简单扩展变量.只用一个"="符号定义的变量被称为递归扩展变量.通过下面例子观察递归扩展变量的特点. 1 .PHONY: all 2 3 foo=$(bar) 4 bar=$(ugh) 5 ugh=Huh? 6 7 all: 8 @echo $(foo) 从结果来看,递归扩展变量的引用是递归的. CFLAGS =$(CFLAGS) -O 上面的赋值代码将会造成一个死循环,无限递归. 简单变量扩展使用" :="操作符来定义的.对于这种变量,ma

Python小白学习之路—变量、字符编码、字符拼接

变量命名规则: (1)变量名只能是字母,数字,下划线的任意组合. ex:_amber_666NAme (2)关键字不能声明为变量名 ex:['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not'

Makefile学习之路5——通过函数增强功能

通过函数能显著增强Makefile的功能.对于simple项目的Makefile,尽管使用了模式规则,但还是有一件比较麻烦的事情,就是要在Makefile中指明每一个项目源文件.下面介绍几个后期会使用到的函数,更多请参考<GUN Make>. 1.abspath函数 从命名就应该能够猜出它的作用.abspath函数用于将_name中的各路径名转化成绝对路径,并将转化后的结果返回.调用形式为: $(abspath _name) 1 .PHONY: all 2 root :=$(abspath /

makefile学习之路——makefile简介

一.make简介 make是一个指令工具,它解释makefile中的指令或者说规则.makefile文件描述了整个工程中所有文件的**编译顺序,编译规则**.Makefile也有自己的编写规则,通常,我们所使用的IDE都会生成相应的makefile,然后再根据makefile来进行编译,只是这些操作是由IDE来完成,我们只需要点击一个编译按钮. 二.为什么要使用make 现在可以在GitHub上看到,很多的开源项目,在编译的时候,都是使用make来完成的,也就是说,都有其对应的makefile.

我的算法学习之路

关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门--当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾--反正最后考试划个重点也能过,于是这门整个计算机专业本

LTE学习之路(9)—— 3GPP TS协议系列总结

规范编号 规范名称 内容 更新时间 射频系列规范 TS 36.101 UE无线发送和接收 描述FDD和TDD E-UTRA UE的最小射频(RF)特性 08-Oct-2010 TS 36.104 BS无线发送与接收 描述E-UTRA BS在成对频谱和非成对频谱的最小RF特性 30-Sep-2010 TS 36.106 FDD直放站无线发送与接收 描述FDD直放站的射频要求和基本测试条件 30-Sep-2010 TS 36.113 BS与直放站的电磁兼容 包含对E-UTRA基站.直放站和补充设备的

【Linux学习】Makefile学习(二)

FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 40975    Accepted Submission(s): 13563 Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats g

类与对象的学习之路

---恢复内容开始--- 学习java也有一段时间了,这周踏上了类与对象的学习之路,回过头来总结一下类与对象的基本知识.之前在大一上就接触了Python语言跟C语言,现在开始学习java语言了.我觉得跟之前学的C语言还是有区别的,至于在java书中提及的C++没学习,听别人说C++跟java有点像,这两种编程语言都是面向对象的,并且编程语言本身之间都有很多相似相同的地方. 一.说说类与对象 说到面向对象,那么不得不提的就是类和对象了.Java代码是以类为单位的.在我看来,类就是一个模板,比如一个

MySQL数据库学习之路

MySQL学习之路 目录 MySQL学习之路[第一篇]:MySQL单双实例安装 MySQL学习之路[第二篇]:MySQL登陆关闭.密码修改破解 MySQL学习之路[第三篇]:MySQL增删改查.用户权授.系统函数.字段修改 MySQL学习之路[第四篇]:MySQL进程连接.交互.变量 MySQL学习之路[第五篇]:MySQL主健和索引 MySQL学习之路[第六篇]:MySQL存储引擎.事务.锁 MySQL学习之路[第七篇]:MySQL日志管理 MySQL学习之路[第八篇]:MySQL备份恢复 M