在scons中获取基本文件名定义

时间:2012-12-13 08:21:05

标签: scons c-preprocessor

我正在尝试生成一个per-sourcefile宏,它将保存源文件的基本文件名。这是针对make here所描述的。

我试图覆盖“对象”构建器,但它不起作用... 我试着做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'

我认为它与环境的MethodWrapper有关,但我无法验证。

也许我从错误的角度出发。也许我应该改变每个源文件的环境(看起来很多工作......)

主要要求是使用将是无缝的。我不希望用户必须调用MyObjectBuilder类。此外,StaticLibrary Builder应该调用新的对象构建器。

非常感谢任何帮助。 谢谢!

釜谷。

1 个答案:

答案 0 :(得分:0)

找到它。这是一个班轮......

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

只需添加基于规则的定义。 引号只是能够在不对表达式进行描述的情况下打印它的一个补充。