$(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之前获得更多信息,请告知我们。感谢
答案 0 :(得分:0)
我不确定你想要解释的是什么。这是一个调用makedepend
程序的命令行,将其stderr重定向到nul:
(看起来好像是在DOS系统上运行?但是使用像sed这样的UNIX工具?)并将其输出发送到sed
。 sed
程序正在将makedepend输出中的.o
文件名转换为实际目标名称(包括路径),并将反斜杠转换为正斜杠。
然后将结果写入.d
文件。大概在makefile的某个地方,你会发现一行使用include
来包含所有.d
个文件。
基本上,这是一种自动生成头文件依赖关系的方法,以便make在更改时重建目标文件,而无需在makefile中手动编写它们。
ETA
@
或不扩展,以控制makefile的详细程度。makedepend
选项调用CFLAGS
并将结果写入stdout(-f-
),阅读源文件($<
)nul:
,在Windows上是一个特殊的字符设备,这意味着“扔掉它”。foo.cpp
,则$<
为foo.cpp
,$(<:.cpp=.o)
替换.cpp
使用.o
,结果为foo.o
),其中包含目标名称:$@
将是obj/foo.o
的完整目标名称,如果OBJECTDIR
为{ {1}}。obj
)。\\
,$@
替换为.o
,因此如果.d
为OBJECTDIR
,则会写入{{1} }}