【问题标题】:How do I use a non-gnu compiler with SCons?如何将非 gnu 编译器与 SCons 一起使用?
【发布时间】:2016-04-26 21:47:12
【问题描述】:

我正在为使用称为“Cn”的语言的数字信号处理卡开发一些代码 - 与 C 非常相似,但有一些重要的区别,例如引入了“mono”和“poly”变量。

编译器名为“cscn”,位于“C:\Program Files (x86)\clearspeed\bin\cscn.exe”(这是一个 Windows 主机系统。)我正在研究使用 SCons 来做我的编译和依赖生成,但我似乎无法让 SCons 识别/使用 cscn 编译器。一个很简单的编译命令应该是

cscn pi.cn -lcn_reduction -o pi.csx

我最近对配置脚本的尝试是

env = Environment()
env.Replace(CC = ['C:\Program Files (x86)\clearspeed\bin\cscn.exe'])
env.Program('pi.csx', 'pi.cn', CFLAGS='-lcn_reduction')

然而,我得到的是一条错误消息,告诉我“未找到 Visual Studio 编译器的版本”,并且我必须为我的构建指定至少一个 .exe 目标。 cscn 不构建一个 .exe 文件,它构建一个 .csx 文件。我希望我可以用 env.Replace() 命令替换它尝试使用的编译器,但显然不是。

有没有办法做到这一点?

【问题讨论】:

  • 除此之外,与您的问题无关:在 Python 字符串中使用反斜杠最终会咬到您。首选'C:/Prog...''C:\\Prog...'r'C:\Prog...'

标签: cross-compiling scons


【解决方案1】:

请尝试

env = Environment(CC = 'C:/Program Files (x86)/clearspeed/bin/cscn.exe')
env.Program('pi.csx', 'pi.cn', CFLAGS='-lcn_reduction')

相反。简单的Environment() 调用默认为

env = Environment(tools=['default'])

这意味着 SCons 会首先尝试查找其工具,例如 gccg++。如果你之后替换它们的路径,那就太晚了……对应的Builders 像ProgramLibrary 不会为当前环境初始化,因为没有找到编译器。 请注意,您可能必须替换几个其他变量(想到ARLINK)才能使整个工具链正常运行。另见How can I use a cross compiler with Scons?

如果您继续为此苦苦挣扎,您可能希望通过scons-users@scons.org(请参阅http://scons.org/lists.html)访问我们的用户邮件列表,并在那里提出您的更多问题。

【讨论】:

  • 我们的答案在以太中交叉.. ;)
【解决方案2】:

看起来您需要进行一些更改。 首先,由于您在 Windows 上,SCons 将默认配置 Visual Studio 工具(如果可用),

见:SCons/Tool/init.py

c_compilers = ['msvc', 'mingw', 'gcc', 'intelc', 'icl', 'icc', 'cc', 'bcc32' ]

所以首先让我们解决这个问题:

env = Environment(tools=[])
env['CC'] = 'C:\Program Files (x86)\clearspeed\bin\cscn.exe'
env.Tool('cc')
env['LINK'] = 'C:\Program Files (x86)\clearspeed\bin\cscn.exe'
env.Tool('link')
env.Program('pi.csx', 'pi.cn', CFLAGS='-lcn_reduction')

这可能还不够,因为 SCons 不知道 .csx 和 .cn 文件后缀。所以让我们解决这个问题:

env = Environment(tools=[])
env['CC'] = 'C:\Program Files (x86)\clearspeed\bin\cscn.exe'
env.Tool('cc')
env['LINK'] = 'C:\Program Files (x86)\clearspeed\bin\cscn.exe'
env.Tool('link')
env['PROGSUFFIX'] = '.csx'
# Note we removed that from the output for program as it should automatically add it.
env.Program('pi', 'pi.cn', CFLAGS='-lcn_reduction')

接下来你需要告诉 SCons .cn 可以生成目标文件。

import SCons.Tool
import SCons.Default
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
my_suffix = '.cn'
static_obj.add_action(my_suffix, SCons.Defaults.CAction)
#shared_obj.add_action(my_suffix, SCons.Defaults.ShCAction)
static_obj.add_emitter(my_suffix, SCons.Defaults.StaticObjectEmitter)
#shared_obj.add_emitter(my_suffix, SCons.Defaults.SharedObjectEmitter)

那应该解决这个问题。

让我们把它们放在一起:

env = Environment(tools=[])
env['CC'] = 'C:\Program Files (x86)\clearspeed\bin\cscn.exe'
env.Tool('cc')
env['LINK'] = 'C:\Program Files (x86)\clearspeed\bin\cscn.exe'
env.Tool('link')
env['PROGSUFFIX'] = '.csx'

# Add .cn suffix as able to create objects.
import SCons.Tool
import SCons.Default
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
my_suffix = '.cn'
static_obj.add_action(my_suffix, SCons.Defaults.CAction)
#shared_obj.add_action(my_suffix, SCons.Defaults.ShCAction)
static_obj.add_emitter(my_suffix, SCons.Defaults.StaticObjectEmitter)
#shared_obj.add_emitter(my_suffix, SCons.Defaults.SharedObjectEmitter)

# Note we removed that from the output for program as it should automatically add it.
env.Program('pi', 'pi.cn', CFLAGS='-lcn_reduction')

现在,我无法访问您的编译器工具链,所以我没有尝试上述方法,但我相信它应该最能帮助您,如果不是全部的话。

【讨论】:

  • 如果@bdbaddog 这种精心设计的方法有效,请考虑将其包装到我们Tools for Fools Guide 中描述的适当“clearspeed”工具中,然后将其捐赠给index of external Tools...跨度>
  • 肯定一个实际的工具会更干净的方式来做到这一点。 :)
猜你喜欢
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
相关资源
最近更新 更多