chiark / gitweb /
build.rs: Prepare to handle multiple packages
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 25 Feb 2024 17:28:56 +0000 (17:28 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 25 Feb 2024 18:14:02 +0000 (18:14 +0000)
We'll want this for hyper.  (Which is nontrivial.)

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
build.rs

index 64c2269f8137b9272cc412cb12e36e50647d048a..2643bbfc061bc51436e8c7253cd4c4845b96afb3 100644 (file)
--- a/build.rs
+++ b/build.rs
@@ -35,6 +35,30 @@ impl Metadata {
   }
 }
 
+struct Context<'c> {
+  hippo: &'c MNode,
+  metadata: &'c Metadata,
+}
+
+impl Context<'_> {
+  fn emit_for_package(&self, package: &str, versions: &[&str]) {
+    let pkg = self.hippo.dependencies.iter()
+      .map(|i| self.metadata.package(i))
+      .find(|i| i.name == package).expect("no nix in hippotat's deps");
+
+    let pkg = &pkg.version;
+    let pkg: semver::Version = pkg.parse().expect(pkg);
+
+    for test in versions {
+      let cfg = test.replace('.', "_").replace(">=", "ge_");
+      let test: semver::VersionReq = test.parse().unwrap();
+      if test.matches(&pkg) {
+        println!("cargo:rustc-cfg={package}_{cfg}");
+      }
+    }
+  }
+}
+
 fn main(){
   let x = Command::new("cargo")
     .args(["metadata", "--format-version=1"])
@@ -51,17 +75,7 @@ fn main(){
   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 ctx = Context { hippo, metadata: &metadata };
 
-  let nix = &nix.version;
-  let nix: semver::Version = nix.parse().expect(nix);
-  for test in [">=0.27", ">=0.28"] {
-    let cfg = test.replace('.', "_").replace(">=", "ge_");
-    let test: semver::VersionReq = test.parse().unwrap();
-    if test.matches(&nix) {
-      println!("cargo:rustc-cfg=nix_{cfg}");
-    }
-  }
+  ctx.emit_for_package("nix", &[">=0.27", ">=0.28"]);
 }