diff options
Diffstat (limited to 'cras/client/cras-sys/generator/src/main.rs')
-rw-r--r-- | cras/client/cras-sys/generator/src/main.rs | 159 |
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"); -} |