Pełne ujawnienie: początkowo wolałem podejście globalne ze względu na jego prostotę, ale z biegiem lat zdałem sobie sprawę, że jawne umieszczanie plików na liście jest mniej podatne na błędy w przypadku dużych projektów z udziałem wielu programistów.
Oryginalna odpowiedź:
Zalety globbingu to:
Dodawanie nowych plików jest łatwe, ponieważ są one wymienione tylko w jednym miejscu: na dysku. Brak globowania powoduje duplikację.
Twój plik CMakeLists.txt będzie krótszy. To duży plus, jeśli masz dużo plików. Brak globowania powoduje utratę logiki CMake wśród ogromnych list plików.
Zalety korzystania z list plików zakodowanych na stałe to:
CMake będzie poprawnie śledzić zależności nowego pliku na dysku - jeśli użyjemy globu, wtedy pliki, które nie są globbowane za pierwszym razem po uruchomieniu CMake, nie zostaną pobrane
Upewnij się, że dodawane są tylko żądane pliki. Globbing może zbierać niepotrzebne pliki, których nie chcesz.
Aby obejść pierwszy problem, możesz po prostu „dotknąć” pliku CMakeLists.txt, który wykonuje glob, za pomocą polecenia touch lub pisząc plik bez zmian. Zmusi to CMake do ponownego uruchomienia i pobrania nowego pliku.
Aby rozwiązać drugi problem, możesz ostrożnie zorganizować swój kod w katalogach, co i tak prawdopodobnie robisz. W najgorszym przypadku możesz użyć list(REMOVE_ITEM)
polecenia, aby wyczyścić globbed listę plików:
file(GLOB to_remove file_to_remove.cpp)
list(REMOVE_ITEM list ${to_remove})
Jedyną realną sytuacją, w której może to cię ugryźć, jest użycie czegoś takiego jak git-bisect, aby wypróbować starsze wersje swojego kodu w tym samym katalogu kompilacji. W takim przypadku może być konieczne wyczyszczenie i skompilowanie więcej niż to konieczne, aby zapewnić uzyskanie odpowiednich plików na liście. To taka narożna sprawa i taka, w której już jesteś na palcach, że tak naprawdę nie stanowi problemu.
Simply "touch" the CMakeLists.txt
jest OK, jeśli jesteś programistą, ale dla innych tworzących oprogramowanie może być naprawdę problem, że twoja kompilacja nie powiedzie się po aktualizacji i na nich spoczywa ciężar zbadania czemu.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
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:
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).
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.
źródło
W CMake 3.12 polecenia
file(GLOB ...)
ifile(GLOB_RECURSE ...)
zyskałyCONFIGURE_DEPENDS
opcję, która ponownie uruchamia cmake, jeśli zmieni się wartość globu. Ponieważ była to główna wada globbingu dla plików źródłowych, teraz można to zrobić:Jednak niektórzy ludzie nadal zalecają unikanie globbingu dla źródeł. Rzeczywiście, dokumentacja stwierdza:
Osobiście uważam, że korzyści wynikające z braku konieczności ręcznego zarządzania listą plików źródłowych przeważają nad możliwymi wadami. Jeśli musisz przełączyć się z powrotem na ręcznie wymienione pliki, można to łatwo osiągnąć, po prostu drukując listę źródeł globbed i wklejając ją z powrotem.
źródło
Możesz bezpiecznie globować (i prawdopodobnie powinieneś) kosztem dodatkowego pliku do przechowywania zależności.
Dodaj gdzieś takie funkcje:
A potem przejdź do globu:
Nadal poruszasz się po jawnych zależnościach (i uruchamiasz wszystkie automatyczne kompilacje!), Jak poprzednio, tylko w dwóch plikach zamiast w jednym.
Jedyna zmiana w procedurze następuje po utworzeniu nowego pliku. Jeśli tego nie zrobisz, przepływ pracy polega na zmodyfikowaniu CMakeLists.txt z poziomu programu Visual Studio i ponownym skompilowaniu, jeśli wykonujesz glob, uruchamiasz cmake jawnie - lub po prostu dotykasz CMakeLists.txt.
źródło
make
podaje dziwne błędy linkera.Określ każdy plik indywidualnie!
Używam konwencjonalnego CMakeLists.txt i skryptu w Pythonie, aby go zaktualizować. Po dodaniu plików uruchamiam skrypt Pythona ręcznie.
Zobacz moją odpowiedź tutaj: https://stackoverflow.com/a/48318388/3929196
źródło