CMakeLists.txt 43.6 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 NEW)
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)
COULAUD Olivier's avatar
COULAUD Olivier committed
37
set(SCALFMM_MINOR_VERSION 5)
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
  endif()
  include(MorseInit)
56
57
58
59
60
61
62
63
64
65
  # Set the RPATH config
  # --------------------
  # use, i.e. don't skip the full RPATH for the build tree
  set(CMAKE_SKIP_BUILD_RPATH  FALSE)
  # when building, don't use the install RPATH already
  # (but later on when installing)
  set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
  # the RPATH to be used when installing
  set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")

66
67
68
69
  # Build ScalFmm as static or dynamic lib
  # --------------------------------------
  option(BUILD_SHARED_LIBS "Build shared libraries" OFF)

70
71
  #
  # Options
72
  #
73
74
75
76
77
78
79
  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 )
80
  option( SCALFMM_BUILD_DOC            "Set to ON to build the Doxygen documentation " OFF )
81
82
83
84
85
  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 )
86
  option( SCALFMM_USE_SIGNALS          "Set to ON to catch various signal an print backtrace"  OFF )
87
88
  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  )
89
  option( SCALFMM_ONLY_DEVEL           "Set to ON to compile Development tools (only scalfmm team)" OFF )
90
91
92
93
  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 )

94
95
96
  #
  #  VECTORISATION
  #
97
  if( APPLE ) # to fix problem with  GCC and avx
COULAUD Olivier's avatar
COULAUD Olivier committed
98
99
    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  )
100
  else(APPLE)
COULAUD Olivier's avatar
COULAUD Olivier committed
101
102
    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  )
103
  endif(APPLE)
104
105
  CMAKE_DEPENDENT_OPTION( SCALFMM_USE_AVX2             "Set to ON to compile with AVX support (and use intrinsec AVX2 P2P)" ON "CPUOPTION_AVX2" OFF )

106
  if( SCALFMM_ONLY_DEVEL )
107
    # OPENMP 4/5 support 
108
    option( OPENMP_SUPPORT_COMMUTE   "Set to ON to let tasks commute (KSTAR/StarPU compiler only)" OFF )
109
    option( OPENMP_SUPPORT_PRIORITY  "Set to ON to enable tasks priority (KSTAR/StarPU compiler only)" OFF )
110
    option( OPENMP_SUPPORT_TASK_NAME "Set to ON to enable a taskname clause for tasks (KSTAR/StarPU compiler only)" OFF )
111
    if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
112
      option( SCALFMM_USE_OMP4 "Set to ON to disable the gcc/intel omp4"    OFF )
113
    else()
114
      option( SCALFMM_USE_OMP4 "Set to ON to disable the gcc/intel omp4"    ON )
115
    endif()
116
    option( SCALFMM_TIME_OMPTASKS "Set to ON to time omp4 tasks and generate output file"    OFF )
117
# SIMGRID and peformance models options
BRAMAS Berenger's avatar
BRAMAS Berenger committed
118
    option( SCALFMM_SIMGRID_NODATA "Set to ON to avoid the allocation of numerical parts in the group tree" OFF )
119
    option( STARPU_SIMGRID_MLR_MODELS "Set to ON to enable MLR models need for calibration and simulation" OFF )
120
121
122
123
124
# 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)
125
    CMAKE_DEPENDENT_OPTION(SCALFMM_USE_STARPU_EXTRACT  "Set to ON to enable extract with StarPU mpi implicit" ON  "SCALFMM_USE_STARPU" OFF)
126
  endif()
127
  message(STATUS "AVANT  ${CMAKE_CXX_COMPILER_ID}" )
128
129
130
  #
  #  MPI
  #
131
  if( SCALFMM_USE_MPI )
132
    try_compile(COMPILE_INTEL ${CMAKE_CURRENT_BINARY_DIR}
COULAUD Olivier's avatar
COULAUD Olivier committed
133
134
      ${SCALFMM_CMAKE_MODULE_PATH}/compileTestIntel.cpp
      COMPILE_DEFINITIONS "${CMAKE_CXX_FLAGS}")
135
136
137
138
139
140
141
    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 "")
142
  set(SCALFMM_CXX_FLAGS "-std=c++14 -fpic -Wall")
143
144
145
146
147
148
149
150
151
152
153
154
  #
  #
  # 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)
155
  message(STATUS "SCALFMM_BUILD_DEBUG = ${SCALFMM_BUILD_DEBUG}" )
156
157
  #
  if(CMAKE_SIZEOF_VOID_P EQUAL 8)
158
    set(SCALFMM_CXX_FLAGS  "${SCALFMM_CXX_FLAGS} -m64")
159
160
161
162
163
164
165
166
167
  endif()
  ##############################################################################
  #                           Compile options                                  #
  ##############################################################################
  #  -xHost -mfpmath=sse
  # -Wall Wnosign-conversion
  #
  if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
    # INTEL
168
    IF (APPLE)
COULAUD Olivier's avatar
COULAUD Olivier committed
169
170
171
172
173
      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)  
174
    else(APPLE)
175
176
      set(AVX_FLAGS  "-fp-model source -march=native -axCORE-AVX2,CORE-AVX-I,AVX") #-mavx
      set(AVX2_FLAGS "-march=native  -axCORE-AVX2,CORE-AVX-I,AVX") #-march=core-avx2
177
      set(SSE_FLAGS  "-axSSE4.2  -march=native")
178
    endif(APPLE)
179
    set(SCALFMM_CXX_FLAGS  "${SCALFMM_CXX_FLAGS} -fma -align -finline-functions")
Marc-Alexandre Espiaut's avatar
Marc-Alexandre Espiaut committed
180
    #-Wshadow -Wpointer-arith -Wcast-qual -Wconversion  -Wall -Wnosign-conversion ")
