在www.example.com阶段生成Rust代码build.rs

krugob8w  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(126)

我正在尝试用Rust的build.rs代码 Package 一个C库。在configure阶段,可以设置一堆标志,比如MAX_LEVEL=5DERIVATION=2。在这种情况下,脚本将在C代码中生成一个指向函数的指针数组,例如:

#define MAX_LEVEL 5

void (*evaluate_level[MAX_LEVEL])(/* args */);
void (*derivation_1[MAX_LEVEL])(/* args */);
void (*derivation_2[MAX_LEVEL])(/* args */);

其中,通过调用evaluate_level[i](&arg)来计算级别i值,而使用derivation_1[i](&arg)derivation_2[i](&arg)来计算一阶/二阶导数。通过增加DERIVATION并重新编译库,可以支持更高阶的导数。
现在,在我的Rust Package 器lib.rs中,我想

  • 知道MAX_LEVEL被设置为5,例如在某处创建一个pub const MAX_LEVEL: u32 = 5;语句;或者具有栅格函数pub fn get_max_level() -> u32 { 5 }
  • 此外,也可以通过设置
#[repr(C)]
pub struct EvaluateArg(/* private fields */);

const DERIVATION: [fn(u32, *mut EvaluateArg); 2] = [/* ... */];

或具有

pub const MAX_DERIVATIONS: u32 = 2;

pub fn derivation_1(level: u32, arg: &mut EvaluateArg);
pub fn derivation_2(level: u32, arg: &mut EvaluateArg);

使用宏或其他方式,例如手动生成代码?
通过以某种特定方式设置build.rs,这是可能的吗?

wrrgggsh

wrrgggsh1#

正如@Caesar在注解中提到的,标准库bindgen将通过clang解析C++头文件,并生成相应的绑定Rust代码。

相关问题