Index: clang/cmake/caches/Fuchsia-stage2.cmake =================================================================== --- clang/cmake/caches/Fuchsia-stage2.cmake +++ clang/cmake/caches/Fuchsia-stage2.cmake @@ -27,17 +27,60 @@ set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O3 -gline-tables-only -DNDEBUG" CACHE STRING "") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -gline-tables-only -DNDEBUG" CACHE STRING "") -set(LLVM_BUILTIN_TARGETS "default;x86_64-fuchsia;aarch64-fuchsia" CACHE STRING "") - -# Set the per-target builtins options. foreach(target x86_64;aarch64) - set(BUILTINS_${target}-fuchsia_CMAKE_SYSROOT ${FUCHSIA_${target}_SYSROOT} CACHE PATH "") - set(BUILTINS_${target}-fuchsia_CMAKE_SYSTEM_NAME Fuchsia CACHE STRING "") -endforeach() + if(FUCHSIA_${target}_SYSROOT) + set(triple ${target}-fuchsia) + + # Set the per-target builtins options. + set(BUILTINS_${triple}_CMAKE_SYSROOT ${FUCHSIA_${target}_SYSROOT} CACHE PATH "") + set(BUILTINS_${triple}_CMAKE_SYSTEM_NAME Fuchsia CACHE STRING "") + set(BUILTINS_${triple}_CMAKE_SYSTEM_PROCESSOR ${target} CACHE STRING "") + # Set the per-target runtimes options. + set(RUNTIMES_${triple}_CMAKE_BUILD_WITH_INSTALL_RPATH ON CACHE BOOL "") + set(RUNTIMES_${triple}_CMAKE_SYSROOT ${FUCHSIA_${target}_SYSROOT} CACHE PATH "") + set(RUNTIMES_${triple}_CMAKE_SYSTEM_NAME Fuchsia CACHE STRING "") + set(RUNTIMES_${triple}_CMAKE_SYSTEM_PROCESSOR ${target} CACHE STRING "") + set(RUNTIMES_${triple}_UNIX 1 CACHE BOOL "") + set(RUNTIMES_${triple}_LIBUNWIND_USE_COMPILER_RT ON CACHE BOOL "") + set(RUNTIMES_${triple}_LIBUNWIND_ENABLE_STATIC OFF CACHE BOOL "") + set(RUNTIMES_${triple}_LIBCXXABI_USE_COMPILER_RT ON CACHE BOOL "") + set(RUNTIMES_${triple}_LIBCXXABI_USE_LLVM_UNWINDER ON CACHE BOOL "") + set(RUNTIMES_${triple}_LIBCXXABI_ENABLE_STATIC OFF CACHE BOOL "") + set(RUNTIMES_${triple}_LIBCXX_USE_COMPILER_RT ON CACHE BOOL "") + set(RUNTIMES_${triple}_LIBCXX_ENABLE_STATIC OFF CACHE BOOL "") + set(RUNTIMES_${triple}_SANITIZER_USE_COMPILER_RT ON CACHE BOOL "") -set(LLVM_RUNTIME_TARGETS "default;x86_64-fuchsia;aarch64-fuchsia;x86_64-fuchsia-asan:x86_64-fuchsia;aarch64-fuchsia-asan:aarch64-fuchsia" CACHE STRING "") + set(RUNTIMES_${triple}-asan_LLVM_USE_SANITIZER Address CACHE STRING "") + #set(RUNTIMES_${triple}-asan_LLVM_RUNTIMES_PREFIX "${target}-fuchsia/" CACHE STRING "") + set(RUNTIMES_${triple}-asan_LLVM_RUNTIMES_LIBDIR_SUFFIX "/asan" CACHE STRING "") + set(RUNTIMES_${triple}-asan_LIBCXX_INSTALL_HEADERS OFF CACHE BOOL "") + + list(APPEND targets ${triple}) + endif() + if(LINUX_${target}_SYSROOT) + set(triple ${target}-linux-gnu) + set(BUILTINS_${triple}_CMAKE_SYSROOT ${LINUX_${target}_SYSROOT} CACHE PATH "") + set(BUILTINS_${triple}_CMAKE_SYSTEM_NAME Linux CACHE STRING "") + + set(RUNTIMES_${triple}_CMAKE_BUILD_WITH_INSTALL_RPATH ON CACHE BOOL "") + set(RUNTIMES_${triple}_CMAKE_SYSROOT ${LINUX_${target}_SYSROOT} CACHE PATH "") + set(RUNTIMES_${triple}_CMAKE_SYSTEM_NAME Linux CACHE STRING "") + set(RUNTIMES_${triple}_CMAKE_SYSTEM_PROCESSOR ${target} CACHE STRING "") + set(RUNTIMES_${triple}_LIBUNWIND_ENABLE_SHARED OFF CACHE BOOL "") + set(RUNTIMES_${triple}_LIBUNWIND_USE_COMPILER_RT ON CACHE BOOL "") + set(RUNTIMES_${triple}_LIBUNWIND_INSTALL_LIBRARY OFF CACHE BOOL "") + set(RUNTIMES_${triple}_LIBCXXABI_USE_COMPILER_RT ON CACHE BOOL "") + set(RUNTIMES_${triple}_LIBCXXABI_ENABLE_SHARED OFF CACHE BOOL "") + set(RUNTIMES_${triple}_LIBCXXABI_USE_LLVM_UNWINDER ON CACHE BOOL "") + set(RUNTIMES_${triple}_LIBCXXABI_ENABLE_STATIC_UNWINDER ON CACHE BOOL "") + set(RUNTIMES_${triple}_LIBCXXABI_INSTALL_LIBRARY OFF CACHE BOOL "") + set(RUNTIMES_${triple}_LIBCXX_USE_COMPILER_RT ON CACHE BOOL "") + set(RUNTIMES_${triple}_LIBCXX_ENABLE_SHARED OFF CACHE BOOL "") + set(RUNTIMES_${triple}_LIBCXX_ENABLE_STATIC_ABI_LIBRARY ON CACHE BOOL "") + list(APPEND targets ${triple}) + endif() +endforeach() -# Set the default target runtimes options. if(APPLE) # Disable installing libc++, libc++abi or libunwind on Darwin, since Clang # driver doesn't know how to use libraries that are part of the toolchain. @@ -47,41 +90,11 @@ set(LIBCXXABI_INSTALL_LIBRARY OFF CACHE BOOL "") set(LIBCXX_INSTALL_HEADERS OFF CACHE BOOL "") set(LIBCXX_INSTALL_LIBRARY OFF CACHE BOOL "") -else() - set(LIBUNWIND_ENABLE_SHARED OFF CACHE BOOL "") - set(LIBUNWIND_USE_COMPILER_RT ON CACHE BOOL "") - set(LIBUNWIND_INSTALL_LIBRARY OFF CACHE BOOL "") - set(LIBCXXABI_USE_COMPILER_RT ON CACHE BOOL "") - set(LIBCXXABI_ENABLE_SHARED OFF CACHE BOOL "") - set(LIBCXXABI_USE_LLVM_UNWINDER ON CACHE BOOL "") - set(LIBCXXABI_ENABLE_STATIC_UNWINDER ON CACHE BOOL "") - set(LIBCXXABI_INSTALL_LIBRARY OFF CACHE BOOL "") - set(LIBCXX_USE_COMPILER_RT ON CACHE BOOL "") - set(LIBCXX_ENABLE_SHARED OFF CACHE BOOL "") - set(LIBCXX_ENABLE_STATIC_ABI_LIBRARY ON CACHE BOOL "") + list(APPEND targets default) endif() -# Set the per-target runtimes options. -foreach(target x86_64;aarch64) - set(RUNTIMES_${target}-fuchsia_CMAKE_BUILD_WITH_INSTALL_RPATH ON CACHE BOOL "") - set(RUNTIMES_${target}-fuchsia_CMAKE_SYSROOT ${FUCHSIA_${target}_SYSROOT} CACHE PATH "") - set(RUNTIMES_${target}-fuchsia_CMAKE_SYSTEM_NAME Fuchsia CACHE STRING "") - set(RUNTIMES_${target}-fuchsia_UNIX 1 CACHE BOOL "") - set(RUNTIMES_${target}-fuchsia_LIBUNWIND_USE_COMPILER_RT ON CACHE BOOL "") - set(RUNTIMES_${target}-fuchsia_LIBUNWIND_ENABLE_STATIC OFF CACHE BOOL "") - set(RUNTIMES_${target}-fuchsia_LIBCXXABI_USE_COMPILER_RT ON CACHE BOOL "") - set(RUNTIMES_${target}-fuchsia_LIBCXXABI_USE_LLVM_UNWINDER ON CACHE BOOL "") - set(RUNTIMES_${target}-fuchsia_LIBCXXABI_ENABLE_STATIC OFF CACHE BOOL "") - set(RUNTIMES_${target}-fuchsia_LIBCXX_USE_COMPILER_RT ON CACHE BOOL "") - set(RUNTIMES_${target}-fuchsia_LIBCXX_ABI_VERSION 2 CACHE STRING "") - set(RUNTIMES_${target}-fuchsia_LIBCXX_ENABLE_STATIC OFF CACHE BOOL "") - set(RUNTIMES_${target}-fuchsia_SANITIZER_USE_COMPILER_RT ON CACHE BOOL "") - - set(RUNTIMES_${target}-fuchsia-asan_LLVM_USE_SANITIZER Address CACHE STRING "") - set(RUNTIMES_${target}-fuchsia-asan_LLVM_RUNTIMES_PREFIX "${target}-fuchsia/" CACHE STRING "") - set(RUNTIMES_${target}-fuchsia-asan_LLVM_RUNTIMES_LIBDIR_SUFFIX "/asan" CACHE STRING "") - set(RUNTIMES_${target}-fuchsia-asan_LIBCXX_INSTALL_HEADERS OFF CACHE BOOL "") -endforeach() +set(LLVM_BUILTIN_TARGETS "${targets}" CACHE STRING "") +set(LLVM_RUNTIME_TARGETS "${targets}" CACHE STRING "") # Setup toolchain. set(LLVM_INSTALL_TOOLCHAIN_ONLY ON CACHE BOOL "") Index: clang/cmake/caches/Fuchsia.cmake =================================================================== --- clang/cmake/caches/Fuchsia.cmake +++ clang/cmake/caches/Fuchsia.cmake @@ -44,6 +44,9 @@ if(FUCHSIA_${target}_SYSROOT) list(APPEND EXTRA_ARGS -DFUCHSIA_${target}_SYSROOT=${FUCHSIA_${target}_SYSROOT}) endif() + if(LINUX_${target}_SYSROOT) + list(APPEND EXTRA_ARGS -DLINUX_${target}_SYSROOT=${LINUX_${target}_SYSROOT}) + endif() endforeach() # Setup the bootstrap build. Index: clang/include/clang/Driver/Driver.h =================================================================== --- clang/include/clang/Driver/Driver.h +++ clang/include/clang/Driver/Driver.h @@ -309,6 +309,8 @@ const std::string &getTitle() { return DriverTitle; } void setTitle(std::string Value) { DriverTitle = std::move(Value); } + std::string getDefaultTargetTriple() const { return DefaultTargetTriple; } + /// \brief Get the path to the main clang executable. const char *getClangProgramPath() const { return ClangExecutable.c_str(); Index: clang/lib/Driver/ToolChain.cpp =================================================================== --- clang/lib/Driver/ToolChain.cpp +++ clang/lib/Driver/ToolChain.cpp @@ -90,6 +90,11 @@ std::string CandidateLibPath = getArchSpecificLibPath(); if (getVFS().exists(CandidateLibPath)) getFilePaths().push_back(CandidateLibPath); + + SmallString<128> P(D.ResourceDir); + llvm::sys::path::append(P, D.getDefaultTargetTriple(), "lib"); + if (getVFS().exists(P)) + getFilePaths().push_back(P.str()); } void ToolChain::setTripleEnvironment(llvm::Triple::EnvironmentType Env) { @@ -362,6 +367,7 @@ std::string ToolChain::getCompilerRT(const ArgList &Args, StringRef Component, bool Shared) const { + const Driver &D = getDriver(); const llvm::Triple &TT = getTriple(); const char *Env = TT.isAndroid() ? "-android" : ""; bool IsITANMSVCWindows = @@ -372,6 +378,12 @@ const char *Suffix = Shared ? (Triple.isOSWindows() ? ".dll" : ".so") : (IsITANMSVCWindows ? ".lib" : ".a"); + SmallString<128> P(D.ResourceDir); + llvm::sys::path::append(P, D.getDefaultTargetTriple(), "lib", + Prefix + Twine("clang_rt.") + Component + Suffix); + if (getVFS().exists(P)) + return P.str(); + SmallString<128> Path(getCompilerRTPath()); llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" + Arch + Env + Suffix); Index: clang/lib/Driver/ToolChains/Fuchsia.h =================================================================== --- clang/lib/Driver/ToolChains/Fuchsia.h +++ clang/lib/Driver/ToolChains/Fuchsia.h @@ -64,8 +64,9 @@ return 2; // SSPStrong } - std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args, - types::ID InputType) const override; + std::string ComputeEffectiveClangTriple( + const llvm::opt::ArgList &Args, + types::ID InputType = types::TY_INVALID) const override; SanitizerMask getSupportedSanitizers() const override; SanitizerMask getDefaultSanitizers() const override; Index: clang/lib/Driver/ToolChains/Fuchsia.cpp =================================================================== --- clang/lib/Driver/ToolChains/Fuchsia.cpp +++ clang/lib/Driver/ToolChains/Fuchsia.cpp @@ -131,21 +131,6 @@ /// Fuchsia - Fuchsia tool chain which can call as(1) and ld(1) directly. -static std::string normalizeTriple(llvm::Triple Triple) { - SmallString<64> T; - T += Triple.getArchName(); - T += "-"; - T += Triple.getOSName(); - return T.str(); -} - -static std::string getTargetDir(const Driver &D, - llvm::Triple Triple) { - SmallString<128> P(llvm::sys::path::parent_path(D.Dir)); - llvm::sys::path::append(P, "lib", normalizeTriple(Triple)); - return P.str(); -} - Fuchsia::Fuchsia(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) : ToolChain(D, Triple, Args) { @@ -153,10 +138,6 @@ if (getDriver().getInstalledDir() != D.Dir) getProgramPaths().push_back(D.Dir); - SmallString<128> P(getTargetDir(D, getTriple())); - llvm::sys::path::append(P, "lib"); - getFilePaths().push_back(P.str()); - if (!D.SysRoot.empty()) { SmallString<128> P(D.SysRoot); llvm::sys::path::append(P, "lib"); @@ -167,8 +148,8 @@ std::string Fuchsia::ComputeEffectiveClangTriple(const ArgList &Args, types::ID InputType) const { llvm::Triple Triple(ComputeLLVMTriple(Args, InputType)); - Triple.setTriple(normalizeTriple(Triple)); - return Triple.getTriple(); + Triple.setTriple(Triple.getArchName() + "-" + Triple.getOSName()); + return Triple.str(); } Tool *Fuchsia::buildLinker() const { @@ -251,7 +232,7 @@ switch (GetCXXStdlibType(DriverArgs)) { case ToolChain::CST_Libcxx: { - SmallString<128> P(getTargetDir(getDriver(), getTriple())); + SmallString<128> P(getDriver().ResourceDir); llvm::sys::path::append(P, "include", "c++", "v1"); addSystemInclude(DriverArgs, CC1Args, P.str()); break; Index: clang/lib/Driver/ToolChains/Linux.cpp =================================================================== --- clang/lib/Driver/ToolChains/Linux.cpp +++ clang/lib/Driver/ToolChains/Linux.cpp @@ -778,6 +778,7 @@ void Linux::addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const { const std::string LibCXXIncludePathCandidates[] = { + DetectLibcxxIncludePath(getDriver().ResourceDir + "/include/c++"), DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"), // If this is a development, non-installed, clang, libcxx will // not be found at ../include/c++ but it likely to be found at Index: clang/test/Driver/fuchsia.cpp =================================================================== --- clang/test/Driver/fuchsia.cpp +++ clang/test/Driver/fuchsia.cpp @@ -4,7 +4,7 @@ // CHECK: "-triple" "x86_64-fuchsia" // CHECK: "-fuse-init-array" // CHECK: "-isysroot" "[[SYSROOT:[^"]+]]" -// CHECK: "-internal-isystem" "{{.*[/\\]}}x86_64-fuchsia{{/|\\\\}}include{{/|\\\\}}c++{{/|\\\\}}v1" +// CHECK: "-internal-isystem" "{{.*[/\\]}}include{{/|\\\\}}c++{{/|\\\\}}v1" // CHECK: "-internal-externc-isystem" "[[SYSROOT]]{{/|\\\\}}include" // CHECK: {{.*}}ld.lld{{.*}}" "-z" "rodynamic" // CHECK: "--sysroot=[[SYSROOT]]" Index: clang/test/Driver/linux-ld.c =================================================================== --- clang/test/Driver/linux-ld.c +++ clang/test/Driver/linux-ld.c @@ -446,6 +446,21 @@ // CHECK-BASIC-LIBCXX-INSTALL: "-internal-isystem" "[[SYSROOT]]/usr/local/include" // CHECK-BASIC-LIBCXX-INSTALL: "--sysroot=[[SYSROOT]]" // CHECK-BASIC-LIBCXX-INSTALL: "-L[[SYSROOT]]/usr/bin/../lib" +// RUN: %clang -no-canonical-prefixes -x c++ %s -### -o %t.o 2>&1 \ +// RUN: -target x86_64-linux-gnu \ +// RUN: -stdlib=libc++ \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_multiarch_subdir \ +// RUN: -ccc-install-dir %S/Inputs/basic_linux_libcxx_tree/usr/bin \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree \ +// RUN: | FileCheck --check-prefix=CHECK-BASIC-LIBCXX-MULTIARCH %s +// CHECK-BASIC-LIBCXX-MULTIARCH: "{{[^"]*}}clang{{[^"]*}}" "-cc1" +// CHECK-BASIC-LIBCXX-MULTIARCH: "-resource-dir" "[[RESDIR:[^"]*]]" +// CHECK-BASIC-LIBCXX-MULTIARCH: "-isysroot" "[[SYSROOT:[^"]+]]" +// CHECK-BASIC-LIBCXX-MULTIARCH: "-internal-isystem" "[[RESDIR]]/include/c++/v1" +// CHECK-BASIC-LIBCXX-MULTIARCH: "-internal-isystem" "[[SYSROOT]]/usr/local/include" +// CHECK-BASIC-LIBCXX-MULTIARCH: "--sysroot=[[SYSROOT]]" +// CHECK-BASIC-LIBCXX-MULTIARCH: "-L[[RESDIR]]/x86_64-linux-gnu/lib" // // Test that we can use -stdlib=libc++ in a build system even when it // occasionally links C code instead of C++ code. Index: compiler-rt/cmake/Modules/AddCompilerRT.cmake =================================================================== --- compiler-rt/cmake/Modules/AddCompilerRT.cmake +++ compiler-rt/cmake/Modules/AddCompilerRT.cmake @@ -105,7 +105,9 @@ endfunction() macro(set_output_name output name arch) - if(ANDROID AND ${arch} STREQUAL "i386") + if(COMPILER_RT_DEFAULT_TARGET_ONLY) + set(${output} ${name}) + elseif(ANDROID AND ${arch} STREQUAL "i386") set(${output} "${name}-i686${COMPILER_RT_OS_SUFFIX}") else() set(${output} "${name}-${arch}${COMPILER_RT_OS_SUFFIX}") Index: compiler-rt/cmake/base-config-ix.cmake =================================================================== --- compiler-rt/cmake/base-config-ix.cmake +++ compiler-rt/cmake/base-config-ix.cmake @@ -69,10 +69,17 @@ if(NOT DEFINED COMPILER_RT_OS_DIR) string(TOLOWER ${CMAKE_SYSTEM_NAME} COMPILER_RT_OS_DIR) endif() -set(COMPILER_RT_LIBRARY_OUTPUT_DIR - ${COMPILER_RT_OUTPUT_DIR}/lib/${COMPILER_RT_OS_DIR}) -set(COMPILER_RT_LIBRARY_INSTALL_DIR - ${COMPILER_RT_INSTALL_PATH}/lib/${COMPILER_RT_OS_DIR}) +if(COMPILER_RT_DEFAULT_TARGET_ONLY) + set(COMPILER_RT_LIBRARY_OUTPUT_DIR + ${COMPILER_RT_OUTPUT_DIR}/${CMAKE_C_COMPILER_TARGET}/lib) + set(COMPILER_RT_LIBRARY_INSTALL_DIR + ${COMPILER_RT_INSTALL_PATH}/${CMAKE_C_COMPILER_TARGET}/lib) +else() + set(COMPILER_RT_LIBRARY_OUTPUT_DIR + ${COMPILER_RT_OUTPUT_DIR}/lib/${COMPILER_RT_OS_DIR}) + set(COMPILER_RT_LIBRARY_INSTALL_DIR + ${COMPILER_RT_INSTALL_PATH}/lib/${COMPILER_RT_OS_DIR}) +endif() if(APPLE) # On Darwin if /usr/include doesn't exist, the user probably has Xcode but not Index: libcxx/CMakeLists.txt =================================================================== --- libcxx/CMakeLists.txt +++ libcxx/CMakeLists.txt @@ -388,6 +388,10 @@ message(FATAL_ERROR "LIBCXX_INSTALL_PREFIX has to end with \"/\".") endif() +if (NOT LIBCXX_INSTALL_PATH) + set(LIBCXX_INSTALL_PATH ${LIBCXX_INSTALL_PREFIX}) +endif() + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR}) Index: libcxx/cmake/Modules/HandleLibCXXABI.cmake =================================================================== --- libcxx/cmake/Modules/HandleLibCXXABI.cmake +++ libcxx/cmake/Modules/HandleLibCXXABI.cmake @@ -55,7 +55,7 @@ ) if (LIBCXX_INSTALL_HEADERS) install(FILES "${LIBCXX_BINARY_INCLUDE_DIR}/${fpath}" - DESTINATION ${LIBCXX_INSTALL_PREFIX}include/c++/v1/${dstdir} + DESTINATION ${LIBCXX_INSTALL_PATH}include/c++/v1/${dstdir} COMPONENT cxx-headers PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ) Index: libcxx/include/CMakeLists.txt =================================================================== --- libcxx/include/CMakeLists.txt +++ libcxx/include/CMakeLists.txt @@ -46,7 +46,7 @@ if (LIBCXX_INSTALL_HEADERS) install(DIRECTORY . - DESTINATION ${LIBCXX_INSTALL_PREFIX}include/c++/v1 + DESTINATION ${LIBCXX_INSTALL_PATH}include/c++/v1 COMPONENT cxx-headers FILES_MATCHING ${LIBCXX_HEADER_PATTERN} @@ -56,7 +56,7 @@ if (LIBCXX_NEEDS_SITE_CONFIG) # Install the generated header as __config. install(FILES ${LIBCXX_BINARY_DIR}/__generated_config - DESTINATION ${LIBCXX_INSTALL_PREFIX}include/c++/v1 + DESTINATION ${LIBCXX_INSTALL_PATH}include/c++/v1 PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ RENAME __config COMPONENT cxx-headers) Index: llvm/lib/Support/Unix/Host.inc =================================================================== --- llvm/lib/Support/Unix/Host.inc +++ llvm/lib/Support/Unix/Host.inc @@ -64,5 +64,5 @@ TargetTripleString = EnvTriple; #endif - return Triple::normalize(TargetTripleString); + return TargetTripleString; } Index: llvm/runtimes/CMakeLists.txt =================================================================== --- llvm/runtimes/CMakeLists.txt +++ llvm/runtimes/CMakeLists.txt @@ -121,6 +121,11 @@ set(LLVM_RUNTIMES_PREFIX "${LLVM_RUNTIMES_TARGET}/") endif() + string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" CLANG_VERSION + ${PACKAGE_VERSION}) + + set(CLANG_RESOURCE_DIR lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION}) + foreach(entry ${runtimes}) get_filename_component(projName ${entry} NAME) @@ -132,7 +137,8 @@ if(LLVM_RUNTIMES_TARGET) if(NOT "${projName}" MATCHES "compiler-rt") - set(${canon_name}_INSTALL_PREFIX "lib/${LLVM_RUNTIMES_PREFIX}/" CACHE STRING "" FORCE) + set(${canon_name}_INSTALL_PREFIX ${CLANG_RESOURCE_DIR}/${CMAKE_C_COMPILER_TARGET}/ CACHE STRING "" FORCE) + set(${canon_name}_INSTALL_PATH ${CLANG_RESOURCE_DIR}/ CACHE STRING "" FORCE) endif() endif() @@ -145,6 +151,8 @@ set(SAFE_LLVM_LIBRARY_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) set(SAFE_LLVM_RUNTIME_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) + set(CLANG_RESOURCE_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/clang/${CLANG_VERSION}) + # We do this in two loops so that HAVE_* is set for each runtime before the # other runtimes are added. foreach(entry ${runtimes}) @@ -152,9 +160,9 @@ if(LLVM_RUNTIMES_TARGET) if(NOT "${projName}" MATCHES "compiler-rt") - set(LLVM_BINARY_DIR "${LLVM_LIBRARY_DIR}/${LLVM_RUNTIMES_PREFIX}") + set(LLVM_BINARY_DIR ${CLANG_RESOURCE_INTDIR}) set(LLVM_LIBDIR_SUFFIX "${LLVM_RUNTIMES_LIBDIR_SUFFIX}") - set(LLVM_LIBRARY_OUTPUT_INTDIR "${LLVM_LIBRARY_DIR}/${LLVM_RUNTIMES_PREFIX}lib${LLVM_RUNTIMES_LIBDIR_SUFFIX}") + set(LLVM_LIBRARY_OUTPUT_INTDIR ${CLANG_RESOURCE_INTDIR}/${CMAKE_C_COMPILER_TARGET}/lib${LLVM_RUNTIMES_LIBDIR_SUFFIX} CACHE STRING "" FORCE) set(LLVM_RUNTIME_OUTPUT_INTDIR "${LLVM_TOOLS_BINARY_DIR}/${LLVM_RUNTIMES_PREFIX}") endif() endif()