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