如何在仅限订单的先决条件中调用函数?

2024-04-05

鉴于 Makefile 的这一点:

# for pattern matching
$(OBJDIR) := build

# just to see if a level of indirection will work
my_dir = $(dir $(1))

$(OBJECTS) : $(OBJDIR)/% : $(HEADERS) $(SRCDIR)/% | % $(dir %) $(call my_dir,%)
  @echo output-only = $|

这是一个静态模式规则 http://www.gnu.org/software/make/manual/make.html#Static-Pattern with 仅订单先决条件 http://www.gnu.org/software/make/manual/make.html#Prerequisite-Types.

考虑目标“build/utility/debug.js”。上述规则的输出将是这样的:

output-only = utility/debug.js ./
  • 第一个组件“utility/debug.js”是从主干 (%) 正确复制的。
  • 第二个组件“./”是调用的输出dir先决条件列表中的功能。
  • 第三个组成部分是一个空字符串,是调用 my 的输出my_dir先决条件列表中的功能。

如果我改变my_dir对此:

my_dir = $(1)

输出保持不变。如果我把它改成这样:

my_dir = "foo"

然后抱怨没有规则可以制作“foo”(这是预期的)。那么看来$(1)未在调用中绑定my_dir.

这是怎么回事?为什么我不能将主干传递给函数?我有一个使用二次扩展的解决方法,但我想知道为什么我不能以这种方式编写规则。

EDIT:我是 stackoverflow 的新手,如果这不是这里做事的方式,请原谅我。

我想要 $(1) 因为我将词干作为参数传递给my_dir,正如亚历克斯指出的那样。

我不知道为什么有人建议我想要“$”。我不相信 $ 本身可以扩展到任何上下文中的任何内容。

我知道自动变量仅在配方中可用。我没有在先决条件中使用自动变量 - 我正在使用主干:

每个目标都与目标模式进行匹配,以提取目标名称的一部分(称为词干)。该词干被替换到每个先决条件模式中以形成先决条件名称(每个先决条件模式中的一个)。- 手册 http://www.gnu.org/software/make/manual/make.html#Static-Usage

示例证明了茎可用的事实:单独使用时茎会扩展为正确的值,但传递给函数时则不会。


可以看出GNU make 手册的这一部分 http://www.gnu.org/software/make/manual/make.html#Reading-Makefiles在读入阶段,先决条件列表中的变量和函数引用会立即展开。这意味着,在完成任何模式匹配之前,%尚无特殊意义;它在两个函数引用中被解释为文字字符,$(dir %) and $(call my_dir,%),两者都有./结果,它被合并到对$|在食谱中。

除了您已经找到的解决方法(即二次扩展)之外,我不知道还有其他解决方法。

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

如何在仅限订单的先决条件中调用函数? 的相关文章

