InitHeaderSearch.cpp revision 63c8b77334f90472260d2f48df2742ed5067261e
10fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber//===--- InitHeaderSearch.cpp - Initialize header search paths ----------*-===// 20fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber// 30fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber// The LLVM Compiler Infrastructure 40fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber// 50fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber// This file is distributed under the University of Illinois Open Source 60fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber// License. See LICENSE.TXT for details. 70fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber// 80fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber//===----------------------------------------------------------------------===// 90fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber// 100fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber// This file implements the InitHeaderSearch class. 110fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber// 120fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber//===----------------------------------------------------------------------===// 130fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 14e1bd4e6d7c5b13462f83245865f7d9e9b6ea8486Daniel Dunbar#include "clang/Frontend/InitHeaderSearch.h" 150fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber#include "clang/Basic/FileManager.h" 160fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber#include "clang/Basic/LangOptions.h" 1763c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar#include "clang/Frontend/HeaderSearchOptions.h" 1863c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar#include "clang/Lex/HeaderSearch.h" 190fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber#include "llvm/ADT/SmallString.h" 200fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber#include "llvm/ADT/SmallPtrSet.h" 21d57a7ef9252964bc6c8471451d7bd395b0520cb8Chris Lattner#include "llvm/Support/raw_ostream.h" 220fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber#include "llvm/System/Path.h" 23121e3c207415fb4c105d690de384d8f3d49b0f2dArgyrios Kyrtzidis#include "llvm/Config/config.h" 243daed52a57d03765223021f5f921bdc280c8f3ccChris Lattner#include <cstdio> 25620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump#ifdef _MSC_VER 26620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump #define WIN32_LEAN_AND_MEAN 1 27620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump #include <windows.h> 28620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump#endif 290fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weberusing namespace clang; 300fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 31458fb10ef5ba2d7b375c6c64095c1458af0a5be3Benjamin Kramervoid InitHeaderSearch::AddPath(const llvm::StringRef &Path, 32458fb10ef5ba2d7b375c6c64095c1458af0a5be3Benjamin Kramer IncludeDirGroup Group, bool isCXXAware, 33458fb10ef5ba2d7b375c6c64095c1458af0a5be3Benjamin Kramer bool isUserSupplied, bool isFramework, 34458fb10ef5ba2d7b375c6c64095c1458af0a5be3Benjamin Kramer bool IgnoreSysRoot) { 350fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber assert(!Path.empty() && "can't handle empty path here"); 360fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber FileManager &FM = Headers.getFileMgr(); 371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 380fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // Compute the actual path, taking into consideration -isysroot. 390fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber llvm::SmallString<256> MappedPath; 401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 410fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // Handle isysroot. 426858dd3fcc2d3ac6a706a0294be1d3ac51849022Chris Lattner if (Group == System && !IgnoreSysRoot) { 430fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // FIXME: Portability. This should be a sys::Path interface, this doesn't 440fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // handle things like C:\ right, nor win32 \\network\device\blah. 450fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (isysroot.size() != 1 || isysroot[0] != '/') // Add isysroot if present. 460fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber MappedPath.append(isysroot.begin(), isysroot.end()); 470fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 490fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber MappedPath.append(Path.begin(), Path.end()); 500fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 510fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // Compute the DirectoryLookup type. 529d72851fec9e9c62570a027d42701562bbf29751Chris Lattner SrcMgr::CharacteristicKind Type; 530fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (Group == Quoted || Group == Angled) 540b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner Type = SrcMgr::C_User; 550fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber else if (isCXXAware) 560b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner Type = SrcMgr::C_System; 570fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber else 580b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner Type = SrcMgr::C_ExternCSystem; 591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 610fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // If the directory exists, add it. 62458fb10ef5ba2d7b375c6c64095c1458af0a5be3Benjamin Kramer if (const DirectoryEntry *DE = FM.getDirectory(MappedPath.str())) { 630fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber IncludeGroup[Group].push_back(DirectoryLookup(DE, Type, isUserSupplied, 640fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber isFramework)); 650fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber return; 660fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 680fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // Check to see if this is an apple-style headermap (which are not allowed to 690fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // be frameworks). 700fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (!isFramework) { 71458fb10ef5ba2d7b375c6c64095c1458af0a5be3Benjamin Kramer if (const FileEntry *FE = FM.getFile(MappedPath.str())) { 720fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (const HeaderMap *HM = Headers.CreateHeaderMap(FE)) { 730fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // It is a headermap, add it to the search path. 740fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber IncludeGroup[Group].push_back(DirectoryLookup(HM, Type,isUserSupplied)); 750fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber return; 760fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 770fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 780fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 800fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (Verbose) 817765934ad7e157b5fcf925792a38e01b1edbcf8aDaniel Dunbar llvm::errs() << "ignoring nonexistent directory \"" 827765934ad7e157b5fcf925792a38e01b1edbcf8aDaniel Dunbar << MappedPath.str() << "\"\n"; 830fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber} 840fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 850fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 86e166582f8f36f4db8f4ea157538fab7fe6bf2658Daniel Dunbarvoid InitHeaderSearch::AddDelimitedPaths(const char *at) { 87e166582f8f36f4db8f4ea157538fab7fe6bf2658Daniel Dunbar if (*at == 0) // Empty string should not add '.' path. 880fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber return; 890fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 900fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber const char* delim = strchr(at, llvm::sys::PathSeparator); 910fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber while (delim != 0) { 920fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (delim-at == 0) 930fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath(".", Angled, false, true, false); 940fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber else 95458fb10ef5ba2d7b375c6c64095c1458af0a5be3Benjamin Kramer AddPath(llvm::StringRef(at, delim-at), Angled, false, true, false); 960fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber at = delim + 1; 970fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber delim = strchr(at, llvm::sys::PathSeparator); 980fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 990fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (*at == 0) 1000fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath(".", Angled, false, true, false); 1010fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber else 1020fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath(at, Angled, false, true, false); 1030fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber} 1040fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 105ec05766fe525a8f81c7dc96ddbdc874814a14b2cMike Stumpvoid InitHeaderSearch::AddGnuCPlusPlusIncludePaths(const std::string &Base, 10631b63beefa058aa42a12a1c2b72b43a4ba21f7f1Rafael Espindola const char *Dir32, 10731b63beefa058aa42a12a1c2b72b43a4ba21f7f1Rafael Espindola const char *Dir64, 10831b63beefa058aa42a12a1c2b72b43a4ba21f7f1Rafael Espindola const llvm::Triple &triple) { 10931b63beefa058aa42a12a1c2b72b43a4ba21f7f1Rafael Espindola llvm::Triple::ArchType arch = triple.getArch(); 11031b63beefa058aa42a12a1c2b72b43a4ba21f7f1Rafael Espindola bool is64bit = arch == llvm::Triple::ppc64 || arch == llvm::Triple::x86_64; 11131b63beefa058aa42a12a1c2b72b43a4ba21f7f1Rafael Espindola 11231b63beefa058aa42a12a1c2b72b43a4ba21f7f1Rafael Espindola AddPath(Base, System, true, false, false); 11331b63beefa058aa42a12a1c2b72b43a4ba21f7f1Rafael Espindola if (is64bit) 11431b63beefa058aa42a12a1c2b72b43a4ba21f7f1Rafael Espindola AddPath(Base + "/" + Dir64, System, true, false, false); 11531b63beefa058aa42a12a1c2b72b43a4ba21f7f1Rafael Espindola else 11631b63beefa058aa42a12a1c2b72b43a4ba21f7f1Rafael Espindola AddPath(Base + "/" + Dir32, System, true, false, false); 11731b63beefa058aa42a12a1c2b72b43a4ba21f7f1Rafael Espindola AddPath(Base + "/backward", System, true, false, false); 1182e9f652d53346bf7e64c8a12a9ff06b004a3e489Rafael Espindola} 1190fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 120620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stumpvoid InitHeaderSearch::AddMinGWCPlusPlusIncludePaths(const std::string &Base, 121620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump const char *Arch, 122620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump const char *Version) { 1235c5758bb0a4ec0f572cd20249277736da5715003Daniel Dunbar std::string localBase = Base + "/" + Arch + "/" + Version + "/include"; 1245c5758bb0a4ec0f572cd20249277736da5715003Daniel Dunbar AddPath(localBase, System, true, false, false); 1255c5758bb0a4ec0f572cd20249277736da5715003Daniel Dunbar AddPath(localBase + "/c++", System, true, false, false); 1265c5758bb0a4ec0f572cd20249277736da5715003Daniel Dunbar AddPath(localBase + "/c++/backward", System, true, false, false); 127620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump} 12843d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump 129620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump // FIXME: This probably should goto to some platform utils place. 130620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump#ifdef _MSC_VER 131620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump // Read registry string. 132620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stumpbool getSystemRegistryString(const char *keyPath, const char *valueName, 13343d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump char *value, size_t maxLength) { 13443d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump HKEY hRootKey = NULL; 13543d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump HKEY hKey = NULL; 13643d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump const char* subKey = NULL; 13743d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump DWORD valueType; 13843d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump DWORD valueSize = maxLength - 1; 13943d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump bool returnValue = false; 14043d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump if (strncmp(keyPath, "HKEY_CLASSES_ROOT\\", 18) == 0) { 14143d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump hRootKey = HKEY_CLASSES_ROOT; 14243d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump subKey = keyPath + 18; 14343d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump } 14443d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump else if (strncmp(keyPath, "HKEY_USERS\\", 11) == 0) { 14543d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump hRootKey = HKEY_USERS; 14643d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump subKey = keyPath + 11; 14743d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump } 14843d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump else if (strncmp(keyPath, "HKEY_LOCAL_MACHINE\\", 19) == 0) { 14943d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump hRootKey = HKEY_LOCAL_MACHINE; 15043d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump subKey = keyPath + 19; 151121e3c207415fb4c105d690de384d8f3d49b0f2dArgyrios Kyrtzidis } 15243d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump else if (strncmp(keyPath, "HKEY_CURRENT_USER\\", 18) == 0) { 15343d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump hRootKey = HKEY_CURRENT_USER; 15443d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump subKey = keyPath + 18; 15543d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump } 15643d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump else 15743d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump return(false); 15843d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump long lResult = RegOpenKeyEx(hRootKey, subKey, 0, KEY_READ, &hKey); 15943d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump if (lResult == ERROR_SUCCESS) { 160620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump lResult = RegQueryValueEx(hKey, valueName, NULL, &valueType, 161620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump (LPBYTE)value, &valueSize); 16243d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump if (lResult == ERROR_SUCCESS) 16343d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump returnValue = true; 164620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump RegCloseKey(hKey); 16543d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump } 16643d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump return(returnValue); 16743d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump} 168620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump#else // _MSC_VER 169620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump // Read registry string. 170620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stumpbool getSystemRegistryString(const char *, const char *, char *, size_t) { 171620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump return(false); 172620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump} 173620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump#endif // _MSC_VER 174121e3c207415fb4c105d690de384d8f3d49b0f2dArgyrios Kyrtzidis 17543d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump // Get Visual Studio installation directory. 17643d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stumpbool getVisualStudioDir(std::string &path) { 177620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump // Try the Windows registry first. 178620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump char vs80IDEInstallDir[256]; 179620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump char vs90IDEInstallDir[256]; 180620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump const char* vsIDEInstallDir = NULL; 181620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump bool has80 = getSystemRegistryString( 18243d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0", 183620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump "InstallDir", vs80IDEInstallDir, sizeof(vs80IDEInstallDir) - 1); 184620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump bool has90 = getSystemRegistryString( 18543d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\9.0", 186620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump "InstallDir", vs90IDEInstallDir, sizeof(vs90IDEInstallDir) - 1); 18743d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump // If we have both vc80 and vc90, pick version we were compiled with. 18843d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump if (has80 && has90) { 18943d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump #ifdef _MSC_VER 19043d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump #if (_MSC_VER >= 1500) // VC90 191620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump vsIDEInstallDir = vs90IDEInstallDir; 19243d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump #elif (_MSC_VER == 1400) // VC80 193620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump vsIDEInstallDir = vs80IDEInstallDir; 19443d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump #else 195620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump vsIDEInstallDir = vs90IDEInstallDir; 19643d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump #endif 19743d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump #else 198620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump vsIDEInstallDir = vs90IDEInstallDir; 19943d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump #endif 20043d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump } 20143d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump else if (has90) 202620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump vsIDEInstallDir = vs90IDEInstallDir; 20343d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump else if (has80) 204620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump vsIDEInstallDir = vs80IDEInstallDir; 205620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump if (vsIDEInstallDir && *vsIDEInstallDir) { 206620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump char *p = (char*)strstr(vsIDEInstallDir, "\\Common7\\IDE"); 207620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump if (p) 208620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump *p = '\0'; 209620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump path = vsIDEInstallDir; 210620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump return(true); 21143d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump } 212620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump else { 213620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump // Try the environment. 214620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump const char* vs90comntools = getenv("VS90COMNTOOLS"); 215620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump const char* vs80comntools = getenv("VS80COMNTOOLS"); 216620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump const char* vscomntools = NULL; 217620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump // If we have both vc80 and vc90, pick version we were compiled with. 218620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump if (vs90comntools && vs80comntools) { 219620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump #if (_MSC_VER >= 1500) // VC90 220620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump vscomntools = vs90comntools; 221620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump #elif (_MSC_VER == 1400) // VC80 222620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump vscomntools = vs80comntools; 223620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump #else 224620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump vscomntools = vs90comntools; 225620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump #endif 226620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump } 227620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump else if (vs90comntools) 228620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump vscomntools = vs90comntools; 229620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump else if (vs80comntools) 230620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump vscomntools = vs80comntools; 231620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump if (vscomntools && *vscomntools) { 232620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump char *p = (char*)strstr(vscomntools, "\\Common7\\Tools"); 233620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump if (p) 234620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump *p = '\0'; 235620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump path = vscomntools; 236620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump return(true); 237620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump } 238620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump else 239620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump return(false); 240620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump } 241620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump return(false); 24243d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump} 2434d374d4a4832a01d5d3b75c59cb1567e60df41e7Sebastian Redl 244e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindolavoid InitHeaderSearch::AddDefaultCIncludePaths(const llvm::Triple &triple) { 24543d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump // FIXME: temporary hack: hard-coded paths. 24643d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump llvm::Triple::OSType os = triple.getOS(); 24743d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump switch (os) { 24843d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump case llvm::Triple::Win32: 24943d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump { 250620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump std::string VSDir; 251620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump if (getVisualStudioDir(VSDir)) { 252620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump AddPath(VSDir + "\\VC\\include", System, false, false, false); 253620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump AddPath(VSDir + "\\VC\\PlatformSDK\\Include", 254620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump System, false, false, false); 255620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump } 256620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump else { 25743d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump // Default install paths. 258620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump AddPath("C:/Program Files/Microsoft Visual Studio 9.0/VC/include", 25943d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump System, false, false, false); 260620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump AddPath( 261620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump "C:/Program Files/Microsoft Visual Studio 9.0/VC/PlatformSDK/Include", 26243d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump System, false, false, false); 263620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump AddPath("C:/Program Files/Microsoft Visual Studio 8/VC/include", 264620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump System, false, false, false); 265620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump AddPath( 266620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump "C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/Include", 267620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump System, false, false, false); 268620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump // For some clang developers. 269620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump AddPath("G:/Program Files/Microsoft Visual Studio 9.0/VC/include", 270620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump System, false, false, false); 271620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump AddPath( 272620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump "G:/Program Files/Microsoft Visual Studio 9.0/VC/PlatformSDK/Include", 273620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump System, false, false, false); 274620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump } 27543d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump } 27643d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump break; 27743d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump case llvm::Triple::MinGW64: 278620d57a293143e3f07d6e4f5ba50020a80f45564Mike Stump case llvm::Triple::MinGW32: 27943d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump AddPath("c:/mingw/include", System, true, false, false); 28043d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump break; 28143d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump default: 28243d8176d2e8e304b2d419fb0fe139cc07af80deaMike Stump break; 2830fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 284d3f88343af2dec3459493fafa22532317321eaf0John Thompson 285d3f88343af2dec3459493fafa22532317321eaf0John Thompson AddPath("/usr/local/include", System, false, false, false); 286d3f88343af2dec3459493fafa22532317321eaf0John Thompson AddPath("/usr/include", System, false, false, false); 287e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola} 288e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola 289e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindolavoid InitHeaderSearch::AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple) { 290e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola llvm::Triple::OSType os = triple.getOS(); 291e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // FIXME: temporary hack: hard-coded paths. 292e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola switch (os) { 293e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola case llvm::Triple::Cygwin: 294e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddPath("/lib/gcc/i686-pc-cygwin/3.4.4/include", 295e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola System, true, false, false); 296e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddPath("/lib/gcc/i686-pc-cygwin/3.4.4/include/c++", 297e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola System, true, false, false); 298e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola break; 299e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola case llvm::Triple::MinGW64: 300e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Try gcc 4.4.0 301e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw64", "4.4.0"); 302e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Try gcc 4.3.0 303e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw64", "4.3.0"); 304e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Fall through. 305e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola case llvm::Triple::MinGW32: 306e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Try gcc 4.4.0 307e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.4.0"); 308e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Try gcc 4.3.0 309e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.3.0"); 310e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola break; 311e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola case llvm::Triple::Darwin: 312e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1", 31340d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i686-apple-darwin10", 31440d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i686-apple-darwin10/x86_64", 31540d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 316e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.0.0", 31740d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i686-apple-darwin8", 31840d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i686-apple-darwin8", 31940d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 320e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola break; 321e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola case llvm::Triple::Linux: 322e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Ubuntu 7.10 - Gutsy Gibbon 323e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1.3", 32440d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i486-linux-gnu", 32540d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i486-linux-gnu", 32640d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 327e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Ubuntu 9.04 328e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.3", 32940d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "x86_64-linux-gnu/32", 33040d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "x86_64-linux-gnu", 33140d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 3325114ecab149ab91d13d3f7fd165dbe0839c1f2e8Sebastian Redl // Ubuntu 9.10 3335114ecab149ab91d13d3f7fd165dbe0839c1f2e8Sebastian Redl AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4.1", 33440d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "x86_64-linux-gnu/32", 33540d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "x86_64-linux-gnu", 33640d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 337e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Fedora 8 338e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1.2", 33940d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i386-redhat-linux", 34040d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i386-redhat-linux", 34140d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 342e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Fedora 9 343e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.0", 34440d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i386-redhat-linux", 34540d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i386-redhat-linux", 34640d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 347e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Fedora 10 348e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.2", 34940d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i386-redhat-linux", 35040d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i386-redhat-linux", 35140d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 352e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // openSUSE 11.1 32 bit 353e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3", 35440d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i586-suse-linux", 35540d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i586-suse-linux", 35640d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 357e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // openSUSE 11.1 64 bit 358e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3", 35940d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "x86_64-suse-linux/32", 36040d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "x86_64-suse-linux", 36140d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 362e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // openSUSE 11.2 363e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4", 36440d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i586-suse-linux", 36540d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i586-suse-linux", 36640d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 367e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4", 36840d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "x86_64-suse-linux", 36940d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "x86_64-suse-linux", 37040d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 371e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Arch Linux 2008-06-24 372e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.1", 37340d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i686-pc-linux-gnu", 37440d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i686-pc-linux-gnu", 37540d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 376e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.1", 37740d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "x86_64-unknown-linux-gnu", 37840d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "x86_64-unknown-linux-gnu", 37940d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 380e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Gentoo x86 2009.1 stable 381e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths( 38240d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4", 38340d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i686-pc-linux-gnu", 38440d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i686-pc-linux-gnu", 38540d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 386e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Gentoo x86 2009.0 stable 387e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths( 38840d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4", 38940d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i686-pc-linux-gnu", 39040d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i686-pc-linux-gnu", 39140d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 392e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Gentoo x86 2008.0 stable 393e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths( 39440d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include/g++-v4", 39540d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i686-pc-linux-gnu", 39640d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i686-pc-linux-gnu", 39740d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 398e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Ubuntu 8.10 399e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3", 40040d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i486-pc-linux-gnu", 40140d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i486-pc-linux-gnu", 40240d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 403e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Ubuntu 9.04 404e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3", 40540d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i486-linux-gnu", 40640d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson "i486-linux-gnu", 40740d1bb6383c14d5f8249d0640e8088a91b694c66John Thompson triple); 408e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Gentoo amd64 stable 409e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths( 410e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola "/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/include/g++-v4", 411e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola "i686-pc-linux-gnu", 412e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola "i686-pc-linux-gnu", 413e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola triple); 4145d7a188cbc66d0af5aa3c135942a9e4aa7cb69f9Benjamin Kramer // Exherbo (2009-10-26) 4155d7a188cbc66d0af5aa3c135942a9e4aa7cb69f9Benjamin Kramer AddGnuCPlusPlusIncludePaths( 4165d7a188cbc66d0af5aa3c135942a9e4aa7cb69f9Benjamin Kramer "/usr/include/c++/4.4.2", 4175d7a188cbc66d0af5aa3c135942a9e4aa7cb69f9Benjamin Kramer "x86_64-pc-linux-gnu/32", 4185d7a188cbc66d0af5aa3c135942a9e4aa7cb69f9Benjamin Kramer "x86_64-pc-linux-gnu", 4195d7a188cbc66d0af5aa3c135942a9e4aa7cb69f9Benjamin Kramer triple); 4205d7a188cbc66d0af5aa3c135942a9e4aa7cb69f9Benjamin Kramer AddGnuCPlusPlusIncludePaths( 4215d7a188cbc66d0af5aa3c135942a9e4aa7cb69f9Benjamin Kramer "/usr/include/c++/4.4.2", 4225d7a188cbc66d0af5aa3c135942a9e4aa7cb69f9Benjamin Kramer "i686-pc-linux-gnu", 4235d7a188cbc66d0af5aa3c135942a9e4aa7cb69f9Benjamin Kramer "i686-pc-linux-gnu", 4245d7a188cbc66d0af5aa3c135942a9e4aa7cb69f9Benjamin Kramer triple); 425e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola break; 426e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola case llvm::Triple::FreeBSD: 427e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // DragonFly 428e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddPath("/usr/include/c++/4.1", System, true, false, false); 429e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // FreeBSD 430e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddPath("/usr/include/c++/4.2", System, true, false, false); 431e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola break; 432e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola case llvm::Triple::Solaris: 433e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // Solaris - Fall though.. 434e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola case llvm::Triple::AuroraUX: 435e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola // AuroraUX 436e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddGnuCPlusPlusIncludePaths("/opt/gcc4/include/c++/4.2.4", 437e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola "i386-pc-solaris2.11", 438e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola "i386-pc-solaris2.11", 439e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola triple); 440e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola break; 441e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola default: 442e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola break; 443e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola } 444e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola} 445e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola 446e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindolavoid InitHeaderSearch::AddDefaultSystemIncludePaths(const LangOptions &Lang, 447e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola const llvm::Triple &triple) { 448e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddDefaultCIncludePaths(triple); 449e166582f8f36f4db8f4ea157538fab7fe6bf2658Daniel Dunbar 450e166582f8f36f4db8f4ea157538fab7fe6bf2658Daniel Dunbar // Add the default framework include paths on Darwin. 451e166582f8f36f4db8f4ea157538fab7fe6bf2658Daniel Dunbar if (triple.getOS() == llvm::Triple::Darwin) { 452e166582f8f36f4db8f4ea157538fab7fe6bf2658Daniel Dunbar AddPath("/System/Library/Frameworks", System, true, false, true); 453e166582f8f36f4db8f4ea157538fab7fe6bf2658Daniel Dunbar AddPath("/Library/Frameworks", System, true, false, true); 454e166582f8f36f4db8f4ea157538fab7fe6bf2658Daniel Dunbar } 455e166582f8f36f4db8f4ea157538fab7fe6bf2658Daniel Dunbar 456e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola if (Lang.CPlusPlus) 457e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola AddDefaultCPlusPlusIncludePaths(triple); 458e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola} 459e4b255c80a786c6f16d3f0362ecb7e1b1e959f63Rafael Espindola 4600fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber/// RemoveDuplicates - If there are duplicate directory entries in the specified 4610fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber/// search list, remove the later (dead) ones. 4620fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weberstatic void RemoveDuplicates(std::vector<DirectoryLookup> &SearchList, 4630fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber bool Verbose) { 4640fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber llvm::SmallPtrSet<const DirectoryEntry *, 8> SeenDirs; 4650fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber llvm::SmallPtrSet<const DirectoryEntry *, 8> SeenFrameworkDirs; 4660fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber llvm::SmallPtrSet<const HeaderMap *, 8> SeenHeaderMaps; 4670fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber for (unsigned i = 0; i != SearchList.size(); ++i) { 4687a739401983eb9bc25c9b4b25177e116f5e5ba92Chris Lattner unsigned DirToRemove = i; 4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47043eee07270bf1966ea7289310066aa670c4b647fChris Lattner const DirectoryLookup &CurEntry = SearchList[i]; 4711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47243eee07270bf1966ea7289310066aa670c4b647fChris Lattner if (CurEntry.isNormalDir()) { 4730fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // If this isn't the first time we've seen this dir, remove it. 47443eee07270bf1966ea7289310066aa670c4b647fChris Lattner if (SeenDirs.insert(CurEntry.getDir())) 4750fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber continue; 47643eee07270bf1966ea7289310066aa670c4b647fChris Lattner } else if (CurEntry.isFramework()) { 4770fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // If this isn't the first time we've seen this framework dir, remove it. 47843eee07270bf1966ea7289310066aa670c4b647fChris Lattner if (SeenFrameworkDirs.insert(CurEntry.getFrameworkDir())) 4790fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber continue; 4800fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } else { 48143eee07270bf1966ea7289310066aa670c4b647fChris Lattner assert(CurEntry.isHeaderMap() && "Not a headermap or normal dir?"); 4820fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // If this isn't the first time we've seen this headermap, remove it. 48343eee07270bf1966ea7289310066aa670c4b647fChris Lattner if (SeenHeaderMaps.insert(CurEntry.getHeaderMap())) 4840fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber continue; 48530f05b553db067c994966daca37e75324ee7b424Chris Lattner } 4861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48730f05b553db067c994966daca37e75324ee7b424Chris Lattner // If we have a normal #include dir/framework/headermap that is shadowed 48830f05b553db067c994966daca37e75324ee7b424Chris Lattner // later in the chain by a system include location, we actually want to 48930f05b553db067c994966daca37e75324ee7b424Chris Lattner // ignore the user's request and drop the user dir... keeping the system 49030f05b553db067c994966daca37e75324ee7b424Chris Lattner // dir. This is weird, but required to emulate GCC's search path correctly. 49130f05b553db067c994966daca37e75324ee7b424Chris Lattner // 49230f05b553db067c994966daca37e75324ee7b424Chris Lattner // Since dupes of system dirs are rare, just rescan to find the original 49330f05b553db067c994966daca37e75324ee7b424Chris Lattner // that we're nuking instead of using a DenseMap. 49443eee07270bf1966ea7289310066aa670c4b647fChris Lattner if (CurEntry.getDirCharacteristic() != SrcMgr::C_User) { 49530f05b553db067c994966daca37e75324ee7b424Chris Lattner // Find the dir that this is the same of. 49630f05b553db067c994966daca37e75324ee7b424Chris Lattner unsigned FirstDir; 49730f05b553db067c994966daca37e75324ee7b424Chris Lattner for (FirstDir = 0; ; ++FirstDir) { 49830f05b553db067c994966daca37e75324ee7b424Chris Lattner assert(FirstDir != i && "Didn't find dupe?"); 4991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 50043eee07270bf1966ea7289310066aa670c4b647fChris Lattner const DirectoryLookup &SearchEntry = SearchList[FirstDir]; 50143eee07270bf1966ea7289310066aa670c4b647fChris Lattner 50230f05b553db067c994966daca37e75324ee7b424Chris Lattner // If these are different lookup types, then they can't be the dupe. 50343eee07270bf1966ea7289310066aa670c4b647fChris Lattner if (SearchEntry.getLookupType() != CurEntry.getLookupType()) 50430f05b553db067c994966daca37e75324ee7b424Chris Lattner continue; 5051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 50630f05b553db067c994966daca37e75324ee7b424Chris Lattner bool isSame; 50743eee07270bf1966ea7289310066aa670c4b647fChris Lattner if (CurEntry.isNormalDir()) 50843eee07270bf1966ea7289310066aa670c4b647fChris Lattner isSame = SearchEntry.getDir() == CurEntry.getDir(); 50943eee07270bf1966ea7289310066aa670c4b647fChris Lattner else if (CurEntry.isFramework()) 51043eee07270bf1966ea7289310066aa670c4b647fChris Lattner isSame = SearchEntry.getFrameworkDir() == CurEntry.getFrameworkDir(); 51130f05b553db067c994966daca37e75324ee7b424Chris Lattner else { 51243eee07270bf1966ea7289310066aa670c4b647fChris Lattner assert(CurEntry.isHeaderMap() && "Not a headermap or normal dir?"); 51343eee07270bf1966ea7289310066aa670c4b647fChris Lattner isSame = SearchEntry.getHeaderMap() == CurEntry.getHeaderMap(); 51430f05b553db067c994966daca37e75324ee7b424Chris Lattner } 5151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 51630f05b553db067c994966daca37e75324ee7b424Chris Lattner if (isSame) 51730f05b553db067c994966daca37e75324ee7b424Chris Lattner break; 51830f05b553db067c994966daca37e75324ee7b424Chris Lattner } 5191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 52030f05b553db067c994966daca37e75324ee7b424Chris Lattner // If the first dir in the search path is a non-system dir, zap it 52130f05b553db067c994966daca37e75324ee7b424Chris Lattner // instead of the system one. 52230f05b553db067c994966daca37e75324ee7b424Chris Lattner if (SearchList[FirstDir].getDirCharacteristic() == SrcMgr::C_User) 52330f05b553db067c994966daca37e75324ee7b424Chris Lattner DirToRemove = FirstDir; 52430f05b553db067c994966daca37e75324ee7b424Chris Lattner } 52530f05b553db067c994966daca37e75324ee7b424Chris Lattner 52630f05b553db067c994966daca37e75324ee7b424Chris Lattner if (Verbose) { 52743eee07270bf1966ea7289310066aa670c4b647fChris Lattner fprintf(stderr, "ignoring duplicate directory \"%s\"\n", 52843eee07270bf1966ea7289310066aa670c4b647fChris Lattner CurEntry.getName()); 52930f05b553db067c994966daca37e75324ee7b424Chris Lattner if (DirToRemove != i) 53030f05b553db067c994966daca37e75324ee7b424Chris Lattner fprintf(stderr, " as it is a non-system directory that duplicates" 53130f05b553db067c994966daca37e75324ee7b424Chris Lattner " a system directory\n"); 5320fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 5331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5347a739401983eb9bc25c9b4b25177e116f5e5ba92Chris Lattner // This is reached if the current entry is a duplicate. Remove the 5357a739401983eb9bc25c9b4b25177e116f5e5ba92Chris Lattner // DirToRemove (usually the current dir). 5367a739401983eb9bc25c9b4b25177e116f5e5ba92Chris Lattner SearchList.erase(SearchList.begin()+DirToRemove); 5370fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber --i; 5380fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 5390fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber} 5400fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 5410fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 5420fca022d77b89100e746f4d659b84ed5b1ee0158Nico Webervoid InitHeaderSearch::Realize() { 5430fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // Concatenate ANGLE+SYSTEM+AFTER chains together into SearchList. 5440fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber std::vector<DirectoryLookup> SearchList; 5450fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber SearchList = IncludeGroup[Angled]; 5460fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber SearchList.insert(SearchList.end(), IncludeGroup[System].begin(), 5470fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber IncludeGroup[System].end()); 5480fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber SearchList.insert(SearchList.end(), IncludeGroup[After].begin(), 5490fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber IncludeGroup[After].end()); 5500fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber RemoveDuplicates(SearchList, Verbose); 5510fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber RemoveDuplicates(IncludeGroup[Quoted], Verbose); 5521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5530fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // Prepend QUOTED list on the search list. 5541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SearchList.insert(SearchList.begin(), IncludeGroup[Quoted].begin(), 5550fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber IncludeGroup[Quoted].end()); 5561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5570fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 5580fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber bool DontSearchCurDir = false; // TODO: set to true if -I- is set? 5590fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber Headers.SetSearchPaths(SearchList, IncludeGroup[Quoted].size(), 5600fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber DontSearchCurDir); 5610fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 5620fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // If verbose, print the list of directories that will be searched. 5630fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (Verbose) { 5640fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber fprintf(stderr, "#include \"...\" search starts here:\n"); 5650fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber unsigned QuotedIdx = IncludeGroup[Quoted].size(); 5660fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber for (unsigned i = 0, e = SearchList.size(); i != e; ++i) { 5670fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (i == QuotedIdx) 5680fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber fprintf(stderr, "#include <...> search starts here:\n"); 5690fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber const char *Name = SearchList[i].getName(); 5700fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber const char *Suffix; 5710fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (SearchList[i].isNormalDir()) 5720fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber Suffix = ""; 5730fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber else if (SearchList[i].isFramework()) 5740fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber Suffix = " (framework directory)"; 5750fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber else { 5760fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber assert(SearchList[i].isHeaderMap() && "Unknown DirectoryLookup"); 5770fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber Suffix = " (headermap)"; 5780fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 5790fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber fprintf(stderr, " %s%s\n", Name, Suffix); 5800fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 5810fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber fprintf(stderr, "End of search list.\n"); 5820fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 5830fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber} 58463c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar 58563c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbarvoid clang::ApplyHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 58663c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar HeaderSearch &HS, const LangOptions &Lang, 58763c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar const llvm::Triple &Triple) { 58863c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar InitHeaderSearch Init(HS, HSOpts.Verbose, HSOpts.Sysroot); 58963c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar 59063c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar // Add the user defined entries. 59163c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar for (unsigned i = 0, e = HSOpts.UserEntries.size(); i != e; ++i) { 59263c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar const HeaderSearchOptions::Entry &E = HSOpts.UserEntries[i]; 59363c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar Init.AddPath(E.Path, E.Group, E.IsCXXAware, E.IsUserSupplied, E.IsFramework, 59463c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar E.IgnoreSysRoot); 59563c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar } 59663c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar 59763c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar // Add entries from CPATH and friends. 59863c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar Init.AddDelimitedPaths(HSOpts.EnvIncPath.c_str()); 59963c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar Init.AddDelimitedPaths(HSOpts.LangEnvIncPath.c_str()); 60063c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar 60163c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar if (!HSOpts.BuiltinIncludePath.empty()) { 60263c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar // Ignore the sys root, we *always* look for clang headers relative to 60363c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar // supplied path. 60463c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar Init.AddPath(HSOpts.BuiltinIncludePath, InitHeaderSearch::System, 60563c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar false, false, false, /*IgnoreSysRoot=*/ true); 60663c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar } 60763c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar 60863c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar if (!HSOpts.UseStandardIncludes) 60963c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar Init.AddDefaultSystemIncludePaths(Lang, Triple); 61063c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar 61163c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar Init.Realize(); 61263c8b77334f90472260d2f48df2742ed5067261eDaniel Dunbar} 613