4

多くのライブラリと実行可能ファイルを含む、いくつかのサブディレクトリを持つかなり複雑な scons システムがあります。現在、すべての SConscript は独自の複製された環境を取得しているため、SConscript ごとに CFLAGS (またはその他の変数) を簡単に変更できますが、ターゲットごと、さらにはオブジェクト内のファイルごとに変更したいと考えています。目標。

次のように、問題を説明するために SConscript と SConstruct の簡単な例を作成しました。

Sコンストラクト:

env = Environment()
env['CFLAGS'] = '-O2'
env.SConscript('SConscript', 'env')

SConscript:

Import('env')
env=env.Clone()
env.Program('foo', ['foo.c', 'bar.c'])

scons を実行すると、foo.c と bar.c の両方が -O2 フラグでコンパイルされます。SConscript 内に追加するだけで、SConscript 全体のフラグを簡単に変更できますが、foo.c をでコンパイルし、bar.c を完全なデバッグでenv['CFLAGS'] = '...'コンパイルしたいとします。どうすれば(最も簡単な方法で)それを行うことができますか?-O2-O0 -g

例ではgccを使っていますが、どのコンパイラでも使えるものがいいです。

これは、最適化を行わずにすべてをコンパイルすると許容できないパフォーマンスが発生する、パフォーマンスに敏感なプロジェクトで頻繁に発生しますが、1 つのファイル (またはそれらのサブセット) をデバッグする必要があります。

4

2 に答える 2

4

これは、必要なターゲットをクリーンアップしてデバッグ フラグを付けて再構築するだけの make よりも、scons の方が少し難しいと思います。特定のオブジェクトを再構築するだけです。

特定のプロジェクトの解決策は、プロジェクトのサイズと、開発者がどれだけの労力を費やす準備ができているかによって異なります。したがって、コマンド ラインでソース ファイルを指定して、デバッグと最適化なしでコンパイルする大まかな解決策を次に示します。 -O2 でコンパイルされます。

SConsctruct で、コマンド ライン オプションからデバッグを使用してコンパイルするソース ファイルを取得するための 1 行を追加します。

    env = Environment()
    env['CFLAGS'] = '-O2'
    AddOption('--debug-targets', dest='debug-targets', type='string')
    env.SConscript('SConscript', 'env')

そして今、SConscript ファイルで:

    Import('env')
    env=env.Clone()
    debug_env = env.Clone()
    debug_env['CFLAGS'] = '-g -O0'

    normal_src = ['foo.c', 'bar.c']
    debug_src = []

    #Add src specified via the command line to the debug build 
    if GetOption('debug-targets'):
        for x in GetOption('debug-targets').split(','):
             if x in normal_src:
                normal_src.remove(x)
                debug_src.append(x)

    normal_obj = env.Object(normal_src)
    debug_obj = debug_env.Object(debug_src)
    all_obj = normal_obj + debug_obj
    env.Program('foo', all_obj)

debug-targets フラグなしで scons を実行します。

    scons -Q      
    gcc -o bar.o -c -O2 bar.c
    gcc -o foo.o -c -O2 foo.c
    gcc -o foo foo.o bar.o

しかし、今度は bar.c をデバッグ情報でコンパイルしたいと思います:

    scons -Q --debug-targets=bar.c 
    gcc -o bar.o -c -g -O0 bar.c
    gcc -o foo foo.o bar.o

そのため、ビルド システムが少し複雑になりますが、そのようなコマンド ラインからデバッグ ターゲットを指定する必要がない場合、開発者は明らかに、normal_src リストから debug_src にソースを切り取って貼り付けることができます。特定の環境に合わせてこれを改善および微調整するには、おそらく多くの方法があります

于 2013-10-05T12:32:31.067 に答える