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