blob: 4b3573a751ce5a6384bf0dd79206bc66b8f443a0 [file] [log] [blame]
// Protocol Buffers - Google's data interchange format
// Copyright 2025 Google LLC. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
use protobuf_codegen::{CodeGen, Dependency};
use std::path::Path;
use std::path::PathBuf;
// Given "a/b/c.proto", returns "c".
fn short_name(proto_file_name: &str) -> String {
proto_file_name.rsplit('/').next().unwrap().strip_suffix(".proto").unwrap().to_string()
}
fn main() {
// All proto files needed for testing, grouped by protoc invocation.
let proto_files = vec![
vec!["rust/test/bad_names.proto".to_string()],
vec!["rust/test/bad_names.proto".to_string()],
vec!["rust/test/child.proto".to_string()],
vec!["google/protobuf/cpp_features.proto".to_string()],
vec!["google/protobuf/descriptor.proto".to_string()],
vec!["rust/test/dots_in_package.proto".to_string()],
vec!["rust/test/edition2023.proto".to_string()],
vec!["rust/test/enums.proto".to_string()],
vec!["rust/test/fields_with_imported_types.proto".to_string()],
vec!["rust/test/imported_types.proto".to_string()],
vec!["rust/test/import_public_grandparent.proto".to_string()],
vec!["rust/test/import_public_non_primary_src1.proto".to_string()],
vec!["rust/test/import_public_non_primary_src2.proto".to_string()],
vec!["rust/test/import_public_primary_src.proto".to_string()],
vec![
"rust/test/import_public.proto".to_string(),
"rust/test/import_public2.proto".to_string(),
],
vec!["rust/test/map_unittest.proto".to_string()],
vec!["rust/test/nested.proto".to_string()],
vec!["rust/test/no_package_import.proto".to_string()],
vec![
"rust/test/no_package.proto".to_string(),
"rust/test/no_package_other.proto".to_string(),
],
vec!["rust/test/package_disabiguation1.proto".to_string()],
vec!["rust/test/package_disabiguation2.proto".to_string()],
vec!["rust/test/package_import.proto".to_string()],
vec![
"rust/test/package.proto".to_string(),
"rust/test/package_other.proto".to_string(),
"rust/test/package_other_different.proto".to_string(),
],
vec!["rust/test/parent.proto".to_string()],
vec!["rust/test/srcsless_library_test_child.proto".to_string()],
vec!["rust/test/srcsless_library_test_parent.proto".to_string()],
vec!["rust/test/unittest_import.proto".to_string()],
vec!["rust/test/unittest.proto".to_string()],
vec!["rust/test/unittest_proto3_optional.proto".to_string()],
vec!["rust/test/unittest_proto3.proto".to_string()],
vec!["rust/test/bad_names.proto".to_string()],
vec!["rust/test/child.proto".to_string()],
vec!["google/protobuf/cpp_features.proto".to_string()],
vec!["google/protobuf/descriptor.proto".to_string()],
vec!["rust/test/dots_in_package.proto".to_string()],
vec!["rust/test/edition2023.proto".to_string()],
vec!["rust/test/enums.proto".to_string()],
vec!["rust/test/fields_with_imported_types.proto".to_string()],
vec!["rust/test/imported_types.proto".to_string()],
vec!["rust/test/import_public_grandparent.proto".to_string()],
vec!["rust/test/import_public_non_primary_src1.proto".to_string()],
vec!["rust/test/import_public_non_primary_src2.proto".to_string()],
vec!["rust/test/import_public_primary_src.proto".to_string()],
vec![
"rust/test/import_public.proto".to_string(),
"rust/test/import_public2.proto".to_string(),
],
vec!["rust/test/map_unittest.proto".to_string()],
vec!["rust/test/nested.proto".to_string()],
vec!["rust/test/no_package_import.proto".to_string()],
vec![
"rust/test/no_package.proto".to_string(),
"rust/test/no_package_other.proto".to_string(),
],
vec!["rust/test/package_disabiguation1.proto".to_string()],
vec!["rust/test/package_disabiguation2.proto".to_string()],
vec!["rust/test/package_import.proto".to_string()],
vec![
"rust/test/package.proto".to_string(),
"rust/test/package_other.proto".to_string(),
"rust/test/package_other_different.proto".to_string(),
],
vec!["rust/test/parent.proto".to_string()],
vec!["rust/test/srcsless_library_test_child.proto".to_string()],
vec!["rust/test/srcsless_library_test_parent.proto".to_string()],
vec!["rust/test/unittest_import.proto".to_string()],
vec!["rust/test/unittest.proto".to_string()],
vec!["rust/test/unittest_proto3_optional.proto".to_string()],
vec!["rust/test/unittest_proto3.proto".to_string()],
];
let mut deps: Vec<Dependency> = vec![];
for target in &proto_files {
let name = short_name(&target[0]);
deps.push(Dependency {
crate_name: format!("crate::protos::{name}_rust_proto"),
proto_import_paths: vec![Path::new(env!("CARGO_MANIFEST_DIR")).join("proto")],
proto_files: target.to_vec(),
});
}
for target in proto_files {
let name = short_name(&target[0]);
CodeGen::new()
.inputs(target)
.dependency(deps.clone())
.output_dir(
PathBuf::from(std::env::var("OUT_DIR").unwrap())
.join(format!("protobuf_generated/{name}")),
)
.include("proto")
.generate_and_compile()
.unwrap();
}
}