Enable support for OpenMP in Clang if detected.
- Previously we disabled OpenMP if Clang was detected, as it did not
support it. However as of Clang 3.8 (and potentially Xcode 8) OpenMP
is supported.
Change-Id: Ia39dac9fe746f1fc6310e08553f85f3c37349707
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 25c8ae2..845c949 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -400,31 +400,25 @@
endif (NOT CUSTOM_BLAS)
if (OPENMP)
- # Clang does not (yet) support OpenMP.
- if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+ # Find quietly, as we can continue without OpenMP if it is not found.
+ find_package(OpenMP QUIET)
+ if (OPENMP_FOUND)
+ message("-- Building with OpenMP.")
+ list(APPEND CERES_COMPILE_OPTIONS CERES_USE_OPENMP)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
+ if (UNIX)
+ # At least on Linux, we need pthreads to be enabled for mutex to
+ # compile. This may not work on Windows or Android.
+ find_package(Threads REQUIRED)
+ list(APPEND CERES_COMPILE_OPTIONS CERES_HAVE_PTHREAD)
+ list(APPEND CERES_COMPILE_OPTIONS CERES_HAVE_RWLOCK)
+ endif (UNIX)
+ else (OPENMP_FOUND)
+ message("-- Failed to find OpenMP, disabling. This is expected on "
+ "Clang < 3.8, and at least Xcode <= 7.")
update_cache_variable(OPENMP OFF)
- message("-- Compiler is Clang, disabling OpenMP.")
list(APPEND CERES_COMPILE_OPTIONS CERES_NO_THREADS)
- else (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
- # Find quietly s/t as we can continue without OpenMP if it is not found.
- find_package(OpenMP QUIET)
- if (OPENMP_FOUND)
- message("-- Building with OpenMP.")
- list(APPEND CERES_COMPILE_OPTIONS CERES_USE_OPENMP)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
- if (UNIX)
- # At least on Linux, we need pthreads to be enabled for mutex to
- # compile. This may not work on Windows or Android.
- find_package(Threads REQUIRED)
- list(APPEND CERES_COMPILE_OPTIONS CERES_HAVE_PTHREAD)
- list(APPEND CERES_COMPILE_OPTIONS CERES_HAVE_RWLOCK)
- endif (UNIX)
- else (OPENMP_FOUND)
- message("-- Failed to find OpenMP, disabling.")
- update_cache_variable(OPENMP OFF)
- list(APPEND CERES_COMPILE_OPTIONS CERES_NO_THREADS)
- endif (OPENMP_FOUND)
- endif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+ endif (OPENMP_FOUND)
else (OPENMP)
message("-- Building without OpenMP (disabling multithreading).")
list(APPEND CERES_COMPILE_OPTIONS CERES_NO_THREADS)
diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt
index 74b0799..c352e0e 100644
--- a/internal/ceres/CMakeLists.txt
+++ b/internal/ceres/CMakeLists.txt
@@ -152,10 +152,13 @@
endif (BLAS_FOUND AND LAPACK_FOUND)
if (OPENMP_FOUND)
- if (NOT MSVC)
+ # OpenMP support in Clang requires a non-GNU OpenMP library.
+ if (CMAKE_COMPILER_IS_GNUCXX)
list(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES gomp)
+ endif()
+ if (NOT MSVC)
list(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES ${CMAKE_THREAD_LIBS_INIT})
- endif (NOT MSVC)
+ endif()
endif (OPENMP_FOUND)
set(CERES_LIBRARY_SOURCE