[cfe-commits] r89517 - /cfe/trunk/lib/Frontend/InitHeaderSearch.cpp
Daniel Dunbar
daniel at zuster.org
Sat Nov 21 20:39:14 PST 2009
Hi John,
It looks like this broke the windows buildbot, can you take a look, or
tell me what I should check (in the registry) to see what it is
failing.
I recently upgraded the Windows box to be a very straightforward
out-of-the-box XP + VS 2009 install (+ gnuwin32), so this is
definitely a platform I would hope keeps working OOTB.
- Daniel
On Fri, Nov 20, 2009 at 4:15 PM, John Thompson
<John.Thompson.JTSoftware at gmail.com> wrote:
> Author: jtsoftware
> Date: Fri Nov 20 18:15:52 2009
> New Revision: 89517
>
> URL: http://llvm.org/viewvc/llvm-project?rev=89517&view=rev
> Log:
> Revised Win32 include path to search highest version in registry, plus platform SDK path
>
> Modified:
> cfe/trunk/lib/Frontend/InitHeaderSearch.cpp
>
> Modified: cfe/trunk/lib/Frontend/InitHeaderSearch.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitHeaderSearch.cpp?rev=89517&r1=89516&r2=89517&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Frontend/InitHeaderSearch.cpp (original)
> +++ cfe/trunk/lib/Frontend/InitHeaderSearch.cpp Fri Nov 20 18:15:52 2009
> @@ -194,7 +194,15 @@
>
> // FIXME: This probably should goto to some platform utils place.
> #ifdef _MSC_VER
> +
> // Read registry string.
> + // This also supports a means to look for high-versioned keys by use
> + // of a $VERSION placeholder in the key path.
> + // $VERSION in the key path is a placeholder for the version number,
> + // causing the highest value path to be searched for and used.
> + // I.e. "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\$VERSION".
> + // There can be additional characters in the component. Only the numberic
> + // characters are compared.
> bool getSystemRegistryString(const char *keyPath, const char *valueName,
> char *value, size_t maxLength) {
> HKEY hRootKey = NULL;
> @@ -202,6 +210,7 @@
> const char* subKey = NULL;
> DWORD valueType;
> DWORD valueSize = maxLength - 1;
> + long lResult;
> bool returnValue = false;
> if (strncmp(keyPath, "HKEY_CLASSES_ROOT\\", 18) == 0) {
> hRootKey = HKEY_CLASSES_ROOT;
> @@ -221,13 +230,80 @@
> }
> else
> return(false);
> - long lResult = RegOpenKeyEx(hRootKey, subKey, 0, KEY_READ, &hKey);
> - if (lResult == ERROR_SUCCESS) {
> - lResult = RegQueryValueEx(hKey, valueName, NULL, &valueType,
> - (LPBYTE)value, &valueSize);
> - if (lResult == ERROR_SUCCESS)
> - returnValue = true;
> - RegCloseKey(hKey);
> + const char *placeHolder = strstr(subKey, "$VERSION");
> + char bestName[256];
> + bestName[0] = '\0';
> + // If we have a $VERSION placeholder, do the highest-version search.
> + if (placeHolder) {
> + const char *keyEnd = placeHolder - 1;
> + const char *nextKey = placeHolder;
> + // Find end of previous key.
> + while ((keyEnd > subKey) && (*keyEnd != '\\'))
> + keyEnd--;
> + // Find end of key containing $VERSION.
> + while (*nextKey && (*nextKey != '\\'))
> + nextKey++;
> + size_t partialKeyLength = keyEnd - subKey;
> + char partialKey[256];
> + if (partialKeyLength > sizeof(partialKey))
> + partialKeyLength = sizeof(partialKey);
> + strncpy(partialKey, subKey, partialKeyLength);
> + partialKey[partialKeyLength] = '\0';
> + HKEY hTopKey = NULL;
> + lResult = RegOpenKeyEx(hRootKey, partialKey, 0, KEY_READ, &hTopKey);
> + if (lResult == ERROR_SUCCESS) {
> + char keyName[256];
> + int bestIndex = -1;
> + double bestValue = 0.0;
> + DWORD index, size = sizeof(keyName) - 1;
> + for (index = 0; RegEnumKeyEx(hTopKey, index, keyName, &size, NULL,
> + NULL, NULL, NULL) == ERROR_SUCCESS; index++) {
> + const char *sp = keyName;
> + while (*sp && !isdigit(*sp))
> + sp++;
> + if (!*sp)
> + continue;
> + const char *ep = sp + 1;
> + while (*ep && (isdigit(*ep) || (*ep == '.')))
> + ep++;
> + char numBuf[32];
> + strncpy(numBuf, sp, sizeof(numBuf) - 1);
> + numBuf[sizeof(numBuf) - 1] = '\0';
> + double value = strtod(numBuf, NULL);
> + if (value > bestValue) {
> + bestIndex = (int)index;
> + bestValue = value;
> + strcpy(bestName, keyName);
> + }
> + size = sizeof(keyName) - 1;
> + }
> + // If we found the highest versioned key, open the key and get the value.
> + if (bestIndex != -1) {
> + // Append rest of key.
> + strncat(bestName, nextKey, sizeof(bestName) - 1);
> + bestName[sizeof(bestName) - 1] = '\0';
> + // Open the chosen key path remainder.
> + lResult = RegOpenKeyEx(hTopKey, bestName, 0, KEY_READ, &hKey);
> + if (lResult == ERROR_SUCCESS) {
> + lResult = RegQueryValueEx(hKey, valueName, NULL, &valueType,
> + (LPBYTE)value, &valueSize);
> + if (lResult == ERROR_SUCCESS)
> + returnValue = true;
> + RegCloseKey(hKey);
> + }
> + }
> + RegCloseKey(hTopKey);
> + }
> + }
> + else {
> + lResult = RegOpenKeyEx(hRootKey, subKey, 0, KEY_READ, &hKey);
> + if (lResult == ERROR_SUCCESS) {
> + lResult = RegQueryValueEx(hKey, valueName, NULL, &valueType,
> + (LPBYTE)value, &valueSize);
> + if (lResult == ERROR_SUCCESS)
> + returnValue = true;
> + RegCloseKey(hKey);
> + }
> }
> return(returnValue);
> }
> @@ -240,35 +316,13 @@
>
> // Get Visual Studio installation directory.
> bool getVisualStudioDir(std::string &path) {
> + char vsIDEInstallDir[256];
> // Try the Windows registry first.
> - char vs80IDEInstallDir[256];
> - char vs90IDEInstallDir[256];
> - const char* vsIDEInstallDir = NULL;
> - bool has80 = getSystemRegistryString(
> - "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0",
> - "InstallDir", vs80IDEInstallDir, sizeof(vs80IDEInstallDir) - 1);
> - bool has90 = getSystemRegistryString(
> - "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\9.0",
> - "InstallDir", vs90IDEInstallDir, sizeof(vs90IDEInstallDir) - 1);
> + bool hasVCDir = getSystemRegistryString(
> + "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\$VERSION",
> + "InstallDir", vsIDEInstallDir, sizeof(vsIDEInstallDir) - 1);
> // If we have both vc80 and vc90, pick version we were compiled with.
> - if (has80 && has90) {
> - #ifdef _MSC_VER
> - #if (_MSC_VER >= 1500) // VC90
> - vsIDEInstallDir = vs90IDEInstallDir;
> - #elif (_MSC_VER == 1400) // VC80
> - vsIDEInstallDir = vs80IDEInstallDir;
> - #else
> - vsIDEInstallDir = vs90IDEInstallDir;
> - #endif
> - #else
> - vsIDEInstallDir = vs90IDEInstallDir;
> - #endif
> - }
> - else if (has90)
> - vsIDEInstallDir = vs90IDEInstallDir;
> - else if (has80)
> - vsIDEInstallDir = vs80IDEInstallDir;
> - if (vsIDEInstallDir && *vsIDEInstallDir) {
> + if (hasVCDir && vsIDEInstallDir[0]) {
> char *p = (char*)strstr(vsIDEInstallDir, "\\Common7\\IDE");
> if (p)
> *p = '\0';
> @@ -307,6 +361,21 @@
> return(false);
> }
>
> + // Get Windows SDK installation directory.
> +bool getWindowsSDKDir(std::string &path) {
> + char windowsSDKInstallDir[256];
> + // Try the Windows registry.
> + bool hasSDKDir = getSystemRegistryString(
> + "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\$VERSION",
> + "InstallationFolder", windowsSDKInstallDir, sizeof(windowsSDKInstallDir) - 1);
> + // If we have both vc80 and vc90, pick version we were compiled with.
> + if (hasSDKDir && windowsSDKInstallDir[0]) {
> + path = windowsSDKInstallDir;
> + return(true);
> + }
> + return(false);
> +}
> +
> void InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple) {
> // FIXME: temporary hack: hard-coded paths.
> llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
> @@ -324,29 +393,14 @@
> case llvm::Triple::Win32:
> {
> std::string VSDir;
> + std::string WindowsSDKDir;
> if (getVisualStudioDir(VSDir)) {
> AddPath(VSDir + "\\VC\\include", System, false, false, false);
> - AddPath(VSDir + "\\VC\\PlatformSDK\\Include",
> - System, false, false, false);
> - }
> - else {
> - // Default install paths.
> - AddPath("C:/Program Files/Microsoft Visual Studio 9.0/VC/include",
> - System, false, false, false);
> - AddPath(
> - "C:/Program Files/Microsoft Visual Studio 9.0/VC/PlatformSDK/Include",
> - System, false, false, false);
> - AddPath("C:/Program Files/Microsoft Visual Studio 8/VC/include",
> - System, false, false, false);
> - AddPath(
> - "C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/Include",
> - System, false, false, false);
> - // For some clang developers.
> - AddPath("G:/Program Files/Microsoft Visual Studio 9.0/VC/include",
> - System, false, false, false);
> - AddPath(
> - "G:/Program Files/Microsoft Visual Studio 9.0/VC/PlatformSDK/Include",
> - System, false, false, false);
> + if (getWindowsSDKDir(WindowsSDKDir))
> + AddPath(WindowsSDKDir, System, false, false, false);
> + else
> + AddPath(VSDir + "\\VC\\PlatformSDK\\Include",
> + System, false, false, false);
> }
> }
> break;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list