On Fri, 19 Jun 2020 00:15:46 +0300 tal...@mellanox.com wrote: > From: Tal Shnaiderman <tal...@mellanox.com> > > The MingW build for Windows has special cases where exported > function contain additional prefix: > > __emutls_v.per_lcore__* > > To avoid adding those prefixed functions to the version.map file > the map_to_def.py script was modified to create a map file for Mingw > with the needed changed.
Thanks for working on this. Your solution is even simpler than we discussed, see some comments inline. > > The file name was changed to map_to_win.py > > Signed-off-by: Tal Shnaiderman <tal...@mellanox.com> > --- > buildtools/{map_to_def.py => map_to_win.py} | 21 ++++++++++++++++----- > buildtools/meson.build | 4 ++-- > drivers/meson.build | 12 +++++++++--- > lib/meson.build | 15 ++++++++++++--- > 4 files changed, 39 insertions(+), 13 deletions(-) > rename buildtools/{map_to_def.py => map_to_win.py} (51%) > > diff --git a/buildtools/map_to_def.py b/buildtools/map_to_win.py > similarity index 51% > rename from buildtools/map_to_def.py > rename to buildtools/map_to_win.py > index 6775b54a9d..dfb0748159 100644 > --- a/buildtools/map_to_def.py > +++ b/buildtools/map_to_win.py > @@ -13,23 +13,34 @@ def is_function_line(ln): > > def main(args): > if not args[1].endswith('version.map') or \ > - not args[2].endswith('exports.def'): > + not args[2].endswith('exports.def') and \ > + not args[2].endswith('mingw.map'): > return 1 > > # special case, allow override if an def file already exists alongside map > file > +# for mingw also replace per_lcore__* to __emutls_v.per_lcore__* > override_file = join(dirname(args[1]), basename(args[2])) > if exists(override_file): > with open(override_file) as f_in: > - functions = f_in.readlines() > + lines = f_in.readlines() > + if args[2].endswith('mingw.map'): > + lines = [l.replace('per_lcore__', '__emutls_v.per_lcore__') > for l in lines] > + functions = lines MinGW GCC linker doesn't fail on undefined symbols, so .map overrides will never be needed (and we're going to get rid of overrides soon anyway). > > # generate def file from map file. > -# This works taking indented lines only which end with a ";" and which don't > +# For clang this works taking indented lines only which end with a ";" and > which don't > # have a colon in them, i.e. the lines defining functions only. > +# mingw keeps the original .map file but replaces per_lcore__* to > __emutls_v.per_lcore__* > else: > with open(args[1]) as f_in: > - functions = [ln[:-2] + '\n' for ln in sorted(f_in.readlines()) > + lines = f_in.readlines() > + if args[2].endswith('mingw.map'): > + lines = [l.replace('per_lcore__', '__emutls_v.per_lcore__') > for l in lines] > + functions = lines > + else: > + functions = [ln[:-2] + '\n' for ln in sorted(lines) > if is_function_line(ln)] > - functions = ["EXPORTS\n"] + functions > + functions = ["EXPORTS\n"] + functions Considering the comment above, entire logic for mingw.map is the following: if args[2].endswith('mingw.map'): with open(args[1]) as f_in, open(args[2], 'w') as f_out: f_out.writelines([...replace... for line in f_in.readlines()]) return 0 Wouldn't it be cleaner to move it to the beginning of function or even to a separate function dispatched by filename (or even script)? Motivation: soon .def logic will become more complicated and Windows-dependent (to analyze dumpbin.exe output), intertwining it with .map saves nothing and will impede. -- Dmitry Kozlyuk