Per iniziare

Questa guida descrive passo dopo passo come configurare il controllo di versione, ottenere e compilare una copia del codice sorgente per un port, creare la documentazione, eseguire i test e fornisce una descrizione della struttura delle directory del codice base di MicroPython.

Controllo del codice sorgente con git

MicroPython è ospitato su GitHub e utilizza Git per il controllo del codice sorgente. Il flusso di lavoro prevede che il codice venga prelevato e inviato da e verso il repository principale. Installa la versione di Git adatta al tuo sistema operativo per seguire i passaggi successivi.

Nota

Per i dettagli sulle istruzioni di installazione, consulta le istruzioni di installazione di Git. Scopri i comandi git di base in questo Git Handbook o in qualunque altra fonte presente in internet.

Nota

È incluso un file .git-blame-ignore-revs che evita che l’output di git blame venga ingombrato da commit dedicati alla sola formattazione del codice ma privi di modifiche funzionali. Consulta la documentazione di git blame per sapere come utilizzarlo.

Ottenere il codice

È consigliabile mantenere un fork del repository MicroPython per i tuoi scopi di sviluppo. La procedura per ottenere il codice sorgente comprende i seguenti passaggi:

  1. Esegui il fork del repository https://github.com/micropython/micropython

  2. Ora avrai un fork all’indirizzo <https://github.com/<your-user-name>/micropython>.

  3. Clona il repository forkato utilizzando il seguente comando:

$ git clone https://github.com/<your-user-name>/micropython

Quindi, configura i repository remoti per poter collaborare al progetto MicroPython.

Configura l’upstream remoto:

$ cd micropython
$ git remote add upstream https://github.com/micropython/micropython

È prassi comune configurare upstream e origin su un repository forkato per facilitare la condivisione delle modifiche al codice. Puoi mantenere la tua mappatura, ma è consigliabile che origin punti al tuo fork e upstream al repository principale di MicroPython.

Dopo la configurazione descritta sopra, la tua impostazione dovrebbe essere simile a questa:

$ git remote -v
origin       https://github.com/<your-user-name>/micropython (fetch)
origin       https://github.com/<your-user-name>/micropython (push)
upstream     https://github.com/micropython/micropython (fetch)
upstream     https://github.com/micropython/micropython (push)

Ora dovresti avere una copia del codice sorgente. Per impostazione predefinita, ti trovi sul branch master. Per prepararti allo sviluppo successivo, è consigliabile lavorare su un branch di sviluppo.

$ git checkout -b dev-branch

Puoi dargli un nome qualsiasi. Dovrai ricompilare MicroPython ogni volta che passi a un branch diverso.

Compilare e creare il codice

Quando compili MicroPython, compili un port specifico, di solito destinato a una determinata board. Inizia installando le dipendenze richieste. Quindi compila il cross-compiler di MicroPython prima di poter compilare e creare il codice con successo. Questo vale in particolare quando si usa Linux per la compilazione. Le istruzioni per Windows sono fornite in una sezione successiva.

Dipendenze richieste

Installa le dipendenze richieste per Linux:

$ sudo apt-get install build-essential libffi-dev git pkg-config

Per il port stm32 è richiesto il cross-compiler ARM:

$ sudo apt-get install gcc-arm-none-eabi libnewlib-arm-none-eabi

Consulta la toolchain ARM GCC per i dettagli più recenti.

È richiesto anche Python 3. Verifica di avere Python disponibile sul tuo sistema:

$ python3
Python 3.5.0 (default, Jul 17 2020, 14:04:10)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

Tutti i port supportati hanno diversi requisiti di dipendenza; consulta i rispettivi file readme.

Compilare il cross-compiler di MicroPython

Quasi tutti i port richiedono di compilare prima mpy-cross per eseguire la pre-compilazione del codice Python che verrà incluso nel firmware del port:

$ cd mpy-cross
$ make

Nota

Nota che mpy-cross deve essere compilato per l’architettura host e non per l’architettura di destinazione.

Se la compilazione è andata a buon fine, dovresti vedere un messaggio simile a questo:

LINK mpy-cross
   text          data    bss     dec     hex filename
 279328          776     880  280984   44998 mpy-cross

Nota

Usa make -C mpy-cross per compilare il cross-compiler in un’unica istruzione senza spostarti nella directory mpy-cross; in caso contrario dovrai eseguire cd .. per i passaggi successivi.

Compilare il port Unix di MicroPython

Il port Unix è una versione di MicroPython che gira su Linux, macOS e altri sistemi operativi simili a Unix. È estremamente utile per sviluppare MicroPython perché evita di dover distribuire il codice su un dispositivo per testarlo. In molti aspetti funziona in modo molto simile al binario python di CPython.

Per compilare il port Unix, assicurati che tutte le dipendenze relative a Linux siano installate come descritto nella sezione dedicata alle dipendenze richieste. Consulta Dipendenze richieste per assicurarti che tutte le dipendenze per questo port siano installate. Inoltre, assicurati di avere un ambiente funzionante per gcc e GNU make. Per l’esempio seguente è stato usato Ubuntu 20.04, ma altri sistemi unix dovrebbero funzionare con poche modifiche:

$ gcc --version
gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

quindi compila:

$ cd ports/unix
$ make submodules
$ make

Se MicroPython è stato compilato correttamente, dovresti vedere quanto segue:

LINK micropython
   text         data     bss     dec     hex filename
 412033         5680    2496  420209   66971 micropython

Ora eseguilo:

$ ./micropython
MicroPython v1.13-38-gc67012d-dirty on 2020-09-13; linux version
Use Ctrl-D to exit, Ctrl-E for paste mode
>>> print("hello world")
hello world
>>>

