Programovanie Arduino (a derivátov) bez Arduino IDE #3
Prepínať sa do terminálu a spúšťať príkazy kompilácie je otrava. Radšej si to zakomponujeme do iného IDE. A aby to nebolo stále len o Emacse, tak to budem aplikovať v Geany.
Obsah minulej časti + čo je to Makefile?
V minulej časti sme si stručne ukázali, ako využiť arduino-cli na zostavenie a nahratie programu pre (nielen) Arduino z príkazového riadku. S nahrávaním takýmto spôsobom by sme sa ešte zmierili, ale spúšťať kompiláciu, pamätať si čísla riadkov, v ktorých je chyba, a potom tam ručne skákať, to by bol krok späť, s porovnaním s originálnym Arduino IDE. Ani zadávanie celého príkazu nie je pohodlné, hoci aj s využitím histórie shellu. Preto si na to spravíme skript - a hoci by mohol byť aj nejaký klasický bash-ový, využijeme na to tzv. Makefile.
Múdra definícia vraví, že: "Makefile je súbor obsahujúci pravidlá a akcie určené na automatizáciu procesu kompilácie a spustenia programov v rámci vývojového prostredia. Tento súbor definuje závislosti medzi zdrojovými kódmi a objektovými súbormi, ako aj príkazy potrebné na kompiláciu a linkovanie programu. Makefile je často používaný v projektoch napísaných v jazykoch C a C++, ale môže byť použitý aj pre iné programovacie jazyky."
Nevýhodou Makefile je trochu odlišná syntax, ktorá je špecificky navrhnutá na definovanie cieľov a akcií, ktoré majú byť vykonané pri kompilácii projektu. Avšak je možné použiť bash príkazy aj v Makefile súbore, aby sa dosiahla väčšia flexibilita a zložitejšie operácie pri automatizácii kompilácie projektov.
Makefile s využitím arduino-cli
Tak si rovno ukážme, ako taký súbor Makefile vyzerá. Je treba poznamenať, že názov súboru musí byť Makefile, s veľkým "M" na začiatku.

Trochu si to rozoberme:
- PROGRAM ?= $(wildcard ./*.ino) : Vytvoríme si premennú PROGRAM, do ktorej si načítame názov súbor s príponou ino (môže byť len jeden taký súbor v adresári s Makefile, inak ho treba explicitne definovať).
- PORT ?= $(shell ls /dev/ttyACM* | /usr/bin/grep -o '/dev/ttyACM.*') :ttyACM je systémový súborový symbolický odkaz, ktorý sa používa na komunikáciu s USB zariadeniami pripojenými k počítaču cez sériový port (niekedy je to i ttyUSB, ale to som videl hádam iba raz v živote).
- FQBN ?= arduino:avr:uno : Je plný kvalifikovaný názov dosky, ako sme si o ňom hovorili v 2. časti seriálu.
- ARDUINO-CLI-BIN ?= home/richard.arduino15/arduino-cli : Je cesta k binárke arduino-cli.
kompiler-verify ?= $(ARDUINO-CLI-BIN) compile -b
kompiler-verbose ?= $(ARDUINO-CLI-BIN) compile -v -b
kompiler-upload ?= $(ARDUINO-CLI-BIN) upload -v -b
Sú len také pomocné premenné, aby sme nemuseli tie reťazce písať celé v neskorších receptoch. Tie sa totiž konštruujú tak, aby boli ľahko upraviteľné práve zmenami premenných.
all, vebose, upload, fqbn
Sú konkrétne "recepty". To časti kódu, ktoré sa vykonajú, ak zavoláme z príkazového riadku príkaz make.
all: sa vykoná, ak je make bez parametrov, verbose, ak je príkaz make verbose atď.
Zásadná informácia: príkazy v rámci receptov musia byť odsadené tabulátorom. Teda nie medzerami! Dobrý textový editor na to upozorní.
V recepte upload sú tieto zaujímavosti:
- @ pred bash príkazom spôsobí, že sa príkaz vykoná, ale nezobrazí sa samotný príkaz (teda
@echo "Upload >>>"vypíše "Upload >>>", ale nie samotný príkazecho). - Ak je príkaz viacriadkový, ako ten if, tak riadky sú zakončené znakom ; pre oddelenie jednotlivých príkazov v rámci jedného riadku a znakom \ pre pokračovanie príkazu na ďalšom riadku. Týmto zabezpečuje správne vykonanie príkazov v Makefile. Použitie týchto znakov je štandardnou praxou pri písaní Makefile a zvyšuje prehľadnosť a prenositeľnosť kódu.
A ešte:
V Makefile znamená ?= priradenie do premennej, ale iba ak ešte nebola definovaná. Ak premenná už má hodnotu, nedôjde k prepísaniu. Tento operátor je užitočný na definovanie predvolených hodnôt pre premenné v prípade, že by užívateľ nezadal žiadnu hodnotu.
Volanie make z (nejakého) IDE
Osobne používam roky Emacs, ale poznám aj Geany, ktoré je nenáročné, rýchle a má veľa pluginov a podporuje všakovaké jazyky.

Obr. 0: Info o Geany
V nastavení zostavovania, ak už máme otvorený náš ino súbor - menu Zostaviť ⟶ Nastaviť príkazy pre zostavenie si nastavíme príkazy pre Zostavenie (build, build verbose), Nahratie (upload), a duplicitne môžme i Spustenie (tiež upload). Viď obrázok nižšie.

Obr. 1: Nastavenie príkazov pre zostavenie
Ďalším fotkám stačí len komentár. Ešte dodám, že ak nastane pri kompilácii chyba, tak kliknutie na ňu nás teleportuje na príslušný riadok.

Obr. 2: Prebiehajúca kompilácia v spodnej časti obrazovky

Obr. 3: Súbor Makefile v 2. tabe

Obr. 4: Geany bez rušivých prvkov so "zbalenými" funkciami
V iných IDE sa to určite nastavuje nejako obdobne. A určite je možné k tomu nastaviť i klávesovú skratku. Napr. ja som si z čias Turbo Pascal-u a Turbo C zvykol mať F9 na kompiláciu.
Obsah ďalšej časti
V budúcej časti si ukážeme malú odlišnosť pri práci s Rasperry Pi Pico.
Máte aj vy zaujímavú konštrukciu, alebo článok a chceli by ste sa o to podeliť s viac ako 200.000 čitateľmi? Tak neváhajte a dajte nám vedieť, radi ju uverejníme a to vrátane obrazových a video príloh. Rovnako uvítame aj autorov teoretických článkov, či autorov zaujímavých videí z oblasti elektroniky / elektrotechniky.
Kontaktujte nás!
Komentár môžete adresovať buď diskutujúcemu priamo pomocou tlačidla „Odpovedať“, alebo ho môžete adresovať všeobecne do poľa nižšie.