为什么 .SECONDARY 不能与模式 (%) 一起使用,而 .PRECIOUS 可以?

2023-12-25

我的问题是更好地理解我在制作过程和 .SECONDARY 目的与 .PRECIOUS 中错过的内容,而不是让我的脚本工作,因为它已经工作了。

我正在使用 make 打开文件上的 emacs 编辑器( java 但与此问题的目的无关),或者使用模板创建它(如果不存在)。

如果它适用于现有文件,使用生成的文件时,它在最后被删除.

我在 .SECONDARY 中添加了先决条件,但没有帮助,我必须将其添加到 .PRECIOUS 中。

这是问题为什么它在 .SECONDARY 中不起作用? .

从我在SO上发现的.SECONDARY 不适用于模式 ( % ),但即使知道我想知道这是设计使然还是 make 中的错误。 (.SECONDARY 用于 GNU Make 的模式规则 https://stackoverflow.com/questions/17625394/secondary-for-a-pattern-rule-with-gnu-make and Makefile 模式规则要么忽略虚假规则,要么自发删除输出文件 https://stackoverflow.com/questions/19883282/makefile-pattern-rule-either-ignores-phony-rule-or-spontaneously-deletes-output/19892035#19892035 )

这里是我的 Makefile 的精简内容,用于重现我的问题(请创建一个 com/stackoverflow/question 目录来测试它)。

PACKAGE=com.stackoverflow.question
PACKAGE_DIR=$(subst .,/,$(PACKAGE))
OUT=out

clean:
    find $(OUT) -name "*.class" -type f -print0|xargs -0 rm

# does not work : deleted at end due to intermediate file removal.
$(PACKAGE_DIR)/%.java:
    @echo "package com.stackoverflow.question;\npublic class $(subst .java,,$(subst $(PACKAGE_DIR)/,,$@))\n{\n /** TODO */ \n}" >$@ 

work/%: $(PACKAGE_DIR)/$(subst work/,,%).java
    emacs $<

.PHONY: clean work/%

# tried to avoid intermediate file removal : does not work
.SECONDARY: $(PACKAGE_DIR)/%.java 

# if not commented this does work : once precious intermediate file is not removed.
#.PRECIOUS: $(PACKAGE_DIR)/%.java 

try

制作工作/SoTest

我知道这被标记为中间。

然后查看 SO,我尝试将其设置为 .SECONDARY:目标列表:也不起作用。

查看 make 源代码,我发现 make 中间文件删除是在这种情况下完成的:

if (f->intermediate && (f->dontcare || !f->precious)
    && !f->secondary && !f->cmd_target)

所以我将文件设置为 .PRECIOUS: 现在它可以工作了。

它显示到控制台:

com/stackoverflow/question/SoTest.java

它运行 emacs 并使用正确的模板,因此创建是可以的 在这里我退出emacs

它会删除最后的文件

rm com/stackoverflow/question/SoTest.java

最后的删除是由于中间文件造成的,这可以通过 make 上的 -d 选项看到

LANG=C make -d 工作/SoTest

...
Must remake target 'work/SoTest'.
emacs com/stackoverflow/question/SoTest.java
Putting child 0xc3b580 (work/SoTest) PID 20681 on the chain.
Live child 0xc3b580 (work/SoTest) PID 20681 
Reaping winning child 0xc3b580 PID 20681 
Removing child 0xc3b580 PID 20681 from chain.
Successfully remade target file 'work/SoTest'.
Removing intermediate files...
rm com/stackoverflow/question/SoTest.java

为了让它工作,我需要取消注释 .PRECIOUS 段落。

制作--版本

GNU Make 4.0
Construit pour x86_64-pc-linux-gnu
Copyright (C) 1988-2013 Free Software Foundation, Inc.
Licence GPLv3+ : GNU GPL version 3 ou ultérieure <http://gnu.org/licenses/gpl.html>
Ceci est un logiciel libre : vous êtes autorisé à le modifier et à la redistribuer.
Il ne comporte AUCUNE GARANTIE, dans la mesure de ce que permet la loi.

感谢亚历克斯(参见答案),我在搜索中走得更远。

我发现它在make项目的TODO.private中记录了15年....

使用 git://git.savannah.gnu.org/make.git 您可以查看 TODO.private 内容的历史记录:

 6) Right now the .PRECIOUS, .INTERMEDIATE, and .SECONDARY
    pseudo-targets have different capabilities.  For example, .PRECIOUS
    can take a "%", the others can't.  Etc.  These should all work the
    same, insofar as that makes sense.

