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