如何获得 makefile 函数来停止当前目标?

2024-03-28

我在 makefile 中有一个函数,如果文件不存在,或者至少是执行它的目标不存在,我想停止整个 make 运行:

vaultfile = ./vault

$(shell test -f $(1) || exit 1)

define get_token
$(shell test -f $1 && cat $1 || exit 2)
endef

a: token = $(call get_token,$(vaultfile),tokenname)
a:
        echo ==== $(token)
.PHONY=a

上面的方法不起作用,当文件丢失时默默地失败

$ rm vault
$ make
echo ==== 
====
$ echo f > vault
$ make
echo ==== f
==== f

我希望它位于函数中,因为大多数目标不会调用该函数(这显然会执行更多 IRL 操作)。

我该如何进行这项工作?


首先有几件事:

.PHONY=a

不执行任何操作:变量.PHONY并不是特别做的。要声明目标假冒,您需要将其列为先决条件.PHONY伪目标:

.PHONY: a

其次,这一行:

$(shell test -f $(1) || exit 1)

不执行任何操作:make 变量$(1)此处未设置,因此test总是失败,但这并不重要,因为退出代码被忽略,见下文。

make 的退出代码shellfunction 不会导致 make 失败,它会被忽略。要使 make 认为配方失败,您必须让命令行本身以非零值退出。

一个好的经验法则是,如果您发现自己使用 makeshell如果你在菜谱中使用函数,你就做错了,而且你不理解 make 如何扩展变量和函数。配方已经被传递到 shell,所以你不需要使用shell根本没有功能。

让我们看看在第一步扩展之后您的配方是什么token多变的:

    echo ==== $(call get_token,$(vaultfile),tokenname)

现在之后call函数被扩展(注意函数的第二个参数,tokenname,被完全忽略)你得到:

    echo ==== $(shell test -f ./vault && cat ./vault || exit 2)

现在 make 扩展了 shell 函数,该函数调用 shell 来运行命令并用输出替换扩展...但退出代码被忽略。这么说吧./vault不存在:则此 shell 命令不输出任何内容,并且 make 运行此规则:

    echo ==== 

停止整个 make 运行的最佳方法是使用error功能。您可以使用 make 函数来完成所有工作,如下所示:

vaultfile = ./vault

get_token = $(if $(wildcard $1),`cat $1`,$(error File $1 does not exist))

a: token = $(call get_token,$(vaultfile),tokenname)
a:
        echo ==== $(token)

我们来看看结果如何call扩展现在将是:

    echo ==== $(if $(wildcard ,/vault),`cat ./vault`,$(error File ./vault does not exist))

现在 make 评估if函数和条件是wildcard函数将扩展为./vault如果存在,则为空字符串。这if函数将非空字符串视为“true”,将空字符串视为“false”,因此如果文件存在,它将扩展为:

    echo ==== `cat ./vault`

如果该文件不存在,它将运行error立即停止 make 的函数,打印该错误消息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获得 makefile 函数来停止当前目标? 的相关文章