COULAUD Olivier's avatar
COULAUD Olivier committed
181
182
183
  elseif(CMAKE_CXX_COMPILER_ID STREQUAL "XL")
    set(SCALFMM_CXX_FLAGS  "${SCALFMM_CXX_FLAGS} -mcpu=power8 -mtune=power8")
  else() #if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
Marc-Alexandre Espiaut's avatar
Marc-Alexandre Espiaut committed
184
    # NOT      INTEL
185
    if(NOT SCALFMM_USE_MPI)
186
187
188
      include(CheckCCompilerFlag)
      check_c_compiler_flag(-Wzero-as-null-pointer-constant HAS_WZERO_NULL_PTR_FLAG)
      if(HAS_WZERO_NULL_PTR_FLAG)
189
        set(SCALFMM_CXX_FLAGS  "${SCALFMM_CXX_FLAGS} -Wzero-as-null-pointer-constant")
190
      endif()
191
    else()
192
193
194
      include(CheckCCompilerFlag)
      check_c_compiler_flag(-Wno-literal-suffix HAS_NO_LITERAL_SUFFIX_FLAG)
      if(HAS_NO_LITERAL_SUFFIX_FLAG)
195
        set(SCALFMM_CXX_FLAGS  "${SCALFMM_CXX_FLAGS} -Wno-literal-suffix")
196
      endif()
197
    endif()
198
    IF (APPLE)
COULAUD Olivier's avatar
COULAUD Olivier committed
199
200
201
202
203
204
      #      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)
205
206
      set(AVX_FLAGS "-mtune=native -march=avx")
      set(AVX2_FLAGS "-mtune=native -march=native -mmic")
207
    else(APPLE)
208
209
210
      set(SSE_FLAGS  "-mtune=native -march=native")
      set(AVX_FLAGS "-mtune=native -march=native")
      set(AVX2_FLAGS "-mtune=native -march=native -mmic")
211
212
    endif(APPLE)
  endif()
213

214
215
216
217
218
219
  ##############################################################################
  #                           FUSE list                                        #
  ##############################################################################
  set(FUSE_LIST "")
  # then do list(APPEND FUSE_LIST "BLAS") to protect from FUSE_BLAS
  list(APPEND FUSE_LIST "MPI")
220

221
222
223
224
  ##############################################################################
  #                        Debug      flags                                    #
  ##############################################################################
  #
225
  if( SCALFMM_BUILD_DEBUG )
226
227
228
229
230
231
    #
    # Compile Debug flags
    #
    set(CMAKE_BUILD_TYPE Debug)
    ADD_DEFINITIONS(-O0)
    if( APPLE )
