rpm-ostree/Cargo.toml

95 lines
2.5 KiB
TOML
Raw Normal View History

# Explicitly create a workspace since we have libdnf-sys as a path
# dependency, and in the future we may use other sub-crates.
[workspace]
[package]
name = "rpmostree-rust"
version = "0.1.0"
authors = ["Colin Walters <walters@verbum.org>", "Jonathan Lebon <jonathan@jlebon.com>"]
edition = "2018"
# See https://rust-lang.github.io/rfcs/2495-min-rust-version.html
# Usually, we try to keep this to no newer than current RHEL8 rust-toolset version.
# You can find the current versions from here:
# https://access.redhat.com/documentation/en-us/red_hat_developer_tools/1/
# However, right now we are bumping to 1.48 so we can use https://cxx.rs
#rust = "1.48"
links = "rpmostreeinternals"
# This currently needs to duplicate the libraries in configure.ac
# until we unify on Cargo as our build system
[package.metadata.system-deps]
libarchive = "3.0"
jsonglib = { name = "json-glib-1.0", version = "1" }
polkitgobject = { name = "polkit-gobject-1", version = "0" }
rpm = "4"
libcurl = "7"
[dependencies]
anyhow = "1.0.38"
paste = "1.0"
serde = { version = "1.0.123", features = ["derive"] }
serde_derive = "1.0.118"
serde_json = "1.0.62"
serde_yaml = "0.8.16"
libc = "0.2.84"
cxx = "1.0.32"
nix = "0.19.1"
glib-sys = "0.10.1"
glib = "0.10.3"
gio-sys = "0.10.1"
gio = "0.9.1"
ostree = { version = "0.9.1", features = ["v2020_4"] }
ostree-sys = "0.7.1"
tempfile = "3.2.0"
clap = "2.33.3"
structopt = "0.3.21"
openat = "0.1.19"
app: Add `rpm-ostree compose extensions` This adds support for a new `rpm-ostree compose extensions` command` which takes a treefile, a new extensions YAML file, and an OSTree repo and ref. It performs a depsolve and downloads the extensions to a provided output directory. This is intended to replace cosa's `download-extensions`: https://github.com/coreos/coreos-assembler/blob/master/src/download-extensions The input YAML schema matches the one accepted by that script. Some differences from the script: - We have a guaranteed depsolve match and thus can avoid silly issues we've hit in RHCOS (like downloading the wrong `libprotobuf` for `usbguard` -- rhbz#1889694). - We seamlessly re-use the same repos defined in the treefile, whereas the cosa script uses `reposdir=$dir` which doesn't have the same semantics (repo enablement is in that case purely based on the `enabled` flag in those repos, which may be different than what the rpm-ostree compose ran with). - We perform more sanity-checks against the requested extensions, such as whether the extension is already in the base. - We support no-change detection via a state SHA512 file for better integration in cosa and pipelines. - We support a `match-base-evr` key, which forces the extension to have the same EVR as the one from a base package: this is helpful in the case of extensions which complement a base package, esp. those which may not have strong enough reldeps to enforce matching EVRs by depsolve alone (`kernel-headers` is an example of this). - We don't try to organize the RPMs into separate directories by extension because IMO it's not at the right level. Instead, we should work towards higher-level metadata to represent extensions (see https://github.com/openshift/os/issues/409 which is related to this). Closes: #2055
2021-01-12 00:53:05 +03:00
openat-ext = "^0.1.11"
curl = "0.4.34"
rayon = "1.5.0"
c_utf8 = "0.1.0"
rand = "0.8.3"
phf = { version = "0.8", features = ["macros"] }
systemd = "0.8.2"
indicatif = "0.15.0"
lazy_static = "1.4.0"
envsubst = "0.2.0"
subprocess = "0.2.6"
chrono = { version = "0.4.19", features = ["serde"] }
libdnf-sys = { path = "rust/libdnf-sys", version = "0.1.0" }
memfd = "0.3.0"
rust-ini = "0.16.1"
os-release = "0.1.0"
rpmostree-client = { path = "rust/rpmostree-client", version = "0.1.0" }
[build-dependencies]
cbindgen = "0.16.0"
system-deps = "2.0"
anyhow = "1.0"
[lib]
name = "rpmostree_rust"
path = "rust/src/lib.rs"
[[bin]]
name = "rpm-ostree"
path = "rust/src/main.rs"
[profile.release]
# Unwinding across FFI boundaries is undefined behavior, and anyways, we're
# [crash-only](https://en.wikipedia.org/wiki/Crash-only_software)
panic = "abort"
# We assume we're being delivered via e.g. RPM which supports split debuginfo
debug = true
# We need this to avoid leaking symbols, see
# https://internals.rust-lang.org/t/rust-staticlibs-and-optimizing-for-size/5746
lto = true
[features]
sqlite-rpmdb-default = []
fedora-integration = []
Add --enable-sanitizers (not on by default yet) This way we at least get unit test coverage (which... our unit test coverage doesn't do much because our main code paths require privileges or virt). One main blocker to this is that rustc doesn't expose first-class support for this yet: https://github.com/rust-lang/rust/issues/39699 At a practical level this works when building in release mode but fails with `cargo test` for some reason; linker arguments being pruned? Not sure. So I was able to use this when composing to find a bug, but then for some other reason the client side apparently infinite loops inside libsolv. So we're not enabling this yet for those reasons, but let's land the build infrastructure now. ``` (lldb) thread backtrace * thread #4, name = 'pool-/usr/bin/r' * frame #0: 0x00007fd61b97200f libc.so.6`__memcpy_sse2_unaligned_erms + 623 frame #1: 0x00007fd61cbc88e6 libasan.so.6`__asan::asan_realloc(void*, unsigned long, __sanitizer::BufferedStackTrace*) + 214 frame #2: 0x00007fd61cc4b725 libasan.so.6`__interceptor_realloc + 245 frame #3: 0x00007fd61baec43e libsolv.so.1`solv_realloc + 30 frame #4: 0x00007fd61baf0414 libsolv.so.1`repodata_add_dirstr + 276 frame #5: 0x00007fd61bb6f755 libsolvext.so.1`end_element + 53 frame #6: 0x00007fd61b05855d libxml2.so.2`xmlParseEndTag1.constprop.0 + 317 frame #7: 0x00007fd61b063548 libxml2.so.2`xmlParseTryOrFinish.isra.0 + 888 frame #8: 0x00007fd61af7ed20 libxml2.so.2`xmlParseChunk + 560 frame #9: 0x00007fd61bb727e7 libsolvext.so.1`solv_xmlparser_parse + 183 frame #10: 0x00007fd61bb5ea0e libsolvext.so.1`repo_add_rpmmd + 254 frame #11: 0x000055a4fce7a5f5 rpm-ostree`::load_filelists_cb(repo=<unavailable>, fp=<unavailable>) at dnf-sack.cpp:444:23 frame #12: 0x000055a4fce7cad6 rpm-ostree`load_ext(_DnfSack*, libdnf::Repo*, _hy_repo_repodata, char const*, char const*, int (*)(s_Repo*, _IO_FILE*), _GError**) at dnf-sack.cpp:430:13 frame #13: 0x000055a4fce7df60 rpm-ostree`dnf_sack_load_repo at dnf-sack.cpp:1789:26 frame #14: 0x000055a4fce7eee9 rpm-ostree`dnf_sack_add_repo at dnf-sack.cpp:2217:28 frame #15: 0x000055a4fce7f0fb rpm-ostree`dnf_sack_add_repos at dnf-sack.cpp:2271:32 frame #16: 0x000055a4fce870ee rpm-ostree`dnf_context_setup_sack_with_flags at dnf-context.cpp:1796:29 frame #17: 0x000055a4fcdf757f rpm-ostree`rpmostree_context_download_metadata at rpmostree-core.cxx:1206:44 frame #18: 0x000055a4fcdf95c3 rpm-ostree`rpmostree_context_prepare at rpmostree-core.cxx:2001:48 frame #19: 0x000055a4fce54ab7 rpm-ostree`rpmostree_sysroot_upgrader_prep_layering at rpmostree-sysroot-upgrader.cxx:1018:38 frame #20: 0x000055a4fcdcb143 rpm-ostree`deploy_transaction_execute(_RpmostreedTransaction*, _GCancellable*, _GError**) at rpmostreed-transaction-types.cxx:1445:49 frame #21: 0x000055a4fcdba4cd rpm-ostree`transaction_execute_thread(_GTask*, void*, void*, _GCancellable*) at rpmostreed-transaction.cxx:340:34 frame #22: 0x00007fd61c58f7e2 libgio-2.0.so.0`g_task_thread_pool_thread + 114 frame #23: 0x00007fd61c3d7e54 libglib-2.0.so.0`g_thread_pool_thread_proxy.lto_priv.0 + 116 frame #24: 0x00007fd61c3d52b2 libglib-2.0.so.0`g_thread_proxy + 82 frame #25: 0x00007fd61b8af3f9 libpthread.so.0`start_thread + 233 frame #26: 0x00007fd61b9c9903 libc.so.6`__clone + 67 (lldb) ```
2021-02-03 00:54:38 +03:00
# ASAN+UBSAN
sanitizers = []
default = []