Grazie a tutti per le risposte finora date. Mi piace lasciar correre la discussione senza in influenzarla per un certo periodo di tempo, ma ora vi devo un paio di risposte e precisazioni
drGremi ha scritto:Sarei curioso di avere qualche dettaglio in più sul progetto (che si possa rendere pubblico, ma che rimanga anonimo).
Non capisco perché generare del codice sorgente tutto uguale automaticamente, cioè (magari non è così), che forse si potrebbe organizzare meglio il progetto lato firmware (se stiamo parlando di un firmware).
Esempio banale: il memory management delle variabili coinvolte in un progetto embedded. C'è un'entità che si occupa di gestire le variabili che sono "globali" (insomma, a cui accedono piú moduli).
Per ognuna di queste variabili va generato un
getter e un
setter. Va specificato il tipo, vanno definiti i limiti che verranno controllati nel setter, va generato un mapping che permetta allo slave I2C di metterla a disposizione sotto un certo indirizzo. Va specificato se lo slave I2C può solo leggere o anche scrivere. Va generato un meccanismo che permetta ad un callback di registrarsi per una certa variabile e venir quindi chiamato se essa viene modificata.
Tutto ciò risulta in una certa quantità di codice che si ripete con differenze minime per ogni variabile che serve.
Automatizzare questo processo risparmia tempo, semplifica la documentazione (apri il file CSV in Excel e trovi tutto), riduce la probabilità di errori dovuti al centesimo copia-e-incolla e decuplica la mantenibilità.
fairyvilje ha scritto:Secondo me i file generati vanno versionati
Esco allo scoperto. Anche secondo me
ma in un repository separato e solo per un branch specifico del generatore
Qui non sono sicuro. Probabilmente non nuoce, ma si tratta di un progetto a cui lavorano 4 persone e quasi certamente il codice non verrà riciclato altrove.
IlGuru ha scritto:Otterreste n progetti tutti uguali alimentati solo dal generatore di codice.
Non capisco cosa intendi. Il progetto è uno ed è sempre lo stesso. Quando generarne una nuova revisione lo decide lo sviluppatore facendo un commit. Che le differenze siano nel file CSV, in un file autogenerato o in un file scritto a mano, fa poca differenza.
xyz ha scritto:nel repository deve finire solo il codice che genera il software
Sembra una finezza letteraria, ma non lo è: il codice che genera il software è il file C++, non lo script in python o il file CSV. Quindi, se facciamo come dici tu, il file C++ autogenerato va messo sotto version control. Che è esattamente quello che penso anch'io
Dimentichiamoci per un momento di quello che ho scritto e prendiamo utilizzi classici di toolchains molto diffuse: se genero un progetto per un microcontroller STM32, per comodità posso decidere di farlo usando STM32CubeMX. Cosa metto nel repository? Il file IOC usato dal CubeMX, i file C che genera o entrambi?
Non credo che ci sia chi metta in version control solo il file IOC.
(un discorso analogo si può fare per MCUXpresso, se preferite NXP).
fairyvilje ha scritto:A quel punto vuol dire che ogni sviluppatore, che python magari non vuole nemmeno toccarlo, è costretto a gestire in locale una sua distribuzione aggiornata con tutte le librerie rilevanti. Solo per poter usare del codice C++.
Stai descrivendo il mio stato d'animo?
Facciamo un esperimento mentale: questa storia non sta avvenendo ora, ma 10 anni fa e si è deciso di non mettere nel repository i files C++. Un paio di anni dopo c'è stato un release e il software è usato in un prodotto che viene venduto. Oggi un cliente si lamenta di un bug e noi dobbiamo scoprire cosa non funziona.
Mi esporto il repository e scopro che non ci sono tutti i files che mi servono. Mi ricordo che sono generati in automatico, quindi faccio partire python. Sorpresa, era stato scritto in Python 2.6 e serve anche una libreria non piú mantenuta che non so dove trovare... sarò anche una persona con poca pazienza, ma queste cose mi fanno imbestialire.
In questo contesto python va equiparato alla funzione di code completion della IDE.
In questo contesto python non va equiparato al compiler.L'unico problema che vedo nel versionare i file C++ è che può succedere che lo sviluppatore sbadato faccia un commit senza aver prima avviato lo script di generazione, creando così una discrepanza tra file CSV e codice C++.
Ma si può sicuramente risolvere (sto pensando di versionare una checksum in un file separato o di confrontare le date di ultima modifica).
Il tutto viene compilato su un server di continuous integration, quindi abbiamo diverse possibilità in tal senso.
Boiler