CMakeLists.txt 38.8 KB
Newer Older
1 2
cmake_minimum_required (VERSION 2.8.3 FATAL_ERROR)

3 4 5
if(CMAKE_MAJOR_VERSION GREATER 1 AND CMAKE_MINOR_VERSION GREATER 7 AND CMAKE_PATCH_VERSION GREATER 11)
  cmake_policy(SET CMP0022 OLD)
endif()
6

7
cmake_policy(SET CMP0004 OLD)
BRAMAS Berenger's avatar
BRAMAS Berenger committed
8

9 10 11 12 13
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)

#===========================================================================
# Project Declaration
#===========================================================================
14
project(SCALFMM C CXX)
COULAUD Olivier's avatar
COULAUD Olivier committed
15

16
# check if compiling into source directories
17
string(COMPARE EQUAL "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}" insource)
18
if(insource)
Florent Pruvost's avatar
Florent Pruvost committed
19
  message(FATAL_ERROR "${PROJECT_NAME} requires an out of source build. Goto ./Build and tapes cmake ../")
20
endif(insource)
21

22 23
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/)
set(SCALFMM_CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules)
COULAUD Olivier's avatar
COULAUD Olivier committed
24 25 26 27
#
# Adds the CMAKE_DEPENDENT_OPTION command
INCLUDE(CMakeDependentOption)
#  Add to check CPU info
28 29 30
include(GetCpuInfos)
GetCpuInfos()

COULAUD Olivier's avatar
COULAUD Olivier committed
31 32 33 34
#===========================================================================
# Version Number
#===========================================================================

35 36
# SCALFMM version number.  An even minor number corresponds to releases.
set(SCALFMM_MAJOR_VERSION 1)
37
set(SCALFMM_MINOR_VERSION 4)
38 39
set(SCALFMM_PATCH_VERSION 0)
set(SCALFMM_VERSION  "${SCALFMM_MAJOR_VERSION}.${SCALFMM_MINOR_VERSION}.${SCALFMM_PATCH_VERSION}" )
COULAUD Olivier's avatar
COULAUD Olivier committed
40

41
set( MORSE_DISTRIB_DIR "" CACHE PATH "Directory of MORSE distribution")
BRAMAS Berenger's avatar
BRAMAS Berenger committed
42

43
if (MORSE_DISTRIB_DIR OR EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/morse/")
44 45 46 47

  # Add extra cmake module path and initialize morse cmake modules
  # --------------------------------------------------------------
  if(MORSE_DISTRIB_DIR)
COULAUD Olivier's avatar
COULAUD Olivier committed
48 49 50
    list(APPEND CMAKE_MODULE_PATH ${MORSE_DISTRIB_DIR}/cmake_modules)
    list(APPEND CMAKE_MODULE_PATH "${MORSE_DISTRIB_DIR}/cmake_modules/morse")
    set(MORSE_CMAKE_MODULE_PATH ${MORSE_DISTRIB_DIR}/cmake_modules/morse )
51 52 53
  elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/morse/")
    list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/morse/)
    set(MORSE_CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/morse )
54 55 56 57
  endif()
  include(MorseInit)
  #
  # Options
58
  #
59 60 61 62 63 64 65
  option( SCALFMM_USE_MPI              "Set to ON to build ScaFMM with MPI"          OFF )
  option( SCALFMM_USE_BLAS             "Set to ON to build ScaFMM with BLAS"         ON )
  option( SCALFMM_USE_FFT              "Set to ON to build ScaFMM with FFTW"         ON )
  option( SCALFMM_BUILD_EXAMPLES       "Set to ON to compile examples "              ON  )
  option( SCALFMM_BUILD_TESTS          "Set to ON to build functionalities Tests"    OFF )
  option( SCALFMM_BUILD_UTESTS         "Set to ON to build UTests"                   OFF )
  option( SCALFMM_INSTALL_DATA         "Set to ON to include the data when proceeding to the installtion " OFF )
66
  option( SCALFMM_BUILD_DOC            "Set to ON to build the Doxygen documentation " OFF )
67 68 69 70 71
  option( SCALFMM_BUILD_DEBUG          "Set to ON to build in Debug"                 OFF )
  option( SCALFMM_USE_LOG              "Set to ON to print output debug information" OFF )
  option( SCALFMM_USE_MEM_STATS        "Set to ON to profile memory"                 OFF )
  option( SCALFMM_ATTACHE_SOURCE       "Set to ON to compile with -g"                OFF )
  option( SCALFMM_USE_ADDONS           "Set to ON to compile add ons"                OFF )
72
  option( SCALFMM_USE_SIGNALS          "Set to ON to catch various signal an print backtrace"  OFF )
73 74 75 76 77 78 79 80 81 82
  option( SCALFMM_USE_ASSERT           "Set to ON to enable safe tests during execution" ON  )
  option( SCALFMM_USE_MIC_NATIVE       "Set to ON to compile in native mode for MIC" OFF  )
  option( SCALFMM_ONLY_DEVEL           "Set to ON to compile Development tools (only scalfmm team)" ON )
  option( SCALFMM_USE_EZTRACE          "Set to ON to compile with eztrace framwork" OFF )
  option( SCALFMM_USE_STARPU           "Set to ON to build SCALFMM with StarPU"     OFF )
  option( SCALFMM_BUILD_UTILS          "Set to ON to build utils Tests"             OFF )

#
#  VECTORISATION
#
83
  if( APPLE ) # to fix problem with  GCC and avx
COULAUD Olivier's avatar
COULAUD Olivier committed
84 85
    CMAKE_DEPENDENT_OPTION( SCALFMM_USE_SSE              "Set to ON to compile with SSE support (and use intrinsec SSE P2P)" ON "CPUOPTION_SSE3;NOT CPUOPTION_AVX2" OFF  )
    CMAKE_DEPENDENT_OPTION( SCALFMM_USE_AVX              "Set to ON to compile with AVX support (and use intrinsec AVX P2P)" OFF "CPUOPTION_AVX; NOT CPUOPTION_AVX2" OFF  )
86
  else(APPLE)
COULAUD Olivier's avatar
COULAUD Olivier committed
87 88
    CMAKE_DEPENDENT_OPTION( SCALFMM_USE_SSE              "Set to ON to compile with SSE support (and use intrinsec SSE P2P)" ON "CPUOPTION_SSE3;NOT CPUOPTION_AVX;NOT CPUOPTION_AVX2" OFF  )
    CMAKE_DEPENDENT_OPTION( SCALFMM_USE_AVX              "Set to ON to compile with AVX support (and use intrinsec AVX P2P)" ON "CPUOPTION_AVX; NOT CPUOPTION_AVX2" OFF  )
89
  endif(APPLE)
90 91
  CMAKE_DEPENDENT_OPTION( SCALFMM_USE_AVX2             "Set to ON to compile with AVX support (and use intrinsec AVX2 P2P)" ON "CPUOPTION_AVX2" OFF )

92
  if( SCALFMM_ONLY_DEVEL )
93
# OPENMP 4/5 support 
94
    option( OPENMP_SUPPORT_COMMUTE   "Set to ON to let tasks commute (KSTAR/StarPU compiler only)" OFF )
95
    option( OPENMP_SUPPORT_PRIORITY  "Set to ON to enable tasks priority (KSTAR/StarPU compiler only)" OFF )
96
    option( OPENMP_SUPPORT_TASK_NAME "Set to ON to enable a taskname clause for tasks (KSTAR/StarPU compiler only)" OFF )
BRAMAS Berenger's avatar
BRAMAS Berenger committed
97
    option( SCALFMM_DISABLE_NATIVE_OMP4 "Set to ON to disable the gcc/intel omp4"    OFF )
98
    option( SCALFMM_TIME_OMPTASKS "Set to ON to time omp4 tasks and generate output file"    OFF )
99 100 101 102 103
# STARPU options
    CMAKE_DEPENDENT_OPTION(SCALFMM_STARPU_USE_COMMUTE  "Set to ON to enable commute with StarPU" ON  "SCALFMM_USE_STARPU" OFF)
    CMAKE_DEPENDENT_OPTION(SCALFMM_STARPU_USE_REDUX  "Set to ON to enable redux with StarPU"     OFF "SCALFMM_USE_STARPU" OFF)
    CMAKE_DEPENDENT_OPTION(SCALFMM_STARPU_USE_PRIO  "Set to ON to enable priority with StarPU"   ON  "SCALFMM_USE_STARPU" OFF)
    CMAKE_DEPENDENT_OPTION(SCALFMM_STARPU_FORCE_NO_SCHEDULER  "Set to ON to disable heteroprio even if supported" OFF "SCALFMM_USE_STARPU" OFF)
104
  endif()
105
  message(STATUS "AVANT  ${CMAKE_CXX_COMPILER_ID}" )
106 107 108
#
#  MPI
#
109
  if( SCALFMM_USE_MPI )
110
    try_compile(COMPILE_INTEL ${CMAKE_CURRENT_BINARY_DIR}
COULAUD Olivier's avatar
COULAUD Olivier committed
111 112
      ${SCALFMM_CMAKE_MODULE_PATH}/compileTestIntel.cpp
      COMPILE_DEFINITIONS "${CMAKE_CXX_FLAGS}")
113 114 115 116 117 118 119
    if (COMPILE_INTEL)
      set(CMAKE_CXX_COMPILER_ID  "Intel")
    endif()
  endif()
  message(STATUS "CXX  ${CMAKE_CXX_COMPILER_ID}" )
  # Set scalfmm to default libraries
  set(SCALFMM_LIBRARIES "")
120
  set(SCALFMM_CXX_FLAGS "-std=c++11 -fpic -Wall")
121 122 123 124 125 126 127 128 129 130 131 132
  #
  #
  # Test if openmp is here
  #
  find_package (OpenMP)
  if(OPENMP_FOUND)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
  else(OPENMP_FOUND)
    message(WARNING "OPENMP NOT FOUND")
  endif(OPENMP_FOUND)
133
  message(STATUS "SCALFMM_BUILD_DEBUG = ${SCALFMM_BUILD_DEBUG}" )
134 135
  #
  if(CMAKE_SIZEOF_VOID_P EQUAL 8)
136
    set(SCALFMM_CXX_FLAGS  "${SCALFMM_CXX_FLAGS} -m64")
137 138 139 140 141 142 143 144 145
  endif()
  ##############################################################################
  #                           Compile options                                  #
  ##############################################################################
  #  -xHost -mfpmath=sse
  # -Wall Wnosign-conversion
  #
  if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
    # INTEL
146
    IF (APPLE)
COULAUD Olivier's avatar
COULAUD Olivier committed
147 148 149 150 151
      IF( CPUOPTION_SSE42 ) 
        set(SSE_FLAGS  "-msse4  -mfpmath=sse")   # -mtune=native -march=native
      ELSEIF (CPUOPTION_SSE3)
        set(SSE_FLAGS  "-msse3  -mfpmath=sse")   # -mtune=native -march=native
      ENDIF (CPUOPTION_SSE42)  
152
    else(APPLE)
COULAUD Olivier's avatar
COULAUD Olivier committed
153 154
      set(AVX_FLAGS  "-march=native -axCORE-AVX2,CORE-AVX-I,AVX") #-mavx
      set(AVX2_FLAGS  "-march=native  -axCORE-AVX2,CORE-AVX-I") #-march=core-avx2
155
      set(SSE_FLAGS  "-axSSE4.2  -march=native")
156
    endif(APPLE)
Marc-Alexandre Espiaut's avatar
Marc-Alexandre Espiaut committed
157
    #-Wshadow -Wpointer-arith -Wcast-qual -Wconversion  -Wall -Wnosign-conversion ")
158
  else()
Marc-Alexandre Espiaut's avatar
Marc-Alexandre Espiaut committed
159
    # NOT      INTEL
160
    if(NOT SCALFMM_USE_MPI)
161 162 163
      include(CheckCCompilerFlag)
      check_c_compiler_flag(-Wzero-as-null-pointer-constant HAS_WZERO_NULL_PTR_FLAG)
      if(HAS_WZERO_NULL_PTR_FLAG)
164
        set(SCALFMM_CXX_FLAGS  "${SCALFMM_CXX_FLAGS} -Wzero-as-null-pointer-constant")
165
      endif()
166
    else()
167 168 169
      include(CheckCCompilerFlag)
      check_c_compiler_flag(-Wno-literal-suffix HAS_NO_LITERAL_SUFFIX_FLAG)
      if(HAS_NO_LITERAL_SUFFIX_FLAG)
170
        set(SCALFMM_CXX_FLAGS  "${SCALFMM_CXX_FLAGS} -Wno-literal-suffix")
171
      endif()
172
    endif()
173
    IF (APPLE)
COULAUD Olivier's avatar
COULAUD Olivier committed
174 175 176 177 178 179
      #      set(SSE_FLAGS  "-msse4  -mfpmath=sse")   # -mtune=native -march=native
      IF( CPUOPTION_SSE42 ) 
        set(SSE_FLAGS  "-msse4  -mfpmath=sse")   # -mtune=native -march=native
      ELSEIF (CPUOPTION_SSE3)
        set(SSE_FLAGS  "-msse3  -mfpmath=sse")   # -mtune=native -march=native
      ENDIF (CPUOPTION_SSE42)
180 181
      set(AVX_FLAGS "-mtune=native -march=avx")
      set(AVX2_FLAGS "-mtune=native -march=native -mmic")
182
    else(APPLE)
183 184 185
      set(SSE_FLAGS  "-mtune=native -march=native")
      set(AVX_FLAGS "-mtune=native -march=native")
      set(AVX2_FLAGS "-mtune=native -march=native -mmic")
186 187
    endif(APPLE)
  endif()
188

189 190 191 192 193 194
  ##############################################################################
  #                           FUSE list                                        #
  ##############################################################################
  set(FUSE_LIST "")
  # then do list(APPEND FUSE_LIST "BLAS") to protect from FUSE_BLAS
  list(APPEND FUSE_LIST "MPI")
195

196 197 198 199
  ##############################################################################
  #                        Debug      flags                                    #
  ##############################################################################
  #
200
  if( SCALFMM_BUILD_DEBUG )
201 202 203 204 205 206
    #
    # Compile Debug flags
    #
    set(CMAKE_BUILD_TYPE Debug)
    ADD_DEFINITIONS(-O0)
    if( APPLE )
