-1

在 GNU Makefile 中,我使用多行变量语法定义临时文件的内容,如下所示:

define __FOO__
file
with
many
lines
endef

这个文件恰好是一个 GDB 脚本,它支持具有以下语法的函数定义:

define my-func
    foo
end

我想你已经看到了问题:

define __FOO__
define my-func
    foo
end
endef

make吐出以下错误:

Makefile:218: *** missing 'endef', unterminated 'define'.  Stop.

在我上面发布的链接中,GNU 自信地解释了该功能:

您可以嵌套定义指令:make 将跟踪嵌套指令并在它们没有全部被 endef 正确关闭时报告错误。请注意,以配方前缀字符开头的行被视为配方的一部分,因此出现在此类行上的任何 define 或 endef 字符串都不会被视为 make 指令。

因此,如果我听从该建议并\t在每行的开头插入配方前缀字符 ( ):

define __FOO__
        define my-func
            foo
        end
endef

它很高兴地解析了这个,但是当我将它写入配方中的文件时,现在每行的前面__FOO__都有一个前导:\t

foo:
        @echo $$__FOO__ > my-file
$ cat my-file
        define my-func
            foo
        end

在很多情况下这可能没问题,但我可以想象它会导致一些潜在的模棱两可的内容,我宁愿明年不享受调试。

我应该如何处理这个 - 包括一个带有前导的字符串define,并且在输出中没有前导选项卡?

4

1 回答 1

1
Makefile:218: *** missing 'endef', unterminated 'define'.  Stop.

您可以通过使用扩展为整个或部分麻烦指令的宏来解决此问题。

最简单最笨的:

d = d
e = e
define __FOO__
$define my-func
    foo
$end
endef


export __FOO__
all:; @printf '%s\n' "$$__FOO__"
于 2021-08-31T11:57:29.783 回答