SCons-集成CUDA、CORBA等的自定义生成器
SCons - integrating custom builders for CUDA, CORBA etc
对于一个异构(C、C++14、Fortran95、python3)项目,我目前正在评估与CMake SCons相比,在集成CUDA(7.5)、CORBA(omniorb-4.2.1)、MPI2(MPICH)等平台编译器和编译器包装器方面将为我们提供哪些优势。
为了开始,我创建了一个项目根目录(附带SConstruct脚本中的"data/projects/snippets"),其中有一个子目录"model",omnorb4 Documentation 的"echo.idl"
interface Echo {
string echoString(in string mesg);
};
存在(带有int main()
的echo_i.cc
将由与-Wbexample开关一起使用的omniidl
生成),以及子目录树"include/cuda_samples_inc",它是cuda工具包示例的"common/inc"分支的副本,并复制cuda工具包样本
2_Graphics/simpleGL/simpleGL.cu
到项目根目录中。
我的定制SConstruct
import os
CORBA_PASS = False
CUDA_PASS = True
CUDA_FAIL = not CUDA_PASS
CORBA_FAIL = not CORBA_PASS
EXE_SUFFIX = None
if os.name != 'posix':
raise NotImplementedError('Only on POSIX platforms yet')
PROJECT_ROOT = '/data/projects/snippets' # your mileage will likely vary
INCLUDE_DIR = os.path.join(PROJECT_ROOT, 'include')
LIB_DIR = os.path.join(PROJECT_ROOT, 'lib')
SYS_LIBS = ['dl', 'pthread']
GL_LIBS = ['glut', 'GLEW', 'GL', 'GLU', 'X11']
CORBA_LIBS = ['omniORB4', 'omnithread']
class CUDAEnvironment(Environment):
CUDA_ROOT = '/usr/local/cuda-7.5'
CUDA_BIN_DIR = os.path.join(CUDA_ROOT, 'bin')
CUDA_INCLUDE_DIRS = os.path.join(INCLUDE_DIR, 'cuda_samples_inc')
GENC = "-gencode arch=compute_%d,code=sm_%d "
GEN_RANGE = [20, 30, 35, 37, 50, 52]
GENT = "-gencode arch=compute_52,code=compute_52"
GENS = " ".join([GENC % (n, n) for n in GEN_RANGE]) + GENT
COMPILE = """
%s/nvcc -ccbin g++ -I %s -m64 %s -o $TARGET -c $SOURCE
""" % (CUDA_BIN_DIR, CUDA_INCLUDE_DIRS, GENS)
LINK = """
%s/nvcc -ccbin g++ -I %s -m64 %s -o $TARGET $SOURCE
-L%s, %s
""" % (CUDA_BIN_DIR, CUDA_INCLUDE_DIRS, GENS, LIB_DIR,
''.join([' -l%s' % (s,) for s in GL_LIBS]))
def __init__(self):
super(Environment, self).__init__()
C = CUDAEnvironment # class alias
self.Append(PATH=":".join([os.environ['PATH'],
C.CUDA_BIN_DIR]))
cu2o = Builder(action=C.COMPILE, suffix='.o', src_suffix='.cu')
o2exe = Builder(action=C.LINK, suffix=EXE_SUFFIX, src_suffix='.o')
self.Append(BUILDERS={'CU2O': cu2o, 'O2EXE': o2exe})
if (CUDA_PASS):
CUDA = CUDAEnvironment()
CUDA.CU2O(['simpleGL.cu'])
CUDA.O2EXE(['simpleGL.o'])
if (CUDA_FAIL):
CUDA = CUDAEnvironment()
o = CUDA.Object(['simpleGL.cu']) # line 63
CUDA.Program(o)
class CORBAEnvironment(Environment):
IDL2CC = """
omniidl -bcxx -Wbexample $SOURCE
cp `basename $SOURCE .idl`SK.cc `basename $SOURCE .idl`.cc
"""
COMPILE = """
g++ -std=c++14 -I. -Wall -pedantic %s $SOURCES -o $TARGET
""" % (''.join([' -l%s' % (s,) for s in CORBA_LIBS + SYS_LIBS]))
def __init__(self):
super(Environment, self).__init__()
C = CORBAEnvironment # class alias
idl2cc = Builder(
action=C.IDL2CC, suffix='.cc', src_suffix='.idl'
)
cc2exe = Builder(
action=C.COMPILE, suffix=EXE_SUFFIX, src_suffix='.cc'
)
self.Append(BUILDERS={'IDL2CC': idl2cc, 'CC2EXE': cc2exe})
if (CORBA_PASS):
CORBA = CORBAEnvironment()
CORBA.IDL2CC('echo.cc', os.path.join('model', 'echo.idl'))
CORBA.CC2EXE('echo', ['echo.cc', 'echo_i.cc'])
if (CORBA_FAIL):
CORBA = CORBAEnvironment()
skel = CORBA.Object(os.path.join('model', 'echo.idl')) # line 98
impl = CORBA.Object('echo_i.cc')
CORBA.Program([skel, impl])
启用开关CUDA_PASS
和CORBA_PASS
时工作良好,但对于
CUDA = CUDAEnvironment()
o = CUDA.Object(['simpleGL.cu']) # line 63
CUDA.Program(o)
resp
CORBA = CORBAEnvironment()
skel = CORBA.Object(os.path.join('model', 'echo.idl')) # line 98
impl = CORBA.Object('echo_i.cc')
CORBA.Program([skel, impl])
方块,烤饼由于我害怕的那种错误而放弃:
scons: *** While building `['simpleGL.o']' from `['simpleGL.cu']'
Don't know how to build from a source file with suffix `.cu'.
Expected a suffix in this list: ['.c', '.m', '.cpp', '.cc', '.cxx',
'.c++', '.C++', '.mm', '.C', '.f', '.for', '.ftn', '.fpp', '.FPP',
'.F', '.FOR', '.FTN', '.f77', '.F77', '.f90', '.F90', '.f95', '.F95',
'.f03', '.F03', '.s', '.asm', '.ASM', '.spp', '.SPP', '.sx', '.S'].
File "/data/projects/snippets/SConstruct", line 63, in <module>
分别:
scons: *** While building `['model/echo.o']' from `['model/echo.idl']':
Don't know how to build from a source file with suffix `.idl'
[same as above]
File "/data/projects/snippets/SConstruct", line 98, in <module>.
遗憾的是,
如何从后缀为
<suffix>
的源文件构建
这正是我试图用我的定制环境和建设者告诉烤饼的。
所以我的问题是:
如何集成自定义环境和生成器,以便可以使用SCons Object()
和Program()
生成器立面
《苏格兰建设者》()doc,特别是18.2。将生成器附加到构造环境似乎只是解释了我的PASS
块中使用的语法以及传递的Program()
调用,而不是如何使例如"Object()"了解自定义生成器。
不用说,python本身可以用来编写几乎所有类型的行为或附加组件的代码,但我希望尽可能地留在SCons工具集的范围内。
版本:
SCons 2.3.1
(但这在stone中并不可取,如果对2.4.1的更新会有所帮助,我会这么做)使用python 2.7.9
运行
SCons具有src_builder
的概念。它是一个关键字(通常添加到Builder类的构造函数中),用于通知系统如何通过首先运行额外的生成器来创建实际的C/CPP源文件。查看ll中的工具engine/SCons/Tool/qt.py
。315上面写着:
# register the builders
env['BUILDERS']['Uic'] = uicBld
env['BUILDERS']['Moc'] = mocBld
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
static_obj.add_src_builder('Uic')
shared_obj.add_src_builder('Uic')
通过调用add_src_builder
,Uic构建器分别向静态和共享对象构建器注册。然后,如果*.uic
文件直接提供给Object
,SCons会检查其定义的源生成器列表,将*.uic
转换为其相应的*.cc
文件,然后将后者传递给对象生成器。
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- C++自定义比较函数
- 如何比较自定义类的std::变体
- std::设置自定义比较器
- 如何正确实现和访问运算符的各种自定义枚举器
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 自定义先决条件对移动分配运算符有效吗
- 使用VS Code和CMake Tools运行自定义命令
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- std::ranges::elements_view,用于自定义类似元组的数据
- 跟随整数索引列表的自定义类迭代器
- 参数化自定义CMake工具链
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 如何在自定义类中启用'auto loops'?
- 使用QJsEngine在Qt中注册自定义类型
- Qt自定义QPush按钮未显示在布局上
- 如何将自定义C++模块集成到自定义版本的 NodeJS 中?
- 跨共享/静态库集成C++自定义内存分配器
- SCons-集成CUDA、CORBA等的自定义生成器