diff options
author | David Tolnay <dtolnay@chromium.org> | 2019-01-04 11:50:58 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-01-13 03:23:13 -0800 |
commit | c49ef3e03bcce3a507c37daeba0da6234d7025bc (patch) | |
tree | 910c77d146210db05723a153748dbf839d04b1a8 /tpm2-sys/build.rs | |
parent | 4adfdc03227a076b485d8b37fc8f227c08897696 (diff) | |
download | crosvm-c49ef3e03bcce3a507c37daeba0da6234d7025bc.tar crosvm-c49ef3e03bcce3a507c37daeba0da6234d7025bc.tar.gz crosvm-c49ef3e03bcce3a507c37daeba0da6234d7025bc.tar.bz2 crosvm-c49ef3e03bcce3a507c37daeba0da6234d7025bc.tar.lz crosvm-c49ef3e03bcce3a507c37daeba0da6234d7025bc.tar.xz crosvm-c49ef3e03bcce3a507c37daeba0da6234d7025bc.tar.zst crosvm-c49ef3e03bcce3a507c37daeba0da6234d7025bc.zip |
tpm: Add tpm2-sys crate
This CL adds a tpm2-sys crate that builds libtpm2 from source (from a git submodule) using the existing Makefile and then links the generated static library as -ltpm2. For production builds there is a flag `RUSTFLAGS='--cfg hermetic'` to disallow building our own libtpm2. Instead it will expect to find libtpm2 installed in the standard system location. Building from the libtpm2 submodule is a convenience only intended for developer environments. The functions exposed by tpm2-sys are the ones that will be necessary to initialize a TPM simulator in crosvm and execute TPM commands. Trunks uses the same functions for its simulator mode here: https://chromium.googlesource.com/chromiumos/platform2/+/e4cf13c05773f3446bd76a13c4e37f0b80728711/trunks/tpm_simulator_handle.cc Tested by running: fn main() { unsafe { tpm2_sys::TPM_Manufacture(1); } } inside cros_sdk. Libtpm2 cannot be built outside of cros_sdk because it requires openssl 1.0.2p, whereas dev machines come with openssl 1.1.0j. I have not yet added any dependency on tpm2-sys from crosvm, but when it does get added it will be behind a tpm feature flag so that crosvm can continue to build outside of cros_sdk just without tpm support. I published num_cpus version 1.9.0 to chromeos-localmirror. TEST=running the code snippet above as described BUG=chromium:911799 Change-Id: I097729bc447f9dc95e39959a426d1ac42f46b16d Reviewed-on: https://chromium-review.googlesource.com/1396280 Commit-Ready: David Tolnay <dtolnay@chromium.org> Tested-by: David Tolnay <dtolnay@chromium.org> Reviewed-by: Chirantan Ekbote <chirantan@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'tpm2-sys/build.rs')
-rw-r--r-- | tpm2-sys/build.rs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/tpm2-sys/build.rs b/tpm2-sys/build.rs new file mode 100644 index 0000000..f1abd4a --- /dev/null +++ b/tpm2-sys/build.rs @@ -0,0 +1,48 @@ +// 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<()> { + println!("cargo:rustc-link-lib=ssl"); + println!("cargo:rustc-link-lib=crypto"); + + if pkg_config::probe_library("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"); + Ok(()) +} |