232
      set(SCALFMM_FLAGS_OPTI_DEBUG "-funroll-loops" CACHE STRING
233
234
235
236
237
238
239
240
241
242
243
        "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})
244
    set(SCALFMM_CXX_FLAGS "${SCALFMM_CXX_FLAGS} ${SCALFMM_FLAGS_OPTI_DEBUG}")
245
246
247
248
249
250
    set(CMAKE_CXX_FLAGS_TYPE "${CMAKE_CXX_FLAGS_DEBUG}")

  else()
    ##############################################################################
    #                          Release flags                                     #
    ##############################################################################
251

252
253
254
    set(CMAKE_BUILD_TYPE Release)
    set(CMAKE_CXX_FLAGS_TYPE  "${CMAKE_CXX_FLAGS_RELEASE}")
    # if compiler is intel add -ip
255

BRAMAS Berenger's avatar
BRAMAS Berenger committed
256
    if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
COULAUD Olivier's avatar
COULAUD Olivier committed
257
      set(SCALFMM_CXX_FLAGS  "${SCALFMM_CXX_FLAGS} -ipo  -fstrict-aliasing ")# -no-prec-div -no-prec-sqrt")
BRAMAS Berenger's avatar
BRAMAS Berenger committed
258
    endif()
259
260
    # Compile optimization
    if(APPLE)
261
      set(SCALFMM_FLAGS_OPTI_RELEASE "-funroll-loops" CACHE STRING
262
263
264
        "Set your optimization flags for release mode.")
    else(APPLE)
      # Not apple system - Check the compiler flags
COULAUD Olivier's avatar
COULAUD Olivier committed
265
266
267
268
      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.")
269
270
	# set(SCALFMM_FLAGS_OPTI_RELEASE "-funroll-loops -ftree-vectorize" CACHE STRING
	#   "Set your optimization flags for release mode.")
271
272
273
274
275
276
      else()
        set(SCALFMM_FLAGS_OPTI_RELEASE "-ffast-math -funroll-loops -ftree-vectorize" CACHE STRING
          "Set your optimization flags for release mode.")
      endif()
    endif(APPLE)
    #
277
    set(SCALFMM_CXX_FLAGS  "${SCALFMM_CXX_FLAGS} ${SCALFMM_FLAGS_OPTI_RELEASE}")
278
  endif()
COULAUD Olivier's avatar
COULAUD Olivier committed
279
280
  MESSAGE(STATUS   " %%%%%%%%%% SCALFMM_CXX_FLAGS  ${SCALFMM_CXX_FLAGS} %%%%%%%%%%%%%")
  MESSAGE(STATUS   " %%%%%%%%%% CMAKE_CXX_FLAGS_RELEASE  ${CMAKE_CXX_FLAGS_RELEASE} %%%%%%%%%%%%%")
281

282
283
284
285
  #
  ##############################################################################
  #                Attach source code to exec                                  #
  ##############################################################################
286
287
  message(STATUS "SCALFMM_ATTACHE_SOURCE       = ${SCALFMM_ATTACHE_SOURCE}" )
  if( SCALFMM_ATTACHE_SOURCE )
288
    message(STATUS "Option -g is used, the code is attached to the binary." )
289
290
    set(SCALFMM_CXX_FLAGS  "${SCALFMM_CXX_FLAGS} -g")
  endif(SCALFMM_ATTACHE_SOURCE)
291
292
293
294
295
  #
  ##############################################################################
  #                                 find MPI                                   #
  ##############################################################################
  #
296
  if( SCALFMM_USE_MPI )
297
298
299
300
301

    # 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
302
      set(MPI_C_COMPILER mpicc)
303
304
    endif()
    if(NOT MPI_CXX_COMPILER)
COULAUD Olivier's avatar
COULAUD Olivier committed
305
      set(MPI_CXX_COMPILER mpicxx)
306
307
308
309
    endif()

    find_package(MPI REQUIRED)
    if (MPI_CXX_INCLUDE_PATH)
COULAUD Olivier's avatar
COULAUD Olivier committed
310
      include_directories( ${MPI_CXX_INCLUDE_PATH} )
311
312
    endif()
    if (MPI_CXX_COMPILE_FLAGS)
COULAUD Olivier's avatar
COULAUD Olivier committed
313
      set(SCALFMM_CXX_FLAGS "${SCALFMM_CXX_FLAGS} ${MPI_CXX_COMPILE_FLAGS}")
314
315
    endif()
    if (MPI_CXX_INCLUDE_PATH)
316
      set(SCALFMM_INCLUDES  "${SCALFMM_INCLUDES};${MPI_CXX_INCLUDE_PATH}")
317
318
    endif()
    if (MPI_CXX_LINK_FLAGS)
319
      string(REGEX REPLACE " " ";" MPI_CXX_LINK_FLAGS  ${MPI_CXX_LINK_FLAGS} )
COULAUD Olivier's avatar
COULAUD Olivier committed
320
      set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${MPI_CXX_LINK_FLAGS}")
321
322
    endif()
    if (MPI_CXX_LIBRARIES)
COULAUD Olivier's avatar
COULAUD Olivier committed
323
      set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${MPI_CXX_LIBRARIES}")
324
325
326
327
328
329
330
331
    endif()

  endif()
  #
  ##############################################################################
  #                             Blas option                                    #
  ##############################################################################
  #
332
  if( SCALFMM_USE_BLAS )
COULAUD Olivier's avatar
COULAUD Olivier committed
333
334
335
336
337
338
    #   include(FortranCInterface)
    #    # Define a Fortran interface file (FCMangle.hpp)
    #   FortranCInterface_HEADER( ${CMAKE_CURRENT_SOURCE_DIR}/Src/FCMangle.hpp
    #                            MACRO_NAMESPACE "PM_"
    #                           SYMBOL_NAMESPACE "PM_"
    #                           SYMBOLS init testPPM:init)
339
340
    message(STATUS "CMAKE_CXX_COMPILER_ID STREQUAL  ${CMAKE_CXX_COMPILER_ID}")

341
342
    option( SCALFMM_USE_MKL_AS_BLAS  "Set to ON to use MKL BLAS/LAPACK" OFF )
    option( SCALFMM_USE_ESSL_AS_BLAS "Set to ON to use ESSL BLAS/LAPACK" OFF )
343

344
    if( SCALFMM_USE_MKL_AS_BLAS )
345
      set(BLA_VENDOR "Intel10_64lp_seq")
COULAUD Olivier's avatar
COULAUD Olivier committed
346
      find_package(BLASEXT QUIET) # not REQUIRED
347
348
349
350
      unset(LAPACK_LIBRARIES)
      if (BLAS_LIBRARIES)
        set(BLASLAPACK_LIBRARIES ${BLAS_LIBRARIES})
      endif()
351
352
353
354
355
356
357
358
359
360
    elseif(SCALFMM_USE_ESSL_AS_BLAS)
      set(BLA_VENDOR "IBMESSL")
      find_package(BLASEXT   QUIET) # not REQUIRED
      find_package(LAPACKEXT QUIET) # not REQUIRED
      if (LAPACK_LIBRARIES)
        set(BLASLAPACK_LIBRARIES "${LAPACK_LIBRARIES}")
      endif()
      if (BLAS_LIBRARIES)
        list(APPEND BLASLAPACK_LIBRARIES ${BLAS_LIBRARIES})
      endif()
361
    elseif(SCALFMM_USE_EXTERNAL_BLAS)
362
      message(STATUS "BLAS SET BY EXTERNAL PROGRAM = ${BLAS_LIBRARIES}")
363
      list(APPEND BLASLAPACK_LIBRARIES "${BLAS_LIBRARIES}")
364
    else()
365
366
      find_package(BLASEXT)  # not REQUIRED
      find_package(LAPACKEXT)  # not REQUIRED
367
368
369
370
371
372
373
      set(BLASLAPACK_LIBRARIES)
      if (LAPACK_LIBRARIES)
        set(BLASLAPACK_LIBRARIES "${LAPACK_LIBRARIES}")
      endif()
      if (BLAS_LIBRARIES)
        list(APPEND BLASLAPACK_LIBRARIES "${BLAS_LIBRARIES}")
      endif()
374
    endif()
375

376
    if(BLAS_FOUND)
COULAUD Olivier's avatar
COULAUD Olivier committed
377
      set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${BLASLAPACK_LIBRARIES}")
378
379
380
381
382
383
384
385
      if(BLAS_LIBRARY_DIRS)
        # the RPATH to be used when installing
        list(APPEND CMAKE_INSTALL_RPATH "${BLAS_LIBRARY_DIRS}")
      endif()
      if(LAPACK_FOUND AND LAPACK_LIBRARY_DIRS)
        # the RPATH to be used when installing
        list(APPEND CMAKE_INSTALL_RPATH "${LAPACK_LIBRARY_DIRS}")
      endif()
386
      message (STATUS "check BLAS Fortran mangling")
387
388
389
390
391
392
393
394
395
      # add options to let the user be able to force a behavior
      option( SCALFMM_BLAS_ADD_     "Set to ON to force calls to BLAS Fortran symbols with _ (ex: dgemm_)"        OFF )
      option( SCALFMM_BLAS_UPCASE   "Set to ON to force calls to BLAS Fortran symbols in capital (ex: DGEMM)"     OFF )
      option( SCALFMM_BLAS_NOCHANGE "Set to ON to force calls to BLAS Fortran symbols with no change (ex: dgemm)" OFF )
      # if options not changed by user then auto-detection
      if (NOT SCALFMM_BLAS_ADD_ AND NOT SCALFMM_BLAS_UPCASE AND NOT SCALFMM_BLAS_NOCHANGE)
        # give blas libraries and check dgemm symbol
        set(CMAKE_REQUIRED_LIBRARIES "${BLAS_LIBRARIES}")
        check_function_exists(dgemv_ DGEMV_ADD_)
396
        check_function_exists(DGEMV  DGEMV_UPCASE)
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
        check_function_exists(dgemv  DGEMV_NOCHANGE)
        # here we consider that the first kind of symbol found will be the one used
        # current order is: ADD_, UPCASE, NOCHANGE
        if (DGEMV_ADD_)
          set (SCALFMM_BLAS_ADD_     ON)
          set (SCALFMM_BLAS_UPCASE   OFF)
          set (SCALFMM_BLAS_NOCHANGE OFF)
          message (STATUS "BLAS dgemv_ symbol found, SCALFMM_BLAS_ADD_ is ON")
        else (DGEMV_ADD_)
          if (DGEMV_UPCASE)
            set (SCALFMM_BLAS_ADD_     OFF)
            set (SCALFMM_BLAS_UPCASE   ON)
            set (SCALFMM_BLAS_NOCHANGE OFF)
            message (STATUS "BLAS DGEMV symbol found, SCALFMM_BLAS_UPCASE is ON")
          else (DGEMV_UPCASE)
            if (DGEMV_NOCHANGE)
              set (SCALFMM_BLAS_ADD_     OFF)
              set (SCALFMM_BLAS_UPCASE   OFF)
              set (SCALFMM_BLAS_NOCHANGE ON)
              message (STATUS "BLAS dgemv symbol found, SCALFMM_BLAS_NOCHANGE is ON")
            endif (DGEMV_NOCHANGE)
          endif (DGEMV_UPCASE)
        endif (DGEMV_ADD_)
        if ( (NOT DGEMV_ADD_) AND (NOT DGEMV_UPCASE) AND (NOT DGEMV_NOCHANGE) )
          message(FATAL_ERROR "BLAS Fortran mangling is not properly detected - please check your BLAS libraries")
        endif ()
      else  (NOT SCALFMM_BLAS_ADD_ AND NOT SCALFMM_BLAS_UPCASE AND NOT SCALFMM_BLAS_NOCHANGE)
        if (SCALFMM_BLAS_ADD_)
          message (STATUS "SCALFMM_BLAS_ADD_ is set to ON")
        endif()
        if (SCALFMM_BLAS_UPCASE)
          message (STATUS "SCALFMM_BLAS_UPCASE is set to ON")
        endif()
        if (SCALFMM_BLAS_NOCHANGE)
          message (STATUS "SCALFMM_BLAS_NOCHANGE is set to ON")
        endif()
      endif (NOT SCALFMM_BLAS_ADD_ AND NOT SCALFMM_BLAS_UPCASE AND NOT SCALFMM_BLAS_NOCHANGE)
434
    else()
COULAUD Olivier's avatar
COULAUD Olivier committed
435
436
437
      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)
