[cfe-commits] [PATCH] [Driver] Make default GCC install prefix and sysroot relocatable
Chandler Carruth
chandlerc at gmail.com
Tue Dec 11 01:28:01 PST 2012
On Mon, Dec 10, 2012 at 10:45 PM, Kito Cheng <kito at 0xlab.org> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20121211/b15cefca/attachment.html>
More information about the cfe-commits
mailing list