1
1
"""Tests for distutils.unixccompiler."""
2
+ import os
2
3
import sys
3
4
import unittest
4
5
from test .support import run_unittest
5
6
6
7
from .py38compat import EnvironmentVarGuard
7
8
8
9
from distutils import sysconfig
10
+ from distutils .errors import DistutilsPlatformError
9
11
from distutils .unixccompiler import UnixCCompiler
12
+ from distutils .util import _clear_cached_macosx_ver
10
13
11
14
class UnixCCompilerTestCase (unittest .TestCase ):
12
15
@@ -26,18 +29,90 @@ def tearDown(self):
26
29
27
30
@unittest .skipIf (sys .platform == 'win32' , "can't test on Windows" )
28
31
def test_runtime_libdir_option (self ):
29
- # Issue#5900
32
+ # Issue #5900; GitHub Issue #37
30
33
#
31
34
# Ensure RUNPATH is added to extension modules with RPATH if
32
35
# GNU ld is used
33
36
34
37
# darwin
35
38
sys .platform = 'darwin'
36
- self .assertEqual (self .cc .rpath_foo (), '-L/foo' )
39
+ darwin_ver_var = 'MACOSX_DEPLOYMENT_TARGET'
40
+ darwin_rpath_flag = '-Wl,-rpath,/foo'
41
+ darwin_lib_flag = '-L/foo'
42
+
43
+ # (macOS version from syscfg, macOS version from env var) -> flag
44
+ # Version value of None generates two tests: as None and as empty string
45
+ # Expected flag value of None means an mismatch exception is expected
46
+ darwin_test_cases = [
47
+ ((None , None ), darwin_lib_flag ),
48
+ ((None , '11' ), darwin_rpath_flag ),
49
+ (('10' , None ), darwin_lib_flag ),
50
+ (('10.3' , None ), darwin_lib_flag ),
51
+ (('10.3.1' , None ), darwin_lib_flag ),
52
+ (('10.5' , None ), darwin_rpath_flag ),
53
+ (('10.5.1' , None ), darwin_rpath_flag ),
54
+ (('10.3' , '10.3' ), darwin_lib_flag ),
55
+ (('10.3' , '10.5' ), darwin_rpath_flag ),
56
+ (('10.5' , '10.3' ), darwin_lib_flag ),
57
+ (('10.5' , '11' ), darwin_rpath_flag ),
58
+ (('10.4' , '10' ), None ),
59
+ ]
60
+
61
+ def make_darwin_gcv (syscfg_macosx_ver ):
62
+ def gcv (var ):
63
+ if var == darwin_ver_var :
64
+ return syscfg_macosx_ver
65
+ return "xxx"
66
+ return gcv
67
+
68
+ def do_darwin_test (syscfg_macosx_ver , env_macosx_ver , expected_flag ):
69
+ env = os .environ
70
+ msg = "macOS version = (sysconfig=%r, env=%r)" % \
71
+ (syscfg_macosx_ver , env_macosx_ver )
72
+
73
+ # Save
74
+ old_gcv = sysconfig .get_config_var
75
+ old_env_macosx_ver = env .get (darwin_ver_var )
76
+
77
+ # Setup environment
78
+ _clear_cached_macosx_ver ()
79
+ sysconfig .get_config_var = make_darwin_gcv (syscfg_macosx_ver )
80
+ if env_macosx_ver is not None :
81
+ env [darwin_ver_var ] = env_macosx_ver
82
+ elif darwin_ver_var in env :
83
+ env .pop (darwin_ver_var )
84
+
85
+ # Run the test
86
+ if expected_flag is not None :
87
+ self .assertEqual (self .cc .rpath_foo (), expected_flag , msg = msg )
88
+ else :
89
+ with self .assertRaisesRegex (DistutilsPlatformError ,
90
+ darwin_ver_var + r' mismatch' , msg = msg ):
91
+ self .cc .rpath_foo ()
92
+
93
+ # Restore
94
+ if old_env_macosx_ver is not None :
95
+ env [darwin_ver_var ] = old_env_macosx_ver
96
+ elif darwin_ver_var in env :
97
+ env .pop (darwin_ver_var )
98
+ sysconfig .get_config_var = old_gcv
99
+ _clear_cached_macosx_ver ()
100
+
101
+ for macosx_vers , expected_flag in darwin_test_cases :
102
+ syscfg_macosx_ver , env_macosx_ver = macosx_vers
103
+ do_darwin_test (syscfg_macosx_ver , env_macosx_ver , expected_flag )
104
+ # Bonus test cases with None interpreted as empty string
105
+ if syscfg_macosx_ver is None :
106
+ do_darwin_test ("" , env_macosx_ver , expected_flag )
107
+ if env_macosx_ver is None :
108
+ do_darwin_test (syscfg_macosx_ver , "" , expected_flag )
109
+ if syscfg_macosx_ver is None and env_macosx_ver is None :
110
+ do_darwin_test ("" , "" , expected_flag )
111
+
112
+ old_gcv = sysconfig .get_config_var
37
113
38
114
# hp-ux
39
115
sys .platform = 'hp-ux'
40
- old_gcv = sysconfig .get_config_var
41
116
def gcv (v ):
42
117
return 'xxx'
43
118
sysconfig .get_config_var = gcv
0 commit comments