我正在尝试根据 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)
我来这里寻找与原始问题相同的答案,但离开了,因为我认为它没有得到充分的回答,并找到了一个不需要 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)
希望有帮助。
| 归档时间: |
|
| 查看次数: |
11879 次 |
| 最近记录: |