VS: Add option to set `ConfigurationType` of a .vcxproj file

Add a VS_CONFIGURATION_TYPE target property to set this value
explicitly.  This is useful to build a Windows Kernel Mode Driver,
for example.
This commit is contained in:
Fabian Otto 2016-02-25 22:04:05 +01:00 committed by Brad King
parent 6b0a664c16
commit 6122909c33
10 changed files with 96 additions and 34 deletions

View File

@ -255,6 +255,7 @@ Properties on Targets
/prop_tgt/TYPE
/prop_tgt/VERSION
/prop_tgt/VISIBILITY_INLINES_HIDDEN
/prop_tgt/VS_CONFIGURATION_TYPE
/prop_tgt/VS_DESKTOP_EXTENSIONS_VERSION
/prop_tgt/VS_DOTNET_REFERENCES
/prop_tgt/VS_DOTNET_TARGET_FRAMEWORK_VERSION

View File

@ -0,0 +1,10 @@
VS_CONFIGURATION_TYPE
---------------------
Visual Studio project configuration type.
Sets the ``ConfigurationType`` attribute for a generated Visual Studio project.
If this property is set, it overrides the default setting that is based on the
target type (e.g. ``StaticLibrary``, ``Application``, ...).
Supported on :ref:`Visual Studio Generators` for VS 2010 and higher.

View File

@ -0,0 +1,6 @@
vs-vcxproj-ConfigurationType
----------------------------
* :ref:`Visual Studio Generators` for VS 2010 and above learned a new
:prop_tgt:`VS_CONFIGURATION_TYPE` target property to specify a custom
project file type.

View File

@ -696,43 +696,51 @@ void cmVisualStudio10TargetGenerator::WriteProjectConfigurationValues()
i->c_str(),
1, " Label=\"Configuration\"", "\n");
std::string configType = "<ConfigurationType>";
switch(this->GeneratorTarget->GetType())
if (const char* vsConfigurationType =
this->GeneratorTarget->GetProperty("VS_CONFIGURATION_TYPE"))
{
case cmState::SHARED_LIBRARY:
case cmState::MODULE_LIBRARY:
configType += "DynamicLibrary";
break;
case cmState::OBJECT_LIBRARY:
case cmState::STATIC_LIBRARY:
configType += "StaticLibrary";
break;
case cmState::EXECUTABLE:
if(this->NsightTegra &&
!this->GeneratorTarget->GetPropertyAsBool("ANDROID_GUI"))
{
// Android executables are .so too.
configType += cmVS10EscapeXML(vsConfigurationType);
}
else
{
switch(this->GeneratorTarget->GetType())
{
case cmState::SHARED_LIBRARY:
case cmState::MODULE_LIBRARY:
configType += "DynamicLibrary";
}
else
{
configType += "Application";
}
break;
case cmState::UTILITY:
case cmState::GLOBAL_TARGET:
if(this->NsightTegra)
{
// Tegra-Android platform does not understand "Utility".
break;
case cmState::OBJECT_LIBRARY:
case cmState::STATIC_LIBRARY:
configType += "StaticLibrary";
}
else
{
configType += "Utility";
}
break;
case cmState::UNKNOWN_LIBRARY:
case cmState::INTERFACE_LIBRARY:
break;
break;
case cmState::EXECUTABLE:
if(this->NsightTegra &&
!this->GeneratorTarget->GetPropertyAsBool("ANDROID_GUI"))
{
// Android executables are .so too.
configType += "DynamicLibrary";
}
else
{
configType += "Application";
}
break;
case cmState::UTILITY:
case cmState::GLOBAL_TARGET:
if(this->NsightTegra)
{
// Tegra-Android platform does not understand "Utility".
configType += "StaticLibrary";
}
else
{
configType += "Utility";
}
break;
case cmState::UNKNOWN_LIBRARY:
case cmState::INTERFACE_LIBRARY:
break;
}
}
configType += "</ConfigurationType>\n";
this->WriteString(configType.c_str(), 2);

View File

@ -236,6 +236,10 @@ if("${CMAKE_GENERATOR}" MATCHES "Visual Studio [^6]")
add_RunCMake_test(SolutionGlobalSections)
endif()
if("${CMAKE_GENERATOR}" MATCHES "Visual Studio ([^6789]|[6789][0-9])")
add_RunCMake_test(VS10Project)
endif()
if(XCODE_VERSION AND NOT "${XCODE_VERSION}" VERSION_LESS 3)
add_RunCMake_test(XcodeProject -DXCODE_VERSION=${XCODE_VERSION})
endif()

View File

@ -0,0 +1,3 @@
cmake_minimum_required(VERSION 3.5.0)
project(${RunCMake_TEST} NONE)
include(${RunCMake_TEST}.cmake)

View File

@ -0,0 +1,2 @@
include(RunCMake)
run_cmake(VsConfigurationType)

View File

@ -0,0 +1,24 @@
set(vcProjectFile "${RunCMake_TEST_BINARY_DIR}/foo.vcxproj")
if(NOT EXISTS "${vcProjectFile}")
set(RunCMake_TEST_FAILED "Project file ${vcProjectFile} does not exist.")
return()
endif()
set(propertyFound FALSE)
file(STRINGS "${vcProjectFile}" lines)
foreach(line IN LISTS lines)
if(line MATCHES "^ *<ConfigurationType>(.*)</ConfigurationType>$")
set(propertyFound TRUE)
set(expectedValue "MyValue")
set(actualValue ${CMAKE_MATCH_1})
if(NOT (${actualValue} STREQUAL ${expectedValue}))
set(RunCMake_TEST_FAILED "ConfigurationType \"${actualValue}\" differs from expected value \"${expectedValue}\".")
return()
endif()
endif()
endforeach()
if(NOT propertyFound)
set(RunCMake_TEST_FAILED "Property ConfigurationType not found in project file.")
return()
endif()

View File

@ -0,0 +1,3 @@
enable_language(CXX)
add_library(foo foo.cpp)
set_target_properties(foo PROPERTIES VS_CONFIGURATION_TYPE "MyValue")

View File

@ -0,0 +1 @@
void foo() { }