高级使用方法有两种:第一种是变量的替换引用,第二种是变量的嵌套引用。

  第一种用法经常用到,第二种用法我们很少使用。我们应该尽量避免使用变量的嵌套引用,在必须使用时,嵌套的层数越少越好。因为这种方法表达比较复杂,条理难以理清。

变量的替换引用:

  我们使用变量的时候,经常对它的值(字符串)进行操作。

  操作字符串,通常使用字符串操作函数,比如 patsubst 函数(模式字符串替换函数),但是使用变量同样可以实现类似 patsubst 函数的功能。

  我们通过下面的例子来具体分析。

  写法一:

foo:=a.c b.c d.c
obj:=$(foo:.c=.o)
All:
@echo $(obj)

  这段代码实现的功能是字符串的后缀名的替换,把变量 foo 中所有的以 .c 结尾的字符串全部替换成 .o 结尾的字符串。在 shell 命令行执行 make 命令,打印出来的是 "a.o b.o d.o" ,实现了文件名后缀的替换。

  注意,括号中的变量,使用的是变量名而不是变量名的引用,变量名与参数选项之间用冒号隔开,表达式中间不能使用空格。

  写法二:

foo:=a.c b.c d.c
obj:=$(foo:%.c=%.o)
All:
@echo $(obj)

  在 shell 中执行 make 命令,发现结果和写法一是相同的。这里的表达式中使用了通配符 "%",表示自动匹配一个或多个字符。在开发的过程中,我们通常会使用这种方式来进行变量替换引用的操作。

  写法二比写法一更加实用。因为在实际使用的过程中,我们对某个变量值的修改,可能不只是它的一部分,也可能是它的多个部分,那么第一种方式就不能实现了。比如:

foo:=a123c a1234c a12345c
obj:=$(foo:a%c=x%y)
All:
@echo $(obj)

  这个例子中我们操作的是两个不连续的部分,执行 make 后打印的值是 "x123y x1234y x12345y",这种情况下我们使用第一种情况就不能实现,所以第二种的使用更全面。

变量的嵌套使用:

  我们对一个变量进行赋值时可以引用其他的变量,并且引用变量的数量和和次数是不限制的。

  下面我们通过几个实例来说明一下。

  实例 1:

foo:=test
var:=$(foo)
All:
@echo $(var)

  这种用法是最常见的使用方法,打印出 var 的值就是 test。我们可以认为是一层的嵌套引用。

  实例 2:

foo=bar
bar=test
var:=$($(foo))
All:
@echo $(var)

  执行 make 命令的时候得到的结果也是 test。$(foo) 代表的字符串是 bar,变量 bar 表示的值是 test,所以对 bar 的引用就是 test,所以最终 var 的值就是 test。这是变量的二层嵌套执行。当然我们还可以使用三层的嵌套执行,写法跟上面的方式是一样的。嵌套的层数也可以更多,但是不提倡使用。

  我们在给一个变量进行赋值时,可以同时引用多个变量,还可以包含一些文本字符。比如:

first_pass=hello
bar=first
var:=$(bar)_pass
all:
@echo $(var)

  或者

first_pass=hello
bar=first
foo=pass
var:=$(bar)_$(foo)
all:
@echo $(var)

  执行 make 时, var 的值是 hello。

《Makefile中变量的高级用法:变量的替换引用、变量的嵌套使用》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. 与 Flutter 共创未来 | Flutter Forward 活动精彩回顾

    作者 / Google 开发者框架和语言 (含 Flutter.Dart 和 Go) 产品经理 & 用户体验总监 Tim Sneath 我们很高兴可以在 Flutter Forward 活动 ...

  2. Vue js引用警告 “export ‘default‘ (imported as ‘xxx‘) was not found

    问题原因:ES6 编译器识别问题 如果在public.js这样写会有警告export 'default' (imported as 'xxx') was not found export const ...

  3. PostgreSQL 打印详细错误调用栈 - pg_backtrace

    一.用法 create extension pg_backtrace; select pg_backtrace_init(); 二.示例 postgres=# select count(*)/0.0 ...

  4. go语言环境配置(windous)

    1.下载go语言安装包:https://golang.google.cn/dl/ 2.配置环境变量:GOBIN:项目bin目录  GOPATH:项目目录(src下) GOROOT(go的环境变量) G ...

  5. LeetCode-1001 网格照明

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/grid-illumination 题目描述 在大小为 n x n 的网格 grid 上,每个单元 ...

  6. left join(一)

    例表aaid adate1 a12 a23 a3 表bbid bdate1 b12 b24 b4 两个表a,b相连接,要取出id相同的字段select * from a inner join b on ...

  7. JavaWeb 之 Http

    0x01:为什么会有Http? 在 HTTP 建立之初,主要目的就是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器 0x02:什么是Http? http是一个简单的,请求-响应 ...

  8. 代码随想录训练营day 5|24.两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题02.07.链表相交 142.环形链表Ⅱ

    24. 两两交换链表中的节点 题目链接:24. 两两交换链表中的节点 题目描述:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行 ...

  9. react项目打包后点击index.html页面出现空白

    当本地打包后的文件,直接通过文件路径访问,出现空白或者,提示打包后的build内的js,css文件路径错误,有以下两种方式 方式一(无网络限制的情况下使用): 1.全局安装serve启动本地服务: n ...

  10. vue vite 打包开启 gzip 部署 nginx 支持 gzip

    vite 打包开启 gzip 安装插件 npm i vite-plugin-compression --save-dev vite.config.js 配置 import { defineConfig ...