2015-11-28 2 views
0

Для проекта 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

+1

Что этот вопрос имеет отношение к программированию CUDA? Почему он помечен тегом CUDA? Разве это не просто «задание на конфигурацию»? – talonmies

ответ

2

Скинсон имеет понятие src_builder. Это ключевое слово (обычно добавляется к конструктору класса Builder), которое информирует систему о том, как создавать исходные исходные файлы C/CPP, сначала запуская дополнительный строитель. Проверьте Инструмент engine/SCons/Tool/qt.py в ll. 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, а затем передает его последнему в построитель объектов.

+0

** Большое спасибо **! Это определенно большой шаг вперед, по крайней мере, вызов 'Object()' для CORBA работает (после некоторых тривиальных модов моего кода) с .idl. Проблема заключается в том, что инструмент CU2O уже создает '.o', а scons справедливо жалуется на« Несколько способов создания одной и той же цели [...] simpleGL.o', если я пытаюсь добавить мой 'CU2O' как' src_builder'. Кроме того, я теперь охотясь за некоторым использованием связанного с ним 'Tool.createProgBuilder (env)', чтобы также подключить мои exe-сборщики к вызову 'Program()'. Я обновлю свой код, когда у меня будет существенный прогресс, и хотел бы оставить вам строку, если можно. –

+1

Как только вы успешно освоили создание файла объекта, вы должны позволить обработчику по умолчанию для программы обрабатывать шаг связывания. Не предоставляйте специализированный строитель для связывания каждого из ваших объектов с окончательным исполняемым файлом. Вместо этого инициализируйте отдельную среду для каждой задачи сборки, где вам нужны разные пути и/или настройки. Вы также захотите использовать специальные переменные, такие как CPPPATH, для включения каталогов, а не для жесткого кодирования флагов «-I» в ваш командный вызов, потому что первые позволяют вам создавать и Windows. – dirkbaechle

+0

Поскольку вы начинаете с SCons и смотрите на свою текущую спецификацию сборки, я также предлагаю вам подписаться на наш список рассылки пользователей ([email protected], см. Также http://scons.org/lists .php) и начинайте задавать свои дальнейшие вопросы. Вы достигнете гораздо более широкой аудитории экспертов SCons там ... и время отклика обычно очень короткое. – dirkbaechle

Смежные вопросы