On Mon, Dec 10, 2012 at 10:45 PM, Kito Cheng <[email protected]> wrote: > Hi chapuni, chandlerc, rafael.espindola, > > Make default GCC install prefix and sysroot relocatable, they are use > absolute path now, so this patch can relocated the path if their prefix is > install prefix (LLVM_PREFIX). > > It's useful for build stand along toolchain, especially for build > toolchain distribution:) >
I don't understand. Neither GCC_INSTALL_PREFIX nor DEFAULT_SYSROOT are set by default. If you can set LLVM_PREFIX, you can just as easily set those two variables. Note that the standard build doesn't set either variable *and* it produces a relocatable clang installation, if that's really what you're after: it uses the path of the clang executable itself to detect a prefix within which GCC might be installed. > > http://llvm-reviews.chandlerc.com/D203 > > Files: > include/clang/Driver/Driver.h > lib/Driver/Driver.cpp > lib/Driver/ToolChains.cpp > > Index: include/clang/Driver/Driver.h > =================================================================== > --- include/clang/Driver/Driver.h > +++ include/clang/Driver/Driver.h > @@ -81,6 +81,9 @@ > /// sysroot, if present > std::string SysRoot; > > + /// Default GCC install path > + std::string DefaultGCCInstallPath; > + > /// If the standard library is used > bool UseStdLib; > > @@ -197,6 +200,11 @@ > const std::string &getTitle() { return DriverTitle; } > void setTitle(std::string Value) { DriverTitle = Value; } > > + /// \brief Get the default path of GCC install prefix > + const char *getDefaultGCCInstallPath() const { > + return DefaultGCCInstallPath.c_str(); > + } > + > /// \brief Get the path to the main clang executable. > const char *getClangProgramPath() const { > return ClangExecutable.c_str(); > Index: lib/Driver/Driver.cpp > =================================================================== > --- lib/Driver/Driver.cpp > +++ lib/Driver/Driver.cpp > @@ -36,16 +36,26 @@ > // FIXME: It would prevent to include llvm-config.h > // if it were included before system_error.h. > #include "clang/Config/config.h" > +#include "llvm/Config/config.h" // for LLVM_PREFIX > > using namespace clang::driver; > using namespace clang; > > +static bool isPrefixFolderOf(StringRef prefix, StringRef path) { > + bool IsEndWithBackslash = ((path.size() >= prefix.size()) && > + path[prefix.size()] == '/') || > + prefix[prefix.size()-1] == '/'; > + bool IsPrefix = path.startswith(prefix); > + return (IsEndWithBackslash && IsPrefix) || prefix.equals(path); > +} > + > Driver::Driver(StringRef ClangExecutable, > StringRef DefaultTargetTriple, > StringRef DefaultImageName, > DiagnosticsEngine &Diags) > : Opts(createDriverOptTable()), Diags(Diags), > ClangExecutable(ClangExecutable), SysRoot(DEFAULT_SYSROOT), > + DefaultGCCInstallPath(GCC_INSTALL_PREFIX), > UseStdLib(true), DefaultTargetTriple(DefaultTargetTriple), > DefaultImageName(DefaultImageName), > DriverTitle("clang LLVM compiler"), > @@ -59,6 +69,33 @@ > Name = llvm::sys::path::stem(ClangExecutable); > Dir = llvm::sys::path::parent_path(ClangExecutable); > > + StringRef DefaultSysroot = DEFAULT_SYSROOT; > + StringRef DefaultGCCInstallPathRef = GCC_INSTALL_PREFIX; > + if (!DefaultSysroot.empty() || !DefaultGCCInstallPathRef.empty()) { > + // Try to relocate the sysroot/gcc install path when prefix of > + // ClangExecutable not equal to LLVM_PREFIX. > + StringRef LLVMPrefix = LLVM_PREFIX; > + if (!isPrefixFolderOf(LLVMPrefix, ClangExecutable)) { > + // We only recognize the case for default sysroot/gcc install path > is > + // sub-folder of install prefix. > + StringRef UpperFolder = "/../"; > + Twine RelocatedBase = Dir + UpperFolder; > + if (isPrefixFolderOf(LLVMPrefix, SysRoot)) { > + // Need relocate sysroot ! > + StringRef RelativePath = DefaultSysroot.data() + > LLVMPrefix.size(); > + Twine RelocatedPath = RelocatedBase + RelativePath; > + SysRoot = RelocatedPath.str(); > + } > + if (isPrefixFolderOf(LLVMPrefix, DefaultGCCInstallPath)) { > + // Need relocate default gcc install path ! > + StringRef RelativePath = DefaultGCCInstallPathRef.data() + > + LLVMPrefix.size(); > + Twine RelocatedPath = RelocatedBase + RelativePath; > + DefaultGCCInstallPath = RelocatedPath.str(); > + } > + } > + } > + > // Compute the path to the resource directory. > StringRef ClangResourceDir(CLANG_RESOURCE_DIR); > SmallString<128> P(Dir); > Index: lib/Driver/ToolChains.cpp > =================================================================== > --- lib/Driver/ToolChains.cpp > +++ lib/Driver/ToolChains.cpp > @@ -33,6 +33,7 @@ > // FIXME: This needs to be listed last until we fix the broken include > guards > // in these files and the LLVM config.h files. > #include "clang/Config/config.h" // for GCC_INSTALL_PREFIX > +#include "llvm/Config/config.h" // for LLVM_PREFIX > > #include <cstdlib> // ::getenv > > @@ -978,11 +979,11 @@ > return false; > } > > -static StringRef getGCCToolchainDir(const ArgList &Args) { > +static StringRef getGCCToolchainDir(const ArgList &Args, const Driver &D) > { > const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain); > if (A) > return A->getValue(); > - return GCC_INSTALL_PREFIX; > + return D.getDefaultGCCInstallPath(); > } > > /// \brief Construct a GCCInstallationDetector from the driver. > @@ -1017,7 +1018,7 @@ > SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(), > D.PrefixDirs.end()); > > - StringRef GCCToolchainDir = getGCCToolchainDir(Args); > + StringRef GCCToolchainDir = getGCCToolchainDir(Args, D); > if (GCCToolchainDir != "") { > if (GCCToolchainDir.back() == '/') > GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the / > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
