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