【发布时间】:2013-02-18 18:09:39
【问题描述】:
我目前正在设置 SCons 以使用 Windows 作为主机操作系统进行交叉编译。我正在为交叉编译器构建一个自定义的Environment,但 SCons 坚持在我每次启动它时都查找 Visual Studio(并打印一条警告说它找不到它,因为我没有安装它)。我可以阻止它寻找我知道我不会使用的标准工具吗?
【问题讨论】:
标签: cross-compiling scons
我目前正在设置 SCons 以使用 Windows 作为主机操作系统进行交叉编译。我正在为交叉编译器构建一个自定义的Environment,但 SCons 坚持在我每次启动它时都查找 Visual Studio(并打印一条警告说它找不到它,因为我没有安装它)。我可以阻止它寻找我知道我不会使用的标准工具吗?
【问题讨论】:
标签: cross-compiling scons
至少有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'])
【讨论】:
DefaultEnvironment 仍然使用默认工具进行初始化。添加DefaultEnvironment(tools=[]) 解决了这个问题。
你可以禁止这样的警告
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,而不是定义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。
【讨论】: