// Copyright 2019 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. use std::env; use std::io; use std::path::Path; use std::process::{self, Command}; fn main() -> io::Result<()> { if pkg_config::Config::new() .statik(true) .probe("libtpm2") .is_ok() { // Use tpm2 package from the standard system location if available. return Ok(()); } // Build with `RUSTFLAGS='--cfg hermetic'` to disallow building our own // libtpm2 in a production build context. Building from the libtpm2 // submodule is a convenience only intended for developer environments. if cfg!(hermetic) { eprintln!("libtpm2 not found; unable to perform hermetic build"); process::exit(1); } if !Path::new("libtpm2/.git").exists() { Command::new("git") .args(&["submodule", "update", "--init"]) .status()?; } if !Path::new("libtpm2/build/libtpm2.a").exists() { let ncpu = num_cpus::get(); let status = Command::new("make") .arg(format!("-j{}", ncpu)) .current_dir("libtpm2") .status()?; if !status.success() { process::exit(status.code().unwrap_or(1)); } } let dir = env::var("CARGO_MANIFEST_DIR").unwrap(); println!("cargo:rustc-link-search={}/libtpm2/build", dir); println!("cargo:rustc-link-lib=static=tpm2"); println!("cargo:rustc-link-lib=ssl"); println!("cargo:rustc-link-lib=crypto"); Ok(()) }