Najlepszym sposobem określenia plików źródłowych w CMake jest jawne ich podanie .
Twórcy CMake sami doradzają nie do użycia masek.
Zobacz: https://cmake.org/cmake/help/v3.15/command/file.html?highlight=glob#file
(Nie zalecamy używania GLOB do zbierania listy plików źródłowych z twojego drzewa źródłowego. Jeśli żaden plik CMakeLists.txt nie zmienia się po dodaniu lub usunięciu źródła, wówczas wygenerowany system kompilacji nie może wiedzieć, kiedy poprosić CMake o ponowne wygenerowanie).
Oczywiście możesz chcieć wiedzieć, jakie są wady - czytaj dalej!
Kiedy globbing się nie powiedzie:
Dużą wadą globbingu jest to, że tworzenie / usuwanie plików nie aktualizuje automatycznie systemu kompilacji.
Jeśli jesteś osobą dodającą pliki, może się to wydawać akceptowalnym kompromisem, jednak powoduje to problemy dla innych osób budujących Twój kod, aktualizują projekt z poziomu kontroli wersji, uruchamiają kompilację, a następnie kontaktują się z tobą, narzekając, że
„kompilacja złamany".
Co gorsza, awaria zazwyczaj powoduje błąd łączenia, który nie daje żadnych wskazówek co do przyczyny problemu, a jego rozwiązanie jest tracone.
W projekcie, nad którym pracowałem, zaczęliśmy od globowania, ale otrzymywaliśmy tak wiele skarg, gdy dodawano nowe pliki, że był to wystarczający powód, aby wyraźnie wyświetlić listę plików zamiast globowania.
To również łamie typowe przepływy pracy git
(git bisect
i przełączanie między gałęziami funkcji).
Więc nie mogłem tego polecić, problemy, które powoduje, znacznie przewyższają wygodę, kiedy ktoś nie może z tego powodu zbudować twojego oprogramowania, może stracić dużo czasu na wyśledzenie problemu lub po prostu się poddać.
I jeszcze jedna uwaga, samo pamiętanie o dotknięciu CMakeLists.txt
nie zawsze wystarcza, przy automatycznych kompilacjach, które używają globbingu, musiałem uruchamiać cmake
przed każdą kompilacją od plików mogły zostać dodane / usunięte od ostatniego budowania *.
Wyjątki od reguły:
Są chwile, kiedy globbing jest lepszy:
- Do konfigurowania
CMakeLists.txt
plików dla istniejących projektów, które nie używają CMake.
Jest to szybki sposób na uzyskanie wszystkich źródeł, do których się odwołujemy (po uruchomieniu systemu budowania - zamień globbing na jawne listy plików).
- Gdy CMake nie jest używany jako podstawowy system kompilacji, jeśli na przykład używasz projektu, który nie używa CMake, i chcesz utrzymywać dla niego własny system kompilacji.
- W każdej sytuacji, w której lista plików zmienia się tak często, że jej utrzymanie staje się niepraktyczne. W tym przypadku może to być przydatne, ale wtedy musisz zaakceptować uruchamianie w
cmake
celu generowania plików kompilacji za każdym razem, aby uzyskać niezawodną / poprawną kompilację (co jest sprzeczne z intencją CMake - możliwością oddzielenia konfiguracji od kompilacji ) .
* Tak, mogłem napisać kod porównujący drzewo plików na dysku przed i po aktualizacji, ale nie jest to takie przyjemne obejście i coś lepiej pozostawić systemowi kompilacji.