2011-06-21 15 views
15

Al ejecutar CMake en una PC, CMake genera archivos NMake de forma predeterminada. En otro, genera un proyecto de Visual Studio.¿Cuál es el generador predeterminado para CMake en Windows?

Sé que puedo anular el valor predeterminado agregando -G "NMake Makefiles" al final de mi declaración de CMake, pero quiero saber por qué se predetermina a los proyectos de Visual Studio en uno y NMake en otro.

+0

¿Es la misma versión de CMake? – rubenvb

+0

Sí, la versión es 2.8.4 en ambas máquinas. – cfinley

+0

De hecho, encontré una solución, pero no me permitirá publicarla durante otras siete horas ... <. < – cfinley

Respuesta

16

El siguiente es de la Fuente CMake (versión 2.8.4: cmake.cxx: línea de salida 2039):

// Try to find the newest VS installed on the computer and 
    // use that as a default if -G is not specified 
    std::string vsregBase = 
    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\"; 
    struct VSRegistryEntryName 
    { 
    const char* MSVersion; 
    const char* GeneratorName; 
    }; 
    VSRegistryEntryName version[] = { 
    {"6.0", "Visual Studio 6"}, 
    {"7.0", "Visual Studio 7"}, 
    {"7.1", "Visual Studio 7 .NET 2003"}, 
    {"8.0", "Visual Studio 8 2005"}, 
    {"9.0", "Visual Studio 9 2008"}, 
    {"10.0", "Visual Studio 10"}, 
    {0, 0}}; 
    for(int i =0; version[i].MSVersion != 0; i++) 
    { 
    std::string reg = vsregBase + version[i].MSVersion; 
    reg += ";InstallDir]"; 
    cmSystemTools::ExpandRegistryValues(reg); 
    if (!(reg == "/registry")) 
     { 
     installedCompiler = version[i].GeneratorName; 
     } 
    } 
    cmGlobalGenerator* gen 
    = this->CreateGlobalGenerator(installedCompiler.c_str()); 
    if(!gen) 
    { 
    gen = new cmGlobalNMakeMakefileGenerator; 
    } 
    this->SetGlobalGenerator(gen); 
    std::cout << "-- Building for: " << gen->GetName() << "\n"; 

Parece que CMake se ve en el registro de Windows para determinar qué generador de usar. Busca las subclaves de registro de Visual Studio (6.0, 7.0, etc.) en [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\ para una entrada llamada InstallDir. Si se encuentra uno, usa el generador correspondiente. (Utilizará la versión más nueva de Visual Studio disponible.) De lo contrario, usa el generador NMake.

Tenga en cuenta que la entrada InstallDir no siempre está presente, incluso cuando se instala una versión particular de Visual Studio. Esto puede tener que ver con la configuración de instalación o una versión particular de Visual Studio (por ejemplo, parece que las versiones "Express" de Visual C++ no agregan esta entrada).

Es posible, por supuesto, anular el valor predeterminado configurando al agregar -G {Generator Name} al final de su comando CMake.

+0

Para la posteridad: hay [una entrada en la lista de correo de CMake] (http: //www.mail) -archive.com/[email protected]/msg18033.html) que aborda este problema. Para cambiar el generador predeterminado, parece que necesita modificar el origen de CMake y volver a compilar o escribir un pequeño archivo por lotes que agregue la opción '-G' para sustituir el generador cuando no se especifique ninguno. –

+1

La comunidad de Visual Studio 14 no tiene 'InstallDir'. Quiero automatizar la selección de 64 bits del generador 'cmake', y parece que no hay una manera fácil. – dashesy

+1

En realidad, está allí, solo debe asegurarse de mirar dentro del 'W6432Node' si Windows es de 64 bits, porque VS es una aplicación de 32 bits. – dashesy

Cuestiones relacionadas