[mod]Compiliamo ricorsivamente con arduino IDE

Ciao,
vi presento la mia ultima creazione, fabbricata in serata mentre guardavo un filmetto (una settimana da dio :grin:)

Partendo dal presupposto che sono pigro, odio vedere mille file .cpp e .h nella mia cartella degli sketch. Sopratutto qunado il progetto inizia a diventare seriamente complesso la situazione si fa critica.
Purtoppo se infili i file .cpp e .h, a meno che non siano in una sotto-cartella "utility", e solo nel caso di librerie nella cartella libraries di distema o della sketcbook, il caro arduino IDE ignorerà completamente codesti file.
Qualcuno si ricorderà che in passato proposi un brutale hack, che in fase di compilazione copiava il contenuto delle sotto-cartelle nella directory principale.
Questo è lo stesso sistema che l'attuale arduino IDE usa per la cartella utility: ciò fa sballare gli include, in pratica anzichè dover fare
#include "utility/file.h"
si fa
#include "file.h"
perchè al momento dela compilazione i file sono in realtà tutti in una cartella temporanea senza sottocartelle.
Ma ciò provoca un grosso problema: se una delle cartelle (solo utility con l'IDE originale) conteneva un file con lo stesso nome di un altro file, allora l'ultimo file copiato sovrascriveva quello di partenza con conseguente errore di compilazione.
Non un grosso problema finchè le cartelle e i file sono pochi, ma pessima idea.

Ora, con la mia nuova modifica, la struttura di cartelle viene mantenta, e si riesce a compilare felicemente il codice.

Certo la include torna ad essere qulle vera, e quindi se usate una libreria come la Wire, Ethernet, SD, WiFi, o una qualsiasi altra libreria che contiene la cartella "utility", dovrete fare attenzione a sistemare tutti gli include. Per tutte le librerie di cui ho parlato, essendo incluse nell'ide, questa modifica è insita nell'IDE, e questo settagio avviene in modo completamente trasparente a tutti gli sketch/librerie che le usano. La stessa cosa non vale per le librerie scaricate, ma sinceramente sono talmente poche e l'errore del compilatore così facilmente riconoscibile che non dovrebbe creare grossi problemi anche ai nuovi arrivati.

visto che stasera ho compilato il codice con siccesso, domani faccio altri due check e faccio la pull-request, ovvero chiedere che la mia patch venga inclusa in una della prossime versione dell'ide.

allego l'unico file da modificare per patchare l'IDE, così per darvi un'idea. Il file si trova in Arduino/app/src/processing/app/debug/Compiler.java, ovviamente per accedervi dovrete scaricare i sorgenti di arduino da git-hub, sostituire il file e compilare l'IDE.
La guida per questa operazione la trovate quì: Google Code Archive - Long-term storage for Google Code Project Hosting. oppure c'è in giro una guida del buon Leo72 se non erro

NOTA BENE: anche se l'IDE è ora in grado di compilare, non è in grado di visualizzare i sorgenti nelle sotto-cartelle. La mia pull-request sarà senza questa feature, che potrebbe richiedere un pò di tempo (devo ancora guardare il codice)

edit: Postato anche sulla board inglese http://arduino.cc/forum/index.php/topic,124176.new.html

Compiler.java (27.8 KB)

Ciao lesto. Scusa se ti chiedo maggiori info ma non ho capito bene la questione della cartella /utility.

Dove sta questa cartella? Cosa contiene di solito? Perchè l'IDE la tratta in maniera così strana?

lesto:
(una settimana da dio :grin:)

Confessa che in realtà era "una settimana da Lesto" :smiley: :grin: :smiley:

Partendo dal presupposto che sono pigro, odio vedere mille file .cpp e .h nella mia cartella degli sketch. Sopratutto qunado il progetto inizia a diventare seriamente complesso la situazione si fa critica.

Sarà che stamattina ho la testa da tutt'altra parte, però non riesco a capire quale sia il tuo problema e perché fai tutto questo sbattimento con la cartella utility ?

la cartella utility è una sottocartella contenuta in alcune librerie, ed attualmente è l'unica sotto-cartella delle librerie NON ignorata in fase di copia dei file nella cartella temporanea da cui avverrà la compialazione. Per esempio la classe Wire ha una cartella utility in cui è contenuta la libreria twi, ovvero l'mplementazione ufficiale del protocollo, la classe Wire non fa altro che prendere questa implementazione a basso livello e usala per fornire un'interfaccia più semplice.

In pratica attualmente la utility contiene "i driver", mentre la sua cartella madre contiene le classi che usiamo con l'IDE. Il suo sfortunato utilizzo e errata gestione secondo me deriva proprio dal fatto di essere un hack per inserire un minimo di organizzazione nella struttura delle librerie.

@astro: lo sbattimento se lo fa l'ide attuale gestendo la cartella utility come caso speciale e ignorando le sotto-cartelle. Tempo fa feci una mod in cui tutte le cartelle fossero gestite come caso speciale. Con questo codice invece ho fatto in modo che tuttle le cartelle siano gestite "secondo standard", ovvero senza alterare la struttura delle cartelle

schematicamente:
prima:

  1. copia .ino, .c, .cpp, .h di tutte le librerie incluse e della cartella sketch in una cartella temporanea senza creare sottocartelle
  2. se NON è la cartella skecth copia anche i .c, .cpp e .h della cartella utility (se presente) nella cartella temporanea senza creare sottocartelle
  3. compila

ora

  1. copia .ino, .c, .cpp, .h di tutte le librerie incluse e della cartella sketch e tutte le loro sottocartelle in una cartella temporanea, creando anche le sottocartelle (quindi struttura delle cartelle inalterata)
  2. compila

vantaggi: se hai una struttura di una libreria complessa, magari perchè fatta con un IDE più "professionale", ora puoi fare tranquillamente copia-incolla nella cartella arduino e creare il file .ino
prima invece avresti dovuto prendere tutti i file delle sottocartelle e metterli direttamente nella cartella skecth, modificando tutti gli include

Insomma è una questionde di compatibilità, quindi di standard, quindi di principio.
All'utente finale non cambia quasi niente, se non che raramente a VECCHIE librerie scaricate bisognerà sistemare l'include, e che le le nuove librerie NON saranno compatibili con la vecchia versione, ma in compenso saranno compatibili con il resto del mondo

Confessa che in realtà era "una settimana da Lesto"

salvo il finesettiamana sarebbe un film assai noioso... maledetto lavoro! dovrei mettere su un'azienda di automatizzazione SW/HW, chissà prima o poi..

Tu dici al punto 2 che non vengono create sottocartelle, ma io vedo che se compilo uno sketch che contiene delle lib, vengono copiate le cartelle delle lib ed al loro interno vengono create le cartelle utility anche se queste non ce l'hanno.
O non ho capito il discorso?

sì, attenzione che io parlo di SOTTO-cartelle delle librerie.

patch inviata! Recursive compilation by lestofante · Pull Request #116 · arduino/Arduino · GitHub