28

このメイクファイルを見てください。これには、ある種の原始的な進行状況表示 (進行状況バーであった可能性があります) があります。

提案/コメントをお願いします!


# BUILD は最初は未定義です
ifndef ビルド

# 最大は 256 個の x に等しい
16 := xxxxxxxxxxxxxxxx
MAX := $(foreach x,$(sixteen),$(sixteen))

# T は、BUILD を特別な文字列に置き換えることで、ビルドしているターゲットの数を推定します
T := $(shell $(MAKE) -nrRf $(firstword $(MAKEFILE_LIST)) $(MAKECMDGOALS) \
            BUILD="COUNTTHIS" | grep -c "COUNTTHIS")

# N は基数 1 の保留中のターゲットの数です。実際には、基数 x :-)
N := $(ワードリスト 1,$T,$(MAX))

# 保留中のターゲットの数を基数 10 で返す自動デクリメント カウンター
カウンター = $(単語 $N)$(eval N := $(単語リスト 2,$(単語 $N),$N))

# BUILD は進行状況を表示するように定義されるようになりました。これにより、ループ内での T の再定義も回避されます。
BUILD = @echo $(counter) of $(T)
終了

# ダミーの偽のターゲット

.PHONY: すべてクリーン

すべて: ターゲット
    @echo完了

掃除:
    @rm -f ターゲット *.c

# ダミービルドルール

ターゲット: ac bc cc dc ec fc gc
    @タッチ $@
    $(ビルド)

%.c:
    @タッチ $@
    $(ビルド)


すべての提案を歓迎します!

4

5 に答える 5

11

これは邪魔にならず、より素晴らしいものです。

ifneq ($(words $(MAKECMDGOALS)),1)
.DEFAULT_GOAL = all
%:
        @$(MAKE) $@ --no-print-directory -rRf $(firstword $(MAKEFILE_LIST))
else
ifndef ECHO
T := $(shell $(MAKE) $(MAKECMDGOALS) --no-print-directory \
      -nrRf $(firstword $(MAKEFILE_LIST)) \
      ECHO="COUNTTHIS" | grep -c "COUNTTHIS")

N := x
C = $(words $N)$(eval N := x $N)
ECHO = echo "`expr " [\`expr $C '*' 100 / $T\`" : '.*\(....\)$$'`%]"
endif

.PHONY: all clean

all: target
        @$(ECHO) All done

clean:
        @rm -f target *.c
#       @$(ECHO) Clean done

target: a.c b.c c.c d.c e.c
        @$(ECHO) Linking $@
        @sleep 0.1
        @touch $@

%.c:
        @$(ECHO) Compiling $@
        @sleep 0.1
        @touch $@

endif
于 2009-01-18T16:19:54.743 に答える
2

いいトリック!(-:

しかし、多くのmakefileを含む多くのディレクトリに分散している成長中のプロジェクトには、実際にはスケーラブルではありません。

プロジェクトの[Mm]akefiles*にログを振りかけ、それを使用して進行状況を追跡したいと思います。

ちょっとした考え。ところでこれを共有していただきありがとうございます。

編集:ちょうど考えました。これは、tarコマンドに-vオプションを指定するだけでなく、大規模な配布tarballを解凍するなど、長いタスクの進行中に進行状況を表示するようにスロバーを表示するように変更された形式で役立つ場合があります。まだ少し砂糖コーティングがありますが、少し楽しいです。(-:

乾杯、

ロブ

于 2009-01-16T18:41:02.047 に答える