ninja: Implement Windows-style command line quoting

We avoided having to get this right previously, as we'd always use a
response file if possible.

But this is so insane, I can't imagine it's right.

See also: subprocess.list2cmdline() internal method
pull/7245/head
Jon Turney 6 years ago committed by Dan Kegel
parent fbacf87af5
commit eb60c041f9
  1. 15
      mesonbuild/backend/ninjabackend.py

@ -53,8 +53,17 @@ FORTRAN_SUBMOD_PAT = r"^\s*\bsubmodule\b\s*\((\w+:?\w+)\)\s*(\w+)"
FORTRAN_USE_PAT = r"^\s*use,?\s*(?:non_intrinsic)?\s*(?:::)?\s*(\w+)"
def cmd_quote(s):
# XXX: this needs to understand how to escape any existing double quotes(")
return '"{}"'.format(s)
# see: https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw#remarks
# backslash escape any existing double quotes
# any existing backslashes preceding a quote are doubled
s = re.sub(r'(\\*)"', lambda m: '\\' * (len(m.group(1)) * 2 + 1) + '"', s)
# any terminal backslashes likewise need doubling
s = re.sub(r'(\\*)$', lambda m: '\\' * (len(m.group(1)) * 2), s)
# and double quote
s = '"{}"'.format(s)
return s
# How ninja executes command lines differs between Unix and Windows
# (see https://ninja-build.org/manual.html#ref_rule_command)
@ -340,8 +349,6 @@ class NinjaBuildElement:
else:
quoter = lambda x: ninja_quote(qf(x))
i = i.replace('\\', '\\\\')
if qf('') == '""':
i = i.replace('"', '\\"')
newelems.append(quoter(i))
line += ' '.join(newelems)
line += '\n'

Loading…
Cancel
Save