#! /usr/bin/env python # encoding: utf-8 import hashlib from waflib import Task, TaskGen, Logs OBJ_NAME = 'YY_Thunks_for_WinXP.obj' OBJ_SHA256 = '51a13c4b667c82181d357e274a50308a273be63f5f85ae958465774857721573' DLL_LINKFLAGS = ['-ENTRY:DllMainCRTStartupForYY_Thunks', '-alternatename:_YY_ThunksOriginalDllMainCRTStartup@12=__DllMainCRTStartup@12'] class copy_yy_thunks(Task.Task): color = 'CYAN' def run(self): return self.outputs[0].write(self.inputs[0].read('rb'), 'wb') @TaskGen.feature('yy_thunks') def add_yy_thunks_obj(self): src = self.path.find_node(OBJ_NAME) out = self.path.find_or_declare(OBJ_NAME) self.compiled_tasks = [self.create_task('copy_yy_thunks', src, out)] @TaskGen.feature('cshlib', 'cxxshlib') @TaskGen.after_method('process_use') def apply_yy_thunks_dll(self): if 'yy_thunks' not in self.to_list(getattr(self, 'use', [])): return try: self.bld.get_tgen_by_name('yy_thunks') except Exception: return self.env.append_value('LINKFLAGS', DLL_LINKFLAGS) def options(opt): pass def configure(conf): if conf.env.DEST_OS != 'win32' or conf.env.COMPILER_CC != 'msvc': return if conf.env.MSVC_TARGETS[0] not in ['amd64_x86', 'x86']: return obj = conf.path.find_node(OBJ_NAME) if not obj: Logs.warn('YY-Thunks: %s not found, XP compatibility disabled' % OBJ_NAME) return with open(obj.abspath(), 'rb') as f: digest = hashlib.sha256(f.read()).hexdigest() if digest != OBJ_SHA256: conf.fatal('%s checksum mismatch: expected %s, got %s' % (OBJ_NAME, OBJ_SHA256, digest)) conf.env.YY_THUNKS = True def build(bld): if bld.env.YY_THUNKS: bld(name='yy_thunks', features='yy_thunks')