Salome HOME
set environment for tests
[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 0)
8 set (SOLVERLAB_VERSION_MINOR 1)
9
10 option (SOLVERLAB_WITH_DOCUMENTATION "Generate SOLVERLAB documentation" ON)
11 option (SOLVERLAB_WITH_PYTHON        "Compile Python interface of SOLVERLAB" ON)
12 option (SOLVERLAB_WITH_GUI           "Compile a Graphic user Interface for SOLVERLAB" OFF)
13 option (SOLVERLAB_WITH_PACKAGE       "Generate RPM, Debian and tarball packages" OFF)
14 option (SOLVERLAB_WITH_COREFLOWS     "Generate COREFLOWS module" ON)
15 option (SOLVERLAB_WITH_TESTS         "Generate SOLVERLAB example tests" ON)
16
17 #Path to installed libraries
18 set (PETSC_DIR            OFF CACHE STRING "PETSc library path" )
19 set (SLEPC_DIR            OFF CACHE STRING "SLEPc library path" )
20 set (HDF5_ROOT            OFF CACHE STRING "HDF5 library path" )#For the compilation of MED with a specific version of HDF5
21 set (MEDFILE_ROOT_DIR     OFF CACHE STRING "MED library path" )
22 set (MEDCOUPLING_ROOT_DIR OFF CACHE STRING "MEDCoupling library path" )
23 set (PYTHON_ROOT_DIR      OFF CACHE STRING "Python library path" )
24
25 #url of tarball librairies
26 set (DOWNLOAD_PETSC         http://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-lite-3.14.0.tar.gz 
27      CACHE STRING           "PETSc tarball path/url" )
28 set (DOWNLOAD_SLEPC         https://slepc.upv.es/download/distrib/slepc-3.14.0.tar.gz
29      CACHE STRING           "SLEPC tarball path/url" )
30 set (DOWNLOAD_F2CBLASLAPACK https://www.mcs.anl.gov/petsc/mirror/externalpackages/f2cblaslapack-3.4.2.q4.tar.gz
31      CACHE STRING           "F2CBLASLAPACK tarball path/url" )
32 set (DOWNLOAD_HDF5          https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.3/src/hdf5-1.10.3.tar.gz  
33      CACHE STRING           "HDF5 tarball path/url" )
34 set (DOWNLOAD_MED           http://files.salome-platform.org/Salome/other/med-4.1.0.tar.gz
35      CACHE STRING           "MED tarball path/url")
36 set (DOWNLOAD_MEDCOUPLING   http://files.salome-platform.org/Salome/other/medCoupling-9.4.0.tar.gz
37      CACHE STRING           "MEDCoupling tarball path/url" )
38
39 set (CMAKE_BUILD_TYPE Release CACHE STRING "Installation mode")
40
41 list (APPEND CMAKE_MODULE_PATH "${SOLVERLAB_SOURCE_DIR}/cmake_files")
42
43 include(ExternalProject)#For PETSc, MED and MEDCoupling
44
45 set(Python_ROOT_DIR $ENV{PYTHON_ROOT_DIR} )
46 set(PYQT5_ROOT_DIR $ENV{PYQT5_ROOT_DIR} )
47 set(PARAVIEW_ROOT_DIR $ENV{PARAVIEW_ROOT_DIR} )
48 set(MATPLOTLIB_ROOT_DIR $ENV{MATPLOTLIB_ROOT_DIR} )
49 set(HDF5_ROOT_DIR $ENV{HDF5_ROOT_DIR} )
50
51 ######################################################
52 # Detection or compilation of PETSc+SLEPc+HDF5       #
53 ######################################################
54   if ( DEFINED ENV{PETSC_DIR} OR PETSC_DIR)
55     if   (NOT PETSC_DIR)
56       set(PETSC_DIR $ENV{PETSC_DIR})
57       message ( STATUS "Checking variable PETSC_DIR : " $ENV{PETSC_DIR} )
58     else (NOT PETSC_DIR)
59       message ( STATUS "Checking variable PETSC_DIR : " ${PETSC_DIR} )
60     endif(NOT PETSC_DIR)
61
62     find_package (PETSc 3.4 REQUIRED)
63     petsc_get_version ()
64
65     message ( STATUS "PETSc found. Version is ${PETSC_VERSION_MAJOR}.${PETSC_VERSION_MINOR}.${PETSC_VERSION_SUBMINOR}" )
66     set(PETSC_INSTALL ${PETSC_DIR})
67
68     #Define and search slepc variables
69     if   ( NOT SLEPC_DIR )
70       if   ( DEFINED ENV{SLEPC_DIR} )
71         set(SLEPC_DIR $ENV{SLEPC_DIR})
72       else ( DEFINED ENV{SLEPC_DIR} )
73         set(SLEPC_DIR ${PETSC_DIR}/${PETSC_ARCH})
74       endif( DEFINED ENV{SLEPC_DIR} )
75     endif( NOT SLEPC_DIR)
76
77     message ( STATUS "Checking variable SLEPC_DIR" )
78     if ( IS_DIRECTORY ${SLEPC_DIR}/include AND EXISTS ${SLEPC_DIR}/lib/libslepc.so)
79       set(SLEPC_INCLUDES  ${SLEPC_DIR}/include)
80       set(SLEPC_LIBRARIES ${SLEPC_DIR}/lib/libslepc.so)
81       message( STATUS "SLEPc found at ${SLEPC_DIR}" )
82     else()
83       message( FATAL_ERROR "SLEPc not found at ${SLEPC_DIR}" )
84     endif()
85
86     #define hdf5 variables
87     if   ( NOT HDF5_ROOT )#hdf5 is not defined in cmake arguments
88       if  ( DEFINED ENV{HDF5_ROOT} )#hdf5 is defined in the environment
89         set(HDF5_ROOT $ENV{HDF5_ROOT})
90       else( DEFINED ENV{HDF5_ROOT} )#hdf5 is not defined in the environment
91         #HDF5 to be found in petsc external packages
92         set(HDF5_ROOT ${PETSC_DIR}/${PETSC_ARCH})# define hint for hdf5/med installation in petsc external packages
93       endif( DEFINED ENV{HDF5_ROOT} )
94     endif( NOT HDF5_ROOT )
95     set(HDF5_LIBRARY_DIR  ${HDF5_ROOT}/lib)
96     set(HDF5_INCLUDE_DIRS ${HDF5_ROOT}/include)
97   else ( DEFINED ENV{PETSC_DIR} OR PETSC_DIR )
98     message ( STATUS "PETSC_DIR not set, searching PETSc and SLEPc in the system" )
99
100     if ( IS_DIRECTORY "/usr/include/petsc/" AND EXISTS "/usr/lib64/libpetsc.so" )  #Case fedora/redhat system install
101       message ( STATUS "PETSC includes found in /usr/include/petsc/" )
102       message ( STATUS "PETSC library  found in /usr/lib64" )
103       set(PETSC_DIR /usr/)
104       set(PETSC_INCLUDES  /usr/include/petsc /usr/include/petsc/petsc/mpiuni)
105       set(PETSC_LIBRARIES /usr/lib64/libpetsc.so)
106
107       set(PETSC_VERSION "3.8") #3.8 for fedora 26 , 3.9 for fedora 29 , 3.10 for fedora 30, , 3.12 for fedora 32
108       
109       set(CPACK_RPM_PACKAGE_REQUIRES   "${CPACK_RPM_PACKAGE_REQUIRES}, petsc-devel (>= 3.4)") # This is not fully working yet. 
110       set(PETSC_INSTALL ${PETSC_DIR})
111
112       #Define and search slepc variables
113       if   ( IS_DIRECTORY "/usr/include/slepc/" AND EXISTS "/usr/lib64/libslepc.so" )
114         message( STATUS "SLEPc includes found in /usr/include/slepc/" )
115         message( STATUS "SLEPc library  found in /usr/lib64/slepc/" )
116         set(SLEPC_DIR /usr/)
117         set(SLEPC_INCLUDES  ${SLEPC_DIR}/include)
118         set(SLEPC_LIBRARIES ${SLEPC_DIR}/lib/libslepc.so)
119         set (CPACK_RPM_PACKAGE_REQUIRES   "${CPACK_RPM_PACKAGE_REQUIRES}, slepc-devel (>= 3.4)") # This is not fully working yet. 
120       else ( IS_DIRECTORY "/usr/include/slepc/" AND EXISTS "/usr/lib64/libslepc.so" )
121         message( FATAL_ERROR "SLEPc not found in the system" )
122       endif( IS_DIRECTORY "/usr/include/slepc/" AND EXISTS "/usr/lib64/libslepc.so" )
123
124       #HDF5 to be found in the system
125       if   ( NOT HDF5_ROOT AND NOT DEFINED ENV{HDF5_ROOT} )#hdf5 is not defined in the environment
126         find_package(HDF5 REQUIRED)
127         set(CPACK_DEBIAN_PACKAGE_DEPENDS "libhdf5-dev")
128         set(CPACK_RPM_PACKAGE_REQUIRES   "hdf5-devel")
129       endif( NOT HDF5_ROOT AND NOT DEFINED ENV{HDF5_ROOT} )
130
131     #elseif ( IS_DIRECTORY "/usr/lib/petsc/include" AND EXISTS "/usr/lib/petsc/lib/libpetsc_real.so" ) #Case ubuntu/debian system install
132     #  message ( STATUS "PETSc includes found in /usr/lib/petsc/include")
133     #  message ( STATUS "PETSc library  found in /usr/lib/petsc/lib/libpetsc_real.so")
134     #  set(PETSC_DIR /usr/lib/petsc/)
135     #  set(PETSC_INCLUDES  ${PETSC_DIR}/include ${PETSC_DIR}/include/petsc/mpiuni)
136     #  set(PETSC_LIBRARIES ${PETSC_DIR}/lib/libpetsc_real.so)
137
138     #  find_package (PETSc 3.4 REQUIRED)
139     #  petsc_get_version ()
140     #  set (CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, petsc-dev   (>= 3.4)") # This is not fully working yet. 
141
142     #  Define and search slepc variables
143     #  if   ( IS_DIRECTORY "/usr/lib/slepc/include" AND EXISTS "/usr/lib/slepc/lib/libslepc_real.so" )
144     #    message( STATUS "SLEPc includes found in /usr/lib/slepc/include" )
145     #    message( STATUS "SLEPc library  found in /usr/lib/slepc/lib/libslepc_real.so" )
146     #    set(SLEPC_DIR /usr/lib/slepc/)
147     #    set(SLEPC_INCLUDES ${SLEPC_DIR}/include)
148     #    set(SLEPC_LIBRARIES ${SLEPC_DIR}/lib/libslepc_real.so)
149     #    set (CPACK_DEBIAN_PACKAGE_REQUIRES   "${CPACK_DEBIAN_PACKAGE_REQUIRES}, slepc-devel (>= 3.4)") # This is not fully working yet. 
150     #  else ( IS_DIRECTORY "/usr/lib/slepc/include" AND EXISTS "/usr/lib/slepc/lib/libslepc_real.so" )
151     #    message( FATAL_ERROR "SLEPc not found in the system" )
152     #  endif( IS_DIRECTORY "/usr/lib/slepc/include" AND EXISTS "/usr/lib/slepc/lib/libslepc_real.so" )
153
154     #elseif ( IS_DIRECTORY "/usr/local/lib/python2.7/dist-packages/petsc") #Case ubuntu/debian system pip install
155
156     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
157       message (STATUS "PETSC not found in the system")
158       message (STATUS "PETSC will be downloaded and compiled from ${DOWNLOAD_PETSC}" )
159       message (STATUS "SLEPC will be downloaded and compiled from ${DOWNLOAD_SLEPC}" )
160       message (STATUS "HDF5  will be downloaded and compiled from ${DOWNLOAD_HDF5}" )
161
162       #extract tarball name
163       string(LENGTH "${DOWNLOAD_PETSC}" tarball_url_length)#length of the tarball
164       string(FIND   "${DOWNLOAD_PETSC}" "/" start_tarball_name REVERSE )# last occurence of "/"
165       MATH(EXPR start_tarball_name  "${start_tarball_name}+1")#start after the occurence of "/"
166       MATH(EXPR tarball_name_length "${tarball_url_length}-${start_tarball_name}-7")#name ends before .tar.gz that counts for 7 characters
167       string(SUBSTRING ${DOWNLOAD_PETSC} ${start_tarball_name} ${tarball_name_length} PETSC_TARBALL_NAME)
168
169       set(PETSC_DIR ${CMAKE_CURRENT_BINARY_DIR}/pre_requis/${PETSC_TARBALL_NAME}) # Location of the final install 
170       set(PETSC_ARCH arch-linux-c-opt)
171       set(PETSC_INSTALL ${CMAKE_INSTALL_PREFIX}/share/petsc)#folder to copy petsc libraries and include files
172
173       ExternalProject_Add (PETSc
174       URL               ${DOWNLOAD_PETSC}   
175       SOURCE_DIR        ${PETSC_DIR}
176       BUILD_IN_SOURCE   TRUE
177       CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=${PETSC_INSTALL} --with-debugging=0 --with-mpi=0 --download-f2cblaslapack=${DOWNLOAD_F2CBLASLAPACK} --with-fc=0 --download-slepc=${DOWNLOAD_SLEPC} --download-hdf5=${DOWNLOAD_HDF5}
178       BUILD_COMMAND     make all
179       TEST_COMMAND      make check
180       INSTALL_COMMAND   make install
181       INSTALL_DIR       ${PETSC_DIR}
182       STAMP_DIR         ${CMAKE_CURRENT_BINARY_DIR}/pre_requis
183       LOG_DOWNLOAD      TRUE           # Wrap download in script to log output
184       LOG_UPDATE        TRUE           # Wrap update in script to log output
185       LOG_CONFIGURE     TRUE           # Wrap configure in script to log output
186       LOG_BUILD         TRUE           # Wrap build in script to log output
187       LOG_TEST          TRUE           # Wrap test in script to log output
188       LOG_INSTALL       TRUE           # Wrap install in script to log output
189        )
190
191       message( STATUS "PETSc, SLEPc and HDF5 will be installed at ${PETSC_INSTALL}")
192
193       string(LENGTH "${PETSC_TARBALL_NAME}" tarball_name_length)#length of the tarball
194       string(FIND   "${PETSC_TARBALL_NAME}" "-" start_version_name REVERSE )# last occurence of "-"
195       MATH(EXPR start_version_name  "${start_version_name}+1")#start after the occurence of "/"
196       string(SUBSTRING ${PETSC_TARBALL_NAME} ${start_version_name} ${tarball_name_length} PETSC_VERSION)
197       message( STATUS "PETSc version ${PETSC_VERSION}  will be installed" )
198
199       set(PETSC_INCLUDES  ${PETSC_DIR}/${PETSC_ARCH}/include ${PETSC_DIR}/include)
200       set(PETSC_LIBRARIES ${PETSC_DIR}/${PETSC_ARCH}/lib/libpetsc.so)
201
202       #define slepc variables
203       set(SLEPC_DIR ${PETSC_INSTALL})
204       set(SLEPC_INCLUDES ${SLEPC_DIR}/include  ${PETSC_DIR}/${PETSC_ARCH}/externalpackages/slepc-3.13.4/include ${PETSC_DIR}/${PETSC_ARCH}/externalpackages/slepc-3.13.4/installed-arch-linux2-c-opt/include)
205       set(SLEPC_LIBRARIES ${PETSC_DIR}/${PETSC_ARCH}/externalpackages/slepc-3.13.4/installed-arch-linux2-c-opt/lib/libslepc.so)
206       message( STATUS "SLEPc includes ${SLEPC_INCLUDES}")
207
208       #define hdf5 variables
209       if   ( NOT HDF5_ROOT )#hdf5 is not defined in cmake arguments
210         if  ( DEFINED ENV{HDF5_ROOT} )#hdf5 is defined in the environment
211           set(HDF5_ROOT $ENV{HDF5_ROOT})
212         else( DEFINED ENV{HDF5_ROOT} )#hdf5 is not defined in the environment          
213           set(HDF5_ROOT ${PETSC_INSTALL})#HDF5 to be found in petsc installation
214         endif( DEFINED ENV{HDF5_ROOT} )
215       endif( NOT HDF5_ROOT )
216       set(HDF5_LIBRARY_DIR ${HDF5_ROOT}/lib)
217       set(HDF5_INCLUDE_DIRS ${HDF5_ROOT}/include)
218
219     endif ( IS_DIRECTORY "/usr/include/petsc/" AND EXISTS "/usr/lib64/libpetsc.so" )
220   endif ( DEFINED ENV{PETSC_DIR} OR PETSC_DIR )
221
222   if   ( ${PETSC_VERSION} VERSION_GREATER 3.5 )
223     add_definitions(-DPETSC_VERSION_GREATER_3_5)
224   endif( ${PETSC_VERSION} VERSION_GREATER 3.5 )
225
226 string(REPLACE ";" ":"  PETSC_INCLUDES_INSTALL "${PETSC_INCLUDES}")# use colon instead of semicolon in environment file env_SOLVERLAB.sh
227
228 add_library(petsc   SHARED IMPORTED)
229 set_property(TARGET petsc  PROPERTY IMPORTED_LOCATION ${PETSC_LIBRARIES})
230 add_library(slepc   SHARED IMPORTED)
231 set_property(TARGET slepc  PROPERTY IMPORTED_LOCATION ${SLEPC_LIBRARIES})
232
233 ######################################################
234 # Detection or compilation of MEDFile                #
235 ######################################################
236 if( MEDFILE_ROOT_DIR OR DEFINED ENV{MEDFILE_ROOT_DIR})
237
238   if   ( NOT MEDFILE_ROOT_DIR )
239     set(MEDFILE_ROOT_DIR $ENV{MEDFILE_ROOT_DIR} )
240   endif( NOT MEDFILE_ROOT_DIR )
241
242   find_package (MEDFile REQUIRED)
243   message (STATUS "MEDFile found in ${MEDFILE_ROOT_DIR}")
244
245 else( MEDFILE_ROOT_DIR OR DEFINED ENV{MEDFILE_ROOT_DIR})
246
247   message(STATUS "MED will be downloaded and installed from ${DOWNLOAD_MED}")
248   set(MACHINE PCLINUX)
249   set(MEDFILE_DEFINITIONS "-D${MACHINE} -DMEDFILE_INSTALL_DOC=OFF")#Comment ne pas compiler la doc ?
250   set(MEDFILE_ROOT_DIR ${CMAKE_INSTALL_PREFIX}/share/med) # Location of the final install
251   
252   #extraction of the tarball archive name
253   string(LENGTH "${DOWNLOAD_MED}" tarball_url_length)#length of the name of the tarball
254   string(FIND "${DOWNLOAD_MED}" "/" start_tarball_name REVERSE )# last occurence of "/"
255   MATH(EXPR start_tarball_name "${start_tarball_name}+1")#start after the occurence of "/"
256   MATH(EXPR tarball_name_length "${tarball_url_length}-${start_tarball_name}-7")#name ends before .tar.gz that counts for 7 characters
257   string(SUBSTRING ${DOWNLOAD_MED} ${start_tarball_name} ${tarball_name_length} MED_TARBALL_NAME)
258
259   ExternalProject_Add (MED
260         URL               ${DOWNLOAD_MED}  #location of med tarball
261         SOURCE_DIR        ${CMAKE_CURRENT_BINARY_DIR}/pre_requis/${MED_TARBALL_NAME}
262         BUILD_IN_SOURCE   TRUE
263         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 
264         BUILD_COMMAND     make
265         INSTALL_COMMAND   make install
266         INSTALL_DIR       ${MEDFILE_ROOT_DIR}
267         STAMP_DIR         ${CMAKE_CURRENT_BINARY_DIR}/pre_requis
268         LOG_DOWNLOAD      TRUE           # Wrap download in script to log output
269         LOG_UPDATE        TRUE           # Wrap update in script to log output
270         LOG_CONFIGURE     TRUE           # Wrap configure in script to log output
271         LOG_BUILD         TRUE           # Wrap build in script to log output
272         LOG_TEST          TRUE           # Wrap test in script to log output
273         LOG_INSTALL       TRUE           # Wrap install in script to log output
274   )
275   
276   set(MEDFILE_INCLUDE_DIRS ${MEDFILE_ROOT_DIR}/include)# Nécessaire pour le medloader et les sous-dossiers mesh, et IJKMesh
277   set(MEDFILE_LIBRARIES    ${MEDFILE_ROOT_DIR}/lib)# Nécessaire pour le env_SOLVERLAB.sh
278   set(MEDFILE_C_LIBRARIES med medC)# Nécessaire pour le medloader
279
280 endif( MEDFILE_ROOT_DIR OR DEFINED ENV{MEDFILE_ROOT_DIR})
281
282 add_library(med   SHARED IMPORTED)
283 set_property(TARGET med  PROPERTY IMPORTED_LOCATION ${MEDFILE_ROOT_DIR}/lib/libmed.so)
284 add_library(medC   SHARED IMPORTED)
285 set_property(TARGET medC PROPERTY IMPORTED_LOCATION ${MEDFILE_ROOT_DIR}/lib/libmedC.so)
286
287 string(REPLACE ";" ":"  MEDFILE_LIBRARIES_INSTALL "${MEDFILE_LIBRARIES}")# use colon instead of semicolon in environment file env_SOLVERLAB.sh
288
289 ######################################################
290 # Detection or compilation of MEDCoupling            #
291 ######################################################
292 if( MEDCOUPLING_ROOT_DIR OR DEFINED ENV{MEDCOUPLING_ROOT_DIR})
293
294   if( NOT MEDCOUPLING_ROOT_DIR )
295     set(MEDCOUPLING_ROOT_DIR $ENV{MEDCOUPLING_ROOT_DIR} )
296   endif( NOT MEDCOUPLING_ROOT_DIR )
297
298   message (STATUS "Seeking MEDCoupling library in ${MEDCOUPLING_ROOT_DIR}")
299
300   if( NOT EXISTS ${MEDCOUPLING_ROOT_DIR}/lib/libmedloader.so OR NOT EXISTS ${MEDCOUPLING_ROOT_DIR}/lib/libmedcoupling.so OR NOT EXISTS ${MEDCOUPLING_ROOT_DIR}/include/MEDCoupling.hxx)
301     message (FATAL_ERROR "MEDCoupling library not found in ${MEDCOUPLING_ROOT_DIR}")
302   else( NOT EXISTS ${MEDCOUPLING_ROOT_DIR}/lib/libmedloader.so OR NOT EXISTS ${MEDCOUPLING_ROOT_DIR}/lib/libmedcoupling.so OR NOT EXISTS ${MEDCOUPLING_ROOT_DIR}/include/MEDCoupling.hxx)
303     message (STATUS "MEDCoupling library found in ${MEDCOUPLING_ROOT_DIR}")
304   endif( NOT EXISTS ${MEDCOUPLING_ROOT_DIR}/lib/libmedloader.so OR NOT EXISTS ${MEDCOUPLING_ROOT_DIR}/lib/libmedcoupling.so OR NOT EXISTS ${MEDCOUPLING_ROOT_DIR}/include/MEDCoupling.hxx)
305
306 else( MEDCOUPLING_ROOT_DIR OR DEFINED ENV{MEDCOUPLING_ROOT_DIR})
307   message(STATUS "MEDCoupling will be downloaded and installed from ${DOWNLOAD_MEDCOUPLING}")
308   set(MEDCOUPLING_ROOT_DIR ${CMAKE_INSTALL_PREFIX}/share/medcoupling) # Location of the final install
309   SET(ENV{HDF5_ROOT} ${HDF5_ROOT})#MEDCoupling install process seems to require an environment variable
310
311   #extraction of the tarball archive name
312   string(LENGTH "${DOWNLOAD_MEDCOUPLING}" tarball_url_length)#length of the tarball
313   string(FIND   "${DOWNLOAD_MEDCOUPLING}" "/" start_tarball_name REVERSE )# last occurence of "/"
314   MATH(EXPR start_tarball_name "${start_tarball_name}+1")#start after the occurence of "/"
315   MATH(EXPR tarball_name_length "${tarball_url_length}-${start_tarball_name}-7")#name ends before .tar.gz that counts for 7 characters
316   string(SUBSTRING ${DOWNLOAD_MEDCOUPLING} ${start_tarball_name} ${tarball_name_length} MEDCOUPLING_TARBALL_NAME)
317   string(SUBSTRING ${MEDCOUPLING_TARBALL_NAME} 12 ${tarball_name_length} MEDCOUPLING_VERSION_NAME)
318
319   message(STATUS "MEDCoupling version is ${MEDCOUPLING_VERSION_NAME}")
320
321   ExternalProject_Add (MEDCoupling
322         URL               ${DOWNLOAD_MEDCOUPLING}  #location of medcoupling tarball
323         SOURCE_DIR        ${CMAKE_CURRENT_BINARY_DIR}/pre_requis/${MEDCOUPLING_TARBALL_NAME}
324 #        BUILD_IN_SOURCE   FALSE
325         CONFIGURE_COMMAND cmake <SOURCE_DIR>/${MEDCOUPLING_TARBALL_NAME} -DCMAKE_INSTALL_PREFIX=${MEDCOUPLING_ROOT_DIR} -DCONFIGURATION_ROOT_DIR=<SOURCE_DIR>/configuration-${MEDCOUPLING_VERSION_NAME} -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}
326         BUILD_COMMAND     make
327         INSTALL_COMMAND   make install
328         INSTALL_DIR       ${MEDCOUPLING_ROOT_DIR}
329         STAMP_DIR         ${CMAKE_CURRENT_BINARY_DIR}/pre_requis
330         LOG_DOWNLOAD      TRUE           # Wrap download in script to log output
331         LOG_UPDATE        TRUE           # Wrap update in script to log output
332         LOG_CONFIGURE     TRUE           # Wrap configure in script to log output
333         LOG_BUILD         TRUE           # Wrap build in script to log output
334         LOG_TEST          TRUE           # Wrap test in script to log output
335         LOG_INSTALL       TRUE           # Wrap install in script to log output
336   )
337
338 endif( MEDCOUPLING_ROOT_DIR OR DEFINED ENV{MEDCOUPLING_ROOT_DIR} )
339
340 set(MEDCOUPLING_INCLUDE_DIR ${MEDCOUPLING_ROOT_DIR}/include)
341 set(MEDCOUPLING_LIBRARIES   ${MEDCOUPLING_ROOT_DIR}/lib    )#for environment file env_SOLVERLAB.sh 
342
343 add_library(medloader   SHARED IMPORTED )
344 set_property(TARGET medloader   PROPERTY IMPORTED_LOCATION ${MEDCOUPLING_ROOT_DIR}/lib/libmedloader.so)
345 add_library(medcoupling SHARED IMPORTED )
346 set_property(TARGET medcoupling PROPERTY IMPORTED_LOCATION ${MEDCOUPLING_ROOT_DIR}/lib/libmedcoupling.so)
347
348 if   (TARGET MED AND TARGET PETSc)
349   ExternalProject_Add_StepDependencies( MED build PETSc )#PETSc doit être compilé avant MED car c'est PETSc qui compile HDF5
350 endif(TARGET MED AND TARGET PETSc)
351
352 if   (TARGET MED AND TARGET MEDCoupling)
353   ExternalProject_Add_StepDependencies( MEDCoupling build MED )#MED doit être compilé avant MEDCoupling
354 endif(TARGET MED AND TARGET MEDCoupling)
355  
356 if   (TARGET PETSc AND TARGET MEDCoupling)
357   ExternalProject_Add_StepDependencies( MEDCoupling build PETSc )#PETSc doit être compilé avant MEDCoupling (car il contient hdf5)
358 endif(TARGET PETSc AND TARGET MEDCoupling)
359  
360 ####################
361 # Final operations #
362 ####################                                  
363
364 # Paraview variables to choose python version and for env_SOLVERLAB.sh  
365 if  ( DEFINED PARAVIEW_VERSION OR DEFINED ENV{PARAVIEW_VERSION} )
366   if   ( NOT DEFINED PARAVIEW_VERSION )
367     set( PARAVIEW_VERSION  $ENV{PARAVIEW_VERSION})
368   endif( NOT DEFINED PARAVIEW_VERSION )
369   message(STATUS "ParaView version is ${PARAVIEW_VERSION}" )
370 else( DEFINED PARAVIEW_VERSION OR DEFINED ENV{PARAVIEW_VERSION} )
371   if  ( DEFINED PARAVIEW_ROOT_DIR OR DEFINED ENV{PARAVIEW_ROOT_DIR})
372     if  ( DEFINED PARAVIEW_ROOT_DIR )
373       set( PARAVIEW_INCLUDE_DIR   ${PARAVIEW_ROOT_DIR}/include)
374       set( PARAVIEW_LIBRARIES_DIR ${PARAVIEW_ROOT_DIR}/lib)
375     else( DEFINED PARAVIEW_ROOT_DIR )
376       set( PARAVIEW_INCLUDE_DIR   $ENV{PARAVIEW_ROOT_DIR}/include)
377       set( PARAVIEW_LIBRARIES_DIR $ENV{PARAVIEW_ROOT_DIR}/lib)
378     endif( DEFINED PARAVIEW_ROOT_DIR )
379   else( DEFINED PARAVIEW_ROOT_DIR OR DEFINED ENV{PARAVIEW_ROOT_DIR})
380     message(STATUS "PARAVIEW_VERSION and PARAVIEW_ROOT_DIR not set. Trying to detect paraview.")
381     set( PARAVIEW_INCLUDE_DIR /usr/include/paraview/)
382     set( PARAVIEW_LIBRARIES_DIR /usr/lib/paraview/:/usr/lib64/paraview/:/usr/lib64/vtk/:/usr/lib/vtk/)
383   endif( DEFINED PARAVIEW_ROOT_DIR OR DEFINED ENV{PARAVIEW_ROOT_DIR})
384
385   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 )
386   find_file( vtkConfig_file vtkPVConfig.h HINTS ${PARAVIEW_INCLUDE_DIR} PATH_SUFFIXES ${PARAVIEW_SUFFIXES})
387
388   #extraction of the paraview version"
389   IF   ( ${vtkConfig_file} STREQUAL "vtkConfig_file-NOTFOUND" )
390     message(WARNING "Could not find ParaView configuration file vtkPVConfig.h in folder ${PARAVIEW_INCLUDE_DIR} and subdirectories  ${PARAVIEW_SUFFIXES}. Postprocessing may not work")
391     set( PARAVIEW_VERSION  "5.0")
392   ELSE ( ${vtkConfig_file} STREQUAL "vtkConfig_file-NOTFOUND" )
393     message( STATUS "Found vtkPVConfig.h in ${vtkConfig_file}")
394     file(STRINGS ${vtkConfig_file} vtkConfig)
395     FOREACH(line ${vtkConfig})
396       string(FIND "${line}" "#define PARAVIEW_VERSION_FULL " pos)
397       IF(NOT ${pos} EQUAL -1)
398         string(LENGTH ${line} line_length)#length of the tarball
399         MATH(EXPR start_pv_version "${line_length}-6")#line ends with "x.y.z", that counts for 7 characters
400         string(SUBSTRING ${line} ${start_pv_version} 5 PARAVIEW_VERSION)
401         break()
402       ENDIF(NOT ${pos} EQUAL -1)
403     ENDFOREACH(line ${vtkConfig})
404     message(STATUS "ParaView detected, version is ${PARAVIEW_VERSION}" )
405   ENDIF( ${vtkConfig_file} STREQUAL "vtkConfig_file-NOTFOUND" )
406 endif( DEFINED PARAVIEW_VERSION OR DEFINED ENV{PARAVIEW_VERSION} )
407
408   
409 IF   ( ${PARAVIEW_VERSION} STRGREATER "5.6" OR ${PARAVIEW_VERSION} STREQUAL "5.6" )#Use python 3, use VERSION_GREATER_EQUAL if cmake >=3.7
410   SET(PYTHON2OR3 "3")
411   message(STATUS "PARAVIEW_VERSION greater than 5.6. We need python3 for postprocessing scripts.")
412 ELSE ( ${PARAVIEW_VERSION} STRGREATER "5.6" OR ${PARAVIEW_VERSION} STREQUAL "5.6" )#Use python 2
413   SET(PYTHON2OR3 "2")
414   message(STATUS "PARAVIEW_VERSION smaller than 5.6. We need python2 for postprocessing scripts.")
415 ENDIF( ${PARAVIEW_VERSION} STRGREATER "5.6" OR ${PARAVIEW_VERSION} STREQUAL "5.6" )
416
417 # Find python
418 IF  ( PYTHON_ROOT_DIR OR ENV{PYTHON_ROOT_DIR})
419   IF  ( PYTHON_ROOT_DIR )
420     set(Python_ROOT_DIR ${PYTHON_ROOT_DIR} ) 
421   ELSE( PYTHON_ROOT_DIR })
422     set(Python_ROOT_DIR $ENV{PYTHON_ROOT_DIR} ) 
423   ENDIF( PYTHON_ROOT_DIR })
424 ENDIF(PYTHON_ROOT_DIR OR ENV{PYTHON_ROOT_DIR})
425
426 IF   (${CMAKE_VERSION} VERSION_GREATER "3.12.0")
427   find_package(Python ${PYTHON2OR3} REQUIRED COMPONENTS Interpreter Development )
428   SET(PYTHON_EXECUTABLE ${Python_EXECUTABLE})
429 ELSE (${CMAKE_VERSION} VERSION_GREATER "3.12.0")
430   find_package(PythonInterp ${PYTHON2OR3} REQUIRED )
431   find_package(PythonLibs   ${PYTHON2OR3} REQUIRED )
432   set(Python_LIBRARIES     ${PYTHON_LIBRARIES})
433   set(Python_INCLUDE_DIRS  ${PYTHON_INCLUDE_DIRS})
434   set(Python_VERSION       ${PYTHON_VERSION_STRING})
435   set(Python_VERSION_MAJOR ${PYTHON_VERSION_MAJOR})
436   set(Python_VERSION_MINOR ${PYTHON_VERSION_MINOR})
437 ENDIF(${CMAKE_VERSION} VERSION_GREATER "3.12.0")
438
439 #Paraview library paths
440 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/:${PARAVIEW_LIBRARIES_DIR})
441 set (PV_PYTHON_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/:/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_LIBRARIES_DIR}/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages/vtkmodules/)
442
443 message(STATUS "Python version found is ${Python_VERSION}")
444 find_package (SWIG 3.0 REQUIRED)
445
446 if (SOLVERLAB_WITH_DOCUMENTATION)                                                                           #
447   find_package (Doxygen)                                                                                    #
448   set (CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, doxygen, graphviz, mscgen")
449   set (CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES}, doxygen, graphviz, mscgen")
450   if   (NOT DOXYGEN_FOUND)
451     message (FATAL_ERROR "Doxygen is needed to build the documentation. Please install it correctly.")
452   endif(NOT DOXYGEN_FOUND)
453 endif()                 
454 if (SOLVERLAB_WITH_TESTS)                                                                                  #
455   enable_testing ()
456   find_package (CPPUNIT REQUIRED)
457 endif()                 
458 find_package (XDR REQUIRED)
459                                     
460 # Enter subdirectories
461 add_subdirectory (CDMATH)
462 if(SOLVERLAB_WITH_COREFLOWS)
463   add_subdirectory (CoreFlows)
464 endif(SOLVERLAB_WITH_COREFLOWS)
465
466 # Configuration file
467 configure_file(
468     ${PROJECT_SOURCE_DIR}/env_SOLVERLAB.sh
469     ${CMAKE_INSTALL_PREFIX}/env_SOLVERLAB.sh
470     @ONLY
471 )
472
473