[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