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

Я изучаю идеи использования 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 и копирует настройки.


Мои вопросы:

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

1 Ответ

1 голос
/ 14 мая 2019

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

Например, запуститеcrate .lib file with

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

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

...