VS12: Add Visual Studio 12 generator (#14251)
Copy cmGlobalVisualStudio11Generator to cmGlobalVisualStudio12Generator and update version numbers accordingly. Add the VS12 enumeration value. Add module CMakeVS12FindMake to find MSBuild. Look for MSBuild in its now-dedicated Windows Registry entry. Teach the platform module Windows-MSVC to set MSVC12 and document the variable. Teach module InstallRequiredSystemLibraries to look for the VS 12 runtime libraries. Teach tests CheckCompilerRelatedVariables, Preprocess, VSExternalInclude, and RunCMake.GeneratorToolset to treat VS 12 as they do VS 10 and 11. Inspired-by: Minmin Gong <minmin.gong@gmail.com>
This commit is contained in:
parent
5dd8c01429
commit
77ac9b8b9c
|
@ -0,0 +1,27 @@
|
|||
|
||||
#=============================================================================
|
||||
# Copyright 2007-2013 Kitware, Inc.
|
||||
#
|
||||
# Distributed under the OSI-approved BSD License (the "License");
|
||||
# see accompanying file Copyright.txt for details.
|
||||
#
|
||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the License for more information.
|
||||
#=============================================================================
|
||||
# (To distribute this file outside of CMake, substitute the full
|
||||
# License text for the above reference.)
|
||||
|
||||
# Always use MSBuild because:
|
||||
# - devenv treats command-line builds as recently-loaded projects in the IDE
|
||||
# - devenv does not appear to support non-standard platform toolsets
|
||||
# If we need devenv for Intel Fortran in the future we should add
|
||||
# a special case when Fortran is enabled.
|
||||
find_program(CMAKE_MAKE_PROGRAM
|
||||
NAMES MSBuild
|
||||
HINTS "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MSBuild\\ToolsVersions\\12.0;MSBuildToolsPath]"
|
||||
)
|
||||
|
||||
mark_as_advanced(CMAKE_MAKE_PROGRAM)
|
||||
set(MSVC12 1)
|
||||
set(MSVC_VERSION 1800)
|
|
@ -182,6 +182,10 @@ if(MSVC)
|
|||
MSVCRT_FILES_FOR_VERSION(11)
|
||||
endif()
|
||||
|
||||
if(MSVC12)
|
||||
MSVCRT_FILES_FOR_VERSION(12)
|
||||
endif()
|
||||
|
||||
if(CMAKE_INSTALL_MFC_LIBRARIES)
|
||||
if(MSVC70)
|
||||
set(__install__libs ${__install__libs}
|
||||
|
@ -330,6 +334,10 @@ if(MSVC)
|
|||
if(MSVC11)
|
||||
MFC_FILES_FOR_VERSION(11)
|
||||
endif()
|
||||
|
||||
if(MSVC12)
|
||||
MFC_FILES_FOR_VERSION(12)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
foreach(lib
|
||||
|
|
|
@ -81,6 +81,7 @@ if(NOT MSVC_VERSION)
|
|||
|
||||
set(MSVC10)
|
||||
set(MSVC11)
|
||||
set(MSVC12)
|
||||
set(MSVC60)
|
||||
set(MSVC70)
|
||||
set(MSVC71)
|
||||
|
@ -88,7 +89,9 @@ if(NOT MSVC_VERSION)
|
|||
set(MSVC90)
|
||||
set(CMAKE_COMPILER_2005)
|
||||
set(CMAKE_COMPILER_SUPPORTS_PDBTYPE)
|
||||
if(NOT "${_compiler_version}" VERSION_LESS 17)
|
||||
if(NOT "${_compiler_version}" VERSION_LESS 18)
|
||||
set(MSVC12 1)
|
||||
elseif(NOT "${_compiler_version}" VERSION_LESS 17)
|
||||
set(MSVC11 1)
|
||||
elseif(NOT "${_compiler_version}" VERSION_LESS 16)
|
||||
set(MSVC10 1)
|
||||
|
|
|
@ -345,6 +345,8 @@ if (WIN32)
|
|||
cmGlobalVisualStudio10Generator.cxx
|
||||
cmGlobalVisualStudio11Generator.h
|
||||
cmGlobalVisualStudio11Generator.cxx
|
||||
cmGlobalVisualStudio12Generator.h
|
||||
cmGlobalVisualStudio12Generator.cxx
|
||||
cmGlobalVisualStudioGenerator.cxx
|
||||
cmGlobalVisualStudioGenerator.h
|
||||
cmGlobalWatcomWMakeGenerator.cxx
|
||||
|
|
|
@ -1022,7 +1022,7 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
|
|||
false,
|
||||
"Variables That Describe the System");
|
||||
|
||||
int msvc_versions[] = { 60, 70, 71, 80, 90, 100, 110, 0 };
|
||||
int msvc_versions[] = { 60, 70, 71, 80, 90, 100, 110, 120, 0 };
|
||||
for (int i = 0; msvc_versions[i] != 0; i ++)
|
||||
{
|
||||
const char minor = (char)('0' + (msvc_versions[i] % 10));
|
||||
|
@ -1069,6 +1069,7 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
|
|||
" 1500 = VS 9.0\n"
|
||||
" 1600 = VS 10.0\n"
|
||||
" 1700 = VS 11.0\n"
|
||||
" 1800 = VS 12.0\n"
|
||||
"",
|
||||
false,
|
||||
"Variables That Describe the System");
|
||||
|
|
|
@ -0,0 +1,111 @@
|
|||
/*============================================================================
|
||||
CMake - Cross Platform Makefile Generator
|
||||
Copyright 2000-2011 Kitware, Inc., Insight Software Consortium
|
||||
|
||||
Distributed under the OSI-approved BSD License (the "License");
|
||||
see accompanying file Copyright.txt for details.
|
||||
|
||||
This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the License for more information.
|
||||
============================================================================*/
|
||||
#include "cmGlobalVisualStudio12Generator.h"
|
||||
#include "cmLocalVisualStudio10Generator.h"
|
||||
#include "cmMakefile.h"
|
||||
|
||||
static const char vs12Win32generatorName[] = "Visual Studio 12";
|
||||
static const char vs12Win64generatorName[] = "Visual Studio 12 Win64";
|
||||
static const char vs12ARMgeneratorName[] = "Visual Studio 12 ARM";
|
||||
|
||||
class cmGlobalVisualStudio12Generator::Factory
|
||||
: public cmGlobalGeneratorFactory
|
||||
{
|
||||
public:
|
||||
virtual cmGlobalGenerator* CreateGlobalGenerator(const char* name) const {
|
||||
if(!strcmp(name, vs12Win32generatorName))
|
||||
{
|
||||
return new cmGlobalVisualStudio12Generator(
|
||||
vs12Win32generatorName, NULL, NULL);
|
||||
}
|
||||
if(!strcmp(name, vs12Win64generatorName))
|
||||
{
|
||||
return new cmGlobalVisualStudio12Generator(
|
||||
vs12Win64generatorName, "x64", "CMAKE_FORCE_WIN64");
|
||||
}
|
||||
if(!strcmp(name, vs12ARMgeneratorName))
|
||||
{
|
||||
return new cmGlobalVisualStudio12Generator(
|
||||
vs12ARMgeneratorName, "ARM", NULL);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual void GetDocumentation(cmDocumentationEntry& entry) const {
|
||||
entry.Name = "Visual Studio 12";
|
||||
entry.Brief = "Generates Visual Studio 12 project files.";
|
||||
entry.Full =
|
||||
"It is possible to append a space followed by the platform name "
|
||||
"to create project files for a specific target platform. E.g. "
|
||||
"\"Visual Studio 12 Win64\" will create project files for "
|
||||
"the x64 processor; \"Visual Studio 12 ARM\" for ARM.";
|
||||
}
|
||||
|
||||
virtual void GetGenerators(std::vector<std::string>& names) const {
|
||||
names.push_back(vs12Win32generatorName);
|
||||
names.push_back(vs12Win64generatorName);
|
||||
names.push_back(vs12ARMgeneratorName); }
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
cmGlobalGeneratorFactory* cmGlobalVisualStudio12Generator::NewFactory()
|
||||
{
|
||||
return new Factory;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
cmGlobalVisualStudio12Generator::cmGlobalVisualStudio12Generator(
|
||||
const char* name, const char* architectureId,
|
||||
const char* additionalPlatformDefinition)
|
||||
: cmGlobalVisualStudio11Generator(name, architectureId,
|
||||
additionalPlatformDefinition)
|
||||
{
|
||||
this->FindMakeProgramFile = "CMakeVS12FindMake.cmake";
|
||||
std::string vc12Express;
|
||||
this->ExpressEdition = cmSystemTools::ReadRegistryValue(
|
||||
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VCExpress\\12.0\\Setup\\VC;"
|
||||
"ProductDir", vc12Express, cmSystemTools::KeyWOW64_32);
|
||||
this->PlatformToolset = "v120";
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmGlobalVisualStudio12Generator::WriteSLNHeader(std::ostream& fout)
|
||||
{
|
||||
fout << "Microsoft Visual Studio Solution File, Format Version 12.00\n";
|
||||
if (this->ExpressEdition)
|
||||
{
|
||||
fout << "# Visual Studio Express 2013 for Windows Desktop\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
fout << "# Visual Studio 2013\n";
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
cmLocalGenerator *cmGlobalVisualStudio12Generator::CreateLocalGenerator()
|
||||
{
|
||||
cmLocalVisualStudio10Generator* lg =
|
||||
new cmLocalVisualStudio10Generator(cmLocalVisualStudioGenerator::VS12);
|
||||
lg->SetPlatformName(this->GetPlatformName());
|
||||
lg->SetGlobalGenerator(this);
|
||||
return lg;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool cmGlobalVisualStudio12Generator::UseFolderProperty()
|
||||
{
|
||||
// Intentionally skip over the parent class implementation and call the
|
||||
// grand-parent class's implementation. Folders are not supported by the
|
||||
// Express editions in VS10 and earlier, but they are in VS12 Express.
|
||||
return cmGlobalVisualStudio8Generator::UseFolderProperty();
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
/*============================================================================
|
||||
CMake - Cross Platform Makefile Generator
|
||||
Copyright 2000-2011 Kitware, Inc., Insight Software Consortium
|
||||
|
||||
Distributed under the OSI-approved BSD License (the "License");
|
||||
see accompanying file Copyright.txt for details.
|
||||
|
||||
This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the License for more information.
|
||||
============================================================================*/
|
||||
#ifndef cmGlobalVisualStudio12Generator_h
|
||||
#define cmGlobalVisualStudio12Generator_h
|
||||
|
||||
#include "cmGlobalVisualStudio11Generator.h"
|
||||
|
||||
|
||||
/** \class cmGlobalVisualStudio12Generator */
|
||||
class cmGlobalVisualStudio12Generator:
|
||||
public cmGlobalVisualStudio11Generator
|
||||
{
|
||||
public:
|
||||
cmGlobalVisualStudio12Generator(const char* name,
|
||||
const char* architectureId, const char* additionalPlatformDefinition);
|
||||
static cmGlobalGeneratorFactory* NewFactory();
|
||||
|
||||
virtual void WriteSLNHeader(std::ostream& fout);
|
||||
|
||||
///! create the correct local generator
|
||||
virtual cmLocalGenerator *CreateLocalGenerator();
|
||||
|
||||
/** TODO: VS 12 user macro support. */
|
||||
virtual std::string GetUserMacrosDirectory() { return ""; }
|
||||
protected:
|
||||
virtual const char* GetIDEVersion() { return "12.0"; }
|
||||
bool UseFolderProperty();
|
||||
private:
|
||||
class Factory;
|
||||
};
|
||||
#endif
|
|
@ -38,7 +38,8 @@ public:
|
|||
VS8 = 80,
|
||||
VS9 = 90,
|
||||
VS10 = 100,
|
||||
VS11 = 110
|
||||
VS11 = 110,
|
||||
VS12 = 120
|
||||
};
|
||||
|
||||
cmLocalVisualStudioGenerator(VSVersion v);
|
||||
|
|
|
@ -66,6 +66,7 @@ void cmVisualStudioGeneratorOptions::FixExceptionHandlingDefault()
|
|||
break;
|
||||
case cmLocalVisualStudioGenerator::VS10:
|
||||
case cmLocalVisualStudioGenerator::VS11:
|
||||
case cmLocalVisualStudioGenerator::VS12:
|
||||
// by default VS puts <ExceptionHandling></ExceptionHandling> empty
|
||||
// for a project, to make our projects look the same put a new line
|
||||
// and space over for the closing </ExceptionHandling> as the default
|
||||
|
|
|
@ -65,6 +65,7 @@
|
|||
# include "cmGlobalVisualStudio9Generator.h"
|
||||
# include "cmGlobalVisualStudio10Generator.h"
|
||||
# include "cmGlobalVisualStudio11Generator.h"
|
||||
# include "cmGlobalVisualStudio12Generator.h"
|
||||
# include "cmGlobalBorlandMakefileGenerator.h"
|
||||
# include "cmGlobalNMakeMakefileGenerator.h"
|
||||
# include "cmGlobalJOMMakefileGenerator.h"
|
||||
|
@ -2244,6 +2245,7 @@ int cmake::ActualConfigure()
|
|||
{"9.0", "Visual Studio 9 2008"},
|
||||
{"10.0", "Visual Studio 10"},
|
||||
{"11.0", "Visual Studio 11"},
|
||||
{"12.0", "Visual Studio 12"},
|
||||
{0, 0}};
|
||||
for(int i=0; version[i].MSVersion != 0; i++)
|
||||
{
|
||||
|
@ -2652,6 +2654,8 @@ void cmake::AddDefaultGenerators()
|
|||
cmGlobalVisualStudio10Generator::NewFactory());
|
||||
this->Generators.push_back(
|
||||
cmGlobalVisualStudio11Generator::NewFactory());
|
||||
this->Generators.push_back(
|
||||
cmGlobalVisualStudio12Generator::NewFactory());
|
||||
this->Generators.push_back(
|
||||
cmGlobalVisualStudio71Generator::NewFactory());
|
||||
this->Generators.push_back(
|
||||
|
|
|
@ -37,6 +37,9 @@ endif()
|
|||
if(DEFINED MSVC11)
|
||||
math(EXPR msvc_total "${msvc_total} + 1")
|
||||
endif()
|
||||
if(DEFINED MSVC12)
|
||||
math(EXPR msvc_total "${msvc_total} + 1")
|
||||
endif()
|
||||
|
||||
echo_var(MSVC)
|
||||
echo_var(MSVC60)
|
||||
|
@ -46,6 +49,7 @@ echo_var(MSVC80)
|
|||
echo_var(MSVC90)
|
||||
echo_var(MSVC10)
|
||||
echo_var(MSVC11)
|
||||
echo_var(MSVC12)
|
||||
echo_var(MSVC_IDE)
|
||||
|
||||
if(MSVC)
|
||||
|
|
|
@ -40,6 +40,9 @@ endif()
|
|||
if("${CMAKE_GENERATOR}" MATCHES "Visual Studio 11")
|
||||
set(PP_VS110 1)
|
||||
endif()
|
||||
if("${CMAKE_GENERATOR}" MATCHES "Visual Studio 12")
|
||||
set(PP_VS120 1)
|
||||
endif()
|
||||
|
||||
# Some tests below check the PP_* variables set above. They are meant
|
||||
# to test the case that the build tool is at fault. Other tests below
|
||||
|
@ -55,7 +58,8 @@ endif()
|
|||
# must not have it escaped inside the configured header.
|
||||
set(STRING_EXTRA "")
|
||||
|
||||
if(NOT BORLAND AND NOT PP_VS70 AND NOT PP_VS100 AND NOT PP_VS110)
|
||||
if(NOT BORLAND AND NOT PP_VS70
|
||||
AND NOT PP_VS100 AND NOT PP_VS110 AND NOT PP_VS120)
|
||||
# Borland, VS70 IDE: ;
|
||||
# The Borland compiler will simply not accept a non-escaped semicolon
|
||||
# on the command line. If it is escaped \; then the escape character
|
||||
|
|
|
@ -3,7 +3,7 @@ include(RunCMake)
|
|||
set(RunCMake_GENERATOR_TOOLSET "")
|
||||
run_cmake(NoToolset)
|
||||
|
||||
if("${RunCMake_GENERATOR}" MATCHES "Visual Studio 1[01]|Xcode" AND NOT XCODE_BELOW_3)
|
||||
if("${RunCMake_GENERATOR}" MATCHES "Visual Studio 1[012]|Xcode" AND NOT XCODE_BELOW_3)
|
||||
set(RunCMake_GENERATOR_TOOLSET "Test Toolset")
|
||||
run_cmake(TestToolset)
|
||||
else()
|
||||
|
|
|
@ -6,7 +6,7 @@ if(${CMAKE_GENERATOR} MATCHES "Visual Studio 6")
|
|||
else()
|
||||
set(PROJECT_EXT vcproj)
|
||||
endif()
|
||||
if(${CMAKE_GENERATOR} MATCHES "Visual Studio 1[01]")
|
||||
if(${CMAKE_GENERATOR} MATCHES "Visual Studio 1[012]")
|
||||
set(PROJECT_EXT vcxproj)
|
||||
endif()
|
||||
|
||||
|
@ -54,7 +54,7 @@ add_dependencies(VSExternalInclude lib2)
|
|||
# and the sln file can no longer be the only source
|
||||
# of that depend. So, for VS 10 make the executable
|
||||
# depend on lib1 and lib2
|
||||
if(${CMAKE_GENERATOR} MATCHES "Visual Studio 1[01]")
|
||||
if(${CMAKE_GENERATOR} MATCHES "Visual Studio 1[012]")
|
||||
add_dependencies(VSExternalInclude lib1)
|
||||
endif()
|
||||
|
||||
|
|
Loading…
Reference in New Issue