Salome HOME
Tested mesh fast equivalence when giving an input field
[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.2.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   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})
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       #define MPI variables
347       #set(SOLVERLAB_WITH_MPI ON)
348       #set(MPI_HOME    ${PETSC_INSTALL} )
349       #set(MPI_LIBRARY ${PETSC_INSTALL}/lib/libmpi.so)
350       #set(MPIEXEC     ${PETSC_INSTALL}/bin/mpiexec)
351       #set(MPI4PY_ROOT_DIR    ${PETSC_INSTALL}/lib/mpi4py )
352
353     endif ( IS_DIRECTORY "/usr/include/petsc/" AND EXISTS "/usr/lib64/libpetsc.so" )
354   endif ( DEFINED ENV{PETSC_DIR} OR PETSC_DIR )
355
356 if   ( ${PETSC_VERSION} VERSION_GREATER 3.5 )
357   add_definitions(-DPETSC_VERSION_GREATER_3_5)
358 endif( ${PETSC_VERSION} VERSION_GREATER 3.5 )
359
360 string(REPLACE ";" ":"  PETSC_INCLUDES_INSTALL "${PETSC_INCLUDES}")# use colon instead of semicolon in environment file env_SOLVERLAB.sh
361
362 add_library(petsc   SHARED IMPORTED)
363 set_property(TARGET petsc  PROPERTY IMPORTED_LOCATION ${PETSC_LIBRARIES})
364 add_library(slepc   SHARED IMPORTED)
365 set_property(TARGET slepc  PROPERTY IMPORTED_LOCATION ${SLEPC_LIBRARIES})
366
367 ######################################################
368 # Detection or compilation of MEDFile                #
369 ######################################################
370 if( MEDFILE_ROOT_DIR OR DEFINED ENV{MEDFILE_ROOT_DIR})
371
372   if   ( NOT MEDFILE_ROOT_DIR )
373     set(MEDFILE_ROOT_DIR $ENV{MEDFILE_ROOT_DIR} )
374   endif( NOT MEDFILE_ROOT_DIR )
375
376   find_package (MEDFile REQUIRED)
377
378 else( MEDFILE_ROOT_DIR OR DEFINED ENV{MEDFILE_ROOT_DIR})
379
380   message(STATUS "MED will be downloaded and installed from ${DOWNLOAD_MED}")
381   set(MACHINE PCLINUX)
382   set(MEDFILE_DEFINITIONS "-D${MACHINE} -DMEDFILE_INSTALL_DOC=OFF")#Comment ne pas compiler la doc ?
383   set(MEDFILE_ROOT_DIR ${CMAKE_INSTALL_PREFIX}/lib/med) # Location of the final install
384   
385   #extraction of the tarball archive name
386   string(LENGTH "${DOWNLOAD_MED}" tarball_url_length)#length of the name of the tarball
387   string(FIND "${DOWNLOAD_MED}" "/" start_tarball_name REVERSE )# last occurence of "/"
388   MATH(EXPR start_tarball_name "${start_tarball_name}+1")#start after the occurence of "/"
389   MATH(EXPR tarball_name_length "${tarball_url_length}-${start_tarball_name}-7")#name ends before .tar.gz that counts for 7 characters
390   string(SUBSTRING ${DOWNLOAD_MED} ${start_tarball_name} ${tarball_name_length} MED_TARBALL_NAME)
391
392   ExternalProject_Add (MED
393         URL               ${DOWNLOAD_MED}  #location of med tarball
394         SOURCE_DIR        ${CMAKE_CURRENT_BINARY_DIR}/pre_requis/${MED_TARBALL_NAME}
395         BUILD_IN_SOURCE   TRUE
396         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
397         BUILD_COMMAND     make
398         INSTALL_COMMAND   make install
399         INSTALL_DIR       ${MEDFILE_ROOT_DIR}
400         STAMP_DIR         ${CMAKE_CURRENT_BINARY_DIR}/pre_requis
401         LOG_DOWNLOAD      TRUE           # Wrap download in script to log output
402         LOG_UPDATE        TRUE           # Wrap update in script to log output
403         LOG_CONFIGURE     TRUE           # Wrap configure in script to log output
404         LOG_BUILD         TRUE           # Wrap build in script to log output
405         LOG_TEST          TRUE           # Wrap test in script to log output
406         LOG_INSTALL       TRUE           # Wrap install in script to log output
407   )
408   
409   set(MEDFILE_INCLUDE_DIRS ${MEDFILE_ROOT_DIR}/include)# NĂ©cessaire pour le medloader et les sous-dossiers mesh, et IJKMesh
410   set(MEDFILE_LIBRARIES    ${MEDFILE_ROOT_DIR}/lib)# NĂ©cessaire pour le env_SOLVERLAB.sh
411   set(MEDFILE_C_LIBRARIES med medC)# NĂ©cessaire pour le medloader
412
413 endif( MEDFILE_ROOT_DIR OR DEFINED ENV{MEDFILE_ROOT_DIR})
414
415 add_library(med   SHARED IMPORTED)
416 set_property(TARGET med  PROPERTY IMPORTED_LOCATION ${MEDFILE_ROOT_DIR}/lib/libmed.so)
417 add_library(medC   SHARED IMPORTED)
418 set_property(TARGET medC PROPERTY IMPORTED_LOCATION ${MEDFILE_ROOT_DIR}/lib/libmedC.so)
419
420 string(REPLACE ";" ":"  MEDFILE_LIBRARIES_INSTALL "${MEDFILE_LIBRARIES}")# use colon instead of semicolon in environment file env_SOLVERLAB.sh
421
422 ######################################################
423 # Detection or compilation of MEDCoupling            #
424 ######################################################
425 if( MEDCOUPLING_ROOT_DIR OR DEFINED ENV{MEDCOUPLING_ROOT_DIR})
426
427   if   ( NOT MEDCOUPLING_ROOT_DIR )
428     set(MEDCOUPLING_ROOT_DIR $ENV{MEDCOUPLING_ROOT_DIR} )
429   endif( NOT MEDCOUPLING_ROOT_DIR )
430
431   message (STATUS "Seeking MEDCoupling library in ${MEDCOUPLING_ROOT_DIR}")
432
433   set(MEDCoupling_DIR  ${MEDCOUPLING_ROOT_DIR}/cmake_files)
434   find_package(MEDCoupling CONFIG REQUIRED)   # CONFIG is important !
435   message( STATUS "MEDCoupling found. Version is ${MEDCoupling_VERSION}")
436
437 else( MEDCOUPLING_ROOT_DIR OR DEFINED ENV{MEDCOUPLING_ROOT_DIR})
438   message(STATUS "MEDCoupling will be downloaded and installed from ${DOWNLOAD_MEDCOUPLING}")
439   set(MEDCOUPLING_ROOT_DIR ${CMAKE_INSTALL_PREFIX}/lib/medcoupling) # Location of the final install
440   SET(ENV{HDF5_ROOT} ${HDF5_ROOT})#MEDCoupling install process seems to require an environment variable
441
442   #extraction of the tarball archive name
443   string(LENGTH "${DOWNLOAD_MEDCOUPLING}" tarball_url_length)#length of the tarball
444   string(FIND   "${DOWNLOAD_MEDCOUPLING}" "/" start_tarball_name REVERSE )# last occurence of "/"
445   MATH(EXPR start_tarball_name "${start_tarball_name}+1")#start after the occurence of "/"
446   MATH(EXPR tarball_name_length "${tarball_url_length}-${start_tarball_name}-7")#name ends before .tar.gz that counts for 7 characters
447   string(SUBSTRING ${DOWNLOAD_MEDCOUPLING} ${start_tarball_name} ${tarball_name_length} MEDCOUPLING_TARBALL_NAME)
448   string(SUBSTRING ${MEDCOUPLING_TARBALL_NAME} 12 ${tarball_name_length} MEDCoupling_VERSION)
449
450   message(STATUS "MEDCoupling will be installed at ${MEDCOUPLING_ROOT_DIR}")
451
452   ExternalProject_Add (MEDCoupling
453         URL               ${DOWNLOAD_MEDCOUPLING}  #location of medcoupling tarball
454         SOURCE_DIR        ${CMAKE_CURRENT_BINARY_DIR}/pre_requis/${MEDCOUPLING_TARBALL_NAME}
455         BUILD_IN_SOURCE   TRUE
456         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
457         BUILD_COMMAND     make
458         INSTALL_COMMAND   make install
459         INSTALL_DIR       ${MEDCOUPLING_ROOT_DIR}
460         STAMP_DIR         ${CMAKE_CURRENT_BINARY_DIR}/pre_requis
461         LOG_DOWNLOAD      TRUE           # Wrap download in script to log output
462         LOG_UPDATE        TRUE           # Wrap update in script to log output
463         LOG_CONFIGURE     TRUE           # Wrap configure in script to log output
464         LOG_BUILD         TRUE           # Wrap build in script to log output
465         LOG_TEST          TRUE           # Wrap test in script to log output
466         LOG_INSTALL       TRUE           # Wrap install in script to log output
467   )
468
469   add_library(medloader   SHARED IMPORTED )
470   set_property(TARGET medloader   PROPERTY IMPORTED_LOCATION ${MEDCOUPLING_ROOT_DIR}/lib/libmedloader.so)
471
472   SET(MEDCOUPLING_USE_64BIT_IDS  ON)
473
474 endif( MEDCOUPLING_ROOT_DIR OR DEFINED ENV{MEDCOUPLING_ROOT_DIR} )
475
476 set(MEDCOUPLING_INCLUDE_DIR ${MEDCOUPLING_ROOT_DIR}/include)
477 set(MEDCOUPLING_LIBRARIES   ${MEDCOUPLING_ROOT_DIR}/lib    )#for environment file env_SOLVERLAB.sh 
478
479 add_library(medcoupling SHARED IMPORTED )
480 set_property(TARGET medcoupling PROPERTY IMPORTED_LOCATION ${MEDCOUPLING_ROOT_DIR}/lib/libmedcoupling.so)
481
482 if   ( ${MEDCoupling_VERSION} VERSION_GREATER 9.4 )
483   add_definitions(-DMEDCoupling_VERSION_VERSION_GREATER_9_4)
484 endif( ${MEDCoupling_VERSION} VERSION_GREATER 9.4 )
485
486 if   (TARGET MED AND TARGET PETSc)
487   ExternalProject_Add_StepDependencies( MED build PETSc )#PETSc doit ĂȘtre compilĂ© avant MED car c'est PETSc qui compile HDF5
488 endif(TARGET MED AND TARGET PETSc)
489
490 if   (TARGET MED AND TARGET MEDCoupling)
491   ExternalProject_Add_StepDependencies( MEDCoupling build MED )#MED doit ĂȘtre compilĂ© avant MEDCoupling
492 endif(TARGET MED AND TARGET MEDCoupling)
493  
494 if   (TARGET PETSc AND TARGET MEDCoupling)
495   ExternalProject_Add_StepDependencies( MEDCoupling build PETSc )#PETSc doit ĂȘtre compilĂ© avant MEDCoupling (car il contient hdf5)
496 endif(TARGET PETSc AND TARGET MEDCoupling)
497
498 IF(MEDCOUPLING_USE_64BIT_IDS)
499   SET(CMAKE_SWIG_FLAGS ${CMAKE_SWIG_FLAGS} -DMEDCOUPLING_USE_64BIT_IDS)
500 ENDIF(MEDCOUPLING_USE_64BIT_IDS)
501  
502 ####################
503 # Final operations #
504 ####################                                  
505
506 # Paraview variables to choose python version and for env_SOLVERLAB.sh  
507 if  ( PARAVIEW_ROOT_DIR OR DEFINED ENV{PARAVIEW_ROOT_DIR})
508   if  ( PARAVIEW_ROOT_DIR )
509     set( PARAVIEW_INCLUDE_DIR   ${PARAVIEW_ROOT_DIR}/include)
510     set( PARAVIEW_LIBRARIES_DIR ${PARAVIEW_ROOT_DIR}/lib)
511   else( PARAVIEW_ROOT_DIR )
512     set( PARAVIEW_ROOT_DIR      $ENV{PARAVIEW_ROOT_DIR} )
513     set( PARAVIEW_INCLUDE_DIR   $ENV{PARAVIEW_ROOT_DIR}/include)
514     set( PARAVIEW_LIBRARIES_DIR $ENV{PARAVIEW_ROOT_DIR}/lib)
515   endif( PARAVIEW_ROOT_DIR )
516 else( PARAVIEW_ROOT_DIR OR DEFINED ENV{PARAVIEW_ROOT_DIR})
517   message(STATUS "PARAVIEW_ROOT_DIR not set. Trying to detect paraview in the system.")
518   set( PARAVIEW_INCLUDE_DIR /usr/include/paraview/)
519   set( PARAVIEW_LIBRARIES_DIR /usr/lib/paraview/:/usr/lib64/paraview/:/usr/lib64/vtk/:/usr/lib/vtk/:/usr/lib/x86_64-linux-gnu)
520 endif( PARAVIEW_ROOT_DIR OR DEFINED ENV{PARAVIEW_ROOT_DIR})
521
522 if  ( DEFINED PARAVIEW_VERSION OR DEFINED ENV{PARAVIEW_VERSION} )
523   if   ( NOT DEFINED PARAVIEW_VERSION )
524     set( PARAVIEW_VERSION  $ENV{PARAVIEW_VERSION})
525   endif( NOT DEFINED PARAVIEW_VERSION )
526   message(STATUS "ParaView version is ${PARAVIEW_VERSION}" )
527 else( DEFINED PARAVIEW_VERSION OR DEFINED ENV{PARAVIEW_VERSION} )
528   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 )
529   find_file( vtkConfig_file vtkPVConfig.h HINTS ${PARAVIEW_INCLUDE_DIR} PATH_SUFFIXES ${PARAVIEW_SUFFIXES})
530
531   #extraction of the paraview version"
532   IF   ( ${vtkConfig_file} STREQUAL "vtkConfig_file-NOTFOUND" )
533     message(WARNING "Could not find ParaView configuration file vtkPVConfig.h in folder ${PARAVIEW_INCLUDE_DIR} and subdirectories  ${PARAVIEW_SUFFIXES}. Postprocessing may not work")
534     set( PARAVIEW_VERSION  "5.8")
535   ELSE ( ${vtkConfig_file} STREQUAL "vtkConfig_file-NOTFOUND" )
536     message( STATUS "Found vtkPVConfig.h in ${vtkConfig_file}")
537     file(STRINGS ${vtkConfig_file} vtkConfig)
538     FOREACH(line ${vtkConfig})
539       string(FIND "${line}" "#define PARAVIEW_VERSION_FULL " pos)
540       IF(NOT ${pos} EQUAL -1)
541         string(LENGTH ${line} line_length)#length of the tarball
542         MATH(EXPR start_pv_version "${line_length}-6")#line ends with "x.y.z", that counts for 7 characters
543         string(SUBSTRING ${line} ${start_pv_version} 5 PARAVIEW_VERSION)
544         break()
545       ENDIF(NOT ${pos} EQUAL -1)
546     ENDFOREACH(line ${vtkConfig})
547     message(STATUS "ParaView detected, version is ${PARAVIEW_VERSION}" )
548   ENDIF( ${vtkConfig_file} STREQUAL "vtkConfig_file-NOTFOUND" )
549 endif( DEFINED PARAVIEW_VERSION OR DEFINED ENV{PARAVIEW_VERSION} )
550
551 #Choose python 2 or 3  
552 IF   ( ${PARAVIEW_VERSION} STRGREATER "5.6" OR ${PARAVIEW_VERSION} STREQUAL "5.6" )#Use python 3, use VERSION_GREATER_EQUAL if cmake >=3.7
553   SET(PYTHON2OR3 "3")
554   message(STATUS "PARAVIEW_VERSION greater than 5.6. We need python3 for postprocessing scripts.")
555 ELSE ( ${PARAVIEW_VERSION} STRGREATER "5.6" OR ${PARAVIEW_VERSION} STREQUAL "5.6" )#Use python 2
556   SET(PYTHON2OR3 "2")
557   message(STATUS "PARAVIEW_VERSION smaller than 5.6. We need python2 for postprocessing scripts.")
558 ENDIF( ${PARAVIEW_VERSION} STRGREATER "5.6" OR ${PARAVIEW_VERSION} STREQUAL "5.6" )
559
560 # Find python
561 IF   ( PYTHON_ROOT_DIR OR DEFINED ENV{PYTHON_ROOT_DIR})
562   IF  ( PYTHON_ROOT_DIR )
563     set(Python_ROOT_DIR ${PYTHON_ROOT_DIR} ) 
564   ELSE( PYTHON_ROOT_DIR )
565     set(Python_ROOT_DIR $ENV{PYTHON_ROOT_DIR} ) 
566   ENDIF( PYTHON_ROOT_DIR)
567 ENDIF( PYTHON_ROOT_DIR OR DEFINED ENV{PYTHON_ROOT_DIR})
568
569 IF   (${CMAKE_VERSION} VERSION_GREATER "3.12.0")
570   find_package(Python ${PYTHON2OR3} REQUIRED COMPONENTS Interpreter Development )
571   SET(PYTHON_EXECUTABLE ${Python_EXECUTABLE})
572 ELSE (${CMAKE_VERSION} VERSION_GREATER "3.12.0")
573   find_package(PythonInterp ${PYTHON2OR3} REQUIRED )
574   find_package(PythonLibs   ${PYTHON2OR3} REQUIRED )
575   set(Python_LIBRARIES     ${PYTHON_LIBRARIES})
576   set(Python_INCLUDE_DIRS  ${PYTHON_INCLUDE_DIRS})
577   set(Python_VERSION       ${PYTHON_VERSION_STRING})
578   set(Python_VERSION_MAJOR ${PYTHON_VERSION_MAJOR})
579   set(Python_VERSION_MINOR ${PYTHON_VERSION_MINOR})
580 ENDIF(${CMAKE_VERSION} VERSION_GREATER "3.12.0")
581
582 message(STATUS "Python version found is ${Python_VERSION}")
583
584 #Matplotlib root dir
585 IF   ( NOT DEFINED MATPLOTLIB_ROOT_DIR )
586     set(MATPLOTLIB_ROOT_DIR $ENV{MATPLOTLIB_ROOT_DIR} )
587 ENDIF( NOT DEFINED MATPLOTLIB_ROOT_DIR )
588
589 #PyQt5 root dir
590 IF   ( NOT DEFINED PYQT5_ROOT_DIR )
591     set(PYQT5_ROOT_DIR $ENV{PYQT5_ROOT_DIR} )
592 ENDIF( NOT DEFINED PYQT5_ROOT_DIR )
593
594 #Paraview library paths
595 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})
596 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)
597
598 # Detection of python-paraview
599 string(REPLACE ":" ";"  PV_PYTHON_DIR_PATHS "${PV_PYTHON_DIR}")# use semicolon instead of colon in PATH search
600 find_file(python-paraview simple.py PATHS ${PV_PYTHON_DIR_PATHS})
601 if( ${python-paraview} STREQUAL "python-paraview-NOTFOUND" )
602   message(WARNING "Python Paraview library not found. Post processing will fail in SOLVERLAB scripts.")
603   set(PRELOAD_NETCDF_ON_UBUNTU20 OFF)
604 else( ${python-paraview} STREQUAL "python-paraview-NOTFOUND" )
605   if(    ${python-paraview} STREQUAL "/usr/lib/python3/dist-packages/paraview/simple.py" )
606     message ( STATUS "Using system Paraview python libraries on Ubuntu 20.04 requires the presence and preload of library netcdf (bug in linkage)." )
607     if(    EXISTS "/usr/lib/x86_64-linux-gnu/libnetcdf.so" )
608       message ( STATUS "Library netcdf found in the system. Paraview python libraries should be functional." )
609       set(PRELOAD_NETCDF_ON_UBUNTU20 ON)
610     else(  EXISTS "/usr/lib/x86_64-linux-gnu/libnetcdf.so" )
611       message ( WARNING "Library netcdf not found in system. Paraview python libraries may not be functional (bug in linkage)." )
612       set(PRELOAD_NETCDF_ON_UBUNTU20 OFF)
613     endif( EXISTS "/usr/lib/x86_64-linux-gnu/libnetcdf.so" )
614   else(  ${python-paraview} STREQUAL "/usr/lib/python3/dist-packages/paraview/simple.py" )
615     message(STATUS "Python Paraview library found. Post processing will work in SOLVERLAB scripts.")
616     set(PRELOAD_NETCDF_ON_UBUNTU20 OFF)
617   endif( ${python-paraview} STREQUAL "/usr/lib/python3/dist-packages/paraview/simple.py" )
618 endif( ${python-paraview} STREQUAL "python-paraview-NOTFOUND" )
619
620 # Find SWIG
621 IF   ( DEFINED SWIG_ROOT_DIR OR DEFINED ENV{SWIG_ROOT_DIR})
622   IF   ( DEFINED SWIG_ROOT_DIR )
623     set(SWIG_EXECUTABLE    ${SWIG_ROOT_DIR}/bin/swig ) 
624   ELSE ( DEFINED SWIG_ROOT_DIR )
625     set(SWIG_EXECUTABLE $ENV{SWIG_ROOT_DIR}/bin/swig ) 
626   ENDIF( DEFINED SWIG_ROOT_DIR)
627 ENDIF( DEFINED SWIG_ROOT_DIR OR DEFINED ENV{SWIG_ROOT_DIR})
628 find_package (SWIG 3.0 REQUIRED)
629
630 # Find Doxygen
631 if (SOLVERLAB_WITH_DOCUMENTATION)                                                                           #
632  IF   ( DEFINED DOXYGEN_ROOT_DIR OR DEFINED ENV{DOXYGEN_ROOT_DIR})
633    IF   ( DEFINED DOXYGEN_ROOT_DIR )
634      set(DOXYGEN_EXECUTABLE    ${DOXYGEN_ROOT_DIR}/bin/doxygen ) 
635    ELSE ( DEFINED DOXYGEN_ROOT_DIR )
636      set(DOXYGEN_EXECUTABLE $ENV{DOXYGEN_ROOT_DIR}/bin/doxygen ) 
637    ENDIF( DEFINED DOXYGEN_ROOT_DIR)
638  ENDIF( DEFINED DOXYGEN_ROOT_DIR OR DEFINED ENV{DOXYGEN_ROOT_DIR})
639   find_package (Doxygen)                                                                                    #
640   set (CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, doxygen, graphviz, mscgen")
641   set (CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES}, doxygen, graphviz, mscgen")
642   if   (NOT DOXYGEN_FOUND)
643     message (FATAL_ERROR "Doxygen is needed to build the documentation. Please install it correctly.")
644   endif(NOT DOXYGEN_FOUND)
645 endif(SOLVERLAB_WITH_DOCUMENTATION)                     
646
647 if (SOLVERLAB_WITH_TESTS)                                                                                  #
648   enable_testing ()
649  IF   ( DEFINED CPPUNIT_ROOT_DIR OR DEFINED ENV{CPPUNIT_ROOT_DIR})
650    IF   ( DEFINED CPPUNIT_ROOT_DIR )
651      set(CPPUNIT_ROOT_USER    ${CPPUNIT_ROOT_DIR} ) 
652    ELSE ( DEFINED CPPUNIT_ROOT_DIR )
653      set(CPPUNIT_ROOT_USER $ENV{CPPUNIT_ROOT_DIR} ) 
654    ENDIF( DEFINED CPPUNIT_ROOT_DIR)
655  ENDIF( DEFINED CPPUNIT_ROOT_DIR OR DEFINED ENV{CPPUNIT_ROOT_DIR})
656   find_package (CPPUNIT REQUIRED)
657 endif(SOLVERLAB_WITH_TESTS)                     
658                                     
659 # Enter subdirectories
660 set(CDMATH_WITH_POSTPRO ${SOLVERLAB_WITH_POSTPRO} )
661 set(CDMATH_WITH_PETSC ${SOLVERLAB_WITH_PETSC} )
662 set(CDMATH_WITH_DOCUMENTATION ${SOLVERLAB_WITH_DOCUMENTATION} )
663 set(CDMATH_WITH_PYTHON ${SOLVERLAB_WITH_PYTHON} )
664 set(CDMATH_WITH_PACKAGE ${SOLVERLAB_WITH_PACKAGE} )
665 set(CDMATH_WITH_TESTS ${SOLVERLAB_WITH_TESTS} )
666 add_subdirectory (CDMATH)
667 if(SOLVERLAB_WITH_COREFLOWS)
668   set(COREFLOWS_WITH_DOCUMENTATION ${SOLVERLAB_WITH_DOCUMENTATION} )
669   set(COREFLOWS_WITH_PYTHON ${SOLVERLAB_WITH_PYTHON} )
670   set(COREFLOWS_WITH_GUI ${SOLVERLAB_WITH_GUI} )
671   set(COREFLOWS_WITH_PACKAGE ${SOLVERLAB_WITH_PACKAGE} )
672   set(COREFLOWS_WITH_TESTS ${SOLVERLAB_WITH_TESTS} )
673   add_subdirectory (CoreFlows)
674 endif(SOLVERLAB_WITH_COREFLOWS)
675
676 # Configuration file
677 configure_file(
678     ${PROJECT_SOURCE_DIR}/env_SOLVERLAB.sh
679     ${CMAKE_INSTALL_PREFIX}/env_SOLVERLAB.sh
680     @ONLY
681 )
682