我目前正在设置与Windows作为主机操作系统交叉编译的SCons。我正在为交叉编译器构建一个自定义的Environment
,但是每次我启动它时,SCons都坚持寻找Visual Studio(并打印一个无法找到它的警告,因为我没有安装它)。我能阻止它寻找我知道我不会使用的标准工具吗?
至少有两种方法可以做到这一点,第一种方法是最简单的,尝试创建指定编译器的环境,如下所示:
env = Environment(CC = '/path/to/the/compiler')
您可能还需要为链接器和其他工具添加路径。那么SCons不应该搜索它们。
另一种方法是使用Environment()
函数上的tools
参数为交叉编译器创建一个工具定义,如SCons手册页的CONFIGURATION FILE REFERENCE部分所述,其中提到以下内容:
另外,一组特定的工具用来初始化环境可以指定为可选的关键字参数:
env = Environment(tools = ['msvc', 'lex'])
非内置工具可以使用toolpath参数指定:
env = Environment(tools = ['default', 'foo'], toolpath = ['tools'])
…
工具列表的单个元素本身也可能是表单的双元素列表(toolname, 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'])
您可以禁止像这样的警告
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函数,比如程序和库,实际上使用默认的构造环境包含各种编译器和其他工具的设置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。