只要有意义,这些都应该发挥相同的作用。但没有编码。

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

为什么 .SECONDARY 不能与模式 (%) 一起使用,而 .PRECIOUS 可以? 的相关文章

  • 如何在 Windows 上应用差异补丁?

    有很多程序可以创建差异补丁 但我在尝试应用一个程序时遇到了很大的困难 我正在尝试分发补丁 但用户向我询问了如何应用该补丁 于是我尝试自己弄清楚 结果发现我毫无头绪 而且我能找到的大多数工具都是命令行的 我可以处理命令行 但是如果没有一个漂亮
  • 如果未设置,则从控制台读取 Makefile 变量

    我正在更新一个从外部源访问某些资源的 Makefile 即存在以下形式的规则 External cvs up 对于不受限制的资源 它可以按预期工作 现在 出现了功能漂移 外部资源需要更复杂的登录 因此规则已更改为与此没有太大不同的内容 Ex
  • 在 GNU C++ 编译器中运行具有多个源文件的程序

    我在 Windows 7 操作系统上使用 DEV GNU c 编译器 我需要知道如何编译具有多个源文件的程序 这是例子 FILE1 void f1 printf this is another file under same program
  • 如何在 makefile 中拥有正确的 .mod 顺序

    我正在尝试用 Fortran 为我的项目创建一个 Makefile 并使其可在现在的项目中重用 我经过多次尝试后得出的 Mkefile 如下 问题是它在少数情况下工作正常 但现在我有这个文件 main f90 初始 f90 参数 f90 函
  • 致命错误:向量:没有这样的文件或目录

    我有一个 Android 项目 其中包含大量 C 本机代码 但是 我无法构建我的库 因为它无法找到 vector h 头文件 可能是什么问题 我在几乎所有页面中包含的示例 include
  • 在赋值时计算 Makefile 变量

    在 Makefile 中 我尝试将 shell 命令的结果分配给变量 TMP mktemp d tmp XXXXX all echo TMP echo TMP but make Makefile all 正在回显 2 个不同的值 例如 tm
  • makefile 目标依赖项取决于目标名称

    我有以下规则 SPECIAL file1 file2 o cpp a h CC c CFLAGS lt o 我希望如果 is in SPECIAL then b h已添加到依赖项列表中 有没有办法做到这一点 而不重复规则 您可以单独分配其他
  • makefile 使用目标中定义的变量[重复]

    这个问题在这里已经有答案了 如何使用 make 目标中定义的变量 PHONY foo VAR GLOBAL shell cat tmp global foo echo local gt tmp local VAR LOCAL shell c
  • 错误:-march= 开关的值错误

    我写了一个Makefile 但无法让它工作 我有一个选项应该选择编译到哪个处理器 然而 当我跑步时make从命令行它说 tandex tandex P 6860FX emulators nintendo sdks 3DS SDK HomeB
  • 控制 make 命令的输出不那么冗长,不要回显每个命令

    目前 我正在使用 Makefile 来跟踪项目的所有依赖项和编译 问题是make只是输出它正在执行的所有操作 这使得很难发现 甚至读取 更重要的信息 例如编译器警告 有没有办法控制终端上显示哪些信息 我知道有一个 s沉默的选项make 但这
  • make:仅针对单个目标禁用子目录中的并行构建

    我有一个相当庞大的由自动工具驱动的项目 它位于一个目录树中 该目录树由许多带有子目录的目录组成 它有一个目标check 在每个子目录以及主目录中 执行大量自动化测试 这check目标是递归构建的 并行构建和测试 通过 j选项 make 适用
  • 为什么 make 会删除我的临时文件?

    我有一个简单的 Makefile PHONY clean PROGRAMS patsubst main cpp example wildcard main cpp all PROGRAMS GCCVERSION shell gcc dump
  • Makefile:如何正确包含头文件及其目录?

    我有以下 makefile CC g INC DIR StdCUtil CFLAGS c Wall I INC DIR DEPS split h all Lock o DBC o Trace o o cpp DEPS CC o lt CFL
  • 从 makefile 内部传递命令行参数

    我有一个 makefile 我试图从中调用一个可执行文件 该可执行文件需要 5 个参数 我如何从 makefile 传递这些参数 这样做不起作用 run exe arg1 somevalue arg2 somevalue arg3 some
  • 如何让 Makefile 目标被多次调用?

    在下面的简单示例中 我想做一个make dist并拥有distclean之前执行的目标distdebug and distrelease PHONY distclean dist distdebug distrelease echo in
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 具有此处文档重定向的 Makefile 配方

    有谁知道如何在菜谱上使用此处文档重定向 test sh lt
  • 如何将宏定义从“make”命令行参数(-D)传递到C源代码?

    我通常使用以下选项将宏定义从 make command line 传递到 makefile D名称 值 该定义可在 makefile 中访问 我还使用类似的编译器选项将宏定义从 makefile 传递到 源代码 Dname value 许多
  • /usr/bin/ld: 使用 makefile 编译时找不到 -lc

    上下文第一 我有一个标头 event h 一个名为 event c 的程序和主程序 main c 该程序将被编译 首先生成一个目标程序 event o 然后在一个单独的文件夹中生成一个静态库 libevent a 然后生成可执行程序work
  • 如何在makefile中添加多行注释

    有没有办法像 C 语法一样注释掉 makefile 中的多行 不 没有什么比 C 风格更好的了 makefile 中的注释 正如其他人所建议的 您可以通过使用行延续来进行多行注释 例如 This is the first line of a

