2012-06-29 957 views
16

me gustaría fuerza CMake utilizar la "Unix Makefile" generador de desde dentro CMakeLists.txt.cmake: Selección de un generador dentro de CMakeLists.txt

Este es el comando que uso ahora.

cmake -G "Unix Makefiles" . 

me gustaría que fuera de esta.

cmake . 

Cuando se ejecuta en ventanas con VC instalados y una cadena de herramientas personalizada.

Esperaría poder establecer el generador en el archivo CMakeLists.txt.

Tal vez algo como esto.

set(CMAKE_GENERATOR "Unix Makefiles") 

Respuesta

2

Esto no es lo que me pasa, cuando ejecuto el mismo comando, cmake buscará un compilador gcc/hacer utilidad. Si la ruta no está configurado correctamente se producirá un error con algo como:

 
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! 

cuando gcc/MinGW está en el camino, entonces todo funciona bien. Entonces, ¿podría proporcionar más información sobre su variable PATH o su versión CMAKE?

+0

porque estoy utilizando una herramienta de cadena personalizada, y tengo VC++ instalado, no puede depender de CMake la selección de un generador. Tampoco sé qué especificar en la línea de comandos para que sea fácil para el usuario clonar y construir el proyecto. – Ted

+1

Ok ... lo siento, no entendí bien su pregunta.En ese caso, recomendaría colocar un CMakeCache.txt en el directorio, que en su mayoría está vacío, pero para la variable CMAKE_GENERATOR. O podría tener ese archivo de caché en su repositorio de origen y pasarlo junto con la opción -C cmake. – Frank

7

Me parece que la variable CMAKE_GENERATOR se establece demasiado tarde si se establece en el CMakeLists.txt. Si utiliza (incluso al principio de CMakeLists.txt)

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

se puede ver en la salida algo así como

% 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 

Así que la variable sólo se fija en el final del procedimiento de generación. Si utiliza algo así como

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

en CMakeLists.txt, a continuación, en la primera carrera de cmake ../source (sin -G) se utiliza el generador dedefecto. Sin embargo, la variable CMAKE_GENERATOR se almacena en el caché. Por lo tanto, si vuelve a ejecutar cmake ../source después, usará el generador como se especifica en la variable CMAKE_GENERATOR en la caché.

Esto seguramente no es la solución más elegante, aunque ;-) Tal vez utilizar un archivo por lotes que realmente va a ejecutar la cmake -G generator para el usuario ...

+0

Me gustaría que permitieran al usuario establecer toda la configuración en 'CMakeLists.txt'. ¿Cuál es el punto si necesita un '.bat' sobre él? – Royi

+1

Parece que [la respuesta de Ivan] (https://gitlab.kitware.com/cmake/cmake/issues/17231) hace algo muy parecido a esto: la variable se configura en un archivo de configuración de cmake que se obtiene antes del ' CMakeLists.txt' está cargado. –

8

Esto es lo que funcionó para mí - crear un archivo llamado PreLoad.cmake en su directorio que contiene este proyecto:

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

+2

Parece que el comportamiento 'Preload.cmake' no estaba documentado en la documentación cmake" oficial "; ver [ticket 17231] (https://gitlab.kitware.com/cmake/cmake/issues/17231) - ¡pero es bueno saberlo! –

Cuestiones relacionadas