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

时间:2013-07-01 08:44:59

标签: makefile etag

我试图根据gcc生成的依赖关系信息在make中编写etags目标。有没有办法一次性获取所有依赖项?或者,如果不这样做,我将如何编写仅在"标记"制作目标并将所有源文件和头文件传递给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)

编辑:以下似乎有效,但我真的想找到更优雅的解决方案 (double sort / uniq仅用于表现)。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

%.o : %.c
    $(CC) $(CFLAGS) -MMD -MF $(@:.o=.d) -o $@ -c $< -MQ $@ -MQ tags

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

tags:
    ctags $^ -o $@

$^变量是依赖项列表。这将是源文件和头文件的列表,因为每个.d文件看起来像这样:

main.o tags: main.c a.h b.h

希望有所帮助。

答案 1 :(得分:0)

您需要为每个.d文件创建一个迷你标记文件,然后使用它来更新您的etags文件。请注意,这会将内容附加到文件中,而不是删除和替换,因此您可能需要偶尔远程处理代码文件(ctags--update选项)

TAGFILES = $(OBJFILES:.o=.t)

# prune the .d files a bit to get a list of files for etags to scan
%.t: %.d
    cat $< | sed stuff > $@
    cat $@ | etags -a $@

.PHONY: tags
tags: $(TAGFILES)