Bash 如何在Makefile中记录精确的配方行

Bash 如何在Makefile中记录精确的配方行,bash,makefile,Bash,Makefile,我希望记录用于在makefile中构建工件的确切命令。我想把它存储在一个文件中,供以后使用。由于引用,我遇到了一些问题。基本上,我想要的是: define record_and_run_recipe @echo '$(2)' > $1 $2 endef all: $(call record_and_run_recipe,out.cmd,\ @echo 'hello world "$$1"' ) cat out.cmd 我希望这个

我希望记录用于在makefile中构建工件的确切命令。我想把它存储在一个文件中,供以后使用。由于引用,我遇到了一些问题。基本上,我想要的是:

define record_and_run_recipe
    @echo '$(2)' > $1
    $2
endef


all:
    $(call record_and_run_recipe,out.cmd,\
            @echo 'hello world "$$1"' )
    cat out.cmd
我希望这个输出(准确)

当然,引号最终会与变量展开中的引号匹配,这会把一切搞砸。(取而代之的是
@echo hello world
)。Bash也不喜欢
'\'
,所以我不能简单地做
$(2:'=\')
。我似乎在
字符方面也有问题


我不想调试整个makefile,只想转储几个配方。我想知道是否有人有强大的方法来实现这一点。

正如我在上面的评论中所说,您可以使用GNU make的
$(info…
函数。上面的例子并不清楚你想做什么;为什么要将输出放入文件中,然后对其进行cat?这重要吗

如果不能使用
info
,处理shell中的引号的标准方法是用单引号括住字符串,然后用
'\'
替换每个引号。你说“bash不喜欢”,但我不知道那是什么意思。通常情况下,您会这样做:

define record_and_run_recipe
    @echo '$(subst ','\'',$2)' > $1
    $2
endef
就逗号而言,如果要使用
$(call…
函数,则逗号绝对有问题。避免这种情况的唯一方法是将字符串放入变量中,如:

output = foo, bar
    ... $(call blah,$(output))

要从调用中“隐藏”逗号,请尝试使用make的
$(info…
函数:make不关心引号。通常的方法是避免命令不重复(
@
),然后在
脚本
之类的工具中运行make命令。您不能使用
$(2:'=\')
,因为首先,这不会引用其他字符,其次,这种替换只替换一个元素,最后不是所有元素。请参阅下面我的回复:您需要使用
subst
来替换所有这些文件。我正在寻找作为配方副作用生成的文件(是的,我知道配方副作用不是好的做法…)。具体地说,对于每个.o,我想要一个.o.cmd文件,其中包含用于生成文件的命令。这将在后续的代码分析工具中使用。因此,不幸的是,我无法解析make的输出来找到它,
$(info)
对我来说不起作用…好的,请参阅我的其他建议如果在bash提示符下执行
echo'\''
,它会将第一个引号与第二个引号(未转义…)匹配,然后会看到第三个引号,并提示您输入第二行…逗号并不是一个大问题。我不必担心变量中的逗号,因为参数边界似乎是在变量展开之前确定的。因此,在我正在检测的配方中避免手动逗号应该不难。对不起,我的
subst
命令错误。它在我的更新版本中工作
output = foo, bar
    ... $(call blah,$(output))