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