ref: f2f9d8b27aabea41aaacd6492e234f4ff1830bfe
parent: dfe058a0aceb47abf80d5eb24670b81ad756eaf7
author: Paul Brossier <piem@piem.org>
date: Tue Oct 3 05:07:14 EDT 2017
src/wscript_build: add task to create def file on windows, inspired by waf/extras/syms (see #126 and waf-project/waf#2053)
--- a/src/wscript_build
+++ b/src/wscript_build
@@ -25,7 +25,7 @@
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.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<symbol>%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<symbol>%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