b640892f04
Right now, we're using libdnf APIs from Rust via hand-crafted `extern C` interfaces, which is extra dangerous because there is no signature checking that happens at compile-time. Until either we can automate libdnf bindings or use its C++ API directly via cxx.rs, let's do some basic wrapping in C++ ourselves and use libdnf through that API only instead. That gives us a lot more confidence and makes the libdnf API feel more natural to use in Rust.
52 lines
1.9 KiB
Rust
52 lines
1.9 KiB
Rust
use anyhow::Result;
|
|
|
|
fn main() -> Result<()> {
|
|
let libs = system_deps::Config::new().probe()?;
|
|
|
|
// first, the submodule proper
|
|
let libdnf = cmake::Config::new("../../libdnf")
|
|
// Needed for hardened builds
|
|
.cxxflag("-fPIC")
|
|
// I picked /usr/libexec/rpm-ostree just because we need an
|
|
// arbitrary path - we don't actually install there.
|
|
.define("CMAKE_INSTALL_PREFIX:PATH", "/usr/libexec/rpm-ostree")
|
|
.define(
|
|
"INCLUDE_INSTALL_DIR:PATH",
|
|
"/usr/libexec/rpm-ostree/include",
|
|
)
|
|
.define("LIB_INSTALL_DIR:PATH", "/usr/libexec/rpm-ostree")
|
|
.define("SYSCONF_INSTALL_DIR:PATH", "/usr/libexec/rpm-ostree/etc")
|
|
.define("SHARE_INSTALL_PREFIX:PATH", "/usr/libexec/rpm-ostree/share")
|
|
.define("ENABLE_STATIC:BOOL", "1")
|
|
.define("CMAKE_POSITION_INDEPENDENT_CODE", "ON")
|
|
// We don't need docs
|
|
.define("WITH_HTML:BOOL", "0")
|
|
.define("WITH_MAN:BOOL", "0")
|
|
// Don't need bindings
|
|
.define("WITH_BINDINGS:BOOL", "0")
|
|
// Needed in Koji at least because timestamps(?)
|
|
// cause cmake to rerun without our -D flags which
|
|
// breaks the build.
|
|
.always_configure(false)
|
|
.build_target("all")
|
|
.build();
|
|
println!(
|
|
"cargo:rustc-link-search=native={}/build/libdnf",
|
|
libdnf.display()
|
|
);
|
|
println!("cargo:rustc-link-lib=static=dnf");
|
|
|
|
// now, our thin cxx.rs bridge wrapper
|
|
let mut libdnfcxx = cxx_build::bridge("lib.rs");
|
|
libdnfcxx
|
|
.file("cxx/libdnf.cxx")
|
|
.flag("-std=c++17")
|
|
.include("cxx") // this is needed for cxx.rs' `include!("libdnf.hxx")` to work
|
|
.include("../../libdnf");
|
|
// until https://github.com/gdesmott/system-deps/pull/32
|
|
libdnfcxx.includes(libs.iter().flat_map(|lib| lib.1.include_paths.iter()));
|
|
libdnfcxx.compile("libdnfcxx.a");
|
|
|
|
Ok(())
|
|
}
|