library is configurable now
This commit is contained in:
parent
637d87756c
commit
89a90f55b4
@ -0,0 +1,4 @@
|
|||||||
|
[env]
|
||||||
|
# This is set for this repository so it does not always have to be set in the command line.
|
||||||
|
# It is required for building libcsp-rust.
|
||||||
|
CSP_CONFIG_DIR = { value = "examples", relative = true }
|
7
examples/autoconfig.rs
Normal file
7
examples/autoconfig.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
const CSP_CONN_RXQUEUE_LEN: usize = 16
|
||||||
|
const CSP_QFIFO_LEN: usize = 16
|
||||||
|
const CSP_PORT_MAX_BIND: usize = 16
|
||||||
|
const CSP_CONN_MAX: usize = 8
|
||||||
|
const CSP_BUFFER_SIZE: usize = 256
|
||||||
|
const CSP_RDP_MAX_WINDOW: usize = 5
|
||||||
|
const CSP_RTABLE_SIZE: usize = 10
|
@ -4,8 +4,18 @@ use libcsp_cargo_build::Builder;
|
|||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let out_dir = env::var("OUT_DIR").unwrap_or_default();
|
let out_dir = env::var("OUT_DIR").unwrap_or_default();
|
||||||
|
let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap_or_default();
|
||||||
let libcsp_path = "../lib/libcsp";
|
let libcsp_path = "../lib/libcsp";
|
||||||
let mut csp_builder = Builder::new(PathBuf::from(libcsp_path), PathBuf::from(out_dir));
|
let mut csp_builder = Builder::new(PathBuf::from(libcsp_path), PathBuf::from(&out_dir));
|
||||||
|
let update_autoconf = match env::var("UPDATE_CSP_AUTOCONF") {
|
||||||
|
Ok(update_autoconf) => update_autoconf == "1",
|
||||||
|
Err(_e) => false,
|
||||||
|
};
|
||||||
|
if update_autoconf {
|
||||||
|
csp_builder
|
||||||
|
.generate_autoconf_rust_file(PathBuf::from(&manifest_dir))
|
||||||
|
.expect("generating autoconfig.rs failed");
|
||||||
|
println!("cargo:warning=autoconfig.rs updated");
|
||||||
|
}
|
||||||
csp_builder.compile().expect("compiling libcsp failed");
|
csp_builder.compile().expect("compiling libcsp failed");
|
||||||
}
|
}
|
||||||
|
@ -199,12 +199,15 @@ impl Builder {
|
|||||||
self.build.include(&autoconf_dir);
|
self.build.include(&autoconf_dir);
|
||||||
autoconf_dir.push("csp");
|
autoconf_dir.push("csp");
|
||||||
std::fs::create_dir_all(&autoconf_dir)?;
|
std::fs::create_dir_all(&autoconf_dir)?;
|
||||||
generate_autoconf_file(autoconf_dir, &self.cfg)
|
generate_autoconf_header_file(autoconf_dir, &self.cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn generate_autoconf_rust_file(&self, out_dir: PathBuf) -> io::Result<()> {
|
||||||
|
generate_autoconf_rust_file(out_dir, &self.cfg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate_autoconf_file(out_dir: PathBuf, cfg: &Config) -> io::Result<()> {
|
pub fn generate_autoconf_header_file(out_dir: PathBuf, cfg: &Config) -> io::Result<()> {
|
||||||
// panic!("cargo:warning=outdir for autoconf file: {:?}", out_dir);
|
|
||||||
let mut autoconf_file_string = String::new();
|
let mut autoconf_file_string = String::new();
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
autoconf_file_string.push_str("#define CSP_POSIX 1\n");
|
autoconf_file_string.push_str("#define CSP_POSIX 1\n");
|
||||||
@ -307,6 +310,49 @@ pub fn generate_autoconf_file(out_dir: PathBuf, cfg: &Config) -> io::Result<()>
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn generate_autoconf_rust_file(out_dir: PathBuf, cfg: &Config) -> io::Result<()> {
|
||||||
|
let mut autoconf_file_string = String::new();
|
||||||
|
autoconf_file_string.push_str(&format!(
|
||||||
|
"const {}: usize = {}\n",
|
||||||
|
autoconf::CFG_CONN_RXQUEUE_LEN,
|
||||||
|
cfg.conn_rx_queue_len
|
||||||
|
));
|
||||||
|
autoconf_file_string.push_str(&format!(
|
||||||
|
"const {}: usize = {}\n",
|
||||||
|
autoconf::CFG_QFIFO_LEN,
|
||||||
|
cfg.qfifo_len
|
||||||
|
));
|
||||||
|
autoconf_file_string.push_str(&format!(
|
||||||
|
"const {}: usize = {}\n",
|
||||||
|
autoconf::CFG_PORT_MAX_BIND,
|
||||||
|
cfg.port_max_bind
|
||||||
|
));
|
||||||
|
autoconf_file_string.push_str(&format!(
|
||||||
|
"const {}: usize = {}\n",
|
||||||
|
autoconf::CFG_CONN_MAX,
|
||||||
|
cfg.conn_max
|
||||||
|
));
|
||||||
|
autoconf_file_string.push_str(&format!(
|
||||||
|
"const {}: usize = {}\n",
|
||||||
|
autoconf::CFG_BUFFER_SIZE,
|
||||||
|
cfg.buffer_size
|
||||||
|
));
|
||||||
|
autoconf_file_string.push_str(&format!(
|
||||||
|
"const {}: usize = {}\n",
|
||||||
|
autoconf::CFG_RDP_MAX_WINDOW,
|
||||||
|
cfg.rdp_max_window
|
||||||
|
));
|
||||||
|
autoconf_file_string.push_str(&format!(
|
||||||
|
"const {}: usize = {}\n",
|
||||||
|
autoconf::CFG_RTABLE_SIZE,
|
||||||
|
cfg.rtable_size
|
||||||
|
));
|
||||||
|
let out_file = out_dir.join("autoconfig.rs");
|
||||||
|
let mut file = std::fs::File::create(out_file)?;
|
||||||
|
file.write_all(autoconf_file_string.as_bytes())?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
// TODO: Unittest autoconf generator.
|
// TODO: Unittest autoconf generator.
|
||||||
|
@ -1,3 +1,29 @@
|
|||||||
|
use std::{env, path::PathBuf};
|
||||||
|
|
||||||
|
pub const ENV_KEY_CSP_CONFIG_DIR: &str = "CSP_CONFIG_DIR";
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("cargo:rustc-link-lib=csp")
|
println!("cargo:rustc-link-lib=csp");
|
||||||
|
|
||||||
|
let out_path = env::var("OUT_DIR").unwrap();
|
||||||
|
let csp_conf_dir = match env::var("CSP_CONFIG_DIR") {
|
||||||
|
Ok(conf_path) => conf_path,
|
||||||
|
Err(_e) => {
|
||||||
|
println!("cargo:warning=CSP_CONFIG_DIR not set, using CARGO_MANIFEST_DIR to search for autoconfig.rs");
|
||||||
|
env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set")
|
||||||
|
}
|
||||||
|
};
|
||||||
|
println!("cargo:warning=CSP_CONFIG_DIR={}", csp_conf_dir);
|
||||||
|
let mut csp_conf_path = PathBuf::new();
|
||||||
|
csp_conf_path.push(csp_conf_dir);
|
||||||
|
csp_conf_path.push("autoconfig.rs");
|
||||||
|
if !csp_conf_path.exists() {
|
||||||
|
panic!(
|
||||||
|
"autoconfig.rs not found at {:?}, is required for library build",
|
||||||
|
csp_conf_path
|
||||||
|
);
|
||||||
|
}
|
||||||
|
let out_path_full = PathBuf::from(&out_path).join("autoconfig.rs");
|
||||||
|
std::fs::copy(&csp_conf_path, out_path_full).expect("failed to copy autoconfig.rs to OUT_DIR");
|
||||||
|
println!("cargo::rerun-if-changed={:?}", &csp_conf_path);
|
||||||
}
|
}
|
||||||
|
3
libcsp-rust/src/config.rs
Normal file
3
libcsp-rust/src/config.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/// This environbment variable should be set by the user. If it is not set, the library will
|
||||||
|
/// try to find an autoconfig.rs file inside the CARGO_TARGET_DIR directory.
|
||||||
|
pub const ENV_KEY_CSP_CONFIG_DIR: &str = "CSP_CONFIG_DIR";
|
@ -2,10 +2,10 @@
|
|||||||
#![allow(non_camel_case_types)]
|
#![allow(non_camel_case_types)]
|
||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
|
|
||||||
// These constants come from the autoconfig file, which is supposed to be configurable..
|
// This file will be created by the build script by copying a user-provided file to the output
|
||||||
// How do we deal with this? Rust libraries are not supposed to be configured like this.
|
// directory. It contains important compile time constants. Compilation of the library is not
|
||||||
pub const CSP_BUFFER_SIZE: usize = 256;
|
// possible without these constants.
|
||||||
pub const CSP_CONN_RXQUEUE_LEN: usize = 16;
|
include!(concat!(env!("OUT_DIR"), "/autoconfig.rs"));
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
@ -6,6 +6,8 @@ extern crate alloc;
|
|||||||
extern crate std;
|
extern crate std;
|
||||||
|
|
||||||
pub mod ffi;
|
pub mod ffi;
|
||||||
|
pub mod config;
|
||||||
|
|
||||||
use core::time::Duration;
|
use core::time::Duration;
|
||||||
|
|
||||||
use num_enum::{IntoPrimitive, TryFromPrimitive};
|
use num_enum::{IntoPrimitive, TryFromPrimitive};
|
||||||
|
8
libcsp-rust/templates/autoconfig.rs
Normal file
8
libcsp-rust/templates/autoconfig.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
pub const CSP_CONN_RXQUEUE_LEN: usize = 16;
|
||||||
|
pub const CSP_QFIFO_LEN: usize = 15;
|
||||||
|
pub const CSP_PORT_MAX_BIND: usize = 16;
|
||||||
|
pub const CSP_CONN_MAX: usize = 8;
|
||||||
|
pub const CSP_BUFFER_SIZE: usize = 256;
|
||||||
|
pub const CSP_BUFFER_COUNT: usize = 15;
|
||||||
|
pub const CSP_RDP_MAX_WINDOW: usize = 5;
|
||||||
|
pub const CSP_RTABLE_SIZE: usize = 10;
|
Loading…
Reference in New Issue
Block a user