Index: clang/lib/Headers/CMakeLists.txt =================================================================== --- clang/lib/Headers/CMakeLists.txt +++ clang/lib/Headers/CMakeLists.txt @@ -281,7 +281,8 @@ openmp_wrappers/new ) -set(output_dir ${LLVM_LIBRARY_OUTPUT_INTDIR}/clang/${CLANG_VERSION_MAJOR}/include) +include(GetClangResourceDir) +get_clang_resource_dir(output_dir PREFIX ${LLVM_BINARY_DIR} SUBDIR include) set(out_files) set(generated_files) @@ -434,7 +435,7 @@ add_header_target("windows-resource-headers" ${windows_only_files}) add_header_target("utility-resource-headers" ${utility_files}) -set(header_install_dir lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION_MAJOR}/include) +get_clang_resource_dir(header_install_dir SUBDIR include) ############################################################# # Install rules for the catch-all clang-resource-headers target Index: clang/lib/Tooling/CMakeLists.txt =================================================================== --- clang/lib/Tooling/CMakeLists.txt +++ clang/lib/Tooling/CMakeLists.txt @@ -52,6 +52,8 @@ list(APPEND implicitDirs -I ${implicitDir}) endforeach() + include(GetClangResourceDir) + get_clang_resource_dir(resource_dir PREFIX ${LLVM_BINARY_DIR}) add_custom_command( COMMENT Generate ASTNodeAPI.json OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ASTNodeAPI.json @@ -60,7 +62,7 @@ $ # Skip this in debug mode because parsing AST.h is too slow --skip-processing=${skip_expensive_processing} - -I ${LLVM_BINARY_DIR}/lib/clang/${CLANG_VERSION_MAJOR}/include + -I ${resource_dir}/include -I ${CLANG_SOURCE_DIR}/include -I ${LLVM_BINARY_DIR}/tools/clang/include -I ${LLVM_BINARY_DIR}/include Index: clang/runtime/CMakeLists.txt =================================================================== --- clang/runtime/CMakeLists.txt +++ clang/runtime/CMakeLists.txt @@ -66,6 +66,9 @@ list(APPEND compiler_rt_configure_deps LLVMTestingSupport) endif() + include(GetClangResourceDir) + get_clang_resource_dir(output_resource_dir PREFIX ${LLVM_BINARY_DIR}) + get_clang_resource_dir(install_resource_dir) ExternalProject_Add(compiler-rt DEPENDS llvm-config clang ${compiler_rt_configure_deps} PREFIX ${COMPILER_RT_PREFIX} @@ -82,9 +85,9 @@ -DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER} -DLLVM_CONFIG_PATH=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-config -DLLVM_LIT_ARGS=${LLVM_LIT_ARGS} - -DCOMPILER_RT_OUTPUT_DIR=${LLVM_LIBRARY_OUTPUT_INTDIR}/clang/${CLANG_VERSION_MAJOR} + -DCOMPILER_RT_OUTPUT_DIR=${output_resource_dir} -DCOMPILER_RT_EXEC_OUTPUT_DIR=${LLVM_RUNTIME_OUTPUT_INTDIR} - -DCOMPILER_RT_INSTALL_PATH:PATH=lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION_MAJOR} + -DCOMPILER_RT_INSTALL_PATH:PATH=${install_resource_dir} -DCOMPILER_RT_INCLUDE_TESTS=${LLVM_INCLUDE_TESTS} -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DLLVM_LIBDIR_SUFFIX=${LLVM_LIBDIR_SUFFIX} Index: cmake/Modules/GetClangResourceDir.cmake =================================================================== --- /dev/null +++ cmake/Modules/GetClangResourceDir.cmake @@ -0,0 +1,28 @@ +# get clang resource directory +# +# usage: +# get_clang_resource_dir(out_var [PREFIX prefix] [SUBDIR subdirectory]) +# +# user can use `PREFIX` to prepend some path to it or use `SUBDIR` to +# get subdirectory under clang resource dir + +function(get_clang_resource_dir out_var) + if(DEFINED CLANG_RESOURCE_DIR AND NOT CLANG_RESOURCE_DIR STREQUAL "") + set(ret_dir bin/${CLANG_RESOURCE_DIR}) + else() + string(REGEX MATCH "^[0-9]+" CLANG_VERSION_MAJOR ${PACKAGE_VERSION}) + set(ret_dir lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION_MAJOR}) + endif() + + set(oneValueArgs PREFIX SUBDIR) + cmake_parse_arguments(RESOURCE_DIR "" "${oneValueArgs}" "" ${ARGN}) + + if(RESOURCE_DIR_PREFIX) + set(ret_dir ${RESOURCE_DIR_PREFIX}/${ret_dir}) + endif() + if(RESOURCE_DIR_SUBDIR) + set(ret_dir ${ret_dir}/${RESOURCE_DIR_SUBDIR}) + endif() + + set(${out_var} ${ret_dir} PARENT_SCOPE) +endfunction() Index: compiler-rt/cmake/base-config-ix.cmake =================================================================== --- compiler-rt/cmake/base-config-ix.cmake +++ compiler-rt/cmake/base-config-ix.cmake @@ -7,6 +7,7 @@ include(CheckIncludeFile) include(CheckCXXSourceCompiles) include(GNUInstallDirs) +include(GetClangResourceDir) include(ExtendPath) check_include_file(unwind.h HAVE_UNWIND_H) @@ -43,9 +44,9 @@ string(REGEX MATCH "^[0-9]+" CLANG_VERSION_MAJOR ${PACKAGE_VERSION}) # Setup the paths where compiler-rt runtimes and headers should be stored. - set(COMPILER_RT_OUTPUT_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/clang/${CLANG_VERSION_MAJOR}) + get_clang_resource_dir(COMPILER_RT_OUTPUT_DIR PREFIX ${LLVM_BINARY_DIR}) set(COMPILER_RT_EXEC_OUTPUT_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) - set(COMPILER_RT_INSTALL_PATH lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION_MAJOR}) + get_clang_resource_dir(COMPILER_RT_INSTALL_PATH) option(COMPILER_RT_INCLUDE_TESTS "Generate and build compiler-rt unit tests." ${LLVM_INCLUDE_TESTS}) option(COMPILER_RT_ENABLE_WERROR "Fail and stop if warning is triggered" Index: lldb/source/Plugins/ExpressionParser/Clang/ClangHost.cpp =================================================================== --- lldb/source/Plugins/ExpressionParser/Clang/ClangHost.cpp +++ lldb/source/Plugins/ExpressionParser/Clang/ClangHost.cpp @@ -54,8 +54,11 @@ static const llvm::StringRef kResourceDirSuffixes[] = { // LLVM.org's build of LLDB uses the clang resource directory placed - // in $install_dir/lib{,64}/clang/$clang_version. - CLANG_INSTALL_LIBDIR_BASENAME "/clang/" CLANG_VERSION_MAJOR_STRING, + // in $install_dir/lib{,64}/clang/$clang_version or + // $install_dir/bin/$CLANG_RESOURCE_DIR + CLANG_RESOURCE_DIR[0] ? "bin/" CLANG_RESOURCE_DIR + : CLANG_INSTALL_LIBDIR_BASENAME + "/clang/" CLANG_VERSION_MAJOR_STRING, // swift-lldb uses the clang resource directory copied from swift, which // by default is placed in $install_dir/lib{,64}/lldb/clang. LLDB places // it there, so we use LLDB_INSTALL_LIBDIR_BASENAME. Index: lldb/unittests/Expression/ClangParserTest.cpp =================================================================== --- lldb/unittests/Expression/ClangParserTest.cpp +++ lldb/unittests/Expression/ClangParserTest.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "clang/Basic/Version.h" +#include "clang/Config/config.h" #include "Plugins/ExpressionParser/Clang/ClangHost.h" #include "TestingSupport/SubsystemRAII.h" @@ -37,12 +38,16 @@ TEST_F(ClangHostTest, ComputeClangResourceDirectory) { #if !defined(_WIN32) std::string path_to_liblldb = "/foo/bar/lib/"; - std::string path_to_clang_dir = - "/foo/bar/" LLDB_INSTALL_LIBDIR_BASENAME "/clang/" CLANG_VERSION_MAJOR_STRING; + std::string path_to_clang_dir = CLANG_RESOURCE_DIR[0] + ? "/foo/bar/bin/" CLANG_RESOURCE_DIR + : "/foo/bar/" LLDB_INSTALL_LIBDIR_BASENAME + "/clang/" CLANG_VERSION_MAJOR_STRING; #else std::string path_to_liblldb = "C:\\foo\\bar\\lib"; std::string path_to_clang_dir = - "C:\\foo\\bar\\lib\\clang\\" CLANG_VERSION_MAJOR_STRING; + CLANG_RESOURCE_DIR[0] + ? "C:\\foo\\bar\\bin\\" CLANG_RESOURCE_DIR + : "C:\\foo\\bar\\lib\\clang\\" CLANG_VERSION_MAJOR_STRING; #endif EXPECT_EQ(ComputeClangResourceDir(path_to_liblldb), path_to_clang_dir); Index: llvm/cmake/modules/LLVMExternalProjectUtils.cmake =================================================================== --- llvm/cmake/modules/LLVMExternalProjectUtils.cmake +++ llvm/cmake/modules/LLVMExternalProjectUtils.cmake @@ -257,7 +257,11 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") string(REGEX MATCH "^[0-9]+" CLANG_VERSION_MAJOR ${PACKAGE_VERSION}) - set(resource_dir "${LLVM_LIBRARY_DIR}/clang/${CLANG_VERSION_MAJOR}") + if(DEFINED CLANG_RESOURCE_DIR AND NOT CLANG_RESOURCE_DIR STREQUAL "") + set(resource_dir ${LLVM_TOOLS_BINARY_DIR}/${CLANG_RESOURCE_DIR}) + else() + set(resource_dir "${LLVM_LIBRARY_DIR}/clang/${CLANG_VERSION_MAJOR}") + endif() set(flag_types ASM C CXX MODULE_LINKER SHARED_LINKER EXE_LINKER) foreach(type ${flag_types}) set(${type}_flag -DCMAKE_${type}_FLAGS=-resource-dir=${resource_dir}) Index: openmp/CMakeLists.txt =================================================================== --- openmp/CMakeLists.txt +++ openmp/CMakeLists.txt @@ -79,8 +79,8 @@ if(${OPENMP_STANDALONE_BUILD}) set(LIBOMP_HEADERS_INSTALL_PATH "${CMAKE_INSTALL_INCLUDEDIR}") else() - string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" CLANG_VERSION ${PACKAGE_VERSION}) - set(LIBOMP_HEADERS_INSTALL_PATH "${OPENMP_INSTALL_LIBDIR}/clang/${CLANG_VERSION}/include") + include(GetClangResourceDir) + get_clang_resource_dir(LIBOMP_HEADERS_INSTALL_PATH SUBDIR include) endif() # Build host runtime library, after LIBOMPTARGET variables are set since they are needed