Compilare il port Windows

Il port Windows include un file di progetto di Visual Studio micropython.vcxproj che puoi usare per compilare micropython.exe. Può essere aperto in Visual Studio o compilato da riga di comando usando msbuild. In alternativa, può essere compilato usando mingw, sia in Windows con Cygwin, sia su Linux. Consulta la documentazione del port Windows per ulteriori informazioni.

Compilare il port STM32

Come per il port Unix, devi installare alcune dipendenze richieste come descritto nella sezione Dipendenze richieste, quindi compilare:

$ cd ports/stm32
$ make submodules
$ make

Consulta la documentazione stm32 per maggiori dettagli sul flashing del firmware.

Nota

Consulta Dipendenze richieste per assicurarti che tutte le dipendenze per questo port siano installate. È necessario il cross-compiler. Anche arm-none-eabi-gcc deve essere nel $PATH oppure specificato manualmente tramite CROSS_COMPILE, sia impostando la variabile d’ambiente sia negli argomenti della riga di comando di make.

Puoi anche specificare quale board utilizzare:

$ cd ports/stm32
$ make BOARD=<board> submodules
$ make BOARD=<board>

Consulta ports/stm32/boards per le board disponibili, ad esempio «OPENMV4» o «OPENMV4P».

Compilare la documentazione

La documentazione di MicroPython viene creata utilizzando Sphinx. Se hai già installato Python, installa Sphinx usando pip. È consigliabile utilizzare un ambiente virtuale:

$ python3 -m venv env
$ source env/bin/activate
$ pip install -r docs/requirements.txt

Spostati nella directory docs:

$ cd docs

Compila la documentazione:

$ make html

Apri docs/build/html/index.html nel tuo browser per visualizzare la documentazione in locale. Consulta la documentazione su come importare la tua documentazione per usare Read the Docs.

Eseguire i test

Per eseguire tutti i test della suite di test sul port Unix usa:

$ cd ports/unix
$ make test

Per eseguire una selezione di test su una board/dispositivo connesso tramite USB usa:

$ cd tests
$ ./run-tests.py -t /dev/ttyACM0

Vedi anche Scrittura dei test.

Target make aggiuntivi per gli sviluppatori

In tutti i port basati su make esiste un target per stampare la dimensione di un file oggetto specifico. Quando una modifica è circoscritta a un singolo file, questo è utile per testare varianti e trovare alternative più piccole.

Ad esempio, per stampare la dimensione di objstr.o nella directory py/ quando si esegue una build standard unix:

$ make build-standard/py/objstr.sz

Analogamente, esiste un target per salvare la versione preprocessata di un file:

$ make build-standard/py/objstr.pp

In ports/unix ci sono target aggiuntivi relativi all’esecuzione dei test:

$ make test//int       # Run all tests matching the pattern "int"
$ make test/ports/unix # Run all tests in ports/unix
$ make test-failures   # Re-run only the failed tests
$ make print-failures  # print the differences for failed tests
$ make clean-failures  # delete the .exp and .out files from failed tests

Usare ci.sh in locale

MicroPython utilizza GitHub Actions per l’integrazione continua. Per ridurre la dipendenza da un sistema di CI specifico, i passaggi di build effettivi per le build basate su Unix si trovano nel file tools/ci.sh. Questo può essere usato anche come script sui desktop degli sviluppatori, con alcune avvertenze:

  • Per la maggior parte dei passaggi si presuppone un sistema Ubuntu/Debian simile a quello usato durante la CI.

  • Alcuni passaggi specifici presuppongono versioni specifiche di Ubuntu.

  • I passaggi di configurazione possono richiamare il gestore di pacchetti del sistema per installare pacchetti, scaricare e installare software da internet, ecc.

Per ottenere un messaggio d’uso che include l’elenco dei comandi, esegui:

$ tools/ci.sh --help

Ad esempio, puoi compilare e testare il port unix minimal con:

$ tools/ci.sh unix_minimal_build unix_minimal_run_tests

Se usi la shell bash, puoi aggiungere un comando ci con il completamento tramite tab:

$ eval $(tools/ci.sh --bash-completion)

Per la shell zsh, sostituisci --bash-completion con --zsh-completion. Per la shell fish, sostituisci --bash-completion con --fish-completion.

Quindi, digitando:

$ ci unix_cov<tab>

Questo completerà il nome del passaggio ci in unix_coverage_. Premendo tab una seconda volta verrà mostrato l’elenco dei passaggi corrispondenti:

$ ci unix_coverage_<tab>
unix_coverage_32bit_build
unix_coverage_32bit_run_native_mpy_tests…

Struttura delle cartelle

Ci sono alcune directory da tenere a mente per quanto riguarda la posizione di determinati dettagli implementativi. Di seguito è riportata una suddivisione delle cartelle di primo livello nel codice sorgente.

py

Contiene il compilatore, il runtime e l’implementazione della libreria principale.

mpy-cross

Contiene il cross-compiler di MicroPython che pre-compila gli script Python in bytecode.

ports

Codice per tutte le versioni di MicroPython per i port supportati.

lib

Librerie C di basso livello usate da qualsiasi port, per lo più librerie di terze parti.

drivers

Contiene i driver per hardware specifico, progettati per funzionare su più port.

extmod

Contiene un’implementazione in C di altri moduli non principali.

docs

Contiene la documentazione standard disponibile su https://docs.micropython.org/.

tests

Un’implementazione della suite di test.

tools

Contiene gli script usati dai processi di build e CI, nonché strumenti per l’utente come mpremote.

examples

Codice di esempio per compilare MicroPython come libreria e come moduli nativi.