Allen Webb | ed175c7 | 2019-09-25 10:36:34 -0700 | [diff] [blame] | 1 | // Copyright 2019 The Chromium OS Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
Ryo Hashimoto | 82dd68c | 2021-08-30 22:26:21 +0900 | [diff] [blame] | 5 | // Generates the Rust D-Bus bindings and protobuf definitions for system_api. |
| 6 | // The generated bindings are included in the published crate since the source XML files are only |
| 7 | // available from the original path or the ebuild. |
Allen Webb | ed175c7 | 2019-09-25 10:36:34 -0700 | [diff] [blame] | 8 | |
Ryo Hashimoto | 82dd68c | 2021-08-30 22:26:21 +0900 | [diff] [blame] | 9 | use std::env; |
| 10 | use std::error::Error; |
| 11 | use std::fs::{self, File}; |
| 12 | use std::io::Write; |
| 13 | use std::path::{Path, PathBuf}; |
| 14 | |
| 15 | type Result<T> = std::result::Result<T, Box<dyn Error>>; |
Allen Webb | ed175c7 | 2019-09-25 10:36:34 -0700 | [diff] [blame] | 16 | |
Allen Webb | 91bf46e | 2020-09-18 12:02:28 -0700 | [diff] [blame] | 17 | use chromeos_dbus_bindings::{self, generate_module, BindingsType}; |
Allen Webb | ed175c7 | 2019-09-25 10:36:34 -0700 | [diff] [blame] | 18 | |
| 19 | // The parent path of system_api. |
| 20 | const SOURCE_DIR: &str = ".."; |
| 21 | |
Allen Webb | 40f89cd | 2021-09-01 16:59:27 -0500 | [diff] [blame] | 22 | const OPTS: Option<&[&str]> = None; |
| 23 | |
Allen Webb | ed175c7 | 2019-09-25 10:36:34 -0700 | [diff] [blame] | 24 | // (<module name>, <relative path to source xml>) |
| 25 | // When adding additional bindings, remember to include the source project and subtree in the |
Ryo Hashimoto | 82dd68c | 2021-08-30 22:26:21 +0900 | [diff] [blame] | 26 | // ebuild. Otherwise, the source files will not be accessible when building dev-rust/system_api. |
Allen Webb | 91bf46e | 2020-09-18 12:02:28 -0700 | [diff] [blame] | 27 | const BINDINGS_TO_GENERATE: &[(&str, &str, BindingsType)] = &[ |
Allen Webb | ed175c7 | 2019-09-25 10:36:34 -0700 | [diff] [blame] | 28 | ( |
| 29 | "org_chromium_authpolicy", |
| 30 | "authpolicy/dbus_bindings/org.chromium.AuthPolicy.xml", |
Allen Webb | 40f89cd | 2021-09-01 16:59:27 -0500 | [diff] [blame] | 31 | BindingsType::Client(OPTS), |
Allen Webb | ed175c7 | 2019-09-25 10:36:34 -0700 | [diff] [blame] | 32 | ), |
| 33 | ( |
| 34 | "org_chromium_debugd", |
| 35 | "debugd/dbus_bindings/org.chromium.debugd.xml", |
Allen Webb | 40f89cd | 2021-09-01 16:59:27 -0500 | [diff] [blame] | 36 | BindingsType::Client(OPTS), |
Allen Webb | ed175c7 | 2019-09-25 10:36:34 -0700 | [diff] [blame] | 37 | ), |
| 38 | ( |
Jie Jiang | ca887ae | 2021-06-03 21:04:58 +0900 | [diff] [blame] | 39 | "org_chromium_flimflam_manager", |
| 40 | "shill/dbus_bindings/org.chromium.flimflam.Manager.dbus-xml", |
Allen Webb | 40f89cd | 2021-09-01 16:59:27 -0500 | [diff] [blame] | 41 | BindingsType::Client(OPTS), |
Jie Jiang | ca887ae | 2021-06-03 21:04:58 +0900 | [diff] [blame] | 42 | ), |
| 43 | ( |
| 44 | "org_chromium_flimflam_service", |
| 45 | "shill/dbus_bindings/org.chromium.flimflam.Service.dbus-xml", |
Allen Webb | 40f89cd | 2021-09-01 16:59:27 -0500 | [diff] [blame] | 46 | BindingsType::Client(OPTS), |
Jie Jiang | ca887ae | 2021-06-03 21:04:58 +0900 | [diff] [blame] | 47 | ), |
| 48 | ( |
Allen Webb | ed175c7 | 2019-09-25 10:36:34 -0700 | [diff] [blame] | 49 | "org_chromium_sessionmanagerinterface", |
| 50 | "login_manager/dbus_bindings/org.chromium.SessionManagerInterface.xml", |
Allen Webb | 40f89cd | 2021-09-01 16:59:27 -0500 | [diff] [blame] | 51 | BindingsType::Client(OPTS), |
Allen Webb | ed175c7 | 2019-09-25 10:36:34 -0700 | [diff] [blame] | 52 | ), |
Ryo Hashimoto | 9976901 | 2021-07-08 20:34:43 +0900 | [diff] [blame] | 53 | ( |
| 54 | "org_chromium_userdataauth", |
| 55 | "cryptohome/dbus_bindings/org.chromium.UserDataAuth.xml", |
Allen Webb | 40f89cd | 2021-09-01 16:59:27 -0500 | [diff] [blame] | 56 | BindingsType::Client(OPTS), |
Ryo Hashimoto | 9976901 | 2021-07-08 20:34:43 +0900 | [diff] [blame] | 57 | ), |
Allen Webb | ed175c7 | 2019-09-25 10:36:34 -0700 | [diff] [blame] | 58 | ]; |
| 59 | |
Ryo Hashimoto | 82dd68c | 2021-08-30 22:26:21 +0900 | [diff] [blame] | 60 | // (<module name>, <relative path to .proto file>) |
| 61 | // When adding additional protos, remember to include the source project and subtree in the |
| 62 | // ebuild. Otherwise, the source files will not be accessible when building dev-rust/system_api. |
| 63 | const PROTOS_TO_GENERATE: &[(&str, &str)] = &[ |
Hardik Goyal | 0e8404a | 2021-12-06 02:40:08 -0800 | [diff] [blame^] | 64 | ( |
| 65 | "auth_factor", |
| 66 | "system_api/dbus/cryptohome/auth_factor.proto", |
| 67 | ), |
Ryo Hashimoto | 82dd68c | 2021-08-30 22:26:21 +0900 | [diff] [blame] | 68 | ("fido", "system_api/dbus/cryptohome/fido.proto"), |
| 69 | ("key", "system_api/dbus/cryptohome/key.proto"), |
| 70 | ("rpc", "system_api/dbus/cryptohome/rpc.proto"), |
| 71 | ( |
| 72 | "UserDataAuth", |
| 73 | "system_api/dbus/cryptohome/UserDataAuth.proto", |
| 74 | ), |
| 75 | ]; |
| 76 | |
| 77 | fn generate_protos(source_dir: &Path, protos: &[(&str, &str)]) -> Result<()> { |
| 78 | let out_dir = PathBuf::from("src/protos"); |
| 79 | if out_dir.exists() { |
| 80 | // If CROS_RUST is set, skip generation. |
| 81 | if env::var("CROS_RUST") == Ok(String::from("1")) { |
| 82 | return Ok(()); |
| 83 | } |
| 84 | fs::remove_dir_all(&out_dir)?; |
| 85 | } |
| 86 | fs::create_dir_all(&out_dir)?; |
| 87 | |
| 88 | let mut out = File::create(out_dir.join("include_protos.rs"))?; |
| 89 | |
| 90 | for (module, input_path) in protos { |
| 91 | let input_path = source_dir.join(input_path); |
| 92 | let input_dir = input_path.parent().unwrap(); |
| 93 | |
| 94 | // Invoke protobuf compiler. |
| 95 | protoc_rust::Codegen::new() |
| 96 | .input(input_path.as_os_str().to_str().unwrap()) |
| 97 | .include(input_dir.as_os_str().to_str().unwrap()) |
| 98 | .out_dir(&out_dir) |
| 99 | .run() |
| 100 | .expect("protoc"); |
| 101 | |
| 102 | // Write out a `mod` that refers to the generated module. |
| 103 | writeln!(out, "pub mod {};", module)?; |
| 104 | } |
| 105 | Ok(()) |
| 106 | } |
| 107 | |
Allen Webb | ed175c7 | 2019-09-25 10:36:34 -0700 | [diff] [blame] | 108 | fn main() { |
| 109 | generate_module(Path::new(SOURCE_DIR), BINDINGS_TO_GENERATE).unwrap(); |
Ryo Hashimoto | 82dd68c | 2021-08-30 22:26:21 +0900 | [diff] [blame] | 110 | generate_protos(Path::new(SOURCE_DIR), PROTOS_TO_GENERATE).unwrap(); |
Allen Webb | ed175c7 | 2019-09-25 10:36:34 -0700 | [diff] [blame] | 111 | } |