2

我试图了解如何在给定链接中的 makefile 中生成自动依赖关系,但我无法理解以下代码:

DEPDIR = .deps
df = $(DEPDIR)/$(*F)

SRCS = foo.c bar.c ...

%.o : %.c
        @$(MAKEDEPEND); \
          cp $(df).d $(df).P; \
          sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
              -e '/^$$/ d' -e 's/$$/ :/' < $(df).d >> $(df).P; \
          rm -f $(df).d
        $(COMPILE.c) -o $@ $<

-include $(SRCS:%.c=$(DEPDIR)/%.P)

我从这个链接得到它。我知道它会生成依赖文件,但我无法理解这一行的作用:

sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
    -e '/^$$/ d' -e 's/$$/ :/' < $(df).d >> $(df).P; \

有人可以解释一下这段代码吗,这么多通配符给了我蝴蝶,我是makefile的新手。

4

2 回答 2

2

那是许多不同的命令,所以将其分解。

  1. -e 's/#.*//'

    删除以 a 开头的所有内容#(评论?预处理器指令?)

  2. -e 's/^[^:]*: *//'

    删除所有: 拥有: 它的所有内容。

  3. -e 's/ *\\$$//'

    从行尾删除续行斜杠(和它们之前的空格)。

  4. -e '/^$$/ d'

    删除任何空行。

  5. -e 's/$$/ :/'

    添加 :到每一行的末尾。

这为每个列出的依赖文件添加了明确的目标,以便“知道”如何构建它们以避免“没有规则来制作目标”错误。这里的推理在前面部分的链接中进行了解释。

简而言之,这将创建一个具有原始先决条件列表的 .P 文件,然后通过获取每一行、删除任何现有目标信息和任何行继续 (\) 字符,然后在末尾添加目标分隔符 (:) 来添加目标。这适用于我在下面建议的 MAKEDEPEND 值;您可能需要修改您可能使用的其他依赖项生成器的翻译。

于 2015-06-05T15:18:44.753 回答
2

这并不是要回答您的实际问题,但是由于您说您是 GNU make 的新手,所以我认为传播存在一种更简单的处理自动依赖关系的方法不会造成任何伤害。

如今,像 GCC 或 Clang 这样的编译器可以在编译代码时为您执行此操作!

只需向它们传递一个预处理器标志:

# Preprocessor flags
CPPFLAGS += -MMD

并将生成的文件包含到 Makefile 中:

-include $(wildcard *.d)

你完成了。


您可以在此处了解有关 GCC的预处理器选项的更多信息,Clang 只是镜像这些选项。

这里也有一个比较好的例子。

于 2015-06-06T07:57:24.700 回答