diff --git a/mesonbuild/scripts/symbolextractor.py b/mesonbuild/scripts/symbolextractor.py index dea7284f5..b168acc54 100644 --- a/mesonbuild/scripts/symbolextractor.py +++ b/mesonbuild/scripts/symbolextractor.py @@ -55,6 +55,8 @@ def print_tool_warning(tool, msg, stderr=None): global TOOL_WARNING_FILE if os.path.exists(TOOL_WARNING_FILE): return + if len(tool) == 1: + tool = tool[0] m = '{!r} {}. {}'.format(tool, msg, RELINKING_WARNING) if stderr: m += '\n' + stderr @@ -66,10 +68,13 @@ def print_tool_warning(tool, msg, stderr=None): def call_tool(name, args): evar = name.upper() if evar in os.environ: - name = os.environ[evar].strip() + import shlex + name = shlex.split(os.environ[evar]) + else: + name = [name] # Run it try: - p, output, e = Popen_safe([name] + args) + p, output, e = Popen_safe(name + args) except FileNotFoundError: print_tool_warning(tool, 'not found') return None @@ -80,15 +85,15 @@ def call_tool(name, args): def linux_syms(libfilename: str, outfilename: str): # Get the name of the library - output = call_tool(['readelf', '-d', libfilename]) + output = call_tool('readelf', ['-d', libfilename]) if not output: dummy_syms(outfilename) return result = [x for x in output.split('\n') if 'SONAME' in x] assert(len(result) <= 1) # Get a list of all symbols exported - output = call_tool(['nm', '--dynamic', '--extern-only', '--defined-only', - '--format=posix', libfilename]) + output = call_tool('nm', ['--dynamic', '--extern-only', '--defined-only', + '--format=posix', libfilename]) if not output: dummy_syms(outfilename) return @@ -104,7 +109,7 @@ def linux_syms(libfilename: str, outfilename: str): def osx_syms(libfilename, outfilename): # Get the name of the library - output = call_tool(['otool', '-l', libfilename]) + output = call_tool('otool', ['-l', libfilename]) if not output: dummy_syms(outfilename) return @@ -115,8 +120,8 @@ def osx_syms(libfilename, outfilename): break result = [arr[match + 2], arr[match + 5]] # Libreoffice stores all 5 lines but the others seem irrelevant. # Get a list of all symbols exported - output = call_tool(['nm', '--extern-only', '--defined-only', - '--format=posix', libfilename]) + output = call_tool('nm', ['--extern-only', '--defined-only', + '--format=posix', libfilename]) if not output: dummy_syms(outfilename) return