mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2025-02-09 03:57:24 +00:00
1dab58a2cf
This search/replace updates all copyright notices to drop the "All rights reserved", Use "ChromiumOS" instead of "Chromium OS" and drops the trailing dots. This fulfills the request from legal and unifies our notices. ./tools/health-check has been updated to only accept this style. BUG=b:246579983 TEST=./tools/health-check Change-Id: I87a80701dc651f1baf4820e5cc42469d7c5f5bf7 Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/3894243 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Commit-Queue: Dennis Kempin <denniskempin@google.com>
108 lines
3.6 KiB
Rust
108 lines
3.6 KiB
Rust
// Copyright 2019 The ChromiumOS Authors
|
|
// 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::error::Error;
|
|
use std::fs;
|
|
use std::fs::File;
|
|
use std::io::Write;
|
|
use std::path::Path;
|
|
use std::path::PathBuf;
|
|
|
|
type Result<T> = std::result::Result<T, Box<dyn Error>>;
|
|
|
|
struct ExternalProto {
|
|
// Where to find protos during builds within cros_sdk. Relative to
|
|
// $SYSROOT environment variable set by emerge builds.
|
|
dir_relative_to_sysroot: &'static str,
|
|
|
|
// Where to find protos during "cargo build" in a local developer
|
|
// environment. Relative to the platform/crosvm/protos directory.
|
|
dir_relative_to_us: &'static str,
|
|
|
|
// *.proto file expected to exist in both of the above directories.
|
|
proto_file_name: &'static str,
|
|
|
|
// Code generated by proto compiler will be placed under
|
|
// protos::generated::$module_name.
|
|
module: &'static str,
|
|
}
|
|
|
|
// Rustfmt bug: https://github.com/rust-lang/rustfmt/issues/3498
|
|
#[rustfmt::skip]
|
|
static EXTERNAL_PROTOS: &[ExternalProto] = &[];
|
|
|
|
struct LocalProto {
|
|
// Corresponding to the input file src/$module.proto.
|
|
module: &'static str,
|
|
}
|
|
|
|
#[rustfmt::skip]
|
|
static LOCAL_PROTOS: &[LocalProto] = &[
|
|
#[cfg(feature = "plugin")]
|
|
LocalProto { module: "plugin" },
|
|
#[cfg(feature = "composite-disk")]
|
|
LocalProto { module: "cdisk_spec" },
|
|
];
|
|
|
|
fn main() -> Result<()> {
|
|
let out_dir = env::var("OUT_DIR")?;
|
|
let sysroot = env::var_os("SYSROOT");
|
|
|
|
// Write out a Rust module that imports the modules generated by protoc.
|
|
let generated = PathBuf::from(&out_dir).join("generated.rs");
|
|
let out = File::create(generated)?;
|
|
|
|
// Compile external protos.
|
|
for proto in EXTERNAL_PROTOS {
|
|
let dir = match &sysroot {
|
|
Some(dir) => PathBuf::from(dir).join(proto.dir_relative_to_sysroot),
|
|
None => PathBuf::from(proto.dir_relative_to_us),
|
|
};
|
|
let input_path = dir.join(proto.proto_file_name);
|
|
protoc(proto.module, input_path, &out)?;
|
|
}
|
|
|
|
// Compile protos from the local src directory.
|
|
for proto in LOCAL_PROTOS {
|
|
let input_path = format!("src/{}.proto", proto.module);
|
|
protoc(proto.module, input_path, &out)?;
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
// Compile a single proto file located at $input_path, placing the generated
|
|
// code at $OUT_DIR/$module and emitting the right `pub mod $module` into the
|
|
// output file.
|
|
fn protoc<P: AsRef<Path>>(module: &str, input_path: P, mut out: &File) -> Result<()> {
|
|
let input_path = input_path.as_ref();
|
|
let input_dir = input_path.parent().unwrap();
|
|
|
|
// Place output in a subdirectory so that different protos with the same
|
|
// common filename (like interface.proto) do not conflict.
|
|
let out_dir = format!("{}/{}", env::var("OUT_DIR")?, module);
|
|
fs::create_dir_all(&out_dir)?;
|
|
|
|
// Invoke protobuf compiler.
|
|
protoc_rust::Codegen::new()
|
|
.input(input_path.as_os_str().to_str().unwrap())
|
|
.include(input_dir.as_os_str().to_str().unwrap())
|
|
.out_dir(&out_dir)
|
|
.run()
|
|
.expect("protoc");
|
|
|
|
// Write out a `mod` that refers to the generated module.
|
|
//
|
|
// The lint suppression is because protoc-rust emits
|
|
// #![cfg_attr(feature = "cargo-clippy", allow(clippy))]
|
|
// which still works but is deprecated in favor of tool attributes:
|
|
// #![allow(clippy::all)].
|
|
let file_stem = input_path.file_stem().unwrap().to_str().unwrap();
|
|
writeln!(out, "#[path = \"{}/{}.rs\"]", out_dir, file_stem)?;
|
|
writeln!(out, "#[allow(renamed_and_removed_lints)]")?;
|
|
writeln!(out, "pub mod {};", module)?;
|
|
|
|
Ok(())
|
|
}
|