【问题标题】:building library variants with scons使用 scons 构建库变体
【发布时间】:2011-05-17 14:49:26
【问题描述】:

我有一个用 scons 构建的现有 C 库(该库有它自己的 征兵)。此代码现在包含由#ifdefs 控制的两个变体。如何 我是否告诉 scons 构建这个库的两个变体,可以并存 侧(以便应用程序可以链接到适当的变体)?

从概念上讲,它是这样的:

driver_sources = [ ... ]
env.Library('drivers', driver_sources)

env.Library('drivers_withflag', driver_sources, 
            CPPDEFINES += ['FLAG'])

SCons(可以理解)不喜欢将相同的源列表用于不同的 具有不同环境的输出,因为中间对象名称 冲突。

我不确定是否通过某种方式推导出一个新的来解决这个问题 drivers_withflag 对象的生成器,或者我是否应该包含我的库的 SConscript 两次用一些参数指定#defines(我可以把 每个变体都在其自己的构建目录中)。有什么建议吗?

【问题讨论】:

    标签: scons


    【解决方案1】:

    这里是一些相关文档的链接:http://www.scons.org/doc/1.1.0/HTML/scons-user/x1392.html

    我想会是这样的

    driver_sources = [ ... ]
    
    env.Library('libdrivers', driver_sources)
    
    env_flag = env.Clone()
    
    env_flag.Append(CPPDEFINES = ['FLAG'])
    
    flag_objects = [os.path.splitext(src)[0] + '_flag' + 
      env['OBJSUFFIX'] for src in driver_sources]
    
    d_wf = [env_flag.Object(tgt, src) for tgt,src in 
      zip(flag_objects, driver_sources)]
    
    env_flag.Library(d_wf)
    

    这将直接进入您当前的 SConscript 文件,但您也可以查看以下问题:here

    您可以使用调用库的 SConscript 文件的任何文件中概述的步骤来设置两个环境,然后每次调用 SConscript 两次。

    希望对您有所帮助。

    【讨论】:

    • 感谢汤姆的回答。不幸的是,它对我不起作用。 driver_sources 是一个文件列表,因此对于您的解决方案,scons 抱怨说,“为单一源构建器提供了多个源。”尝试直接从源代码构建库会导致我在问题中解释的问题,即在生成相同的中间对象文件名时环境发生冲突。
    • 啊,我明白了,是的,我只用一个测试文件制定了一个简单的例子。也许有一些替代对象?或者也许是某种 for 循环来创建对象列表,然后也许您可以从该对象列表构建库.. 不过现在这里有点在黑暗中射击。
    • 确实,我可以使用列表推导来创建对象列表:d_wf = [env_flag.Object(src + '.flag', src) for src in driver_sources]。有时我仍然忘记,在 scons 中,我可以使用 python 的全部功能。 :) 如果您编辑答案,我会接受。
    • 好东西。 scons 实际上是我对 python 的第一次真实世界介绍,所以我对它有点陌生。现在好看吗?图书馆知道如何处理对象列表,对吧?我假设它确实如此,因为 scons 那样很棒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多