From 8afdd56babf69cd8e3b45d0baff0d4fc20d088a0 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Wed, 8 Jun 2011 10:13:14 +0000 Subject: [PATCH] hack in my new variables for GCC git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@132743 91177308-0d34-0410-b5e6-96231b3b80d8 --- CMakeLists.txt | 12 ++++++++ include/clang/Config/config.h.cmake | 12 ++++++++ lib/Driver/ToolChains.cpp | 44 +++++++++++++---------------- 3 files changed, 44 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index aa89823e76..dd33f814c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,6 +54,18 @@ endif() set(CLANG_RESOURCE_DIR "" CACHE STRING "Relative directory from the Clang binary to its resource files.") +set(CLANG_GCC_INSTALL_ROOT "" CACHE STRING + "The GCC install root to use for headers and libraries.") + +set(CLANG_GCC_LIB_DIR "/lib/gcc" CACHE STRING + "The directory relative to the install root for GCC libraries.") + +set(CLANG_GCC_ARCH "" CACHE STRING + "The architecture string of the GCC installation.") + +set(CLANG_GCC_VERSION "" CACHE STRING + "The version of the GCC installation.") + set(C_INCLUDE_DIRS "" CACHE STRING "Colon separated list of directories clang will search for headers.") diff --git a/include/clang/Config/config.h.cmake b/include/clang/Config/config.h.cmake index 5f13d2faa3..993bbc98b7 100644 --- a/include/clang/Config/config.h.cmake +++ b/include/clang/Config/config.h.cmake @@ -1,6 +1,18 @@ /* Relative directory for resource files */ #define CLANG_RESOURCE_DIR "${CLANG_RESOURCE_DIR}" +/* GCC install root */ +#define CLANG_GCC_INSTALL_ROOT "${CLANG_GCC_INSTALL_ROOT}" + +/* GCC library directory, relative to the installation root */ +#define CLANG_GCC_LIB_DIR "${CLANG_GCC_LIB_DIR}" + +/* GCC architecture */ +#define CLANG_GCC_ARCH "${CLANG_GCC_ARCH}" + +/* GCC version */ +#define CLANG_GCC_VERSION "${CLANG_GCC_VERSION}" + /* 32 bit multilib directory. */ #define CXX_INCLUDE_32BIT_DIR "${CXX_INCLUDE_32BIT_DIR}" diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index ca613e3d6c..5266f6a883 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -1334,31 +1334,27 @@ static LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) { } static std::string findGCCBaseLibDir(const std::string &GccTriple) { - // FIXME: Using CXX_INCLUDE_ROOT is here is a bit of a hack, but - // avoids adding yet another option to configure/cmake. - // It would probably be cleaner to break it in two variables - // CXX_GCC_ROOT with just /foo/bar - // CXX_GCC_VER with 4.5.2 - // Then we would have - // CXX_INCLUDE_ROOT = CXX_GCC_ROOT/include/c++/CXX_GCC_VER - // and this function would return - // CXX_GCC_ROOT/lib/gcc/CXX_INCLUDE_ARCH/CXX_GCC_VER - llvm::SmallString<128> CxxIncludeRoot(CXX_INCLUDE_ROOT); - if (CxxIncludeRoot != "") { - // This is of the form /foo/bar/include/c++/4.5.2/ - if (CxxIncludeRoot.back() == '/') - llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the / - llvm::StringRef Version = llvm::sys::path::filename(CxxIncludeRoot); - llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the version - llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the c++ - llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the include - std::string ret(CxxIncludeRoot.c_str()); - ret.append("/lib/gcc/"); - ret.append(CXX_INCLUDE_ARCH); - ret.append("/"); - ret.append(Version); - return ret; + // Check for an explicit configure-time version of GCC. + llvm::SmallString<32> GCCVersion(CLANG_GCC_VERSION); + if (GCCVersion != "") { + // Read the other variables if we have a specific GCC version requested at + // configuration time. We provide defaults for them if missing though. + llvm::SmallString<128> InstallRoot(CLANG_GCC_INSTALL_ROOT); + if (InstallRoot == "") InstallRoot = "/usr"; + llvm::SmallString<32> GCCLibDir(CLANG_GCC_LIB_DIR); + if (GCCLibDir == "") GCCLibDir = "/lib/gcc"; + llvm::SmallString<32> GCCArch(CLANG_GCC_ARCH); + if (GCCArch == "") GCCArch = GccTriple; + + InstallRoot += GCCLibDir; + InstallRoot += "/"; + InstallRoot += GCCArch; + InstallRoot += "/"; + InstallRoot += GCCVersion; + return InstallRoot.str(); } + + // Otherwise, attempt to detect a system GCC installation. static const char* GccVersions[] = {"4.6.0", "4.6", "4.5.2", "4.5.1", "4.5", "4.4.5", "4.4.4", "4.4.3", "4.4", -- 2.40.0