From: Ian Jackson Date: Sun, 25 Feb 2024 00:17:15 +0000 (+0000) Subject: nix: Introduce a build.rs script X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=b29f9f8a4e6607de38de436c056eac546fe9ad4e;p=hippotat.git nix: Introduce a build.rs script This uses "cargo metadata" to find the nix version. Signed-off-by: Ian Jackson --- diff --git a/Cargo.lock b/Cargo.lock index cdca232..7ab5efb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -563,6 +563,9 @@ dependencies = [ "parking_lot", "pin-project-lite", "regex", + "semver", + "serde", + "serde_json", "sha2", "subtle", "syslog", @@ -1036,6 +1039,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "ryu" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" + [[package]] name = "schannel" version = "0.1.23" @@ -1074,6 +1083,12 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" + [[package]] name = "serde" version = "1.0.197" @@ -1094,6 +1109,17 @@ dependencies = [ "syn 2.0.50", ] +[[package]] +name = "serde_json" +version = "1.0.113" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" +dependencies = [ + "itoa", + "ryu", + "serde", +] + [[package]] name = "sha2" version = "0.10.8" diff --git a/Cargo.lock.minimal b/Cargo.lock.minimal index 9763f9a..d89736f 100644 --- a/Cargo.lock.minimal +++ b/Cargo.lock.minimal @@ -139,9 +139,9 @@ checksum = "ad1f8e949d755f9d79112b5bb46938e0ef9d3804a0b16dfab13aafcaa5f0fa72" [[package]] name = "cc" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9fa1897e4325be0d68d48df6aa1a71ac2ed4d27723887e7754192705350730" +checksum = "3286b845d0fccbdd15af433f61c5970e711987036cb468f437ff6badd70f4e24" [[package]] name = "cfg-if" @@ -591,6 +591,9 @@ dependencies = [ "parking_lot", "pin-project-lite", "regex", + "semver 1.0.14", + "serde", + "serde_json", "sha2", "subtle", "syslog", @@ -1152,7 +1155,7 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084" dependencies = [ - "semver", + "semver 0.1.20", ] [[package]] @@ -1183,6 +1186,12 @@ dependencies = [ "windows-sys 0.42.0", ] +[[package]] +name = "ryu" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997" + [[package]] name = "schannel" version = "0.1.13" @@ -1226,6 +1235,43 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac" +[[package]] +name = "semver" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" + +[[package]] +name = "serde" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36df6ac6412072f67cf767ebbde4133a5b2e88e76dc6187fa7104cd16f783399" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e549e3abf4fb8621bd1609f11dfc9f5e50320802273b12f3811a67e6716ea6c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.103", +] + +[[package]] +name = "serde_json" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f72eb2a68a7dc3f9a691bfda9305a1c017a6215e5a4545c258500d2099a37c2" +dependencies = [ + "itoa", + "ryu", + "serde", +] + [[package]] name = "sha2" version = "0.10.1" diff --git a/Cargo.toml b/Cargo.toml index a11f0e9..7605b39 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,3 +62,8 @@ syslog = "6" thiserror = "1.0.2" tokio = { version = "1.7", features = ["full"] } void = "1" + +[build-dependencies] +semver = "1.0.14" +serde = { version = "1.0.106", features = ["derive"] } +serde_json = "1.0.41" diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..d52f747 --- /dev/null +++ b/build.rs @@ -0,0 +1,67 @@ +use serde::Deserialize; +use std::process::Command; + +// We don't use cargo-metadata because it has a very unstable API! + +#[derive(Deserialize, Debug)] +struct Metadata { + workspace_members: Vec, + resolve: MResolve, + packages: Vec, +} +#[derive(Deserialize, Debug)] +struct MResolve { + nodes: Vec, +} +#[derive(Deserialize, Debug)] +struct MNode { + id: PackageId, + dependencies: Vec, +} +#[derive(Deserialize, Debug)] +struct MPackage { + id: PackageId, + version: String, + name: String, +} +#[derive(Deserialize, Debug, Eq, PartialEq)] +#[serde(transparent)] +struct PackageId(String); + +impl Metadata { + fn package(&self, id: &PackageId) -> &MPackage { + self.packages.iter() + .find(|p| &p.id == id).expect("missing") + } +} + +fn main(){ + let x = Command::new("cargo") + .args(["metadata", "--format-version=1"]) + .stderr(std::process::Stdio::inherit()) + .output().unwrap(); + if !x.status.success() { panic!() } + let output = std::str::from_utf8(&x.stdout).unwrap(); +// eprintln!("{}", output); + let metadata: Metadata = serde_json::from_str(&output).unwrap(); + + let hippo = metadata.workspace_members.iter() + .map(|i| metadata.package(i)) + .find(|p| p.name == "hippotat").expect("no hippotat in workspace?"); + let hippo = metadata.resolve.nodes.iter() + .find(|n| n.id == hippo.id).expect("no hippotat in nodes!"); + + let nix = hippo.dependencies.iter() + .map(|i| metadata.package(i)) + .find(|i| i.name == "nix").expect("no nix in hippotat's deps"); + + let nix = &nix.version; + let nix: semver::Version = nix.parse().expect(nix); + for test in ["0.27"] { + let cfg = test.replace('.', "_"); + let test: semver::VersionReq = test.parse().unwrap(); + if test.matches(&nix) { + println!("cargo:rustc-cfg=nix_{cfg}"); + } + } +} diff --git a/debian/control b/debian/control index 949222f..b0828f6 100644 --- a/debian/control +++ b/debian/control @@ -36,6 +36,9 @@ Build-Depends: debhelper (>= 12), cargo, rustc, python3-sphinx, librust-proc-macro2-dev (>= 1~) , librust-quote-dev (>= 1~) , librust-regex-dev (>= 1.5~) , + librust-semver-dev (>= 1.0.14~) , + librust-serde-dev (>= 1.0.106~) , + librust-serde-json-dev (>= 1.0.41~) , librust-sha2-dev (>= 0.10~) , librust-subtle-dev (>= 2~) , librust-syn-dev (>= 1~) ,