MacOS, CMake y OpenMP
Estoy usando el nuevo CMake (3.9.3) de Homebrew junto con LLVM 5.0.0 también de Brew, porque Clang aquí tiene soporte para OpenMP.
Esto funcionó en CMake 3.8.2 con LLVM 5.
En miCMakeLists.txt
yo tengo
find_package( OpenMP )
y luego quiero hacer
if( OpenMP_CXX_FOUND )
Sin embargo, CMake no parece darse cuenta delfind_package
directiva.
Corro CMake con
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DUSE_WERROR=ON
donde he comprobado esoclang
yclang++
apunta correctamente a/usr/local/opt/llvm/bin/clang
y/usr/local/opt/llvm/bin/clang++
Todo lo que obtengo son estas dos líneas:
-- Could NOT find OpenMP_C (missing: OpenMP_C_FLAGS OpenMP_C_LIB_NAMES) (found version "1.0")
-- Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES) (found version "1.0")
Si pongoOpenMP_C_FLAGS
yo mismo (con-DOpenMP_C_FLAGS=-fopenmp=libomp
) cambia el error a
-- Could NOT find OpenMP_C (missing: OpenMP_C_LIB_NAMES) (found version "3.1")
Tenga en cuenta que cambia el número de versión, por lo que debe encontrar algo, ¿verdad?
¿Qué me falta para que esto funcione correctamente?
Ok, parece que dentro delFindOpenMP.cmake
suministrado por CMake hacemos untry_compile
, que falla en silencio (porque lo hacemos muchas veces y la mayoría de ellos fallará, esto tiene sentido). Sin embargo, con Clang a-Werror
se proporciona el indicador, que falla debido a un argumento de línea de comando no utilizado. Por lo tanto, puedo agregar:
if(APPLE)
if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
set(OpenMP_C_FLAG "-fopenmp=libomp -Wno-unused-command-line-argument")
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(OpenMP_CXX_FLAG "-fopenmp=libomp -Wno-unused-command-line-argument")
endif()
endif()
a mi proyecto porque sé que-fopenmp=libomp
funcionará para este Clang.
¿Es esta la forma correcta de hacerlo?