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)
編集:以下はうまくいくようですが、もっと洗練された解決策を見つけたいと思います(ダブルソート/ uniqはパフォーマンスのためだけです)。
tags : $(TARGET)
cat $(DEPFILES) | sort | uniq | sed 's/.*:.*$$//' | tr -d '\\' | tr "\n" " " | xargs -n 1 readlink -f | sort | uniq | xargs etags -a