第十一部分 隐含规则(三)

目录

一、定义模式规则

1、模式规则介绍

2、模式规则示例

3、自动化变量

4、模式的匹配

5、重载内建隐含规则


一、定义模式规则

        你可以使用模式规则来定义一个隐含规则。一个模式规则就好像一个一般的规则,只是 在规则中,目标的定义需要有"%"字符。"%"的意思是表示一个或多个任意字符。在依赖目标 中同样可以使用"%",只是依赖目标中的"%"的取值,取决于其目标。

        有一点需要注意的是,"%"的展开发生在变量和函数的展开之后,变量和函数的展开发 生在 make 载入 Makefile 时,而模式规则中的"%"则发生在运行时。

1、模式规则介绍

        模式规则中,至少在规则的目标定义中要包含"%",否则,就是一般的规则。目标中的 "%"定义表示对文件名的匹配,"%"表示长度任意的非空字符串。例如:"%.c"表示以".c"结 尾的文件名(文件名的长度至少为 3),而"s.%.c"则表示以"s."开头,".c"结尾的文件名(文 件名的长度至少为 5)。

         如果"%"定义在目标中,那么,目标中的"%"的值决定了依赖目标中的"%"的值,也就是说,目标中的模式的"%"决定了依赖目标中"%"的样子。例如有一个模式规则如下: %.o : %.c ;

其含义是,指出了怎么从所有的[.c]文件生成相应的[.o]文件的规则。如果要生成的目标 是"a.o b.o",那么"%c"就是"a.c b.c"。

         一旦依赖目标中的"%"模式被确定,那么,make 会被要求去匹配当前目录下所有的文件名, 一旦找到,make 就会规则下的命令,所以,在模式规则中,目标可能会是多个的,如果有 模式匹配出多个目标,make 就会产生所有的模式目标,此时,make 关心的是依赖的文件名 和生成目标的命令这两件事。

2、模式规则示例

        下面这个例子表示了,把所有的[.c]文件都编译成[.o]文件.

%.o : %.c

$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

         其中,"$@"表示所有的目标的挨个值,"$.y"执行,然后生成 ".tab.c"和".tab.h"文件。(其中,""表示一个任意字符串)。如果我们的执行程 序 "foo" 依 赖 于 文 件 "parse.tab.o" 和 "scan.o" , 并 且 文 件 "scan.o" 依 赖 于 文 件 "parse.tab.h",如果"parse.y"文件被更新了,那么根据上述的规则,"bison -d parse.y" 就会被执行一次,于是,"parse.tab.o"和"scan.o"的依赖文件就齐了。(假设,"parse.tab.o" 由"parse.tab.c"生成,和"scan.o"由"scan.c"生成,而"foo"由"parse.tab.o"和"scan.o" 链接生成,而且 foo 和其[.o]文件的依赖关系也写好,那么,所有的目标都会得到满足)

3、自动化变量

        在上述的模式规则中,目标和依赖文件都是一系例的文件,那么我们如何书写一个命令 来完成从不同的依赖文件生成相应的目标?因为在每一次的对模式规则的解析时,都会是不 同的目标和依赖文件。

        自动化变量就是完成这个功能的。在前面,我们已经对自动化变量有所提涉,相信你看 到这里已对它有一个感性认识了。所谓自动化变量,就是这种变量会把模式中所定义的一系 列的文件自动地挨个取出,直至所有的符合模式的文件都取完了。这种自动化变量只应出现 在规则的命令中。

         下面是所有的自动化变量及其说明:

$@

        表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于 目标中模式定义的集合。

$%

        仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a (bar.o)",那么,

"$%"

        就是"bar.o","$@"就是"foo.a"。如果目标不是函数库文件(Unix 下是[.a],Windows 下是[.lib]),那么,其值为空。

$<

         依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$很有可能不兼容于其它版本的 make,所以,你应该尽量避免使用"$*",除非是在隐含规则 或是静态模式中。如果目标中的后缀是 make 所不能识别的,那么

"$*"

        就是空值。 当你希望只对更新过的依赖文件进行操作时,

