diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index bf04ac541e6b02..f3198d666080b0 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -259,12 +259,21 @@ def _parse_makefile(filename, vars=None): while len(variables) > 0: for name in tuple(variables): value = notdone[name] - m1 = _findvar1_rx.search(value) - m2 = _findvar2_rx.search(value) - if m1 and m2: - m = m1 if m1.start() < m2.start() else m2 - else: - m = m1 if m1 else m2 + m = None + offset = 0 + for substr in value.split('$$'): + m1 = _findvar1_rx.search(substr) + m2 = _findvar2_rx.search(substr) + if m1 and m2: + m = m1 if m1.start() < m2.start() else m2 + else: + m = m1 if m1 else m2 + if m is not None: + break + + # Add 2 to account for the $$ which were removed by split('$$') + offset += 2 + len(substr) + if m is not None: n = m.group(1) found = True @@ -292,11 +301,13 @@ def _parse_makefile(filename, vars=None): done[n] = item = "" if found: - after = value[m.end():] - value = value[:m.start()] + item + after - if "$" in after: + after = value[offset + m.end():] + value = value[:offset + m.start()] + \ + item.replace('$', '$$') + after + if "$" in after.replace('$$', ''): notdone[name] = value else: + value = value.replace('$$', '$') try: value = int(value) except ValueError: diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py index d07d28df607ce7..05fa441e20c429 100644 --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -406,6 +406,7 @@ def test_parse_makefile(self): print("var5=dollar$$5", file=makefile) print("var6=${var3}/lib/python3.5/config-$(VAR2)$(var5)" "-x86_64-linux-gnu", file=makefile) + print("var7=$${ORIGIN}${var5}", file=makefile) vars = sysconfig._parse_makefile(TESTFN) self.assertEqual(vars, { 'var1': 'ab42', @@ -414,6 +415,7 @@ def test_parse_makefile(self): 'var4': '$/invalid', 'var5': 'dollar$5', 'var6': '42/lib/python3.5/config-b42dollar$5-x86_64-linux-gnu', + 'var7': '${ORIGIN}dollar$5', }) diff --git a/Misc/NEWS.d/next/Library/2018-09-17-19-11-17.bpo-34689.RtyOE3.rst b/Misc/NEWS.d/next/Library/2018-09-17-19-11-17.bpo-34689.RtyOE3.rst new file mode 100644 index 00000000000000..1751dcb7bb77a6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-09-17-19-11-17.bpo-34689.RtyOE3.rst @@ -0,0 +1,2 @@ +Split strings prior to parsing in `sysconfig._parse_makefile` so it doesn't +expand variables formatted as ``$${variable}``.