438
    endif()
439

440
  endif(SCALFMM_USE_BLAS)
441
442
443
444
  list(APPEND FUSE_LIST "BLAS")
  #
  # FFT option
  #
445
446
  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 )
  CMAKE_DEPENDENT_OPTION(SCALFMM_USE_ESSL_AS_FFTW "Set to ON to use ESSL FFTW" ON  "SCALFMM_USE_FFT;SCALFMM_USE_ESSL_AS_BLAS" OFF )
447
  if( SCALFMM_USE_FFT )
448
449
    message(STATUS "SCALFMM USE FFT Configure:")

450
451
452
    # The package find_package(FFTW) can be used with the following COMPONENTS:
    # MKL, ESSL, THREADS|OMP and/or SIMPLE|LONG|QUAD
    # Default will find the real double precision fftw library version without THREADS|OMP
453
    if( SCALFMM_USE_MKL_AS_FFTW )
454
455
456
      message(STATUS "         SCALFMM USE FFT from MKL")
      find_package(FFTW COMPONENTS MKL)
    elseif (SCALFMM_USE_ESSL_AS_FFTW)
457
458
459
      message(STATUS "         SCALFMM USE FFT from ESSL ")
      find_package(FFTW COMPONENTS ESSL)
      add_definitions(-DSCALFMM_USE_ESSL_AS_FFTW)
460
    else()
461
462
      message(STATUS "         SCALFMM USE FFTW")
      find_package(FFTW COMPONENTS SIMPLE)
463
    endif()
464

465
466
467
468
469
470
471
472
    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})
        set(FFT_LIBRARIES "${FFT_LIBRARIES};${fft_lib};")
      endforeach()
    endif()
473

474
475
476
477
    set(FFT_INCLUDES "${FFTW_INCLUDE_DIRS_DEP}" )
    if (FFT_LIBRARIES)
      set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${FFT_LIBRARIES}")
    endif()
478

479
480
481
482
    if(FFTW_LIBRARY_DIRS)
      # the RPATH to be used when installing
      list(APPEND CMAKE_INSTALL_RPATH "${FFTW_LIBRARY_DIRS}")
    endif()
483
    if (FFT_INCLUDES)
