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