mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2025-02-06 02:25:23 +00:00
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:
e4cf13c057/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>
48 lines
1.5 KiB
Rust
48 lines
1.5 KiB
Rust
// 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(())
|
|
}
|