"$?"

        在显式规则中很有用,例如,假设有 一个函数库文件叫"lib",其由其它几个 object 文件更新。那么把 object 文件打包的比较 有效率的 Makefile 规则是: lib : foo.o bar.o lose.o win.o ar r lib $? 在上述所列出来的自动量变量中。四个变量($@、$"$(+D)" "$(+F)" 分别表示所有依赖文件的目录部分和文件部分。(可以有相同的) "$(?D)" "$(?F)" 分别表示被更新的依赖文件的目录部分和文件部分。 最后想提醒一下的是,对于"$

4、模式的匹配

        一般来说,一个目标的模式有一个有前缀或是后缀的"%",或是没有前后缀,直接就是 一个"%"。因为"%"代表一个或多个字符,所以在定义好了的模式中,我们把"%"所匹配的内 容叫做"茎",例如"%.c"所匹配的文件"test.c"中"test"就是"茎"。因为在目标和依赖目标 中同时有"%"时,依赖目标的"茎"会传给目标,当做目标中的"茎"。

         当一个模式匹配包含有斜杠(实际也不经常包含)的文件时,那么在进行模式匹配时, 目录部分会首先被移开,然后进行匹配,成功后,再把目录加回去。在进行"茎"的传递时, 我们需要知道这个步骤。例如有一个模式"e%t",文件"src/eat"匹配于该模式,于是"src/a" 就是其"茎",如果这个模式定义在依赖目标中,而被依赖于这个模式的目标中又有个模式 "c%r",那么,目标就是"src/car"。("茎"被传递)

5、重载内建隐含规则

        你可以重载内建的隐含规则(或是定义一个全新的),例如你可以重新构造和内建隐含 规则不同的命令,如:

%.o : %.c

$(CC) -c $(CPPFLAGS) $(CFLAGS) -D$(date)

你可以取消内建的隐含规则,只要不在后面写命令就行。如:

%.o : %.s

        同样,你也可以重新定义一个全新的隐含规则,其在隐含规则中的位置取决于你在哪里 写下这个规则。朝前的位置就靠前。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/630844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zookeeper启动报错常见问题以及常用zk命令

Zk常规启动的命令如下 sh bin/zkServer.sh start 启动过程如果存在失败&#xff0c;是没办法直接看出什么问题&#xff0c;只会报出来 Starting zookeeper … FAILED TO START 可以用如下命令启动&#xff0c;便于查看zk启动过程中的详细错误 sh bin/zkServer.sh start-for…

ros2 基础学习16 - RQT:模块化可视化工具

RQT&#xff1a;模块化可视化工具 ROS中的Rviz功能已经很强大了&#xff0c;不过有些场景下&#xff0c;我们可能更需要一些简单的模块化的可视化工具&#xff0c;比如只显示一个摄像头的图像&#xff0c;使用Rviz的话&#xff0c;难免会觉得操作有点麻烦。 此时&#xff0c;我…

AIGC(生成式AI)试用 17 -- 续2,生成式AI是什么

还是培训资料中的内容&#xff0c;重读一遍。 列举内容&#xff0c;尝试理解的多那么一点点。 1. 生成式AI 生成式AI定义 - Generative AI, GenAI - 一种人工智能技术 - 对已经数据分类、预测 - 生成新的内容&#xff0c;包括文本、图像、音频、视频 - 由大量数据语料库预…

nexus3 npm-hosted仓库迁移

迁移背景&#xff1a; 从nexus 3.33 升级到 nexus 3.64 过程中&#xff0c;私服 npm-hosted 无法上传。由于这个 npm-hosted 和 npm-proxy 放的同一个 blob存储&#xff0c;无法单独拆除去&#xff0c;所以采用迁移的方式 迁移思路&#xff1a; down下来 npm-hosted 仓库&am…

pytest学习和使用-pytest如何进行分布式测试?(pytest-xdist)

1 什么是分布式测试&#xff1f; 在进行本文之前&#xff0c;先了解些基础知识&#xff0c;什么是分布式测试&#xff1f;分布式测试&#xff1a;是指通过局域网和Internet&#xff0c;把分布于不同地点、独立完成特定功能的测试计算机连接起来&#xff0c;以达到测试资源共享…

C——语言内存函数

目录 一、memcpy的使用和模拟实现 1.memcpy函数原型 2.memcpy函数的使用 3.memcpy函数的模拟实现 二、memmove的使用和模拟实现 1.memmove函数原型 2.memmove函数的使用 3.memmove函数的模拟实现 三、memset的使用 1.memset函数原型 2.memset函数的使用 四、memcmp…

flowable流程结束触发监听器 flowable获取结束节点 flowable流程结束事件响应监听器

flowable流程结束触发监听器 | flowable流程结束获取结束节点 | flowable流程结束事件响应监听器 下面代码是该监听器是对每个到达结束事件后执行的。 原本的流程定义是如果其中任意某个节点进行了驳回&#xff0c;则直接结束流程。 所以在每个节点的驳回对应的排他网关都设…

#vue3# el-table-horizontal-scroll 让 el-table 在底部显示横向滚动条

一、需求: 当 el-table 的宽度超出浏览器宽度时&#xff0c;尽管 el_table 底部会出现滚动条&#xff0c;但使用起来不太便捷&#xff0c;因为每次需要先滚动到底部才能使用 el-table 的滚动体&#xff0c;这显得相当繁琐。 为了提升体验&#xff0c;希望在 el-table 的宽度超…

蓝桥杯备赛 day 3 —— 高精度(C/C++,零基础,配图)

目录 &#x1f308;前言&#xff1a; &#x1f4c1; 高精度的概念 &#x1f4c1; 高精度加法和其模板 &#x1f4c1; 高精度减法和其模板 &#x1f4c1; 高精度乘法和其模板 &#x1f4c1; 高精度除法和其模板 &#x1f4c1; 总结 &#x1f308;前言&#xff1a; 这篇文…

设计一个网页爬虫

定义 User Case 和 约束 注意&#xff1a;没有一个面试官会阐述清楚问题&#xff0c;我们需要定义Use case和约束 Use cases 我们的作用域只是处理以下Use Case&#xff1a; Service 爬取一批 url 生成包含搜索词的单词到页面的反向索引给页面生成标题和片段– 标题和片段是…

迅为RK3588开发板编译 Buildroot单独编译图形化界面(打包镜像)

上面 Kernel/U-Boot/Recovery/Rootfs 各个部分的编译后&#xff0c;将打包要用到的所有固件移动到 rockdev 目录下&#xff0c;然后打包为完整的 update.img 镜像。 首先在 linux 源码目录下输入以下命令进入编译的 UI 界面&#xff0c;进入之后如下所示&#xff1a; ./buil…

gin+gorm增删改查目录框架

从网上找资料,发现,很多都是直接的结构 路由&#xff0c;后端的controller层&#xff0c;还有model层&#xff0c;都是放在了同一个main.go文件中&#xff0c;如果写项目的话&#xff0c;还得自己去拆文件&#xff0c;拆代码&#xff0c;经过查询和自己总结&#xff0c;下面放…

鸿蒙开发(四)UIAbility和Page交互

通过上一篇的学习&#xff0c;相信大家对UIAbility已经有了初步的认知。在上篇中&#xff0c;我们最后实现了一个小demo&#xff0c;从一个UIAbility调起了另外一个UIAbility。当时我提到过&#xff0c;暂不实现比如点击EntryAbility中的控件去触发跳转&#xff0c;而是在Entry…

vue 指定区域可拖拽的限定拖拽区域的div(如仅弹窗标题可拖拽的弹窗)

<template><div class"container" ref"container"><div class"drag-box" v-drag><div class"win_head">弹窗标题</div><div class"win_content">弹窗内容</div></div><…

.NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务

在这篇文章中&#xff0c;我们将了解 .NET 8 中为托管服务引入的一些新生命周期事件。请注意&#xff0c;这篇文章与 .NET 8 相关&#xff0c;在撰写本文时&#xff0c;.NET 8 目前处于预览状态。在 11 月 .NET 8 最终版本发布之前&#xff0c;类型和实现可能会发生变化。要继续…

pycharm import torch

目录 1 安装 2 conda环境配置 3 测试 开始学习Pytorch! 1 安装 我的电脑 Windows 11 Python 3.11 Anaconda3-2023.09-0-Windows-x86_64.exe cuda_11.8.0_522.06_windows.exe pytorch &#xff08;管理员命令行安装&#xff09; pycharm-community-2023.3.2.exe 2 c…

白山云基于StarRocks数据库构建湖仓一体数仓的实践

背景 随着每天万亿级别的业务数据流向数据湖&#xff0c;数据湖的弊端也逐渐凸显出来&#xff0c;例如&#xff1a; 数据入湖时效性差&#xff1a;数据湖主要依赖于离线批量计算&#xff0c;通常不支持实时数据更新&#xff0c;因此无法保证数据的强一致性&#xff0c;造成数…

js的防抖与节流

目录 认识防抖与节流防抖节流 手写防抖函数绑定this与参数取消功能立即执行获取返回值最终版 手写节流函数 认识防抖与节流 在JavaScript中&#xff0c;大量操作都会触发事件&#xff0c;这些事件又会被添加到事件队列中进行排队处理 某些事件如果频繁触发的话会对浏览器的性能…

HarmonyOS —— buildMode 设置(对比 Android Build Varient)

前言 在安卓中 Build Variant 主要依赖模块&#xff08;module&#xff09;中 build.gradle 的 BuildType 和 ProductFlavor 提供的属性和方法&#xff0c;我们可以使用 Build Type 可以配置不同的构建方式、ProductFlavor 主要用来进行多渠道打包。 在鸿蒙中要做到同样像效果…

计算机网络——第四层:传输层以及TCP UDP

1. 传输层的协议 1.1 TCP (传输控制协议) - rfc793 连接模式的传输。 保证按顺序传送数据包。 流量控制、错误检测和在数据包丢失时的重传。 用于需要可靠传输的应用&#xff0c;如网络&#xff08;HTTP/HTTPS&#xff09;、电子邮件&#xff08;SMTP, IMAP, POP3&#xff09;…