bpo-38360: macOS: support alternate form of -isysroot flag (GH-16480)
It is possible to use either '-isysroot /some/path' (with a space) or
'-isysroot/some/path' (no space in between). Support both forms in
places where special handling of -isysroot is done, rather than just
the first form.
Co-authored-by: Ned Deily <nad@python.org>
(cherry picked from commit b310700976
)
Co-authored-by: Joshua Root <jmr@macports.org>
This commit is contained in:
parent
de5dcfa3bc
commit
e7f8684ef7
|
@ -211,7 +211,7 @@ def _remove_universal_flags(_config_vars):
|
||||||
if cv in _config_vars and cv not in os.environ:
|
if cv in _config_vars and cv not in os.environ:
|
||||||
flags = _config_vars[cv]
|
flags = _config_vars[cv]
|
||||||
flags = re.sub(r'-arch\s+\w+\s', ' ', flags, flags=re.ASCII)
|
flags = re.sub(r'-arch\s+\w+\s', ' ', flags, flags=re.ASCII)
|
||||||
flags = re.sub('-isysroot [^ \t]*', ' ', flags)
|
flags = re.sub(r'-isysroot\s*\S+', ' ', flags)
|
||||||
_save_modified_value(_config_vars, cv, flags)
|
_save_modified_value(_config_vars, cv, flags)
|
||||||
|
|
||||||
return _config_vars
|
return _config_vars
|
||||||
|
@ -287,7 +287,7 @@ def _check_for_unavailable_sdk(_config_vars):
|
||||||
# to /usr and /System/Library by either a standalone CLT
|
# to /usr and /System/Library by either a standalone CLT
|
||||||
# package or the CLT component within Xcode.
|
# package or the CLT component within Xcode.
|
||||||
cflags = _config_vars.get('CFLAGS', '')
|
cflags = _config_vars.get('CFLAGS', '')
|
||||||
m = re.search(r'-isysroot\s+(\S+)', cflags)
|
m = re.search(r'-isysroot\s*(\S+)', cflags)
|
||||||
if m is not None:
|
if m is not None:
|
||||||
sdk = m.group(1)
|
sdk = m.group(1)
|
||||||
if not os.path.exists(sdk):
|
if not os.path.exists(sdk):
|
||||||
|
@ -295,7 +295,7 @@ def _check_for_unavailable_sdk(_config_vars):
|
||||||
# Do not alter a config var explicitly overridden by env var
|
# Do not alter a config var explicitly overridden by env var
|
||||||
if cv in _config_vars and cv not in os.environ:
|
if cv in _config_vars and cv not in os.environ:
|
||||||
flags = _config_vars[cv]
|
flags = _config_vars[cv]
|
||||||
flags = re.sub(r'-isysroot\s+\S+(?:\s|$)', ' ', flags)
|
flags = re.sub(r'-isysroot\s*\S+(?:\s|$)', ' ', flags)
|
||||||
_save_modified_value(_config_vars, cv, flags)
|
_save_modified_value(_config_vars, cv, flags)
|
||||||
|
|
||||||
return _config_vars
|
return _config_vars
|
||||||
|
@ -320,7 +320,7 @@ def compiler_fixup(compiler_so, cc_args):
|
||||||
stripArch = stripSysroot = True
|
stripArch = stripSysroot = True
|
||||||
else:
|
else:
|
||||||
stripArch = '-arch' in cc_args
|
stripArch = '-arch' in cc_args
|
||||||
stripSysroot = '-isysroot' in cc_args
|
stripSysroot = any(arg for arg in cc_args if arg.startswith('-isysroot'))
|
||||||
|
|
||||||
if stripArch or 'ARCHFLAGS' in os.environ:
|
if stripArch or 'ARCHFLAGS' in os.environ:
|
||||||
while True:
|
while True:
|
||||||
|
@ -338,23 +338,34 @@ def compiler_fixup(compiler_so, cc_args):
|
||||||
|
|
||||||
if stripSysroot:
|
if stripSysroot:
|
||||||
while True:
|
while True:
|
||||||
try:
|
indices = [i for i,x in enumerate(compiler_so) if x.startswith('-isysroot')]
|
||||||
index = compiler_so.index('-isysroot')
|
if not indices:
|
||||||
|
break
|
||||||
|
index = indices[0]
|
||||||
|
if compiler_so[index] == '-isysroot':
|
||||||
# Strip this argument and the next one:
|
# Strip this argument and the next one:
|
||||||
del compiler_so[index:index+2]
|
del compiler_so[index:index+2]
|
||||||
except ValueError:
|
else:
|
||||||
break
|
# It's '-isysroot/some/path' in one arg
|
||||||
|
del compiler_so[index:index+1]
|
||||||
|
|
||||||
# Check if the SDK that is used during compilation actually exists,
|
# Check if the SDK that is used during compilation actually exists,
|
||||||
# the universal build requires the usage of a universal SDK and not all
|
# the universal build requires the usage of a universal SDK and not all
|
||||||
# users have that installed by default.
|
# users have that installed by default.
|
||||||
sysroot = None
|
sysroot = None
|
||||||
if '-isysroot' in cc_args:
|
argvar = cc_args
|
||||||
idx = cc_args.index('-isysroot')
|
indices = [i for i,x in enumerate(cc_args) if x.startswith('-isysroot')]
|
||||||
sysroot = cc_args[idx+1]
|
if not indices:
|
||||||
elif '-isysroot' in compiler_so:
|
argvar = compiler_so
|
||||||
idx = compiler_so.index('-isysroot')
|
indices = [i for i,x in enumerate(compiler_so) if x.startswith('-isysroot')]
|
||||||
sysroot = compiler_so[idx+1]
|
|
||||||
|
for idx in indices:
|
||||||
|
if argvar[idx] == '-isysroot':
|
||||||
|
sysroot = argvar[idx+1]
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
sysroot = argvar[idx][len('-isysroot'):]
|
||||||
|
break
|
||||||
|
|
||||||
if sysroot and not os.path.isdir(sysroot):
|
if sysroot and not os.path.isdir(sysroot):
|
||||||
from distutils import log
|
from distutils import log
|
||||||
|
|
|
@ -288,7 +288,7 @@ class UnixCCompiler(CCompiler):
|
||||||
# vs
|
# vs
|
||||||
# /usr/lib/libedit.dylib
|
# /usr/lib/libedit.dylib
|
||||||
cflags = sysconfig.get_config_var('CFLAGS')
|
cflags = sysconfig.get_config_var('CFLAGS')
|
||||||
m = re.search(r'-isysroot\s+(\S+)', cflags)
|
m = re.search(r'-isysroot\s*(\S+)', cflags)
|
||||||
if m is None:
|
if m is None:
|
||||||
sysroot = '/'
|
sysroot = '/'
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -174,6 +174,29 @@ class Test_OSXSupport(unittest.TestCase):
|
||||||
_osx_support._remove_universal_flags(
|
_osx_support._remove_universal_flags(
|
||||||
config_vars))
|
config_vars))
|
||||||
|
|
||||||
|
def test__remove_universal_flags_alternate(self):
|
||||||
|
# bpo-38360: also test the alternate single-argument form of -isysroot
|
||||||
|
config_vars = {
|
||||||
|
'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 ',
|
||||||
|
'LDFLAGS': '-arch ppc -arch i386 -g',
|
||||||
|
'CPPFLAGS': '-I. -isysroot/Developer/SDKs/MacOSX10.4u.sdk',
|
||||||
|
'BLDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 -g',
|
||||||
|
'LDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 '
|
||||||
|
'-isysroot/Developer/SDKs/MacOSX10.4u.sdk -g',
|
||||||
|
}
|
||||||
|
expected_vars = {
|
||||||
|
'CFLAGS': '-fno-strict-aliasing -g -O3 ',
|
||||||
|
'LDFLAGS': ' -g',
|
||||||
|
'CPPFLAGS': '-I. ',
|
||||||
|
'BLDSHARED': 'gcc-4.0 -bundle -g',
|
||||||
|
'LDSHARED': 'gcc-4.0 -bundle -g',
|
||||||
|
}
|
||||||
|
self.add_expected_saved_initial_values(config_vars, expected_vars)
|
||||||
|
|
||||||
|
self.assertEqual(expected_vars,
|
||||||
|
_osx_support._remove_universal_flags(
|
||||||
|
config_vars))
|
||||||
|
|
||||||
def test__remove_unsupported_archs(self):
|
def test__remove_unsupported_archs(self):
|
||||||
config_vars = {
|
config_vars = {
|
||||||
'CC': 'clang',
|
'CC': 'clang',
|
||||||
|
@ -261,6 +284,34 @@ class Test_OSXSupport(unittest.TestCase):
|
||||||
_osx_support._check_for_unavailable_sdk(
|
_osx_support._check_for_unavailable_sdk(
|
||||||
config_vars))
|
config_vars))
|
||||||
|
|
||||||
|
def test__check_for_unavailable_sdk_alternate(self):
|
||||||
|
# bpo-38360: also test the alternate single-argument form of -isysroot
|
||||||
|
config_vars = {
|
||||||
|
'CC': 'clang',
|
||||||
|
'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 '
|
||||||
|
'-isysroot/Developer/SDKs/MacOSX10.1.sdk',
|
||||||
|
'LDFLAGS': '-arch ppc -arch i386 -g',
|
||||||
|
'CPPFLAGS': '-I. -isysroot/Developer/SDKs/MacOSX10.1.sdk',
|
||||||
|
'BLDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 -g',
|
||||||
|
'LDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 '
|
||||||
|
'-isysroot/Developer/SDKs/MacOSX10.1.sdk -g',
|
||||||
|
}
|
||||||
|
expected_vars = {
|
||||||
|
'CC': 'clang',
|
||||||
|
'CFLAGS': '-fno-strict-aliasing -g -O3 -arch ppc -arch i386 '
|
||||||
|
' ',
|
||||||
|
'LDFLAGS': '-arch ppc -arch i386 -g',
|
||||||
|
'CPPFLAGS': '-I. ',
|
||||||
|
'BLDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 -g',
|
||||||
|
'LDSHARED': 'gcc-4.0 -bundle -arch ppc -arch i386 '
|
||||||
|
' -g',
|
||||||
|
}
|
||||||
|
self.add_expected_saved_initial_values(config_vars, expected_vars)
|
||||||
|
|
||||||
|
self.assertEqual(expected_vars,
|
||||||
|
_osx_support._check_for_unavailable_sdk(
|
||||||
|
config_vars))
|
||||||
|
|
||||||
def test_get_platform_osx(self):
|
def test_get_platform_osx(self):
|
||||||
# Note, get_platform_osx is currently tested more extensively
|
# Note, get_platform_osx is currently tested more extensively
|
||||||
# indirectly by test_sysconfig and test_distutils
|
# indirectly by test_sysconfig and test_distutils
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Support single-argument form of macOS -isysroot flag.
|
2
setup.py
2
setup.py
|
@ -110,7 +110,7 @@ def macosx_sdk_root():
|
||||||
return MACOS_SDK_ROOT
|
return MACOS_SDK_ROOT
|
||||||
|
|
||||||
cflags = sysconfig.get_config_var('CFLAGS')
|
cflags = sysconfig.get_config_var('CFLAGS')
|
||||||
m = re.search(r'-isysroot\s+(\S+)', cflags)
|
m = re.search(r'-isysroot\s*(\S+)', cflags)
|
||||||
if m is not None:
|
if m is not None:
|
||||||
MACOS_SDK_ROOT = m.group(1)
|
MACOS_SDK_ROOT = m.group(1)
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in New Issue