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