From 58c453703095ddfad20b8f29b82d5c2442b27256 Mon Sep 17 00:00:00 2001 From: Florent Pruvost <florent.pruvost@inria.fr> Date: Fri, 20 Feb 2015 15:50:42 +0000 Subject: [PATCH] add cmake_modules in the project - this is a copy of morse_distrib directory - for dev in Finds --> use the centralized version in trunk/morse_distrib/ of the MORSE inria forge repository and set cmake var MORSE_DISTRIB_DIR --- cmake_modules/GenPkgConfig.cmake | 135 +++ cmake_modules/PrintOpts.cmake | 85 ++ cmake_modules/array2d.cmake | 46 + cmake_modules/morse/AuxilaryFlags.cmake | 35 + cmake_modules/morse/ColorizeMessage.cmake | 79 ++ cmake_modules/morse/FindHeadersAndLibs.cmake | 100 ++ cmake_modules/morse/MorseInit.cmake | 55 + cmake_modules/morse/ParseArguments.cmake | 71 ++ cmake_modules/morse/PrintFindStatus.cmake | 210 ++++ cmake_modules/morse/RulesPrecisions.cmake | 257 +++++ cmake_modules/morse/find/FindBLAS.cmake | 929 +++++++++++++++++ cmake_modules/morse/find/FindBLASEXT.cmake | 335 ++++++ cmake_modules/morse/find/FindCBLAS.cmake | 330 ++++++ cmake_modules/morse/find/FindCHAMELEON.cmake | 721 +++++++++++++ cmake_modules/morse/find/FindFFTW.cmake | 417 ++++++++ cmake_modules/morse/find/FindFXT.cmake | 264 +++++ cmake_modules/morse/find/FindHWLOC.cmake | 271 +++++ cmake_modules/morse/find/FindLAPACK.cmake | 497 +++++++++ cmake_modules/morse/find/FindLAPACKE.cmake | 333 ++++++ cmake_modules/morse/find/FindLAPACKEXT.cmake | 296 ++++++ cmake_modules/morse/find/FindMAGMA.cmake | 372 +++++++ cmake_modules/morse/find/FindMETIS.cmake | 224 ++++ cmake_modules/morse/find/FindMPIEXT.cmake | 120 +++ cmake_modules/morse/find/FindMUMPS.cmake | 608 +++++++++++ cmake_modules/morse/find/FindPARMETIS.cmake | 225 ++++ cmake_modules/morse/find/FindPASTIX.cmake | 622 +++++++++++ cmake_modules/morse/find/FindPTSCOTCH.cmake | 326 ++++++ cmake_modules/morse/find/FindQUARK.cmake | 283 +++++ cmake_modules/morse/find/FindSCALAPACK.cmake | 450 ++++++++ cmake_modules/morse/find/FindSCOTCH.cmake | 297 ++++++ cmake_modules/morse/find/FindSTARPU.cmake | 776 ++++++++++++++ cmake_modules/morse/find/FindTMG.cmake | 267 +++++ cmake_modules/morse/find/MORSE-Copyright.txt | 41 + .../morse/precision_generator/Conversion.py | 266 +++++ .../morse/precision_generator/codegen.py | 120 +++ .../precision_generator/genDependencies.py | 211 ++++ .../morse/precision_generator/subs.py | 968 ++++++++++++++++++ 37 files changed, 11642 insertions(+) create mode 100644 cmake_modules/GenPkgConfig.cmake create mode 100644 cmake_modules/PrintOpts.cmake create mode 100644 cmake_modules/array2d.cmake create mode 100644 cmake_modules/morse/AuxilaryFlags.cmake create mode 100644 cmake_modules/morse/ColorizeMessage.cmake create mode 100644 cmake_modules/morse/FindHeadersAndLibs.cmake create mode 100644 cmake_modules/morse/MorseInit.cmake create mode 100644 cmake_modules/morse/ParseArguments.cmake create mode 100644 cmake_modules/morse/PrintFindStatus.cmake create mode 100644 cmake_modules/morse/RulesPrecisions.cmake create mode 100644 cmake_modules/morse/find/FindBLAS.cmake create mode 100644 cmake_modules/morse/find/FindBLASEXT.cmake create mode 100644 cmake_modules/morse/find/FindCBLAS.cmake create mode 100644 cmake_modules/morse/find/FindCHAMELEON.cmake create mode 100644 cmake_modules/morse/find/FindFFTW.cmake create mode 100644 cmake_modules/morse/find/FindFXT.cmake create mode 100644 cmake_modules/morse/find/FindHWLOC.cmake create mode 100644 cmake_modules/morse/find/FindLAPACK.cmake create mode 100644 cmake_modules/morse/find/FindLAPACKE.cmake create mode 100644 cmake_modules/morse/find/FindLAPACKEXT.cmake create mode 100644 cmake_modules/morse/find/FindMAGMA.cmake create mode 100644 cmake_modules/morse/find/FindMETIS.cmake create mode 100644 cmake_modules/morse/find/FindMPIEXT.cmake create mode 100644 cmake_modules/morse/find/FindMUMPS.cmake create mode 100644 cmake_modules/morse/find/FindPARMETIS.cmake create mode 100644 cmake_modules/morse/find/FindPASTIX.cmake create mode 100644 cmake_modules/morse/find/FindPTSCOTCH.cmake create mode 100644 cmake_modules/morse/find/FindQUARK.cmake create mode 100644 cmake_modules/morse/find/FindSCALAPACK.cmake create mode 100644 cmake_modules/morse/find/FindSCOTCH.cmake create mode 100644 cmake_modules/morse/find/FindSTARPU.cmake create mode 100644 cmake_modules/morse/find/FindTMG.cmake create mode 100644 cmake_modules/morse/find/MORSE-Copyright.txt create mode 100644 cmake_modules/morse/precision_generator/Conversion.py create mode 100755 cmake_modules/morse/precision_generator/codegen.py create mode 100755 cmake_modules/morse/precision_generator/genDependencies.py create mode 100644 cmake_modules/morse/precision_generator/subs.py diff --git a/cmake_modules/GenPkgConfig.cmake b/cmake_modules/GenPkgConfig.cmake new file mode 100644 index 000000000..b8dde5bf7 --- /dev/null +++ b/cmake_modules/GenPkgConfig.cmake @@ -0,0 +1,135 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# @file GenPkgConfig.cmake +# +# @project MORSE +# MORSE is a software package provided by: +# Inria Bordeaux - Sud-Ouest, +# Univ. of Tennessee, +# King Abdullah Univesity of Science and Technology +# Univ. of California Berkeley, +# Univ. of Colorado Denver. +# +# @version 0.9.0 +# @author Cedric Castagnede +# @author Emmanuel Agullo +# @author Mathieu Faverge +# @author Florent Pruvost +# @date 10-11-2014 +# +### + +### +# +# GENERATE_PKGCONFIG_FILE: generate a file .pc according to the options +# +### +MACRO(GENERATE_PKGCONFIG_FILE _file) + + # The link flags specific to this package and any required libraries + # that don't support PkgConfig + set(CHAMELEON_PKGCONFIG_LIBS "") + # The link flags for private libraries required by this package but not + # exposed to applications + set(CHAMELEON_PKGCONFIG_LIBS_PRIVATE "") + # A list of packages required by this package + set(CHAMELEON_PKGCONFIG_REQUIRED "") + # A list of private packages required by this package but not exposed to + # applications + set(CHAMELEON_PKGCONFIG_REQUIRED_PRIVATE "") + + list(APPEND CHAMELEON_PKGCONFIG_LIBS -lchameleon) + if(CHAMELEON_SCHED_STARPU) + list(APPEND CHAMELEON_PKGCONFIG_LIBS -lchameleon_starpu) + if ( CHAMELEON_USE_MPI ) + list(APPEND CHAMELEON_PKGCONFIG_REQUIRED + starpumpi-${CHAMELEON_STARPU_VERSION}) + else() + list(APPEND CHAMELEON_PKGCONFIG_REQUIRED + starpu-${CHAMELEON_STARPU_VERSION}) + endif() + elseif(CHAMELEON_SCHED_QUARK) + list(APPEND CHAMELEON_PKGCONFIG_LIBS -lchameleon_quark) + list(APPEND CHAMELEON_PKGCONFIG_LIBS "-l${QUARK_quark_LIBRARY}") + endif() + + + if(NOT CHAMELEON_SIMULATION) + + if(CHAMELEON_USE_CUDA) + list(APPEND CHAMELEON_PKGCONFIG_LIBS ${CUDA_LIBRARIES}) + endif() + + if(CHAMELEON_USE_MAGMA) + list(APPEND CHAMELEON_PKGCONFIG_REQUIRED magma) + endif() + + list(APPEND CHAMELEON_PKGCONFIG_LIBS + -lcoreblas + ${LAPACKE_LIBRARIES} + ${CBLAS_LIBRARIES} + ${EXTRA_LIBRARIES} + ) + + list(APPEND CHAMELEON_PKGCONFIG_REQUIRED hwloc) + + else(NOT CHAMELEON_SIMULATION) + + list(APPEND CHAMELEON_PKGCONFIG_LIBS + -lcoreblas + -lsimulapacke + -lsimucblas + ${EXTRA_LIBRARIES} + ) + + list(APPEND CHAMELEON_PKGCONFIG_REQUIRED hwloc) + + endif(NOT CHAMELEON_SIMULATION) + + # Define required package + # ----------------------- + set(CHAMELEON_PKGCONFIG_LIBS_CPY "${CHAMELEON_PKGCONFIG_LIBS}") + set(CHAMELEON_PKGCONFIG_LIBS "") + foreach(_dep ${CHAMELEON_PKGCONFIG_LIBS_CPY}) + get_filename_component(dep_we ${_dep} NAME) + STRING(REPLACE "lib" "-l" dep_we "${dep_we}") + STRING(REPLACE ".so" "" dep_we "${dep_we}") + STRING(REPLACE ".a" "" dep_we "${dep_we}") + STRING(REPLACE ".dylib" "" dep_we "${dep_we}") + STRING(REPLACE ".dll" "" dep_we "${dep_we}") + list(APPEND CHAMELEON_PKGCONFIG_LIBS ${dep_we}) + endforeach() + + list(REMOVE_DUPLICATES CHAMELEON_PKGCONFIG_LIBS) + list(REMOVE_DUPLICATES CHAMELEON_PKGCONFIG_LIBS_PRIVATE) + list(REMOVE_DUPLICATES CHAMELEON_PKGCONFIG_REQUIRED) + list(REMOVE_DUPLICATES CHAMELEON_PKGCONFIG_REQUIRED_PRIVATE) + + STRING(REPLACE ";" " " CHAMELEON_PKGCONFIG_LIBS "${CHAMELEON_PKGCONFIG_LIBS}") + STRING(REPLACE ";" " " CHAMELEON_PKGCONFIG_LIBS_PRIVATE "${CHAMELEON_PKGCONFIG_LIBS_PRIVATE}") + STRING(REPLACE ";" " " CHAMELEON_PKGCONFIG_REQUIRED "${CHAMELEON_PKGCONFIG_REQUIRED}") + STRING(REPLACE ";" " " CHAMELEON_PKGCONFIG_REQUIRED_PRIVATE "${CHAMELEON_PKGCONFIG_REQUIRED_PRIVATE}") + + # Create .pc file + # --------------- + SET(_output_file "${CMAKE_BINARY_DIR}/chameleon.pc") + # TODO: add url of MORSE releases in .pc file + CONFIGURE_FILE("${_file}" "${_output_file}" @ONLY) + + # installation + # ------------ + INSTALL(FILES ${_output_file} DESTINATION lib/pkgconfig) + +ENDMACRO(GENERATE_PKGCONFIG_FILE) + +## +## @end file GenPkgConfig.cmake +## diff --git a/cmake_modules/PrintOpts.cmake b/cmake_modules/PrintOpts.cmake new file mode 100644 index 000000000..4a096ec33 --- /dev/null +++ b/cmake_modules/PrintOpts.cmake @@ -0,0 +1,85 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# @file PrintOpts.cmake +# +# @project MORSE +# MORSE is a software package provided by: +# Inria Bordeaux - Sud-Ouest, +# Univ. of Tennessee, +# King Abdullah Univesity of Science and Technology +# Univ. of California Berkeley, +# Univ. of Colorado Denver. +# +# @version 0.9.0 +# @author Florent Pruvost +# @date 10-11-2014 +# +### +set(dep_message "\nConfiguration of Chameleon:\n" + " BUILDNAME ...........: ${BUILDNAME}\n" + " SITE ................: ${SITE}\n" + "\n" + " Compiler: C .........: ${CMAKE_C_COMPILER} (${CMAKE_C_COMPILER_ID})\n" + " Compiler: Fortran ...: ${CMAKE_Fortran_COMPILER} (${CMAKE_Fortran_COMPILER_ID})\n") +if(CHAMELEON_USE_MPI) + set(dep_message "${dep_message}" + " Compiler: MPI .......: ${MPI_C_COMPILER}\n" + " compiler flags ......: ${MPI_C_COMPILE_FLAGS}\n") +endif() +set(dep_message "${dep_message}" +" Linker: .............: ${CMAKE_LINKER}\n" +"\n" +" Build type ..........: ${CMAKE_BUILD_TYPE}\n" +" Build shared ........: ${BUILD_SHARED_LIBS}\n" +" CFlags ..............: ${CMAKE_C_FLAGS}\n" +" LDFlags .............: ${CMAKE_C_LINK_FLAGS}\n" +"\n" +" Implementation paradigm\n" +" CUDA ................: ${CHAMELEON_USE_CUDA}\n" +" MPI .................: ${CHAMELEON_USE_MPI}\n" +"\n" +" Runtime specific\n" +" QUARK ...............: ${CHAMELEON_SCHED_QUARK}\n" +" StarPU ..............: ${CHAMELEON_SCHED_STARPU}\n" +" FxT .................: ${CHAMELEON_USE_FXT}\n" +"\n" +" Kernels specific\n" +" BLAS ................: ${BLA_VENDOR}\n" +" MAGMA ...............: ${CHAMELEON_USE_MAGMA}\n" +"\n" +" Simulation mode .....: ${CHAMELEON_SIMULATION}\n" +"\n" +" Binaries to build\n" +" documentation ........: ${CHAMELEON_ENABLE_DOCS}\n" +" example ..............: ${CHAMELEON_ENABLE_EXAMPLE}\n" +" testing ..............: ${CHAMELEON_ENABLE_TESTING}\n" +" timing ...............: ${CHAMELEON_ENABLE_TIMING}\n" +"\n" +" CHAMELEON dependencies :\n") +foreach (_dep ${CHAMELEON_DEP}) + set(dep_message "${dep_message}" + " ${_dep}\n") +endforeach () +set(dep_message "${dep_message}" +"\n" +" Definitions: ${CHAMELEON_DEFINITIONS_LIST}\n") +set(dep_message "${dep_message}" +"\n" +" INSTALL_PREFIX ......: ${CMAKE_INSTALL_PREFIX}\n\n") + +string(REPLACE ";" " " dep_message_wsc "${dep_message}") +#message(${dep_message}) +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/config.log "${dep_message_wsc}") +message(STATUS "Configuration is done - A summary of the current configuration" +"has been written in ${CMAKE_CURRENT_BINARY_DIR}/config.log") +# installation +# ------------ +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/config.log DESTINATION share/chameleon) diff --git a/cmake_modules/array2d.cmake b/cmake_modules/array2d.cmake new file mode 100644 index 000000000..251130b57 --- /dev/null +++ b/cmake_modules/array2d.cmake @@ -0,0 +1,46 @@ + +#------------------------------------------------------------------- + +macro( array2d_get_item out_value offset ) + math( EXPR _finalindex "${_array2d_index}+${offset}" ) + list( GET _array2d_array ${_finalindex} _item ) + set( ${out_value} "${_item}" ) +endmacro() + +#------------------------------------------------------------------- + +macro( array2d_begin_loop out_advanced array width var_names ) + set( _array2d_out_advanced ${out_advanced} ) + set( _array2d_index 0 ) + set( _array2d_array ${array} ) + set( _array2d_width ${width} ) + set( _array2d_var_names ${var_names} ) + array2d_advance() +endmacro() + +#------------------------------------------------------------------- + +macro( array2d_advance ) + if( NOT _array2d_array ) + set( ${_array2d_out_advanced} false ) + else() + list( LENGTH _array2d_array _size ) + math( EXPR _remaining "${_size}-${_array2d_index}" ) + + if( (_array2d_width LESS 1) OR (_size LESS _array2d_width) OR (_remaining LESS _array2d_width) ) + set( ${_array2d_out_advanced} false ) + else() + math( EXPR _adjusted_width "${_array2d_width}-1" ) + foreach( offset RANGE ${_adjusted_width} ) + list( GET _array2d_var_names ${offset} _var_name ) + array2d_get_item( ${_var_name} ${offset} ) + endforeach() + + math( EXPR _index "${_array2d_index}+${_array2d_width}" ) + set( _array2d_index ${_index} ) + set( ${_array2d_out_advanced} true ) + endif() + endif() +endmacro() + +#------------------------------------------------------------------- \ No newline at end of file diff --git a/cmake_modules/morse/AuxilaryFlags.cmake b/cmake_modules/morse/AuxilaryFlags.cmake new file mode 100644 index 000000000..60de26627 --- /dev/null +++ b/cmake_modules/morse/AuxilaryFlags.cmake @@ -0,0 +1,35 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# @file AuxilaryFlags.cmake +# +# @project MORSE +# MORSE is a software package provided by: +# Inria Bordeaux - Sud-Ouest, +# Univ. of Tennessee, +# King Abdullah Univesity of Science and Technology +# Univ. of California Berkeley, +# Univ. of Colorado Denver. +# +# @version 0.9.0 +# @author Xavier Lacoste +# @date 30-01-2015 +# +# Define auxilary variables: +# - CMAKE_Fortran_PREPROCESS_FLAGS : force C preprocessor. +# - CMAKE_Fortran_FREEFORM_FLAG : Force free format. +### + + +IF(CMAKE_Fortran_COMPILER_ID MATCHES GNU) + list(APPEND CMAKE_Fortran_FLAGS "-cpp -ffree-form") +ELSEIF(CMAKE_Fortran_COMPILER_ID MATCHES Intel) + list(APPEND CMAKE_Fortran_PREPROCESS_FLAG "-fpp") +ENDIF() diff --git a/cmake_modules/morse/ColorizeMessage.cmake b/cmake_modules/morse/ColorizeMessage.cmake new file mode 100644 index 000000000..6ec23d833 --- /dev/null +++ b/cmake_modules/morse/ColorizeMessage.cmake @@ -0,0 +1,79 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# @file ColorizeMessage.cmake +# +# @project MORSE +# MORSE is a software package provided by: +# Inria Bordeaux - Sud-Ouest, +# Univ. of Tennessee, +# King Abdullah Univesity of Science and Technology +# Univ. of California Berkeley, +# Univ. of Colorado Denver. +# +# @version 0.9.0 +# @author Cedric Castagnede +# @author Emmanuel Agullo +# @author Mathieu Faverge +# @author Florent Pruvost +# @date 13-07-2012 +# +### + +# Set some colors +if(NOT WIN32) + string(ASCII 27 Esc) + set(ColourReset "${Esc}[m") + set(ColourBold "${Esc}[1m") + set(Red "${Esc}[31m") + set(Green "${Esc}[32m") + set(Yellow "${Esc}[33m") + set(Blue "${Esc}[34m") + set(Magenta "${Esc}[35m") + set(Cyan "${Esc}[36m") + set(White "${Esc}[37m") + set(BoldRed "${Esc}[1;31m") + set(BoldGreen "${Esc}[1;32m") + set(BoldYellow "${Esc}[1;33m") + set(BoldBlue "${Esc}[1;34m") + set(BoldMagenta "${Esc}[1;35m") + set(BoldCyan "${Esc}[1;36m") + set(BoldWhite "${Esc}[1;37m") +endif() + +# Colorize cmake messages during configure +function(message) + list(GET ARGV 0 MessageType) + if(MessageType STREQUAL FATAL_ERROR OR MessageType STREQUAL SEND_ERROR) + list(REMOVE_AT ARGV 0) + string (REPLACE ";" " " ARGV_STR "${ARGV}") + _message(${MessageType} "${BoldRed}${ARGV_STR}${ColourReset}") + elseif(MessageType STREQUAL WARNING) + list(REMOVE_AT ARGV 0) + string (REPLACE ";" " " ARGV_STR "${ARGV}") + _message(${MessageType} "${BoldYellow}${ARGV_STR}${ColourReset}") + elseif(MessageType STREQUAL AUTHOR_WARNING) + list(REMOVE_AT ARGV 0) + string (REPLACE ";" " " ARGV_STR "${ARGV}") + _message(${MessageType} "${BoldCyan}${ARGV_STR}${ColourReset}") + elseif(MessageType STREQUAL STATUS) + list(REMOVE_AT ARGV 0) + string (REPLACE ";" " " ARGV_STR "${ARGV}") + _message(${MessageType} "${Green}${ARGV_STR}${ColourReset}") + else() + string (REPLACE ";" " " ARGV_STR "${ARGV}") + string (REPLACE "${Esc}[1 " "${Esc}[1;" ARGV_STR "${ARGV_STR}") + _message("${ARGV_STR}") + endif() +endfunction() + +## +## @end file ColorizeMessage.cmake +## diff --git a/cmake_modules/morse/FindHeadersAndLibs.cmake b/cmake_modules/morse/FindHeadersAndLibs.cmake new file mode 100644 index 000000000..0f5eadde7 --- /dev/null +++ b/cmake_modules/morse/FindHeadersAndLibs.cmake @@ -0,0 +1,100 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# @file FindHeadersAndLibs.cmake +# +# @project MORSE +# MORSE is a software package provided by: +# Inria Bordeaux - Sud-Ouest, +# Univ. of Tennessee, +# King Abdullah Univesity of Science and Technology +# Univ. of California Berkeley, +# Univ. of Colorado Denver. +# +# @version 0.9.0 +# @author Cedric Castagnede +# @author Emmanuel Agullo +# @author Mathieu Faverge +# @author Florent Pruvost +# @date 13-07-2012 +# +### + +# Add the path where we handle our FindFOO.cmake to seek for liraries +list(APPEND CMAKE_MODULE_PATH ${MORSE_CMAKE_MODULE_PATH}/find) + +# Some macros to print status when search for headers and libs +# PrintFindStatus.cmake is in cmake_modules/morse/find directory +include(PrintFindStatus) + + +function(FindHeader _libname _header_to_find) + + # save _libname upper and lower case + string(TOUPPER ${_libname} LIBNAME) + string(TOLOWER ${_libname} libname) + + # Looking for include + # ------------------- + + # Add system include paths to search include + # ------------------------------------------ + unset(_inc_env) + if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") + else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + endif() + list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") + list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") + list(REMOVE_DUPLICATES _inc_env) + + + # Try to find the _header_to_find in the given paths + # -------------------------------------------------- + # call cmake macro to find the header path + if(${LIBNAME}_INCDIR) + set(${LIBNAME}_${_header_to_find}_DIRS "${LIBNAME}_${_header_to_find}_DIRS-NOTFOUND") + find_path(${LIBNAME}_${_header_to_find}_DIRS + NAMES ${_header_to_find} + HINTS ${${LIBNAME}_INCDIR}) + elseif(${LIBNAME}_DIR) + set(${LIBNAME}_${_header_to_find}_DIRS "${LIBNAME}_${_header_to_find}_DIRS-NOTFOUND") + find_path(${LIBNAME}_${_header_to_find}_DIRS + NAMES ${_header_to_find} + HINTS ${${LIBNAME}_DIR} + PATH_SUFFIXES include) + else() + set(${LIBNAME}_${_header_to_find}_DIRS "${LIBNAME}_${_header_to_find}_DIRS-NOTFOUND") + find_path(${LIBNAME}_${_header_to_find}_DIRS + NAMES ${_header_to_find} + HINTS ${_inc_env}) + endif() + mark_as_advanced(${LIBNAME}_${_header_to_find}_DIRS) + + # Print status if not found + # ------------------------- + if (NOT ${LIBNAME}_${_header_to_find}_DIRS) + Print_Find_Header_Status(${libname} ${_header_to_find}) + endif () + +endfunction(FindHeader) + + +## +## @end file FindHeadersAndLibs.cmake +## diff --git a/cmake_modules/morse/MorseInit.cmake b/cmake_modules/morse/MorseInit.cmake new file mode 100644 index 000000000..ccb528762 --- /dev/null +++ b/cmake_modules/morse/MorseInit.cmake @@ -0,0 +1,55 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# @file MorseInit.cmake +# +# @project MORSE +# MORSE is a software package provided by: +# Inria Bordeaux - Sud-Ouest, +# Univ. of Tennessee, +# King Abdullah Univesity of Science and Technology +# Univ. of California Berkeley, +# Univ. of Colorado Denver. +# +# @version 0.9.0 +# @author Cedric Castagnede +# @author Emmanuel Agullo +# @author Mathieu Faverge +# @author Florent Pruvost +# @date 13-07-2012 +# +### + +# This include is required to check symbols of libs in the main CMakeLists.txt +include(CheckFunctionExists) + +# To colorize messages +include(ColorizeMessage) + +# To find headers and libs +include(FindHeadersAndLibs) + +# Some macros to print status when search for headers and libs +# PrintFindStatus.cmake is in cmake_modules/morse/find directory +include(PrintFindStatus) + +# Define some auxilary flags +include(AuxilaryFlags) + +# Add the path where we handle our FindFOO.cmake to seek for liraries +list(APPEND CMAKE_MODULE_PATH ${MORSE_CMAKE_MODULE_PATH}/find) + +option(MORSE_VERBOSE_FIND_PACKAGE "Add additional messages concerning no found packages" OFF) +#message("-- ${BoldGreen}MORSE_VERBOSE_FIND_PACKAGE is set to OFF, turn it ON to get" +# "information about packages not found${ColourReset}") + +## +## @end file MorseInit.cmake +## diff --git a/cmake_modules/morse/ParseArguments.cmake b/cmake_modules/morse/ParseArguments.cmake new file mode 100644 index 000000000..1407ded47 --- /dev/null +++ b/cmake_modules/morse/ParseArguments.cmake @@ -0,0 +1,71 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# @file ParseArguments.cmake +# +# @project MORSE +# MORSE is a software package provided by: +# Inria Bordeaux - Sud-Ouest, +# Univ. of Tennessee, +# King Abdullah Univesity of Science and Technology +# Univ. of California Berkeley, +# Univ. of Colorado Denver. +# +# @version 0.9.0 +# @author Cedric Castagnede +# @author Emmanuel Agullo +# @author Mathieu Faverge +# @date 13-07-2012 +# +### + +MACRO(PARSE_ARGUMENTS prefix arg_names option_names) + set(DEFAULT_ARGS) + foreach(arg_name ${arg_names}) + set(${prefix}_${arg_name}) + endforeach(arg_name) + foreach(option ${option_names}) + set(${prefix}_${option} FALSE) + endforeach(option) + + set(current_arg_name DEFAULT_ARGS) + set(current_arg_list) + foreach(arg ${ARGN}) + set(larg_names ${arg_names}) + list(FIND larg_names "${arg}" is_arg_name) + if(is_arg_name GREATER -1) + set(${prefix}_${current_arg_name} ${current_arg_list}) + set(current_arg_name ${arg}) + set(current_arg_list) + else(is_arg_name GREATER -1) + set(loption_names ${option_names}) + list(FIND loption_names "${arg}" is_option) + if(is_option GREATER -1) + set(${prefix}_${arg} TRUE) + else(is_option GREATER -1) + set(current_arg_list ${current_arg_list} ${arg}) + endif(is_option GREATER -1) + endif(is_arg_name GREATER -1) + endforeach(arg) + set(${prefix}_${current_arg_name} ${current_arg_list}) + +ENDMACRO(PARSE_ARGUMENTS) + +MACRO(CAR var) + set(${var} ${ARGV1}) +ENDMACRO(CAR) + +MACRO(CDR var junk) + set(${var} ${ARGN}) +ENDMACRO(CDR) + +## +## @end file ParseArguments.cmake +## diff --git a/cmake_modules/morse/PrintFindStatus.cmake b/cmake_modules/morse/PrintFindStatus.cmake new file mode 100644 index 000000000..686f9575e --- /dev/null +++ b/cmake_modules/morse/PrintFindStatus.cmake @@ -0,0 +1,210 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Some macros to print status when search for headers and libs +# Main parameters of macros +# _libname: name of the lib you seek, foo for example +# _header_to_find: name of the header you seek, foo.h for example +# _lib_to_find: name of the library you seek, libfoo for example +# _pc_to_find: name of the pkg-config file zyou seek, foo.pc for example + + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. + +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + + +# Set some colors +if(NOT WIN32) + string(ASCII 27 Esc) + set(ColourReset "${Esc}[m") + set(ColourBold "${Esc}[1m") + set(Red "${Esc}[31m") + set(Green "${Esc}[32m") + set(Yellow "${Esc}[33m") + set(Blue "${Esc}[34m") + set(Magenta "${Esc}[35m") + set(Cyan "${Esc}[36m") + set(White "${Esc}[37m") + set(BoldRed "${Esc}[1;31m") + set(BoldGreen "${Esc}[1;32m") + set(BoldYellow "${Esc}[1;33m") + set(BoldBlue "${Esc}[1;34m") + set(BoldMagenta "${Esc}[1;35m") + set(BoldCyan "${Esc}[1;36m") + set(BoldWhite "${Esc}[1;37m") +endif() + + +# This macro informs why the _header_to_find file has not been found +macro(Print_Find_Header_Status _libname _header_to_find) + + # save _libname upper and lower case + string(TOUPPER ${_libname} LIBNAME) + string(TOLOWER ${_libname} libname) + + # print status + #message(" ") + if(${LIBNAME}_INCDIR) + message("${Blue}${LIBNAME}_INCDIR is defined but ${_header_to_find}" + "has not been found in ${${LIBNAME}_INCDIR}${ColourReset}") + else() + if(${LIBNAME}_DIR) + message("${Blue}${LIBNAME}_DIR is defined but" + "${_header_to_find} has not been found in" + "${${LIBNAME}_DIR}/include${ColourReset}") + else() + message("${Blue}${_header_to_find} not found." + "Nor ${LIBNAME}_DIR neither ${LIBNAME}_INCDIR" + "are defined so that we looked for ${_header_to_find} in" + "system paths (INCLUDE, CPATH, C_INCLUDE_PATH," + "INCLUDE_PATH, CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES" + ", CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES)${ColourReset}") + if(_inc_env) + message("${Blue}${_header_to_find} has not been found in" + "${_inc_env}${ColourReset}") + endif() + endif() + endif() + message("${BoldBlue}Please indicate where to find ${_header_to_find}. You have three options:\n" + "- Option 1: Provide the root directory of the library with cmake option: -D${LIBNAME}_DIR=your/path/to/${libname}/\n" + "- Option 2: Provide the directory where to find the headers with cmake option: -D${LIBNAME}_INCDIR=your/path/to/${libname}/include/\n" + "- Option 3: Update your environment variable (INCLUDE or CPATH)\n" + "- Option 4: If your library provides a PkgConfig file, make sure pkg-config finds your library${ColourReset}") + #message(" ") + +endmacro() + +# This macro informs why the _lib_to_find file has not been found +macro(Print_Find_Library_Status _libname _lib_to_find) + + # save _libname upper/lower case + string(TOUPPER ${_libname} LIBNAME) + string(TOLOWER ${_libname} libname) + + # print status + #message(" ") + if(${LIBNAME}_LIBDIR) + message("${Yellow}${LIBNAME}_LIBDIR is defined but ${_lib_to_find}" + "has not been found in ${${LIBNAME}_LIBDIR}${ColourReset}") + else() + if(${LIBNAME}_DIR) + message("${Yellow}${LIBNAME}_DIR is defined but ${_lib_to_find}" + "has not been found in ${${LIBNAME}_DIR}/lib(or /lib32 or" + "/lib64)${ColourReset}") + else() + message("${Yellow}${_lib_to_find} not found." + "Nor ${LIBNAME}_DIR neither ${LIBNAME}_LIBDIR" + "are defined so that we looked for ${_lib_to_find} in" + "system paths (Linux: LD_LIBRARY_PATH, Windows: LIB," + "Mac: DYLD_LIBRARY_PATH," + "CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES," + "CMAKE_C_IMPLICIT_LINK_DIRECTORIES)${ColourReset}") + if(_lib_env) + message("${Yellow}${_lib_to_find} has not been found in" + "${_lib_env}${ColourReset}") + endif() + endif() + endif() + message("${BoldYellow}Please indicate where to find ${_lib_to_find}. You have three options:\n" + "- Option 1: Provide the root directory of the library with cmake option: -D${LIBNAME}_DIR=your/path/to/${libname}/\n" + "- Option 2: Provide the directory where to find the library with cmake option: -D${LIBNAME}_LIBDIR=your/path/to/${libname}/lib/\n" + "- Option 3: Update your environment variable (Linux: LD_LIBRARY_PATH, Windows: LIB, Mac: DYLD_LIBRARY_PATH)\n" + "- Option 4: If your library provides a PkgConfig file, make sure pkg-config finds your library${ColourReset}") + +endmacro() + +# This macro informs why the _lib_to_find file has not been found +macro(Print_Find_Library_Blas_Status _libname _lib_to_find) + + # save _libname upper/lower case + string(TOUPPER ${_libname} LIBNAME) + string(TOLOWER ${_libname} libname) + + # print status + #message(" ") + if(${LIBNAME}_LIBDIR) + message("${Yellow}${LIBNAME}_LIBDIR is defined but ${_lib_to_find}" + "has not been found in ${ARGN}${ColourReset}") + else() + if(${LIBNAME}_DIR) + message("${Yellow}${LIBNAME}_DIR is defined but ${_lib_to_find}" + "has not been found in ${ARGN}${ColourReset}") + else() + message("${Yellow}${_lib_to_find} not found." + "Nor ${LIBNAME}_DIR neither ${LIBNAME}_LIBDIR" + "are defined so that we look for ${_lib_to_find} in" + "system paths (Linux: LD_LIBRARY_PATH, Windows: LIB," + "Mac: DYLD_LIBRARY_PATH," + "CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES," + "CMAKE_C_IMPLICIT_LINK_DIRECTORIES)${ColourReset}") + if(_lib_env) + message("${Yellow}${_lib_to_find} has not been found in" + "${_lib_env}${ColourReset}") + endif() + endif() + endif() + message("${BoldYellow}Please indicate where to find ${_lib_to_find}. You have three options:\n" + "- Option 1: Provide the root directory of the library with cmake option: -D${LIBNAME}_DIR=your/path/to/${libname}/\n" + "- Option 2: Provide the directory where to find the library with cmake option: -D${LIBNAME}_LIBDIR=your/path/to/${libname}/lib/\n" + "- Option 3: Update your environment variable (Linux: LD_LIBRARY_PATH, Windows: LIB, Mac: DYLD_LIBRARY_PATH)\n" + "- Option 4: If your library provides a PkgConfig file, make sure pkg-config finds your library${ColourReset}") + +endmacro() + +# This macro informs why the _lib_to_find file has not been found +macro(Print_Find_Library_Blas_CheckFunc_Status _name) + + # save _libname upper/lower case + string(TOUPPER ${_name} FUNCNAME) + string(TOLOWER ${_name} funcname) + + # print status + #message(" ") + message("${Red}Libs have been found but check of symbol ${_name} failed " + "with following libraries ${ARGN}${ColourReset}") + message("${BoldRed}Please open your error file CMakeFiles/CMakeError.log" + "to figure out why it fails${ColourReset}") + #message(" ") + +endmacro() + +# This macro informs that _pc_to_find file has not been found in the list +# path you give as last argument (read in ${ARGN}) +# ex: Print_Find_Pkgconfig_Status(foo foo.pc ${PATHLIST} +macro(Print_Find_Pkgconfig_Status _libname _pc_to_find) + + # save _libname lower case + string(TOLOWER ${_libname} libname) + + # print status + #message(" ") + message("${Magenta}${_pc_to_find} has not been found in" + "${ARGN}${ColourReset}") + message("${BoldMagenta}If you really want to use the pkg-config file of" + "${libname}, please update your PKG_CONFIG_PATH with the path" + "where ${_pc_to_find} states${ColourReset}") + #message(" ") + +endmacro() diff --git a/cmake_modules/morse/RulesPrecisions.cmake b/cmake_modules/morse/RulesPrecisions.cmake new file mode 100644 index 000000000..bef0c4418 --- /dev/null +++ b/cmake_modules/morse/RulesPrecisions.cmake @@ -0,0 +1,257 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# @file RulesPrecisions.cmake +# +# @project MORSE +# MORSE is a software package provided by: +# Inria Bordeaux - Sud-Ouest, +# Univ. of Tennessee, +# King Abdullah Univesity of Science and Technology +# Univ. of California Berkeley, +# Univ. of Colorado Denver. +# +# @version 0.9.0 +# @author Thomas Herault +# @author George Bosilca +# @author Aurelien Bouteiller +# @author Mathieu Faverge +# @author Florent Puvost +# @date 13-07-2012 +# +### +cmake_minimum_required(VERSION 2.8) +include(CMakeDependentOption) + +set(RP_GENDEPENDENCIES ${MORSE_CMAKE_MODULE_PATH}/precision_generator/genDependencies.py) +set(RP_CODEGEN ${MORSE_CMAKE_MODULE_PATH}/precision_generator/codegen.py) + +# Dictionnary +# ----------- +if( NOT DEFINED RP_${CMAKE_PROJECT_NAME}_DICTIONNARY ) + message( WARNING "RulesPrecisions included before RP_${CMAKE_PROJECT_NAME}_DICTIONNARY was defined (Default is used)" ) + set(RP_${CMAKE_PROJECT_NAME}_DICTIONNARY ${MORSE_CMAKE_MODULE_PATH}/precision_generator/subs.py + CACHE INTERNAL "Dictionnary used for precision generation" ) +else() + set(RP_${CMAKE_PROJECT_NAME}_DICTIONNARY ${RP_${CMAKE_PROJECT_NAME}_DICTIONNARY} + CACHE INTERNAL "Dictionnary used for precision generation" ) +endif() + +# Default Precisions +# ------------------ +if( NOT DEFINED RP_${CMAKE_PROJECT_NAME}_PRECISIONS ) + message( WARNING "RulesPrecisions included before RP_${CMAKE_PROJECT_NAME}_PRECISIONS was defined (\"s;d;c;z\" is used)" ) + set(RP_${CMAKE_PROJECT_NAME}_PRECISIONS "s;d;c;z" + CACHE INTERNAL "Set of available precisions for the project" ) +else() + set(RP_${CMAKE_PROJECT_NAME}_PRECISIONS ${RP_${CMAKE_PROJECT_NAME}_PRECISIONS} + CACHE INTERNAL "Set of available precisions for the project" ) +endif() + +# Detect if compilation is done in or out of place +# ------------------------------------------------ +string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" __inplace) +set( ${CMAKE_PROJECT_NAME}_COMPILE_INPLACE ${__inplace} + CACHE INTERNAL "Defines if the project compilation is made inplace or not" ) + +# Detect default settings +# ----------------------- +set( _prec_S OFF ) +set( _prec_D OFF ) +set( _prec_DS OFF ) +set( _prec_C OFF ) +set( _prec_Z OFF ) +set( _prec_ZC OFF ) +foreach(_prec ${RP_${CMAKE_PROJECT_NAME}_PRECISIONS}) + if ( ${_prec} STREQUAL "zc" ) + set( _prec_S ON ) + set( _prec_D ON ) + set( _prec_C ON ) + set( _prec_Z ON ) + set( _prec_ZC ON ) + elseif( ${_prec} STREQUAL "z" ) + set( _prec_D ON ) + set( _prec_Z ON ) + elseif( ${_prec} STREQUAL "c" ) + set( _prec_S ON ) + set( _prec_C ON ) + elseif( ${_prec} STREQUAL "ds" ) + set( _prec_S ON ) + set( _prec_D ON ) + set( _prec_DS ON ) + elseif( ${_prec} STREQUAL "d" ) + set( _prec_S ON ) + elseif( ${_prec} STREQUAL "s" ) + set( _prec_S ON ) + endif() +endforeach() + +# set computed precisions +# ----------------------- +if( ${_prec_S} ) + option(${PROJECT_NAME}_PREC_S + "Build ${PROJECT_NAME} real single precision" ON) +endif() +if( ${_prec_D} ) + option(${PROJECT_NAME}_PREC_D + "Build ${PROJECT_NAME} real double precision" ON) +endif() + +if( ${_prec_C} ) + cmake_dependent_option(${PROJECT_NAME}_PREC_C + "Build ${PROJECT_NAME} complex single precision" ON "${PROJECT_NAME}_PREC_S" OFF) +endif() +if( ${_prec_Z} ) + cmake_dependent_option(${PROJECT_NAME}_PREC_Z + "Build ${PROJECT_NAME} complex double precision" ON "${PROJECT_NAME}_PREC_D" OFF) +endif() + +if( ${_prec_DS} ) + cmake_dependent_option(${PROJECT_NAME}_PREC_DS + "Build ${PROJECT_NAME} real mixed precision" ON "${PROJECT_NAME}_PREC_S;${PROJECT_NAME}_PREC_D" OFF) +endif() +if( ${_prec_ZC} ) + cmake_dependent_option(${PROJECT_NAME}_PREC_ZC + "Build ${PROJECT_NAME} complex mixed precision" ON "${PROJECT_NAME}_PREC_C;${PROJECT_NAME}_PREC_Z" OFF) +endif() + +# Define precision supported by the project +# ----------------------------------------- +set( ${CMAKE_PROJECT_NAME}_PRECISION "" ) +if(${CMAKE_PROJECT_NAME}_PREC_S) + list(APPEND ${CMAKE_PROJECT_NAME}_PRECISION "s") +endif() + +if(${CMAKE_PROJECT_NAME}_PREC_D) + list(APPEND ${CMAKE_PROJECT_NAME}_PRECISION "d") +endif() + +if(${CMAKE_PROJECT_NAME}_PREC_DS) + list(APPEND ${CMAKE_PROJECT_NAME}_PRECISION "ds") +endif() + +if(${CMAKE_PROJECT_NAME}_PREC_C) + list(APPEND ${CMAKE_PROJECT_NAME}_PRECISION "c") +endif() + +if(${CMAKE_PROJECT_NAME}_PREC_Z) + list(APPEND ${CMAKE_PROJECT_NAME}_PRECISION "z") +endif() + +if(${CMAKE_PROJECT_NAME}_PREC_ZC) + list(APPEND ${CMAKE_PROJECT_NAME}_PRECISION "zc") +endif() + +# +# Generates a rule for every SOURCES file, to create the precisions in PRECISIONS. If TARGETDIR +# is not empty then all generated files will be prepended with the $TARGETDIR/. +# A new file is created, from a copy by default +# If the first precision is "/", all occurences of the basename in the file are remplaced by +# "pbasename" where p is the selected precision. +# the target receives a -DPRECISION_p in its cflags. +# +include(ParseArguments) +find_package(PythonInterp REQUIRED) + +MACRO(precisions_rules_py) + PARSE_ARGUMENTS(PREC_RULE "TARGETDIR;PRECISIONS" "" ${ARGN}) + + message(STATUS "Generate precision dependencies in ${CMAKE_CURRENT_SOURCE_DIR}") + + # The first is the output variable list + CAR(OUTPUTLIST ${PREC_RULE_DEFAULT_ARGS}) + # Everything else should be source files. + CDR(SOURCES ${PREC_RULE_DEFAULT_ARGS}) + + if( NOT DEFINED ${CMAKE_PROJECT_NAME}_COMPILE_INPLACE ) + message( FATAL_ERROR "precisions_rules_init must be called before any call to precisions_rules_py" ) + endif() + + if( NOT DEFINED RP_${CMAKE_PROJECT_NAME}_DICTIONNARY ) + message( FATAL_ERROR "precisions_rules_init must be called before any call to precisions_rules_py" ) + endif() + + # By default the TARGETDIR is the current binary directory + if( "${PREC_RULE_TARGETDIR}" STREQUAL "" ) + set(PREC_RULE_TARGETDIR "./") + set(PRECISIONPP_prefix "./") + set(PRECISIONPP_arg "-P") + else( "${PREC_RULE_TARGETDIR}" STREQUAL "" ) + if(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/${PREC_RULE_TARGETDIR}) + else(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/${PREC_RULE_TARGETDIR}) + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${PREC_RULE_TARGETDIR}) + endif(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/${PREC_RULE_TARGETDIR}) + set(PRECISIONPP_arg "-P") + set(PRECISIONPP_prefix "${PREC_RULE_TARGETDIR}") + endif( "${PREC_RULE_TARGETDIR}" STREQUAL "" ) + + set(options_list "") + foreach(prec_rules_PREC ${PREC_RULE_PRECISIONS}) + set(options_list "${options_list} ${prec_rules_PREC}") + endforeach() + + set(sources_list "") + foreach(_src ${SOURCES}) + set(sources_list "${sources_list} ${_src}") + endforeach() + + set(gencmd ${PYTHON_EXECUTABLE} ${RP_GENDEPENDENCIES} -f "${sources_list}" -p "${options_list}" -s "${CMAKE_CURRENT_SOURCE_DIR}" ${PRECISIONPP_arg} ${PRECISIONPP_prefix}) + EXECUTE_PROCESS(COMMAND ${gencmd} OUTPUT_VARIABLE dependencies_list) + + foreach(_dependency ${dependencies_list}) + + string(STRIP "${_dependency}" _dependency) + string(COMPARE NOTEQUAL "${_dependency}" "" not_empty) + if( not_empty ) + + string(REGEX REPLACE "^(.*),(.*),(.*)$" "\\1" _dependency_INPUT "${_dependency}") + set(_dependency_PREC "${CMAKE_MATCH_2}") + set(_dependency_OUTPUT "${CMAKE_MATCH_3}") + + set(pythoncmd ${PYTHON_EXECUTABLE} ${RP_CODEGEN} -f ${CMAKE_CURRENT_SOURCE_DIR}/${_dependency_INPUT} -p ${_dependency_PREC} ${PRECISIONPP_arg} ${PRECISIONPP_prefix}) + + string(STRIP "${_dependency_OUTPUT}" _dependency_OUTPUT) + string(COMPARE NOTEQUAL "${_dependency_OUTPUT}" "" got_file) + + # Force the copy of the original files in the binary_dir + # for VPATH compilation + if( NOT ${CMAKE_PROJECT_NAME}_COMPILE_INPLACE ) + set(generate_out 1) + else( NOT ${CMAKE_PROJECT_NAME}_COMPILE_INPLACE ) + string(COMPARE NOTEQUAL "${_dependency_OUTPUT}" "${_dependency_INPUT}" generate_out ) + endif() + + # We generate a dependency only if a file will be generated + if( got_file ) + if( generate_out ) + # the custom command is executed in CMAKE_CURRENT_BINARY_DIR + ADD_CUSTOM_COMMAND( + OUTPUT ${_dependency_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E remove -f ${_dependency_OUTPUT} && ${pythoncmd} && chmod a-w ${_dependency_OUTPUT} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_dependency_INPUT} ${RP_CODEGEN} ${RP_${CMAKE_PROJECT_NAME}_DICTIONNARY}) + + set_SOURCE_FILES_PROPERTIES(${_dependency_OUTPUT} PROPERTIES COMPILE_FLAGS "-DPRECISION_${_dependency_PREC}" GENERATED 1 IS_IN_BINARY_DIR 1 ) + + else( generate_out ) + set_SOURCE_FILES_PROPERTIES(${_dependency_OUTPUT} PROPERTIES COMPILE_FLAGS "-DPRECISION_${_dependency_PREC}" GENERATED 0 ) + endif( generate_out ) + + list(APPEND ${OUTPUTLIST} ${_dependency_OUTPUT}) + endif( got_file ) + endif() + endforeach() + + message(STATUS "Generate precision dependencies in ${CMAKE_CURRENT_SOURCE_DIR} - Done") + +ENDMACRO(precisions_rules_py) + +## +## @end file RulesPrecisions.cmake +## diff --git a/cmake_modules/morse/find/FindBLAS.cmake b/cmake_modules/morse/find/FindBLAS.cmake new file mode 100644 index 000000000..8c946b77b --- /dev/null +++ b/cmake_modules/morse/find/FindBLAS.cmake @@ -0,0 +1,929 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find BLAS library +# This module finds an installed fortran library that implements the BLAS +# linear-algebra interface (see http://www.netlib.org/blas/). +# The list of libraries searched for is taken +# from the autoconf macro file, acx_blas.m4 (distributed at +# http://ac-archive.sourceforge.net/ac-archive/acx_blas.html). +# +# This module sets the following variables: +# BLAS_FOUND - set to true if a library implementing the BLAS interface +# is found +# BLAS_LINKER_FLAGS - uncached list of required linker flags (excluding -l +# and -L). +# BLAS_LIBRARIES - uncached list of libraries (using full path name) to +# link against to use BLAS +# BLAS95_LIBRARIES - uncached list of libraries (using full path name) +# to link against to use BLAS95 interface +# BLAS95_FOUND - set to true if a library implementing the BLAS f95 interface +# is found +# BLA_STATIC if set on this determines what kind of linkage we do (static) +# BLA_VENDOR if set checks only the specified vendor, if not set checks +# all the possibilities +# BLA_F95 if set on tries to find the f95 interfaces for BLAS/LAPACK +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DBLAS_DIR=path/to/blas): +# BLAS_DIR - Where to find the base directory of blas +# BLAS_INCDIR - Where to find the header files +# BLAS_LIBDIR - Where to find the library files +########## +### List of vendors (BLA_VENDOR) valid in this module +########## List of vendors (BLA_VENDOR) valid in this module +## Goto,ATLAS PhiPACK,CXML,DXML,SunPerf,SCSL,SGIMATH,IBMESSL,Intel10_32 (intel mkl v10 32 bit),Intel10_64lp (intel mkl v10 64 bit,lp thread model, lp64 model), +## Intel10_64lp_seq (intel mkl v10 64 bit,sequential code, lp64 model), +## Intel( older versions of mkl 32 and 64 bit), ACML,ACML_MP,ACML_GPU,Apple, NAS, Generic +# C/CXX should be enabled to use Intel mkl + +#============================================================================= +# Copyright 2007-2009 Kitware, Inc. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + + +# Set some colors +if(NOT WIN32) + string(ASCII 27 Esc) + set(ColourReset "${Esc}[m") + set(ColourBold "${Esc}[1m") + set(Red "${Esc}[31m") + set(Green "${Esc}[32m") + set(Yellow "${Esc}[33m") + set(Blue "${Esc}[34m") + set(Magenta "${Esc}[35m") + set(Cyan "${Esc}[36m") + set(White "${Esc}[37m") + set(BoldRed "${Esc}[1;31m") + set(BoldGreen "${Esc}[1;32m") + set(BoldYellow "${Esc}[1;33m") + set(BoldBlue "${Esc}[1;34m") + set(BoldMagenta "${Esc}[1;35m") + set(BoldCyan "${Esc}[1;36m") + set(BoldWhite "${Esc}[1;37m") +endif() + +## Some macros to print status when search for headers and libs +# This macro informs why the _lib_to_find file has not been found +macro(Print_Find_Library_Blas_Status _libname _lib_to_find) + + # save _libname upper/lower case + string(TOUPPER ${_libname} LIBNAME) + string(TOLOWER ${_libname} libname) + + # print status + #message(" ") + if(${LIBNAME}_LIBDIR) + message("${Yellow}${LIBNAME}_LIBDIR is defined but ${_lib_to_find}" + "has not been found in ${ARGN}${ColourReset}") + else() + if(${LIBNAME}_DIR) + message("${Yellow}${LIBNAME}_DIR is defined but ${_lib_to_find}" + "has not been found in ${ARGN}${ColourReset}") + else() + message("${Yellow}${_lib_to_find} not found." + "Nor ${LIBNAME}_DIR neither ${LIBNAME}_LIBDIR" + "are defined so that we look for ${_lib_to_find} in" + "system paths (Linux: LD_LIBRARY_PATH, Windows: LIB," + "Mac: DYLD_LIBRARY_PATH," + "CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES," + "CMAKE_C_IMPLICIT_LINK_DIRECTORIES)${ColourReset}") + if(_lib_env) + message("${Yellow}${_lib_to_find} has not been found in" + "${_lib_env}${ColourReset}") + endif() + endif() + endif() + message("${BoldYellow}Please indicate where to find ${_lib_to_find}. You have three options:\n" + "- Option 1: Provide the root directory of the library with cmake option: -D${LIBNAME}_DIR=your/path/to/${libname}/\n" + "- Option 2: Provide the directory where to find the library with cmake option: -D${LIBNAME}_LIBDIR=your/path/to/${libname}/lib/\n" + "- Option 3: Update your environment variable (Linux: LD_LIBRARY_PATH, Windows: LIB, Mac: DYLD_LIBRARY_PATH)\n" + "- Option 4: If your library provides a PkgConfig file, make sure pkg-config finds your library${ColourReset}") + +endmacro() + +# This macro informs why the _lib_to_find file has not been found +macro(Print_Find_Library_Blas_CheckFunc_Status _name) + + # save _libname upper/lower case + string(TOUPPER ${_name} FUNCNAME) + string(TOLOWER ${_name} funcname) + + # print status + #message(" ") + message("${Red}Libs have been found but check of symbol ${_name} failed " + "with following libraries ${ARGN}${ColourReset}") + message("${BoldRed}Please open your error file CMakeFiles/CMakeError.log" + "to figure out why it fails${ColourReset}") + #message(" ") + +endmacro() + +if (NOT BLAS_FOUND) + set(BLAS_DIR "" CACHE PATH "Root directory of BLAS library") + if (NOT BLAS_FIND_QUIETLY) + message(STATUS "A cache variable, namely BLAS_DIR, has been set to specify the install directory of BLAS") + endif() +endif() + +option(BLAS_VERBOSE "Print some additional information during BLAS +libraries detection" OFF) + +include(CheckFunctionExists) +include(CheckFortranFunctionExists) + +set(_blas_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + +# Check the language being used +get_property( _LANGUAGES_ GLOBAL PROPERTY ENABLED_LANGUAGES ) +if( _LANGUAGES_ MATCHES Fortran ) + set( _CHECK_FORTRAN TRUE ) +elseif( (_LANGUAGES_ MATCHES C) OR (_LANGUAGES_ MATCHES CXX) ) + set( _CHECK_FORTRAN FALSE ) +else() + if(BLAS_FIND_REQUIRED) + message(FATAL_ERROR "FindBLAS requires Fortran, C, or C++ to be enabled.") + else() + message(STATUS "Looking for BLAS... - NOT found (Unsupported languages)") + return() + endif() +endif() + +macro(Check_Fortran_Libraries LIBRARIES _prefix _name _flags _list _thread) +# This macro checks for the existence of the combination of fortran libraries +# given by _list. If the combination is found, this macro checks (using the +# Check_Fortran_Function_Exists macro) whether can link against that library +# combination using the name of a routine given by _name using the linker +# flags given by _flags. If the combination of libraries is found and passes +# the link test, LIBRARIES is set to the list of complete library paths that +# have been found. Otherwise, LIBRARIES is set to FALSE. + +# N.B. _prefix is the prefix applied to the names of all cached variables that +# are generated internally and marked advanced by this macro. + + set(_libdir ${ARGN}) + + set(_libraries_work TRUE) + set(${LIBRARIES} ${_flags}) + set(_combined_name) + if (NOT _libdir) + if (BLAS_DIR) + list(APPEND _libdir "${BLAS_DIR}") + list(APPEND _libdir "${BLAS_DIR}/lib") + if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + list(APPEND _libdir "${BLAS_DIR}/lib64") + list(APPEND _libdir "${BLAS_DIR}/lib/intel64") + else() + list(APPEND _libdir "${BLAS_DIR}/lib32") + list(APPEND _libdir "${BLAS_DIR}/lib/ia32") + endif() + endif () + if (BLAS_LIBDIR) + list(APPEND _libdir "${BLAS_LIBDIR}") + endif () + if (WIN32) + string(REPLACE ":" ";" _libdir2 "$ENV{LIB}") + elseif (APPLE) + string(REPLACE ":" ";" _libdir2 "$ENV{DYLD_LIBRARY_PATH}") + else () + string(REPLACE ":" ";" _libdir2 "$ENV{LD_LIBRARY_PATH}") + endif () + list(APPEND _libdir "${_libdir2}") + list(APPEND _libdir "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _libdir "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") + endif () + + if (BLAS_VERBOSE) + message("${Cyan}Try to find BLAS libraries: ${_list}") + endif () + + foreach(_library ${_list}) + set(_combined_name ${_combined_name}_${_library}) + + if(_libraries_work) + if (BLA_STATIC) + if (WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif () + if (APPLE) + set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else () + set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif () + else () + if (CMAKE_SYSTEM_NAME STREQUAL "Linux") + # for ubuntu's libblas3gf and liblapack3gf packages + set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .so.3gf) + endif () + endif () + find_library(${_prefix}_${_library}_LIBRARY + NAMES ${_library} + HINTS ${_libdir} + ) + mark_as_advanced(${_prefix}_${_library}_LIBRARY) + # Print status if not found + # ------------------------- + if (NOT ${_prefix}_${_library}_LIBRARY AND NOT BLAS_FIND_QUIETLY AND BLAS_VERBOSE) + Print_Find_Library_Blas_Status(blas ${_library} ${_libdir}) + endif () + set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY}) + set(_libraries_work ${${_prefix}_${_library}_LIBRARY}) + endif(_libraries_work) + endforeach(_library ${_list}) + + if(_libraries_work) + # Test this combination of libraries. + set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_thread}) + if (BLAS_VERBOSE) + message("${Cyan}BLAS libs found. Try to compile symbol ${_name} with" + "following libraries: ${CMAKE_REQUIRED_LIBRARIES}") + endif () + if(NOT BLAS_FOUND) + unset(${_prefix}${_combined_name}_WORKS CACHE) + endif() + if (_CHECK_FORTRAN) + check_fortran_function_exists("${_name}" ${_prefix}${_combined_name}_WORKS) + else() + check_function_exists("${_name}_" ${_prefix}${_combined_name}_WORKS) + endif() + mark_as_advanced(${_prefix}${_combined_name}_WORKS) + set(_libraries_work ${${_prefix}${_combined_name}_WORKS}) + # Print status if not found + # ------------------------- + if (NOT _libraries_work AND NOT BLAS_FIND_QUIETLY AND BLAS_VERBOSE) + Print_Find_Library_Blas_CheckFunc_Status(${_name} ${CMAKE_REQUIRED_LIBRARIES}) + endif () + set(CMAKE_REQUIRED_LIBRARIES) + endif() + + if(_libraries_work) + set(${LIBRARIES} ${${LIBRARIES}} ${_thread}) + else() + set(${LIBRARIES} FALSE) + endif() + +# message("DEBUG: ${LIBRARIES} = ${${LIBRARIES}}") + +endmacro(Check_Fortran_Libraries) + + +set(BLAS_LINKER_FLAGS) +set(BLAS_LIBRARIES) +set(BLAS95_LIBRARIES) +if ($ENV{BLA_VENDOR} MATCHES ".+") + set(BLA_VENDOR $ENV{BLA_VENDOR}) +else () + if(NOT BLA_VENDOR) + set(BLA_VENDOR "All") + endif() +endif () + +#BLAS in intel mkl 10 library? (em64t 64bit) +if (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All") + + if (NOT WIN32) + set(LM "-lm") + endif () + if (_LANGUAGES_ MATCHES C OR _LANGUAGES_ MATCHES CXX) + if(BLAS_FIND_QUIETLY OR NOT BLAS_FIND_REQUIRED) + find_package(Threads) + else() + find_package(Threads REQUIRED) + endif() + + set(BLAS_SEARCH_LIBS "") + + set(additional_flags "-Wl,--no-as-needed") + + if(BLA_F95) + + set(BLAS_mkl_SEARCH_SYMBOL SGEMM) + set(_LIBRARIES BLAS95_LIBRARIES) + if (WIN32) + if (BLA_STATIC) + set(BLAS_mkl_DLL_SUFFIX "") + else() + set(BLAS_mkl_DLL_SUFFIX "_dll") + endif() + + # Find the main file (32-bit or 64-bit) + set(BLAS_SEARCH_LIBS_WIN_MAIN "") + if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All") + list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN + "mkl_blas95${BLAS_mkl_DLL_SUFFIX} mkl_intel_c${BLAS_mkl_DLL_SUFFIX}") + endif() + if (BLA_VENDOR STREQUAL "Intel10_64lp*" OR BLA_VENDOR STREQUAL "All") + list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN + "mkl_blas95_lp64${BLAS_mkl_DLL_SUFFIX} mkl_intel_lp64${BLAS_mkl_DLL_SUFFIX}") + endif () + + # Add threading/sequential libs + set(BLAS_SEARCH_LIBS_WIN_THREAD "") + if (BLA_VENDOR STREQUAL "*_seq" OR BLA_VENDOR STREQUAL "All") + list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD + "mkl_sequential${BLAS_mkl_DLL_SUFFIX}") + endif() + if (NOT BLA_VENDOR STREQUAL "*_seq" OR BLA_VENDOR STREQUAL "All") + # old version + list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD + "libguide40 mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}") + # mkl >= 10.3 + list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD + "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}") + endif() + + # Cartesian product of the above + foreach (MAIN ${BLAS_SEARCH_LIBS_WIN_MAIN}) + foreach (THREAD ${BLAS_SEARCH_LIBS_WIN_THREAD}) + list(APPEND BLAS_SEARCH_LIBS + "${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}") + endforeach() + endforeach() + else (WIN32) + if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All") + list(APPEND BLAS_SEARCH_LIBS + "mkl_blas95 mkl_intel mkl_intel_thread mkl_core guide") + endif () + if (BLA_VENDOR STREQUAL "Intel10_64lp" OR BLA_VENDOR STREQUAL "All") + # old version + list(APPEND BLAS_SEARCH_LIBS + "mkl_blas95 mkl_intel_lp64 mkl_intel_thread mkl_core guide") + # mkl >= 10.3 + get_filename_component(CMAKE_C_COMPILER_NAME ${CMAKE_C_COMPILER} NAME) + if (CMAKE_C_COMPILER_NAME STREQUAL "gcc" OR + CMAKE_C_COMPILER_NAME STREQUAL "cc") + list(APPEND BLAS_SEARCH_LIBS + "mkl_blas95_lp64 mkl_intel_lp64 mkl_gnu_thread mkl_core gomp") + else () + list(APPEND BLAS_SEARCH_LIBS + "mkl_blas95_lp64 mkl_intel_lp64 mkl_intel_thread mkl_core iomp5") + endif () + endif () + if (BLA_VENDOR STREQUAL "Intel10_64lp_seq" OR BLA_VENDOR STREQUAL "All") + list(APPEND BLAS_SEARCH_LIBS + "mkl_intel_lp64 mkl_sequential mkl_core") + endif () + endif (WIN32) + + else (BLA_F95) + + set(BLAS_mkl_SEARCH_SYMBOL sgemm) + set(_LIBRARIES BLAS_LIBRARIES) + if (WIN32) + if (BLA_STATIC) + set(BLAS_mkl_DLL_SUFFIX "") + else() + set(BLAS_mkl_DLL_SUFFIX "_dll") + endif() + + # Find the main file (32-bit or 64-bit) + set(BLAS_SEARCH_LIBS_WIN_MAIN "") + if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All") + list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN + "mkl_intel_c${BLAS_mkl_DLL_SUFFIX}") + endif() + if (BLA_VENDOR STREQUAL "Intel10_64lp*" OR BLA_VENDOR STREQUAL "All") + list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN + "mkl_intel_lp64${BLAS_mkl_DLL_SUFFIX}") + endif () + + # Add threading/sequential libs + set(BLAS_SEARCH_LIBS_WIN_THREAD "") + if (NOT BLA_VENDOR STREQUAL "*_seq" OR BLA_VENDOR STREQUAL "All") + # old version + list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD + "libguide40 mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}") + # mkl >= 10.3 + list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD + "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}") + endif() + if (BLA_VENDOR STREQUAL "*_seq" OR BLA_VENDOR STREQUAL "All") + list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD + "mkl_sequential${BLAS_mkl_DLL_SUFFIX}") + endif() + + # Cartesian product of the above + foreach (MAIN ${BLAS_SEARCH_LIBS_WIN_MAIN}) + foreach (THREAD ${BLAS_SEARCH_LIBS_WIN_THREAD}) + list(APPEND BLAS_SEARCH_LIBS + "${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}") + endforeach() + endforeach() + else (WIN32) + if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All") + list(APPEND BLAS_SEARCH_LIBS + "mkl_intel mkl_intel_thread mkl_core guide") + endif () + if (BLA_VENDOR STREQUAL "Intel10_64lp" OR BLA_VENDOR STREQUAL "All") + + # old version + list(APPEND BLAS_SEARCH_LIBS + "mkl_intel_lp64 mkl_intel_thread mkl_core guide") + + # mkl >= 10.3 + get_filename_component(CMAKE_C_COMPILER_NAME ${CMAKE_C_COMPILER} NAME) + if (CMAKE_C_COMPILER_NAME STREQUAL "gcc" OR + CMAKE_C_COMPILER_NAME STREQUAL "cc") + list(APPEND BLAS_SEARCH_LIBS + "mkl_intel_lp64 mkl_gnu_thread mkl_core gomp") + else () + list(APPEND BLAS_SEARCH_LIBS + "mkl_intel_lp64 mkl_intel_thread mkl_core iomp5") + endif () + endif () + if (BLA_VENDOR STREQUAL "Intel10_64lp_seq" OR BLA_VENDOR STREQUAL "All") + list(APPEND BLAS_SEARCH_LIBS + "mkl_intel_lp64 mkl_sequential mkl_core") + endif () + + #older vesions of intel mkl libs + if (BLA_VENDOR STREQUAL "Intel" OR BLA_VENDOR STREQUAL "All") + list(APPEND BLAS_SEARCH_LIBS + "mkl") + list(APPEND BLAS_SEARCH_LIBS + "mkl_ia32") + list(APPEND BLAS_SEARCH_LIBS + "mkl_em64t") + endif () + endif (WIN32) + + endif (BLA_F95) + + foreach (IT ${BLAS_SEARCH_LIBS}) + string(REPLACE " " ";" SEARCH_LIBS ${IT}) + if (${_LIBRARIES}) + else () + check_fortran_libraries( + ${_LIBRARIES} + BLAS + ${BLAS_mkl_SEARCH_SYMBOL} + "${additional_flags}" + "${SEARCH_LIBS}" + "${CMAKE_THREAD_LIBS_INIT};${LM}" + ) + endif() + endforeach () + + endif (_LANGUAGES_ MATCHES C OR _LANGUAGES_ MATCHES CXX) + +endif (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All") + + +if (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All") + + if(NOT BLAS_LIBRARIES) + # gotoblas (http://www.tacc.utexas.edu/tacc-projects/gotoblas2) + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + sgemm + "" + "goto2" + "" + ) + endif() + +endif (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All") + + +if (BLA_VENDOR STREQUAL "Open" OR BLA_VENDOR STREQUAL "All") + + if(NOT BLAS_LIBRARIES) + # openblas (http://www.openblas.net/) + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + sgemm + "" + "openblas" + "" + ) + endif() + +endif (BLA_VENDOR STREQUAL "Open" OR BLA_VENDOR STREQUAL "All") + + +if (BLA_VENDOR STREQUAL "ATLAS" OR BLA_VENDOR STREQUAL "All") + + if(NOT BLAS_LIBRARIES) + # BLAS in ATLAS library? (http://math-atlas.sourceforge.net/) + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + dgemm + "" + "f77blas;atlas" + "" + ) + endif() + +endif (BLA_VENDOR STREQUAL "ATLAS" OR BLA_VENDOR STREQUAL "All") + + +# BLAS in PhiPACK libraries? (requires generic BLAS lib, too) +if (BLA_VENDOR STREQUAL "PhiPACK" OR BLA_VENDOR STREQUAL "All") + + if(NOT BLAS_LIBRARIES) + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + sgemm + "" + "sgemm;dgemm;blas" + "" + ) + endif() + +endif (BLA_VENDOR STREQUAL "PhiPACK" OR BLA_VENDOR STREQUAL "All") + + +# BLAS in Alpha CXML library? +if (BLA_VENDOR STREQUAL "CXML" OR BLA_VENDOR STREQUAL "All") + + if(NOT BLAS_LIBRARIES) + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + sgemm + "" + "cxml" + "" + ) + endif() + +endif (BLA_VENDOR STREQUAL "CXML" OR BLA_VENDOR STREQUAL "All") + + +# BLAS in Alpha DXML library? (now called CXML, see above) +if (BLA_VENDOR STREQUAL "DXML" OR BLA_VENDOR STREQUAL "All") + + if(NOT BLAS_LIBRARIES) + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + sgemm + "" + "dxml" + "" + ) + endif() + +endif (BLA_VENDOR STREQUAL "DXML" OR BLA_VENDOR STREQUAL "All") + + +# BLAS in Sun Performance library? +if (BLA_VENDOR STREQUAL "SunPerf" OR BLA_VENDOR STREQUAL "All") + + if(NOT BLAS_LIBRARIES) + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + sgemm + "-xlic_lib=sunperf" + "sunperf;sunmath" + "" + ) + if(BLAS_LIBRARIES) + set(BLAS_LINKER_FLAGS "-xlic_lib=sunperf") + endif() + endif() + +endif () + + +# BLAS in SCSL library? (SGI/Cray Scientific Library) +if (BLA_VENDOR STREQUAL "SCSL" OR BLA_VENDOR STREQUAL "All") + + if(NOT BLAS_LIBRARIES) + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + sgemm + "" + "scsl" + "" + ) + endif() + +endif () + + +# BLAS in SGIMATH library? +if (BLA_VENDOR STREQUAL "SGIMATH" OR BLA_VENDOR STREQUAL "All") + + if(NOT BLAS_LIBRARIES) + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + sgemm + "" + "complib.sgimath" + "" + ) + endif() + +endif () + + +# BLAS in IBM ESSL library? (requires generic BLAS lib, too) +if (BLA_VENDOR STREQUAL "IBMESSL" OR BLA_VENDOR STREQUAL "All") + + if(NOT BLAS_LIBRARIES) + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + sgemm + "" + "essl;blas" + "" + ) + endif() + +endif () + + +#BLAS in acml library? +if (BLA_VENDOR MATCHES "ACML.*" OR BLA_VENDOR STREQUAL "All") + + if( ((BLA_VENDOR STREQUAL "ACML") AND (NOT BLAS_ACML_LIB_DIRS)) OR + ((BLA_VENDOR STREQUAL "ACML_MP") AND (NOT BLAS_ACML_MP_LIB_DIRS)) OR + ((BLA_VENDOR STREQUAL "ACML_GPU") AND (NOT BLAS_ACML_GPU_LIB_DIRS))) + + # try to find acml in "standard" paths + if( WIN32 ) + file( GLOB _ACML_ROOT "C:/AMD/acml*/ACML-EULA.txt" ) + else() + file( GLOB _ACML_ROOT "/opt/acml*/ACML-EULA.txt" ) + endif() + if( WIN32 ) + file( GLOB _ACML_GPU_ROOT "C:/AMD/acml*/GPGPUexamples" ) + else() + file( GLOB _ACML_GPU_ROOT "/opt/acml*/GPGPUexamples" ) + endif() + list(GET _ACML_ROOT 0 _ACML_ROOT) + list(GET _ACML_GPU_ROOT 0 _ACML_GPU_ROOT) + + if( _ACML_ROOT ) + + get_filename_component( _ACML_ROOT ${_ACML_ROOT} PATH ) + if( SIZEOF_INTEGER EQUAL 8 ) + set( _ACML_PATH_SUFFIX "_int64" ) + else() + set( _ACML_PATH_SUFFIX "" ) + endif() + if( CMAKE_Fortran_COMPILER_ID STREQUAL "Intel" ) + set( _ACML_COMPILER32 "ifort32" ) + set( _ACML_COMPILER64 "ifort64" ) + elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "SunPro" ) + set( _ACML_COMPILER32 "sun32" ) + set( _ACML_COMPILER64 "sun64" ) + elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "PGI" ) + set( _ACML_COMPILER32 "pgi32" ) + if( WIN32 ) + set( _ACML_COMPILER64 "win64" ) + else() + set( _ACML_COMPILER64 "pgi64" ) + endif() + elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "Open64" ) + # 32 bit builds not supported on Open64 but for code simplicity + # We'll just use the same directory twice + set( _ACML_COMPILER32 "open64_64" ) + set( _ACML_COMPILER64 "open64_64" ) + elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "NAG" ) + set( _ACML_COMPILER32 "nag32" ) + set( _ACML_COMPILER64 "nag64" ) + else() + set( _ACML_COMPILER32 "gfortran32" ) + set( _ACML_COMPILER64 "gfortran64" ) + endif() + + if( BLA_VENDOR STREQUAL "ACML_MP" ) + set(_ACML_MP_LIB_DIRS + "${_ACML_ROOT}/${_ACML_COMPILER32}_mp${_ACML_PATH_SUFFIX}/lib" + "${_ACML_ROOT}/${_ACML_COMPILER64}_mp${_ACML_PATH_SUFFIX}/lib" ) + else() + set(_ACML_LIB_DIRS + "${_ACML_ROOT}/${_ACML_COMPILER32}${_ACML_PATH_SUFFIX}/lib" + "${_ACML_ROOT}/${_ACML_COMPILER64}${_ACML_PATH_SUFFIX}/lib" ) + endif() + + endif(_ACML_ROOT) + + elseif(BLAS_${BLA_VENDOR}_LIB_DIRS) + + set(_${BLA_VENDOR}_LIB_DIRS ${BLAS_${BLA_VENDOR}_LIB_DIRS}) + + endif() + + if( BLA_VENDOR STREQUAL "ACML_MP" ) + foreach( BLAS_ACML_MP_LIB_DIRS ${_ACML_MP_LIB_DIRS}) + check_fortran_libraries ( + BLAS_LIBRARIES + BLAS + sgemm + "" "acml_mp;acml_mv" "" ${BLAS_ACML_MP_LIB_DIRS} + ) + if( BLAS_LIBRARIES ) + break() + endif() + endforeach() + elseif( BLA_VENDOR STREQUAL "ACML_GPU" ) + foreach( BLAS_ACML_GPU_LIB_DIRS ${_ACML_GPU_LIB_DIRS}) + check_fortran_libraries ( + BLAS_LIBRARIES + BLAS + sgemm + "" "acml;acml_mv;CALBLAS" "" ${BLAS_ACML_GPU_LIB_DIRS} + ) + if( BLAS_LIBRARIES ) + break() + endif() + endforeach() + else() + foreach( BLAS_ACML_LIB_DIRS ${_ACML_LIB_DIRS} ) + check_fortran_libraries ( + BLAS_LIBRARIES + BLAS + sgemm + "" "acml;acml_mv" "" ${BLAS_ACML_LIB_DIRS} + ) + if( BLAS_LIBRARIES ) + break() + endif() + endforeach() + endif() + + # Either acml or acml_mp should be in LD_LIBRARY_PATH but not both + if(NOT BLAS_LIBRARIES) + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + sgemm + "" + "acml;acml_mv" + "" + ) + endif() + + if(NOT BLAS_LIBRARIES) + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + sgemm + "" + "acml_mp;acml_mv" + "" + ) + endif() + + if(NOT BLAS_LIBRARIES) + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + sgemm + "" + "acml;acml_mv;CALBLAS" + "" + ) + endif() + +endif (BLA_VENDOR MATCHES "ACML.*" OR BLA_VENDOR STREQUAL "All") # ACML + + +# Apple BLAS library? +if (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All") + + if(NOT BLAS_LIBRARIES) + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + dgemm + "" + "Accelerate" + "" + ) + endif() + +endif (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All") + + +if (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All") + + if ( NOT BLAS_LIBRARIES ) + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + dgemm + "" + "vecLib" + "" + ) + endif () + +endif (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All") + + +# Generic BLAS library? +if (BLA_VENDOR STREQUAL "Generic" OR BLA_VENDOR STREQUAL "All") + + if(NOT BLAS_LIBRARIES) + check_fortran_libraries( + BLAS_LIBRARIES + BLAS + sgemm + "" + "blas" + "" + ) + endif() + +endif (BLA_VENDOR STREQUAL "Generic" OR BLA_VENDOR STREQUAL "All") + + +if(BLA_F95) + + if(BLAS95_LIBRARIES) + set(BLAS95_FOUND TRUE) + else() + set(BLAS95_FOUND FALSE) + endif() + + if(NOT BLAS_FIND_QUIETLY) + if(BLAS95_FOUND) + message(STATUS "A library with BLAS95 API found.") + message(STATUS "BLAS_LIBRARIES ${BLAS_LIBRARIES}") + else(BLAS95_FOUND) + message(WARNING "BLA_VENDOR has been set to ${BLA_VENDOR} but blas 95 libraries could not be found or check of symbols failed." + "\nPlease indicate where to find blas libraries. You have three options:\n" + "- Option 1: Provide the root directory of BLAS library with cmake option: -DBLAS_DIR=your/path/to/blas\n" + "- Option 2: Provide the directory where to find BLAS libraries with cmake option: -DBLAS_LIBDIR=your/path/to/blas/libs\n" + "- Option 3: Update your environment variable (Linux: LD_LIBRARY_PATH, Windows: LIB, Mac: DYLD_LIBRARY_PATH)\n" + "\nTo follow libraries detection more precisely you can activate a verbose mode with -DBLAS_VERBOSE=ON at cmake configure." + "\nYou could also specify a BLAS vendor to look for by setting -DBLA_VENDOR=blas_vendor_name." + "\nList of possible BLAS vendor: Goto, ATLAS PhiPACK, CXML, DXML, SunPerf, SCSL, SGIMATH, IBMESSL, Intel10_32 (intel mkl v10 32 bit)," + "Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model), Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model)," + "Intel( older versions of mkl 32 and 64 bit), ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic") + if(BLAS_FIND_REQUIRED) + message(FATAL_ERROR + "A required library with BLAS95 API not found. Please specify library location.") + else() + message(STATUS + "A library with BLAS95 API not found. Please specify library location.") + endif() + endif(BLAS95_FOUND) + endif(NOT BLAS_FIND_QUIETLY) + + set(BLAS_FOUND TRUE) + set(BLAS_LIBRARIES "${BLAS95_LIBRARIES}") + +else(BLA_F95) + + if(BLAS_LIBRARIES) + set(BLAS_FOUND TRUE) + else() + set(BLAS_FOUND FALSE) + endif() + + if(NOT BLAS_FIND_QUIETLY) + if(BLAS_FOUND) + message(STATUS "A library with BLAS API found.") + message(STATUS "BLAS_LIBRARIES ${BLAS_LIBRARIES}") + else(BLAS_FOUND) + message(WARNING "BLA_VENDOR has been set to ${BLA_VENDOR} but blas libraries could not be found or check of symbols failed." + "\nPlease indicate where to find blas libraries. You have three options:\n" + "- Option 1: Provide the root directory of BLAS library with cmake option: -DBLAS_DIR=your/path/to/blas\n" + "- Option 2: Provide the directory where to find BLAS libraries with cmake option: -DBLAS_LIBDIR=your/path/to/blas/libs\n" + "- Option 3: Update your environment variable (Linux: LD_LIBRARY_PATH, Windows: LIB, Mac: DYLD_LIBRARY_PATH)\n" + "\nTo follow libraries detection more precisely you can activate a verbose mode with -DBLAS_VERBOSE=ON at cmake configure." + "\nYou could also specify a BLAS vendor to look for by setting -DBLA_VENDOR=blas_vendor_name." + "\nList of possible BLAS vendor: Goto, ATLAS PhiPACK, CXML, DXML, SunPerf, SCSL, SGIMATH, IBMESSL, Intel10_32 (intel mkl v10 32 bit)," + "Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model), Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model)," + "Intel( older versions of mkl 32 and 64 bit), ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic") + if(BLAS_FIND_REQUIRED) + message(FATAL_ERROR + "A required library with BLAS API not found. Please specify library location.") + else() + message(STATUS + "A library with BLAS API not found. Please specify library location.") + endif() + endif(BLAS_FOUND) + endif(NOT BLAS_FIND_QUIETLY) + +endif(BLA_F95) + +set(CMAKE_FIND_LIBRARY_SUFFIXES ${_blas_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) diff --git a/cmake_modules/morse/find/FindBLASEXT.cmake b/cmake_modules/morse/find/FindBLASEXT.cmake new file mode 100644 index 000000000..4838e5143 --- /dev/null +++ b/cmake_modules/morse/find/FindBLASEXT.cmake @@ -0,0 +1,335 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find BLAS EXTENDED for MORSE projects: find include dirs and libraries +# +# This module allows to find BLAS libraries by calling the official FindBLAS module +# and handles the creation of different library lists whether the user wishes to link +# with a sequential BLAS or a multihreaded (BLAS_SEQ_LIBRARIES and BLAS_PAR_LIBRARIES). +# BLAS is detected with a FindBLAS call then if the BLAS vendor is Intel10_64lp or ACML +# then the module tries to find the corresponding multithreaded libraries. +# +# The following variables have been added to manage links with sequential or multithreaded +# versions: +# BLAS_INCLUDE_DIRS - BLAS include directories +# BLAS_LIBRARY_DIRS - Link directories for BLAS libraries +# BLAS_SEQ_LIBRARIES - BLAS component libraries to be linked (sequential) +# BLAS_PAR_LIBRARIES - BLAS component libraries to be linked (multithreaded) + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + + +# add a cache variable to let the user specify the BLAS vendor +set(BLA_VENDOR "" CACHE STRING "list of possible BLAS vendor: + Goto, ATLAS PhiPACK, CXML, DXML, SunPerf, SCSL, SGIMATH, IBMESSL, + Intel10_32 (intel mkl v10 32 bit), + Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model), + Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model), + Intel( older versions of mkl 32 and 64 bit), + ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic") + + +if (NOT BLAS_FOUND) + # First try to detect two cases: + # 1: only SEQ libs are handled + # 2: both SEQ and PAR libs are handled + if(BLASEXT_FIND_REQUIRED) + find_package(BLAS REQUIRED) + else() + find_package(BLAS) + endif() +endif () + +# detect the cases where SEQ and PAR libs are handled +if(BLA_VENDOR STREQUAL "All" AND + (BLAS_mkl_core_LIBRARY OR BLAS_mkl_core_dll_LIBRARY) + ) + set(BLA_VENDOR "Intel") + if(BLAS_mkl_intel_LIBRARY) + set(BLA_VENDOR "Intel10_32") + endif() + if(BLAS_mkl_intel_lp64_LIBRARY) + set(BLA_VENDOR "Intel10_64lp") + endif() + if(NOT BLASEXT_FIND_QUIETLY) + message(STATUS "A BLAS library has been found (${BLAS_LIBRARIES}) but we" + "have also potentially detected some BLAS libraries from the MKL." + "We try to use this one.") + message(STATUS "If you want to force the use of one specific library, " + "please specify the BLAS vendor by setting -DBLA_VENDOR=blas_vendor_name" + "at cmake configure.") + message(STATUS "List of possible BLAS vendor: Goto, ATLAS PhiPACK, CXML, " + "DXML, SunPerf, SCSL, SGIMATH, IBMESSL, Intel10_32 (intel mkl v10 32 bit)," + "Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model)," + "Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model)," + "Intel( older versions of mkl 32 and 64 bit)," + "ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic") + endif() + set(BLAS_FOUND "") +elseif(BLA_VENDOR STREQUAL "All" AND BLAS_acml_LIBRARY) + set(BLA_VENDOR "ACML") + if(NOT BLASEXT_FIND_QUIETLY) + message(STATUS "A BLAS library has been found (${BLAS_LIBRARIES}) but we" + "have also potentially detected some BLAS libraries from the ACML." + "We try to use this one.") + message(STATUS "If you want to force the use of one specific library, " + "please specify the BLAS vendor by setting -DBLA_VENDOR=blas_vendor_name" + "at cmake configure.") + message(STATUS "List of possible BLAS vendor: Goto, ATLAS PhiPACK, CXML, " + "DXML, SunPerf, SCSL, SGIMATH, IBMESSL, Intel10_32 (intel mkl v10 32 bit)," + "Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model)," + "Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model)," + "Intel( older versions of mkl 32 and 64 bit)," + "ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic") + endif() + set(BLAS_FOUND "") +endif() + +# Intel case +if(BLA_VENDOR MATCHES "Intel*") + + ### + # look for include path if the BLAS vendor is Intel + ### + + # gather system include paths + unset(_inc_env) + if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") + else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + endif() + list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") + list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") + list(REMOVE_DUPLICATES _inc_env) + + # find mkl.h inside known include paths + set(BLAS_mkl.h_INCLUDE_DIRS "BLAS_mkl.h_INCLUDE_DIRS-NOTFOUND") + if(BLAS_INCDIR) + set(BLAS_mkl.h_INCLUDE_DIRS "BLAS_mkl.h_INCLUDE_DIRS-NOTFOUND") + find_path(BLAS_mkl.h_INCLUDE_DIRS + NAMES mkl.h + HINTS ${BLAS_INCDIR}) + else() + if(BLAS_DIR) + set(BLAS_mkl.h_INCLUDE_DIRS "BLAS_mkl.h_INCLUDE_DIRS-NOTFOUND") + find_path(BLAS_mkl.h_INCLUDE_DIRS + NAMES mkl.h + HINTS ${BLAS_DIR} + PATH_SUFFIXES include) + else() + set(BLAS_mkl.h_INCLUDE_DIRS "BLAS_mkl.h_INCLUDE_DIRS-NOTFOUND") + find_path(BLAS_mkl.h_INCLUDE_DIRS + NAMES mkl.h + HINTS ${_inc_env}) + endif() + endif() + mark_as_advanced(BLAS_mkl.h_INCLUDE_DIRS) + ## Print status if not found + ## ------------------------- + #if (NOT BLAS_mkl.h_INCLUDE_DIRS AND MORSE_VERBOSE) + # Print_Find_Header_Status(blas mkl.h) + #endif () + set(BLAS_INCLUDE_DIRS "") + if(BLAS_mkl.h_INCLUDE_DIRS) + list(APPEND BLAS_INCLUDE_DIRS "${BLAS_mkl.h_INCLUDE_DIRS}" ) + endif() + + ### + # look for libs + ### + # if Intel 10 64 bit -> look for sequential and multithreaded versions + if(BLA_VENDOR MATCHES "Intel10_64lp*") + + ## look for the sequential version + set(BLA_VENDOR "Intel10_64lp_seq") + if(NOT BLASEXT_FIND_QUIETLY) + message(STATUS "Look for the sequential version Intel10_64lp_seq") + endif() +# if(NOT BLAS_FOUND AND BLASEXT_FIND_REQUIRED) + if(BLASEXT_FIND_REQUIRED) + find_package(BLAS REQUIRED) + else() + find_package(BLAS) + endif() + if(BLAS_FOUND) + set(BLAS_SEQ_LIBRARIES "${BLAS_LIBRARIES}") + else() + set(BLAS_SEQ_LIBRARIES "${BLAS_SEQ_LIBRARIES-NOTFOUND}") + endif() + + ## look for the multithreaded version + set(BLA_VENDOR "Intel10_64lp") + if(NOT BLASEXT_FIND_QUIETLY) + message(STATUS "Look for the multithreaded version Intel10_64lp") + endif() + find_package(BLAS) + if(BLAS_FOUND) + set(BLAS_PAR_LIBRARIES "${BLAS_LIBRARIES}") + else() + set(BLAS_PAR_LIBRARIES "${BLAS_PAR_LIBRARIES-NOTFOUND}") + endif() + + else() + + if(BLAS_FOUND) + set(BLAS_SEQ_LIBRARIES "${BLAS_LIBRARIES}") + else() + set(BLAS_SEQ_LIBRARIES "${BLAS_SEQ_LIBRARIES-NOTFOUND}") + endif() + + endif() + +# ACML case +elseif(BLA_VENDOR MATCHES "ACML*") + + ## look for the sequential version + set(BLA_VENDOR "ACML") + if(BLASEXT_FIND_REQUIRED) + find_package(BLAS REQUIRED) + else() + find_package(BLAS) + endif() + if(BLAS_FOUND) + set(BLAS_SEQ_LIBRARIES "${BLAS_LIBRARIES}") + else() + set(BLAS_SEQ_LIBRARIES "${BLAS_SEQ_LIBRARIES-NOTFOUND}") + endif() + + ## look for the multithreaded version + set(BLA_VENDOR "ACML_MP") + if(BLASEXT_FIND_REQUIRED) + find_package(BLAS REQUIRED) + else(BLAS_FOUND) + find_package(BLAS) + endif() + if(BLAS_FOUND) + set(BLAS_PAR_LIBRARIES "${BLAS_LIBRARIES}") + else() + set(BLAS_PAR_LIBRARIES "${BLAS_PAR_LIBRARIES-NOTFOUND}") + endif() + +else() + + if(BLAS_FOUND) + # define the SEQ libs as the BLAS_LIBRARIES + set(BLAS_SEQ_LIBRARIES "${BLAS_LIBRARIES}") + else() + set(BLAS_SEQ_LIBRARIES "${BLAS_SEQ_LIBRARIES-NOTFOUND}") + endif() + set(BLAS_PAR_LIBRARIES "${BLAS_PAR_LIBRARIES-NOTFOUND}") + +endif() + + +if(BLAS_SEQ_LIBRARIES) + set(BLAS_LIBRARIES "${BLAS_SEQ_LIBRARIES}") +endif() +# message("DEBUG BLAS: ${BLAS_SEQ_LIBRARIES} ${BLAS_LIBRARIES}") + +# extract libs paths +# remark: because it is not given by find_package(BLAS) +set(BLAS_LIBRARY_DIRS "") +foreach(blas_lib ${BLAS_LIBRARIES}) + get_filename_component(a_blas_lib_dir "${blas_lib}" PATH) + list(APPEND BLAS_LIBRARY_DIRS "${a_blas_lib_dir}" ) +endforeach() +if (BLAS_LIBRARY_DIRS) + list(REMOVE_DUPLICATES BLAS_LIBRARY_DIRS) +endif () + + +# message(STATUS "BLAS_FOUND: ${BLAS_FOUND}") +# message(STATUS "BLA_VENDOR: ${BLA_VENDOR}") +# message(STATUS "BLAS_LIBRARIES: ${BLAS_LIBRARIES}") +# message(STATUS "BLAS_SEQ_LIBRARIES: ${BLAS_SEQ_LIBRARIES}") +# message(STATUS "BLAS_PAR_LIBRARIES: ${BLAS_PAR_LIBRARIES}") +# message(STATUS "BLAS_INCLUDE_DIRS: ${BLAS_INCLUDE_DIRS}") +# message(STATUS "BLAS_LIBRARY_DIRS: ${BLAS_LIBRARY_DIRS}") + +# check that BLAS has been found +# --------------------------------- +include(FindPackageHandleStandardArgs) +if(BLA_VENDOR MATCHES "Intel*") + if(BLA_VENDOR MATCHES "Intel10_64lp*") + if(NOT BLASEXT_FIND_QUIETLY) + message(STATUS "BLAS found is Intel MKL:" + "we manage two lists of libs," + " one sequential and one parallel if found (see BLAS_SEQ_LIBRARIES and BLAS_PAR_LIBRARIES)") + message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES") + endif() + find_package_handle_standard_args(BLAS DEFAULT_MSG + BLAS_SEQ_LIBRARIES + BLAS_LIBRARY_DIRS + BLAS_INCLUDE_DIRS) + if(BLAS_PAR_LIBRARIES) + if(NOT BLASEXT_FIND_QUIETLY) + message(STATUS "BLAS parallel libraries stored in BLAS_PAR_LIBRARIES") + endif() + find_package_handle_standard_args(BLAS DEFAULT_MSG + BLAS_PAR_LIBRARIES) + endif() + else() + if(NOT BLASEXT_FIND_QUIETLY) + message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES") + endif() + find_package_handle_standard_args(BLAS DEFAULT_MSG + BLAS_SEQ_LIBRARIES + BLAS_LIBRARY_DIRS + BLAS_INCLUDE_DIRS) + endif() +elseif(BLA_VENDOR MATCHES "ACML*") + if(NOT BLASEXT_FIND_QUIETLY) + message(STATUS "BLAS found is ACML:" + "we manage two lists of libs," + " one sequential and one parallel if found (see BLAS_SEQ_LIBRARIES and BLAS_PAR_LIBRARIES)") + message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES") + endif() + find_package_handle_standard_args(BLAS DEFAULT_MSG + BLAS_SEQ_LIBRARIES + BLAS_LIBRARY_DIRS + BLAS_INCLUDE_DIRS) + if(BLAS_PAR_LIBRARIES) + if(NOT BLASEXT_FIND_QUIETLY) + message(STATUS "BLAS parallel libraries stored in BLAS_PAR_LIBRARIES") + endif() + find_package_handle_standard_args(BLAS DEFAULT_MSG + BLAS_PAR_LIBRARIES) + endif() +else() + if(NOT BLASEXT_FIND_QUIETLY) + message(STATUS "BLAS sequential libraries stored in BLAS_SEQ_LIBRARIES") + endif() + find_package_handle_standard_args(BLAS DEFAULT_MSG + BLAS_SEQ_LIBRARIES + BLAS_LIBRARY_DIRS) +endif() diff --git a/cmake_modules/morse/find/FindCBLAS.cmake b/cmake_modules/morse/find/FindCBLAS.cmake new file mode 100644 index 000000000..f85c66348 --- /dev/null +++ b/cmake_modules/morse/find/FindCBLAS.cmake @@ -0,0 +1,330 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find CBLAS include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(CBLAS +# [REQUIRED] # Fail with error if cblas is not found +# [COMPONENTS <comp1> <comp2> ...] # dependencies +# ) +# +# CBLAS depends on the following libraries: +# - BLAS +# +# COMPONENTS are optional libraries LAPACKE could be linked with, +# Use it to drive detection of a specific compilation chain +# COMPONENTS can be some of the following: +# - BLASEXT: to activate detection of BLAS with BLASEXT cmake module +# +# This module finds headers and cblas library. +# Results are reported in variables: +# CBLAS_FOUND - True if headers and requested libraries were found +# CBLAS_INCLUDE_DIRS - cblas include directories +# CBLAS_LIBRARY_DIRS - Link directories for cblas libraries +# CBLAS_LIBRARIES - cblas component libraries to be linked +# CBLAS_INCLUDE_DIRS_DEP - cblas + dependencies include directories +# CBLAS_LIBRARY_DIRS_DEP - cblas + dependencies link directories +# CBLAS_LIBRARIES_DEP - cblas libraries + dependencies +# +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DCBLAS_DIR=path/to/cblas): +# CBLAS_DIR - Where to find the base directory of cblas +# CBLAS_INCDIR - Where to find the header files +# CBLAS_LIBDIR - Where to find the library files +# +# CBLAS could be directly embedded in BLAS library (ex: Intel MKL) so that +# we test a cblas function with the blas libraries found and set CBLAS +# variables to BLAS ones if test is successful. To skip this feature and +# look for a stand alone cblas, please add the following in your +# CMakeLists.txt before to call find_package(CBLAS): +# set(CBLAS_STANDALONE TRUE) + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + + +if (NOT CBLAS_FOUND) + set(CBLAS_DIR "" CACHE PATH "Root directory of CBLAS library") + if (NOT CBLAS_FIND_QUIETLY) + message(STATUS "A cache variable, namely CBLAS_DIR, has been set to specify the install directory of CBLAS") + endif() +endif() + + +# CBLAS may depend on BLASEXT +# try to find it specified as COMPONENTS during the call +if (CBLAS_FIND_COMPONENTS) + foreach( component ${CBLAS_FIND_COMPONENTS} ) + if(CBLAS_FIND_REQUIRED_${component}) + find_package(${component} REQUIRED) + else() + find_package(${component}) + endif() + if(${component}_FOUND) + set(CBLAS_${component}_FOUND TRUE) + else() + set(CBLAS_${component}_FOUND FALSE) + endif() + endforeach() +endif () + + +# CBLAS depends on BLAS anyway, try to find it +if (NOT BLAS_FOUND) + if(CBLAS_FIND_REQUIRED) + find_package(BLAS REQUIRED) + else() + find_package(BLAS) + endif() +endif() + + +# find CBLAS +if (BLAS_FOUND) + + if (NOT CBLAS_STANDALONE) + # check if a cblas function exists in the BLAS lib + # this can be the case with libs such as MKL, ACML + include(CheckFunctionExists) + set(CMAKE_REQUIRED_LIBRARIES "${BLAS_LIBRARIES}") + unset(CBLAS_WORKS CACHE) + check_function_exists(cblas_dscal CBLAS_WORKS) + mark_as_advanced(CBLAS_WORKS) + set(CMAKE_REQUIRED_LIBRARIES) + + if(CBLAS_WORKS) + if(NOT CBLAS_FIND_QUIETLY) + message(STATUS "Looking for cblas: test with blas succeeds") + endif() + # test succeeds: CBLAS is in BLAS + set(CBLAS_LIBRARIES "${BLAS_LIBRARIES}") + set(CBLAS_LIBRARY_DIRS "${BLAS_LIBRARY_DIRS}") + if(BLAS_INCLUDE_DIRS) + set(CBLAS_INCLUDE_DIRS "${BLAS_INCLUDE_DIRS}") + endif() + endif() + endif (NOT CBLAS_STANDALONE) + + if (CBLAS_STANDALONE OR NOT CBLAS_WORKS) + + if(NOT CBLAS_WORKS AND NOT CBLAS_FIND_QUIETLY) + message(STATUS "Looking for cblas : test with blas fails") + endif() + # test fails: try to find CBLAS lib exterior to BLAS + + # Try to find CBLAS lib + ####################### + + # Looking for include + # ------------------- + + # Add system include paths to search include + # ------------------------------------------ + unset(_inc_env) + if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") + else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + endif() + list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") + list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") + list(REMOVE_DUPLICATES _inc_env) + + + # Try to find the cblas header in the given paths + # ------------------------------------------------- + # call cmake macro to find the header path + if(CBLAS_INCDIR) + set(CBLAS_cblas.h_DIRS "CBLAS_cblas.h_DIRS-NOTFOUND") + find_path(CBLAS_cblas.h_DIRS + NAMES cblas.h + HINTS ${CBLAS_INCDIR}) + else() + if(CBLAS_DIR) + set(CBLAS_cblas.h_DIRS "CBLAS_cblas.h_DIRS-NOTFOUND") + find_path(CBLAS_cblas.h_DIRS + NAMES cblas.h + HINTS ${CBLAS_DIR} + PATH_SUFFIXES include) + else() + set(CBLAS_cblas.h_DIRS "CBLAS_cblas.h_DIRS-NOTFOUND") + find_path(CBLAS_cblas.h_DIRS + NAMES cblas.h + HINTS ${_inc_env}) + endif() + endif() + mark_as_advanced(CBLAS_cblas.h_DIRS) + + # If found, add path to cmake variable + # ------------------------------------ + if (CBLAS_cblas.h_DIRS) + set(CBLAS_INCLUDE_DIRS "${CBLAS_cblas.h_DIRS}") + else () + set(CBLAS_INCLUDE_DIRS "CBLAS_INCLUDE_DIRS-NOTFOUND") + if(NOT CBLAS_FIND_QUIETLY) + message(STATUS "Looking for cblas -- cblas.h not found") + endif() + endif() + + + # Looking for lib + # --------------- + + # Add system library paths to search lib + # -------------------------------------- + unset(_lib_env) + if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") + else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") + endif() + list(REMOVE_DUPLICATES _lib_env) + + # Try to find the cblas lib in the given paths + # ---------------------------------------------- + + # call cmake macro to find the lib path + if(CBLAS_LIBDIR) + set(CBLAS_cblas_LIBRARY "CBLAS_cblas_LIBRARY-NOTFOUND") + find_library(CBLAS_cblas_LIBRARY + NAMES cblas + HINTS ${CBLAS_LIBDIR}) + else() + if(CBLAS_DIR) + set(CBLAS_cblas_LIBRARY "CBLAS_cblas_LIBRARY-NOTFOUND") + find_library(CBLAS_cblas_LIBRARY + NAMES cblas + HINTS ${CBLAS_DIR} + PATH_SUFFIXES lib lib32 lib64) + else() + set(CBLAS_cblas_LIBRARY "CBLAS_cblas_LIBRARY-NOTFOUND") + find_library(CBLAS_cblas_LIBRARY + NAMES cblas + HINTS ${_lib_env}) + endif() + endif() + mark_as_advanced(CBLAS_cblas_LIBRARY) + + # If found, add path to cmake variable + # ------------------------------------ + if (CBLAS_cblas_LIBRARY) + get_filename_component(cblas_lib_path "${CBLAS_cblas_LIBRARY}" PATH) + # set cmake variables + set(CBLAS_LIBRARIES "${CBLAS_cblas_LIBRARY}") + set(CBLAS_LIBRARY_DIRS "${cblas_lib_path}") + else () + set(CBLAS_LIBRARIES "CBLAS_LIBRARIES-NOTFOUND") + set(CBLAS_LIBRARY_DIRS "CBLAS_LIBRARY_DIRS-NOTFOUND") + if (NOT CBLAS_FIND_QUIETLY) + message(STATUS "Looking for cblas -- lib cblas not found") + endif() + endif () + + # check a function to validate the find + if(CBLAS_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # CBLAS + if (CBLAS_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${CBLAS_INCLUDE_DIRS}") + endif() + if (CBLAS_LIBRARY_DIRS) + set(REQUIRED_LIBDIRS "${CBLAS_LIBRARY_DIRS}") + endif() + set(REQUIRED_LIBS "${CBLAS_LIBRARIES}") + # BLAS + if (BLAS_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${BLAS_INCLUDE_DIRS}") + endif() + if (BLAS_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${BLAS_LIBRARY_DIRS}") + endif() + list(APPEND REQUIRED_LIBS "${BLAS_LIBRARIES}") + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + + # test link + unset(CBLAS_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(cblas_dscal CBLAS_WORKS) + mark_as_advanced(CBLAS_WORKS) + + if(CBLAS_WORKS) + # save link with dependencies + set(CBLAS_LIBRARIES_DEP "${REQUIRED_LIBS}") + set(CBLAS_LIBRARY_DIRS_DEP "${REQUIRED_LIBDIRS}") + set(CBLAS_INCLUDE_DIRS_DEP "${REQUIRED_INCDIRS}") + else() + if(NOT CBLAS_FIND_QUIETLY) + message(STATUS "Looking for cblas : test of cblas_dscal with cblas and blas libraries fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) + endif(CBLAS_LIBRARIES) + + endif (CBLAS_STANDALONE OR NOT CBLAS_WORKS) + +else(BLAS_FOUND) + + if (NOT CBLAS_FIND_QUIETLY) + message(STATUS "CBLAS requires BLAS but BLAS has not been found." + "Please look for BLAS first.") + endif() + +endif(BLAS_FOUND) + + +# check that CBLAS has been found +# ------------------------------- +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(CBLAS DEFAULT_MSG + CBLAS_LIBRARIES + CBLAS_WORKS) diff --git a/cmake_modules/morse/find/FindCHAMELEON.cmake b/cmake_modules/morse/find/FindCHAMELEON.cmake new file mode 100644 index 000000000..9aa16decd --- /dev/null +++ b/cmake_modules/morse/find/FindCHAMELEON.cmake @@ -0,0 +1,721 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find CHAMELEON include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(CHAMELEON +# [REQUIRED] # Fail with error if chameleon is not found +# [COMPONENTS <comp1> <comp2> ...] # dependencies +# ) +# +# CHAMELEON depends on the following libraries: +# - Threads, m, rt +# - HWLOC +# - CBLAS +# - LAPACKE +# - TMG +# - At least one runtime, default is StarPU +# (For QUARK, use COMPONENTS QUARK) +# +# COMPONENTS are optional libraries CHAMELEON could be linked with, +# Use it to drive detection of a specific compilation chain +# COMPONENTS can be some of the following: +# - STARPU (default): to activate detection of Chameleon linked with StarPU +# - QUARK (STARPU will be deactivated): to activate detection of Chameleon linked with QUARK +# - CUDA (comes with cuBLAS): to activate detection of Chameleon linked with CUDA +# - MAGMA: to activate detection of Chameleon linked with MAGMA +# - MPI: to activate detection of Chameleon linked with MPI +# - FXT: to activate detection of Chameleon linked with StarPU+FXT +# +# This module finds headers and chameleon library. +# Results are reported in variables: +# CHAMELEON_FOUND - True if headers and requested libraries were found +# CHAMELEON_INCLUDE_DIRS - chameleon include directories +# CHAMELEON_LIBRARY_DIRS - Link directories for chameleon libraries +# CHAMELEON_INCLUDE_DIRS_DEP - chameleon + dependencies include directories +# CHAMELEON_LIBRARY_DIRS_DEP - chameleon + dependencies link directories +# CHAMELEON_LIBRARIES_DEP - chameleon libraries + dependencies +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DCHAMELEON_DIR=path/to/chameleon): +# CHAMELEON_DIR - Where to find the base directory of chameleon +# CHAMELEON_INCDIR - Where to find the header files +# CHAMELEON_LIBDIR - Where to find the library files + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + + +if (NOT CHAMELEON_FOUND) + set(CHAMELEON_DIR "" CACHE PATH "Root directory of CHAMELEON library") + if (NOT CHAMELEON_FIND_QUIETLY) + message(STATUS "A cache variable, namely CHAMELEON_DIR, has been set to specify the install directory of CHAMELEON") + endif() +endif() + +# Try to find CHAMELEON dependencies if specified as COMPONENTS during the call +set(CHAMELEON_LOOK_FOR_STARPU ON) +set(CHAMELEON_LOOK_FOR_QUARK OFF) +set(CHAMELEON_LOOK_FOR_CUDA OFF) +set(CHAMELEON_LOOK_FOR_MAGMA OFF) +set(CHAMELEON_LOOK_FOR_MPI OFF) +set(CHAMELEON_LOOK_FOR_FXT OFF) + +if( CHAMELEON_FIND_COMPONENTS ) + foreach( component ${CHAMELEON_FIND_COMPONENTS} ) + if (${component} STREQUAL "STARPU") + # means we look for Chameleon with StarPU + set(CHAMELEON_LOOK_FOR_STARPU ON) + set(CHAMELEON_LOOK_FOR_QUARK OFF) + endif() + if (${component} STREQUAL "QUARK") + # means we look for Chameleon with QUARK + set(CHAMELEON_LOOK_FOR_QUARK ON) + set(CHAMELEON_LOOK_FOR_STARPU OFF) + endif() + if (${component} STREQUAL "CUDA") + # means we look for Chameleon with CUDA + set(CHAMELEON_LOOK_FOR_CUDA ON) + endif() + if (${component} STREQUAL "MAGMA") + # means we look for Chameleon with MAGMA + set(CHAMELEON_LOOK_FOR_MAGMA ON) + endif() + if (${component} STREQUAL "MPI") + # means we look for Chameleon with MPI + set(CHAMELEON_LOOK_FOR_MPI ON) + endif() + if (${component} STREQUAL "FXT") + # means we look for Chameleon with FXT + set(CHAMELEON_LOOK_FOR_FXT ON) + endif() + endforeach() +endif() + +# Optionally use pkg-config to detect include/library dirs (if pkg-config is available) +# ------------------------------------------------------------------------------------- +include(FindPkgConfig) +find_package(PkgConfig QUIET) +if(PKG_CONFIG_EXECUTABLE) + + pkg_search_module(CHAMELEON chameleon) + if (NOT CHAMELEON_FIND_QUIETLY) + if (CHAMELEON_FOUND AND CHAMELEON_LIBRARIES) + message(STATUS "Looking for CHAMELEON - found using PkgConfig") + #if(NOT CHAMELEON_INCLUDE_DIRS) + # message("${Magenta}CHAMELEON_INCLUDE_DIRS is empty using PkgConfig." + # "Perhaps the path to chameleon headers is already present in your" + # "C(PLUS)_INCLUDE_PATH environment variable.${ColourReset}") + #endif() + else() + message("${Magenta}Looking for CHAMELEON - not found using PkgConfig." + "Perhaps you should add the directory containing chameleon.pc" + "to the PKG_CONFIG_PATH environment variable.${ColourReset}") + endif() + endif() + + if (CHAMELEON_FIND_VERSION_EXACT) + if( NOT (CHAMELEON_FIND_VERSION_MAJOR STREQUAL CHAMELEON_VERSION_MAJOR) OR + NOT (CHAMELEON_FIND_VERSION_MINOR STREQUAL CHAMELEON_VERSION_MINOR) ) + if(NOT CHAMELEON_FIND_QUIETLY) + message(FATAL_ERROR + "CHAMELEON version found is ${CHAMELEON_VERSION_STRING}" + "when required is ${CHAMELEON_FIND_VERSION}") + endif() + endif() + else() + # if the version found is older than the required then error + if( (CHAMELEON_FIND_VERSION_MAJOR STRGREATER CHAMELEON_VERSION_MAJOR) OR + (CHAMELEON_FIND_VERSION_MINOR STRGREATER CHAMELEON_VERSION_MINOR) ) + if(NOT CHAMELEON_FIND_QUIETLY) + message(FATAL_ERROR + "CHAMELEON version found is ${CHAMELEON_VERSION_STRING}" + "when required is ${CHAMELEON_FIND_VERSION} or newer") + endif() + endif() + endif() + +endif(PKG_CONFIG_EXECUTABLE) + +if( (NOT PKG_CONFIG_EXECUTABLE AND NOT CHAMELEON_FOUND) OR NOT CHAMELEON_FOUND ) + + if (NOT CHAMELEON_FIND_QUIETLY) + message(STATUS "Looking for CHAMELEON - PkgConfig not used") + endif() + + # Dependencies detection + # ---------------------- + + if (NOT CHAMELEON_FIND_QUIETLY) + message(STATUS "Looking for CHAMELEON - Try to detect pthread") + endif() + if (CHAMELEON_FIND_REQUIRED) + find_package(Threads REQUIRED) + else() + find_package(Threads) + endif() + set(CHAMELEON_EXTRA_LIBRARIES "") + if( THREADS_FOUND ) + list(APPEND CHAMELEON_EXTRA_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) + endif () + + # Add math library to the list of extra + # it normally exists on all common systems provided with a C compiler + if (NOT CHAMELEON_FIND_QUIETLY) + message(STATUS "Looking for CHAMELEON - Try to detect libm") + endif() + set(CHAMELEON_M_LIBRARIES "") + if(UNIX OR WIN32) + find_library( + CHAMELEON_M_m_LIBRARY + NAMES m + ) + mark_as_advanced(CHAMELEON_M_m_LIBRARY) + if (CHAMELEON_M_m_LIBRARY) + list(APPEND CHAMELEON_M_LIBRARIES "${CHAMELEON_M_m_LIBRARY}") + list(APPEND CHAMELEON_EXTRA_LIBRARIES "${CHAMELEON_M_m_LIBRARY}") + else() + if (CHAMELEON_FIND_REQUIRED) + message(FATAL_ERROR "Could NOT find libm on your system." + "Are you sure to a have a C compiler installed?") + endif() + endif() + endif() + + # Try to find librt (libposix4 - POSIX.1b Realtime Extensions library) + # on Unix systems except Apple ones because it does not exist on it + if (NOT CHAMELEON_FIND_QUIETLY) + message(STATUS "Looking for CHAMELEON - Try to detect librt") + endif() + set(CHAMELEON_RT_LIBRARIES "") + if(UNIX AND NOT APPLE) + find_library( + CHAMELEON_RT_rt_LIBRARY + NAMES rt + ) + mark_as_advanced(CHAMELEON_RT_rt_LIBRARY) + if (CHAMELEON_RT_rt_LIBRARY) + list(APPEND CHAMELEON_RT_LIBRARIES "${CHAMELEON_RT_rt_LIBRARY}") + list(APPEND CHAMELEON_EXTRA_LIBRARIES "${CHAMELEON_RT_rt_LIBRARY}") + else() + if (CHAMELEON_FIND_REQUIRED) + message(FATAL_ERROR "Could NOT find librt on your system") + endif() + endif() + endif() + + # CHAMELEON depends on CBLAS + #--------------------------- + if (NOT CHAMELEON_FIND_QUIETLY) + message(STATUS "Looking for CHAMELEON - Try to detect CBLAS (depends on BLAS)") + endif() + if (CHAMELEON_FIND_REQUIRED) + find_package(CBLAS REQUIRED COMPONENTS BLASEXT) + else() + find_package(CBLAS COMPONENTS BLASEXT) + endif() + + # CHAMELEON depends on LAPACKE + #----------------------------- + + # standalone version of lapacke seems useless for now + # let the comment in case we meet some problems of non existing lapacke + # functions in lapack library such as mkl, acml, ... + #set(LAPACKE_STANDALONE TRUE) + if (NOT CHAMELEON_FIND_QUIETLY) + message(STATUS "Looking for CHAMELEON - Try to detect LAPACKE (depends on LAPACK)") + endif() + if (CHAMELEON_FIND_REQUIRED) + find_package(LAPACKE REQUIRED COMPONENTS LAPACKEXT) + else() + find_package(LAPACKE COMPONENTS LAPACKEXT) + endif() + + # CHAMELEON depends on TMG + #------------------------- + if (NOT CHAMELEON_FIND_QUIETLY) + message(STATUS "Looking for CHAMELEON - Try to detect TMG (depends on LAPACK)") + endif() + if (CHAMELEON_FIND_REQUIRED) + find_package(TMG REQUIRED) + else() + find_package(TMG) + endif() + + # CHAMELEON may depend on CUDA/CUBLAS + #------------------------------------ + if (NOT CUDA_FOUND AND CHAMELEON_LOOK_FOR_CUDA) + if (CHAMELEON_FIND_REQUIRED) + find_package(CUDA REQUIRED) + else() + find_package(CUDA) + endif() + if (CUDA_FOUND) + mark_as_advanced(CUDA_BUILD_CUBIN) + mark_as_advanced(CUDA_BUILD_EMULATION) + mark_as_advanced(CUDA_SDK_ROOT_DIR) + mark_as_advanced(CUDA_TOOLKIT_ROOT_DIR) + mark_as_advanced(CUDA_VERBOSE_BUILD) + endif() + endif() + + # CHAMELEON may depend on MAGMA gpu kernels + # call our cmake module to test (in cmake_modules) + # change this call position if not appropriated + #------------------------------------------------- + if( CUDA_FOUND AND CHAMELEON_LOOK_FOR_MAGMA ) + set(CHAMELEON_MAGMA_VERSION "1.4" CACHE STRING "oldest MAGMA version desired") + if (CHAMELEON_FIND_REQUIRED) + find_package(MAGMA ${CHAMELEON_MAGMA_VERSION} REQUIRED) + else() + find_package(MAGMA ${CHAMELEON_MAGMA_VERSION}) + endif() + endif() + + # CHAMELEON depends on MPI + #------------------------- + if( NOT MPI_FOUND AND CHAMELEON_LOOK_FOR_MPI ) + + # allows to use an external mpi compilation by setting compilers with + # -DMPI_C_COMPILER=path/to/mpicc -DMPI_Fortran_COMPILER=path/to/mpif90 + # at cmake configure + if(NOT MPI_C_COMPILER) + set(MPI_C_COMPILER mpicc) + endif() + if (CHAMELEON_FIND_REQUIRED) + find_package(MPI REQUIRED) + else() + find_package(MPI) + endif() + if (MPI_FOUND) + mark_as_advanced(MPI_LIBRARY) + mark_as_advanced(MPI_EXTRA_LIBRARY) + endif() + + endif() + + if( NOT STARPU_FOUND AND CHAMELEON_LOOK_FOR_STARPU ) + + set(CHAMELEON_STARPU_VERSION "1.1" CACHE STRING "oldest STARPU version desired") + + # create list of components in order to make a single call to find_package(starpu...) + # we explicitly need a StarPU version built with hwloc + set(STARPU_COMPONENT_LIST "HWLOC") + + # StarPU may depend on MPI + # allows to use an external mpi compilation by setting compilers with + # -DMPI_C_COMPILER=path/to/mpicc -DMPI_Fortran_COMPILER=path/to/mpif90 + # at cmake configure + if (CHAMELEON_LOOK_FOR_MPI) + if(NOT MPI_C_COMPILER) + set(MPI_C_COMPILER mpicc) + endif() + list(APPEND STARPU_COMPONENT_LIST "MPI") + endif() + if (CHAMELEON_LOOK_FOR_CUDA) + list(APPEND STARPU_COMPONENT_LIST "CUDA") + endif() + if (CHAMELEON_LOOK_FOR_FXT) + list(APPEND STARPU_COMPONENT_LIST "FXT") + endif() + if (CHAMELEON_FIND_REQUIRED) + find_package(STARPU ${CHAMELEON_STARPU_VERSION} REQUIRED + COMPONENTS ${STARPU_COMPONENT_LIST}) + else() + find_package(STARPU ${CHAMELEON_STARPU_VERSION} + COMPONENTS ${STARPU_COMPONENT_LIST}) + endif() + + endif() + + if( NOT QUARK_FOUND AND CHAMELEON_LOOK_FOR_QUARK ) + + # try to find quark runtime + if (CHAMELEON_FIND_REQUIRED) + find_package(QUARK REQUIRED COMPONENTS HWLOC) + else() + find_package(QUARK COMPONENTS HWLOC) + endif() + + endif() + + # Looking for include + # ------------------- + + # Add system include paths to search include + # ------------------------------------------ + unset(_inc_env) + if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") + else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + endif() + list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") + list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") + list(REMOVE_DUPLICATES _inc_env) + + + # Try to find the chameleon header in the given paths + # --------------------------------------------------- + # call cmake macro to find the header path + if(CHAMELEON_INCDIR) + set(CHAMELEON_morse.h_DIRS "CHAMELEON_morse.h_DIRS-NOTFOUND") + find_path(CHAMELEON_morse.h_DIRS + NAMES morse.h + HINTS ${CHAMELEON_INCDIR}) + else() + if(CHAMELEON_DIR) + set(CHAMELEON_morse.h_DIRS "CHAMELEON_morse.h_DIRS-NOTFOUND") + find_path(CHAMELEON_morse.h_DIRS + NAMES morse.h + HINTS ${CHAMELEON_DIR} + PATH_SUFFIXES "include" "include/chameleon") + else() + set(CHAMELEON_morse.h_DIRS "CHAMELEON_morse.h_DIRS-NOTFOUND") + find_path(CHAMELEON_morse.h_DIRS + NAMES morse.h + HINTS ${_inc_env}) + endif() + endif() + mark_as_advanced(CHAMELEON_morse.h_DIRS) + + # If found, add path to cmake variable + # ------------------------------------ + if (CHAMELEON_morse.h_DIRS) + set(CHAMELEON_INCLUDE_DIRS "${CHAMELEON_morse.h_DIRS}") + else () + set(CHAMELEON_INCLUDE_DIRS "CHAMELEON_INCLUDE_DIRS-NOTFOUND") + if(NOT CHAMELEON_FIND_QUIETLY) + message(STATUS "Looking for chameleon -- morse.h not found") + endif() + endif() + + + # Looking for lib + # --------------- + + # Add system library paths to search lib + # -------------------------------------- + unset(_lib_env) + if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") + else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") + endif() + list(REMOVE_DUPLICATES _lib_env) + + # Try to find the chameleon lib in the given paths + # ------------------------------------------------ + + # create list of libs to find + set(CHAMELEON_libs_to_find "chameleon") + if (STARPU_FOUND) + list(APPEND CHAMELEON_libs_to_find "chameleon_starpu") + elseif (QUARK_FOUND) + list(APPEND CHAMELEON_libs_to_find "chameleon_quark") + endif() + list(APPEND CHAMELEON_libs_to_find "coreblas") + + # call cmake macro to find the lib path + if(CHAMELEON_LIBDIR) + foreach(chameleon_lib ${CHAMELEON_libs_to_find}) + set(CHAMELEON_${chameleon_lib}_LIBRARY "CHAMELEON_${chameleon_lib}_LIBRARY-NOTFOUND") + find_library(CHAMELEON_${chameleon_lib}_LIBRARY + NAMES ${chameleon_lib} + HINTS ${CHAMELEON_LIBDIR}) + endforeach() + else() + if(CHAMELEON_DIR) + foreach(chameleon_lib ${CHAMELEON_libs_to_find}) + set(CHAMELEON_${chameleon_lib}_LIBRARY "CHAMELEON_${chameleon_lib}_LIBRARY-NOTFOUND") + find_library(CHAMELEON_${chameleon_lib}_LIBRARY + NAMES ${chameleon_lib} + HINTS ${CHAMELEON_DIR} + PATH_SUFFIXES lib lib32 lib64) + endforeach() + else() + foreach(chameleon_lib ${CHAMELEON_libs_to_find}) + set(CHAMELEON_${chameleon_lib}_LIBRARY "CHAMELEON_${chameleon_lib}_LIBRARY-NOTFOUND") + find_library(CHAMELEON_${chameleon_lib}_LIBRARY + NAMES ${chameleon_lib} + HINTS ${_lib_env}) + endforeach() + endif() + endif() + + # If found, add path to cmake variable + # ------------------------------------ + foreach(chameleon_lib ${CHAMELEON_libs_to_find}) + + get_filename_component(${chameleon_lib}_lib_path ${CHAMELEON_${chameleon_lib}_LIBRARY} PATH) + # set cmake variables (respects naming convention) + if (CHAMELEON_LIBRARIES) + list(APPEND CHAMELEON_LIBRARIES "${CHAMELEON_${chameleon_lib}_LIBRARY}") + else() + set(CHAMELEON_LIBRARIES "${CHAMELEON_${chameleon_lib}_LIBRARY}") + endif() + if (CHAMELEON_LIBRARY_DIRS) + list(APPEND CHAMELEON_LIBRARY_DIRS "${${chameleon_lib}_lib_path}") + else() + set(CHAMELEON_LIBRARY_DIRS "${${chameleon_lib}_lib_path}") + endif() + mark_as_advanced(CHAMELEON_${chameleon_lib}_LIBRARY) + + endforeach(chameleon_lib ${CHAMELEON_libs_to_find}) + + # check a function to validate the find + if(CHAMELEON_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # CHAMELEON + if (CHAMELEON_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${CHAMELEON_INCLUDE_DIRS}") + endif() + foreach(libdir ${CHAMELEON_LIBRARY_DIRS}) + if (libdir) + list(APPEND REQUIRED_LIBDIRS "${libdir}") + endif() + endforeach() + set(REQUIRED_LIBS "${CHAMELEON_LIBRARIES}") + # STARPU + if (STARPU_FOUND AND CHAMELEON_LOOK_FOR_STARPU) + if (STARPU_INCLUDE_DIRS_DEP) + list(APPEND REQUIRED_INCDIRS "${STARPU_INCLUDE_DIRS_DEP}") + elseif (STARPU_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${STARPU_INCLUDE_DIRS}") + endif() + if(STARPU_LIBRARY_DIRS_DEP) + list(APPEND REQUIRED_LIBDIRS "${STARPU_LIBRARY_DIRS_DEP}") + elseif(STARPU_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${STARPU_LIBRARY_DIRS}") + endif() + if (STARPU_LIBRARIES_DEP) + list(APPEND REQUIRED_LIBS "${STARPU_LIBRARIES_DEP}") + elseif (STARPU_LIBRARIES) + foreach(lib ${STARPU_LIBRARIES}) + if (EXISTS ${lib} OR ${lib} MATCHES "^-") + list(APPEND REQUIRED_LIBS "${lib}") + else() + list(APPEND REQUIRED_LIBS "-l${lib}") + endif() + endforeach() + endif() + endif() + # QUARK + if (QUARK_FOUND AND CHAMELEON_LOOK_FOR_QUARK) + if (QUARK_INCLUDE_DIRS_DEP) + list(APPEND REQUIRED_INCDIRS "${QUARK_INCLUDE_DIRS_DEP}") + elseif(QUARK_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${QUARK_INCLUDE_DIRS}") + endif() + if(QUARK_LIBRARY_DIRS_DEP) + list(APPEND REQUIRED_LIBDIRS "${QUARK_LIBRARY_DIRS_DEP}") + elseif(QUARK_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${QUARK_LIBRARY_DIRS}") + endif() + if (QUARK_LIBRARY_DIRS_DEP) + list(APPEND REQUIRED_LIBS "${QUARK_LIBRARIES_DEP}") + elseif (QUARK_LIBRARY_DIRS_DEP) + list(APPEND REQUIRED_LIBS "${QUARK_LIBRARIES}") + endif() + endif() + # CUDA + if (CUDA_FOUND AND CHAMELEON_LOOK_FOR_CUDA) + if (CUDA_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${CUDA_INCLUDE_DIRS}") + endif() + foreach(libdir ${CUDA_LIBRARY_DIRS}) + if (libdir) + list(APPEND REQUIRED_LIBDIRS "${libdir}") + endif() + endforeach() + list(APPEND REQUIRED_LIBS "${CUDA_CUBLAS_LIBRARIES};${CUDA_LIBRARIES}") + endif() + # MAGMA + if (MAGMA_FOUND AND CHAMELEON_LOOK_FOR_MAGMA) + if (MAGMA_INCLUDE_DIRS_DEP) + list(APPEND REQUIRED_INCDIRS "${MAGMA_INCLUDE_DIRS_DEP}") + elseif(MAGMA_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${MAGMA_INCLUDE_DIRS}") + endif() + if (MAGMA_LIBRARY_DIRS_DEP) + list(APPEND REQUIRED_LIBDIRS "${MAGMA_LIBRARY_DIRS_DEP}") + elseif(MAGMA_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${MAGMA_LIBRARY_DIRS}") + endif() + if (MAGMA_LIBRARIES_DEP) + list(APPEND REQUIRED_LIBS "${MAGMA_LIBRARIES_DEP}") + elseif(MAGMA_LIBRARIES) + foreach(lib ${MAGMA_LIBRARIES}) + if (EXISTS ${lib} OR ${lib} MATCHES "^-") + list(APPEND REQUIRED_LIBS "${lib}") + else() + list(APPEND REQUIRED_LIBS "-l${lib}") + endif() + endforeach() + endif() + endif() + # MPI + if (MPI_FOUND AND CHAMELEON_LOOK_FOR_MPI) + if (MPI_C_INCLUDE_PATH) + list(APPEND REQUIRED_INCDIRS "${MPI_C_INCLUDE_PATH}") + endif() + if (MPI_C_LINK_FLAGS) + list(APPEND REQUIRED_LIBS "${MPI_C_LINK_FLAGS}") + endif() + list(APPEND REQUIRED_LIBS "${MPI_C_LIBRARIES}") + endif() + # HWLOC + if (HWLOC_FOUND) + if (HWLOC_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${HWLOC_INCLUDE_DIRS}") + endif() + foreach(libdir ${HWLOC_LIBRARY_DIRS}) + if (libdir) + list(APPEND REQUIRED_LIBDIRS "${libdir}") + endif() + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${HWLOC_LIBRARIES}") + endif() + # TMG + if (TMG_FOUND) + if (TMG_INCLUDE_DIRS_DEP) + list(APPEND REQUIRED_INCDIRS "${TMG_INCLUDE_DIRS_DEP}") + elseif (TMG_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${TMG_INCLUDE_DIRS}") + endif() + if(TMG_LIBRARY_DIRS_DEP) + list(APPEND REQUIRED_LIBDIRS "${TMG_LIBRARY_DIRS_DEP}") + elseif(TMG_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${TMG_LIBRARY_DIRS}") + endif() + if (TMG_LIBRARIES_DEP) + list(APPEND REQUIRED_LIBS "${TMG_LIBRARIES_DEP}") + elseif(TMG_LIBRARIES) + list(APPEND REQUIRED_LIBS "${TMG_LIBRARIES}") + endif() + endif() + # LAPACKE + if (LAPACKE_FOUND) + if (LAPACKE_INCLUDE_DIRS_DEP) + list(APPEND REQUIRED_INCDIRS "${LAPACKE_INCLUDE_DIRS_DEP}") + elseif (LAPACKE_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${LAPACKE_INCLUDE_DIRS}") + endif() + if(LAPACKE_LIBRARY_DIRS_DEP) + list(APPEND REQUIRED_LIBDIRS "${LAPACKE_LIBRARY_DIRS_DEP}") + elseif(LAPACKE_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${LAPACKE_LIBRARY_DIRS}") + endif() + if (LAPACKE_LIBRARIES_DEP) + list(APPEND REQUIRED_LIBS "${LAPACKE_LIBRARIES_DEP}") + elseif(LAPACKE_LIBRARIES) + list(APPEND REQUIRED_LIBS "${LAPACKE_LIBRARIES}") + endif() + endif() + # CBLAS + if (CBLAS_FOUND) + if (CBLAS_INCLUDE_DIRS_DEP) + list(APPEND REQUIRED_INCDIRS "${CBLAS_INCLUDE_DIRS_DEP}") + elseif (CBLAS_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${CBLAS_INCLUDE_DIRS}") + endif() + if(CBLAS_LIBRARY_DIRS_DEP) + list(APPEND REQUIRED_LIBDIRS "${CBLAS_LIBRARY_DIRS_DEP}") + elseif(CBLAS_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${CBLAS_LIBRARY_DIRS}") + endif() + if (CBLAS_LIBRARIES_DEP) + list(APPEND REQUIRED_LIBS "${CBLAS_LIBRARIES_DEP}") + elseif(CBLAS_LIBRARIES) + list(APPEND REQUIRED_LIBS "${CBLAS_LIBRARIES}") + endif() + endif() + # EXTRA LIBS such that pthread, m, rt + list(APPEND REQUIRED_LIBS ${CHAMELEON_EXTRA_LIBRARIES}) + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + + # test link + unset(CHAMELEON_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(MORSE_Init CHAMELEON_WORKS) + mark_as_advanced(CHAMELEON_WORKS) + + if(CHAMELEON_WORKS) + # save link with dependencies + set(CHAMELEON_LIBRARIES_DEP "${REQUIRED_LIBS}") + set(CHAMELEON_LIBRARY_DIRS_DEP "${REQUIRED_LIBDIRS}") + set(CHAMELEON_INCLUDE_DIRS_DEP "${REQUIRED_INCDIRS}") + else() + if(NOT CHAMELEON_FIND_QUIETLY) + message(STATUS "Looking for chameleon : test of MORSE_Init fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + message(STATUS "Maybe CHAMELEON is linked with specific libraries. " + "Have you tried with COMPONENTS (STARPU/QUARK, CUDA, MAGMA, MPI, FXT)? " + "See the explanation in FindCHAMELEON.cmake.") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) + endif(CHAMELEON_LIBRARIES) + +endif( (NOT PKG_CONFIG_EXECUTABLE AND NOT CHAMELEON_FOUND) OR NOT CHAMELEON_FOUND ) + + +# check that CHAMELEON has been found +# --------------------------------- +include(FindPackageHandleStandardArgs) +if (PKG_CONFIG_EXECUTABLE AND CHAMELEON_FOUND) + find_package_handle_standard_args(CHAMELEON DEFAULT_MSG + CHAMELEON_LIBRARIES) +else() + find_package_handle_standard_args(CHAMELEON DEFAULT_MSG + CHAMELEON_LIBRARIES + CHAMELEON_WORKS) +endif() diff --git a/cmake_modules/morse/find/FindFFTW.cmake b/cmake_modules/morse/find/FindFFTW.cmake new file mode 100644 index 000000000..6df493eb5 --- /dev/null +++ b/cmake_modules/morse/find/FindFFTW.cmake @@ -0,0 +1,417 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find FFTW Version 3 include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(FFTW +# [REQUIRED] # Fail with error if fftw is not found +# [COMPONENTS MKL] +# +# COMPONENTS can be some of the following: +# - MKL: to detect the FFTW from Intel MKL +# - THREADS: to detect the Threads version of FFTW +# - OMP: to detect the OpenMP version of FFTW +# - SIMPLE: to detect the FFTW simple precision fftw3f +# - DOUBLE: to detect the FFTW double precision fftw3 (default) +# - LONG: to detect the FFTW long double precision fftw3l +# - QUAD: to detect the FFTW quadruple precision fftw3q +# +# This module finds headers and fftw library. +# Results are reported in variables: +# FFTW_FOUND - True if headers and requested libraries were found +# FFTW_INCLUDE_DIRS - fftw include directories +# FFTW_LIBRARY_DIRS - Link directories for fftw libraries +# FFTW_LIBRARIES - fftw component libraries to be linked +# FFTW_INCLUDE_DIRS_DEP - fftw + dependencies include directories +# FFTW_LIBRARY_DIRS_DEP - fftw + dependencies link directories +# FFTW_LIBRARIES_DEP - fftw libraries + dependencies +# +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DFFTW_DIR=path/to/fftw): +# FFTW_DIR - Where to find the base directory of fftw +# FFTW_INCDIR - Where to find the header files +# FFTW_LIBDIR - Where to find the library files + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + + +if (NOT FFTW_FOUND) + set(FFTW_DIR "" CACHE PATH "Root directory of FFTW library") + if (NOT FFTW_FIND_QUIETLY) + message(STATUS "A cache variable, namely FFTW_DIR, has been set to specify the install directory of FFTW") + endif() +endif() + +# Set the version to find +set(FFTW_LOOK_FOR_MKL OFF) +set(FFTW_LOOK_FOR_THREADS OFF) +set(FFTW_LOOK_FOR_OMP OFF) +set(FFTW_LOOK_FOR_FFTW_SIMPLE OFF) +set(FFTW_LOOK_FOR_FFTW_DOUBLE ON) +set(FFTW_LOOK_FOR_FFTW_LONG OFF) +set(FFTW_LOOK_FOR_FFTW_QUAD OFF) + +if( FFTW_FIND_COMPONENTS ) + foreach( component ${FFTW_FIND_COMPONENTS} ) + if (${component} STREQUAL "THREADS") + # means we look for the Threads version of FFTW + set(FFTW_LOOK_FOR_THREADS ON) + endif() + if (${component} STREQUAL "OMP") + # means we look for the OpenMP version of FFTW + set(FFTW_LOOK_FOR_OMP ON) + endif() + if (${component} STREQUAL "SIMPLE") + # means we look for FFTW simple precision (fftw3f) + set(FFTW_LOOK_FOR_FFTW_SIMPLE ON) + set(FFTW_LOOK_FOR_FFTW_DOUBLE OFF) + set(FFTW_LOOK_FOR_FFTW_LONG OFF) + set(FFTW_LOOK_FOR_FFTW_QUAD OFF) + endif() + if (${component} STREQUAL "DOUBLE") + # means we look for FFTW double precision (fftw3) + set(FFTW_LOOK_FOR_FFTW_SIMPLE OFF) + set(FFTW_LOOK_FOR_FFTW_DOUBLE ON) + set(FFTW_LOOK_FOR_FFTW_LONG OFF) + set(FFTW_LOOK_FOR_FFTW_QUAD OFF) + endif() + if (${component} STREQUAL "LONG") + # means we look for FFTW long double precision (fftw3l) + set(FFTW_LOOK_FOR_FFTW_SIMPLE OFF) + set(FFTW_LOOK_FOR_FFTW_DOUBLE OFF) + set(FFTW_LOOK_FOR_FFTW_LONG ON) + set(FFTW_LOOK_FOR_FFTW_QUAD OFF) + endif() + if (${component} STREQUAL "QUAD") + # means we look for FFTW quad precision (fftw3q) + set(FFTW_LOOK_FOR_FFTW_SIMPLE OFF) + set(FFTW_LOOK_FOR_FFTW_DOUBLE OFF) + set(FFTW_LOOK_FOR_FFTW_LONG OFF) + set(FFTW_LOOK_FOR_FFTW_QUAD ON) + endif() + if (${component} STREQUAL "MKL") + # means we look for the Intel MKL version of FFTW + set(FFTW_LOOK_FOR_MKL ON) + if (FFTW_LOOK_FOR_FFTW_LONG) + message(WARNING "Looking for FFTW -- long precision functions do not exist in MKL FFTW") + set(FFTW_LOOK_FOR_FFTW_LONG OFF) + endif() + if (FFTW_LOOK_FOR_FFTW_QUAD) + message(WARNING "Looking for FFTW -- quadruple functions do not exist in MKL FFTW") + set(FFTW_LOOK_FOR_FFTW_QUAD OFF) + endif() + endif() + endforeach() +endif() + +if (FFTW_LOOK_FOR_THREADS) + if (FFTW_FIND_REQUIRED) + find_package(Threads REQUIRED) + else() + find_package(Threads) + endif() +endif() + +if (FFTW_LOOK_FOR_OMP) + if (FFTW_FIND_REQUIRED) + find_package(OpenMP REQUIRED) + else() + find_package(OpenMP) + endif() +endif() + +if( NOT FFTW_FOUND ) + + # Looking for include + # ------------------- + + # Add system include paths to search include + # ------------------------------------------ + unset(_inc_env) + if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") + else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + endif() + list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") + list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") + list(REMOVE_DUPLICATES _inc_env) + + # set paths where to look for + set(PATH_TO_LOOK_FOR "${_inc_env}") + + # Try to find the fftw header in the given paths + # ------------------------------------------------- + # call cmake macro to find the header path + if(FFTW_INCDIR) + set(FFTW_fftw3.h_DIRS "FFTW_fftw3.h_DIRS-NOTFOUND") + find_path(FFTW_fftw3.h_DIRS + NAMES fftw3.h + HINTS ${FFTW_INCDIR}) + else() + if(FFTW_DIR) + set(FFTW_fftw3.h_DIRS "FFTW_fftw3.h_DIRS-NOTFOUND") + find_path(FFTW_fftw3.h_DIRS + NAMES fftw3.h + HINTS ${FFTW_DIR} + PATH_SUFFIXES include) + else() + set(FFTW_fftw3.h_DIRS "FFTW_fftw3.h_DIRS-NOTFOUND") + find_path(FFTW_fftw3.h_DIRS + NAMES fftw3.h + HINTS ${PATH_TO_LOOK_FOR}) + endif() + endif() + mark_as_advanced(FFTW_fftw3.h_DIRS) + + # Add path to cmake variable + # ------------------------------------ + if (FFTW_fftw3.h_DIRS) + set(FFTW_INCLUDE_DIRS "${FFTW_fftw3.h_DIRS}") + else () + set(FFTW_INCLUDE_DIRS "FFTW_INCLUDE_DIRS-NOTFOUND") + if(NOT FFTW_FIND_QUIETLY) + message(STATUS "Looking for FFTW -- fftw3.h not found") + endif() + endif () + + + # Looking for lib + # --------------- + + # Add system library paths to search lib + # -------------------------------------- + unset(_lib_env) + if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") + else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") + endif() + list(REMOVE_DUPLICATES _lib_env) + + # set paths where to look for + set(PATH_TO_LOOK_FOR "${_lib_env}") + + if(FFTW_LOOK_FOR_FFTW_SIMPLE) + set(FFTW_PREC "f") + set(FFTW_PREC_TESTFUNC "s") + elseif(FFTW_LOOK_FOR_FFTW_DOUBLE) + set(FFTW_PREC "") + set(FFTW_PREC_TESTFUNC "d") + elseif(FFTW_LOOK_FOR_FFTW_LONG) + set(FFTW_PREC "l") + set(FFTW_PREC_TESTFUNC "l") + elseif(FFTW_LOOK_FOR_FFTW_QUAD) + set(FFTW_PREC "q") + set(FFTW_PREC_TESTFUNC "q") + endif() + + if (FFTW_LOOK_FOR_MKL) + + set(FFTW_libs_to_find "mkl_intel_lp64;mkl_sequential;mkl_core") + + # Try to find the MKL fftw lib in the given paths + # ----------------------------------------------- + + # call cmake macro to find the lib path + if(FFTW_LIBDIR) + foreach(fftw_lib ${FFTW_libs_to_find}) + set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND") + find_library(FFTW_${fftw_lib}_LIBRARY + NAMES ${fftw_lib} + HINTS ${FFTW_LIBDIR}) + endforeach() + else() + if(FFTW_DIR) + foreach(fftw_lib ${FFTW_libs_to_find}) + set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND") + find_library(FFTW_${fftw_lib}_LIBRARY + NAMES ${fftw_lib} + HINTS ${FFTW_DIR} + PATH_SUFFIXES lib lib32 lib64) + endforeach() + else() + foreach(fftw_lib ${FFTW_libs_to_find}) + set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND") + find_library(FFTW_${fftw_lib}_LIBRARY + NAMES ${fftw_lib} + HINTS ${PATH_TO_LOOK_FOR}) + endforeach() + endif() + endif() + + else(FFTW_LOOK_FOR_MKL) + + if (FFTW_LOOK_FOR_THREADS) + set(FFTW_libs_to_find "fftw3${FFTW_PREC}_threads;fftw3${FFTW_PREC}") + elseif (FFTW_LOOK_FOR_OMP) + set(FFTW_libs_to_find "fftw3${FFTW_PREC}_omp;fftw3${FFTW_PREC}") + else() + set(FFTW_libs_to_find "fftw3${FFTW_PREC}") + endif() + + # Try to find the fftw lib in the given paths + # ---------------------------------------------- + + # call cmake macro to find the lib path + if(FFTW_LIBDIR) + foreach(fftw_lib ${FFTW_libs_to_find}) + set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND") + find_library(FFTW_${fftw_lib}_LIBRARY + NAMES ${fftw_lib} + HINTS ${FFTW_LIBDIR}) + endforeach() + else() + if(FFTW_DIR) + foreach(fftw_lib ${FFTW_libs_to_find}) + set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND") + find_library(FFTW_${fftw_lib}_LIBRARY + NAMES ${fftw_lib} + HINTS ${FFTW_DIR} + PATH_SUFFIXES lib lib32 lib64) + endforeach() + else() + foreach(fftw_lib ${FFTW_libs_to_find}) + set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND") + find_library(FFTW_${fftw_lib}_LIBRARY + NAMES ${fftw_lib} + HINTS ${PATH_TO_LOOK_FOR}) + endforeach() + endif() + endif() + + endif(FFTW_LOOK_FOR_MKL) + + # If found, add path to cmake variable + # ------------------------------------ + set(FFTW_LIBRARIES "") + set(FFTW_LIBRARY_DIRS "") + foreach(fftw_lib ${FFTW_libs_to_find}) + + if (FFTW_${fftw_lib}_LIBRARY) + get_filename_component(${fftw_lib}_lib_path "${FFTW_${fftw_lib}_LIBRARY}" PATH) + # set cmake variables + list(APPEND FFTW_LIBRARIES "${FFTW_${fftw_lib}_LIBRARY}") + list(APPEND FFTW_LIBRARY_DIRS "${${fftw_lib}_lib_path}") + else () + list(APPEND FFTW_LIBRARIES "${FFTW_${fftw_lib}_LIBRARY}") + if (NOT FFTW_FIND_QUIETLY) + message(STATUS "Looking for FFTW -- lib ${fftw_lib} not found") + endif() + endif () + mark_as_advanced(FFTW_${fftw_lib}_LIBRARY) + + endforeach() + + list(REMOVE_DUPLICATES FFTW_INCLUDE_DIRS) + list(REMOVE_DUPLICATES FFTW_LIBRARY_DIRS) + + # check a function to validate the find + if(FFTW_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # FFTW + if (FFTW_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${FFTW_INCLUDE_DIRS}") + endif() + if (FFTW_LIBRARY_DIRS) + set(REQUIRED_LIBDIRS "${FFTW_LIBRARY_DIRS}") + endif() + set(REQUIRED_LIBS "${FFTW_LIBRARIES}") + # THREADS + if (FFTW_LOOK_FOR_THREADS) + list(APPEND REQUIRED_LIBS "${CMAKE_THREAD_LIBS_INIT}") + endif() + # OMP + if(FFTW_LOOK_FOR_OMP) + if (CMAKE_C_COMPILER MATCHES ".+gcc.*") + set(CMAKE_REQUIRED_FLAGS "-fopenmp") + endif() + endif() + # MKL + if(FFTW_LOOK_FOR_MKL) + list(APPEND REQUIRED_LIBS "-Wl,--no-as-needed;${CMAKE_REQUIRED_LIBRARIES};${CMAKE_THREAD_LIBS_INIT};-lm") + endif() + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + + # test link + unset(FFTW_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(${FFTW_PREC_TESTFUNC}fftw_execute_ FFTW_WORKS) + mark_as_advanced(FFTW_WORKS) + + if(FFTW_WORKS) + # save link with dependencies + set(FFTW_LIBRARIES_DEP "${REQUIRED_LIBS}") + set(FFTW_LIBRARY_DIRS_DEP "${REQUIRED_LIBDIRS}") + set(FFTW_INCLUDE_DIRS_DEP "${REQUIRED_INCDIRS}") + else() + if(NOT FFTW_FIND_QUIETLY) + message(STATUS "Looking for FFTW : test of ${FFTW_PREC_TESTFUNC}fftw_execute_ with fftw library fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + endif() + else() + set(FFTW_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) + endif(FFTW_LIBRARIES) + +endif( NOT FFTW_FOUND ) + + +# check that FFTW has been found +# ------------------------------- +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(FFTW DEFAULT_MSG + FFTW_LIBRARIES + FFTW_INCLUDE_DIRS + FFTW_WORKS) diff --git a/cmake_modules/morse/find/FindFXT.cmake b/cmake_modules/morse/find/FindFXT.cmake new file mode 100644 index 000000000..fdc149076 --- /dev/null +++ b/cmake_modules/morse/find/FindFXT.cmake @@ -0,0 +1,264 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find FXT include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(FXT +# [REQUIRED]) # Fail with error if fxt is not found +# +# This module finds headers and fxt library. +# Results are reported in variables: +# FXT_FOUND - True if headers and requested libraries were found +# FXT_INCLUDE_DIRS - fxt include directories +# FXT_LIBRARY_DIRS - Link directories for fxt libraries +# FXT_LIBRARIES - fxt component libraries to be linked +# +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DFXT_DIR=path/to/fxt): +# FXT_DIR - Where to find the base directory of fxt +# FXT_INCDIR - Where to find the header files +# FXT_LIBDIR - Where to find the library files + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + +if (NOT FXT_FOUND) + set(FXT_DIR "" CACHE PATH "Root directory of FXT library") + if (NOT FXT_FIND_QUIETLY) + message(STATUS "A cache variable, namely FXT_DIR, has been set to specify the install directory of FXT") + endif() +endif() + +# Optionally use pkg-config to detect include/library dirs (if pkg-config is available) +# ------------------------------------------------------------------------------------- +include(FindPkgConfig) +find_package(PkgConfig QUIET) +if(PKG_CONFIG_EXECUTABLE) + + pkg_search_module(FXT fxt) + if (NOT FXT_FIND_QUIETLY) + if (FXT_FOUND AND FXT_LIBRARIES) + message(STATUS "Looking for FXT - found using PkgConfig") + #if(NOT FXT_INCLUDE_DIRS) + # message("${Magenta}FXT_INCLUDE_DIRS is empty using PkgConfig." + # "Perhaps the path to fxt headers is already present in your" + # "C(PLUS)_INCLUDE_PATH environment variable.${ColourReset}") + #endif() + else() + message("${Magenta}Looking for FXT - not found using PkgConfig." + "Perhaps you should add the directory containing fxt.pc to the" + "PKG_CONFIG_PATH environment variable.${ColourReset}") + endif() + endif() + +endif(PKG_CONFIG_EXECUTABLE) + +if( (NOT PKG_CONFIG_EXECUTABLE AND NOT FXT_FOUND) OR NOT FXT_FOUND ) + + if (NOT FXT_FIND_QUIETLY) + message(STATUS "Looking for FXT - PkgConfig not used") + endif() + + # Looking for include + # ------------------- + + # Add system include paths to search include + # ------------------------------------------ + unset(_inc_env) + if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") + else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + endif() + list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") + list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") + list(REMOVE_DUPLICATES _inc_env) + + # Try to find the fxt header in the given paths + # ------------------------------------------------- + # call cmake macro to find the header path + if(FXT_INCDIR) + set(FXT_fxt.h_DIRS "FXT_fxt.h_DIRS-NOTFOUND") + find_path(FXT_fxt.h_DIRS + NAMES fxt.h + HINTS ${FXT_INCDIR}) + else() + if(FXT_DIR) + set(FXT_fxt.h_DIRS "FXT_fxt.h_DIRS-NOTFOUND") + find_path(FXT_fxt.h_DIRS + NAMES fxt.h + HINTS ${FXT_DIR} + PATH_SUFFIXES include) + else() + set(FXT_fxt.h_DIRS "FXT_fxt.h_DIRS-NOTFOUND") + find_path(FXT_fxt.h_DIRS + NAMES fxt.h + HINTS ${_inc_env}) + endif() + endif() + mark_as_advanced(FXT_fxt.h_DIRS) + + # Add path to cmake variable + # ------------------------------------ + if (FXT_fxt.h_DIRS) + set(FXT_INCLUDE_DIRS "${FXT_fxt.h_DIRS}") + else () + set(FXT_INCLUDE_DIRS "FXT_INCLUDE_DIRS-NOTFOUND") + if(NOT FXT_FIND_QUIETLY) + message(STATUS "Looking for fxt -- fxt.h not found") + endif() + endif () + + if (FXT_INCLUDE_DIRS) + list(REMOVE_DUPLICATES FXT_INCLUDE_DIRS) + endif () + + + # Looking for lib + # --------------- + + # Add system library paths to search lib + # -------------------------------------- + unset(_lib_env) + if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") + else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") + endif() + list(REMOVE_DUPLICATES _lib_env) + + # Try to find the fxt lib in the given paths + # ---------------------------------------------- + + # call cmake macro to find the lib path + if(FXT_LIBDIR) + set(FXT_fxt_LIBRARY "FXT_fxt_LIBRARY-NOTFOUND") + find_library(FXT_fxt_LIBRARY + NAMES fxt + HINTS ${FXT_LIBDIR}) + else() + if(FXT_DIR) + set(FXT_fxt_LIBRARY "FXT_fxt_LIBRARY-NOTFOUND") + find_library(FXT_fxt_LIBRARY + NAMES fxt + HINTS ${FXT_DIR} + PATH_SUFFIXES lib lib32 lib64) + else() + set(FXT_fxt_LIBRARY "FXT_fxt_LIBRARY-NOTFOUND") + find_library(FXT_fxt_LIBRARY + NAMES fxt + HINTS ${_lib_env}) + endif() + endif() + mark_as_advanced(FXT_fxt_LIBRARY) + + # If found, add path to cmake variable + # ------------------------------------ + if (FXT_fxt_LIBRARY) + get_filename_component(fxt_lib_path ${FXT_fxt_LIBRARY} PATH) + # set cmake variables (respects naming convention) + set(FXT_LIBRARIES "${FXT_fxt_LIBRARY}") + set(FXT_LIBRARY_DIRS "${fxt_lib_path}") + else () + set(FXT_LIBRARIES "FXT_LIBRARIES-NOTFOUND") + set(FXT_LIBRARY_DIRS "FXT_LIBRARY_DIRS-NOTFOUND") + if(NOT FXT_FIND_QUIETLY) + message(STATUS "Looking for fxt -- lib fxt not found") + endif() + endif () + + if (FXT_LIBRARY_DIRS) + list(REMOVE_DUPLICATES FXT_LIBRARY_DIRS) + endif () + + # check a function to validate the find + if(FXT_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # FXT + if (FXT_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${FXT_INCLUDE_DIRS}") + endif() + if (FXT_LIBRARY_DIRS) + set(REQUIRED_LIBDIRS "${FXT_LIBRARY_DIRS}") + endif() + set(REQUIRED_LIBS "${FXT_LIBRARIES}") + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + + # test link + unset(FXT_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(fut_keychange FXT_WORKS) + mark_as_advanced(FXT_WORKS) + + if(NOT FXT_WORKS) + if(NOT FXT_FIND_QUIETLY) + message(STATUS "Looking for fxt : test of fut_keychange with fxt library fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) + endif(FXT_LIBRARIES) + +endif( (NOT PKG_CONFIG_EXECUTABLE AND NOT FXT_FOUND) OR NOT FXT_FOUND ) + + +# check that FXT has been found +# ------------------------------- +include(FindPackageHandleStandardArgs) +if (PKG_CONFIG_EXECUTABLE AND FXT_FOUND) + find_package_handle_standard_args(FXT DEFAULT_MSG + FXT_LIBRARIES) +else() + find_package_handle_standard_args(FXT DEFAULT_MSG + FXT_LIBRARIES + FXT_WORKS) +endif() diff --git a/cmake_modules/morse/find/FindHWLOC.cmake b/cmake_modules/morse/find/FindHWLOC.cmake new file mode 100644 index 000000000..ee08a29cf --- /dev/null +++ b/cmake_modules/morse/find/FindHWLOC.cmake @@ -0,0 +1,271 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find HWLOC include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(HWLOC +# [REQUIRED]) # Fail with error if hwloc is not found +# +# This module finds headers and hwloc library. +# Results are reported in variables: +# HWLOC_FOUND - True if headers and requested libraries were found +# HWLOC_INCLUDE_DIRS - hwloc include directories +# HWLOC_LIBRARY_DIRS - Link directories for hwloc libraries +# HWLOC_LIBRARIES - hwloc component libraries to be linked +# +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DHWLOC_DIR=path/to/hwloc): +# HWLOC_DIR - Where to find the base directory of hwloc +# HWLOC_INCDIR - Where to find the header files +# HWLOC_LIBDIR - Where to find the library files + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + + +if (NOT HWLOC_FOUND) + set(HWLOC_DIR "" CACHE PATH "Root directory of HWLOC library") + if (NOT HWLOC_FIND_QUIETLY) + message(STATUS "A cache variable, namely HWLOC_DIR, has been set to specify the install directory of HWLOC") + endif() +endif() + +# Optionally use pkg-config to detect include/library dirs (if pkg-config is available) +# ------------------------------------------------------------------------------------- +include(FindPkgConfig) +find_package(PkgConfig QUIET) +if(PKG_CONFIG_EXECUTABLE) + + pkg_search_module(HWLOC hwloc) + if (NOT HWLOC_FIND_QUIETLY) + if (HWLOC_FOUND AND HWLOC_LIBRARIES) + message(STATUS "Looking for HWLOC - found using PkgConfig") + #if(NOT HWLOC_INCLUDE_DIRS) + # message("${Magenta}HWLOC_INCLUDE_DIRS is empty using PkgConfig." + # "Perhaps the path to hwloc headers is already present in your" + # "C(PLUS)_INCLUDE_PATH environment variable.${ColourReset}") + #endif() + else() + message("${Magenta}Looking for HWLOC - not found using PkgConfig." + "Perhaps you should add the directory containing hwloc.pc to" + "the PKG_CONFIG_PATH environment variable.${ColourReset}") + endif() + endif() + +endif(PKG_CONFIG_EXECUTABLE) + +if( (NOT PKG_CONFIG_EXECUTABLE AND NOT HWLOC_FOUND) OR NOT HWLOC_FOUND ) + + if (NOT HWLOC_FIND_QUIETLY) + message(STATUS "Looking for HWLOC - PkgConfig not used") + endif() + + # Looking for include + # ------------------- + + # Add system include paths to search include + # ------------------------------------------ + unset(_inc_env) + if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") + else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + endif() + list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") + list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") + list(REMOVE_DUPLICATES _inc_env) + + # set paths where to look for + set(PATH_TO_LOOK_FOR "${_inc_env}") + + # Try to find the hwloc header in the given paths + # ------------------------------------------------- + # call cmake macro to find the header path + if(HWLOC_INCDIR) + set(HWLOC_hwloc.h_DIRS "HWLOC_hwloc.h_DIRS-NOTFOUND") + find_path(HWLOC_hwloc.h_DIRS + NAMES hwloc.h + HINTS ${HWLOC_INCDIR}) + else() + if(HWLOC_DIR) + set(HWLOC_hwloc.h_DIRS "HWLOC_hwloc.h_DIRS-NOTFOUND") + find_path(HWLOC_hwloc.h_DIRS + NAMES hwloc.h + HINTS ${HWLOC_DIR} + PATH_SUFFIXES include) + else() + set(HWLOC_hwloc.h_DIRS "HWLOC_hwloc.h_DIRS-NOTFOUND") + find_path(HWLOC_hwloc.h_DIRS + NAMES hwloc.h + HINTS ${PATH_TO_LOOK_FOR}) + endif() + endif() + mark_as_advanced(HWLOC_hwloc.h_DIRS) + + # Add path to cmake variable + # ------------------------------------ + if (HWLOC_hwloc.h_DIRS) + set(HWLOC_INCLUDE_DIRS "${HWLOC_hwloc.h_DIRS}") + else () + set(HWLOC_INCLUDE_DIRS "HWLOC_INCLUDE_DIRS-NOTFOUND") + if(NOT HWLOC_FIND_QUIETLY) + message(STATUS "Looking for hwloc -- hwloc.h not found") + endif() + endif () + + if (HWLOC_INCLUDE_DIRS) + list(REMOVE_DUPLICATES HWLOC_INCLUDE_DIRS) + endif () + + + # Looking for lib + # --------------- + + # Add system library paths to search lib + # -------------------------------------- + unset(_lib_env) + if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") + else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") + endif() + list(REMOVE_DUPLICATES _lib_env) + + # set paths where to look for + set(PATH_TO_LOOK_FOR "${_lib_env}") + + # Try to find the hwloc lib in the given paths + # ---------------------------------------------- + + # call cmake macro to find the lib path + if(HWLOC_LIBDIR) + set(HWLOC_hwloc_LIBRARY "HWLOC_hwloc_LIBRARY-NOTFOUND") + find_library(HWLOC_hwloc_LIBRARY + NAMES hwloc + HINTS ${HWLOC_LIBDIR}) + else() + if(HWLOC_DIR) + set(HWLOC_hwloc_LIBRARY "HWLOC_hwloc_LIBRARY-NOTFOUND") + find_library(HWLOC_hwloc_LIBRARY + NAMES hwloc + HINTS ${HWLOC_DIR} + PATH_SUFFIXES lib lib32 lib64) + else() + set(HWLOC_hwloc_LIBRARY "HWLOC_hwloc_LIBRARY-NOTFOUND") + find_library(HWLOC_hwloc_LIBRARY + NAMES hwloc + HINTS ${PATH_TO_LOOK_FOR}) + endif() + endif() + mark_as_advanced(HWLOC_hwloc_LIBRARY) + + # If found, add path to cmake variable + # ------------------------------------ + if (HWLOC_hwloc_LIBRARY) + get_filename_component(hwloc_lib_path ${HWLOC_hwloc_LIBRARY} PATH) + # set cmake variables (respects naming convention) + set(HWLOC_LIBRARIES "${HWLOC_hwloc_LIBRARY}") + set(HWLOC_LIBRARY_DIRS "${hwloc_lib_path}") + else () + set(HWLOC_LIBRARIES "HWLOC_LIBRARIES-NOTFOUND") + set(HWLOC_LIBRARY_DIRS "HWLOC_LIBRARY_DIRS-NOTFOUND") + if(NOT HWLOC_FIND_QUIETLY) + message(STATUS "Looking for hwloc -- lib hwloc not found") + endif() + endif () + + if (HWLOC_LIBRARY_DIRS) + list(REMOVE_DUPLICATES HWLOC_LIBRARY_DIRS) + endif () + + # check a function to validate the find + if(HWLOC_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # HWLOC + if (HWLOC_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${HWLOC_INCLUDE_DIRS}") + endif() + if (HWLOC_LIBRARY_DIRS) + set(REQUIRED_LIBDIRS "${HWLOC_LIBRARY_DIRS}") + endif() + set(REQUIRED_LIBS "${HWLOC_LIBRARIES}") + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + + # test link + unset(HWLOC_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(hwloc_topology_init HWLOC_WORKS) + mark_as_advanced(HWLOC_WORKS) + + if(NOT HWLOC_WORKS) + if(NOT HWLOC_FIND_QUIETLY) + message(STATUS "Looking for hwloc : test of hwloc_topology_init with hwloc library fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) + endif(HWLOC_LIBRARIES) + +endif( (NOT PKG_CONFIG_EXECUTABLE AND NOT HWLOC_FOUND) OR NOT HWLOC_FOUND ) + + +# check that HWLOC has been found +# ------------------------------- +include(FindPackageHandleStandardArgs) +if (PKG_CONFIG_EXECUTABLE AND HWLOC_FOUND) + find_package_handle_standard_args(HWLOC DEFAULT_MSG + HWLOC_LIBRARIES) +else() + find_package_handle_standard_args(HWLOC DEFAULT_MSG + HWLOC_LIBRARIES + HWLOC_WORKS) +endif() diff --git a/cmake_modules/morse/find/FindLAPACK.cmake b/cmake_modules/morse/find/FindLAPACK.cmake new file mode 100644 index 000000000..93f89b27d --- /dev/null +++ b/cmake_modules/morse/find/FindLAPACK.cmake @@ -0,0 +1,497 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find LAPACK library +# This module finds an installed fortran library that implements the LAPACK +# linear-algebra interface (see http://www.netlib.org/lapack/). +# +# The approach follows that taken for the autoconf macro file, acx_lapack.m4 +# (distributed at http://ac-archive.sourceforge.net/ac-archive/acx_lapack.html). +# +# This module sets the following variables: +# LAPACK_FOUND - set to true if a library implementing the LAPACK interface +# is found +# LAPACK_LINKER_FLAGS - uncached list of required linker flags (excluding -l +# and -L). +# LAPACK_LIBRARIES - uncached list of libraries (using full path name) to +# link against to use LAPACK +# LAPACK95_LIBRARIES - uncached list of libraries (using full path name) to +# link against to use LAPACK95 +# LAPACK95_FOUND - set to true if a library implementing the LAPACK f95 +# interface is found +# BLA_STATIC if set on this determines what kind of linkage we do (static) +# BLA_VENDOR if set checks only the specified vendor, if not set checks +# all the possibilities +# BLA_F95 if set on tries to find the f95 interfaces for BLAS/LAPACK +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DLAPACK_DIR=path/to/lapack): +# LAPACK_DIR - Where to find the base directory of lapack +# LAPACK_INCDIR - Where to find the header files +# LAPACK_LIBDIR - Where to find the library files +# Note that if BLAS_DIR is set, it will also look for lapack in it +### List of vendors (BLA_VENDOR) valid in this module +## Intel(mkl), ACML,Apple, NAS, Generic + +#============================================================================= +# Copyright 2007-2009 Kitware, Inc. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + + +# Set some colors +if(NOT WIN32) + string(ASCII 27 Esc) + set(ColourReset "${Esc}[m") + set(ColourBold "${Esc}[1m") + set(Red "${Esc}[31m") + set(Green "${Esc}[32m") + set(Yellow "${Esc}[33m") + set(Blue "${Esc}[34m") + set(Magenta "${Esc}[35m") + set(Cyan "${Esc}[36m") + set(White "${Esc}[37m") + set(BoldRed "${Esc}[1;31m") + set(BoldGreen "${Esc}[1;32m") + set(BoldYellow "${Esc}[1;33m") + set(BoldBlue "${Esc}[1;34m") + set(BoldMagenta "${Esc}[1;35m") + set(BoldCyan "${Esc}[1;36m") + set(BoldWhite "${Esc}[1;37m") +endif() + +## Some macros to print status when search for headers and libs +# This macro informs why the _lib_to_find file has not been found +macro(Print_Find_Library_Blas_Status _libname _lib_to_find) + + # save _libname upper/lower case + string(TOUPPER ${_libname} LIBNAME) + string(TOLOWER ${_libname} libname) + + # print status + #message(" ") + if(${LIBNAME}_LIBDIR) + message("${Yellow}${LIBNAME}_LIBDIR is defined but ${_lib_to_find}" + "has not been found in ${ARGN}${ColourReset}") + else() + if(${LIBNAME}_DIR) + message("${Yellow}${LIBNAME}_DIR is defined but ${_lib_to_find}" + "has not been found in ${ARGN}${ColourReset}") + else() + message("${Yellow}${_lib_to_find} not found." + "Nor ${LIBNAME}_DIR neither ${LIBNAME}_LIBDIR" + "are defined so that we look for ${_lib_to_find} in" + "system paths (Linux: LD_LIBRARY_PATH, Windows: LIB," + "Mac: DYLD_LIBRARY_PATH," + "CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES," + "CMAKE_C_IMPLICIT_LINK_DIRECTORIES)${ColourReset}") + if(_lib_env) + message("${Yellow}${_lib_to_find} has not been found in" + "${_lib_env}${ColourReset}") + endif() + endif() + endif() + message("${BoldYellow}Please indicate where to find ${_lib_to_find}. You have three options:\n" + "- Option 1: Provide the root directory of the library with cmake option: -D${LIBNAME}_DIR=your/path/to/${libname}/\n" + "- Option 2: Provide the directory where to find the library with cmake option: -D${LIBNAME}_LIBDIR=your/path/to/${libname}/lib/\n" + "- Option 3: Update your environment variable (Linux: LD_LIBRARY_PATH, Windows: LIB, Mac: DYLD_LIBRARY_PATH)\n" + "- Option 4: If your library provides a PkgConfig file, make sure pkg-config finds your library${ColourReset}") + +endmacro() + +if (NOT LAPACK_FOUND) + set(LAPACK_DIR "" CACHE PATH "Root directory of LAPACK library") + if (NOT LAPACK_FIND_QUIETLY) + message(STATUS "A cache variable, namely LAPACK_DIR, has been set to specify the install directory of LAPACK") + endif() +endif (NOT LAPACK_FOUND) + +option(LAPACK_VERBOSE "Print some additional information during LAPACK +libraries detection" OFF) +if (BLAS_VERBOSE) + set(LAPACK_VERBOSE ON) +endif () +set(_lapack_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + +get_property(_LANGUAGES_ GLOBAL PROPERTY ENABLED_LANGUAGES) +if (NOT _LANGUAGES_ MATCHES Fortran) +include(CheckFunctionExists) +else (NOT _LANGUAGES_ MATCHES Fortran) +include(CheckFortranFunctionExists) +endif (NOT _LANGUAGES_ MATCHES Fortran) + +set(LAPACK_FOUND FALSE) +set(LAPACK95_FOUND FALSE) + +# TODO: move this stuff to separate module + +macro(Check_Lapack_Libraries LIBRARIES _prefix _name _flags _list _blas _threads) +# This macro checks for the existence of the combination of fortran libraries +# given by _list. If the combination is found, this macro checks (using the +# Check_Fortran_Function_Exists macro) whether can link against that library +# combination using the name of a routine given by _name using the linker +# flags given by _flags. If the combination of libraries is found and passes +# the link test, LIBRARIES is set to the list of complete library paths that +# have been found. Otherwise, LIBRARIES is set to FALSE. + +# N.B. _prefix is the prefix applied to the names of all cached variables that +# are generated internally and marked advanced by this macro. + +set(_libraries_work TRUE) +set(${LIBRARIES}) +set(_combined_name) +if (NOT _libdir) + if (BLAS_DIR) + list(APPEND _libdir "${BLAS_DIR}") + list(APPEND _libdir "${BLAS_DIR}/lib") + if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + list(APPEND _libdir "${BLAS_DIR}/lib64") + list(APPEND _libdir "${BLAS_DIR}/lib/intel64") + else() + list(APPEND _libdir "${BLAS_DIR}/lib32") + list(APPEND _libdir "${BLAS_DIR}/lib/ia32") + endif() + endif () + if (BLAS_LIBDIR) + list(APPEND _libdir "${BLAS_LIBDIR}") + endif () + if (LAPACK_DIR) + list(APPEND _libdir "${LAPACK_DIR}") + list(APPEND _libdir "${LAPACK_DIR}/lib") + if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + list(APPEND _libdir "${LAPACK_DIR}/lib64") + list(APPEND _libdir "${LAPACK_DIR}/lib/intel64") + else() + list(APPEND _libdir "${LAPACK_DIR}/lib32") + list(APPEND _libdir "${LAPACK_DIR}/lib/ia32") + endif() + endif () + if (LAPACK_LIBDIR) + list(APPEND _libdir "${LAPACK_LIBDIR}") + endif () + if (WIN32) + string(REPLACE ":" ";" _libdir2 "$ENV{LIB}") + elseif (APPLE) + string(REPLACE ":" ";" _libdir2 "$ENV{DYLD_LIBRARY_PATH}") + else () + string(REPLACE ":" ";" _libdir2 "$ENV{LD_LIBRARY_PATH}") + endif () + list(APPEND _libdir "${_libdir2}") + list(APPEND _libdir "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _libdir "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") +endif () + +if (LAPACK_VERBOSE) + message("${Cyan}Try to find LAPACK libraries: ${_list}") +endif () + +foreach(_library ${_list}) + set(_combined_name ${_combined_name}_${_library}) + + if(_libraries_work) + if (BLA_STATIC) + if (WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif ( WIN32 ) + if (APPLE) + set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else (APPLE) + set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif (APPLE) + else (BLA_STATIC) + if (CMAKE_SYSTEM_NAME STREQUAL "Linux") + # for ubuntu's libblas3gf and liblapack3gf packages + set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .so.3gf) + endif () + endif (BLA_STATIC) + find_library(${_prefix}_${_library}_LIBRARY + NAMES ${_library} + HINTS ${_libdir} + ) + mark_as_advanced(${_prefix}_${_library}_LIBRARY) + # Print status if not found + # ------------------------- + if (NOT ${_prefix}_${_library}_LIBRARY AND NOT LAPACK_FIND_QUIETLY AND LAPACK_VERBOSE) + Print_Find_Library_Blas_Status(lapack ${_library} ${_libdir}) + endif () + set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY}) + set(_libraries_work ${${_prefix}_${_library}_LIBRARY}) + endif(_libraries_work) +endforeach(_library ${_list}) + +if(_libraries_work) + # Test this combination of libraries. + if(UNIX AND BLA_STATIC) + set(CMAKE_REQUIRED_LIBRARIES ${_flags} "-Wl,--start-group" ${${LIBRARIES}} ${_blas} "-Wl,--end-group" ${_threads}) + else(UNIX AND BLA_STATIC) + set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_blas} ${_threads}) + endif(UNIX AND BLA_STATIC) + if (LAPACK_VERBOSE) + message("${Cyan}LAPACK libs found. Try to compile symbol ${_name} with" + "following libraries: ${CMAKE_REQUIRED_LIBRARIES}") + endif () + if(NOT LAPACK_FOUND) + unset(${_prefix}${_combined_name}_WORKS CACHE) + endif() + if (NOT _LANGUAGES_ MATCHES Fortran) + check_function_exists("${_name}_" ${_prefix}${_combined_name}_WORKS) + else (NOT _LANGUAGES_ MATCHES Fortran) + check_fortran_function_exists(${_name} ${_prefix}${_combined_name}_WORKS) + endif (NOT _LANGUAGES_ MATCHES Fortran) + set(CMAKE_REQUIRED_LIBRARIES) + mark_as_advanced(${_prefix}${_combined_name}_WORKS) + set(_libraries_work ${${_prefix}${_combined_name}_WORKS}) +endif(_libraries_work) + + if(_libraries_work) + set(${LIBRARIES} ${${LIBRARIES}} ${_blas} ${_threads}) + else(_libraries_work) + set(${LIBRARIES} FALSE) + endif(_libraries_work) + +endmacro(Check_Lapack_Libraries) + + +set(LAPACK_LINKER_FLAGS) +set(LAPACK_LIBRARIES) +set(LAPACK95_LIBRARIES) + +if (NOT BLAS_FOUND) + if(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED) + find_package(BLAS) + else(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED) + find_package(BLAS REQUIRED) + endif(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED) +endif () + +if(BLAS_FOUND) + set(LAPACK_LINKER_FLAGS ${BLAS_LINKER_FLAGS}) + if ($ENV{BLA_VENDOR} MATCHES ".+") + set(BLA_VENDOR $ENV{BLA_VENDOR}) + else ($ENV{BLA_VENDOR} MATCHES ".+") + if(NOT BLA_VENDOR) + set(BLA_VENDOR "All") + endif(NOT BLA_VENDOR) + endif ($ENV{BLA_VENDOR} MATCHES ".+") + +if (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All") + if(NOT LAPACK_LIBRARIES) + check_lapack_libraries( + LAPACK_LIBRARIES + LAPACK + cheev + "" + "goto2" + "${BLAS_LIBRARIES}" + "" + ) + endif(NOT LAPACK_LIBRARIES) +endif (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All") + + +#acml lapack + if (BLA_VENDOR MATCHES "ACML.*" OR BLA_VENDOR STREQUAL "All") + if (BLAS_LIBRARIES MATCHES ".+acml.+") + set (LAPACK_LIBRARIES ${BLAS_LIBRARIES}) + endif () + endif () + +# Apple LAPACK library? +if (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All") + if(NOT LAPACK_LIBRARIES) + check_lapack_libraries( + LAPACK_LIBRARIES + LAPACK + cheev + "" + "Accelerate" + "${BLAS_LIBRARIES}" + "" + ) + endif(NOT LAPACK_LIBRARIES) +endif (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All") +if (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All") + if ( NOT LAPACK_LIBRARIES ) + check_lapack_libraries( + LAPACK_LIBRARIES + LAPACK + cheev + "" + "vecLib" + "${BLAS_LIBRARIES}" + "" + ) + endif ( NOT LAPACK_LIBRARIES ) +endif (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All") +# Generic LAPACK library? +if (BLA_VENDOR STREQUAL "Generic" OR + BLA_VENDOR STREQUAL "ATLAS" OR + BLA_VENDOR STREQUAL "All") + if ( NOT LAPACK_LIBRARIES ) + check_lapack_libraries( + LAPACK_LIBRARIES + LAPACK + cheev + "" + "lapack" + "${BLAS_LIBRARIES}" + "" + ) + endif ( NOT LAPACK_LIBRARIES ) +endif () +#intel lapack +if (BLA_VENDOR MATCHES "Intel" OR BLA_VENDOR STREQUAL "All") + if (NOT WIN32) + set(LM "-lm") + endif () + if (_LANGUAGES_ MATCHES C OR _LANGUAGES_ MATCHES CXX) + if(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED) + find_PACKAGE(Threads) + else() + find_package(Threads REQUIRED) + endif() + + set(LAPACK_SEARCH_LIBS "") + + if (BLA_F95) + set(LAPACK_mkl_SEARCH_SYMBOL "CHEEV") + set(_LIBRARIES LAPACK95_LIBRARIES) + set(_BLAS_LIBRARIES ${BLAS95_LIBRARIES}) + + # old + list(APPEND LAPACK_SEARCH_LIBS + "mkl_lapack95") + # new >= 10.3 + list(APPEND LAPACK_SEARCH_LIBS + "mkl_intel_c") + list(APPEND LAPACK_SEARCH_LIBS + "mkl_intel_lp64") + else() + set(LAPACK_mkl_SEARCH_SYMBOL "cheev") + set(_LIBRARIES LAPACK_LIBRARIES) + set(_BLAS_LIBRARIES ${BLAS_LIBRARIES}) + + # old + list(APPEND LAPACK_SEARCH_LIBS + "mkl_lapack") + # new >= 10.3 + list(APPEND LAPACK_SEARCH_LIBS + "mkl_gf_lp64") + endif() + + # First try empty lapack libs + if (NOT ${_LIBRARIES}) + check_lapack_libraries( + ${_LIBRARIES} + BLAS + ${LAPACK_mkl_SEARCH_SYMBOL} + "" + "" + "${_BLAS_LIBRARIES}" + "${CMAKE_THREAD_LIBS_INIT};${LM}" + ) + endif () + # Then try the search libs + foreach (IT ${LAPACK_SEARCH_LIBS}) + if (NOT ${_LIBRARIES}) + check_lapack_libraries( + ${_LIBRARIES} + BLAS + ${LAPACK_mkl_SEARCH_SYMBOL} + "" + "${IT}" + "${_BLAS_LIBRARIES}" + "${CMAKE_THREAD_LIBS_INIT};${LM}" + ) + endif () + endforeach () + endif () +endif() +else(BLAS_FOUND) + message(STATUS "LAPACK requires BLAS") +endif(BLAS_FOUND) + +if(BLA_F95) + if(LAPACK95_LIBRARIES) + set(LAPACK95_FOUND TRUE) + else(LAPACK95_LIBRARIES) + set(LAPACK95_FOUND FALSE) + endif(LAPACK95_LIBRARIES) + if(NOT LAPACK_FIND_QUIETLY) + if(LAPACK95_FOUND) + message(STATUS "A library with LAPACK95 API found.") + message(STATUS "LAPACK_LIBRARIES ${LAPACK_LIBRARIES}") + else(LAPACK95_FOUND) + message(WARNING "BLA_VENDOR has been set to ${BLA_VENDOR} but LAPACK 95 libraries could not be found or check of symbols failed." + "\nPlease indicate where to find LAPACK libraries. You have three options:\n" + "- Option 1: Provide the root directory of LAPACK library with cmake option: -DLAPACK_DIR=your/path/to/lapack\n" + "- Option 2: Provide the directory where to find BLAS libraries with cmake option: -DBLAS_LIBDIR=your/path/to/blas/libs\n" + "- Option 3: Update your environment variable (Linux: LD_LIBRARY_PATH, Windows: LIB, Mac: DYLD_LIBRARY_PATH)\n" + "\nTo follow libraries detection more precisely you can activate a verbose mode with -DLAPACK_VERBOSE=ON at cmake configure." + "\nYou could also specify a BLAS vendor to look for by setting -DBLA_VENDOR=blas_vendor_name." + "\nList of possible BLAS vendor: Goto, ATLAS PhiPACK, CXML, DXML, SunPerf, SCSL, SGIMATH, IBMESSL, Intel10_32 (intel mkl v10 32 bit)," + "Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model), Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model)," + "Intel( older versions of mkl 32 and 64 bit), ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic") + if(LAPACK_FIND_REQUIRED) + message(FATAL_ERROR + "A required library with LAPACK95 API not found. Please specify library location." + ) + else(LAPACK_FIND_REQUIRED) + message(STATUS + "A library with LAPACK95 API not found. Please specify library location." + ) + endif(LAPACK_FIND_REQUIRED) + endif(LAPACK95_FOUND) + endif(NOT LAPACK_FIND_QUIETLY) + set(LAPACK_FOUND "${LAPACK95_FOUND}") + set(LAPACK_LIBRARIES "${LAPACK95_LIBRARIES}") +else(BLA_F95) + if(LAPACK_LIBRARIES) + set(LAPACK_FOUND TRUE) + else(LAPACK_LIBRARIES) + set(LAPACK_FOUND FALSE) + endif(LAPACK_LIBRARIES) + + if(NOT LAPACK_FIND_QUIETLY) + if(LAPACK_FOUND) + message(STATUS "A library with LAPACK API found.") + message(STATUS "LAPACK_LIBRARIES ${LAPACK_LIBRARIES}") + else(LAPACK_FOUND) + message(WARNING "BLA_VENDOR has been set to ${BLA_VENDOR} but LAPACK libraries could not be found or check of symbols failed." + "\nPlease indicate where to find LAPACK libraries. You have three options:\n" + "- Option 1: Provide the root directory of LAPACK library with cmake option: -DLAPACK_DIR=your/path/to/lapack\n" + "- Option 2: Provide the directory where to find BLAS libraries with cmake option: -DBLAS_LIBDIR=your/path/to/blas/libs\n" + "- Option 3: Update your environment variable (Linux: LD_LIBRARY_PATH, Windows: LIB, Mac: DYLD_LIBRARY_PATH)\n" + "\nTo follow libraries detection more precisely you can activate a verbose mode with -DLAPACK_VERBOSE=ON at cmake configure." + "\nYou could also specify a BLAS vendor to look for by setting -DBLA_VENDOR=blas_vendor_name." + "\nList of possible BLAS vendor: Goto, ATLAS PhiPACK, CXML, DXML, SunPerf, SCSL, SGIMATH, IBMESSL, Intel10_32 (intel mkl v10 32 bit)," + "Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model), Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model)," + "Intel( older versions of mkl 32 and 64 bit), ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic") + if(LAPACK_FIND_REQUIRED) + message(FATAL_ERROR + "A required library with LAPACK API not found. Please specify library location." + ) + else(LAPACK_FIND_REQUIRED) + message(STATUS + "A library with LAPACK API not found. Please specify library location." + ) + endif(LAPACK_FIND_REQUIRED) + endif(LAPACK_FOUND) + endif(NOT LAPACK_FIND_QUIETLY) +endif(BLA_F95) + +set(CMAKE_FIND_LIBRARY_SUFFIXES ${_lapack_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) diff --git a/cmake_modules/morse/find/FindLAPACKE.cmake b/cmake_modules/morse/find/FindLAPACKE.cmake new file mode 100644 index 000000000..894a18c09 --- /dev/null +++ b/cmake_modules/morse/find/FindLAPACKE.cmake @@ -0,0 +1,333 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find LAPACKE include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(LAPACKE +# [REQUIRED] # Fail with error if lapacke is not found +# [COMPONENTS <comp1> <comp2> ...] # dependencies +# ) +# +# LAPACKE depends on the following libraries: +# - LAPACK +# +# COMPONENTS are optional libraries LAPACKE could be linked with, +# Use it to drive detection of a specific compilation chain +# COMPONENTS available: +# - LAPACKEXT: to activate detection of LAPACK with LAPACKEXT cmake module +# +# This module finds headers and lapacke library. +# Results are reported in variables: +# LAPACKE_FOUND - True if headers and requested libraries were found +# LAPACKE_INCLUDE_DIRS - lapacke include directories +# LAPACKE_LIBRARY_DIRS - Link directories for lapacke libraries +# LAPACKE_LIBRARIES - lapacke component libraries to be linked +# LAPACKE_INCLUDE_DIRS_DEP - lapacke + dependencies include directories +# LAPACKE_LIBRARY_DIRS_DEP - lapacke + dependencies link directories +# LAPACKE_LIBRARIES_DEP - lapacke libraries + dependencies +# +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DLAPACKE_DIR=path/to/lapacke): +# LAPACKE_DIR - Where to find the base directory of lapacke +# LAPACKE_INCDIR - Where to find the header files +# LAPACKE_LIBDIR - Where to find the library files +# +# LAPACKE could be directly embedded in LAPACK library (ex: Intel MKL) so that +# we test a lapacke function with the lapack libraries found and set LAPACKE +# variables to LAPACK ones if test is successful. To skip this feature and +# look for a stand alone lapacke, please add the following in your +# CMakeLists.txt before to call find_package(LAPACKE): +# set(LAPACKE_STANDALONE TRUE) + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + +if (NOT LAPACKE_FOUND) + set(LAPACKE_DIR "" CACHE PATH "Root directory of LAPACKE library") + if (NOT LAPACKE_FIND_QUIETLY) + message(STATUS "A cache variable, namely LAPACKE_DIR, has been set to specify the install directory of LAPACKE") + endif() +endif() + +# LAPACKE depends on LAPACKEXT +# try to find it specified as COMPONENTS during the call +if (LAPACKE_FIND_COMPONENTS) + foreach( component ${LAPACKE_FIND_COMPONENTS} ) + if(LAPACKE_FIND_REQUIRED_${component}) + find_package(${component} REQUIRED) + else() + find_package(${component}) + endif() + if(${component}_FOUND) + set(LAPACKE_${component}_FOUND TRUE) + else() + set(LAPACKE_${component}_FOUND FALSE) + endif() + endforeach() +endif () + +# LAPACKE depends on LAPACK anyway, try to find it +if (NOT LAPACK_FOUND) + if(LAPACKE_FIND_REQUIRED) + find_package(LAPACK REQUIRED) + else() + find_package(LAPACK) + endif() +endif() + +# LAPACKE depends on LAPACK +if (LAPACK_FOUND) + + if (NOT LAPACKE_STANDALONE) + # check if a lapacke function exists in the LAPACK lib + include(CheckFunctionExists) + set(CMAKE_REQUIRED_LIBRARIES "${LAPACK_LIBRARIES}") + unset(LAPACKE_WORKS CACHE) + check_function_exists(LAPACKE_dgeqrf LAPACKE_WORKS) + mark_as_advanced(LAPACKE_WORKS) + set(CMAKE_REQUIRED_LIBRARIES) + + if(LAPACKE_WORKS) + if(NOT LAPACKE_FIND_QUIETLY) + message(STATUS "Looking for lapacke: test with lapack succeeds") + endif() + # test succeeds: LAPACKE is in LAPACK + set(LAPACKE_LIBRARIES "${LAPACK_LIBRARIES}") + set(LAPACKE_LIBRARY_DIRS "${LAPACK_LIBRARY_DIRS}") + if(LAPACK_INCLUDE_DIRS) + set(LAPACKE_INCLUDE_DIRS "${LAPACK_INCLUDE_DIRS}") + endif() + endif() + endif (NOT LAPACKE_STANDALONE) + + if (LAPACKE_STANDALONE OR NOT LAPACKE_WORKS) + + if(NOT LAPACKE_WORKS AND NOT LAPACKE_FIND_QUIETLY) + message(STATUS "Looking for lapacke : test with lapack fails") + endif() + # test fails: try to find LAPACKE lib exterior to LAPACK + + # Try to find LAPACKE lib + ####################### + + # Looking for include + # ------------------- + + # Add system include paths to search include + # ------------------------------------------ + unset(_inc_env) + if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") + else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + endif() + list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") + list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") + list(REMOVE_DUPLICATES _inc_env) + + + # Try to find the lapacke header in the given paths + # ------------------------------------------------- + # call cmake macro to find the header path + if(LAPACKE_INCDIR) + set(LAPACKE_lapacke.h_DIRS "LAPACKE_lapacke.h_DIRS-NOTFOUND") + find_path(LAPACKE_lapacke.h_DIRS + NAMES lapacke.h + HINTS ${LAPACKE_INCDIR}) + else() + if(LAPACKE_DIR) + set(LAPACKE_lapacke.h_DIRS "LAPACKE_lapacke.h_DIRS-NOTFOUND") + find_path(LAPACKE_lapacke.h_DIRS + NAMES lapacke.h + HINTS ${LAPACKE_DIR} + PATH_SUFFIXES include) + else() + set(LAPACKE_lapacke.h_DIRS "LAPACKE_lapacke.h_DIRS-NOTFOUND") + find_path(LAPACKE_lapacke.h_DIRS + NAMES lapacke.h + HINTS ${_inc_env}) + endif() + endif() + mark_as_advanced(LAPACKE_lapacke.h_DIRS) + + # If found, add path to cmake variable + # ------------------------------------ + if (LAPACKE_lapacke.h_DIRS) + set(LAPACKE_INCLUDE_DIRS "${LAPACKE_lapacke.h_DIRS}") + else () + set(LAPACKE_INCLUDE_DIRS "LAPACKE_INCLUDE_DIRS-NOTFOUND") + if(NOT LAPACKE_FIND_QUIETLY) + message(STATUS "Looking for lapacke -- lapacke.h not found") + endif() + endif() + + + # Looking for lib + # --------------- + + # Add system library paths to search lib + # -------------------------------------- + unset(_lib_env) + if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") + else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") + endif() + list(REMOVE_DUPLICATES _lib_env) + + # Try to find the lapacke lib in the given paths + # ---------------------------------------------- + + # call cmake macro to find the lib path + if(LAPACKE_LIBDIR) + set(LAPACKE_lapacke_LIBRARY "LAPACKE_lapacke_LIBRARY-NOTFOUND") + find_library(LAPACKE_lapacke_LIBRARY + NAMES lapacke + HINTS ${LAPACKE_LIBDIR}) + else() + if(LAPACKE_DIR) + set(LAPACKE_lapacke_LIBRARY "LAPACKE_lapacke_LIBRARY-NOTFOUND") + find_library(LAPACKE_lapacke_LIBRARY + NAMES lapacke + HINTS ${LAPACKE_DIR} + PATH_SUFFIXES lib lib32 lib64) + else() + set(LAPACKE_lapacke_LIBRARY "LAPACKE_lapacke_LIBRARY-NOTFOUND") + find_library(LAPACKE_lapacke_LIBRARY + NAMES lapacke + HINTS ${_lib_env}) + endif() + endif() + mark_as_advanced(LAPACKE_lapacke_LIBRARY) + + # If found, add path to cmake variable + # ------------------------------------ + if (LAPACKE_lapacke_LIBRARY) + get_filename_component(lapacke_lib_path "${LAPACKE_lapacke_LIBRARY}" PATH) + # set cmake variables + set(LAPACKE_LIBRARIES "${LAPACKE_lapacke_LIBRARY}") + set(LAPACKE_LIBRARY_DIRS "${lapacke_lib_path}") + else () + set(LAPACKE_LIBRARIES "LAPACKE_LIBRARIES-NOTFOUND") + set(LAPACKE_LIBRARY_DIRS "LAPACKE_LIBRARY_DIRS-NOTFOUND") + if (NOT LAPACKE_FIND_QUIETLY) + message(STATUS "Looking for lapacke -- lib lapacke not found") + endif() + endif () + + # check a function to validate the find + if(LAPACKE_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # LAPACKE + if (LAPACKE_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${LAPACKE_INCLUDE_DIRS}") + endif() + if (LAPACKE_LIBRARY_DIRS) + set(REQUIRED_LIBDIRS "${LAPACKE_LIBRARY_DIRS}") + endif() + set(REQUIRED_LIBS "${LAPACKE_LIBRARIES}") + # LAPACK + if (LAPACK_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${LAPACK_INCLUDE_DIRS}") + endif() + if (LAPACK_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${LAPACK_LIBRARY_DIRS}") + endif() + list(APPEND REQUIRED_LIBS "${LAPACK_LIBRARIES}") + # Fortran + if (CMAKE_Fortran_COMPILER MATCHES ".+gfortran.*") + list(APPEND CMAKE_REQUIRED_LIBRARIES "-lgfortran") + elseif (CMAKE_Fortran_COMPILER MATCHES ".+ifort.*") + list(APPEND CMAKE_REQUIRED_LIBRARIES "-lifcore") + endif() + # m + list(APPEND REQUIRED_LIBS "-lm") + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + + # test link + unset(LAPACKE_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(LAPACKE_dgeqrf LAPACKE_WORKS) + mark_as_advanced(LAPACKE_WORKS) + + if(LAPACKE_WORKS) + # save link with dependencies + set(LAPACKE_LIBRARIES_DEP "${REQUIRED_LIBS}") + set(LAPACKE_LIBRARY_DIRS_DEP "${REQUIRED_LIBDIRS}") + set(LAPACKE_INCLUDE_DIRS_DEP "${REQUIRED_INCDIRS}") + else() + if(NOT LAPACKE_FIND_QUIETLY) + message(STATUS "Looking for lapacke: test of LAPACKE_dgeqrf with lapacke and lapack libraries fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) + endif(LAPACKE_LIBRARIES) + + endif (LAPACKE_STANDALONE OR NOT LAPACKE_WORKS) + +else(LAPACK_FOUND) + + if (NOT LAPACKE_FIND_QUIETLY) + message(STATUS "LAPACKE requires LAPACK but LAPACK has not been found." + "Please look for LAPACK first.") + endif() + +endif(LAPACK_FOUND) + + +# check that LAPACKE has been found +# --------------------------------- +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LAPACKE DEFAULT_MSG + LAPACKE_LIBRARIES + LAPACKE_WORKS) diff --git a/cmake_modules/morse/find/FindLAPACKEXT.cmake b/cmake_modules/morse/find/FindLAPACKEXT.cmake new file mode 100644 index 000000000..dc608cc74 --- /dev/null +++ b/cmake_modules/morse/find/FindLAPACKEXT.cmake @@ -0,0 +1,296 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find LAPACK EXTENDED for MORSE projects: find include dirs and libraries +# +# This module allows to find LAPACK libraries by calling the official FindLAPACK module +# and handles the creation of different library lists whether the user wishes to link +# with a sequential LAPACK or a multihreaded (LAPACK_SEQ_LIBRARIES and LAPACK_PAR_LIBRARIES). +# LAPACK is detected with a FindLAPACK call then if the LAPACK vendor is in the following list, +# Intel mkl, Goto, Openlapack, ACML, IBMESSL +# then the module tries find the corresponding multithreaded libraries +# LAPACK_LIBRARIES does not exists anymore. +# +# The following variables have been added to manage links with sequential or multithreaded +# versions: +# LAPACK_INCLUDE_DIRS - LAPACK include directories +# LAPACK_LIBRARY_DIRS - Link directories for LAPACK libraries +# LAPACK_SEQ_LIBRARIES - LAPACK component libraries to be linked (sequential) +# LAPACK_PAR_LIBRARIES - LAPACK component libraries to be linked (multithreaded) + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + + +# LAPACKEXT depends on BLASEXT +# call our extended module for BLAS +#---------------------------------- +if (NOT BLAS_FOUND) + if(LAPACKEXT_FIND_REQUIRED) + find_package(BLASEXT REQUIRED) + else() + find_package(BLASEXT) + endif() +endif () + + +if(BLA_VENDOR MATCHES "Intel*") + + ### + # look for include path if the LAPACK vendor is Intel + ### + + # gather system include paths + unset(_inc_env) + if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") + else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + endif() + list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") + list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") + list(REMOVE_DUPLICATES _inc_env) + + if (BLAS_DIR) + set(LAPACK_DIR ${BLAS_DIR}) + endif () + if (BLAS_INCDIR) + set(LAPACK_INCDIR ${BLAS_INCDIR}) + endif () + # find mkl.h inside known include paths + set(LAPACK_mkl_lapack.h_INCLUDE_DIRS "LAPACK_mkl_lapack.h_INCLUDE_DIRS-NOTFOUND") + if(LAPACK_INCDIR) + find_path(LAPACK_mkl_lapack.h_INCLUDE_DIRS + NAMES mkl_lapack.h + HINTS ${LAPACK_INCDIR}) + else() + if(LAPACK_DIR) + find_path(LAPACK_mkl_lapack.h_INCLUDE_DIRS + NAMES mkl_lapack.h + HINTS ${LAPACK_DIR} + PATH_SUFFIXES include) + else() + find_path(LAPACK_mkl_lapack.h_INCLUDE_DIRS + NAMES mkl_lapack.h + HINTS ${_inc_env}) + endif() + endif() + mark_as_advanced(LAPACK_mkl_lapack.h_INCLUDE_DIRS) + ## Print status if not found + ## ------------------------- + #if (NOT LAPACK_mkl_lapack.h_INCLUDE_DIRS) + # Print_Find_Header_Status(lapack mkl_lapack.h) + #endif () + set(LAPACK_INCLUDE_DIRS "") + if(LAPACK_mkl_lapack.h_INCLUDE_DIRS) + list(APPEND LAPACK_INCLUDE_DIRS "${LAPACK_mkl_lapack.h_INCLUDE_DIRS}" ) + endif() + + ### + # look for libs + ### + + if (BLA_VENDOR MATCHES "Intel10_64lp*") + ## look for the sequential version + set(BLA_VENDOR "Intel10_64lp_seq") + endif() + + if(LAPACKEXT_FIND_REQUIRED) + find_package(LAPACK REQUIRED) + else() + find_package(LAPACK) + endif() + + if (LAPACK_FOUND) + if(BLAS_SEQ_LIBRARIES) + set(LAPACK_SEQ_LIBRARIES "${BLAS_SEQ_LIBRARIES}") + else() + set(LAPACK_SEQ_LIBRARIES "${LAPACK_SEQ_LIBRARIES-NOTFOUND}") + endif() + # if BLAS Intel 10 64 bit -> save sequential and multithreaded versions + if(BLA_VENDOR MATCHES "Intel10_64lp*") + if(BLAS_PAR_LIBRARIES) + set(LAPACK_PAR_LIBRARIES "${BLAS_PAR_LIBRARIES}") + else() + set(LAPACK_PAR_LIBRARIES "${LAPACK_PAR_LIBRARIES-NOTFOUND}") + endif() + endif() + endif() + +elseif(BLA_VENDOR MATCHES "ACML*") + + ### + # look for libs + ### + if(LAPACKEXT_FIND_REQUIRED) + find_package(LAPACK REQUIRED) + else() + find_package(LAPACK) + endif() + + if (LAPACK_FOUND) + if(BLAS_SEQ_LIBRARIES) + set(LAPACK_SEQ_LIBRARIES "${BLAS_SEQ_LIBRARIES}") + else() + set(LAPACK_SEQ_LIBRARIES "${LAPACK_SEQ_LIBRARIES-NOTFOUND}") + endif() + if(BLAS_PAR_LIBRARIES) + set(LAPACK_PAR_LIBRARIES "${BLAS_PAR_LIBRARIES}") + else() + set(LAPACK_PAR_LIBRARIES "${LAPACK_PAR_LIBRARIES-NOTFOUND}") + endif() + endif() + +else() + + ## look for a sequential version + # call to the cmake official FindLAPACK module + # This module sets the following variables: + # LAPACK_FOUND - set to true if a library implementing the LAPACK interface + # is found + # LAPACK_LINKER_FLAGS - uncached list of required linker flags (excluding -l + # and -L). + # LAPACK_LIBRARIES - uncached list of libraries (using full path name) to + # link against to use LAPACK + # LAPACK95_LIBRARIES - uncached list of libraries (using full path name) + # to link against to use LAPACK95 interface + # LAPACK95_FOUND - set to true if a library implementing the LAPACK f95 interface + # is found + # BLA_STATIC if set on this determines what kind of linkage we do (static) + # BLA_VENDOR if set checks only the specified vendor, if not set checks + # all the possibilities + # BLA_F95 if set on tries to find the f95 interfaces for LAPACK/LAPACK + # Remark: it looks only into paths contained in the system environment variables + if(LAPACKEXT_FIND_REQUIRED) + find_package(LAPACK REQUIRED) + else() + find_package(LAPACK) + endif() + + if(LAPACK_FOUND) + set(LAPACK_SEQ_LIBRARIES "${LAPACK_LIBRARIES}") + else() + set(LAPACK_SEQ_LIBRARIES "${LAPACK_SEQ_LIBRARIES-NOTFOUND}") + endif() + set(BLAS_PAR_LIBRARIES "${BLAS_PAR_LIBRARIES-NOTFOUND}") + +endif() + +if (LAPACK_SEQ_LIBRARIES) + set(LAPACK_LIBRARIES "${LAPACK_SEQ_LIBRARIES}") +endif() + +# extract libs paths +# remark: because it is not given by find_package(LAPACK) +set(LAPACK_LIBRARY_DIRS "") +foreach(lapack_lib ${LAPACK_LIBRARIES}) + get_filename_component(a_lapack_lib_dir "${lapack_lib}" PATH) + list(APPEND LAPACK_LIBRARY_DIRS "${a_lapack_lib_dir}" ) +endforeach() +if (LAPACK_LIBRARY_DIRS) + list(REMOVE_DUPLICATES LAPACK_LIBRARY_DIRS) +endif () + + +# message(STATUS "LAPACK_FOUND: ${LAPACK_FOUND}") +# message(STATUS "LAPACK_VENDOR: ${LAPACK_VENDOR}") +# message(STATUS "LAPACK_LIBRARIES: ${LAPACK_LIBRARIES}") +# message(STATUS "LAPACK_SEQ_LIBRARIES: ${LAPACK_SEQ_LIBRARIES}") +# message(STATUS "LAPACK_PAR_LIBRARIES: ${LAPACK_PAR_LIBRARIES}") +# message(STATUS "LAPACK_INCLUDE_DIRS: ${LAPACK_INCLUDE_DIRS}") +# message(STATUS "LAPACK_LIBRARY_DIRS: ${LAPACK_LIBRARY_DIRS}") + +# check that LAPACK has been found +# --------------------------------- +include(FindPackageHandleStandardArgs) +if(BLA_VENDOR MATCHES "Intel*") + if(BLA_VENDOR MATCHES "Intel10_64lp*") + if(NOT LAPACKEXT_FIND_QUIETLY) + message(STATUS "LAPACK found is Intel MKL:" + "we manage two lists of libs," + " one sequential and one parallel (see" + "LAPACK_SEQ_LIBRARIES and LAPACK_PAR_LIBRARIES)") + message(STATUS "LAPACK sequential libraries stored in" + "LAPACK_SEQ_LIBRARIES") + endif() + find_package_handle_standard_args(LAPACK DEFAULT_MSG + LAPACK_SEQ_LIBRARIES + LAPACK_LIBRARY_DIRS + LAPACK_INCLUDE_DIRS) + if(LAPACK_PAR_LIBRARIES) + if(NOT LAPACKEXT_FIND_QUIETLY) + message(STATUS "LAPACK parallel libraries stored in" + "LAPACK_PAR_LIBRARIES") + endif() + find_package_handle_standard_args(LAPACK DEFAULT_MSG + LAPACK_PAR_LIBRARIES) + endif() + + else() + if(NOT LAPACKEXT_FIND_QUIETLY) + message(STATUS "LAPACK sequential libraries stored in" + "LAPACK_SEQ_LIBRARIES") + endif() + find_package_handle_standard_args(LAPACK DEFAULT_MSG + LAPACK_SEQ_LIBRARIES + LAPACK_LIBRARY_DIRS + LAPACK_INCLUDE_DIRS) + endif() +elseif(BLA_VENDOR MATCHES "ACML*") + if(NOT LAPACKEXT_FIND_QUIETLY) + message(STATUS "LAPACK found is ACML:" + "we manage two lists of libs," + " one sequential and one parallel (see" + "LAPACK_SEQ_LIBRARIES and LAPACK_PAR_LIBRARIES)") + message(STATUS "LAPACK sequential libraries stored in" + "LAPACK_SEQ_LIBRARIES") + endif() + find_package_handle_standard_args(LAPACK DEFAULT_MSG + LAPACK_SEQ_LIBRARIES + LAPACK_LIBRARY_DIRS + LAPACK_INCLUDE_DIRS) + if(LAPACK_PAR_LIBRARIES) + if(NOT LAPACKEXT_FIND_QUIETLY) + message(STATUS "LAPACK parallel libraries stored in" + "LAPACK_PAR_LIBRARIES") + endif() + find_package_handle_standard_args(LAPACK DEFAULT_MSG + LAPACK_PAR_LIBRARIES) + endif() +else() + if(NOT LAPACKEXT_FIND_QUIETLY) + message(STATUS "LAPACK sequential libraries stored in" + "LAPACK_SEQ_LIBRARIES") + endif() + find_package_handle_standard_args(LAPACK DEFAULT_MSG + LAPACK_SEQ_LIBRARIES + LAPACK_LIBRARY_DIRS) +endif() diff --git a/cmake_modules/morse/find/FindMAGMA.cmake b/cmake_modules/morse/find/FindMAGMA.cmake new file mode 100644 index 000000000..2c0734128 --- /dev/null +++ b/cmake_modules/morse/find/FindMAGMA.cmake @@ -0,0 +1,372 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find MAGMA include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(MAGMA +# [REQUIRED] # Fail with error if magma is not found +# [COMPONENTS <comp1> <comp2> ...] # dependencies +# ) +# +# MAGMA depends on the following libraries: +# - CUDA/cuBLAS +# - LAPACK +# - CBLAS +# +# COMPONENTS are optional libraries MAGMA could be linked with, +# Use it to drive detection of a specific compilation chain +# COMPONENTS can be some of the following: +# - no components are available for now: maybe PLASMA in the future? +# +# Results are reported in variables: +# MAGMA_FOUND - True if headers and requested libraries were found +# MAGMA_INCLUDE_DIRS - magma include directories +# MAGMA_LIBRARY_DIRS - Link directories for magma libraries +# MAGMA_LIBRARIES - magma libraries +# MAGMA_INCLUDE_DIRS_DEP - magma + dependencies include directories +# MAGMA_LIBRARY_DIRS_DEP - magma + dependencies link directories +# MAGMA_LIBRARIES_DEP - magma libraries + dependencies +# +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DMAGMA_DIR=path/to/magma): +# MAGMA_DIR - Where to find the base directory of magma +# MAGMA_INCDIR - Where to find the header files +# MAGMA_LIBDIR - Where to find the library files +# +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + + +if(NOT MAGMA_FOUND) + set(MAGMA_DIR "" CACHE PATH "Root directory of MAGMA library") + if (NOT MAGMA_FIND_QUIETLY) + message(STATUS "A cache variable, namely MAGMA_DIR, has been set to specify the install directory of MAGMA") + endif() +endif(NOT MAGMA_FOUND) + +# MAGMA depends on CUDA anyway, try to find it +if (NOT CUDA_FOUND) + if(MAGMA_FIND_REQUIRED) + find_package(CUDA REQUIRED) + else() + find_package(CUDA) + endif() +endif() +# MAGMA depends on cuBLAS which should come with CUDA, if not found -> error +if (NOT CUDA_CUBLAS_LIBRARIES) + if(MAGMA_FIND_REQUIRED) + message(FATAL_ERROR "Looking for MAGMA - MAGMA depends on cuBLAS which has " + "not been found (should come with cuda install)") + endif() +endif() +# MAGMA depends on LAPACK anyway, try to find it +if (NOT LAPACK_FOUND) + if(MAGMA_FIND_REQUIRED) + find_package(LAPACK REQUIRED) + else() + find_package(LAPACK) + endif() +endif() +# MAGMA depends on CBLAS anyway, try to find it +if (NOT CBLAS_FOUND) + if(MAGMA_FIND_REQUIRED) + find_package(CBLAS REQUIRED) + else() + find_package(CBLAS) + endif() +endif() + +# Optionally use pkg-config to detect include/library dirs (if pkg-config is available) +# ------------------------------------------------------------------------------------- +include(FindPkgConfig) +find_package(PkgConfig QUIET) +if(PKG_CONFIG_EXECUTABLE) + + pkg_search_module(MAGMA magma) + if (NOT MAGMA_FIND_QUIETLY) + if (MAGMA_FOUND AND MAGMA_LIBRARIES) + message(STATUS "Looking for MAGMA - found using PkgConfig") + #if(NOT MAGMA_INCLUDE_DIRS) + # message("${Magenta}MAGMA_INCLUDE_DIRS is empty using PkgConfig." + # "Perhaps the path to magma headers is already present in your" + # "C(PLUS)_INCLUDE_PATH environment variable.${ColourReset}") + #endif() + else() + message("${Magenta}Looking for MAGMA - not found using PkgConfig. " + "Perhaps you should add the directory containing magma.pc " + "to the PKG_CONFIG_PATH environment variable.${ColourReset}") + endif() + endif() + + if (MAGMA_FIND_VERSION_EXACT) + if( NOT (MAGMA_FIND_VERSION_MAJOR STREQUAL MAGMA_VERSION_MAJOR) OR + NOT (MAGMA_FIND_VERSION_MINOR STREQUAL MAGMA_VERSION_MINOR) ) + if(NOT MAGMA_FIND_QUIETLY) + message(FATAL_ERROR + "MAGMA version found is ${MAGMA_VERSION_STRING} " + "when required is ${MAGMA_FIND_VERSION}") + endif() + endif() + else() + # if the version found is older than the required then error + if( (MAGMA_FIND_VERSION_MAJOR STRGREATER MAGMA_VERSION_MAJOR) OR + (MAGMA_FIND_VERSION_MINOR STRGREATER MAGMA_VERSION_MINOR) ) + if(NOT MAGMA_FIND_QUIETLY) + message(FATAL_ERROR + "MAGMA version found is ${MAGMA_VERSION_STRING} " + "when required is ${MAGMA_FIND_VERSION} or newer") + endif() + endif() + endif() + + # if pkg-config is used: these variables are empty + # the pkg_search_module call will set the following: + # MAGMA_LDFLAGS: all required linker flags + # MAGMA_CFLAGS: all required cflags + set(MAGMA_INCLUDE_DIRS_DEP "") + set(MAGMA_LIBRARY_DIRS_DEP "") + set(MAGMA_LIBRARIES_DEP "") + +endif(PKG_CONFIG_EXECUTABLE) + +# if MAGMA is not found using pkg-config +if( (NOT PKG_CONFIG_EXECUTABLE AND NOT MAGMA_FOUND) OR NOT MAGMA_FOUND ) + + if (NOT MAGMA_FIND_QUIETLY) + message(STATUS "Looking for MAGMA - PkgConfig not used") + endif() + + # Looking for include + # ------------------- + + # Add system include paths to search include + # ------------------------------------------ + unset(_inc_env) + if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") + else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + endif() + list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") + list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") + list(REMOVE_DUPLICATES _inc_env) + + + # Try to find the magma header in the given paths + # ------------------------------------------------- + # call cmake macro to find the header path + if(MAGMA_INCDIR) + set(MAGMA_magma.h_DIRS "MAGMA_magma.h_DIRS-NOTFOUND") + find_path(MAGMA_magma.h_DIRS + NAMES magma.h + HINTS ${MAGMA_INCDIR}) + else() + if(MAGMA_DIR) + set(MAGMA_magma.h_DIRS "MAGMA_magma.h_DIRS-NOTFOUND") + find_path(MAGMA_magma.h_DIRS + NAMES magma.h + HINTS ${MAGMA_DIR} + PATH_SUFFIXES include) + else() + set(MAGMA_magma.h_DIRS "MAGMA_magma.h_DIRS-NOTFOUND") + find_path(MAGMA_magma.h_DIRS + NAMES magma.h + HINTS ${_inc_env}) + endif() + endif() + mark_as_advanced(MAGMA_magma.h_DIRS) + + # If found, add path to cmake variable + # ------------------------------------ + if (MAGMA_magma.h_DIRS) + set(MAGMA_INCLUDE_DIRS "${MAGMA_magma.h_DIRS}") + else () + set(MAGMA_INCLUDE_DIRS "MAGMA_INCLUDE_DIRS-NOTFOUND") + if(NOT MAGMA_FIND_QUIETLY) + message(STATUS "Looking for magma -- magma.h not found") + endif() + endif() + + + # Looking for lib + # --------------- + + # Add system library paths to search lib + # -------------------------------------- + unset(_lib_env) + if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") + else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") + endif() + list(REMOVE_DUPLICATES _lib_env) + + # Try to find the magma lib in the given paths + # ---------------------------------------------- + + # call cmake macro to find the lib path + if(MAGMA_LIBDIR) + set(MAGMA_magma_LIBRARY "MAGMA_magma_LIBRARY-NOTFOUND") + find_library(MAGMA_magma_LIBRARY + NAMES magma + HINTS ${MAGMA_LIBDIR}) + else() + if(MAGMA_DIR) + set(MAGMA_magma_LIBRARY "MAGMA_magma_LIBRARY-NOTFOUND") + find_library(MAGMA_magma_LIBRARY + NAMES magma + HINTS ${MAGMA_DIR} + PATH_SUFFIXES lib lib32 lib64) + else() + set(MAGMA_magma_LIBRARY "MAGMA_magma_LIBRARY-NOTFOUND") + find_library(MAGMA_magma_LIBRARY + NAMES magma + HINTS ${_lib_env}) + endif() + endif() + mark_as_advanced(MAGMA_magma_LIBRARY) + + # If found, add path to cmake variable + # ------------------------------------ + if (MAGMA_magma_LIBRARY) + get_filename_component(magma_lib_path "${MAGMA_magma_LIBRARY}" PATH) + # set cmake variables + set(MAGMA_LIBRARIES "${MAGMA_magma_LIBRARY}") + set(MAGMA_LIBRARY_DIRS "${magma_lib_path}") + else () + set(MAGMA_LIBRARIES "MAGMA_LIBRARIES-NOTFOUND") + set(MAGMA_LIBRARY_DIRS "MAGMA_LIBRARY_DIRS-NOTFOUND") + if(NOT MAGMA_FIND_QUIETLY) + message(STATUS "Looking for magma -- lib magma not found") + endif() + endif () + + # check a function to validate the find + if (MAGMA_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # MAGMA + if (MAGMA_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${MAGMA_INCLUDE_DIRS}") + endif() + if (MAGMA_LIBRARY_DIRS) + set(REQUIRED_LIBDIRS "${MAGMA_LIBRARY_DIRS}") + endif() + set(REQUIRED_LIBS "${MAGMA_LIBRARIES}") + # CBLAS + if (CBLAS_INCLUDE_DIRS_DEP) + list(APPEND REQUIRED_INCDIRS "${CBLAS_INCLUDE_DIRS_DEP}") + elseif (CBLAS_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${CBLAS_INCLUDE_DIRS}") + endif() + if(CBLAS_LIBRARY_DIRS_DEP) + list(APPEND REQUIRED_LIBDIRS "${CBLAS_LIBRARY_DIRS_DEP}") + elseif(CBLAS_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${CBLAS_LIBRARY_DIRS}") + endif() + if (CBLAS_LIBRARIES_DEP) + list(APPEND REQUIRED_LIBS "${CBLAS_LIBRARIES_DEP}") + elseif(CBLAS_LIBRARIES) + list(APPEND REQUIRED_LIBS "${CBLAS_LIBRARIES}") + endif() + # LAPACK + if (LAPACK_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${LAPACK_INCLUDE_DIRS}") + endif() + if(LAPACK_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${LAPACK_LIBRARY_DIRS}") + endif() + list(APPEND REQUIRED_LIBS "${LAPACK_LIBRARIES}") + # CUDA + if (CUDA_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${CUDA_INCLUDE_DIRS}") + endif() + if(CUDA_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${CUDA_LIBRARY_DIRS}") + endif() + list(APPEND REQUIRED_LIBS "${CUDA_CUBLAS_LIBRARIES};${CUDA_LIBRARIES}") + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + + # test link + unset(MAGMA_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(magma_dgetrf MAGMA_WORKS) + mark_as_advanced(MAGMA_WORKS) + + if(MAGMA_WORKS) + # save link with dependencies + set(MAGMA_LIBRARIES_DEP "${REQUIRED_LIBS}") + set(MAGMA_LIBRARY_DIRS_DEP "${REQUIRED_LIBDIRS}") + set(MAGMA_INCLUDE_DIRS_DEP "${REQUIRED_INCDIRS}") + else() + if(NOT MAGMA_FIND_QUIETLY) + message(STATUS "Looking for magma : test of magma_dgetrf with + magma, cblas, cuda and lapack libraries fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) + endif(MAGMA_LIBRARIES) + +endif( (NOT PKG_CONFIG_EXECUTABLE AND NOT MAGMA_FOUND) OR NOT MAGMA_FOUND ) + + +# check that MAGMA has been found +# ------------------------------- +include(FindPackageHandleStandardArgs) +if (PKG_CONFIG_EXECUTABLE AND MAGMA_FOUND) + find_package_handle_standard_args(MAGMA DEFAULT_MSG + MAGMA_LIBRARIES) +else() + find_package_handle_standard_args(MAGMA DEFAULT_MSG + MAGMA_LIBRARIES + MAGMA_WORKS) +endif() diff --git a/cmake_modules/morse/find/FindMETIS.cmake b/cmake_modules/morse/find/FindMETIS.cmake new file mode 100644 index 000000000..0056f9bd7 --- /dev/null +++ b/cmake_modules/morse/find/FindMETIS.cmake @@ -0,0 +1,224 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find METIS include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(METIS +# [REQUIRED] # Fail with error if metis is not found +# ) +# +# This module finds headers and metis library. +# Results are reported in variables: +# METIS_FOUND - True if headers and requested libraries were found +# METIS_INCLUDE_DIRS - metis include directories +# METIS_LIBRARY_DIRS - Link directories for metis libraries +# METIS_LIBRARIES - metis component libraries to be linked +# +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DMETIS_DIR=path/to/metis): +# METIS_DIR - Where to find the base directory of metis +# METIS_INCDIR - Where to find the header files +# METIS_LIBDIR - Where to find the library files + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + +if (NOT METIS_FOUND) + set(METIS_DIR "" CACHE PATH "Root directory of METIS library") + if (NOT METIS_FIND_QUIETLY) + message(STATUS "A cache variable, namely METIS_DIR, has been set to specify the install directory of METIS") + endif() +endif() + +# Looking for include +# ------------------- + +# Add system include paths to search include +# ------------------------------------------ +unset(_inc_env) +if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") +else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") +endif() +list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") +list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") +list(REMOVE_DUPLICATES _inc_env) + + +# Try to find the metis header in the given paths +# ------------------------------------------------- +# call cmake macro to find the header path +if(METIS_INCDIR) + set(METIS_metis.h_DIRS "METIS_metis.h_DIRS-NOTFOUND") + find_path(METIS_metis.h_DIRS + NAMES metis.h + HINTS ${METIS_INCDIR}) +else() + if(METIS_DIR) + set(METIS_metis.h_DIRS "METIS_metis.h_DIRS-NOTFOUND") + find_path(METIS_metis.h_DIRS + NAMES metis.h + HINTS ${METIS_DIR} + PATH_SUFFIXES include) + else() + set(METIS_metis.h_DIRS "METIS_metis.h_DIRS-NOTFOUND") + find_path(METIS_metis.h_DIRS + NAMES metis.h + HINTS ${_inc_env}) + endif() +endif() +mark_as_advanced(METIS_metis.h_DIRS) + + +# If found, add path to cmake variable +# ------------------------------------ +if (METIS_metis.h_DIRS) + set(METIS_INCLUDE_DIRS "${METIS_metis.h_DIRS}") +else () + set(METIS_INCLUDE_DIRS "METIS_INCLUDE_DIRS-NOTFOUND") + if(NOT METIS_FIND_QUIETLY) + message(STATUS "Looking for metis -- metis.h not found") + endif() +endif() + + +# Looking for lib +# --------------- + +# Add system library paths to search lib +# -------------------------------------- +unset(_lib_env) +if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") +else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") +endif() +list(REMOVE_DUPLICATES _lib_env) + +# Try to find the metis lib in the given paths +# ---------------------------------------------- +# call cmake macro to find the lib path +if(METIS_LIBDIR) + set(METIS_metis_LIBRARY "METIS_metis_LIBRARY-NOTFOUND") + find_library(METIS_metis_LIBRARY + NAMES metis + HINTS ${METIS_LIBDIR}) +else() + if(METIS_DIR) + set(METIS_metis_LIBRARY "METIS_metis_LIBRARY-NOTFOUND") + find_library(METIS_metis_LIBRARY + NAMES metis + HINTS ${METIS_DIR} + PATH_SUFFIXES lib lib32 lib64) + else() + set(METIS_metis_LIBRARY "METIS_metis_LIBRARY-NOTFOUND") + find_library(METIS_metis_LIBRARY + NAMES metis + HINTS ${_lib_env}) + endif() +endif() +mark_as_advanced(METIS_metis_LIBRARY) + + +# If found, add path to cmake variable +# ------------------------------------ +if (METIS_metis_LIBRARY) + get_filename_component(metis_lib_path "${METIS_metis_LIBRARY}" PATH) + # set cmake variables + set(METIS_LIBRARIES "${METIS_metis_LIBRARY}") + set(METIS_LIBRARY_DIRS "${metis_lib_path}") +else () + set(METIS_LIBRARIES "METIS_LIBRARIES-NOTFOUND") + set(METIS_LIBRARY_DIRS "METIS_LIBRARY_DIRS-NOTFOUND") + if(NOT METIS_FIND_QUIETLY) + message(STATUS "Looking for metis -- lib metis not found") + endif() +endif () + +# check a function to validate the find +if(METIS_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # METIS + if (METIS_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${METIS_INCLUDE_DIRS}") + endif() + if (METIS_LIBRARY_DIRS) + set(REQUIRED_LIBDIRS "${METIS_LIBRARY_DIRS}") + endif() + set(REQUIRED_LIBS "${METIS_LIBRARIES}") + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + + # test link + unset(METIS_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(METIS_NodeND METIS_WORKS) + mark_as_advanced(METIS_WORKS) + + if(NOT METIS_WORKS) + if(NOT METIS_FIND_QUIETLY) + message(STATUS "Looking for METIS : test of METIS_NodeND with METIS library fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) +endif(METIS_LIBRARIES) + +# check that METIS has been found +# --------------------------------- +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(METIS DEFAULT_MSG + METIS_LIBRARIES + METIS_WORKS) +# +# TODO: Add possibility to check for specific functions in the library +# diff --git a/cmake_modules/morse/find/FindMPIEXT.cmake b/cmake_modules/morse/find/FindMPIEXT.cmake new file mode 100644 index 000000000..68520a478 --- /dev/null +++ b/cmake_modules/morse/find/FindMPIEXT.cmake @@ -0,0 +1,120 @@ +# - Find MPI EXTENDED for MORSE projects: +# +# This module allows to find MPI libraries by calling the official FindMPI module +# and adds an additional variable indicating the level of thread supported: +# MPI_THREAD_SUPPORTED_LEVEL - MPI_THREAD_MULTIPLE, MPI_THREAD_SERIALIZED, MPI_THREAD_FUNNELED, or MPI_THREAD_SINGLE + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + +# add a cache variable to let the user specify the BLAS vendor +if (NOT MPI_FOUND) + if(MPIEXT_FIND_REQUIRED) + find_package(MPI REQUIRED) + else() + find_package(MPI) + endif() +endif () + +if (MPI_FOUND) + set(CMAKE_REQUIRED_INCLUDES_SAVE ${CMAKE_REQUIRED_INCLUDES}) + set(CMAKE_REQUIRED_LIBRARIES_SAVE ${CMAKE_REQUIRED_LIBRARIES}) + set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS}) + # Set flags for building test program + set(CMAKE_REQUIRED_INCLUDES ${MPI_INCLUDE_PATH}) + set(CMAKE_REQUIRED_LIBRARIES ${MPI_LIBRARIES}) + set(CMAKE_REQUIRED_FLAGS ${MPI_COMPILE_FLAGS}) + + include(CheckCSourceRuns) + set(MPI_C_TEST_MULTIPLE_SOURCE " +#include <stdio.h> +#include <mpi.h> + +int main(int argc, char **argv) { + int provided; + + MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided); + + if (MPI_THREAD_MULTIPLE > provided) { + fprintf(stderr,\"MPI implementation is not supporting MPI_THREAD_MULTIPLE\"); + MPI_Finalize(); + return 1000+MPI_THREAD_MULTIPLE-provided; + } + MPI_Finalize(); + return 0; +} +") + + set(MPI_C_TEST_SERIALIZED_SOURCE " +#include <stdio.h> +#include <mpi.h> + +int main(int argc, char **argv) { + int provided; + + MPI_Init_thread(&argc, &argv, MPI_THREAD_SERIALIZED, &provided); + + if (MPI_THREAD_SERIALIZED > provided) { + printf(\"MPI implementation is not supporting MPI_THREAD_SERIALIZED\"); + MPI_Finalize(); + return 1; + } + MPI_Finalize(); + return 0; +} +") + + set(MPI_C_TEST_FUNNELED_SOURCE " +#include <stdio.h> +#include <mpi.h> + +int main(int argc, char **argv) { + int provided; + + MPI_Init_thread(&argc, &argv, MPI_THREAD_FUNNELED, &provided); + + if (MPI_THREAD_FUNNELED > provided) { + printf(\"MPI implementation is not supporting MPI_THREAD_FUNNELED\"); + MPI_Finalize(); + return 1; + } + MPI_Finalize(); + return 0; +} +") + + check_c_source_runs("${MPI_C_TEST_MULTIPLE_SOURCE}" MULTIPLE_TEST_RUNS) + if(NOT MULTIPLE_TEST_RUNS) + check_c_source_runs("${MPI_C_TEST_SERIALIZED_SOURCE}" SERIALIZED_TEST_RUNS) + if(NOT SERIALIZED_TEST_RUNS) + check_c_source_runs("${MPI_C_TEST_FUNNELED_SOURCE}" FUNNELED_TEST_RUNS) + if(NOT FUNNELED_TEST_RUNS) + set(MPI_THREAD_SUPPORTED_LEVEL "MPI_THREAD_SINGLE") + else(NOT FUNNELED_TEST_RUNS) + set(MPI_THREAD_SUPPORTED_LEVEL "MPI_THREAD_FUNNELED") + endif(NOT FUNNELED_TEST_RUNS) + else(NOT SERIALIZED_TEST_RUNS) + set(MPI_THREAD_SUPPORTED_LEVEL "MPI_THREAD_SERIALIZED") + endif(NOT SERIALIZED_TEST_RUNS) + else(NOT MULTIPLE_TEST_RUNS) + set(MPI_THREAD_SUPPORTED_LEVEL "MPI_THREAD_MULTIPLE") + endif(NOT MULTIPLE_TEST_RUNS) + # Set flags for building test program + set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_SAVE}) + set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES_SAVE}) + set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE}) +endif(MPI_FOUND) \ No newline at end of file diff --git a/cmake_modules/morse/find/FindMUMPS.cmake b/cmake_modules/morse/find/FindMUMPS.cmake new file mode 100644 index 000000000..081c59cb1 --- /dev/null +++ b/cmake_modules/morse/find/FindMUMPS.cmake @@ -0,0 +1,608 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find MUMPS include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(MUMPS +# [REQUIRED] # Fail with error if mumps is not found +# [COMPONENTS <comp1> <comp2> ...] # dependencies +# ) +# +# MUMPS depends on the following libraries: +# - Threads +# - BLAS +# +# COMPONENTS are optional libraries MUMPS could be linked with, +# Use it to drive detection of a specific compilation chain +# COMPONENTS can be some of the following: +# - MPI: to activate detection of the parallel MPI version (default) +# it looks for Threads, BLAS, MPI and ScaLAPACK libraries +# - SEQ: to activate detection of sequential version (exclude MPI version) +# it looks for Threads and BLAS libraries +# - SCOTCH: to activate detection of MUMPS linked with SCOTCH +# - METIS: to activate detection of MUMPS linked with METIS +# +# This module finds headers and mumps library. +# Results are reported in variables: +# MUMPS_FOUND - True if headers and requested libraries were found +# MUMPS_INCLUDE_DIRS - mumps include directories +# MUMPS_LIBRARY_DIRS - Link directories for mumps libraries +# MUMPS_LIBRARIES - mumps libraries +# MUMPS_INCLUDE_DIRS_DEP - mumps + dependencies include directories +# MUMPS_LIBRARY_DIRS_DEP - mumps + dependencies link directories +# MUMPS_LIBRARIES_DEP - mumps libraries + dependencies +# +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DMUMPS_DIR=path/to/mumps): +# MUMPS_DIR - Where to find the base directory of mumps + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + + +if (NOT MUMPS_FOUND) + set(MUMPS_DIR "" CACHE PATH "Root directory of MUMPS library") + if (NOT MUMPS_FIND_QUIETLY) + message(STATUS "A cache variable, namely MUMPS_DIR, has been set to specify the install directory of MUMPS") + endif() +endif() + +# Set the version to find +set(MUMPS_LOOK_FOR_MPI ON) +set(MUMPS_LOOK_FOR_SEQ OFF) +set(MUMPS_LOOK_FOR_SCOTCH OFF) +set(MUMPS_LOOK_FOR_METIS OFF) + +if( MUMPS_FIND_COMPONENTS ) + foreach( component ${MUMPS_FIND_COMPONENTS} ) + if (${component} STREQUAL "SEQ") + # means we look for the sequential version of MUMPS (without MPI) + set(MUMPS_LOOK_FOR_SEQ ON) + set(MUMPS_LOOK_FOR_MPI OFF) + endif() + if (${component} STREQUAL "MPI") + # means we look for the MPI version of MUMPS (default) + set(MUMPS_LOOK_FOR_MPI ON) + set(MUMPS_LOOK_FOR_SEQ OFF) + endif() + if (${component} STREQUAL "SCOTCH") + set(MUMPS_LOOK_FOR_SCOTCH ON) + endif() + if (${component} STREQUAL "METIS") + set(MUMPS_LOOK_FOR_METIS ON) + endif() + endforeach() +endif() + +if (NOT MUMPS_FIND_QUIETLY) + if (MUMPS_LOOK_FOR_SEQ) + message(STATUS "Looking for MUMPS - sequential version (without MPI)") + else() + message(STATUS "Looking for MUMPS - MPI version -" + " if you want to force detection of a sequential " + "version use find_package(MUMPS [REQUIRED] COMPONENTS SEQ [...])") + endif() +endif() + +if (NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for MUMPS - PkgConfig not used") +endif() + +# Dependencies detection +# ---------------------- + + +# Required dependencies +# --------------------- + +if (NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for MUMPS - Try to detect pthread") +endif() +if (NOT Threads_FOUND) + if (MUMPS_FIND_REQUIRED) + find_package(Threads REQUIRED) + else() + find_package(Threads) + endif() +endif() +set(MUMPS_EXTRA_LIBRARIES "") +if( THREADS_FOUND ) + list(APPEND MUMPS_EXTRA_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) +endif () + +# MUMPS depends on BLAS +#---------------------- +if (NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for MUMPS - Try to detect BLAS") +endif() +if (NOT BLASEXT_FOUND) + if (MUMPS_FIND_REQUIRED) + find_package(BLASEXT REQUIRED) + else() + find_package(BLASEXT) + endif() +endif() + +# Optional dependencies +# --------------------- + +# MUMPS may depend on MPI +#------------------------ +if (NOT MPI_FOUND AND MUMPS_LOOK_FOR_MPI) + if (NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for MUMPS - Try to detect MPI") + endif() + # allows to use an external mpi compilation by setting compilers with + # -DMPI_C_COMPILER=path/to/mpicc -DMPI_Fortran_COMPILER=path/to/mpif90 + # at cmake configure + if(NOT MPI_C_COMPILER) + set(MPI_C_COMPILER mpicc) + endif() + if (MUMPS_FIND_REQUIRED) + find_package(MPI REQUIRED) + else() + find_package(MPI) + endif() + if (MPI_FOUND) + mark_as_advanced(MPI_LIBRARY) + mark_as_advanced(MPI_EXTRA_LIBRARY) + endif() +endif (NOT MPI_FOUND AND MUMPS_LOOK_FOR_MPI) + +# MUMPS may depend on ScaLAPACK (if MPI version) +#----------------------------------------------- +if (NOT SCALAPACK_FOUND AND MUMPS_LOOK_FOR_MPI) + if (NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for MUMPS - Try to detect SCALAPACK") + endif() + # SCALAPACK is a required dependency if MPI is used + if (MUMPS_FIND_REQUIRED) + find_package(SCALAPACK REQUIRED) + else() + find_package(SCALAPACK) + endif() +endif (NOT SCALAPACK_FOUND AND MUMPS_LOOK_FOR_MPI) + +# MUMPS may depends on SCOTCH +#---------------------------- +if (NOT SCOTCH_FOUND AND MUMPS_LOOK_FOR_SCOTCH) + if (NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for MUMPS - Try to detect SCOTCH") + endif() + if (MUMPS_FIND_REQUIRED) + find_package(SCOTCH REQUIRED) + else() + find_package(SCOTCH) + endif() +endif() + +# MUMPS may depends on METIS +#--------------------------- +if (NOT METIS_FOUND AND MUMPS_LOOK_FOR_METIS) + if (NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for MUMPS - Try to detect METIS") + endif() + if (MUMPS_FIND_REQUIRED) + find_package(METIS REQUIRED) + else() + find_package(METIS) + endif() +endif() + + +# Looking for MUMPS +# ----------------- + +# Looking for include +# ------------------- + +# Try to find the mumps header in the given path +# ---------------------------------------------- +# call cmake macro to find the header path +if(MUMPS_DIR) + set(MUMPS_smumps_c.h_DIRS "MUMPS_smumps_c.h_DIRS-NOTFOUND") + find_path(MUMPS_smumps_c.h_DIRS + NAMES smumps_c.h + HINTS ${MUMPS_DIR} + PATH_SUFFIXES "include") + set(MUMPS_dmumps_c.h_DIRS "MUMPS_dmumps_c.h_DIRS-NOTFOUND") + find_path(MUMPS_dmumps_c.h_DIRS + NAMES dmumps_c.h + HINTS ${MUMPS_DIR} + PATH_SUFFIXES "include") + set(MUMPS_cmumps_c.h_DIRS "MUMPS_cmumps_c.h_DIRS-NOTFOUND") + find_path(MUMPS_cmumps_c.h_DIRS + NAMES cmumps_c.h + HINTS ${MUMPS_DIR} + PATH_SUFFIXES "include") + set(MUMPS_zmumps_c.h_DIRS "MUMPS_zmumps_c.h_DIRS-NOTFOUND") + find_path(MUMPS_zmumps_c.h_DIRS + NAMES zmumps_c.h + HINTS ${MUMPS_DIR} + PATH_SUFFIXES "include") +else() + if (MUMPS_FIND_REQUIRED) + message(FATAL_ERROR "Looking for mumps -- MUMPS_DIR is not set, to find" + " MUMPS please set MUMPS_DIR, the path to MUMPS installation where" + " sub-directories include/ and lib/ are located") + else() + if(NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for mumps -- MUMPS_DIR is not set, to find" + " MUMPS please set MUMPS_DIR, the path to MUMPS installation where" + " sub-directories include/ and lib/ are located") + endif() + endif() +endif() + +# If found, add path to cmake variable +# ------------------------------------ +# detect which precisions are available +if (MUMPS_smumps_c.h_DIRS) + mark_as_advanced(MUMPS_smumps_c.h_DIRS) + set(MUMPS_PREC_S ON) + set(MUMPS_INCLUDE_DIRS "${MUMPS_smumps_c.h_DIRS}") +else () + set(MUMPS_PREC_S OFF) + if(NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for mumps -- smumps_c.h not found") + endif() +endif() +if (MUMPS_dmumps_c.h_DIRS) + mark_as_advanced(MUMPS_dmumps_c.h_DIRS) + set(MUMPS_PREC_D ON) + set(MUMPS_INCLUDE_DIRS "${MUMPS_dmumps_c.h_DIRS}") +else () + set(MUMPS_PREC_D OFF) + if(NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for mumps -- dmumps_c.h not found") + endif() +endif() +if (MUMPS_cmumps_c.h_DIRS) + mark_as_advanced(MUMPS_cmumps_c.h_DIRS) + set(MUMPS_PREC_C ON) + set(MUMPS_INCLUDE_DIRS "${MUMPS_cmumps_c.h_DIRS}") +else () + set(MUMPS_PREC_C OFF) + if(NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for mumps -- cmumps_c.h not found") + endif() +endif() +if (MUMPS_zmumps_c.h_DIRS) + mark_as_advanced(MUMPS_zmumps_c.h_DIRS) + set(MUMPS_PREC_Z ON) + set(MUMPS_INCLUDE_DIRS "${MUMPS_zmumps_c.h_DIRS}") +else () + set(MUMPS_PREC_Z OFF) + if(NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for mumps -- zmumps_c.h not found") + endif() +endif() + +# Looking for lib +# --------------- + +# Try to find the mumps lib in the given paths +# -------------------------------------------- + +# call cmake macro to find the lib path +if(MUMPS_DIR) + set(MUMPS_smumps_LIBRARY "MUMPS_smumps_LIBRARY-NOTFOUND") + find_library(MUMPS_smumps_LIBRARY + NAMES smumps + HINTS ${MUMPS_DIR} + PATH_SUFFIXES lib) + set(MUMPS_dmumps_LIBRARY "MUMPS_dmumps_LIBRARY-NOTFOUND") + find_library(MUMPS_dmumps_LIBRARY + NAMES dmumps + HINTS ${MUMPS_DIR} + PATH_SUFFIXES lib) + set(MUMPS_cmumps_LIBRARY "MUMPS_cmumps_LIBRARY-NOTFOUND") + find_library(MUMPS_cmumps_LIBRARY + NAMES cmumps + HINTS ${MUMPS_DIR} + PATH_SUFFIXES lib) + set(MUMPS_zmumps_LIBRARY "MUMPS_zmumps_LIBRARY-NOTFOUND") + find_library(MUMPS_zmumps_LIBRARY + NAMES zmumps + HINTS ${MUMPS_DIR} + PATH_SUFFIXES lib) + set(MUMPS_mumps_common_LIBRARY "MUMPS_mumps_common_LIBRARY-NOTFOUND") + find_library(MUMPS_mumps_common_LIBRARY + NAMES mumps_common + HINTS ${MUMPS_DIR} + PATH_SUFFIXES lib) + set(MUMPS_mpiseq_LIBRARY "MUMPS_mpiseq_LIBRARY-NOTFOUND") + find_library(MUMPS_mpiseq_LIBRARY + NAMES mpiseq + HINTS ${MUMPS_DIR} + PATH_SUFFIXES libseq) + set(MUMPS_pord_LIBRARY "MUMPS_pord_LIBRARY-NOTFOUND") + find_library(MUMPS_pord_LIBRARY + NAMES pord + HINTS ${MUMPS_DIR} + PATH_SUFFIXES lib) +else() + if (MUMPS_FIND_REQUIRED) + message(FATAL_ERROR "Looking for mumps -- MUMPS_DIR is not set, to find" + " MUMPS please set MUMPS_DIR, the path to MUMPS installation where" + " sub-directories include/ and lib/ are located") + else() + if(NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for mumps -- MUMPS_DIR is not set, to find" + " MUMPS please set MUMPS_DIR, the path to MUMPS installation where" + " sub-directories include/ and lib/ are located") + endif() + endif() +endif() + +# If found, add path to cmake variable +# ------------------------------------ +set(MUMPS_LIBRARIES "") +set(MUMPS_LIBRARY_DIRS "") +# detect which precisions are available +if (MUMPS_smumps_LIBRARY) + mark_as_advanced(MUMPS_smumps_LIBRARY) + list(APPEND MUMPS_LIBRARIES "${MUMPS_smumps_LIBRARY}") + get_filename_component(smumps_lib_path ${MUMPS_smumps_LIBRARY} PATH) + list(APPEND MUMPS_LIBRARY_DIRS "${smumps_lib_path}") +else () + set(MUMPS_PREC_S OFF) + if(NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for mumps -- libsmumps.a not found") + endif() +endif() +if (MUMPS_dmumps_LIBRARY) + mark_as_advanced(MUMPS_dmumps_LIBRARY) + list(APPEND MUMPS_LIBRARIES "${MUMPS_dmumps_LIBRARY}") + get_filename_component(dmumps_lib_path ${MUMPS_dmumps_LIBRARY} PATH) + list(APPEND MUMPS_LIBRARY_DIRS "${dmumps_lib_path}") +else () + set(MUMPS_PREC_D OFF) + if(NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for mumps -- libdmumps.a not found") + endif() +endif() +if (MUMPS_cmumps_LIBRARY) + mark_as_advanced(MUMPS_cmumps_LIBRARY) + list(APPEND MUMPS_LIBRARIES "${MUMPS_cmumps_LIBRARY}") + get_filename_component(cmumps_lib_path ${MUMPS_cmumps_LIBRARY} PATH) + list(APPEND MUMPS_LIBRARY_DIRS "${cmumps_lib_path}") +else () + set(MUMPS_PREC_C OFF) + if(NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for mumps -- libcmumps.a not found") + endif() +endif() +if (MUMPS_zmumps_LIBRARY) + mark_as_advanced(MUMPS_zmumps_LIBRARY) + list(APPEND MUMPS_LIBRARIES "${MUMPS_zmumps_LIBRARY}") + get_filename_component(zmumps_lib_path ${MUMPS_zmumps_LIBRARY} PATH) + list(APPEND MUMPS_LIBRARY_DIRS "${zmumps_lib_path}") +else () + set(MUMPS_PREC_Z OFF) + if(NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for mumps -- libzmumps.a not found") + endif() +endif() +list(REMOVE_DUPLICATES MUMPS_LIBRARY_DIRS) +# check that one precision arithmetic at least has been discovered +if (NOT MUMPS_PREC_S AND NOT MUMPS_PREC_D AND NOT MUMPS_PREC_C AND NOT MUMPS_PREC_S) + if (MUMPS_FIND_REQUIRED) + message(FATAL_ERROR "Looking for mumps -- " + "no lib[sdcz]mumps.a have been found in ${MUMPS_DIR}/lib when required") + else() + if(NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for mumps -- no lib[sdcz]mumps.a have been found") + endif() + endif() +endif() +# other MUMPS libraries +if (MUMPS_mumps_common_LIBRARY) + mark_as_advanced(MUMPS_mumps_common_LIBRARY) + list(APPEND MUMPS_LIBRARIES "${MUMPS_mumps_common_LIBRARY}") + get_filename_component(mumps_common_lib_path ${MUMPS_mumps_common_LIBRARY} PATH) + list(APPEND MUMPS_LIBRARY_DIRS "${mumps_common_lib_path}") +else () + if (MUMPS_FIND_REQUIRED) + message(FATAL_ERROR "Looking for mumps -- " + "libmumps_common.a not found in ${MUMPS_DIR}/lib when required") + else() + if(NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for mumps -- libmumps_common.a not found") + endif() + endif() +endif() +if (MUMPS_mpiseq_LIBRARY) + mark_as_advanced(MUMPS_mpiseq_LIBRARY) + if (MUMPS_LOOK_FOR_SEQ) + list(APPEND MUMPS_LIBRARIES "${MUMPS_mpiseq_LIBRARY}") + get_filename_component(mpiseq_lib_path ${MUMPS_mpiseq_LIBRARY} PATH) + list(APPEND MUMPS_LIBRARY_DIRS "${mpiseq_lib_path}") + endif() +else () + if (MUMPS_FIND_REQUIRED AND MUMPS_LOOK_FOR_SEQ) + message(FATAL_ERROR "Looking for mumps -- " + "libmpiseq.a not found in ${MUMPS_DIR}/libseq when required") + else() + if(NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for mumps -- libmpiseq.a not found") + endif() + endif() +endif() +if (MUMPS_pord_LIBRARY) + mark_as_advanced(MUMPS_pord_LIBRARY) + list(APPEND MUMPS_LIBRARIES "${MUMPS_pord_LIBRARY}") + get_filename_component(pord_lib_path ${MUMPS_pord_LIBRARY} PATH) + list(APPEND MUMPS_LIBRARY_DIRS "${pord_lib_path}") +else () + if (MUMPS_FIND_REQUIRED) + message(FATAL_ERROR "Looking for mumps -- " + "libpord.a not found in ${MUMPS_DIR}/lib when required") + else() + if(NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for mumps -- libpord.a not found") + endif() + endif() +endif() + +# check a function to validate the find +if(MUMPS_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # MUMPS + if (MUMPS_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${MUMPS_INCLUDE_DIRS}") + endif() + foreach(libdir ${MUMPS_LIBRARY_DIRS}) + if (libdir) + list(APPEND REQUIRED_LIBDIRS "${libdir}") + endif() + endforeach() + set(REQUIRED_LIBS "${MUMPS_LIBRARIES}") + # SCALAPACK + if (MUMPS_LOOK_FOR_MPI AND SCALAPACK_FOUND) + if (SCALAPACK_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${SCALAPACK_INCLUDE_DIRS}") + endif() + foreach(libdir ${SCALAPACK_LIBRARY_DIRS}) + if (libdir) + list(APPEND REQUIRED_LIBDIRS "${libdir}") + endif() + endforeach() + list(APPEND REQUIRED_LIBS "${SCALAPACK_LIBRARIES}") + endif() + # MPI + if (MUMPS_LOOK_FOR_MPI AND MPI_FOUND) + if (MPI_C_INCLUDE_PATH) + list(APPEND REQUIRED_INCDIRS "${MPI_C_INCLUDE_PATH}") + endif() + if (MPI_Fortran_LINK_FLAGS) + list(APPEND REQUIRED_LIBS "${MPI_Fortran_LINK_FLAGS}") + endif() + list(APPEND REQUIRED_LIBS "${MPI_Fortran_LIBRARIES}") + endif() + # BLAS + if (BLAS_FOUND) + if (BLAS_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${BLAS_INCLUDE_DIRS}") + endif() + foreach(libdir ${BLAS_LIBRARY_DIRS}) + if (libdir) + list(APPEND REQUIRED_LIBDIRS "${libdir}") + endif() + endforeach() + list(APPEND REQUIRED_LIBS "${BLAS_LIBRARIES}") + endif() + # SCOTCH + if (MUMPS_LOOK_FOR_SCOTCH AND SCOTCH_FOUND) + if (SCOTCH_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${SCOTCH_INCLUDE_DIRS}") + endif() + foreach(libdir ${SCOTCH_LIBRARY_DIRS}) + if (libdir) + list(APPEND REQUIRED_LIBDIRS "${libdir}") + endif() + endforeach() + list(APPEND REQUIRED_LIBS "${SCOTCH_LIBRARIES}") + endif() + # METIS + if (MUMPS_LOOK_FOR_METIS AND METIS_FOUND) + if (METIS_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${METIS_INCLUDE_DIRS}") + endif() + foreach(libdir ${METIS_LIBRARY_DIRS}) + if (libdir) + list(APPEND REQUIRED_LIBDIRS "${libdir}") + endif() + endforeach() + list(APPEND REQUIRED_LIBS "${METIS_LIBRARIES}") + endif() + # Fortran + if (CMAKE_Fortran_COMPILER MATCHES ".+gfortran.*") + list(APPEND REQUIRED_LIBS "-lgfortran") + elseif (CMAKE_Fortran_COMPILER MATCHES ".+ifort.*") + list(APPEND REQUIRED_LIBS "-lifcore") + endif() + # EXTRA LIBS such that pthread, m, rt + list(APPEND REQUIRED_LIBS ${MUMPS_EXTRA_LIBRARIES}) + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + + # test link + include(CheckFortranFunctionExists) + unset(MUMPS_PREC_S_WORKS CACHE) + check_fortran_function_exists(smumps MUMPS_PREC_S_WORKS) + mark_as_advanced(MUMPS_PREC_S_WORKS) + unset(MUMPS_PREC_D_WORKS CACHE) + check_fortran_function_exists(dmumps MUMPS_PREC_D_WORKS) + mark_as_advanced(MUMPS_PREC_D_WORKS) + unset(MUMPS_PREC_C_WORKS CACHE) + check_fortran_function_exists(cmumps MUMPS_PREC_C_WORKS) + mark_as_advanced(MUMPS_PREC_C_WORKS) + unset(MUMPS_PREC_Z_WORKS CACHE) + check_fortran_function_exists(zmumps MUMPS_PREC_Z_WORKS) + mark_as_advanced(MUMPS_PREC_Z_WORKS) + + set(MUMPS_WORKS FALSE) + if(MUMPS_PREC_S_WORKS OR MUMPS_PREC_D_WORKS OR MUMPS_PREC_C_WORKS OR MUMPS_PREC_Z_WORKS) + set(MUMPS_WORKS TRUE) + endif() + + if(MUMPS_WORKS) + # save link with dependencies + set(MUMPS_LIBRARIES_DEP "${REQUIRED_LIBS}") + set(MUMPS_LIBRARY_DIRS_DEP "${REQUIRED_LIBDIRS}") + set(MUMPS_INCLUDE_DIRS_DEP "${REQUIRED_INCDIRS}") + else() + if(NOT MUMPS_FIND_QUIETLY) + message(STATUS "Looking for MUMPS : test of [sdcz]mumps() fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + message(STATUS "Maybe MUMPS is linked with specific libraries. " + "Have you tried with COMPONENTS (MPI/SEQ, SCOTCH, METIS)? " + "See the explanation in FindMUMPS.cmake.") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) +endif(MUMPS_LIBRARIES) + + +# check that MUMPS has been found +# ------------------------------- +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(MUMPS DEFAULT_MSG + MUMPS_LIBRARIES + MUMPS_WORKS) diff --git a/cmake_modules/morse/find/FindPARMETIS.cmake b/cmake_modules/morse/find/FindPARMETIS.cmake new file mode 100644 index 000000000..c009e48c3 --- /dev/null +++ b/cmake_modules/morse/find/FindPARMETIS.cmake @@ -0,0 +1,225 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find PARMETIS include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(PARMETIS +# [REQUIRED] # Fail with error if parmetis is not found +# ) +# +# This module finds headers and parmetis library. +# Results are reported in variables: +# PARMETIS_FOUND - True if headers and requested libraries were found +# PARMETIS_INCLUDE_DIRS - parmetis include directories +# PARMETIS_LIBRARY_DIRS - Link directories for parmetis libraries +# PARMETIS_LIBRARIES - parmetis component libraries to be linked +# +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DPARMETIS_DIR=path/to/parmetis): +# PARMETIS_DIR - Where to find the base directory of parmetis +# PARMETIS_INCDIR - Where to find the header files +# PARMETIS_LIBDIR - Where to find the library files + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + +if (NOT PARMETIS_FOUND) + set(PARMETIS_DIR "" CACHE PATH "Root directory of PARMETIS library") + if (NOT PARMETIS_FIND_QUIETLY) + message(STATUS "A cache variable, namely PARMETIS_DIR, has been set to specify the install directory of PARMETIS") + endif() +endif() + + +# Looking for include +# ------------------- + +# Add system include paths to search include +# ------------------------------------------ +unset(_inc_env) +if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") +else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") +endif() +list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") +list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") +list(REMOVE_DUPLICATES _inc_env) + + +# Try to find the parmetis header in the given paths +# ------------------------------------------------- +# call cmake macro to find the header path +if(PARMETIS_INCDIR) + set(PARMETIS_parmetis.h_DIRS "PARMETIS_parmetis.h_DIRS-NOTFOUND") + find_path(PARMETIS_parmetis.h_DIRS + NAMES parmetis.h + HINTS ${PARMETIS_INCDIR}) +else() + if(PARMETIS_DIR) + set(PARMETIS_parmetis.h_DIRS "PARMETIS_parmetis.h_DIRS-NOTFOUND") + find_path(PARMETIS_parmetis.h_DIRS + NAMES parmetis.h + HINTS ${PARMETIS_DIR} + PATH_SUFFIXES include) + else() + set(PARMETIS_parmetis.h_DIRS "PARMETIS_parmetis.h_DIRS-NOTFOUND") + find_path(PARMETIS_parmetis.h_DIRS + NAMES parmetis.h + HINTS ${_inc_env}) + endif() +endif() +mark_as_advanced(PARMETIS_parmetis.h_DIRS) + + +# If found, add path to cmake variable +# ------------------------------------ +if (PARMETIS_parmetis.h_DIRS AND NOT PARMETIS_FIND_QUIETLY) + set(PARMETIS_INCLUDE_DIRS "${PARMETIS_parmetis.h_DIRS}") +else () + set(PARMETIS_INCLUDE_DIRS "PARMETIS_INCLUDE_DIRS-NOTFOUND") + if(NOT PARMETIS_FIND_QUIETLY) + message(STATUS "Looking for parmetis -- parmetis.h not found") + endif() +endif() + + +# Looking for lib +# --------------- + +# Add system library paths to search lib +# -------------------------------------- +unset(_lib_env) +if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") +else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") +endif() +list(REMOVE_DUPLICATES _lib_env) + +# Try to find the parmetis lib in the given paths +# ---------------------------------------------- +# call cmake macro to find the lib path +if(PARMETIS_LIBDIR) + set(PARMETIS_parmetis_LIBRARY "PARMETIS_parmetis_LIBRARY-NOTFOUND") + find_library(PARMETIS_parmetis_LIBRARY + NAMES parmetis + HINTS ${PARMETIS_LIBDIR}) +else() + if(PARMETIS_DIR) + set(PARMETIS_parmetis_LIBRARY "PARMETIS_parmetis_LIBRARY-NOTFOUND") + find_library(PARMETIS_parmetis_LIBRARY + NAMES parmetis + HINTS ${PARMETIS_DIR} + PATH_SUFFIXES lib lib32 lib64) + else() + set(PARMETIS_parmetis_LIBRARY "PARMETIS_parmetis_LIBRARY-NOTFOUND") + find_library(PARMETIS_parmetis_LIBRARY + NAMES parmetis + HINTS ${_lib_env}) + endif() +endif() +mark_as_advanced(PARMETIS_parmetis_LIBRARY) + +# If found, add path to cmake variable +# ------------------------------------ +if (PARMETIS_parmetis_LIBRARY) + get_filename_component(parmetis_lib_path "${PARMETIS_parmetis_LIBRARY}" PATH) + # set cmake variables + set(PARMETIS_LIBRARIES "${PARMETIS_parmetis_LIBRARY}") + set(PARMETIS_LIBRARY_DIRS "${parmetis_lib_path}") +else () + set(PARMETIS_LIBRARIES "PARMETIS_LIBRARIES-NOTFOUND") + set(PARMETIS_LIBRARY_DIRS "PARMETIS_LIBRARY_DIRS-NOTFOUND") + if (NOT PARMETIS_FIND_QUIETLY) + message(STATUS "Looking for parmetis -- lib parmetis not found") + endif() +endif () + +# check a function to validate the find +if(PARMETIS_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # PARMETIS + if (PARMETIS_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${PARMETIS_INCLUDE_DIRS}") + endif() + if (PARMETIS_LIBRARY_DIRS) + set(REQUIRED_LIBDIRS "${PARMETIS_LIBRARY_DIRS}") + endif() + set(REQUIRED_LIBS "${PARMETIS_LIBRARIES}") + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + + # test link + unset(PARMETIS_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(ParMETIS_V3_NodeND PARMETIS_WORKS) + mark_as_advanced(PARMETIS_WORKS) + + if(NOT PARMETIS_WORKS) + if(NOT PARMETIS_FIND_QUIETLY) + message(STATUS "Looking for PARMETIS : test of ParMETIS_V3_NodeND with PARMETIS library fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) +endif(PARMETIS_LIBRARIES) + + +# check that PARMETIS has been found +# ---------------------------------- +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(PARMETIS DEFAULT_MSG + PARMETIS_LIBRARIES + PARMETIS_WORKS) +# +# TODO: Add possibility to check for specific functions in the library +# diff --git a/cmake_modules/morse/find/FindPASTIX.cmake b/cmake_modules/morse/find/FindPASTIX.cmake new file mode 100644 index 000000000..d5f33e8a8 --- /dev/null +++ b/cmake_modules/morse/find/FindPASTIX.cmake @@ -0,0 +1,622 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find PASTIX include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(PASTIX +# [REQUIRED] # Fail with error if pastix is not found +# [COMPONENTS <comp1> <comp2> ...] # dependencies +# ) +# +# PASTIX depends on the following libraries: +# - Threads, m, rt +# - HWLOC +# - BLAS +# +# COMPONENTS are optional libraries PASTIX could be linked with, +# Use it to drive detection of a specific compilation chain +# COMPONENTS can be some of the following: +# - MPI: to activate detection of the parallel MPI version (default) +# it looks for Threads, HWLOC, BLAS, MPI and ScaLAPACK libraries +# - SEQ: to activate detection of the sequential version (exclude MPI version) +# - STARPU: to activate detection of StarPU version +# it looks for MPI version of StarPU (default behaviour) +# if SEQ and STARPU are given, it looks for a StarPU without MPI +# - STARPU_CUDA: to activate detection of StarPU with CUDA +# - STARPU_FXT: to activate detection of StarPU with FxT +# - SCOTCH: to activate detection of PASTIX linked with SCOTCH +# - PTSCOTCH: to activate detection of PASTIX linked with SCOTCH +# - METIS: to activate detection of PASTIX linked with SCOTCH +# +# This module finds headers and pastix library. +# Results are reported in variables: +# PASTIX_FOUND - True if headers and requested libraries were found +# PASTIX_INCLUDE_DIRS - pastix include directories +# PASTIX_LIBRARY_DIRS - Link directories for pastix libraries +# PASTIX_LIBRARIES - pastix libraries +# PASTIX_INCLUDE_DIRS_DEP - pastix + dependencies include directories +# PASTIX_LIBRARY_DIRS_DEP - pastix + dependencies link directories +# PASTIX_LIBRARIES_DEP - pastix libraries + dependencies +# +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DPASTIX_DIR=path/to/pastix): +# PASTIX_DIR - Where to find the base directory of pastix +# PASTIX_INCDIR - Where to find the header files +# PASTIX_LIBDIR - Where to find the library files + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + + +if (NOT PASTIX_FOUND) + set(PASTIX_DIR "" CACHE PATH "Root directory of PASTIX library") + if (NOT PASTIX_FIND_QUIETLY) + message(STATUS "A cache variable, namely PASTIX_DIR, has been set to specify the install directory of PASTIX") + endif() +endif() + +# Set the version to find +set(PASTIX_LOOK_FOR_MPI ON) +set(PASTIX_LOOK_FOR_SEQ OFF) +set(PASTIX_LOOK_FOR_STARPU OFF) +set(PASTIX_LOOK_FOR_STARPU_CUDA OFF) +set(PASTIX_LOOK_FOR_STARPU_FXT OFF) +set(PASTIX_LOOK_FOR_SCOTCH ON) +set(PASTIX_LOOK_FOR_PTSCOTCH OFF) +set(PASTIX_LOOK_FOR_METIS OFF) + +if( PASTIX_FIND_COMPONENTS ) + foreach( component ${PASTIX_FIND_COMPONENTS} ) + if (${component} STREQUAL "SEQ") + # means we look for the sequential version of PaStiX (without MPI) + set(PASTIX_LOOK_FOR_SEQ ON) + set(PASTIX_LOOK_FOR_MPI OFF) + endif() + if (${component} STREQUAL "MPI") + # means we look for the MPI version of PaStiX (default) + set(PASTIX_LOOK_FOR_SEQ ON) + set(PASTIX_LOOK_FOR_MPI OFF) + endif() + if (${component} STREQUAL "STARPU") + # means we look for PaStiX with StarPU + set(PASTIX_LOOK_FOR_STARPU ON) + endif() + if (${component} STREQUAL "STARPU_CUDA") + # means we look for PaStiX with StarPU + CUDA + set(PASTIX_LOOK_FOR_STARPU ON) + set(PASTIX_LOOK_FOR_STARPU_CUDA ON) + endif() + if (${component} STREQUAL "STARPU_FXT") + # means we look for PaStiX with StarPU + FxT + set(PASTIX_LOOK_FOR_STARPU_FXT ON) + endif() + if (${component} STREQUAL "SCOTCH") + set(PASTIX_LOOK_FOR_SCOTCH ON) + endif() + if (${component} STREQUAL "SCOTCH") + set(PASTIX_LOOK_FOR_PTSCOTCH ON) + endif() + if (${component} STREQUAL "METIS") + set(PASTIX_LOOK_FOR_METIS ON) + endif() + endforeach() +endif() + + +# Dependencies detection +# ---------------------- + + +# Required dependencies +# --------------------- + +if (NOT PASTIX_FIND_QUIETLY) + message(STATUS "Looking for PASTIX - Try to detect pthread") +endif() +if (PASTIX_FIND_REQUIRED) + find_package(Threads REQUIRED) +else() + find_package(Threads) +endif() +set(PASTIX_EXTRA_LIBRARIES "") +if( THREADS_FOUND ) + list(APPEND PASTIX_EXTRA_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) +endif () + +# Add math library to the list of extra +# it normally exists on all common systems provided with a C compiler +if (NOT PASTIX_FIND_QUIETLY) + message(STATUS "Looking for PASTIX - Try to detect libm") +endif() +set(PASTIX_M_LIBRARIES "") +if(UNIX OR WIN32) + find_library( + PASTIX_M_m_LIBRARY + NAMES m + ) + mark_as_advanced(PASTIX_M_m_LIBRARY) + if (PASTIX_M_m_LIBRARY) + list(APPEND PASTIX_M_LIBRARIES "${PASTIX_M_m_LIBRARY}") + list(APPEND PASTIX_EXTRA_LIBRARIES "${PASTIX_M_m_LIBRARY}") + else() + if (PASTIX_FIND_REQUIRED) + message(FATAL_ERROR "Could NOT find libm on your system." + "Are you sure to a have a C compiler installed?") + endif() + endif() +endif() + +# Try to find librt (libposix4 - POSIX.1b Realtime Extensions library) +# on Unix systems except Apple ones because it does not exist on it +if (NOT PASTIX_FIND_QUIETLY) + message(STATUS "Looking for PASTIX - Try to detect librt") +endif() +set(PASTIX_RT_LIBRARIES "") +if(UNIX AND NOT APPLE) + find_library( + PASTIX_RT_rt_LIBRARY + NAMES rt + ) + mark_as_advanced(PASTIX_RT_rt_LIBRARY) + if (PASTIX_RT_rt_LIBRARY) + list(APPEND PASTIX_RT_LIBRARIES "${PASTIX_RT_rt_LIBRARY}") + list(APPEND PASTIX_EXTRA_LIBRARIES "${PASTIX_RT_rt_LIBRARY}") + else() + if (PASTIX_FIND_REQUIRED) + message(FATAL_ERROR "Could NOT find librt on your system") + endif() + endif() +endif() + +# PASTIX depends on HWLOC +#------------------------ +if (NOT PASTIX_FIND_QUIETLY) + message(STATUS "Looking for PASTIX - Try to detect HWLOC") +endif() +if (PASTIX_FIND_REQUIRED) + find_package(HWLOC REQUIRED) +else() + find_package(HWLOC) +endif() + +# PASTIX depends on BLAS +#----------------------- +if (NOT PASTIX_FIND_QUIETLY) + message(STATUS "Looking for PASTIX - Try to detect BLAS") +endif() +if (PASTIX_FIND_REQUIRED) + find_package(BLASEXT REQUIRED) +else() + find_package(BLASEXT) +endif() + +# Optional dependencies +# --------------------- + +# PASTIX may depend on MPI +#------------------------- +if (NOT MPI_FOUND AND PASTIX_LOOK_FOR_MPI) + if (NOT PASTIX_FIND_QUIETLY) + message(STATUS "Looking for PASTIX - Try to detect MPI") + endif() + # allows to use an external mpi compilation by setting compilers with + # -DMPI_C_COMPILER=path/to/mpicc -DMPI_Fortran_COMPILER=path/to/mpif90 + # at cmake configure + if(NOT MPI_C_COMPILER) + set(MPI_C_COMPILER mpicc) + endif() + if (PASTIX_FIND_REQUIRED) + find_package(MPI REQUIRED) + else() + find_package(MPI) + endif() + if (MPI_FOUND) + mark_as_advanced(MPI_LIBRARY) + mark_as_advanced(MPI_EXTRA_LIBRARY) + endif() +endif (NOT MPI_FOUND AND PASTIX_LOOK_FOR_MPI) + +# PASTIX may depend on STARPU +#---------------------------- +if( NOT STARPU_FOUND AND PASTIX_LOOK_FOR_STARPU) + + if (NOT PASTIX_FIND_QUIETLY) + message(STATUS "Looking for PASTIX - Try to detect StarPU") + endif() + + set(PASTIX_STARPU_VERSION "1.1" CACHE STRING "oldest STARPU version desired") + + # create list of components in order to make a single call to find_package(starpu...) + # we explicitly need a StarPU version built with hwloc + set(STARPU_COMPONENT_LIST "HWLOC") + + # StarPU may depend on MPI + # allows to use an external mpi compilation by setting compilers with + # -DMPI_C_COMPILER=path/to/mpicc -DMPI_Fortran_COMPILER=path/to/mpif90 + # at cmake configure + if (PASTIX_LOOK_FOR_MPI) + if(NOT MPI_C_COMPILER) + set(MPI_C_COMPILER mpicc) + endif() + list(APPEND STARPU_COMPONENT_LIST "MPI") + endif() + if (PASTIX_LOOK_FOR_STARPU_CUDA) + list(APPEND STARPU_COMPONENT_LIST "CUDA") + endif() + if (PASTIX_LOOK_FOR_STARPU_FXT) + list(APPEND STARPU_COMPONENT_LIST "FXT") + endif() + # set the list of optional dependencies we may discover + if (PASTIX_FIND_REQUIRED) + find_package(STARPU ${PASTIX_STARPU_VERSION} REQUIRED + COMPONENTS ${STARPU_COMPONENT_LIST}) + else() + find_package(STARPU ${PASTIX_STARPU_VERSION} + COMPONENTS ${STARPU_COMPONENT_LIST}) + endif() + +endif( NOT STARPU_FOUND AND PASTIX_LOOK_FOR_STARPU) + +# PASTIX may depends on SCOTCH +#----------------------------- +if (NOT SCOTCH_FOUND AND PASTIX_LOOK_FOR_SCOTCH) + if (NOT PASTIX_FIND_QUIETLY) + message(STATUS "Looking for PASTIX - Try to detect SCOTCH") + endif() + if (PASTIX_FIND_REQUIRED ) + find_package(SCOTCH REQUIRED) + else() + find_package(SCOTCH) + endif() +endif() + +# PASTIX may depends on PTSCOTCH +#------------------------------- +if (NOT PTSCOTCH_FOUND AND PASTIX_LOOK_FOR_PTSCOTCH) + if (NOT PASTIX_FIND_QUIETLY) + message(STATUS "Looking for PASTIX - Try to detect PTSCOTCH") + endif() + if (PASTIX_FIND_REQUIRED) + find_package(PTSCOTCH REQUIRED) + else() + find_package(PTSCOTCH) + endif() +endif() + +# PASTIX may depends on METIS +#---------------------------- +if (NOT METIS_FOUND AND PASTIX_LOOK_FOR_METIS) + if (NOT PASTIX_FIND_QUIETLY) + message(STATUS "Looking for PASTIX - Try to detect METIS") + endif() + if (PASTIX_FIND_REQUIRED) + find_package(METIS REQUIRED) + else() + find_package(METIS) + endif() +endif() + +# Error if pastix required and no partitioning lib found +if (PASTIX_FIND_REQUIRED AND NOT SCOTCH_FOUND AND NOT PTSCOTCH_FOUND AND NOT METIS_FOUND) + message(FATAL_ERROR "Could NOT find any partitioning library on your system" + " (install scotch, ptscotch or metis)") +endif() + + +# Looking for PaStiX +# ------------------ + +# Looking for include +# ------------------- + +# Add system include paths to search include +# ------------------------------------------ +unset(_inc_env) +if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") +else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") +endif() +list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") +list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") +list(REMOVE_DUPLICATES _inc_env) + + +# Try to find the pastix header in the given paths +# --------------------------------------------------- +# call cmake macro to find the header path +if(PASTIX_INCDIR) + set(PASTIX_pastix.h_DIRS "PASTIX_pastix.h_DIRS-NOTFOUND") + find_path(PASTIX_pastix.h_DIRS + NAMES pastix.h + HINTS ${PASTIX_INCDIR}) +else() + if(PASTIX_DIR) + set(PASTIX_pastix.h_DIRS "PASTIX_pastix.h_DIRS-NOTFOUND") + find_path(PASTIX_pastix.h_DIRS + NAMES pastix.h + HINTS ${PASTIX_DIR} + PATH_SUFFIXES "include" "include/pastix") + else() + set(PASTIX_pastix.h_DIRS "PASTIX_pastix.h_DIRS-NOTFOUND") + find_path(PASTIX_pastix.h_DIRS + NAMES pastix.h + HINTS ${_inc_env}) + endif() +endif() +mark_as_advanced(PASTIX_pastix.h_DIRS) + +# If found, add path to cmake variable +# ------------------------------------ +if (PASTIX_pastix.h_DIRS) + set(PASTIX_INCLUDE_DIRS "${PASTIX_pastix.h_DIRS}") +else () + set(PASTIX_INCLUDE_DIRS "PASTIX_INCLUDE_DIRS-NOTFOUND") + if(NOT PASTIX_FIND_QUIETLY) + message(STATUS "Looking for pastix -- pastix.h not found") + endif() +endif() + + +# Looking for lib +# --------------- + +# Add system library paths to search lib +# -------------------------------------- +unset(_lib_env) +if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") +else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") +endif() +list(REMOVE_DUPLICATES _lib_env) + +# Try to find the pastix lib in the given paths +# ------------------------------------------------ + +# create list of libs to find +set(PASTIX_libs_to_find "pastix_murge;pastix") + +# call cmake macro to find the lib path +if(PASTIX_LIBDIR) + foreach(pastix_lib ${PASTIX_libs_to_find}) + set(PASTIX_${pastix_lib}_LIBRARY "PASTIX_${pastix_lib}_LIBRARY-NOTFOUND") + find_library(PASTIX_${pastix_lib}_LIBRARY + NAMES ${pastix_lib} + HINTS ${PASTIX_LIBDIR}) + endforeach() +else() + if(PASTIX_DIR) + foreach(pastix_lib ${PASTIX_libs_to_find}) + set(PASTIX_${pastix_lib}_LIBRARY "PASTIX_${pastix_lib}_LIBRARY-NOTFOUND") + find_library(PASTIX_${pastix_lib}_LIBRARY + NAMES ${pastix_lib} + HINTS ${PASTIX_DIR} + PATH_SUFFIXES lib lib32 lib64) + endforeach() + else() + foreach(pastix_lib ${PASTIX_libs_to_find}) + set(PASTIX_${pastix_lib}_LIBRARY "PASTIX_${pastix_lib}_LIBRARY-NOTFOUND") + find_library(PASTIX_${pastix_lib}_LIBRARY + NAMES ${pastix_lib} + HINTS ${_lib_env}) + endforeach() + endif() +endif() + +# If found, add path to cmake variable +# ------------------------------------ +foreach(pastix_lib ${PASTIX_libs_to_find}) + + get_filename_component(${pastix_lib}_lib_path ${PASTIX_${pastix_lib}_LIBRARY} PATH) + # set cmake variables (respects naming convention) + if (PASTIX_LIBRARIES) + list(APPEND PASTIX_LIBRARIES "${PASTIX_${pastix_lib}_LIBRARY}") + else() + set(PASTIX_LIBRARIES "${PASTIX_${pastix_lib}_LIBRARY}") + endif() + if (PASTIX_LIBRARY_DIRS) + list(APPEND PASTIX_LIBRARY_DIRS "${${pastix_lib}_lib_path}") + else() + set(PASTIX_LIBRARY_DIRS "${${pastix_lib}_lib_path}") + endif() + mark_as_advanced(PASTIX_${pastix_lib}_LIBRARY) + +endforeach(pastix_lib ${PASTIX_libs_to_find}) + +# check a function to validate the find +if(PASTIX_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # PASTIX + if (PASTIX_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${PASTIX_INCLUDE_DIRS}") + endif() + foreach(libdir ${PASTIX_LIBRARY_DIRS}) + if (libdir) + list(APPEND REQUIRED_LIBDIRS "${libdir}") + endif() + endforeach() + set(REQUIRED_LIBS "${PASTIX_LIBRARIES}") + # STARPU + if (PASTIX_LOOK_FOR_STARPU AND STARPU_FOUND) + if (STARPU_INCLUDE_DIRS_DEP) + list(APPEND REQUIRED_INCDIRS "${STARPU_INCLUDE_DIRS_DEP}") + endif() + foreach(libdir ${STARPU_LIBRARY_DIRS_DEP}) + if (libdir) + list(APPEND REQUIRED_LIBDIRS "${libdir}") + endif() + endforeach() + list(APPEND REQUIRED_LIBS "${STARPU_LIBRARIES_DEP}") + endif() + # CUDA + if (PASTIX_LOOK_FOR_STARPU_CUDA AND CUDA_FOUND) + if (CUDA_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${CUDA_INCLUDE_DIRS}") + endif() + foreach(libdir ${CUDA_LIBRARY_DIRS}) + if (libdir) + list(APPEND REQUIRED_LIBDIRS "${libdir}") + endif() + endforeach() + list(APPEND REQUIRED_LIBS "${CUDA_CUBLAS_LIBRARIES};${CUDA_LIBRARIES}") + endif() + # MPI + if (PASTIX_LOOK_FOR_MPI AND MPI_FOUND) + if (MPI_C_INCLUDE_PATH) + list(APPEND REQUIRED_INCDIRS "${MPI_C_INCLUDE_PATH}") + endif() + if (MPI_C_LINK_FLAGS) + list(APPEND REQUIRED_LIBS "${MPI_C_LINK_FLAGS}") + endif() + list(APPEND REQUIRED_LIBS "${MPI_C_LIBRARIES}") + endif() + # HWLOC + if (HWLOC_FOUND) + if (HWLOC_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${HWLOC_INCLUDE_DIRS}") + endif() + foreach(libdir ${HWLOC_LIBRARY_DIRS}) + if (libdir) + list(APPEND REQUIRED_LIBDIRS "${libdir}") + endif() + endforeach() + list(APPEND REQUIRED_LIBS "${HWLOC_LIBRARIES}") + endif() + # BLAS + if (BLAS_FOUND) + if (BLAS_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${BLAS_INCLUDE_DIRS}") + endif() + foreach(libdir ${BLAS_LIBRARY_DIRS}) + if (libdir) + list(APPEND REQUIRED_LIBDIRS "${libdir}") + endif() + endforeach() + list(APPEND REQUIRED_LIBS "${BLAS_LIBRARIES}") + endif() + # SCOTCH + if (PASTIX_LOOK_FOR_SCOTCH AND SCOTCH_FOUND) + if (SCOTCH_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${SCOTCH_INCLUDE_DIRS}") + endif() + foreach(libdir ${SCOTCH_LIBRARY_DIRS}) + if (libdir) + list(APPEND REQUIRED_LIBDIRS "${libdir}") + endif() + endforeach() + list(APPEND REQUIRED_LIBS "${SCOTCH_LIBRARIES}") + endif() + # PTSCOTCH + if (PASTIX_LOOK_FOR_PTSCOTCH AND PTSCOTCH_FOUND) + if (PTSCOTCH_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${PTSCOTCH_INCLUDE_DIRS}") + endif() + foreach(libdir ${PTSCOTCH_LIBRARY_DIRS}) + if (libdir) + list(APPEND REQUIRED_LIBDIRS "${libdir}") + endif() + endforeach() + list(APPEND REQUIRED_LIBS "${PTSCOTCH_LIBRARIES}") + endif() + # METIS + if (PASTIX_LOOK_FOR_METIS AND METIS_FOUND) + if (METIS_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${METIS_INCLUDE_DIRS}") + endif() + foreach(libdir ${METIS_LIBRARY_DIRS}) + if (libdir) + list(APPEND REQUIRED_LIBDIRS "${libdir}") + endif() + endforeach() + list(APPEND REQUIRED_LIBS "${METIS_LIBRARIES}") + endif() + # Fortran + if (CMAKE_Fortran_COMPILER MATCHES ".+gfortran.*") + list(APPEND REQUIRED_LIBS "-lgfortran") + elseif (CMAKE_Fortran_COMPILER MATCHES ".+ifort.*") + list(APPEND REQUIRED_LIBS "-lifcore") + endif() + # EXTRA LIBS such that pthread, m, rt + list(APPEND REQUIRED_LIBS ${PASTIX_EXTRA_LIBRARIES}) + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + + # test link + unset(PASTIX_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(pastix PASTIX_WORKS) + mark_as_advanced(PASTIX_WORKS) + + if(PASTIX_WORKS) + # save link with dependencies + set(PASTIX_LIBRARIES_DEP "${REQUIRED_LIBS}") + set(PASTIX_LIBRARY_DIRS_DEP "${REQUIRED_LIBDIRS}") + set(PASTIX_INCLUDE_DIRS_DEP "${REQUIRED_INCDIRS}") + else() + if(NOT PASTIX_FIND_QUIETLY) + message(STATUS "Looking for PASTIX : test of pastix() fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + message(STATUS "Maybe PASTIX is linked with specific libraries. " + "Have you tried with COMPONENTS (MPI/SEQ, STARPU, STARPU_CUDA, SCOTCH, PTSCOTCH, METIS)? " + "See the explanation in FindPASTIX.cmake.") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) +endif(PASTIX_LIBRARIES) + + +# check that PASTIX has been found +# --------------------------------- +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(PASTIX DEFAULT_MSG + PASTIX_LIBRARIES + PASTIX_WORKS) diff --git a/cmake_modules/morse/find/FindPTSCOTCH.cmake b/cmake_modules/morse/find/FindPTSCOTCH.cmake new file mode 100644 index 000000000..48feec169 --- /dev/null +++ b/cmake_modules/morse/find/FindPTSCOTCH.cmake @@ -0,0 +1,326 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find PTSCOTCH include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(PTSCOTCH +# [REQUIRED] # Fail with error if ptscotch is not found +# ) +# +# PTSCOTCH depends on the following libraries: +# - Threads +# - MPI +# +# This module finds headers and ptscotch library. +# Results are reported in variables: +# PTSCOTCH_FOUND - True if headers and requested libraries were found +# PTSCOTCH_INCLUDE_DIRS - ptscotch include directories +# PTSCOTCH_LIBRARY_DIRS - Link directories for ptscotch libraries +# PTSCOTCH_LIBRARIES - ptscotch component libraries to be linked +# PTSCOTCH_INCLUDE_DIRS_DEP - ptscotch + dependencies include directories +# PTSCOTCH_LIBRARY_DIRS_DEP - ptscotch + dependencies link directories +# PTSCOTCH_LIBRARIES_DEP - ptscotch libraries + dependencies +# PTSCOTCH_INTSIZE - Number of octets occupied by a SCOTCH_Num +# +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DPTSCOTCH=path/to/ptscotch): +# PTSCOTCH_DIR - Where to find the base directory of ptscotch +# PTSCOTCH_INCDIR - Where to find the header files +# PTSCOTCH_LIBDIR - Where to find the library files + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + +if (NOT PTSCOTCH_FOUND) + set(PTSCOTCH_DIR "" CACHE PATH "Root directory of PTSCOTCH library") + if (NOT PTSCOTCH_FIND_QUIETLY) + message(STATUS "A cache variable, namely PTSCOTCH_DIR, has been set to specify the install directory of PTSCOTCH") + endif() +endif() + +# PTSCOTCH may depend on Threads, try to find it +if (NOT THREADS_FOUND) + if (PTSCOTCH_FIND_REQUIRED) + find_package(Threads REQUIRED) + else() + find_package(Threads) + endif() +endif() + +# PTSCOTCH may depend on MPI, try to find it +if (NOT MPI_FOUND) + if (PTSCOTCH_FIND_REQUIRED) + find_package(MPI REQUIRED) + else() + find_package(MPI) + endif() +endif() + +# Looking for include +# ------------------- + +# Add system include paths to search include +# ------------------------------------------ +unset(_inc_env) +if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") +else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") +endif() +list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") +list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") +list(REMOVE_DUPLICATES _inc_env) + + +# Try to find the ptscotch header in the given paths +# ------------------------------------------------- +# call cmake macro to find the header path +if(PTSCOTCH_INCDIR) + set(PTSCOTCH_ptscotch.h_DIRS "PTSCOTCH_ptscotch.h_DIRS-NOTFOUND") + find_path(PTSCOTCH_ptscotch.h_DIRS + NAMES ptscotch.h + HINTS ${PTSCOTCH_INCDIR}) +else() + if(PTSCOTCH_DIR) + set(PTSCOTCH_ptscotch.h_DIRS "PTSCOTCH_ptscotch.h_DIRS-NOTFOUND") + find_path(PTSCOTCH_ptscotch.h_DIRS + NAMES ptscotch.h + HINTS ${PTSCOTCH_DIR} + PATH_SUFFIXES include) + else() + set(PTSCOTCH_ptscotch.h_DIRS "PTSCOTCH_ptscotch.h_DIRS-NOTFOUND") + find_path(PTSCOTCH_ptscotch.h_DIRS + NAMES ptscotch.h + HINTS ${_inc_env}) + endif() +endif() +mark_as_advanced(PTSCOTCH_ptscotch.h_DIRS) + +# If found, add path to cmake variable +# ------------------------------------ +if (PTSCOTCH_ptscotch.h_DIRS) + set(PTSCOTCH_INCLUDE_DIRS "${PTSCOTCH_ptscotch.h_DIRS}") +else () + set(PTSCOTCH_INCLUDE_DIRS "PTSCOTCH_INCLUDE_DIRS-NOTFOUND") + if (NOT PTSCOTCH_FIND_QUIETLY) + message(STATUS "Looking for ptscotch -- ptscotch.h not found") + endif() +endif() + + +# Looking for lib +# --------------- + +# Add system library paths to search lib +# -------------------------------------- +unset(_lib_env) +if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") +else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") +endif() +list(REMOVE_DUPLICATES _lib_env) + +# Try to find the ptscotch lib in the given paths +# ---------------------------------------------- + +set(PTSCOTCH_libs_to_find "ptscotch;scotch;scotcherrexit") + +# call cmake macro to find the lib path +if(PTSCOTCH_LIBDIR) + foreach(ptscotch_lib ${PTSCOTCH_libs_to_find}) + set(PTSCOTCH_${ptscotch_lib}_LIBRARY "PTSCOTCH_${ptscotch_lib}_LIBRARY-NOTFOUND") + find_library(PTSCOTCH_${ptscotch_lib}_LIBRARY + NAMES ${ptscotch_lib} + HINTS ${PTSCOTCH_LIBDIR}) + endforeach() +else() + if(PTSCOTCH_DIR) + foreach(ptscotch_lib ${PTSCOTCH_libs_to_find}) + set(PTSCOTCH_${ptscotch_lib}_LIBRARY "PTSCOTCH_${ptscotch_lib}_LIBRARY-NOTFOUND") + find_library(PTSCOTCH_${ptscotch_lib}_LIBRARY + NAMES ${ptscotch_lib} + HINTS ${PTSCOTCH_DIR} + PATH_SUFFIXES lib lib32 lib64) + endforeach() + else() + foreach(ptscotch_lib ${PTSCOTCH_libs_to_find}) + set(PTSCOTCH_${ptscotch_lib}_LIBRARY "PTSCOTCH_${ptscotch_lib}_LIBRARY-NOTFOUND") + find_library(PTSCOTCH_${ptscotch_lib}_LIBRARY + NAMES ${ptscotch_lib} + HINTS ${_lib_env}) + endforeach() + endif() +endif() + +set(PTSCOTCH_LIBRARIES "") +set(PTSCOTCH_LIBRARY_DIRS "") +# If found, add path to cmake variable +# ------------------------------------ +foreach(ptscotch_lib ${PTSCOTCH_libs_to_find}) + + if (PTSCOTCH_${ptscotch_lib}_LIBRARY) + get_filename_component(${ptscotch_lib}_lib_path "${PTSCOTCH_${ptscotch_lib}_LIBRARY}" PATH) + # set cmake variables + list(APPEND PTSCOTCH_LIBRARIES "${PTSCOTCH_${ptscotch_lib}_LIBRARY}") + list(APPEND PTSCOTCH_LIBRARY_DIRS "${${ptscotch_lib}_lib_path}") + else () + list(APPEND PTSCOTCH_LIBRARIES "${PTSCOTCH_${ptscotch_lib}_LIBRARY}") + if (NOT PTSCOTCH_FIND_QUIETLY) + message(STATUS "Looking for ptscotch -- lib ${ptscotch_lib} not found") + endif() + endif () + + mark_as_advanced(PTSCOTCH_${ptscotch_lib}_LIBRARY) + +endforeach() + +# check a function to validate the find +if(PTSCOTCH_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # PTSCOTCH + if (PTSCOTCH_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${PTSCOTCH_INCLUDE_DIRS}") + endif() + if (PTSCOTCH_LIBRARY_DIRS) + set(REQUIRED_LIBDIRS "${PTSCOTCH_LIBRARY_DIRS}") + endif() + set(REQUIRED_LIBS "${PTSCOTCH_LIBRARIES}") + # MPI + if (MPI_FOUND) + if (MPI_C_INCLUDE_PATH) + list(APPEND CMAKE_REQUIRED_INCLUDES "${MPI_C_INCLUDE_PATH}") + endif() + if (MPI_C_LINK_FLAGS) + list(APPEND REQUIRED_LIBS "${MPI_C_LINK_FLAGS}") + endif() + list(APPEND REQUIRED_LIBS "${MPI_C_LIBRARIES}") + endif() + endif() + # THREADS + if(CMAKE_THREAD_LIBS_INIT) + list(APPEND REQUIRED_LIBS "${CMAKE_THREAD_LIBS_INIT}") + endif() + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + + # test link + unset(PTSCOTCH_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(SCOTCH_dgraphInit PTSCOTCH_WORKS) + mark_as_advanced(PTSCOTCH_WORKS) + + if(PTSCOTCH_WORKS) + # save link with dependencies + set(PTSCOTCH_LIBRARIES_DEP "${REQUIRED_LIBS}") + set(PTSCOTCH_LIBRARY_DIRS_DEP "${REQUIRED_LIBDIRS}") + set(PTSCOTCH_INCLUDE_DIRS_DEP "${REQUIRED_INCDIRS}") + else() + if(NOT PTSCOTCH_FIND_QUIETLY) + message(STATUS "Looking for PTSCOTCH : test of SCOTCH_dgraphInit with PTSCOTCH library fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) +endif(PTSCOTCH_LIBRARIES) + + +# Check the size of SCOTCH_Num +# --------------------------------- +set(CMAKE_REQUIRED_INCLUDES ${PTSCOTCH_INCLUDE_DIRS}) + +include(CheckCSourceRuns) +#stdio.h and stdint.h should be included by scotch.h directly +set(PTSCOTCH_C_TEST_SCOTCH_Num_4 " +#include <stdio.h> +#include <stdint.h> +#include <ptscotch.h> +int main(int argc, char **argv) { + if (sizeof(SCOTCH_Num) == 4) + return 0; + else + return 1; +} +") + +set(PTSCOTCH_C_TEST_SCOTCH_Num_8 " +#include <stdio.h> +#include <stdint.h> +#include <ptscotch.h> +int main(int argc, char **argv) { + if (sizeof(SCOTCH_Num) == 8) + return 0; + else + return 1; +} +") +check_c_source_runs("${PTSCOTCH_C_TEST_SCOTCH_Num_4}" PTSCOTCH_Num_4) +if(NOT PTSCOTCH_Num_4) + check_c_source_runs("${PTSCOTCH_C_TEST_SCOTCH_Num_8}" PTSCOTCH_Num_8) + if(NOT PTSCOTCH_Num_8) + set(PTSCOTCH_INTSIZE -1) + else() + set(PTSCOTCH_INTSIZE 8) + endif() +else() + set(PTSCOTCH_INTSIZE 4) +endif() +set(CMAKE_REQUIRED_INCLUDES "") + +# check that PTSCOTCH has been found +# --------------------------------- +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(PTSCOTCH DEFAULT_MSG + PTSCOTCH_LIBRARIES + PTSCOTCH_WORKS) +# +# TODO: Add possibility to check for specific functions in the library +# diff --git a/cmake_modules/morse/find/FindQUARK.cmake b/cmake_modules/morse/find/FindQUARK.cmake new file mode 100644 index 000000000..1735879de --- /dev/null +++ b/cmake_modules/morse/find/FindQUARK.cmake @@ -0,0 +1,283 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find QUARK include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(QUARK +# [REQUIRED] # Fail with error if quark is not found +# [COMPONENTS <comp1> <comp2> ...] # dependencies +# ) +# +# QUARK depends on the following libraries: +# - Threads +# +# COMPONENTS are optional libraries QUARK could be linked with, +# Use it to drive detection of a specific compilation chain +# COMPONENTS can be some of the following: +# - HWLOC: to activate detection of QUARK linked with hwloc +# +# This module finds headers and quark library. +# Results are reported in variables: +# QUARK_FOUND - True if headers and requested libraries were found +# QUARK_INCLUDE_DIRS - quark include directories +# QUARK_LIBRARY_DIRS - Link directories for quark libraries +# QUARK_LIBRARIES - quark component libraries to be linked +# QUARK_INCLUDE_DIRS_DEP - quark + dependencies include directories +# QUARK_LIBRARY_DIRS_DEP - quark + dependencies link directories +# QUARK_LIBRARIES_DEP - quark libraries + dependencies +# +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DQUARK=path/to/quark): +# QUARK_DIR - Where to find the base directory of quark +# QUARK_INCDIR - Where to find the header files +# QUARK_LIBDIR - Where to find the library files + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + + +if (NOT QUARK_FOUND) + set(QUARK_DIR "" CACHE PATH "Root directory of QUARK library") + if (NOT QUARK_FIND_QUIETLY) + message(STATUS "A cache variable, namely QUARK_DIR, has been set to specify the install directory of QUARK") + endif() +endif() + +# QUARK may depend on HWLOC +# try to find it specified as COMPONENTS during the call +set(QUARK_LOOK_FOR_HWLOC FALSE) + +if( QUARK_FIND_COMPONENTS ) + foreach( component ${QUARK_FIND_COMPONENTS} ) + if(${component} STREQUAL "HWLOC") + set(QUARK_LOOK_FOR_HWLOC TRUE) + endif() + endforeach() +endif() + +# QUARK may depend on Threads, try to find it +if (NOT Threads_FOUND) + if (QUARK_FIND_REQUIRED) + find_package(Threads REQUIRED) + else() + find_package(Threads) + endif() +endif() + +# QUARK may depend on HWLOC, try to find it +if (NOT HWLOC_FOUND AND QUARK_LOOK_FOR_HWLOC) + if (QUARK_FIND_REQUIRED) + find_package(HWLOC REQUIRED) + else() + find_package(HWLOC) + endif() +endif() + +# Looking for include +# ------------------- + +# Add system include paths to search include +# ------------------------------------------ +unset(_inc_env) +if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") +else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") +endif() +list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") +list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") +list(REMOVE_DUPLICATES _inc_env) + + +# Try to find the quark header in the given paths +# ------------------------------------------------- +# call cmake macro to find the header path +if(QUARK_INCDIR) + set(QUARK_quark.h_DIRS "QUARK_quark.h_DIRS-NOTFOUND") + find_path(QUARK_quark.h_DIRS + NAMES quark.h + HINTS ${QUARK_INCDIR}) +else() + if(QUARK_DIR) + set(QUARK_quark.h_DIRS "QUARK_quark.h_DIRS-NOTFOUND") + find_path(QUARK_quark.h_DIRS + NAMES quark.h + HINTS ${QUARK_DIR} + PATH_SUFFIXES include) + else() + set(QUARK_quark.h_DIRS "QUARK_quark.h_DIRS-NOTFOUND") + find_path(QUARK_quark.h_DIRS + NAMES quark.h + HINTS ${_inc_env}) + endif() +endif() +mark_as_advanced(QUARK_quark.h_DIRS) + +# If found, add path to cmake variable +# ------------------------------------ +if (QUARK_quark.h_DIRS) + set(QUARK_INCLUDE_DIRS "${QUARK_quark.h_DIRS}") +else () + set(QUARK_INCLUDE_DIRS "QUARK_INCLUDE_DIRS-NOTFOUND") + if(NOT QUARK_FIND_QUIETLY) + message(STATUS "Looking for quark -- quark.h not found") + endif() +endif() + + +# Looking for lib +# --------------- + +# Add system library paths to search lib +# -------------------------------------- +unset(_lib_env) +if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") +else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") +endif() +list(REMOVE_DUPLICATES _lib_env) + +# Try to find the quark lib in the given paths +# ---------------------------------------------- + +# call cmake macro to find the lib path +if(QUARK_LIBDIR) + set(QUARK_quark_LIBRARY "QUARK_quark_LIBRARY-NOTFOUND") + find_library(QUARK_quark_LIBRARY + NAMES quark + HINTS ${QUARK_LIBDIR}) +else() + if(QUARK_DIR) + set(QUARK_quark_LIBRARY "QUARK_quark_LIBRARY-NOTFOUND") + find_library(QUARK_quark_LIBRARY + NAMES quark + HINTS ${QUARK_DIR} + PATH_SUFFIXES lib lib32 lib64) + else() + set(QUARK_quark_LIBRARY "QUARK_quark_LIBRARY-NOTFOUND") + find_library(QUARK_quark_LIBRARY + NAMES quark + HINTS ${_lib_env}) + endif() +endif() +mark_as_advanced(QUARK_quark_LIBRARY) + +# If found, add path to cmake variable +# ------------------------------------ +if (QUARK_quark_LIBRARY) + get_filename_component(quark_lib_path "${QUARK_quark_LIBRARY}" PATH) + # set cmake variables + set(QUARK_LIBRARIES "${QUARK_quark_LIBRARY}") + set(QUARK_LIBRARY_DIRS "${quark_lib_path}") +else () + set(QUARK_LIBRARIES "QUARK_LIBRARIES-NOTFOUND") + set(QUARK_LIBRARY_DIRS "QUARK_LIBRARY_DIRS-NOTFOUND") + if(NOT QUARK_FIND_QUIETLY) + message(STATUS "Looking for quark -- lib quark not found") + endif() +endif () + +# check a function to validate the find +if(QUARK_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # QUARK + if (QUARK_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${QUARK_INCLUDE_DIRS}") + endif() + if (QUARK_LIBRARY_DIRS) + set(CMAKE_REQUIRED_FLAGS "${QUARK_LIBRARY_DIRS}") + endif() + set(REQUIRED_LIBS "${QUARK_LIBRARIES}") + # HWLOC + if (HWLOC_FOUND AND QUARK_LOOK_FOR_HWLOC) + if (HWLOC_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${HWLOC_INCLUDE_DIRS}") + endif() + if (HWLOC_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${HWLOC_LIBRARY_DIRS}") + endif() + list(APPEND REQUIRED_LIBS "${HWLOC_LIBRARIES}") + endif() + # THREADS + list(APPEND REQUIRED_LIBS "${CMAKE_THREAD_LIBS_INIT}") + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + + # test link + unset(QUARK_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(QUARK_New QUARK_WORKS) + mark_as_advanced(QUARK_WORKS) + + if(QUARK_WORKS) + # save link with dependencies + set(QUARK_LIBRARIES_DEP "${REQUIRED_LIBS}") + set(QUARK_LIBRARY_DIRS_DEP "${REQUIRED_LIBDIRS}") + set(QUARK_INCLUDE_DIRS_DEP "${REQUIRED_INCDIRS}") + else() + if(NOT QUARK_FIND_QUIETLY) + message(STATUS "Looking for QUARK : test of QUARK_New with QUARK library fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + message(STATUS "Maybe QUARK is linked with specific libraries like. " + "Have you tried with COMPONENTS (HWLOC)? See the explanation in FindQUARK.cmake.") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) +endif(QUARK_LIBRARIES) + + +# check that QUARK has been found +# --------------------------------- +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(QUARK DEFAULT_MSG + QUARK_LIBRARIES + QUARK_WORKS) diff --git a/cmake_modules/morse/find/FindSCALAPACK.cmake b/cmake_modules/morse/find/FindSCALAPACK.cmake new file mode 100644 index 000000000..4d9151880 --- /dev/null +++ b/cmake_modules/morse/find/FindSCALAPACK.cmake @@ -0,0 +1,450 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find SCALAPACK library +# This module finds an installed fortran library that implements the SCALAPACK +# linear-algebra interface. +# +# This module sets the following variables: +# SCALAPACK_FOUND - set to true if a library implementing the SCALAPACK interface +# is found +# SCALAPACK_LINKER_FLAGS - uncached list of required linker flags (excluding -l +# and -L). +# SCALAPACK_LIBRARIES - uncached list of libraries (using full path name) to +# link against to use SCALAPACK +# SCALAPACK95_LIBRARIES - uncached list of libraries (using full path name) to +# link against to use SCALAPACK95 +# SCALAPACK95_FOUND - set to true if a library implementing the SCALAPACK f95 +# interface is found +# BLA_STATIC if set on this determines what kind of linkage we do (static) +# BLA_VENDOR if set checks only the specified vendor, if not set checks +# all the possibilities +# BLA_F95 if set on tries to find the f95 interfaces for BLAS/SCALAPACK +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DSCALAPACK_DIR=path/to/scalapack): +# SCALAPACK_DIR - Where to find the base directory of scalapack +# SCALAPACK_INCDIR - Where to find the header files +# SCALAPACK_LIBDIR - Where to find the library files +# Note that if BLAS_DIR is set, it will also look for scalapack in it +### List of vendors (BLA_VENDOR) valid in this module +## Intel(mkl), ACML, Apple, NAS, Generic + +#============================================================================= +# Copyright 2007-2009 Kitware, Inc. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + + +# Set some colors +if(NOT WIN32) + string(ASCII 27 Esc) + set(ColourReset "${Esc}[m") + set(ColourBold "${Esc}[1m") + set(Red "${Esc}[31m") + set(Green "${Esc}[32m") + set(Yellow "${Esc}[33m") + set(Blue "${Esc}[34m") + set(Magenta "${Esc}[35m") + set(Cyan "${Esc}[36m") + set(White "${Esc}[37m") + set(BoldRed "${Esc}[1;31m") + set(BoldGreen "${Esc}[1;32m") + set(BoldYellow "${Esc}[1;33m") + set(BoldBlue "${Esc}[1;34m") + set(BoldMagenta "${Esc}[1;35m") + set(BoldCyan "${Esc}[1;36m") + set(BoldWhite "${Esc}[1;37m") +endif() + +## Some macros to print status when search for headers and libs +# This macro informs why the _lib_to_find file has not been found +macro(Print_Find_Library_Blas_Status _libname _lib_to_find) + + # save _libname upper/lower case + string(TOUPPER ${_libname} LIBNAME) + string(TOLOWER ${_libname} libname) + + # print status + #message(" ") + if(${LIBNAME}_LIBDIR) + message("${Yellow}${LIBNAME}_LIBDIR is defined but ${_lib_to_find}" + "has not been found in ${ARGN}${ColourReset}") + else() + if(${LIBNAME}_DIR) + message("${Yellow}${LIBNAME}_DIR is defined but ${_lib_to_find}" + "has not been found in ${ARGN}${ColourReset}") + else() + message("${Yellow}${_lib_to_find} not found." + "Nor ${LIBNAME}_DIR neither ${LIBNAME}_LIBDIR" + "are defined so that we look for ${_lib_to_find} in" + "system paths (Linux: LD_LIBRARY_PATH, Windows: LIB," + "Mac: DYLD_LIBRARY_PATH," + "CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES," + "CMAKE_C_IMPLICIT_LINK_DIRECTORIES)${ColourReset}") + if(_lib_env) + message("${Yellow}${_lib_to_find} has not been found in" + "${_lib_env}${ColourReset}") + endif() + endif() + endif() + message("${BoldYellow}Please indicate where to find ${_lib_to_find}. You have three options:\n" + "- Option 1: Provide the root directory of the library with cmake option: -D${LIBNAME}_DIR=your/path/to/${libname}/\n" + "- Option 2: Provide the directory where to find the library with cmake option: -D${LIBNAME}_LIBDIR=your/path/to/${libname}/lib/\n" + "- Option 3: Update your environment variable (Linux: LD_LIBRARY_PATH, Windows: LIB, Mac: DYLD_LIBRARY_PATH)\n" + "- Option 4: If your library provides a PkgConfig file, make sure pkg-config finds your library${ColourReset}") + +endmacro() + +if (NOT SCALAPACK_FOUND) + set(SCALAPACK_DIR "" CACHE PATH "Root directory of SCALAPACK library") + if (NOT SCALAPACK_FIND_QUIETLY) + message(STATUS "A cache variable, namely SCALAPACK_DIR, has been set to specify the install directory of SCALAPACK") + endif() +endif (NOT SCALAPACK_FOUND) + +option(SCALAPACK_VERBOSE "Print some additional information during SCALAPACK +libraries detection" OFF) +if (BLAS_VERBOSE) + set(SCALAPACK_VERBOSE ON) +endif () +set(_scalapack_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + +get_property(_LANGUAGES_ GLOBAL PROPERTY ENABLED_LANGUAGES) +if (NOT _LANGUAGES_ MATCHES Fortran) +include(CheckFunctionExists) +else (NOT _LANGUAGES_ MATCHES Fortran) +include(CheckFortranFunctionExists) +endif (NOT _LANGUAGES_ MATCHES Fortran) + +set(SCALAPACK_FOUND FALSE) +set(SCALAPACK95_FOUND FALSE) + +# TODO: move this stuff to separate module + +macro(Check_Scalapack_Libraries LIBRARIES _prefix _name _flags _list _blaslapack _mpi _threads) +# This macro checks for the existence of the combination of fortran libraries +# given by _list. If the combination is found, this macro checks (using the +# Check_Fortran_Function_Exists macro) whether can link against that library +# combination using the name of a routine given by _name using the linker +# flags given by _flags. If the combination of libraries is found and passes +# the link test, LIBRARIES is set to the list of complete library paths that +# have been found. Otherwise, LIBRARIES is set to FALSE. + +# N.B. _prefix is the prefix applied to the names of all cached variables that +# are generated internally and marked advanced by this macro. + +set(_libraries_work TRUE) +set(${LIBRARIES}) +set(_combined_name) +if (NOT _libdir) + if (BLAS_DIR) + list(APPEND _libdir "${BLAS_DIR}") + list(APPEND _libdir "${BLAS_DIR}/lib") + if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + list(APPEND _libdir "${BLAS_DIR}/lib64") + list(APPEND _libdir "${BLAS_DIR}/lib/intel64") + else() + list(APPEND _libdir "${BLAS_DIR}/lib32") + list(APPEND _libdir "${BLAS_DIR}/lib/ia32") + endif() + endif () + if (BLAS_LIBDIR) + list(APPEND _libdir "${BLAS_LIBDIR}") + endif () + if (SCALAPACK_DIR) + list(APPEND _libdir "${SCALAPACK_DIR}") + list(APPEND _libdir "${SCALAPACK_DIR}/lib") + if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + list(APPEND _libdir "${SCALAPACK_DIR}/lib64") + list(APPEND _libdir "${SCALAPACK_DIR}/lib/intel64") + else() + list(APPEND _libdir "${SCALAPACK_DIR}/lib32") + list(APPEND _libdir "${SCALAPACK_DIR}/lib/ia32") + endif() + endif () + if (SCALAPACK_LIBDIR) + list(APPEND _libdir "${SCALAPACK_LIBDIR}") + endif () + if (WIN32) + string(REPLACE ":" ";" _libdir2 "$ENV{LIB}") + elseif (APPLE) + string(REPLACE ":" ";" _libdir2 "$ENV{DYLD_LIBRARY_PATH}") + else () + string(REPLACE ":" ";" _libdir2 "$ENV{LD_LIBRARY_PATH}") + endif () + list(APPEND _libdir "${_libdir2}") + list(APPEND _libdir "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _libdir "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") +endif () + +if (SCALAPACK_VERBOSE) + message("${Cyan}Try to find SCALAPACK libraries: ${_list}") +endif () + +foreach(_library ${_list}) + set(_combined_name ${_combined_name}_${_library}) + + if(_libraries_work) + if (BLA_STATIC) + if (WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif ( WIN32 ) + if (APPLE) + set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else (APPLE) + set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif (APPLE) + else (BLA_STATIC) + if (CMAKE_SYSTEM_NAME STREQUAL "Linux") + # for ubuntu's libblas3gf and libscalapack3gf packages + set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .so.3gf) + endif () + endif (BLA_STATIC) + find_library(${_prefix}_${_library}_LIBRARY + NAMES ${_library} + HINTS ${_libdir} + ) + mark_as_advanced(${_prefix}_${_library}_LIBRARY) + # Print status if not found + # ------------------------- + if (NOT ${_prefix}_${_library}_LIBRARY AND NOT SCALAPACK_FIND_QUIETLY AND SCALAPACK_VERBOSE) + Print_Find_Library_Blas_Status(scalapack ${_library} ${_libdir}) + endif () + set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY}) + set(_libraries_work ${${_prefix}_${_library}_LIBRARY}) + endif(_libraries_work) +endforeach(_library ${_list}) + +if(_libraries_work) + # Test this combination of libraries. + if(UNIX AND BLA_STATIC) + set(CMAKE_REQUIRED_LIBRARIES ${_flags} "-Wl,--start-group" ${${LIBRARIES}} ${_blaslapack} "-Wl,--end-group" ${_mpi} ${_threads}) + else(UNIX AND BLA_STATIC) + set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_blaslapack} ${_mpi} ${_threads}) + endif(UNIX AND BLA_STATIC) + if (SCALAPACK_VERBOSE) + message("${Cyan}SCALAPACK libs found. Try to compile symbol ${_name} with" + "following libraries: ${CMAKE_REQUIRED_LIBRARIES}") + endif () + if(NOT SCALAPACK_FOUND) + unset(${_prefix}${_combined_name}_WORKS CACHE) + endif() + if (NOT _LANGUAGES_ MATCHES Fortran) + check_function_exists("${_name}_" ${_prefix}${_combined_name}_WORKS) + else (NOT _LANGUAGES_ MATCHES Fortran) + check_fortran_function_exists(${_name} ${_prefix}${_combined_name}_WORKS) + endif (NOT _LANGUAGES_ MATCHES Fortran) + set(CMAKE_REQUIRED_LIBRARIES) + mark_as_advanced(${_prefix}${_combined_name}_WORKS) + set(_libraries_work ${${_prefix}${_combined_name}_WORKS}) +endif(_libraries_work) + + if(_libraries_work) + set(${LIBRARIES} ${${LIBRARIES}} ${_blaslapack} ${_mpi} ${_threads}) + else(_libraries_work) + set(${LIBRARIES} FALSE) + endif(_libraries_work) + +endmacro(Check_Scalapack_Libraries) + + +set(SCALAPACK_LINKER_FLAGS) +set(SCALAPACK_LIBRARIES) +set(SCALAPACK95_LIBRARIES) + +if (NOT BLAS_FOUND) + if(SCALAPACK_FIND_QUIETLY OR NOT SCALAPACK_FIND_REQUIRED) + find_package(BLAS) + else() + find_package(BLAS REQUIRED) + endif() +endif () + +if (NOT LAPACK_FOUND) + if(SCALAPACK_FIND_QUIETLY OR NOT SCALAPACK_FIND_REQUIRED) + find_package(LAPACK) + else() + find_package(LAPACK REQUIRED) + endif() +endif () + +if (NOT MPI_FOUND) + if(SCALAPACK_FIND_QUIETLY OR NOT SCALAPACK_FIND_REQUIRED) + find_package(MPI) + else() + find_package(MPI REQUIRED) + endif() +endif () + +if(BLAS_FOUND AND LAPACK_FOUND AND MPI_FOUND) + set(SCALAPACK_LINKER_FLAGS ${BLAS_LINKER_FLAGS}) + list(APPEND SCALAPACK_LINKER_FLAGS ${LAPACK_LINKER_FLAGS}) + if ($ENV{BLA_VENDOR} MATCHES ".+") + set(BLA_VENDOR $ENV{BLA_VENDOR}) + else ($ENV{BLA_VENDOR} MATCHES ".+") + if(NOT BLA_VENDOR) + set(BLA_VENDOR "All") + endif(NOT BLA_VENDOR) + endif ($ENV{BLA_VENDOR} MATCHES ".+") + +# Generic SCALAPACK library +if (BLA_VENDOR STREQUAL "Generic" OR + BLA_VENDOR STREQUAL "All") + if ( NOT SCALAPACK_LIBRARIES ) + check_scalapack_libraries( + SCALAPACK_LIBRARIES + SCALAPACK + pdgemm + "" + "scalapack" # scalapack lib to look for + "${LAPACK_LIBRARIES};${BLAS_LIBRARIES}" # blas and lapack libs + "${MPI_Fortran_LIBRARIES}" # mpi libs + "" # threads libs + ) + endif ( NOT SCALAPACK_LIBRARIES ) +endif () +#intel scalapack +#if (BLA_VENDOR MATCHES "Intel" OR BLA_VENDOR STREQUAL "All") +# if (NOT WIN32) +# set(LM "-lm") +# endif () +# if (_LANGUAGES_ MATCHES C OR _LANGUAGES_ MATCHES CXX) +# if(SCALAPACK_FIND_QUIETLY OR NOT SCALAPACK_FIND_REQUIRED) +# find_PACKAGE(Threads) +# else() +# find_package(Threads REQUIRED) +# endif() +# +# set(SCALAPACK_SEARCH_LIBS "") +# +# if (BLA_F95) +# set(SCALAPACK_mkl_SEARCH_SYMBOL "PDGEMM") +# set(_LIBRARIES SCALAPACK95_LIBRARIES) +# set(_BLAS_LIBRARIES ${BLAS95_LIBRARIES}) +# list(APPEND SCALAPACK_SEARCH_LIBS "mkl_scalapack_lp64") +# else() +# set(SCALAPACK_mkl_SEARCH_SYMBOL "pdgemm") +# set(_LIBRARIES SCALAPACK_LIBRARIES) +# set(_BLAS_LIBRARIES ${BLAS_LIBRARIES}) +# list(APPEND SCALAPACK_SEARCH_LIBS "mkl_scalapack_lp64") +# endif() +# + # First try empty scalapack libs +# if (NOT ${_LIBRARIES}) +# check_scalapack_libraries( +# ${_LIBRARIES} +# BLAS +# ${SCALAPACK_mkl_SEARCH_SYMBOL} +# "" +# "" +# "${_BLAS_LIBRARIES}" +# "mkl_blacs_intelmpi_lp64" +# "${CMAKE_THREAD_LIBS_INIT};${LM}" +# ) +# endif () + # Then try the search libs +# foreach (IT ${SCALAPACK_SEARCH_LIBS}) +# if (NOT ${_LIBRARIES}) +# check_scalapack_libraries( +# ${_LIBRARIES} +# BLAS +# ${SCALAPACK_mkl_SEARCH_SYMBOL} +# "" +# "${IT}" +# "${_BLAS_LIBRARIES}" +# "mkl_blacs_intelmpi_lp64" +# "${CMAKE_THREAD_LIBS_INIT};${LM}" +# ) +# endif () +# endforeach () +# endif () +#endif() +else(BLAS_FOUND AND LAPACK_FOUND AND MPI_FOUND) + message(STATUS "SCALAPACK requires BLAS, LAPACK, and MPI") +endif(BLAS_FOUND AND LAPACK_FOUND AND MPI_FOUND) + +if(BLA_F95) + if(SCALAPACK95_LIBRARIES) + set(SCALAPACK95_FOUND TRUE) + else(SCALAPACK95_LIBRARIES) + set(SCALAPACK95_FOUND FALSE) + endif(SCALAPACK95_LIBRARIES) + if(NOT SCALAPACK_FIND_QUIETLY) + if(SCALAPACK95_FOUND) + message(STATUS "A library with SCALAPACK95 API found.") + message(STATUS "SCALAPACK_LIBRARIES ${SCALAPACK_LIBRARIES}") + else(SCALAPACK95_FOUND) + message(WARNING "BLA_VENDOR has been set to ${BLA_VENDOR} but SCALAPACK 95 libraries could not be found or check of symbols failed." + "\nPlease indicate where to find SCALAPACK libraries. You have three options:\n" + "- Option 1: Provide the root directory of SCALAPACK library with cmake option: -DSCALAPACK_DIR=your/path/to/scalapack\n" + "- Option 2: Provide the directory where to find BLAS libraries with cmake option: -DBLAS_LIBDIR=your/path/to/blas/libs\n" + "- Option 3: Update your environment variable (Linux: LD_LIBRARY_PATH, Windows: LIB, Mac: DYLD_LIBRARY_PATH)\n" + "\nTo follow libraries detection more precisely you can activate a verbose mode with -DSCALAPACK_VERBOSE=ON at cmake configure." + "\nYou could also specify a BLAS vendor to look for by setting -DBLA_VENDOR=blas_vendor_name." + "\nList of possible BLAS vendor: Goto, ATLAS PhiPACK, CXML, DXML, SunPerf, SCSL, SGIMATH, IBMESSL, Intel10_32 (intel mkl v10 32 bit)," + "Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model), Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model)," + "Intel( older versions of mkl 32 and 64 bit), ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic") + if(SCALAPACK_FIND_REQUIRED) + message(FATAL_ERROR + "A required library with SCALAPACK95 API not found. Please specify library location." + ) + else(SCALAPACK_FIND_REQUIRED) + message(STATUS + "A library with SCALAPACK95 API not found. Please specify library location." + ) + endif(SCALAPACK_FIND_REQUIRED) + endif(SCALAPACK95_FOUND) + endif(NOT SCALAPACK_FIND_QUIETLY) + set(SCALAPACK_FOUND "${SCALAPACK95_FOUND}") + set(SCALAPACK_LIBRARIES "${SCALAPACK95_LIBRARIES}") +else(BLA_F95) + if(SCALAPACK_LIBRARIES) + set(SCALAPACK_FOUND TRUE) + else(SCALAPACK_LIBRARIES) + set(SCALAPACK_FOUND FALSE) + endif(SCALAPACK_LIBRARIES) + + if(NOT SCALAPACK_FIND_QUIETLY) + if(SCALAPACK_FOUND) + message(STATUS "A library with SCALAPACK API found.") + message(STATUS "SCALAPACK_LIBRARIES ${SCALAPACK_LIBRARIES}") + else(SCALAPACK_FOUND) + message(WARNING "BLA_VENDOR has been set to ${BLA_VENDOR} but SCALAPACK libraries could not be found or check of symbols failed." + "\nPlease indicate where to find SCALAPACK libraries. You have three options:\n" + "- Option 1: Provide the root directory of SCALAPACK library with cmake option: -DSCALAPACK_DIR=your/path/to/scalapack\n" + "- Option 2: Provide the directory where to find BLAS libraries with cmake option: -DBLAS_LIBDIR=your/path/to/blas/libs\n" + "- Option 3: Update your environment variable (Linux: LD_LIBRARY_PATH, Windows: LIB, Mac: DYLD_LIBRARY_PATH)\n" + "\nTo follow libraries detection more precisely you can activate a verbose mode with -DSCALAPACK_VERBOSE=ON at cmake configure." + "\nYou could also specify a BLAS vendor to look for by setting -DBLA_VENDOR=blas_vendor_name." + "\nList of possible BLAS vendor: Goto, ATLAS PhiPACK, CXML, DXML, SunPerf, SCSL, SGIMATH, IBMESSL, Intel10_32 (intel mkl v10 32 bit)," + "Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model), Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model)," + "Intel( older versions of mkl 32 and 64 bit), ACML, ACML_MP, ACML_GPU, Apple, NAS, Generic") + if(SCALAPACK_FIND_REQUIRED) + message(FATAL_ERROR + "A required library with SCALAPACK API not found. Please specify library location." + ) + else(SCALAPACK_FIND_REQUIRED) + message(STATUS + "A library with SCALAPACK API not found. Please specify library location." + ) + endif(SCALAPACK_FIND_REQUIRED) + endif(SCALAPACK_FOUND) + endif(NOT SCALAPACK_FIND_QUIETLY) +endif(BLA_F95) + +set(CMAKE_FIND_LIBRARY_SUFFIXES ${_scalapack_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) diff --git a/cmake_modules/morse/find/FindSCOTCH.cmake b/cmake_modules/morse/find/FindSCOTCH.cmake new file mode 100644 index 000000000..fa67623b8 --- /dev/null +++ b/cmake_modules/morse/find/FindSCOTCH.cmake @@ -0,0 +1,297 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find SCOTCH include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(SCOTCH +# [REQUIRED] # Fail with error if scotch is not found +# ) +# +# This module finds headers and scotch library. +# Results are reported in variables: +# SCOTCH_FOUND - True if headers and requested libraries were found +# SCOTCH_INCLUDE_DIRS - scotch include directories +# SCOTCH_LIBRARY_DIRS - Link directories for scotch libraries +# SCOTCH_LIBRARIES - scotch component libraries to be linked +# SCOTCH_INTSIZE - Number of octets occupied by a SCOTCH_Num +# +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DSCOTCH=path/to/scotch): +# SCOTCH_DIR - Where to find the base directory of scotch +# SCOTCH_INCDIR - Where to find the header files +# SCOTCH_LIBDIR - Where to find the library files + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + +if (NOT SCOTCH_FOUND) + set(SCOTCH_DIR "" CACHE PATH "Root directory of SCOTCH library") + if (NOT SCOTCH_FIND_QUIETLY) + message(STATUS "A cache variable, namely SCOTCH_DIR, has been set to specify the install directory of SCOTCH") + endif() +endif() + +# SCOTCH may depend on Threads, try to find it +if (NOT THREADS_FOUND) + if (SCOTCH_FIND_REQUIRED) + find_package(Threads REQUIRED) + else() + find_package(Threads) + endif() +endif() + +# Looking for include +# ------------------- + +# Add system include paths to search include +# ------------------------------------------ +unset(_inc_env) +if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") +else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") +endif() +list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") +list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") +list(REMOVE_DUPLICATES _inc_env) + + +# Try to find the scotch header in the given paths +# ------------------------------------------------- +# call cmake macro to find the header path +if(SCOTCH_INCDIR) + set(SCOTCH_scotch.h_DIRS "SCOTCH_scotch.h_DIRS-NOTFOUND") + find_path(SCOTCH_scotch.h_DIRS + NAMES scotch.h + HINTS ${SCOTCH_INCDIR}) +else() + if(SCOTCH_DIR) + set(SCOTCH_scotch.h_DIRS "SCOTCH_scotch.h_DIRS-NOTFOUND") + find_path(SCOTCH_scotch.h_DIRS + NAMES scotch.h + HINTS ${SCOTCH_DIR} + PATH_SUFFIXES include) + else() + set(SCOTCH_scotch.h_DIRS "SCOTCH_scotch.h_DIRS-NOTFOUND") + find_path(SCOTCH_scotch.h_DIRS + NAMES scotch.h + HINTS ${_inc_env}) + endif() +endif() +mark_as_advanced(SCOTCH_scotch.h_DIRS) + +# If found, add path to cmake variable +# ------------------------------------ +if (SCOTCH_scotch.h_DIRS) + set(SCOTCH_INCLUDE_DIRS "${SCOTCH_scotch.h_DIRS}") +else () + set(SCOTCH_INCLUDE_DIRS "SCOTCH_INCLUDE_DIRS-NOTFOUND") + if (NOT SCOTCH_FIND_QUIETLY) + message(STATUS "Looking for scotch -- scotch.h not found") + endif() +endif() + + +# Looking for lib +# --------------- + +# Add system library paths to search lib +# -------------------------------------- +unset(_lib_env) +if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") +else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") +endif() +list(REMOVE_DUPLICATES _lib_env) + +# Try to find the scotch lib in the given paths +# ---------------------------------------------- + +set(SCOTCH_libs_to_find "scotch;scotcherrexit") + +# call cmake macro to find the lib path +if(SCOTCH_LIBDIR) + foreach(scotch_lib ${SCOTCH_libs_to_find}) + set(SCOTCH_${scotch_lib}_LIBRARY "SCOTCH_${scotch_lib}_LIBRARY-NOTFOUND") + find_library(SCOTCH_${scotch_lib}_LIBRARY + NAMES ${scotch_lib} + HINTS ${SCOTCH_LIBDIR}) + endforeach() +else() + if(SCOTCH_DIR) + foreach(scotch_lib ${SCOTCH_libs_to_find}) + set(SCOTCH_${scotch_lib}_LIBRARY "SCOTCH_${scotch_lib}_LIBRARY-NOTFOUND") + find_library(SCOTCH_${scotch_lib}_LIBRARY + NAMES ${scotch_lib} + HINTS ${SCOTCH_DIR} + PATH_SUFFIXES lib lib32 lib64) + endforeach() + else() + foreach(scotch_lib ${SCOTCH_libs_to_find}) + set(SCOTCH_${scotch_lib}_LIBRARY "SCOTCH_${scotch_lib}_LIBRARY-NOTFOUND") + find_library(SCOTCH_${scotch_lib}_LIBRARY + NAMES ${scotch_lib} + HINTS ${_lib_env}) + endforeach() + endif() +endif() + +set(SCOTCH_LIBRARIES "") +set(SCOTCH_LIBRARY_DIRS "") +# If found, add path to cmake variable +# ------------------------------------ +foreach(scotch_lib ${SCOTCH_libs_to_find}) + + if (SCOTCH_${scotch_lib}_LIBRARY) + get_filename_component(${scotch_lib}_lib_path "${SCOTCH_${scotch_lib}_LIBRARY}" PATH) + # set cmake variables + list(APPEND SCOTCH_LIBRARIES "${SCOTCH_${scotch_lib}_LIBRARY}") + list(APPEND SCOTCH_LIBRARY_DIRS "${${scotch_lib}_lib_path}") + else () + list(APPEND SCOTCH_LIBRARIES "${SCOTCH_${scotch_lib}_LIBRARY}") + if (NOT SCOTCH_FIND_QUIETLY) + message(STATUS "Looking for scotch -- lib ${scotch_lib} not found") + endif() + endif () + + mark_as_advanced(SCOTCH_${scotch_lib}_LIBRARY) + +endforeach() + +# check a function to validate the find +if(SCOTCH_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # SCOTCH + if (SCOTCH_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${SCOTCH_INCLUDE_DIRS}") + endif() + if (SCOTCH_LIBRARY_DIRS) + set(REQUIRED_LIBDIRS "${SCOTCH_LIBRARY_DIRS}") + endif() + set(REQUIRED_LIBS "${SCOTCH_LIBRARIES}") + # THREADS + if(CMAKE_THREAD_LIBS_INIT) + list(APPEND CMAKE_REQUIRED_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}") + endif() + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + + # test link + unset(SCOTCH_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(SCOTCH_graphInit SCOTCH_WORKS) + mark_as_advanced(SCOTCH_WORKS) + + if(NOT SCOTCH_WORKS) + # save link with dependencies + set(SCOTCH_LIBRARIES "${REQUIRED_LIBS}") + else() + if(NOT SCOTCH_FIND_QUIETLY) + message(STATUS "Looking for SCOTCH : test of SCOTCH_graphInit with SCOTCH library fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) +endif(SCOTCH_LIBRARIES) + + +# Check the size of SCOTCH_Num +# --------------------------------- +set(CMAKE_REQUIRED_INCLUDES ${SCOTCH_INCLUDE_DIRS}) + +include(CheckCSourceRuns) +#stdio.h and stdint.h should be included by scotch.h directly +set(SCOTCH_C_TEST_SCOTCH_Num_4 " +#include <stdio.h> +#include <stdint.h> +#include <scotch.h> +int main(int argc, char **argv) { + if (sizeof(SCOTCH_Num) == 4) + return 0; + else + return 1; +} +") + +set(SCOTCH_C_TEST_SCOTCH_Num_8 " +#include <stdio.h> +#include <stdint.h> +#include <scotch.h> +int main(int argc, char **argv) { + if (sizeof(SCOTCH_Num) == 8) + return 0; + else + return 1; +} +") +check_c_source_runs("${SCOTCH_C_TEST_SCOTCH_Num_4}" SCOTCH_Num_4) +if(NOT SCOTCH_Num_4) + check_c_source_runs("${SCOTCH_C_TEST_SCOTCH_Num_8}" SCOTCH_Num_8) + if(NOT SCOTCH_Num_8) + set(SCOTCH_INTSIZE -1) + else() + set(SCOTCH_INTSIZE 8) + endif() +else() + set(SCOTCH_INTSIZE 4) +endif() +set(CMAKE_REQUIRED_INCLUDES "") + +# check that SCOTCH has been found +# --------------------------------- +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(SCOTCH DEFAULT_MSG + SCOTCH_LIBRARIES + SCOTCH_WORKS) +# +# TODO: Add possibility to check for specific functions in the library +# diff --git a/cmake_modules/morse/find/FindSTARPU.cmake b/cmake_modules/morse/find/FindSTARPU.cmake new file mode 100644 index 000000000..89a36bc19 --- /dev/null +++ b/cmake_modules/morse/find/FindSTARPU.cmake @@ -0,0 +1,776 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find STARPU include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(STARPU +# [version] [EXACT] # Minimum or EXACT version e.g. 1.1 +# [REQUIRED] # Fail with error if starpu is not found +# [COMPONENTS <comp1> <comp2> ...] # dependencies +# ) +# +# COMPONENTS are optional libraries STARPU could be linked with, +# Use it to drive detection of a specific compilation chain +# COMPONENTS can be some of the following: +# - HWLOC: to activate the detection of StarPU linked with HWLOC +# - CUDA: to activate the detection of StarPU linked with CUDA +# - MPI: to activate the detection of StarPU linked with MPI +# - BLAS: to activate the detection of StarPU linked with BLAS +# - MAGMA: to activate the detection of StarPU linked with MAGMA +# - FXT: to activate the detection of StarPU linked with FxT +# +# Results are reported in variables: +# STARPU_FOUND - True if headers and requested libraries were found +# STARPU_INCLUDE_DIRS - starpu include directories +# STARPU_LIBRARY_DIRS - Link directories for starpu libraries +# STARPU_LIBRARIES - starpu libraries +# STARPU_SHM_LIBRARIES - starpu libraries without libstarpumpi +# STARPU_MPI_LIBRARIES - starpu libraries with libstarpumpi +# MAGMA_INCLUDE_DIRS_DEP - starpu + dependencies include directories +# MAGMA_LIBRARY_DIRS_DEP - starpu + dependencies link directories +# MAGMA_LIBRARIES_DEP - starpu libraries + dependencies +# STARPU_VERSION_STRING - A human-readable string containing the version of the package found +# STARPU_VERSION_MAJOR - The major version of the package found +# STARPU_VERSION_MINOR - The minor version of the package found +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DSTARPU=path/to/starpu): +# STARPU_DIR - Where to find the base directory of starpu +# STARPU_INCDIR - Where to find the header files +# STARPU_LIBDIR - Where to find the library files + + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + +if (NOT STARPU_FOUND) + set(STARPU_DIR "" CACHE PATH "Root directory of STARPU library") + if (NOT STARPU_FIND_QUIETLY) + message(STATUS "A cache variable, namely STARPU_DIR, has been set to specify the install directory of STARPU") + endif() +endif() + +# STARPU may depend on other packages (HWLOC, MPI, CUDA, BLAS, MAGMA, FXT, ...) +# try to find them if specified as COMPONENTS during the call +set(STARPU_LOOK_FOR_HWLOC FALSE) +set(STARPU_LOOK_FOR_CUDA FALSE) +set(STARPU_LOOK_FOR_MPI FALSE) +set(STARPU_LOOK_FOR_BLAS FALSE) +set(STARPU_LOOK_FOR_MAGMA FALSE) +set(STARPU_LOOK_FOR_FXT FALSE) + +if( STARPU_FIND_COMPONENTS ) + foreach( component ${STARPU_FIND_COMPONENTS} ) + if(${component} STREQUAL "HWLOC") + set(STARPU_LOOK_FOR_HWLOC TRUE) + elseif(${component} STREQUAL "CUDA") + set(STARPU_LOOK_FOR_CUDA TRUE) + elseif(${component} STREQUAL "MPI") + set(STARPU_LOOK_FOR_MPI TRUE) + elseif(${component} STREQUAL "BLAS") + set(STARPU_LOOK_FOR_BLAS TRUE) + elseif(${component} STREQUAL "MAGMA") + set(STARPU_LOOK_FOR_MAGMA TRUE) + elseif(${component} STREQUAL "FXT") + set(STARPU_LOOK_FOR_FXT TRUE) + endif() + endforeach() +endif() + +# STARPU may depend on HWLOC, try to find it +if (NOT HWLOC_FOUND AND STARPU_LOOK_FOR_HWLOC) + if (STARPU_FIND_REQUIRED) + find_package(HWLOC REQUIRED) + else() + find_package(HWLOC) + endif() +endif() + +# STARPU may depend on CUDA, try to find it +if (NOT CUDA_FOUND AND STARPU_LOOK_FOR_CUDA) + if (STARPU_FIND_REQUIRED) + find_package(CUDA REQUIRED) + else() + find_package(CUDA) + endif() + if (CUDA_FOUND) + mark_as_advanced(CUDA_BUILD_CUBIN) + mark_as_advanced(CUDA_BUILD_EMULATION) + mark_as_advanced(CUDA_SDK_ROOT_DIR) + mark_as_advanced(CUDA_TOOLKIT_ROOT_DIR) + mark_as_advanced(CUDA_VERBOSE_BUILD) + endif() +endif() + +# STARPU may depend on MPI, try to find it +if (NOT MPI_FOUND AND STARPU_LOOK_FOR_MPI) + if (STARPU_FIND_REQUIRED) + find_package(MPI REQUIRED) + else() + find_package(MPI) + endif() + if (MPI_FOUND) + mark_as_advanced(MPI_LIBRARY) + mark_as_advanced(MPI_EXTRA_LIBRARY) + endif() +endif() + +# STARPU may depend on BLAS, try to find it +if (NOT BLAS_FOUND AND STARPU_LOOK_FOR_BLAS) + if (STARPU_FIND_REQUIRED) + find_package(BLAS REQUIRED) + else() + find_package(BLAS) + endif() +endif() + +# STARPU may depend on MAGMA, try to find it +if (NOT MAGMA_FOUND AND STARPU_LOOK_FOR_MAGMA) + if (STARPU_FIND_REQUIRED) + find_package(MAGMA REQUIRED) + else() + find_package(MAGMA) + endif() +endif() + +# STARPU may depend on FXT, try to find it +if (NOT FXT_FOUND AND STARPU_LOOK_FOR_FXT) + if (STARPU_FIND_REQUIRED) + find_package(FXT REQUIRED) + else() + find_package(FXT) + endif() +endif() + +# Optionally use pkg-config to detect include/library dirs (if pkg-config is available) +# ------------------------------------------------------------------------------------- +include(FindPkgConfig) +find_package(PkgConfig QUIET) + +if(PKG_CONFIG_EXECUTABLE) + + pkg_search_module(STARPU_SHM libstarpu) + set(STARPU_INCLUDE_DIRS "${STARPU_SHM_INCLUDE_DIRS}") + set(STARPU_LIBRARY_DIRS "${STARPU_SHM_LIBRARY_DIRS}") + if(STARPU_LOOK_FOR_MPI AND MPI_FOUND) + pkg_search_module(STARPU_MPI libstarpumpi) + endif() + if (NOT STARPU_FIND_QUIETLY) + if (STARPU_SHM_FOUND AND STARPU_SHM_LIBRARIES) + message(STATUS "Looking for STARPU - found using PkgConfig") + #if(NOT STARPU_SHM_INCLUDE_DIRS) + # message("${Magenta}STARPU_SHM_INCLUDE_DIRS is empty using PkgConfig." + # "Perhaps the path to starpu headers is already present in your" + # "C(PLUS)_INCLUDE_PATH environment variable.${ColourReset}") + #endif() + else() + message("${Magenta}Looking for STARPU - not found using PkgConfig." + "Perhaps you should add the directory containing libstarpu.pc" + "to the PKG_CONFIG_PATH environment variable.${ColourReset}") + endif() + if (STARPU_LOOK_FOR_MPI) + if (STARPU_MPI_FOUND AND STARPU_MPI_LIBRARIES) + message(STATUS "Looking for STARPU MPI - found using PkgConfig") + else() + message("${Magenta}Looking for STARPU MPI - not found using PkgConfig." + "Perhaps you should add the directory containing libstarpumpi.pc to" + "the PKG_CONFIG_PATH environment variable.${ColourReset}") + endif() + endif() + endif() + + if (STARPU_FIND_VERSION_EXACT) + if( NOT (STARPU_FIND_VERSION_MAJOR STREQUAL STARPU_VERSION_MAJOR) OR + NOT (STARPU_FIND_VERSION_MINOR STREQUAL STARPU_VERSION_MINOR) ) + if(STARPU_FIND_REQUIRED AND NOT STARPU_FIND_QUIETLY) + message(FATAL_ERROR + "STARPU version found is ${STARPU_VERSION_STRING}" + "when required is ${STARPU_FIND_VERSION}") + endif() + endif() + else() + # if the version found is older than the required then error + if( (STARPU_FIND_VERSION_MAJOR STRGREATER STARPU_VERSION_MAJOR) OR + (STARPU_FIND_VERSION_MINOR STRGREATER STARPU_VERSION_MINOR) ) + if(STARPU_FIND_REQUIRED AND NOT STARPU_FIND_QUIETLY) + message(FATAL_ERROR + "STARPU version found is ${STARPU_VERSION_STRING}" + "when required is ${STARPU_FIND_VERSION} or newer") + endif() + endif() + endif() + + if(STARPU_MPI_LIBRARIES) + set(STARPU_LIBRARIES "${STARPU_MPI_LIBRARIES}") + elseif(STARPU_SHM_LIBRARIES) + set(STARPU_LIBRARIES "${STARPU_SHM_LIBRARIES}") + else() + set(STARPU_LIBRARIES "STARPU_LIBRARIES-NOTFOUND") + endif() + +endif(PKG_CONFIG_EXECUTABLE) + + +if( (NOT PKG_CONFIG_EXECUTABLE AND NOT STARPU_FOUND) OR + (NOT STARPU_SHM_FOUND OR (NOT STARPU_MPI_FOUND AND STARPU_LOOK_FOR_MPI)) + ) + + # Looking for include + # ------------------- + + # Add system include paths to search include + # ------------------------------------------ + unset(_inc_env) + if(WIN32) + string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") + else() + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + endif() + list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") + list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") + list(REMOVE_DUPLICATES _inc_env) + + # Try to find the version of StarPU in starpu_config.h file + set(STARPU_hdrs_to_find "starpu_config.h") + + # call cmake macro to find the header path + if(STARPU_INCDIR) + foreach(starpu_hdr ${STARPU_hdrs_to_find}) + set(STARPU_${starpu_hdr}_INCLUDE_DIRS "STARPU_${starpu_hdr}_INCLUDE_DIRS-NOTFOUND") + find_path(STARPU_${starpu_hdr}_INCLUDE_DIRS + NAMES ${starpu_hdr} + HINTS ${STARPU_INCDIR}) + endforeach() + else() + if(STARPU_DIR) + foreach(starpu_hdr ${STARPU_hdrs_to_find}) + set(STARPU_${starpu_hdr}_INCLUDE_DIRS "STARPU_${starpu_hdr}_INCLUDE_DIRS-NOTFOUND") + find_path(STARPU_${starpu_hdr}_INCLUDE_DIRS + NAMES ${starpu_hdr} + HINTS ${STARPU_DIR} + PATH_SUFFIXES "include" + "include/starpu/1.0" + "include/starpu/1.1" + "include/starpu/1.2" + "include/starpu/1.3") + endforeach() + else() + foreach(starpu_hdr ${STARPU_hdrs_to_find}) + set(STARPU_${starpu_hdr}_INCLUDE_DIRS "STARPU_${starpu_hdr}_INCLUDE_DIRS-NOTFOUND") + find_path(STARPU_${starpu_hdr}_INCLUDE_DIRS + NAMES ${starpu_hdr} + HINTS ${_inc_env}) + endforeach() + endif() + endif() + mark_as_advanced(STARPU_starpu_config.h_INCLUDE_DIRS) + + ### + # + # GET_VERSION: Get the version of the software by parsing a file + # + ### + MACRO(GET_VERSION _PACKAGE _filepath) + + #message(STATUS "Looking for ${_PACKAGE} version in the file ${_filepath}") + file(READ "${_filepath}" _file) + string(REGEX REPLACE + "(.*)define([ \t]*)${_PACKAGE}_MAJOR_VERSION([ \t]*)([0-9]+)(.*)" + "\\4" ${_PACKAGE}_VERSION_MAJOR "${_file}") + string(REGEX REPLACE + "(.*)define([ \t]*)${_PACKAGE}_MINOR_VERSION([ \t]*)([0-9]+)(.*)" + "\\4" ${_PACKAGE}_VERSION_MINOR "${_file}") + set(${_PACKAGE}_VERSION_STRING + "${${_PACKAGE}_VERSION_MAJOR}.${${_PACKAGE}_VERSION_MINOR}") + #message(STATUS "${_PACKAGE}_VERSION_MAJOR = -${${_PACKAGE}_VERSION_MAJOR}-") + #message(STATUS "${_PACKAGE}_VERSION_MINOR = -${${_PACKAGE}_VERSION_MINOR}-") + + ENDMACRO(GET_VERSION) + + # Find the version of StarPU in starpu_config.h file + # remark: the version is defined in this file since the STARPU 1.0 version + if (STARPU_starpu_config.h_INCLUDE_DIRS) + GET_VERSION("STARPU" "${STARPU_starpu_config.h_INCLUDE_DIRS}/starpu_config.h") + if (STARPU_VERSION_MAJOR AND STARPU_VERSION_MINOR) + if (STARPU_FIND_VERSION_EXACT) + if (STARPU_FIND_VERSION_MAJOR AND STARPU_FIND_VERSION_MINOR) + if( NOT (STARPU_FIND_VERSION_MAJOR STREQUAL STARPU_VERSION_MAJOR) OR + NOT (STARPU_FIND_VERSION_MINOR STREQUAL STARPU_VERSION_MINOR) ) + if(STARPU_FIND_REQUIRED AND NOT STARPU_FIND_QUIETLY) + message(FATAL_ERROR + "STARPU version found is ${STARPU_VERSION_STRING} " + "when required is ${STARPU_FIND_VERSION}") + endif() + endif() + endif() + else() + if (STARPU_FIND_VERSION_MAJOR AND STARPU_FIND_VERSION_MINOR) + # if the version found is older than the required then error + if( (STARPU_FIND_VERSION_MAJOR STRGREATER STARPU_VERSION_MAJOR) OR + (STARPU_FIND_VERSION_MINOR STRGREATER STARPU_VERSION_MINOR) ) + if(STARPU_FIND_REQUIRED AND NOT STARPU_FIND_QUIETLY) + message(FATAL_ERROR + "STARPU version found is ${STARPU_VERSION_STRING} " + "when required is ${STARPU_FIND_VERSION} or newer") + endif() + endif() + endif() + endif() + else() + if(STARPU_FIND_REQUIRED AND NOT STARPU_FIND_QUIETLY) + message(FATAL_ERROR + "STARPU version has not been found using starpu_config.h" + "located in ${STARPU_starpu_config.h_INCLUDE_DIRS}") + endif() + endif() + else() + if(STARPU_FIND_REQUIRED AND NOT STARPU_FIND_QUIETLY) + message(FATAL_ERROR + "starpu_config.h has not been found while required to get StarPU version") + endif() + endif() + + + # Try to find the starpu headers in the given paths + # ------------------------------------------------- + + # create list of headers to find + list(APPEND STARPU_hdrs_to_find "starpu.h;starpu_profiling.h") + if(STARPU_LOOK_FOR_MPI AND MPI_FOUND) + list(APPEND STARPU_hdrs_to_find "starpu_mpi.h") + endif() + if(STARPU_LOOK_FOR_CUDA AND CUDA_FOUND) + list(APPEND STARPU_hdrs_to_find "starpu_cuda.h;starpu_scheduler.h") + endif() + + # call cmake macro to find the header path + if(STARPU_INCDIR) + foreach(starpu_hdr ${STARPU_hdrs_to_find}) + set(STARPU_${starpu_hdr}_INCLUDE_DIRS "STARPU_${starpu_hdr}_INCLUDE_DIRS-NOTFOUND") + find_path(STARPU_${starpu_hdr}_INCLUDE_DIRS + NAMES ${starpu_hdr} + HINTS ${STARPU_INCDIR}) + endforeach() + else() + if(STARPU_DIR) + set(STARPU_${starpu_hdr}_INCLUDE_DIRS "STARPU_${starpu_hdr}_INCLUDE_DIRS-NOTFOUND") + foreach(starpu_hdr ${STARPU_hdrs_to_find}) + find_path(STARPU_${starpu_hdr}_INCLUDE_DIRS + NAMES ${starpu_hdr} + HINTS ${STARPU_DIR} + PATH_SUFFIXES "include/starpu/${STARPU_VERSION_STRING}") + endforeach() + else() + foreach(starpu_hdr ${STARPU_hdrs_to_find}) + set(STARPU_${starpu_hdr}_INCLUDE_DIRS "STARPU_${starpu_hdr}_INCLUDE_DIRS-NOTFOUND") + find_path(STARPU_${starpu_hdr}_INCLUDE_DIRS + NAMES ${starpu_hdr} + HINTS ${_inc_env}) + endforeach() + endif() + endif() + + # If found, add path to cmake variable + # ------------------------------------ + set(STARPU_INCLUDE_DIRS "") + foreach(starpu_hdr ${STARPU_hdrs_to_find}) + + if (STARPU_${starpu_hdr}_INCLUDE_DIRS) + # set cmake variables using the pkg-config naming convention + list(APPEND STARPU_INCLUDE_DIRS "${STARPU_${starpu_hdr}_INCLUDE_DIRS}" ) + else () + if(NOT STARPU_FIND_QUIETLY) + message(STATUS "Looking for starpu -- ${starpu_hdr} not found") + endif() + if(starpu_hdr STREQUAL "starpu_mpi.h") + if(NOT STARPU_FIND_REQUIRED_MPI) + if (NOT STARPU_FIND_QUIETLY) + message(STATUS "Looking for starpu -- ${starpu_hdr} not required") + endif() + else() + list(APPEND STARPU_INCLUDE_DIRS "${STARPU_${starpu_hdr}_INCLUDE_DIRS}" ) + endif() + elseif( (starpu_hdr STREQUAL "starpu_cuda.h") OR (starpu_hdr STREQUAL "starpu_scheduler.h") ) + if(NOT STARPU_FIND_REQUIRED_CUDA) + if (NOT STARPU_FIND_QUIETLY) + message(STATUS "Looking for starpu -- ${starpu_hdr} not required") + endif() + else() + list(APPEND STARPU_INCLUDE_DIRS "${STARPU_${starpu_hdr}_INCLUDE_DIRS}" ) + endif() + endif() + endif () + mark_as_advanced(STARPU_${starpu_hdr}_INCLUDE_DIRS) + + endforeach(starpu_hdr ${STARPU_hdrs_to_find}) + + if (STARPU_INCLUDE_DIRS) + list(REMOVE_DUPLICATES STARPU_INCLUDE_DIRS) + endif () + + if (STARPU_starpu_config.h_INCLUDE_DIRS) + # Looking for lib + # --------------- + + set(STARPU_SHM_LIBRARIES "") + set(STARPU_MPI_LIBRARIES "") + set(STARPU_LIBRARY_DIRS "") + + # Add system library paths to search lib + # -------------------------------------- + unset(_lib_env) + if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") + else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") + endif() + list(REMOVE_DUPLICATES _lib_env) + + # Try to find the starpu libs in the given paths + # ---------------------------------------------- + + # create list of libs to find + set(STARPU_libs_to_find "starpu-${STARPU_VERSION_STRING}") + set(STARPU_SHM_libs_to_find "starpu-${STARPU_VERSION_STRING}") + if (STARPU_LOOK_FOR_MPI OR MPI_FOUND) + list(APPEND STARPU_libs_to_find "starpumpi-${STARPU_VERSION_STRING}") + set(STARPU_MPI_libs_to_find "${STARPU_libs_to_find}") + endif() + + # call cmake macro to find the lib path + if(STARPU_LIBDIR) + foreach(starpu_lib ${STARPU_libs_to_find}) + set(STARPU_${starpu_lib}_LIBRARY "STARPU_${starpu_lib}_LIBRARY-NOTFOUND") + find_library(STARPU_${starpu_lib}_LIBRARY + NAMES ${starpu_lib} + HINTS ${STARPU_LIBDIR}) + endforeach() + else() + if(STARPU_DIR) + foreach(starpu_lib ${STARPU_libs_to_find}) + set(STARPU_${starpu_lib}_LIBRARY "STARPU_${starpu_lib}_LIBRARY-NOTFOUND") + find_library(STARPU_${starpu_lib}_LIBRARY + NAMES ${starpu_lib} + HINTS ${STARPU_DIR} + PATH_SUFFIXES lib lib32 lib64) + endforeach() + else() + foreach(starpu_lib ${STARPU_libs_to_find}) + set(STARPU_${starpu_lib}_LIBRARY "STARPU_${starpu_lib}_LIBRARY-NOTFOUND") + find_library(STARPU_${starpu_lib}_LIBRARY + NAMES ${starpu_lib} + HINTS ${_lib_env}) + endforeach() + endif() + endif() + + # If found, add path to cmake variable + # ------------------------------------ + foreach(starpu_lib ${STARPU_libs_to_find}) + + if (STARPU_${starpu_lib}_LIBRARY) + + get_filename_component(${starpu_lib}_lib_path ${STARPU_${starpu_lib}_LIBRARY} PATH) + # set cmake variables (respects naming convention) + + foreach(starpu_shm_lib ${STARPU_SHM_libs_to_find}) + if(starpu_shm_lib STREQUAL starpu_lib) + if (STARPU_SHM_LIBRARIES) + list(APPEND STARPU_SHM_LIBRARIES "${STARPU_${starpu_lib}_LIBRARY}") + else() + set(STARPU_SHM_LIBRARIES "${STARPU_${starpu_lib}_LIBRARY}") + endif() + endif() + endforeach() + if (STARPU_LOOK_FOR_MPI AND MPI_FOUND) + foreach(starpu_mpi_lib ${STARPU_MPI_libs_to_find}) + if(starpu_mpi_lib STREQUAL starpu_lib) + if (STARPU_MPI_LIBRARIES) + list(APPEND STARPU_MPI_LIBRARIES "${STARPU_${starpu_lib}_LIBRARY}") + else() + set(STARPU_MPI_LIBRARIES "${STARPU_${starpu_lib}_LIBRARY}") + endif() + endif() + endforeach() + endif () + if (STARPU_LIBRARY_DIRS) + list(APPEND STARPU_LIBRARY_DIRS "${${starpu_lib}_lib_path}") + else() + set(STARPU_LIBRARY_DIRS "${${starpu_lib}_lib_path}") + endif() + + else (STARPU_${starpu_lib}_LIBRARY) + + if(NOT STARPU_FIND_QUIETLY) + message(STATUS "Looking for starpu -- lib ${starpu_lib} not found") + endif() + if(starpu_lib STREQUAL "starpumpi-${STARPU_VERSION_STRING}" AND + NOT STARPU_FIND_REQUIRED_MPI) + # if MPI optional, not a problem: no NOTFOUND in list of MPI LIBRARIES + if(NOT STARPU_FIND_QUIETLY) + message(STATUS "Looking for starpu -- lib ${starpu_lib} not required") + endif() + else() + # for any other lib, add NOTFOUND in the proper list of LIBRARIES + foreach(starpu_shm_lib ${STARPU_SHM_libs_to_find}) + if(starpu_shm_lib STREQUAL starpu_lib) + if (STARPU_SHM_LIBRARIES) + list(APPEND STARPU_SHM_LIBRARIES "${STARPU_${starpu_lib}_LIBRARY}") + else() + set(STARPU_SHM_LIBRARIES "${STARPU_${starpu_lib}_LIBRARY}") + endif() + endif() + endforeach() + if (STARPU_LOOK_FOR_MPI AND MPI_FOUND) + foreach(starpu_mpi_lib ${STARPU_MPI_libs_to_find}) + if(starpu_mpi_lib STREQUAL starpu_lib) + if (STARPU_MPI_LIBRARIES) + list(APPEND STARPU_MPI_LIBRARIES "${STARPU_${starpu_lib}_LIBRARY}") + else() + set(STARPU_MPI_LIBRARIES "${STARPU_${starpu_lib}_LIBRARY}") + endif() + endif() + endforeach() + endif () + endif() + + endif (STARPU_${starpu_lib}_LIBRARY) + + mark_as_advanced(STARPU_${starpu_lib}_LIBRARY) + + endforeach(starpu_lib ${STARPU_libs_to_find}) + + if (STARPU_LIBRARY_DIRS) + list(REMOVE_DUPLICATES STARPU_SHM_LIBRARIES) + list(REMOVE_DUPLICATES STARPU_MPI_LIBRARIES) + list(REMOVE_DUPLICATES STARPU_LIBRARY_DIRS) + endif () + + if (STARPU_SHM_LIBRARIES AND STARPU_LIBRARY_DIRS AND STARPU_INCLUDE_DIRS) + set(STARPU_SHM_FOUND TRUE) + if(STARPU_MPI_LIBRARIES) + set(STARPU_MPI_FOUND TRUE) + endif() + endif() + + else(STARPU_starpu_config.h_INCLUDE_DIRS) + if(NOT STARPU_FIND_QUIETLY) + message(STATUS "The version of StarPU is not known so that we do not search libraries") + endif() + endif(STARPU_starpu_config.h_INCLUDE_DIRS) + + if(STARPU_MPI_LIBRARIES) + set(STARPU_LIBRARIES "${STARPU_MPI_LIBRARIES}") + elseif(STARPU_SHM_LIBRARIES) + set(STARPU_LIBRARIES "${STARPU_SHM_LIBRARIES}") + else() + set(STARPU_LIBRARIES "STARPU_LIBRARIES-NOTFOUND") + endif() + + # check a function to validate the find + if(STARPU_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # STARPU + if (STARPU_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${STARPU_INCLUDE_DIRS}") + endif() + set(CMAKE_REQUIRED_FLAGS) + foreach(libdir ${STARPU_LIBRARY_DIRS}) + if (libdir) + list(APPEND REQUIRED_LIBDIRS "${libdir}") + endif() + endforeach() + set(REQUIRED_LIBS "${STARPU_LIBRARIES}") + # HWLOC + if (HWLOC_FOUND AND STARPU_LOOK_FOR_HWLOC) + if (HWLOC_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${HWLOC_INCLUDE_DIRS}") + endif() + if (HWLOC_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${HWLOC_LIBRARY_DIRS}") + endif() + list(APPEND REQUIRED_LIBS "${HWLOC_LIBRARIES}") + endif() + # MPI + if (MPI_FOUND AND STARPU_LOOK_FOR_MPI) + if (MPI_C_INCLUDE_PATH) + list(APPEND REQUIRED_INCDIRS "${MPI_C_INCLUDE_PATH}") + endif() + if (MPI_C_LINK_FLAGS) + list(APPEND REQUIRED_LIBS "${MPI_C_LINK_FLAGS}") + endif() + list(APPEND REQUIRED_LIBS "${MPI_C_LIBRARIES}") + endif() + # MAGMA + if (MAGMA_FOUND AND STARPU_LOOK_FOR_MAGMA) + if (MAGMA_INCLUDE_DIRS_DEP) + list(APPEND REQUIRED_INCDIRS "${MAGMA_INCLUDE_DIRS_DEP}") + elseif(MAGMA_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${MAGMA_INCLUDE_DIRS}") + endif() + if (MAGMA_LIBRARY_DIRS_DEP) + list(APPEND REQUIRED_LIBDIRS "${MAGMA_LIBRARY_DIRS_DEP}") + elseif(MAGMA_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${MAGMA_LIBRARY_DIRS}") + endif() + if (MAGMA_LIBRARIES_DEP) + list(APPEND REQUIRED_LIBS "${MAGMA_LIBRARIES_DEP}") + elseif(MAGMA_LIBRARIES) + foreach(lib ${MAGMA_LIBRARIES}) + if (EXISTS ${lib} OR ${lib} MATCHES "^-") + list(APPEND REQUIRED_LIBS "${lib}") + else() + list(APPEND REQUIRED_LIBS "-l${lib}") + endif() + endforeach() + endif() + endif() + # CUDA + if (CUDA_FOUND AND STARPU_LOOK_FOR_CUDA) + if (CUDA_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${CUDA_INCLUDE_DIRS}") + endif() + if (CUDA_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${CUDA_LIBRARY_DIRS}") + endif() + list(APPEND REQUIRED_LIBS "${CUDA_CUBLAS_LIBRARIES};${CUDA_LIBRARIES}") + endif() + # FXT + if (FXT_FOUND AND STARPU_LOOK_FOR_FXT) + if (FXT_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${FXT_INCLUDE_DIRS}") + endif() + if (FXT_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${FXT_LIBRARY_DIRS}") + endif() + list(APPEND REQUIRED_LIBS "${FXT_LIBRARIES}") + endif() + # BLAS + if (BLAS_FOUND AND STARPU_LOOK_FOR_BLAS) + if (BLAS_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${BLAS_INCLUDE_DIRS}") + endif() + if (BLAS_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${BLAS_LIBRARY_DIRS}") + endif() + list(APPEND REQUIRED_LIBS "${BLAS_LIBRARIES}") + endif() + # Fortran + if (CMAKE_Fortran_COMPILER MATCHES ".+gfortran.*") + list(APPEND REQUIRED_LIBS "-lgfortran") + elseif (CMAKE_Fortran_COMPILER MATCHES ".+ifort.*") + list(APPEND REQUIRED_LIBS "-lifcore") + endif() + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + + # test link + unset(STARPU_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(starpu_init STARPU_WORKS) + mark_as_advanced(STARPU_WORKS) + + if(STARPU_WORKS) + # save link with dependencies + set(STARPU_LIBRARIES_DEP "${REQUIRED_LIBS}") + set(STARPU_LIBRARY_DIRS_DEP "${REQUIRED_LIBDIRS}") + set(STARPU_INCLUDE_DIRS_DEP "${REQUIRED_INCDIRS}") + else() + if(NOT STARPU_FIND_QUIETLY) + message(STATUS "Looking for starpu : test of starpu_init fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + message(STATUS "Maybe STARPU is linked with specific libraries. " + "Have you tried with COMPONENTS (HWLOC, CUDA, MPI, BLAS, MAGMA, FXT)? " + "See the explanation in FindSTARPU.cmake.") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) + endif(STARPU_LIBRARIES) + +endif( (NOT PKG_CONFIG_EXECUTABLE AND NOT STARPU_FOUND) OR + (NOT STARPU_SHM_FOUND OR (NOT STARPU_MPI_FOUND AND STARPU_LOOK_FOR_MPI)) + ) + + +# check that STARPU has been found +# -------------------------------- +include(FindPackageHandleStandardArgs) +if(NOT STARPU_FIND_QUIETLY) + if(STARPU_SHM_FOUND) + message(STATUS "StarPU has been found.") + if(STARPU_MPI_FOUND) + message(STATUS "The mpi version of StarPU has been found so that we manage" + "two lists of libs, one sequential and one parallel (see" + "STARPU_SHM_LIBRARIES and STARPU_MPI_LIBRARIES).") + endif() + message(STATUS "StarPU shared memory libraries stored in STARPU_SHM_LIBRARIES") + endif() +endif() +if (PKG_CONFIG_EXECUTABLE AND STARPU_SHM_FOUND) + find_package_handle_standard_args(STARPU DEFAULT_MSG + STARPU_SHM_LIBRARIES) +else() + find_package_handle_standard_args(STARPU DEFAULT_MSG + STARPU_SHM_LIBRARIES + STARPU_WORKS) +endif() +if(STARPU_LOOK_FOR_MPI) + if(NOT STARPU_FIND_QUIETLY) + message(STATUS "StarPU mpi libraries stored in STARPU_MPI_LIBRARIES") + endif() + if (PKG_CONFIG_EXECUTABLE AND STARPU_MPI_FOUND) + find_package_handle_standard_args(STARPU DEFAULT_MSG + STARPU_MPI_LIBRARIES) + else() + find_package_handle_standard_args(STARPU DEFAULT_MSG + STARPU_MPI_LIBRARIES + STARPU_WORKS) + endif() +endif() diff --git a/cmake_modules/morse/find/FindTMG.cmake b/cmake_modules/morse/find/FindTMG.cmake new file mode 100644 index 000000000..20ef9a877 --- /dev/null +++ b/cmake_modules/morse/find/FindTMG.cmake @@ -0,0 +1,267 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# - Find TMG include dirs and libraries +# Use this module by invoking find_package with the form: +# find_package(TMG +# [REQUIRED] # Fail with error if tmg is not found +# ) +# +# This module finds headers and tmg library. +# Results are reported in variables: +# TMG_FOUND - True if headers and requested libraries were found +# TMG_INCLUDE_DIRS - tmg include directories +# TMG_LIBRARY_DIRS - Link directories for tmg libraries +# TMG_LIBRARIES - tmg component libraries to be linked +# TMG_INCLUDE_DIRS_DEP - tmg + dependencies include directories +# TMG_LIBRARY_DIRS_DEP - tmg + dependencies link directories +# TMG_LIBRARIES_DEP - tmg libraries + dependencies +# +# The user can give specific paths where to find the libraries adding cmake +# options at configure (ex: cmake path/to/project -DTMG=path/to/tmg): +# TMG_DIR - Where to find the base directory of tmg +# TMG_INCDIR - Where to find the header files +# TMG_LIBDIR - Where to find the library files + +#============================================================================= +# Copyright 2012-2013 Inria +# Copyright 2012-2013 Emmanuel Agullo +# Copyright 2012-2013 Mathieu Faverge +# Copyright 2012 Cedric Castagnede +# Copyright 2013 Florent Pruvost +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file MORSE-Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of Morse, substitute the full +# License text for the above reference.) + + +if (NOT TMG_FOUND) + set(TMG_DIR "" CACHE PATH "Root directory of TMG library") + if (NOT TMG_FIND_QUIETLY) + message(STATUS "A cache variable, namely TMG_DIR, has been set to specify the install directory of TMG") + endif() +endif() + + +# used to test a TMG function after +get_property(_LANGUAGES_ GLOBAL PROPERTY ENABLED_LANGUAGES) +if (NOT _LANGUAGES_ MATCHES Fortran) + include(CheckFunctionExists) +else (NOT _LANGUAGES_ MATCHES Fortran) + include(CheckFortranFunctionExists) +endif (NOT _LANGUAGES_ MATCHES Fortran) + +# TMG depends on LAPACK anyway, try to find it +if (NOT LAPACK_FOUND) + if(TMG_FIND_REQUIRED) + find_package(LAPACK REQUIRED) + else() + find_package(LAPACK) + endif() +endif() + +# TMG depends on LAPACK +if (LAPACK_FOUND) + + # check if a tmg function exists in the LAPACK lib + set(CMAKE_REQUIRED_LIBRARIES "${LAPACK_LIBRARIES}") + include(CheckFunctionExists) + include(CheckFortranFunctionExists) + unset(TMG_WORKS CACHE) + if (NOT _LANGUAGES_ MATCHES Fortran) + check_function_exists(dlarnv TMG_WORKS) + else (NOT _LANGUAGES_ MATCHES Fortran) + check_fortran_function_exists(dlarnv TMG_WORKS) + endif (NOT _LANGUAGES_ MATCHES Fortran) + if (TMG_WORKS) + unset(TMG_WORKS CACHE) + if (NOT _LANGUAGES_ MATCHES Fortran) + check_function_exists(dlagsy TMG_WORKS) + else (NOT _LANGUAGES_ MATCHES Fortran) + check_fortran_function_exists(dlagsy TMG_WORKS) + endif (NOT _LANGUAGES_ MATCHES Fortran) + mark_as_advanced(TMG_WORKS) + endif() + set(CMAKE_REQUIRED_LIBRARIES) + + if(TMG_WORKS) + if(NOT TMG_FIND_QUIETLY) + message(STATUS "Looking for tmg: test with lapack succeeds") + endif() + # test succeeds: TMG is in LAPACK + set(TMG_LIBRARIES "${LAPACK_LIBRARIES}") + set(TMG_LIBRARY_DIRS "${LAPACK_LIBRARY_DIRS}") + if(LAPACK_INCLUDE_DIRS) + set(TMG_INCLUDE_DIRS "${LAPACK_INCLUDE_DIRS}") + endif() + else() + + if(NOT TMG_FIND_QUIETLY) + message(STATUS "Looking for tmg : test with lapack fails") + message(STATUS "Looking for tmg : try to find it elsewhere") + endif() + # test fails: try to find TMG lib exterior to LAPACK + + # Looking for lib tmg + # ------------------- + + # Add system library paths to search lib + # -------------------------------------- + unset(_lib_env) + if(WIN32) + string(REPLACE ":" ";" _lib_env "$ENV{LIB}") + else() + if(APPLE) + string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + else() + string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + endif() + list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") + list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") + endif() + list(REMOVE_DUPLICATES _lib_env) + + # Try to find the tmg lib in the given paths + # ---------------------------------------------- + + # call cmake macro to find the lib path + if(TMG_LIBDIR) + set(TMG_tmg_LIBRARY "TMG_tmg_LIBRARY-NOTFOUND") + find_library(TMG_tmg_LIBRARY + NAMES tmg + HINTS ${TMG_LIBDIR} ) + else() + if(TMG_DIR) + set(TMG_tmg_LIBRARY "TMG_tmg_LIBRARY-NOTFOUND") + find_library(TMG_tmg_LIBRARY + NAMES tmg + HINTS ${TMG_DIR} + PATH_SUFFIXES lib lib32 lib64 ) + else() + set(TMG_tmg_LIBRARY "TMG_tmg_LIBRARY-NOTFOUND") + find_library(TMG_tmg_LIBRARY + NAMES tmg + HINTS ${_lib_env} ) + endif() + endif() + mark_as_advanced(TMG_tmg_LIBRARY) + + # If found, add path to cmake variable + # ------------------------------------ + if (TMG_tmg_LIBRARY) + get_filename_component(tmg_lib_path ${TMG_tmg_LIBRARY} PATH) + # set cmake variables (respects naming convention) + set(TMG_LIBRARIES "${TMG_tmg_LIBRARY}") + set(TMG_LIBRARY_DIRS "${tmg_lib_path}") + else () + set(TMG_LIBRARIES "TMG_LIBRARIES-NOTFOUND") + set(TMG_LIBRARY_DIRS "TMG_LIBRARY_DIRS-NOTFOUND") + if(NOT TMG_FIND_QUIETLY) + message(STATUS "Looking for tmg -- lib tmg not found") + endif() + endif () + + if (TMG_LIBRARY_DIRS) + list(REMOVE_DUPLICATES TMG_LIBRARY_DIRS) + endif () + + # check a function to validate the find + if(TMG_LIBRARIES) + + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # TMG + if (TMG_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${TMG_INCLUDE_DIRS}") + endif() + if (TMG_LIBRARY_DIRS) + set(REQUIRED_LIBDIRS "${TMG_LIBRARY_DIRS}") + endif() + set(REQUIRED_LIBS "${TMG_LIBRARIES}") + # LAPACK + if (LAPACK_INCLUDE_DIRS) + list(APPEND REQUIRED_INCDIRS "${LAPACK_INCLUDE_DIRS}") + endif() + if (LAPACK_LIBRARY_DIRS) + list(APPEND REQUIRED_LIBDIRS "${LAPACK_LIBRARY_DIRS}") + endif() + list(APPEND REQUIRED_LIBS "${LAPACK_LIBRARIES}") + + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + + # test link + unset(TMG_WORKS CACHE) + include(CheckFunctionExists) + include(CheckFortranFunctionExists) + if (NOT _LANGUAGES_ MATCHES Fortran) + check_function_exists(dlarnv TMG_WORKS) + else (NOT _LANGUAGES_ MATCHES Fortran) + check_fortran_function_exists(dlarnv TMG_WORKS) + endif (NOT _LANGUAGES_ MATCHES Fortran) + if (TMG_WORKS) + unset(TMG_WORKS CACHE) + if (NOT _LANGUAGES_ MATCHES Fortran) + check_function_exists(dlagsy TMG_WORKS) + else (NOT _LANGUAGES_ MATCHES Fortran) + check_fortran_function_exists(dlagsy TMG_WORKS) + endif (NOT _LANGUAGES_ MATCHES Fortran) + mark_as_advanced(TMG_WORKS) + endif() + + if(TMG_WORKS) + # save link with dependencies + set(TMG_LIBRARIES_DEP "${REQUIRED_LIBS}") + set(TMG_LIBRARY_DIRS_DEP "${REQUIRED_LIBDIRS}") + set(TMG_INCLUDE_DIRS_DEP "${REQUIRED_INCDIRS}") + else() + if(NOT TMG_FIND_QUIETLY) + message(STATUS "Looking for tmg: test of dlarnv and dlagsy with tmg and lapack libraries fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") + endif() + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) + endif(TMG_LIBRARIES) + + endif() + +else() + + if(NOT TMG_FIND_QUIETLY) + message(STATUS "TMG requires LAPACK but LAPACK has not been found." + "Please look for LAPACK first.") + endif() + +endif() + + +# check that TMG has been found +# ------------------------------- +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(TMG DEFAULT_MSG + TMG_LIBRARIES + TMG_WORKS) diff --git a/cmake_modules/morse/find/MORSE-Copyright.txt b/cmake_modules/morse/find/MORSE-Copyright.txt new file mode 100644 index 000000000..1e5650e0a --- /dev/null +++ b/cmake_modules/morse/find/MORSE-Copyright.txt @@ -0,0 +1,41 @@ +### +# +# @copyright (c) 2009-2014 The University of Tennessee and The University +# of Tennessee Research Foundation. +# All rights reserved. +# @copyright (c) 2012-2014 Inria. All rights reserved. +# @copyright (c) 2012-2014 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, Univ. Bordeaux. All rights reserved. +# +### +# +# This software is a computer program whose purpose is to process +# Matrices Over Runtime Systems @ Exascale (MORSE). More information +# can be found on the following website: http://www.inria.fr/en/teams/morse. +# +# This software is governed by the CeCILL-C license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/ or redistribute the software under the terms of the CeCILL-C +# license as circulated by CEA, CNRS and INRIA at the following URL +# "http://www.cecill.info". +# +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. +# +# In this respect, the user's attention is drawn to the risks associated +# with loading, using, modifying and/or developing or reproducing the +# software by the user in light of its specific status of free software, +# that may mean that it is complicated to manipulate, and that also +# therefore means that it is reserved for developers and experienced +# professionals having in-depth computer knowledge. Users are therefore +# encouraged to load and test the software's suitability as regards their +# requirements in conditions enabling the security of their systems and/or +# data to be ensured and, more generally, to use and operate it in the +# same conditions as regards security. +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL-C license and that you accept its terms. +# +### diff --git a/cmake_modules/morse/precision_generator/Conversion.py b/cmake_modules/morse/precision_generator/Conversion.py new file mode 100644 index 000000000..00202d701 --- /dev/null +++ b/cmake_modules/morse/precision_generator/Conversion.py @@ -0,0 +1,266 @@ +#!/usr/bin/env python +"""@package Tools + +This python script is responsible for precision generation replacements +as well as replacements of any kind in other files. Different types of +replacements can be defined such that no two sets can conflict. Multiple +types of replacements can, however, be specified for the same file. + +@author Wesley Alvaro +@date 2011-4-8 + +""" +__author__="alvaro" +__date__ ="$Sep 2, 2010 10:09:19 AM$" +__version__=11.0408 + +import sys; +import re; +import shlex; +import os; +import shutil; +from os import path; +from optparse import OptionParser,OptionGroup; +from subs import subs; +from datetime import datetime; + +"""Keyword used to signal replacement actions on a file""" +KEYWORD = '@precisions'; +"""Replace the above keyword with this one post-replacements""" +DONE_KEYWORD = '@generated'; +"""Regular expression for the replacement formatting""" +REGEX = '^.*'+KEYWORD+'\s+((\w+,?)+)\s+(\w+)\s+->\s*((\s\w+)+).*$'; +"""Default acceptable extensions for files during directory walking""" +EXTS = ['.c','.cpp','.h','.hpp','.f','.jdf','.f90','.F90','.f77','.F77','.cu','.cuf','.CUF','.jdf']; + +def check_gen(file, work, rex): + """Reads the file and determines if the file needs generation.""" + fd = open(path.realpath(file), 'r'); + lines = fd.readlines(); + fd.close(); + for line in lines: + m = rex.match(line); + if m is None: continue; + work.append((file, m.groups(), ''.join(lines))); + +def grep(string,list): + expr = re.compile(string) + return filter(expr.search,list) + +def hidden(file): + """Exclude hidden files""" + return not file.startswith('.'); + +def valid_extension(file): + """Exclude non-valid extensions""" + global EXTS; + for ext in EXTS: + if file.endswith(ext): + return True; + return False; + +def relpath(p): + """Get the relative path of a file.""" + p = path.realpath(p); + return p.replace(path.realpath('.')+'/',''); + +class Conversion: + """ + This class works on a single file to create generations + """ + """Static. Is the conversion in debug mode? More verbose.""" + debug = False; + """Static. Is the conversion in test mode? No real work.""" + test = False; + """Static. Is the conversion in make mode? Output make commands.""" + make = False; + """Static. What (if any) prefix is specified for the output folder? + If None, use the file's resident folder.""" + prefix = None; + required_precisions = []; + """Static. A running list of files that are input.""" + files_in = []; + """Static. A running list of files that are output.""" + files_out = []; + """Static. A running list of files that are output.""" + dependencies = []; + def __init__(self, file = None, match = None, content = None): + """Constructor that takes a file, match, and content. + @param file The file name of the input. + @param match The regular expression matches + @param content The ASCII content of the file. + """ + if file is None: return; + self.content = content; + #file = path.realpath(file); + rel = relpath(file); + self.file = list(path.split(file)); + self.date = path.getmtime(file); + if sys.platform!="win32" and path.samefile(path.join(self.file[0],self.file[1]),sys.argv[0]): + raise ValueError('Let\'s just forget codegen.py'); + try: + """['normal','all','mixed'] for example. This(ese) are the replacement types to be used.""" + self.types = match[0].split(','); + """'z' for example. This is the current file's `type`.""" + self.precision = match[2].lower(); + """['c','d','s'] for example. This is the current file's destination `types`.""" + self.precisions = match[3].lower().split(); + if len(self.required_precisions): + self.precstmp = []; + for prec in self.required_precisions: + if prec in self.precisions or prec == self.precision: + self.precstmp.append(prec); + self.precisions = self.precstmp; + except: + raise ValueError(path.join(self.file[0],self.file[1])+' : Invalid conversion string'); + self.files_in.append(rel); + + def run(self): + """Does the appropriate work, if in test mode, this is limited to only converting names.""" + if self.convert_names() and not self.test: + """If not in test mode, actually make changes and export to disk.""" + self.convert_data(); + self.export_data(); + + def convert_names(self): + """Investigate file name and make appropriate changes.""" + self.names = []; + self.dates = []; + self.copy = []; + self.converted = []; + load = False; + if self.debug: print '|'.join(self.types), self.precision, relpath(path.join(self.file[0],self.file[1])); + for precision in self.precisions: + """For each destination precision, make the appropriate changes to the file name/data.""" + new_file = self.convert(self.file[1], precision); + if self.debug: print precision,':', + copy = False; + if new_file <> self.file[1] or self.prefix is not None: + if self.prefix is None: + """If no prefix is specified, use the file's current folder.""" + prefix = '' + makeprefix = ''; + else: + """If a prefix is specified, set it up.""" + prefix = self.prefix; + makeprefix = '--prefix '+prefix; + if new_file == self.file[1]: + copy = True; + """Where the destination file will reside.""" + conversion = path.join(prefix, new_file); + file_out = relpath(conversion); + if self.make: + """If in GNU Make mode, write the rule to create the file.""" + file_in = relpath(path.join(self.file[0],self.file[1])); + print file_out+':',file_in; + print "\t$(PYTHON)",path.realpath(sys.argv[0]),makeprefix,'-p',precision,"--file",file_in; + self.names.append(new_file); + self.files_out.append(file_out); + self.dependencies.append( (path.join(self.file[0],self.file[1]), precision, file_out) ); + if self.debug: print relpath(conversion), ':', + try: + """Try to emulate Make like time based dependencies.""" + date = path.getmtime(conversion); + diff = self.date - date; + self.dates.append(diff); + if self.debug: + if diff > 0: print 'Old', + else: print 'Current', + print diff; + if diff > 0: load = True; + except: + if self.debug: print 'Missing'; + self.dates.append(None); + load = True; + elif precision <> self.precision : + """There was no change in the file's name, thus, + no work can be done without overwriting the original.""" + if self.debug: print '<No Change>',':'; + else: print >> sys.stderr, new_file, 'had no change for', precision; + self.names.append(None); + self.dates.append(None); + self.copy.append(copy); + return load; + + def export_data(self): + """After all of the conversions are complete, + this will write the output file contents to the disk.""" + for i in range(len(self.names)): + name = self.names[i]; + data = self.converted[i]; + copy = self.copy[i]; + if copy: + shutil.copy(self.files_in[i], self.files_out[i]); + continue; + if data is None or name is None: continue; + fd = open(self.files_out[i], 'w'); + fd.write(data); + fd.close(); + + + def convert_data(self): + """Convert the data in the files by making the + appropriate replacements for each destination precision.""" + for i in range(len(self.precisions)): + precision = self.precisions[i]; + name = self.names[i]; + date = self.dates[i]; + copy = self.copy[i]; + if name is not None and not copy and (date is None or date > 0): + self.converted.append(self.convert(self.content, precision)); + else: self.converted.append(None); + + def substitute(self, sub_type, data, precision): + """This operates on a single replacement type. + @param sub_type The name of the replacement set. + @param data The content subject for replacments. + @param precision The target precision for replacements. + """ + try: + """Try to select the requested replacements.""" + work = subs[sub_type]; + prec_to = work[0].index(precision); + prec_from = work[0].index(self.precision); + except: + """If requested replacement type does not exist, + return unaltered contents.""" + return data; + for i in range(1,len(work)): + """Requested replacements were found, + execute replacements for each entry.""" + try: + search = work[i][prec_from]; + replace = work[i][prec_to]; + if not search: continue; + replace = replace.replace('\*','*'); + if sub_type != 'tracing' : + replace = replace.replace('\(','('); + replace = replace.replace('\)',')'); + data = re.sub(search, replace, data); + except: + print 'Bad replacement pair ',i,'in',sub_type; + continue; + return data; + + def convert(self, data, precision): + """Select appropriate replacements for the current file. + @param data The content subject for the replacements. + @param precision The target precision for generation. + """ + global KEYWORD, DONE_KEYWORD; + try: + """All files undergo the "all" replacements.""" + data = self.substitute('all', data, precision); + except: pass; + for sub_type in self.types: + """For all the other types of conversion for the current file, + make the correct replacements.""" + if sub_type == 'all': continue; + try: + data = self.substitute(sub_type, data, precision); + except Exception, e: + raise ValueError('I encountered an unrecoverable error while working in subtype:',sub_type+'.'); + """Replace the replacement keywork with one that signifies this is an output file, + to prevent multiple replacement issues if run again.""" + data = re.sub(KEYWORD+' '+','.join(self.types)+'.*', DONE_KEYWORD+' '+precision+' '+datetime.now().ctime(), data); + return data; diff --git a/cmake_modules/morse/precision_generator/codegen.py b/cmake_modules/morse/precision_generator/codegen.py new file mode 100755 index 000000000..8b0322361 --- /dev/null +++ b/cmake_modules/morse/precision_generator/codegen.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python +"""@package Tools + +This python script is responsible for precision generation replacements +as well as replacements of any kind in other files. Different types of +replacements can be defined such that no two sets can conflict. Multiple +types of replacements can, however, be specified for the same file. + +@author Wesley Alvaro +@date 2011-4-8 + +""" +__author__="alvaro" +__date__ ="$Sep 2, 2010 10:09:19 AM$" +__version__=11.0408 + +import sys; +import re; +import shlex; +import os; +import shutil; +from os import path; +from optparse import OptionParser,OptionGroup; +from datetime import datetime; +from Conversion import KEYWORD,DONE_KEYWORD,REGEX,EXTS,Conversion,check_gen,subs; + +def main(): + """Create option parser, set static variables of the converter and manage printing options/order.""" + global REGEX, EXTS; + """The compiled regular expression for detecting proper files.""" + rex = re.compile(REGEX); + """Files found to be workable.""" + work = []; + + """Create the options parser for detecting options on the command line.""" + parser = OptionParser(usage="Usage: %prog [options]",version='%prog '+str(__version__)); + group = OptionGroup(parser,"Printing Options","These options control the printing output."); + group.add_option("-i", "--in-files", help='Print the filenames of files for precision generation.', action='store_true', dest='in_print', default=False); + group.add_option("-o", "--out-files", help='Print the filenames for the precision generated files.', action='store_true', dest='out_print', default=False); + group.add_option("-m", "--make", help='Spew a GNU Make friendly file to standard out.', action='store_true', dest='make', default=False); + group.add_option("-d", "--debug", help='Print debugging messages.', action='store_true', dest='debug', default=False); + parser.add_option_group(group); + group = OptionGroup(parser,"Operating Mode Options","These options alter the way the program operates on the input/output files."); + group.add_option("-c", "--clean", help='Remove the files that are the product of generation.', action='store_true', dest='out_clean', default=False); + group.add_option("-T", "--test", help='Don\'t actually do any work.', action='store_true', dest='test', default=False); + parser.add_option_group(group); + group = OptionGroup(parser,"Settings","These options specify how the work should be done."); + group.add_option("-P", "--prefix", help='The output directory if different from the input directory.', action='store', dest='prefix', default=None); + group.add_option("-f", "--file", help='Specify a file(s) on which to operate.', action='store', dest='fileslst', type='string', default=""); + group.add_option("-p", "--prec", help='Specify a precision(s) on which to operate.', action='store', dest='precslst', type='string', default=""); + group.add_option("-e", "--filetypes", help='Specify file extensions on which to operate when walking.', action='store', dest='fileexts', type='string', default=""); + parser.add_option_group(group); + + (options, args) = parser.parse_args(); + + """If file extensions are specified, override defaults.""" + if options.fileexts: + EXTS = options.fileexts.split(); + + """Fill the 'work' array with files found to be operable.""" + if options.fileslst: + """If files to examine are specified on the command line""" + for file in options.fileslst.split(): + check_gen(file, work, rex); + else: + """Begin directory walking in the current directory.""" + startDir = '.'; + for root, dirs, files in os.walk(startDir, True, None): + dirs = filter(hidden,dirs); + files = filter(hidden,files); + files = filter(valid_extension,files); + for file in files: + check_gen(path.join(root,file), work, rex); + + """Set static options for conversion.""" + Conversion.debug = options.debug; + Conversion.make = options.make; + Conversion.prefix = options.prefix; + Conversion.required_precisions = options.precslst.split(); + if options.out_print or options.out_clean or options.in_print or options.make or options.test: + Conversion.test = True; + + if options.make: + """If the program should be GNU Make friendly.""" + print '## Automatically generated Makefile'; + print 'PYTHON ?= python'; + + c = Conversion(); """This initializes the variable for static member access.""" + + for tuple in work: + """For each valid conversion file found.""" + try: + """Try creating and executing a converter.""" + c = Conversion(tuple[0], tuple[1], tuple[2]); + c.run(); + except Exception, e: + print >> sys.stderr, str(e); + continue; + + if options.make: + """If the program should be GNU Make friendly.""" + print 'gen = ',' '+' '.join(c.files_out); + print 'cleangen:'; + print '\trm -f $(gen)'; + print 'generate: $(gen)'; + print '.PHONY: cleangen generate'; + if options.in_print: + """Should we print the input files?""" + print ' '.join(c.files_in); + if options.out_print: + """Should we print the output files?""" + print ' '.join(c.files_out); + if options.out_clean: + """Clean generated files""" + for file in c.files_out: + if not path.exists(file): continue; + os.remove(file); + +if __name__ == "__main__": + main(); diff --git a/cmake_modules/morse/precision_generator/genDependencies.py b/cmake_modules/morse/precision_generator/genDependencies.py new file mode 100755 index 000000000..973e5aa29 --- /dev/null +++ b/cmake_modules/morse/precision_generator/genDependencies.py @@ -0,0 +1,211 @@ +#!/usr/bin/env python +"""@package Tools + +This python script is responsible for precision generation replacements +as well as replacements of any kind in other files. Different types of +replacements can be defined such that no two sets can conflict. Multiple +types of replacements can, however, be specified for the same file. + +@author Wesley Alvaro +@date 2011-4-8 + +""" +__author__="alvaro" +__date__ ="$Sep 2, 2010 10:09:19 AM$" +__version__=11.0408 + +import sys; +import re; +import shlex; +import os; +import shutil; +import imp; +from os import path; +from optparse import OptionParser,OptionGroup; +from datetime import datetime; +from Conversion import KEYWORD,DONE_KEYWORD,REGEX,EXTS,Conversion,check_gen,relpath,subs; + +class GenConversion: + """ + This class works on a single file to create generations + """ + """Static. Source directory where to find the input files""" + srcdir = None; + """Static. What (if any) prefix is specified for the output folder? + If None, use the file's resident folder.""" + prefix = None; + """Static. Precisions asked by the user.""" + required_precisions = []; + """The compiled regular expression for detecting proper files.""" + rex = re.compile(REGEX); + + def run(self, file = None): + match = None; + """Local complete """ + if self.srcdir is None: + lfile = file; + else: + lfile = path.join(self.srcdir, file); + """Reads the file and determines if the file needs generation.""" + for line in open(path.realpath(lfile), 'r'): + m = self.rex.match(line); + if m is None: continue; + else: + match = m.groups(); + break; + + """This file need to go through precision generation script""" + if match is None: + return ""; + else: + try: + """['normal','all','mixed'] for example. This(ese) are the replacement types to be used.""" + self.types = match[0].split(','); + """'z' for example. This is the current file's `type`.""" + self.precision = match[2].lower(); + """['c','d','s'] for example. This is the current file's destination `types`.""" + self.precisions = set(match[3].lower().split()); + """Add the local precision to the list if not present""" + self.precisions.add(self.precision); + """Take only the intersection of the available precision and the requested ones""" + self.precisions.intersection_update(self.required_precisions); + except: + raise ValueError(lfile+' : Invalid conversion string'); + + filename = list(path.split(lfile))[1]; + result = ""; + for precision in self.precisions: + """For each destination precision, make the appropriate changes to the file name/data.""" + new_file = self.convert(filename, precision); + if new_file <> filename or self.prefix is not None: + if self.prefix is None: + """If no prefix is specified, use the file's current folder.""" + prefix = '' + else: + """If a prefix is specified, set it up.""" + prefix = self.prefix; + """Where the destination file will reside.""" + conversion = path.join(prefix, new_file); + file_out = relpath(conversion); + result = result+file+","+precision+","+file_out+";"; + return result; + + def substitute(self, sub_type, data, precision): + """This operates on a single replacement type. + @param sub_type The name of the replacement set. + @param data The content subject for replacments. + @param precision The target precision for replacements. + """ + try: + """Try to select the requested replacements.""" + work = subs[sub_type]; + prec_to = work[0].index(precision); + prec_from = work[0].index(self.precision); + except: + """If requested replacement type does not exist, + return unaltered contents.""" + return data; + for i in range(1,len(work)): + """Requested replacements were found, + execute replacements for each entry.""" + try: + search = work[i][prec_from]; + replace = work[i][prec_to]; + if not search: continue; + replace = replace.replace('\*','*'); + if sub_type != 'tracing' : + replace = replace.replace('\(','('); + replace = replace.replace('\)',')'); + data = re.sub(search, replace, data); + except: + print 'Bad replacement pair ',i,'in',sub_type; + continue; + return data; + + def convert(self, data, precision): + """Select appropriate replacements for the current file. + @param data The content subject for the replacements. + @param precision The target precision for generation. + """ + global KEYWORD, DONE_KEYWORD; + try: + """All files undergo the "all" replacements.""" + data = self.substitute('all', data, precision); + except: pass; + for sub_type in self.types: + """For all the other types of conversion for the current file, + make the correct replacements.""" + if sub_type == 'all': continue; + try: + data = self.substitute(sub_type, data, precision); + except Exception, e: + raise ValueError('I encountered an unrecoverable error while working in subtype:',sub_type+'.'); + return data; + + +def main(): + """Create option parser, set static variables of the converter and manage printing options/order.""" + global REGEX, EXTS; + """The compiled regular expression for detecting proper files.""" + rex = re.compile(REGEX); + """Files found to be workable.""" + work = []; + + """Create the options parser for detecting options on the command line.""" + parser = OptionParser(usage="Usage: %prog [options]",version='%prog '+str(__version__)); + group = OptionGroup(parser,"Printing Options","These options control the printing output."); + group.add_option("-i", "--in-files", help='Print the filenames of files for precision generation.', action='store_true', dest='in_print', default=False); + group.add_option("-o", "--out-files", help='Print the filenames for the precision generated files.', action='store_true', dest='out_print', default=False); + group.add_option("-d", "--debug", help='Print debugging messages.', action='store_true', dest='debug', default=False); + parser.add_option_group(group); + group = OptionGroup(parser,"Settings","These options specify how the work should be done."); + group.add_option("-s", "--srcdir", help='The input source directory.', action='store', dest='srcdir', default=None); + group.add_option("-P", "--prefix", help='The output directory if different from the input directory.', action='store', dest='prefix', default=None); + group.add_option("-f", "--file", help='Specify a file(s) on which to operate.', action='store', dest='fileslst', type='string', default=""); + group.add_option("-p", "--prec", help='Specify a precision(s) on which to operate.', action='store', dest='precslst', type='string', default=""); + group.add_option("-e", "--filetypes", help='Specify file extensions on which to operate when walking.', action='store', dest='fileexts', type='string', default=""); + group.add_option("-D", "--dictionnary", help='Specify the dictionnary to use in names conversion.', action='store', dest='dictionnary', type='string', default=""); + parser.add_option_group(group); + + (options, args) = parser.parse_args(); + + """If file extensions are specified, override defaults.""" + if options.fileexts: + EXTS = options.fileexts.split(); + + """Fill the 'work' array with files found to be operable.""" + # if options.fileslst: + # """If files to examine are specified on the command line""" + # for file in options.fileslst.split(): + # check_gen(file, work, rex); + # else: + # """Begin directory walking in the current directory.""" + # startDir = '.'; + # for root, dirs, files in os.walk(startDir, True, None): + # dirs = filter(hidden,dirs); + # files = filter(hidden,files); + # files = filter(valid_extension,files); + # for file in files: + # check_gen(path.join(root,file), work, rex); + + """Set static options for conversion.""" + GenConversion.srcdir = options.srcdir; + GenConversion.prefix = options.prefix; + GenConversion.required_precisions = options.precslst.split(); + + c = GenConversion(); """This initializes the variable for static member access.""" + + result = "" + for file in options.fileslst.split(): + """For each valid conversion file found.""" + try: + """Try creating and executing a converter.""" + result += c.run(file); + except Exception, e: + print >> sys.stderr, str(e); + continue; + + print result; + +if __name__ == "__main__": + main(); diff --git a/cmake_modules/morse/precision_generator/subs.py b/cmake_modules/morse/precision_generator/subs.py new file mode 100644 index 000000000..fe0d0effd --- /dev/null +++ b/cmake_modules/morse/precision_generator/subs.py @@ -0,0 +1,968 @@ +#!/usr/bin/env python +# Substitutions are applied in the order listed. This is important in cases +# where multiple substitutions could match, or when one substitution matches +# the result of a previous substitution. For example, these rules are correct +# in this order: +# +# ('real', 'double precision', 'real', 'double precision' ), # before double +# ('float', 'double', 'float', 'double' ), +# +# but if switched would translate 'double precision' -> 'float precision', +# which is wrong. +# +# Reorganized 5/2012 Mark Gates + +# Dictionary is keyed on substitution type (mixed, normal, etc.) +subs = { + # ------------------------------------------------------------ + # replacements applied to ALL files. + 'all' : [ + [None, None] + ], + + # ------------------------------------------------------------ + # replacements applied to mixed precision files. + 'mixed' : [ + # ----- Special line indicating column types + ['ds', 'zc' ], + + # ----- Mixed precisions + ('DS', 'ZC' ), + ('ds', 'zc' ), + + # ----- Preprocessor + ('#define PRECISION_d', '#define PRECISION_z' ), + ('#define PRECISION_s', '#define PRECISION_c' ), + ('#undef PRECISION_d', '#undef PRECISION_z' ), + ('#undef PRECISION_s', '#undef PRECISION_c' ), + + # ----- Fortran Types + ('real\(kind=c_double\)', 'complex\(kind=c_double_complex\)' ), + ('real\(kind=c_float\)', 'real\(kind=c_float_complex\)' ), + + # ----- Data types + ('double', 'double2' ), + ('float', 'float2' ), + ('double', 'cuDoubleComplex' ), + ('float', 'cuFloatComplex' ), + ('DOUBLE PRECISION', 'COMPLEX_16' ), + ('SINGLE PRECISION', 'COMPLEX' ), + ('real', 'complex' ), + ('float', 'MORSE_Complex32_t' ), + ('double', 'MORSE_Complex64_t' ), + ('float', 'MORSE_voidComplex32_t' ), + ('double', 'MORSE_voidComplex64_t' ), + ('MorseRealFloat', 'MorseComplexFloat' ), + ('MorseRealDouble', 'MorseComplexDouble' ), + + # ----- CBLAS + ('', 'CBLAS_SADDR' ), + + # ----- Prefixes + ('blasf77_d', 'blasf77_z' ), + ('blasf77_s', 'blasf77_c' ), + ('cublasIdamax', 'cublasIzamax' ), + ('cublasD', 'cublasZ' ), + ('cublasS', 'cublasC' ), + ('lapackf77_d', 'lapackf77_z' ), + ('lapackf77_s', 'lapackf77_c' ), + ('MAGMA_D', 'MAGMA_Z' ), + ('MAGMA_S', 'MAGMA_C' ), + ('magmablas_d', 'magmablas_z' ), + ('magmablas_s', 'magmablas_c' ), + ('magma_d', 'magma_z' ), + ('magma_s', 'magma_c' ), + ('magma_get_d', 'magma_get_z' ), + ('magma_get_s', 'magma_get_c' ), + + # ----- Prefixes MORSE + ('MORSE_D', 'MORSE_Z' ), + ('MORSE_S', 'MORSE_C' ), + ('morse_get_d', 'morse_get_z' ), + ('morse_get_s', 'morse_get_c' ), + ('TASK_S', 'TASK_C' ), + ('TASK_D', 'TASK_Z' ), + ('RUNTIME_S', 'RUNTIME_C' ), + ('RUNTIME_D', 'RUNTIME_Z' ), + + # ----- Complex numbers + ('(double)', 'cuComplexFloatToDouble' ), + ('(float)', 'cuComplexDoubleToFloat' ), + ('', 'cuCrealf' ), + ('', 'cuCimagf' ), + ('', 'cuCreal' ), + ('', 'cuCimag' ), + ('', 'cuConj' ), + ('abs', 'cuCabs' ), + ('absf', 'cuCabsf' ), + + # ----- PLASMA / MAGMA + ('magma_sdgetrs', 'magma_czgetrs' ), + + # ----- MORSE + ('morse_sdgetrs', 'morse_czgetrs' ), + + # ----- Constants + ('CblasTrans', 'CblasConjTrans' ), + ('MagmaTrans', 'MagmaConjTrans' ), + ('MorseTrans', 'MorseConjTrans' ), + + # ----- BLAS and LAPACK, lowercase, alphabetic order + # copy & paste these to uppercase below and fix case. + # mixed precision + ('dsaxpy', 'zcaxpy' ), + ('dslaswp', 'zclaswp' ), + + # regular + ('daxpy', 'zaxpy' ), + ('dgemm', 'zgemm' ), + ('dgesv', 'zgesv' ), + ('dlacpy', 'zlacpy' ), + ('dlange', 'zlange' ), + ('dlansy', 'zlansy' ), + ('dlarnv', 'zlarnv' ), + ('dpotrf', 'zpotrf' ), + ('dsytrf', 'zsytrf' ), + ('dtrmm', 'ztrmm' ), + ('dtrsm', 'ztrsm' ), + ('dtrsv', 'ztrsv' ), + ('idamax', 'izamax' ), + ('spotrf', 'cpotrf' ), + ('ssytrf', 'csytrf' ), + ('strmm', 'ctrmm' ), + ('strsm', 'ctrsm' ), + ('strsv', 'ctrsv' ), + + # ----- BLAS and LAPACK, where complex base name != real base name + # with precision + ('dlag2s', 'zlag2c' ), + ('dlagsy', 'zlaghe' ), + ('dlansy', 'zlanhe' ), + ('dlat2s', 'zlat2c' ), + ('dormqr', 'zunmqr' ), + ('dsymm', 'zhemm' ), + ('dsymv', 'zhemv' ), + ('dsyrk', 'zherk' ), + ('slag2d', 'clag2z' ), + ('slansy', 'clanhe' ), + ('slat2d', 'clat2z' ), + + # without precision + ('lag2s', 'lag2c' ), + ('lagsy', 'laghe' ), + ('lansy', 'lanhe' ), + ('lat2s', 'lat2c' ), + ('ormqr', 'unmqr' ), + ('symm', 'hemm' ), + ('symv', 'hemv' ), + ('syrk', 'herk' ), + ('lag2d', 'lag2z' ), + ('lansy', 'lanhe' ), + ('lat2d', 'lat2z' ), + + # QUARK codelets protection (to prevent conversion with LAPACK WITH PRECISION) + ('DAG_CORE_L-AG2C', 'DAG_CORE_LAG2C' ), + + # ----- BLAS AND LAPACK, UPPERCASE, ALPHABETIC ORDER + # COPY & PASTE THESE TO UPPERCASE BELOW AND FIX CASE. + # MIXED PRECISION + ('DSAXPY', 'ZCAXPY' ), + ('DSLASWP', 'ZCLASWP' ), + + # REGULAR + ('DAXPY', 'ZAXPY' ), + ('DGEMM', 'ZGEMM' ), + ('DGESV', 'ZGESV' ), + ('DLACPY', 'ZLACPY' ), + ('DLANGE', 'ZLANGE' ), + ('DLANSY', 'ZLANSY' ), + ('DLARNV', 'ZLARNV' ), + ('DPOTRF', 'ZPOTRF' ), + ('DSYTRF', 'ZSYTRF' ), + ('DTRMM', 'ZTRMM' ), + ('DTRSM', 'ZTRSM' ), + ('DTRSV', 'ZTRSV' ), + ('IDAMAX', 'IZAMAX' ), + ('SPOTRF', 'CPOTRF' ), + ('SSYTRF', 'CSYTRF' ), + ('STRMM', 'CTRMM' ), + ('STRSM', 'CTRSM' ), + ('STRSV', 'CTRSV' ), + + # ----- BLAS AND LAPACK, WHERE COMPLEX BASE NAME != REAL BASE NAME + # WITH PRECISION + ('DLAG2S', 'ZLAG2C' ), + ('DLAGSY', 'ZLAGHE' ), + ('DLANSY', 'ZLANHE' ), + ('DLAT2S', 'ZLAT2C' ), + ('DORMQR', 'ZUNMQR' ), + ('DSYMM', 'ZHEMM' ), + ('DSYMV', 'ZHEMV' ), + ('DSYRK', 'ZHERK' ), + ('SLAG2D', 'CLAG2Z' ), + ('SLANSY', 'CLANHE' ), + ('SLAT2D', 'CLAT2Z' ), + + # WITHOUT PRECISION + ('LAG2S', 'LAG2C' ), + ('LAGSY', 'LAGHE' ), + ('LANSY', 'LANHE' ), + ('LAT2S', 'LAT2C' ), + ('ORMQR', 'UNMQR' ), + ('SYMM', 'HEMM' ), + ('SYMV', 'HEMV' ), + ('SYRK', 'HERK' ), + ('LAG2D', 'LAG2Z' ), + ('LANSY', 'LANHE' ), + ('LAT2D', 'LAT2Z' ), + + # QUARK codelets protection (to prevent conversion with LAPACK WITH PRECISION) + ('DAG_CORE_LAG2C', 'DAG_CORE_L-AG2C' ), +], + + # ------------------------------------------------------------ + # replacements applied to most files. + 'normal' : [ + # ----- Special line indicating column types + # old python (2.4) requires this line to be list [] rather than tuple () to use index() function. + ['s', 'd', 'c', 'z' ], + + # ----- Preprocessor + ('#define PRECISION_s', '#define PRECISION_d', '#define PRECISION_c', '#\s*define PRECISION_z' ), + ('#undef PRECISION_s', '#undef PRECISION_d', '#undef PRECISION_c', '#undef PRECISION_z' ), + ('#define REAL', '#define REAL', '#define COMPLEX', '#define COMPLEX' ), + ('#undef COMPLEX', '#undef COMPLEX', '#undef REAL', '#undef REAL' ), + ('#define SINGLE', '#define DOUBLE', '#define SINGLE', '#define DOUBLE' ), + ('#undef DOUBLE', '#undef SINGLE', '#undef DOUBLE', '#undef SINGLE' ), + + # ----- Fortran Types + ('real\(kind=c_float\)', 'real\(kind=c_double\)', 'complex\(kind=c_float_complex\)', 'complex\(kind=c_double_complex\)' ), + ('real(kind=c_float\)', 'real\(kind=c_double\)', 'real\(kind=c_float\)', 'real\(kind=c_double\)' ), + ('real', 'double precision', 'complex', 'complex\(kind=wp\)' ), + + # ----- Data types + ('real', 'double precision', 'real', r'\bdouble precision' ), # before double + ('float', 'double', 'float _Complex', r'\bdouble _Complex' ), + ('float', 'double', 'cuFloatComplex', r'\bcuDoubleComplex' ), + ('float', 'double', 'make_cuFloatComplex', 'make_cuDoubleComplex' ), + ('float', 'double', 'magmaFloatComplex', r'\bmagmaDoubleComplex' ), + ('float', 'double', 'PLASMA_Complex32_t', r'\bPLASMA_Complex64_t' ), + ('float', 'double', 'PLASMA_voidComplex32_t', r'\bPLASMA_voidComplex64_t' ), + ('PlasmaRealFloat', 'PlasmaRealDouble', 'PlasmaComplexFloat', r'\bPlasmaComplexDouble' ), + ('float', 'double', 'MORSE_Complex32_t', r'\bMORSE_Complex64_t' ), + ('float', 'double', 'MORSE_voidComplex32_t', r'\bMORSE_voidComplex64_t' ), + ('MorseRealFloat', 'MorseRealDouble', 'MorseComplexFloat', r'\bMorseComplexDouble' ), + ('real', 'double precision', 'complex', r'\bcomplex\*16' ), + ('REAL', 'DOUBLE_PRECISION', 'COMPLEX', r'\bCOMPLEX_16' ), + ('REAL', 'DOUBLE PRECISION', 'COMPLEX', r'\bDOUBLE COMPLEX' ), + ('REAL', 'DOUBLE PRECISION', 'REAL', r'\bDOUBLE PRECISION' ), + ('sizeof_real', 'sizeof_double', 'sizeof_complex', r'\bsizeof_complex_16' ), # before complex + ('float', 'double', 'pastix_complex32_t', r'\bpastix_complex64_t' ), + ('real', 'real', 'complex', r'\bcomplex' ), + ('float', 'double', 'float2', r'\bdouble2' ), + ('float', 'double', 'float', r'\bdouble' ), + ('ipt_s', 'ipt_d', 'ipt_c', 'ipt_z' ), + + # ----- Text + ('symmetric', 'symmetric', 'Hermitian', 'Hermitian' ), + ('\*\*T', '\*\*T', '\*\*H', '\*\*H' ), + ('%f', '%lf', '%f', '%lf' ), # for scanf + ('%g', '%lg', '%g', '%lg' ), # for scanf + + # ----- CBLAS + ('cblas_sasum', 'cblas_dasum', 'cblas_scasum', 'cblas_dzasum' ), + ('cblas_snrm2', 'cblas_dnrm2', 'cblas_scnrm2', 'cblas_dznrm2' ), + ('', '', 'CBLAS_SADDR', 'CBLAS_SADDR' ), + ('cblas_ssyr', 'cblas_dsyr', 'cblas_cher', 'cblas_zher' ), + + # ----- Core BLAS + ('CORE_sasum', 'CORE_dasum', 'CORE_scasum', 'CORE_dzasum' ), + ('core_sasum', 'core_dasum', 'core_scasum', 'core_dzasum' ), + ('CORE_ssyrfb', 'CORE_dsyrfb', 'CORE_cherfb', 'CORE_zherfb' ), + ('core_ssyrfb', 'core_dsyrfb', 'core_cherfb', 'core_zherfb' ), + ('CORE_stsmlq_sy', 'CORE_dtsmlq_sy', 'CORE_ctsmlq_he', 'CORE_ztsmlq_he' ), + ('core_stsmlq_sy', 'core_dtsmlq_sy', 'core_ctsmlq_he', 'core_ztsmlq_he' ), + ('CORE_stsmqr_sy', 'CORE_dtsmqr_sy', 'CORE_ctsmqr_he', 'CORE_ztsmqr_he' ), + ('core_stsmqr_sy', 'core_dtsmqr_sy', 'core_ctsmqr_he', 'core_ztsmqr_he' ), + + # ----- Prefixes + # Changing prefixes first requires some calls to be fixed without precision, + # e.g., her2k -> syr2k instead of zher2k -> ssyr2k. + # See BLAS and LAPACK without precision, below. + ('blasf77_s', 'blasf77_d', 'blasf77_c', 'blasf77_z' ), + ('blasf77_s', 'blasf77_d', 'blasf77_s', 'blasf77_d' ), + ('BLAS_S', 'BLAS_D', 'BLAS_C', 'BLAS_Z' ), + ('BLAS_s', 'BLAS_d', 'BLAS_c', 'BLAS_z' ), + ('BLAS_s', 'BLAS_d', 'BLAS_s', 'BLAS_d' ), + ('blas_is', 'blas_id', 'blas_ic', 'blas_iz' ), + ('blas_s', 'blas_d', 'blas_c', 'blas_z' ), + ('cl_ps', 'cl_pd', 'cl_pc', 'cl_pz' ), + ('cl_s', 'cl_d', 'cl_c', 'cl_z' ), + ('cl_s', 'cl_d', 'cl_sc', 'cl_dz' ), + ('CODELETS_S', 'CODELETS_D', 'CODELETS_C', 'CODELETS_Z' ), + ('codelet_s', 'codelet_d', 'codelet_c', 'codelet_z' ), + ('compute_s', 'compute_d', 'compute_c', 'compute_z' ), + ('control_s', 'control_d', 'control_c', 'control_z' ), + ('coreblas_s', 'coreblas_d', 'coreblas_c', 'coreblas_z' ), + ('CORE_S', 'CORE_D', 'CORE_C', 'CORE_Z' ), + ('CORE_s', 'CORE_d', 'CORE_c', 'CORE_z' ), + ('core_s', 'core_d', 'core_c', 'core_z' ), + ('CORE_s', 'CORE_d', 'CORE_s', 'CORE_d' ), + ('cpu_gpu_s', 'cpu_gpu_d', 'cpu_gpu_c', 'cpu_gpu_z' ), + ('cublasS', 'cublasD', 'cublasC', 'cublasZ' ), + ('example_s', 'example_d', 'example_c', 'example_z' ), + ('ipt_s', 'ipt_d', 'ipt_c', 'ipt_z' ), + ('LAPACKE_s', 'LAPACKE_d', 'LAPACKE_c', 'LAPACKE_z' ), + ('lapackf77_s', 'lapackf77_d', 'lapackf77_c', 'lapackf77_z' ), + ('lapackf77_s', 'lapackf77_d', 'lapackf77_s', 'lapackf77_d' ), + ('lapack_s', 'lapack_d', 'lapack_c', 'lapack_z' ), + ('lapack_s', 'lapack_d', 'lapack_s', 'lapack_d' ), + ('MAGMABLAS_S', 'MAGMABLAS_D', 'MAGMABLAS_C', 'MAGMABLAS_Z' ), + ('magmablas_s', 'magmablas_d', 'magmablas_c', 'magmablas_z' ), + ('magmaf_s', 'magmaf_d', 'magmaf_c', 'magmaf_z' ), + ('magma_get_s', 'magma_get_d', 'magma_get_c', 'magma_get_z' ), + ('magma_ps', 'magma_pd', 'magma_pc', 'magma_pz' ), + ('MAGMA_S', 'MAGMA_D', 'MAGMA_C', 'MAGMA_Z' ), + ('MAGMA_s', 'MAGMA_d', 'MAGMA_c', 'MAGMA_z' ), + ('magma_s', 'magma_d', 'magma_c', 'magma_z' ), + ('QUARK_S', 'QUARK_D', 'QUARK_C', 'QUARK_Z' ), + ('QUARK_s', 'QUARK_d', 'QUARK_c', 'QUARK_z' ), + ('quark_s', 'quark_d', 'quark_c', 'quark_z' ), + ('QUARK_s', 'QUARK_d', 'QUARK_s', 'QUARK_d' ), + ('plasma_ps', 'plasma_pd', 'plasma_pc', 'plasma_pz' ), + ('PLASMA_S', 'PLASMA_D', 'PLASMA_C', 'PLASMA_Z' ), + ('PLASMA_sor', 'PLASMA_dor', 'PLASMA_cun', 'PLASMA_zun' ), + ('PLASMA_s', 'PLASMA_d', 'PLASMA_c', 'PLASMA_z' ), + ('plasma_s', 'plasma_d', 'plasma_c', 'plasma_z' ), + ('PROFILE_S', 'PROFILE_D', 'PROFILE_C', 'PROFILE_Z' ), + ('profile_s', 'profile_d', 'profile_c', 'profile_z' ), + ('SCHED_s', 'SCHED_d', 'SCHED_c', 'SCHED_z' ), + ('starpu_s', 'starpu_d', 'starpu_c', 'starpu_z' ), + ('testing_ds', 'testing_ds', 'testing_zc', 'testing_zc' ), + ('TESTING_S', 'TESTING_D', 'TESTING_C', 'TESTING_Z' ), + ('testing_s', 'testing_d', 'testing_c', 'testing_z' ), + ('time_s', 'time_d', 'time_c', 'time_z' ), + ('WRAPPER_S', 'WRAPPER_D', 'WRAPPER_C', 'WRAPPER_Z' ), + ('wrapper_s', 'wrapper_d', 'wrapper_c', 'wrapper_z' ), + ('Workspace_s', 'Workspace_d', 'Workspace_c', 'Workspace_z' ), + ('workspace_s', 'workspace_d', 'workspace_c', 'workspace_z' ), + + ('csc_s', 'csc_d', 'csc_c', 'csc_z' ), + ('sequential_s', 'sequential_d', 'sequential_c', 'sequential_z' ), + ('coeftab_s', 'coeftab_d', 'coeftab_c', 'coeftab_z' ), + + # ----- Prefixes MORSE + ('MORSE_S', 'MORSE_D', 'MORSE_C', 'MORSE_Z' ), + ('MORSE_sor', 'MORSE_dor', 'MORSE_cun', 'MORSE_zun' ), + ('MORSE_s', 'MORSE_d', 'MORSE_c', 'MORSE_z' ), + ('morse_get_s', 'morse_get_d', 'morse_get_c', 'morse_get_z' ), + ('morse_ps', 'morse_pd', 'morse_pc', 'morse_pz' ), + ('morse_s', 'morse_d', 'morse_c', 'morse_z' ), + ('morse_sdesc', 'morse_ddesc', 'morse_sdesc', 'morse_ddesc' ), + ('TASK_sasum', 'TASK_dasum', 'TASK_scasum', 'TASK_dzasum' ), + ('TASK_ssyrfb', 'TASK_dsyrfb', 'TASK_cherfb', 'TASK_zherfb' ), + ('TASK_stsmlq_sy', 'TASK_dtsmlq_sy', 'TASK_ctsmlq_he', 'TASK_ztsmlq_he' ), + ('TASK_stsmqr_sy', 'TASK_dtsmqr_sy', 'TASK_ctsmqr_he', 'TASK_ztsmqr_he' ), + ('TASK_sor', 'TASK_dor', 'TASK_cun', 'TASK_zun' ), + ('TASK_s', 'TASK_d', 'TASK_c', 'TASK_z' ), + ('TASK_slan', 'TASK_dlan', 'TASK_slan', 'TASK_dlan' ), + ('RUNTIME_S', 'RUNTIME_D', 'RUNTIME_C', 'RUNTIME_Z' ), + ('RUNTIME_s', 'RUNTIME_d', 'RUNTIME_c', 'RUNTIME_z' ), + + # ----- Complex numbers + # \b regexp here avoids conjugate -> conjfugate, + # assuming we always translate from z, not to z. + ('', '', 'conjf', 'conj\b' ), + ('fabsf', 'fabs', 'cabsf', 'cabs' ), + ('', '', 'cuCrealf', 'cuCreal' ), + ('', '', 'cuCimagf', 'cuCimag' ), + ('', '', 'cuConjf', 'cuConj' ), + ('fabsf', 'fabs', 'cuCabsf', 'cuCabs' ), + ('', '', 'crealf', 'creal' ), + ('sqrtf', 'sqrt', 'csqrtf', 'csqrt' ), + + # ----- CUDA + ('cublasIsamax', 'cublasIdamax', 'cublasIcamax', 'cublasIzamax' ), + ('cublasIsamax', 'cublasIdamax', 'cublasIsamax', 'cublasIdamax' ), + ('cublasSnrm2', 'cublasDnrm2', 'cublasScnrm2', 'cublasDznrm2' ), + + # ----- PLASMA / MAGMA / MORSE + ('bsy2trc', 'bsy2trc', 'bhe2trc', 'bhe2trc' ), + ('magma_ssqrt', 'magma_dsqrt', 'magma_ssqrt', 'magma_dsqrt' ), + ('morse_ssqrt', 'morse_dsqrt', 'morse_ssqrt', 'morse_dsqrt' ), + ('SAUXILIARY', 'DAUXILIARY', 'CAUXILIARY', 'ZAUXILIARY' ), + ('sauxiliary', 'dauxiliary', 'cauxiliary', 'zauxiliary' ), + ('sbcyclic', 'dbcyclic', 'cbcyclic', 'zbcyclic' ), + ('sbulge', 'dbulge', 'cbulge', 'zbulge' ), + ('SCODELETS', 'DCODELETS', 'CCODELETS', 'ZCODELETS' ), + ('sgetmatrix', 'dgetmatrix', 'cgetmatrix', 'zgetmatrix' ), + ('sinplace', 'dinplace', 'cinplace', 'zinplace' ), + ('slocality', 'dlocality', 'clocality', 'zlocality' ), + ('slapack', 'dlapack', 'clapack', 'zlapack' ), + ('SLAPACK', 'DLAPACK', 'CLAPACK', 'ZLAPACK' ), + ('smalloc', 'dmalloc', 'cmalloc', 'zmalloc' ), + ('smalloc', 'dmalloc', 'smalloc', 'dmalloc' ), + ('spanel_to_q', 'dpanel_to_q', 'cpanel_to_q', 'zpanel_to_q' ), + ('spermute', 'dpermute', 'cpermute', 'zpermute' ), + ('sprint', 'dprint', 'cprint', 'zprint' ), + ('sprint', 'dprint', 'sprint', 'dprint' ), + ('sprofiling', 'dprofiling', 'cprofiling', 'zprofiling' ), + ('sq_to_panel', 'dq_to_panel', 'cq_to_panel', 'zq_to_panel' ), + ('sset', 'dset', 'cset', 'zset' ), + ('ssetmatrix', 'dsetmatrix', 'csetmatrix', 'zsetmatrix' ), + ('SSIZE', 'DSIZE', 'CSIZE', 'ZSIZE' ), + ('ssplit', 'dsplit', 'csplit', 'zsplit' ), + ('stile', 'dtile', 'ctile', 'ztile' ), + ('STILE', 'DTILE', 'CTILE', 'ZTILE' ), + ('stranspose', 'dtranspose', 'ctranspose', 'ztranspose' ), + ('szero', 'dzero', 'czero', 'zzero' ), + ('sy2sb', 'sy2sb', 'he2hb', 'he2hb' ), + + # ----- Constants + ('CblasTrans', 'CblasTrans', 'CblasConjTrans', 'CblasConjTrans' ), + ('MagmaTrans', 'MagmaTrans', 'MagmaConjTrans', 'MagmaConjTrans' ), + ('MorseTrans', 'MorseTrans', 'MorseConjTrans', 'MorseConjTrans' ), + ('PlasmaTrans', 'PlasmaTrans', 'PlasmaConjTrans','PlasmaConjTrans' ), + ('symmetric', 'symmetric', 'Hermitian', 'Hermitian' ), + + # ----- BLAS and LAPACK, lowercase, alphabetic order + # copy & paste these to uppercase below and fix case. + # used for filenames lacking magma_z, etc. prefix + ('isamax', 'idamax', 'icamax', 'izamax' ), + ('isamax', 'idamax', 'isamax', 'idamax' ), + ('saxpy', 'daxpy', 'caxpy', 'zaxpy' ), + ('scopy', 'dcopy', 'ccopy', 'zcopy' ), + ('sgecfi', 'dgecfi', 'cgecfi', 'zgecfi' ), + ('sgemm', 'dgemm', 'cgemm', 'zgemm' ), + ('sgemdm', 'dgemdm', 'cgemdm', 'zgemdm' ), + ('SGEMDM', 'DGEMDM', 'CGEMDM', 'ZGEMDM' ), + ('sgemv', 'dgemv', 'cgemv', 'zgemv' ), + ('sscal', 'dscal', 'cscal', 'zscal' ), + ('sscal', 'dscal', 'csscal', 'zdscal' ), + ('sscal', 'dscal', 'sscal', 'dscal' ), # zdscal -> csscal + ('sswap', 'dswap', 'cswap', 'zswap' ), + ('ssymm', 'dsymm', 'csymm', 'zsymm' ), + ('ssymv', 'dsymv', 'csymv', 'zsymv' ), + ('ssyr2k', 'dsyr2k', 'csyr2k', 'zsyr2k' ), + ('ssyrk', 'dsyrk', 'csyrk', 'zsyrk' ), + ('strmm', 'dtrmm', 'ctrmm', 'ztrmm' ), + ('strmv', 'dtrmv', 'ctrmv', 'ztrmv' ), + ('strsm', 'dtrsm', 'ctrsm', 'ztrsm' ), + ('strsv', 'dtrsv', 'ctrsv', 'ztrsv' ), + +# ADD FOR NEW VERSION OF CHAMELEON + ('sgeadd', 'dgeadd', 'cgeadd', 'zgeadd' ), + ('shbcpy', 'dhbcpy', 'chbcpy', 'zhbcpy' ), + ('ssyrbt', 'dsyrbt', 'cherbt', 'zherbt' ), + ('ssygv', 'dsygv', 'chegv', 'zhegv' ), +# END ADD + + # LAPACK + ('sbarrier', 'dbarrier', 'cbarrier', 'zbarrier' ), + ('sbdsqr', 'dbdsqr', 'cbdsqr', 'zbdsqr' ), + ('sbdt01', 'dbdt01', 'cbdt01', 'zbdt01' ), + ('scheck', 'dcheck', 'ccheck', 'zcheck' ), + ('sgebak', 'dgebak', 'cgebak', 'zgebak' ), + ('sgebal', 'dgebal', 'cgebal', 'zgebal' ), + ('sgebd2', 'dgebd2', 'cgebd2', 'zgebd2' ), + ('sgebrd', 'dgebrd', 'cgebrd', 'zgebrd' ), + ('sgeev', 'dgeev', 'cgeev', 'zgeev' ), + ('sgehd2', 'dgehd2', 'cgehd2', 'zgehd2' ), + ('sgehrd', 'dgehrd', 'cgehrd', 'zgehrd' ), + ('sgelq2', 'dgelq2', 'cgelq2', 'zgelq2' ), + ('sgelqf', 'dgelqf', 'cgelqf', 'zgelqf' ), + ('sgelqs', 'dgelqs', 'cgelqs', 'zgelqs' ), + ('sgelqt', 'dgelqt', 'cgelqt', 'zgelqt' ), + ('sgels', 'dgels', 'cgels', 'zgels' ), + ('sgeqlf', 'dgeqlf', 'cgeqlf', 'zgeqlf' ), + ('sgeqp3', 'dgeqp3', 'cgeqp3', 'zgeqp3' ), + ('sgeqr2', 'dgeqr2', 'cgeqr2', 'zgeqr2' ), + ('sgeqrf', 'dgeqrf', 'cgeqrf', 'zgeqrf' ), + ('sgeqrs', 'dgeqrs', 'cgeqrs', 'zgeqrs' ), + ('sgeqrt', 'dgeqrt', 'cgeqrt', 'zgeqrt' ), + ('sgessm', 'dgessm', 'cgessm', 'zgessm' ), + ('sgessq', 'dgessq', 'cgessq', 'zgessq' ), + ('sgesv', 'dgesv', 'cgesv', 'zgesv' ), + ('sgesv', 'sgesv', 'cgesv', 'cgesv' ), + ('sget22', 'dget22', 'cget22', 'zget22' ), + ('sgetf2', 'dgetf2', 'cgetf2', 'zgetf2' ), + ('sgetmi', 'dgetmi', 'cgetmi', 'zgetmi' ), + ('sgetmo', 'dgetmo', 'cgetmo', 'zgetmo' ), + ('sgetrf', 'dgetrf', 'cgetrf', 'zgetrf' ), + ('sgetri', 'dgetri', 'cgetri', 'zgetri' ), + ('sgetrl', 'dgetrl', 'cgetrl', 'zgetrl' ), + ('sgetrs', 'dgetrs', 'cgetrs', 'zgetrs' ), + ('shseqr', 'dhseqr', 'chseqr', 'zhseqr' ), + ('shst01', 'dhst01', 'chst01', 'zhst01' ), + ('slabad', 'dlabad', 'slabad', 'dlabad' ), + ('slabrd', 'dlabrd', 'clabrd', 'zlabrd' ), + ('slacgv', 'dlacgv', 'clacgv', 'zlacgv' ), + ('slacpy', 'dlacpy', 'clacpy', 'zlacpy' ), + ('slaed', 'dlaed', 'slaed', 'dlaed' ), + ('slaex', 'dlaex', 'slaex', 'dlaex' ), + ('slagsy', 'dlagsy', 'clagsy', 'zlagsy' ), + ('slahr', 'dlahr', 'clahr', 'zlahr' ), + ('slamc3', 'dlamc3', 'slamc3', 'dlamc3' ), + ('slamch', 'dlamch', 'slamch', 'dlamch' ), + ('slamrg', 'dlamrg', 'slamrg', 'dlamrg' ), + ('slange', 'dlange', 'clange', 'zlange' ), + ('slanst', 'dlanst', 'clanht', 'zlanht' ), + ('slansy', 'dlansy', 'clansy', 'zlansy' ), + ('slantr', 'dlantr', 'clantr', 'zlantr' ), + ('slaqps', 'dlaqps', 'claqps', 'zlaqps' ), + ('slaqp2', 'dlaqp2', 'claqp2', 'zlaqp2' ), + ('slarfb', 'dlarfb', 'clarfb', 'zlarfb' ), + ('slarfg', 'dlarfg', 'clarfg', 'zlarfg' ), + ('slarft', 'dlarft', 'clarft', 'zlarft' ), + ('slarfx', 'dlarfx', 'clarfx', 'zlarfx' ), + ('slarfy', 'dlarfy', 'clarfy', 'zlarfy' ), + ('slarnv', 'dlarnv', 'clarnv', 'zlarnv' ), + ('slarnv', 'dlarnv', 'slarnv', 'dlarnv' ), + ('slartg', 'dlartg', 'clartg', 'zlartg' ), + ('slascl', 'dlascl', 'clascl', 'zlascl' ), + ('slaset', 'dlaset', 'claset', 'zlaset' ), + ('slaswp', 'dlaswp', 'claswp', 'zlaswp' ), + ('slatrd', 'dlatrd', 'clatrd', 'zlatrd' ), + ('slauum', 'dlauum', 'clauum', 'zlauum' ), + ('spack', 'dpack', 'cpack', 'zpack' ), + ('splgsy', 'dplgsy', 'cplgsy', 'zplgsy' ), + ('splrnt', 'dplrnt', 'cplrnt', 'zplrnt' ), + ('splssq', 'dplssq', 'cplssq', 'zplssq' ), + ('sposv', 'dposv', 'cposv', 'zposv' ), + ('ssysv', 'dsysv', 'csysv', 'zsysv' ), + ('sposv', 'sposv', 'cposv', 'cposv' ), + ('spotrf', 'dpotrf', 'cpotrf', 'zpotrf' ), + ('ssytrf', 'dsytrf', 'csytrf', 'zsytrf' ), + ('spotri', 'dpotri', 'cpotri', 'zpotri' ), + ('spotrs', 'dpotrs', 'cpotrs', 'zpotrs' ), + ('ssytrs', 'dsytrs', 'csytrs', 'zsytrs' ), + ('sqpt01', 'dqpt01', 'cqpt01', 'zqpt01' ), + ('sqrt02', 'dqrt02', 'cqrt02', 'zqrt02' ), + ('sshift', 'dshift', 'cshift', 'zshift' ), + ('sssssm', 'dssssm', 'cssssm', 'zssssm' ), + ('sstebz', 'dstebz', 'sstebz', 'dstebz' ), + ('sstedc', 'dstedc', 'cstedc', 'zstedc' ), + ('sstedx', 'dstedx', 'cstedx', 'zstedx' ), + ('sstedx', 'dstedx', 'sstedx', 'dstedx' ), + ('sstein', 'dstein', 'cstein', 'zstein' ), + ('sstemr', 'dstemr', 'cstemr', 'zstemr' ), + ('ssteqr', 'dsteqr', 'csteqr', 'zsteqr' ), + ('ssterf', 'dsterf', 'ssterf', 'dsterf' ), + ('ssterm', 'dsterm', 'csterm', 'zsterm' ), + ('sstt21', 'dstt21', 'cstt21', 'zstt21' ), + ('strasm', 'dtrasm', 'ctrasm', 'ztrasm' ), + ('strevc', 'dtrevc', 'ctrevc', 'ztrevc' ), + ('strsmpl', 'dtrsmpl', 'ctrsmpl', 'ztrsmpl' ), + ('strssq', 'dtrssq', 'ctrssq', 'ztrssq' ), + ('strtri', 'dtrtri', 'ctrtri', 'ztrtri' ), + ('stslqt', 'dtslqt', 'ctslqt', 'ztslqt' ), + ('stsmlq_sy', 'dtsmlq_sy', 'ctsmlq_he', 'ztsmlq_he' ), + ('stsmqr_sy', 'dtsmqr_sy', 'ctsmqr_he', 'ztsmqr_he' ), + ('stsmqr', 'dtsmqr', 'ctsmqr', 'ztsmqr' ), + ('stsmlq', 'dtsmlq', 'ctsmlq', 'ztsmlq' ), + ('stsqrt', 'dtsqrt', 'ctsqrt', 'ztsqrt' ), + ('stslqt', 'dtslqt', 'ctslqt', 'ztslqt' ), + ('ststrf', 'dtstrf', 'ctstrf', 'ztstrf' ), + ('sttlqt', 'dttlqt', 'cttlqt', 'zttlqt' ), + ('sttmlq', 'dttmlq', 'cttmlq', 'zttmlq' ), + ('sttmqr', 'dttmqr', 'cttmqr', 'zttmqr' ), + ('sttqrt', 'dttqrt', 'cttqrt', 'zttqrt' ), + ('sungesv', 'sungesv', 'cungesv', 'cungesv' ), + ('sstegr', 'dstegr', 'cstegr', 'zstegr' ), + ('ssyssq', 'dsyssq', 'csyssq', 'zsyssq' ), + + # ----- BLAS and LAPACK, where complex base name != real base name + # BLAS, with precision + ('sasum', 'dasum', 'scasum', 'dzasum' ), + ('sasum', 'dasum', 'casum', 'zasum' ), + ('sdot', 'ddot', 'cdotc', 'zdotc' ), + ('sdot_sub', 'ddot_sub', 'cdotc_sub', 'zdotc_sub' ), + ('sdot_sub', 'ddot_sub', 'cdotu_sub', 'zdotu_sub' ), + ('sger', 'dger', 'cgerc', 'zgerc' ), + ('sger', 'dger', 'cgeru', 'zgeru' ), + ('snrm2', 'dnrm2', 'scnrm2', 'dznrm2' ), + ('ssymm', 'dsymm', 'chemm', 'zhemm' ), + ('ssymv', 'dsymv', 'chemv', 'zhemv' ), + ('ssyr2', 'dsyr2', 'cher2', 'zher2' ), + ('ssyr2k', 'dsyr2k', 'cher2k', 'zher2k' ), + ('ssyrk', 'dsyrk', 'cherk', 'zherk' ), + ('ssyr', 'dsyr', 'cher', 'zher' ), + + # LAPACK, with precision + ('slag2d', 'dlag2s', 'clag2z', 'zlag2c' ), + ('slagsy', 'dlagsy', 'claghe', 'zlaghe' ), + ('slasyf', 'dlasyf', 'clahef', 'zlahef' ), + ('slansy', 'dlansy', 'clanhe', 'zlanhe' ), + ('slavsy', 'dlavsy', 'clavhe', 'zlavhe' ), + ('sorg2r', 'dorg2r', 'cung2r', 'zung2r' ), + ('sorgbr', 'dorgbr', 'cungbr', 'zungbr' ), + ('sorghr', 'dorghr', 'cunghr', 'zunghr' ), + ('sorglq', 'dorglq', 'cunglq', 'zunglq' ), + ('sorgql', 'dorgql', 'cungql', 'zungql' ), + ('sorgqr', 'dorgqr', 'cungqr', 'zungqr' ), + ('sorgtr', 'dorgtr', 'cungtr', 'zungtr' ), + ('sorm2r', 'dorm2r', 'cunm2r', 'zunm2r' ), + ('sormbr', 'dormbr', 'cunmbr', 'zunmbr' ), + ('sormlq', 'dormlq', 'cunmlq', 'zunmlq' ), + ('sormql', 'dormql', 'cunmql', 'zunmql' ), + ('sormqr', 'dormqr', 'cunmqr', 'zunmqr' ), + ('sormr2', 'dormr2', 'cunmr2', 'zunmr2' ), + ('sormtr', 'dormtr', 'cunmtr', 'zunmtr' ), + ('sort01', 'dort01', 'cunt01', 'zunt01' ), + ('splgsy', 'dplgsy', 'cplghe', 'zplghe' ), + ('ssbtrd', 'dsbtrd', 'chbtrd', 'zhbtrd' ), + ('ssybbd', 'dsybbd', 'chebbd', 'zhebbd' ), + ('ssyev', 'dsyev', 'cheev', 'zheev' ), + ('ssyevd', 'dsyevd', 'cheevd', 'zheevd' ), + ('ssygs2', 'dsygs2', 'chegs2', 'zhegs2' ), + ('ssygst', 'dsygst', 'chegst', 'zhegst' ), + ('ssygvd', 'dsygvd', 'chegvd', 'zhegvd' ), + ('ssygvr', 'dsygvr', 'chegvr', 'zhegvr' ), + ('ssygvx', 'dsygvx', 'chegvx', 'zhegvx' ), + ('ssyssq', 'dsyssq', 'chessq', 'zhessq' ), + ('ssyt21', 'dsyt21', 'chet21', 'zhet21' ), + ('ssytd2', 'dsytd2', 'chetd2', 'zhetd2' ), + ('ssytrd', 'dsytrd', 'chetrd', 'zhetrd' ), + ('ssytrf', 'dsytrf', 'chetrf', 'zhetrf' ), + + # BLAS, without precision + # must be after BLAS with precision + # Ex: cublasZhemm -> cublasShemm -> cublasSsymm + ('dot', 'dot', 'dotc', 'dotc' ), + ('dot_sub', 'dot_sub', 'dotc_sub', 'dotc_sub' ), + ('dot_sub', 'dot_sub', 'dotu_sub', 'dotu_sub' ), + ('ger', 'ger', 'gerc', 'gerc' ), + ('ger', 'ger', 'geru', 'geru' ), + ('nrm2', 'nrm2', 'cnrm2', 'znrm2' ), # dznrm2 -> dnrm2 + ('symm', 'symm', 'hemm', 'hemm' ), + ('symv', 'symv', 'hemv', 'hemv' ), + ('syr2', 'syr2', 'her2', 'her2' ), + ('syr2k', 'syr2k', 'her2k', 'her2k' ), + ('syrk', 'syrk', 'herk', 'herk' ), + + # LAPACK, without precision + ('lag2d', 'lag2s', 'lag2z', 'lag2c' ), + ('lagsy', 'lagsy', 'laghe', 'laghe' ), + ('lasyf', 'lasyf', 'lahef', 'lahef' ), + ('lansy', 'lansy', 'lanhe', 'lanhe' ), + ('lanst', 'lanst', 'lanht', 'lanht' ), + ('lavsy', 'lavsy', 'lavhe', 'lavhe' ), + ('org2r', 'org2r', 'ung2r', 'ung2r' ), + ('orgbr', 'orgbr', 'ungbr', 'ungbr' ), + ('orghr', 'orghr', 'unghr', 'unghr' ), + ('orglq', 'orglq', 'unglq', 'unglq' ), + ('orgql', 'orgql', 'ungql', 'ungql' ), + ('orgqr', 'orgqr', 'ungqr', 'ungqr' ), + ('orgtr', 'orgtr', 'ungtr', 'ungtr' ), + ('orm2r', 'orm2r', 'unm2r', 'unm2r' ), + ('ormbr', 'ormbr', 'unmbr', 'unmbr' ), + ('ormlq', 'ormlq', 'unmlq', 'unmlq' ), + ('ormql', 'ormql', 'unmql', 'unmql' ), + ('ormqr', 'ormqr', 'unmqr', 'unmqr' ), + ('ormr2', 'ormr2', 'unmr2', 'unmr2' ), + ('ormtr', 'ormtr', 'unmtr', 'unmtr' ), + ('ort01', 'ort01', 'unt01', 'unt01' ), + ('plgsy', 'plgsy', 'plghe', 'plghe' ), + ('sbtrd', 'sbtrd', 'hbtrd', 'hbtrd' ), + ('sybbd', 'sybbd', 'hebbd', 'hebbd' ), + ('syev', 'syev', 'heev', 'heev' ), + ('syevd', 'syevd', 'heevd', 'heevd' ), + ('sygs2', 'sygs2', 'hegs2', 'hegs2' ), + ('sygst', 'sygst', 'hegst', 'hegst' ), + ('sygvd', 'sygvd', 'hegvd', 'hegvd' ), + ('sygvr', 'sygvr', 'hegvr', 'hegvr' ), + ('sygvx', 'sygvx', 'hegvx', 'hegvx' ), + ('syssq', 'syssq', 'hessq', 'hessq' ), + ('syt21', 'syt21', 'het21', 'het21' ), + ('sytd2', 'sytd2', 'hetd2', 'hetd2' ), + ('sytrd', 'sytrd', 'hetrd', 'hetrd' ), + ('sytrf', 'sytrf', 'hetrf', 'hetrf' ), + + # ----- For norms: compute result in Real or Double + ('sgeadd', 'dgeadd', 'sgeadd', 'dgeadd' ), + ('slange', 'dlange', 'slange', 'dlange' ), + ('slaset', 'dlaset', 'slaset', 'dlaset' ), + ('splssq', 'dplssq', 'splssq', 'dplssq' ), + ('slacpy', 'dlacpy', 'slacpy', 'dlacpy' ), + ('saxpy', 'daxpy', 'saxpy', 'daxpy' ), + ('MorseRealFloat', 'MorseRealDouble', 'MorseRealFloat', 'MorseRealDouble'), + + # QUARK codelets protection (to prevent conversion with LAPACK WITH PRECISION) + ('DAG_CORE_U-NG2R', 'DAG_CORE_U-NG2R', 'DAG_CORE_UNG2R', 'DAG_CORE_UNG2R' ), + ('DAG_CORE_U-NGBR', 'DAG_CORE_U-NGBR', 'DAG_CORE_UNGBR', 'DAG_CORE_UNGBR' ), + ('DAG_CORE_U-NGHR', 'DAG_CORE_U-NGHR', 'DAG_CORE_UNGHR', 'DAG_CORE_UNGHR' ), + ('DAG_CORE_U-NGLQ', 'DAG_CORE_U-NGLQ', 'DAG_CORE_UNGLQ', 'DAG_CORE_UNGLQ' ), + ('DAG_CORE_U-NGQL', 'DAG_CORE_U-NGQL', 'DAG_CORE_UNGQL', 'DAG_CORE_UNGQL' ), + ('DAG_CORE_U-NGQR', 'DAG_CORE_U-NGQR', 'DAG_CORE_UNGQR', 'DAG_CORE_UNGQR' ), + ('DAG_CORE_U-NGTR', 'DAG_CORE_U-NGTR', 'DAG_CORE_UNGTR', 'DAG_CORE_UNGTR' ), + ('DAG_CORE_U-NM2R', 'DAG_CORE_U-NM2R', 'DAG_CORE_UNM2R', 'DAG_CORE_UNM2R' ), + ('DAG_CORE_U-NMBR', 'DAG_CORE_U-NMBR', 'DAG_CORE_UNMBR', 'DAG_CORE_UNMBR' ), + ('DAG_CORE_U-NMLQ', 'DAG_CORE_U-NMLQ', 'DAG_CORE_UNMLQ', 'DAG_CORE_UNMLQ' ), + ('DAG_CORE_U-NMQL', 'DAG_CORE_U-NMQL', 'DAG_CORE_UNMQL', 'DAG_CORE_UNMQL' ), + ('DAG_CORE_U-NMQR', 'DAG_CORE_U-NMQR', 'DAG_CORE_UNMQR', 'DAG_CORE_UNMQR' ), + + # ----- BLAS AND LAPACK, UPPERCASE, ALPHABETIC ORDER + # COPY & PASTE THESE TO UPPERCASE BELOW AND FIX CASE. + # USED FOR FILENAMES LACKING MAGMA_Z, ETC. PREFIX + ('ISAMAX', 'IDAMAX', 'ICAMAX', 'IZAMAX' ), + ('ISAMAX', 'IDAMAX', 'ISAMAX', 'IDAMAX' ), + ('SAXPY', 'DAXPY', 'CAXPY', 'ZAXPY' ), + ('SCOPY', 'DCOPY', 'CCOPY', 'ZCOPY' ), + ('SGEMV', 'DGEMV', 'CGEMV', 'ZGEMV' ), + ('SSCAL', 'DSCAL', 'CSCAL', 'ZSCAL' ), + ('SSCAL', 'DSCAL', 'CSSCAL', 'ZDSCAL' ), + ('SSCAL', 'DSCAL', 'SSCAL', 'DSCAL' ), # ZDSCAL -> CSSCAL + ('SSWAP', 'DSWAP', 'CSWAP', 'ZSWAP' ), + ('SSYMM', 'DSYMM', 'CSYMM', 'ZSYMM' ), + ('SSYMV', 'DSYMV', 'CSYMV', 'ZSYMV' ), + ('SSYR2K', 'DSYR2K', 'CSYR2K', 'ZSYR2K' ), + ('SSYRK', 'DSYRK', 'CSYRK', 'ZSYRK' ), + ('STRMM', 'DTRMM', 'CTRMM', 'ZTRMM' ), + ('STRMV', 'DTRMV', 'CTRMV', 'ZTRMV' ), + ('STRSM', 'DTRSM', 'CTRSM', 'ZTRSM' ), + ('STRSV', 'DTRSV', 'CTRSV', 'ZTRSV' ), + + # LAPACK + ('SBDSQR', 'DBDSQR', 'CBDSQR', 'ZBDSQR' ), + ('SBDT01', 'DBDT01', 'CBDT01', 'ZBDT01' ), + ('SCHECK', 'DCHECK', 'CCHECK', 'ZCHECK' ), + ('SGEBAK', 'DGEBAK', 'CGEBAK', 'ZGEBAK' ), + ('SGEBAL', 'DGEBAL', 'CGEBAL', 'ZGEBAL' ), + ('SGEBD2', 'DGEBD2', 'CGEBD2', 'ZGEBD2' ), + ('SGEBRD', 'DGEBRD', 'CGEBRD', 'ZGEBRD' ), + ('SGEEV', 'DGEEV', 'CGEEV', 'ZGEEV' ), + ('SGEHD2', 'DGEHD2', 'CGEHD2', 'ZGEHD2' ), + ('SGEHRD', 'DGEHRD', 'CGEHRD', 'ZGEHRD' ), + ('SGELQ2', 'DGELQ2', 'CGELQ2', 'ZGELQ2' ), + ('SGELQF', 'DGELQF', 'CGELQF', 'ZGELQF' ), + ('SGELQS', 'DGELQS', 'CGELQS', 'ZGELQS' ), + ('SGELS', 'DGELS', 'CGELS', 'ZGELS' ), + ('SGEMM', 'DGEMM', 'CGEMM', 'ZGEMM' ), + ('SGEQLF', 'DGEQLF', 'CGEQLF', 'ZGEQLF' ), + ('SGEQP3', 'DGEQP3', 'CGEQP3', 'ZGEQP3' ), + ('SGEQR2', 'DGEQR2', 'CGEQR2', 'ZGEQR2' ), + ('SGEQRF', 'DGEQRF', 'CGEQRF', 'ZGEQRF' ), + ('SGEQRS', 'DGEQRS', 'CGEQRS', 'ZGEQRS' ), + ('SGESSM', 'DGESSM', 'CGESSM', 'ZGESSM' ), + ('SGESV', 'DGESV', 'CGESV', 'ZGESV' ), + ('SGESV', 'SGESV', 'CGESV', 'CGESV' ), + ('SGET22', 'DGET22', 'CGET22', 'ZGET22' ), + ('SGETF2', 'DGETF2', 'CGETF2', 'ZGETF2' ), + ('SGETRF', 'DGETRF', 'CGETRF', 'ZGETRF' ), + ('SGETRI', 'DGETRI', 'CGETRI', 'ZGETRI' ), + ('SGETRL', 'DGETRL', 'CGETRL', 'ZGETRL' ), + ('SGETRS', 'DGETRS', 'CGETRS', 'ZGETRS' ), + ('SHSEQR', 'DHSEQR', 'CHSEQR', 'ZHSEQR' ), + ('SHST01', 'DHST01', 'CHST01', 'ZHST01' ), + ('SLABAD', 'DLABAD', 'SLABAD', 'DLABAD' ), + ('SLABRD', 'DLABRD', 'CLABRD', 'ZLABRD' ), + ('SLACGV', 'DLACGV', 'CLACGV', 'ZLACGV' ), + ('SLACPY', 'DLACPY', 'CLACPY', 'ZLACPY' ), + ('SLAED', 'DLAED', 'SLAED', 'DLAED' ), + ('SLAEX', 'DLAEX', 'SLAEX', 'DLAEX' ), + ('SLAGSY', 'DLAGSY', 'CLAGSY', 'ZLAGSY' ), + ('SLAHR', 'DLAHR', 'CLAHR', 'ZLAHR' ), + ('SLAMC3', 'DLAMC3', 'SLAMC3', 'DLAMC3' ), + ('SLAMCH', 'DLAMCH', 'SLAMCH', 'DLAMCH' ), + ('SLAMRG', 'DLAMRG', 'SLAMRG', 'DLAMRG' ), + ('SLANGE', 'DLANGE', 'CLANGE', 'ZLANGE' ), + ('SLANST', 'DLANST', 'CLANHT', 'ZLANHT' ), + ('SLANSY', 'DLANSY', 'CLANSY', 'ZLANSY' ), + ('SLANTR', 'DLANTR', 'CLANTR', 'ZLANTR' ), + ('SLAQPS', 'DLAQPS', 'CLAQPS', 'ZLAQPS' ), + ('SLAQP2', 'DLAQP2', 'CLAQP2', 'ZLAQP2' ), + ('SLARFB', 'DLARFB', 'CLARFB', 'ZLARFB' ), + ('SLARFG', 'DLARFG', 'CLARFG', 'ZLARFG' ), + ('SLARFT', 'DLARFT', 'CLARFT', 'ZLARFT' ), + ('SLARFX', 'DLARFX', 'CLARFX', 'ZLARFX' ), + ('SLARFY', 'DLARFY', 'CLARFY', 'ZLARFY' ), + ('SLARNV', 'DLARNV', 'CLARNV', 'ZLARNV' ), + ('SLARNV', 'DLARNV', 'SLARNV', 'DLARNV' ), + ('SLARTG', 'DLARTG', 'CLARTG', 'ZLARTG' ), + ('SLASCL', 'DLASCL', 'CLASCL', 'ZLASCL' ), + ('SLASET', 'DLASET', 'CLASET', 'ZLASET' ), + ('SLASWP', 'DLASWP', 'CLASWP', 'ZLASWP' ), + ('SLATRD', 'DLATRD', 'CLATRD', 'ZLATRD' ), + ('SLAUUM', 'DLAUUM', 'CLAUUM', 'ZLAUUM' ), + ('SPOSV', 'DPOSV', 'CPOSV', 'ZPOSV' ), + ('SSYSV', 'DSYSV', 'CSYSV', 'ZSYSV' ), + ('SPOSV', 'SPOSV', 'CPOSV', 'CPOSV' ), + ('SPOTRF', 'DPOTRF', 'CPOTRF', 'ZPOTRF' ), + ('SSYTRF', 'DSYTRF', 'CSYTRF', 'ZSYTRF' ), + ('SPOTRI', 'DPOTRI', 'CPOTRI', 'ZPOTRI' ), + ('SPOTRS', 'DPOTRS', 'CPOTRS', 'ZPOTRS' ), + ('SSYTRS', 'DSYTRS', 'CSYTRS', 'ZSYTRS' ), + ('SQPT01', 'DQPT01', 'CQPT01', 'ZQPT01' ), + ('SQRT02', 'DQRT02', 'CQRT02', 'ZQRT02' ), + ('SSSSSM', 'DSSSSM', 'CSSSSM', 'ZSSSSM' ), + ('SSTEBZ', 'DSTEBZ', 'SSTEBZ', 'DSTEBZ' ), + ('SSTEDC', 'DSTEDC', 'CSTEDC', 'ZSTEDC' ), + ('SSTEDX', 'DSTEDX', 'CSTEDX', 'ZSTEDX' ), + ('SSTEDX', 'DSTEDX', 'SSTEDX', 'DSTEDX' ), + ('SSTEIN', 'DSTEIN', 'CSTEIN', 'ZSTEIN' ), + ('SSTEMR', 'DSTEMR', 'CSTEMR', 'ZSTEMR' ), + ('SSTEQR', 'DSTEQR', 'CSTEQR', 'ZSTEQR' ), + ('SSTERF', 'DSTERF', 'SSTERF', 'DSTERF' ), + ('SSTERM', 'DSTERM', 'CSTERM', 'ZSTERM' ), + ('SSTT21', 'DSTT21', 'CSTT21', 'ZSTT21' ), + ('STREVC', 'DTREVC', 'CTREVC', 'ZTREVC' ), + ('STRSMPL', 'DTRSMPL', 'CTRSMPL', 'ZTRSMPL' ), + ('STRTRI', 'DTRTRI', 'CTRTRI', 'ZTRTRI' ), + ('STSQRT', 'DTSQRT', 'CTSQRT', 'ZTSQRT' ), + ('STSTRF', 'DTSTRF', 'CTSTRF', 'ZTSTRF' ), + ('SUNGESV', 'SUNGESV', 'CUNGESV', 'CUNGESV' ), + ('SSTEGR', 'DSTEGR', 'CSTEGR', 'ZSTEGR' ), + + # ----- BLAS AND LAPACK, WHERE COMPLEX BASE NAME != REAL BASE NAME + # BLAS, WITH PRECISION + ('SDOT', 'DDOT', 'CDOTC', 'ZDOTC' ), + ('SDOT_SUB', 'DDOT_SUB', 'CDOTC_SUB', 'ZDOTC_SUB' ), + ('SDOT_SUB', 'DDOT_SUB', 'CDOTU_SUB', 'ZDOTU_SUB' ), + ('SGER', 'DGER', 'CGERC', 'ZGERC' ), + ('SGER', 'DGER', 'CGERU', 'ZGERU' ), + ('SNRM2', 'DNRM2', 'SCNRM2', 'DZNRM2' ), + ('SSYMM', 'DSYMM', 'CHEMM', 'ZHEMM' ), + ('SSYMV', 'DSYMV', 'CHEMV', 'ZHEMV' ), + ('SSYR2', 'DSYR2', 'CHER2', 'ZHER2' ), + ('SSYR2K', 'DSYR2K', 'CHER2K', 'ZHER2K' ), + ('SSYRK', 'DSYRK', 'CHERK', 'ZHERK' ), + ('SSYR', 'DSYR', 'CHER', 'ZHER' ), + + # LAPACK, WITH PRECISION + ('SLAG2D', 'DLAG2S', 'CLAG2Z', 'ZLAG2C' ), + ('SLAGSY', 'DLAGSY', 'CLAGHE', 'ZLAGHE' ), + ('SLASYF', 'DLASYF', 'CLAHEF', 'ZLAHEF' ), + ('SLANSY', 'DLANSY', 'CLANHE', 'ZLANHE' ), + ('SLAVSY', 'DLAVSY', 'CLAVHE', 'ZLAVHE' ), + ('SORG2R', 'DORG2R', 'CUNG2R', 'ZUNG2R' ), + ('SORGBR', 'DORGBR', 'CUNGBR', 'ZUNGBR' ), + ('SORGHR', 'DORGHR', 'CUNGHR', 'ZUNGHR' ), + ('SORGLQ', 'DORGLQ', 'CUNGLQ', 'ZUNGLQ' ), + ('SORGQL', 'DORGQL', 'CUNGQL', 'ZUNGQL' ), + ('SORGQR', 'DORGQR', 'CUNGQR', 'ZUNGQR' ), + ('SORGTR', 'DORGTR', 'CUNGTR', 'ZUNGTR' ), + ('SORM2R', 'DORM2R', 'CUNM2R', 'ZUNM2R' ), + ('SORMBR', 'DORMBR', 'CUNMBR', 'ZUNMBR' ), + ('SORMLQ', 'DORMLQ', 'CUNMLQ', 'ZUNMLQ' ), + ('SORMQL', 'DORMQL', 'CUNMQL', 'ZUNMQL' ), + ('SORMQR', 'DORMQR', 'CUNMQR', 'ZUNMQR' ), + ('SORMR2', 'DORMR2', 'CUNMR2', 'ZUNMR2' ), + ('SORMTR', 'DORMTR', 'CUNMTR', 'ZUNMTR' ), + ('SORT01', 'DORT01', 'CUNT01', 'ZUNT01' ), + ('SPLGSY', 'DPLGSY', 'CPLGHE', 'ZPLGHE' ), + ('SSBTRD', 'DSBTRD', 'CHBTRD', 'ZHBTRD' ), + ('SSYBBD', 'DSYBBD', 'CHEBBD', 'ZHEBBD' ), + ('SSYEV', 'DSYEV', 'CHEEV', 'ZHEEV' ), + ('SSYEVD', 'DSYEVD', 'CHEEVD', 'ZHEEVD' ), + ('SSYGS2', 'DSYGS2', 'CHEGS2', 'ZHEGS2' ), + ('SSYGST', 'DSYGST', 'CHEGST', 'ZHEGST' ), + ('SSYGVD', 'DSYGVD', 'CHEGVD', 'ZHEGVD' ), + ('SSYGVR', 'DSYGVR', 'CHEGVR', 'ZHEGVR' ), + ('SSYGVX', 'DSYGVX', 'CHEGVX', 'ZHEGVX' ), + ('SSYT21', 'DSYT21', 'CHET21', 'ZHET21' ), + ('SSYTD2', 'DSYTD2', 'CHETD2', 'ZHETD2' ), + ('SSYTRD', 'DSYTRD', 'CHETRD', 'ZHETRD' ), + ('SSYTRF', 'DSYTRF', 'CHETRF', 'ZHETRF' ), + + # BLAS, WITHOUT PRECISION + # MUST BE AFTER BLAS WITH PRECISION + # EX: CUBLASZHEMM -> CUBLASSHEMM -> CUBLASSSYMM + ('DOT', 'DOT', 'DOTC', 'DOTC' ), + ('DOT_SUB', 'DOT_SUB', 'DOTC_SUB', 'DOTC_SUB' ), + ('DOT_SUB', 'DOT_SUB', 'DOTU_SUB', 'DOTU_SUB' ), + ('GER', 'GER', 'GERC', 'GERC' ), + ('GER', 'GER', 'GERU', 'GERU' ), + ('NRM2', 'NRM2', 'CNRM2', 'ZNRM2' ), # DZNRM2 -> DNRM2 + ('SYMM', 'SYMM', 'HEMM', 'HEMM' ), + ('SYMV', 'SYMV', 'HEMV', 'HEMV' ), + ('SYR2', 'SYR2', 'HER2', 'HER2' ), + ('SYR2K', 'SYR2K', 'HER2K', 'HER2K' ), + ('SYRK', 'SYRK', 'HERK', 'HERK' ), + + # LAPACK, WITHOUT PRECISION + ('LAG2D', 'LAG2S', 'LAG2Z', 'LAG2C' ), + ('LAGSY', 'LAGSY', 'LAGHE', 'LAGHE' ), + ('LASYF', 'LASYF', 'LAHEF', 'LAHEF' ), + ('LANSY', 'LANSY', 'LANHE', 'LANHE' ), + ('LAVSY', 'LAVSY', 'LAVHE', 'LAVHE' ), + ('ORG2R', 'ORG2R', 'UNG2R', 'UNG2R' ), + ('ORGBR', 'ORGBR', 'UNGBR', 'UNGBR' ), + ('ORGHR', 'ORGHR', 'UNGHR', 'UNGHR' ), + ('ORGLQ', 'ORGLQ', 'UNGLQ', 'UNGLQ' ), + ('ORGQL', 'ORGQL', 'UNGQL', 'UNGQL' ), + ('ORGQR', 'ORGQR', 'UNGQR', 'UNGQR' ), + ('ORGTR', 'ORGTR', 'UNGTR', 'UNGTR' ), + ('ORM2R', 'ORM2R', 'UNM2R', 'UNM2R' ), + ('ORMBR', 'ORMBR', 'UNMBR', 'UNMBR' ), + ('ORMLQ', 'ORMLQ', 'UNMLQ', 'UNMLQ' ), + ('ORMQL', 'ORMQL', 'UNMQL', 'UNMQL' ), + ('ORMQR', 'ORMQR', 'UNMQR', 'UNMQR' ), + ('ORMR2', 'ORMR2', 'UNMR2', 'UNMR2' ), + ('ORMTR', 'ORMTR', 'UNMTR', 'UNMTR' ), + ('ORT01', 'ORT01', 'UNT01', 'UNT01' ), + ('PLGSY', 'PLGSY', 'PLGHE', 'PLGHE' ), + ('SBTRD', 'SBTRD', 'HBTRD', 'HBTRD' ), + ('SYBBD', 'SYBBD', 'HEBBD', 'HEBBD' ), + ('SYEV', 'SYEV', 'HEEV', 'HEEV' ), + ('SYEVD', 'SYEVD', 'HEEVD', 'HEEVD' ), + ('SYGS2', 'SYGS2', 'HEGS2', 'HEGS2' ), + ('SYGST', 'SYGST', 'HEGST', 'HEGST' ), + ('SYGVD', 'SYGVD', 'HEGVD', 'HEGVD' ), + ('SYGVR', 'SYGVR', 'HEGVR', 'HEGVR' ), + ('SYGVX', 'SYGVX', 'HEGVX', 'HEGVX' ), + ('SYT21', 'SYT21', 'HET21', 'HET21' ), + ('SYTD2', 'SYTD2', 'HETD2', 'HETD2' ), + ('SYTRD', 'SYTRD', 'HETRD', 'HETRD' ), + ('SYTRF', 'SYTRF', 'HETRF', 'HETRF' ), + + # QUARK codelets protection (to prevent conversion with LAPACK WITH PRECISION) + ('DAG_CORE_UNG2R', 'DAG_CORE_UNG2R', 'DAG_CORE_UNG2R', 'DAG_CORE_U-NG2R' ), + ('DAG_CORE_UNGBR', 'DAG_CORE_UNGBR', 'DAG_CORE_UNGBR', 'DAG_CORE_U-NGBR' ), + ('DAG_CORE_UNGHR', 'DAG_CORE_UNGHR', 'DAG_CORE_UNGHR', 'DAG_CORE_U-NGHR' ), + ('DAG_CORE_UNGLQ', 'DAG_CORE_UNGLQ', 'DAG_CORE_UNGLQ', 'DAG_CORE_U-NGLQ' ), + ('DAG_CORE_UNGQL', 'DAG_CORE_UNGQL', 'DAG_CORE_UNGQL', 'DAG_CORE_U-NGQL' ), + ('DAG_CORE_UNGQR', 'DAG_CORE_UNGQR', 'DAG_CORE_UNGQR', 'DAG_CORE_U-NGQR' ), + ('DAG_CORE_UNGTR', 'DAG_CORE_UNGTR', 'DAG_CORE_UNGTR', 'DAG_CORE_U-NGTR' ), + ('DAG_CORE_UNM2R', 'DAG_CORE_UNM2R', 'DAG_CORE_UNM2R', 'DAG_CORE_U-NM2R' ), + ('DAG_CORE_UNMBR', 'DAG_CORE_UNMBR', 'DAG_CORE_UNMBR', 'DAG_CORE_U-NMBR' ), + ('DAG_CORE_UNMLQ', 'DAG_CORE_UNMLQ', 'DAG_CORE_UNMLQ', 'DAG_CORE_U-NMLQ' ), + ('DAG_CORE_UNMQL', 'DAG_CORE_UNMQL', 'DAG_CORE_UNMQL', 'DAG_CORE_U-NMQL' ), + ('DAG_CORE_UNMQR', 'DAG_CORE_UNMQR', 'DAG_CORE_UNMQR', 'DAG_CORE_U-NMQR' ), + + # PaStiX + ('sutils.h', 'dutils.h', 'cutils.h', 'zutils.h' ), + ('SMURGE_', 'DMURGE_', 'CMURGE_', 'ZMURGE_' ), + ('smurge_', 'dmurge_', 'cmurge_', 'zmurge_' ), + ('smurge.h', 'dmurge.h', 'cmurge.h', 'zmurge.h' ), + ('smurge.inc', 'dmurge.inc', 'cmurge.inc', 'zmurge.inc' ), + ('smurge.c', 'dmurge.c', 'cmurge.c', 'zmurge.c' ), + ('ssimple', 'dsimple', 'csimple', 'zsimple' ), + ('sstep-by-step', 'dstep-by-step', 'cstep-by-step', 'zstep-by-step' ), + ('starpu_s', 'starpu_d', 'starpu_c', 'starpu_z' ), + ('STARPU_S', 'STARPU_D', 'STARPU_C', 'STARPU_Z' ), + ('pastix_s', 'pastix_d', 'pastix_c', 'pastix_z' ), + ('s_', 'd_', 'c_', 'z_' ), + ('S_', 'D_', 'C_', 'Z_' ), + ('FLT_EPSILON', 'DBL_EPSILON', 'FLT_EPSILON', 'DBL_EPSILON' ), + ('s_RAFF_FLOAT', 'd_RAFF_FLOAT', 'c_RAFF_FLOAT', 'z_RAFF_FLOAT' ), + ('MPI_FLOAT', 'MPI_DOUBLE', 'MPI_COMPLEX', 'MPI_DOUBLE_COMPLEX'), + ('MPI_FLOAT', 'MPI_DOUBLE', 'MPI_FLOAT', 'MPI_DOUBLE' ), + # ----- unused? + ('s_check', 'd_check', 'c_check', 'z_check' ), + ('s_get_idparm', 'd_get_idparm', 's_get_idparm', 'd_get_idparm', ), + #('stesting', 'dtesting', 'ctesting', 'ztesting' ), + #('SAUXILIARY', 'DAUXILIARY', 'CAUXILIARY', 'ZAUXILIARY' ), + ], + + # ------------------------------------------------------------ + # replacements applied for profiling with tau + 'tracing' :[ + # ----- Special line indicating column types + ['plain', 'tau'], + + # ----- Replacements + ('(\w+\*?)\s+(\w+)\s*\(([a-z* ,A-Z_0-9]*)\)\s*{\s+(.*)\s*#pragma tracing_start\s+(.*)\s+#pragma tracing_end\s+(.*)\s+}', + r'\1 \2(\3){\n\4tau("\2");\5tau();\6}'), + ('\.c','.c.tau'), + ], +}; -- GitLab