diff --git a/src/portable_python/__init__.py b/src/portable_python/__init__.py index 0e105ec..411aac9 100644 --- a/src/portable_python/__init__.py +++ b/src/portable_python/__init__.py @@ -497,10 +497,10 @@ def cfg_url(self, version): url_template = Template(config_url) return url_template.substitute(version=version) - def cfg_configure(self, deps_lib): + def cfg_configure(self, deps_lib_dir, deps_lib64_dir): if configure := PPG.config.get_value("%s-configure" % self.m_name): configure_template = Template(configure) - return configure_template.substitute(deps_lib=deps_lib) + return configure_template.substitute(lib_dir=deps_lib_dir, lib64_dir=deps_lib64_dir) def cfg_patches(self): return PPG.config.get_value("%s-patches" % self.m_name) @@ -521,9 +521,20 @@ def deps(self): return self.setup.folders.deps @property - def deps_lib(self): + def deps_lib_dir(self): return self.deps / "lib" + @property + def deps_lib64_dir(self): + return self.deps / "lib64" + + @property + def deps_lib_dirs(self): + lib_dirs = [self.deps_lib_dir] + if self.deps_lib64_dir.exists(): + lib_dirs.append(self.deps_lib64_dir) + return lib_dirs + def xenv_CPATH(self): folder = self.deps / "include" if folder.exists(): @@ -536,7 +547,7 @@ def xenv_CPATH(self): def xenv_LDFLAGS(self): if self.modules.selected: - yield f"-L{self.deps_lib}" + yield from (f"-L{lib_dir}" for lib_dir in self.deps_lib_dirs) def xenv_PATH(self): yield f"{self.deps}/bin" @@ -550,7 +561,7 @@ def xenv_LD_LIBRARY_PATH(self): def xenv_PKG_CONFIG_PATH(self): yield from os.environ.get("PKG_CONFIG_PATH", "").split(":") if self.modules.selected: - yield f"{self.deps_lib}/pkgconfig" + yield from (f"{lib_dir}/pkgconfig" for lib_dir in self.deps_lib_dirs) def _do_run(self, program, *args, fatal=True, env=None): return runez.run(program, *args, passthrough=self._log_handler, stdout=None, stderr=None, fatal=fatal, env=env) @@ -771,10 +782,12 @@ def _prepare(self): # Some libs get funky permissions for some reason super()._prepare() self.setup.ensure_clean_folder(self.install_folder) - for path in runez.ls_dir(self.deps_lib): - if not path.name.endswith(".la"): - expected = 0o755 if path.is_dir() else 0o644 - current = path.stat().st_mode & 0o777 - if current != expected: - LOG.info("Corrected permissions for %s (was %s)", runez.short(path), oct(current)) - path.chmod(expected) + + for lib_dir in self.deps_lib_dirs: + for path in runez.ls_dir(lib_dir): + if not path.name.endswith(".la"): + expected = 0o755 if path.is_dir() else 0o644 + current = path.stat().st_mode & 0o777 + if current != expected: + LOG.info("Corrected permissions for %s (was %s)", runez.short(path), oct(current)) + path.chmod(expected) diff --git a/src/portable_python/cpython.py b/src/portable_python/cpython.py index 3462cdd..310c023 100644 --- a/src/portable_python/cpython.py +++ b/src/portable_python/cpython.py @@ -110,7 +110,7 @@ def url(self): return f"https://www.python.org/ftp/python/{self.version.main}/Python-{self.version}.tar.xz" def xenv_LDFLAGS_NODIST(self): - yield f"-L{self.deps_lib}" + yield from (f"-L{lib_dir}" for lib_dir in self.deps_lib_dirs) if PPG.target.is_linux: yield "-Wl,-z,origin" # rpath intentionally long to give 'patchelf' some room @@ -142,7 +142,7 @@ def c_configure_args(self): if not self.has_configure_opt("--with-system-ffi"): if self.active_module(LibFFI): - yield f"LIBFFI_INCLUDEDIR={self.deps_lib}" + yield f"LIBFFI_INCLUDEDIR={self.deps_lib_dir}" yield "--with-system-ffi=no" else: @@ -166,7 +166,11 @@ def c_configure_args(self): # TODO: this doesn't seem to be enough, on macos cpython's ./configure still picks up the shared macos tcl/tk libs version = Version(tkinter.version) yield f"--with-tcltk-includes=-I{self.deps}/include" - yield f"--with-tcltk-libs=-L{self.deps_lib} -ltcl{version.mm} -ltk{version.mm}" + + lib_dir_flags = " ".join(f"-L{lib_dir}" for lib_dir in self.deps_lib_dirs) + yield f"--with-tcltk-libs={lib_dir_flags}" + yield f"-ltcl{version.mm}" + yield f"-ltk{version.mm}" @runez.cached_property def prefix_lib_folder(self): diff --git a/src/portable_python/external/xcpython.py b/src/portable_python/external/xcpython.py index 1201d02..5bbf391 100644 --- a/src/portable_python/external/xcpython.py +++ b/src/portable_python/external/xcpython.py @@ -28,7 +28,7 @@ def version(self): return self.cfg_version("6.2.32") def c_configure_args(self): - if config_args := self.cfg_configure(self.deps_lib): + if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir): yield config_args else: @@ -87,7 +87,7 @@ def version(self): return self.cfg_version("1.24") def c_configure_args(self): - if config_args := self.cfg_configure(self.deps_lib): + if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir): yield config_args else: @@ -132,7 +132,7 @@ def version(self): return self.cfg_version("3.4.6") def c_configure_args(self): - if config_args := self.cfg_configure(self.deps_lib): + if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir): yield config_args else: @@ -179,7 +179,7 @@ def version(self): return self.cfg_version("3.0.15") def c_configure_args(self): - if config_args := self.cfg_configure(self.deps_lib): + if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir): yield config_args else: @@ -208,7 +208,7 @@ def version(self): return self.cfg_version("6.5") def c_configure_args(self): - if config_args := self.cfg_configure(self.deps_lib): + if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir): yield config_args else: @@ -219,7 +219,7 @@ def c_configure_args(self): yield "--without-manpages" yield "--without-progs" yield "--without-tests" - yield f"--with-pkg-config-libdir={self.deps_lib}/pkgconfig" + yield f"--with-pkg-config-libdir={self.deps_lib_dir}/pkgconfig" yield "--enable-pc-files" yield "--with-debug=no" yield "--with-gpm=no" @@ -265,7 +265,7 @@ def version(self): return self.cfg_version("8.2.13") def c_configure_args(self): - if config_args := self.cfg_configure(self.deps_lib): + if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir): yield config_args else: @@ -309,7 +309,7 @@ def version(self): return self.cfg_version("3.47.0") def c_configure_args(self): - if config_args := self.cfg_configure(self.deps_lib): + if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir): yield config_args else: @@ -346,7 +346,7 @@ def version(self): return self.cfg_version("1.0.3") def c_configure_args(self): - if config_args := self.cfg_configure(self.deps_lib): + if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir): yield config_args else: @@ -376,7 +376,7 @@ def version(self): return self.cfg_version("5.6.3") def c_configure_args(self): - if config_args := self.cfg_configure(self.deps_lib): + if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir): yield config_args else: @@ -419,7 +419,7 @@ def version(self): return self.cfg_version("1.3.1") def c_configure_args(self): - if config_args := self.cfg_configure(self.deps_lib): + if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir): yield config_args else: diff --git a/src/portable_python/external/xtkinter.py b/src/portable_python/external/xtkinter.py index 299b97b..9d0f626 100644 --- a/src/portable_python/external/xtkinter.py +++ b/src/portable_python/external/xtkinter.py @@ -53,7 +53,7 @@ def xenv_CFLAGS(self): def c_configure_args(self): yield "--enable-shared=no" yield "--enable-threads" - yield f"--with-tcl={self.deps_lib}" + yield f"--with-tcl={self.deps_lib_dir}" yield "--without-x" if PPG.target.is_macos: # pragma: no cover, tcl/tk is "best effort" yield "--enable-aqua=yes" @@ -89,8 +89,8 @@ def xenv_CFLAGS(self): def c_configure_args(self): yield "--enable-shared=no" yield "--enable-threads" - yield f"--with-tcl={self.deps_lib}" - yield f"--with-tk={self.deps_lib}" + yield f"--with-tcl={self.deps_lib_dir}" + yield f"--with-tk={self.deps_lib_dir}" yield "--without-x" def _do_linux_compile(self):