Mon 3 Mar 2025

Previous: Tue 25 Feb 2025

Babel

A Debian encoding in PubGrub

  1. DONE provides with virtual packages

    here

DONE cross ecosystem resolutions between opam and debian

Done in babel.

Some examples follow.

  1. conf-gmp

    #[test]
    fn test_conf_gmp_variables() -> Result<(), Box<dyn Error>> {
        let root = OpamPackage::Root(vec![
            (
                OpamPackage::Base("conf-gmp".to_string()),
                Range::singleton(OpamVersion("4".to_string())),
            ),
            (
                OpamPackage::Var("os-family".to_string()),
                Range::singleton(OpamVersion("debian".to_string())),
            ),
            (
                OpamPackage::Var("os-distribution".to_string()),
                Range::singleton(OpamVersion("debian".to_string())),
            ),
        ]);
        solve_repo(
            BabelPackage::Opam(root),
            BabelVersion::Opam(OpamVersion("".to_string())),
            "../pubgrub_opam/opam-repository/packages",
            "../pubgrub_debian/repositories/buster/Packages",
        )?;
        Ok(())
    }
    
    Solution Set:
            Debian  (libgmp10, 2:6.1.2+dfsg-4+deb10u1)
            Opam    os-family = debian
            Debian  (libc6, 2.28-10+deb10u1)
            Debian  (libgcc1, 1:8.3.0-6)
            Opam    os-distribution = debian
            Opam    os = linux
            Debian  (libstdc++6, 8.3.0-6)
            Debian  (libgmpxx4ldbl, 2:6.1.2+dfsg-4+deb10u1)
            Debian  (gcc-8-base, 8.3.0-6)
            Opam    (conf-gmp, 4)
            Debian  (libgmp-dev, 2:6.1.2+dfsg-4+deb10u1)
    
    Resolved Dependency Graph:
            (conf-gmp, 4) -> (Opam `os-distribution`, debian), (Opam `os-family`, debian), (Opam `os`, linux), (libgmp-dev, 2:6.1.2+dfsg-4+deb10u1)
            (gcc-8-base, 8.3.0-6)
            (libc6, 2.28-10+deb10u1) -> (libgcc1, 1:8.3.0-6)
            (libgcc1, 1:8.3.0-6) -> (gcc-8-base, 8.3.0-6), (libc6, 2.28-10+deb10u1)
            (libgmp-dev, 2:6.1.2+dfsg-4+deb10u1) -> (libgmp10, 2:6.1.2+dfsg-4+deb10u1), (libgmpxx4ldbl, 2:6.1.2+dfsg-4+deb10u1)
            (libgmp10, 2:6.1.2+dfsg-4+deb10u1) -> (libc6, 2.28-10+deb10u1)
            (libgmpxx4ldbl, 2:6.1.2+dfsg-4+deb10u1) -> (libc6, 2.28-10+deb10u1), (libgcc1, 1:8.3.0-6), (libgmp10, 2:6.1.2+dfsg-4+deb10u1), (libstdc++6, 8.3.0-6)
            (libstdc++6, 8.3.0-6) -> (gcc-8-base, 8.3.0-6), (libc6, 2.28-10+deb10u1), (libgcc1, 1:8.3.0-6)
    
  2. ocluster

    let root = OpamPackage::Root(vec![
        (
            OpamPackage::Base("ocluster".to_string()),
            Range::singleton(OpamVersion("0.3.0".to_string())),
        ),
        (
            OpamPackage::Var("os-family".to_string()),
            Range::singleton(OpamVersion("debian".to_string())),
        ),
        (
            OpamPackage::Var("os-distribution".to_string()),
            Range::singleton(OpamVersion("debian".to_string())),
        ),
    ]);
    solve_repo(
        BabelPackage::Opam(root),
        BabelVersion::Opam(OpamVersion("".to_string())),
        "../pubgrub_opam/opam-repository/packages",
        "../pubgrub_debian/repositories/buster/Packages",
    )?;
    Ok(())
    
    Solution Set:
            Opam    (ppx_deriving, 6.0.3)
            Opam    (stringext, 1.6.0)
            Debian  (libgcc1, 1:8.3.0-6)
            Opam    (mirage-crypto-ec, 0.11.3)
            Opam    (conduit-lwt-unix, 7.1.0)
            Opam    (bigstringaf, 0.10.0)
            Opam    (base-bytes, base)
            Opam    (angstrom, 0.16.1)
            Opam    (cstruct-lwt, 6.2.0)
            Opam    (sha, 1.15.4)
            Opam    (ppx_here, v0.17.0)
            Debian  (gcc-8-base, 8.3.0-6)
            Opam    (tls-mirage, 0.17.5)
            Opam    (conf-gmp, 4)
            Opam    (ocaml-compiler, 5.3)
            Opam    os-family = debian
            Opam    (ppx_inline_test, v0.17.0)
            Opam    (domain-name, 0.4.0)
            Opam    (extunix, 0.4.3)
            Opam    (eqaf, 0.9)
            Debian  (libstdc++6, 8.3.0-6)
            Opam    (mirage-crypto-rng, 0.11.3)
            Opam    opam-version = 2.1.0
            Opam    (ppx_base, v0.17.0)
            Opam    (yojson, 2.2.2)
            Opam    (ppx_expect, v0.17.2)
            Opam    (ocaml-variants, 5.3.1+trunk)
            Opam    (duration, 0.2.1)
            Opam    (ca-certs, 0.2.3)
            Opam    (pbkdf, 1.2.0)
            Opam    (zarith, 1.13)
            Opam    (prometheus, 1.2)
            Opam    (obuilder, 0.6.0)
            Opam    (psq, 0.2.1)
            Opam    (result, 1.5)
            Opam    (hmap, 0.8.1)
            Opam    (system-mingw, 1)
            Opam    (asetmap, 0.8.1)
            Opam    (cstruct, 6.2.0)
            Opam    (conf-mingw-w64-gcc-i686, 1)
            Opam    (ocplib-endian, 1.2)
            Opam    (cohttp-lwt, 6.0.0)
            Opam    (ipaddr-sexp, 5.6.0)
            Opam    (ocaml-env-mingw32, 1)
            Opam    (ocluster, 0.3.0)
            Opam    (ocaml, 5.3.1)
            Opam    (dune, 3.17.2)
            Opam    (base-unix, base)
            Opam    (magic-mime, 1.3.1)
            Debian  (libgmp-dev, 2:6.1.2+dfsg-4+deb10u1)
            Opam    (x509, 0.16.5)
            Opam    (fpath, 0.7.3)
            Opam    (fmt, 0.9.0)
            Opam    (ppxlib_jane, v0.17.2)
            Opam    (eio, 1.2)
            Opam    (optint, 0.3.0)
            Opam    (jst-config, v0.17.0)
            Opam    (re, 1.12.0)
            Opam    (csexp, 1.5.2)
            Opam    (base-bigarray, base)
            Debian  (libc6, 2.28-10+deb10u1)
            Opam    (sexplib0, v0.17.0)
            Opam    post = false
            Opam    (stdio, v0.17.0)
            Opam    (ppx_hash, v0.17.0)
            Opam    (ppx_cold, v0.17.0)
            Opam    (thread-table, 1.0.0)
            Opam    (uri, 4.4.0)
            Opam    (parsexp, v0.17.0)
            Opam    (base, v0.17.1)
            Opam    (conduit-lwt, 7.1.0)
            Opam    (cmdliner, 1.3.0)
            Opam    (mirage-crypto, 0.11.3)
            Opam    (sexplib, v0.17.0)
            Opam    (mtime, 2.1.0)
            Opam    (ppx_sexp_conv, v0.17.0)
            Opam    (mirage-flow, 5.0.0)
            Opam    (lwt-dllist, 1.0.1)
            Opam    os-distribution = debian
            Opam    (ocaml_intrinsics_kernel, v0.17.1)
            Opam    os = linux
            Opam    build = false
            Debian  (libgmpxx4ldbl, 2:6.1.2+dfsg-4+deb10u1)
            Opam    (capnp-rpc-lwt, 2.0)
            Opam    (ppx_compare, v0.17.0)
            Opam    (base-threads, base)
            Opam    (logs, 0.7.0)
            Opam    (stdlib-shims, 0.3.0)
            Opam    (dune-configurator, 3.17.2)
            Opam    (ipaddr, 5.6.0)
            Opam    (res, 5.0.2)
            Opam    (capnp-rpc-net, 1.2.3)
            Opam    (tar-unix, 2.6.0)
            Opam    (ppx_assert, v0.17.0)
            Opam    (mirage-kv, 6.1.1)
            Debian  (libev4, 1:4.25-1)
            Opam    with-dev-setup = false
            Opam    (lwt, 5.9.0)
            Opam    (ppx_globalize, v0.17.0)
            Opam    (mirage-crypto-pk, 0.11.3)
            Opam    (rresult, 0.7.0)
            Opam    (conf-libev, 4-12)
            Opam    (capnp, 3.6.0)
            Opam    (time_now, v0.17.0)
            Opam    (domain-local-await, 1.0.1)
            Opam    (stdint, 0.7.2)
            Debian  (libgmp10, 2:6.1.2+dfsg-4+deb10u1)
            Opam    (digestif, 1.2.0)
            Opam    with-test = false
            Opam    (lwt_eio, 0.5.1)
            Opam    (sqlite3, 5.3.0)
            Opam    (asn1-combinators, 0.2.6)
            Opam    with-doc = false
            Opam    (dune-build-info, 3.17.2)
            Opam    (num, 1.5-1)
            Opam    (prometheus-app, 1.2)
            Opam    dev = false
            Opam    (capnp-rpc-unix, 1.2.4)
            Opam    (ppx_derivers, 1.2.1)
            Opam    (gmap, 0.3.0)
            Opam    (astring, 0.8.5)
            Opam    (bos, 0.2.1)
            Opam    (hkdf, 1.0.4)
            Opam    (mirage-crypto-rng-lwt, 1.2.0)
            Opam    (mirage-clock, 4.2.0)
            Opam    (ocaml-compiler-libs, v0.17.0)
            Opam    (ptime, 1.2.0)
            Opam    arch = x86_64
            Opam    (ocaml-config, 3)
            Opam    (jane-street-headers, v0.17.0)
            Opam    (ppxlib, 0.35.0)
            Opam    (seq, base)
            Opam    version = false
            Opam    (cohttp-lwt-unix, 6.0.0)
            Opam    (base64, 3.5.1)
            Opam    (ppx_enumerate, v0.17.0)
            Opam    (ppx_optcomp, v0.17.0)
            Opam    (ocamlfind, 1.9.8)
            Opam    (tls, 0.17.5)
            Debian  (libev-dev, 1:4.25-1)
    

TODO read up on answer set programming

https://pubgrub-rs-guide.pages.dev/internals/intro is a good starting point

TODO benchmark pubgrub against zero install

TODO paper resubmission

3 stunts:

  • stunt 1: cross-ecosystem solving
    • debian and alpine MVP
  • stunt 2: portable lock files
    • portability metric
    • semantics from formalism
    • look at what uv does
    • add to table 1
  • stunt 3: gpu package
    • filesystems
    • hetrogenous hardware
    • intel amd

TODO think about uses of this graph other than solving

  1. security venerabilities - usenix security

  2. local vector db of internet scale packages managers

papers in the works

Babel to SPLASH

Shark to SOSP

Eilean to HotNets idea

Spatial Name System sensor networks SIGCOMM idea