COULAUD Olivier's avatar
COULAUD Olivier committed
484
      set(SCALFMM_INCLUDES "${SCALFMM_INCLUDES}; ${FFT_INCLUDES}")
485
    endif()
486

487
    if(NOT FFTW_FOUND)
COULAUD Olivier's avatar
COULAUD Olivier committed
488
489
490
      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)
491
    endif()
492

493
  endif(SCALFMM_USE_FFT)
494
  list(APPEND FUSE_LIST "FFT")
COULAUD Olivier's avatar
??    
COULAUD Olivier committed
495
  message(STATUS "SCALFMM_USE_FFT       =  ${SCALFMM_USE_FFT}")
496
497
498
499
500
501
  if (SCALFMM_INCLUDES)
    list(REMOVE_DUPLICATES SCALFMM_INCLUDES)
  endif()
  if (SCALFMM_LIBRARIES)
    list(REMOVE_DUPLICATES SCALFMM_LIBRARIES)
  endif()
502
503
504
505
506
507
508

  #
  # 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}")
509
    set(SCALFMM_CXX_FLAGS "${SCALFMM_CXX_FLAGS} -Wall")
510
511
  else()
    # Compile option valid on GCC/G++
512
    set(SCALFMM_CXX_FLAGS "${SCALFMM_CXX_FLAGS} -Wall -Wshadow -Wpointer-arith -Wcast-qual -Wconversion -Wcast-qual -Wcast-align -Woverloaded-virtual")
513
  endif()
514
515
  #
  ##################################################################
COULAUD Olivier's avatar
??    
COULAUD Olivier committed
516
  #              STARPU Section
517
518
  ##################################################################
  #
519
520
  message( STATUS "SCALFMM_USE_STARPU             = ${SCALFMM_USE_STARPU}" )
  if( SCALFMM_USE_STARPU )
521
    # CUDA could be used with StarPU enabled
522
523
524
    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
525
526
527
528
529
      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)
530
531
        set( CUSTOM_CUDA_FLAGS "-std=c++11;-arch=sm_20;--ptxas-options=-v;-use_fast_math" CACHE
          STRING "Set your CUDA flags, for example : -arch=sm_20;--ptxas-options=-v;-use_fast_math")
COULAUD Olivier's avatar
COULAUD Olivier committed
532
533
534
535
      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}" )
536

COULAUD Olivier's avatar
COULAUD Olivier committed
537
      find_package(CUDA REQUIRED)
538

COULAUD Olivier's avatar
COULAUD Olivier committed
539
540
541
542
543
544
      if (CUDA_INCLUDE_DIRS)
        include_directories(${CUDA_INCLUDE_DIRS})
      endif()
      if (CUDA_LIBRARIES)
        set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${CUDA_LIBRARIES}")
      endif()
545

546
      set(CUDA_NEEDED_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/Src)
547
548
549
    endif()

    # Find StarPU with a list of optional components
550
    set(SCALFMM_STARPU_VERSION "1.1" CACHE STRING "oldest STARPU version desired")
551
552
    # create list of components in order to make a single call to find_package(starpu...)
    set(STARPU_COMPONENT_LIST "HWLOC")
553
    if(SCALFMM_USE_MPI)
COULAUD Olivier's avatar
COULAUD Olivier committed
554
      list(APPEND STARPU_COMPONENT_LIST "MPI")
555
    endif()
556
    if(SCALFMM_USE_CUDA)
COULAUD Olivier's avatar
COULAUD Olivier committed
557
      list(APPEND STARPU_COMPONENT_LIST "CUDA")
558
    endif()
559

560
    find_package(STARPU ${SCALFMM_STARPU_VERSION} REQUIRED
COULAUD Olivier's avatar
COULAUD Olivier committed
561
      COMPONENTS ${STARPU_COMPONENT_LIST})
562

563
564
565
566
567
568
569
570
571
572
573
574
575
    if(HWLOC_FOUND AND HWLOC_LIBRARY_DIRS)
      # the RPATH to be used when installing
      list(APPEND CMAKE_INSTALL_RPATH "${HWLOC_LIBRARY_DIRS}")
    endif()
    if(FXT_FOUND AND FXT_LIBRARY_DIRS)
      # the RPATH to be used when installing
      list(APPEND CMAKE_INSTALL_RPATH "${FXT_LIBRARY_DIRS}")
    endif()
    if(STARPU_FOUND AND STARPU_LIBRARY_DIRS)
      # the RPATH to be used when installing
      list(APPEND CMAKE_INSTALL_RPATH "${STARPU_LIBRARY_DIRS}")
    endif()

576
    # Append list of libraries and include dirs
577
578
579
    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
580
        set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${starpu_libdir}")
581
      else()
COULAUD Olivier's avatar
COULAUD Olivier committed
582
        set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};-L${starpu_libdir}")
583
584
585
586
      endif()
    endforeach()
    foreach (starpu_lib ${STARPU_LIBRARIES_DEP})
      if (EXISTS ${starpu_lib} OR ${starpu_lib} MATCHES "^ *-")
COULAUD Olivier's avatar
COULAUD Olivier committed
587
        set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${starpu_lib}")
588
      else()
COULAUD Olivier's avatar
COULAUD Olivier committed
589
        set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};-l${starpu_lib}")
590
591
      endif()
    endforeach()
592

593
    # TODO: is this very useful? CUDA is already a component of find starpu
594
    if (CUDA_LIBRARIES)
COULAUD Olivier's avatar
COULAUD Olivier committed
595
      set(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};${CUDA_LIBRARIES}")
596
    endif()
Florent Pruvost's avatar
Florent Pruvost committed
597

598
    # Message
599
600
    message(STATUS "         STARPU_LIBRARIES          = ${STARPU_LIBRARIES}")
    if (STARPU_INCLUDE_DIRS)
COULAUD Olivier's avatar
COULAUD Olivier committed
601
      message(STATUS "         STARPU_INCLUDES           = ${STARPU_INCLUDE_DIRS}")
602
      set(SCALFMM_INCLUDES  "${SCALFMM_INCLUDES}; ${STARPU_INCLUDE_DIRS}")
603
    endif()
604

605
606
607
608
    # Adding SimGrid includes
    set(SCALFMM_INCLUDES "${SCALFMM_INCLUDES};$ENV{SIMGRID_INCLUDE}")
    message(STATUS "         Adding SIMGRID           = $ENV{SIMGRID_INCLUDE}")

609
    # TODO: replace this by a component of find starpu
610
611
612
    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
613
614
      include_directories($ENV{OPENCL_INC})
      SET(SCALFMM_LIBRARIES "${SCALFMM_LIBRARIES};-L$ENV{OPENCL_LIB};-lOpenCL")
BRAMAS Berenger's avatar
BRAMAS Berenger committed
615
    endif()
616
  endif(SCALFMM_USE_STARPU)
617
  list(APPEND FUSE_LIST "STARPU")
Florent Pruvost's avatar
Florent Pruvost committed
618
  list(APPEND FUSE_LIST "CUDA")
BRAMAS Berenger's avatar
BRAMAS Berenger committed
619
  list(APPEND FUSE_LIST "OPENCL")
620
  list(APPEND FUSE_LIST "OMP4")
Florent Pruvost's avatar
Florent Pruvost committed
621

622
623
624
625
  ##################################################################
  #                         Use SSE                                #
  ##################################################################

626
627
628
629
  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)" )
630
631
632
    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
633
634
635
      ${SCALFMM_CMAKE_MODULE_PATH}/compileTestSse.cpp
      COMPILE_DEFINITIONS "${CMAKE_CXX_FLAGS} ${SSE_FLAGS}"
      OUTPUT_VARIABLE COMPILE_SSE_OUTPUT)
636
637

    if(${COMPILE_SSE})
638
      set(SCALFMM_CXX_FLAGS "${SCALFMM_CXX_FLAGS} ${SSE_FLAGS}")
639
640

      try_compile(COMPILE_RESULT_VAR ${CMAKE_CURRENT_BINARY_DIR}
COULAUD Olivier's avatar
COULAUD Olivier committed
641
642
        ${SCALFMM_CMAKE_MODULE_PATH}/checkSSEpe.cpp
        COMPILE_DEFINITIONS "${CMAKE_CXX_FLAGS} ${SSE_FLAGS}")
643
644
645
      if( NOT ${COMPILE_RESULT_VAR})
        set(__SSEPE_INTEL_COMPILER ON)
      endif()
646
      #set(SCALFMM_USE_AVX OFF)
647
    else(${COMPILE_SSE})
648
      message(FATAL_ERROR "SSE NOT SUPPORTED ; Set SCALFMM_USE_SSE  to OFF \n Output from test is : ${COMPILE_SSE_OUTPUT}")
649
650
651
    endif(${COMPILE_SSE})
  endif()
  list(APPEND FUSE_LIST "SSE")
652

653
654
655
656
  ##################################################################
  #                           Use AVX                              #
  ##################################################################

657
658
659
660
  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)" )
661
662
663
    endif()

    try_compile(COMPILE_AVX ${CMAKE_CURRENT_BINARY_DIR}
COULAUD Olivier's avatar
COULAUD Olivier committed
664
665
666
667
668
      ${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}")
669

670
      set(SCALFMM_CXX_FLAGS "${SCALFMM_CXX_FLAGS}   ${AVX_FLAGS}")
COULAUD Olivier's avatar
COULAUD Olivier committed
671
672
      message(STATUS "%%%%%%%%%%%% SCALFMM_CXX_FLAGS               = ${SCALFMM_CXX_FLAGS}")
      #set( SCALFMM_USE_SSE   OFF   FORCE) # ne marche pas
673
      try_compile(COMPILE_RESULT_AVSPE ${CMAKE_CURRENT_BINARY_DIR}
COULAUD Olivier's avatar
COULAUD Olivier committed
674
675
676
        ${SCALFMM_CMAKE_MODULE_PATH}/checkAVXpe.cpp
        COMPILE_DEFINITIONS "${CMAKE_CXX_FLAGS} ${AVX_FLAGS}")
      if( NOT ${COMPILE_RESULT_AVSPE})
677
678


679
        set(__AVXPE_INTEL_COMPILER ON)
COULAUD Olivier's avatar
COULAUD Olivier committed
680
      endif()
681
682
683

      message(STATUS ${CMAKE_CXX_FLAGS} )
    else(${COMPILE_AVX})
684
      message(FATAL_ERROR "AVX NOT SUPPORTED ; Set SCALFMM_USE_AVX  to OFF \n Output from test is : ${COMPILE_AVX_OUTPUT} ")
685
    endif(${COMPILE_AVX})
686
  endif(SCALFMM_USE_AVX)
687
688
  list(APPEND FUSE_LIST "AVX")
  #
689
  # Error if both SCALFMM_USE_AVX AND SCALFMM_USE_SSE are set
690
  #
691
692
693
  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)
694
  ##################################################################
695
696
697
698
699
700
701
702
703
704
  #                           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
705
706
707
      ${SCALFMM_CMAKE_MODULE_PATH}/compileTestAvx2.cpp
      COMPILE_DEFINITIONS "${CMAKE_CXX_FLAGS} ${AVX2_FLAGS}"
      OUTPUT_VARIABLE COMPILE_AVX2_OUTPUT)
708
709
710
711
    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
712
713
        ${SCALFMM_CMAKE_MODULE_PATH}/checkAVX2pe.cpp
        COMPILE_DEFINITIONS "${CMAKE_CXX_FLAGS} ${AVX2_FLAGS}")
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
      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)
  ##################################################################
731
732
  #                     Use  native MIC compilation                #
  ##################################################################
733
  if( SCALFMM_USE_MIC_NATIVE )
734
735
    include(CheckCCompilerFlag)
    check_c_compiler_flag(-mmic HAS_MMIC_FLAG)
736
    if(NOT HAS_MMIC_FLAG)
737
      message(FATAL_ERROR "MIC NOT SUPPORTED ; Set SCALFMM_USE_MIC_NATIVE to OFF")
738
739
740
    endif()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmic")
  else()
741
    #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -xhost")
742
743
744
745
  endif()
  list(APPEND FUSE_LIST "MIC")
  ##################################################################
  #
COULAUD Olivier's avatar
COULAUD Olivier committed
746
747
  #   Set EZTRACE
  #
748
  ##################################################################
COULAUD Olivier's avatar
COULAUD Olivier committed
749
750
751
752
  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
753
      pkg_search_module( EZTrace REQUIRED eztrace)
COULAUD Olivier's avatar
COULAUD Olivier committed
754
      if(EZTrace_FOUND)
COULAUD Olivier's avatar
COULAUD Olivier committed
755
756
        link_directories(${EZTrace_LIBRARY_DIRS})
        link_libraries( ${EZTrace_LIBRARIES})
757
758
759
760
        if (EZTrace_LIBRARY_DIRS)
          # the RPATH to be used when installing
          list(APPEND CMAKE_INSTALL_RPATH "${EZTrace_LIBRARY_DIRS}")
        endif()
COULAUD Olivier's avatar
COULAUD Olivier committed
761
        IF( SCALFMM_USE_MPI )
COULAUD Olivier's avatar
COULAUD Olivier committed
762
          link_libraries(-leztrace-autostart-mpi)
763
764
765
766
767
768
769
770
771
	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
772
      else(EZTrace_FOUND)
773
774
	MESSAGE(WARNING "Eztrace not found - EZTRACE Is set to OFF")
	set(SCALFMM_USE_EZTRACE OFF)  
COULAUD Olivier's avatar
COULAUD Olivier committed
775
      endif(EZTrace_FOUND)
COULAUD Olivier's avatar
COULAUD Olivier committed
776
    else(PKG_CONFIG_FOUND)
COULAUD Olivier's avatar
COULAUD Olivier committed
777
      MESSAGE(WARNING "PKG-CONFIG not found - EZTRACE Is set to OFF")
COULAUD Olivier's avatar
COULAUD Olivier committed
778
779
780
781
      set(SCALFMM_USE_EZTRACE OFF)
    endif(PKG_CONFIG_FOUND)

  endif(SCALFMM_USE_EZTRACE)
782

783
784
785
786
787
  ##################################################################
  #
  #   To catch signals
  #
  ##################################################################  
788
789
790
791
792
793
794
795
  if((WIN32 OR (${CMAKE_SYSTEM_NAME} MATCHES "Windows")) AND SCALFMM_USE_SIGNALS)
    # We are on Windows and we cannot catch signals
    message( FATAL_ERROR "Catching the signals requieres an UNIX system." )
  else()
    IF( NOT APPLE)
      SET(SCALFMM_CXX_FLAGS "${SCALFMM_CXX_FLAGS} -rdynamic")
    ENDIF()
  endif()
796
797
798
799
800
801
802
803
  ##################################################################
  #                                                                #
  #                     END SETTING VARIABLES                      #
  #                                                                #
  ##################################################################
  #
  # Generate  ScalFmmConfig.h
  #
804
  set(SCALFMM_COMPILE_FLAGS "${SCALFMM_CXX_FLAGS} ${CMAKE_CXX_FLAGS}") 
805
  set(CMAKE_CXX_FLAGS "${SCALFMM_COMPILE_FLAGS}")
806
807
808
  # 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
809
    string(STRIP ${lib_var} lib_var)
810
    LIST(APPEND SCALFMM_COMPILE_LIBS   ${lib_var})
811
  endforeach()
812
  configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/Src/ScalFmmConfig.h.cmake
813
    ${CMAKE_CURRENT_BINARY_DIR}/Src/ScalFmmConfig.h  )
814
815
816
817
818
819
820
821
822
823
824
825
  #
  ##################################################################
  #                      Build - lib                               #
  ##################################################################
  #
  add_subdirectory(Src)
  # Link with scalfmm lib
  set(scalfmm_lib scalfmm)
  #
  ##################################################################
  #            Remove compilation  of the drivers                  #
  ##################################################################
826
  message(STATUS "SCALFMM_BUILD_EXAMPLES  =  ${SCALFMM_BUILD_EXAMPLES}" ) 
827
  if( SCALFMM_BUILD_EXAMPLES )
828
829
830
831
832
833
834
    # Build - Examples and drivers
    add_subdirectory(Examples)
  endif()
  ##################################################################
  #           Build tools (Internal use)                           #
  ##################################################################
  # Build - UTILs
835
  if( SCALFMM_ONLY_DEVEL AND SCALFMM_BUILD_UTILS)
836
    add_subdirectory(Utils)
837
  endif()
838

839
840
841
842
  ##################################################################
  #                Build -Tests to see examples                    #
  ##################################################################
  # Build - Tests
843
844
  message( STATUS "SCALFMM_BUILD_TESTS          = ${SCALFMM_BUILD_TESTS}" )
  if( SCALFMM_BUILD_TESTS )
845
846
    add_subdirectory(Tests)
  endif()
berenger-bramas's avatar
berenger-bramas committed
847

848
849
850
851
  ##################################################################
  #              Build - Unitary and numerical Tests               #
  ##################################################################
  #
852
853
  message( STATUS "SCALFMM_BUILD_UTESTS         = ${SCALFMM_BUILD_UTESTS}" )
  if( SCALFMM_BUILD_UTESTS )
