diff options
author | Gregor Jasny <gjasny@googlemail.com> | 2017-10-11 18:58:35 (GMT) |
---|---|---|
committer | Gregor Jasny <gjasny@googlemail.com> | 2017-10-13 19:28:34 (GMT) |
commit | 5de37a4a6474fa569e2ac28d5e9c164b6e7d2f46 (patch) | |
tree | 310730d01dd0a79a268c2ce6982ab49fe8b3e171 /Source/cmGlobalVisualStudioGenerator.cxx | |
parent | d0b6c2da8b7fda317e11c66a4b133d4a88eaeef6 (diff) | |
download | CMake-5de37a4a6474fa569e2ac28d5e9c164b6e7d2f46.zip CMake-5de37a4a6474fa569e2ac28d5e9c164b6e7d2f46.tar.gz CMake-5de37a4a6474fa569e2ac28d5e9c164b6e7d2f46.tar.bz2 |
cmake: Add --open option for IDE generators
Diffstat (limited to 'Source/cmGlobalVisualStudioGenerator.cxx')
-rw-r--r-- | Source/cmGlobalVisualStudioGenerator.cxx | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/Source/cmGlobalVisualStudioGenerator.cxx b/Source/cmGlobalVisualStudioGenerator.cxx index 0651536..b752f84 100644 --- a/Source/cmGlobalVisualStudioGenerator.cxx +++ b/Source/cmGlobalVisualStudioGenerator.cxx @@ -4,7 +4,10 @@ #include "cmGlobalVisualStudioGenerator.h" #include "cmsys/Encoding.hxx" +#include <future> #include <iostream> +#include <objbase.h> +#include <shellapi.h> #include <windows.h> #include "cmAlgorithms.h" @@ -928,3 +931,33 @@ void cmGlobalVisualStudioGenerator::AddSymbolExportCommand( commandLines, "Auto build dll exports", "."); commands.push_back(command); } + +static bool OpenSolution(std::string sln) +{ + HRESULT comInitialized = + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); + if (FAILED(comInitialized)) { + return false; + } + + HINSTANCE hi = + ShellExecuteA(NULL, "open", sln.c_str(), NULL, NULL, SW_SHOWNORMAL); + + CoUninitialize(); + + return reinterpret_cast<intptr_t>(hi) > 32; +} + +bool cmGlobalVisualStudioGenerator::Open(const std::string& bindir, + const std::string& projectName, + bool dryRun) +{ + std::string buildDir = cmSystemTools::ConvertToOutputPath(bindir.c_str()); + std::string sln = buildDir + "\\" + projectName + ".sln"; + + if (dryRun) { + return cmSystemTools::FileExists(sln, true); + } + + return std::async(std::launch::async, OpenSolution, sln).get(); +} |