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'