Indicare percorso alternativo di una libreria

C'e da aggiungere che l'ide Arduino in fase di compilazione le librerie le ficca tutte a spanello insieme, pertanto un include in un progetto Arduino non conterrà mai il path, ma solo il nome della libreria.
La cosa importante da sapere è su quali percorsi e con che precedenza vengono cercate le librerie.

ah già, quindi tutto il discorso <> e "" viene a decadere perchè tanto arduino fa un bel minestone di tutto!

niki77:
C'e da aggiungere che l'ide Arduino in fase di compilazione le librerie le ficca tutte a spanello insieme,

Vero. Basta aprire un progetto e compilarlo, e poi andare a vedere nella cartella temporanea che gran calderone è stato creato :stuck_out_tongue_closed_eyes:

ho già fatto la pull request per sistemare il fatto e rendere l'IDE compatibile con il vero C, il bello è che non ho praticamente mai visto librerie "custom" che usano la cartella "utility", e quindi il passaggio sarebbe trasparente all'utente finale, salvo rarissimi casi.

Invece ci sono 4 librerie standard dell'ide che bisogna aggiornare, ma anche in questo caso sono modifiche interne e quindi completamente trasparenti all'utente. Se volete rompere un pò le balle: Recursive compilation by lestofante · Pull Request #116 · arduino/Arduino · GitHub

Ciao lesto, hai effettuato le modifiche in oggetto?
Io l'ho fatto già da tempo ed ho riscontrato che comunque continuando ad usarle dall'ide originale quest'utlimo continua a compilare regolarmente.
Pensandoci bene mi è venuto pensato che questo comportamento però è un pò strano.
Tu che dici?

cioè modificando gli include per usare le sottocartelle la compilazione va a buon fine? questa è black magic :slight_smile:
non so, se mi dici c he è così provo a darci un'occhiata.

Esattamente, come ti hod etto tempo fà, io uso eclipse al momento per arduino, e ho dovuto CORREGGERE i puntamenti degli include di alcune librerie, perchè sennò non compilava (ovviamente).
Il punto è che mi sono accorto che compilando nuovamente i vecchi progetti nell'ide originale (che utilizza le librerie con gli include modificati) queste vengono compilate correttamente.
Comunque ho notato che a seguito di compilazione su ide originale, nella cartella temporanea (.build) vengono incluse come al solito le librerie del core a spanello e vengono incluse anche le librerie esterne compilate (tipo ethernet eeprom e spi) con tutta la loro cartellina mantenendo la struttura originale.
Chizza che casso di ragionamenti fà l'ide in questo caso :grin:
Mistero della fede!

leo72:
Vero. Basta aprire un progetto e compilarlo, e poi andare a vedere nella cartella temporanea che gran calderone è stato creato :stuck_out_tongue_closed_eyes:

Nella cartella temporanea ci vanno a finire tutti gli stadi intermedi della compilazione, non c'è nulla di strano, tutti i compilatori usano una cartella d'appoggio per questa cosa oppure lo fanno nella cartella del progetto se non è stato specificata una cartella dedicata.

I file intermedi è normale, ma in questo caso ci ficca pure i sorgenti del core.
Manon è questo il problema , quello che non si capisce è come fà a compilare indistintamente le librerie esterne sia esse abbiano gli include in formato originale (cosi come rilasciate da arduino) sia con gli include modificati(con percorsi relativi corretti).

niki77:
I file intermedi è normale, ma in questo caso ci ficca pure i sorgenti del core,

No ci mette solo gli obj, e gli .elf, dei vari sorgenti usati durante la compilazione, ed è normale che sia così, forse ti fai ingannare dal fatto che vedi i nomi scritti come miofile.cpp.o .

quello che non si capisce è come fà a compilare indistintamente le librerie esterne sia esse abbiano gli include in formato originale (cosi come rilasciate da arduino) sia con gli include modificati(con percorsi relativi corretti).

Perchè l'IDE fa un override delle impostazioni di defult del compilatore e specifica lui i percorsi da usare.

L'IDE fa un gran bel casino. Compilando un programma ti ritrovi i sorgenti .cpp tutti copiati nella cartella /build, poi crea una cartella per ogni libreria inclusa, dentro ci mette una cartella /utility e dentro... non ci sono né header né i file cpp della libreria! :stuck_out_tongue_closed_eyes:

