Aurelien Larcher
2021-01-08 b5a8497ec9558d0061024ac4b49f445bbe7d1094
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
This patch modifies the setup script to support Solaris.
As it is Solaris-specific, it is not suitable for upstream.
 
Bugs associated with following changes:
 
Curses library fixes: Bug 22661864
 
Changes to directory inclusion: Bug 20367692
 
Libsocket tweaks: Bug 21959680
 
--- Python-3.9.1/setup.py
+++ Python-3.9.1/setup.py
@@ -725,12 +725,15 @@ class PyBuildExt(build_ext):
                         add_dir_to_list(dir_list, directory)
 
     def configure_compiler(self):
-        # Ensure that /usr/local is always used, but the local build
-        # directories (i.e. '.' and 'Include') must be first.  See issue
-        # 10520.
         if not CROSS_COMPILING:
-            add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
-            add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
+            if HOST_PLATFORM != 'sunos5':
+                # Upstream notes the following for source builds:
+                #    Ensure that /usr/local is always used, but the local build
+                #    directories (i.e. '.' and 'Include') must be first.  See
+                #    issue 10520.
+                # But we skip that for Solaris system builds.
+                add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
+                add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
         # only change this for cross builds for 3.3, issues on Mageia
         if CROSS_COMPILING:
             self.add_cross_compiling_paths()
@@ -1042,6 +1045,13 @@ class PyBuildExt(build_ext):
                                                      ['/usr/lib/termcap'],
                                                      'termcap'):
                 readline_libs.append('termcap')
+
+            if HOST_PLATFORM == 'sunos5':
+                # insert '-zrecord' before the readline libraries that we
+                # want to link with to avoid rl_insert() elimination
+                readline_extra_link_args = ('-Wl,-zrecord','-lreadline','-lncurses')
+                readline_libs = ()
+
             self.add(Extension('readline', ['readline.c'],
                                library_dirs=['/usr/lib/termcap'],
                                extra_link_args=readline_extra_link_args,
@@ -1076,6 +1086,10 @@ class PyBuildExt(build_ext):
 
         curses_enabled = True
         if curses_library.startswith('ncurses'):
+            if HOST_PLATFORM == 'sunos5':
+                curses_defines.append(('HAVE_NCURSESW', '1'))
+                curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
+                curses_includes.append('/usr/include/ncurses')
             curses_libs = [curses_library]
             self.add(Extension('_curses', ['_cursesmodule.c'],
                                include_dirs=curses_includes,
@@ -1103,10 +1117,34 @@ class PyBuildExt(build_ext):
         skip_curses_panel = True if AIX else False
         if (curses_enabled and not skip_curses_panel and
                 self.compiler.find_library_file(self.lib_dirs, panel_library)):
+
+            panel_lib_dirs = []
+            if HOST_PLATFORM == 'sunos5':
+                # Look for libpanel under /usr/gnu/lib on Solaris.
+                # os.uname() does not include the processor. platform.uname()
+                # does, but the platform module is not available in setup.
+                # Work around this by parsing os.system('uname -p') output.
+                tmpfile = os.path.join(self.build_temp, 'processor')
+                if not os.path.exists(self.build_temp):
+                    os.makedirs(self.build_temp)
+                os.system('/usr/bin/uname -p > %s 2> /dev/null' %tmpfile)
+                processor = ''
+                try:
+                    with open(tmpfile) as fp:
+                        processor = fp.readline().strip()
+                finally:
+                    os.unlink(tmpfile)
+                if processor == 'sparc':
+                    panel_lib_dirs.append('/usr/gnu/lib/sparcv9')
+                else:
+                    panel_lib_dirs.append('/usr/gnu/lib/amd64')
+
             self.add(Extension('_curses_panel', ['_curses_panel.c'],
                            include_dirs=curses_includes,
                            define_macros=curses_defines,
-                           libraries=[panel_library, *curses_libs]))
+                           libraries=[panel_library, *curses_libs],
+                           library_dirs=panel_lib_dirs,
+                           runtime_library_dirs=panel_lib_dirs) )
         elif not skip_curses_panel:
             self.missing.append('_curses_panel')
 
@@ -1134,6 +1172,7 @@ class PyBuildExt(build_ext):
                 # Issue #35569: Expose RFC 3542 socket options.
                 kwargs['extra_compile_args'] = ['-D__APPLE_USE_RFC_3542']
 
+            kwargs['libraries'] = ['socket', 'nsl']
             self.add(Extension('_socket', ['socketmodule.c'], **kwargs))
         elif self.compiler.find_library_file(self.lib_dirs, 'net'):
             libs = ['net']