62
62
relative_rpath = "@loader_path" if darwin_native else r"\$ORIGIN"
63
63
so_ext = get_config_var ("EXT_SUFFIX" )
64
64
SOABI = get_config_var ("SOABI" )
65
+ is_managed = 'managed' in SOABI
65
66
66
67
# configure logger
67
68
logger = logging .getLogger (__name__ )
@@ -206,7 +207,7 @@ def __init__(self, lib_name, package_spec, src_var):
206
207
if "==" in package_spec :
207
208
self .package_name , _ , self .version = package_spec .rpartition ("==" )
208
209
else :
209
- self .package_name = self . package_spec
210
+ self .package_name = package_spec
210
211
self .version = None
211
212
self .src_var = src_var
212
213
@@ -269,6 +270,10 @@ def build(self, extracted_dir=None):
269
270
return lib_src_folder
270
271
271
272
def install (self , build_dir = None ):
273
+ lib_path = os .path .join (self .lib_install_dir , "lib%s.so" % self .lib_name )
274
+ if os .path .exists (lib_path ):
275
+ # library has been built earlier, so just return the install directory.
276
+ return self .lib_install_dir
272
277
if not build_dir :
273
278
build_dir = self .build ()
274
279
@@ -290,11 +295,34 @@ def install(self, build_dir=None):
290
295
shutil .copy (os .path .join (build_dir , self .header_name ), dest_include_filename )
291
296
292
297
# create symlink 'libbz2.so' for linking
293
- os .symlink (self .install_name , os . path . join ( self . lib_install_dir , "lib%s.so" % self . lib_name ) )
298
+ os .symlink (self .install_name , lib_path )
294
299
295
300
return self .lib_install_dir
296
301
297
302
303
+ def _build_deps (deps ):
304
+ libs = []
305
+ library_dirs = []
306
+ include_dirs = []
307
+ for dep in deps :
308
+ if not dep .conftest ():
309
+ # this will download, build and install the library
310
+ install_dir = dep .install ()
311
+ assert install_dir == dep .lib_install_dir
312
+ else :
313
+ logger .info ("conftest for %s passed; not installing" , dep .package_name )
314
+
315
+ # Whether or not the dependency is already available, we need to link against it.
316
+ if dep .lib_install_dir :
317
+ libs .append (dep .lib_name )
318
+ library_dirs .append (dep .lib_install_dir )
319
+
320
+ # If the dependency provides a header file, add the include path
321
+ if dep .include_install_dir :
322
+ include_dirs .append (dep .include_install_dir )
323
+ return libs , library_dirs , include_dirs
324
+
325
+
298
326
class NativeBuiltinModule :
299
327
def __init__ (self , name , subdir = "modules" , files = None , deps = [], ** kwargs ):
300
328
self .name = name
@@ -307,27 +335,10 @@ def __init__(self, name, subdir="modules", files=None, deps=[], **kwargs):
307
335
308
336
def __call__ (self ):
309
337
kwargs = self .kwargs
310
- libs = []
311
- library_dirs = []
312
- include_dirs = []
338
+
339
+ libs , library_dirs , include_dirs = _build_deps (self .deps )
313
340
runtime_library_dirs = []
314
341
extra_link_args = []
315
- for dep in self .deps :
316
- if not dep .conftest ():
317
- # this will download, build and install the library
318
- install_dir = dep .install ()
319
- assert install_dir == dep .lib_install_dir
320
- else :
321
- logger .info ("conftest for %s passed; not installing" , dep .package_name )
322
-
323
- # Whether or not the dependency is already available, we need to link against it.
324
- if dep .lib_install_dir :
325
- libs .append (dep .lib_name )
326
- library_dirs .append (dep .lib_install_dir )
327
-
328
- # If the dependency provides a header file, add the include path
329
- if dep .include_install_dir :
330
- include_dirs .append (dep .include_install_dir )
331
342
332
343
libs += kwargs .get ("libs" , [])
333
344
library_dirs += kwargs .get ("library_dirs" , [])
@@ -394,6 +405,37 @@ def build_libhpy(capi_home):
394
405
ext_modules = [module ],
395
406
)
396
407
408
+ def build_nativelibsupport (capi_home , subdir , libname , deps = [], ** kwargs ):
409
+ if not is_managed :
410
+ src_dir = os .path .join (__dir__ , subdir )
411
+ files = [os .path .abspath (os .path .join (src_dir , f )) for f in os .listdir (src_dir ) if f .endswith (".c" )]
412
+
413
+ libs , library_dirs , include_dirs = _build_deps (deps )
414
+ libs += kwargs .get ("libs" , [])
415
+ library_dirs += kwargs .get ("library_dirs" , [])
416
+ runtime_library_dirs = kwargs .get ("runtime_library_dirs" , [])
417
+ include_dirs += kwargs .get ("include_dirs" , [])
418
+ extra_link_args = kwargs .get ("extra_link_args" , [])
419
+ module = Extension (libname ,
420
+ sources = files ,
421
+ libraries = libs ,
422
+ library_dirs = library_dirs ,
423
+ extra_compile_args = cflags_warnings + kwargs .get ("cflags_warnings" , []),
424
+ runtime_library_dirs = runtime_library_dirs ,
425
+ include_dirs = include_dirs ,
426
+ extra_link_args = extra_link_args ,
427
+
428
+ )
429
+ args = [verbosity , 'build' , 'install_lib' , '-f' , '--install-dir=%s' % capi_home , "clean" ]
430
+ setup (
431
+ script_name = 'setup' + libname ,
432
+ script_args = args ,
433
+ name = libname ,
434
+ version = '1.0' ,
435
+ description = "Graal Python's native %s support" % subdir ,
436
+ ext_modules = [module ],
437
+ )
438
+
397
439
398
440
def build_builtin_exts (capi_home ):
399
441
args = [verbosity , 'build' , 'install_lib' , '-f' , '--install-dir=%s/modules' % capi_home , "clean" ]
@@ -427,6 +469,10 @@ def build(capi_home):
427
469
428
470
try :
429
471
build_libhpy (capi_home )
472
+ build_nativelibsupport (capi_home ,
473
+ subdir = "zlib" ,
474
+ libname = "libzsupport" ,
475
+ libs = ['z' ])
430
476
build_libpython (capi_home )
431
477
build_builtin_exts (capi_home )
432
478
finally :
0 commit comments