Index: openmp/CMakeLists.txt =================================================================== --- openmp/CMakeLists.txt +++ openmp/CMakeLists.txt @@ -20,6 +20,8 @@ "Suffix of lib installation directory, e.g. 64 => lib64") # Do not use OPENMP_LIBDIR_SUFFIX directly, use OPENMP_INSTALL_LIBDIR. set(OPENMP_INSTALL_LIBDIR "lib${OPENMP_LIBDIR_SUFFIX}") + set(OPENMP_CLANG_VERSION CACHE STRING + "The Clang version to assume when installing OpenMP headers/libraries in Clang-dedicated directories from a standalone OpenMP build") # Group test settings. set(OPENMP_TEST_C_COMPILER ${CMAKE_C_COMPILER} CACHE STRING @@ -31,6 +33,8 @@ set(OPENMP_ENABLE_WERROR ${LLVM_ENABLE_WERROR}) # If building in tree, we honor the same install suffix LLVM uses. set(OPENMP_INSTALL_LIBDIR "lib${LLVM_LIBDIR_SUFFIX}") + string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" OPENMP_CLANG_VERSION + ${PACKAGE_VERSION}) if (NOT MSVC) set(OPENMP_TEST_C_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang) @@ -41,6 +45,14 @@ endif() endif() +# Clang-dedicated subdirectories. +if(OPENMP_CLANG_VERSION) + string(TOLOWER ${CMAKE_SYSTEM_NAME} os_dir) + set(OPENMP_CLANG_LIB_SUBDIR + clang/${OPENMP_CLANG_VERSION}/lib/${os_dir}/${CMAKE_SYSTEM_PROCESSOR}) + set(OPENMP_CLANG_INCLUDE_SUBDIR clang/${OPENMP_CLANG_VERSION}/include) +endif() + # Check and set up common compiler flags. include(config-ix) include(HandleOpenMPOptions) Index: openmp/libomptarget/deviceRTLs/nvptx/CMakeLists.txt =================================================================== --- openmp/libomptarget/deviceRTLs/nvptx/CMakeLists.txt +++ openmp/libomptarget/deviceRTLs/nvptx/CMakeLists.txt @@ -87,9 +87,21 @@ cuda_add_library(omptarget-nvptx STATIC ${cuda_src_files} ${omp_data_objects} OPTIONS ${CUDA_ARCH} ${CUDA_DEBUG}) + if(OPENMP_CLANG_LIB_SUBDIR AND NOT OPENMP_STANDALONE_BUILD) + add_custom_command(TARGET "omptarget-nvptx" POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory + $/${OPENMP_CLANG_LIB_SUBDIR} + COMMAND ${CMAKE_COMMAND} -E copy $ + $/${OPENMP_CLANG_LIB_SUBDIR} + ) + endif() # Install device RTL under the lib destination folder. install(TARGETS omptarget-nvptx ARCHIVE DESTINATION "${OPENMP_INSTALL_LIBDIR}") + if(OPENMP_CLANG_LIB_SUBDIR) + install(TARGETS omptarget-nvptx ARCHIVE DESTINATION + "${OPENMP_INSTALL_LIBDIR}/${OPENMP_CLANG_LIB_SUBDIR}") + endif() target_link_libraries(omptarget-nvptx ${CUDA_LIBRARIES}) @@ -174,9 +186,22 @@ add_custom_command(TARGET omptarget-nvptx-${sm}-bc POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/libomptarget-nvptx-sm_${sm}.bc $) + if(OPENMP_CLANG_LIB_SUBDIR AND NOT OPENMP_STANDALONE_BUILD) + add_custom_command(TARGET omptarget-nvptx-${sm}-bc POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory + $/${OPENMP_CLANG_LIB_SUBDIR} + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_BINARY_DIR}/libomptarget-nvptx-sm_${sm}.bc + $/${OPENMP_CLANG_LIB_SUBDIR} + ) + endif() # Install bitcode library under the lib destination folder. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libomptarget-nvptx-sm_${sm}.bc DESTINATION "${OPENMP_INSTALL_LIBDIR}") + if(OPENMP_CLANG_LIB_SUBDIR) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libomptarget-nvptx-sm_${sm}.bc + DESTINATION "${OPENMP_INSTALL_LIBDIR}/${OPENMP_CLANG_LIB_SUBDIR}") + endif() endforeach() endif() Index: openmp/libomptarget/plugins/CMakeLists.txt =================================================================== --- openmp/libomptarget/plugins/CMakeLists.txt +++ openmp/libomptarget/plugins/CMakeLists.txt @@ -34,10 +34,25 @@ add_library("omptarget.rtl.${tmachine_libname}" SHARED ${CMAKE_CURRENT_SOURCE_DIR}/../generic-elf-64bit/src/rtl.cpp) + if(OPENMP_CLANG_LIB_SUBDIR AND NOT OPENMP_STANDALONE_BUILD) + add_custom_command(TARGET "omptarget.rtl.${tmachine_libname}" + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory + $/${OPENMP_CLANG_LIB_SUBDIR} + COMMAND ${CMAKE_COMMAND} -E copy + $ + $/${OPENMP_CLANG_LIB_SUBDIR} + ) + endif() # Install plugin under the lib destination folder. install(TARGETS "omptarget.rtl.${tmachine_libname}" LIBRARY DESTINATION "${OPENMP_INSTALL_LIBDIR}") + if(OPENMP_CLANG_LIB_SUBDIR) + install(TARGETS "omptarget.rtl.${tmachine_libname}" + LIBRARY DESTINATION + "${OPENMP_INSTALL_LIBDIR}/${OPENMP_CLANG_LIB_SUBDIR}") + endif() target_link_libraries( "omptarget.rtl.${tmachine_libname}" Index: openmp/libomptarget/plugins/cuda/CMakeLists.txt =================================================================== --- openmp/libomptarget/plugins/cuda/CMakeLists.txt +++ openmp/libomptarget/plugins/cuda/CMakeLists.txt @@ -37,9 +37,22 @@ include_directories(${LIBOMPTARGET_DEP_LIBELF_INCLUDE_DIRS}) add_library(omptarget.rtl.cuda SHARED src/rtl.cpp) +if(OPENMP_CLANG_LIB_SUBDIR AND NOT OPENMP_STANDALONE_BUILD) + add_custom_command(TARGET "omptarget.rtl.cuda" + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory + $/${OPENMP_CLANG_LIB_SUBDIR} + COMMAND ${CMAKE_COMMAND} -E copy $ + $/${OPENMP_CLANG_LIB_SUBDIR} + ) +endif() # Install plugin under the lib destination folder. install(TARGETS omptarget.rtl.cuda LIBRARY DESTINATION "${OPENMP_INSTALL_LIBDIR}") +if(OPENMP_CLANG_LIB_SUBDIR) + install(TARGETS "omptarget.rtl.cuda" LIBRARY DESTINATION + "${OPENMP_INSTALL_LIBDIR}/${OPENMP_CLANG_LIB_SUBDIR}") +endif() target_link_libraries(omptarget.rtl.cuda ${LIBOMPTARGET_DEP_CUDA_DRIVER_LIBRARIES} Index: openmp/libomptarget/src/CMakeLists.txt =================================================================== --- openmp/libomptarget/src/CMakeLists.txt +++ openmp/libomptarget/src/CMakeLists.txt @@ -26,6 +26,18 @@ target_link_libraries(omptarget ${CMAKE_DL_LIBS} "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/exports") +if(OPENMP_CLANG_LIB_SUBDIR AND NOT OPENMP_STANDALONE_BUILD) + add_custom_command(TARGET omptarget POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory + $/${OPENMP_CLANG_LIB_SUBDIR} + COMMAND ${CMAKE_COMMAND} -E copy $ + $/${OPENMP_CLANG_LIB_SUBDIR} + ) +endif() # Install libomptarget under the lib destination folder. install(TARGETS omptarget LIBRARY DESTINATION "${OPENMP_INSTALL_LIBDIR}") +if(OPENMP_CLANG_LIB_SUBDIR) + install(TARGETS omptarget LIBRARY DESTINATION + "${OPENMP_INSTALL_LIBDIR}/${OPENMP_CLANG_LIB_SUBDIR}") +endif() Index: openmp/runtime/src/CMakeLists.txt =================================================================== --- openmp/runtime/src/CMakeLists.txt +++ openmp/runtime/src/CMakeLists.txt @@ -148,6 +148,15 @@ LINKER_LANGUAGE ${LIBOMP_LINKER_LANGUAGE} ) +if(OPENMP_CLANG_LIB_SUBDIR AND NOT OPENMP_STANDALONE_BUILD) + add_custom_command(TARGET omp POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory + $/${OPENMP_CLANG_LIB_SUBDIR} + COMMAND ${CMAKE_COMMAND} -E copy $ + $/${OPENMP_CLANG_LIB_SUBDIR} + ) +endif() + # Get the library's location within the build tree for the unit tester if(NOT WIN32) get_target_property(LIBOMP_LIBRARY_DIR omp LIBRARY_OUTPUT_DIRECTORY) @@ -282,11 +291,10 @@ # Install rules # We want to install libomp in DESTDIR/CMAKE_INSTALL_PREFIX/lib # We want to install headers in DESTDIR/CMAKE_INSTALL_PREFIX/include -if(${OPENMP_STANDALONE_BUILD}) +if(NOT OPENMP_CLANG_INCLUDE_SUBDIR) set(LIBOMP_HEADERS_INSTALL_PATH include) 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") + set(LIBOMP_HEADERS_INSTALL_PATH "${OPENMP_INSTALL_LIBDIR}/${OPENMP_CLANG_INCLUDE_SUBDIR}") endif() if(WIN32) install(TARGETS omp RUNTIME DESTINATION bin) @@ -302,6 +310,9 @@ else() install(TARGETS omp ${LIBOMP_INSTALL_KIND} DESTINATION "${OPENMP_INSTALL_LIBDIR}") + if(OPENMP_CLANG_LIB_SUBDIR) + install(TARGETS omp ${LIBOMP_INSTALL_KIND} DESTINATION "${OPENMP_INSTALL_LIBDIR}/${OPENMP_CLANG_LIB_SUBDIR}") + endif() if(${LIBOMP_INSTALL_ALIASES}) # Create aliases (symlinks) of the library for backwards compatibility