Ядра Arduino сторонних производителей

Я пытаюсь использовать Arduino platform.txt для выполнения дополнительной предварительной обработки моих кодов Arduino.

Насколько я понимаю, лучший способ сделать это — использовать готовые хуки, как указано ниже. https://github.com/arduino/arduino/wiki/arduino-ide-1.5-3rd-party-hardware-specification

Я использую крючки следующим образом

recipe.hooks.sketch.prebuild.1.pattern=echo {source_file} sketch pret;
recipe.hooks.sketch.prebuild.2.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"

Вот что я получаю на выходе для хуков

echo "{source_file}" sketch pret;
{source_file} sketch pret;
"/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avr-gcc" -c -g -Os -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10804 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   {includes} "{source_file}" -o "{object_file}"
avr-gcc: error: {includes}: No such file or directory
avr-gcc: error: {source_file}: No such file or directory
avr-gcc: fatal error: no input files
compilation terminated.

Переменная {source_file} используется в рецепте компиляции следующим образом

recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"

и рецепт выглядит следующим образом

"/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10804 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino" "-I/Users/vinayakjoshi/Library/Arduino15/packages/boltiot/hardware/avr/1.0.0/variants/boltduino" "-I/Users/vinayakjoshi/Documents/Arduino/libraries/boltiot-arduino-helper-update-dev/src" "-I/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/libraries/SoftwareSerial/src" "/var/folders/kp/9gnp402j7_nfb1qpqpdkxgcr0000gn/T/arduino_build_658970/sketch/CommandHandler.ino.cpp" -o "/var/folders/kp/9gnp402j7_nfb1qpqpdkxgcr0000gn/T/arduino_build_658970/sketch/CommandHandler.ino.cpp.o"

Как видите, в стандартном рецепте переменная {source_file} и другие подобные определения заменяются правильно. Но в хуках этого не происходит.

Я хочу узнать, возможно ли получить значение переменной {source_file} для использования с хуками, чтобы я мог выполнить с ним дополнительную предварительную обработку. И если да, то как это сделать.

P.S. IDK, какой тег нужно использовать. Я не смог найти platform.txt или сторонние ядра. Я использовал тег Arduino-IDE, так как этот вопрос определенно спрашивает, как работает IDE.

, 👍1


1 ответ


Лучший ответ:

2

Похоже, эти свойства расширены только в:

  • recipe.cpp.o.pattern
  • recipe.Sopattern
  • recipe.copattern
  • recipe.preproc.includes
  • recipe.preproc.macros

Они не расширяются ни в одном из рецептов крючков.

Это на самом деле имеет смысл для {source_file} с текущей системой сборки, потому что хуки не запускаются до и после компиляции каждого файла, а скорее до и после компиляции всего скетча, поэтому даже если это свойство было расширено, оно могло бы дать вам только произвольное имя файла, возможно, первый файл, который будет скомпилирован в хуке prebuild, и последний в хуке postbuild, но это оставляет все остальные имена файлов недоступными, так что это действительно не принесет много пользы. См. отчет о связанной проблеме.

Если вы на самом деле пытаетесь использовать {source_file} для получения предварительно обработанного файла эскиза, то он доступен из любого рецепта как {build.path}/sketch/{build.project_name}.cpp.

Что касается {includes}, то это кажется излишним ограничением для этого свойства, чтобы оно расширялось только в определенных рецептах. Если вы можете представить веские доводы в пользу изменения этого поведения, возможно, стоит открыть запрос на функцию, чтобы посмотреть, что подумают разработчики Arduino.

,