如何将非 GNU 编译器与 SCons 一起使用



我正在为使用名为"Cn"的语言的数字信号处理卡开发一些代码 - 与C非常相似,但有一些重要的区别,例如引入"单声道"和"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)clearspeedbincscn.exe'])
env.Program('pi.csx', 'pi.cn', CFLAGS='-lcn_reduction')

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

有没有办法做到这一点?

请尝试

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++。如果事后更换他们的路径,那就太晚了......由于找不到编译器,因此不会为当前环境初始化相应的Builder(如 ProgramLibrary)。请注意,您可能需要替换其他几个变量(ARLINK想到的变量)才能使整个工具链正常运行。另请参阅如何将交叉编译器与 Scons 一起使用? 。

如果您继续为此苦苦挣扎,您可能想在scons-users@scons.org访问我们的用户邮件列表(见 http://scons.org/lists.html),并在那里提出您的进一步问题。

看起来您需要进行一些更改。首先,由于您在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)clearspeedbincscn.exe'
env.Tool('cc')
env['LINK'] = 'C:Program Files (x86)clearspeedbincscn.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)clearspeedbincscn.exe'
env.Tool('cc')
env['LINK'] = 'C:Program Files (x86)clearspeedbincscn.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)clearspeedbincscn.exe'
env.Tool('cc')
env['LINK'] = 'C:Program Files (x86)clearspeedbincscn.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')

现在,我无法访问您的编译器工具链,所以我没有尝试上述方法,但我相信它应该能让您获得大部分,如果不是一路走来的话。

最新更新