Fixup windows include paths. Patch by John Thompson.

llvm-svn: 83898
This commit is contained in:
Mike Stump 2009-10-12 20:50:45 +00:00
parent e4adae267e
commit b9a9a7c0ad
3 changed files with 126 additions and 103 deletions

View File

@ -61,6 +61,12 @@ public:
/// libstdc++.
void AddGnuCPlusPlusIncludePaths(const std::string &Base, const char *Arch);
/// AddMinGWCPlusPlusIncludePaths - Add the necessary paths to suport a MinGW
/// libstdc++.
void AddMinGWCPlusPlusIncludePaths(const std::string &Base,
const char *Arch,
const char *Version);
/// AddDefaultEnvVarPaths - Adds list of paths from default environment
/// variables such as CPATH.
void AddDefaultEnvVarPaths(const LangOptions &Lang);

View File

@ -37,6 +37,14 @@ add_clang_library(clangFrontend
Warnings.cpp
)
IF(MSVC)
get_target_property(NON_ANSI_COMPILE_FLAGS clangFrontend COMPILE_FLAGS)
string(REPLACE /Za
"" NON_ANSI_COMPILE_FLAGS
${NON_ANSI_COMPILE_FLAGS})
set_target_properties(clangFrontend PROPERTIES COMPILE_FLAGS ${NON_ANSI_COMPILE_FLAGS})
ENDIF(MSVC)
add_dependencies(clangFrontend
ClangDiagnosticFrontend
ClangDiagnosticLex

View File

@ -21,6 +21,10 @@
#include "llvm/System/Path.h"
#include "llvm/Config/config.h"
#include <cstdio>
#ifdef _MSC_VER
#define WIN32_LEAN_AND_MEAN 1
#include <windows.h>
#endif
using namespace clang;
void InitHeaderSearch::AddPath(const llvm::StringRef &Path,
@ -105,16 +109,19 @@ void InitHeaderSearch::AddGnuCPlusPlusIncludePaths(const std::string &Base,
AddPath(Base + "/backward", System, true, false, false);
}
#if defined(LLVM_ON_WIN32)
void InitHeaderSearch::AddMinGWCPlusPlusIncludePaths(const std::string &Base,
const char *Arch,
const char *Version) {
std::string localBase = Base + "/" + Arch + "/" + Version + "/include";
AddPath(localBase, System, true, false, false);
AddPath(localBase + "/c++", System, true, false, false);
AddPath(localBase + "/c++/backward", System, true, false, false);
}
#if 0 // Yikes! Can't include windows.h.
#if LLVM_ON_WIN32
#define WIN32_LEAN_AND_MEAN 1
#include <windows.h>
#endif
// Read Windows registry string.
bool getWindowsRegistryString(const char *keyPath, const char *valueName,
// FIXME: This probably should goto to some platform utils place.
#ifdef _MSC_VER
// Read registry string.
bool getSystemRegistryString(const char *keyPath, const char *valueName,
char *value, size_t maxLength) {
HKEY hRootKey = NULL;
HKEY hKey = NULL;
@ -142,29 +149,65 @@ bool getWindowsRegistryString(const char *keyPath, const char *valueName,
return(false);
long lResult = RegOpenKeyEx(hRootKey, subKey, 0, KEY_READ, &hKey);
if (lResult == ERROR_SUCCESS) {
lResult = RegQueryValueEx(hKey, valueName, NULL, &valueType, (LPBYTE)value,
&valueSize);
lResult = RegQueryValueEx(hKey, valueName, NULL, &valueType,
(LPBYTE)value, &valueSize);
if (lResult == ERROR_SUCCESS)
returnValue = true;
RegCloseKey(kKey);
RegCloseKey(hKey);
}
return(returnValue);
}
#else // _MSC_VER
// Read registry string.
bool getSystemRegistryString(const char *, const char *, char *, size_t) {
return(false);
}
#endif // _MSC_VER
// Get Visual Studio installation directory.
bool getVisualStudioDir(std::string &path) {
char vs80comntools[256];
char vs90comntools[256];
const char* vscomntools = NULL;
bool has80 = getWindowsRegistryString(
// 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", vs80comntools, sizeof(vs80comntools) - 1);
bool has90 = getWindowsRegistryString(
"InstallDir", vs80IDEInstallDir, sizeof(vs80IDEInstallDir) - 1);
bool has90 = getSystemRegistryString(
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\9.0",
"InstallDir", vs90comntools, sizeof(vs90comntools) - 1);
"InstallDir", vs90IDEInstallDir, sizeof(vs90IDEInstallDir) - 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) {
char *p = (char*)strstr(vsIDEInstallDir, "\\Common7\\IDE");
if (p)
*p = '\0';
path = vsIDEInstallDir;
return(true);
}
else {
// Try the environment.
const char* vs90comntools = getenv("VS90COMNTOOLS");
const char* vs80comntools = getenv("VS80COMNTOOLS");
const char* vscomntools = NULL;
// If we have both vc80 and vc90, pick version we were compiled with.
if (vs90comntools && vs80comntools) {
#if (_MSC_VER >= 1500) // VC90
vscomntools = vs90comntools;
#elif (_MSC_VER == 1400) // VC80
@ -172,54 +215,23 @@ bool getVisualStudioDir(std::string &path) {
#else
vscomntools = vs90comntools;
#endif
#else
}
else if (vs90comntools)
vscomntools = vs90comntools;
#endif
else if (vs80comntools)
vscomntools = vs80comntools;
if (vscomntools && *vscomntools) {
char *p = (char*)strstr(vscomntools, "\\Common7\\Tools");
if (p)
*p = '\0';
path = vscomntools;
return(true);
}
else
return(false);
}
else if (has90)
vscomntools = vs90comntools;
else if (has80)
vscomntools = vs80comntools;
else
return(false);
char *p = strstr(vscomntools, "\\Common7\\ide");
if (p)
*p = '\0';
path = vscomntools;
return(true);
return(false);
}
#else
// Get Visual Studio installation directory.
bool getVisualStudioDir(std::string &path) {
const char* vs90comntools = getenv("VS90COMNTOOLS");
const char* vs80comntools = getenv("VS80COMNTOOLS");
const char* vscomntools = NULL;
// If we have both vc80 and vc90, pick version we were compiled with.
if (vs90comntools && vs80comntools) {
#if (_MSC_VER >= 1500) // VC90
vscomntools = vs90comntools;
#elif (_MSC_VER == 1400) // VC80
vscomntools = vs80comntools;
#else
vscomntools = vs90comntools;
#endif
}
else if (vs90comntools)
vscomntools = vs90comntools;
else if (vs80comntools)
vscomntools = vs80comntools;
else
return(false);
char *p = (char*)strstr(vscomntools, "\\Common7\\Tools");
if (p)
*p = '\0';
path = vscomntools;
return(true);
}
#endif
#endif // LLVM_ON_WIN32
void InitHeaderSearch::AddDefaultSystemIncludePaths(const LangOptions &Lang,
const llvm::Triple &triple) {
@ -229,59 +241,56 @@ void InitHeaderSearch::AddDefaultSystemIncludePaths(const LangOptions &Lang,
switch (os) {
case llvm::Triple::Win32:
{
#if defined(_MSC_VER)
std::string VSDir;
if (getVisualStudioDir(VSDir)) {
VSDir += "\\VC\\include";
AddPath(VSDir, 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 8\\VC\\include",
System, false, false, false);
// For some clang developers.
AddPath("G:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\include",
System, false, false, false);
}
#else
std::string VSDir;
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("/Program Files/Microsoft Visual Studio 9.0/VC/include",
AddPath("C:/Program Files/Microsoft Visual Studio 9.0/VC/include",
System, false, false, false);
AddPath("/Program Files/Microsoft Visual Studio 8/VC/include",
AddPath(
"C:/Program Files/Microsoft Visual Studio 9.0/VC/PlatformSDK/Include",
System, false, false, false);
#endif
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);
}
}
break;
case llvm::Triple::Cygwin:
if (Lang.CPlusPlus) {
AddPath("/lib/gcc/i686-pc-cygwin/3.4.4/include", System, false, false,
false);
AddPath("/lib/gcc/i686-pc-cygwin/3.4.4/include/c++", System, false, false,
false);
AddPath("/lib/gcc/i686-pc-cygwin/3.4.4/include",
System, false, false, false);
AddPath("/lib/gcc/i686-pc-cygwin/3.4.4/include/c++",
System, false, false, false);
}
AddPath("/usr/include", System, false, false, false);
break;
case llvm::Triple::MinGW32:
case llvm::Triple::MinGW64:
if (Lang.CPlusPlus) { // I'm guessing here.
// Try gcc 4.4.0
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw64", "4.4.0");
// Try gcc 4.3.0
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw64", "4.3.0");
}
// Fall through.
case llvm::Triple::MinGW32:
if (Lang.CPlusPlus) {
// Try gcc 4.4.0
// FIXME: This can just use AddGnuCPlusPlusIncludePaths, right?
AddPath("c:/mingw/lib/gcc/mingw32/4.4.0/include/c++",
System, true, false, false);
AddPath("c:/mingw/lib/gcc/mingw32/4.4.0/include/c++/mingw32",
System, true, false, false);
AddPath("c:/mingw/lib/gcc/mingw32/4.4.0/include/c++/backward",
System, true, false, false);
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.4.0");
// Try gcc 4.3.0
// FIXME: This can just use AddGnuCPlusPlusIncludePaths, right?
AddPath("c:/mingw/lib/gcc/mingw32/4.3.0/include/c++",
System, true, false, false);
AddPath("c:/mingw/lib/gcc/mingw32/4.3.0/include/c++/mingw32",
System, true, false, false);
AddPath("c:/mingw/lib/gcc/mingw32/4.3.0/include/c++/backward",
System, true, false, false);
AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.3.0");
}
AddPath("c:/mingw/include", System, true, false, false);
break;