これを行う1つの方法は、オブジェクトエミッタ関数です。これは、C++コードをリンク可能なオブジェクトファイルに変換します。このようなエミッタ関数は2つあります。 1つは静的オブジェクト用、もう1つは共有オブジェクト用です。
import sys
import SCons.Defaults
import SCons.Builder
OriginalShared = SCons.Defaults.SharedObjectEmitter
OriginalStatic = SCons.Defaults.StaticObjectEmitter
def DoLint(env, source):
for s in source:
env.Lint(s.srcnode().path + ".lint", s)
def SharedObjectEmitter(target, source, env):
DoLint(env, source)
return OriginalShared(target, source, env)
def StaticObjectEmitter(target, source, env):
DoLint(env, source)
return OriginalStatic(target, source, env)
SCons.Defaults.SharedObjectEmitter = SharedObjectEmitter
SCons.Defaults.StaticObjectEmitter = StaticObjectEmitter
linter = SCons.Builder.Builder(
action=['$PYTHON $LINT $LINT_OPTIONS $SOURCE','date > $TARGET'],
suffix='.lint',
src_suffix='.cpp')
# actual build
env = Environment()
env.Append(BUILDERS={'Lint': linter})
env["PYTHON"] = sys.executable
env["LINT"] = "cpplint.py"
env["LINT_OPTIONS"] = ["--filter=-whitespace,+whitespace/tab", "--verbose=3"]
env.Program("test", Glob("*.cpp"))
本当にそれについてあまりにもトリッキーなものは何もありません。ここでは、SConstructにコピー&ペーストすることができます例です。 LINTをcpplint.pyコピーのパスに設定し、プロジェクトに適切なLINT_OPTIONSを設定します。小切手がコマンドラインdate
プログラムを使用して合格すると、TARGETファイルが作成されます。クロスプラットフォームにしたい場合は、それを変更する必要があります。
whitelist = """"
src/legacy_code.cpp
src/by_the_PHB.cpp
"""".split()
def DoLint(env, source):
for s in source:
src = s.srcnode().path
if src not in whitelist:
env.Lint(+ ".lint", s)
それは正しいエラーステータス出力しcpplint.pyようだ:
は、ホワイトリストを追加すると、今だけ通常のPythonコードのようなものです。エラーがある場合は1を返し、それ以外の場合は0を返します。そこで余分な作業はありません。 lintチェックが失敗すると、ビルドに失敗します。
このソリューションは-jオプションで動作しますが、lint fake出力とオブジェクトファイルターゲットの間に暗黙的な依存関係がないため、C++ファイルがコンパイルされることがあります。 env.Depends
を明示的に追加して、強制的に ".lint"出力をオブジェクトターゲットに依存させることができます。すべてのC++コンパイル後に残っているlintの問題があれば、ビルド自体が失敗する(sconsはゼロ以外の戻りコードを返す)ので、おそらく十分です。完全にするためのコードがDoLint機能では、このようなものになるだろうによって異なります
def DoLint(env, source, target):
for i in range(len(source)):
s = source[i]
out = env.Lint(s.srcnode().path + ".lint", s)
env.Depends(target[i], out)
これが機能するには、事前に目標を知る必要があります。どうすれば私のプロジェクトにすべての.cc/cpp/cと.h/hppファイルのリストが得られますか?私はまた、システムやブーストヘッダーなどのヘッダーを除外する必要があります。 – Jonathan
@Jonathan、あなたは2行のシェルスクリプトでこれを行うことができます。 – ismail
@İsmail、SConsスクリプトですでに収集されたノードを使用するのが最善でしょう。私はSCons.Action、SCons.Job、&SCons.Nodeモジュールを見ていますが、保留中のビルドがどこに置かれているのかは分かりません。 – Jonathan