Skip to content

Commit d187cee

Browse files
committed
[OpenMP] Use CMAKE_CXX_STANDARD for setting the C++ version
Previously, we tried to check whether the -std=c++17 option was supported and manually add the flag. That doesn't work for compilers that do support C++17 but use a different option syntax, like clang-cl. OpenMP itself probably doesn't specifically require C++17, therefore CXX_STANDARD_REQUIRED is left off, but in some cases, we may have code that only works in C++17 mode. In particular, 46262ca made a refactoring that works when built with Clang in C++17 mode, but not in C++14 mode. MSVC accepts the construct in both language modes. For libomptarget, we've had specific checks that require C++17 (or the -std=c++17 option) to be supported. It's doubtful that libomptarget has got any code which more specifically requires C++17; this seems to be a remnant from when libomptarget was added originally in 2467df6 / D14031. At that point, the rest of OpenMP didn't require C++11, while libomptarget did require it. Now, it's unlikely that anyone attempts building it with a toolchain that doesn't support C++11. At this point, we could also probably just set CXX_STANDARD_REQUIRED to true, requiring C++17 as baseline for all the OpenMP libraries. This fixes building OpenMP with clang-cl after 46262ca. Differential Revision: https://reviews.llvm.org/D149726
1 parent c2b256a commit d187cee

File tree

3 files changed

+12
-6
lines changed

3 files changed

+12
-6
lines changed

openmp/CMakeLists.txt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ if (OPENMP_STANDALONE_BUILD)
3737
set(OPENMP_TEST_CXX_COMPILER ${CMAKE_CXX_COMPILER} CACHE STRING
3838
"C++ compiler to use for testing OpenMP runtime libraries.")
3939
set(OPENMP_LLVM_TOOLS_DIR "" CACHE PATH "Path to LLVM tools for testing.")
40+
41+
set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")
42+
set(CMAKE_CXX_STANDARD_REQUIRED NO)
43+
set(CMAKE_CXX_EXTENSIONS NO)
4044
else()
4145
set(OPENMP_ENABLE_WERROR ${LLVM_ENABLE_WERROR})
4246
# If building in tree, we honor the same install suffix LLVM uses.
@@ -49,6 +53,12 @@ else()
4953
set(OPENMP_TEST_C_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang.exe)
5054
set(OPENMP_TEST_CXX_COMPILER ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++.exe)
5155
endif()
56+
57+
# If not standalone, set CMAKE_CXX_STANDARD but don't set the global cache value,
58+
# only set it locally for OpenMP.
59+
set(CMAKE_CXX_STANDARD 17)
60+
set(CMAKE_CXX_STANDARD_REQUIRED NO)
61+
set(CMAKE_CXX_EXTENSIONS NO)
5262
endif()
5363

5464
# Check and set up common compiler flags.
@@ -68,7 +78,7 @@ set(ENABLE_LIBOMPTARGET ON)
6878
# Since the device plugins are only supported on Linux anyway,
6979
# there is no point in trying to compile libomptarget on other OSes.
7080
# 32-bit systems are not supported either.
71-
if (APPLE OR WIN32 OR NOT OPENMP_HAVE_STD_CPP17_FLAG OR NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
81+
if (APPLE OR WIN32 OR NOT "cxx_std_17" IN_LIST CMAKE_CXX_COMPILE_FEATURES OR NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
7282
set(ENABLE_LIBOMPTARGET OFF)
7383
endif()
7484

@@ -92,7 +102,7 @@ if (OPENMP_ENABLE_LIBOMPTARGET)
92102
# Check that the library can actually be built.
93103
if (APPLE OR WIN32)
94104
message(FATAL_ERROR "libomptarget cannot be built on Windows and MacOS X!")
95-
elseif (NOT OPENMP_HAVE_STD_CPP17_FLAG)
105+
elseif (NOT "cxx_std_17" IN_LIST CMAKE_CXX_COMPILE_FEATURES)
96106
message(FATAL_ERROR "Host compiler must support C++17 to build libomptarget!")
97107
elseif (NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
98108
message(FATAL_ERROR "libomptarget on 32-bit systems are not supported!")

openmp/cmake/HandleOpenMPOptions.cmake

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,3 @@ append_if(OPENMP_HAVE_WENUM_CONSTEXPR_CONVERSION_FLAG "-Wno-enum-constexpr-conve
3535
append_if(OPENMP_HAVE_WEXTRA_FLAG "-Wno-extra" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
3636
append_if(OPENMP_HAVE_WPEDANTIC_FLAG "-Wno-pedantic" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
3737
append_if(OPENMP_HAVE_WMAYBE_UNINITIALIZED_FLAG "-Wno-maybe-uninitialized" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
38-
39-
append_if(OPENMP_HAVE_STD_CPP17_FLAG "-std=c++17" CMAKE_CXX_FLAGS)

openmp/cmake/config-ix.cmake

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,3 @@ check_cxx_compiler_flag(-Wenum-constexpr-conversion OPENMP_HAVE_WENUM_CONSTEXPR_
3636
check_cxx_compiler_flag(-Wextra OPENMP_HAVE_WEXTRA_FLAG)
3737
check_cxx_compiler_flag(-Wpedantic OPENMP_HAVE_WPEDANTIC_FLAG)
3838
check_cxx_compiler_flag(-Wmaybe-uninitialized OPENMP_HAVE_WMAYBE_UNINITIALIZED_FLAG)
39-
40-
check_cxx_compiler_flag(-std=c++17 OPENMP_HAVE_STD_CPP17_FLAG)

0 commit comments

Comments
 (0)