我目前正在设置 SCons 以使用 Windows 作为主机操作系统进行交叉编译。我正在Environment
为交叉编译器构建一个自定义,但 SCons 坚持在我每次启动它时查找 Visual Studio(并打印一条警告说它找不到它,因为我没有安装它)。我可以阻止它寻找我知道我不会使用的标准工具吗?
3 回答
至少有2种方法,第一种方法最简单,尝试创建指定编译器的环境,如下:
env = Environment(CC = '/path/to/the/compiler')
您可能还需要为链接器和其他工具添加路径。然后 SCons 不应该搜索它们。
另一种方法是使用SCons 手册页的CONFIGURATION FILE REFERENCE部分中提到tools
的函数参数为交叉编译器创建工具定义,其中提到了以下内容:Environment()
此外,可以将一组用于初始化环境的特定工具指定为可选的关键字参数:
env = Environment(tools = ['msvc', 'lex'])
可以使用 toolpath 参数指定非内置工具:
env = Environment(tools = ['default', 'foo'], toolpath = ['tools'])
...
工具列表的各个元素本身也可以是 (toolname, kw_dict) 形式的双元素列表。SCons 如上所述搜索工具名称规范文件,并将必须是字典的 kw_dict 作为关键字参数传递给工具的生成函数。generate 函数可以使用参数通过以不同方式设置环境或更改其初始化来修改工具的行为。
工具/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
S构造:
env = Environment(tools = ['default', ('my_tool', {'arg1': 'abc'})],
toolpath=['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。