Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Lib/distutils/tests/test_unixccompiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ def gcv(v):
sys.platform = 'bar'
def gcv(v):
if v == 'CC':
return 'cc'
return 'icc'
elif v == 'GNULD':
return 'yes'
sysconfig.get_config_var = gcv
Expand All @@ -100,7 +100,7 @@ def gcv(v):
sys.platform = 'bar'
def gcv(v):
if v == 'CC':
return 'cc'
return 'icc'
elif v == 'GNULD':
return 'no'
sysconfig.get_config_var = gcv
Expand Down
24 changes: 22 additions & 2 deletions Lib/distutils/unixccompiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
* link shared library handled by 'cc -shared'
"""

import os, sys, re
import os, sys, re, shutil

from distutils import sysconfig
from distutils.dep_util import newer
Expand Down Expand Up @@ -216,7 +216,27 @@ def library_dir_option(self, dir):

def _is_gcc(self, compiler_name):
# clang uses same syntax for rpath as gcc
return any(name in compiler_name for name in ("gcc", "g++", "clang"))
valid_compiler_names = ("gcc", "g++", "clang")
is_gcc = any(name in compiler_name for name in valid_compiler_names)
# On Linux systems, the compiler name may be, e.g., "cc -pthread".
# The executable "cc" is in this case a symlink to the true compiler.
if not is_gcc and "cc" in compiler_name:
# We need to make sure that this is not another compiler with "cc"
# at the end of its name, like "icc". For this, it is checked
# whether "cc" is the first word, or separated by a space or path
# delimiter before the "cc" substring.
cc_string_location = compiler_name.find("cc")
if cc_string_location == 0 \
or compiler_name[cc_string_location - 1] == ' ' \
or compiler_name[cc_string_location - 1] == '/' \
or compiler_name[cc_string_location - 1] == '\\':
cc_path = shutil.which("cc")
if cc_path is not None:
real_compiler_path = os.path.realpath(cc_path)
is_gcc = any(
name in real_compiler_path \
for name in valid_compiler_names)
return is_gcc

def runtime_library_dir_option(self, dir):
# XXX Hackish, at the very least. See Python bug #445902:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix build failures with older versions of GCC when using runtime_library_dirs with distutils. Older versions of GCC only support the flag "-Wl,-R" instead of "-R". distutils now also handles this correctly with the compiler alias "cc".