From 7c5846a5ef7aa2f957c5740904ced51deb2f268a Mon Sep 17 00:00:00 2001
From: Mathieu Faverge <mathieu.faverge@inria.fr>
Date: Mon, 6 Jul 2020 16:44:14 +0200
Subject: [PATCH] Redispatch cmake features discovery into dedicated runtime
 directories

---
 CMakeLists.txt                | 319 ----------------------------------
 cmake_modules/PrintOpts.cmake |   1 +
 include/chameleon/simulate.h  |  13 +-
 runtime/openmp/CMakeLists.txt |  14 ++
 runtime/parsec/CMakeLists.txt |  76 ++++++++
 runtime/quark/CMakeLists.txt  |  51 ++++++
 runtime/starpu/CMakeLists.txt | 167 ++++++++++++++++++
 7 files changed, 320 insertions(+), 321 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 179faa457..3b60a6d5d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -577,325 +577,6 @@ else (NOT CHAMELEON_SIMULATION)
 
 endif(NOT CHAMELEON_SIMULATION)
 
-
-# CHAMELEON depends on a runtime
-# -------------------------------
-if( CHAMELEON_SCHED_STARPU )
-
-    set(CHAMELEON_STARPU_VERSION "1.3" CACHE STRING "oldest STARPU version desired")
-
-    # create list of components in order to make a single call to find_package(starpu...)
-    if(NOT CHAMELEON_SIMULATION)
-        set(STARPU_COMPONENT_LIST "HWLOC")
-        if(CHAMELEON_USE_CUDA)
-            list(APPEND STARPU_COMPONENT_LIST "CUDA")
-        endif()
-    else()
-        set(STARPU_COMPONENT_LIST "SIMGRID")
-    endif()
-    if(CHAMELEON_USE_MPI)
-        list(APPEND STARPU_COMPONENT_LIST "MPI")
-    endif()
-
-    find_package(STARPU ${CHAMELEON_STARPU_VERSION} REQUIRED
-                 COMPONENTS ${STARPU_COMPONENT_LIST})
-
-    # Add definition and include_dir if found
-    if ( STARPU_FOUND )
-        message("-- ${Blue}Add definition CHAMELEON_SCHED_STARPU"
-        " - Activate StarPU in Chameleon${ColourReset}")
-        if (STARPU_INCLUDE_DIRS_DEP)
-            include_directories(${STARPU_INCLUDE_DIRS_DEP})
-            set(CMAKE_REQUIRED_INCLUDES "${STARPU_INCLUDE_DIRS_DEP}")
-        endif()
-        if(STARPU_CFLAGS_OTHER_DEP)
-            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${STARPU_CFLAGS_OTHER_DEP}")
-            string(REPLACE ";" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
-            set(CMAKE_REQUIRED_FLAGS "${STARPU_CFLAGS_OTHER_DEP}")
-        endif()
-        if(STARPU_LDFLAGS_OTHER_DEP)
-            set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${STARPU_LDFLAGS_OTHER_DEP}")
-            string(REPLACE ";" " " CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
-            set(CMAKE_REQUIRED_LDFLAGS "${STARPU_LDFLAGS_OTHER_DEP}")
-        endif()
-        if(STARPU_LIBRARY_DIRS_DEP)
-            list(APPEND CMAKE_INSTALL_RPATH "${STARPU_LIBRARY_DIRS_DEP}")
-        endif()
-        if (STARPU_LIBRARIES_DEP)
-            list(INSERT CHAMELEON_DEP 0 ${STARPU_LIBRARIES_DEP})
-            set(CMAKE_REQUIRED_LIBRARIES "${STARPU_LIBRARIES_DEP}")
-        endif()
-        string(REPLACE ";" " " CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
-        check_function_exists(starpu_data_idle_prefetch_on_node HAVE_STARPU_IDLE_PREFETCH)
-        if ( HAVE_STARPU_IDLE_PREFETCH )
-            message("-- ${Blue}Add definition HAVE_STARPU_IDLE_PREFETCH${ColourReset}")
-        endif()
-        check_function_exists(starpu_iteration_push HAVE_STARPU_ITERATION_PUSH)
-        if ( HAVE_STARPU_ITERATION_PUSH )
-            message("-- ${Blue}Add definition HAVE_STARPU_ITERATION_PUSH${ColourReset}")
-        endif()
-        check_function_exists(starpu_data_wont_use HAVE_STARPU_DATA_WONT_USE)
-        if ( HAVE_STARPU_DATA_WONT_USE )
-            message("-- ${Blue}Add definition HAVE_STARPU_DATA_WONT_USE${ColourReset}")
-        endif()
-        check_function_exists(starpu_data_set_coordinates HAVE_STARPU_DATA_SET_COORDINATES)
-        if ( HAVE_STARPU_DATA_SET_COORDINATES )
-            message("-- ${Blue}Add definition HAVE_STARPU_DATA_SET_COORDINATES${ColourReset}")
-        endif()
-        check_function_exists(starpu_malloc_on_node_set_default_flags HAVE_STARPU_MALLOC_ON_NODE_SET_DEFAULT_FLAGS)
-        if ( HAVE_STARPU_MALLOC_ON_NODE_SET_DEFAULT_FLAGS )
-            message("-- ${Blue}Add definition HAVE_STARPU_MALLOC_ON_NODE_SET_DEFAULT_FLAGS${ColourReset}")
-        endif()
-        check_function_exists(starpu_data_set_ooc_flag HAVE_STARPU_DATA_SET_OOC_FLAG)
-        if ( HAVE_STARPU_DATA_SET_OOC_FLAG )
-            message("-- ${Blue}Add definition HAVE_STARPU_DATA_SET_OOC_FLAG${ColourReset}")
-        endif()
-        check_function_exists(starpu_mpi_init_conf HAVE_STARPU_MPI_INIT_CONF)
-        if ( HAVE_STARPU_MPI_INIT_CONF )
-            message("-- ${Blue}Add definition HAVE_STARPU_MPI_INIT_CONF${ColourReset}")
-        endif()
-        check_function_exists(starpu_mpi_wait_for_all HAVE_STARPU_MPI_WAIT_FOR_ALL)
-        if ( HAVE_STARPU_MPI_WAIT_FOR_ALL )
-            message("-- ${Blue}Add definition HAVE_STARPU_MPI_WAIT_FOR_ALL${ColourReset}")
-        endif()
-        check_function_exists(starpu_mpi_data_migrate HAVE_STARPU_MPI_DATA_MIGRATE)
-        if ( HAVE_STARPU_MPI_DATA_MIGRATE )
-            message("-- ${Blue}Add definition HAVE_STARPU_MPI_DATA_MIGRATE${ColourReset}")
-        elseif(CHAMELEON_USE_MIGRATE)
-            set(CHAMELEON_USE_MIGRATE "OFF")
-            message("-- ${Blue}CHAMELEON_USE_MIGRATE is turned OFF because starpu_mpi_data_migrate not found${ColourReset}")
-        endif()
-        check_function_exists(starpu_mpi_interface_datatype_register HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER)
-        if ( HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER )
-          message("-- ${Blue}Add definition HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER${ColourReset}")
-        else()
-          if( CHAMELEON_USE_MPI_DATATYPES )
-            set( CHAMELEON_USE_MPI_DATATYPES OFF )
-          endif()
-        endif()
-        check_function_exists(starpu_interface_copy2d HAVE_STARPU_INTERFACE_COPY2D)
-        if ( HAVE_STARPU_INTERFACE_COPY2D )
-            message("-- ${Blue}Add definition HAVE_STARPU_INTERFACE_COPY2D${ColourReset}")
-        endif()
-        if (CHAMELEON_USE_MPI)
-            # Check if a specific function exist
-            check_function_exists(starpu_mpi_data_register_comm HAVE_STARPU_MPI_DATA_REGISTER)
-            if ( HAVE_STARPU_MPI_DATA_REGISTER )
-                message("-- ${Blue}Add definition HAVE_STARPU_MPI_DATA_REGISTER - Activate"
-                " use of starpu_mpi_data_register() in Chameleon with StarPU${ColourReset}")
-            endif()
-            check_function_exists(starpu_mpi_comm_rank HAVE_STARPU_MPI_COMM_RANK)
-            if ( HAVE_STARPU_MPI_COMM_RANK )
-                message("-- ${Blue}Add definition HAVE_STARPU_MPI_COMM_RANK - Activate"
-                " use of starpu_mpi_comm_rank() in Chameleon with StarPU${ColourReset}")
-            endif()
-            check_function_exists(starpu_mpi_cached_receive HAVE_STARPU_MPI_CACHED_RECEIVE)
-            if ( HAVE_STARPU_MPI_CACHED_RECEIVE )
-                message("-- ${Blue}Add definition HAVE_STARPU_MPI_CACHED_RECEIVE${ColourReset}")
-            endif()
-            check_function_exists(starpu_mpi_comm_get_attr HAVE_STARPU_MPI_COMM_GET_ATTR)
-            if ( HAVE_STARPU_MPI_COMM_GET_ATTR )
-                message("-- ${Blue}Add definition HAVE_STARPU_MPI_COMM_GET_ATTR${ColourReset}")
-            endif()
-        endif()
-    else ( STARPU_FOUND )
-        if(CHAMELEON_VERBOSE_FIND_PACKAGE)
-            if(NOT HWLOC_FOUND OR NOT HWLOC_LIBRARIES)
-                if (NOT HWLOC_hwloc.h_DIRS)
-                    Print_Find_Header_Status(hwloc hwloc.h)
-                endif ()
-                if (NOT HWLOC_hwloc_LIBRARY)
-                    Print_Find_Library_Status(hwloc libhwloc)
-                endif ()
-            endif()
-            if(CHAMELEON_SIMULATION AND (NOT SIMGRID_FOUND OR NOT SIMGRID_LIBRARIES))
-                if (NOT SIMGRID_simgrid.h_DIRS)
-                    Print_Find_Header_Status(simgrid simgrid.h)
-                endif ()
-                if (NOT SIMGRID_simgrid_LIBRARY)
-                    Print_Find_Library_Status(simgrid libsimgrid)
-                endif ()
-            endif()
-            if( (NOT STARPU_SHM_FOUND) OR (NOT STARPU_SHM_LIBRARIES) OR
-                ( STARPU_LOOK_FOR_MPI AND (NOT STARPU_MPI_FOUND OR NOT STARPU_MPI_LIBRARIES) )
-              )
-                foreach(starpu_hdr ${STARPU_hdrs_to_find})
-                    if (NOT STARPU_${starpu_hdr}_INCLUDE_DIRS)
-                        Print_Find_Header_Status(starpu ${starpu_hdr})
-                    endif ()
-                endforeach()
-                if(STARPU_VERSION_STRING)
-                    foreach(starpu_lib ${STARPU_libs_to_find})
-                        if (NOT STARPU_${starpu_lib}_LIBRARY)
-                            Print_Find_Library_Status(starpu ${starpu_lib})
-                        endif ()
-                    endforeach()
-                endif ()
-            endif ()
-        else(CHAMELEON_VERBOSE_FIND_PACKAGE)
-            message(WARNING "StarPU library has not been found and CHAMELEON_VERBOSE_FIND_PACKAGE is set to OFF."
-            " Try to activate CHAMELEON_VERBOSE_FIND_PACKAGE option (-DCHAMELEON_VERBOSE_FIND_PACKAGE=ON) to get some hints for the detection")
-        endif(CHAMELEON_VERBOSE_FIND_PACKAGE)
-        if(NOT HWLOC_FOUND OR NOT HWLOC_LIBRARIES)
-            message(FATAL_ERROR "hwloc library is required but has not been found")
-        endif()
-        if(CHAMELEON_SIMULATION AND (NOT SIMGRID_FOUND OR NOT SIMGRID_LIBRARIES))
-            message(FATAL_ERROR "SimGrid library is required but has not been found")
-        endif()
-        if( (NOT STARPU_SHM_FOUND) OR (NOT STARPU_SHM_LIBRARIES) OR
-            ( STARPU_LOOK_FOR_MPI AND (NOT STARPU_MPI_FOUND OR NOT STARPU_MPI_LIBRARIES) )
-          )
-            message(FATAL_ERROR "StarPU library is required but has not been found")
-        endif()
-    endif ( STARPU_FOUND )
-
-endif( CHAMELEON_SCHED_STARPU )
-
-if( CHAMELEON_SCHED_PARSEC )
-
-    # create list of components in order to make a single call to find_package(starpu...)
-    set(PARSEC_COMPONENT_LIST "HWLOC")
-    if(CHAMELEON_USE_MPI)
-        list(APPEND PARSEC_COMPONENT_LIST "MPI")
-    endif()
-    if(CHAMELEON_USE_CUDA)
-        list(APPEND PARSEC_COMPONENT_LIST "CUDA")
-    endif()
-    find_package(PARSEC COMPONENTS ${PARSEC_COMPONENT_LIST})
-    if(PARSEC_FOUND)
-        message("-- ${Blue}Add definition CHAMELEON_SCHED_PARSEC"
-        " - Activate PaRSEC in Chameleon${ColourReset}")
-      if (PARSEC_INCLUDE_DIRS_DEP)
-          include_directories(${PARSEC_INCLUDE_DIRS_DEP})
-      endif()
-      if(PARSEC_CFLAGS_OTHER_DEP)
-          set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${PARSEC_CFLAGS_OTHER_DEP}")
-          string(REPLACE ";" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
-      endif()
-      if(PARSEC_LDFLAGS_OTHER_DEP)
-          set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PARSEC_LDFLAGS_OTHER_DEP}")
-          string(REPLACE ";" " " CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
-      endif()
-      if(PARSEC_LIBRARY_DIRS_DEP)
-          list(APPEND CMAKE_INSTALL_RPATH "${PARSEC_LIBRARY_DIRS_DEP}")
-      endif()
-      if (PARSEC_LIBRARIES_DEP)
-          list(INSERT CHAMELEON_DEP 0 ${PARSEC_LIBRARIES_DEP})
-      endif()
-      string(REPLACE ";" " " CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
-      # to test if symbols exist, e.g.
-      # set(CMAKE_REQUIRED_INCLUDES "${PARSEC_INCLUDE_DIRS_DEP}")
-      # set(CMAKE_REQUIRED_FLAGS "${PARSEC_CFLAGS_OTHER_DEP}")
-      # set(CMAKE_REQUIRED_LDFLAGS "${PARSEC_LDFLAGS_OTHER_DEP}")
-      # set(CMAKE_REQUIRED_LIBRARIES "${PARSEC_LIBRARIES_DEP}")
-      # check_function_exists(parsec_init HAVE_PARSEC_INIT)
-    else ( PARSEC_FOUND )
-        if(CHAMELEON_VERBOSE_FIND_PACKAGE)
-            if(NOT HWLOC_FOUND OR NOT HWLOC_LIBRARIES)
-                if (NOT HWLOC_hwloc.h_DIRS)
-                    Print_Find_Header_Status(hwloc hwloc.h)
-                endif ()
-                if (NOT HWLOC_hwloc_LIBRARY)
-                    Print_Find_Library_Status(hwloc libhwloc)
-                endif ()
-            endif()
-            if( (NOT PARSEC_FOUND) OR (NOT PARSEC_LIBRARIES_DEP) )
-              foreach(parsec_hdr ${PARSEC_hdrs_to_find})
-                    if (NOT PARSEC_${parsec_hdr}_INCLUDE_DIRS)
-                        Print_Find_Header_Status(parsec ${parsec_hdr})
-                    endif ()
-                endforeach()
-                if(PARSEC_VERSION_STRING)
-                    foreach(parsec_lib ${PARSEC_libs_to_find})
-                        if (NOT PARSEC_${parsec_lib}_LIBRARY)
-                            Print_Find_Library_Status(parsec ${parsec_lib})
-                        endif ()
-                    endforeach()
-                endif()
-            endif()
-        else(CHAMELEON_VERBOSE_FIND_PACKAGE)
-            message(WARNING "PaRSEC library has not been found and CHAMELEON_VERBOSE_FIND_PACKAGE is set to OFF."
-            " Try to activate CHAMELEON_VERBOSE_FIND_PACKAGE option (-DCHAMELEON_VERBOSE_FIND_PACKAGE=ON) to get some hints for the detection")
-        endif(CHAMELEON_VERBOSE_FIND_PACKAGE)
-        if(NOT HWLOC_FOUND OR NOT HWLOC_LIBRARIES)
-            message(FATAL_ERROR "hwloc library is required but has not been found")
-        endif()
-        if( (NOT PARSEC_FOUND) OR (NOT PARSEC_LIBRARIES_DEP) )
-            message(FATAL_ERROR "PaRSEC library is required but has not been found")
-        endif()
-    endif ( PARSEC_FOUND )
-
-endif( CHAMELEON_SCHED_PARSEC )
-
-      # try to find quark runtime
-if( CHAMELEON_SCHED_QUARK )
-
-    find_package(QUARK COMPONENTS HWLOC)
-
-    # Add definition and include_dir if found
-    if(QUARK_FOUND)
-        message("-- ${Blue}Add definition CHAMELEON_SCHED_QUARK"
-        " - Activate QUARK in Chameleon${ColourReset}")
-        if (QUARK_INCLUDE_DIRS_DEP)
-            include_directories(${QUARK_INCLUDE_DIRS_DEP})
-        endif()
-        if(QUARK_CFLAGS_OTHER_DEP)
-            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${QUARK_CFLAGS_OTHER_DEP}")
-            string(REPLACE ";" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
-        endif()
-        if(QUARK_LDFLAGS_OTHER_DEP)
-            set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${QUARK_LDFLAGS_OTHER_DEP}")
-            string(REPLACE ";" " " CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
-        endif()
-        if(QUARK_LIBRARY_DIRS_DEP)
-            list(APPEND CMAKE_INSTALL_RPATH "${QUARK_LIBRARY_DIRS_DEP}")
-        endif()
-        if (QUARK_LIBRARIES_DEP)
-            list(INSERT CHAMELEON_DEP 0 ${QUARK_LIBRARIES_DEP})
-        endif()
-    else(QUARK_FOUND)
-        if(CHAMELEON_VERBOSE_FIND_PACKAGE)
-            if(NOT HWLOC_FOUND OR NOT HWLOC_LIBRARIES)
-                if (NOT HWLOC_hwloc.h_DIRS)
-                    Print_Find_Header_Status(hwloc hwloc.h)
-                endif ()
-                if (NOT HWLOC_hwloc_LIBRARY)
-                    Print_Find_Library_Status(hwloc libhwloc)
-                endif ()
-            endif()
-            if (NOT QUARK_quark.h_DIRS)
-                Print_Find_Header_Status(quark quark.h)
-            endif ()
-            if (NOT QUARK_quark_LIBRARY)
-                Print_Find_Library_Status(quark libquark)
-            endif ()
-        else()
-            message(WARNING "QUARK library has not been found and CHAMELEON_VERBOSE_FIND_PACKAGE is set to OFF."
-            " Try to activate CHAMELEON_VERBOSE_FIND_PACKAGE option (-DCHAMELEON_VERBOSE_FIND_PACKAGE=ON) to get some hints for the detection")
-        endif()
-        if(NOT HWLOC_FOUND OR NOT HWLOC_LIBRARIES)
-            message(FATAL_ERROR "hwloc library is required but has not been found")
-        endif()
-        message(FATAL_ERROR "QUARK library is required but has not been found")
-    endif(QUARK_FOUND)
-
-endif()
-
-if( CHAMELEON_SCHED_OPENMP )
-    find_package(OpenMP REQUIRED)
-
-    if ( OPENMP_FOUND )
-        message("-- ${Blue}Add definition CHAMELEON_SCHED_OPENMP"
-        " - Activate OpenMP in Chameleon${ColourReset}")
-        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
-        set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OpenMP_Fortran_FLAGS}")
-        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_C_FLAGS}")
-        # TODO: check for compiler support for "_Pragma"
-    else ( OPENMP_FOUND )
-      message(FATAL_ERROR "Something went wrong when finding OpenMP")
-    endif ( OPENMP_FOUND )
-endif( CHAMELEON_SCHED_OPENMP )
-
 # getopt
 unset(CMAKE_REQUIRED_LIBRARIES)
 check_include_files(getopt.h CHAMELEON_HAVE_GETOPT_H)
diff --git a/cmake_modules/PrintOpts.cmake b/cmake_modules/PrintOpts.cmake
index 9fa5551b5..2a6a34e75 100644
--- a/cmake_modules/PrintOpts.cmake
+++ b/cmake_modules/PrintOpts.cmake
@@ -48,6 +48,7 @@ set(dep_message "${dep_message}"
 "       MPI .................: ${CHAMELEON_USE_MPI}\n"
 "\n"
 "       Runtime specific\n"
+"       OPENMP ..............: ${CHAMELEON_SCHED_OPENMP}\n"
 "       PARSEC ..............: ${CHAMELEON_SCHED_PARSEC}\n"
 "       QUARK ...............: ${CHAMELEON_SCHED_QUARK}\n"
 "       STARPU ..............: ${CHAMELEON_SCHED_STARPU}\n"
diff --git a/include/chameleon/simulate.h b/include/chameleon/simulate.h
index 4b93f6752..4e5ca845a 100644
--- a/include/chameleon/simulate.h
+++ b/include/chameleon/simulate.h
@@ -22,11 +22,20 @@
 #include "chameleon/config.h"
 
 /* we need this when starpu is compiled with simgrid enabled */
-#if defined(CHAMELEON_SCHED_STARPU) && defined(CHAMELEON_SIMULATION)
-#include <starpu_simgrid_wrap.h>
+#if defined(CHAMELEON_SIMULATION)
+
+#if !defined(CHAMELEON_SCHED_STARPU)
+#error "CHAMELEON_SIMULATION can not be enabled without StarPU support"
+#endif
+
+#ifndef main
+#define main starpu_main
+#endif
+
 #if defined(CHAMELEON_USE_MPI)
 #define starpu_main smpi_simulated_main_
 #endif
+
 #endif
 
 #endif /* _chameleon_simulate_h_ */
diff --git a/runtime/openmp/CMakeLists.txt b/runtime/openmp/CMakeLists.txt
index fba0c9b16..ae6e6264b 100644
--- a/runtime/openmp/CMakeLists.txt
+++ b/runtime/openmp/CMakeLists.txt
@@ -27,6 +27,20 @@
 ###
 cmake_minimum_required(VERSION 2.8)
 
+find_package(OpenMP REQUIRED)
+
+if ( OPENMP_FOUND )
+  message("-- ${Blue}Add definition CHAMELEON_SCHED_OPENMP"
+    " - Activate OpenMP in Chameleon${ColourReset}")
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
+  set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OpenMP_Fortran_FLAGS}")
+  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_C_FLAGS}")
+  # TODO: check for compiler support for "_Pragma"
+else ( OPENMP_FOUND )
+  message(FATAL_ERROR "Something went wrong when finding OpenMP")
+  return()
+endif ( OPENMP_FOUND )
+
 include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include )
 include_directories( ${CMAKE_CURRENT_BINARY_DIR}/include )
 
diff --git a/runtime/parsec/CMakeLists.txt b/runtime/parsec/CMakeLists.txt
index 7ff91b30d..fd99b8d0a 100644
--- a/runtime/parsec/CMakeLists.txt
+++ b/runtime/parsec/CMakeLists.txt
@@ -27,6 +27,82 @@
 ###
 cmake_minimum_required(VERSION 2.8)
 
+# create list of components in order to make a single call to find_package(starpu...)
+set(PARSEC_COMPONENT_LIST "HWLOC")
+if(CHAMELEON_USE_MPI)
+  list(APPEND PARSEC_COMPONENT_LIST "MPI")
+endif()
+if(CHAMELEON_USE_CUDA)
+  list(APPEND PARSEC_COMPONENT_LIST "CUDA")
+endif()
+
+find_package( PARSEC REQUIRED
+  COMPONENTS ${PARSEC_COMPONENT_LIST} )
+
+if(PARSEC_FOUND)
+  message("-- ${Blue}Add definition CHAMELEON_SCHED_PARSEC"
+    " - Activate PaRSEC in Chameleon${ColourReset}")
+  if (PARSEC_INCLUDE_DIRS_DEP)
+    include_directories(${PARSEC_INCLUDE_DIRS_DEP})
+  endif()
+  if(PARSEC_CFLAGS_OTHER_DEP)
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${PARSEC_CFLAGS_OTHER_DEP}")
+    string(REPLACE ";" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
+  endif()
+  if(PARSEC_LDFLAGS_OTHER_DEP)
+    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PARSEC_LDFLAGS_OTHER_DEP}")
+    string(REPLACE ";" " " CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
+  endif()
+  if(PARSEC_LIBRARY_DIRS_DEP)
+    list(APPEND CMAKE_INSTALL_RPATH "${PARSEC_LIBRARY_DIRS_DEP}")
+  endif()
+  if (PARSEC_LIBRARIES_DEP)
+    list(INSERT CHAMELEON_DEP 0 ${PARSEC_LIBRARIES_DEP})
+  endif()
+  string(REPLACE ";" " " CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
+  # to test if symbols exist, e.g.
+  # set(CMAKE_REQUIRED_INCLUDES "${PARSEC_INCLUDE_DIRS_DEP}")
+  # set(CMAKE_REQUIRED_FLAGS "${PARSEC_CFLAGS_OTHER_DEP}")
+  # set(CMAKE_REQUIRED_LDFLAGS "${PARSEC_LDFLAGS_OTHER_DEP}")
+  # set(CMAKE_REQUIRED_LIBRARIES "${PARSEC_LIBRARIES_DEP}")
+  # check_function_exists(parsec_init HAVE_PARSEC_INIT)
+else ( PARSEC_FOUND )
+  if(CHAMELEON_VERBOSE_FIND_PACKAGE)
+    if(NOT HWLOC_FOUND OR NOT HWLOC_LIBRARIES)
+      if (NOT HWLOC_hwloc.h_DIRS)
+        Print_Find_Header_Status(hwloc hwloc.h)
+      endif ()
+      if (NOT HWLOC_hwloc_LIBRARY)
+        Print_Find_Library_Status(hwloc libhwloc)
+      endif ()
+    endif()
+    if( (NOT PARSEC_FOUND) OR (NOT PARSEC_LIBRARIES_DEP) )
+      foreach(parsec_hdr ${PARSEC_hdrs_to_find})
+        if (NOT PARSEC_${parsec_hdr}_INCLUDE_DIRS)
+          Print_Find_Header_Status(parsec ${parsec_hdr})
+        endif ()
+      endforeach()
+      if(PARSEC_VERSION_STRING)
+        foreach(parsec_lib ${PARSEC_libs_to_find})
+          if (NOT PARSEC_${parsec_lib}_LIBRARY)
+            Print_Find_Library_Status(parsec ${parsec_lib})
+          endif ()
+        endforeach()
+      endif()
+    endif()
+  else(CHAMELEON_VERBOSE_FIND_PACKAGE)
+    message(WARNING "PaRSEC library has not been found and CHAMELEON_VERBOSE_FIND_PACKAGE is set to OFF."
+      " Try to activate CHAMELEON_VERBOSE_FIND_PACKAGE option (-DCHAMELEON_VERBOSE_FIND_PACKAGE=ON) to get some hints for the detection")
+  endif(CHAMELEON_VERBOSE_FIND_PACKAGE)
+  if(NOT HWLOC_FOUND OR NOT HWLOC_LIBRARIES)
+    message(FATAL_ERROR "hwloc library is required but has not been found")
+  endif()
+  if( (NOT PARSEC_FOUND) OR (NOT PARSEC_LIBRARIES_DEP) )
+    message(FATAL_ERROR "PaRSEC library is required but has not been found")
+  endif()
+  return()
+endif ( PARSEC_FOUND )
+
 include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include )
 include_directories( ${CMAKE_CURRENT_BINARY_DIR}/include )
 
diff --git a/runtime/quark/CMakeLists.txt b/runtime/quark/CMakeLists.txt
index 347279ce0..099da9381 100644
--- a/runtime/quark/CMakeLists.txt
+++ b/runtime/quark/CMakeLists.txt
@@ -27,6 +27,57 @@
 ###
 cmake_minimum_required(VERSION 2.8)
 
+find_package( QUARK REQUIRED
+  COMPONENTS HWLOC )
+
+# Add definition and include_dir if found
+if(QUARK_FOUND)
+  message("-- ${Blue}Add definition CHAMELEON_SCHED_QUARK"
+    " - Activate QUARK in Chameleon${ColourReset}")
+  if (QUARK_INCLUDE_DIRS_DEP)
+    include_directories(${QUARK_INCLUDE_DIRS_DEP})
+  endif()
+  if(QUARK_CFLAGS_OTHER_DEP)
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${QUARK_CFLAGS_OTHER_DEP}")
+    string(REPLACE ";" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
+  endif()
+  if(QUARK_LDFLAGS_OTHER_DEP)
+    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${QUARK_LDFLAGS_OTHER_DEP}")
+    string(REPLACE ";" " " CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
+  endif()
+  if(QUARK_LIBRARY_DIRS_DEP)
+    list(APPEND CMAKE_INSTALL_RPATH "${QUARK_LIBRARY_DIRS_DEP}")
+  endif()
+  if (QUARK_LIBRARIES_DEP)
+    list(INSERT CHAMELEON_DEP 0 ${QUARK_LIBRARIES_DEP})
+  endif()
+else(QUARK_FOUND)
+  if(CHAMELEON_VERBOSE_FIND_PACKAGE)
+    if(NOT HWLOC_FOUND OR NOT HWLOC_LIBRARIES)
+      if (NOT HWLOC_hwloc.h_DIRS)
+        Print_Find_Header_Status(hwloc hwloc.h)
+      endif ()
+      if (NOT HWLOC_hwloc_LIBRARY)
+        Print_Find_Library_Status(hwloc libhwloc)
+      endif ()
+    endif()
+    if (NOT QUARK_quark.h_DIRS)
+      Print_Find_Header_Status(quark quark.h)
+    endif ()
+    if (NOT QUARK_quark_LIBRARY)
+      Print_Find_Library_Status(quark libquark)
+    endif ()
+  else()
+    message(WARNING "QUARK library has not been found and CHAMELEON_VERBOSE_FIND_PACKAGE is set to OFF."
+      " Try to activate CHAMELEON_VERBOSE_FIND_PACKAGE option (-DCHAMELEON_VERBOSE_FIND_PACKAGE=ON) to get some hints for the detection")
+  endif()
+  if(NOT HWLOC_FOUND OR NOT HWLOC_LIBRARIES)
+    message(FATAL_ERROR "hwloc library is required but has not been found")
+  endif()
+  message(FATAL_ERROR "QUARK library is required but has not been found")
+  return()
+endif(QUARK_FOUND)
+
 include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include )
 include_directories( ${CMAKE_CURRENT_BINARY_DIR}/include )
 
diff --git a/runtime/starpu/CMakeLists.txt b/runtime/starpu/CMakeLists.txt
index f02a8bbb0..af2095e27 100644
--- a/runtime/starpu/CMakeLists.txt
+++ b/runtime/starpu/CMakeLists.txt
@@ -27,6 +27,173 @@
 ###
 cmake_minimum_required(VERSION 2.8)
 
+set(CHAMELEON_STARPU_VERSION "1.3" CACHE STRING "oldest STARPU version desired")
+
+# create list of components in order to make a single call to find_package(starpu...)
+if(NOT CHAMELEON_SIMULATION)
+  set(STARPU_COMPONENT_LIST "HWLOC")
+  if(CHAMELEON_USE_CUDA)
+    list(APPEND STARPU_COMPONENT_LIST "CUDA")
+  endif()
+else()
+  set(STARPU_COMPONENT_LIST "SIMGRID")
+endif()
+if(CHAMELEON_USE_MPI)
+  list(APPEND STARPU_COMPONENT_LIST "MPI")
+endif()
+
+find_package(STARPU ${CHAMELEON_STARPU_VERSION} REQUIRED
+  COMPONENTS ${STARPU_COMPONENT_LIST})
+
+# Add definition and include_dir if found
+if ( STARPU_FOUND )
+  message("-- ${Blue}Add definition CHAMELEON_SCHED_STARPU"
+    " - Activate StarPU in Chameleon${ColourReset}")
+  if (STARPU_INCLUDE_DIRS_DEP)
+    include_directories(${STARPU_INCLUDE_DIRS_DEP})
+    set(CMAKE_REQUIRED_INCLUDES "${STARPU_INCLUDE_DIRS_DEP}")
+  endif()
+  if(STARPU_CFLAGS_OTHER_DEP)
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${STARPU_CFLAGS_OTHER_DEP}")
+    string(REPLACE ";" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
+    set(CMAKE_REQUIRED_FLAGS "${STARPU_CFLAGS_OTHER_DEP}")
+  endif()
+  if(STARPU_LDFLAGS_OTHER_DEP)
+    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${STARPU_LDFLAGS_OTHER_DEP}")
+    string(REPLACE ";" " " CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
+    set(CMAKE_REQUIRED_LDFLAGS "${STARPU_LDFLAGS_OTHER_DEP}")
+  endif()
+  if(STARPU_LIBRARY_DIRS_DEP)
+    list(APPEND CMAKE_INSTALL_RPATH "${STARPU_LIBRARY_DIRS_DEP}")
+  endif()
+  if (STARPU_LIBRARIES_DEP)
+    list(INSERT CHAMELEON_DEP 0 ${STARPU_LIBRARIES_DEP})
+    set(CMAKE_REQUIRED_LIBRARIES "${STARPU_LIBRARIES_DEP}")
+  endif()
+  string(REPLACE ";" " " CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
+  check_function_exists(starpu_data_idle_prefetch_on_node HAVE_STARPU_IDLE_PREFETCH)
+  if ( HAVE_STARPU_IDLE_PREFETCH )
+    message("-- ${Blue}Add definition HAVE_STARPU_IDLE_PREFETCH${ColourReset}")
+  endif()
+  check_function_exists(starpu_iteration_push HAVE_STARPU_ITERATION_PUSH)
+  if ( HAVE_STARPU_ITERATION_PUSH )
+    message("-- ${Blue}Add definition HAVE_STARPU_ITERATION_PUSH${ColourReset}")
+  endif()
+  check_function_exists(starpu_data_wont_use HAVE_STARPU_DATA_WONT_USE)
+  if ( HAVE_STARPU_DATA_WONT_USE )
+    message("-- ${Blue}Add definition HAVE_STARPU_DATA_WONT_USE${ColourReset}")
+  endif()
+  check_function_exists(starpu_data_set_coordinates HAVE_STARPU_DATA_SET_COORDINATES)
+  if ( HAVE_STARPU_DATA_SET_COORDINATES )
+    message("-- ${Blue}Add definition HAVE_STARPU_DATA_SET_COORDINATES${ColourReset}")
+  endif()
+  check_function_exists(starpu_malloc_on_node_set_default_flags HAVE_STARPU_MALLOC_ON_NODE_SET_DEFAULT_FLAGS)
+  if ( HAVE_STARPU_MALLOC_ON_NODE_SET_DEFAULT_FLAGS )
+    message("-- ${Blue}Add definition HAVE_STARPU_MALLOC_ON_NODE_SET_DEFAULT_FLAGS${ColourReset}")
+  endif()
+  check_function_exists(starpu_data_set_ooc_flag HAVE_STARPU_DATA_SET_OOC_FLAG)
+  if ( HAVE_STARPU_DATA_SET_OOC_FLAG )
+    message("-- ${Blue}Add definition HAVE_STARPU_DATA_SET_OOC_FLAG${ColourReset}")
+  endif()
+  check_function_exists(starpu_mpi_init_conf HAVE_STARPU_MPI_INIT_CONF)
+  if ( HAVE_STARPU_MPI_INIT_CONF )
+    message("-- ${Blue}Add definition HAVE_STARPU_MPI_INIT_CONF${ColourReset}")
+  endif()
+  check_function_exists(starpu_mpi_wait_for_all HAVE_STARPU_MPI_WAIT_FOR_ALL)
+  if ( HAVE_STARPU_MPI_WAIT_FOR_ALL )
+    message("-- ${Blue}Add definition HAVE_STARPU_MPI_WAIT_FOR_ALL${ColourReset}")
+  endif()
+  check_function_exists(starpu_mpi_data_migrate HAVE_STARPU_MPI_DATA_MIGRATE)
+  if ( HAVE_STARPU_MPI_DATA_MIGRATE )
+    message("-- ${Blue}Add definition HAVE_STARPU_MPI_DATA_MIGRATE${ColourReset}")
+  elseif(CHAMELEON_USE_MIGRATE)
+    set(CHAMELEON_USE_MIGRATE "OFF")
+    message("-- ${Blue}CHAMELEON_USE_MIGRATE is turned OFF because starpu_mpi_data_migrate not found${ColourReset}")
+  endif()
+  check_function_exists(starpu_mpi_interface_datatype_register HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER)
+  if ( HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER )
+    message("-- ${Blue}Add definition HAVE_STARPU_MPI_INTERFACE_DATATYPE_REGISTER${ColourReset}")
+  else()
+    if( CHAMELEON_USE_MPI_DATATYPES )
+      set( CHAMELEON_USE_MPI_DATATYPES OFF )
+    endif()
+  endif()
+  check_function_exists(starpu_interface_copy2d HAVE_STARPU_INTERFACE_COPY2D)
+  if ( HAVE_STARPU_INTERFACE_COPY2D )
+    message("-- ${Blue}Add definition HAVE_STARPU_INTERFACE_COPY2D${ColourReset}")
+  endif()
+  if (CHAMELEON_USE_MPI)
+    # Check if a specific function exist
+    check_function_exists(starpu_mpi_data_register_comm HAVE_STARPU_MPI_DATA_REGISTER)
+    if ( HAVE_STARPU_MPI_DATA_REGISTER )
+      message("-- ${Blue}Add definition HAVE_STARPU_MPI_DATA_REGISTER - Activate"
+        " use of starpu_mpi_data_register() in Chameleon with StarPU${ColourReset}")
+    endif()
+    check_function_exists(starpu_mpi_comm_rank HAVE_STARPU_MPI_COMM_RANK)
+    if ( HAVE_STARPU_MPI_COMM_RANK )
+      message("-- ${Blue}Add definition HAVE_STARPU_MPI_COMM_RANK - Activate"
+        " use of starpu_mpi_comm_rank() in Chameleon with StarPU${ColourReset}")
+    endif()
+    check_function_exists(starpu_mpi_cached_receive HAVE_STARPU_MPI_CACHED_RECEIVE)
+    if ( HAVE_STARPU_MPI_CACHED_RECEIVE )
+      message("-- ${Blue}Add definition HAVE_STARPU_MPI_CACHED_RECEIVE${ColourReset}")
+    endif()
+    check_function_exists(starpu_mpi_comm_get_attr HAVE_STARPU_MPI_COMM_GET_ATTR)
+    if ( HAVE_STARPU_MPI_COMM_GET_ATTR )
+      message("-- ${Blue}Add definition HAVE_STARPU_MPI_COMM_GET_ATTR${ColourReset}")
+    endif()
+  endif()
+else ( STARPU_FOUND )
+  if(CHAMELEON_VERBOSE_FIND_PACKAGE)
+    if(NOT HWLOC_FOUND OR NOT HWLOC_LIBRARIES)
+      if (NOT HWLOC_hwloc.h_DIRS)
+        Print_Find_Header_Status(hwloc hwloc.h)
+      endif ()
+      if (NOT HWLOC_hwloc_LIBRARY)
+        Print_Find_Library_Status(hwloc libhwloc)
+      endif ()
+    endif()
+    if(CHAMELEON_SIMULATION AND (NOT SIMGRID_FOUND OR NOT SIMGRID_LIBRARIES))
+      if (NOT SIMGRID_simgrid.h_DIRS)
+        Print_Find_Header_Status(simgrid simgrid.h)
+      endif ()
+      if (NOT SIMGRID_simgrid_LIBRARY)
+        Print_Find_Library_Status(simgrid libsimgrid)
+      endif ()
+    endif()
+    if( (NOT STARPU_SHM_FOUND) OR (NOT STARPU_SHM_LIBRARIES) OR
+        ( STARPU_LOOK_FOR_MPI AND (NOT STARPU_MPI_FOUND OR NOT STARPU_MPI_LIBRARIES) )
+        )
+      foreach(starpu_hdr ${STARPU_hdrs_to_find})
+        if (NOT STARPU_${starpu_hdr}_INCLUDE_DIRS)
+          Print_Find_Header_Status(starpu ${starpu_hdr})
+        endif ()
+      endforeach()
+      if(STARPU_VERSION_STRING)
+        foreach(starpu_lib ${STARPU_libs_to_find})
+          if (NOT STARPU_${starpu_lib}_LIBRARY)
+            Print_Find_Library_Status(starpu ${starpu_lib})
+          endif ()
+        endforeach()
+      endif ()
+    endif ()
+  else(CHAMELEON_VERBOSE_FIND_PACKAGE)
+    message(WARNING "StarPU library has not been found and CHAMELEON_VERBOSE_FIND_PACKAGE is set to OFF."
+      " Try to activate CHAMELEON_VERBOSE_FIND_PACKAGE option (-DCHAMELEON_VERBOSE_FIND_PACKAGE=ON) to get some hints for the detection")
+  endif(CHAMELEON_VERBOSE_FIND_PACKAGE)
+  if(NOT HWLOC_FOUND OR NOT HWLOC_LIBRARIES)
+    message(FATAL_ERROR "hwloc library is required but has not been found")
+  endif()
+  if(CHAMELEON_SIMULATION AND (NOT SIMGRID_FOUND OR NOT SIMGRID_LIBRARIES))
+    message(FATAL_ERROR "SimGrid library is required but has not been found")
+  endif()
+  if( (NOT STARPU_SHM_FOUND) OR (NOT STARPU_SHM_LIBRARIES) OR
+      ( STARPU_LOOK_FOR_MPI AND (NOT STARPU_MPI_FOUND OR NOT STARPU_MPI_LIBRARIES) )
+      )
+    message(FATAL_ERROR "StarPU library is required but has not been found")
+  endif()
+endif ( STARPU_FOUND )
+
 include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include )
 include_directories( ${CMAKE_CURRENT_BINARY_DIR}/include )
 
-- 
GitLab