Как установить целевой триплет из ящика в Rust для всей программы?

#rust #rust-cargo

#Ржавчина #rust-груз

Вопрос:

Я изучаю идеи для использования Rust в многоцелевом встроенном проекте.

Текущая идея, которая у меня есть, — иметь ящик для каждого MCU, который у меня есть. Ящик MCU будет содержать реализации для таких вещей, как GPIO, SPI и UART для этого конкретного устройства.

Система должна быть спроектирована таким образом, чтобы ящик MCU можно было заменить на ящик другого MCU, чтобы настроить таргетинг на этот новый MCU. Это также должно быть как можно проще.

Чтобы сделать это переключение прямо сейчас, вам также необходимо изменить файл .cargo/config в исполняемом проекте, из которого запускается сборка самостоятельно. Это превращает переключение в двухэтапный процесс, о котором в какой-то момент забудут.

В принципе, я хочу, чтобы цель ящика применялась ко всей сборке.


Я немного поискал в Интернете, чтобы узнать, было ли это раньше, но либо его там нет, либо мои навыки поиска заканчиваются.

Моя идея заключается в том, что buildscript в ящике MCU может скопировать свои настройки в файл .cargo / config создателя сборки.


Как я представляю, что buildscript может выглядеть (псевдо):

 // 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.

В качестве альтернативы, это может быть отменено. Исполняемый файл мог иметь buildscript, который искал ящик MCU и копировал настройки.


Мои вопросы:

  • Возможно ли это?
  • Разумно ли это?
  • Есть ли лучший способ сделать это?

Комментарии:

1. Может помочь целевая спецификация в phil-opp

Ответ №1:

Если вы беспокоитесь о том, что переключатель конфигурации — это то, «о чем в какой-то момент забудут», вы можете использовать некоторую условную компиляцию, чтобы создать ошибку, если целевой триплет неверен.

например, запустите .lib файл ящика с

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

Тогда переключение ящиков без обновления конфигурации груза вызовет ошибку.

Комментарии:

1. Спасибо, это поможет. Основная проблема, с которой я сталкиваюсь, — это простота переключения. Это не поможет с этим, но поможет убедиться, что переключение было выполнено правильно.