防止SCons寻找标准工具

时间:2013-03-04 15:36:33

标签: cross-compiling scons

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

3 个答案:

答案 0 :(得分:6)

至少有两种方法可以做到这一点,第一种方法是最简单的,尝试创建指定编译器的环境,如下所示:

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

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

另一种方法是使用配置文件参考中提到的tools函数上的Environment()参数为交叉编译器创建工具定义 SCons man page的一部分,其中提到了以下内容:

  

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

     

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

SConstruct:

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

答案 1 :(得分:1)

您可以取消此类警告

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)

答案 2 :(得分:0)

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

  

到目前为止我们介绍的所有Builder函数,例如   程序和库,实际上使用默认的构造环境   包含各种编译器和其他工具的设置   SCons默认进行配置,否则了解并具有   在您的系统上发现。默认构造的目标   环境是要进行许多配置以“正常工作”来构建   使用现成的工具进行最少配置的软件   变化。

这样, SCons 不会尝试根据常用用法进行预测并将其应用于您的项目。例如:

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

将根据其认为最有可能的情况做出假设,并尝试使用 Visual Studio ,然后再使用它在PATH中找到的内容,而

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

不会做这样的假设,直接进入PATH中找到的任何内容,而无需寻找 Visual Studio