def get_configure_script(self, build: targets.Build) -> str: sdir = build.get_source_dir(self, relative_to="pkgbuild") configure = sdir / "configure" configure_flags = { "--prefix": str(build.get_full_install_prefix()), } return build.sh_format_command(configure, configure_flags)
def get_install_list_script(self, build: targets.Build) -> str: common_script = super().get_install_list_script(build) prefix = build.get_full_install_prefix() dest = build.get_install_dir(self, relative_to="pkgbuild") pkgname = getattr(self, "dist_name", None) if pkgname is None: pkgname = self.pretty_name if pkgname.startswith("pypkg-"): pkgname = pkgname[len("pypkg-"):] dist_name = pkgname.replace("-", "_") pyscript = textwrap.dedent(f"""\ import pathlib import site sitepackages = pathlib.Path(site.getsitepackages(["{prefix}"])[0]) abs_sitepackages = ( pathlib.Path("{dest}") / sitepackages.relative_to('/') ) record = ( abs_sitepackages / f'{dist_name}-{self.pretty_version}.dist-info' / 'RECORD' ) if not record.exists(): raise RuntimeError(f'no wheel RECORD for {pkgname}') with open(record) as f: for entry in f: filename = entry.split(',')[0] install_path = (sitepackages / filename).resolve() print(install_path.relative_to('/')) """) scriptfile_name = f"_gen_install_list_from_wheel_{self.unique_name}.py" wheel_files = build.sh_write_python_helper(scriptfile_name, pyscript, relative_to="pkgbuild") if common_script: return f"{common_script}\n{wheel_files}" else: return wheel_files
def write_file_list_script( self, build: targets.Build, listname: str, entries: list[str] ) -> str: installdest = build.get_install_dir(self, relative_to="pkgbuild") paths: dict[str, str | pathlib.Path] = {} for aspect in ("systembin", "bin", "data", "include", "lib", "legal"): path = build.get_install_path(aspect).relative_to("/") paths[f"{aspect}dir"] = path paths["prefix"] = build.get_full_install_prefix().relative_to("/") paths["exesuffix"] = build.get_exe_suffix() processed_entries = [] for entry in entries: processed_entries.append( entry.strip().format(**paths).replace("/", os.sep) ) pyscript = textwrap.dedent( """\ import glob import pathlib tmp = pathlib.Path({installdest!r}) patterns = {patterns} for pattern in patterns: for path in glob.glob(str(tmp / pattern), recursive=True): p = pathlib.Path(path) if p.exists(): print(p.relative_to(tmp)) """ ).format( installdest=str(installdest), patterns=pprint.pformat(processed_entries), ) scriptfile_name = f"_gen_{listname}_list_{self.unique_name}.py" return build.sh_write_python_helper( scriptfile_name, pyscript, relative_to="pkgbuild" )
def sh_configure( self, build: targets.Build, path: str | pathlib.Path, args: Mapping[str, str | pathlib.Path | None], ) -> str: conf_args = dict(args) shlib_paths = self.get_shlib_paths(build) ldflags = [] for shlib_path in shlib_paths: ldflags.extend( build.target.get_shlib_path_run_time_ldflags( build, shlex.quote(str(shlib_path)) ) ) if ldflags: build.sh_append_flags(conf_args, "LDFLAGS", ldflags) if "--prefix" not in args: conf_args["--prefix"] = str(build.get_full_install_prefix()) conf_args = build.sh_append_global_flags(conf_args) return build.sh_format_command(path, conf_args, force_args_eq=True)
def get_configure_script(self, build: targets.Build) -> str: sdir = shlex.quote( str(build.get_source_dir(self, relative_to="pkgbuild"))) copy_sources = f"test ./ -ef {sdir} || cp -a {sdir}/* ./" configure = "./Configure" configure_flags = { "--openssldir": str(build.get_full_install_prefix() / "etc" / "ssl"), "--libdir": str(build.get_install_path("lib")), "no-ssl3": None, "shared": None, "enable-ec_nistp_64_gcc_128": None, } cfgcmd = self.sh_configure(build, configure, configure_flags) if platform.system() == "Darwin": # Force 64-bit build cfgcmd = f"KERNEL_BITS=64 {cfgcmd}" return "\n\n".join([ copy_sources, cfgcmd, ])
def get_build_script(self, build: targets.Build) -> str: # Run edgedb-server --bootstrap to produce stdlib cache # for the benefit of faster bootstrap in the package. common_script = super().get_build_script(build) pg_pkg = build.get_package("postgresql-edgedb") icu_pkg = build.get_package("icu") openssl_pkg = build.get_package("openssl") uuid_pkg = build.get_package("uuid") build_python = build.sh_get_command("python") temp_dir = build.get_temp_dir(self, relative_to="pkgbuild") cachedir = temp_dir / "_datacache" pg_temp_install_path = ( build.get_build_dir(pg_pkg, relative_to="pkgbuild") / "_install") bindir = build.get_install_path("bin").relative_to("/") libdir = build.get_install_path("lib").relative_to("/") pg_config = pg_temp_install_path / bindir / "pg_config" pg_libpath = pg_temp_install_path / libdir temp_install_dir = build.get_temp_root( relative_to="pkgbuild") / build.get_full_install_prefix( ).relative_to("/") sitescript = ( f"import site; " f'print(site.getsitepackages(["{temp_install_dir}"])[0])') runstatescript = "import tempfile; " "print(tempfile.mkdtemp())" abspath = ( "import pathlib, sys; print(pathlib.Path(sys.argv[1]).resolve())") ld_env = " ".join( build.get_ld_env( deps=[icu_pkg, openssl_pkg, uuid_pkg], wd="${_wd}", extra=["${_ldlibpath}"], )) if platform.system() == "Darwin": # Workaround SIP madness on macOS and allow popen() calls # in postgres to inherit DYLD_LIBRARY_PATH. extraenv = "PGOVERRIDESTDSHELL=1" else: extraenv = "" data_cache_script = textwrap.dedent(f"""\ mkdir -p "{cachedir}" _tempdir=$("{build_python}" -c '{runstatescript}') if [ "$(whoami)" = "root" ]; then chown nobody "{cachedir}" chown nobody "${{_tempdir}}" _sudo="sudo -u nobody" else _sudo="" fi _pythonpath=$("{build_python}" -c '{sitescript}') _pythonpath=$("{build_python}" -c '{abspath}' "${{_pythonpath}}") _cachedir=$("{build_python}" -c '{abspath}' "{cachedir}") _pg_config=$("{build_python}" -c '{abspath}' "{pg_config}") _ldlibpath=$("{build_python}" -c '{abspath}' "{pg_libpath}") _build_python=$("{build_python}" -c '{abspath}' "{build_python}") _wd=$("{build_python}" -c '{abspath}' "$(pwd)") ( cd ../; ${{_sudo}} env \\ {ld_env} {extraenv} \\ PYTHONPATH="${{_pythonpath}}" \\ _EDGEDB_BUILDMETA_PG_CONFIG_PATH="${{_pg_config}}" \\ _EDGEDB_WRITE_DATA_CACHE_TO="${{_cachedir}}" \\ "${{_build_python}}" \\ -m edb.server.main \\ --data-dir="${{_tempdir}}" \\ --runstate-dir="${{_tempdir}}" \\ --bootstrap-only rm -rf "${{_tempdir}}" ) mkdir ./share/ cp "${{_cachedir}}"/* ./share/ pwd ls -al ./share/ """) return f"{common_script}\n{data_cache_script}"
def get_configure_script(self, build: targets.Build) -> str: extra_version = "" system = platform.system() if system.endswith("BSD"): uuid_lib = "bsd" elif system == "Linux" or system == "Darwin": # macOS actually ships the e2fs version despite being a "BSD" uuid_lib = "e2fs" else: raise NotImplementedError(f"unsupported target system: {system}") sdir = build.get_source_dir(self, relative_to="pkgbuild") configure = sdir / "configure" configure_flags: dict[str, str | pathlib.Path | None] = { "--sysconfdir": build.get_install_path("sysconf"), "--datarootdir": build.get_install_path("data"), "--bindir": build.get_install_path("bin"), "--libdir": build.get_install_path("lib"), "--includedir": build.get_install_path("include"), "--with-extra-version": extra_version, "--with-icu": None, "--without-pam": None, "--without-zlib": None, "--with-openssl": None, "--with-uuid": uuid_lib, "--without-readline": None, } icu_pkg = build.get_package("icu") if build.is_bundled(icu_pkg): icu_path = build.get_install_dir(icu_pkg, relative_to="pkgbuild") icu_path /= build.get_full_install_prefix().relative_to("/") icu_rel_path = f'$(pwd)/"{icu_path}"' configure_flags["ICU_CFLAGS"] = f"!-I{icu_rel_path}/include/" icu_ldflags = build.sh_get_bundled_shlib_ldflags( icu_pkg, relative_to="pkgbuild") configure_flags["ICU_LIBS"] = f"!{icu_ldflags}" uuid_pkg = build.get_package("uuid") if build.is_bundled(uuid_pkg): uuid_path = build.get_install_dir(uuid_pkg, relative_to="pkgbuild") uuid_path /= build.get_full_install_prefix().relative_to("/") uuid_rel_path = f'$(pwd)/"{uuid_path}"' configure_flags["UUID_CFLAGS"] = f"!-I{uuid_rel_path}/include/" uuid_ldflags = build.sh_get_bundled_shlib_ldflags( uuid_pkg, relative_to="pkgbuild") configure_flags["UUID_LIBS"] = f"!{uuid_ldflags}" openssl_pkg = build.get_package("openssl") if build.is_bundled(openssl_pkg): openssl_root = build.get_install_dir(openssl_pkg, relative_to="pkgbuild") openssl_path = (openssl_root / build.get_full_install_prefix().relative_to("/")) openssl_rel_path = f'$(pwd)/"{openssl_path}"' configure_flags[ "OPENSSL_CFLAGS"] = f"!-I{openssl_rel_path}/include/" openssl_ldflags = build.sh_get_bundled_shlib_ldflags( openssl_pkg, relative_to="pkgbuild") configure_flags["OPENSSL_LIBS"] = f"!{openssl_ldflags}" ldflags = f"!-L{openssl_rel_path}/lib" if system == "Darwin": # ./configure tries to compile and test a program # and it fails because openssl is not yet installed # at its install_name location. configure_flags["DYLD_FALLBACK_LIBRARY_PATH"] = openssl_root else: ldflags += f'" "-Wl,-rpath-link,{openssl_rel_path}/lib' configure_flags["LDFLAGS"] = ldflags if build.target.has_capability("tzdata"): zoneinfo = build.target.get_resource_path(build, "tzdata") configure_flags["--with-system-tzdata"] = zoneinfo if build.target.has_capability("systemd"): configure_flags["--with-systemd"] = None if (build.extra_optimizations_enabled() and build.supports_lto() and build.uses_modern_gcc()): build.sh_append_flags( configure_flags, "CFLAGS", ( "-flto", "-fuse-linker-plugin", "-ffat-lto-objects", "-flto-partition=none", ), ) return self.sh_configure(build, configure, configure_flags)
def get_include_paths(self, build: targets.Build) -> list[pathlib.Path]: return [build.get_full_install_prefix() / "include"]
def get_configure_script(self, build: targets.Build) -> str: sdir = build.get_source_dir(self, relative_to="pkgbuild") configure = sdir / "configure" configure_flags = { "--prefix": build.get_full_install_prefix(), "--sysconfdir": build.get_install_path("sysconf"), "--datarootdir": build.get_install_path("data"), "--bindir": build.get_install_path("bin"), "--libdir": build.get_install_path("lib"), "--includedir": build.get_install_path("include"), "--enable-ipv6": None, "--with-dbmliborder": "bdb:gdbm", "--with-computed-gotos": None, } if build.extra_optimizations_enabled(): if build.supports_pgo(): configure_flags["--enable-optimizations"] = None if build.supports_lto(): configure_flags["--with-lto"] = None if build.uses_modern_gcc(): build.sh_append_flags( configure_flags, "CFLAGS", ( "-fgraphite-identity", "-floop-nest-optimize", "-fipa-pta", "-fno-semantic-interposition", ), ) libffi_pkg = build.get_package("libffi") if build.is_bundled(libffi_pkg): libffi_path = build.get_install_dir(libffi_pkg, relative_to="pkgbuild") libffi_path /= build.get_full_install_prefix().relative_to("/") libffi_rel_path = f'$(pwd)/"{libffi_path}"' configure_flags["LIBFFI_CFLAGS"] = f"!-I{libffi_rel_path}/include/" libffi_ldflags = build.sh_get_bundled_shlib_ldflags( libffi_pkg, relative_to="pkgbuild") configure_flags["LIBFFI_LIBS"] = f"!{libffi_ldflags}" else: configure_flags["--with-system-ffi"] = None if platform.system() == "Darwin": configure_flags[ "--enable-universalsdk"] = "!$(xcrun --show-sdk-path)" configure_flags["--with-universal-archs"] = "intel-64" openssl_pkg = build.get_package("openssl") if build.is_bundled(openssl_pkg): openssl_path = build.get_install_dir(openssl_pkg, relative_to="pkgbuild") openssl_path /= build.get_full_install_prefix().relative_to("/") configure_flags["--with-openssl"] = openssl_path configure_flags[ "--with-openssl-rpath"] = openssl_pkg.get_shlib_paths(build)[0] uuid_pkg = build.get_package("uuid") if build.is_bundled(uuid_pkg): uuid_path = build.get_install_dir(uuid_pkg, relative_to="pkgbuild") uuid_path /= build.get_full_install_prefix().relative_to("/") uuid_rel_path = f'$(pwd)/"{uuid_path}"' configure_flags["UUID_CFLAGS"] = f"!-I{uuid_rel_path}/include/" uuid_ldflags = build.sh_get_bundled_shlib_ldflags( uuid_pkg, relative_to="pkgbuild") configure_flags["UUID_LIBS"] = f"!{uuid_ldflags}" zlib_pkg = build.get_package("zlib") if build.is_bundled(zlib_pkg): zlib_path = build.get_install_dir(zlib_pkg, relative_to="pkgbuild") zlib_path /= build.get_full_install_prefix().relative_to("/") zlib_rel_path = f'$(pwd)/"{zlib_path}"' configure_flags["ZLIB_CFLAGS"] = f"!-I{zlib_rel_path}/include/" zlib_ldflags = build.sh_get_bundled_shlib_ldflags( zlib_pkg, relative_to="pkgbuild") configure_flags["ZLIB_LIBS"] = f"!{zlib_ldflags}" return build.sh_configure(configure, configure_flags)
def get_build_script(self, build: targets.Build) -> str: make = build.sh_get_command("make") prefix = build.get_full_install_prefix().relative_to("/") dest = build.get_temp_root(relative_to="pkgbuild") if platform.system() == "Darwin": exe_suffix = ".exe" else: exe_suffix = "" sitescript = (f"import site; import pathlib; " f"print(pathlib.Path( " f'site.getsitepackages([\\"${{p}}\\"])[0]).resolve())') python = f"python{exe_suffix}" wrapper_env = self._get_make_env(build, "${d}") bash = build.sh_get_command("bash") make_wrapper = textwrap.dedent(f"""\ echo '#!{bash}' > python-wrapper echo set -Exe -o pipefail >> python-wrapper echo 'd=$(cd -- "$(dirname "$0")" >/dev/null 2>&1; pwd -P)' \\ >> python-wrapper echo 'unset __PYVENV_LAUNCHER__' >> python-wrapper {f"echo 'export {wrapper_env}' >> python-wrapper" if wrapper_env else ""} echo 'p=${{d}}/{dest}/{prefix}' >> python-wrapper echo 's=$(${{d}}/{python} -c "{sitescript}")' >> python-wrapper echo export PYTHONPATH='${{s}}':"${{EXTRA_PYTHONPATH}}" \\ >> python-wrapper echo exec '${{d}}/{python}' '"$@"' >> python-wrapper chmod +x python-wrapper cat python-wrapper """) disabled_modules = [ "_sqlite3", "_tkinter", "_dbm", "_gdbm", "_lzma", "_bz2", "_curses", "_curses_panel", "_crypt", "audioop", "readline", "nis", "ossaudiodev", "spwd", ] make_env = self._get_make_env(build, "$(pwd)") return textwrap.dedent(f"""\ # make sure no funny business is going on if metapkg # is ran from a venv. unset __PYVENV_LAUNCHER__ echo '*disabled*' >> Modules/Setup.local echo '' >> Modules/Setup.local echo {' '.join(disabled_modules)} >> Modules/Setup.local # make sure config.c is regenerated reliably by make rm Modules/config.c ls -al Modules/ {make} {make_env} ./{python} -m ensurepip --root "{dest}" {make_wrapper}""")
def get_build_script(self, build: targets.Build) -> str: sdir = build.get_source_dir(self, relative_to="pkgbuild") src_python = build.sh_get_command("python", package=self, relative_to="pkgsource") build_python = build.sh_get_command("python") dest = build.get_temp_root( relative_to="pkgbuild") / build.get_full_install_prefix( ).relative_to("/") sitescript = (f"import site; " f'print(site.getsitepackages(["{dest}"])[0])') src_dest = build.get_temp_root( relative_to="pkgsource") / build.get_full_install_prefix( ).relative_to("/") src_sitescript = (f"import site; " f'print(site.getsitepackages(["{src_dest}"])[0])') wheeldir_script = 'import pathlib; print(pathlib.Path(".").resolve())' abspath = ( "import pathlib, sys; print(pathlib.Path(sys.argv[1]).resolve())") pkgname = getattr(self, "dist_name", None) if pkgname is None: pkgname = self.name if pkgname.startswith("pypkg-"): pkgname = pkgname[len("pypkg-"):] env = build.sh_append_global_flags({ "SETUPTOOLS_SCM_PRETEND_VERSION": self.pretty_version, "PIP_DISABLE_PIP_VERSION_CHECK": "1", }) dep_names = [dep.name for dep in self.build_requires] build_deps = build.get_packages(dep_names) if pkgname == "wheel": build_command = f'"{src_python}" setup.py sdist -d ${{_wheeldir}}' binary = False else: args = [ src_python, "-m", "pip", "wheel", "--verbose", "--wheel-dir", "${_wheeldir}", "--no-binary=:all:", "--no-build-isolation", "--use-feature=in-tree-build", "--no-deps", ".", ] build_command = " ".join( shlex.quote(c) if c[0] != "$" else c for c in args) env.update( self.sh_get_build_wheel_env( build, site_packages_var="${_sitepkg_from_src}")) cflags = build.sh_get_bundled_shlibs_cflags( build_deps, relative_to="pkgsource", ) if cflags: build.sh_append_flags(env, "CFLAGS", cflags) ldflags = build.sh_get_bundled_shlibs_ldflags( build_deps, relative_to="pkgsource", ) if ldflags: build.sh_append_flags(env, "LDFLAGS", ldflags) binary = True all_build_deps = build.get_packages(dep_names, recursive=True) env_str = build.sh_format_command("env", env, force_args_eq=True) env_str += " " + " ".join(build.get_ld_env(all_build_deps, "${_wd}")) return textwrap.dedent(f"""\ _wheeldir=$("{build_python}" -c '{wheeldir_script}') _target=$("{build_python}" -c '{sitescript}') _sitepkg_from_src=$("{build_python}" -c '{src_sitescript}') _wd=$("{build_python}" -c '{abspath}' "$(pwd)") (cd "{sdir}"; \\ {env_str} \\ {build_command}) "{build_python}" -m pip install \\ --no-build-isolation \\ --no-warn-script-location \\ --no-index \\ --no-deps \\ --upgrade \\ -f "file://${{_wheeldir}}" \\ {'--only-binary' if binary else '--no-binary'} :all: \\ --target "${{_target}}" \\ "{pkgname}" """)