1

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 
4

2 に答える 2

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)
于 2013-07-02T14:03:51.393 に答える