基本コード:
def make_check(local, master, old_revno, old_revid, future_revno, future_revid,
tree_delta, future_tree):
try:
check_call('make check', shell=True)
except CalledProcessError as e:
raise BzrError(e)
結果: bzr: エラー: コマンド 'make check' がゼロ以外の終了ステータス 2 を返しました
すべてのソース コードに有効な構文があることを確認するスクリプトを実行する「チェック」ターゲットを含む Makefile があります。
make check
コンソールから実行すると、ステータスが 0 で存在します。
make check
Bazaar の pre-commit フックから実行すると、ステータス 2 で存在します。
strace
環境変数のチェック(本質的に同じ)や両方の方法に対する実行など、ある程度詳しく調査しました。
どちらの場合も、スクリプトからの出力は同じですが、precommit フックの場合、最後に呼び出したプロセスの終了ステータスがゼロであり、他の外部プロセスがないため、識別できる説明がなくても終了ステータスは 2 です。システムコール。私が見落としているものはありますか、それとも内部バグの可能性がありmake
ますか?
コンソール
16436 execve("/usr/bin/make", ["make", "check"], [/* 22 vars */]) = 0
#Big snip
16947 execve("/bin/sh", ["/bin/sh", "-c", "find archive/rpm/6 -name '*.rpm' -printf '%f\\n' | rev | cut -d- -f3- | rev | sort | uniq -c | grep -v '^ *1 ' && \\\n{ echo \"ERROR: Found duplicate RPMs in archive.\"; exit 1; } || true"], [/* 35 vars */]) = 0
#Big snip
16948 exit_group(0) = ?
16947 <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 16949
16947 --- SIGCHLD (Child exited) @ 0 (0) ---
16947 rt_sigreturn(0x11) = 16949
16947 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 16948
16947 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 16950
16947 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 16951
16947 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 16952
16947 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 16953
16947 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 16954
16947 exit_group(0) = ?
16436 <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 16947
16436 --- SIGCHLD (Child exited) @ 0 (0) ---
16436 rt_sigreturn(0xffffffff) = 16947
16436 rt_sigprocmask(SIG_BLOCK, [HUP INT QUIT TERM XCPU XFSZ], NULL, 8) = 0
16436 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
16436 chdir("/code/n/branches/jeff") = 0
16436 close(1) = 0
16436 munmap(0x7f7ed780e000, 4096) = 0
16436 exit_group(0)
脚本
14001 execve("/usr/bin/make", ["make", "check"], [/* 21 vars */]) = 0
#Big snip
14525 execve("/bin/sh", ["/bin/sh", "-c", "find archive/rpm/6 -name '*.rpm' -printf '%f\\n' | rev | cut -d- -f3- | rev | sort | uniq -c | grep -v '^ *1 ' && \\\n{ echo \"ERROR: Found duplicate RPMs in archive.\"; exit 1; } || true"], [/* 34 vars */]) = 0
#Big snip
14526 exit_group(0) = ?
14525 <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14527
14525 --- SIGCHLD (Child exited) @ 0 (0) ---
14525 rt_sigreturn(0x11) = 14527
14525 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14526
14525 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14528
14525 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14529
14525 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14530
14525 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14531
14525 wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 14532
14525 exit_group(0) = ?
14001 <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14525
14001 --- SIGCHLD (Child exited) @ 0 (0) ---
14001 rt_sigreturn(0xffffffff) = 14525
14001 rt_sigprocmask(SIG_BLOCK, [HUP INT QUIT TERM XCPU], NULL, 8) = 0
14001 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
14001 chdir("/code/n/branches/jeff") = 0
14001 close(1) = 0
14001 munmap(0x7f064aa7b000, 4096) = 0
14001 exit_group(2) = ?
アップデート
次のターゲットを Makefile に追加しました。
.PHONY: foobar
foobar:
echo "Testing foobar"
また、このターゲットは、手動実行で成功している間に pre-commit フック スクリプトを介して呼び出された場合、make プロセスをエラー ステータス 2 で終了させます。