我试图根据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
答案 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)