diff options
author | David Cole <david.cole@kitware.com> | 2012-12-05 15:29:58 (GMT) |
---|---|---|
committer | CMake Topic Stage <kwrobot@kitware.com> | 2012-12-05 15:29:58 (GMT) |
commit | 4df341b0410d016f4f36d5ea92f36c8c7028a696 (patch) | |
tree | b96453e7751873d97c1ecdb4defd01087e47a82c | |
parent | 8a581696efaf47707c150e6fb95f1258aab8cd39 (diff) | |
parent | dce54b103af0ee1627de9e0cf04a5e390442a929 (diff) | |
download | CMake-4df341b0410d016f4f36d5ea92f36c8c7028a696.zip CMake-4df341b0410d016f4f36d5ea92f36c8c7028a696.tar.gz CMake-4df341b0410d016f4f36d5ea92f36c8c7028a696.tar.bz2 |
Merge topic 'windows-ce-env-helper'
dce54b1 Add command to generate environment for a Windows CE SDK
-rw-r--r-- | Source/cmVisualStudioWCEPlatformParser.cxx | 48 | ||||
-rw-r--r-- | Source/cmVisualStudioWCEPlatformParser.h | 13 | ||||
-rw-r--r-- | Source/cmake.cxx | 36 | ||||
-rw-r--r-- | Source/cmake.h | 2 |
4 files changed, 93 insertions, 6 deletions
diff --git a/Source/cmVisualStudioWCEPlatformParser.cxx b/Source/cmVisualStudioWCEPlatformParser.cxx index 0afcf67..b302246 100644 --- a/Source/cmVisualStudioWCEPlatformParser.cxx +++ b/Source/cmVisualStudioWCEPlatformParser.cxx @@ -15,18 +15,23 @@ int cmVisualStudioWCEPlatformParser::ParseVersion(const char* version) { - std::string vskey = cmGlobalVisualStudioGenerator::GetRegistryBase(version); - vskey += "\\Setup\\VS;ProductDir"; + const std::string registryBase = + cmGlobalVisualStudioGenerator::GetRegistryBase(version); + const std::string vckey = registryBase + "\\Setup\\VC;ProductDir"; + const std::string vskey = registryBase + "\\Setup\\VS;ProductDir"; - std::string vsInstallPath; - if(!cmSystemTools::ReadRegistryValue(vskey.c_str(), vsInstallPath)) + if(!cmSystemTools::ReadRegistryValue(vckey.c_str(), this->VcInstallDir) || + !cmSystemTools::ReadRegistryValue(vskey.c_str(), this->VsInstallDir)) { return 0; } - cmSystemTools::ConvertToUnixSlashes(vsInstallPath); + cmSystemTools::ConvertToUnixSlashes(this->VcInstallDir); + cmSystemTools::ConvertToUnixSlashes(this->VsInstallDir); + this->VcInstallDir.append("/"); + this->VsInstallDir.append("/"); const std::string configFilename = - vsInstallPath + "/VC/vcpackages/WCE.VCPlatform.config"; + this->VcInstallDir + "vcpackages/WCE.VCPlatform.config"; return this->ParseFile(configFilename.c_str()); } @@ -93,6 +98,24 @@ void cmVisualStudioWCEPlatformParser::StartElement(const char* name, this->Macros[macroName] = macroValue; } } + else if(strcmp(name, "Directories") == 0) + { + for(const char** attr = attributes; *attr; attr += 2) + { + if(strcmp(attr[0], "Include") == 0) + { + this->Include = attr[1]; + } + else if(strcmp(attr[0], "Library") == 0) + { + this->Library = attr[1]; + } + else if(strcmp(attr[0], "Path") == 0) + { + this->Path = attr[1]; + } + } + } } void cmVisualStudioWCEPlatformParser::EndElement(const char* name) @@ -137,3 +160,16 @@ void cmVisualStudioWCEPlatformParser::CharacterDataHandler(const char* data, { this->CharacterData.append(data, length); } + +std::string cmVisualStudioWCEPlatformParser::FixPaths( + const std::string& paths) const +{ + std::string ret = paths; + cmSystemTools::ReplaceString(ret, "$(PATH)", "%PATH%"); + cmSystemTools::ReplaceString(ret, "$(VCInstallDir)", VcInstallDir.c_str()); + cmSystemTools::ReplaceString(ret, "$(VSInstallDir)", VsInstallDir.c_str()); + cmSystemTools::ReplaceString(ret, "\\", "/"); + cmSystemTools::ReplaceString(ret, "//", "/"); + cmSystemTools::ReplaceString(ret, "/", "\\"); + return ret; +} diff --git a/Source/cmVisualStudioWCEPlatformParser.h b/Source/cmVisualStudioWCEPlatformParser.h index 28061fd..466e1dd 100644 --- a/Source/cmVisualStudioWCEPlatformParser.h +++ b/Source/cmVisualStudioWCEPlatformParser.h @@ -31,6 +31,12 @@ public: bool Found() const {return this->FoundRequiredName;} const char* GetArchitectureFamily() const; std::string GetOSVersion() const; + std::string GetIncludeDirectories() const { + return this->FixPaths(this->Include); } + std::string GetLibraryDirectories() const { + return this->FixPaths(this->Library); } + std::string GetPathDirectories() const { + return this->FixPaths(this->Path); } const std::vector<std::string>& GetAvailablePlatforms() const { return this->AvailablePlatforms; } @@ -40,8 +46,13 @@ protected: void CharacterDataHandler(const char* data, int length); private: + std::string FixPaths(const std::string& paths) const; + std::string CharacterData; + std::string Include; + std::string Library; + std::string Path; std::string PlatformName; std::string OSMajorVersion; std::string OSMinorVersion; @@ -50,6 +61,8 @@ private: const char* RequiredName; bool FoundRequiredName; + std::string VcInstallDir; + std::string VsInstallDir; }; #endif diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 1424a11..fba4860 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -82,6 +82,7 @@ #if defined(CMAKE_HAVE_VS_GENERATORS) #include "cmCallVisualStudioMacro.h" +#include "cmVisualStudioWCEPlatformParser.h" #endif #if !defined(CMAKE_BOOT_MINGW) @@ -1143,6 +1144,10 @@ void CMakeCommandUsage(const char* program) << "Available on Windows only:\n" << " comspec - on windows 9x use this for RunCommand\n" << " delete_regv key - delete registry value\n" + << " env_vs8_wince sdkname - displays a batch file which sets the " + "environment for the provided Windows CE SDK installed in VS2005\n" + << " env_vs9_wince sdkname - displays a batch file which sets the " + "environment for the provided Windows CE SDK installed in VS2008\n" << " write_regv key value - write registry value\n" #else << "Available on UNIX only:\n" @@ -1808,6 +1813,14 @@ int cmake::ExecuteCMakeCommand(std::vector<std::string>& args) } return cmWin32ProcessExecution::Windows9xHack(command.c_str()); } + else if (args[1] == "env_vs8_wince" && args.size() == 3) + { + return cmake::WindowsCEEnvironment("8.0", args[2]); + } + else if (args[1] == "env_vs9_wince" && args.size() == 3) + { + return cmake::WindowsCEEnvironment("9.0", args[2]); + } #endif } @@ -4001,6 +4014,29 @@ static bool cmakeCheckStampList(const char* stampList) return true; } +//---------------------------------------------------------------------------- +int cmake::WindowsCEEnvironment(const char* version, const std::string& name) +{ +#if defined(CMAKE_HAVE_VS_GENERATORS) + cmVisualStudioWCEPlatformParser parser(name.c_str()); + parser.ParseVersion(version); + if (parser.Found()) + { + std::cout << "@echo off" << std::endl; + std::cout << "echo Environment Selection: " << name << std::endl; + std::cout << "set PATH=" << parser.GetPathDirectories() << std::endl; + std::cout << "set INCLUDE=" << parser.GetIncludeDirectories() <<std::endl; + std::cout << "set LIB=" << parser.GetLibraryDirectories() <<std::endl; + return 0; + } +#else + (void)version; +#endif + + std::cerr << "Could not find " << name; + return -1; +} + // For visual studio 2005 and newer manifest files need to be embeded into // exe and dll's. This code does that in such a way that incremental linking // still works. diff --git a/Source/cmake.h b/Source/cmake.h index 79e05ca..e5aa076 100644 --- a/Source/cmake.h +++ b/Source/cmake.h @@ -445,6 +445,8 @@ protected: std::string const& link); static int ExecuteEchoColor(std::vector<std::string>& args); static int ExecuteLinkScript(std::vector<std::string>& args); + static int WindowsCEEnvironment(const char* version, + const std::string& name); static int VisualStudioLink(std::vector<std::string>& args, int type); static int VisualStudioLinkIncremental(std::vector<std::string>& args, int type, |