Cmake ricompila tutto ogni volta che aggiungo una nuova sottocartella di origine

Ho un albero del progetto organizzato come segue:

MyProjects/ - build - project1 - CMakeLists.txt | | project2 - CMakeLists.txt | | src - project1 - Project1Class1.h | Project1Class1.cpp | Project1Class2.h | Project1Class2.cpp | more subdirectories ... project2 - Project2Class1.h | Project2Class1.cpp | more subdirectories ... 

Immagina che project2 dipenda da project1. Quindi project2 utilizza direttamente file project1 e non utilizza una libreria project1 statica o dynamic. Quindi project2 / CMakeLists.txt trova i file di origine project1 e project2 e li include attraverso un GLOB_RECURSE:

 file( GLOB_RECURSE source_files ../../project1/ ../../project2/ ) 

Funziona nel senso che crea correttamente i miei progetti.

Ogni volta che aggiungo un nuovo file sorgente in una nuova cartella, ad es. File MyNewFolder / myTest.cpp in src / project2 /, e digita

 ~/MyProjects/build/project2/$ cmake . ~/MyProjects/build/project2/$ make 

Quindi il file viene preso correttamente in considerazione da cmake. Tuttavia, il mio problema è che ogni file viene ricompilato di nuovo.

    Stessa cosa quando cambio un file sorgente in project1 e provo a compilare project2.

    Nota che ho notevolmente semplificato ciò che realmente è nel mio CMakeLists.txt. Quindi la mia domanda è: sulla base di ciò che ho spiegato a riguardo, questo comportamento è ciò che CMake dovrebbe fare? E se sì, quale è la logica alla base di ciò e cosa dovrei fare per make compilare solo il nuovo file? Non ero in grado di trovare alcuna documentazione su Internet.

    Nota: Sentiti libero di discutere l’organizzazione generale dei file di build di origine. Si noti che volevo mantenere la mia configurazione di build separata dalla cartella src /.

    Modifica: ho trovato questo che spiega perché GLOB e GLOB_RECURSE impediscono il suo funzionamento.

    Modifica 2: anche senza GLOB, la compilazione viene eseguita dall’inizio è altri casi (vedi questa domanda)

    Stai osservando il noto effetto collaterale del file(GLOB_RECURSE ...) . Non sono sicuro del motivo per cui ciò stia accadendo, ma per evitare che la maggior parte dei progetti basati su CMake elenchi le loro fonti in modo esplicito:

     set(source_files ../../project1/Project1Class1.cpp ../../project1/Project1Class2.cpp ... ../../project2/Project2Class1.cpp ../../project2/Project2Class1.cpp ... )