【发布时间】:2020-06-19 12:19:29
【问题描述】:
在我的makefile 中有一个针对每个目标文件的规则。对应的源文件和隐藏的依赖文件是前提条件。
示例: obj/test/bar.o : src/test/bar.c src/test/.bar.d
由于可能有大量的目标文件,我想概括一下这个规则。我的第一次尝试如下:
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(SRCEXT) $(dir $(SRCDIR)/%.$(DEPSEXT)).$(notdir $(SRCDIR)/%.$(DEPSEXT))
与
$(BUILDDIR):=obj
$(SRCDIR):=src
$(OBJEXT):=o
$(SRCEXT):=c
$(DEPXEXT):=d
问题在于第二个先决条件中的模式规则评估在 dir 和notdir 已被应用。因此,上述示例的第二个先决条件是/src/.test/bar.d,而不是/src/test/.bar.d。
作为替代方案,我尝试使用以下 shell 命令生成正确的先决条件:
%.$(OBJEXT): $(shell echo %.$(SRCEXT) | sed -e 's/^[^\/]*/src/') $(shell echo %.$(SRCEXT) | sed -e 's/^[^\/]*/src/;s/^\(.*\/\)/\1./')
我正在使用sed 对目标文件执行字符串替换。正则表达式经过测试并且正确。虽然通配符% 对echo 可见,但我无法将它通过管道传输到sed。因此,sed 接收到一个空字符串并输出一个“错误”的结果。
问题:
- 如何调整规则以使其正常工作?
- 为什么
echo会看到%,但为什么无法通过管道将其导入sed?
【问题讨论】: