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