summaryrefslogtreecommitdiff
path: root/cras/client/cras-sys/generator/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cras/client/cras-sys/generator/src/main.rs')
-rw-r--r--cras/client/cras-sys/generator/src/main.rs159
1 files changed, 0 insertions, 159 deletions
diff --git a/cras/client/cras-sys/generator/src/main.rs b/cras/client/cras-sys/generator/src/main.rs
deleted file mode 100644
index e562691d..00000000
--- a/cras/client/cras-sys/generator/src/main.rs
+++ /dev/null
@@ -1,159 +0,0 @@
-// 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.
-extern crate bindgen;
-
-use bindgen::builder;
-
-use std::fs::{self, File};
-use std::io::Write;
-use std::path::Path;
-use std::str;
-
-fn copy_headers(src_dir: &Path, dst_dir: &Path) -> Result<(), String> {
- if dst_dir.is_file() {
- fs::remove_file(&dst_dir).or_else(|e| {
- Err(format!(
- "failed to remove existing file at {:?}: {}",
- dst_dir, e
- ))
- })?;
- }
-
- if !dst_dir.is_dir() {
- fs::create_dir(&dst_dir).or_else(|e| {
- Err(format!(
- "failed to create destination directory: {:?}: {}",
- dst_dir, e
- ))
- })?;
- }
-
- let header_files = vec![
- "cras_audio_format.h",
- "cras_iodev_info.h",
- "cras_messages.h",
- "cras_shm.h",
- "cras_types.h",
- "cras_util.h",
- "packet_status_logger.h",
- ];
-
- for header in &header_files {
- let src = src_dir.join(&header);
- let dst = dst_dir.join(&header);
- fs::copy(&src, &dst).or_else(|e| {
- Err(format!(
- "failed to copy header file {:?} to {:?}: {}",
- src, dst, e
- ))
- })?;
- }
- Ok(())
-}
-
-/*
- * If we use both `packed` and `align(4)` for a struct, bindgen will generate
- * it as an opaque struct.
- *
- * `cras_server_state` is created from C with `packed` and `aligned(4)` and
- * shared through a shared memory area.
- *
- * Structs with `packed` and `align(4)` have the same memory layout as those
- * with `packed` except for some extra alignment bytes at the end.
- *
- * Therefore, using only `packed` for `cras_server_state` from Rust side is safe.
- *
- * This function modifies `cras_server_state` from
- * `__attribute__ ((packed, aligned(4)))` to `__attribute__ ((packed))`
- */
-fn modify_server_state_attributes(dir: &Path) -> Result<(), String> {
- let cras_types_path = dir.join("cras_types.h");
- let bytes = fs::read(&cras_types_path)
- .or_else(|e| Err(format!("failed to read {:?}: {}", cras_types_path, e)))?;
-
- let old = str::from_utf8(&bytes).or_else(|e| {
- Err(format!(
- "failed to parse {:?} as utf8: {}",
- cras_types_path, e
- ))
- })?;
-
- let new = old.replacen(
- "struct __attribute__((packed, aligned(4))) cras_server_state {",
- "struct __attribute__((packed)) cras_server_state {",
- 1,
- );
-
- if new.len() >= old.len() {
- return Err("failed to remove 'aligned(4)' from cras_server_state".to_string());
- }
-
- fs::write(&cras_types_path, new).or_else(|e| {
- Err(format!(
- "failed to write updated contents to {:?}: {}",
- cras_types_path, e
- ))
- })?;
-
- Ok(())
-}
-
-fn gen() -> String {
- let name = "cras_gen";
- let bindings = builder()
- .header("c_headers/cras_messages.h")
- .header("c_headers/cras_types.h")
- .header("c_headers/cras_audio_format.h")
- .header("c_headers/cras_shm.h")
- .whitelist_type("cras_.*")
- .whitelist_var("cras_.*")
- .whitelist_type("CRAS_.*")
- .whitelist_var("CRAS_.*")
- .whitelist_type("audio_message")
- .whitelist_var("MAX_DEBUG_.*")
- .rustified_enum("CRAS_.*")
- .rustified_enum("_snd_pcm_.*")
- .bitfield_enum("CRAS_STREAM_EFFECT")
- .generate()
- .expect(format!("Unable to generate {} code", name).as_str());
-
- bindings.to_string()
-}
-
-fn write_output(output_path: &Path, output: String) -> std::io::Result<()> {
- let header = b"// 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.
-
-/*
- * generated from files in cras/src/common in adhd:
- * cras_audio_format.h
- * cras_iodev_info.h
- * cras_messages.h
- * cras_shm.h
- * cras_types.h
- * cras_util.h
- * packet_status_logger.h
- */
-
-#![allow(clippy::unreadable_literal)]
-#![allow(clippy::cognitive_complexity)]
-";
-
- let mut output_file = File::create(output_path)?;
- output_file.write_all(header)?;
- output_file.write_all(output.as_bytes())?;
- Ok(())
-}
-
-fn main() {
- let src_header_dir = Path::new("../../../src/common");
- let dst_header_dir = Path::new("./c_headers");
-
- copy_headers(src_header_dir, dst_header_dir).expect("failed to copy C headers");
- modify_server_state_attributes(dst_header_dir)
- .expect("failed to modify cras_server_state's attributes");
- let generated_code = gen();
- write_output(Path::new("lib_gen.rs"), generated_code).expect("failed to write generated code");
-}