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