207
      set(SCALFMM_FLAGS_OPTI_DEBUG "-funroll-loops" CACHE STRING
208 209 210 211 212 213 214 215 216 217 218
        "Set your optimization flags for debug mode.")
    else(APPLE)
      if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
        set(SCALFMM_FLAGS_OPTI_DEBUG "-fp-model strict  -funroll-loops" CACHE STRING
          "Set your optimization flags for debug mode.")
      else()
        set(SCALFMM_FLAGS_OPTI_DEBUG "-funroll-loops" CACHE STRING
          "Set your optimization flags for debug mode.")
      endif()
    endif(APPLE)
    #  ADD_DEFINITIONS(${SCALFMM_FLAGS_OPTI_DEBUG})
219
    set(SCALFMM_CXX_FLAGS "${SCALFMM_CXX_FLAGS} ${SCALFMM_FLAGS_OPTI_DEBUG}")
220 221 222 223 224 225
    set(CMAKE_CXX_FLAGS_TYPE "${CMAKE_CXX_FLAGS_DEBUG}")

  else()
    ##############################################################################
    #                          Release flags                                     #
    ##############################################################################
226

227 228 229
    set(CMAKE_BUILD_TYPE Release)
    set(CMAKE_CXX_FLAGS_TYPE  "${CMAKE_CXX_FLAGS_RELEASE}")
    # if compiler is intel add -ip
230

BRAMAS Berenger's avatar
BRAMAS Berenger committed
231
    if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
COULAUD Olivier's avatar
COULAUD Olivier committed
232
      set(SCALFMM_CXX_FLAGS  "${SCALFMM_CXX_FLAGS} -ipo  -fstrict-aliasing ")# -no-prec-div -no-prec-sqrt")
BRAMAS Berenger's avatar
BRAMAS Berenger committed
233
    endif()
234 235
    # Compile optimization
    if(APPLE)
236
      set(SCALFMM_FLAGS_OPTI_RELEASE "-funroll-loops" CACHE STRING
237 238 239
        "Set your optimization flags for release mode.")
    else(APPLE)
      # Not apple system - Check the compiler flags
COULAUD Olivier's avatar
COULAUD Olivier committed
240 241 242 243
      if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
        #set(SCALFMM_FLAGS_OPTI_RELEASE "-fp-model precise -fp-model source -fimf-precision=low  -funroll-loops -ftree-vectorize"
        set(SCALFMM_FLAGS_OPTI_RELEASE "-funroll-loops -ftree-vectorize"
          CACHE STRING "Set your optimization flags for release mode.")
244 245
  # set(SCALFMM_FLAGS_OPTI_RELEASE "-funroll-loops -ftree-vectorize" CACHE STRING
  #   "Set your optimization flags for release mode.")
246 247 248 249 250 251
      else()
        set(SCALFMM_FLAGS_OPTI_RELEASE "-ffast-math -funroll-loops -ftree-vectorize" CACHE STRING
          "Set your optimization flags for release mode.")
      endif()
    endif(APPLE)
    #
252
    set(SCALFMM_CXX_FLAGS  "${SCALFMM_CXX_FLAGS} ${SCALFMM_FLAGS_OPTI_RELEASE}")
253
  endif()
COULAUD Olivier's avatar
COULAUD Olivier committed
254 255
  MESSAGE(STATUS   " %%%%%%%%%% SCALFMM_CXX_FLAGS  ${SCALFMM_CXX_FLAGS} %%%%%%%%%%%%%")
  MESSAGE(STATUS   " %%%%%%%%%% CMAKE_CXX_FLAGS_RELEASE  ${CMAKE_CXX_FLAGS_RELEASE} %%%%%%%%%%%%%")
256

257 258 259 260
  #
  ##############################################################################
  #                Attach source code to exec                                  #
  ##############################################################################
261 262
  message(STATUS "SCALFMM_ATTACHE_SOURCE       = ${SCALFMM_ATTACHE_SOURCE}" )
  if( SCALFMM_ATTACHE_SOURCE )
263
    message(STATUS "Option -g is used, the code is attached to the binary." )
264 265
    set(SCALFMM_CXX_FLAGS  "${SCALFMM_CXX_FLAGS} -g")
  endif(SCALFMM_ATTACHE_SOURCE)
266 267 268 269 270
  #
  ##############################################################################
  #                                 find MPI                                   #
  ##############################################################################
  #
271
  if( SCALFMM_USE_MPI )
272 273 274 275 276

    # allows to use an external mpi compilation by setting compilers with
    # -DMPI_C_COMPILER=path/to/mpicc -DMPI_CXX_COMPILER=path/to/mpicxx
    # at cmake configure
    if(NOT MPI_C_COMPILER)
COULAUD Olivier's avatar
COULAUD Olivier committed
277
      set(MPI_C_COMPILER mpicc)
278 279
    endif()
    if(NOT MPI_CXX_COMPILER)
COULAUD Olivier's avatar
COULAUD Olivier committed
280
      set(MPI_CXX_COMPILER mpicxx)
281 282 283 284 285
    endif()

    find_package(MPI REQUIRED)

    if (MPI_CXX_INCLUDE_PATH)
COULAUD Olivier's avatar
COULAUD Olivier committed
286
      include_directories( ${MPI_CXX_INCLUDE_PATH} )
287 288
    endif()
    if (MPI_CXX_COMPILE_FLAGS)
COULAUD Olivier's avatar
COULAUD Olivier committed
289
      set(SCALFMM_CXX_FLAGS "${SCALFMM_CXX_FLAGS} ${MPI_CXX_COMPILE_FLAGS}")
290 291
    endif()
    if (MPI_CXX_INCLUDE_PATH)
COULAUD Olivier's avatar
COULAUD Olivier committed
292
      set(SCALFMM_INCLUDES  "${SCALFMM_INCLUDES}; ${MPI_CXX_INCLUDE_PATH}")
293 294
    endif()
    if (MPI_CXX_LINK_FLAGS)
COULAUD Olivier's avatar
COULAUD Olivier committed
295
      set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${MPI_CXX_LINK_FLAGS}")
296 297
    endif()
    if (MPI_CXX_LIBRARIES)
COULAUD Olivier's avatar
COULAUD Olivier committed
298
      set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${MPI_CXX_LIBRARIES}")
299 300 301 302 303 304 305 306
    endif()

  endif()
  #
  ##############################################################################
  #                             Blas option                                    #
  ##############################################################################
  #
307
  if( SCALFMM_USE_BLAS )
308 309
    message(STATUS "CMAKE_CXX_COMPILER_ID STREQUAL  ${CMAKE_CXX_COMPILER_ID}")

310
    option( SCALFMM_USE_MKL_AS_BLAS "Set to ON to use MKL CBLAS" OFF )
311

312
    if( SCALFMM_USE_MKL_AS_BLAS )
313
      set(BLA_VENDOR "Intel10_64lp_seq")
COULAUD Olivier's avatar
COULAUD Olivier committed
314
      find_package(BLASEXT QUIET) # not REQUIRED
315

316
      if(BLAS_LIBRARY_DIRS)
317 318 319 320 321 322 323
        # the RPATH to be used when installing
        list(APPEND CMAKE_INSTALL_RPATH "${BLAS_LIBRARY_DIRS}")
      endif()
      unset(LAPACK_LIBRARIES)
      if (BLAS_LIBRARIES)
        set(BLASLAPACK_LIBRARIES ${BLAS_LIBRARIES})
      endif()
324
    elseif(SCALFMM_USE_EXTERNAL_BLAS)
325
      message(STATUS "BLAS SET BY EXTERNAL PROGRAM = ${BLAS_LIBRARIES}")
326
    else()
327 328
      find_package(BLASEXT)  # not REQUIRED
      find_package(LAPACKEXT)  # not REQUIRED
329 330 331 332 333 334 335
      set(BLASLAPACK_LIBRARIES)
      if (LAPACK_LIBRARIES)
        set(BLASLAPACK_LIBRARIES "${LAPACK_LIBRARIES}")
      endif()
      if (BLAS_LIBRARIES)
        list(APPEND BLASLAPACK_LIBRARIES "${BLAS_LIBRARIES}")
      endif()
336
    endif()
337

338
    if(BLAS_FOUND)
COULAUD Olivier's avatar
COULAUD Olivier committed
339 340
      set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${BLASLAPACK_LIBRARIES}")
      #message(STATUS "SCALFMM_LIBRARIES          = ${SCALFMM_LIBRARIES}")
341
    else()
COULAUD Olivier's avatar
COULAUD Olivier committed
342 343 344
      message(WARNING "BLAS has not been found, SCALFMM will continue to compile but some applications will be disabled.")
      message(WARNING "If you have BLAS set BLAS_LIBDIR, BLAS_INCDIR or BLAS_DIR (CMake variables using -D or environment variables).")        
      set(SCALFMM_USE_BLAS OFF)
345
    endif()
346

347
  endif(SCALFMM_USE_BLAS)
348 349 350 351
  list(APPEND FUSE_LIST "BLAS")
  #
  # FFT option
  #
352
  CMAKE_DEPENDENT_OPTION(SCALFMM_USE_MKL_AS_FFTW "Set to ON to use MKL FFTW" ON  "SCALFMM_USE_FFT;SCALFMM_USE_MKL_AS_BLAS" OFF )
353
  if( SCALFMM_USE_FFT )
354 355
    message(STATUS "SCALFMM USE FFT Configure:")

356
    if( SCALFMM_USE_MKL_AS_FFTW )
357 358 359

      message(STATUS "         SCALFMM USE MKL ")

360
      if( SCALFMM_USE_MKL_AS_BLAS )
361 362 363 364

        unset(FFT_LIBRARIES CACHE)
        message(STATUS "         SCALFMM USE MKL already defined")
        set(FFT_INCLUDES "$ENV{MKLROOT}/include/fftw" CACHE STRING "Set your MKL flags")
365
        if (BLAS_FOUND)
COULAUD Olivier's avatar
COULAUD Olivier committed
366
          set(FFTW_FOUND ON)
367
        endif()
368

369
      else(SCALFMM_USE_MKL_AS_BLAS)
370 371 372 373

        # The package can be used with the following COMPONENTS:
        # MKL, THREADS|OMP and/or SIMPLE|DOUBLE|LONG|QUAD
        # Default is DOUBLE and without THREADS|OMP
374
        find_package(FFTW  COMPONENTS MKL) # not REQUIRED
375
        if (FFTW_LIBRARY_DIRS_DEP)
COULAUD Olivier's avatar
COULAUD Olivier committed
376
          set(FFT_LIBRARIES "-L${FFTW_LIBRARY_DIRS_DEP};" CACHE STRING "Set your MKL flags")
377 378
        endif()
        if (FFTW_LIBRARIES_DEP)
COULAUD Olivier's avatar
COULAUD Olivier committed
379 380 381
          foreach (fft_lib ${FFTW_LIBRARIES_DEP})
            set(FFT_LIBRARIES "${FFT_LIBRARIES};${fft_lib};")
          endforeach()
382
        endif()
383
        set(FFT_INCLUDES "${FFTW_INCLUDE_DIRS_DEP}" )
384
        if (FFT_LIBRARIES)
COULAUD Olivier's avatar
COULAUD Olivier committed
385
          set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${FFT_LIBRARIES}")
386
        endif()
387

388
      endif(SCALFMM_USE_MKL_AS_BLAS)
389

390
    else(SCALFMM_USE_MKL_AS_FFTW)
391 392 393 394 395

      message(STATUS "         SCALFMM USE FFTW ")
      # The package can be used with the following COMPONENTS:
      # MKL, THREADS|OMP and/or SIMPLE|DOUBLE|LONG|QUAD
      # Default is DOUBLE and without THREADS|OMP
396
      find_package(FFTW COMPONENTS SIMPLE) # not REQUIRED
397 398 399 400 401
      if (FFTW_LIBRARY_DIRS_DEP)
        set(FFT_LIBRARIES "-L${FFTW_LIBRARY_DIRS_DEP};" CACHE STRING "Set your MKL flags")
      endif()
      if (FFTW_LIBRARIES_DEP)
        foreach (fft_lib ${FFTW_LIBRARIES_DEP})
402
          set(FFT_LIBRARIES "${FFT_LIBRARIES};${fft_lib};")
403 404
        endforeach()
      endif()
405
      set(FFT_INCLUDES "${FFTW_INCLUDE_DIRS_DEP}" )
406
      if (FFT_LIBRARIES)
407
        set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${FFT_LIBRARIES}")
408
      endif()
409

410
    endif(SCALFMM_USE_MKL_AS_FFTW)
411 412

    if (FFT_INCLUDES)
COULAUD Olivier's avatar
COULAUD Olivier committed
413
      set(SCALFMM_INCLUDES "${SCALFMM_INCLUDES}; ${FFT_INCLUDES}")
414
    endif()
415

416
    if(FFTW_FOUND)
COULAUD Olivier's avatar
COULAUD Olivier committed
417 418
      message(STATUS "         SCALFMM_LIBRARIES          = ${SCALFMM_LIBRARIES}")
      message(STATUS "         SCALFMM_INCLUDES          = ${SCALFMM_INCLUDES}")
419
    else()
COULAUD Olivier's avatar
COULAUD Olivier committed
420 421 422
      message(WARNING "FFTW has not been found, SCALFMM will continue to compile but some applications will be disabled.")
      message(WARNING "If you have FFTW set FFTW_LIBDIR, FFTW_INCDIR or FFTW_DIR (CMake variables using -D or environment variables).")        
      set(SCALFMM_USE_FFT OFF)
423
    endif()
424
  endif(SCALFMM_USE_FFT)
425
  list(APPEND FUSE_LIST "FFT")
COULAUD Olivier's avatar
COULAUD Olivier committed
426 427
  message(STATUS "         SCALFMM_LIBRARIES          = ${SCALFMM_LIBRARIES}")
  message(STATUS "         SCALFMM_INCLUDES          = ${SCALFMM_INCLUDES}")
428
  
COULAUD Olivier's avatar
??  
COULAUD Olivier committed
429
  message(STATUS "SCALFMM_USE_FFT       =  ${SCALFMM_USE_FFT}")
430 431 432 433 434 435 436

  #
  # C++ 2011
  message( STATUS "CMAKE_SYSTEM:   ${CMAKE_SYSTEM}  CMAKE_CXX_COMPILER_ID ${CMAKE_CXX_COMPILER_ID}  CMAKE_CXX_COMPILER ${NAME}")
  if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
    execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE INTEL_VERSION)
    message( STATUS "Intel:   ${INTEL_VERSION}")
437
    set(SCALFMM_CXX_FLAGS "${SCALFMM_CXX_FLAGS} -Wall")
438 439
  else()
    # Compile option valid on GCC/G++
440
    set(SCALFMM_CXX_FLAGS "${SCALFMM_CXX_FLAGS} -Wall -Wshadow -Wpointer-arith -Wcast-qual -Wconversion -Wcast-qual -Wcast-align -Woverloaded-virtual")
441
  endif()
442 443
  #
  ##################################################################
COULAUD Olivier's avatar
??  
COULAUD Olivier committed
444
  #              STARPU Section
445 446
  ##################################################################
  #
447 448
  message( STATUS "SCALFMM_USE_STARPU             = ${SCALFMM_USE_STARPU}" )
  if( SCALFMM_USE_STARPU )
449
    # CUDA could be used with StarPU enabled
450 451 452
    option( SCALFMM_USE_CUDA "Set to ON to use CUDA with StarPU" OFF )
    message( STATUS "SCALFMM_USE_CUDA             = ${SCALFMM_USE_CUDA}" )
    if(SCALFMM_USE_CUDA)
COULAUD Olivier's avatar
COULAUD Olivier committed
453 454 455 456 457
      execute_process(COMMAND nvcc --version ERROR_VARIABLE cuda_error_output OUTPUT_QUIET)
      if(cuda_error_output)
        message( FATAL_ERROR "nvcc is needed with CUDA." )
      endif()
      if(NOT DEFINED CUSTOM_CUDA_FLAGS)
458
        set( CUSTOM_CUDA_FLAGS "-std=c++11;-arch=sm_20;-ptxas-options=-v;-use_fast_math" CACHE
COULAUD Olivier's avatar
COULAUD Olivier committed
459 460 461 462 463
          STRING "Set your CUDA flags, for example : -arch=sm_20;-ptxas-options=-v;-use_fast_math")
      endif()
      # This is needed to remove backslash after space in ADD_CUSTOM_COMMAND
      separate_arguments(CUSTOM_CUDA_FLAGS)
      message( STATUS "CUSTOM_CUDA_FLAGS             = ${CUSTOM_CUDA_FLAGS}" )
464

COULAUD Olivier's avatar
COULAUD Olivier committed
465
      find_package(CUDA REQUIRED)
466

COULAUD Olivier's avatar
COULAUD Olivier committed
467 468 469 470 471 472 473
      if (CUDA_INCLUDE_DIRS)
        include_directories(${CUDA_INCLUDE_DIRS})
      endif()
      if (CUDA_LIBRARIES)
        set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${CUDA_LIBRARIES}")
      endif()
      
474
      set(CUDA_NEEDED_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/Src)
475 476 477
    endif()

    # Find StarPU with a list of optional components
478
    set(SCALFMM_STARPU_VERSION "1.1" CACHE STRING "oldest STARPU version desired")
479 480
    # create list of components in order to make a single call to find_package(starpu...)
    set(STARPU_COMPONENT_LIST "HWLOC")
481
    if(SCALFMM_USE_MPI)
COULAUD Olivier's avatar
COULAUD Olivier committed
482
      list(APPEND STARPU_COMPONENT_LIST "MPI")
483
    endif()
484
    if(SCALFMM_USE_CUDA)
COULAUD Olivier's avatar
COULAUD Olivier committed
485
      list(APPEND STARPU_COMPONENT_LIST "CUDA")
486
    endif()
487

488
    find_package(STARPU ${SCALFMM_STARPU_VERSION} REQUIRED
COULAUD Olivier's avatar
COULAUD Olivier committed
489
      COMPONENTS ${STARPU_COMPONENT_LIST})
490

491
    # Append list of libraries and include dirs
492 493 494
    include_directories(${STARPU_INCLUDE_DIRS_DEP})
    foreach (starpu_libdir ${STARPU_LIBRARY_DIRS_DEP})
      if (${starpu_libdir} MATCHES "^ *-L")
COULAUD Olivier's avatar
COULAUD Olivier committed
495
        set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${starpu_libdir}")
496
      else()
COULAUD Olivier's avatar
COULAUD Olivier committed
497
        set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};-L${starpu_libdir}")
498 499 500 501
      endif()
    endforeach()
    foreach (starpu_lib ${STARPU_LIBRARIES_DEP})
      if (EXISTS ${starpu_lib} OR ${starpu_lib} MATCHES "^ *-")
COULAUD Olivier's avatar
COULAUD Olivier committed
502
        set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${starpu_lib}")
503
      else()
COULAUD Olivier's avatar
COULAUD Olivier committed
504
        set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};-l${starpu_lib}")
505 506
      endif()
    endforeach()
507

508
    # TODO: is this very useful? CUDA is already a component of find starpu
509
    if (CUDA_LIBRARIES)
COULAUD Olivier's avatar
COULAUD Olivier committed
510
      set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${CUDA_LIBRARIES}")
511
    endif()
Florent Pruvost's avatar
Florent Pruvost committed
512

513
    # Message
514 515
    message(STATUS "         STARPU_LIBRARIES          = ${STARPU_LIBRARIES}")
    if (STARPU_INCLUDE_DIRS)
COULAUD Olivier's avatar
COULAUD Olivier committed
516 517
      message(STATUS "         STARPU_INCLUDES           = ${STARPU_INCLUDE_DIRS}")
      set(SCALFMM_INCLUDES  "${SCALFMM_INCLUDES}; ${STARPU_INCLUDE_DIRS}")
518
    endif()
519

520
    # TODO: replace this by a component of find starpu
521 522 523
    OPTION( SCALFMM_USE_OPENCL      "Set to ON to use OPENCL with StarPU" OFF )
    MESSAGE( STATUS "SCALFMM_USE_OPENCL             = ${SCALFMM_USE_OPENCL}" )
    if(SCALFMM_USE_OPENCL)
COULAUD Olivier's avatar
COULAUD Olivier committed
524 525
      include_directories($ENV{OPENCL_INC})
      SET(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};-L$ENV{OPENCL_LIB};-lOpenCL")
BRAMAS Berenger's avatar
BRAMAS Berenger committed
526
    endif()
527
  endif(SCALFMM_USE_STARPU)
528
  list(APPEND FUSE_LIST "STARPU")
Florent Pruvost's avatar
Florent Pruvost committed
529
  list(APPEND FUSE_LIST "CUDA")
BRAMAS Berenger's avatar
BRAMAS Berenger committed
530
  list(APPEND FUSE_LIST "OPENCL")
Florent Pruvost's avatar
Florent Pruvost committed
531

532 533 534 535
  ##################################################################
  #                         Use SSE                                #
  ##################################################################

536 537 538 539
  message( STATUS "SCALFMM_USE_SSE              = ${SCALFMM_USE_SSE}" )
  if( SCALFMM_USE_SSE )
    if(NOT EXISTS ${SCALFMM_CMAKE_MODULE_PATH}/compileTestSse.cpp)
      message(FATAL_ERROR "The CompileTestSseFile does not exist (${SCALFMM_CMAKE_MODULE_PATH}/compileTestSse.cpp)" )
540 541 542
    endif()
    message( STATUS "SSE_FLAGS ${SSE_FLAGS}  -- ${CMAKE_CXX_FLAGS}  ")
    try_compile(COMPILE_SSE  ${CMAKE_CURRENT_BINARY_DIR}
COULAUD Olivier's avatar
COULAUD Olivier committed
543 544 545
      ${SCALFMM_CMAKE_MODULE_PATH}/compileTestSse.cpp
      COMPILE_DEFINITIONS "${CMAKE_CXX_FLAGS} ${SSE_FLAGS}"
      OUTPUT_VARIABLE COMPILE_SSE_OUTPUT)
546 547

    if(${COMPILE_SSE})
548
      set(SCALFMM_CXX_FLAGS "${SCALFMM_CXX_FLAGS} ${SSE_FLAGS}")
549 550

      try_compile(COMPILE_RESULT_VAR ${CMAKE_CURRENT_BINARY_DIR}
COULAUD Olivier's avatar
COULAUD Olivier committed
551 552
        ${SCALFMM_CMAKE_MODULE_PATH}/checkSSEpe.cpp
        COMPILE_DEFINITIONS "${CMAKE_CXX_FLAGS} ${SSE_FLAGS}")
553 554 555
      if( NOT ${COMPILE_RESULT_VAR})
        set(__SSEPE_INTEL_COMPILER ON)
      endif()
556
      #set(SCALFMM_USE_AVX OFF)
557
    else(${COMPILE_SSE})
558
      message(FATAL_ERROR "SSE NOT SUPPORTED ; Set SCALFMM_USE_SSE  to OFF \n Output from test is : ${COMPILE_SSE_OUTPUT}")
559 560 561
    endif(${COMPILE_SSE})
  endif()
  list(APPEND FUSE_LIST "SSE")
562

563 564 565 566
  ##################################################################
  #                           Use AVX                              #
  ##################################################################

567 568 569 570
  message(STATUS "SCALFMM_USE_AVX               = ${SCALFMM_USE_AVX}")
  if(SCALFMM_USE_AVX)
    if(NOT EXISTS ${SCALFMM_CMAKE_MODULE_PATH}/compileTestAvx.cpp)
      message(FATAL_ERROR "The CompileTestSseFile does not exist (${SCALFMM_CMAKE_MODULE_PATH}/compileTestAvx.cpp)" )
571 572 573
    endif()

    try_compile(COMPILE_AVX ${CMAKE_CURRENT_BINARY_DIR}
COULAUD Olivier's avatar
COULAUD Olivier committed
574 575 576 577 578 579
      ${SCALFMM_CMAKE_MODULE_PATH}/compileTestAvx.cpp
      COMPILE_DEFINITIONS "${CMAKE_CXX_FLAGS} ${AVX_FLAGS}"
      OUTPUT_VARIABLE COMPILE_AVX_OUTPUT)
    if(${COMPILE_AVX})
      message(STATUS "%%%%%%%%%%%% COMPILE_AVX               = ${COMPILE_AVX}  %%%%<    ${AVX_FLAGS}")
      
580
      set(SCALFMM_CXX_FLAGS "${SCALFMM_CXX_FLAGS}   ${AVX_FLAGS}")
COULAUD Olivier's avatar
COULAUD Olivier committed
581 582
      message(STATUS "%%%%%%%%%%%% SCALFMM_CXX_FLAGS               = ${SCALFMM_CXX_FLAGS}")
      #set( SCALFMM_USE_SSE   OFF   FORCE) # ne marche pas
583
      try_compile(COMPILE_RESULT_AVSPE ${CMAKE_CURRENT_BINARY_DIR}
COULAUD Olivier's avatar
COULAUD Olivier committed
584 585 586
        ${SCALFMM_CMAKE_MODULE_PATH}/checkAVXpe.cpp
        COMPILE_DEFINITIONS "${CMAKE_CXX_FLAGS} ${AVX_FLAGS}")
      if( NOT ${COMPILE_RESULT_AVSPE})
587 588


589
        set(__AVXPE_INTEL_COMPILER ON)
COULAUD Olivier's avatar
COULAUD Olivier committed
590
      endif()
591 592 593

      message(STATUS ${CMAKE_CXX_FLAGS} )
    else(${COMPILE_AVX})
594
      message(FATAL_ERROR "AVX NOT SUPPORTED ; Set SCALFMM_USE_AVX  to OFF \n Output from test is : ${COMPILE_AVX_OUTPUT} ")
595
    endif(${COMPILE_AVX})
596
  endif(SCALFMM_USE_AVX)
597 598
  list(APPEND FUSE_LIST "AVX")
  #
599
  # Error if both SCALFMM_USE_AVX AND SCALFMM_USE_SSE are set
600
  #
601 602 603
  if( SCALFMM_USE_AVX AND SCALFMM_USE_SSE)
    message(FATAL_ERROR "Check SCALFMM_USE_SSE or SCALFMM_USE_AVX BUT NOT BOTH. ")
  endif(SCALFMM_USE_AVX AND SCALFMM_USE_SSE)
604
  ##################################################################
605 606 607 608 609 610 611 612 613 614
  #                           Use AVX2                             #
  ##################################################################

  message(STATUS "SCALFMM_USE_AVX2               = ${SCALFMM_USE_AVX2}")
  if(SCALFMM_USE_AVX2)
    if(NOT EXISTS ${SCALFMM_CMAKE_MODULE_PATH}/compileTestAvx2.cpp)
      message(FATAL_ERROR "The CompileTestSseFile does not exist (${SCALFMM_CMAKE_MODULE_PATH}/compileTestAvx.cpp)" )
    endif()

    try_compile(COMPILE_AVX2 ${CMAKE_CURRENT_BINARY_DIR}
COULAUD Olivier's avatar
COULAUD Olivier committed
615 616 617
      ${SCALFMM_CMAKE_MODULE_PATH}/compileTestAvx2.cpp
      COMPILE_DEFINITIONS "${CMAKE_CXX_FLAGS} ${AVX2_FLAGS}"
      OUTPUT_VARIABLE COMPILE_AVX2_OUTPUT)
618 619 620 621
    if(${COMPILE_AVX2})
      set(SCALFMM_CXX_FLAGS "${SCALFMM_CXX_FLAGS}   ${AVX2_FLAGS}")
      #set( SCALFMM_USE_SSE   OFF   FORCE) # ne marche pas
      try_compile(COMPILE_RESULT_AVSPE ${CMAKE_CURRENT_BINARY_DIR}
COULAUD Olivier's avatar
COULAUD Olivier committed
622 623
        ${SCALFMM_CMAKE_MODULE_PATH}/checkAVX2pe.cpp
        COMPILE_DEFINITIONS "${CMAKE_CXX_FLAGS} ${AVX2_FLAGS}")
624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640
      if( NOT ${COMPILE_RESULT_AVSPE})
        set(__AVX2PE_INTEL_COMPILER ON)
      endif()

      message(STATUS ${CMAKE_CXX_FLAGS} )
    else(${COMPILE_AVX2})
      message(FATAL_ERROR "AVX2 NOT SUPPORTED ; Set SCALFMM_USE_AVX2  to OFF \n Output from test is : ${COMPILE_AVX_OUTPUT} ")
    endif(${COMPILE_AVX2})
  endif(SCALFMM_USE_AVX2)
  list(APPEND FUSE_LIST "AVX2")
  #
  # Error if both SCALFMM_USE_AVX2 AND SCALFMM_USE_SSE are set
  #
  if( SCALFMM_USE_AVX2 AND SCALFMM_USE_SSE)
    message(FATAL_ERROR "Check SCALFMM_USE_SSE or SCALFMM_USE_AVX2 BUT NOT BOTH. ")
  endif(SCALFMM_USE_AVX2 AND SCALFMM_USE_SSE)
  ##################################################################
641 642
  #                     Use  native MIC compilation                #
  ##################################################################
643
  if( SCALFMM_USE_MIC_NATIVE )
644 645
    include(CheckCCompilerFlag)
    check_c_compiler_flag(-mmic HAS_MMIC_FLAG)
646
    if(NOT HAS_MMIC_FLAG)
647
      message(FATAL_ERROR "MIC NOT SUPPORTED ; Set SCALFMM_USE_MIC_NATIVE to OFF")
648 649 650
    endif()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmic")
  else()
651
    #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -xhost")
652 653 654 655
  endif()
  list(APPEND FUSE_LIST "MIC")
  ##################################################################
  #
COULAUD Olivier's avatar
COULAUD Olivier committed
656 657
  #   Set EZTRACE
  #
658
  ##################################################################
COULAUD Olivier's avatar
COULAUD Olivier committed
659 660 661 662
  If(SCALFMM_USE_EZTRACE)
    find_package (PkgConfig)
    if(PKG_CONFIG_FOUND)
      set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH "ON")
COULAUD Olivier's avatar
COULAUD Olivier committed
663
      pkg_search_module( EZTrace REQUIRED eztrace)
COULAUD Olivier's avatar
COULAUD Olivier committed
664
      if(EZTrace_FOUND)
COULAUD Olivier's avatar
COULAUD Olivier committed
665 666 667
        link_directories(${EZTrace_LIBRARY_DIRS})
        link_libraries( ${EZTrace_LIBRARIES})
        IF( SCALFMM_USE_MPI )
COULAUD Olivier's avatar
COULAUD Olivier committed
668
          link_libraries(-leztrace-autostart-mpi)
669 670 671 672 673 674 675 676 677
  ENDIF(SCALFMM_USE_MPI)     
  include_directories(${EZTrace_INCLUDE_DIRS})
  MESSAGE(STATUS "EZTRACE:  ${EZTrace_INCLUDE_DIRS}   ${EZTrace_LIBRARY_DIRS}  ${EZTrace_LIBRARIES}")
  CMAKE_DEPENDENT_OPTION(SCALFMM_TRACE_ALGO "Set to ON to trace the full algorithm (all operators)" ON  "SCALFMM_USE_EZTRACE" OFF )
  CMAKE_DEPENDENT_OPTION(SCALFMM_TRACE_P2M   "Set to ON to trace P2M operator" OFF  "SCALFMM_USE_EZTRACE" OFF )
  CMAKE_DEPENDENT_OPTION(SCALFMM_TRACE_M2M   "Set to ON to trace M2M operator" OFF  "SCALFMM_USE_EZTRACE" OFF )
  CMAKE_DEPENDENT_OPTION(SCALFMM_TRACE_M2L   "Set to ON to trace M2L operator" OFF  "SCALFMM_USE_EZTRACE" OFF )
  CMAKE_DEPENDENT_OPTION(SCALFMM_TRACE_L2L   "Set to ON to trace L2L operator" OFF  "SCALFMM_USE_EZTRACE" OFF )
  CMAKE_DEPENDENT_OPTION(SCALFMM_TRACE_P2P   "Set to ON to trace P2P operator" OFF  "SCALFMM_USE_EZTRACE" OFF )
COULAUD Olivier's avatar
COULAUD Olivier committed
678
      else(EZTrace_FOUND)
679 680
  MESSAGE(WARNING "Eztrace not found - EZTRACE Is set to OFF")
  set(SCALFMM_USE_EZTRACE OFF)  
COULAUD Olivier's avatar
COULAUD Olivier committed
681
      endif(EZTrace_FOUND)
COULAUD Olivier's avatar
COULAUD Olivier committed
682
    else(PKG_CONFIG_FOUND)
COULAUD Olivier's avatar
COULAUD Olivier committed
683
      MESSAGE(WARNING "PKG-CONFIG not found - EZTRACE Is set to OFF")
COULAUD Olivier's avatar
COULAUD Olivier committed
684 685 686 687
      set(SCALFMM_USE_EZTRACE OFF)
    endif(PKG_CONFIG_FOUND)

  endif(SCALFMM_USE_EZTRACE)
688 689 690 691 692 693 694
  
  ##################################################################
  #
  #   To catch signals
  #
  ##################################################################  
    if((WIN32 OR (${CMAKE_SYSTEM_NAME} MATCHES "Windows")) AND SCALFMM_USE_SIGNALS)
695 696
      # We are on Windows and we cannot catch signals
      message( FATAL_ERROR "Catching the signals requieres an UNIX system." )
697
    else()
COULAUD Olivier's avatar
COULAUD Olivier committed
698
        IF( NOT APPLE)
699 700 701
        SET(SCALFMM_CXX_FLAGS "${SCALFMM_CXX_FLAGS} -rdynamic")
        ENDIF()
        
702
    endif()
703 704 705 706 707 708 709 710
  ##################################################################
  #                                                                #
  #                     END SETTING VARIABLES                      #
  #                                                                #
  ##################################################################
  #
  # Generate  ScalFmmConfig.h
  #
711
  set(SCALFMM_COMPILE_FLAGS "${SCALFMM_CXX_FLAGS} ${CMAKE_CXX_FLAGS_TYPE} ${CMAKE_CXX_FLAGS}")
712
  set(CMAKE_CXX_FLAGS "${SCALFMM_COMPILE_FLAGS}")
713 714 715
  # We need the libraries without spaces (inside the config file)
  set(SCALFMM_COMPILE_LIBS   "")
  foreach(lib_var ${SCALFMM_LIBRARIES})
COULAUD Olivier's avatar
COULAUD Olivier committed
716 717
    string(STRIP ${lib_var} lib_var)
    LIST(APPEND SCALFMM_COMPILE_LIBS   ${lib_var})        
718
  endforeach()
719
  configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/Src/ScalFmmConfig.h.cmake
720
    ${CMAKE_CURRENT_BINARY_DIR}/Src/ScalFmmConfig.h  )
721 722 723 724 725 726 727 728 729 730 731 732
  #
  ##################################################################
  #                      Build - lib                               #
  ##################################################################
  #
  add_subdirectory(Src)
  # Link with scalfmm lib
  set(scalfmm_lib scalfmm)
  #
  ##################################################################
  #            Remove compilation  of the drivers                  #
  ##################################################################
733
  if( SCALFMM_BUILD_EXAMPLES )
734 735 736 737 738 739 740
    # Build - Examples and drivers
    add_subdirectory(Examples)
  endif()
  ##################################################################
  #           Build tools (Internal use)                           #
  ##################################################################
  # Build - UTILs
741
  if( SCALFMM_ONLY_DEVEL AND SCALFMM_BUILD_UTILS)
742
    add_subdirectory(Utils)
743
  endif()
744

745 746 747 748
  ##################################################################
  #                Build -Tests to see examples                    #
  ##################################################################
  # Build - Tests
749 750
  message( STATUS "SCALFMM_BUILD_TESTS          = ${SCALFMM_BUILD_TESTS}" )
  if( SCALFMM_BUILD_TESTS )
751 752
    add_subdirectory(Tests)
  endif()
berenger-bramas's avatar
berenger-bramas committed
753

754 755 756 757
  ##################################################################
  #              Build - Unitary and numerical Tests               #
  ##################################################################
  #
758 759
  message( STATUS "SCALFMM_BUILD_UTESTS         = ${SCALFMM_BUILD_UTESTS}" )
  if( SCALFMM_BUILD_UTESTS )
