7

SConsを使用してまとめたプロジェクト用の単純なビルド システムがあります。このプロジェクトにはかなりの数のソース ファイルがあり、ビルドの進行中に何らかの進行状況情報を表示するとユーザー フレンドリーになると思いました。SCons はCXXCOMSTR、各ビルド ステップでターミナルに表示されるものを制御するためにオーバーライドできるような構築変数を提供します。たとえば、次のような表示の代わりに:

gcc file.c -o file.o

次のようなものがあるといいでしょう:

[1/10] Compiling file.c: `gcc file.c -o file.o`

[1/10]は、これがこのビルド中に更新される 10 個のターゲットの最初のものであることを指定します。このようなメッセージを生成できるように、この情報にアクセスする方法はありますか? 更新されているターゲットの総数 (SCons が行う依存関係のスキャンに基づく) と、それぞれを列挙する何らかの方法を知る必要があるようです。同様の動作が CMake や waf などの他のビルド システムでも同様であることは知っていますが、SCons の (詳細な) ドキュメントには何も見つかりませんでした。

4

3 に答える 3

5

これは、Progress() SCons 関数で実行できます。

SCons の man ページにさらに例があります。「Progress」を検索してください。

呼び出される関数、定期的に表示される文字列、または順番に表示される文字列のリストを指定できます。ビルド中の現在のターゲットにアクセスできますが、完了率を知ることはできないと思います。

于 2013-05-15T17:20:08.820 に答える
4

ビルドの進行状況をパーセンテージで表示できる、かなりまともな回避策を思いつくことができました。基本的に、次のコードがどのように機能するかは次のとおりです。

  • ターゲットが以前に作成されたことがない場合は、[??%]各ターゲットの横に 表示されます
  • 最初のビルド時に、そのターゲットに対して処理されたノードの合計がキャッシュされます。.scons_progress
  • 次回ビルドを実行すると、開始時にファイルから読み取られ、前回そのターゲットから合計ノードが取得され、それを使用してパーセンテージ (つまり[50%]) が表示されます。
  • ノードの数がキャッシュされた合計を超えると、元に戻って[??%]更新されます.scons_progress
  • SConstruct が「安定」するにつれて (つまり、常に変更を行っているわけではありません)、これらのキャッシュ値はますます正確になるはずです。
  • キャッシュを更新するとビルドが遅くなるため (ノードごとにわずかに)、intervalを 5 に設定して、5 ノードごとにキャッシュのみを更新することをお勧めします。

コードは次のとおりです。

custom_utils.py下でsite_scons/

PROGRESS = {
    "env": None,
    "nodes": 0,
    "interval": 1,
    "total": 0,
    "cache": {},
    "cache_key": "_",
    "cache_name": ".scons_progress",
    "cache_update": False
}

def get_progress_total():
    return PROGRESS["cache"].get(PROGRESS["cache_key"], 0)

def update_progress_cache():
    PROGRESS["cache"][PROGRESS["cache_key"]] = PROGRESS["nodes"]
    with open(PROGRESS["cache_name"], "w") as f:
        f.write(json.dumps(PROGRESS["cache"]))

def load_progress_cache():
    try:
        with open(PROGRESS["cache_name"]) as f:
            PROGRESS["cache"] = json.load(f)

            cache_key = "_".join(COMMAND_LINE_TARGETS)
            if cache_key:
                PROGRESS["cache_key"] = cache_key
    except IOError as e:
        pass

def progress_function(node):
    PROGRESS["nodes"] += PROGRESS["interval"]

    #Only update cached environment if it is not None
    if node.env:
        PROGRESS["env"] = node.env
        PROGRESS["env"].Replace(PROGRESS = "[??%]")

    #Update display message
    if PROGRESS["nodes"] <= PROGRESS["total"]:
        PROGRESS["env"].Replace(PROGRESS = "[%d%%]" % (100*PROGRESS["nodes"]/PROGRESS["total"]))
    #If current node is more than total, we need to update the cache
    elif not PROGRESS["cache_update"]:
        PROGRESS["cache_update"] = True
        PROGRESS["env"].Replace(PROGRESS = "[??%]")
    #If cache flag is on, update cache file
    else:
        update_progress_cache()

def progress_settings(env, interval):
    load_progress_cache()
    PROGRESS["interval"] = interval
    PROGRESS["env"]      = env
    PROGRESS["total"]    = get_progress_total()
    Progress(progress_function, interval=PROGRESS["interval"])

SConstruct

if GetOption("progress"):
    custom_utils.progress_settings(env, 5)

出力例:

user@linuxbox:~/project1$ scons -j4 --progress
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
[??%] Compiling (shared): src/ExpressRuntimeException.os
[??%] Compiling (shared): src/Application.os
[??%] Compiling (shared): src/Callback.os
[??%] Compiling (shared): src/Response.os
[??%] Compiling (shared): src/Router.os
[??%] Compiling (shared): src/Route.os
[??%] Compiling (shared): src/Regex.os
[??%] Compiling (shared): src/tools.os
[??%] Linking   (shared): libexpresscpp.so
scons: done building targets.

user@linuxbox:~/project1$ scons -c
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Cleaning targets ...
Removed src/ExpressRuntimeException.os
Removed src/Application.os
Removed src/Callback.os
Removed src/Response.os
Removed src/Router.os
Removed src/Route.os
Removed src/Regex.os
Removed src/tools.os
Removed libexpresscpp.so
scons: done cleaning targets.

user@linuxbox:~/project1$ scons -j4 --progress
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
[14%] Compiling (shared): src/ExpressRuntimeException.os
[51%] Compiling (shared): src/Application.os
[59%] Compiling (shared): src/Callback.os
[66%] Compiling (shared): src/Response.os
[74%] Compiling (shared): src/Router.os
[81%] Compiling (shared): src/Route.os
[88%] Compiling (shared): src/Regex.os
[96%] Compiling (shared): src/tools.os
[100%] Linking   (shared): libexpresscpp.so
scons: done building targets.
于 2016-09-01T18:53:33.690 に答える