2012-06-29 11 views
16

Chciałbym wymusić CMake używać "Unix Makefiles" generator z ciągu CMakeLists.txt.cmake: Wybór generatora w CMakeLists.txt

To polecenie, którego teraz używam.

cmake -G "Unix Makefiles" . 

Chciałbym to być to.

Podczas pracy w systemie Windows z zainstalowanym VC i niestandardowym łańcuchem narzędzi.

Spodziewam się ustawić generator w pliku CMakeLists.txt.

Może coś takiego.

set(CMAKE_GENERATOR "Unix Makefiles") 

Odpowiedz

2

To nie jest to, co mam, kiedy uruchomić tę samą komendę, CUpewnij będzie szukać kompilatora gcc/make użyteczność. Jeśli ścieżka nie jest prawidłowo skonfigurowany to nie z czymś takim:

 
D:\Development\build>cmake -G "Unix Makefiles" ..\source 
CMake Error: CMake was unable to find a build program corresponding to "Unix Makefiles". CMAKE_MAKE_PROGRAM is not set. 
    You probably need to select a different build tool. 
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly. 
Missing variable is: 
CMAKE_C_COMPILER_ENV_VAR 
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly. 
Missing variable is: 
CMAKE_C_COMPILER 
CMake Error: Could not find cmake module file:D:/Development/build/CMakeFiles/CMakeCCompiler.cmake 
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly. 
Missing variable is: 
CMAKE_CXX_COMPILER_ENV_VAR 
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly. 
Missing variable is: 
CMAKE_CXX_COMPILER 
CMake Error: Could not find cmake module file:D:/Development/build/CMakeFiles/CMakeCXXCompiler.cmake 
CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage 
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage 
-- Configuring incomplete, errors occurred! 

kiedy gcc/mingw znajduje się na ścieżce następnie wszystko działa poprawnie. Czy mógłbyś podać więcej informacji na temat zmiennej PATH lub wersji CMAKE?

+0

Ponieważ używam niestandardowe narzędzie łańcucha i mam VC++ zainstalowane, nie może powoływać się na CMake wybierając generator. Nie wiem też, co wybrać w wierszu poleceń, aby użytkownik mógł łatwo sklonować i zbudować projekt. – Ted

+1

Ok ... Przepraszam, źle zrozumiałem twoje pytanie.W takim przypadku polecam umieszczenie CMakeCache.txt w katalogu, który jest w większości pusty, ale dla zmiennej CMAKE_GENERATOR. Lub możesz mieć ten plik pamięci podręcznej w repozytorium źródłowym i przekazać go przy użyciu opcji -C cmake. – Frank

7

Wydaje mi się, że zmienna CMAKE_GENERATOR jest ustawiona zbyt późno, jeśli jest ustawiona w CMakeLists.txt. Jeśli używasz (nawet na początku CMakeLists.txt)

set(CMAKE_GENERATOR "Ninja") 
message("generator is set to ${CMAKE_GENERATOR}") 

można zobaczyć w czymś wyjścia jak

% cmake ../source 
-- The C compiler identification is GNU 4.9.2 
... 
-- Detecting CXX compile features - done 
generator is set to Ninja 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /tmp/build 

więc zmienna jest ustawiona tylko na samym końcu procedury generacji. Jeśli używasz coś podobnego

set(CMAKE_GENERATOR "Ninja" CACHE INTERNAL "" FORCE) 

w CMakeLists.txt, a następnie w pierwszym biegu cmake ../source (bez -G) używany jest domyślnygenerator. Zmienna CMAKE_GENERATOR jest jednak przechowywana w pamięci podręcznej. Więc jeśli ponownie uruchomisz cmake ../source, użyje on generatora określonego w zmiennej CMAKE_GENERATOR w pamięci podręcznej.

To nie jest z pewnością najbardziej eleganckie rozwiązanie, choć ;-) Może wykorzystać plik wsadowy, który będzie faktycznie wykonać ten cmake -G generator dla użytkownika ...

+0

Chciałbym, aby pozwolili użytkownikowi ustawić całą konfigurację w 'CMakeLists.txt'. Jaki jest sens, jeśli potrzebujesz '.bat' nad nim? – Royi

+1

Wygląda na to, że [odpowiedź Ivana] (https://gitlab.kitware.com/cmake/cmake/issues/17231) robi coś bardzo bliskiego - zmienna jest skonfigurowana w pliku konfiguracyjnym cmake, który jest pobierany przed faktycznym ' CMakeLists.txt' jest załadowany. –

8

Oto co pracował dla mnie - utwórz plik o nazwie PreLoad.cmake w katalogu projektu zawierającego to:

set (CMAKE_GENERATOR "Unix Makefiles" CACHE INTERNAL "" FORCE)

+2

Wygląda na to, że zachowanie 'Preload.cmake' nie zostało udokumentowane w" oficjalnej "dokumentacji cmake; patrz [bilet 17231] (https://gitlab.kitware.com/cmake/cmake/issues/17231) - ale dobrze wiedzieć! –