获取 make 中所有依赖项的列表

Per*_*ytt 2 etag makefile

我正在尝试根据 gcc 生成的依赖信息在 make 中编写 etags 目标。有没有某种方法可以一次性获取所有依赖项?或者,如果做不到这一点,我将如何编写一个仅在创建“tags”目标时执行并将所有源文件和头文件传递给 etags 的规则?我只想索引实际编译的文件(包括标头)。我知道我可以自己在 .d 文件中查找,但我正在尝试找到一个更优雅且更不易损坏的解决方案。

我有以下内容(摘录)

DEPFILES = $(OBJFILES:.o=.d)

%.o : %.c
    @echo "Compiling $<"
    $(NO_ECHO) $(CC) $(CFLAGS) -MMD -MF $(@:.o=.d) -o $@ -c $<

%.o : %.S
    @echo "Compiling $<"
    $(NO_ECHO) $(CC) $(ASFLAGS) -MMD -MF $(@:.o=.d) -o $@ -c $<

$(TARGET) : $(OBJFILES)
    @echo "Linking $@"
    $(NO_ECHO) $(LD) $(LDFLAGS) -o $@ $(OBJFILES) $(LIBS:%=-l%)

.PHONY: clean

# Order-only dependency to make Dep/obj-directories if they are not
# present
$(OBJFILES) : | $(ALLPATHS)

$(ALLPATHS):
    $(NO_ECHO) mkdir -p $(ALLPATHS)

# Depend on the makefiles
$(OBJFILES) : $(SRC_PATH)/Makefile $(MAKECFG) $(BUILDCFG)

# Include dependency files

sinclude $(DEPFILES)
Run Code Online (Sandbox Code Playgroud)

编辑:以下似乎可行,但我真的很想找到一个更优雅的解决方案(双重排序/uniq只是为了性能)。

tags : $(TARGET)
    cat $(DEPFILES) | sort | uniq | sed 's/.*:.*$$//' | tr -d '\\' | tr "\n" " " | xargs -n 1 readlink -f | sort | uniq | xargs etags -a 
Run Code Online (Sandbox Code Playgroud)

jry*_*and 5

我来这里寻找与原始问题相同的答案,但离开了,因为我认为它没有得到充分的回答,并找到了一个不需要 sed 等的解决方案。

下面我假设一个 Makefile 类似于原始问题中的 Makefile,它使用编译器生成 dep 文件并包含它们。

对于生成 .d 文件的编译规则,我修改了编译器选项,要求它也使标记目标依赖于目标文件的依赖关系。我添加-MQ $@ -MQ tags到选项中。这些选项明确告诉编译器依赖项的目标名称。

%.o : %.c
    $(CC) $(CFLAGS) -MMD -MF $(@:.o=.d) -o $@ -c $< -MQ $@ -MQ tags
Run Code Online (Sandbox Code Playgroud)

现在我们不需要显式地为标签目标提供依赖项列表,它会在编译时生成,并随着源文件的更改而相应更新。就我而言,我正在使用它ctags,这就是我使用它的选项:

tags:
    ctags $^ -o $@
Run Code Online (Sandbox Code Playgroud)

$^变量是依赖项列表。这将是源文件和头文件的列表,因为每个 .d 文件将如下所示:

main.o tags: main.c a.h b.h
Run Code Online (Sandbox Code Playgroud)

希望有帮助。