ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
52862
bialix (03.03.2006 18:19, просмотров: 1287)
Первые пробы запуска тулзов от кейла автономно (при помощи простого враппера) Я взял стандартный проект-пример HELLO из комплекта поставки кейла. Сгенерил батник для сборки проекта. Потом для эксперимента ввел одну неопределенную функцию и при помощи простой обвертки позапускал компилятор c51 и линкер bl51. Вот что выдает сам кейл при компиляции: компилятор:
compiling HELLO.C...
HELLO.C(41): warning C206: 'func': missing function-prototype
HELLO.C - 0 Error(s), 1 Warning(s).
линкер:
linking...
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  FUNC
    MODULE:  HELLO.obj (HELLO)
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  FUNC
    MODULE:  HELLO.obj (HELLO)
    ADDRESS: 0422H
Program Size: data=30.1 xdata=0 code=1099
А вот, что можно увидеть, если мои враппером запустить компилятор и линкер отдельно: компилятор:
Return code: 1
*** Stdout:

C51 COMPILER V7.05 - SN: xxxxx-xxxxxx
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2003
*** WARNING C206 IN LINE 41 OF HELLO.C: 'func': missing function-prototype

C51 COMPILATION COMPLETE.  1 WARNING(S),  0 ERROR(S)

*** Stderr:
линкер:
Return code: 1
*** Stdout:

BL51 BANKED LINKER/LOCATER V5.03 - SN: xxxxx-xxxxxx
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2002
"HELLO.obj" 
TO "HELLO" 
RAMSIZE(256) 


*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  FUNC
    MODULE:  HELLO.obj (HELLO)

*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  FUNC
    MODULE:  HELLO.obj (HELLO)
    ADDRESS: 0422H

Program Size: data=30.1 xdata=0 code=1099
LINK/LOCATE RUN COMPLETE.  2 WARNING(S),  0 ERROR(S)

*** Stderr:
А вот и сам текст скрипта-враппера:
#!/usr/bin/python2.4
# (c) Alexander Belchenko, 2006

"""Wrapper for launching C51 Keil's compiler"""

from subprocess import Popen, PIPE
import sys

if __name__ == "__main__":
    q = Popen(sys.argv[1:], stdin=PIPE, stdout=PIPE, stderr=PIPE, universal_newlines=True)
    output = q.stdout.read()
    error = q.stderr.read()
    status = q.wait()
    if status >= 0:
        print "Return code:", status
        print "*** Stdout:"
        print output
        print "*** Stderr:"
        print error
    else:
        raise Exception("Command failed: %s" % error)
Как видно из приведенной информации, враппер необходим. Он же может использоваться для преобразования возвращаемого кода к виду 0/1 на основе задаваемого порога. Хотя как по мне, так и делать stop on warnings -- не самый худший вариант. Хотя бывают казусы, когда трудно добиться от кейла компиляции без предупреждений. Но надо стремиться! Вобщем-то главное назвачение враппера -- это преобразование выходной информации от кейловых тулзов в более удобный и привычный вид (то, что нам подсовывает микровижн). Далее -- делаем конвертор батника в SConstruct файл. Следующий этап -- разработка простого синтаксиса для указания опций компиляции-линковки. У меня есть некоторые идеи на этот счет. Но готов услышать мнения со стороны.