Salome HOME
Corrected error in python detection
[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
110     find_package(HDF5 COMPONENTS CXX HL)
111     if ( NOT HDF5_FOUND)
112       set(HDF5_LIBRARY_DIR  ${HDF5_ROOT}/lib)
113       set(HDF5_INCLUDE_DIRS ${HDF5_ROOT}/include)
114     endif( NOT HDF5_FOUND)
115   
116   else ( DEFINED ENV{PETSC_DIR} OR PETSC_DIR )
117     message ( STATUS "PETSC_DIR not set, searching PETSc and SLEPc in the system" )
118
119     if ( IS_DIRECTORY "/usr/include/petsc/" AND EXISTS "/usr/lib64/libpetsc.so" )  #Case fedora/redhat system install
120       message ( STATUS "PETSC includes found in /usr/include/petsc/" )
121       message ( STATUS "PETSC library  found in /usr/lib64" )
122       set(PETSC_DIR /usr/)
123       set(PETSC_INCLUDES  /usr/include/petsc /usr/include/petsc/petsc/mpiuni)
124       set(PETSC_LIBRARIES /usr/lib64/libpetsc.so)
125
126       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
127       
128       set(CPACK_RPM_PACKAGE_REQUIRES   "${CPACK_RPM_PACKAGE_REQUIRES}, petsc-devel (>= 3.4)") # This is not fully working yet. 
129       set(PETSC_INSTALL ${PETSC_DIR})
130
131       #Define and search slepc variables
132       if   ( IS_DIRECTORY "/usr/include/slepc/" AND EXISTS "/usr/lib64/libslepc.so" )
133         message( STATUS "SLEPc includes found in /usr/include/slepc/" )
134         message( STATUS "SLEPc library  found in /usr/lib64/slepc/" )
135         set(SLEPC_DIR /usr/)
136         set(SLEPC_INCLUDES  ${SLEPC_DIR}/include)
137         set(SLEPC_LIBRARIES ${SLEPC_DIR}/lib/libslepc.so)
138         set (CPACK_RPM_PACKAGE_REQUIRES   "${CPACK_RPM_PACKAGE_REQUIRES}, slepc-devel (>= 3.4)") # This is not fully working yet. 
139       else ( IS_DIRECTORY "/usr/include/slepc/" AND EXISTS "/usr/lib64/libslepc.so" )
140         message( FATAL_ERROR "SLEPc not found in the system" )
141       endif( IS_DIRECTORY "/usr/include/slepc/" AND EXISTS "/usr/lib64/libslepc.so" )
142
143       #HDF5 to be found in the system
144       if   ( NOT HDF5_ROOT AND NOT DEFINED ENV{HDF5_ROOT} )#hdf5 is not defined in the environment
145         find_package(HDF5 REQUIRED)
146         set(CPACK_DEBIAN_PACKAGE_DEPENDS "libhdf5-dev")
147         set(CPACK_RPM_PACKAGE_REQUIRES   "hdf5-devel")
148       endif( NOT HDF5_ROOT AND NOT DEFINED ENV{HDF5_ROOT} )
149
150     #elseif ( IS_DIRECTORY "/usr/lib/petsc/include" AND EXISTS "/usr/lib/petsc/lib/libpetsc_real.so" ) #Case ubuntu/debian system install
151     #  message ( STATUS "PETSc includes found in /usr/lib/petsc/include")
152     #  message ( STATUS "PETSc library  found in /usr/lib/petsc/lib/libpetsc_real.so")
153     #  set(PETSC_DIR /usr/lib/petsc/)
154     #  set(PETSC_INCLUDES  ${PETSC_DIR}/include ${PETSC_DIR}/include/petsc/mpiuni)
155     #  set(PETSC_LIBRARIES ${PETSC_DIR}/lib/libpetsc_real.so)
156
157     #  find_package (PETSc 3.4 REQUIRED)
158     #  petsc_get_version ()
159     #  set (CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, petsc-dev   (>= 3.4)") # This is not fully working yet. 
160
161     #  Define and search slepc variables
162     #  if   ( IS_DIRECTORY "/usr/lib/slepc/include" AND EXISTS "/usr/lib/slepc/lib/libslepc_real.so" )
163     #    message( STATUS "SLEPc includes found in /usr/lib/slepc/include" )
164     #    message( STATUS "SLEPc library  found in /usr/lib/slepc/lib/libslepc_real.so" )
165     #    set(SLEPC_DIR /usr/lib/slepc/)
166     #    set(SLEPC_INCLUDES ${SLEPC_DIR}/include)
167     #    set(SLEPC_LIBRARIES ${SLEPC_DIR}/lib/libslepc_real.so)
168     #    set (CPACK_DEBIAN_PACKAGE_REQUIRES   "${CPACK_DEBIAN_PACKAGE_REQUIRES}, slepc-devel (>= 3.4)") # This is not fully working yet. 
169     #  else ( IS_DIRECTORY "/usr/lib/slepc/include" AND EXISTS "/usr/lib/slepc/lib/libslepc_real.so" )
170     #    message( FATAL_ERROR "SLEPc not found in the system" )
171     #  endif( IS_DIRECTORY "/usr/lib/slepc/include" AND EXISTS "/usr/lib/slepc/lib/libslepc_real.so" )
172
173     #elseif ( IS_DIRECTORY "/usr/local/lib/python2.7/dist-packages/petsc") #Case ubuntu/debian system pip install
174
175     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
176       message (STATUS "PETSC not found in the system")
177       message (STATUS "PETSC will be downloaded and compiled from ${DOWNLOAD_PETSC}" )
178       message (STATUS "SLEPC will be downloaded and compiled from ${DOWNLOAD_SLEPC}" )
179       message (STATUS "HDF5  will be downloaded and compiled from ${DOWNLOAD_HDF5}" )
180
181       #extract petsc tarball name
182       string(LENGTH "${DOWNLOAD_PETSC}" tarball_url_length)#length of the tarball
183       string(FIND   "${DOWNLOAD_PETSC}" "/" start_tarball_name REVERSE )# last occurence of "/"
184       MATH(EXPR start_tarball_name  "${start_tarball_name}+1")#start after the occurence of "/"
185       MATH(EXPR tarball_name_length "${tarball_url_length}-${start_tarball_name}-7")#name ends before .tar.gz that counts for 7 characters
186       string(SUBSTRING ${DOWNLOAD_PETSC} ${start_tarball_name} ${tarball_name_length} PETSC_TARBALL_NAME)
187
188       set(PETSC_DIR ${CMAKE_CURRENT_BINARY_DIR}/pre_requis/${PETSC_TARBALL_NAME}) # Location of the final install 
189       set(PETSC_ARCH arch-linux-c-opt)
190       set(PETSC_INSTALL ${CMAKE_INSTALL_PREFIX}/lib/petsc)#folder to copy petsc libraries and include files
191
192       ExternalProject_Add (PETSc
193       URL               ${DOWNLOAD_PETSC}   
194       SOURCE_DIR        ${PETSC_DIR}
195       BUILD_IN_SOURCE   TRUE
196       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}
197       BUILD_COMMAND     make all
198       TEST_COMMAND      make check
199       INSTALL_COMMAND   make install
200       INSTALL_DIR       ${PETSC_DIR}
201       STAMP_DIR         ${CMAKE_CURRENT_BINARY_DIR}/pre_requis
202       LOG_DOWNLOAD      TRUE           # Wrap download in script to log output
203       LOG_UPDATE        TRUE           # Wrap update in script to log output
204       LOG_CONFIGURE     TRUE           # Wrap configure in script to log output
205       LOG_BUILD         TRUE           # Wrap build in script to log output
206       LOG_TEST          TRUE           # Wrap test in script to log output
207       LOG_INSTALL       TRUE           # Wrap install in script to log output
208        )
209
210       message( STATUS "PETSc, SLEPc and HDF5 will be installed at ${PETSC_INSTALL}")
211
212       string(LENGTH "${PETSC_TARBALL_NAME}" tarball_name_length)#length of the tarball
213       string(FIND   "${PETSC_TARBALL_NAME}" "-" start_version_name REVERSE )# last occurence of "-"
214       MATH(EXPR start_version_name  "${start_version_name}+1")#start after the occurence of "/"
215       string(SUBSTRING ${PETSC_TARBALL_NAME} ${start_version_name} ${tarball_name_length} PETSC_VERSION)
216       message( STATUS "PETSc version ${PETSC_VERSION}  will be installed" )
217
218       set(PETSC_INCLUDES  ${PETSC_DIR}/${PETSC_ARCH}/include ${PETSC_DIR}/include)
219       set(PETSC_LIBRARIES ${PETSC_DIR}/${PETSC_ARCH}/lib/libpetsc.so)
220
221       #extract slepc tarball name 
222       string(LENGTH "${DOWNLOAD_SLEPC}" tarball_url_length)#length of the tarball
223       string(FIND   "${DOWNLOAD_SLEPC}" "/" start_tarball_name REVERSE )# last occurence of "/"
224       MATH(EXPR start_tarball_name  "${start_tarball_name}+1")#start after the occurence of "/"
225       MATH(EXPR tarball_name_length "${tarball_url_length}-${start_tarball_name}-7")#name ends before .tar.gz that counts for 7 characters
226       string(SUBSTRING ${DOWNLOAD_SLEPC} ${start_tarball_name} ${tarball_name_length} SLEPC_TARBALL_NAME)
227
228       #extract slepc version
229       string(LENGTH "${SLEPC_TARBALL_NAME}" tarball_name_length)#length of the tarball
230       string(FIND   "${SLEPC_TARBALL_NAME}" "-" start_version_name REVERSE )# last occurence of "-"
231       MATH(EXPR start_version_name  "${start_version_name}+1")#start after the occurence of "/"
232       string(SUBSTRING ${SLEPC_TARBALL_NAME} ${start_version_name} ${tarball_name_length} SLEPC_VERSION)
233       message( STATUS "SLEPc version ${SLEPC_VERSION}  will be installed" )
234
235       #define slepc variables
236       set(SLEPC_DIR ${PETSC_INSTALL})
237       set(SLEPC_INCLUDES ${SLEPC_DIR}/include  ${PETSC_DIR}/${PETSC_ARCH}/externalpackages/${SLEPC_TARBALL_NAME}/include )
238       set(SLEPC_LIBRARIES ${PETSC_DIR}/${PETSC_ARCH}/externalpackages/${SLEPC_TARBALL_NAME}/installed-arch-linux2-c-opt/lib/libslepc.so)
239       message( STATUS "SLEPc includes ${SLEPC_INCLUDES}")
240
241       #define hdf5 variables
242       if   ( NOT HDF5_ROOT )#hdf5 is not defined in cmake arguments
243         if  ( DEFINED ENV{HDF5_ROOT} )#hdf5 is defined in the environment
244           set(HDF5_ROOT $ENV{HDF5_ROOT})
245         else( DEFINED ENV{HDF5_ROOT} )#hdf5 is not defined in the environment          
246           set(HDF5_ROOT ${PETSC_INSTALL})#HDF5 to be found in petsc installation
247         endif( DEFINED ENV{HDF5_ROOT} )
248       endif( NOT HDF5_ROOT )
249       set(HDF5_LIBRARY_DIR ${HDF5_ROOT}/lib)
250       set(HDF5_INCLUDE_DIRS ${HDF5_ROOT}/include)
251
252       #define MPI variables
253       #set(SOLVERLAB_WITH_MPI ON)
254       #set(MPI_HOME    ${PETSC_INSTALL} )
255       #set(MPI_LIBRARY ${PETSC_INSTALL}/lib/libmpi.so)
256       #set(MPIEXEC     ${PETSC_INSTALL}/bin/mpiexec)
257
258     endif ( IS_DIRECTORY "/usr/include/petsc/" AND EXISTS "/usr/lib64/libpetsc.so" )
259   endif ( DEFINED ENV{PETSC_DIR} OR PETSC_DIR )
260
261 if   ( ${PETSC_VERSION} VERSION_GREATER 3.5 )
262   add_definitions(-DPETSC_VERSION_GREATER_3_5)
263 endif( ${PETSC_VERSION} VERSION_GREATER 3.5 )
264
265 string(REPLACE ";" ":"  PETSC_INCLUDES_INSTALL "${PETSC_INCLUDES}")# use colon instead of semicolon in environment file env_SOLVERLAB.sh
266
267 add_library(petsc   SHARED IMPORTED)
268 set_property(TARGET petsc  PROPERTY IMPORTED_LOCATION ${PETSC_LIBRARIES})
269 add_library(slepc   SHARED IMPORTED)
270 set_property(TARGET slepc  PROPERTY IMPORTED_LOCATION ${SLEPC_LIBRARIES})
271
272 ######################################################
273 # Detection or compilation of MEDFile                #
274 ######################################################
275 if( MEDFILE_ROOT_DIR OR DEFINED ENV{MEDFILE_ROOT_DIR})
276
277   if   ( NOT MEDFILE_ROOT_DIR )
278     set(MEDFILE_ROOT_DIR $ENV{MEDFILE_ROOT_DIR} )
279   endif( NOT MEDFILE_ROOT_DIR )
280
281   find_package (MEDFile REQUIRED)
282
283 else( MEDFILE_ROOT_DIR OR DEFINED ENV{MEDFILE_ROOT_DIR})
284
285   message(STATUS "MED will be downloaded and installed from ${DOWNLOAD_MED}")
286   set(MACHINE PCLINUX)
287   set(MEDFILE_DEFINITIONS "-D${MACHINE} -DMEDFILE_INSTALL_DOC=OFF")#Comment ne pas compiler la doc ?
288   set(MEDFILE_ROOT_DIR ${CMAKE_INSTALL_PREFIX}/lib/med) # Location of the final install
289   
290   #extraction of the tarball archive name
291   string(LENGTH "${DOWNLOAD_MED}" tarball_url_length)#length of the name of the tarball
292   string(FIND "${DOWNLOAD_MED}" "/" start_tarball_name REVERSE )# last occurence of "/"
293   MATH(EXPR start_tarball_name "${start_tarball_name}+1")#start after the occurence of "/"
294   MATH(EXPR tarball_name_length "${tarball_url_length}-${start_tarball_name}-7")#name ends before .tar.gz that counts for 7 characters
295   string(SUBSTRING ${DOWNLOAD_MED} ${start_tarball_name} ${tarball_name_length} MED_TARBALL_NAME)
296
297   ExternalProject_Add (MED
298         URL               ${DOWNLOAD_MED}  #location of med tarball
299         SOURCE_DIR        ${CMAKE_CURRENT_BINARY_DIR}/pre_requis/${MED_TARBALL_NAME}
300         BUILD_IN_SOURCE   TRUE
301         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
302         BUILD_COMMAND     make
303         INSTALL_COMMAND   make install
304         INSTALL_DIR       ${MEDFILE_ROOT_DIR}
305         STAMP_DIR         ${CMAKE_CURRENT_BINARY_DIR}/pre_requis
306         LOG_DOWNLOAD      TRUE           # Wrap download in script to log output
307         LOG_UPDATE        TRUE           # Wrap update in script to log output
308         LOG_CONFIGURE     TRUE           # Wrap configure in script to log output
309         LOG_BUILD         TRUE           # Wrap build in script to log output
310         LOG_TEST          TRUE           # Wrap test in script to log output
311         LOG_INSTALL       TRUE           # Wrap install in script to log output
312   )
313   
314   set(MEDFILE_INCLUDE_DIRS ${MEDFILE_ROOT_DIR}/include)# Nécessaire pour le medloader et les sous-dossiers mesh, et IJKMesh
315   set(MEDFILE_LIBRARIES    ${MEDFILE_ROOT_DIR}/lib)# Nécessaire pour le env_SOLVERLAB.sh
316   set(MEDFILE_C_LIBRARIES med medC)# Nécessaire pour le medloader
317
318 endif( MEDFILE_ROOT_DIR OR DEFINED ENV{MEDFILE_ROOT_DIR})
319
320 add_library(med   SHARED IMPORTED)
321 set_property(TARGET med  PROPERTY IMPORTED_LOCATION ${MEDFILE_ROOT_DIR}/lib/libmed.so)
322 add_library(medC   SHARED IMPORTED)
323 set_property(TARGET medC PROPERTY IMPORTED_LOCATION ${MEDFILE_ROOT_DIR}/lib/libmedC.so)
324
325 string(REPLACE ";" ":"  MEDFILE_LIBRARIES_INSTALL "${MEDFILE_LIBRARIES}")# use colon instead of semicolon in environment file env_SOLVERLAB.sh
326
327 ######################################################
328 # Detection or compilation of MEDCoupling            #
329 ######################################################
330 if( MEDCOUPLING_ROOT_DIR OR DEFINED ENV{MEDCOUPLING_ROOT_DIR})
331
332   if   ( NOT MEDCOUPLING_ROOT_DIR )
333     set(MEDCOUPLING_ROOT_DIR $ENV{MEDCOUPLING_ROOT_DIR} )
334   endif( NOT MEDCOUPLING_ROOT_DIR )
335
336   message (STATUS "Seeking MEDCoupling library in ${MEDCOUPLING_ROOT_DIR}")
337
338   set(MEDCoupling_DIR  ${MEDCOUPLING_ROOT_DIR}/cmake_files)
339   find_package(MEDCoupling CONFIG REQUIRED)   # CONFIG is important !
340   message( STATUS "MEDCoupling found. Version is ${MEDCoupling_VERSION}")
341
342 else( DEFINED MEDCOUPLING_ROOT_DIR OR DEFINED ENV{MEDCOUPLING_ROOT_DIR})
343   message(STATUS "MEDCoupling will be downloaded and installed from ${DOWNLOAD_MEDCOUPLING}")
344   set(MEDCOUPLING_ROOT_DIR ${CMAKE_INSTALL_PREFIX}/lib/medcoupling) # Location of the final install
345   SET(ENV{HDF5_ROOT} ${HDF5_ROOT})#MEDCoupling install process seems to require an environment variable
346
347   #extraction of the tarball archive name
348   string(LENGTH "${DOWNLOAD_MEDCOUPLING}" tarball_url_length)#length of the tarball
349   string(FIND   "${DOWNLOAD_MEDCOUPLING}" "/" start_tarball_name REVERSE )# last occurence of "/"
350   MATH(EXPR start_tarball_name "${start_tarball_name}+1")#start after the occurence of "/"
351   MATH(EXPR tarball_name_length "${tarball_url_length}-${start_tarball_name}-7")#name ends before .tar.gz that counts for 7 characters
352   string(SUBSTRING ${DOWNLOAD_MEDCOUPLING} ${start_tarball_name} ${tarball_name_length} MEDCOUPLING_TARBALL_NAME)
353   string(SUBSTRING ${MEDCOUPLING_TARBALL_NAME} 12 ${tarball_name_length} MEDCoupling_VERSION)
354
355   message(STATUS "MEDCoupling will be installed at ${MEDCOUPLING_ROOT_DIR}")
356
357   ExternalProject_Add (MEDCoupling
358         URL               ${DOWNLOAD_MEDCOUPLING}  #location of medcoupling tarball
359         SOURCE_DIR        ${CMAKE_CURRENT_BINARY_DIR}/pre_requis/${MEDCOUPLING_TARBALL_NAME}
360         BUILD_IN_SOURCE   TRUE
361         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
362         BUILD_COMMAND     make
363         INSTALL_COMMAND   make install
364         INSTALL_DIR       ${MEDCOUPLING_ROOT_DIR}
365         STAMP_DIR         ${CMAKE_CURRENT_BINARY_DIR}/pre_requis
366         LOG_DOWNLOAD      TRUE           # Wrap download in script to log output
367         LOG_UPDATE        TRUE           # Wrap update in script to log output
368         LOG_CONFIGURE     TRUE           # Wrap configure in script to log output
369         LOG_BUILD         TRUE           # Wrap build in script to log output
370         LOG_TEST          TRUE           # Wrap test in script to log output
371         LOG_INSTALL       TRUE           # Wrap install in script to log output
372   )
373
374   add_library(medloader   SHARED IMPORTED )
375   set_property(TARGET medloader   PROPERTY IMPORTED_LOCATION ${MEDCOUPLING_ROOT_DIR}/lib/libmedloader.so)
376
377   SET(MEDCOUPLING_USE_64BIT_IDS  ON)
378
379 endif( MEDCOUPLING_ROOT_DIR OR DEFINED ENV{MEDCOUPLING_ROOT_DIR} )
380
381 set(MEDCOUPLING_INCLUDE_DIR ${MEDCOUPLING_ROOT_DIR}/include)
382 set(MEDCOUPLING_LIBRARIES   ${MEDCOUPLING_ROOT_DIR}/lib    )#for environment file env_SOLVERLAB.sh 
383
384 add_library(medcoupling SHARED IMPORTED )
385 set_property(TARGET medcoupling PROPERTY IMPORTED_LOCATION ${MEDCOUPLING_ROOT_DIR}/lib/libmedcoupling.so)
386
387 if   ( ${MEDCoupling_VERSION} VERSION_GREATER 9.4 )
388   add_definitions(-DMEDCoupling_VERSION_VERSION_GREATER_9_4)
389 endif( ${MEDCoupling_VERSION} VERSION_GREATER 9.4 )
390
391 if   (TARGET MED AND TARGET PETSc)
392   ExternalProject_Add_StepDependencies( MED build PETSc )#PETSc doit être compilé avant MED car c'est PETSc qui compile HDF5
393 endif(TARGET MED AND TARGET PETSc)
394
395 if   (TARGET MED AND TARGET MEDCoupling)
396   ExternalProject_Add_StepDependencies( MEDCoupling build MED )#MED doit être compilé avant MEDCoupling
397 endif(TARGET MED AND TARGET MEDCoupling)
398  
399 if   (TARGET PETSc AND TARGET MEDCoupling)
400   ExternalProject_Add_StepDependencies( MEDCoupling build PETSc )#PETSc doit être compilé avant MEDCoupling (car il contient hdf5)
401 endif(TARGET PETSc AND TARGET MEDCoupling)
402
403 IF(MEDCOUPLING_USE_64BIT_IDS)
404   SET(CMAKE_SWIG_FLAGS ${CMAKE_SWIG_FLAGS} -DMEDCOUPLING_USE_64BIT_IDS)
405 ENDIF(MEDCOUPLING_USE_64BIT_IDS)
406  
407 ####################
408 # Final operations #
409 ####################                                  
410
411 # Paraview variables to choose python version and for env_SOLVERLAB.sh  
412 if  ( PARAVIEW_ROOT_DIR OR DEFINED ENV{PARAVIEW_ROOT_DIR})
413   if  ( PARAVIEW_ROOT_DIR )
414     set( PARAVIEW_INCLUDE_DIR   ${PARAVIEW_ROOT_DIR}/include)
415     set( PARAVIEW_LIBRARIES_DIR ${PARAVIEW_ROOT_DIR}/lib)
416   else( PARAVIEW_ROOT_DIR )
417     set( PARAVIEW_ROOT_DIR      $ENV{PARAVIEW_ROOT_DIR} )
418     set( PARAVIEW_INCLUDE_DIR   $ENV{PARAVIEW_ROOT_DIR}/include)
419     set( PARAVIEW_LIBRARIES_DIR $ENV{PARAVIEW_ROOT_DIR}/lib)
420   endif( PARAVIEW_ROOT_DIR )
421 else( PARAVIEW_ROOT_DIR OR DEFINED ENV{PARAVIEW_ROOT_DIR})
422   message(STATUS "PARAVIEW_ROOT_DIR not set. Trying to detect paraview.")
423   set( PARAVIEW_INCLUDE_DIR /usr/include/paraview/)
424   set( PARAVIEW_LIBRARIES_DIR /usr/lib/paraview/:/usr/lib64/paraview/:/usr/lib64/vtk/:/usr/lib/vtk/)
425 endif( PARAVIEW_ROOT_DIR OR DEFINED ENV{PARAVIEW_ROOT_DIR})
426
427 if  ( DEFINED PARAVIEW_VERSION OR DEFINED ENV{PARAVIEW_VERSION} )
428   if   ( NOT DEFINED PARAVIEW_VERSION )
429     set( PARAVIEW_VERSION  $ENV{PARAVIEW_VERSION})
430   endif( NOT DEFINED PARAVIEW_VERSION )
431   message(STATUS "ParaView version is ${PARAVIEW_VERSION}" )
432 else( DEFINED PARAVIEW_VERSION OR DEFINED ENV{PARAVIEW_VERSION} )
433   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 )
434   find_file( vtkConfig_file vtkPVConfig.h HINTS ${PARAVIEW_INCLUDE_DIR} PATH_SUFFIXES ${PARAVIEW_SUFFIXES})
435
436   #extraction of the paraview version"
437   IF   ( ${vtkConfig_file} STREQUAL "vtkConfig_file-NOTFOUND" )
438     message(WARNING "Could not find ParaView configuration file vtkPVConfig.h in folder ${PARAVIEW_INCLUDE_DIR} and subdirectories  ${PARAVIEW_SUFFIXES}. Postprocessing may not work")
439     set( PARAVIEW_VERSION  "5.8")
440   ELSE ( ${vtkConfig_file} STREQUAL "vtkConfig_file-NOTFOUND" )
441     message( STATUS "Found vtkPVConfig.h in ${vtkConfig_file}")
442     file(STRINGS ${vtkConfig_file} vtkConfig)
443     FOREACH(line ${vtkConfig})
444       string(FIND "${line}" "#define PARAVIEW_VERSION_FULL " pos)
445       IF(NOT ${pos} EQUAL -1)
446         string(LENGTH ${line} line_length)#length of the tarball
447         MATH(EXPR start_pv_version "${line_length}-6")#line ends with "x.y.z", that counts for 7 characters
448         string(SUBSTRING ${line} ${start_pv_version} 5 PARAVIEW_VERSION)
449         break()
450       ENDIF(NOT ${pos} EQUAL -1)
451     ENDFOREACH(line ${vtkConfig})
452     message(STATUS "ParaView detected, version is ${PARAVIEW_VERSION}" )
453   ENDIF( ${vtkConfig_file} STREQUAL "vtkConfig_file-NOTFOUND" )
454 endif( DEFINED PARAVIEW_VERSION OR DEFINED ENV{PARAVIEW_VERSION} )
455
456 #Choose python 2 or 3  
457 IF   ( ${PARAVIEW_VERSION} STRGREATER "5.6" OR ${PARAVIEW_VERSION} STREQUAL "5.6" )#Use python 3, use VERSION_GREATER_EQUAL if cmake >=3.7
458   SET(PYTHON2OR3 "3")
459   message(STATUS "PARAVIEW_VERSION greater than 5.6. We need python3 for postprocessing scripts.")
460 ELSE ( ${PARAVIEW_VERSION} STRGREATER "5.6" OR ${PARAVIEW_VERSION} STREQUAL "5.6" )#Use python 2
461   SET(PYTHON2OR3 "2")
462   message(STATUS "PARAVIEW_VERSION smaller than 5.6. We need python2 for postprocessing scripts.")
463 ENDIF( ${PARAVIEW_VERSION} STRGREATER "5.6" OR ${PARAVIEW_VERSION} STREQUAL "5.6" )
464
465 # Find python
466 IF  ( DEFINED PYTHON_ROOT_DIR OR DEFINED ENV{PYTHON_ROOT_DIR})
467   IF  ( DEFINED PYTHON_ROOT_DIR )
468     set(Python_ROOT_DIR ${PYTHON_ROOT_DIR} ) 
469   ELSE( DEFINED PYTHON_ROOT_DIR )
470     set(Python_ROOT_DIR $ENV{PYTHON_ROOT_DIR} ) 
471   ENDIF( DEFINED PYTHON_ROOT_DIR)
472 ENDIF(DEFINED PYTHON_ROOT_DIR OR DEFINED ENV{PYTHON_ROOT_DIR})
473
474 IF   (${CMAKE_VERSION} VERSION_GREATER "3.12.0")
475   find_package(Python ${PYTHON2OR3} REQUIRED COMPONENTS Interpreter Development )
476   SET(PYTHON_EXECUTABLE ${Python_EXECUTABLE})
477 ELSE (${CMAKE_VERSION} VERSION_GREATER "3.12.0")
478   find_package(PythonInterp ${PYTHON2OR3} REQUIRED )
479   find_package(PythonLibs   ${PYTHON2OR3} REQUIRED )
480   set(Python_LIBRARIES     ${PYTHON_LIBRARIES})
481   set(Python_INCLUDE_DIRS  ${PYTHON_INCLUDE_DIRS})
482   set(Python_VERSION       ${PYTHON_VERSION_STRING})
483   set(Python_VERSION_MAJOR ${PYTHON_VERSION_MAJOR})
484   set(Python_VERSION_MINOR ${PYTHON_VERSION_MINOR})
485 ENDIF(${CMAKE_VERSION} VERSION_GREATER "3.12.0")
486
487 #PyQt5
488 IF  ( NOT PYQT5_ROOT_DIR )
489     set(PYQT5_ROOT_DIR $ENV{PYQT5_ROOT_DIR} )
490 ENDIF( NOT PYQT5_ROOT_DIR )
491
492 #Matplotlib
493 IF   ( NOT MATPLOTLIB_ROOT_DIR )
494     set(MATPLOTLIB_ROOT_DIR $ENV{MATPLOTLIB_ROOT_DIR} )
495 ENDIF( NOT MATPLOTLIB_ROOT_DIR )
496
497 #HDF5_ROOT_DIR
498 IF   ( NOT HDF5_ROOT_DIR )
499   IF  ( ENV{HDF5_ROOT_DIR} )
500     set(HDF5_ROOT_DIR $ENV{HDF5_ROOT_DIR} )
501   ELSE( ENV{HDF5_ROOT_DIR} )
502     set(HDF5_ROOT_DIR ${HDF5_ROOT} )
503   ENDIF( ENV{HDF5_ROOT_DIR} )
504 ENDIF( NOT HDF5_ROOT_DIR )
505
506
507 #Paraview library paths
508 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})
509 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)
510
511 message(STATUS "Python version found is ${Python_VERSION}")
512 find_package (SWIG 3.0 REQUIRED)
513
514 if (SOLVERLAB_WITH_DOCUMENTATION)                                                                           #
515   find_package (Doxygen)                                                                                    #
516   set (CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, doxygen, graphviz, mscgen")
517   set (CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES}, doxygen, graphviz, mscgen")
518   if   (NOT DOXYGEN_FOUND)
519     message (FATAL_ERROR "Doxygen is needed to build the documentation. Please install it correctly.")
520   endif(NOT DOXYGEN_FOUND)
521 endif()                 
522 if (SOLVERLAB_WITH_TESTS)                                                                                  #
523   enable_testing ()
524   find_package (CPPUNIT REQUIRED)
525 endif()                 
526                                     
527 # Enter subdirectories
528 add_subdirectory (CDMATH)
529 if(SOLVERLAB_WITH_COREFLOWS)
530   add_subdirectory (CoreFlows)
531 endif(SOLVERLAB_WITH_COREFLOWS)
532
533 # Configuration file
534 configure_file(
535     ${PROJECT_SOURCE_DIR}/env_SOLVERLAB.sh
536     ${CMAKE_INSTALL_PREFIX}/env_SOLVERLAB.sh
537     @ONLY
538 )
539
540