随机推荐

  • Paramiko:从公钥字符串创建 PKey

    我试图在低级别使用 SSH 协议 即我不想启动 shell 或任何东西 我只想传递数据 因此 我正在使用Paramiko的Transport http www lag net paramiko docs paramiko Transport
  • 乐谱库

    我是一名 Python 黑客 希望构建一个乐谱应用程序 我很擅长阅读 理解乐谱 弹钢琴多年 这是我完整的新手问题 是否有以数字方式表示笔记的标准 我不想重新发明任何轮子 给定一系列音符和持续时间 是否有一个库可以以乐谱格式显示这些内容 基本
  • 为什么我收到 422 错误代码?

    我正在发出 POST 请求 但除了 422 响应之外无法获得任何内容 Vue js 客户端代码 new Vue el app data form companyName street city state zip contactName p
  • iOS:Facebook 聊天头行为和动画

    这个问题可能有点过时了 但我一直在使用新的 iOS 版 Facebook 的 聊天头 功能 聊天头仅出现在应用程序中 并且想知道 Facebook 是如何实现这一点的 例如 他们如何处理聊天头的拖动动画 以及 当单击聊天头时 他们如何设法将
  • 在redux中间件中使用react-router进行重定向

    我创建了一个中间件来检查请求是否返回无效的访问响应 如果状态是 401 我想将用户重定向到登录页面 这是中间件代码 import React from react import push replace from react router
  • TPageControl 上的 TLinkLabel 背景

    我试图在 TPageControl 上使用 TLinkLabel 但找不到让它使用父级背景的方法 Image removed because the website doesn t exist any more and I can t fi
  • iOS 文本字段验证

    我需要一种方法来确保电话号码有 10 位数字 没有其他字符 即 并确保电子邮件地址是有效的电子邮件 格式正确 有没有任何库不能让我轻松做到这一点 这样我就不必编写正则表达式了 这将检查 UITextField 是否包含 10 位或更少的正确
  • 如何设置使用 ChartFactory.createBarChart 创建的 BarGraph 的 Y 轴范围

    我使用创建了一个条形图jfree chart ChartFactory使用下面的代码 我需要将Y轴的范围设置为0 100 如何设置最大值 import java io File import org jfree chart ChartFac
  • 在 Swift 中仅更改 AttributedText 的字体

    我在 IB 中创建了许多 UILabel 它们都有属性文本 每个标签的文本包含多行不同字体大小和颜色 在运行时 我希望能够仅更改这些标签的字体名称 而不更改现有的字体大小或颜色 我进行了研究 但找不到直接的方法来实现这一目标 有任何想法吗
  • 在现有 Firebase 项目目录中初始化 firebase CLI 功能

    我正在尝试将 托管 功能添加到已安装 Functions 的 Firebase 项目文件中 所以我想知道我是否可以使用 Firebase Init 来做到这一点 否则这将删除我现有的 firebase 功能 无论如何 我可以在不删除 Fir
  • Parallel.ForEach 和 DataTable - DataTable.NewRow() 不是线程安全的“读取”操作吗?

    我正在转换现有的应用程序以利用多个处理器 我有一些嵌套循环 并且我已将最内层循环转换为 Parallel Foreach 循环 在原始应用程序中 在最内层循环内 代码将调用DataTable NewRow 要实例化适当布局的新 DataRo
  • php oop 使用 ajax 登录失败

    我已经使用 php oops 和 ajax 作为登录按钮完成了登录页面 if isset result username 它以 Json 类型返回错误的详细信息 if isset result username 其返回成功的 Json 类型
  • 如何在 AuthenticationSuccessHandler 中检索会话范围的 bean?

    我有一个自定义的 AuthenticationSuccessHandler 我想要做的是在 onAuthenticationSuccess 方法中设置一些会话数据 为了存储会话数据 我想使用会话范围的 bean 它在任何控制器中都可以正常工
  • nginx + php5-fpm 中的错误 502

    我的主题有一些错误 服务器负载不高 CPU约15 内存有几GB 硬盘不忙 但错误 502 大约在 3 的情况下抛出 程序 Debian 6 nginx 0 7 62 php5 fpm 5 3 3 1 在nginx的error log中是这样
  • QThread.wait()函数有什么用?

    我和其他人一样偶然发现了这个问题 QThread 不会停止 不处理信号 https stackoverflow com questions 7432861 qthread wont stop does not process a signa
  • C 语言的完整 x86/x64 JIT 汇编器

    你知道类似的事情吗this http code google com p asmjit 但是可以嵌入到 C 程序中吗 一些选项 LibJIT http www gnu org software dotgnu GNU闪电 http www g
  • 使用maven为eclipse编译器设置Java 6注释处理配置

    为 Java 6 注释处理器设置 eclipse 项目编译器配置的最佳方法是什么 我的解决方案是设置org eclipse jdt apt core prefs and factorypath手动文件 这有点麻烦 在工厂路径文件中引用处理器
  • 最大函数c树高度

    c 中是否有 max 函数 所以我可以做这样的事情来计算树高 或者也许有更好的方法来计算树高 int height struct node tree if tree NULL return 0 return 1 max height tre
  • 如何在不使用 Management Studio 的情况下更改 SQL Server 授权模式

    有没有办法在不使用 SQL Server Management Studio 的情况下更改 SQL Server 2008 或 2012 中的授权模式 以下是 Management Studio 将身份验证模式从混合更改为仅 Windows
  • 如何在仅限订单的先决条件中调用函数?

    鉴于 Makefile 的这一点 for pattern matching OBJDIR build just to see if a level of indirection will work my dir dir 1 OBJECTS