ビルドの進行状況をパーセンテージで表示できる、かなりまともな回避策を思いつくことができました。基本的に、次のコードがどのように機能するかは次のとおりです。
- ターゲットが以前に作成されたことがない場合は、
[??%]
各ターゲットの横に 表示されます
- 最初のビルド時に、そのターゲットに対して処理されたノードの合計がキャッシュされます。
.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.