InitHeaderSearch.cpp revision 1eb4433ac451dc16f4133a88af2d002ac26c58ef
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/Lex/HeaderSearch.h" 160fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber#include "clang/Basic/FileManager.h" 170fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber#include "clang/Basic/LangOptions.h" 180fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber#include "llvm/ADT/SmallString.h" 190fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber#include "llvm/ADT/SmallPtrSet.h" 20d57a7ef9252964bc6c8471451d7bd395b0520cb8Chris Lattner#include "llvm/Support/raw_ostream.h" 210fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber#include "llvm/System/Path.h" 22121e3c207415fb4c105d690de384d8f3d49b0f2dArgyrios Kyrtzidis#include "llvm/Config/config.h" 233daed52a57d03765223021f5f921bdc280c8f3ccChris Lattner#include <cstdio> 240fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weberusing namespace clang; 250fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 26458fb10ef5ba2d7b375c6c64095c1458af0a5be3Benjamin Kramervoid InitHeaderSearch::AddPath(const llvm::StringRef &Path, 27458fb10ef5ba2d7b375c6c64095c1458af0a5be3Benjamin Kramer IncludeDirGroup Group, bool isCXXAware, 28458fb10ef5ba2d7b375c6c64095c1458af0a5be3Benjamin Kramer bool isUserSupplied, bool isFramework, 29458fb10ef5ba2d7b375c6c64095c1458af0a5be3Benjamin Kramer bool IgnoreSysRoot) { 300fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber assert(!Path.empty() && "can't handle empty path here"); 310fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber FileManager &FM = Headers.getFileMgr(); 321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 330fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // Compute the actual path, taking into consideration -isysroot. 340fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber llvm::SmallString<256> MappedPath; 351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 360fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // Handle isysroot. 376858dd3fcc2d3ac6a706a0294be1d3ac51849022Chris Lattner if (Group == System && !IgnoreSysRoot) { 380fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // FIXME: Portability. This should be a sys::Path interface, this doesn't 390fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // handle things like C:\ right, nor win32 \\network\device\blah. 400fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (isysroot.size() != 1 || isysroot[0] != '/') // Add isysroot if present. 410fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber MappedPath.append(isysroot.begin(), isysroot.end()); 420fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 440fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber MappedPath.append(Path.begin(), Path.end()); 450fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 460fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // Compute the DirectoryLookup type. 479d72851fec9e9c62570a027d42701562bbf29751Chris Lattner SrcMgr::CharacteristicKind Type; 480fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (Group == Quoted || Group == Angled) 490b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner Type = SrcMgr::C_User; 500fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber else if (isCXXAware) 510b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner Type = SrcMgr::C_System; 520fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber else 530b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner Type = SrcMgr::C_ExternCSystem; 541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 560fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // If the directory exists, add it. 57458fb10ef5ba2d7b375c6c64095c1458af0a5be3Benjamin Kramer if (const DirectoryEntry *DE = FM.getDirectory(MappedPath.str())) { 580fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber IncludeGroup[Group].push_back(DirectoryLookup(DE, Type, isUserSupplied, 590fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber isFramework)); 600fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber return; 610fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 630fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // Check to see if this is an apple-style headermap (which are not allowed to 640fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // be frameworks). 650fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (!isFramework) { 66458fb10ef5ba2d7b375c6c64095c1458af0a5be3Benjamin Kramer if (const FileEntry *FE = FM.getFile(MappedPath.str())) { 670fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (const HeaderMap *HM = Headers.CreateHeaderMap(FE)) { 680fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // It is a headermap, add it to the search path. 690fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber IncludeGroup[Group].push_back(DirectoryLookup(HM, Type,isUserSupplied)); 700fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber return; 710fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 720fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 730fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 750fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (Verbose) 767765934ad7e157b5fcf925792a38e01b1edbcf8aDaniel Dunbar llvm::errs() << "ignoring nonexistent directory \"" 777765934ad7e157b5fcf925792a38e01b1edbcf8aDaniel Dunbar << MappedPath.str() << "\"\n"; 780fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber} 790fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 800fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 810fca022d77b89100e746f4d659b84ed5b1ee0158Nico Webervoid InitHeaderSearch::AddEnvVarPaths(const char *Name) { 820fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber const char* at = getenv(Name); 83bb95255e08c5d56616f5581118f5babe2c4e6ea6Daniel Dunbar if (!at || *at == 0) // Empty string should not add '.' path. 840fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber return; 850fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 860fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber const char* delim = strchr(at, llvm::sys::PathSeparator); 870fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber while (delim != 0) { 880fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (delim-at == 0) 890fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath(".", Angled, false, true, false); 900fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber else 91458fb10ef5ba2d7b375c6c64095c1458af0a5be3Benjamin Kramer AddPath(llvm::StringRef(at, delim-at), Angled, false, true, false); 920fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber at = delim + 1; 930fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber delim = strchr(at, llvm::sys::PathSeparator); 940fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 950fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (*at == 0) 960fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath(".", Angled, false, true, false); 970fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber else 980fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath(at, Angled, false, true, false); 990fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber} 1000fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 1010fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 1020fca022d77b89100e746f4d659b84ed5b1ee0158Nico Webervoid InitHeaderSearch::AddDefaultSystemIncludePaths(const LangOptions &Lang) { 1030fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // FIXME: temporary hack: hard-coded paths. 1040fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // FIXME: get these from the target? 105121e3c207415fb4c105d690de384d8f3d49b0f2dArgyrios Kyrtzidis 106121e3c207415fb4c105d690de384d8f3d49b0f2dArgyrios Kyrtzidis#ifdef LLVM_ON_WIN32 107121e3c207415fb4c105d690de384d8f3d49b0f2dArgyrios Kyrtzidis if (Lang.CPlusPlus) { 108121e3c207415fb4c105d690de384d8f3d49b0f2dArgyrios Kyrtzidis // Mingw32 GCC version 4 1096f541026b6dffc2801ed825d769e5fa0af95178dChris Lattner AddPath("c:/mingw/lib/gcc/mingw32/4.3.0/include/c++", 1106f541026b6dffc2801ed825d769e5fa0af95178dChris Lattner System, true, false, false); 1116f541026b6dffc2801ed825d769e5fa0af95178dChris Lattner AddPath("c:/mingw/lib/gcc/mingw32/4.3.0/include/c++/mingw32", 1126f541026b6dffc2801ed825d769e5fa0af95178dChris Lattner System, true, false, false); 1136f541026b6dffc2801ed825d769e5fa0af95178dChris Lattner AddPath("c:/mingw/lib/gcc/mingw32/4.3.0/include/c++/backward", 1146f541026b6dffc2801ed825d769e5fa0af95178dChris Lattner System, true, false, false); 115121e3c207415fb4c105d690de384d8f3d49b0f2dArgyrios Kyrtzidis } 116121e3c207415fb4c105d690de384d8f3d49b0f2dArgyrios Kyrtzidis 117121e3c207415fb4c105d690de384d8f3d49b0f2dArgyrios Kyrtzidis // Mingw32 GCC version 4 118121e3c207415fb4c105d690de384d8f3d49b0f2dArgyrios Kyrtzidis AddPath("C:/mingw/include", System, false, false, false); 119121e3c207415fb4c105d690de384d8f3d49b0f2dArgyrios Kyrtzidis#else 120121e3c207415fb4c105d690de384d8f3d49b0f2dArgyrios Kyrtzidis 1210fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (Lang.CPlusPlus) { 1220fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.2.1", System, true, false, false); 1230fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.2.1/i686-apple-darwin10", System, true, false, 1240fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber false); 1250fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.2.1/backward", System, true, false, false); 1260fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 1270fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.0.0", System, true, false, false); 1280fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.0.0/i686-apple-darwin8", System, true, false, 1290fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber false); 1300fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.0.0/backward", System, true, false, false); 1310fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 1320fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // Ubuntu 7.10 - Gutsy Gibbon 1330fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.1.3", System, true, false, false); 1340fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.1.3/i486-linux-gnu", System, true, false, 1350fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber false); 1360fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.1.3/backward", System, true, false, false); 1370fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 13815e92322a77c6b6f03da76f0cecd598b5ccdf877Douglas Gregor // Ubuntu 9.04 13915e92322a77c6b6f03da76f0cecd598b5ccdf877Douglas Gregor AddPath("/usr/include/c++/4.3.3", System, true, false, false); 14015e92322a77c6b6f03da76f0cecd598b5ccdf877Douglas Gregor AddPath("/usr/include/c++/4.3.3/x86_64-linux-gnu/", System, true, false, 14115e92322a77c6b6f03da76f0cecd598b5ccdf877Douglas Gregor false); 14215e92322a77c6b6f03da76f0cecd598b5ccdf877Douglas Gregor AddPath("/usr/include/c++/4.3.3/backward", System, true, false, false); 14315e92322a77c6b6f03da76f0cecd598b5ccdf877Douglas Gregor 1440fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // Fedora 8 1450fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.1.2", System, true, false, false); 1460fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.1.2/i386-redhat-linux", System, true, false, 1470fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber false); 1480fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.1.2/backward", System, true, false, false); 1490fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 1500fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // Fedora 9 1510fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.3.0", System, true, false, false); 1520fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.3.0/i386-redhat-linux", System, true, false, 1530fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber false); 1540fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.3.0/backward", System, true, false, false); 1550fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 156776caefc70360a00ee860f63d7f76288d5f41d87Zhongxing Xu // Fedora 10 157776caefc70360a00ee860f63d7f76288d5f41d87Zhongxing Xu AddPath("/usr/include/c++/4.3.2", System, true, false, false); 158776caefc70360a00ee860f63d7f76288d5f41d87Zhongxing Xu AddPath("/usr/include/c++/4.3.2/i386-redhat-linux", System, true, false, 159776caefc70360a00ee860f63d7f76288d5f41d87Zhongxing Xu false); 160776caefc70360a00ee860f63d7f76288d5f41d87Zhongxing Xu AddPath("/usr/include/c++/4.3.2/backward", System, true, false, false); 161776caefc70360a00ee860f63d7f76288d5f41d87Zhongxing Xu 162ef888a4d7f0fa1596807f702d09df88044dcaf41Chris Lattner // openSUSE 11.1 163ef888a4d7f0fa1596807f702d09df88044dcaf41Chris Lattner AddPath("/usr/include/c++/4.3", System, true, false, false); 164ef888a4d7f0fa1596807f702d09df88044dcaf41Chris Lattner AddPath("/usr/include/c++/4.3/i586-suse-linux", System, true, false, 165ef888a4d7f0fa1596807f702d09df88044dcaf41Chris Lattner false); 166ef888a4d7f0fa1596807f702d09df88044dcaf41Chris Lattner AddPath("/usr/include/c++/4.3/x86_64-suse-linux", System, true, false, 167ef888a4d7f0fa1596807f702d09df88044dcaf41Chris Lattner false); 168ef888a4d7f0fa1596807f702d09df88044dcaf41Chris Lattner AddPath("/usr/include/c++/4.3/backward", System, true, false, false); 169ef888a4d7f0fa1596807f702d09df88044dcaf41Chris Lattner 170ef888a4d7f0fa1596807f702d09df88044dcaf41Chris Lattner // openSUSE 11.2 171ef888a4d7f0fa1596807f702d09df88044dcaf41Chris Lattner AddPath("/usr/include/c++/4.4", System, true, false, false); 172ef888a4d7f0fa1596807f702d09df88044dcaf41Chris Lattner AddPath("/usr/include/c++/4.4/i586-suse-linux", System, true, false, 173ef888a4d7f0fa1596807f702d09df88044dcaf41Chris Lattner false); 174ef888a4d7f0fa1596807f702d09df88044dcaf41Chris Lattner AddPath("/usr/include/c++/4.4/x86_64-suse-linux", System, true, false, 175ef888a4d7f0fa1596807f702d09df88044dcaf41Chris Lattner false); 176ef888a4d7f0fa1596807f702d09df88044dcaf41Chris Lattner AddPath("/usr/include/c++/4.4/backward", System, true, false, false); 177ef888a4d7f0fa1596807f702d09df88044dcaf41Chris Lattner 1780fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // Arch Linux 2008-06-24 1790fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.3.1", System, true, false, false); 1800fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.3.1/i686-pc-linux-gnu", System, true, false, 1810fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber false); 1820fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.3.1/backward", System, true, false, false); 1830fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include/c++/4.3.1/x86_64-unknown-linux-gnu", System, true, 1840fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber false, false); 1855654ffda8f44cb11e3380823a99f6556961bdc16Chris Lattner 186ec9fd769d0bf3fe8b20790f5c34e9484da006eacNuno Lopes // Gentoo x86 2009.0 stable 187ec9fd769d0bf3fe8b20790f5c34e9484da006eacNuno Lopes AddPath("/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4", System, 188ec9fd769d0bf3fe8b20790f5c34e9484da006eacNuno Lopes true, false, false); 189ec9fd769d0bf3fe8b20790f5c34e9484da006eacNuno Lopes AddPath("/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/" 190ec9fd769d0bf3fe8b20790f5c34e9484da006eacNuno Lopes "i686-pc-linux-gnu", System, true, false, false); 191ec9fd769d0bf3fe8b20790f5c34e9484da006eacNuno Lopes AddPath(" /usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/backward", 192ec9fd769d0bf3fe8b20790f5c34e9484da006eacNuno Lopes System, true, false, false); 193ec9fd769d0bf3fe8b20790f5c34e9484da006eacNuno Lopes 194ec9fd769d0bf3fe8b20790f5c34e9484da006eacNuno Lopes // Gentoo x86 2008.0 stable 195a3d783b11fc8a48ef9a024aaacba8caf43961de5Nuno Lopes AddPath("/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include/g++-v4", System, 196a3d783b11fc8a48ef9a024aaacba8caf43961de5Nuno Lopes true, false, false); 197a3d783b11fc8a48ef9a024aaacba8caf43961de5Nuno Lopes AddPath("/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include/g++-v4/" 198a3d783b11fc8a48ef9a024aaacba8caf43961de5Nuno Lopes "i686-pc-linux-gnu", System, true, false, false); 199a3d783b11fc8a48ef9a024aaacba8caf43961de5Nuno Lopes AddPath("/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include/g++-v4/backward", 200a3d783b11fc8a48ef9a024aaacba8caf43961de5Nuno Lopes System, true, false, false); 201a3d783b11fc8a48ef9a024aaacba8caf43961de5Nuno Lopes 20203d6b6eba2bcc4eb4524fce28a2f8a018223bb01Eli Friedman // Ubuntu 8.10 20303d6b6eba2bcc4eb4524fce28a2f8a018223bb01Eli Friedman AddPath("/usr/include/c++/4.3/i486-linux-gnu", System, true, false, false); 20403d6b6eba2bcc4eb4524fce28a2f8a018223bb01Eli Friedman 2054d374d4a4832a01d5d3b75c59cb1567e60df41e7Sebastian Redl // Gentoo amd64 stable 2064d374d4a4832a01d5d3b75c59cb1567e60df41e7Sebastian Redl AddPath("/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/include/g++-v4", System, 2074d374d4a4832a01d5d3b75c59cb1567e60df41e7Sebastian Redl true, false, false); 2084d374d4a4832a01d5d3b75c59cb1567e60df41e7Sebastian Redl AddPath("/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/include/g++-v4/" 2094d374d4a4832a01d5d3b75c59cb1567e60df41e7Sebastian Redl "i686-pc-linux-gnu", System, true, false, false); 2104d374d4a4832a01d5d3b75c59cb1567e60df41e7Sebastian Redl AddPath("/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/include/g++-v4/backward", 2114d374d4a4832a01d5d3b75c59cb1567e60df41e7Sebastian Redl System, true, false, false); 2124d374d4a4832a01d5d3b75c59cb1567e60df41e7Sebastian Redl 2135654ffda8f44cb11e3380823a99f6556961bdc16Chris Lattner // DragonFly 2145654ffda8f44cb11e3380823a99f6556961bdc16Chris Lattner AddPath("/usr/include/c++/4.1", System, true, false, false); 21501e4b5c3bf9f529c0c873162119d56a4f9341167Chris Lattner 21601e4b5c3bf9f529c0c873162119d56a4f9341167Chris Lattner // FreeBSD 21701e4b5c3bf9f529c0c873162119d56a4f9341167Chris Lattner AddPath("/usr/include/c++/4.2", System, true, false, false); 218868d01660de7fa9f3475b49d58e8a6a8067cb4d2Eli Friedman 219868d01660de7fa9f3475b49d58e8a6a8067cb4d2Eli Friedman // AuroraUX 220868d01660de7fa9f3475b49d58e8a6a8067cb4d2Eli Friedman AddPath("/opt/gcc4/include/c++/4.2.4", System, true, false, false); 2212ef398c69809edf816a942e3265df32983a87985Eli Friedman AddPath("/opt/gcc4/include/c++/4.2.4/i386-pc-solaris2.11", System, true, false, false); 2220fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 2230fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 2240fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/local/include", System, false, false, false); 2250fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 2260fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/usr/include", System, false, false, false); 2270fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/System/Library/Frameworks", System, true, false, true); 2280fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddPath("/Library/Frameworks", System, true, false, true); 229121e3c207415fb4c105d690de384d8f3d49b0f2dArgyrios Kyrtzidis#endif 2300fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber} 2310fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 2320fca022d77b89100e746f4d659b84ed5b1ee0158Nico Webervoid InitHeaderSearch::AddDefaultEnvVarPaths(const LangOptions &Lang) { 2330fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddEnvVarPaths("CPATH"); 2340fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (Lang.CPlusPlus && Lang.ObjC1) 2350fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddEnvVarPaths("OBJCPLUS_INCLUDE_PATH"); 2360fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber else if (Lang.CPlusPlus) 2370fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddEnvVarPaths("CPLUS_INCLUDE_PATH"); 2380fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber else if (Lang.ObjC1) 2390fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddEnvVarPaths("OBJC_INCLUDE_PATH"); 2400fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber else 2410fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber AddEnvVarPaths("C_INCLUDE_PATH"); 2420fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber} 2430fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 2440fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 2450fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber/// RemoveDuplicates - If there are duplicate directory entries in the specified 2460fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber/// search list, remove the later (dead) ones. 2470fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weberstatic void RemoveDuplicates(std::vector<DirectoryLookup> &SearchList, 2480fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber bool Verbose) { 2490fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber llvm::SmallPtrSet<const DirectoryEntry *, 8> SeenDirs; 2500fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber llvm::SmallPtrSet<const DirectoryEntry *, 8> SeenFrameworkDirs; 2510fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber llvm::SmallPtrSet<const HeaderMap *, 8> SeenHeaderMaps; 2520fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber for (unsigned i = 0; i != SearchList.size(); ++i) { 2537a739401983eb9bc25c9b4b25177e116f5e5ba92Chris Lattner unsigned DirToRemove = i; 2541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25543eee07270bf1966ea7289310066aa670c4b647fChris Lattner const DirectoryLookup &CurEntry = SearchList[i]; 2561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25743eee07270bf1966ea7289310066aa670c4b647fChris Lattner if (CurEntry.isNormalDir()) { 2580fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // If this isn't the first time we've seen this dir, remove it. 25943eee07270bf1966ea7289310066aa670c4b647fChris Lattner if (SeenDirs.insert(CurEntry.getDir())) 2600fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber continue; 26143eee07270bf1966ea7289310066aa670c4b647fChris Lattner } else if (CurEntry.isFramework()) { 2620fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // If this isn't the first time we've seen this framework dir, remove it. 26343eee07270bf1966ea7289310066aa670c4b647fChris Lattner if (SeenFrameworkDirs.insert(CurEntry.getFrameworkDir())) 2640fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber continue; 2650fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } else { 26643eee07270bf1966ea7289310066aa670c4b647fChris Lattner assert(CurEntry.isHeaderMap() && "Not a headermap or normal dir?"); 2670fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // If this isn't the first time we've seen this headermap, remove it. 26843eee07270bf1966ea7289310066aa670c4b647fChris Lattner if (SeenHeaderMaps.insert(CurEntry.getHeaderMap())) 2690fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber continue; 27030f05b553db067c994966daca37e75324ee7b424Chris Lattner } 2711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27230f05b553db067c994966daca37e75324ee7b424Chris Lattner // If we have a normal #include dir/framework/headermap that is shadowed 27330f05b553db067c994966daca37e75324ee7b424Chris Lattner // later in the chain by a system include location, we actually want to 27430f05b553db067c994966daca37e75324ee7b424Chris Lattner // ignore the user's request and drop the user dir... keeping the system 27530f05b553db067c994966daca37e75324ee7b424Chris Lattner // dir. This is weird, but required to emulate GCC's search path correctly. 27630f05b553db067c994966daca37e75324ee7b424Chris Lattner // 27730f05b553db067c994966daca37e75324ee7b424Chris Lattner // Since dupes of system dirs are rare, just rescan to find the original 27830f05b553db067c994966daca37e75324ee7b424Chris Lattner // that we're nuking instead of using a DenseMap. 27943eee07270bf1966ea7289310066aa670c4b647fChris Lattner if (CurEntry.getDirCharacteristic() != SrcMgr::C_User) { 28030f05b553db067c994966daca37e75324ee7b424Chris Lattner // Find the dir that this is the same of. 28130f05b553db067c994966daca37e75324ee7b424Chris Lattner unsigned FirstDir; 28230f05b553db067c994966daca37e75324ee7b424Chris Lattner for (FirstDir = 0; ; ++FirstDir) { 28330f05b553db067c994966daca37e75324ee7b424Chris Lattner assert(FirstDir != i && "Didn't find dupe?"); 2841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28543eee07270bf1966ea7289310066aa670c4b647fChris Lattner const DirectoryLookup &SearchEntry = SearchList[FirstDir]; 28643eee07270bf1966ea7289310066aa670c4b647fChris Lattner 28730f05b553db067c994966daca37e75324ee7b424Chris Lattner // If these are different lookup types, then they can't be the dupe. 28843eee07270bf1966ea7289310066aa670c4b647fChris Lattner if (SearchEntry.getLookupType() != CurEntry.getLookupType()) 28930f05b553db067c994966daca37e75324ee7b424Chris Lattner continue; 2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29130f05b553db067c994966daca37e75324ee7b424Chris Lattner bool isSame; 29243eee07270bf1966ea7289310066aa670c4b647fChris Lattner if (CurEntry.isNormalDir()) 29343eee07270bf1966ea7289310066aa670c4b647fChris Lattner isSame = SearchEntry.getDir() == CurEntry.getDir(); 29443eee07270bf1966ea7289310066aa670c4b647fChris Lattner else if (CurEntry.isFramework()) 29543eee07270bf1966ea7289310066aa670c4b647fChris Lattner isSame = SearchEntry.getFrameworkDir() == CurEntry.getFrameworkDir(); 29630f05b553db067c994966daca37e75324ee7b424Chris Lattner else { 29743eee07270bf1966ea7289310066aa670c4b647fChris Lattner assert(CurEntry.isHeaderMap() && "Not a headermap or normal dir?"); 29843eee07270bf1966ea7289310066aa670c4b647fChris Lattner isSame = SearchEntry.getHeaderMap() == CurEntry.getHeaderMap(); 29930f05b553db067c994966daca37e75324ee7b424Chris Lattner } 3001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30130f05b553db067c994966daca37e75324ee7b424Chris Lattner if (isSame) 30230f05b553db067c994966daca37e75324ee7b424Chris Lattner break; 30330f05b553db067c994966daca37e75324ee7b424Chris Lattner } 3041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30530f05b553db067c994966daca37e75324ee7b424Chris Lattner // If the first dir in the search path is a non-system dir, zap it 30630f05b553db067c994966daca37e75324ee7b424Chris Lattner // instead of the system one. 30730f05b553db067c994966daca37e75324ee7b424Chris Lattner if (SearchList[FirstDir].getDirCharacteristic() == SrcMgr::C_User) 30830f05b553db067c994966daca37e75324ee7b424Chris Lattner DirToRemove = FirstDir; 30930f05b553db067c994966daca37e75324ee7b424Chris Lattner } 31030f05b553db067c994966daca37e75324ee7b424Chris Lattner 31130f05b553db067c994966daca37e75324ee7b424Chris Lattner if (Verbose) { 31243eee07270bf1966ea7289310066aa670c4b647fChris Lattner fprintf(stderr, "ignoring duplicate directory \"%s\"\n", 31343eee07270bf1966ea7289310066aa670c4b647fChris Lattner CurEntry.getName()); 31430f05b553db067c994966daca37e75324ee7b424Chris Lattner if (DirToRemove != i) 31530f05b553db067c994966daca37e75324ee7b424Chris Lattner fprintf(stderr, " as it is a non-system directory that duplicates" 31630f05b553db067c994966daca37e75324ee7b424Chris Lattner " a system directory\n"); 3170fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 3181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3197a739401983eb9bc25c9b4b25177e116f5e5ba92Chris Lattner // This is reached if the current entry is a duplicate. Remove the 3207a739401983eb9bc25c9b4b25177e116f5e5ba92Chris Lattner // DirToRemove (usually the current dir). 3217a739401983eb9bc25c9b4b25177e116f5e5ba92Chris Lattner SearchList.erase(SearchList.begin()+DirToRemove); 3220fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber --i; 3230fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 3240fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber} 3250fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 3260fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 3270fca022d77b89100e746f4d659b84ed5b1ee0158Nico Webervoid InitHeaderSearch::Realize() { 3280fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // Concatenate ANGLE+SYSTEM+AFTER chains together into SearchList. 3290fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber std::vector<DirectoryLookup> SearchList; 3300fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber SearchList = IncludeGroup[Angled]; 3310fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber SearchList.insert(SearchList.end(), IncludeGroup[System].begin(), 3320fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber IncludeGroup[System].end()); 3330fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber SearchList.insert(SearchList.end(), IncludeGroup[After].begin(), 3340fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber IncludeGroup[After].end()); 3350fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber RemoveDuplicates(SearchList, Verbose); 3360fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber RemoveDuplicates(IncludeGroup[Quoted], Verbose); 3371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3380fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // Prepend QUOTED list on the search list. 3391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SearchList.insert(SearchList.begin(), IncludeGroup[Quoted].begin(), 3400fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber IncludeGroup[Quoted].end()); 3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3420fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 3430fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber bool DontSearchCurDir = false; // TODO: set to true if -I- is set? 3440fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber Headers.SetSearchPaths(SearchList, IncludeGroup[Quoted].size(), 3450fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber DontSearchCurDir); 3460fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 3470fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber // If verbose, print the list of directories that will be searched. 3480fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (Verbose) { 3490fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber fprintf(stderr, "#include \"...\" search starts here:\n"); 3500fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber unsigned QuotedIdx = IncludeGroup[Quoted].size(); 3510fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber for (unsigned i = 0, e = SearchList.size(); i != e; ++i) { 3520fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (i == QuotedIdx) 3530fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber fprintf(stderr, "#include <...> search starts here:\n"); 3540fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber const char *Name = SearchList[i].getName(); 3550fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber const char *Suffix; 3560fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber if (SearchList[i].isNormalDir()) 3570fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber Suffix = ""; 3580fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber else if (SearchList[i].isFramework()) 3590fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber Suffix = " (framework directory)"; 3600fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber else { 3610fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber assert(SearchList[i].isHeaderMap() && "Unknown DirectoryLookup"); 3620fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber Suffix = " (headermap)"; 3630fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 3640fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber fprintf(stderr, " %s%s\n", Name, Suffix); 3650fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 3660fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber fprintf(stderr, "End of search list.\n"); 3670fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber } 3680fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber} 3690fca022d77b89100e746f4d659b84ed5b1ee0158Nico Weber 370