summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/cmGlobalVisualStudioGenerator.cxx105
1 files changed, 73 insertions, 32 deletions
diff --git a/Source/cmGlobalVisualStudioGenerator.cxx b/Source/cmGlobalVisualStudioGenerator.cxx
index 9e6817e..e424c2b 100644
--- a/Source/cmGlobalVisualStudioGenerator.cxx
+++ b/Source/cmGlobalVisualStudioGenerator.cxx
@@ -67,6 +67,9 @@ void cmGlobalVisualStudioGenerator::Generate()
}
//----------------------------------------------------------------------------
+bool IsVisualStudioMacrosFileRegistered(const std::string& macrosFile,
+ std::string& nextAvailableSubKeyName);
+
void RegisterVisualStudioMacros(const std::string& macrosFile);
//----------------------------------------------------------------------------
@@ -114,33 +117,47 @@ void cmGlobalVisualStudioGenerator::CallVisualStudioReloadMacro()
cmMakefile* mf = this->LocalGenerators[0]->GetMakefile();
std::string dir = this->GetUserMacrosDirectory();
+ // Only really try to call the macro if:
+ // - mf is non-NULL
+ // - there is a UserMacrosDirectory
+ // - the CMake vsmacros file exists
+ // - the CMake vsmacros file is registered
+ // - there were .sln/.vcproj files changed during generation
+ //
if (mf != 0 && dir != "")
{
- std::vector<std::string> filenames;
- this->GetFilesReplacedDuringGenerate(filenames);
- if (filenames.size() > 0)
+ std::string macrosFile = dir + "/CMakeMacros/" CMAKE_VSMACROS_FILENAME;
+ std::string nextSubkeyName;
+ if (cmSystemTools::FileExists(macrosFile.c_str()) &&
+ IsVisualStudioMacrosFileRegistered(macrosFile, nextSubkeyName)
+ )
{
- // Convert vector to semi-colon delimited string of filenames:
- std::string projects;
- std::vector<std::string>::iterator it = filenames.begin();
- if (it != filenames.end())
+ std::vector<std::string> filenames;
+ this->GetFilesReplacedDuringGenerate(filenames);
+ if (filenames.size() > 0)
{
- projects = *it;
- ++it;
- }
- for (; it != filenames.end(); ++it)
- {
- projects += ";";
- projects += *it;
- }
+ // Convert vector to semi-colon delimited string of filenames:
+ std::string projects;
+ std::vector<std::string>::iterator it = filenames.begin();
+ if (it != filenames.end())
+ {
+ projects = *it;
+ ++it;
+ }
+ for (; it != filenames.end(); ++it)
+ {
+ projects += ";";
+ projects += *it;
+ }
- std::string topLevelSlnName = mf->GetStartOutputDirectory();
- topLevelSlnName += "/";
- topLevelSlnName += mf->GetProjectName();
- topLevelSlnName += ".sln";
+ std::string topLevelSlnName = mf->GetStartOutputDirectory();
+ topLevelSlnName += "/";
+ topLevelSlnName += mf->GetProjectName();
+ topLevelSlnName += ".sln";
- cmCallVisualStudioMacro::CallMacro(topLevelSlnName,
- CMAKE_VSMACROS_RELOAD_MACRONAME, projects);
+ cmCallVisualStudioMacro::CallMacro(topLevelSlnName,
+ CMAKE_VSMACROS_RELOAD_MACRONAME, projects);
+ }
}
}
}
@@ -560,22 +577,46 @@ void RegisterVisualStudioMacros(const std::string& macrosFile)
// Studio running. If we register it while one is running, first, it has
// no effect on the running instance; second, and worse, Visual Studio
// removes our newly added registration entry when it quits. Instead,
- // emit a warning instructing the user to re-run the CMake configure step
- // after exiting all running Visual Studio instances...
+ // emit a warning asking the user to exit all running Visual Studio
+ // instances...
//
- if (0 == count)
- {
- WriteVSMacrosFileRegistryEntry(nextAvailableSubKeyName, macrosFile);
- }
- else
+ if (0 != count)
{
std::ostringstream oss;
- oss << "Could not register Visual Studio macros file '" << macrosFile
- << "' with instances of Visual Studio running. Please exit all"
- << " running instances of Visual Studio and rerun this CMake"
- << " configure to register CMake's Visual Studio macros file."
+ oss << "Could not register CMake's Visual Studio macros file '"
+ << CMAKE_VSMACROS_FILENAME "' while Visual Studio is running."
+ << " Please exit all running instances of Visual Studio before"
+ << " continuing." << std::endl
+ << std::endl
+ << "CMake needs to register Visual Studio macros when its macros"
+ << " file is updated or when it detects that its current macros file"
+ << " is no longer registered with Visual Studio."
<< std::endl;
cmSystemTools::Message(oss.str().c_str(), "Warning");
+
+ // Count them again now that the warning is over. In the case of a GUI
+ // warning, the user may have gone to close Visual Studio and then come
+ // back to the CMake GUI and clicked ok on the above warning. If so,
+ // then register the macros *now* if the count is *now* 0...
+ //
+ count = cmCallVisualStudioMacro::
+ GetNumberOfRunningVisualStudioInstances("ALL");
+
+ // Also re-get the nextAvailableSubKeyName in case Visual Studio
+ // wrote out new registered macros information as it was exiting:
+ //
+ if (0 == count)
+ {
+ IsVisualStudioMacrosFileRegistered(macrosFile,
+ nextAvailableSubKeyName);
+ }
+ }
+
+ // Do another if check - 'count' may have changed inside the above if:
+ //
+ if (0 == count)
+ {
+ WriteVSMacrosFileRegistryEntry(nextAvailableSubKeyName, macrosFile);
}
}
}