libshit

Just some random shit
git clone https://git.neptards.moe/neptards/libshit.git
Log | Files | Refs | Submodules | README | LICENSE

wscript_lua (5275B)


      1 # -*- python -*-
      2 
      3 from waflib import Context
      4 def options(ctx):
      5     ctx.with_opt('lua', ['lua', 'system', 'none'],
      6                  default=getattr(Context.g_module, 'DEFAULT_LUA', 'none'))
      7 
      8     grp = ctx.get_option_group('configure options')
      9     grp.add_option('--lua-pc-name', action='store', default='lua5.3',
     10                    help='Lua pkg-config name (in case of --with-lua=system). '+
     11                    'Should be lua 5.3 or compatible with c++ exceptions')
     12     grp.add_option('--lua-dll', action='store_true', default=None,
     13                    help='Compile lua as dll (Windows only)')
     14 
     15     grp.add_option('--luac-mode', action='store',
     16                    help='Luac mode: copy, system-luajit, luac, system-luac, luac-wrapper')
     17 
     18 def chk_luac(ctx, modes):
     19     if not ctx.env.LUAC_MODE in modes:
     20         ctx.fatal('Invalid --luac-mode, valid modes: %s' % modes)
     21     if ctx.env.LUAC_MODE in ['system-luajit', 'system-luac', 'luac-wrapper']:
     22         if ctx.env.LUAC == []:
     23             ctx.fatal('Must specify LUAC env var')
     24 
     25 def configure(ctx):
     26     from waflib import Logs
     27     ctx.add_os_flags('LUACFLAGS')
     28     ctx.add_os_flags('LUAC')
     29 
     30     def no_lua(ctx, _):
     31         ctx.env.append_value('DEFINES_LUA', 'LIBSHIT_WITH_LUA=0')
     32         ctx.env.WITH_LUA = 'none'
     33     ctx.only_host_env(no_lua)
     34 
     35     ctx.env.LUAC_MODE = ctx.options.luac_mode
     36 
     37     def check_none(ctx):
     38         chk_luac(ctx, [[]])
     39 
     40     def check_system(ctx):
     41         ctx.check_cfg(package=ctx.options.lua_pc_name, args='--cflags --libs',
     42                       uselib_store='LUA')
     43         if not ctx.env.LUAC_MODE: ctx.env.LUAC_MODE = 'copy'
     44         chk_luac(ctx, ['copy', 'system-luajit', 'system-luac'])
     45 
     46     def check_common(ctx):
     47         if ctx.env.DEST_OS == 'win32':
     48             ctx.env.LUA_DLL = ctx.options.lua_dll
     49 
     50         if ctx.env['COMPILER_CXX'] != 'msvc':
     51             ctx.env.append_value('CFLAGS_LUA', '-fexceptions')
     52 
     53         if ctx.env.LUA_DLL:
     54             ctx.env.append_value('DEFINES_LUA', 'LUA_BUILD_AS_DLL')
     55         if not ctx.options.release:
     56             ctx.env.append_value('DEFINES_LUA', 'LUA_USE_APICHECK')
     57 
     58     def check_lua(ctx):
     59         check_common(ctx)
     60         ctx.recurse('lua', name='configure', once=False)
     61         chk_luac(ctx, ['copy', 'luac', 'system-luac', 'luac-wrapper'])
     62 
     63     ctx.with_chk(
     64         'lua', {'none': check_none, 'system': check_system,
     65                 'lua': check_lua}, define='LIBSHIT_WITH_LUA')
     66 
     67     if ctx.env.DEBUG and ctx.env.LUAC_MODE in ['system-luajit']:
     68         ctx.env.append_value('LUACFLAGS', '-g')
     69     elif not ctx.env.DEBUG and \
     70          ctx.env.LUAC_MODE in ['luac', 'system-luac', 'luac-wrapper']:
     71         ctx.env.append_value('LUACFLAGS', '-s')
     72 
     73 def build(ctx):
     74     if ctx.env.WITH_LUA == 'lua':
     75         ctx.recurse('lua', name='build', once=False)
     76 
     77 
     78 from waflib import Task, Utils
     79 from hashlib import sha256
     80 class bin2c(Task.Task):
     81     color = 'BLUE'
     82     map = {
     83         39: "'",
     84         92: "\\",
     85         7:  "a",
     86         8:  "b",
     87         9:  "t",
     88         10: "n",
     89         11: "v",
     90         12: "f",
     91         13: "r",
     92     }
     93 
     94     def __init__(self, *k, **kw):
     95         Task.Task.__init__(self, *k, **kw)
     96         if True:
     97             self.name_prefix = 'luaJIT_BC_'
     98             self.quote_name = lambda x: x
     99         else:
    100             self.name_prefix = 'BIN2C'
    101             self.quote_name = Utils.quote_define_name
    102 
    103     def run(self):
    104         inp = self.inputs[0]
    105         data = inp.read('rb')
    106         hash = sha256(data).hexdigest()
    107 
    108         name = self.name_prefix + self.quote_name(inp.change_ext('').name)
    109         out = """
    110 #ifndef %s_H_INCLUDED_%s
    111 #define %s_H_INCLUDED_%s
    112 #pragma once
    113 
    114 static constexpr const size_t %s_SIZE = %d;
    115 static const char %s[] = {
    116 """ % (name, hash, name, hash, name, len(data), name)
    117         i = 0
    118         for c in data:
    119             if i > 16:
    120                 out += "\n"
    121                 i = 0
    122             i += 1
    123             if c in self.map:
    124                 out += "'\\%s'," % self.map[c]
    125             elif c >= 32 and c < 127:
    126                 out += "'%s'," % chr(c)
    127             else:
    128                 out += "'\%o'," % int(c)
    129         out += "\n};\n\n#endif\n"
    130         self.outputs[0].write(out)
    131 
    132 from waflib.TaskGen import extension
    133 @extension('.lua')
    134 def lua_to_h(self, node):
    135     if not self.env.WITH_LUA:
    136         self.bld.fatal('Trying to compile .lua in build with no lua')
    137 
    138     out = node.change_ext('.lua.h')
    139     if self.env.LUAC_MODE == 'copy':
    140         self.create_task('bin2c', node, out)
    141     elif self.env.LUAC_MODE == 'system-luajit':
    142         self.create_task('luajit', node, out)
    143     elif self.env.LUAC_MODE == 'system-luac':
    144         self.luac_task(node, out, self.env.LUAC[0])
    145     elif self.env.LUAC_MODE == 'luac':
    146         luac = self.bld.get_tgen_by_name('luac').link_task.outputs[0]
    147         tsk = self.luac_task(node, out, luac.abspath())
    148         tsk.dep_nodes += [luac]
    149     elif self.env.LUAC_MODE == 'luac-wrapper':
    150         luac = self.bld.get_tgen_by_name('luac').link_task.outputs[0]
    151         tsk = self.luac_task(node, out, self.env.LUAC + [luac.abspath()])
    152         tsk.dep_nodes += [luac]
    153     else:
    154         self.bld.fatal('Unknown LUAC_MODE %s' % self.env.LUAC_MODE)
    155 
    156 # task .lua->.h
    157 class luajit(Task.Task):
    158     run_str = '${LUAC} -bt h ${LUACFLAGS} ${SRC} ${TGT}'
    159     color = 'BLUE'