GNU make 自动依赖生成

Jer*_*rry 5 linux sed gnu-make

最近在学习GNU make。以下是 GNU make 手册中自动生成依赖项的示例。我知道上面脚本的一般含义(它基本上是用命令用其他东西替换一些东西sed)。但我对命令中的细节有两个问题。\1.o首先,命令中的含义是什么?与位置参数有关吗?其次,为什么$*要放入一对,()因为$*它本身已经意味着目标文件名的主干?(我尝试不加括号,但没有成功。)

%.d: %.c
    $(CC) -M $(CPPFLAGS) $< > $@.$$$$;                  \
    sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
    rm -f $@.$$$$
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法,但没有成功。

%.d: %.c
    $(CC) -M $(CPPFLAGS) $< > $@.$$$$;                  \
    sed 's,$*\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@;     \
    rm -f $@.$$$$
Run Code Online (Sandbox Code Playgroud)

谁能解释一下背后的原因吗?谢谢。

5go*_*der 4

文本被解释多次

\n\n
\'s,\\($*\\)\\.o[ :]*,\\1.o $@ : ,g\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

第一步,Make 扩展$变量。例如:

\n\n
\'s,\\(foo\\)\\.o[ :]*,\\1.o foo.d : ,g\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

接下来,该字符串被传递到 Shell,后者会去掉引号。

\n\n
s,\\(foo\\)\\.o[ :]*,\\1.o foo.d : ,g\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后由 来解读sed。在默认情况下理解的基本正则表达式中sed\\(\xe2\x80\xa6\\)简单匹配\xe2\x80\xa6但对匹配进行分组。然后,在替换中,您可以引用匹配的文本。 指的是匹配的第 N个组。所以在这个例子中,简单地引用任何匹配的 \xe2\x80\x93 可能。(如果扩展到正则表达式中具有特殊含义的内容,您可能会遇到麻烦。请注意,反向引用使正则表达式变得非正则,但这可能与这里无关。)\\N\\1$*foo$*

\n\n

根据我的理解,这不是一种非常可靠的编写替换的方法,并且实际上没有必要在这里使用反向引用。通过这样的替换,可以更有效地实现预期的效果。

\n\n
\'s,[^:]*:,$*.o $@ :,g\'\n
Run Code Online (Sandbox Code Playgroud)\n