Rozważam przejście projektu wieloplatformowego z oddzielnych systemów zarządzania kompilacją w Visual C ++, XCode i makefile na CMake.
Jedną z podstawowych funkcji, których potrzebuję, jest automatyczne dodawanie wszystkich plików w katalogu do celu. Chociaż jest to łatwe do zrobienia w make, nie jest to łatwe do wykonania w Visual C ++ i XCode (popraw mnie, jeśli się mylę). Czy można to zrobić bezpośrednio w CMake? W jaki sposób?
c++
cross-platform
cmake
martjno
źródło
źródło
Odpowiedzi:
To jest możliwe. Np. Z
file(GLOB
:Zauważ, że wymaga to ręcznego ponownego uruchomienia,
cmake
jeśli plik źródłowy zostanie dodany lub usunięty, ponieważ wygenerowany system kompilacji nie wie, kiedy poprosić CMake o ponowne wygenerowanie, a robienie tego przy każdej kompilacji wydłuży czas kompilacji.źródło
GLOB
:file(GLOB_RECURSE variable [RELATIVE path] [FOLLOW_SYMLINKS] [globbing expressions]...)
.Odpowiedź Kleista z pewnością działa, ale jest ważne zastrzeżenie:
Kiedy piszesz
Makefile
ręcznie, możesz wygenerowaćSRCS
zmienną za pomocą funkcji zaznaczania wszystkich plików.cpp
i.h
. Jeśli plik źródłowy zostanie później dodany, ponowne uruchomieniemake
będzie go zawierać.Jednak CMake (z poleceniem takim jak
file(GLOB ...)
) jawnie wygeneruje listę plików i umieści ją w automatycznie generowanym plikuMakefile
. Jeśli masz nowy plik źródłowy, będziesz musiał ponownie wygenerować plikMakefile
przez ponowne uruchomieniecmake
.edycja: nie ma potrzeby usuwania pliku Makefile.
źródło
Rozszerzenie dla odpowiedzi @Kleist :
Od CMake 3.12 dodatkowa opcja CONFIGURE_DEPENDS jest obsługiwana przez polecenia
file(GLOB)
ifile(GLOB_RECURSE)
. Dzięki tej opcji nie ma potrzeby do ręcznie ponownie uruchomić CMake Po dodaniu / usunięciu pliku źródłowego w katalogu - CUpewnij zostanie ponownie uruchomiony automatycznie na następny budowania projektu.Jednak opcja CONFIGURE_DEPENDS oznacza, że odpowiedni katalog będzie ponownie sprawdzany za każdym razem, gdy zażądane jest zbudowanie, więc proces budowania zajmie więcej czasu niż bez CONFIGURE_DEPENDS .
Nawet z dostępną opcją CONFIGURE_DEPENDS, dokumentacja CMake nadal nie zaleca używania
file(GLOB)
anifile(GLOB_RECURSE)
do zbierania źródeł.źródło
file(GLOB)
anifile(GLOB_RECURSE)
zbierania źródeł”. Co zatem zalecają? Używasz czegoś innego do zbierania źródeł lub ręcznego wyświetlania każdego pliku źródłowego?Dlaczego więc nie skorzystać z PowerShell, aby utworzyć listę plików źródłowych? Spójrz na ten skrypt
Załóżmy, że masz folder o takiej strukturze
Teraz zapisz ten plik na przykład jako „generationSourceList.ps1” i uruchom skrypt jako
Plik out.txt będzie zawierał
źródło