Для проекта aa heterogene (C, C++ 14, Fortran95, python3) я в настоящее время оцениваю, какие преимущества перед CMake SCons предоставят нам для интеграции компиляторов платформы и обертки компилятора для CUDA (7.5), CORBA (omniorb-4.2.1), MPI2 (MPICH) и т. д.SCons - интеграция пользовательских сборщиков для CUDA, CORBA и т. Д.
Для начала я создал корневой каталог проекта («данные/проекты/фрагменты» в сценарии SConstruct прилагается) с подкаталоге 'модели', in which the 'echo.idl' of the omniorb4 Documentation
interface Echo {
string echoString(in string mesg);
};
проживает (ые echo_i.cc
с int main()
будет генерироваться omniidl
используется с переключателем -Wbexample), и подкаталог дерево «включают в себя/cuda_samples_inc», который представляет собой копию «общего/ИНК» ветви образцов CUDA Toolkit и копировали образцы CUDA Toolkit
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)
соответственно
CORBA = CORBAEnvironment()
skel = CORBA.Object(os.path.join('model', 'echo.idl')) # line 98
impl = CORBA.Object('echo_i.cc')
CORBA.Program([skel, impl])
блоки, SCons отдает благодаря тому, что вид ошибки, которую я боялся:
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 с мои пользовательские среды и строители.
Так что мой вопрос:
Как интегрировать пользовательские среды и строитель, так что SCons Object()
и Program()
строителя фасад могут быть использованы?
Scons Builder() doc, esp. 18.2. Attaching a Builder to a Construction Environment, по-видимому, просто объясняет синтаксис, используемый в моих блоках PASS
вместе с переданным, хотя и Program()
вызовом, но не таким, как make, например. «Объект()» знает пользовательские сборщики.
Само собой разумеется, что сам python можно использовать для ручного кодирования практически любого типа поведения или надстройки, но я хочу как можно больше оставаться в пределах набора инструментов SCons.
версии:
SCons 2.3.1
(но не жаждал в камне, если обновление до 2.4.1 поможет, я сделаю это) запустите с python 2.7.9
Что этот вопрос имеет отношение к программированию CUDA? Почему он помечен тегом CUDA? Разве это не просто «задание на конфигурацию»? – talonmies