|
4 | 4 | use std::convert::TryInto;
|
5 | 5 | use std::env;
|
6 | 6 | use std::error::Error;
|
7 |
| -use std::fmt::{self, Debug, Display}; |
| 7 | +use std::fmt::{self, Debug}; |
8 | 8 | use std::fs;
|
9 | 9 | use std::os::raw::{c_int, c_uint};
|
10 | 10 | use std::path::{Path, PathBuf};
|
@@ -49,6 +49,16 @@ impl Debug for Version {
|
49 | 49 | }
|
50 | 50 | }
|
51 | 51 |
|
| 52 | +fn known_hdf5_versions() -> Vec<Version> { |
| 53 | + // Keep up to date with known_versions in hdf5 |
| 54 | + let mut vs = Vec::new(); |
| 55 | + vs.extend((5..=21).map(|v| Version::new(1, 8, v))); // 1.8.[5-23] |
| 56 | + vs.extend((0..=8).map(|v| Version::new(1, 10, v))); // 1.10.[0-10] |
| 57 | + vs.extend((0..=2).map(|v| Version::new(1, 12, v))); // 1.12.[0-2] |
| 58 | + vs.extend((0..=4).map(|v| Version::new(1, 14, v))); // 1.14.[0-4] |
| 59 | + vs |
| 60 | +} |
| 61 | + |
52 | 62 | #[allow(dead_code)]
|
53 | 63 | fn run_command(cmd: &str, args: &[&str]) -> Option<String> {
|
54 | 64 | let out = Command::new(cmd).args(args).output();
|
@@ -80,17 +90,6 @@ fn is_msvc() -> bool {
|
80 | 90 | std::env::var("CARGO_CFG_TARGET_ENV").unwrap() == "msvc"
|
81 | 91 | }
|
82 | 92 |
|
83 |
| -#[derive(Clone, Debug)] |
84 |
| -struct RuntimeError(String); |
85 |
| - |
86 |
| -impl Error for RuntimeError {} |
87 |
| - |
88 |
| -impl Display for RuntimeError { |
89 |
| - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
90 |
| - write!(f, "HDF5 runtime error: {}", self.0) |
91 |
| - } |
92 |
| -} |
93 |
| - |
94 | 93 | #[allow(non_snake_case, non_camel_case_types)]
|
95 | 94 | fn get_runtime_version_single<P: AsRef<Path>>(path: P) -> Result<Version, Box<dyn Error>> {
|
96 | 95 | type H5open_t = unsafe extern "C" fn() -> c_int;
|
@@ -634,59 +633,68 @@ pub struct Config {
|
634 | 633 |
|
635 | 634 | impl Config {
|
636 | 635 | pub fn emit_link_flags(&self) {
|
637 |
| - println!("cargo:rustc-link-lib=dylib=hdf5"); |
| 636 | + println!("cargo::rustc-link-lib=dylib=hdf5"); |
638 | 637 | for dir in &self.link_paths {
|
639 |
| - println!("cargo:rustc-link-search=native={}", dir.to_str().unwrap()); |
| 638 | + println!("cargo::rustc-link-search=native={}", dir.to_str().unwrap()); |
640 | 639 | }
|
641 |
| - println!("cargo:rerun-if-env-changed=HDF5_DIR"); |
642 |
| - println!("cargo:rerun-if-env-changed=HDF5_VERSION"); |
| 640 | + println!("cargo::rerun-if-env-changed=HDF5_DIR"); |
| 641 | + println!("cargo::rerun-if-env-changed=HDF5_VERSION"); |
643 | 642 |
|
644 | 643 | if is_msvc() {
|
645 |
| - println!("cargo:msvc_dll_indirection=1"); |
| 644 | + println!("cargo::metadata=msvc_dll_indirection=1"); |
646 | 645 | }
|
647 |
| - println!("cargo:include={}", self.inc_dir.to_str().unwrap()); |
| 646 | + println!("cargo::metadata=include={}", self.inc_dir.to_str().unwrap()); |
648 | 647 |
|
649 |
| - println!("cargo:library=hdf5"); |
| 648 | + println!("cargo::metadata=library=hdf5"); |
650 | 649 |
|
651 | 650 | if feature_enabled("HL") {
|
652 |
| - println!("cargo:hl_library=hdf5_hl"); |
| 651 | + println!("cargo::metadata=hl_library=hdf5_hl"); |
653 | 652 | }
|
654 | 653 | }
|
655 | 654 |
|
656 | 655 | pub fn emit_cfg_flags(&self) {
|
657 | 656 | let version = self.header.version;
|
658 | 657 | assert!(version >= Version::new(1, 8, 4), "required HDF5 version: >=1.8.4");
|
659 |
| - let mut vs: Vec<_> = (5..=21).map(|v| Version::new(1, 8, v)).collect(); // 1.8.[5-23] |
660 |
| - vs.extend((0..=8).map(|v| Version::new(1, 10, v))); // 1.10.[0-10] |
661 |
| - vs.extend((0..=2).map(|v| Version::new(1, 12, v))); // 1.12.[0-2] |
662 |
| - vs.extend((0..=4).map(|v| Version::new(1, 14, v))); // 1.14.[0-4] |
663 |
| - for v in vs.into_iter().filter(|&v| version >= v) { |
664 |
| - println!("cargo:rustc-cfg=feature=\"{}.{}.{}\"", v.major, v.minor, v.micro); |
665 |
| - println!("cargo:version_{}_{}_{}=1", v.major, v.minor, v.micro); |
| 658 | + |
| 659 | + for v in known_hdf5_versions() { |
| 660 | + println!( |
| 661 | + "cargo::rustc-check-cfg=cfg(feature, values(\"{}.{}.{}\"))", |
| 662 | + v.major, v.minor, v.micro |
| 663 | + ); |
| 664 | + } |
| 665 | + for v in known_hdf5_versions().into_iter().filter(|&v| version >= v) { |
| 666 | + println!("cargo::rustc-cfg=feature=\"{}.{}.{}\"", v.major, v.minor, v.micro); |
| 667 | + println!("cargo::metadata=version_{}_{}_{}=1", v.major, v.minor, v.micro); |
666 | 668 | }
|
| 669 | + |
| 670 | + println!("cargo::rustc-check-cfg=cfg(have_stdbool_h)"); |
667 | 671 | if self.header.have_stdbool_h {
|
668 |
| - println!("cargo:rustc-cfg=have_stdbool_h"); |
| 672 | + println!("cargo::rustc-cfg=have_stdbool_h"); |
669 | 673 | // there should be no need to export have_stdbool_h downstream
|
670 | 674 | }
|
| 675 | + println!("cargo::rustc-check-cfg=cfg(feature, values(\"have-direct\"))"); |
671 | 676 | if self.header.have_direct {
|
672 |
| - println!("cargo:rustc-cfg=feature=\"have-direct\""); |
673 |
| - println!("cargo:have_direct=1"); |
| 677 | + println!("cargo::rustc-cfg=feature=\"have-direct\""); |
| 678 | + println!("cargo::metadata=have_direct=1"); |
674 | 679 | }
|
| 680 | + println!("cargo::rustc-check-cfg=cfg(feature, values(\"have-parallel\"))"); |
675 | 681 | if self.header.have_parallel {
|
676 |
| - println!("cargo:rustc-cfg=feature=\"have-parallel\""); |
677 |
| - println!("cargo:have_parallel=1"); |
| 682 | + println!("cargo::rustc-cfg=feature=\"have-parallel\""); |
| 683 | + println!("cargo::metadata=have_parallel=1"); |
678 | 684 | }
|
| 685 | + println!("cargo::rustc-check-cfg=cfg(feature, values(\"have-threadsafe\"))"); |
679 | 686 | if self.header.have_threadsafe {
|
680 |
| - println!("cargo:rustc-cfg=feature=\"have-threadsafe\""); |
681 |
| - println!("cargo:have_threadsafe=1"); |
| 687 | + println!("cargo::rustc-cfg=feature=\"have-threadsafe\""); |
| 688 | + println!("cargo::metadata=have_threadsafe=1"); |
682 | 689 | }
|
| 690 | + println!("cargo::rustc-check-cfg=cfg(feature, values(\"have-filter-deflate\"))"); |
683 | 691 | if self.header.have_filter_deflate {
|
684 |
| - println!("cargo:rustc-cfg=feature=\"have-filter-deflate\""); |
685 |
| - println!("cargo:have_filter_deflate=1"); |
| 692 | + println!("cargo::rustc-cfg=feature=\"have-filter-deflate\""); |
| 693 | + println!("cargo::metadata=have_filter_deflate=1"); |
686 | 694 | }
|
687 | 695 |
|
688 | 696 | if cfg!(windows) && version >= Version::new(1, 14, 0) {
|
689 |
| - println!("cargo:rustc-link-lib=shlwapi"); |
| 697 | + println!("cargo::rustc-link-lib=shlwapi"); |
690 | 698 | }
|
691 | 699 | }
|
692 | 700 |
|
@@ -721,31 +729,31 @@ fn main() {
|
721 | 729 | }
|
722 | 730 |
|
723 | 731 | fn get_build_and_emit() {
|
724 |
| - println!("cargo:rerun-if-changed=build.rs"); |
| 732 | + println!("cargo::rerun-if-changed=build.rs"); |
725 | 733 |
|
726 | 734 | if feature_enabled("ZLIB") {
|
727 | 735 | let zlib_lib = env::var("DEP_HDF5SRC_ZLIB").unwrap();
|
728 |
| - println!("cargo:zlib={}", &zlib_lib); |
| 736 | + println!("cargo::metadata=zlib={}", &zlib_lib); |
729 | 737 | let zlib_lib_header = env::var("DEP_HDF5SRC_ZLIB").unwrap();
|
730 |
| - println!("cargo:zlib={}", &zlib_lib_header); |
731 |
| - println!("cargo:rustc-link-lib=static={}", &zlib_lib); |
| 738 | + println!("cargo::metadata=zlib={}", &zlib_lib_header); |
| 739 | + println!("cargo::rustc-link-lib=static={}", &zlib_lib); |
732 | 740 | }
|
733 | 741 |
|
734 | 742 | if feature_enabled("HL") {
|
735 | 743 | let hdf5_hl_lib = env::var("DEP_HDF5SRC_HL_LIBRARY").unwrap();
|
736 |
| - println!("cargo:rustc-link-lib=static={}", &hdf5_hl_lib); |
737 |
| - println!("cargo:hl_library={}", &hdf5_hl_lib); |
| 744 | + println!("cargo::rustc-link-lib=static={}", &hdf5_hl_lib); |
| 745 | + println!("cargo::metadata=hl_library={}", &hdf5_hl_lib); |
738 | 746 | }
|
739 | 747 |
|
740 | 748 | let hdf5_root = env::var("DEP_HDF5SRC_ROOT").unwrap();
|
741 |
| - println!("cargo:root={}", &hdf5_root); |
| 749 | + println!("cargo::metadata=root={}", &hdf5_root); |
742 | 750 | let hdf5_incdir = env::var("DEP_HDF5SRC_INCLUDE").unwrap();
|
743 |
| - println!("cargo:include={}", &hdf5_incdir); |
| 751 | + println!("cargo::metadata=include={}", &hdf5_incdir); |
744 | 752 | let hdf5_lib = env::var("DEP_HDF5SRC_LIBRARY").unwrap();
|
745 |
| - println!("cargo:library={}", &hdf5_lib); |
| 753 | + println!("cargo::metadata=library={}", &hdf5_lib); |
746 | 754 |
|
747 |
| - println!("cargo:rustc-link-search=native={}/lib", &hdf5_root); |
748 |
| - println!("cargo:rustc-link-lib=static={}", &hdf5_lib); |
| 755 | + println!("cargo::rustc-link-search=native={}/lib", &hdf5_root); |
| 756 | + println!("cargo::rustc-link-lib=static={}", &hdf5_lib); |
749 | 757 |
|
750 | 758 | let header = Header::parse(&hdf5_incdir);
|
751 | 759 | let config = Config { header, inc_dir: "".into(), link_paths: Vec::new() };
|
|
0 commit comments