有人能解释一下这个食谱吗?

时间:2017-01-05 14:52:01

标签: sed makefile

$(Q)makedepend $(CFLAGS) -o.o -f- $< 2> nul: | sed -e s!$(<:.cpp=.o)!$@! -e s!\\!/!g > $(@:.o=.d)

这是contiki makefile中以下规则的一部分。

CUSTOM_RULE_CPP_TO_OBJECTDIR_O = 1
$(OBJECTDIR)/%.o: %.cpp | $(OBJECTDIR)
    $(TRACE_CC)
    $(Q)cl -nologo $(VCFLAGS) -c $< -Fo$@
    $(Q)makedepend $(CFLAGS) -o.o -f- $< 2> nul: | sed -e s!$(<:.cpp=.o)!$@! -e s!\\!/!g > $(@:.o=.d)

如果您想在downvoting之前获得更多信息,请告知我们。感谢

1 个答案:

答案 0 :(得分:0)

我不确定你想要解释的是什么。这是一个调用makedepend程序的命令行,将其stderr重定向到nul:(看起来好像是在DOS系统上运行?但是使用像sed这样的UNIX工具?)并将其输出发送到sedsed程序正在将makedepend输出中的.o文件名转换为实际目标名称(包括路径),并将反斜杠转换为正斜杠。

然后将结果写入.d文件。大概在makefile的某个地方,你会发现一行使用include来包含所有.d个文件。

基本上,这是一种自动生成头文件依赖关系的方法,以便make在更改时重建目标文件,而无需在makefile中手动编写它们。

ETA

  • $(Q)
    一个make变量引用,它可能扩展为@或不扩展,以控制makefile的详细程度。
  • makedepend $(CFLAGS)-o.o -f- $&lt;
    使用makedepend选项调用CFLAGS并将结果写入stdout(-f-),阅读源文件($<
  • 2 - ; NUL:
    将stderr重定向到nul:,在Windows上是一个特殊的字符设备,这意味着“扔掉它”。
  • |
    将上一个命令的输出发送到下一个命令的输入。
  • SED
    运行sed(流编辑器)程序,这是一个UNIX / POSIX程序,逐行操作文件(通常)。
  • -e s!$(&lt;:。cpp = .o)!$ @!
    第一个操作替换目标文件的普通名称(例如,如果您正在编译foo.cpp,则$<foo.cpp$(<:.cpp=.o)替换.cpp使用.o,结果为foo.o),其中包含目标名称:$@将是obj/foo.o的完整目标名称,如果OBJECTDIR为{ {1}}。
  • -e s!\\!/!g
    第二个替换用正斜杠替换所有反斜杠(从shell转义,所以obj)。
  • &GT; $(@ :. O = .D)
    将sed命令的输出写入文件\\$@替换为.o,因此如果.dOBJECTDIR,则会写入{{1} }}