2012-06-29 19 views
16

Vorrei forza CMake da utilizzare per il "Unix Makefiles" generatore dall'interno CMakeLists.txt.cmake: Selezione di un generatore all'interno CMakeLists.txt

Questo è il comando che uso ora.

cmake -G "Unix Makefiles" . 

vorrei che fosse questo.

cmake . 

Durante l'esecuzione su Windows con VC installati e un costume tool-chain.

Mi aspetto di essere in grado di impostare il generatore nel file CMakeLists.txt.

Forse qualcosa del genere.

set(CMAKE_GENERATOR "Unix Makefiles") 

risposta

2

Questo non è ciò che ottengo, quando si esegue lo stesso comando, CMake cercherà un compilatore gcc/make utility. Se il percorso non è impostato correttamente fallirà con qualcosa di simile:

 
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! 

quando gcc/MinGW è nel percorso poi tutto funziona bene. Quindi potresti fornire ulteriori informazioni sulla tua variabile PATH o sulla versione di CMAKE?

+0

perché sto usando uno strumento a catena su misura, e non ho VC++ installato, non può contare su CMake selezione di un generatore. Inoltre, non so cosa specificarne uno sulla riga di comando in modo che sia facile per l'utente clonare e creare il progetto. – Ted

+1

Ok ... scusa ho frainteso la tua domanda.In tal caso, raccomanderei di inserire un CMakeCache.txt nella directory, che è per lo più vuoto ma per la variabile CMAKE_GENERATOR. Oppure potresti avere quel file di cache nel tuo repository di origine e passarlo usando l'opzione -C cmake. – Frank

7

Mi sembra che la variabile CMAKE_GENERATOR sia impostata troppo tardi se impostata su CMakeLists.txt. Se si utilizza (anche all'inizio di CMakeLists.txt)

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

potete vedere nell'output qualcosa come

% 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 

Quindi la variabile è impostata solo alla fine della procedura di generazione. Se si usa qualcosa come

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

in CMakeLists.txt, poi nel primo run di cmake ../source (senza -G) viene utilizzato il generatore predefinita. La variabile CMAKE_GENERATOR è tuttavia memorizzata nella cache. Quindi, se si esegue nuovamente cmake ../source, verrà utilizzato il generatore come specificato nella variabile CMAKE_GENERATOR nella cache.

Questo non è sicuramente la soluzione più elegante, anche se ;-) Forse utilizzare un file batch che realmente eseguire il cmake -G generator per l'utente ...

+0

Mi auguro che lascino che l'utente imposti tutte le configurazioni in 'CMakeLists.txt'. Qual è il punto se hai bisogno di un '.bat 'su di esso? – Royi

+1

Sembra che [la risposta di Ivan] (https://gitlab.kitware.com/cmake/cmake/issues/17231) faccia qualcosa di molto vicino a questo: la variabile è configurata in un file di configurazione cmake che è originato prima dell'effettivo ' CMakeLists.txt' è caricato. –

8

Ecco che cosa ha funzionato per me - creare un file chiamato PreLoad.cmake nel dir questo progetto contenente:

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

+2

Sembra che il comportamento di 'Preload.cmake' non sia stato documentato nella documentazione cmake" ufficiale "; vedi [biglietto 17231] (https://gitlab.kitware.com/cmake/cmake/issues/17231) - ma buono a sapersi! –

Problemi correlati