Il modo migliore per specificare i file sorgente in CMake è elencarli esplicitamente .
I creatori di CMake stessi consigliano di non usare il globbing.
Vedi: https://cmake.org/cmake/help/v3.15/command/file.html?highlight=glob#file
(Non è consigliabile utilizzare GLOB per raccogliere un elenco di file di origine dall'albero dei sorgenti. Se nessun file CMakeLists.txt cambia quando viene aggiunta o rimossa una fonte, il sistema di generazione generato non può sapere quando chiedere a CMake di rigenerarsi.)
Naturalmente, potresti voler sapere quali sono gli svantaggi: continua a leggere!
Quando Globbing fallisce:
Il grande svantaggio del globbing è che la creazione / eliminazione di file non aggiorna automaticamente il sistema di compilazione.
Se sei la persona che aggiunge i file, questo può sembrare un compromesso accettabile, tuttavia ciò causa problemi ad altre persone che costruiscono il tuo codice, aggiornano il progetto dal controllo della versione, eseguono build, quindi contattano, lamentandoti che
creano il "la build è rotto".
A peggiorare le cose, il fallimento in genere dà qualche errore di collegamento che non fornisce alcun suggerimento per la causa del problema e il tempo viene perso per risolvere il problema.
In un progetto su cui ho lavorato abbiamo iniziato a fare globbing ma abbiamo ricevuto così tante lamentele quando sono stati aggiunti nuovi file, che era una ragione sufficiente per elencare esplicitamente i file invece di globbing.
Ciò interrompe anche i flussi di lavoro comuni di git
( git bisect
e il passaggio tra i rami delle caratteristiche).
Quindi non potrei raccomandarlo, i problemi che causa superano di gran lunga la convenienza, quando qualcuno non può costruire il tuo software per questo motivo, potrebbero perdere molto tempo per rintracciare il problema o semplicemente rinunciare.
E un'altra nota, Ricordare di toccare CMakeLists.txt
non è sempre abbastanza, con build automatizzate che usano il globbing, ho dovuto correre cmake
prima di ogni build poiché i file potrebbero essere stati aggiunti / rimossi dall'ultimo edificio *.
Eccezioni alla regola:
Ci sono momenti in cui è preferibile il globbing:
- Per impostare un
CMakeLists.txt
file per progetti esistenti che non usano CMake.
È un modo veloce per ottenere tutti i sorgenti referenziati (una volta che il sistema di compilazione è in esecuzione - sostituisci globbing con elenchi di file espliciti).
- Quando CMake non viene utilizzato come sistema di compilazione principale , ad esempio se si utilizza un progetto che non utilizza CMake e si desidera mantenere il proprio sistema di compilazione.
- Per ogni situazione in cui l'elenco dei file cambia così spesso che diventa poco pratico da mantenere. In questo caso potrebbe essere utile, ma poi devi accettare l'esecuzione
cmake
per generare file di build ogni volta per ottenere una build affidabile / corretta (che va contro l'intenzione di CMake - la possibilità di dividere la configurazione dalla costruzione) .
* Sì, avrei potuto scrivere un codice per confrontare l'albero dei file sul disco prima e dopo un aggiornamento, ma questa non è una soluzione così piacevole e qualcosa di meglio lasciato al sistema di compilazione.