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