From 8cce3681ff485c8edb0de67772707653ae762d11 Mon Sep 17 00:00:00 2001
From: Robert Goulet <robert.goulet@autodesk.com>
Date: Fri, 1 May 2015 13:46:17 -0400
Subject: [PATCH] Add new CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD variable.

---
 Help/manual/cmake-variables.7.rst                       |  1 +
 .../CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD.rst       |  8 ++++++++
 Source/cmGlobalVisualStudio7Generator.cxx               | 17 +++++++++++++++++
 Tests/VSExcludeFromDefaultBuild/CMakeLists.txt          |  4 ++++
 Tests/VSExcludeFromDefaultBuild/ClearExes.cmake         |  4 ++++
 Tests/VSExcludeFromDefaultBuild/ResultTest.cmake        |  6 ++++++
 6 files changed, 40 insertions(+)
 create mode 100644 Help/variable/CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD.rst

diff --git a/Help/manual/cmake-variables.7.rst b/Help/manual/cmake-variables.7.rst
index cbc8a07..e6c966b 100644
--- a/Help/manual/cmake-variables.7.rst
+++ b/Help/manual/cmake-variables.7.rst
@@ -268,6 +268,7 @@ Variables that Control the Build
    /variable/CMAKE_TRY_COMPILE_CONFIGURATION
    /variable/CMAKE_USE_RELATIVE_PATHS
    /variable/CMAKE_VISIBILITY_INLINES_HIDDEN
+   /variable/CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD
    /variable/CMAKE_WIN32_EXECUTABLE
    /variable/CMAKE_XCODE_ATTRIBUTE_an-attribute
    /variable/EXECUTABLE_OUTPUT_PATH
diff --git a/Help/variable/CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD.rst b/Help/variable/CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD.rst
new file mode 100644
index 0000000..68f1ff6
--- /dev/null
+++ b/Help/variable/CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD.rst
@@ -0,0 +1,8 @@
+CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD
+-----------------------------------------
+
+Include INSTALL target to default build.
+
+In Visual Studio solution, by default the INSTALL target will not be part of
+the default build. Setting this variable will enable the INSTALL target to be
+part of the default build.
diff --git a/Source/cmGlobalVisualStudio7Generator.cxx b/Source/cmGlobalVisualStudio7Generator.cxx
index de90f7e..c1540aa 100644
--- a/Source/cmGlobalVisualStudio7Generator.cxx
+++ b/Source/cmGlobalVisualStudio7Generator.cxx
@@ -1031,6 +1031,23 @@ cmGlobalVisualStudio7Generator::IsPartOfDefaultBuild(
   int type = target->GetType();
   if (type == cmTarget::GLOBAL_TARGET)
     {
+    // check if INSTALL target is part of default build
+    if(target->GetName() == "INSTALL")
+      {
+      // inspect CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD properties
+      for(std::vector<std::string>::iterator i = this->Configurations.begin();
+          i != this->Configurations.end(); ++i)
+        {
+        const char* propertyValue =
+          target->GetMakefile()->GetDefinition("CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD");
+        cmGeneratorExpression ge;
+        cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(propertyValue);
+        if(cmSystemTools::IsOn(cge->Evaluate(target->GetMakefile(), *i)))
+          {
+          activeConfigs.insert(*i);
+          }
+        }
+      }
     return activeConfigs;
     }
   if(type == cmTarget::UTILITY && !this->IsDependedOn(projectTargets, target))
diff --git a/Tests/VSExcludeFromDefaultBuild/CMakeLists.txt b/Tests/VSExcludeFromDefaultBuild/CMakeLists.txt
index d30414b..243fdf5 100644
--- a/Tests/VSExcludeFromDefaultBuild/CMakeLists.txt
+++ b/Tests/VSExcludeFromDefaultBuild/CMakeLists.txt
@@ -1,6 +1,9 @@
 cmake_minimum_required(VERSION 2.8.9)
 project(VSExcludeFromDefaultBuild)
 
+# CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD will enable the INSTALL target to be part of the default build
+set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)
+
 # First step is to clear all .exe files in output so that possible past
 # failures of this test do not prevent it from succeeding.
 add_custom_target(ClearExes ALL
@@ -13,6 +16,7 @@ add_custom_target(ClearExes ALL
 function(add_test_executable target)
   add_executable("${target}" ${ARGN})
   add_dependencies("${target}" ClearExes)
+  install(TARGETS "${target}" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/install" OPTIONAL)
 endfunction()
 
 add_test_executable(DefaultBuilt main.c)
diff --git a/Tests/VSExcludeFromDefaultBuild/ClearExes.cmake b/Tests/VSExcludeFromDefaultBuild/ClearExes.cmake
index ece30ad..99cf1a5 100644
--- a/Tests/VSExcludeFromDefaultBuild/ClearExes.cmake
+++ b/Tests/VSExcludeFromDefaultBuild/ClearExes.cmake
@@ -2,3 +2,7 @@ file(GLOB exeFiles "${dir}/*.exe")
 foreach(exeFile IN LISTS exeFiles)
   file(REMOVE "${exeFile}")
 endforeach()
+file(GLOB exeFiles "${dir}/install/*.exe")
+foreach(exeFile IN LISTS exeFiles)
+  file(REMOVE "${exeFile}")
+endforeach()
diff --git a/Tests/VSExcludeFromDefaultBuild/ResultTest.cmake b/Tests/VSExcludeFromDefaultBuild/ResultTest.cmake
index 8fb00bf..f96e70b 100644
--- a/Tests/VSExcludeFromDefaultBuild/ResultTest.cmake
+++ b/Tests/VSExcludeFromDefaultBuild/ResultTest.cmake
@@ -7,6 +7,12 @@ macro(TestExists exeName)
   else()
     message(FATAL_ERROR "File ${exeFile} was expected ${ARGN} to exist!")
   endif()
+  set(exeFile "${dir}/${activeConfig}/install/${exeName}.exe")
+  if(${ARGN} EXISTS "${exeFile}")
+    message(STATUS "File ${exeFile} was correctly found ${ARGN} to exist.")
+  else()
+    message(FATAL_ERROR "File ${exeFile} was expected ${ARGN} to exist!")
+  endif()
 endmacro()
 
 TestExists(DefaultBuilt)
-- 
1.9.4.msysgit.0

