gpt4 book ai didi

makefile - 如何阻止 GNU make 干扰包含美元符号的文件名?

转载 作者:行者123 更新时间:2023-12-03 22:25:09 26 4
gpt4 key购买 nike

所以我正在编译 java 代码,它通常会创建 .class 文件,其中文件名中有一个美元符号。 GNU make 似乎讨厌这个并不断干扰文件名。

作为一个简单(人为的)示例,假设我想创建一个 GNU Makefile 任务,该任务将对 MyFolder 目录(及其子文件夹)中的所有 .class 文件执行十六进制转储。

现在假设 MyFolder 有以下文件:

MyFolder/makefile
MyFolder/sample.java
MyFolder/subdir/abc$1.class
MyFolder/subdir/test.java
MyFolder/xyz.class


目标是编写一个运行 hexdump 的配方,将 MyFolder(及其子文件夹)中的所有 .class 文件传递​​给它。所以对于上面的文件列表,GNU make 应该执行的最终命令是:

hexdump subdir/abc$1.class xyz.class


这应该就像从日志上掉下来一样容易,但是 GNU make 似乎已经竭尽全力使这变得尽可能困难。使用以下 Makefile 的幼稚尝试不起作用:

default:
hexdump $(shell find -name '*.class')


如果你运行这个 Makefile,你会得到以下错误:

hexdump ./subdir/abc$1.class ./xyz.class
hexdump: ./subdir/abc.class: No such file or directory
make: *** [makefile:3: default] Error 1


注意上面输出的第一行,命令是正确的(文件名包含美元符号)。但是随后执行 get 的实际命令,“$1”已被评估掉。

事实上,当使用双美元符号正确转义美元符号时,即使下面的 Makefile 也会失败。当然,我想编写一个不对文件名进行硬编码的配方,但是应该使用 $(shell find ...) 命令找到这些文件

default:
hexdump subdir/abc$$1.class xyz.class


即使上面的 Makefile 也失败,并出现与第一个 Makefile 相同的错误。

如何阻止 GNU make 干扰包含美元符号的文件名? java编译器一直在创建这些东西,所以肯定有人以前遇到过这个吗?

最佳答案

make 不会解释 $(shell …)在配方中以这种方式使用时再次输出。问题是shell解释了$1并将其扩展为第一个(不存在的)参数,即空字符串。

如何解决此问题实际上取决于您遇到此问题时正在做什么。 GNU make 不提供任意的 shell 引用功能,并且无论如何都会有包含空格的文件名的问题。您或许可以尝试使用 ' 将文件名括起来,从而避免 Java 类文件的参数替换。 :

hexdump $(patsubst %,'%',$(shell find -name '*.class'))

另一种方法是在 shell 中创建文件列表,使用以下内容:
find -name -print0 | xargs -0 hexdump

这完全避免了 shell 对字符串的解释。即使
hexdump $$(find -name '*.class')

shell 不会解释 $在文件名中签名是因为命令替换输出只受分词和路径名扩展(通配),而不是参数替换。

关于makefile - 如何阻止 GNU make 干扰包含美元符号的文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47419205/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com