@@ -1315,27 +1315,14 @@ class db_found(Exception): pass
13151315 exts .append ( Extension ('termios' , ['termios.c' ]) )
13161316 # Jeremy Hylton's rlimit interface
13171317 exts .append ( Extension ('resource' , ['resource.c' ]) )
1318+ else :
1319+ missing .extend (['resource' , 'termios' ])
13181320
1319- # Sun yellow pages. Some systems have the functions in libc.
1320- if (host_platform not in ['cygwin' , 'qnx6' ] and
1321- find_file ('rpcsvc/yp_prot.h' , inc_dirs , []) is not None ):
1322- nis_libs = []
1323- nis_includes = []
1324- if self .compiler .find_library_file (lib_dirs , 'nsl' ):
1325- nis_libs .append ('nsl' )
1326- if self .compiler .find_library_file (lib_dirs , 'tirpc' ):
1327- # Sun RPC has been moved from glibc to libtirpc
1328- # rpcsvc/yp_prot.h is still in /usr/include, but
1329- # rpc/rpc.h has been moved into tirpc/ subdir.
1330- nis_libs .append ('tirpc' )
1331- nis_includes .append ('/usr/include/tirpc' )
1332- exts .append ( Extension ('nis' , ['nismodule.c' ],
1333- libraries = nis_libs ,
1334- include_dirs = nis_includes ) )
1335- else :
1336- missing .append ('nis' )
1321+ nis = self ._detect_nis (inc_dirs , lib_dirs )
1322+ if nis is not None :
1323+ exts .append (nis )
13371324 else :
1338- missing .extend ([ 'nis' , 'resource' , 'termios' ] )
1325+ missing .append ( 'nis' )
13391326
13401327 # Curses support, requiring the System V version of curses, often
13411328 # provided by the ncurses library.
@@ -2175,6 +2162,51 @@ def split_var(name, sep):
21752162
21762163 return ssl_ext , hashlib_ext
21772164
2165+ def _detect_nis (self , inc_dirs , lib_dirs ):
2166+ if host_platform in {'win32' , 'cygwin' , 'qnx6' }:
2167+ return None
2168+
2169+ libs = []
2170+ library_dirs = []
2171+ includes_dirs = []
2172+
2173+ # bpo-32521: glibc has deprecated Sun RPC for some time. Fedora 28
2174+ # moved headers and libraries to libtirpc and libnsl. The headers
2175+ # are in tircp and nsl sub directories.
2176+ rpcsvc_inc = find_file (
2177+ 'rpcsvc/yp_prot.h' , inc_dirs ,
2178+ [os .path .join (inc_dir , 'nsl' ) for inc_dir in inc_dirs ]
2179+ )
2180+ rpc_inc = find_file (
2181+ 'rpc/rpc.h' , inc_dirs ,
2182+ [os .path .join (inc_dir , 'tirpc' ) for inc_dir in inc_dirs ]
2183+ )
2184+ if rpcsvc_inc is None or rpc_inc is None :
2185+ # not found
2186+ return None
2187+ includes_dirs .extend (rpcsvc_inc )
2188+ includes_dirs .extend (rpc_inc )
2189+
2190+ if self .compiler .find_library_file (lib_dirs , 'nsl' ):
2191+ libs .append ('nsl' )
2192+ else :
2193+ # libnsl-devel: check for libnsl in nsl/ subdirectory
2194+ nsl_dirs = [os .path .join (lib_dir , 'nsl' ) for lib_dir in lib_dirs ]
2195+ libnsl = self .compiler .find_library_file (nsl_dirs , 'nsl' )
2196+ if libnsl is not None :
2197+ library_dirs .append (os .path .dirname (libnsl ))
2198+ libs .append ('nsl' )
2199+
2200+ if self .compiler .find_library_file (lib_dirs , 'tirpc' ):
2201+ libs .append ('tirpc' )
2202+
2203+ return Extension (
2204+ 'nis' , ['nismodule.c' ],
2205+ libraries = libs ,
2206+ library_dirs = library_dirs ,
2207+ include_dirs = includes_dirs
2208+ )
2209+
21782210
21792211class PyBuildInstall (install ):
21802212 # Suppress the warning about installation into the lib_dynload
0 commit comments