Skip to content

Commit

Permalink
(#22353) llvm-openmp: match FindOpenMP.cmake output, add MSVC support
Browse files Browse the repository at this point in the history
* 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
valgur committed Jul 8, 2024
1 parent 9f2ea93 commit a4e1f4f
Show file tree
Hide file tree
Showing 18 changed files with 337 additions and 488 deletions.
158 changes: 158 additions & 0 deletions recipes/llvm-openmp/all/cmake/conan-llvm-openmp-vars.cmake.in
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})
55 changes: 7 additions & 48 deletions recipes/llvm-openmp/all/conandata.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
sources:
"18.1.8":
openmp:
url: "https://github.com/llvm/llvm-project/releases/download/llvmorg-18.1.8/openmp-18.1.8.src.tar.xz"
sha256: "60ed57245e73894e4a2a89b15889f367bd906abfe6d3f92e1718223d4b496150"
cmake:
url: "https://github.com/llvm/llvm-project/releases/download/llvmorg-18.1.8/cmake-18.1.8.src.tar.xz"
sha256: "59badef592dd34893cd319d42b323aaa990b452d05c7180ff20f23ab1b41e837"
"17.0.6":
openmp:
url: "https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.6/openmp-17.0.6.src.tar.xz"
Expand Down Expand Up @@ -39,56 +46,8 @@ sources:
"11.1.0":
url: "https://github.com/llvm/llvm-project/releases/download/llvmorg-11.1.0/openmp-11.1.0.src.tar.xz"
sha256: "d187483b75b39acb3ff8ea1b7d98524d95322e3cb148842957e9b0fbb866052e"
"10.0.0":
url: "https://github.com/llvm/llvm-project/releases/download/llvmorg-10.0.0/openmp-10.0.0.src.tar.xz"
sha256: "3b9ff29a45d0509a1e9667a0feb43538ef402ea8cfc7df3758a01f20df08adfa"
"9.0.1":
url: "https://github.com/llvm/llvm-project/releases/download/llvmorg-9.0.1/openmp-9.0.1.src.tar.xz"
sha256: "5c94060f846f965698574d9ce22975c0e9f04c9b14088c3af5f03870af75cace"
"8.0.1":
url: "https://github.com/llvm/llvm-project/releases/download/llvmorg-8.0.1/openmp-8.0.1.src.tar.xz"
sha256: "3e85dd3cad41117b7c89a41de72f2e6aa756ea7b4ef63bb10dcddf8561a7722c"
patches:
"17.0.4":
- patch_file: "patches/17/0001-disable-build-testing.patch"
patch_description: "Disable building of tools, gdb-plugin, tests and docs"
patch_type: "conan"
"16.0.6":
- patch_file: "patches/16/0001-disable-build-testing.patch"
patch_description: "Disable building of tools, gdb-plugin, tests and docs"
patch_type: "conan"
"15.0.7":
- patch_file: "patches/15/0001-disable-build-testing.patch"
patch_description: "Disable building of tools, gdb-plugin, tests and docs"
patch_type: "conan"
"14.0.6":
- patch_file: "patches/14/0001-disable-build-testing.patch"
patch_description: "Disable building of tools, gdb-plugin, tests and docs"
patch_type: "conan"
"13.0.1":
- patch_file: "patches/13/0001-disable-build-testing.patch"
patch_description: "Disable building of tools, gdb-plugin, tests and docs"
patch_type: "conan"
"12.0.1":
- patch_file: "patches/12/0001-disable-build-testing.patch"
patch_description: "Disable building of tools, gdb-plugin, tests and docs"
patch_type: "conan"
"11.1.0":
- patch_file: "patches/11/0001-disable-build-testing.patch"
patch_description: "Disable building of tools, gdb-plugin, tests and docs"
patch_type: "conan"
- patch_file: "patches/11/0002-fix-armv8-build.patch"
patch_description: "Fix build issues on armv8 architecture"
patch_type: "portability"
"10.0.0":
- patch_file: "patches/10/0001-disable-build-testing.patch"
patch_description: "Disable building of tools, gdb-plugin, tests and docs"
patch_type: "conan"
"9.0.1":
- patch_file: "patches/8/0001-disable-build-testing.patch"
patch_description: "Disable building of tools, gdb-plugin, tests and docs"
patch_type: "conan"
"8.0.1":
- patch_file: "patches/8/0001-disable-build-testing.patch"
patch_description: "Disable building of tools, gdb-plugin, tests and docs"
patch_type: "conan"
Loading

0 comments on commit a4e1f4f

Please sign in to comment.