【问题标题】:Prevent SCons from looking for standard tools防止 SCons 寻找标准工具
【发布时间】:2013-02-18 18:09:39
【问题描述】:

我目前正在设置 SCons 以使用 Windows 作为主机操作系统进行交叉编译。我正在为交叉编译器构建一个自定义的Environment,但 SCons 坚持在我每次启动它时都查找 Visual Studio(并打印一条警告说它找不到它,因为我没有安装它)。我可以阻止它寻找我知道我不会使用的标准工具吗?

【问题讨论】:

    标签: cross-compiling scons


    【解决方案1】:

    至少有2种方法,第一种方法最简单,尝试创建指定编译器的环境,如下:

    env = Environment(CC = '/path/to/the/compiler')
    

    您可能还需要为链接器和其他工具添加路径。然后 SCons 不应该搜索它们。

    另一种方法是使用Environment() 函数上的tools 参数为交叉编译器创建工具定义,如@ 的CONFIGURATION FILE REFERENCE 部分所述987654321@,其中提到了以下内容:

    此外,还有一组特定的工具,用于初始化 环境可以指定为可选的关键字参数:

    env = Environment(tools = ['msvc', 'lex'])

    可以使用 toolpath 参数指定非内置工具:

    env = Environment(tools = ['default', 'foo'], toolpath = ['tools'])

    ...

    工具列表的各个元素本身也可能是 形式的两元素列表(工具名,kw_dict)。 SCons 搜索 如上所述的工具名称规范文件,并通过 kw_dict,它必须是一个字典,作为关键字参数 工具的生成功能。生成函数可以使用参数 通过设置环境来修改工具的行为 不同的方式或以其他方式更改其初始化。

    工具/my_tool.py:

    def generate(env, **kw):
      # Sets MY_TOOL to the value of keyword argument 'arg1' or 1.
      env['MY_TOOL'] = kw.get('arg1', '1')
    def exists(env):
      return 1
    

    SConstruct:

    env = Environment(tools = ['default', ('my_tool', {'arg1': 'abc'})],
                      toolpath=['tools'])
    

    【讨论】:

    • 感谢您的出色回答。我正在使用第二种方法,它似乎更像我需要的。
    • @BjörnPollex,乐于助人:)
    • 这个解决方案很遗憾没有解决警告的问题。这里的问题是,即使我创建了一个自定义环境,DefaultEnvironment 仍然使用默认工具进行初始化。添加DefaultEnvironment(tools=[]) 解决了这个问题。
    【解决方案2】:

    你可以禁止这样的警告

    env.SetOption('warn', 'no-visual-c-missing')
    

    例如,我正在为 ARM Cortex-M 微控制器进行交叉编译

    cross = 'arm-none-eabi-'
    toolchain = {
        'CC': cross + 'gcc',
        'CXX': cross + 'g++',
        'AR': cross + 'ar',
        'AS': cross + 'gcc',
        'OBJCOPY': cross + 'objcopy',
        'SIZE': cross + 'size',
        'PROGSUFFIX': '.elf',
    }
    
    env = Environment(tools=('gcc', 'g++', 'gnulink', 'ar', 'as'), ENV=os.environ)
    env.SetOption('warn', 'no-visual-c-missing')
    env.Replace(**toolchain)
    

    【讨论】:

    • 如果添加 DefaultEnvironment(tools=[]),那么假设您还明确列出了每个创建的 Environment() 的工具并且列表不包括 msvc,则不需要禁止显示警告,msvs 等
    【解决方案3】:

    考虑重新定义DefaultEnvironment,而不是定义Environment

    到目前为止我们介绍的所有 Builder 函数,例如 Program和Library,实际使用的是默认的构建环境 包含各种编译器和其他工具的设置 SCons 默认配置,或者以其他方式知道并拥有 在您的系统上发现。默认构造的目标 环境是进行许多配置以“正常工作”来构建 软件使用现成的工具,只需最少的配置 变化。

    这样,SCons 不会尝试根据常见用法做出预测并将其应用到您的项目中。例如:

    PATH = {'PATH' : ['C:/cygwin/bin']}
    env = Environment(ENV=PATH)
    env.Program('helloworld.c++')
    

    将根据它认为最有可能的情况做出假设,并在求助于它在 PATH 中找到的任何内容之前尝试找到 Visual Studio,而:

    PATH = {'PATH' : ['C:/cygwin/bin']}
    env = DefaultEnvironment(ENV=PATH)
    env.Program('helloworld.c++')
    

    不会做这样的假设,而是直接转到它在 PATH 中找到的任何内容,而无需查找 Visual Studio

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 2015-12-31
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      相关资源
      最近更新 更多