第九部分 使用函数 (五)

目录

一、origin 函数

“undefined”

“default”

“file”

“command line”

“override”

“automatic”

二、shell 函数

三、控制 make 的函数

1、error

2、warning


一、origin 函数

        origin 函数不像其它的函数,他并不操作变量的值,他只是告诉你你的这个变量是哪 里来的?其语法是:

$(origin <variable>)

        注意,是变量的名字,不应该是引用。所以你最好不要在中使用 “$”字符。Origin 函数会以其返回值来告诉你这个变量的“出生情况”,下面,是 origin 函数的返回值:

“undefined”

        如果从来没有定义过,origin 函数返回这个值“undefined”。

“default”

        如果是一个默认的定义,比如“CC”这个变量,这种变量我们将在后面 讲述。environment” 如果是一个环境变量,并且当 Makefile 被执行时,“-e” 参数没有被打开。

“file”

        如果这个变量被定义在 Makefile 中。

“command line”

        如果这个变量是被命令行定义的。

“override”

        如果是被 override 指示符重新定义的。

“automatic”

        如果是一个命令运行中的自动化变量。关于自动化变量将在后面讲述。

        这些信息对于我们编写 Makefile 是非常有用的,例如,假设我们有一个 Makefile 其包 了一个定义文件 Make.def,在 Make.def 中定义了一个变量“bletch”,而我们的环境中也 有一个环境变量“bletch”,此时,我们想判断一下,如果变量来源于环境,那么我们就把 之重定义了,如果来源于 Make.def 或是命令行等非环境的,那么我们就不重新定义它。于 是,在我们的 Makefile 中,我们可以这样写:

ifdef bletch

ifeq "$(origin bletch)" "environment"

bletch = barf, gag, etc.

endif

endif

        当然,你也许会说,使用 override 关键字不就可以重新定义环境中的变量了吗?为什 么需要使用这样的步骤?是的,我们用 override 是可以达到这样的效果,可是 override过于粗暴,它同时会把从命令行定义的变量也覆盖了,而我们只想重新定义环境传来的,而 不想重新定义命令行传来的。

