1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
// Copyright 2021 Contributors to the Parsec project.
// SPDX-License-Identifier: Apache-2.0
use std::path::PathBuf;
const MINIMUM_VERSION: &str = "2.4.6";
fn main() {
if std::env::var("DOCS_RS").is_ok() {
// Nothing to be done for docs.rs builds.
return;
}
#[cfg(feature = "generate-bindings")]
{
let out_path = std::path::PathBuf::from(std::env::var("OUT_DIR").unwrap());
let esys_path = out_path.join("tss_esapi_bindings.rs");
generate_from_system(esys_path);
}
#[cfg(not(feature = "generate-bindings"))]
{
use std::str::FromStr;
use target_lexicon::{Architecture, OperatingSystem, Triple};
let target = Triple::from_str(&std::env::var("TARGET").unwrap())
.expect("Failed to parse target triple");
match (target.architecture, target.operating_system) {
(Architecture::Arm(_), OperatingSystem::Linux) => {}
(Architecture::Aarch64(_), OperatingSystem::Linux) => {}
(Architecture::X86_64, OperatingSystem::Darwin) => {}
(Architecture::X86_64, OperatingSystem::Linux) => {}
(arch, os) => {
//panic!("Compilation target (architecture, OS) tuple ({}, {}) is not part of the supported tuples. Please compile with the \"generate-bindings\" feature or add support for your platform :)", arch, os);
//no bindings available, lets generate some
let out_path = std::path::PathBuf::from(std::env::var("OUT_DIR").unwrap());
let esys_path = out_path.join("tss_esapi_bindings.rs");
generate_from_system(esys_path);
//tell the main code to use the generated bindings
print!("cargo:rustc-cfg=feature=\"generate-bindings\"\n");
}
}
pkg_config::Config::new()
.atleast_version(MINIMUM_VERSION)
.probe("tss2-sys")
.expect("Failed to find tss2-sys library.");
let tss2_esys = pkg_config::Config::new()
.atleast_version(MINIMUM_VERSION)
.probe("tss2-esys")
.expect("Failed to find tss2-esys library.");
pkg_config::Config::new()
.atleast_version(MINIMUM_VERSION)
.probe("tss2-tctildr")
.expect("Failed to find tss2-tctildr library.");
pkg_config::Config::new()
.atleast_version(MINIMUM_VERSION)
.probe("tss2-mu")
.expect("Failed to find tss2-mu library.");
println!("cargo:version={}", tss2_esys.version);
}
}
pub fn generate_from_system(esapi_out: PathBuf) {
pkg_config::Config::new()
.atleast_version(MINIMUM_VERSION)
.probe("tss2-sys")
.expect("Failed to find tss2-sys library.");
let tss2_esys = pkg_config::Config::new()
.atleast_version(MINIMUM_VERSION)
.probe("tss2-esys")
.expect("Failed to find tss2-esys");
let tss2_tctildr = pkg_config::Config::new()
.atleast_version(MINIMUM_VERSION)
.probe("tss2-tctildr")
.expect("Failed to find tss2-tctildr");
let tss2_mu = pkg_config::Config::new()
.atleast_version(MINIMUM_VERSION)
.probe("tss2-mu")
.expect("Failed to find tss2-mu");
println!("cargo:version={}", tss2_esys.version);
// These three pkg-config files should contain only one include/lib path.
let tss2_esys_include_path = tss2_esys.include_paths[0]
.clone()
.into_os_string()
.into_string()
.expect("Error converting OsString to String.");
let tss2_tctildr_include_path = tss2_tctildr.include_paths[0]
.clone()
.into_os_string()
.into_string()
.expect("Error converting OsString to String.");
let tss2_mu_include_path = tss2_mu.include_paths[0]
.clone()
.into_os_string()
.into_string()
.expect("Error converting OsString to String.");
bindgen::Builder::default()
.size_t_is_usize(false)
.clang_arg(format!("-I{}/tss2/", tss2_esys_include_path))
.clang_arg(format!("-I{}/tss2/", tss2_tctildr_include_path))
.clang_arg(format!("-I{}/tss2/", tss2_mu_include_path))
.header(format!("{}/tss2/tss2_esys.h", tss2_esys_include_path))
.header(format!("{}/tss2/tss2_tctildr.h", tss2_tctildr_include_path))
.header(format!("{}/tss2/tss2_mu.h", tss2_mu_include_path))
// See this issue: https://github.com/parallaxsecond/rust-cryptoki/issues/12
.blocklist_type("max_align_t")
.generate_comments(false)
.derive_default(true)
.generate()
.expect("Unable to generate bindings to TSS2 ESYS APIs.")
.write_to_file(esapi_out)
.expect("Couldn't write ESYS bindings!");
}
|