854
855
856
857
    include(CTest)
    enable_testing()
    add_subdirectory(UTests)
  endif()
858
  #
859
860
861
  ##################################################################
  #                           Add - doc                            #
  ##################################################################
862
  #
COULAUD Olivier's avatar
COULAUD Olivier committed
863
  message(STATUS "SCALFMM_BUILD_DOC           =  ${SCALFMM_BUILD_DOC}" ) 
864
865
866
  if(SCALFMM_BUILD_DOC)
    add_subdirectory(Doc)
  endif()
867
  #
868
869
870
871
  ##################################################################
  #                       Build - Addons                           #
  ##################################################################
  #
872
  if( SCALFMM_USE_ADDONS )
873
874
    file(GLOB all_addons ./Addons/*)
    # Options
875
    option( SCALFMM_ADDON_CKERNELAPI "Set to ON to build ScaFMM FMM API interface" OFF )
876

877
878
879
880
    foreach(addon_name ${all_addons})
      message(STATUS "Addons += ${addon_name}" )
      add_subdirectory(${addon_name})
    endforeach()
881
  endif()
882

883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
  # 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                  #
  #                                                                #
  ##################################################################
  #
898
899
900
  message(STATUS "SCALFMM_BINARY_DIR:          " ${SCALFMM_BINARY_DIR})
  configure_file(${SCALFMM_SOURCE_DIR}/ScalFMMConfig.cmake.in
    ${SCALFMM_BINARY_DIR}/ScalFMMConfig.cmake
901
902
903
    @ONLY IMMEDIATE
    )
  #
904
905
906
  install(FILES  ${SCALFMM_BINARY_DIR}/ScalFMMConfig.cmake  DESTINATION lib/  )
  if( SCALFMM_INSTALL_DATA )
    install(FILES  ${SCALFMM_SOURCE_DIR}/Data/test20k.fma  DESTINATION Data/   )
907
  endif()
908
  #
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
  ##################################################################
  #                                                                #
  #              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")
  #
926
  set (CPACK_RESOURCE_FILE_LICENSE  "${CMAKE_CURRENT_SOURCE_DIR}/LICENCE")
927
928
  set(CPACK_PACKAGE_VERSION_MAJOR "${SCALFMM_MAJOR_VERSION}")
  set(CPACK_PACKAGE_VERSION_MINOR "${SCALFMM_MINOR_VERSION}")
929
  #
930
  set(PACK_PACKAGE_VERSION "${SCALFMM_MAJOR_VERSION}.${SCALFMM_MINOR_VERSION}-${CPACK_PACKAGE_VERSION_PATCH}")
931
  set(CPACK_SOURCE_GENERATOR "TGZ")
932
  set(CPACK_SOURCE_PACKAGE_FILE_NAME  "SCALFMM-${SCALFMM_MAJOR_VERSION}.${SCALFMM_MINOR_VERSION}-${CPACK_PACKAGE_VERSION_PATCH}")
COULAUD Olivier's avatar
COULAUD Olivier committed
933
934
  set(CPACK_SOURCE_IGNORE_FILES "\\\\.git;.DS_Store;.*~;/*.aux;/*.idx;/*.log;/*.out;/*.toc;/*.ilg;CMakeLists.txt.user;/.settings/")
  list(APPEND CPACK_SOURCE_IGNORE_FILES  "${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}/Utils/;/Build*;/Obsolete/")
935
936
937
938
939
940
941
942
943
  #
  include(CPack)
  #
  #
  ##################################################################
  #                                                                #
  #                      PRINT messages                            #
  #                                                                #
  ##################################################################
944
  message(STATUS "CPACK_SOURCE_IGNORE_FILES      = ${CPACK_SOURCE_IGNORE_FILES}")
945
946
947
  message(STATUS "CPACK_SOURCE_PACKAGE_FILE_NAME = ${CPACK_SOURCE_PACKAGE_FILE_NAME}")
  #
  #                    Use Mem stats
948
  message(STATUS "SCALFMM_USE_MEM_STATS = ${SCALFMM_USE_MEM_STATS}" )
949
  #                    Use Log
950
  message(STATUS "SCALFMM_USE_LOG       = ${SCALFMM_USE_LOG}" )
951
  #                    Use Assert
952
  message(STATUS "SCALFMM_USE_ASSERT    = ${SCALFMM_USE_ASSERT}" )
953
  #
954
  message(STATUS "SCALFMM_USE_BLAS      =  ${SCALFMM_USE_BLAS}")
COULAUD Olivier's avatar
??    
COULAUD Olivier committed
955
  message(STATUS "SCALFMM_USE_FFT       =  ${SCALFMM_USE_FFT}")
956
  message(STATUS "SCALFMM_USE_MKL       =   ${SCALFMM_USE_MKL}")
COULAUD Olivier's avatar
COULAUD Olivier committed
957
  # 
958
  message(STATUS "CMAKE_CXX_FLAGS_TYPE  =  ${CMAKE_CXX_FLAGS_TYPE}")
959
960
961
962
  message(STATUS "CMAKE_CXX_FLAGS       =  ${CMAKE_CXX_FLAGS}")
  message(STATUS "SCALFMM_CXX_FLAGS     =  ${SCALFMM_CXX_FLAGS}")
  message(STATUS "SCALFMM_LIBRARIES     =  ${SCALFMM_LIBRARIES}")
  message(STATUS "SCALFMM_INCLUDES      =  ${SCALFMM_INCLUDES}")
963
  message(STATUS "FUSE_LIST             =  ${FUSE_LIST}")
964
  #
965
966
967
  ##################################################################
  #                               END                              #
  ##################################################################
968
  #
969
else(MORSE_DISTRIB_DIR OR EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/morse/")
970
971
972
973
974
975
976

  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")

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