blob: 61e2115cc485db5fa9cc83587f56a61274a84d0e [file] [log] [blame]
Mike Frysingera73e9e42022-09-08 03:37:14 -04001// Copyright 2019 The ChromiumOS Authors
Allen Webbed175c72019-09-25 10:36:34 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ryo Hashimoto82dd68c2021-08-30 22:26:21 +09005// 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 Webbed175c72019-09-25 10:36:34 -07008
Ryo Hashimoto82dd68c2021-08-30 22:26:21 +09009use std::env;
10use std::error::Error;
11use std::fs::{self, File};
12use std::io::Write;
13use std::path::{Path, PathBuf};
14
15type Result<T> = std::result::Result<T, Box<dyn Error>>;
Allen Webbed175c72019-09-25 10:36:34 -070016
Allen Webb91bf46e2020-09-18 12:02:28 -070017use chromeos_dbus_bindings::{self, generate_module, BindingsType};
Allen Webbed175c72019-09-25 10:36:34 -070018
19// The parent path of system_api.
20const SOURCE_DIR: &str = "..";
21
Allen Webb40f89cd2021-09-01 16:59:27 -050022const OPTS: Option<&[&str]> = None;
23
Allen Webbed175c72019-09-25 10:36:34 -070024// (<module name>, <relative path to source xml>)
25// When adding additional bindings, remember to include the source project and subtree in the
Ryo Hashimoto82dd68c2021-08-30 22:26:21 +090026// ebuild. Otherwise, the source files will not be accessible when building dev-rust/system_api.
Allen Webb91bf46e2020-09-18 12:02:28 -070027const BINDINGS_TO_GENERATE: &[(&str, &str, BindingsType)] = &[
Allen Webbed175c72019-09-25 10:36:34 -070028 (
29 "org_chromium_authpolicy",
30 "authpolicy/dbus_bindings/org.chromium.AuthPolicy.xml",
Allen Webb40f89cd2021-09-01 16:59:27 -050031 BindingsType::Client(OPTS),
Allen Webbed175c72019-09-25 10:36:34 -070032 ),
33 (
34 "org_chromium_debugd",
35 "debugd/dbus_bindings/org.chromium.debugd.xml",
Allen Webb40f89cd2021-09-01 16:59:27 -050036 BindingsType::Client(OPTS),
Allen Webbed175c72019-09-25 10:36:34 -070037 ),
38 (
Chih-Yang Hsia9aac35e2022-07-20 13:48:02 +000039 "org_chromium_dlcservice",
40 "dlcservice/dbus_adaptors/org.chromium.DlcServiceInterface.xml",
41 BindingsType::Client(OPTS),
42 ),
43 (
Jie Jiangca887ae2021-06-03 21:04:58 +090044 "org_chromium_flimflam_manager",
45 "shill/dbus_bindings/org.chromium.flimflam.Manager.dbus-xml",
Allen Webb40f89cd2021-09-01 16:59:27 -050046 BindingsType::Client(OPTS),
Jie Jiangca887ae2021-06-03 21:04:58 +090047 ),
48 (
49 "org_chromium_flimflam_service",
50 "shill/dbus_bindings/org.chromium.flimflam.Service.dbus-xml",
Allen Webb40f89cd2021-09-01 16:59:27 -050051 BindingsType::Client(OPTS),
Jie Jiangca887ae2021-06-03 21:04:58 +090052 ),
53 (
Evan Green1b3c8092022-04-07 09:03:38 -070054 "org_chromium_power_manager",
55 "power_manager/dbus_bindings/org.chromium.PowerManager.xml",
56 BindingsType::Client(OPTS),
57 ),
58 (
Allen Webbed175c72019-09-25 10:36:34 -070059 "org_chromium_sessionmanagerinterface",
60 "login_manager/dbus_bindings/org.chromium.SessionManagerInterface.xml",
Allen Webb40f89cd2021-09-01 16:59:27 -050061 BindingsType::Client(OPTS),
Allen Webbed175c72019-09-25 10:36:34 -070062 ),
Ryo Hashimoto99769012021-07-08 20:34:43 +090063 (
64 "org_chromium_userdataauth",
65 "cryptohome/dbus_bindings/org.chromium.UserDataAuth.xml",
Allen Webb40f89cd2021-09-01 16:59:27 -050066 BindingsType::Client(OPTS),
Ryo Hashimoto99769012021-07-08 20:34:43 +090067 ),
Yi Chou343a26d2022-06-10 18:41:35 +080068 (
69 "org_chromium_vtpm",
70 "vtpm/dbus_bindings/org.chromium.Vtpm.xml",
71 BindingsType::Client(OPTS),
72 ),
Allen Webbed175c72019-09-25 10:36:34 -070073];
74
Ryo Hashimoto82dd68c2021-08-30 22:26:21 +090075// (<module name>, <relative path to .proto file>)
76// When adding additional protos, remember to include the source project and subtree in the
77// ebuild. Otherwise, the source files will not be accessible when building dev-rust/system_api.
78const PROTOS_TO_GENERATE: &[(&str, &str)] = &[
Bryan Yu03955af2022-07-22 15:39:30 +090079 ("arc", "system_api/dbus/arc/arc.proto"),
Hardik Goyal0e8404a2021-12-06 02:40:08 -080080 (
81 "auth_factor",
82 "system_api/dbus/cryptohome/auth_factor.proto",
83 ),
Max Lee125b2ef2022-08-24 13:35:15 +100084 (
85 "concierge_service",
86 "system_api/dbus/vm_concierge/concierge_service.proto",
87 ),
Chih-Yang Hsia9aac35e2022-07-20 13:48:02 +000088 ("dlcservice", "system_api/dbus/dlcservice/dlcservice.proto"),
Ryo Hashimoto82dd68c2021-08-30 22:26:21 +090089 ("fido", "system_api/dbus/cryptohome/fido.proto"),
90 ("key", "system_api/dbus/cryptohome/key.proto"),
91 ("rpc", "system_api/dbus/cryptohome/rpc.proto"),
92 (
Max Lee125b2ef2022-08-24 13:35:15 +100093 "shadercached",
94 "system_api/dbus/shadercached/shadercached.proto",
95 ),
96 (
Ryo Hashimoto82dd68c2021-08-30 22:26:21 +090097 "UserDataAuth",
98 "system_api/dbus/cryptohome/UserDataAuth.proto",
99 ),
Yi Chou343a26d2022-06-10 18:41:35 +0800100 ("vtpm_interface", "vtpm/vtpm_interface.proto"),
Evan Green5409d5c2022-10-20 13:22:40 -0700101 (
102 "update_engine",
103 "system_api/dbus/update_engine/update_engine.proto",
104 ),
Ryo Hashimoto82dd68c2021-08-30 22:26:21 +0900105];
106
107fn generate_protos(source_dir: &Path, protos: &[(&str, &str)]) -> Result<()> {
108 let out_dir = PathBuf::from("src/protos");
109 if out_dir.exists() {
110 // If CROS_RUST is set, skip generation.
111 if env::var("CROS_RUST") == Ok(String::from("1")) {
112 return Ok(());
113 }
114 fs::remove_dir_all(&out_dir)?;
115 }
116 fs::create_dir_all(&out_dir)?;
117
118 let mut out = File::create(out_dir.join("include_protos.rs"))?;
119
120 for (module, input_path) in protos {
121 let input_path = source_dir.join(input_path);
122 let input_dir = input_path.parent().unwrap();
Bryan Yu03955af2022-07-22 15:39:30 +0900123 let parent_input_dir = source_dir.join("system_api/dbus");
Ryo Hashimoto82dd68c2021-08-30 22:26:21 +0900124
125 // Invoke protobuf compiler.
126 protoc_rust::Codegen::new()
127 .input(input_path.as_os_str().to_str().unwrap())
128 .include(input_dir.as_os_str().to_str().unwrap())
Bryan Yu03955af2022-07-22 15:39:30 +0900129 .include(parent_input_dir)
Ryo Hashimoto82dd68c2021-08-30 22:26:21 +0900130 .out_dir(&out_dir)
131 .run()
132 .expect("protoc");
133
134 // Write out a `mod` that refers to the generated module.
135 writeln!(out, "pub mod {};", module)?;
136 }
137 Ok(())
138}
139
Allen Webbed175c72019-09-25 10:36:34 -0700140fn main() {
141 generate_module(Path::new(SOURCE_DIR), BINDINGS_TO_GENERATE).unwrap();
Ryo Hashimoto82dd68c2021-08-30 22:26:21 +0900142 generate_protos(Path::new(SOURCE_DIR), PROTOS_TO_GENERATE).unwrap();
Allen Webbed175c72019-09-25 10:36:34 -0700143}