From f2f9d8b27aabea41aaacd6492e234f4ff1830bfe Mon Sep 17 00:00:00 2001 From: Paul Brossier Date: Tue, 3 Oct 2017 09:07:14 +0200 Subject: [PATCH] src/wscript_build: add task to create def file on windows, inspired by waf/extras/syms (see #126 and waf-project/waf#2053) --- src/wscript_build | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/wscript_build b/src/wscript_build index aa85d958..a3706226 100644 --- a/src/wscript_build +++ b/src/wscript_build @@ -25,7 +25,7 @@ ctx(features = 'c', if ctx.env['DEST_OS'] in ['ios', 'iosimulator']: build_features = ['cstlib', 'cshlib'] elif ctx.env['DEST_OS'] in ['win32', 'win64']: - build_features = ['cstlib', 'cshlib'] + build_features = ['cstlib', 'cshlib gensyms'] elif ctx.env['DEST_OS'] in ['emscripten']: build_features = ['cstlib','cshlib'] elif '--static' in ctx.env['LDFLAGS'] or '--static' in ctx.env['LINKFLAGS']: @@ -40,10 +40,48 @@ from waflib.Tools.c import cstlib from waflib.Tools.fc import fcstlib fcstlib.inst_to = cstlib.inst_to = '${LIBDIR}' +import re +from waflib import TaskGen, Task +from waflib.Context import STDOUT +from waflib.Utils import O644 + +class gen_sym_file(Task.Task): + color = 'BLUE' + inst_to = '${LIBDIR}' + def run(self): + syms = {} + reg = getattr(self.generator, 'export_symbols_regex','.+?') + binary_path = self.generator.link_task.outputs[0].abspath() + if 'msvc' in self.env.CC_NAME: + reg_compiled = re.compile(r'External\s+\|\s+_(?P%s)\b' % reg) + cmd =(self.env.DUMPBIN or['dumpbin'])+['/symbols', binary_path] + else: # using gcc? assume we have nm + reg_compiled = re.compile(r'(T|D)\s+_(?P%s)\b'%reg) + cmd = (self.env.NM or ['nm']) + ['-g', binary_path] + print (cmd) + dump_output = self.generator.bld.cmd_and_log(cmd, quiet=STDOUT) + print (dump_output) + syms = [] + for m in reg_compiled.finditer(dump_output): + syms += [m.group('symbol')] + print (m.group('symbol')) + self.outputs[0].write('EXPORTS\n'+'\n'.join(syms)) + +@TaskGen.feature('gensyms') +@TaskGen.after_method('process_source','process_use','apply_link','process_uselib_local','propagate_uselib_vars') +def gen_symbols(self): + #sym_file = self.path.find_or_declare(self.target + '.def') + sym_file_name = os.path.splitext(self.link_task.outputs[0].abspath())[0] + '.def' + sym_file = self.path.find_or_declare(sym_file_name) + symtask = self.create_task('gen_sym_file', self.link_task.outputs, sym_file) + self.add_install_files(install_to=self.link_task.inst_to, install_from=sym_file, + chmod=O644, task=self.link_task) + for target in build_features: ctx(features = 'c ' + target, use = uselib + ['lib_objects'], target = 'aubio', + export_symbols_regex=r'(?:.*aubio|fvec|lvec|cvec|fmat)_.*', vnum = ctx.env['LIB_VERSION']) # install headers, except _priv.h ones -- 2.11.0