随机推荐

  • get_class() 期望参数 1 为对象,给定为 null

    当我尝试在新的本地计算机上部署 Symfony 2 8 项目时 我在代码的多个位置遇到此错误 Warning get class expects parameter 1 to be object null given 在stackoverf
  • 如何清理(用随机字节覆盖)std::string 内部缓冲区?

    考虑一个场景 其中std string用于存储a secret 一旦它被消耗并且不再需要 最好清理它 即覆盖包含它的内存 从而隐藏它secret std string提供一个函数const char data 返回指向 C 11 起 连续内
  • 根据匹配的列标题名称开头组合 R 中的列

    我有一个看起来有点像下面的数据框 A1U sweet 实际上是真实数据帧中的第 19 列 C1U sweet 是真实数据帧中的第 39 列 有 20 个以 A 开头的列和 20 个以 C 开头的列 A1U sweet A2F dip A3U
  • 在 Chapel 中使用矩阵创建域

    我有一个域名D 我想用它来索引几个矩阵A 某种形式的东西 var dom domain 1 0 5 var mats dom
  • 如何获取 PromptDialog.Choice 功能并仍然允许 Bot Framework 中的其他用户响应?

    Bot Framework 中的 PromptDialog Choice 提供了许多运行良好的内置功能 但是 我希望能够拦截 覆盖匹配过程 获得 PromptDialog Choice 功能并且还能够接受某些可能不匹配的字符串的最佳方法是什
  • 卡西尼号源代码下载链接?

    有谁知道哪里可以下载卡西尼号的源代码吗 我尝试了链接http www asp net Projects Cassini Download http www asp net Projects Cassini Download但该页面现在不存在
  • 如何从“struct linux_binprm”获取argv

    我想使用 bprm check security lsm 挂钩来检查是否允许运行具有特定参数的进程 在文档中 我看到 argv 应该在 bprm 类型为 struct linux binprm 中可用 但我没有找到任何从结构中提取 argv
  • 需要VC6平台SDK

    有谁知道我可以在哪里下载最后一个与 VC6 一起使用的 Platform SDK 我通过谷歌搜索找到的链接似乎都已失效 我设法在这里找到它 官方或非官方 http docs moodle org dev FebruaryPlatformSD
  • Gradle 日志在哪里?

    Android Studio 中应用程序的 Gradle 构建会生成以下错误 Error Execution failed for task app compileDebugJavaWithJavac gt java lang Runtim
  • 计算所有结构不同的二叉树的数量的时间复杂度是多少?

    使用此处介绍的方法 http cslibrary stanford edu 110 BinaryTrees html java http cslibrary stanford edu 110 BinaryTrees html java 12
  • 变量列表中的逗号是序列点吗?

    在以下类型的代码中 每个变量构造之间是否存在序列点 或者结果未定义 int a 0 int b a c a 我无法在标准中找到对此处序列点的具体引用 这是否意味着它未定义 或者只是我的搜索失败了 表达式的完成是一个序列点 但是上面的初始化也
  • 在 R 中为 pentium 4 HT 机器使用多核

    我在办公室使用Pentium 4 HT机器来运行R 一些代码需要plyr包 我通常需要等待6 7分钟才能完成脚本运行 而我看到我的处理器只使用了一半 我听说在 R 中使用多核包可以更好地利用多核处理器 我的情况适合吗 Thanks 有很多软
  • PyInstaller 2.1导入自定义包

    我有一个脚本正在尝试使用 Python 2 7 使用 PyInstaller 2 1 进行编译 该脚本使用我编写的名为 auto common 的自定义包 在脚本中 我使用以下命令导入它 sys path append path to pa
  • 如何在 Jupyter 中插入文字选项卡而不是自动完成?

    缩进整行很容易 Just highlight the whole line and press Tab Go to the start of the line and press Tab Click anywhere in the line
  • 如何获取枚举数

    如何获取枚举数 我有一个枚举 typedef enum DEL TIME VALUE 1 DEL TIMESEC VALUE 100 DEL TIMEMIN VALUE 200 DEL TIMEHOUR VALUE 300 DEL DAY
  • 用正则表达式获取最终的特殊字符

    我想要一个正则表达式 将字符串末尾的一些特殊字符分组 特殊字符是 和空格 例如 如果我有字符串 test 我想在组中获取字符串 我创建了以下正则表达式 问题是它给了我以下字符串 为什么要提取最后的括号 Put the 字符类中第一个或最后一
  • 循环选择某列并单独保存

    我的数据框是 c1 c2 c3 c100 0 2 0 4 0 9 0 0 2 0 3 0 1 0 1 0 6 1 0 3 我想选择c1 c2和c3 c1 c2和c4 类似的c1 c2和c100 每 3 个选定的列应保存在单独的文件中 我该怎
  • XNA 屏幕截图显示预绽放,而不是最终渲染

    我有一个使用 Reach 图形设置在 C XNA 4 0 中编码的 Windows 平台游戏 我的项目基于 GameStateManagement 示例 但后来我向其中添加了 Bloom 和 spriteSheet spriteBatch
  • Java Web 应用程序作为桌面应用程序,我应该选择哪些框架?

    我需要制作一个网络应用程序 我可以将其作为桌面应用程序安装在客户端 PC 上 数据库 jetty war firefox chrome sth 便携式 该应用程序是一个相当大的搜索应用程序 我必须使用 Lucene 只有几个屏幕 搜索队列中
  • 如何获得 makefile 函数来停止当前目标?

    我在 makefile 中有一个函数 如果文件不存在 或者至少是执行它的目标不存在 我想停止整个 make 运行 vaultfile vault shell test f 1 exit 1 define get token shell te