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