chiark / gitweb /
nix: Introduce a build.rs script
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 25 Feb 2024 00:17:15 +0000 (00:17 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 25 Feb 2024 17:13:37 +0000 (17:13 +0000)
This uses "cargo metadata" to find the nix version.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Cargo.lock
Cargo.lock.minimal
Cargo.toml
build.rs [new file with mode: 0644]
debian/control

index cdca2322258db70c1bc4160e36ba6c5f82c08d00..7ab5efb2a8d1f1f95c7ee292ed89c44d132d585c 100644 (file)
@@ -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"
index 9763f9ab0dacaa9d33ac65347f4513dc6193a146..d89736fd8e2b4db30f1f35da75277c58becc666b 100644 (file)
@@ -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"
index a11f0e9ff00a3b9d1bee6eaffaac9483760c2e74..7605b391eb88e7da9299e0deecb91e3f2fedcc59 100644 (file)
@@ -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 (file)
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<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}");
+    }
+  }
+}
index 949222fd5eb3f2ba7992d9e4176714f5682c99e4..b0828f61fa4fee3067a70472f226a57879a50665 100644 (file)
@@ -36,6 +36,9 @@ Build-Depends: debhelper (>= 12), cargo, rustc, python3-sphinx,
     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>,