This uses "cargo metadata" to find the nix version.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
"parking_lot",
"pin-project-lite",
"regex",
+ "semver",
+ "serde",
+ "serde_json",
"sha2",
"subtle",
"syslog",
"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"
"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"
"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"
[[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"
"parking_lot",
"pin-project-lite",
"regex",
+ "semver 1.0.14",
+ "serde",
+ "serde_json",
"sha2",
"subtle",
"syslog",
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084"
dependencies = [
- "semver",
+ "semver 0.1.20",
]
[[package]]
"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"
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"
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"
--- /dev/null
+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<PackageId>,
+ resolve: MResolve,
+ packages: Vec<MPackage>,
+}
+#[derive(Deserialize, Debug)]
+struct MResolve {
+ nodes: Vec<MNode>,
+}
+#[derive(Deserialize, Debug)]
+struct MNode {
+ id: PackageId,
+ dependencies: Vec<PackageId>,
+}
+#[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}");
+ }
+ }
+}
librust-proc-macro2-dev (>= 1~) <!upstream-cargo>,
librust-quote-dev (>= 1~) <!upstream-cargo>,
librust-regex-dev (>= 1.5~) <!upstream-cargo>,
+ librust-semver-dev (>= 1.0.14~) <!upstream-cargo>,
+ librust-serde-dev (>= 1.0.106~) <!upstream-cargo>,
+ librust-serde-json-dev (>= 1.0.41~) <!upstream-cargo>,
librust-sha2-dev (>= 0.10~) <!upstream-cargo>,
librust-subtle-dev (>= 2~) <!upstream-cargo>,
librust-syn-dev (>= 1~) <!upstream-cargo>,