Salome HOME
Petsc default version is now 3.15.0
[tools/solverlab.git] / CMakeLists.txt
1 cmake_minimum_required (VERSION 3.1)
2 set(CMAKE_CXX_STANDARD 11)
3 set(CMAKE_CXX_STANDARD_REQUIRED ON)
4
5 # Project name
6 project (SOLVERLAB C CXX)
7 set (SOLVERLAB_VERSION_MAJOR 9)
8 set (SOLVERLAB_VERSION_MINOR 7)
9 set (SOLVERLAB_VERSION_SUBMINOR alpha)
10
11 option (SOLVERLAB_WITH_DOCUMENTATION "Generate SOLVERLAB documentation" ON)
12 option (SOLVERLAB_WITH_PYTHON        "Compile Python interface of SOLVERLAB" ON)
13 option (SOLVERLAB_WITH_GUI           "Compile a Graphic user Interface for SOLVERLAB" OFF)
14 option (SOLVERLAB_WITH_PACKAGE       "Generate RPM, Debian and tarball packages" OFF)
15 option (SOLVERLAB_WITH_COREFLOWS     "Generate COREFLOWS module" ON)
16 option (SOLVERLAB_WITH_TESTS         "Generate SOLVERLAB example tests" ON)
17
18 #Path to installed libraries
19 set (PETSC_DIR            OFF CACHE STRING "PETSc library path" )
20 set (SLEPC_DIR            OFF CACHE STRING "SLEPc library path" )
21 set (HDF5_ROOT            OFF CACHE STRING "HDF5 library path" )#For the compilation of MED with a specific version of HDF5
22 set (MEDFILE_ROOT_DIR     OFF CACHE STRING "MED library path" )
23 set (MEDCOUPLING_ROOT_DIR OFF CACHE STRING "MEDCoupling library path" )
24 set (PYTHON_ROOT_DIR      OFF CACHE STRING "Python library path" )
25 set (PARAVIEW_ROOT_DIR    OFF CACHE STRING "PARAVIEW library path" )
26
27 #url of tarball librairies
28 set (DOWNLOAD_PETSC         http://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-3.15.0.tar.gz 
29      CACHE STRING           "PETSc tarball path/url" )
30 set (DOWNLOAD_SLEPC         https://slepc.upv.es/download/distrib/slepc-3.15.0.tar.gz
31      CACHE STRING           "SLEPC tarball path/url" )
32 set (DOWNLOAD_F2CBLASLAPACK https://www.mcs.anl.gov/petsc/mirror/externalpackages/f2cblaslapack-3.4.2.q4.tar.gz
33      CACHE STRING           "F2CBLASLAPACK tarball path/url" )
34 set (DOWNLOAD_HDF5          https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.3/src/hdf5-1.10.3.tar.gz  
35      CACHE STRING           "HDF5 tarball path/url" )
36 set (DOWNLOAD_MED           http://files.salome-platform.org/Salome/other/med-4.1.0.tar.gz
37      CACHE STRING           "MED tarball path/url")
38 set (DOWNLOAD_MEDCOUPLING   http://files.salome-platform.org/Salome/other/medCoupling-9.6.0.tar.gz
39      CACHE STRING           "MEDCoupling tarball path/url" )
40 set (DOWNLOAD_OPENMPI       https://download.open-mpi.org/release/open-mpi/v3.1/openmpi-3.1.6.tar.gz
41      CACHE STRING           "OPENMPI tarball path/url" )
42 set (DOWNLOAD_HYPRE         https://github.com/hypre-space/hypre/archive/v2.20.0.zip
43      CACHE STRING           "HYPRE tarball path/url" )
44
45 set (CMAKE_BUILD_TYPE Release CACHE STRING "Installation mode")
46
47 include(ExternalProject)#For PETSc, MED and MEDCoupling
48
49 list (APPEND CMAKE_MODULE_PATH "${SOLVERLAB_SOURCE_DIR}/cmake_files")
50
51
52 #####################
53 # Detection of MPI  #
54 #####################
55 if   ( DEFINED ENV{MPI_ROOT_DIR} OR DEFINED MPI_ROOT_DIR )
56   if   ( DEFINED  ENV{MPI_ROOT_DIR} )
57     set(MPI_HOME $ENV{MPI_ROOT_DIR})
58   else ( DEFINED  ENV{MPI_ROOT_DIR} )
59     set(MPI_HOME    ${MPI_ROOT_DIR})
60   endif( DEFINED  ENV{MPI_ROOT_DIR} )
61 endif( DEFINED ENV{MPI_ROOT_DIR} OR DEFINED MPI_ROOT_DIR )
62
63 if(    DEFINED ENV{MPI_HOME} OR MPI_HOME )
64   set(SOLVERLAB_WITH_MPI ON)
65   find_package(MPI)
66   if(   ${MPI_LIBRARY} STREQUAL "MPI_LIBRARY-NOTFOUND")
67     set ( MPI_LIBRARY ${MPI_HOME}/lib/libmpi.so )
68   endif(${MPI_LIBRARY} STREQUAL "MPI_LIBRARY-NOTFOUND")
69   message ( STATUS "MPI executable is ${MPIEXEC}" )
70 else(  DEFINED ENV{MPI_HOME} OR MPI_HOME )
71   set(SOLVERLAB_WITH_MPI OFF)
72 endif( DEFINED ENV{MPI_HOME} OR MPI_HOME )
73
74 ############################
75 # Definition of HDF5_HOME  #
76 ############################
77 if   ( DEFINED ENV{HDF5_ROOT_DIR} OR DEFINED HDF5_ROOT_DIR )
78   if   ( DEFINED  ENV{HDF5_ROOT_DIR} )
79     set(HDF5_ROOT $ENV{HDF5_ROOT_DIR})
80   else ( DEFINED  ENV{HDF5_ROOT_DIR} )
81     set(HDF5_ROOT    ${HDF5_ROOT_DIR})
82   endif( DEFINED  ENV{HDF5_ROOT_DIR} )
83 endif( DEFINED ENV{HDF5_ROOT_DIR} OR DEFINED HDF5_ROOT_DIR )
84
85 ######################################################
86 # Detection or compilation of PETSc+SLEPc+HDF5       #
87 ######################################################
88   if ( DEFINED ENV{PETSC_DIR} OR PETSC_DIR)
89     if   (NOT PETSC_DIR)
90       set(PETSC_DIR $ENV{PETSC_DIR})
91       message ( STATUS "Checking variable PETSC_DIR : " $ENV{PETSC_DIR} )
92     else (NOT PETSC_DIR)
93       message ( STATUS "Checking variable PETSC_DIR : " ${PETSC_DIR} )
94     endif(NOT PETSC_DIR)
95
96     find_package (PETSc 3.4 REQUIRED)
97     petsc_get_version ()
98
99     message ( STATUS "PETSc found. Version is ${PETSC_VERSION_MAJOR}.${PETSC_VERSION_MINOR}.${PETSC_VERSION_SUBMINOR}" )
100     message ( STATUS "PETSc compiler is ${PETSC_COMPILER}" )
101     message ( STATUS "PETSc executable is ${PETSC_MPIEXEC}")
102
103     set(PETSC_INSTALL ${PETSC_DIR})
104
105     #Define and search slepc variables
106     if   ( NOT SLEPC_DIR )
107       if   ( DEFINED ENV{SLEPC_DIR} )
108         set(SLEPC_DIR $ENV{SLEPC_DIR})
109       else ( DEFINED ENV{SLEPC_DIR} )
110         set(SLEPC_DIR ${PETSC_DIR}/${PETSC_ARCH})
111       endif( DEFINED ENV{SLEPC_DIR} )
112     endif( NOT SLEPC_DIR)
113
114     message ( STATUS "Checking variable SLEPC_DIR" )
115     if ( IS_DIRECTORY ${SLEPC_DIR}/include AND EXISTS ${SLEPC_DIR}/lib/libslepc.so)
116       set(SLEPC_INCLUDES  ${SLEPC_DIR}/include)
117       set(SLEPC_LIBRARIES ${SLEPC_DIR}/lib/libslepc.so)
118       message( STATUS "SLEPc found at ${SLEPC_DIR}" )
119     else()
120       message( FATAL_ERROR "SLEPc not found at ${SLEPC_DIR}" )
121     endif()
122
123     #define hdf5 variables
124     if   ( NOT HDF5_ROOT )#hdf5 is not defined in cmake arguments
125       if  ( DEFINED ENV{HDF5_ROOT} )#hdf5 is defined in the environment
126         set(HDF5_ROOT $ENV{HDF5_ROOT})
127       else( DEFINED ENV{HDF5_ROOT} )#hdf5 is not defined in the environment
128         #HDF5 to be found in petsc external packages
129         set(HDF5_ROOT ${PETSC_DIR}/${PETSC_ARCH})# define hint for hdf5/med installation in petsc external packages
130       endif( DEFINED ENV{HDF5_ROOT} )
131     endif( NOT HDF5_ROOT )
132
133     find_package(HDF5 COMPONENTS CXX HL)
134     if ( NOT HDF5_FOUND)
135       set(HDF5_LIBRARY_DIR  ${HDF5_ROOT}/lib)
136       set(HDF5_INCLUDE_DIRS ${HDF5_ROOT}/include)
137     endif( NOT HDF5_FOUND)
138   
139   else ( DEFINED ENV{PETSC_DIR} OR PETSC_DIR )
140     message ( STATUS "PETSC_DIR not set, searching PETSc and SLEPc in the system" )
141
142     if ( IS_DIRECTORY "/usr/include/petsc/" AND EXISTS "/usr/lib64/libpetsc.so" )  #Case fedora/redhat system install
143       message ( STATUS "PETSC includes found in /usr/include/petsc/" )
144       message ( STATUS "PETSC library  found in /usr/lib64" )
145       set(PETSC_DIR /usr/)
146       set(PETSC_INCLUDES  /usr/include/petsc /usr/include/petsc/petsc/mpiuni)
147       set(PETSC_LIBRARIES /usr/lib64/libpetsc.so)
148
149       set(PETSC_VERSION "3.8") #3.8 for fedora 26 , 3.9 for fedora 29 , 3.10 for fedora 30, , 3.12 for fedora 32
150       
151       set(CPACK_RPM_PACKAGE_REQUIRES   "${CPACK_RPM_PACKAGE_REQUIRES}, petsc-devel (>= 3.4)") # This is not fully working yet. 
152       set(PETSC_INSTALL ${PETSC_DIR})
153
154       #Define and search slepc variables
155       if   ( IS_DIRECTORY "/usr/include/slepc/" AND EXISTS "/usr/lib64/libslepc.so" )
156         message( STATUS "SLEPc includes found in /usr/include/slepc/" )
157         message( STATUS "SLEPc library  found in /usr/lib64/slepc/" )
158         set(SLEPC_DIR /usr/)
159         set(SLEPC_INCLUDES  ${SLEPC_DIR}/include)
160         set(SLEPC_LIBRARIES ${SLEPC_DIR}/lib/libslepc.so)
161         set (CPACK_RPM_PACKAGE_REQUIRES   "${CPACK_RPM_PACKAGE_REQUIRES}, slepc-devel (>= 3.4)") # This is not fully working yet. 
162       else ( IS_DIRECTORY "/usr/include/slepc/" AND EXISTS "/usr/lib64/libslepc.so" )
163         message( FATAL_ERROR "SLEPc not found in the system" )
164       endif( IS_DIRECTORY "/usr/include/slepc/" AND EXISTS "/usr/lib64/libslepc.so" )
165
166       #HDF5 to be found in the system
167       if   ( NOT HDF5_ROOT AND NOT DEFINED ENV{HDF5_ROOT} )#hdf5 is not defined in the environment
168         find_package(HDF5 REQUIRED)
169         set(CPACK_DEBIAN_PACKAGE_DEPENDS "libhdf5-dev")
170         set(CPACK_RPM_PACKAGE_REQUIRES   "hdf5-devel")
171       endif( NOT HDF5_ROOT AND NOT DEFINED ENV{HDF5_ROOT} )
172
173     #elseif ( IS_DIRECTORY "/usr/lib/petsc/include" AND EXISTS "/usr/lib/petsc/lib/libpetsc_real.so" ) #Case ubuntu/debian system install
174     #  message ( STATUS "PETSc includes found in /usr/lib/petsc/include")
175     #  message ( STATUS "PETSc library  found in /usr/lib/petsc/lib/libpetsc_real.so")
176     #  set(PETSC_DIR /usr/lib/petsc/)
177     #  set(PETSC_INCLUDES  ${PETSC_DIR}/include ${PETSC_DIR}/include/petsc/mpiuni)
178     #  set(PETSC_LIBRARIES ${PETSC_DIR}/lib/libpetsc_real.so)
179
180     #  find_package (PETSc 3.4 REQUIRED)
181     #  petsc_get_version ()
182     #  set (CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, petsc-dev   (>= 3.4)") # This is not fully working yet. 
183
184     #  Define and search slepc variables
185     #  if   ( IS_DIRECTORY "/usr/lib/slepc/include" AND EXISTS "/usr/lib/slepc/lib/libslepc_real.so" )
186     #    message( STATUS "SLEPc includes found in /usr/lib/slepc/include" )
187     #    message( STATUS "SLEPc library  found in /usr/lib/slepc/lib/libslepc_real.so" )
188     #    set(SLEPC_DIR /usr/lib/slepc/)
189     #    set(SLEPC_INCLUDES ${SLEPC_DIR}/include)
190     #    set(SLEPC_LIBRARIES ${SLEPC_DIR}/lib/libslepc_real.so)
191     #    set (CPACK_DEBIAN_PACKAGE_REQUIRES   "${CPACK_DEBIAN_PACKAGE_REQUIRES}, slepc-devel (>= 3.4)") # This is not fully working yet. 
192     #  else ( IS_DIRECTORY "/usr/lib/slepc/include" AND EXISTS "/usr/lib/slepc/lib/libslepc_real.so" )
193     #    message( FATAL_ERROR "SLEPc not found in the system" )
194     #  endif( IS_DIRECTORY "/usr/lib/slepc/include" AND EXISTS "/usr/lib/slepc/lib/libslepc_real.so" )
195
196     #elseif ( IS_DIRECTORY "/usr/local/lib/python2.7/dist-packages/petsc") #Case ubuntu/debian system pip install
197
198     else ( IS_DIRECTORY "/usr/include/petsc/" AND EXISTS "/usr/lib64/libpetsc.so" )  # No petsc in system, do compile petsc along with slepc as an external package
199       message (STATUS "PETSC not found in the system")
200       message (STATUS "PETSC will be downloaded and compiled from ${DOWNLOAD_PETSC}" )
201       message (STATUS "SLEPC will be downloaded and compiled from ${DOWNLOAD_SLEPC}" )
202       message (STATUS "HDF5  will be downloaded and compiled from ${DOWNLOAD_HDF5}" )
203
204       #extract petsc tarball name
205       string(LENGTH "${DOWNLOAD_PETSC}" tarball_url_length)#length of the tarball
206       string(FIND   "${DOWNLOAD_PETSC}" "/" start_tarball_name REVERSE )# last occurence of "/"
207       MATH(EXPR start_tarball_name  "${start_tarball_name}+1")#start after the occurence of "/"
208       MATH(EXPR tarball_name_length "${tarball_url_length}-${start_tarball_name}-7")#name ends before .tar.gz that counts for 7 characters
209       string(SUBSTRING ${DOWNLOAD_PETSC} ${start_tarball_name} ${tarball_name_length} PETSC_TARBALL_NAME)
210
211       set(PETSC_DIR ${CMAKE_CURRENT_BINARY_DIR}/pre_requis/${PETSC_TARBALL_NAME}) # Location of the final install 
212       set(PETSC_ARCH arch-linux-c-opt)
213       set(PETSC_INSTALL ${CMAKE_INSTALL_PREFIX}/lib/petsc)#folder to copy petsc libraries and include files
214
215       ExternalProject_Add (PETSc
216       URL               ${DOWNLOAD_PETSC}   
217       SOURCE_DIR        ${PETSC_DIR}
218       BUILD_IN_SOURCE   TRUE
219       CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=${PETSC_INSTALL} --with-debugging=0 --download-f2cblaslapack=${DOWNLOAD_F2CBLASLAPACK} --with-fc=0 --download-slepc=${DOWNLOAD_SLEPC} --download-hdf5=${DOWNLOAD_HDF5} --with-mpi=0 # --download-openmpi=${DOWNLOAD_OPENMPI} --download-hypre=${DOWNLOAD_HYPRE}
220       BUILD_COMMAND     make all
221       TEST_COMMAND      make check
222       INSTALL_COMMAND   make install
223       INSTALL_DIR       ${PETSC_DIR}
224       STAMP_DIR         ${CMAKE_CURRENT_BINARY_DIR}/pre_requis
225       LOG_DOWNLOAD      TRUE           # Wrap download in script to log output
226       LOG_UPDATE        TRUE           # Wrap update in script to log output
227       LOG_CONFIGURE     TRUE           # Wrap configure in script to log output
228       LOG_BUILD         TRUE           # Wrap build in script to log output
229       LOG_TEST          TRUE           # Wrap test in script to log output
230       LOG_INSTALL       TRUE           # Wrap install in script to log output
231        )
232
233       message( STATUS "PETSc, SLEPc and HDF5 will be installed at ${PETSC_INSTALL}")
234
235       string(LENGTH "${PETSC_TARBALL_NAME}" tarball_name_length)#length of the tarball
236       string(FIND   "${PETSC_TARBALL_NAME}" "-" start_version_name REVERSE )# last occurence of "-"
237       MATH(EXPR start_version_name  "${start_version_name}+1")#start after the occurence of "/"
238       string(SUBSTRING ${PETSC_TARBALL_NAME} ${start_version_name} ${tarball_name_length} PETSC_VERSION)
239       message( STATUS "PETSc version ${PETSC_VERSION}  will be installed" )
240
241       set(PETSC_INCLUDES  ${PETSC_DIR}/${PETSC_ARCH}/include ${PETSC_DIR}/include)
242       set(PETSC_LIBRARIES ${PETSC_DIR}/${PETSC_ARCH}/lib/libpetsc.so)
243
244       #extract slepc tarball name 
245       string(LENGTH "${DOWNLOAD_SLEPC}" tarball_url_length)#length of the tarball
246       string(FIND   "${DOWNLOAD_SLEPC}" "/" start_tarball_name REVERSE )# last occurence of "/"
247       MATH(EXPR start_tarball_name  "${start_tarball_name}+1")#start after the occurence of "/"
248       MATH(EXPR tarball_name_length "${tarball_url_length}-${start_tarball_name}-7")#name ends before .tar.gz that counts for 7 characters
249       string(SUBSTRING ${DOWNLOAD_SLEPC} ${start_tarball_name} ${tarball_name_length} SLEPC_TARBALL_NAME)
250
251       #extract slepc version
252       string(LENGTH "${SLEPC_TARBALL_NAME}" tarball_name_length)#length of the tarball
253       string(FIND   "${SLEPC_TARBALL_NAME}" "-" start_version_name REVERSE )# last occurence of "-"
254       MATH(EXPR start_version_name  "${start_version_name}+1")#start after the occurence of "/"
255       string(SUBSTRING ${SLEPC_TARBALL_NAME} ${start_version_name} ${tarball_name_length} SLEPC_VERSION)
256       message( STATUS "SLEPc version ${SLEPC_VERSION}  will be installed" )
257
258       #define slepc variables
259       set(SLEPC_DIR ${PETSC_INSTALL})
260       set(SLEPC_INCLUDES ${SLEPC_DIR}/include  ${PETSC_DIR}/${PETSC_ARCH}/externalpackages/${SLEPC_TARBALL_NAME}/include )
261       set(SLEPC_LIBRARIES ${PETSC_DIR}/${PETSC_ARCH}/externalpackages/${SLEPC_TARBALL_NAME}/installed-arch-linux2-c-opt/lib/libslepc.so)
262       message( STATUS "SLEPc includes ${SLEPC_INCLUDES}")
263
264       #define hdf5 variables
265       if   ( NOT HDF5_ROOT )#hdf5 is not defined in cmake arguments
266         if  ( DEFINED ENV{HDF5_ROOT} )#hdf5 is defined in the environment
267           set(HDF5_ROOT $ENV{HDF5_ROOT})
268         else( DEFINED ENV{HDF5_ROOT} )#hdf5 is not defined in the environment          
269           set(HDF5_ROOT ${PETSC_INSTALL})#HDF5 to be found in petsc installation
270         endif( DEFINED ENV{HDF5_ROOT} )
271       endif( NOT HDF5_ROOT )
272       set(HDF5_LIBRARY_DIR ${HDF5_ROOT}/lib)
273       set(HDF5_INCLUDE_DIRS ${HDF5_ROOT}/include)
274
275       #define MPI variables
276       #set(SOLVERLAB_WITH_MPI ON)
277       #set(MPI_HOME    ${PETSC_INSTALL} )
278       #set(MPI_LIBRARY ${PETSC_INSTALL}/lib/libmpi.so)
279       #set(MPIEXEC     ${PETSC_INSTALL}/bin/mpiexec)
280
281     endif ( IS_DIRECTORY "/usr/include/petsc/" AND EXISTS "/usr/lib64/libpetsc.so" )
282   endif ( DEFINED ENV{PETSC_DIR} OR PETSC_DIR )
283
284 if   ( ${PETSC_VERSION} VERSION_GREATER 3.5 )
285   add_definitions(-DPETSC_VERSION_GREATER_3_5)
286 endif( ${PETSC_VERSION} VERSION_GREATER 3.5 )
287
288 string(REPLACE ";" ":"  PETSC_INCLUDES_INSTALL "${PETSC_INCLUDES}")# use colon instead of semicolon in environment file env_SOLVERLAB.sh
289
290 add_library(petsc   SHARED IMPORTED)
291 set_property(TARGET petsc  PROPERTY IMPORTED_LOCATION ${PETSC_LIBRARIES})
292 add_library(slepc   SHARED IMPORTED)
293 set_property(TARGET slepc  PROPERTY IMPORTED_LOCATION ${SLEPC_LIBRARIES})
294
295 ######################################################
296 # Detection or compilation of MEDFile                #
297 ######################################################
298 if( MEDFILE_ROOT_DIR OR DEFINED ENV{MEDFILE_ROOT_DIR})
299
300   if   ( NOT MEDFILE_ROOT_DIR )
301     set(MEDFILE_ROOT_DIR $ENV{MEDFILE_ROOT_DIR} )
302   endif( NOT MEDFILE_ROOT_DIR )
303
304   find_package (MEDFile REQUIRED)
305
306 else( MEDFILE_ROOT_DIR OR DEFINED ENV{MEDFILE_ROOT_DIR})
307
308   message(STATUS "MED will be downloaded and installed from ${DOWNLOAD_MED}")
309   set(MACHINE PCLINUX)
310   set(MEDFILE_DEFINITIONS "-D${MACHINE} -DMEDFILE_INSTALL_DOC=OFF")#Comment ne pas compiler la doc ?
311   set(MEDFILE_ROOT_DIR ${CMAKE_INSTALL_PREFIX}/lib/med) # Location of the final install
312   
313   #extraction of the tarball archive name
314   string(LENGTH "${DOWNLOAD_MED}" tarball_url_length)#length of the name of the tarball
315   string(FIND "${DOWNLOAD_MED}" "/" start_tarball_name REVERSE )# last occurence of "/"
316   MATH(EXPR start_tarball_name "${start_tarball_name}+1")#start after the occurence of "/"
317   MATH(EXPR tarball_name_length "${tarball_url_length}-${start_tarball_name}-7")#name ends before .tar.gz that counts for 7 characters
318   string(SUBSTRING ${DOWNLOAD_MED} ${start_tarball_name} ${tarball_name_length} MED_TARBALL_NAME)
319
320   ExternalProject_Add (MED
321         URL               ${DOWNLOAD_MED}  #location of med tarball
322         SOURCE_DIR        ${CMAKE_CURRENT_BINARY_DIR}/pre_requis/${MED_TARBALL_NAME}
323         BUILD_IN_SOURCE   TRUE
324         CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=${MEDFILE_ROOT_DIR}  --with-hdf5=${HDF5_ROOT} --with-hdf5-include=${HDF5_ROOT}/include --with-hdf5-lib=${HDF5_LIBRARY_DIR} --with-hdf5-bin=${HDF5_ROOT}/bin  --with-swig=yes --disable-fortran #CC=${PETSC_INSTALL}/bin/mpicc
325         BUILD_COMMAND     make
326         INSTALL_COMMAND   make install
327         INSTALL_DIR       ${MEDFILE_ROOT_DIR}
328         STAMP_DIR         ${CMAKE_CURRENT_BINARY_DIR}/pre_requis
329         LOG_DOWNLOAD      TRUE           # Wrap download in script to log output
330         LOG_UPDATE        TRUE           # Wrap update in script to log output
331         LOG_CONFIGURE     TRUE           # Wrap configure in script to log output
332         LOG_BUILD         TRUE           # Wrap build in script to log output
333         LOG_TEST          TRUE           # Wrap test in script to log output
334         LOG_INSTALL       TRUE           # Wrap install in script to log output
335   )
336   
337   set(MEDFILE_INCLUDE_DIRS ${MEDFILE_ROOT_DIR}/include)# Nécessaire pour le medloader et les sous-dossiers mesh, et IJKMesh
338   set(MEDFILE_LIBRARIES    ${MEDFILE_ROOT_DIR}/lib)# Nécessaire pour le env_SOLVERLAB.sh
339   set(MEDFILE_C_LIBRARIES med medC)# Nécessaire pour le medloader
340
341 endif( MEDFILE_ROOT_DIR OR DEFINED ENV{MEDFILE_ROOT_DIR})
342
343 add_library(med   SHARED IMPORTED)
344 set_property(TARGET med  PROPERTY IMPORTED_LOCATION ${MEDFILE_ROOT_DIR}/lib/libmed.so)
345 add_library(medC   SHARED IMPORTED)
346 set_property(TARGET medC PROPERTY IMPORTED_LOCATION ${MEDFILE_ROOT_DIR}/lib/libmedC.so)
347
348 string(REPLACE ";" ":"  MEDFILE_LIBRARIES_INSTALL "${MEDFILE_LIBRARIES}")# use colon instead of semicolon in environment file env_SOLVERLAB.sh
349
350 ######################################################
351 # Detection or compilation of MEDCoupling            #
352 ######################################################
353 if( MEDCOUPLING_ROOT_DIR OR DEFINED ENV{MEDCOUPLING_ROOT_DIR})
354
355   if   ( NOT MEDCOUPLING_ROOT_DIR )
356     set(MEDCOUPLING_ROOT_DIR $ENV{MEDCOUPLING_ROOT_DIR} )
357   endif( NOT MEDCOUPLING_ROOT_DIR )
358
359   message (STATUS "Seeking MEDCoupling library in ${MEDCOUPLING_ROOT_DIR}")
360
361   set(MEDCoupling_DIR  ${MEDCOUPLING_ROOT_DIR}/cmake_files)
362   find_package(MEDCoupling CONFIG REQUIRED)   # CONFIG is important !
363   message( STATUS "MEDCoupling found. Version is ${MEDCoupling_VERSION}")
364
365 else( DEFINED MEDCOUPLING_ROOT_DIR OR DEFINED ENV{MEDCOUPLING_ROOT_DIR})
366   message(STATUS "MEDCoupling will be downloaded and installed from ${DOWNLOAD_MEDCOUPLING}")
367   set(MEDCOUPLING_ROOT_DIR ${CMAKE_INSTALL_PREFIX}/lib/medcoupling) # Location of the final install
368   SET(ENV{HDF5_ROOT} ${HDF5_ROOT})#MEDCoupling install process seems to require an environment variable
369
370   #extraction of the tarball archive name
371   string(LENGTH "${DOWNLOAD_MEDCOUPLING}" tarball_url_length)#length of the tarball
372   string(FIND   "${DOWNLOAD_MEDCOUPLING}" "/" start_tarball_name REVERSE )# last occurence of "/"
373   MATH(EXPR start_tarball_name "${start_tarball_name}+1")#start after the occurence of "/"
374   MATH(EXPR tarball_name_length "${tarball_url_length}-${start_tarball_name}-7")#name ends before .tar.gz that counts for 7 characters
375   string(SUBSTRING ${DOWNLOAD_MEDCOUPLING} ${start_tarball_name} ${tarball_name_length} MEDCOUPLING_TARBALL_NAME)
376   string(SUBSTRING ${MEDCOUPLING_TARBALL_NAME} 12 ${tarball_name_length} MEDCoupling_VERSION)
377
378   message(STATUS "MEDCoupling will be installed at ${MEDCOUPLING_ROOT_DIR}")
379
380   ExternalProject_Add (MEDCoupling
381         URL               ${DOWNLOAD_MEDCOUPLING}  #location of medcoupling tarball
382         SOURCE_DIR        ${CMAKE_CURRENT_BINARY_DIR}/pre_requis/${MEDCOUPLING_TARBALL_NAME}
383         BUILD_IN_SOURCE   TRUE
384         CONFIGURE_COMMAND cmake <SOURCE_DIR>/${MEDCOUPLING_TARBALL_NAME} -DCMAKE_INSTALL_PREFIX=${MEDCOUPLING_ROOT_DIR} -DCONFIGURATION_ROOT_DIR=<SOURCE_DIR>/configuration-${MEDCoupling_VERSION} -DMEDFILE_ROOT_DIR=${MEDFILE_ROOT_DIR} -DMEDCOUPLING_ENABLE_PARTITIONER=OFF -DMEDCOUPLING_PARTITIONER_METIS=OFF -DMEDCOUPLING_PARTITIONER_SCOTCH=OFF -DMEDCOUPLING_ENABLE_RENUMBER=OFF -DMEDCOUPLING_BUILD_DOC=OFF -DHDF5_ROOT_DIR=${HDF5_ROOT} -DMEDCOUPLING_USE_64BIT_IDS=ON #-DSALOME_USE_MPI=ON
385         BUILD_COMMAND     make
386         INSTALL_COMMAND   make install
387         INSTALL_DIR       ${MEDCOUPLING_ROOT_DIR}
388         STAMP_DIR         ${CMAKE_CURRENT_BINARY_DIR}/pre_requis
389         LOG_DOWNLOAD      TRUE           # Wrap download in script to log output
390         LOG_UPDATE        TRUE           # Wrap update in script to log output
391         LOG_CONFIGURE     TRUE           # Wrap configure in script to log output
392         LOG_BUILD         TRUE           # Wrap build in script to log output
393         LOG_TEST          TRUE           # Wrap test in script to log output
394         LOG_INSTALL       TRUE           # Wrap install in script to log output
395   )
396
397   add_library(medloader   SHARED IMPORTED )
398   set_property(TARGET medloader   PROPERTY IMPORTED_LOCATION ${MEDCOUPLING_ROOT_DIR}/lib/libmedloader.so)
399
400   SET(MEDCOUPLING_USE_64BIT_IDS  ON)
401
402 endif( MEDCOUPLING_ROOT_DIR OR DEFINED ENV{MEDCOUPLING_ROOT_DIR} )
403
404 set(MEDCOUPLING_INCLUDE_DIR ${MEDCOUPLING_ROOT_DIR}/include)
405 set(MEDCOUPLING_LIBRARIES   ${MEDCOUPLING_ROOT_DIR}/lib    )#for environment file env_SOLVERLAB.sh 
406
407 add_library(medcoupling SHARED IMPORTED )
408 set_property(TARGET medcoupling PROPERTY IMPORTED_LOCATION ${MEDCOUPLING_ROOT_DIR}/lib/libmedcoupling.so)
409
410 if   ( ${MEDCoupling_VERSION} VERSION_GREATER 9.4 )
411   add_definitions(-DMEDCoupling_VERSION_VERSION_GREATER_9_4)
412 endif( ${MEDCoupling_VERSION} VERSION_GREATER 9.4 )
413
414 if   (TARGET MED AND TARGET PETSc)
415   ExternalProject_Add_StepDependencies( MED build PETSc )#PETSc doit être compilé avant MED car c'est PETSc qui compile HDF5
416 endif(TARGET MED AND TARGET PETSc)
417
418 if   (TARGET MED AND TARGET MEDCoupling)
419   ExternalProject_Add_StepDependencies( MEDCoupling build MED )#MED doit être compilé avant MEDCoupling
420 endif(TARGET MED AND TARGET MEDCoupling)
421  
422 if   (TARGET PETSc AND TARGET MEDCoupling)
423   ExternalProject_Add_StepDependencies( MEDCoupling build PETSc )#PETSc doit être compilé avant MEDCoupling (car il contient hdf5)
424 endif(TARGET PETSc AND TARGET MEDCoupling)
425
426 IF(MEDCOUPLING_USE_64BIT_IDS)
427   SET(CMAKE_SWIG_FLAGS ${CMAKE_SWIG_FLAGS} -DMEDCOUPLING_USE_64BIT_IDS)
428 ENDIF(MEDCOUPLING_USE_64BIT_IDS)
429  
430 ####################
431 # Final operations #
432 ####################                                  
433
434 # Paraview variables to choose python version and for env_SOLVERLAB.sh  
435 if  ( PARAVIEW_ROOT_DIR OR DEFINED ENV{PARAVIEW_ROOT_DIR})
436   if  ( PARAVIEW_ROOT_DIR )
437     set( PARAVIEW_INCLUDE_DIR   ${PARAVIEW_ROOT_DIR}/include)
438     set( PARAVIEW_LIBRARIES_DIR ${PARAVIEW_ROOT_DIR}/lib)
439   else( PARAVIEW_ROOT_DIR )
440     set( PARAVIEW_ROOT_DIR      $ENV{PARAVIEW_ROOT_DIR} )
441     set( PARAVIEW_INCLUDE_DIR   $ENV{PARAVIEW_ROOT_DIR}/include)
442     set( PARAVIEW_LIBRARIES_DIR $ENV{PARAVIEW_ROOT_DIR}/lib)
443   endif( PARAVIEW_ROOT_DIR )
444 else( PARAVIEW_ROOT_DIR OR DEFINED ENV{PARAVIEW_ROOT_DIR})
445   message(STATUS "PARAVIEW_ROOT_DIR not set. Trying to detect paraview.")
446   set( PARAVIEW_INCLUDE_DIR /usr/include/paraview/)
447   set( PARAVIEW_LIBRARIES_DIR /usr/lib/paraview/:/usr/lib64/paraview/:/usr/lib64/vtk/:/usr/lib/vtk/)
448 endif( PARAVIEW_ROOT_DIR OR DEFINED ENV{PARAVIEW_ROOT_DIR})
449
450 if  ( DEFINED PARAVIEW_VERSION OR DEFINED ENV{PARAVIEW_VERSION} )
451   if   ( NOT DEFINED PARAVIEW_VERSION )
452     set( PARAVIEW_VERSION  $ENV{PARAVIEW_VERSION})
453   endif( NOT DEFINED PARAVIEW_VERSION )
454   message(STATUS "ParaView version is ${PARAVIEW_VERSION}" )
455 else( DEFINED PARAVIEW_VERSION OR DEFINED ENV{PARAVIEW_VERSION} )
456   set( PARAVIEW_SUFFIXES paraview-5.0 paraview-5.1 paraview-5.2 paraview-5.3 paraview-5.4 paraview-5.5 paraview-5.6 paraview-5.7 paraview-5.8 paraview-5.9 )
457   find_file( vtkConfig_file vtkPVConfig.h HINTS ${PARAVIEW_INCLUDE_DIR} PATH_SUFFIXES ${PARAVIEW_SUFFIXES})
458
459   #extraction of the paraview version"
460   IF   ( ${vtkConfig_file} STREQUAL "vtkConfig_file-NOTFOUND" )
461     message(WARNING "Could not find ParaView configuration file vtkPVConfig.h in folder ${PARAVIEW_INCLUDE_DIR} and subdirectories  ${PARAVIEW_SUFFIXES}. Postprocessing may not work")
462     set( PARAVIEW_VERSION  "5.8")
463   ELSE ( ${vtkConfig_file} STREQUAL "vtkConfig_file-NOTFOUND" )
464     message( STATUS "Found vtkPVConfig.h in ${vtkConfig_file}")
465     file(STRINGS ${vtkConfig_file} vtkConfig)
466     FOREACH(line ${vtkConfig})
467       string(FIND "${line}" "#define PARAVIEW_VERSION_FULL " pos)
468       IF(NOT ${pos} EQUAL -1)
469         string(LENGTH ${line} line_length)#length of the tarball
470         MATH(EXPR start_pv_version "${line_length}-6")#line ends with "x.y.z", that counts for 7 characters
471         string(SUBSTRING ${line} ${start_pv_version} 5 PARAVIEW_VERSION)
472         break()
473       ENDIF(NOT ${pos} EQUAL -1)
474     ENDFOREACH(line ${vtkConfig})
475     message(STATUS "ParaView detected, version is ${PARAVIEW_VERSION}" )
476   ENDIF( ${vtkConfig_file} STREQUAL "vtkConfig_file-NOTFOUND" )
477 endif( DEFINED PARAVIEW_VERSION OR DEFINED ENV{PARAVIEW_VERSION} )
478
479 #Choose python 2 or 3  
480 IF   ( ${PARAVIEW_VERSION} STRGREATER "5.6" OR ${PARAVIEW_VERSION} STREQUAL "5.6" )#Use python 3, use VERSION_GREATER_EQUAL if cmake >=3.7
481   SET(PYTHON2OR3 "3")
482   message(STATUS "PARAVIEW_VERSION greater than 5.6. We need python3 for postprocessing scripts.")
483 ELSE ( ${PARAVIEW_VERSION} STRGREATER "5.6" OR ${PARAVIEW_VERSION} STREQUAL "5.6" )#Use python 2
484   SET(PYTHON2OR3 "2")
485   message(STATUS "PARAVIEW_VERSION smaller than 5.6. We need python2 for postprocessing scripts.")
486 ENDIF( ${PARAVIEW_VERSION} STRGREATER "5.6" OR ${PARAVIEW_VERSION} STREQUAL "5.6" )
487
488 # Find python
489 IF   ( PYTHON_ROOT_DIR OR DEFINED ENV{PYTHON_ROOT_DIR})
490   IF  ( PYTHON_ROOT_DIR )
491     set(Python_ROOT_DIR ${PYTHON_ROOT_DIR} ) 
492   ELSE( PYTHON_ROOT_DIR )
493     set(Python_ROOT_DIR $ENV{PYTHON_ROOT_DIR} ) 
494   ENDIF( PYTHON_ROOT_DIR)
495 ENDIF( PYTHON_ROOT_DIR OR DEFINED ENV{PYTHON_ROOT_DIR})
496
497 IF   (${CMAKE_VERSION} VERSION_GREATER "3.12.0")
498   find_package(Python ${PYTHON2OR3} REQUIRED COMPONENTS Interpreter Development )
499   SET(PYTHON_EXECUTABLE ${Python_EXECUTABLE})
500 ELSE (${CMAKE_VERSION} VERSION_GREATER "3.12.0")
501   find_package(PythonInterp ${PYTHON2OR3} REQUIRED )
502   find_package(PythonLibs   ${PYTHON2OR3} REQUIRED )
503   set(Python_LIBRARIES     ${PYTHON_LIBRARIES})
504   set(Python_INCLUDE_DIRS  ${PYTHON_INCLUDE_DIRS})
505   set(Python_VERSION       ${PYTHON_VERSION_STRING})
506   set(Python_VERSION_MAJOR ${PYTHON_VERSION_MAJOR})
507   set(Python_VERSION_MINOR ${PYTHON_VERSION_MINOR})
508 ENDIF(${CMAKE_VERSION} VERSION_GREATER "3.12.0")
509
510 #PyQt5 root dir
511 IF   ( NOT DEFINED PYQT5_ROOT_DIR )
512     set(PYQT5_ROOT_DIR $ENV{PYQT5_ROOT_DIR} )
513 ENDIF( NOT DEFINED PYQT5_ROOT_DIR )
514
515 #Matplotlib root dir
516 IF   ( NOT DEFINED MATPLOTLIB_ROOT_DIR )
517     set(MATPLOTLIB_ROOT_DIR $ENV{MATPLOTLIB_ROOT_DIR} )
518 ENDIF( NOT DEFINED MATPLOTLIB_ROOT_DIR )
519
520 #define HDF5_ROOT_DIR
521 IF   ( NOT HDF5_ROOT_DIR )
522   IF  ( ENV{HDF5_ROOT_DIR} )
523     set(HDF5_ROOT_DIR $ENV{HDF5_ROOT_DIR} )
524   ELSE( ENV{HDF5_ROOT_DIR} )
525     set(HDF5_ROOT_DIR ${HDF5_ROOT} )
526   ENDIF( ENV{HDF5_ROOT_DIR} )
527 ENDIF( NOT HDF5_ROOT_DIR )
528
529
530 #Paraview library paths
531 set (PV_LIB_DIR    /usr/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/dist-packages/paraview/:/usr/lib64/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/vtk/:${MATPLOTLIB_ROOT_DIR}/lib/:${PARAVIEW_LIBRARIES_DIR})
532 set (PV_PYTHON_DIR /usr/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/dist-packages/paraview/:/usr/lib64/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/vtk/:/usr/lib64/paraview/site-packages/:/usr/lib64/paraview/site-packages/paraview/:/usr/lib64/paraview/site-packages/vtk/:/usr/lib64/paraview/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/:/usr/lib64/paraview/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/paraview/:/usr/lib64/paraview/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/vtkmodules:/usr/lib/paraview/site-packages/paraview:/usr/lib/paraview/site-packages/paraview/vtk:${PARAVIEW_ROOT_DIR}/lib/:${PARAVIEW_ROOT_DIR}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/:${PARAVIEW_ROOT_DIR}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/vtkmodules/:${MATPLOTLIB_ROOT_DIR}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages:${PYQT5_ROOT_DIR}:${PYQT5_ROOT_DIR}/lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages)
533
534 message(STATUS "Python version found is ${Python_VERSION}")
535
536 # Find SWIG
537 IF   ( DEFINED SWIG_ROOT_DIR OR DEFINED ENV{SWIG_ROOT_DIR})
538   IF   ( DEFINED SWIG_ROOT_DIR )
539     set(SWIG_EXECUTABLE    ${SWIG_ROOT_DIR}/bin/swig ) 
540   ELSE ( DEFINED SWIG_ROOT_DIR )
541     set(SWIG_EXECUTABLE $ENV{SWIG_ROOT_DIR}/bin/swig ) 
542   ENDIF( DEFINED SWIG_ROOT_DIR)
543 ENDIF( DEFINED SWIG_ROOT_DIR OR DEFINED ENV{SWIG_ROOT_DIR})
544 find_package (SWIG 3.0 REQUIRED)
545
546 # Find Doxygen
547 if (SOLVERLAB_WITH_DOCUMENTATION)                                                                           #
548  IF   ( DEFINED DOXYGEN_ROOT_DIR OR DEFINED ENV{DOXYGEN_ROOT_DIR})
549    IF   ( DEFINED DOXYGEN_ROOT_DIR )
550      set(DOXYGEN_EXECUTABLE    ${DOXYGEN_ROOT_DIR}/bin/doxygen ) 
551    ELSE ( DEFINED DOXYGEN_ROOT_DIR )
552      set(DOXYGEN_EXECUTABLE $ENV{DOXYGEN_ROOT_DIR}/bin/doxygen ) 
553    ENDIF( DEFINED DOXYGEN_ROOT_DIR)
554  ENDIF( DEFINED DOXYGEN_ROOT_DIR OR DEFINED ENV{DOXYGEN_ROOT_DIR})
555   find_package (Doxygen)                                                                                    #
556   set (CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, doxygen, graphviz, mscgen")
557   set (CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES}, doxygen, graphviz, mscgen")
558   if   (NOT DOXYGEN_FOUND)
559     message (FATAL_ERROR "Doxygen is needed to build the documentation. Please install it correctly.")
560   endif(NOT DOXYGEN_FOUND)
561 endif(SOLVERLAB_WITH_DOCUMENTATION)                     
562
563 if (SOLVERLAB_WITH_TESTS)                                                                                  #
564   enable_testing ()
565  IF   ( DEFINED CPPUNIT_ROOT_DIR OR DEFINED ENV{CPPUNIT_ROOT_DIR})
566    IF   ( DEFINED CPPUNIT_ROOT_DIR )
567      set(CPPUNIT_ROOT_USER    ${CPPUNIT_ROOT_DIR} ) 
568    ELSE ( DEFINED CPPUNIT_ROOT_DIR )
569      set(CPPUNIT_ROOT_USER $ENV{CPPUNIT_ROOT_DIR} ) 
570    ENDIF( DEFINED CPPUNIT_ROOT_DIR)
571  ENDIF( DEFINED CPPUNIT_ROOT_DIR OR DEFINED ENV{CPPUNIT_ROOT_DIR})
572   find_package (CPPUNIT REQUIRED)
573 endif(SOLVERLAB_WITH_TESTS)                     
574                                     
575 # Enter subdirectories
576 add_subdirectory (CDMATH)
577 if(SOLVERLAB_WITH_COREFLOWS)
578   add_subdirectory (CoreFlows)
579 endif(SOLVERLAB_WITH_COREFLOWS)
580
581 # Configuration file
582 configure_file(
583     ${PROJECT_SOURCE_DIR}/env_SOLVERLAB.sh
584     ${CMAKE_INSTALL_PREFIX}/env_SOLVERLAB.sh
585     @ONLY
586 )
587
588