1

次のように、コンパイラ エラーの表示にのみ影響する変数を追加したいと思います。

vars = Variables()
vars.Add(BoolVariable('fatal', 'Stop on first error', True))
# ...
if env['fatal']:
    env.MergeFlags(['-Wfatal-errors'])

ただし、そのまま実行すると、完全に再構築されますが、このフラグは既にコンパイルされたオブジェクト ファイルには関係ないため、理由はありませんscons fatal=yesscons fatal=no

SCons はこれを許可しますか? もしそうなら、どのように?

4

1 に答える 1

3

SCons は、あなたがやりたいことを本当に許可していません。構築する必要がある各ノードには、それに関連付けられたコマンド ライン アクションがあります。コマンド ライン文字列の MD5 チェックサムが保存され、これらのチェックサムが変更されると再構築がトリガーされます。警告フラグを変更すると、結果のオブジェクト ファイルが同じであっても、オブジェクト ファイルを構築するためのコマンド ラインが変更されます。

あなたが本当に決心しているなら、それを回避する方法は常にあります. たとえば、SCons 内で MD5 合計を計算する方法を変更します。概念実証として、再構築を検討するときに SCons が-Wallフラグを無視するようにしました。これは、SConstruct ファイルの先頭に次のコードを配置して、アクションに関連付けられたコマンド ラインを報告するメソッドを変更することによって行われました。

import SCons
import types
SCons.Action.ActionBase.get_contents_orig = SCons.Action.ActionBase.get_contents
def get_contents(self, *args, **kw):
    norebuild = ("-Wall",)
    cnt = self.get_contents_orig(*args, **kw).split()
    cnt_norebuild = " ".join(i for i in cnt if i not in norebuild)
    return cnt_norebuild
SCons.Action.ActionBase.get_contents = types.MethodType(
        get_contents, None, SCons.Action.ActionBase)

これは、非常に単純な SConstruct ファイルで機能しました。ただし、これは非常に貧弱なハックであり、おそらく異なるバージョン間またはより複雑なビルドで壊れるでしょう.

結論として、あなたが求めていることを行うことは可能ですが、非常に賢明ではありません。

于 2013-03-11T03:09:49.257 に答える