Salome HOME
Corrected some install paths for prerequisites
[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 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       #define slepc variables
222       set(SLEPC_DIR ${PETSC_INSTALL})
223       set(SLEPC_INCLUDES ${SLEPC_DIR}/include  ${PETSC_DIR}/${PETSC_ARCH}/externalpackages/slepc-3.14.1/include )
224       set(SLEPC_LIBRARIES ${PETSC_DIR}/${PETSC_ARCH}/externalpackages/slepc-3.14.1/installed-arch-linux2-c-opt/lib/libslepc.so)
225       message( STATUS "SLEPc includes ${SLEPC_INCLUDES}")
226
227       #define hdf5 variables
228       if   ( NOT HDF5_ROOT )#hdf5 is not defined in cmake arguments
229         if  ( DEFINED ENV{HDF5_ROOT} )#hdf5 is defined in the environment
230           set(HDF5_ROOT $ENV{HDF5_ROOT})
231         else( DEFINED ENV{HDF5_ROOT} )#hdf5 is not defined in the environment          
232           set(HDF5_ROOT ${PETSC_INSTALL})#HDF5 to be found in petsc installation
233         endif( DEFINED ENV{HDF5_ROOT} )
234       endif( NOT HDF5_ROOT )
235       set(HDF5_LIBRARY_DIR ${HDF5_ROOT}/lib)
236       set(HDF5_INCLUDE_DIRS ${HDF5_ROOT}/include)
237
238       #define MPI variables
239       #set(SOLVERLAB_WITH_MPI ON)
240       #set(MPI_HOME    ${PETSC_INSTALL} )
241       #set(MPI_LIBRARY ${PETSC_INSTALL}/lib/libmpi.so)
242       #set(MPIEXEC     ${PETSC_INSTALL}/bin/mpiexec)
243
244     endif ( IS_DIRECTORY "/usr/include/petsc/" AND EXISTS "/usr/lib64/libpetsc.so" )
245   endif ( DEFINED ENV{PETSC_DIR} OR PETSC_DIR )
246
247 if   ( ${PETSC_VERSION} VERSION_GREATER 3.5 )
248   add_definitions(-DPETSC_VERSION_GREATER_3_5)
249 endif( ${PETSC_VERSION} VERSION_GREATER 3.5 )
250
251 string(REPLACE ";" ":"  PETSC_INCLUDES_INSTALL "${PETSC_INCLUDES}")# use colon instead of semicolon in environment file env_SOLVERLAB.sh
252
253 add_library(petsc   SHARED IMPORTED)
254 set_property(TARGET petsc  PROPERTY IMPORTED_LOCATION ${PETSC_LIBRARIES})
255 add_library(slepc   SHARED IMPORTED)
256 set_property(TARGET slepc  PROPERTY IMPORTED_LOCATION ${SLEPC_LIBRARIES})
257
258 ######################################################
259 # Detection or compilation of MEDFile                #
260 ######################################################
261 if( MEDFILE_ROOT_DIR OR DEFINED ENV{MEDFILE_ROOT_DIR})
262
263   if   ( NOT MEDFILE_ROOT_DIR )
264     set(MEDFILE_ROOT_DIR $ENV{MEDFILE_ROOT_DIR} )
265   endif( NOT MEDFILE_ROOT_DIR )
266
267   find_package (MEDFile REQUIRED)
268
269 else( MEDFILE_ROOT_DIR OR DEFINED ENV{MEDFILE_ROOT_DIR})
270
271   message(STATUS "MED will be downloaded and installed from ${DOWNLOAD_MED}")
272   set(MACHINE PCLINUX)
273   set(MEDFILE_DEFINITIONS "-D${MACHINE} -DMEDFILE_INSTALL_DOC=OFF")#Comment ne pas compiler la doc ?
274   set(MEDFILE_ROOT_DIR ${CMAKE_INSTALL_PREFIX}/lib/med) # Location of the final install
275   
276   #extraction of the tarball archive name
277   string(LENGTH "${DOWNLOAD_MED}" tarball_url_length)#length of the name of the tarball
278   string(FIND "${DOWNLOAD_MED}" "/" start_tarball_name REVERSE )# last occurence of "/"
279   MATH(EXPR start_tarball_name "${start_tarball_name}+1")#start after the occurence of "/"
280   MATH(EXPR tarball_name_length "${tarball_url_length}-${start_tarball_name}-7")#name ends before .tar.gz that counts for 7 characters
281   string(SUBSTRING ${DOWNLOAD_MED} ${start_tarball_name} ${tarball_name_length} MED_TARBALL_NAME)
282
283   ExternalProject_Add (MED
284         URL               ${DOWNLOAD_MED}  #location of med tarball
285         SOURCE_DIR        ${CMAKE_CURRENT_BINARY_DIR}/pre_requis/${MED_TARBALL_NAME}
286         BUILD_IN_SOURCE   TRUE
287         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
288         BUILD_COMMAND     make
289         INSTALL_COMMAND   make install
290         INSTALL_DIR       ${MEDFILE_ROOT_DIR}
291         STAMP_DIR         ${CMAKE_CURRENT_BINARY_DIR}/pre_requis
292         LOG_DOWNLOAD      TRUE           # Wrap download in script to log output
293         LOG_UPDATE        TRUE           # Wrap update in script to log output
294         LOG_CONFIGURE     TRUE           # Wrap configure in script to log output
295         LOG_BUILD         TRUE           # Wrap build in script to log output
296         LOG_TEST          TRUE           # Wrap test in script to log output
297         LOG_INSTALL       TRUE           # Wrap install in script to log output
298   )
299   
300   set(MEDFILE_INCLUDE_DIRS ${MEDFILE_ROOT_DIR}/include)# Nécessaire pour le medloader et les sous-dossiers mesh, et IJKMesh
301   set(MEDFILE_LIBRARIES    ${MEDFILE_ROOT_DIR}/lib)# Nécessaire pour le env_SOLVERLAB.sh
302   set(MEDFILE_C_LIBRARIES med medC)# Nécessaire pour le medloader
303
304 endif( MEDFILE_ROOT_DIR OR DEFINED ENV{MEDFILE_ROOT_DIR})
305
306 add_library(med   SHARED IMPORTED)
307 set_property(TARGET med  PROPERTY IMPORTED_LOCATION ${MEDFILE_ROOT_DIR}/lib/libmed.so)
308 add_library(medC   SHARED IMPORTED)
309 set_property(TARGET medC PROPERTY IMPORTED_LOCATION ${MEDFILE_ROOT_DIR}/lib/libmedC.so)
310
311 string(REPLACE ";" ":"  MEDFILE_LIBRARIES_INSTALL "${MEDFILE_LIBRARIES}")# use colon instead of semicolon in environment file env_SOLVERLAB.sh
312
313 ######################################################
314 # Detection or compilation of MEDCoupling            #
315 ######################################################
316 if( MEDCOUPLING_ROOT_DIR OR DEFINED ENV{MEDCOUPLING_ROOT_DIR})
317
318   if   ( NOT MEDCOUPLING_ROOT_DIR )
319     set(MEDCOUPLING_ROOT_DIR $ENV{MEDCOUPLING_ROOT_DIR} )
320   endif( NOT MEDCOUPLING_ROOT_DIR )
321
322   message (STATUS "Seeking MEDCoupling library in ${MEDCOUPLING_ROOT_DIR}")
323
324   set(MEDCoupling_DIR  ${MEDCOUPLING_ROOT_DIR}/cmake_files)
325   find_package(MEDCoupling CONFIG REQUIRED)   # CONFIG is important !
326   message( STATUS "MEDCoupling found. Version is ${MEDCoupling_VERSION}")
327
328 else( DEFINED MEDCOUPLING_ROOT_DIR OR DEFINED ENV{MEDCOUPLING_ROOT_DIR})
329   message(STATUS "MEDCoupling will be downloaded and installed from ${DOWNLOAD_MEDCOUPLING}")
330   set(MEDCOUPLING_ROOT_DIR ${CMAKE_INSTALL_PREFIX}/lib/medcoupling) # Location of the final install
331   SET(ENV{HDF5_ROOT} ${HDF5_ROOT})#MEDCoupling install process seems to require an environment variable
332
333   #extraction of the tarball archive name
334   string(LENGTH "${DOWNLOAD_MEDCOUPLING}" tarball_url_length)#length of the tarball
335   string(FIND   "${DOWNLOAD_MEDCOUPLING}" "/" start_tarball_name REVERSE )# last occurence of "/"
336   MATH(EXPR start_tarball_name "${start_tarball_name}+1")#start after the occurence of "/"
337   MATH(EXPR tarball_name_length "${tarball_url_length}-${start_tarball_name}-7")#name ends before .tar.gz that counts for 7 characters
338   string(SUBSTRING ${DOWNLOAD_MEDCOUPLING} ${start_tarball_name} ${tarball_name_length} MEDCOUPLING_TARBALL_NAME)
339   string(SUBSTRING ${MEDCOUPLING_TARBALL_NAME} 12 ${tarball_name_length} MEDCoupling_VERSION)
340
341   message(STATUS "MEDCoupling will be installed at ${MEDCOUPLING_ROOT_DIR}")
342
343   ExternalProject_Add (MEDCoupling
344         URL               ${DOWNLOAD_MEDCOUPLING}  #location of medcoupling tarball
345         SOURCE_DIR        ${CMAKE_CURRENT_BINARY_DIR}/pre_requis/${MEDCOUPLING_TARBALL_NAME}
346         BUILD_IN_SOURCE   TRUE
347         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
348         BUILD_COMMAND     make
349         INSTALL_COMMAND   make install
350         INSTALL_DIR       ${MEDCOUPLING_ROOT_DIR}
351         STAMP_DIR         ${CMAKE_CURRENT_BINARY_DIR}/pre_requis
352         LOG_DOWNLOAD      TRUE           # Wrap download in script to log output
353         LOG_UPDATE        TRUE           # Wrap update in script to log output
354         LOG_CONFIGURE     TRUE           # Wrap configure in script to log output
355         LOG_BUILD         TRUE           # Wrap build in script to log output
356         LOG_TEST          TRUE           # Wrap test in script to log output
357         LOG_INSTALL       TRUE           # Wrap install in script to log output
358   )
359
360   add_library(medloader   SHARED IMPORTED )
361   set_property(TARGET medloader   PROPERTY IMPORTED_LOCATION ${MEDCOUPLING_ROOT_DIR}/lib/libmedloader.so)
362
363   SET(MEDCOUPLING_USE_64BIT_IDS  ON)
364
365 endif( MEDCOUPLING_ROOT_DIR OR DEFINED ENV{MEDCOUPLING_ROOT_DIR} )
366
367 set(MEDCOUPLING_INCLUDE_DIR ${MEDCOUPLING_ROOT_DIR}/include)
368 set(MEDCOUPLING_LIBRARIES   ${MEDCOUPLING_ROOT_DIR}/lib    )#for environment file env_SOLVERLAB.sh 
369
370 add_library(medcoupling SHARED IMPORTED )
371 set_property(TARGET medcoupling PROPERTY IMPORTED_LOCATION ${MEDCOUPLING_ROOT_DIR}/lib/libmedcoupling.so)
372
373 if   ( ${MEDCoupling_VERSION} VERSION_GREATER 9.4 )
374   add_definitions(-DMEDCoupling_VERSION_VERSION_GREATER_9_4)
375 endif( ${MEDCoupling_VERSION} VERSION_GREATER 9.4 )
376
377 if   (TARGET MED AND TARGET PETSc)
378   ExternalProject_Add_StepDependencies( MED build PETSc )#PETSc doit être compilé avant MED car c'est PETSc qui compile HDF5
379 endif(TARGET MED AND TARGET PETSc)
380
381 if   (TARGET MED AND TARGET MEDCoupling)
382   ExternalProject_Add_StepDependencies( MEDCoupling build MED )#MED doit être compilé avant MEDCoupling
383 endif(TARGET MED AND TARGET MEDCoupling)
384  
385 if   (TARGET PETSc AND TARGET MEDCoupling)
386   ExternalProject_Add_StepDependencies( MEDCoupling build PETSc )#PETSc doit être compilé avant MEDCoupling (car il contient hdf5)
387 endif(TARGET PETSc AND TARGET MEDCoupling)
388
389 IF(MEDCOUPLING_USE_64BIT_IDS)
390   SET(CMAKE_SWIG_FLAGS ${CMAKE_SWIG_FLAGS} -DMEDCOUPLING_USE_64BIT_IDS)
391 ENDIF(MEDCOUPLING_USE_64BIT_IDS)
392  
393 ####################
394 # Final operations #
395 ####################                                  
396
397 # Paraview variables to choose python version and for env_SOLVERLAB.sh  
398 if  ( PARAVIEW_ROOT_DIR OR DEFINED ENV{PARAVIEW_ROOT_DIR})
399   if  ( PARAVIEW_ROOT_DIR )
400     set( PARAVIEW_INCLUDE_DIR   ${PARAVIEW_ROOT_DIR}/include)
401     set( PARAVIEW_LIBRARIES_DIR ${PARAVIEW_ROOT_DIR}/lib)
402   else( PARAVIEW_ROOT_DIR )
403     set( PARAVIEW_ROOT_DIR      $ENV{PARAVIEW_ROOT_DIR} )
404     set( PARAVIEW_INCLUDE_DIR   $ENV{PARAVIEW_ROOT_DIR}/include)
405     set( PARAVIEW_LIBRARIES_DIR $ENV{PARAVIEW_ROOT_DIR}/lib)
406   endif( PARAVIEW_ROOT_DIR )
407 else( PARAVIEW_ROOT_DIR OR DEFINED ENV{PARAVIEW_ROOT_DIR})
408   message(STATUS "PARAVIEW_ROOT_DIR not set. Trying to detect paraview.")
409   set( PARAVIEW_INCLUDE_DIR /usr/include/paraview/)
410   set( PARAVIEW_LIBRARIES_DIR /usr/lib/paraview/:/usr/lib64/paraview/:/usr/lib64/vtk/:/usr/lib/vtk/)
411 endif( PARAVIEW_ROOT_DIR OR DEFINED ENV{PARAVIEW_ROOT_DIR})
412
413 if  ( DEFINED PARAVIEW_VERSION OR DEFINED ENV{PARAVIEW_VERSION} )
414   if   ( NOT DEFINED PARAVIEW_VERSION )
415     set( PARAVIEW_VERSION  $ENV{PARAVIEW_VERSION})
416   endif( NOT DEFINED PARAVIEW_VERSION )
417   message(STATUS "ParaView version is ${PARAVIEW_VERSION}" )
418 else( DEFINED PARAVIEW_VERSION OR DEFINED ENV{PARAVIEW_VERSION} )
419   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 )
420   find_file( vtkConfig_file vtkPVConfig.h HINTS ${PARAVIEW_INCLUDE_DIR} PATH_SUFFIXES ${PARAVIEW_SUFFIXES})
421
422   #extraction of the paraview version"
423   IF   ( ${vtkConfig_file} STREQUAL "vtkConfig_file-NOTFOUND" )
424     message(WARNING "Could not find ParaView configuration file vtkPVConfig.h in folder ${PARAVIEW_INCLUDE_DIR} and subdirectories  ${PARAVIEW_SUFFIXES}. Postprocessing may not work")
425     set( PARAVIEW_VERSION  "5.8")
426   ELSE ( ${vtkConfig_file} STREQUAL "vtkConfig_file-NOTFOUND" )
427     message( STATUS "Found vtkPVConfig.h in ${vtkConfig_file}")
428     file(STRINGS ${vtkConfig_file} vtkConfig)
429     FOREACH(line ${vtkConfig})
430       string(FIND "${line}" "#define PARAVIEW_VERSION_FULL " pos)
431       IF(NOT ${pos} EQUAL -1)
432         string(LENGTH ${line} line_length)#length of the tarball
433         MATH(EXPR start_pv_version "${line_length}-6")#line ends with "x.y.z", that counts for 7 characters
434         string(SUBSTRING ${line} ${start_pv_version} 5 PARAVIEW_VERSION)
435         break()
436       ENDIF(NOT ${pos} EQUAL -1)
437     ENDFOREACH(line ${vtkConfig})
438     message(STATUS "ParaView detected, version is ${PARAVIEW_VERSION}" )
439   ENDIF( ${vtkConfig_file} STREQUAL "vtkConfig_file-NOTFOUND" )
440 endif( DEFINED PARAVIEW_VERSION OR DEFINED ENV{PARAVIEW_VERSION} )
441
442 #Choose python 2 or 3  
443 IF   ( ${PARAVIEW_VERSION} STRGREATER "5.6" OR ${PARAVIEW_VERSION} STREQUAL "5.6" )#Use python 3, use VERSION_GREATER_EQUAL if cmake >=3.7
444   SET(PYTHON2OR3 "3")
445   message(STATUS "PARAVIEW_VERSION greater than 5.6. We need python3 for postprocessing scripts.")
446 ELSE ( ${PARAVIEW_VERSION} STRGREATER "5.6" OR ${PARAVIEW_VERSION} STREQUAL "5.6" )#Use python 2
447   SET(PYTHON2OR3 "2")
448   message(STATUS "PARAVIEW_VERSION smaller than 5.6. We need python2 for postprocessing scripts.")
449 ENDIF( ${PARAVIEW_VERSION} STRGREATER "5.6" OR ${PARAVIEW_VERSION} STREQUAL "5.6" )
450
451 # Find python
452 IF  ( PYTHON_ROOT_DIR OR ENV{PYTHON_ROOT_DIR})
453   IF  ( PYTHON_ROOT_DIR )
454     set(Python_ROOT_DIR ${PYTHON_ROOT_DIR} ) 
455   ELSE( PYTHON_ROOT_DIR )
456     set(Python_ROOT_DIR $ENV{PYTHON_ROOT_DIR} ) 
457   ENDIF( PYTHON_ROOT_DIR)
458 ENDIF(PYTHON_ROOT_DIR OR ENV{PYTHON_ROOT_DIR})
459
460 IF   (${CMAKE_VERSION} VERSION_GREATER "3.12.0")
461   find_package(Python ${PYTHON2OR3} REQUIRED COMPONENTS Interpreter Development )
462   SET(PYTHON_EXECUTABLE ${Python_EXECUTABLE})
463 ELSE (${CMAKE_VERSION} VERSION_GREATER "3.12.0")
464   find_package(PythonInterp ${PYTHON2OR3} REQUIRED )
465   find_package(PythonLibs   ${PYTHON2OR3} REQUIRED )
466   set(Python_LIBRARIES     ${PYTHON_LIBRARIES})
467   set(Python_INCLUDE_DIRS  ${PYTHON_INCLUDE_DIRS})
468   set(Python_VERSION       ${PYTHON_VERSION_STRING})
469   set(Python_VERSION_MAJOR ${PYTHON_VERSION_MAJOR})
470   set(Python_VERSION_MINOR ${PYTHON_VERSION_MINOR})
471 ENDIF(${CMAKE_VERSION} VERSION_GREATER "3.12.0")
472
473 #PyQt5
474 IF  ( NOT PYQT5_ROOT_DIR )
475     set(PYQT5_ROOT_DIR $ENV{PYQT5_ROOT_DIR} )
476 ENDIF( NOT PYQT5_ROOT_DIR )
477
478 #Matplotlib
479 IF   ( NOT MATPLOTLIB_ROOT_DIR )
480     set(MATPLOTLIB_ROOT_DIR $ENV{MATPLOTLIB_ROOT_DIR} )
481 ENDIF( NOT MATPLOTLIB_ROOT_DIR )
482
483 #HDF5_ROOT_DIR
484 IF   ( NOT HDF5_ROOT_DIR )
485   IF  ( ENV{HDF5_ROOT_DIR} )
486     set(HDF5_ROOT_DIR $ENV{HDF5_ROOT_DIR} )
487   ELSE( ENV{HDF5_ROOT_DIR} )
488     set(HDF5_ROOT_DIR ${HDF5_ROOT} )
489   ENDIF( ENV{HDF5_ROOT_DIR} )
490 ENDIF( NOT HDF5_ROOT_DIR )
491
492
493 #Paraview library paths
494 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})
495 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)
496
497 message(STATUS "Python version found is ${Python_VERSION}")
498 find_package (SWIG 3.0 REQUIRED)
499
500 if (SOLVERLAB_WITH_DOCUMENTATION)                                                                           #
501   find_package (Doxygen)                                                                                    #
502   set (CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, doxygen, graphviz, mscgen")
503   set (CPACK_RPM_PACKAGE_REQUIRES "${CPACK_RPM_PACKAGE_REQUIRES}, doxygen, graphviz, mscgen")
504   if   (NOT DOXYGEN_FOUND)
505     message (FATAL_ERROR "Doxygen is needed to build the documentation. Please install it correctly.")
506   endif(NOT DOXYGEN_FOUND)
507 endif()                 
508 if (SOLVERLAB_WITH_TESTS)                                                                                  #
509   enable_testing ()
510   find_package (CPPUNIT REQUIRED)
511 endif()                 
512                                     
513 # Enter subdirectories
514 add_subdirectory (CDMATH)
515 if(SOLVERLAB_WITH_COREFLOWS)
516   add_subdirectory (CoreFlows)
517 endif(SOLVERLAB_WITH_COREFLOWS)
518
519 # Configuration file
520 configure_file(
521     ${PROJECT_SOURCE_DIR}/env_SOLVERLAB.sh
522     ${CMAKE_INSTALL_PREFIX}/env_SOLVERLAB.sh
523     @ONLY
524 )
525
526