随机推荐

  • 当我传递特定参数时,使用 ElementTree 的 iter() 解析 XML 找不到我的标签

    尝试从标签返回属性和值 逐字逐句地遵循 ElementTree 文档不会产生任何结果 没有错误 它只是运行并且不打印任何内容 如果我在没有参数的情况下运行 iter 它会打印每个标签 但如果有参数 它什么也不做 不知道发生了什么事 find
  • 使用 dockerfile 安装 Composer

    我对 docker 还很陌生 我尝试在 Dockerfile 中自动执行 Composer install 但在安装时似乎无法 cd 进入我的应用程序 出了什么问题 或者也许还有另一种更好的方法来做到这一点 我的 docker compos
  • 如何显示 MKAnnotation 的副标题 2 行文本并更改右侧按钮的图像?

    我正在查看 Apple 的 MapCallouts 示例 了解地图注释和标注 单击图钉时出现的气泡 每个注释都有坐标 标题和副标题 我想用两行显示字幕 我尝试过 NSString subtitle return Founded June 2
  • 即使用户已登录,wolkenkit 也会重定向到 Auth0

    我只是尝试按照 wolkenkit 文档使用聊天模板测试 wolkenkit 的身份验证 用户登录似乎可以工作 但即使用户已经登录 用户也会被重定向到 Auth0 客户端无需调用auth login方法 这是来自客户端的代码片段 wolke
  • 使 JEditable 适用于新元素 (.live)

    我正在使用 JEditable 插件进行就地编辑 我有一个 设置 功能 它调用 editable 所有相关课程 问题是 我有新附加的元素 我也想使其可编辑 显然 是新增的 editable 永远不会被叫到他们 换句话说 我希望获得 jque
  • Firebase 离线商店 - 查询未返回在线商店中的更改

    我在用着Firebase离线能力设置为 true let ref FIRDatabase database referenceWithPath my data child my users id scoresRef keepSynced t
  • 如何使用 javascript/jquery 动态更改图像?

    所以 我有这个http jsfiddle net ithril UjGhE 1 http jsfiddle net ithril UjGhE 1 请检查一下 我在这里尝试的是将主图像 img 标签的 src 动态更改为所单击图像的相同 sr
  • android 列表视图意图

    单击列表视图后 我无法创建意图 完成后提示错误 应用程序意外停止 请重试 public void onItemClick AdapterView
  • 缺少 Sweet Alert 的选择选项

    这可能是一个 ServiceNow 问题 但我添加了一个甜蜜警报来显示一个选择框 这样我就可以收集一个值以传递到下一条记录 但是选择框没有显示 弹出窗口只是没有框或选项 我缺少什么 截屏 选择框警报 https i stack imgur
  • Laravel 中的动态数据库连接

    我知道在 Laravel 中你可以通过在config database php文件 然后使用DB connection my conn name 但是无论如何都可以使用未在其中指定的连接config database php file 我正
  • 将类转换为字节数组 + C#

    如何在 C 中将类转换为字节数组 这是一个托管代码 因此以下代码失败 int objsize System Runtime InteropServices Marshal SizeOf objTimeSeries3D byte arr ne
  • 将 std::allocate_shared 与多态资源分配器一起使用

    我正在尝试创建共享指针std pmr monotonic buffer resource 我无法编译它 我缺少什么 https godbolt org z R9 jdju https godbolt org z R9jdju include
  • 为什么当工作线程要退出时我们需要检查IsIoPending?

    从win32threadpool cpp中我们知道 工作线程在通过检查20秒超时退出之前 需要通过IsIoPending 方法检查是否有IO挂起 根据我的理解 1 当工作线程要退出时 它必须完成它的工作并返回到线程池 2 基于上述1 线程退
  • HTML5 国际化

    如何更改 HTML5 的消息 或者它是否根据浏览器的语言自动更改 例如
  • Javascript 事件绑定持久化

    如果您有一个不断呈现 销毁的 HTML 元素 那么与 HTML 的 Javascript 事件绑定是否持续存在 或者是否有必要在创建 销毁周期中绑定 取消绑定事件 我正在使用 D3 生成美国各县的地图 此外 我正在生成一个工具提示叠加层 其
  • 通过 .bat 添加/删除键盘语言

    现在我使用 win7 一段时间 它经常弄乱我的键盘语言 我必须远程添加 3 种键盘语言 应用 然后删除它们 所以 我想知道是否有办法通过 bat 文件自动执行此操作 添加 3 种特定的键盘语言 然后立即删除它们 但是 我对 bat 命令几乎
  • async/await 的作用是什么?

    我正在尝试了解 python 中的 async await 我走在正确的轨道上吗 async and coroutine函数返回协程 生成器 而不是返回值 await提取协程 生成器的实际返回值 async函数结果 协程 旨在添加到事件循环
  • 为什么条件断点会降低调试时应用程序的执行速度?

    当我在VS2005中使用条件断点而不是使用临时代码来检查特定条件时 我注意到它需要更多时间并且执行速度降低 你知道为什么吗 以及如何解决这个问题 Exmaple int sequence atoi m SequenceNumber GetA
  • 使用 Eclipse DDMS 将大文件推送到模拟器/SD 卡时出现问题

    我正在使用 Eclipse DDMS 将文件推送到我的 Android 模拟器 sdcard 上 我选择文件并按 打开 会弹出一个对话框并开始推送文件 在 DDMS 透视图的 文件资源管理器 视图中 我可以看到 sdcard 目录并可以看到
  • 为什么 .SECONDARY 不能与模式 (%) 一起使用,而 .PRECIOUS 可以?

    我的问题是更好地理解我在制作过程和 SECONDARY 目的与 PRECIOUS 中错过的内容 而不是让我的脚本工作 因为它已经工作了 我正在使用 make 打开文件上的 emacs 编辑器 java 但与此问题的目的无关 或者使用模板创建