Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. import os
  2. import sys
  3. import struct
  4.  
  5. ARGV = sys.argv
  6.  
  7. RM = 'rm -f '
  8. VM = './vm '
  9. TINYPY = './tinypy '
  10. if '-mingw32' in ARGV:
  11.     RM = 'del '
  12.     VM = 'vm '
  13.     TINYPY = 'tinypy '
  14.  
  15. def number(v):
  16.     if type(v) is str and v[0:2] == '0x':
  17.         v = int(v[2:],16)
  18.     return float(v)
  19.  
  20. def istype(v,t):
  21.     if t == 'string': return isinstance(v,str)
  22.     elif t == 'list': return (isinstance(v,list) or isinstance(v,tuple))
  23.     elif t == 'dict': return isinstance(v,dict)
  24.     elif t == 'number': return (isinstance(v,float) or isinstance(v,int))
  25.     raise '?'
  26.  
  27. def boot_init():
  28.     global FTYPE
  29.     f = open('tp.h','r').read()
  30.     FTYPE = 'f'
  31.     if 'double tp_num' in f: FTYPE = 'd'
  32. boot_init()
  33.  
  34. def fpack(v):
  35.     return struct.pack(FTYPE,v)
  36.  
  37. def system(cmd):
  38.     return os.system(cmd)
  39.  
  40. def load(fname):
  41.     f = open(fname,'rb')
  42.     r = f.read()
  43.     f.close()
  44.     return r
  45.  
  46. def save(fname,v):
  47.     f = open(fname,'wb')
  48.     f.write(v)
  49.     f.close()
  50.  
  51. def do_cmd(cmd):
  52.     FLAGS = ''
  53.     SDL = '`sdl-config --cflags --libs`'
  54.     SYS = '-linux'
  55.     if '-mingw32' in sys.argv:
  56.         #-mwindows -mno-cygwin
  57.         FLAGS = '-mwindows -lmingw32'
  58.         #SDL = '-lSDLmain -Ic:/packages/sdl-devel/include -Lc:/packages/sdl-devel/lib -lSDL -Lc:/packages/sdl-devel/lib -lSDL'
  59.         SDL = '-Ic:/packages/sdl-devel/include -Lc:/packages/sdl-devel/lib '+\
  60.             '-lSDLmain -lSDL'
  61.         SYS = '-mingw32'
  62.     cmd = cmd.replace('$FLAGS',FLAGS)
  63.     cmd = cmd.replace('$SYS',SYS)
  64.     cmd = cmd.replace('$SDL',SDL)
  65.     print cmd
  66.     r = os.system(cmd)
  67.     if r:
  68.         print 'exit',r
  69.         sys.exit(r)
  70.  
  71. def chksize():
  72.     import mk64k
  73.     t1,t2 = 0,0
  74.     for fname in [
  75.         'tokenize.py','parse.py','encode.py','py2bc.py',
  76.         'tp.h','list.c','dict.c','misc.c','string.c','builtins.c',
  77.         'gc.c','ops.c','vm.c','tp.c','tpmain.c',
  78.         ]:
  79.         f = open(fname,'r'); t1 += len(f.read()); f.close()
  80.         txt = mk64k.shrink(fname)
  81.         t2 += len(txt)
  82.     print "#",t1,t2,t2-65536
  83.     return t2
  84.  
  85. MODS = ['tokenize','parse','encode','py2bc']
  86.  
  87. def build_bc(opt=False):
  88.     out = []
  89.     for mod in MODS:
  90.         out.append("""unsigned char tp_%s[] = {"""%mod)
  91.         fname = mod+".tpc"
  92.         data = open(fname,'rb').read()
  93.         cols = 16
  94.         for n in xrange(0,len(data),cols):
  95.             out.append(",".join([str(ord(v)) for v in data[n:n+cols]])+',')
  96.         out.append("""};""")
  97.     out.append("")
  98.     f = open('bc.c','wb')
  99.     f.write('\n'.join(out))
  100.     f.close()
  101.    
  102. def build_tp():
  103.     out = []
  104.     out.append("/*")
  105.     out.extend([v.rstrip() for v in open('LICENSE.txt','r')])
  106.     out.append("*/")
  107.     out.append("")
  108.    
  109.     out.append("#ifndef TINYPY_H")
  110.     out.append("#define TINYPY_H")
  111.     out.extend([v.rstrip() for v in open('tp.h','r')])
  112.     for fname in ['list.c','dict.c','misc.c','string.c','builtins.c',
  113.         'gc.c','ops.c','vm.c','tp.c']:
  114.         for line in open(fname,'r'):
  115.             line = line.rstrip()
  116.             if not len(line): continue
  117.             if line[0] == ' ': continue
  118.             if line[0] == '\t': continue
  119.             if line[-1] != '{': continue
  120.             if 'enum' in line: continue
  121.             if '=' in line: continue
  122.             if '#' in line: continue
  123.             line = line.replace('{',';')
  124.             out.append(line)
  125.     out.append("#endif")
  126.     out.append('')
  127.     f = open('tinypy.h','w')
  128.     f.write('\n'.join(out))
  129.     f.close()
  130.    
  131.     # we leave all the tinypy.h stuff at the top so that
  132.     # if someone wants to include tinypy.c they don't have to have
  133.     # tinypy.h cluttering up their folder
  134.    
  135.     for mod in MODS:
  136.         out.append("""extern unsigned char tp_%s[];"""%mod)
  137.  
  138.                
  139.     for fname in ['list.c','dict.c','misc.c','string.c','builtins.c',
  140.         'gc.c','ops.c','vm.c','tp.c','bc.c']:
  141.         for line in open(fname,'r'):
  142.             line = line.rstrip()
  143.             if line.find('#include "') != -1: continue
  144.             out.append(line)
  145.     out.append('')
  146.     f = open('tinypy.c','w')
  147.     f.write('\n'.join(out))
  148.     f.close()
  149.    
  150.    
  151.  
  152. def bootstrap():
  153.     mods = MODS[:]; mods.append('tests')
  154.     do_cmd("gcc -Wall -g vmmain.c $FLAGS -lm -o vm")
  155.     do_cmd('python tests.py $SYS')
  156.     for mod in mods: do_cmd('python py2bc.py %s.py %s.tpc'%(mod,mod))
  157.     do_cmd(VM+'tests.tpc $SYS')
  158.     for mod in mods: do_cmd(VM+'py2bc.tpc %s.py %s.tpc'%(mod,mod))
  159.     build_bc()
  160.     do_cmd("gcc -Wall -g tpmain.c $FLAGS -lm -o tinypy")
  161.     #second pass - builts optimized binaries and stuff
  162.     do_cmd(TINYPY+'tests.py $SYS')
  163.     for mod in mods: do_cmd(TINYPY+'py2bc.py %s.py %s.tpc -nopos'%(mod,mod))
  164.     build_bc(True)
  165.     do_cmd("gcc -Wall -O2 tpmain.c $FLAGS -lm -o tinypy")
  166.     do_cmd(TINYPY+'tests.py $SYS')
  167.     print("# OK - we'll try -O3 for extra speed ...")
  168.     do_cmd("gcc -Wall -O3 tpmain.c $FLAGS -lm -o tinypy")
  169.     do_cmd(TINYPY+'tests.py $SYS')
  170.     print("# OK")
  171.     build_tp()
  172.     do_cmd("gcc -Wall -O3 tinypy-sdl.c tinypy.c $FLAGS $SDL -lm -o tinypy-sdl")
  173.  
  174. if __name__ == '__main__':
  175.     bootstrap()
  176.