如何从 Rust 中的板条箱中为整个程序设置目标三元组?



我正在探索在多目标嵌入式项目中使用 Rust 的想法。

我目前的想法是为每个MCU都有一个板条箱。MCU板条箱将包含该特定设备的GPIO,SPI和UART等实现。

系统的设计应使MCU板条箱可以换成另一个MCU的板条箱,以针对该新MCU。它也应该尽可能简单。

要立即进行该切换,您还需要更改自己开始构建的可执行项目中的 .cargo/config 文件。这使得切换成为一个两步过程,在某些时候会被遗忘。

基本上,我希望板条箱的目标适用于整个构建。


我已经在网上搜索了一些,看看它以前是否存在过,但要么它不存在,要么我的搜索技能不足。

我的想法是,MCU 板条箱中的构建脚本可以将其设置复制到构建实例化的 .cargo/config 文件中。


我想象构建脚本可能是什么样子(伪):

// Open the config file of the directory from which the build is done
dir = build_dir
config_file = open_or_create(dir + .cargo/config)
// Read the target of our own crate
my_target = open(.cargo/config).get_option(option: target)
// Set the target in the config file of the source
config_file.add_or_replace_option(option: target, value: my_target)

有了这样的东西,切换到不同的MCU将非常容易。只需更改 toml 文件中的依赖项即可。

或者,可以颠倒过来。可执行文件可能有一个构建脚本,该脚本查找MCU板条箱并复制设置。


我的问题:

  • 这可能吗?
  • 这合理吗?
  • 有没有更好的方法?

如果您担心配置开关是"在某个时候会被遗忘"的东西,那么如果目标三元组错误,您可以使用一些条件编译来创建错误。

例如,启动板条箱.lib文件

#[cfg(not(all(target_arch="...",...)))]
compile_error!("rustc is not correctly configured for this crate - the correct triple is ...");

然后切换板条箱而不更新货物配置将引发错误。

相关内容

最新更新