Пример #1
0
 def sh_get_build_wheel_env(self, build: targets.Build, *,
                            site_packages_var: str) -> dict[str, str]:
     env = dict(super().sh_get_build_wheel_env(
         build, site_packages_var=site_packages_var))
     sdir = build.get_source_dir(self, relative_to="pkgbuild")
     env["EXTRA_PYTHONPATH"] = str(sdir)
     return env
Пример #2
0
    def get_build_install_script(self, build: targets.Build) -> str:
        script = super().get_build_install_script(build)
        srcdir = build.get_source_dir(self, relative_to="pkgbuild")
        dest = build.get_install_dir(self, relative_to="pkgbuild")

        datadir = build.get_install_path("data")
        script += textwrap.dedent(f"""\
            mkdir -p "{dest}/{datadir}"
            cp -a "{srcdir}/tests" "{dest}/{datadir}"
            mkdir -p "{dest}/{datadir}/data/"
            cp -a ./share/* "{dest}/{datadir}/data/"
            chmod 644 "{dest}/{datadir}/data/"*
            """)

        if build.target.is_portable():
            bindir = build.get_install_path("bin").relative_to("/")

            ep_helper_pkg = build.get_package("pyentrypoint")
            ep_helper = (
                build.get_temp_dir(ep_helper_pkg, relative_to="pkgbuild") /
                "bin" / "pyentrypoint")

            script += textwrap.dedent(f"""\
                for p in "{dest}/{bindir}"/*; do
                    if [ -f "$p" ]; then
                        mv "$p" "${{p}}.py"
                        cp "{ep_helper}" "$p"
                    fi
                done
                """)

        return script
Пример #3
0
    def get_build_install_script(self, build: targets.Build) -> str:
        script = super().get_build_install_script(build)
        cargo = build.sh_get_command("cargo")
        sed = build.sh_get_command("sed")
        installdest = build.get_temp_dir(self, relative_to="pkgbuild")
        src = build.get_source_dir(self, relative_to="pkgbuild")
        bindir = build.get_install_path("systembin").relative_to("/")
        install_bindir = (build.get_install_dir(self, relative_to="pkgbuild") /
                          bindir)
        if isinstance(build.target, targets.linux.LinuxMuslTarget):
            target = "--target x86_64-unknown-linux-musl"
        else:
            target = ""

        env = build.sh_append_global_flags({})
        env["RUST_BACKTRACE"] = "1"
        env_str = build.sh_format_command("env", env, force_args_eq=True)
        script += textwrap.dedent(f"""\
            {sed} -i -e '/\\[package\\]/,/\\[.*\\]/{{
                    s/^version\\s*=.*/version = "{self.version.text}"/;
                }}' \\
                "{src}/Cargo.toml"
            {env_str} \\
                {cargo} install {target} \\
                    --verbose --verbose \\
                    --root "{installdest}" \\
                    --path "{src}" \\
                    --locked
            mkdir -p "{install_bindir}"
            cp -a "{installdest}/bin/"* "{install_bindir}/"
            """)
        return script
Пример #4
0
 def get_configure_script(self, build: targets.Build) -> str:
     sdir = build.get_source_dir(self, relative_to="pkgbuild")
     configure = sdir / "configure"
     configure_flags = {
         "--disable-all-programs": None,
         "--enable-libuuid": None,
     }
     return self.sh_configure(build, configure, configure_flags)
Пример #5
0
    def get_configure_script(self, build: targets.Build) -> str:
        sdir = build.get_source_dir(self, relative_to="pkgbuild")
        configure = sdir / "configure"
        configure_flags = {
            "--disable-multi-os-directory": None,
        }

        return self.sh_configure(build, configure, configure_flags)
Пример #6
0
 def get_configure_script(self, build: targets.Build) -> str:
     sdir = build.get_source_dir(self, relative_to="pkgbuild")
     configure = sdir / "source" / "configure"
     configure_flags = {
         "--disable-samples": None,
         "--disable-tests": None,
         "--enable-rpath": None,
     }
     return self.sh_configure(build, configure, configure_flags)
Пример #7
0
    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)
Пример #8
0
    def _get_edgedb_catalog_version(self, build: targets.Build) -> str:
        source = pathlib.Path(build.get_source_dir(self, relative_to="fsroot"))

        defines = source / "edb" / "buildmeta.py"
        if not defines.exists():
            defines = source / "edb" / "server" / "defines.py"

        with open(defines, "r") as f:
            for line in f:
                if line.startswith("EDGEDB_CATALOG_VERSION = "):
                    return str(int(line[len("EDGEDB_CATALOG_VERSION = "):]))
            else:
                raise RuntimeError("cannot determine EDGEDB_CATALOG_VERSION")
Пример #9
0
    def get_build_install_script(self, build: targets.Build) -> str:
        script = ""

        licenses = self.get_license_files_pattern()
        if licenses:
            sdir = build.get_source_dir(self, relative_to="pkgbuild")
            legaldir = build.get_install_path("legal").relative_to("/")
            lic_dest = (
                build.get_install_dir(self, relative_to="pkgbuild") / legaldir
            )
            prefix = str(lic_dest / self.name)
            script += textwrap.dedent(
                f"""\
                mkdir -p "{lic_dest}"
                for _lic_src in "{sdir}"/{licenses}; do
                    if [ -e "$_lic_src" ]; then
                        cp "$_lic_src" "{prefix}-$(basename "$_lic_src")"
                    fi
                done
                """
            )

        return script
Пример #10
0
    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,
        ])
Пример #11
0
    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)
Пример #12
0
 def get_configure_script(self, build: targets.Build) -> str:
     sdir = build.get_source_dir(self, relative_to="pkgbuild")
     configure = sdir / "configure"
     return self.sh_configure(build, configure, {})
Пример #13
0
    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)
Пример #14
0
    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}"
        """)