Skip to content

Commit 43f5ebc

Browse files
committed
[GR-23352] make test_zlib pass and fast
PullRequest: graalpython/1316
2 parents abc5cd1 + 02c35be commit 43f5ebc

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+7437
-1002
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,5 @@ Python3.g4.stamp
6666
graalpython/com.oracle.graal.python/src/com/oracle/graal/python/parser/antlr/.antlr/
6767
graalpython/lib-python/3/test/data
6868
!graalpython/lib-python/3/test/data/README
69+
/venv
70+
*.code-workspace

graalpython/com.oracle.graal.python.cext/setup.py

Lines changed: 67 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
relative_rpath = "@loader_path" if darwin_native else r"\$ORIGIN"
6363
so_ext = get_config_var("EXT_SUFFIX")
6464
SOABI = get_config_var("SOABI")
65+
is_managed = 'managed' in SOABI
6566

6667
# configure logger
6768
logger = logging.getLogger(__name__)
@@ -206,7 +207,7 @@ def __init__(self, lib_name, package_spec, src_var):
206207
if "==" in package_spec:
207208
self.package_name, _, self.version = package_spec.rpartition("==")
208209
else:
209-
self.package_name = self.package_spec
210+
self.package_name = package_spec
210211
self.version = None
211212
self.src_var = src_var
212213

@@ -269,6 +270,10 @@ def build(self, extracted_dir=None):
269270
return lib_src_folder
270271

271272
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
272277
if not build_dir:
273278
build_dir = self.build()
274279

@@ -290,11 +295,34 @@ def install(self, build_dir=None):
290295
shutil.copy(os.path.join(build_dir, self.header_name), dest_include_filename)
291296

292297
# 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)
294299

295300
return self.lib_install_dir
296301

297302

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+
298326
class NativeBuiltinModule:
299327
def __init__(self, name, subdir="modules", files=None, deps=[], **kwargs):
300328
self.name = name
@@ -307,27 +335,10 @@ def __init__(self, name, subdir="modules", files=None, deps=[], **kwargs):
307335

308336
def __call__(self):
309337
kwargs = self.kwargs
310-
libs = []
311-
library_dirs = []
312-
include_dirs = []
338+
339+
libs, library_dirs, include_dirs = _build_deps(self.deps)
313340
runtime_library_dirs = []
314341
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)
331342

332343
libs += kwargs.get("libs", [])
333344
library_dirs += kwargs.get("library_dirs", [])
@@ -394,6 +405,37 @@ def build_libhpy(capi_home):
394405
ext_modules=[module],
395406
)
396407

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+
397439

398440
def build_builtin_exts(capi_home):
399441
args = [verbosity, 'build', 'install_lib', '-f', '--install-dir=%s/modules' % capi_home, "clean"]
@@ -427,6 +469,10 @@ def build(capi_home):
427469

428470
try:
429471
build_libhpy(capi_home)
472+
build_nativelibsupport(capi_home,
473+
subdir="zlib",
474+
libname="libzsupport",
475+
libs=['z'])
430476
build_libpython(capi_home)
431477
build_builtin_exts(capi_home)
432478
finally:

0 commit comments

Comments
 (0)