二、shell 函数

        shell 函数也不像其它的函数。顾名思义,它的参数应该就是操作系统 Shell 的命令。 它和反引号“`”是相同的功能。这就是说,shell 函数把执行操作系统命令后的输出作为 函数返回。于是,我们可以用操作系统命令以及字符串处理命令 awk,sed 等等命令来生成 一个变量,如:

contents := $(shell cat foo)

files := $(shell echo *.c)

注意,这个函数会新生成一个 Shell 程序来执行命令,所以你要注意其运行性能,如果你的 Makefile 中有一些比较复杂的规则,并大量使用了这个函数,那么对于你的系统性能是有 害的。特别是 Makefile 的隐晦的规则可能会让你的 shell 函数执行的次数比你想像的多得 多。

三、控制 make 的函数

        make 提供了一些函数来控制 make 的运行。通常,你需要检测一些运行 Makefile 时的 运行时信息,并且根据这些信息来决定,你是让 make 继续执行,还是停止。

1、error

$(error <text...>)

        产生一个致命的错误,是错误信息。注意,error 函数不会在一被使用就会 产生错误信息,所以如果你把其定义在某个变量中,并在后续的脚本中使用这个变量,那么 也是可以的。例如:

示例一:

ifdef ERROR_001

$(error error is $(ERROR_001))

endif

示例二:

ERR = $(error found an error!)

.PHONY: err

err: ; $(ERR)

        示例一会在变量 ERROR_001 定义了后执行时产生 error 调用,而示例二则在目录 err 被执行时才发生 error 调用。

2、warning

$(warning <text ...>)

这个函数很像 error 函数,只是它并不会让 make 退出,只是输出一段警告信息,而 ma ke 继续执行。

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

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

相关文章

[ACM 学习] 最长上升子序列

LIS&#xff08;最长上升子序列&#xff09;的三种经典求法 - 一只不咕鸟 - 博客园 (cnblogs.com) 理解一下第三种方法&#xff08;贪心二分查找&#xff09; 因为构建的是上升子序列&#xff0c;所以是可以用二分查找找到最大的小于当前 A[i] 的在子序列中的 F[j]&#xff0…

【Git】GitHub上手动解决冲突

在 GitHub 上手动解决冲突通常涉及使用 Pull Request&#xff08;PR&#xff09;来进行合并。以下是一些基本的步骤&#xff0c;以帮助你手动解决冲突&#xff1a; 创建 Pull Request&#xff1a; 在 GitHub 仓库页面&#xff0c;切换到你的分支。 点击 “Pull Requests” 选…

可计算理论的优点及缺陷

可计算理论对计算机科学的发展和理论基础起到了重要的作用&#xff0c;它提供了计算问题可解性和不可解性的理论依据&#xff0c;并且对计算机算法的设计和性能分析有着重要的指导作用。同时&#xff0c;可计算理论也与形式语言、自动机理论、复杂性理论等其他计算科学领域有着…

关于steam游戏搬砖,想给大家的几点忠告

关于CSGO游戏搬砖&#xff0c;想给大家的几点忠告&#xff1a; 1、新出的箱子&#xff0c;里面开出的皮肤短时间内会溢价&#xff0c;价格虚高&#xff0c;后期会呈逐渐下跌趋势&#xff0c;这就是我们不让大家碰新品的原因&#xff0c;哪怕利润再高也不建议购入或者囤货&…

Linux Mii management/mdio子系统分析之五 PHY状态机分析及其与net_device的关联

&#xff08;转载&#xff09;原文链接&#xff1a;https://blog.csdn.net/u014044624/article/details/123303714 前面几章基本上完成了mdio模块驱动模型的分析&#xff0c;本篇文章主要讲述phy device的状态机以及phy device与net_device的关联。Phy device主要是对phy的抽象…

【Android开发】移动程序设计复习大纲

《移动程序设计》复习大纲 考试题型和分值&#xff1a; 一、判断题&#xff08;共10小题&#xff0c;每题1分&#xff0c;共10分&#xff09; 二、单选题(共10小题&#xff0c;每题1分&#xff0c;共10分) 三、填空题&#xff08;共10小题&#xff0c;每空1分&#xff0c;共…

C语言:自定义类型——结构体

一、什么叫做结构体 C语⾔已经提供了内置类型&#xff0c;如&#xff1a;char、short、int、long、float、double等&#xff0c;但是只有这些内置类型还是不够的&#xff0c;假设我想描述学⽣&#xff0c;描述⼀本书&#xff0c;这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要 …

SMD NTC Thermistor NTC热敏电阻产品基本参数定义

热敏电阻器&#xff08;Thermistor&#xff09;是一种电阻值对温度极为灵敏的半导体元件&#xff0c;温度系数可分为Positive Temperature Coefficient 正温度系数热敏电阻又称PTC热敏电阻和Negative Temperature Coefficient 负温度系数热敏电阻又称NTC热敏电阻. NTC热敏电…

Seata分布式事务

文章目录 Seata分布式事务1.分布式事务问题1.1.本地事务1.2.分布式事务 2.理论基础2.1.CAP定理2.1.1.一致性2.1.2.可用性2.1.3.分区容错2.1.4.矛盾 2.2.BASE理论2.3.解决分布式事务的思路 3.初识Seata3.1.Seata的架构3.2.部署TC服务3.2.1.下载3.2.2.解压3.2.3.修改配置3.2.4.在…

【JVM】常用命令

一、前言 Java虚拟机&#xff08;JVM&#xff09;是Java程序运行的基础设施&#xff0c;它负责将Java字节码转换为本地机器代码并执行。在开发过程中&#xff0c;我们经常需要使用一些命令来监控和管理JVM的性能和状态。本文将详细介绍6个常用的JVM命令&#xff1a;jps、jstat…

Linux平台建立GB28181设备模拟器

目录 下载模拟器解决动态库缺少问题运行模拟器抓包参考资料 在没有GB28181摄像机的情况下,在Linux虚拟机中模拟出一台GB28181摄像机用于调试和学习. 下载模拟器 到网站下载Linux 平台版本: https://www.happytimesoft.com/download.html tar -zxvf happytime-gb28181-device…

Shell面试题总结

记录一下&#xff0c;面试背问到的shell的相关面试题。 1.shell中的加法实现方式 这里写三种方式拿53举例 result$((53)) resultexpr 53 resultecho 53 |bc2.shell判断文件是否存在的方式 也是三种 使用test命令 if test -f 文件路径;thenecho "文件存在" else…

P3817 小A的糖果

# 小A的糖果 ## 题目描述 小 A 有 $n$ 个糖果盒&#xff0c;第 $i$ 个盒中有 $a_i$ 颗糖果。 小 A 每次可以从其中一盒糖果中吃掉一颗&#xff0c;他想知道&#xff0c;要让任意两个相邻的盒子中糖的个数之和都不大于 $x$&#xff0c;至少得吃掉几颗糖。 ## 输入格式 输入…

腾讯云服务器定价_云服务器价格_云服务器计费模式

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

创新与竞争:Facebook如何在社交媒体市场站稳脚跟

社交媒体市场一直都是激烈的竞争场地&#xff0c;而Facebook凭借其创新的战略一直站稳脚跟&#xff0c;不断引领行业潮流。本文将深入探讨Facebook是如何通过创新与竞争策略&#xff0c;在社交媒体市场中牢牢占据领导地位的。 多元化产品布局 Facebook并非只是一家单一产品的公…

[Java刷算法]牛客—剑指offer第一天

&#x1f9db;‍♂️个人主页&#xff1a;杯咖啡&#x1f4a1;进步是今天的活动&#xff0c;明天的保证&#xff01;✨目前正在学习&#xff1a;SSM框架,算法刷题&#x1f64c;牛客网&#xff0c;刷算法过面试的神级网站&#xff0c;用牛客你也牛。 &#x1f449;免费注册和我一…

我成为开源贡献者的原因竟然是做MySql-CDC数据同步

今年下半年机缘巧合下公司决定搭建自己的数据中台&#xff0c;中台的建设势必少不了数据集成。首先面临的就是数据集成技术选型的问题&#xff0c;按照社区活跃度、数据源适配性、同步效率等要求对市面上几个成熟度较高的开源引擎进行了深度调研。 最终经过内部讨论决定用Apac…

云服务器部署Stable Diffusion Webui从0到1总结:反复重启+循环debug

文章目录 在学校服务器部署Stable Diffusion Webui&#xff08;一&#xff09;准备工作&#xff08;二&#xff09;环境配置&#xff08;三&#xff09;git拉取项目到本地&#xff08;四&#xff09;运行项目 遇到的问题&#xff1a;&#xff08;一&#xff09;使用git clone时…

JAVAEE初阶 多线程进阶(二)

多线程进阶相关知识点 一.CAS1.1 CAS的原子类1.2 实现自旋锁1.3CAS中的ABA问题1.4 ABA问题的解决 二. callable接口三.reentrantLock3.1 reentrantLock与synchronized区别 四.信息量 semaphore五. CountDownLatch六. concurrentHashMap6.1 concurrentHashMap的优点 一.CAS CAS …

如何解决csgo搬砖饰品买了跌价的问题

大家好&#xff0c;我是阿阳。 经常有粉丝问&#xff1a;近期是该买还是该抛&#xff0c;每次买了就跌&#xff0c;抛了就涨&#xff0c;太揪心了。 在这聊聊阿阳自己对这个问题的看法&#xff0c;首先大家都知道csgo游戏搬砖从饰品持有时间长短&#xff0c;可以分为两类&…