-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
(#22353) llvm-openmp: match FindOpenMP.cmake output, add MSVC support
* llvm-openmp: fix missing FindOpenMP.cmake, check _OPENMP define * llvm-openmp: improve exported compiler flags * llvm-openmp: print runtime library info in test_package * llvm-openmp: match the output of FindOpenMP.cmake * llvm-openmp: add MSVC support * llvm-openmp: mention potential cause of the armv8 Debug issues As suggested by @marxin at #19857 (comment) * llvm-openmp: add a comment * llvm-openmp: move omp to a separate component * llvm-openmp: add Conan v1 support * llvm-openmp: drop v10 and lower The wrong runtime library gets picked up in test_package for some reason. Don't feel like debugging it. * llvm-openmp: patches can be dropped * llvm-openmp: libomptarget is not available on macOS and Windows https://github.com/llvm/llvm-project/blob/llvmorg-17.0.6/openmp/CMakeLists.txt#L103-L104 * llvm-openmp: fix CMake 3.15 incompatibility * llvm-openmp: .get_safe("build_libomptarget") * llvm-openmp: don't use a target for linking in the module * llvm-openmp: restore the v11 macOS armv8 patch * llvm-openmp: add psapi system lib dep on Windows * llvm-openmp: OpenMP version and spec date version can be determined during packaging Avoids a fragile compilation check during find_package(). * llvm-openmp: re-wrap description * llvm-openmp: add v18.1.3 * llvm-openmp: print even more details in test_package * llvm-openmp: set OpenMP version to the minimum of compiler and runtime support * llvm-openmp: add all spec date versions From https://github.com/Kitware/CMake/blob/master/Modules/FindOpenMP.cmake * llvm-openmp: set shared=True by default on Windows * llvm-openmp: force shared=True on Windows * llvm-openmp: fix try_compile() on CXX-only projects * llvm-openmp: bump to v18.1.6 * llvm-openmp: bump to v18.1.8 * llvm-openmp: make the wrapper slightly more robust Based on microsoft/vcpkg#39389
- Loading branch information
Showing
18 changed files
with
337 additions
and
488 deletions.
There are no files selected for viewing
158 changes: 158 additions & 0 deletions
158
recipes/llvm-openmp/all/cmake/conan-llvm-openmp-vars.cmake.in
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,158 @@ | ||
# Reproduces the output of https://github.com/Kitware/CMake/blob/v3.28.1/Modules/FindOpenMP.cmake | ||
|
||
# For Conan v1 compatibility | ||
foreach(_suffix RELEASE DEBUG RELWITHDEBINFO MINSIZEREL) | ||
if(DEFINED OpenMP_OpenMP_INCLUDE_DIRS_${_suffix}) | ||
set(_v1_suffix _${_suffix}) | ||
endif() | ||
endforeach() | ||
|
||
set(OpenMP_C_FLAGS "@OpenMP_FLAGS@") | ||
set(OpenMP_C_INCLUDE_DIR "${OpenMP_INCLUDE_DIR${_v1_suffix}}") | ||
set(OpenMP_C_INCLUDE_DIRS "${OpenMP_INCLUDE_DIRS${_v1_suffix}}") | ||
set(OpenMP_C_LIB_NAMES "@OpenMP_LIB_NAMES@") | ||
set(OpenMP_C_LIBRARIES "${OpenMP_LIBRARIES${_v1_suffix}}") | ||
set(OpenMP_C_DEFINITIONS "${OpenMP_DEFINITIONS${_v1_suffix}}") | ||
|
||
set(OpenMP_CXX_FLAGS "${OpenMP_C_FLAGS}") | ||
set(OpenMP_CXX_INCLUDE_DIR "${OpenMP_C_INCLUDE_DIR}") | ||
set(OpenMP_CXX_INCLUDE_DIRS "${OpenMP_C_INCLUDE_DIRS}") | ||
set(OpenMP_CXX_LIB_NAMES "${OpenMP_C_LIB_NAMES}") | ||
set(OpenMP_CXX_LIBRARIES "${OpenMP_C_LIBRARIES}") | ||
set(OpenMP_CXX_DEFINITIONS "${OpenMP_C_DEFINITIONS}") | ||
|
||
set(OpenMP_omp_LIBRARY "${OpenMP_C_LIBRARIES}") | ||
|
||
# Determine OpenMP specification date and version supported by the compiler. | ||
function(_openmp_get_compiler_spec_date) | ||
set(BUILD_DIR "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindOpenMP") | ||
set(SRC_FILE "${BUILD_DIR}/ompver.c") | ||
if(NOT CMAKE_C_COMPILER_LOADED) | ||
set(SRC_FILE "${BUILD_DIR}/ompver.cpp") | ||
endif() | ||
set(BIN_FILE "${BUILD_DIR}/ompver.bin") | ||
file(WRITE "${SRC_FILE}" " | ||
#include <stdio.h> | ||
const char ompver_str[] = { 'I', 'N', 'F', 'O', ':', 'O', 'p', 'e', 'n', 'M', | ||
'P', '-', 'd', 'a', 't', 'e', '[', | ||
('0' + ((_OPENMP/100000)%10)), | ||
('0' + ((_OPENMP/10000)%10)), | ||
('0' + ((_OPENMP/1000)%10)), | ||
('0' + ((_OPENMP/100)%10)), | ||
('0' + ((_OPENMP/10)%10)), | ||
('0' + ((_OPENMP/1)%10)), | ||
']', '\\0' }; | ||
int main(void) | ||
{ | ||
puts(ompver_str); | ||
return 0; | ||
} | ||
") | ||
try_compile(OpenMP_SPECTEST ${BUILD_DIR} | ||
SOURCES "${SRC_FILE}" | ||
COMPILE_DEFINITIONS "${OpenMP_C_FLAGS}" | ||
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${OpenMP_C_INCLUDE_DIR}" | ||
COPY_FILE "${BIN_FILE}" | ||
) | ||
if(NOT OpenMP_SPECTEST) | ||
if(OpenMP_FIND_REQUIRED) | ||
message(FATAL_ERROR "Failed to build OpenMP test executable for specification date detection") | ||
elseif(NOT OpenMP_FIND_QUIETLY) | ||
message(SEND_ERROR "Failed to build OpenMP test executable for specification date detection") | ||
endif() | ||
return() | ||
endif() | ||
file(STRINGS ${BIN_FILE} specstr LIMIT_COUNT 1 REGEX "INFO:OpenMP-date") | ||
if(specstr MATCHES ".*INFO:OpenMP-date\\[0*([^]]*)\\].*") | ||
set(OpenMP_SPEC_DATE ${CMAKE_MATCH_1} PARENT_SCOPE) | ||
else() | ||
if(OpenMP_FIND_REQUIRED) | ||
message(FATAL_ERROR "Failed to detect OpenMP specification date") | ||
elseif(NOT OpenMP_FIND_QUIETLY) | ||
message(SEND_ERROR "Failed to detect OpenMP specification date") | ||
endif() | ||
return() | ||
endif() | ||
endfunction() | ||
|
||
function(_openmp_set_version_by_spec_date) | ||
set(OpenMP_SPEC_DATE_MAP | ||
"202111=5.2" | ||
"202011=5.1" | ||
# Preview versions | ||
"201611=5.0" # OpenMP 5.0 preview 1 | ||
# Combined versions, 2.5 onwards | ||
"201811=5.0" | ||
"201611=5.0" | ||
"201511=4.5" | ||
"201307=4.0" | ||
"201107=3.1" | ||
"200805=3.0" | ||
"200505=2.5" | ||
# C/C++ version 2.0 | ||
"200203=2.0" | ||
# Fortran version 2.0 | ||
"200011=2.0" | ||
# Fortran version 1.1 | ||
"199911=1.1" | ||
# C/C++ version 1.0 (there's no 1.1 for C/C++) | ||
"199810=1.0" | ||
# Fortran version 1.0 | ||
"199710=1.0" | ||
) | ||
if(OpenMP_SPEC_DATE_MAP MATCHES "${OpenMP_SPEC_DATE}=([0-9]+)\\.([0-9]+)") | ||
set(major "${CMAKE_MATCH_1}") | ||
set(minor "${CMAKE_MATCH_2}") | ||
else() | ||
if(OpenMP_FIND_REQUIRED) | ||
message(FATAL_ERROR "Failed to detect OpenMP specification version") | ||
elseif(NOT OpenMP_FIND_QUIETLY) | ||
message(SEND_ERROR "Failed to detect OpenMP specification version") | ||
endif() | ||
return() | ||
endif() | ||
set(OpenMP_VERSION_MAJOR "${major}" PARENT_SCOPE) | ||
set(OpenMP_VERSION_MINOR "${minor}" PARENT_SCOPE) | ||
set(OpenMP_VERSION "${major}.${minor}" PARENT_SCOPE) | ||
endfunction() | ||
|
||
# Compare the OpenMP API version supported by the compiler to | ||
# the version supported by the LLVM OMP runtime and use the lower of the two. | ||
# Note that this differs slightly from the CMake's FindOpenMP.cmake implementation, | ||
# which checks only the version supported by the compiler. | ||
_openmp_get_compiler_spec_date() | ||
if(OpenMP_SPEC_DATE GREATER @OpenMP_SPEC_DATE@) | ||
set(OpenMP_SPEC_DATE @OpenMP_SPEC_DATE@) | ||
set(OpenMP_VERSION_MAJOR @OpenMP_VERSION_MAJOR@) | ||
set(OpenMP_VERSION_MINOR @OpenMP_VERSION_MINOR@) | ||
set(OpenMP_VERSION @OpenMP_VERSION@) | ||
else() | ||
_openmp_set_version_by_spec_date() | ||
endif() | ||
|
||
foreach(_lang C CXX) | ||
set(OpenMP_${_lang}_FOUND TRUE) | ||
set(OpenMP_${_lang}_SPEC_DATE "${OpenMP_SPEC_DATE}") | ||
set(OpenMP_${_lang}_VERSION_MAJOR "${OpenMP_VERSION_MAJOR}") | ||
set(OpenMP_${_lang}_VERSION_MINOR "${OpenMP_VERSION_MINOR}") | ||
set(OpenMP_${_lang}_VERSION "${OpenMP_VERSION}") | ||
endforeach() | ||
|
||
# Check specification version against the requested min version, validate components | ||
include(FindPackageHandleStandardArgs) | ||
find_package_handle_standard_args(OpenMP | ||
VERSION_VAR OpenMP_VERSION | ||
REQUIRED_VARS | ||
OpenMP_C_FLAGS | ||
OpenMP_C_LIB_NAMES | ||
OpenMP_C_SPEC_DATE | ||
OpenMP_C_VERSION | ||
OpenMP_CXX_FLAGS | ||
OpenMP_CXX_LIB_NAMES | ||
OpenMP_CXX_SPEC_DATE | ||
OpenMP_CXX_VERSION | ||
HANDLE_COMPONENTS | ||
) | ||
set(OPENMP_FOUND ${OpenMP_FOUND}) | ||
set(OpenMP_C_FOUND ${OpenMP_FOUND}) | ||
set(OpenMP_CXX_FOUND ${OpenMP_FOUND}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.