760 761 762 763
    include(CTest)
    enable_testing()
    add_subdirectory(UTests)
  endif()
berenger-bramas's avatar
berenger-bramas committed
764

765 766 767
  ##################################################################
  #                           Add - doc                            #
  ##################################################################
768 769 770
  if(SCALFMM_BUILD_DOC)
    add_subdirectory(Doc)
  endif()
771 772 773 774
  ##################################################################
  #                       Build - Addons                           #
  ##################################################################
  #
775
  if( SCALFMM_USE_ADDONS )
776 777
    file(GLOB all_addons ./Addons/*)
    # Options
778
    option( SCALFMM_ADDON_CKERNELAPI "Set to ON to build ScaFMM FMM API interface" OFF )
779

780 781 782 783
    foreach(addon_name ${all_addons})
      message(STATUS "Addons += ${addon_name}" )
      add_subdirectory(${addon_name})
    endforeach()
784
  endif()
785

786 787 788 789 790 791 792 793 794 795 796 797 798 799 800
  # Add custom clean command
  if("${CMAKE_GENERATOR}" MATCHES "Make")
    add_custom_target(reset
      COMMAND ${CMAKE_MAKE_PROGRAM} clean && rm -r ./CMake* && cmake ..
      WORKING_DIRECTORY ${CMAKE_CURRENT_DIR}
      COMMENT "Cleaning Build dir and CMake cache, then do cmake.."
      )
  endif()
  #
  ##################################################################
  #                                                                #
  #                  Build and export cmake files                  #
  #                                                                #
  ##################################################################
  #
801 802 803
  message(STATUS "SCALFMM_BINARY_DIR:          " ${SCALFMM_BINARY_DIR})
  configure_file(${SCALFMM_SOURCE_DIR}/ScalFMMConfig.cmake.in
    ${SCALFMM_BINARY_DIR}/ScalFMMConfig.cmake
804 805 806
    @ONLY IMMEDIATE
    )
  #
807 808 809
  install(FILES  ${SCALFMM_BINARY_DIR}/ScalFMMConfig.cmake  DESTINATION lib/  )
  if( SCALFMM_INSTALL_DATA )
    install(FILES  ${SCALFMM_SOURCE_DIR}/Data/test20k.fma  DESTINATION Data/   )
810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829
  endif()

  ##################################################################
  #                                                                #
  #              build a CPack driven installer package            #
  #                                                                #
  ##################################################################
  #
  # Use git commit number as CPACK_PACKAGE_VERSION_PATCH
  set(CPACK_PACKAGE_VERSION_PATCH 0)
  execute_process(
    COMMAND git rev-list HEAD --count
    OUTPUT_VARIABLE CPACK_PACKAGE_VERSION_PATCH
    RESULT_VARIABLE RET
    ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
    )
  #string_TRIM(PATCH1 PATCH)
  set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY "ON")
  #
  set (CPACK_RESOURCE_FILE_LICENSE  "${CMAKE_CURRENT_SOURCE_DIR}/Licence.txt")
830 831
  set(CPACK_PACKAGE_VERSION_MAJOR "${SCALFMM_MAJOR_VERSION}")
  set(CPACK_PACKAGE_VERSION_MINOR "${SCALFMM_MINOR_VERSION}")
832
  #
833
  set(PACK_PACKAGE_VERSION "${SCALFMM_MAJOR_VERSION}.${SCALFMM_MINOR_VERSION}-${CPACK_PACKAGE_VERSION_PATCH}")
834
  set(CPACK_SOURCE_GENERATOR "TGZ")
835
  set(CPACK_SOURCE_PACKAGE_FILE_NAME  "SCALFMM-${SCALFMM_MAJOR_VERSION}.${SCALFMM_MINOR_VERSION}-${CPACK_PACKAGE_VERSION_PATCH}")
836
  set(CPACK_SOURCE_IGNORE_FILES "\\\\.git;.DS_Store;.*~;/*.aux;/*.idx;/*.log;/*.out;/*.toc;/*.ilg;scalfmm.pro*;org.eclipse.core.resources.prefs;.cproject;.project")
837
  list(APPEND CPACK_SOURCE_IGNORE_FILES  "${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}/Utils/;Notes;Deprecated;/Build*;/noDist/;/Bench;ToRemove;Olivier;Addons/HMat")
838 839 840 841 842 843 844 845 846 847 848 849 850 851 852
  # Uniform;GroupTree;Adaptive;testUnif*;/*Lagrange*")
  #list(APPEND CPACK_SOURCE_IGNORE_FILES  "Stages;Uniform;Adaptive;testUnif*;*Lagrange*" )
  #
  include(CPack)
  #
  #
  ##################################################################
  #                                                                #
  #                      PRINT messages                            #
  #                                                                #
  ##################################################################
  message(STATUS "CPACK_SOURCE_IGNORE_FILES = ${CPACK_SOURCE_IGNORE_FILES}")
  message(STATUS "CPACK_SOURCE_PACKAGE_FILE_NAME = ${CPACK_SOURCE_PACKAGE_FILE_NAME}")
  #
  #                    Use Mem stats
853
  message(STATUS "SCALFMM_USE_MEM_STATS        = ${SCALFMM_USE_MEM_STATS}" )
854
  #                    Use Log
855
  message(STATUS "SCALFMM_USE_LOG              = ${SCALFMM_USE_LOG}" )
856
  #                    Use Assert
857
  message(STATUS "SCALFMM_USE_ASSERT           = ${SCALFMM_USE_ASSERT}" )
858 859
  #
  #message(STATUS "CMAKE_CXX_FLAGS   =  ${CMAKE_CXX_FLAGS}")
860
  #set(CMAKE_CXX_FLAGS "${SCALFMM_CXX_FLAGS} ${CMAKE_CXX_FLAGS}")
COULAUD Olivier's avatar
??  
COULAUD Olivier committed
861 862
  message(STATUS "SCALFMM_USE_BLAS     =  ${SCALFMM_USE_BLAS}")
  message(STATUS "SCALFMM_USE_FFT       =  ${SCALFMM_USE_FFT}")
863
  message(STATUS "SCALFMM_USE_MKL      =   ${SCALFMM_USE_MKL}")
COULAUD Olivier's avatar
COULAUD Olivier committed
864
  # 
865
  message(STATUS "CMAKE_CXX_FLAGS     =  ${CMAKE_CXX_FLAGS}")
866
  message(STATUS "SCALFMM_CXX_FLAGS   =  ${SCALFMM_CXX_FLAGS}")
867 868 869 870 871 872
  message(STATUS "SCALFMM_LIBRARIES   =  ${SCALFMM_LIBRARIES}")
  message(STATUS "SCALFMM_INCLUDES    =  ${SCALFMM_INCLUDES}")
  ##################################################################
  #                               END                              #
  ##################################################################

873
else(MORSE_DISTRIB_DIR OR EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/morse/")
874 875 876 877 878 879 880

  message(STATUS "MORSE_DISTRIB_DIR is not set")
  message(STATUS "Please indicate where is located your MORSE distribution directory."
    " This is necessary to find cmake_modules.")
  message(STATUS "If you are a MORSE developer, you normally have access to the svn repository of the MORSE_DISTRIB_DIR: "
    "svn checkout svn+ssh://yourlogin@scm.gforge.inria.fr/svnroot/morse/trunk/morse_distrib")

881
endif(MORSE_DISTRIB_DIR OR EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/morse/")