2015-09-05 14 views
11

Il dottore dice CMake sul comando file GLOB:Perché il file cmake GLOB è malvagio?

Si consiglia di non utilizzare GLOB di raccogliere un elenco di file di origine dal proprio albero dei sorgenti. Se nessun file CMakeLists.txt cambia quando viene aggiunta o rimossa una sorgente, il sistema di generazione generato non può sapere quando chiedere a CMake di rigenerare.

Diversi thread di discussione nel web in secondo luogo che i file sorgente globbing è il male.

Tuttavia, per rendere il sistema di compilazione sanno che una fonte è stato aggiunto o rimosso, è sufficiente dire

touch CMakeLists.txt 

Destra?

Quindi è meno sforzo di modificare CMakeLists.txt per inserire o eliminare un nome di file di origine. Né è più difficile da ricordare. Quindi non vedo alcun motivo valido per sconsigliare file GLOB.

Cosa c'è di sbagliato in questo argomento?

+1

Vedere anche la discussione [qui] (http://stackoverflow.com/questions/30949452/cmake-ninja-attempting-to-compile-deleted-cpp-file/31183245). Come descritto nella mia risposta, sto usando un approccio misto: elencando tutti i file sorgente nei file 'CMakeLists.txt' (anche perché a volte seleziono manualmente i file di origine per diverse configurazioni di compilazione) e globing per i file di intestazione (per comodità averli nei progetti VS). E ho suggerito una soluzione alternativa per es. 'git' con qualcosa come' configure_file ($ {CMAKE_SOURCE_DIR} /. git/index $ {PROJECT_BINARY_DIR} /git_index.tmp) '. – Florian

risposta

11

Il problema è quando non si è soli a lavorare su un progetto.

Diciamo progetto ha sviluppatore A e B.

Una aggiunge un nuovo file sorgente x.c. Non cambia CMakeLists.txt e si impegna dopo aver completato l'implementazione di x.c.

Ora B fa un git pull, e dal momento che non ci sono stati modifiche al CMakeLists.txt, CMake non è eseguire nuovamente e B hanno errori del linker durante la compilazione, perché x.c non è stato aggiunto alla sua lista file di origine.

+0

Buon punto, grazie. Prima di accettare questa risposta (e magari iniziare a pensare a una soluzione alternativa) lascia che aspetti e veda se ci sono altri problemi. –

+0

Certo, penso che questa sia una domanda abbastanza aperta e che più persone abbiano esperienze da condividere relative al globbing. Purtroppo non conosco una soluzione alternativa, ho avuto un progetto piuttosto grande (> 500 file sorgente) che ho migrato di nuovo alle liste dei file da globbing perché altri sviluppatori si lamentavano sempre che la build si era rotta sulla loro macchina anche se non interruzione sul server CI. –

+1

@ Jean-Michaël Soluzione alternativa n. 1: eseguire cmake dopo git pull (seriamente), soluzione n. 2: nelle 'CMakeLists', scrivere il risultato del globbing in un file (condizionalmente, se non esiste) e metterlo sotto il controllo del codice sorgente. Fai in modo che 'CMakeLists' includa quel file. All'aggiunta di un nuovo file, eliminare il file globresult. –

4

Non è intrinsecamente male - ha vantaggi e svantaggi, coperto relativamente bene in this answer qui su StackOverflow. Ma se lo si utilizza con noncuranza, si potrebbe finire per ignorare le modifiche di dipendenza e richiedere la ricostruzione pulita di ampie parti della base di codice.

Sono personalmente a favore dell'utilizzo di esso - in progetti più piccoli, o in alcune sottodirectory in più grandi - per evitare di dover inserire ogni file manualmente nei file di build. Modifica: La mia preferenza è cambiata e attualmente tendo ad evitarlo.

+1

Ci sono molti casi delicati che in alcuni casi devi fare clean build come unico salvataggio. Non credo che vada bene per i grandi progetti – Fei

+0

@Fei: dipende da cosa stai costruendo. In un progetto di grandi dimensioni, potresti avere globs per piccole parti di esso per cui ha senso, ma certamente non per l'intero progetto. – einpoklum

Problemi correlati