umup 0 1 мая, 2008 Опубликовано 1 мая, 2008 · Жалоба создал Sconscript : import os env = Environment(ENV = os.environ, tools=['mingw']) env['ENV']['PATH'] = 'c:\\gcc\\win32\\bin;' + os.environ['PATH'] env.Object(source = 'test_01.c', target = 'out/test_01.o') env.Program(source = 'out/test_01.o', target = 'out/test_01.exe') 1) как одним параметром указать, в какую папку должны помещаться выходные файлы (чтобы не замусоривать папку с исходниками - нужно скомпилировать в локальную папку out/) ? 2) как заставить scite показать вывод из gcc ? добавил в cpp.properties : command.build.*.c=scons.py компиляция выполняется, но сообщения об ошибках из gcc не показываются в окне Output scite : scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... gcc -o out\test_01.o -c test_01.c scons: *** [out\test_01.o] Error 1 scons: building terminated because of errors. >Exit code: 2 а должно быть (при компиляции из ком.строки) : scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... gcc -o out\test_01.o -c test_01.c test_01.c: In function 'main': test_01.c:6: error: 's' undeclared (first use in this function) test_01.c:6: error: (Each undeclared identifier is reported only once test_01.c:6: error: for each function it appears in.) test_01.c:6: error: expected ')' before string constant scons: *** [out\test_01.o] Error 1 scons: building terminated because of errors. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 31 2 мая, 2008 Опубликовано 2 мая, 2008 · Жалоба создал Sconscript : ... 1) как одним параметром указать, в какую папку должны помещаться выходные файлы (чтобы не замусоривать папку с исходниками - нужно скомпилировать в локальную папку out/) ? 2) как заставить scite показать вывод из gcc ? добавил в cpp.properties : command.build.*.c=scons.py ... Я не стал заморачиваться с этими вещами. Написал свое. Запуск тулов выполняется через subprocess.Popen. Далее можно перехватывать вывод через PIPE и обрабатывать его, если надо (кое-где применяю), а можно так пускать - все выводит без потерь. Соответственно, папку вывода задаю в ключах компилятору, а не сконсу. Вот, для примера, action функция builder'а, которая компиляет срр файлы: #------------------------------------------------------------------------------- # # Build object file from cpp source file # def compile_cpp(target, source, env): #------------------------------------------------ # # Launch compiler # print 'Compile: ' + str(source[0]) cmd = env['CC'] + env['CFLAGS'] + ' ' + str(source[0]) p = subprocess.Popen(cmd, universal_newlines = True, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE ) out, err = p.communicate() out += err oerr = utils.handle_err(out) # перехват вывода и его обработка if oerr: print oerr rcode = p.returncode if rcode != 0: return rcode sfile_name = os.path.splitext(str(target[0]))[0] + '.s' vdsp_lst.create_lst(sfile_name) # доп. действие - формирование файла листинга из асма (вставка строк из исходника по ссылкам - это нюанс vdsp) #------------------------------------------------------------------------------- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 4 мая, 2008 Опубликовано 4 мая, 2008 · Жалоба 1) как одним параметром указать, в какую папку должны помещаться выходные файлы (чтобы не замусоривать папку с исходниками - нужно скомпилировать в локальную папку out/) ? у меня примерно так: files = """ sources/pver.c sources/compDT.cpp sources/data.cpp sources/defaults.cpp ... """ buildDir = 'build/obj/' for x in files.split('\n'): x = x.strip() filename = os.path.splitext(x)[0] env.Object(source = fullname, target = buildDir + filename + '.r90') 2) как заставить scite показать вывод из gcc ? Странно, у меня весь вывод показывается (правда, у меня IAR). А что у вас за версия scons? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
umup 0 6 мая, 2008 Опубликовано 6 мая, 2008 · Жалоба А что у вас за версия scons scons 0.98.2 scite 1.70 portable еще scite не может запустить scons.py, приходится вызывать его из bat файла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 7 мая, 2008 Опубликовано 7 мая, 2008 · Жалоба еще scite не может запустить scons.py, приходится вызывать его из bat файла. вы под виндой сидите? Сконс создает батник scons.bat в python\scripts, где написан код для вызова скрипта и передачи ему аргументов. Если добавить этот путь к path, то в директории с sconstruct вызываете scons и понеслась... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Akimbo 0 13 мая, 2008 Опубликовано 13 мая, 2008 · Жалоба Знатоки scons'а, помогите рабочим примером скрипта использующего tool отличный от идущих в комплекте. Интересует, собственно, где задаются пути к используемым компилятору/линкеру. Если можно, направьте в правильном направлении - хочу для сборки проекта использовать IAR'овские компилятор/линкер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 13 мая, 2008 Опубликовано 13 мая, 2008 · Жалоба Моя функция для создания environment под IAR from os.path import join import os import sys import string sys.path = [ join(sys.prefix, 'Lib', 'site-packages', 'scons-0.97.0d20071212')] + sys.path from SCons.Environment import Environment def EnvironmentIAR (iarDir, linkerDefs, numOfAddTargets = 0): env = Environment(ENV = os.environ) PROC_DIR = iarDir + r'/avr' LINKER_DIR = iarDir + r'/common/bin' env['OBJSUFFIX'] = '.r90' env['PROGSUFFIX'] = '.hex' env['PROC_DIR'] = PROC_DIR env['CPPPATH'] = ['$PROC_DIR/INC', '$PROC_DIR/INC/$LIB'] env['CC_DIR'] = '"' + PROC_DIR + '"' env['CC'] = '"' + PROC_DIR + '/bin/iccavr.exe"' env['CXXCOM'] = '$CXX $SOURCES $CCCOMFLAGS $CXXFLAGS' env['CCCOM'] = env['CXXCOM'] env['LIBOBJFILE'] = '$CC_DIR\LIB\$LIB\$($LIBFILE$).h' env['CXXFLAGS'] = r"--silent --cpu=$CPU -m$MEMORY_MODEL --no_wrap_diagnostics -y" + \ " -e --debug --initializers_in_flash -$OPT --eeprom_size $EEPROM_SIZE -DENABLE_BIT_DEFINITIONS" + \ " $LANGUAGE --dlib_config $LIBOBJFILE -o $TARGET $OBJLIST $CXXADDFLAGS" env['CCCOMFLAGS'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS' env['INCPREFIX'] = '-I ' env['CCCOMSTR'] = 'Compiling $SOURCE -> $TARGET ...' env['CXXCOMSTR'] = env['CCCOMSTR'] env['LINK'] = '"' + LINKER_DIR + '\\xlink.exe"' env['LINK_LIB'] = '"%s\\LIB\\$LIB\\$($LIBFILE$).r90"' % (PROC_DIR) targets = '-o $TARGET -F$OUT1_FORMAT ' for i in xrange(numOfAddTargets): targets += '-O$OUT%d_FORMAT=$($TARGET$)$OUT%d_EXT' % (i+2, i+2) env['_TARGETS'] = targets env['LIST'] = '-l $($TARGET$).html -x$LIST_FORMAT' env['INCLUDE'] = '' segments = '' for s in string.split(linkerDefs): if s[0] == '@': segments += '-f "%s\\src\\template\\%s" ' % (PROC_DIR, s[1:]) else: segments += s + ' ' env['SEGMENTS'] = segments env['PROG_START'] = '-s __program_start' env['LINKCOM'] = '$LINK $SOURCES $LINK_LIB $_TARGETS $LIST $INCLUDE $SEGMENTS $PROG_START' env['LINKCOMSTR'] = "Linking $TARGET" return env linkerDefs - это строка, примерно такая linker_defs128 = ''' @cfgm128.xcl -D_..X_HEAP_SIZE=0 -D_..X_TINY_HEAP_SIZE=0 -D_..X_NEAR_HEAP_SIZE=0 -D_..X_FAR_HEAP_SIZE=0 -D_..X_HUGE_HEAP_SIZE=0 -D_..X_CSTACK_SIZE=$CSTACK -D_..X_RSTACK_SIZE=$RSTACK @cfg3s.xcl -D_..X_FLASH_BASE=_..X_INTVEC_SIZE -H1895 -h(CODE)0-(_..X_INTVEC_SIZE-1) -D_..X_EXT_SRAM_BASE=_..X_SRAM_END -D_..X_EXT_SRAM_SIZE=0 -D_..X_EXT_ROM_BASE=_..X_SRAM_END -D_..X_EXT_ROM_SIZE=0 -D_..X_EXT_NV_BASE=_..X_SRAM_END -D_..X_EXT_NV_SIZE=0 -D_..X_CSTACK_BASE=_..X_SRAM_BASE -D_..X_CSTACK_END=_..X_SRAM_END -D_..X_RSTACK_BASE=_..X_SRAM_BASE -D_..X_RSTACK_END=_..X_SRAM_END ''' Вместо @ подставится путь к файлу Юзать примерно так: env = EnvironmentIAR(os.environ['IAR'], ut.linker_defs128, 1) # директивы компилятора env['CPU'] = 'm128' env['MEMORY_MODEL'] = 'small' env['OPT'] = 's9' env['EEPROM_SIZE'] = 4096 env['LANGUAGE'] = '--eec++' env['OUT1_FORMAT'] = 'intel-extended' env['OUT2_FORMAT'] = 'ubrof8' env['OUT2_EXT'] = '.dbg' env['LIST_FORMAT'] = 'msniohe' env['CSTACK'] = 150 env['RSTACK'] = 'BE' env['OBJLIST'] = "-lCN build\\list\\" env['LIB'] = 'dlib' env['LIBFILE'] = 'dlAVR-3s-ec_mul-n' env['DEF_VAR'] = defVar env['CXXADDFLAGS'] = '--preinclude sources/preinc103mk1.h' Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 31 13 мая, 2008 Опубликовано 13 мая, 2008 · Жалоба Знатоки scons'а, помогите рабочим примером скрипта использующего tool отличный от идущих в комплекте. Интересует, собственно, где задаются пути к используемым компилятору/линкеру. Если можно, направьте в правильном направлении - хочу для сборки проекта использовать IAR'овские компилятор/линкер. Все просто, там не столько сконсовское, сколько питоновое. Сначала можно задать тулзы и пути, например, так: #------------------------------------------------------------------------------- # # Toolkit # IAR = os.environ['IAR'] TOOLKIT_PATH = IAR + '\\EW430v410' ASM = TOOLKIT_PATH + '\\430\\bin\\a430.exe' CC = TOOLKIT_PATH + '\\430\\bin\\icc430.exe' Linker = TOOLKIT_PATH + '\\430\\bin\\xlink.exe' ToolkitIncPath = [TOOLKIT_PATH + '\\430\\inc', TOOLKIT_PATH + '\\430\\inc\\dlib'] ToolkitLibPath = [TOOLKIT_PATH + '\\430\\lib\\dlib'] ToolkitCfgPath = [TOOLKIT_PATH + '\\430\\config'] Для чего через переменную окружения IAR, думаю, понятно - чтобы не привязываться к абсолютным путям на конкретной машине. Затем задать тулзы в рабочем словаре env: env = Environment(TOOLS = {}) env['BUILDERS'] = { 'asmObj' : asm2obj, 'cppObj' : cpp2obj, 'Exe' : build_exe } env['ASM' ] = ASM env['CC' ] = CC env['LINKER' ] = Linker env['AFLAGS' ] = AFLAGS env['CFLAGS' ] = CFLAGS env['LFLAGS' ] = LFLAGS env['CPPPATH' ] = SourceDirs + ToolkitIncPath env['FIRST_ENTRY'] = FirstEntry Пример функции-билдера уже приводил. Полный скрипт во вложении. Это для EW430. Аналогичный есть для EWAVR и для Blackfin (VisualDSP++ 4.5). Комментарий. Скрипт строит список файлов с расширенями с, срр и ассемблера, находящихся в директориях, указанных в списке SourceDirs, и на основе этого списка производит сборку проекта. Т.е. если надо добавить файл в проект, достаточно положить его в одну из указанных директорий (если убрать из проекта - соответственно, удалить из директории либо изменить расширение). Поддерживаются мнимые цели clean и rebuild. Скрипт работает со структурой проекта (директории): Config - скрипты линкера и подобное Exe - исполняемые (hex и дебажный бинарник) List - листинги и map файл линкера Obj - объектные файлы Если этих директорий не существует, скрипт при первом запуске создает их - чтобы тулзам было куда складывать продукты генерации. Получается аккуратно и удобно. Успехов. SConstruct.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Akimbo 0 19 мая, 2008 Опубликовано 19 мая, 2008 · Жалоба Спасибо всем, очень помогли. Теперь уход с IAR IDE будет менее болезненным. Если вы, DXP, не против - я позаимствую ваш скрипт, с минимальными изменениями. Понимать Питон понимаю, но вот самому написать пока слабо - ничего сложнее парсеров текста писать не приходилось. Но мощь и легкость применения еще как чувствуются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Akimbo 0 22 мая, 2008 Опубликовано 22 мая, 2008 · Жалоба Вопрос к вам, DXP. Есть ли способ заставить функцию Builder'а запускающую линкер, выполнять пересборку при изменении не только списка sources, но и некоторого постороннего файла? Имеется в виду файл конфигурации Линкера *.icf. Можно , конечно, отслеживать это своей функцией запускающей скрипт с опцией rebuild, но как- то это не красиво. Изменил ваш скрипт под свои нужды + IAR EWARM 5.0, если разрешите - могу выложить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 31 23 мая, 2008 Опубликовано 23 мая, 2008 · Жалоба Есть ли способ заставить функцию Builder'а запускающую линкер, выполнять пересборку при изменении не только списка sources, но и некоторого постороннего файла? Имеется в виду файл конфигурации Линкера *.icf. Можно , конечно, отслеживать это своей функцией запускающей скрипт с опцией rebuild, но как- то это не красиво. Вижу тут два варианта. Можно этот файл включить в список зависимостей, но тогда внутри функции билдера придется делать разбор списка и формировать отдельно список объектников и отфильтровывать его от конфигов. В принципе, это несложно, список все равно там формируется - в том же цикле проверять имя файла и пропускать файлы конфигов и все остальные, кто не объектные. Второй вариант - сделать другой билдер, который будет зависеть от конфигов. Но ему придется передавать тогда как-то список объектников. Наверное, первый вариант проще. Изменил ваш скрипт под свои нужды + IAR EWARM 5.0, если разрешите - могу выложить. Это сколько угодно. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Akimbo 0 23 мая, 2008 Опубликовано 23 мая, 2008 · Жалоба ...Можно этот файл включить в список зависимостей, но тогда внутри функции билдера придется делать разбор списка и формировать отдельно список объектников и отфильтровывать его от конфигов. Так и сделал - конфиг. файл добавляю последним элементом в список sources и при разборе внутри action функции он отфильтровывается. Итак, в приложении вариант сборщика на основе скрипта DXP. Основные моменты и принципы остались без изменения, адаптирован под IAR EWARM5.0. Отличия: Переваривает исходники *.c а не *.cpp Другие ключики ассемблера/компилятора/линкера Добавлена директория Config для конфиг. линкера *.icf, отслеживает его изменения при сборке. Две набора ключей линкера - debug и release. Создает два выходных файла формата ELF/DWARF - основной *.out и для отладки *.dbg Конвертирует выходной *.out посредством утилитки Objcopy в *.hex и *.bin Замечания: Контрольную сумму в *.hex и *.bin не добавляет, не проблема если отладчик/загрузчик делает это сам. Протестировано на проекте C+ASM, собирается и работает нормально. SConstruct.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 31 24 мая, 2008 Опубликовано 24 мая, 2008 · Жалоба ... Зависимости работают? Проверяли? Ну, в смысле, если меняете заголовочный файл, то система должна пересобрать все исходники, от которых он зависит. Спрашиваю потому, что не увидел определения env['CPPPATH'] Этот элемент словаря задает путь для сканера заголовков. Если заголовочный файл находится в той же директории, что и исходный, то и без этого работает, но если заголовок в другой директории, нежели исходный, который включает заголовок, то без указанного элемента будут проблемы - сканер не найдет заголовка и не включит его в зависимость. Проверьте. P.S. По стилю. Названия функций в питон-сообществе принято писать строчными буквами (с разделениями подчеркиваниями), а с отбоем регистра прописными буквами - классы, объекты и т.д. Когда этот скрипт писАлся, я еще этого не знал, знакомые питонисты объяснили. :) Теперь пишу "правильно". Хотя это мелочи, конечно. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Akimbo 0 26 мая, 2008 Опубликовано 26 мая, 2008 · Жалоба ... Зависимости между файлами, находящимися в разных директориях, действительно не работают. Волосы дыбом встали - такую ошибку пропустить, спасибо DXP что заметили. Лечится добавлением CPPPATH с путями ко всем директориям с изменяющимися *.h. Про оформление Питона понял, но это процесс естественный - если много занимаешься то постепенно приходишь к правильным формам. Товарищи, если кто будет пользоваться скриптом, добавьте: env['CPPPATH'] = SourceDirs + ToolkitIncPath + ToolkitLibPath Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 17 августа, 2008 Опубликовано 17 августа, 2008 · Жалоба Чтобы не плодить тем: 12 August 2008 SCons 1.0.0 is now available from the download page at SourceForge. This release is functionally the same as the 0.98.5 candidate, with documentation updates. http://www.scons.org/ Успехов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться