tutorial - cmake: seleccionando un generador dentro de CMakeLists.txt
cmake visual studio 2017 (3)
Me gustaría forzar a CMake a usar el generador "Unix Makefiles" desde CMakeLists.txt.
Este es el comando que uso ahora.
cmake -G "Unix Makefiles" .
Me gustaría que fuera esto.
cmake .
Cuando se ejecuta en Windows con VC instalado y una cadena de herramientas personalizada.
Espero poder configurar el generador en el archivo CMakeLists.txt
.
Tal vez algo como esto.
set(CMAKE_GENERATOR "Unix Makefiles")
Esto no es lo que obtengo; cuando ejecuto el mismo comando, cmake buscará una utilidad gcc compiler / make. Si el PATH no está configurado correctamente, fallará 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 la ruta, todo funciona bien. Entonces, ¿podría proporcionar más información sobre su variable PATH o la versión CMAKE?
Me parece que la variable CMAKE_GENERATOR
se establece demasiado tarde si se establece en el CMakeLists.txt
. Si usa (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
Por lo tanto, la variable solo se establece al final del proceso de generación. Si usas algo como
set(CMAKE_GENERATOR "Ninja" CACHE INTERNAL "" FORCE)
en CMakeLists.txt
, luego en la primera ejecución de cmake ../source
(sin -G
) se usa el generador predeterminado . Sin CMAKE_GENERATOR
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 el caché.
Sin embargo, esta no es la solución más elegante ;-) Quizás utilice un archivo por lotes que realmente ejecute el cmake -G generator
para el usuario ...
Esto es lo que funcionó para mí: cree un archivo llamado PreLoad.cmake en el directorio de su proyecto que contiene esto:
set (CMAKE_GENERATOR "Unix Makefiles" CACHE INTERNAL "" FORCE)