> Subject: Re: [PATCH v6 9/9] build: generate version.map file for MingW on > Windows > > 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). >
Right, this special case is irrelevant to MinGW, will remove in v7. > > > > # 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. > IMO Having a separated function for minGW is sufficient, I'll add the change to v7. Thanks. > -- > Dmitry Kozlyuk