astrobeed:

niki77:
I file intermedi è normale, ma in questo caso ci ficca pure i sorgenti del core,

No ci mette solo gli obj, e gli .elf, dei vari sorgenti usati durante la compilazione, ed è normale che sia così, forse ti fai ingannare dal fatto che vedi i nomi scritti come miofile.cpp.o .

nono, copia i sorgenti veri e propri in .cpp e .h, li puoi aprire e modificare (tra l'altro se vedi la issue che ho postato vedi che le istruzioni sono proprio di COPIA dei file e preparazione dell'elenco di path da dare al compilatore), in oltre prima di fare questa copia ha già letto l'INO e copia-incollato in un apposito cpp. quindi a quel punto nella cartella temp di build hai i sorgenti pronti, viene chiamato avr-gcc e poi avrdude

lesto:
nono, copia i sorgenti veri e propri in .cpp e .h, li puoi aprire e modificare

strano, da me su IDE 1.0.2 per Windows (anche nel 1.0.1) nel log di compilazione dice

avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=102 -ID:\Programmi\Arduino\arduino-1.0.2\hardware\arduino\cores\arduino -ID:\Programmi\Arduino\arduino-1.0.2\hardware\arduino\variants\standard -ID:\Programmi\Arduino\arduino-1.0.2\libraries\Wire -ID:\Dropbox\Progetti\Arduino\Sketchbook\libraries\DS1307new -ID:\Dropbox\Progetti\Arduino\Sketchbook\libraries\LedControl -ID:\Programmi\Arduino\arduino-1.0.2\libraries\Wire\utility D:\Programmi\Arduino\arduino-1.0.2\libraries\Wire\Wire.cpp -o C:\Users\Daniele\AppData\Local\Temp\build5837474537041180748.tmp\Wire\Wire.cpp.o

e così per tutte le lib e per il core, infatti nella cartella temporanea nnon c'è traccia dei sorgenti, apparte quello dello sketch generato dall'ide ovviamente.

hai ragione, non copia i sorgenti delle librerie ma solo i sorgenti contenuti nella cartella dello sketch (tranne l'INO a cui viene aggiunto un #include "Arduino.h" e rinominato in .cpp

Ma l'include della libreria Arduino.h non è già nel main.cpp?

#include <Arduino.h>

int main(void)
{
	init();

#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        return 0;
}

Come e cosa faccia l'ide non te lo so dire con esattezza.

Io generalmente gli include li metto tutti nel file H, e nel file cpp metto solo l'inclusione al suo header.
Lo trovo più ordinato, ma ho visto che comunque non tutti utilizzano questa convenzione e mi sono ritrovato tanti progetti con gli include sparsi anche per il file cpp.

PaoloP:
Ma l'include della libreria Arduino.h non è già nel main.cpp?

#include <Arduino.h>

int main(void)
{
init();

#if defined(USBCON)
USBDevice.attach();
#endif

setup();

for (;:wink: {
loop();
if (serialEventRun) serialEventRun();
}
        return 0;
}

non ho controllato ben, non mi stupirei se il .cpp che dico io non è altro che il copia-incolla del main.cpp del file .ino, che viene sucessivamente rinominato in .cpp
Dovrei dare un'occhio al codice dell'ide

da quello che ho visto indagando un po' mi pare che l'IDE unisca tutti i file .ino dello sketch corrente in un unico file cpp chiamato col nome dello sketch.
Per primo copia il file ino "principale", cioè quello col nome dello sketch, poi tutti gli altri in ordine alfabetico.
Eventuali altri file nel progetto (che compaiono nele tab nell'IDE) che non sono file .ino (quindi anche gli header .h) vengono copiati nella cartella finale senza essere uniti.

Poi l'ide aggiunge all'inizio di questo file .cpp l'include di Arduino.h e tutti i prototipi delle funzioni dichiarate al suo interno (cioè tutte quelle all'interno dei vari file .ino)

Infine compila il core, il file cpp appena creato e linka il tutto, usando come include directories quelle delle varie librerie usate e del core.

La funzione main non viene inclusa direttamente nel file creato, ma viene compilata nel core (la si trova in main.cpp mi pare).
Quando alla fine viene linkato tutto insieme verrà usata come entry point.

ok, sì, direi che ci siamo, manca solo laconferma dal codice IDE