0

ソース ファイルのベース ファイル名を保持するソース ファイルごとのマクロを生成しようとしています。これは make hereで説明されています。

オブジェクト ビルダーをオーバーライドしようとしましたが、うまくいきませんでした...ここで説明されていることを実行しようとしました。

def my_object_builder(env, target, source, **kwargs):
    """A builder that calls the Object builder, with the addition of defining
    a macro that holds the source file's basename  
    """
    if SCons.Util.is_List(source):
        if len(source) > 1:
            raise ValueError('cannot pass a list of sources to Object builder: %s',
                             [str(x) for x in source])
        else:
            source, = source

    if 'CPPDEFINES' not in kwargs: 
        kwargs['CPPDEFINES'] = []
    kwargs['CPPDEFINES'].append(('__MY_FILENAME', 
                                 os.path.basename(str(source))))

    ret = env._Object(target=target, 
                  source=source, 
                  **kwargs)
    return ret

次に、ビルダーを置き換えます。

env['BUILDERS']['_Object'] = env['BUILDERS']['Object'] 
env['BUILDERS']['Object'] = my_object_builder

これはうまくいきませんでした。次のエラーが発生しました。

AttributeError: 'function' object has no attribute 'src_suffixes'

EnvironmentのMethodWrapperが関係していると思いますが、確認できませんでした。

多分私は間違った角度からこれをしようとしています。ソースファイルごとに環境を変えたほうがいいかも(大変な作業のようです...)

主な要件は、使用がシームレスになることです。ユーザーが MyObjectBuilder クラスを呼び出す必要はありません。また、StaticLibrary Builder は新しいオブジェクト ビルダーを呼び出す必要があります。

どんな助けでも大歓迎です。ありがとう!

BugoK.

4

1 に答える 1

0

それを見つけた。ワンライナーです...

env.Append(CCFLAGS=['-D__MY_FILENAME=\\"${SOURCE.file}\\"'])

ルールベースの定義を追加するだけです。引用符は、式を損なうことなく印刷できるようにするための単なる追加です。

于 2012-12-13T10:10:42.057 に答える