source: issm/oecreview/Archive/24684-25833/ISSM-25790-25791.diff

Last change on this file was 25834, checked in by Mathieu Morlighem, 4 years ago

CHG: added 24684-25833

File size: 179.4 KB
RevLine 
[25834]1Index: ../trunk-jpl/externalpackages/gmsh/install-4-linux-python-static.sh
2===================================================================
3--- ../trunk-jpl/externalpackages/gmsh/install-4-linux-python-static.sh (revision 25790)
4+++ ../trunk-jpl/externalpackages/gmsh/install-4-linux-python-static.sh (revision 25791)
5@@ -33,7 +33,7 @@
6 rm -rf gmsh-${VER}-source
7
8 # Copy customized source and config files to 'src' directory
9-cp configs/4/linux/static/CMakeLists.txt src
10+cp configs/${VER}/static/CMakeLists.txt src
11
12 # Configure
13 #
14@@ -55,7 +55,6 @@
15 -DENABLE_MPEG_ENCODE=0 \
16 -DENABLE_MPI=1 \
17 -DENABLE_OCC=0 \
18- -DENABLE_TOUCHBAR=0 \
19 -DMETIS_ROOT="${PETSC_ROOT}"
20
21 # Compile and install
22Index: ../trunk-jpl/externalpackages/gmsh/install-4-linux-static.sh
23===================================================================
24--- ../trunk-jpl/externalpackages/gmsh/install-4-linux-static.sh (revision 25790)
25+++ ../trunk-jpl/externalpackages/gmsh/install-4-linux-static.sh (revision 25791)
26@@ -31,7 +31,7 @@
27 rm -rf gmsh-${VER}-source
28
29 # Copy customized source and config files to 'src' directory
30-cp configs/4/mac/static/CMakeLists.txt src
31+cp configs/${VER}/static/CMakeLists.txt src
32
33 # Configure
34 #
35@@ -41,8 +41,6 @@
36 # movies.
37 # - Option -DENABLE_OCC=0 is used because we do not need CAD kernel and are not
38 # importing STEP/IGES files.
39-# - Option -DENABLE_TOUCHBAR=0 is used because we do not have GUI, therefore we
40-# do not need to support Apple Touch bar.
41 #
42 cd install
43 cmake ../src \
44@@ -53,7 +51,6 @@
45 -DENABLE_MPEG_ENCODE=0 \
46 -DENABLE_MPI=1 \
47 -DENABLE_OCC=0 \
48- -DENABLE_TOUCHBAR=0 \
49 -DMETIS_ROOT="${PETSC_ROOT}"
50
51 # Compile and install
52Index: ../trunk-jpl/externalpackages/gmsh/configs/4.7.0/static/CMakeLists.txt
53===================================================================
54--- ../trunk-jpl/externalpackages/gmsh/configs/4.7.0/static/CMakeLists.txt (nonexistent)
55+++ ../trunk-jpl/externalpackages/gmsh/configs/4.7.0/static/CMakeLists.txt (revision 25791)
56@@ -0,0 +1,2191 @@
57+# Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle
58+#
59+# See the LICENSE.txt file for license information. Please report all
60+# issues on https://gitlab.onelab.info/gmsh/gmsh/issues.
61+
62+cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
63+
64+# if CMAKE_BUILD_TYPE is specified use it; otherwise set the default
65+# build type to "RelWithDebInfo" ("-O2 -g" with gcc) prior to calling
66+# project()
67+if(DEFINED CMAKE_BUILD_TYPE)
68+ set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Choose build type")
69+else()
70+ set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose build type")
71+endif()
72+
73+project(gmsh CXX C)
74+
75+# require C++11 and request C99
76+set(CMAKE_CXX_STANDARD 11)
77+set(CMAKE_CXX_STANDARD_REQUIRED ON)
78+set(CMAKE_C_STANDARD 99)
79+
80+# this variable controls the default value of the options which are normally set
81+# to ON (useful if you want to configure a minimal version of Gmsh: e.g. "cmake
82+# -DDEFAULT=0 -DENABLE_POST=1 -DENABLE_PARSER=1")
83+set(DEFAULT ON CACHE INTERNAL "Default value for enabled-by-default options")
84+
85+macro(opt OPTION HELP VALUE)
86+ option(ENABLE_${OPTION} ${HELP} ${VALUE})
87+ set(OPT_TEXI "${OPT_TEXI}\n@item ENABLE_${OPTION}\n${HELP} (default: ${VALUE})")
88+endmacro()
89+
90+opt(3M "Enable proprietary 3M extension" OFF)
91+opt(ALGLIB "Enable ALGLIB (used by some mesh optimizers)" ${DEFAULT})
92+opt(ANN "Enable ANN (used for fast point search in mesh/post)" ${DEFAULT})
93+opt(BAMG "Enable Bamg 2D anisotropic mesh generator" ${DEFAULT})
94+opt(BLAS_LAPACK "Enable BLAS/Lapack for linear algebra (if Eigen if disabled)" OFF)
95+opt(BLOSSOM "Enable Blossom algorithm (needed for full quad meshing)" ${DEFAULT})
96+opt(BUILD_LIB "Enable 'lib' target for building static Gmsh library" OFF)
97+opt(BUILD_SHARED "Enable 'shared' target for building shared Gmsh library" OFF)
98+opt(BUILD_DYNAMIC "Enable dynamic Gmsh executable (linked with shared library)" OFF)
99+opt(BUILD_ANDROID "Enable Android NDK library target (experimental)" OFF)
100+opt(BUILD_IOS "Enable iOS library target (experimental)" OFF)
101+opt(CGNS "Enable CGNS import/export (experimental)" ${DEFAULT})
102+opt(CGNS_CPEX0045 "Enable high-order CGNS import/export following CPEX0045 (experimental)" OFF)
103+opt(CAIRO "Enable Cairo to render fonts (experimental)" ${DEFAULT})
104+opt(PROFILE "Enable profiling compiler flags" OFF)
105+opt(DINTEGRATION "Enable discrete integration (needed for levelsets)" ${DEFAULT})
106+opt(DOMHEX "Enable experimental DOMHEX code" ${DEFAULT})
107+opt(EIGEN "Enable Eigen for linear algebra (instead of Blas/Lapack)" ON)
108+opt(FLTK "Enable FLTK graphical user interface (requires mesh/post)" ${DEFAULT})
109+opt(GETDP "Enable GetDP solver (linked as a library, experimental)" ${DEFAULT})
110+opt(GMM "Enable GMM linear solvers (simple alternative to PETSc)" ${DEFAULT})
111+opt(GMP "Enable GMP for Kbipack (advanced)" ON)
112+opt(GRAPHICS "Enable building graphics lib even without GUI (advanced)" OFF)
113+opt(HXT "Enable HXT library (for reparametrization and meshing)" ${DEFAULT})
114+opt(KBIPACK "Enable Kbipack (neeeded by homology solver)" ${DEFAULT})
115+opt(MATHEX "Enable Mathex expression parser (used by plugins and options)" ${DEFAULT})
116+opt(MED "Enable MED mesh and post file formats" ${DEFAULT})
117+opt(MESH "Enable mesh module (required by GUI)" ${DEFAULT})
118+opt(METIS "Enable Metis mesh partitioner" ${DEFAULT})
119+opt(MMG "Enable Mmg mesh adaptation interface" ${DEFAULT})
120+opt(MPEG_ENCODE "Enable built-in MPEG movie encoder" ${DEFAULT})
121+opt(MPI "Enable MPI (experimental, not used for meshing)" OFF)
122+opt(MSVC_STATIC_RUNTIME "Enable static Visual C++ runtime" OFF)
123+opt(MUMPS "Enable MUMPS sparse direct linear solver" OFF)
124+opt(NETGEN "Enable Netgen 3D frontal mesh generator" ${DEFAULT})
125+opt(NUMPY "Enable fullMatrix and numpy array conversion for private API" OFF)
126+opt(PETSC4PY "Enable petsc4py wrappers for petsc matrices for private API" OFF)
127+opt(OCC "Enable OpenCASCADE CAD kernel" ${DEFAULT})
128+opt(OCC_CAF "Enable OpenCASCADE CAF module (for STEP/IGES attributes)" ${DEFAULT})
129+opt(OCC_STATIC "Link OpenCASCADE static instead of dynamic libraries (requires ENABLE_OCC)" OFF)
130+opt(OCC_TBB "Add TBB libraries in list of OCC libraries" OFF)
131+opt(ONELAB "Enable ONELAB solver interface" ${DEFAULT})
132+opt(ONELAB_METAMODEL "Enable ONELAB metamodels (experimental)" ${DEFAULT})
133+opt(OPENACC "Enable OpenACC" OFF)
134+opt(OPENMP "Enable OpenMP" OFF)
135+opt(OPTHOM "Enable high-order mesh optimization tools" ${DEFAULT})
136+opt(OS_SPECIFIC_INSTALL "Enable OS-specific (e.g. app bundle) installation" OFF)
137+opt(OSMESA "Enable OSMesa for offscreen rendering (experimental)" OFF)
138+opt(P4EST "Enable p4est for enabling automatic mesh size field (experimental)" OFF)
139+opt(PACKAGE_STRIP "Strip symbols in install packages to reduce install size" ON)
140+opt(PARSER "Enable GEO file parser (required for .geo/.pos scripts)" ${DEFAULT})
141+opt(PETSC "Enable PETSc linear solvers (required for SLEPc)" OFF)
142+opt(PLUGINS "Enable post-processing plugins" ${DEFAULT})
143+opt(POST "Enable post-processing module (required by GUI)" ${DEFAULT})
144+opt(POPPLER "Enable Poppler for displaying PDF documents (experimental)" OFF)
145+opt(PRIVATE_API "Enable private API" OFF)
146+opt(PRO "Enable PRO extensions" ${DEFAULT})
147+opt(QUADTRI "Enable QuadTri structured meshing extensions" ${DEFAULT})
148+opt(REVOROPT "Enable Revoropt (used for CVT remeshing)" OFF)
149+opt(RPATH "Use RPATH in dynamically linked targets" ON)
150+opt(SLEPC "Enable SLEPc eigensolvers" OFF)
151+opt(SOLVER "Enable built-in finite element solvers (required for reparametrization)" ${DEFAULT})
152+opt(SYSTEM_CONTRIB "Use system versions of contrib libraries, when possible" OFF)
153+opt(TCMALLOC "Enable libtcmalloc (fast malloc that does not release memory)" OFF)
154+opt(TOUCHBAR "Enable Apple Touch bar" ${DEFAULT})
155+opt(VISUDEV "Enable additional visualization capabilities for development purposes" OFF)
156+opt(VOROPP "Enable voro++ (for hex meshing, experimental)" ${DEFAULT})
157+opt(WRAP_JAVA "Generate SWIG Java wrappers for private API" OFF)
158+opt(WRAP_PYTHON "Generate SWIG Python wrappers for private API (not used by public API)" OFF)
159+opt(ZIPPER "Enable Zip file compression/decompression" OFF)
160+
161+set(GMSH_MAJOR_VERSION 4)
162+set(GMSH_MINOR_VERSION 7)
163+set(GMSH_PATCH_VERSION 0)
164+if(NOT GMSH_EXTRA_VERSION)
165+ set(GMSH_EXTRA_VERSION "")
166+endif()
167+set(GMSH_EXTRA_VERSION_TEXI "${GMSH_EXTRA_VERSION}")
168+set(GMSH_EXTRA_VERSION_ORIG ${GMSH_EXTRA_VERSION})
169+
170+if(NOT GMSH_RELEASE)
171+ find_package(Git)
172+ if(GIT_FOUND)
173+ execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --format=%h
174+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ERROR_QUIET
175+ OUTPUT_VARIABLE GIT_COMMIT_HASH
176+ OUTPUT_STRIP_TRAILING_WHITESPACE)
177+ endif()
178+ if(GIT_COMMIT_HASH)
179+ set(GMSH_EXTRA_VERSION "${GMSH_EXTRA_VERSION}-git-${GIT_COMMIT_HASH}")
180+ endif()
181+ set(GMSH_EXTRA_VERSION_TEXI "${GMSH_EXTRA_VERSION_TEXI} (development version)")
182+endif()
183+
184+set(GMSH_SHORT_VERSION
185+ "${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}.${GMSH_PATCH_VERSION}")
186+set(GMSH_VERSION "${GMSH_SHORT_VERSION}${GMSH_EXTRA_VERSION}")
187+set(GMSH_SHORT_LICENSE "GNU General Public License")
188+
189+set(GMSH_GITLAB_PREFIX "https://gitlab.onelab.info/gmsh/gmsh")
190+if(GMSH_RELEASE)
191+ set(GMSH_GITLAB_PREFIX "${GMSH_GITLAB_PREFIX}/blob/gmsh_${GMSH_SHORT_VERSION}")
192+else()
193+ set(GMSH_GITLAB_PREFIX "${GMSH_GITLAB_PREFIX}/blob/master")
194+endif()
195+
196+set(GMSH_API api/gmsh.h api/gmshc.h api/gmsh.h_cwrap)
197+
198+if(ENABLE_PRIVATE_API)
199+ message(WARNING "The private API is unsupported and undocumented. It is meant "
200+ "for expert Gmsh developers, not for regular Gmsh users, who should rely "
201+ "on the stable public API (gmsh/api) instead.")
202+ file(GLOB_RECURSE HEADERS Common/*.h Numeric/*.h Geo/*.h Mesh/*.h Solver/*.h
203+ Post/*.h Plugin/*.h Graphics/*.h contrib/kbipack/*.h
204+ contrib/DiscreteIntegration/*.h contrib/HighOrderMeshOptimizer/*.h
205+ contrib/MeshOptimizer/*.h contrib/MeshQualityOptimizer/*.h)
206+ set(GMSH_PRIVATE_API ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshConfig.h
207+ ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshVersion.h ${HEADERS})
208+ get_property(IAMCHILD DIRECTORY PROPERTY PARENT_DIRECTORY)
209+ if(IAMCHILD)
210+ set(GMSH_PRIVATE_API ${GMSH_PRIVATE_API} PARENT_SCOPE)
211+ endif()
212+ if(ENABLE_WRAP_PYTHON OR ENABLE_WRAP_JAVA)
213+ set(ENABLE_BUILD_DYNAMIC ON)
214+ message(WARNING "SWIG wrappers for the private API are unsupported and "
215+ "undocumented. The stable public Python API does not required SWIG.")
216+ endif()
217+endif()
218+
219+set(ONELAB_PY contrib/onelab/python/onelab.py)
220+set(GMSH_PY api/gmsh.py)
221+set(GMSH_JL api/gmsh.jl)
222+
223+if(${CMAKE_MAJOR_VERSION} GREATER 2)
224+ string(TIMESTAMP DATE "%Y%m%d")
225+else()
226+ execute_process(COMMAND date "+%Y%m%d" OUTPUT_VARIABLE DATE
227+ OUTPUT_STRIP_TRAILING_WHITESPACE)
228+endif()
229+
230+if(NOT DATE)
231+ set(DATE "unknown")
232+endif()
233+set(GMSH_DATE "${DATE}")
234+
235+if(NOT GMSH_HOST)
236+ execute_process(COMMAND hostname OUTPUT_VARIABLE HOST
237+ OUTPUT_STRIP_TRAILING_WHITESPACE)
238+ if(NOT HOST)
239+ set(HOST "unknown")
240+ endif()
241+ set(GMSH_HOST "${HOST}")
242+endif()
243+
244+if(NOT GMSH_PACKAGER)
245+ execute_process(COMMAND whoami OUTPUT_VARIABLE PACKAGER
246+ OUTPUT_STRIP_TRAILING_WHITESPACE)
247+ if(NOT PACKAGER)
248+ set(PACKAGER "unknown")
249+ endif()
250+ string(REPLACE "\\" " " PACKAGER ${PACKAGER})
251+ set(GMSH_PACKAGER "${PACKAGER}")
252+endif()
253+
254+if(APPLE)
255+ set(GMSH_OS "MacOSX")
256+elseif(CYGWIN OR MSYS)
257+ # detect if we use the MinGW compilers on Cygwin - if we do, handle the build
258+ # as a pure Windows build and make cmake find pure Windows import libraries
259+ # (.lib)
260+ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
261+ CMAKE_CXX_COMPILER_ID MATCHES "Clang")
262+ execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine
263+ OUTPUT_VARIABLE CXX_COMPILER_MACHINE
264+ OUTPUT_STRIP_TRAILING_WHITESPACE)
265+ if(CXX_COMPILER_MACHINE MATCHES "mingw")
266+ set(GMSH_OS "Windows")
267+ set(WIN32 1)
268+ add_definitions(-DWIN32)
269+ set(CMAKE_FIND_LIBRARY_PREFIXES "lib" "")
270+ set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".so" ".lib" ".LIB" ".dll" ".DLL" ".dll.a")
271+ endif()
272+ endif()
273+else()
274+ set(GMSH_OS "${CMAKE_SYSTEM_NAME}")
275+endif()
276+
277+include(CheckTypeSize)
278+include(CheckFunctionExists)
279+include(CheckIncludeFile)
280+include(CheckCXXCompilerFlag)
281+include(CheckCCompilerFlag)
282+
283+macro(set_config_option VARNAME STRING)
284+ set(${VARNAME} TRUE)
285+ list(APPEND CONFIG_OPTIONS ${STRING})
286+ message(STATUS "Found " ${STRING})
287+endmacro()
288+
289+# check the size of size_t
290+check_type_size("size_t" SIZEOF_SIZE_T)
291+if(SIZEOF_SIZE_T EQUAL 8)
292+ set_config_option(HAVE_64BIT_SIZE_T "64Bit")
293+endif()
294+
295+# append 32/64 to the build name on Linux and Windows
296+if(NOT APPLE)
297+ if(HAVE_64BIT_SIZE_T)
298+ set(GMSH_OS "${GMSH_OS}64")
299+ else()
300+ set(GMSH_OS "${GMSH_OS}32")
301+ endif()
302+endif()
303+
304+if(ENABLE_BUILD_DYNAMIC)
305+ set(GMSH_OS "${GMSH_OS}-sdk")
306+endif()
307+
308+if(ENABLE_RPATH)
309+ set(CMAKE_MACOSX_RPATH 1)
310+
311+ # make sure that dynamic libraries can be found when installing/ displacing
312+ # the binaries: from https://gitlab.kitware.com/cmake/community/wikis/doc/
313+ # cmake/RPATH-handling:
314+
315+ # use, i.e. don't skip the full RPATH for the build tree
316+ set(CMAKE_SKIP_BUILD_RPATH FALSE)
317+
318+ # when building, don't use the install RPATH already (but later on when
319+ # installing)
320+ set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
321+ set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
322+
323+ # add the automatically determined parts of the RPATH which point to
324+ # directories outside the build tree to the install RPATH
325+ set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
326+
327+ # the RPATH to be used when installing, but only if it's not a system directory
328+ list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib"
329+ isSystemDir)
330+ if("${isSystemDir}" STREQUAL "-1")
331+ if(APPLE)
332+ set(CMAKE_INSTALL_RPATH "@executable_path/../lib")
333+ else()
334+ set(CMAKE_INSTALL_RPATH "\\\$ORIGIN/../lib")
335+ endif()
336+ endif()
337+else()
338+ set(CMAKE_MACOSX_RPATH 0)
339+ set(CMAKE_SKIP_BUILD_RPATH TRUE)
340+endif()
341+
342+if(MSVC)
343+ # remove annoying warning about bool/int cast performance
344+ set(GMSH_CONFIG_PRAGMAS "#pragma warning(disable:4800 4244 4267)")
345+ foreach(VAR
346+ CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
347+ CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO
348+ CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
349+ CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
350+ if(ENABLE_MSVC_STATIC_RUNTIME AND ${VAR} MATCHES "/MD")
351+ string(REGEX REPLACE "/MD" "/MT" ${VAR} "${${VAR}}")
352+ endif()
353+ if(NOT ${VAR} MATCHES "/MP") # enable parallel compilation
354+ set(${VAR} "${${VAR}} /MP")
355+ endif()
356+ endforeach()
357+ if(ENABLE_PRIVATE_API)
358+ if(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
359+ # automatically export .def file with all symbols (requires CMake 3.4);
360+ # depending on the compiling options this might lead to more than 64k export
361+ # symbols; just trim the .def file to keep the ones you need
362+ set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
363+ endif()
364+ endif()
365+endif()
366+
367+# reduce memory usage of GCC on 32 bit systems
368+if(NOT HAVE_64BIT_SIZE_T AND CMAKE_CXX_COMPILER_ID MATCHES "GNU")
369+ set(CMAKE_CXX_FLAGS
370+ "${CMAKE_CXX_FLAGS} --param ggc-min-expand=1 --param ggc-min-heapsize=512000")
371+endif()
372+
373+if(ENABLE_OPENMP)
374+ find_package(OpenMP)
375+ if(OpenMP_FOUND OR OPENMP_FOUND)
376+ set_config_option(HAVE_OPENMP "OpenMP")
377+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
378+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
379+ elseif(APPLE AND EXISTS "/opt/local/lib/libomp")
380+ # official Apple compiler with macports' libomp
381+ set_config_option(HAVE_OPENMP "OpenMP[MacPorts]")
382+ set(CMAKE_C_FLAGS
383+ "${CMAKE_C_FLAGS} -Xpreprocessor -fopenmp -I/opt/local/include/libomp")
384+ set(CMAKE_CXX_FLAGS
385+ "${CMAKE_CXX_FLAGS} -Xpreprocessor -fopenmp -I/opt/local/include/libomp")
386+ list(APPEND EXTERNAL_LIBRARIES "-L/opt/local/lib/libomp -lomp")
387+ elseif(APPLE AND EXISTS "/usr/local/lib/libomp.dylib")
388+ # official Apple compiler with homebrew's libomp
389+ set_config_option(HAVE_OPENMP "OpenMP[Homebrew]")
390+ set(CMAKE_C_FLAGS
391+ "${CMAKE_C_FLAGS} -Xpreprocessor -fopenmp")
392+ set(CMAKE_CXX_FLAGS
393+ "${CMAKE_CXX_FLAGS} -Xpreprocessor -fopenmp")
394+ list(APPEND EXTERNAL_LIBRARIES "-L/usr/local/lib -lomp")
395+ endif()
396+endif()
397+
398+if(ENABLE_OPENACC)
399+ find_package(OpenACC)
400+ if(OpenACC_C_FOUND AND OpenACC_CXX_FOUND)
401+ set_config_option(HAVE_OPENACC "OpenACC")
402+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenACC_C_FLAGS}")
403+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenACC_CXX_FLAGS}")
404+ endif()
405+endif()
406+
407+if(ENABLE_PROFILE)
408+ # Using the perf set of profiling tools doesn't work without the frame
409+ # pointer and a common optimisation is to remove it
410+ check_cxx_compiler_flag("-fno-omit-frame-pointer" FNOFP)
411+ if(FNOFP)
412+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
413+ endif()
414+endif()
415+
416+macro(append_gmsh_src DIRNAME FILES)
417+ foreach(FILE ${FILES})
418+ list(APPEND LIST ${DIRNAME}/${FILE})
419+ endforeach()
420+ set(GMSH_SRC ${GMSH_SRC};${LIST} PARENT_SCOPE)
421+ set(GMSH_DIRS ${GMSH_DIRS};${DIRNAME} PARENT_SCOPE)
422+endmacro()
423+
424+macro(find_all_libraries VARNAME LISTNAME PATH SUFFIX)
425+ set(${VARNAME})
426+ list(LENGTH ${LISTNAME} NUM_LIST)
427+ foreach(LIB ${${LISTNAME}})
428+ if("${PATH}" STREQUAL "")
429+ find_library(FOUND_LIB ${LIB} PATH_SUFFIXES ${SUFFIX})
430+ else()
431+ find_library(FOUND_LIB ${LIB} PATHS ${PATH} NO_DEFAULT_PATH)
432+ endif()
433+ if(FOUND_LIB)
434+ list(APPEND ${VARNAME} ${FOUND_LIB})
435+ endif()
436+ unset(FOUND_LIB CACHE)
437+ endforeach()
438+ list(LENGTH ${VARNAME} NUM_FOUND_LIBRARIES)
439+ if(NUM_FOUND_LIBRARIES LESS NUM_LIST)
440+ set(${VARNAME})
441+ endif()
442+endmacro()
443+
444+macro(set_compile_flags LISTNAME FLAGS)
445+ foreach(FILE ${${LISTNAME}})
446+ get_source_file_property(PROP ${FILE} COMPILE_FLAGS)
447+ if(PROP)
448+ set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS "${PROP} ${FLAGS}")
449+ else()
450+ set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS "${FLAGS}")
451+ endif()
452+ endforeach()
453+endmacro()
454+
455+if(ENABLE_EIGEN)
456+ if(ENABLE_SYSTEM_CONTRIB)
457+ find_path(EIGEN_INC "Eigen/Dense" HINTS eigen3)
458+ if(EIGEN_INC)
459+ include_directories(${EIGEN_INC})
460+ set_config_option(HAVE_EIGEN "Eigen[system]")
461+ endif()
462+ endif()
463+ if(NOT HAVE_EIGEN)
464+ include_directories(contrib/eigen)
465+ set_config_option(HAVE_EIGEN "Eigen")
466+ endif()
467+ # We could also add an option to use BLAS with Eigen
468+ # add_definitions(-DEIGEN_USE_BLAS)
469+elseif(ENABLE_BLAS_LAPACK)
470+ if(BLAS_LAPACK_LIBRARIES)
471+ # use libs as specified in the BLAS_LAPACK_LIBRARIES variable
472+ set_config_option(HAVE_BLAS "Blas[custom]")
473+ set_config_option(HAVE_LAPACK "Lapack[custom]")
474+ set(LAPACK_LIBRARIES ${BLAS_LAPACK_LIBRARIES})
475+ else()
476+ if(MSVC)
477+ # on Windows with Visual C++ try really hard to find blas/lapack *without*
478+ # requiring a Fortran compiler: 1) try to find the Intel MKL libs using
479+ # the standard search path; if not found 2) try to get the reference
480+ # blas/lapack libs (useful for users with no Fortran compiler and no MKL
481+ # license, who can just download our precompiled "gmsh-dep" package)
482+ if(HAVE_64BIT_SIZE_T)
483+ set(MKL_PATH em64t/lib)
484+ set(MKL_LIBS_REQUIRED libguide40 mkl_intel_lp64 mkl_intel_thread mkl_core)
485+ else()
486+ set(MKL_PATH ia32/lib)
487+ set(MKL_LIBS_REQUIRED libguide40 mkl_intel_c mkl_intel_thread mkl_core)
488+ endif()
489+ find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
490+ if(LAPACK_LIBRARIES)
491+ set_config_option(HAVE_BLAS "Blas[mkl]")
492+ set_config_option(HAVE_LAPACK "Lapack[mkl]")
493+ else()
494+ set(REFLAPACK_LIBS_REQUIRED lapack blas g2c gcc)
495+ find_all_libraries(LAPACK_LIBRARIES REFLAPACK_LIBS_REQUIRED "" "")
496+ if(LAPACK_LIBRARIES)
497+ set_config_option(HAVE_BLAS "Blas[ref]")
498+ set_config_option(HAVE_LAPACK "Lapack[ref]")
499+ endif()
500+ endif()
501+ elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
502+ # on Linux try to find the Intel MKL without a Fortran compiler
503+ if(HAVE_64BIT_SIZE_T)
504+ set(MKL_PATH lib/em64t)
505+ else()
506+ set(MKL_PATH lib/32)
507+ endif()
508+ set(MKL_LIBS_REQUIRED mkl_gf_lp64 iomp5 mkl_gnu_thread mkl_core guide pthread)
509+ find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
510+ if(NOT LAPACK_LIBRARIES)
511+ # match lapack 9.0 on 64bit
512+ set(MKL_LIBS_REQUIRED mkl_lapack mkl_em64t guide)
513+ find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
514+ endif()
515+ if(LAPACK_LIBRARIES)
516+ set_config_option(HAVE_BLAS "Blas[mkl]")
517+ set_config_option(HAVE_LAPACK "Lapack[mkl]")
518+ else()
519+ # on Linux also try to find ATLAS without a Fortran compiler, because
520+ # cmake ships with a buggy FindBLAS e.g. on Ubuntu Lucid Lynx
521+ set(ATLAS_LIBS_REQUIRED lapack f77blas cblas atlas)
522+ find_all_libraries(LAPACK_LIBRARIES ATLAS_LIBS_REQUIRED "" "")
523+ if(LAPACK_LIBRARIES)
524+ set_config_option(HAVE_BLAS "Blas[atlas]")
525+ set_config_option(HAVE_LAPACK "Lapack[atlas]")
526+ else()
527+ # try with generic names
528+ set(GENERIC_LIBS_REQUIRED lapack blas pthread)
529+ find_all_libraries(LAPACK_LIBRARIES GENERIC_LIBS_REQUIRED "" "")
530+ if(LAPACK_LIBRARIES)
531+ set_config_option(HAVE_BLAS "Blas[generic]")
532+ set_config_option(HAVE_LAPACK "Lapack[generic]")
533+ find_library(GFORTRAN_LIB gfortran)
534+ if(GFORTRAN_LIB)
535+ list(APPEND LAPACK_LIBRARIES ${GFORTRAN_LIB})
536+ endif()
537+ endif()
538+ endif()
539+ endif()
540+ elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
541+ # on SunOS we know blas and lapack are available in sunperf
542+ set(LAPACK_LIBRARIES -library=sunperf)
543+ set_config_option(HAVE_BLAS "Blas[sunperf]")
544+ set_config_option(HAVE_LAPACK "Lapack[sunperf]")
545+ elseif(APPLE)
546+ # on Mac we also know that blas and lapack are available
547+ set(LAPACK_LIBRARIES "-llapack -lblas")
548+ set_config_option(HAVE_BLAS "Blas[veclib]")
549+ set_config_option(HAVE_LAPACK "Lapack[veclib]")
550+ endif()
551+
552+ if(NOT HAVE_BLAS OR NOT HAVE_LAPACK)
553+ # if we haven't found blas and lapack check for OpenBlas
554+ set(OPENBLAS_LIBS_REQUIRED openblas)
555+ find_all_libraries(LAPACK_LIBRARIES OPENBLAS_LIBS_REQUIRED "" "")
556+ if(LAPACK_LIBRARIES)
557+ set_config_option(HAVE_BLAS "Blas[openblas]")
558+ set_config_option(HAVE_LAPACK "Lapack[openblas]")
559+ find_library(GFORTRAN_LIB gfortran)
560+ if(GFORTRAN_LIB)
561+ list(APPEND LAPACK_LIBRARIES ${GFORTRAN_LIB})
562+ endif()
563+ endif()
564+ endif()
565+
566+ if(NOT HAVE_BLAS OR NOT HAVE_LAPACK)
567+ # if we still haven't found blas and lapack, use the standard cmake tests,
568+ # which require a working Fortran compiler
569+ enable_language(Fortran)
570+ find_package(BLAS)
571+ if(BLAS_FOUND)
572+ set_config_option(HAVE_BLAS "Blas")
573+ find_package(LAPACK)
574+ if(LAPACK_FOUND)
575+ set_config_option(HAVE_LAPACK "Lapack")
576+ else()
577+ set(LAPACK_LIBRARIES ${BLAS_LIBRARIES})
578+ endif()
579+ if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
580+ if(CMAKE_Fortran_COMPILER MATCHES "gfortran")
581+ list(APPEND LAPACK_LIBRARIES gfortran)
582+ elseif(CMAKE_Fortran_COMPILER MATCHES "f95")
583+ list(APPEND LAPACK_LIBRARIES gfortran)
584+ elseif(CMAKE_Fortran_COMPILER MATCHES "g77")
585+ list(APPEND LAPACK_LIBRARIES g2c)
586+ endif()
587+ elseif(CMAKE_Fortran_COMPILER MATCHES "pgi")
588+ list(APPEND LAPACK_LIBRARIES -pgf77libs)
589+ endif()
590+ endif()
591+ endif()
592+ endif()
593+endif()
594+
595+if(ENABLE_TCMALLOC)
596+ find_library(TCMALLOC tcmalloc)
597+ if(TCMALLOC)
598+ set_config_option(HAVE_TCMALLOC "TCMalloc")
599+ list(APPEND EXTERNAL_LIBRARIES ${TCMALLOC})
600+ endif()
601+endif()
602+
603+add_subdirectory(Common)
604+add_subdirectory(Numeric)
605+add_subdirectory(Geo)
606+
607+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Mesh AND ENABLE_MESH)
608+ add_subdirectory(Mesh)
609+ set_config_option(HAVE_MESH "Mesh")
610+endif()
611+
612+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Solver AND ENABLE_SOLVER)
613+ add_subdirectory(Solver)
614+ set_config_option(HAVE_SOLVER "Solver")
615+endif()
616+
617+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Post AND ENABLE_POST)
618+ add_subdirectory(Post)
619+ set_config_option(HAVE_POST "Post")
620+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Plugin AND ENABLE_PLUGINS)
621+ add_subdirectory(Plugin)
622+ set_config_option(HAVE_PLUGINS "Plugins")
623+ endif()
624+endif()
625+
626+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Parser AND ENABLE_PARSER)
627+ add_subdirectory(Parser)
628+ set_config_option(HAVE_PARSER "Parser")
629+endif()
630+
631+if(ENABLE_VISUDEV)
632+ set_config_option(HAVE_VISUDEV "VisuDev")
633+endif()
634+
635+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Fltk AND ENABLE_FLTK)
636+ # first, try to use fltk-config for fltk >= 1.3 (FindFLTK is buggy on Unix,
637+ # where e.g. xft and xinerama options are not dealt with)
638+ find_program(FLTK_CONFIG_SCRIPT fltk-config)
639+ if(FLTK_CONFIG_SCRIPT)
640+ execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --api-version
641+ OUTPUT_VARIABLE FLTK_VERSION)
642+ string(STRIP "${FLTK_VERSION}" FLTK_VERSION)
643+ if(FLTK_VERSION VERSION_GREATER 1.1)
644+ add_subdirectory(Fltk)
645+ set_config_option(HAVE_FLTK "Fltk")
646+ message(STATUS "Using fltk-config script for Fltk " ${FLTK_VERSION})
647+ execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --use-gl --use-images --includedir
648+ OUTPUT_VARIABLE FLTK_INCLUDE_DIR)
649+ string(STRIP ${FLTK_INCLUDE_DIR} FLTK_INCLUDE_DIR)
650+ list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR})
651+ # On linux (at least OpenSuSE) the following directories are
652+ # not existing (everything is in /usr/include). To avoid warnings
653+ # check existance of these directories before adding them
654+ if(EXISTS ${FLTK_INCLUDE_DIR}/FL/images)
655+ list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/FL/images)
656+ endif()
657+ if(EXISTS ${FLTK_INCLUDE_DIR}/jpeg)
658+ list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/jpeg)
659+ endif()
660+ if(EXISTS ${FLTK_INCLUDE_DIR}/zlib)
661+ list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/zlib)
662+ endif()
663+ if(EXISTS ${FLTK_INCLUDE_DIR}/png)
664+ list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/png)
665+ endif()
666+ execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --use-gl --use-images --ldflags
667+ OUTPUT_VARIABLE FLTK_LIBRARIES)
668+ string(STRIP ${FLTK_LIBRARIES} FLTK_LIBRARIES)
669+ string(REGEX MATCH "fltk[_ ]jpeg" FLTK_JPEG ${FLTK_LIBRARIES})
670+ string(REGEX MATCH "fltk[_ ]z" FLTK_Z ${FLTK_LIBRARIES})
671+ string(REGEX MATCH "fltk[_ ]png" FLTK_PNG ${FLTK_LIBRARIES})
672+ endif()
673+ endif()
674+ # then try the built-in FindFLTK module
675+ if(NOT HAVE_FLTK)
676+ set(FLTK_SKIP_FORMS TRUE)
677+ set(FLTK_SKIP_FLUID TRUE)
678+ find_package(FLTK)
679+ if(FLTK_FOUND)
680+ add_subdirectory(Fltk)
681+ set_config_option(HAVE_FLTK "Fltk")
682+ list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR})
683+ # find fltk jpeg
684+ find_library(FLTK_JPEG NAMES fltk_jpeg fltkjpeg)
685+ if(FLTK_JPEG)
686+ list(APPEND EXTERNAL_LIBRARIES ${FLTK_JPEG})
687+ foreach(DIR ${FLTK_INCLUDE_DIR})
688+ list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/jpeg)
689+ endforeach()
690+ endif()
691+ # find fltk zlib
692+ find_library(FLTK_Z NAMES fltk_z fltkz)
693+ if(FLTK_Z)
694+ list(APPEND EXTERNAL_LIBRARIES ${FLTK_Z})
695+ foreach(DIR ${FLTK_INCLUDE_DIR})
696+ list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/zlib)
697+ endforeach()
698+ endif()
699+ # find fltk png
700+ find_library(FLTK_PNG NAMES fltk_png fltkpng)
701+ if(FLTK_PNG)
702+ list(APPEND EXTERNAL_LIBRARIES ${FLTK_PNG})
703+ foreach(DIR ${FLTK_INCLUDE_DIR})
704+ list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/png)
705+ endforeach()
706+ endif()
707+ endif()
708+ endif()
709+ # workaround for Fedora/Suse messing up fltk-config (see issue #417)
710+ if(HAVE_FLTK AND ${CMAKE_SYSTEM_NAME} MATCHES "Linux")
711+ string(REGEX MATCH "X11" FLTK_X11 ${FLTK_LIBRARIES})
712+ if(NOT FLTK_X11)
713+ find_package(X11)
714+ if(X11_FOUND)
715+ list(APPEND EXTERNAL_INCLUDES ${X11_INCLUDE_DIR})
716+ list(APPEND EXTERNAL_LIBRARIES ${X11_LIBRARIES})
717+ endif()
718+ endif()
719+ endif()
720+endif()
721+
722+if(APPLE AND HAVE_FLTK AND ENABLE_TOUCHBAR)
723+ STRING(REGEX MATCH "([0-9]+.[0-9]+)" OSX_SDK_VERSION "${CMAKE_OSX_SYSROOT}")
724+ if(OSX_SDK_VERSION)
725+ if(${OSX_SDK_VERSION} VERSION_GREATER 10.11)
726+ set(GMSH_SRC ${GMSH_SRC};Fltk/touchBar.mm)
727+ set_config_option(HAVE_TOUCHBAR "TouchBar")
728+ endif()
729+ endif()
730+endif()
731+
732+if(ENABLE_ONELAB)
733+ set_config_option(HAVE_ONELAB "ONELAB")
734+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/onelab)
735+ if(ENABLE_ONELAB_METAMODEL)
736+ add_subdirectory(contrib/onelab)
737+ include_directories(contrib/onelab)
738+ set_config_option(HAVE_ONELAB_METAMODEL "ONELABMetamodel")
739+ endif()
740+ file(COPY ${ONELAB_PY} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
741+ endif()
742+endif()
743+
744+if(ENABLE_BUILD_IOS)
745+ find_file(CMAKE_TOOLCHAIN_FILE "ios.cmake")
746+ if(NOT CMAKE_TOOLCHAIN_FILE)
747+ message(FATAL_ERROR "Cannot compile Gmsh for iOS without a toolchain")
748+ endif()
749+ add_definitions(-DBUILD_IOS)
750+endif()
751+
752+if(HAVE_FLTK OR ENABLE_GRAPHICS)
753+ if(NOT HAVE_MESH OR NOT HAVE_POST OR NOT HAVE_PLUGINS OR NOT HAVE_ONELAB)
754+ message(SEND_ERROR "Cannot compile GUI without Mesh, Post, Plugin and ONELAB")
755+ endif()
756+
757+ if(FLTK_JPEG)
758+ set_config_option(HAVE_LIBJPEG "Jpeg[fltk]")
759+ else()
760+ find_package(JPEG)
761+ if(JPEG_FOUND)
762+ set_config_option(HAVE_LIBJPEG "Jpeg")
763+ list(APPEND EXTERNAL_LIBRARIES ${JPEG_LIBRARIES})
764+ list(APPEND EXTERNAL_INCLUDES ${JPEG_INCLUDE_DIR})
765+ endif()
766+ endif()
767+
768+ if(FLTK_Z)
769+ set_config_option(HAVE_LIBZ "Zlib[fltk]")
770+ else()
771+ find_package(ZLIB)
772+ if(ZLIB_FOUND)
773+ set_config_option(HAVE_LIBZ "Zlib")
774+ list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
775+ list(APPEND EXTERNAL_INCLUDES ${ZLIB_INCLUDE_DIR})
776+ endif()
777+ endif()
778+
779+ if(HAVE_LIBZ)
780+ if(FLTK_PNG)
781+ set_config_option(HAVE_LIBPNG "Png[fltk]")
782+ else()
783+ find_package(PNG)
784+ if(PNG_FOUND)
785+ set_config_option(HAVE_LIBPNG "Png")
786+ list(APPEND EXTERNAL_LIBRARIES ${PNG_LIBRARIES})
787+ list(APPEND EXTERNAL_INCLUDES ${PNG_INCLUDE_DIR})
788+ endif()
789+ endif()
790+ endif()
791+
792+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/mpeg_encode AND
793+ ENABLE_MPEG_ENCODE)
794+ add_subdirectory(contrib/mpeg_encode)
795+ include_directories(contrib/mpeg_encode/headers)
796+ set_config_option(HAVE_MPEG_ENCODE "Mpeg")
797+ endif()
798+
799+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/3M AND ENABLE_3M)
800+ add_subdirectory(contrib/3M)
801+ include_directories(contrib/3M)
802+ set_config_option(HAVE_3M "3M")
803+ endif()
804+
805+ if(ENABLE_OSMESA)
806+ find_library(OSMESA_LIB OSMesa)
807+ if(OSMESA_LIB)
808+ set_config_option(HAVE_OSMESA "OSMesa")
809+ list(APPEND EXTERNAL_LIBRARIES ${OSMESA_LIB})
810+ endif()
811+ endif()
812+
813+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Graphics)
814+ set(OpenGL_GL_PREFERENCE "LEGACY")
815+ find_package(OpenGL REQUIRED)
816+ if(OPENGL_GLU_FOUND AND OPENGL_FOUND)
817+ add_subdirectory(Graphics)
818+ set_config_option(HAVE_OPENGL "OpenGL")
819+ else()
820+ message(SEND_ERROR "Could not find GLU: disabling OpenGL support")
821+ endif()
822+ endif()
823+endif()
824+
825+if(ENABLE_ANN)
826+ find_library(ANN_LIB ANN PATH_SUFFIXES lib)
827+ find_path(ANN_INC "ANN.h" PATH_SUFFIXES src include ANN)
828+ if(ENABLE_SYSTEM_CONTRIB AND ANN_LIB AND ANN_INC)
829+ message(STATUS "Using system version of ANN")
830+ list(APPEND EXTERNAL_LIBRARIES ${ANN_LIB})
831+ list(APPEND EXTERNAL_INCLUDES ${ANN_INC})
832+ set_config_option(HAVE_ANN "ANN[system]")
833+ elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/ANN)
834+ add_subdirectory(contrib/ANN)
835+ include_directories(contrib/ANN/include)
836+ set_config_option(HAVE_ANN "ANN")
837+ endif()
838+endif()
839+
840+if(ENABLE_ALGLIB)
841+ find_library(ALGLIB_LIB alglib)
842+ find_path(ALGLIB_INC "stdafx.h" PATH_SUFFIXES libalglib)
843+ if(ENABLE_SYSTEM_CONTRIB AND ALGLIB_LIB AND ALGLIB_INC)
844+ list(APPEND EXTERNAL_LIBRARIES ${ALGLIB_LIB})
845+ list(APPEND EXTERNAL_INCLUDES ${ALGLIB_INC})
846+ set_config_option(HAVE_ALGLIB "ALGLIB[system]")
847+ elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/ALGLIB)
848+ add_subdirectory(contrib/ALGLIB)
849+ include_directories(contrib/ALGLIB)
850+ set_config_option(HAVE_ALGLIB "ALGLIB")
851+ endif()
852+endif()
853+
854+if(HAVE_FLTK AND ENABLE_CAIRO)
855+ find_library(CAIRO_LIB cairo)
856+ find_path(CAIRO_INC "cairo/cairo.h" PATH_SUFFIXES include)
857+ if(CAIRO_INC AND CAIRO_LIB)
858+ set_config_option(HAVE_CAIRO "Cairo")
859+ list(APPEND EXTERNAL_LIBRARIES ${CAIRO_LIB})
860+ list(APPEND EXTERNAL_INCLUDES ${CAIRO_INC})
861+ endif()
862+endif()
863+
864+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/DiscreteIntegration AND
865+ ENABLE_DINTEGRATION)
866+ add_subdirectory(contrib/DiscreteIntegration)
867+ include_directories(contrib/DiscreteIntegration)
868+ set_config_option(HAVE_DINTEGRATION "DIntegration")
869+endif()
870+
871+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/HighOrderMeshOptimizer AND
872+ EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MeshOptimizer AND
873+ EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MeshQualityOptimizer AND
874+ ENABLE_OPTHOM AND HAVE_MESH)
875+ add_subdirectory(contrib/HighOrderMeshOptimizer)
876+ include_directories(contrib/HighOrderMeshOptimizer)
877+ add_subdirectory(contrib/MeshOptimizer)
878+ include_directories(contrib/MeshOptimizer)
879+ include_directories(${CMAKE_CURRENT_BINARY_DIR}/contrib/MeshOptimizer)
880+ add_subdirectory(contrib/MeshQualityOptimizer)
881+ include_directories(contrib/MeshQualityOptimizer)
882+ set_config_option(HAVE_OPTHOM "OptHom")
883+endif()
884+
885+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/domhex AND
886+ ENABLE_DOMHEX AND HAVE_MESH)
887+ add_subdirectory(contrib/domhex)
888+ include_directories(contrib/domhex)
889+ set_config_option(HAVE_DOMHEX "DomHex")
890+endif()
891+
892+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/QuadTri AND
893+ ENABLE_QUADTRI AND HAVE_MESH)
894+ add_subdirectory(contrib/QuadTri)
895+ include_directories(contrib/QuadTri)
896+ set_config_option(HAVE_QUADTRI "QuadTri")
897+endif()
898+
899+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/kbipack AND ENABLE_KBIPACK)
900+ set_config_option(HAVE_KBIPACK "Kbipack")
901+ add_subdirectory(contrib/kbipack)
902+ include_directories(contrib/kbipack)
903+ if(ENABLE_GMP)
904+ find_library(GMP_LIB libgmp.a)
905+ find_path(GMP_INC "gmp.h" PATH_SUFFIXES src include)
906+ endif()
907+ if(GMP_LIB AND GMP_INC)
908+ set_config_option(HAVE_GMP "GMP")
909+ list(APPEND EXTERNAL_LIBRARIES ${GMP_LIB})
910+ list(APPEND EXTERNAL_INCLUDES ${GMP_INC})
911+ else()
912+ message(STATUS "GMP not found: Kbipack uses long int")
913+ endif()
914+endif()
915+
916+if(ENABLE_MATHEX)
917+ find_library(MATHEX_LIB mathex PATH_SUFFIXES lib)
918+ find_path(MATHEX_INC "mathex.h" PATH_SUFFIXES src include)
919+ if(ENABLE_SYSTEM_CONTRIB AND MATHEX_LIB AND MATHEX_INC)
920+ list(APPEND EXTERNAL_LIBRARIES ${MATHEX_LIB})
921+ list(APPEND EXTERNAL_INCLUDES ${MATHEX_INC})
922+ set_config_option(HAVE_MATHEX "MathEx[system]")
923+ elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MathEx)
924+ add_subdirectory(contrib/MathEx)
925+ include_directories(contrib/MathEx)
926+ set_config_option(HAVE_MATHEX "MathEx")
927+ endif()
928+endif()
929+
930+if(ENABLE_MPI)
931+ find_package(MPI)
932+ if(MPI_FOUND)
933+ set_config_option(HAVE_MPI "MPI")
934+ list(APPEND EXTERNAL_INCLUDES ${MPI_CXX_INCLUDE_PATH})
935+ list(APPEND EXTERNAL_LIBRARIES ${MPI_CXX_LIBRARIES})
936+ set(CMAKE_C_COMPILER ${MPI_C_COMPILER})
937+ set(CMAKE_CXX_COMPILER ${MPI_CXX_COMPILER})
938+ set(CMAKE_Fortran_COMPILER ${MPI_Fortran_COMPILER})
939+ endif()
940+endif()
941+
942+if(ENABLE_POPPLER)
943+ find_library(POPPLER_LIB poppler)
944+ find_library(POPPLER_CPP_LIB poppler-cpp)
945+ find_path(POPPLER_INC "poppler/cpp/poppler-document.h" PATH_SUFFIXES src include)
946+ if(POPPLER_LIB AND POPPLER_INC)
947+ set_config_option(HAVE_POPPLER "Poppler")
948+ list(APPEND EXTERNAL_LIBRARIES ${POPPLER_LIB})
949+ list(APPEND EXTERNAL_LIBRARIES ${POPPLER_CPP_LIB})
950+ list(APPEND EXTERNAL_INCLUDES ${POPPLER_INC})
951+ endif()
952+endif()
953+
954+if(ENABLE_P4EST)
955+ find_library(P4EST_LIB p4est)
956+ find_path(P4EST_INC "p4est.h" PATH_SUFFIXES src)
957+ find_library(SC_LIB sc)
958+ if(P4EST_LIB AND P4EST_INC AND SC_LIB)
959+ set_config_option(HAVE_P4EST "P4est")
960+ list(APPEND EXTERNAL_LIBRARIES ${P4EST_LIB} ${SC_LIB})
961+ list(APPEND EXTERNAL_INCLUDES ${P4EST_INC})
962+ endif()
963+endif()
964+
965+if(HAVE_MESH OR HAVE_SOLVER)
966+ if(ENABLE_METIS)
967+ if(METIS_LIB AND METIS_INC)
968+ list(APPEND EXTERNAL_LIBRARIES ${METIS_LIB})
969+ list(APPEND EXTERNAL_INCLUDES ${METIS_INC})
970+ set_config_option(HAVE_METIS "Metis")
971+ else()
972+ find_library(METIS_LIB metis PATH_SUFFIXES lib)
973+ find_path(METIS_INC "metis.h" PATH_SUFFIXES include)
974+ if(ENABLE_SYSTEM_CONTRIB AND METIS_LIB AND METIS_INC)
975+ message(STATUS "Using system version of METIS")
976+ list(APPEND EXTERNAL_LIBRARIES ${METIS_LIB})
977+ list(APPEND EXTERNAL_INCLUDES ${METIS_INC})
978+ set_config_option(HAVE_METIS "Metis[system]")
979+ elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/metis)
980+ add_definitions(-DUSE_GKREGEX)
981+ add_subdirectory(contrib/metis)
982+ include_directories(contrib/metis/include contrib/metis/libmetis
983+ contrib/metis/GKlib)
984+ set_config_option(HAVE_METIS "Metis")
985+ endif()
986+ endif()
987+ endif()
988+endif()
989+
990+if(HAVE_MESH)
991+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Mesh/tetgenBR.cxx)
992+ set_config_option(HAVE_TETGENBR "TetGen/BR")
993+ endif()
994+
995+ if(ENABLE_VOROPP)
996+ find_library(VOROPP_LIB voro++)
997+ find_path(VOROPP_INC "voro++.hh" PATH_SUFFIXES voro++)
998+ if(ENABLE_SYSTEM_CONTRIB AND VOROPP_LIB AND VOROPP_INC)
999+ message(STATUS "Using system version of voro++")
1000+ list(APPEND EXTERNAL_LIBRARIES ${VOROPP_LIB})
1001+ list(APPEND EXTERNAL_INCLUDES ${VOROPP_INC})
1002+ set_config_option(HAVE_VOROPP "Voro++[system]")
1003+ elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/voro++)
1004+ add_subdirectory(contrib/voro++)
1005+ include_directories(contrib/voro++/src)
1006+ set_config_option(HAVE_VOROPP "Voro++")
1007+ endif()
1008+ endif()
1009+
1010+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/blossom AND ENABLE_BLOSSOM)
1011+ add_subdirectory(contrib/blossom)
1012+ include_directories(contrib/blossom/MATCH contrib/blossom/concorde97
1013+ contrib/blossom/concorde97/INCLUDE)
1014+ set_config_option(HAVE_BLOSSOM "Blossom")
1015+ endif()
1016+
1017+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/Netgen AND ENABLE_NETGEN)
1018+ add_subdirectory(contrib/Netgen)
1019+ include_directories(contrib/Netgen contrib/Netgen/libsrc/include
1020+ contrib/Netgen/nglib)
1021+ set_config_option(HAVE_NETGEN "Netgen")
1022+ add_definitions(-DNO_PARALLEL_THREADS -DNOTCL)
1023+ endif()
1024+
1025+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/bamg AND ENABLE_BAMG)
1026+ add_subdirectory(contrib/bamg)
1027+ include_directories(contrib/bamg contrib/bamg/bamglib)
1028+ set_config_option(HAVE_BAMG "Bamg")
1029+ endif()
1030+
1031+ if(ENABLE_MMG)
1032+ find_library(MMG_LIB NAMES Mmg mmg)
1033+ find_path(MMG_INC "libmmg.h" PATH_SUFFIXES mmg)
1034+ if(MMG_LIB AND MMG_INC)
1035+ list(APPEND EXTERNAL_LIBRARIES ${MMG_LIB})
1036+ list(APPEND EXTERNAL_INCLUDES ${MMG_INC})
1037+ set_config_option(HAVE_MMG "Mmg")
1038+ endif()
1039+ endif()
1040+endif()
1041+
1042+if(ENABLE_MED OR ENABLE_CGNS)
1043+ find_package(HDF5)
1044+ if(HDF5_FOUND)
1045+ set(HDF5_LIB "${HDF5_C_LIBRARIES}")
1046+ list(APPEND EXTERNAL_INCLUDES ${HDF5_INCLUDE_DIRS})
1047+ if(ENABLE_MED)
1048+ find_library(MED_LIB medC)
1049+ if(MED_LIB)
1050+ set_config_option(HAVE_MED "Med")
1051+ list(APPEND EXTERNAL_LIBRARIES ${MED_LIB})
1052+ endif()
1053+ endif()
1054+ if(ENABLE_CGNS)
1055+ find_library(CGNS_LIB cgns HINTS ENV CGNS_ROOT PATH_SUFFIXES lib)
1056+ find_path(CGNS_INC "cgnslib.h" HINTS ENV CGNS_ROOT PATH_SUFFIXES include)
1057+ if(CGNS_LIB AND CGNS_INC)
1058+ set_config_option(HAVE_LIBCGNS "Cgns")
1059+ list(APPEND EXTERNAL_LIBRARIES ${CGNS_LIB})
1060+ list(APPEND EXTERNAL_INCLUDES ${CGNS_INC})
1061+ if(ENABLE_CGNS_CPEX0045)
1062+ set_config_option(HAVE_LIBCGNS_CPEX0045 "Cgns_CPEX0045")
1063+ endif()
1064+ endif()
1065+ endif()
1066+ if(MED_LIB OR CGNS_LIB)
1067+ list(APPEND EXTERNAL_LIBRARIES ${HDF5_LIB})
1068+ find_library(SZ_LIB NAMES szlib sz)
1069+ if(SZ_LIB)
1070+ list(APPEND EXTERNAL_LIBRARIES ${SZ_LIB})
1071+ endif()
1072+ if(NOT HAVE_LIBZ) # necessary for non-GUI builds
1073+ find_package(ZLIB)
1074+ if(ZLIB_FOUND)
1075+ set_config_option(HAVE_LIBZ "Zlib")
1076+ list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
1077+ endif()
1078+ endif()
1079+ endif()
1080+ else()
1081+ message(STATUS "HDF5 not found")
1082+ endif()
1083+endif()
1084+
1085+if(HAVE_SOLVER)
1086+ if(ENABLE_GMM)
1087+ find_path(GMM_INC "gmm.h" PATH_SUFFIXES src include include/gmm)
1088+ if(ENABLE_SYSTEM_CONTRIB AND GMM_INC)
1089+ message(STATUS "Using system version of GMM")
1090+ list(APPEND EXTERNAL_INCLUDES ${GMM_INC})
1091+ set_config_option(HAVE_GMM "Gmm[system]")
1092+ elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/gmm)
1093+ include_directories(contrib/gmm)
1094+ set_config_option(HAVE_GMM "Gmm")
1095+ endif()
1096+ endif()
1097+
1098+ if(ENABLE_PETSC)
1099+ if(PETSC_DIR)
1100+ set(ENV_PETSC_DIR ${PETSC_DIR})
1101+ else()
1102+ set(ENV_PETSC_DIR $ENV{PETSC_DIR})
1103+ endif()
1104+ if(PETSC_ARCH)
1105+ set(ENV_PETSC_ARCH ${PETSC_ARCH})
1106+ else()
1107+ set(ENV_PETSC_ARCH $ENV{PETSC_ARCH})
1108+ endif()
1109+ set(PETSC_POSSIBLE_CONF_FILES
1110+ ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/conf/petscvariables
1111+ ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib/petsc-conf/petscvariables
1112+ ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib/petsc/conf/petscvariables)
1113+ foreach(FILE ${PETSC_POSSIBLE_CONF_FILES})
1114+ if(EXISTS ${FILE})
1115+ # old-style PETSc installations (using PETSC_DIR and PETSC_ARCH)
1116+ message(STATUS "Using PETSc dir: ${ENV_PETSC_DIR}")
1117+ message(STATUS "Using PETSc arch: ${ENV_PETSC_ARCH}")
1118+ # find includes by parsing the petscvariables file
1119+ file(STRINGS ${FILE} PETSC_VARIABLES NEWLINE_CONSUME)
1120+ endif()
1121+ endforeach()
1122+ if(PETSC_VARIABLES)
1123+ # try to find PETSC_CC_INCLUDES for PETSc >= 3.4
1124+ string(REGEX MATCH "PETSC_CC_INCLUDES = [^\n\r]*" PETSC_PACKAGES_INCLUDES
1125+ ${PETSC_VARIABLES})
1126+ if(PETSC_PACKAGES_INCLUDES)
1127+ string(REPLACE "PETSC_CC_INCLUDES = " "" PETSC_PACKAGES_INCLUDES
1128+ ${PETSC_PACKAGES_INCLUDES})
1129+ else()
1130+ # try to find PETSC_PACKAGES_INCLUDES in older versions
1131+ list(APPEND EXTERNAL_INCLUDES ${ENV_PETSC_DIR}/include)
1132+ list(APPEND EXTERNAL_INCLUDES ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/include)
1133+ string(REGEX MATCH "PACKAGES_INCLUDES = [^\n\r]*" PETSC_PACKAGES_INCLUDES
1134+ ${PETSC_VARIABLES})
1135+ string(REPLACE "PACKAGES_INCLUDES = " "" PETSC_PACKAGES_INCLUDES
1136+ ${PETSC_PACKAGES_INCLUDES})
1137+ endif()
1138+ if(PETSC_PACKAGES_INCLUDES)
1139+ if(PETSC_PACKAGES_INCLUDES)
1140+ string(REPLACE "-I" "" PETSC_PACKAGES_INCLUDES ${PETSC_PACKAGES_INCLUDES})
1141+ string(REPLACE " " ";" PETSC_PACKAGES_INCLUDES ${PETSC_PACKAGES_INCLUDES})
1142+ foreach(VAR ${PETSC_PACKAGES_INCLUDES})
1143+ # seem to include unexisting directories (/usr/include/lib64)
1144+ # check to avoid warnings
1145+ if(EXISTS ${VAR})
1146+ list(APPEND EXTERNAL_INCLUDES ${VAR})
1147+ endif()
1148+ endforeach()
1149+ endif()
1150+ endif()
1151+ # find libraries (<= 3.0)
1152+ set(PETSC_LIBS_REQUIRED petscksp petscdm petscmat petscvec petsc)
1153+ find_all_libraries(PETSC_LIBS PETSC_LIBS_REQUIRED
1154+ ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib "")
1155+ # petsc 3.1 creates only one library (libpetsc)
1156+ if(NOT PETSC_LIBS)
1157+ find_library(PETSC_LIBS petsc PATHS ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib
1158+ NO_DEFAULT_PATH)
1159+ endif()
1160+ if(PETSC_LIBS)
1161+ set_config_option(HAVE_PETSC "PETSc")
1162+ if(NOT HAVE_BLAS)
1163+ set_config_option(HAVE_BLAS "Blas[petsc]")
1164+ endif()
1165+ if(NOT HAVE_LAPACK)
1166+ set_config_option(HAVE_LAPACK "Lapack[petsc]")
1167+ endif()
1168+ endif()
1169+ # find slepc (needs to be linked in before petsc)
1170+ if(ENABLE_SLEPC)
1171+ if(SLEPC_DIR)
1172+ set(ENV_SLEPC_DIR ${SLEPC_DIR})
1173+ else()
1174+ set(ENV_SLEPC_DIR $ENV{SLEPC_DIR})
1175+ endif()
1176+ find_library(SLEPC_LIB slepc PATHS ${ENV_SLEPC_DIR}/${ENV_PETSC_ARCH}/lib
1177+ NO_DEFAULT_PATH)
1178+ if(SLEPC_LIB)
1179+ find_path(SLEPC_INC "slepc.h" PATHS ${ENV_SLEPC_DIR} PATH_SUFFIXES include
1180+ ${ENV_PETSC_ARCH}/include include/slepc NO_DEFAULT_PATH)
1181+ if(SLEPC_INC)
1182+ message(STATUS "Using SLEPc dir: ${ENV_SLEPC_DIR}")
1183+ set_config_option(HAVE_SLEPC "SLEPc")
1184+ list(APPEND EXTERNAL_LIBRARIES ${SLEPC_LIB})
1185+ list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC})
1186+ find_path(SLEPC_INC2 "slepcconf.h" PATHS ${ENV_SLEPC_DIR}
1187+ PATH_SUFFIXES ${ENV_PETSC_ARCH}/include NO_DEFAULT_PATH)
1188+ if(SLEPC_INC2)
1189+ list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC2})
1190+ endif()
1191+ endif()
1192+ endif()
1193+ endif()
1194+ list(APPEND EXTERNAL_LIBRARIES ${PETSC_LIBS})
1195+ # find additional libraries to link with
1196+ string(REGEX MATCH "PACKAGES_LIBS = [^\n\r]*" PLIBS ${PETSC_VARIABLES})
1197+ if(PLIBS)
1198+ string(REPLACE "PACKAGES_LIBS = " "" PLIBS ${PLIBS})
1199+ string(STRIP ${PLIBS} PLIBS)
1200+ list(APPEND EXTERNAL_LIBRARIES "${PLIBS}")
1201+ endif()
1202+ string(REGEX MATCH "PETSC_EXTERNAL_LIB_BASIC = [^\n\r]*" PLIBS_BASIC ${PETSC_VARIABLES})
1203+ if(PLIBS_BASIC)
1204+ string(REPLACE "PETSC_EXTERNAL_LIB_BASIC = " "" PLIBS_BASIC ${PLIBS_BASIC})
1205+ string(STRIP ${PLIBS_BASIC} PLIBS_BASIC)
1206+ separate_arguments(PLIBS_BASIC)
1207+ list(APPEND EXTERNAL_LIBRARIES "${PLIBS_BASIC}")
1208+ endif()
1209+ string(REGEX MATCH "PCC_LINKER_LIBS = [^\n\r]*" LLIBS ${PETSC_VARIABLES})
1210+ if(LLIBS)
1211+ string(REPLACE "PCC_LINKER_LIBS = " "" LLIBS ${LLIBS})
1212+ string(STRIP ${LLIBS} LLIBS)
1213+ list(APPEND EXTERNAL_LIBRARIES "${LLIBS}")
1214+ endif()
1215+ else()
1216+ # new-style PETSc installations (in standard system directories)
1217+ find_library(PETSC_LIBS petsc)
1218+ find_path(PETSC_INC "petsc.h" PATH_SUFFIXES include/petsc)
1219+ if(PETSC_LIBS AND PETSC_INC)
1220+ set_config_option(HAVE_PETSC "PETSc")
1221+ if(ENABLE_SLEPC)
1222+ find_library(SLEPC_LIB slepc)
1223+ find_path(SLEPC_INC "slepc.h" PATH_SUFFIXES include/slepc)
1224+ if(SLEPC_LIB AND SLEPC_INC)
1225+ set_config_option(HAVE_SLEPC "SLEPc")
1226+ list(APPEND EXTERNAL_LIBRARIES ${SLEPC_LIB})
1227+ list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC})
1228+ endif()
1229+ endif()
1230+ list(APPEND EXTERNAL_LIBRARIES ${PETSC_LIBS})
1231+ list(APPEND EXTERNAL_INCLUDES ${PETSC_INC})
1232+ endif()
1233+ endif()
1234+ endif()
1235+
1236+ if(ENABLE_MUMPS AND HAVE_BLAS AND HAVE_LAPACK)
1237+ set(MUMPS_LIBS_REQUIRED smumps dmumps cmumps zmumps mumps_common pord)
1238+ if(NOT ENABLE_MPI)
1239+ list(APPEND MUMPS_LIBS_REQUIRED mpiseq)
1240+ endif()
1241+ find_all_libraries(MUMPS_LIBRARIES MUMPS_LIBS_REQUIRED "" "lib")
1242+ find_path(SMUMPS_INC "smumps_c.h" PATH_SUFFIXES src include)
1243+ find_path(DMUMPS_INC "dmumps_c.h" PATH_SUFFIXES src include)
1244+ find_path(CMUMPS_INC "cmumps_c.h" PATH_SUFFIXES src include)
1245+ find_path(ZMUMPS_INC "zmumps_c.h" PATH_SUFFIXES src include)
1246+ if(MUMPS_LIBRARIES AND SMUMPS_INC AND DMUMPS_INC AND CMUMPS_INC AND ZMUMPS_INC)
1247+ set_config_option(HAVE_MUMPS "MUMPS")
1248+ list(APPEND EXTERNAL_LIBRARIES ${MUMPS_LIBRARIES})
1249+ list(APPEND EXTERNAL_INCLUDES ${SMUMPS_INC})
1250+ list(APPEND EXTERNAL_INCLUDES ${DMUMPS_INC})
1251+ list(APPEND EXTERNAL_INCLUDES ${CMUMPS_INC})
1252+ list(APPEND EXTERNAL_INCLUDES ${ZMUMPS_INC})
1253+ find_library(GFORTRAN_LIB gfortran)
1254+ if(GFORTRAN_LIB)
1255+ list(APPEND EXTERNAL_LIBRARIES ${GFORTRAN_LIB})
1256+ endif()
1257+ if(ENABLE_GMM) # use GMM/MUMPS interface
1258+ add_definitions(-DGMM_USES_MUMPS)
1259+ endif()
1260+ endif()
1261+ endif()
1262+
1263+ if(ENABLE_GETDP)
1264+ find_library(GETDP_LIB GetDP)
1265+ find_path(GETDP_INC "GetDP.h" PATH_SUFFIXES getdp)
1266+ if(GETDP_LIB AND GETDP_INC)
1267+ set_config_option(HAVE_GETDP "GetDP")
1268+ list(APPEND EXTERNAL_LIBRARIES ${GETDP_LIB})
1269+ list(APPEND EXTERNAL_INCLUDES ${GETDP_INC})
1270+ endif()
1271+ endif()
1272+endif()
1273+
1274+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt AND ENABLE_HXT)
1275+ add_subdirectory(contrib/hxt)
1276+ include_directories(BEFORE ${HXT_INC_DIRS})
1277+ set_config_option(HAVE_HXT "Hxt")
1278+ # do not use arithmetic contraction in predicates.c
1279+ if(MSVC OR (CMAKE_C_COMPILER_ID STREQUAL "Intel" AND WIN32))
1280+ set_source_files_properties(
1281+ "${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt/predicates/src/predicates.c"
1282+ PROPERTIES COMPILE_FLAGS "/fp:strict")
1283+ elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel")
1284+ set_source_files_properties(
1285+ "${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt/predicates/src/predicates.c"
1286+ PROPERTIES COMPILE_FLAGS "-fp-model strict")
1287+ elseif(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
1288+ set_source_files_properties(
1289+ "${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt/predicates/src/predicates.c"
1290+ PROPERTIES COMPILE_FLAGS "-fno-unsafe-math-optimizations -ffp-contract=off")
1291+ else()
1292+ message(WARNING
1293+ "Unsupported compiler !
1294+ Make sure compiled functions from predicates.c
1295+ do NOT use extended double precision and follow IEEE754 standard.
1296+ It is crucial for the robustness of geometric predicates.")
1297+ endif()
1298+endif()
1299+
1300+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/pro AND ENABLE_PRO)
1301+ add_subdirectory(pro)
1302+endif()
1303+
1304+if(ENABLE_OCC)
1305+ set(OCC_MINIMAL_VERSION "6.9.1")
1306+ if(WIN32)
1307+ if(HAVE_64BIT_SIZE_T)
1308+ set(OCC_SYS_NAME win64)
1309+ else()
1310+ set(OCC_SYS_NAME win32)
1311+ endif()
1312+ else()
1313+ set(OCC_SYS_NAME ${CMAKE_SYSTEM_NAME})
1314+ endif()
1315+ find_path(OCC_INC "Standard_Version.hxx" HINTS ENV CASROOT PATH_SUFFIXES
1316+ inc include include/oce opencascade include/opencascade
1317+ occt include/occt)
1318+ if(OCC_INC)
1319+ file(STRINGS ${OCC_INC}/Standard_Version.hxx
1320+ OCC_MAJOR REGEX "#define OCC_VERSION_MAJOR.*")
1321+ file(STRINGS ${OCC_INC}/Standard_Version.hxx
1322+ OCC_MINOR REGEX "#define OCC_VERSION_MINOR.*")
1323+ file(STRINGS ${OCC_INC}/Standard_Version.hxx
1324+ OCC_MAINT REGEX "#define OCC_VERSION_MAINTENANCE.*")
1325+ if(OCC_MAJOR AND OCC_MINOR AND OCC_MAINT)
1326+ string(REGEX MATCH "[0-9]+" OCC_MAJOR "${OCC_MAJOR}")
1327+ string(REGEX MATCH "[0-9]+" OCC_MINOR "${OCC_MINOR}")
1328+ string(REGEX MATCH "[0-9]+" OCC_MAINT "${OCC_MAINT}")
1329+ set(OCC_VERSION "${OCC_MAJOR}.${OCC_MINOR}.${OCC_MAINT}")
1330+ message(STATUS "Found OpenCASCADE version ${OCC_VERSION} in ${OCC_INC}")
1331+ endif()
1332+ endif()
1333+ if(OCC_VERSION AND OCC_VERSION STRLESS ${OCC_MINIMAL_VERSION})
1334+ message(WARNING "Gmsh requires OpenCASCADE >= ${OCC_MINIMAL_VERSION}. "
1335+ "Use CMAKE_PREFIX_PATH or the CASROOT environment variable "
1336+ "to explicitely specify the installation path of OpenCASCADE")
1337+ elseif(OCC_INC)
1338+ set(OCC_LIBS_REQUIRED
1339+ # subset of DataExchange
1340+ TKSTEP TKSTEP209 TKSTEPAttr TKSTEPBase TKIGES TKXSBase
1341+ # ModelingAlgorithms
1342+ TKOffset TKFeat TKFillet TKBool TKMesh TKHLR TKBO TKPrim TKShHealing
1343+ TKTopAlgo TKGeomAlgo
1344+ # ModelingData
1345+ TKBRep TKGeomBase TKG3d TKG2d
1346+ # FoundationClasses
1347+ TKMath TKernel)
1348+ if(ENABLE_OCC_TBB)
1349+ list(APPEND OCC_LIBS_REQUIRED tbb tbbmalloc)
1350+ endif()
1351+ list(LENGTH OCC_LIBS_REQUIRED NUM_OCC_LIBS_REQUIRED)
1352+ if(OCC_LIBS)
1353+ message(STATUS "OCC libraries specified explicitly: " ${OCC_LIBS})
1354+ list(LENGTH OCC_LIBS_REQUIRED NUM_OCC_LIBS)
1355+ else()
1356+ set(OCC_LIBS)
1357+ foreach(OCC ${OCC_LIBS_REQUIRED})
1358+ find_library(OCC_LIB ${OCC} HINTS ENV CASROOT PATH_SUFFIXES
1359+ lib ${OCC_SYS_NAME}/lib ${OCC_SYS_NAME}/vc8/lib
1360+ ${OCC_SYS_NAME}/gcc/lib ${OCC_SYS_NAME}/gcc/bin)
1361+ if(OCC_LIB)
1362+ list(APPEND OCC_LIBS ${OCC_LIB})
1363+ else()
1364+ message(STATUS "OCC lib " ${OCC} " not Found")
1365+ endif()
1366+ unset(OCC_LIB CACHE)
1367+ endforeach()
1368+ list(LENGTH OCC_LIBS NUM_OCC_LIBS)
1369+ endif()
1370+ endif()
1371+
1372+ # additional OCC libraries to handle reading of STEP/IGES attributes. Oh my...
1373+ if(ENABLE_OCC_CAF)
1374+ find_package(Freetype)
1375+ if(FREETYPE_FOUND)
1376+ set(OCC_CAF_LIBS_REQUIRED
1377+ TKXDESTEP TKXDEIGES TKXCAF TKLCAF TKVCAF TKCAF TKV3d TKService TKCDF)
1378+ list(LENGTH OCC_CAF_LIBS_REQUIRED NUM_OCC_CAF_LIBS_REQUIRED)
1379+ set(OCC_CAF_LIBS)
1380+ foreach(OCC ${OCC_CAF_LIBS_REQUIRED})
1381+ find_library(OCC_CAF_LIB ${OCC} HINTS ENV CASROOT PATH_SUFFIXES
1382+ lib ${OCC_SYS_NAME}/lib ${OCC_SYS_NAME}/vc8/lib
1383+ ${OCC_SYS_NAME}/gcc/lib ${OCC_SYS_NAME}/gcc/bin)
1384+ if(OCC_CAF_LIB)
1385+ list(APPEND OCC_CAF_LIBS ${OCC_CAF_LIB})
1386+ else()
1387+ message(STATUS "OCC CAF lib " ${OCC} " not Found")
1388+ endif()
1389+ unset(OCC_CAF_LIB CACHE)
1390+ endforeach()
1391+ list(LENGTH OCC_CAF_LIBS NUM_OCC_CAF_LIBS)
1392+ endif()
1393+ endif()
1394+
1395+ if(NUM_OCC_LIBS EQUAL NUM_OCC_LIBS_REQUIRED)
1396+ # append OCC CAF libraries first...
1397+ if(NUM_OCC_CAF_LIBS EQUAL NUM_OCC_CAF_LIBS_REQUIRED)
1398+ set_config_option(HAVE_OCC_CAF "OpenCASCADE-CAF")
1399+ list(APPEND EXTERNAL_LIBRARIES ${OCC_CAF_LIBS} ${FREETYPE_LIBRARIES})
1400+ list(APPEND EXTERNAL_INCLUDES ${FREETYPE_INCLUDE_DIRS})
1401+ if(WIN32)
1402+ list(APPEND EXTERNAL_LIBRARIES "windowscodecs")
1403+ list(APPEND EXTERNAL_LIBRARIES "ole32")
1404+ endif()
1405+ endif()
1406+ # then append OCC libraries
1407+ set_config_option(HAVE_OCC "OpenCASCADE")
1408+ list(APPEND EXTERNAL_LIBRARIES ${OCC_LIBS})
1409+ list(APPEND EXTERNAL_INCLUDES ${OCC_INC})
1410+ if(HAVE_64BIT_SIZE_T)
1411+ add_definitions(-D_OCC64)
1412+ endif()
1413+ if(WIN32)
1414+ list(APPEND EXTERNAL_LIBRARIES "winspool")
1415+ add_definitions(-DOCC_CONVERT_SIGNALS)
1416+ elseif(MSVC)
1417+ add_definitions(-DWNT)
1418+ endif()
1419+ endif()
1420+endif()
1421+
1422+if(ENABLE_ZIPPER)
1423+ if(ENABLE_BUILD_IOS)
1424+ set_config_option(HAVE_LIBZ "Zlib")
1425+ endif()
1426+ if(NOT HAVE_LIBZ) # necessary for non-GUI builds
1427+ find_package(ZLIB)
1428+ if(ZLIB_FOUND)
1429+ set_config_option(HAVE_LIBZ "Zlib")
1430+ list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
1431+ list(APPEND EXTERNAL_INCLUDES ${ZLIB_INCLUDE_DIR})
1432+ endif()
1433+ endif()
1434+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/zipper AND HAVE_LIBZ)
1435+ add_subdirectory(contrib/zipper)
1436+ include_directories(contrib/zipper)
1437+ set_config_option(HAVE_ZIPPER "Zipper")
1438+ endif()
1439+endif()
1440+
1441+if(ENABLE_PRIVATE_API AND ENABLE_WRAP_PYTHON)
1442+ find_package(SWIG REQUIRED)
1443+ include(${SWIG_USE_FILE})
1444+ find_package(PythonLibs)
1445+ if(SWIG_FOUND AND PYTHONLIBS_FOUND)
1446+ message(STATUS "Found SWIG version " ${SWIG_VERSION})
1447+ find_package(PythonInterp)
1448+ string(SUBSTRING ${SWIG_VERSION} 0 1 SWIG_MAJOR_VERSION)
1449+ if(SWIG_MAJOR_VERSION EQUAL 1)
1450+ message(WARNING "Python bindings require SWIG >= 2: disabling Python")
1451+ else()
1452+ set_config_option(HAVE_PYTHON "Python")
1453+ mark_as_advanced(CLEAR PYTHON_LIBRARY PYTHON_INCLUDE_DIR)
1454+ if(ENABLE_NUMPY)
1455+ if (NOT NUMPY_INC)
1456+ EXEC_PROGRAM (${PYTHON_EXECUTABLE}
1457+ ARGS "-c \"import numpy; print(numpy.get_include())\""
1458+ OUTPUT_VARIABLE NUMPY_INC
1459+ RETURN_VALUE NUMPY_NOT_FOUND)
1460+ endif()
1461+ if(NUMPY_INC)
1462+ list(APPEND EXTERNAL_INCLUDES ${NUMPY_INC})
1463+ set_config_option(HAVE_NUMPY "Numpy")
1464+ endif()
1465+ endif()
1466+ if(HAVE_PETSC)
1467+ if(ENABLE_PETSC4PY)
1468+ EXECUTE_PROCESS(
1469+ COMMAND ${PYTHON_EXECUTABLE} -c "import petsc4py; print(petsc4py.get_include())"
1470+ OUTPUT_VARIABLE PETSC4PY_INC
1471+ RESULT_VARIABLE PETSC4PY_NOT_FOUND
1472+ ERROR_QUIET
1473+ OUTPUT_STRIP_TRAILING_WHITESPACE)
1474+ if(PETSC4PY_INC)
1475+ list(APPEND EXTERNAL_INCLUDES ${PETSC4PY_INC})
1476+ set_config_option(HAVE_PETSC4PY "PETSc4py")
1477+ endif()
1478+ endif()
1479+ endif()
1480+ endif()
1481+ endif()
1482+endif()
1483+
1484+check_function_exists(vsnprintf HAVE_VSNPRINTF)
1485+if(NOT HAVE_VSNPRINTF AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
1486+ set_config_option(HAVE_NO_VSNPRINTF "NoVsnprintf")
1487+endif()
1488+
1489+check_include_file(sys/socket.h HAVE_SYS_SOCKET_H)
1490+if(HAVE_SYS_SOCKET_H)
1491+ set(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h)
1492+endif()
1493+check_type_size(socklen_t SOCKLEN_T_SIZE)
1494+set(CMAKE_EXTRA_INCLUDE_FILES)
1495+if(NOT SOCKLEN_T_SIZE AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
1496+ set_config_option(HAVE_NO_SOCKLEN_T "NoSocklenT")
1497+endif()
1498+
1499+check_include_file(stdint.h HAVE_STDINT_H)
1500+if(HAVE_STDINT_H)
1501+ set(CMAKE_EXTRA_INCLUDE_FILES stdint.h)
1502+else()
1503+ set_config_option(HAVE_NO_STDINT_H "NoStdintH")
1504+endif()
1505+check_type_size(intptr_t INTPTR_T_SIZE)
1506+set(CMAKE_EXTRA_INCLUDE_FILES)
1507+if(NOT INTPTR_T_SIZE AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
1508+ set_config_option(HAVE_NO_INTPTR_T "NoIntptrT")
1509+endif()
1510+
1511+check_include_file(dlfcn.h DLFCN_H)
1512+if(DLFCN_H)
1513+ set_config_option(HAVE_DLOPEN "Dlopen")
1514+ list(APPEND EXTERNAL_LIBRARIES ${CMAKE_DL_LIBS})
1515+endif()
1516+
1517+if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
1518+ check_include_file(linux/joystick.h LINUX_JOYSTICK_H)
1519+ if(LINUX_JOYSTICK_H)
1520+ set_config_option(HAVE_LINUX_JOYSTICK "LinuxJoystick")
1521+ endif()
1522+endif()
1523+
1524+if(WIN32)
1525+ add_definitions(-D_USE_MATH_DEFINES)
1526+ list(APPEND EXTERNAL_LIBRARIES winmm wsock32 ws2_32 psapi)
1527+endif()
1528+
1529+if(MSVC)
1530+ add_definitions(-DNOMINMAX -D_CRT_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_DEPRECATE)
1531+endif()
1532+
1533+# add C functions API
1534+set(GMSH_SRC ${GMSH_SRC};api/gmshc.cpp)
1535+
1536+# force full warnings to encourage everybody to write clean(er) code
1537+check_cxx_compiler_flag("-Wall" WALL)
1538+if(WALL AND NOT MSVC)
1539+ file(GLOB_RECURSE WALL_SRC Common/*.cpp Fltk/*.cpp FunctionSpace/*.cpp
1540+ Geo/*.cpp Graphics/*.cpp Mesh/*.cpp Numeric/*.cpp Parser/*.cpp
1541+ Plugin/*.cpp Post/*.cpp Solver/*.cpp)
1542+ set(WF "-Wall")
1543+ check_cxx_compiler_flag("-Wint-to-void-pointer-cast" WCAST)
1544+ if(WCAST)
1545+ set(WF "${WF} -Wno-int-to-void-pointer-cast")
1546+ endif()
1547+ check_cxx_compiler_flag("-Wdeprecated-declarations" WDEPREC)
1548+ if(WDEPREC)
1549+ # FIXME: remove this when we have fixed the deprecated GLU code for OpenGL3
1550+ set(WF "${WF} -Wno-deprecated-declarations")
1551+ endif()
1552+ check_cxx_compiler_flag("-Wmisleading-indentation" WIND)
1553+ if(WIND)
1554+ set(WF "${WF} -Wno-misleading-indentation")
1555+ endif()
1556+ check_cxx_compiler_flag("-Wno-attributes" WATTR)
1557+ if(WATTR)
1558+ # FIXME: remove this when GCC behaves more intelligently
1559+ set(WF "${WF} -Wno-attributes")
1560+ endif()
1561+ set_compile_flags(WALL_SRC ${WF})
1562+endif()
1563+
1564+# don't issue warnings for contributed libraries
1565+check_cxx_compiler_flag("-w" NOWARN)
1566+if(NOWARN)
1567+ file(GLOB_RECURSE NOWARN_SRC contrib/*.cpp contrib/*.cc contrib/*.cxx contrib/*.c)
1568+ set_compile_flags(NOWARN_SRC "-w")
1569+endif()
1570+
1571+# disable compile optimization on some known problematic files
1572+check_cxx_compiler_flag("-O0" NOOPT)
1573+if(NOOPT OR ENABLE_BUILD_IOS)
1574+ if(ENABLE_BUILD_IOS) # optimized iOS 10 64 bits screws somewhere in Geo
1575+ file(GLOB_RECURSE NOOPT_SRC Numeric/robustPredicates.cpp Geo/G*.cpp Mesh/BDS.cpp
1576+ Parser/Gmsh.tab.cpp contrib/blossom/* Mesh/Background*)
1577+ else()
1578+ file(GLOB_RECURSE NOOPT_SRC Numeric/robustPredicates.cpp Mesh/BDS.cpp
1579+ Parser/Gmsh.tab.cpp contrib/blossom/* contrib/bamg/* Mesh/Background*)
1580+ endif()
1581+ set_compile_flags(NOOPT_SRC "-O0")
1582+endif()
1583+
1584+# do not use arithmetic contraction in predicates.cpp
1585+# if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
1586+# set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
1587+# COMPILE_FLAGS "/fp:strict")
1588+# elseif(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
1589+# set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
1590+# COMPILE_FLAGS "-fno-unsafe-math-optimizations -ffp-contract=off")
1591+# elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel")
1592+# set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
1593+# COMPILE_FLAGS "-fp-model strict")
1594+# endif()
1595+
1596+# enable Revoropt and set compile flags for the corresponding plugin
1597+if(ENABLE_REVOROPT)
1598+ if(HAVE_EIGEN AND HAVE_MESH AND HAVE_PLUGINS AND HAVE_ANN AND HAVE_ALGLIB)
1599+ list(APPEND EXTERNAL_INCLUDES contrib/Revoropt/include)
1600+ set_config_option(HAVE_REVOROPT "Revoropt")
1601+ add_definitions(-DUSE_ANN)
1602+ else()
1603+ message(WARNING "Revoropt requires Eigen, Mesh, Plugins, ANN and ALGLIB")
1604+ endif()
1605+endif()
1606+
1607+if(HAVE_MESH AND NOT HAVE_EIGEN AND NOT HAVE_LAPACK)
1608+ message(WARNING "Most meshing algorithms will not be functional without "
1609+ "Eigen or Lapack")
1610+endif()
1611+
1612+list(SORT CONFIG_OPTIONS)
1613+set(GMSH_CONFIG_OPTIONS "")
1614+foreach(OPT ${CONFIG_OPTIONS})
1615+ set(GMSH_CONFIG_OPTIONS "${GMSH_CONFIG_OPTIONS} ${OPT}")
1616+endforeach()
1617+
1618+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Common/GmshConfig.h.in
1619+ ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshConfig.h)
1620+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Common/GmshVersion.h.in
1621+ ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshVersion.h)
1622+
1623+# the texi and pypi version files are modified in the source directory (not
1624+# ideal for version.texi, but since git tracks the contents of the file this is
1625+# acceptable as it will only change when the actual version is changed - not for
1626+# each git hash; setup.py is not under version control)
1627+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo/version.texi.in
1628+ ${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo/version.texi)
1629+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/utils/pypi/gmsh/setup.py.in
1630+ ${CMAKE_CURRENT_SOURCE_DIR}/utils/pypi/gmsh/setup.py)
1631+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/utils/pypi/gmsh-dev/setup.py.in
1632+ ${CMAKE_CURRENT_SOURCE_DIR}/utils/pypi/gmsh-dev/setup.py)
1633+
1634+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/version.txt ${GMSH_SHORT_VERSION})
1635+
1636+# process cmake environment variables so we can append them to the -I include
1637+# commands. This is not recommended (we should only use the cache variables) but
1638+# it is very convenient: otherwise we have to remember providing the
1639+# -D... options to cmake for each new build.
1640+set(ENV_CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH})
1641+set(ENV_CMAKE_INCLUDE_PATH $ENV{CMAKE_INCLUDE_PATH})
1642+if(UNIX)
1643+ if(ENV_CMAKE_PREFIX_PATH)
1644+ string(REPLACE ":" ";" ENV_CMAKE_PREFIX_PATH ${ENV_CMAKE_PREFIX_PATH})
1645+ endif()
1646+ if(ENV_CMAKE_INCLUDE_PATH)
1647+ string(REPLACE ":" ";" ENV_CMAKE_INCLUDE_PATH ${ENV_CMAKE_INCLUDE_PATH})
1648+ endif()
1649+endif()
1650+list(APPEND EXTERNAL_INCLUDES ${CMAKE_INCLUDE_PATH} ${ENV_CMAKE_INCLUDE_PATH})
1651+list(APPEND EXTERNAL_INCLUDES ${CMAKE_PREFIX_PATH} ${ENV_CMAKE_PREFIX_PATH})
1652+foreach(DIR ${CMAKE_PREFIX_PATH} ${ENV_CMAKE_PREFIX_PATH})
1653+ list(APPEND EXTERNAL_INCLUDES ${DIR}/include)
1654+endforeach()
1655+
1656+if(EXTERNAL_INCLUDES)
1657+ list(REMOVE_DUPLICATES EXTERNAL_INCLUDES)
1658+endif()
1659+
1660+if(HAVE_FLTK)
1661+ set(LINK_LIBRARIES ${FLTK_LIBRARIES} ${EXTERNAL_LIBRARIES}
1662+ ${OPENGL_LIBRARIES} ${LAPACK_LIBRARIES})
1663+elseif(HAVE_OPENGL)
1664+ set(LINK_LIBRARIES ${EXTERNAL_LIBRARIES} ${OPENGL_LIBRARIES}
1665+ ${LAPACK_LIBRARIES})
1666+else()
1667+ set(LINK_LIBRARIES ${EXTERNAL_LIBRARIES} ${LAPACK_LIBRARIES})
1668+endif()
1669+
1670+# try to use static gfortran on static builds (cannot do this on dynamic builds
1671+# as e.g. Debian compiles libgfortran.a without -fPIC: sigh...)
1672+if(NOT ENABLE_BUILD_DYNAMIC AND NOT ENABLE_BUILD_SHARED)
1673+ find_library(GFORTRAN_STATIC libgfortran.a)
1674+ if(GFORTRAN_STATIC)
1675+ set(CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES)
1676+ message(STATUS "Using static libgfortran")
1677+ foreach(STR ${LINK_LIBRARIES})
1678+ string(REPLACE "-lgfortran" ${GFORTRAN_STATIC} STR2 ${STR})
1679+ list(APPEND LINK_LIBRARIES2 ${STR2})
1680+ endforeach()
1681+ set(LINK_LIBRARIES ${LINK_LIBRARIES2})
1682+ endif()
1683+endif()
1684+
1685+# Linux-specific linker options
1686+if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
1687+ if(HAVE_OCC)
1688+ find_library(RT_LIB rt)
1689+ if(RT_LIB)
1690+ list(APPEND LINK_LIBRARIES ${RT_LIB})
1691+ endif()
1692+ endif()
1693+ if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Intel")
1694+ add_definitions(-fPIC)
1695+ endif()
1696+endif()
1697+
1698+# we could specify include dirs more selectively, but this is simpler
1699+include_directories(Common Fltk Geo Graphics Mesh Solver Numeric Parser
1700+ Plugin Post api ${EXTERNAL_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR}/Common)
1701+
1702+# set this for external codes that might include this CMakeList file
1703+set(GMSH_EXTERNAL_INCLUDE_DIRS ${EXTERNAL_INCLUDES} CACHE
1704+ STRING "External include directories" FORCE)
1705+set(GMSH_EXTERNAL_LIBRARIES ${LINK_LIBRARIES} CACHE
1706+ STRING "External libraries" FORCE)
1707+
1708+# group sources for easier navigation in IDEs
1709+foreach(DIR ${GMSH_DIRS})
1710+ string(REGEX REPLACE "\\+" "\\\\+" DIR ${DIR})
1711+ source_group(${DIR} REGULAR_EXPRESSION ${DIR}/.*)
1712+endforeach()
1713+
1714+# static library target
1715+if(ENABLE_BUILD_LIB)
1716+ add_library(lib STATIC ${GMSH_SRC})
1717+ set_target_properties(lib PROPERTIES OUTPUT_NAME gmsh)
1718+ if(MSVC)
1719+ set_target_properties(lib PROPERTIES DEBUG_POSTFIX d)
1720+ if(ENABLE_MSVC_STATIC_RUNTIME)
1721+ set_target_properties(lib PROPERTIES LINK_FLAGS_RELEASE "/nodefaultlib:LIBCMT")
1722+ endif()
1723+ endif()
1724+endif()
1725+
1726+# shared library target
1727+if(ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
1728+ add_library(shared SHARED ${GMSH_SRC})
1729+ set_target_properties(shared PROPERTIES OUTPUT_NAME gmsh
1730+ VERSION ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}.${GMSH_PATCH_VERSION}
1731+ SOVERSION ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION})
1732+ if(WIN32)
1733+ set_target_properties(shared PROPERTIES PREFIX "" IMPORT_PREFIX ""
1734+ IMPORT_SUFFIX ".lib" COMPILE_FLAGS "-DGMSH_DLL -DGMSH_DLL_EXPORT")
1735+ endif()
1736+ target_link_libraries(shared ${LINK_LIBRARIES})
1737+ # don't define LC_RPATH in dylib for development, to not get endless warnings
1738+ # about code signing
1739+ if(APPLE AND NOT GMSH_RELEASE)
1740+ set_target_properties(shared PROPERTIES INSTALL_RPATH "")
1741+ endif()
1742+ if(MSVC AND ENABLE_MSVC_STATIC_RUNTIME)
1743+ message(STATUS "Note: By enabling ENABLE_MSVC_STATIC_RUNTIME, shared library "
1744+ "won't link. In MSVC change /MT to /MD in the shared project properties")
1745+ endif()
1746+endif()
1747+
1748+# binary targets
1749+if(HAVE_FLTK)
1750+ if(ENABLE_BUILD_DYNAMIC)
1751+ add_executable(gmsh WIN32 Common/Main.cpp)
1752+ target_link_libraries(gmsh shared)
1753+ else()
1754+ add_executable(gmsh WIN32 Common/Main.cpp ${GMSH_SRC})
1755+ endif()
1756+ # we could add this to create a minimal app bundle even without install
1757+ # if(APPLE AND NOT ENABLE_OS_SPECIFIC_INSTALL)
1758+ # set_target_properties(gmsh PROPERTIES MACOSX_BUNDLE ON
1759+ # MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_dev.plist)
1760+ # endif()
1761+else()
1762+ if(ENABLE_BUILD_DYNAMIC)
1763+ add_executable(gmsh Common/Main.cpp)
1764+ target_link_libraries(gmsh shared)
1765+ else()
1766+ add_executable(gmsh Common/Main.cpp ${GMSH_SRC})
1767+ endif()
1768+endif()
1769+target_link_libraries(gmsh ${LINK_LIBRARIES})
1770+
1771+# Windows specific linker options
1772+if(WIN32 AND NOT MSVC)
1773+ set(FLAGS "-Wl,--stack,16777216 -static -municode")
1774+ if(HAVE_FLTK)
1775+ set(FLAGS "${FLAGS} -mwindows")
1776+ else()
1777+ set(FLAGS "${FLAGS} -mconsole")
1778+ endif()
1779+ if(HAVE_64BIT_SIZE_T)
1780+ set(FLAGS "${FLAGS} \"${CMAKE_CURRENT_SOURCE_DIR}/Fltk/Win64Icon.res\"")
1781+ else()
1782+ set(FLAGS "${FLAGS} \"${CMAKE_CURRENT_SOURCE_DIR}/Fltk/Win32Icon.res\"")
1783+ endif()
1784+ set_target_properties(gmsh PROPERTIES LINK_FLAGS "${FLAGS}")
1785+ if(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
1786+ set_target_properties(shared PROPERTIES LINK_FLAGS -static)
1787+ endif()
1788+ # remove -Wl,-Bdynamic flags
1789+ set(CMAKE_EXE_LINK_DYNAMIC_C_FLAGS)
1790+ set(CMAKE_EXE_LINK_DYNAMIC_CXX_FLAGS)
1791+elseif(MSVC)
1792+ set_target_properties(gmsh PROPERTIES LINK_FLAGS "/STACK:16777216 /SAFESEH:NO")
1793+endif()
1794+
1795+# android target
1796+if(ENABLE_BUILD_ANDROID)
1797+ find_file(CMAKE_TOOLCHAIN_FILE "android.toolchain.cmake")
1798+ if(NOT CMAKE_TOOLCHAIN_FILE)
1799+ message(FATAL_ERROR "Cannot compile Gmsh for android without android-cmake")
1800+ endif()
1801+ add_definitions(-D_GLIBCXX_USE_C99_MATH=1)
1802+ set(CMAKE_BUILD_TYPE Release)
1803+ set(LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_CURRENT_BINARY_DIR})
1804+ set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/libs/)
1805+ add_definitions(-DBUILD_ANDROID)
1806+ add_definitions(-DPICOJSON_USE_LOCALE=0)
1807+ add_library(androidGmsh SHARED ${GMSH_SRC})
1808+ set_target_properties(androidGmsh PROPERTIES OUTPUT_NAME gmsh)
1809+ target_link_libraries(androidGmsh ${EXTERNAL_LIBRARIES} ${LAPACK_LIBRARIES})
1810+ add_custom_command(TARGET androidGmsh POST_BUILD COMMAND
1811+ ${CMAKE_STRIP} ${LIBRARY_OUTPUT_PATH}/libgmsh.so)
1812+endif()
1813+
1814+# parser target
1815+find_program(BISON bison)
1816+find_program(FLEX flex)
1817+if(BISON AND FLEX)
1818+ add_custom_target(parser
1819+ COMMAND ${BISON} -p gmsh_yy --output Gmsh.tab.cpp -d Gmsh.y
1820+ COMMAND ${FLEX} -P gmsh_yy -o Gmsh.yy.cpp Gmsh.l
1821+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Parser)
1822+endif()
1823+
1824+if(UNIX)
1825+ # cannot use cmake's file search functions here (they would only find files
1826+ # existing at configuration time)
1827+ add_custom_target(purge
1828+ COMMAND rm -f `find . -name *~ -o -name *~~`
1829+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
1830+ add_custom_target(etags
1831+ COMMAND etags `find . -name *.cpp -o -name *.h -o -name *.y`
1832+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
1833+endif()
1834+
1835+if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
1836+ CMAKE_CXX_COMPILER_ID MATCHES "Clang")
1837+ execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion
1838+ OUTPUT_VARIABLE CXX_COMPILER_VERSION
1839+ OUTPUT_STRIP_TRAILING_WHITESPACE)
1840+else()
1841+ set(CXX_COMPILER_VERSION "Unknown")
1842+endif()
1843+
1844+set(WELCOME_FILE ${CMAKE_CURRENT_SOURCE_DIR}/doc/WELCOME.txt)
1845+set(SDK_FILE ${CMAKE_CURRENT_SOURCE_DIR}/doc/SDK.txt)
1846+set(LICENSE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt)
1847+set(CREDITS_FILE ${CMAKE_CURRENT_SOURCE_DIR}/CREDITS.txt)
1848+set(CHANGELOG_FILE ${CMAKE_CURRENT_SOURCE_DIR}/CHANGELOG.txt)
1849+file(GLOB TUTORIAL_GEO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/?*.*)
1850+file(GLOB TUTORIAL_CPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/c++/?*.*)
1851+file(GLOB TUTORIAL_C_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/c/?*.*)
1852+file(GLOB TUTORIAL_PY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/python/?*.*)
1853+file(GLOB TUTORIAL_JL_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/julia/?*.*)
1854+file(GLOB DEMOS ${CMAKE_CURRENT_SOURCE_DIR}/demos/*)
1855+foreach(SUBDIR ${DEMOS})
1856+ if(IS_DIRECTORY ${SUBDIR})
1857+ list(APPEND DEMOS_DIRS ${SUBDIR})
1858+ endif()
1859+endforeach()
1860+set(TEX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo)
1861+file(GLOB TEX_SRC ${TEX_DIR}/*.texi)
1862+set(TEX_OBJ ${TEX_DIR}/gmsh.aux ${TEX_DIR}/gmsh.cp ${TEX_DIR}/gmsh.cps
1863+ ${TEX_DIR}/gmsh.fn ${TEX_DIR}/gmsh.html ${TEX_DIR}/gmsh.info ${TEX_DIR}/gmsh.ky
1864+ ${TEX_DIR}/gmsh.log ${TEX_DIR}/gmsh.pdf ${TEX_DIR}/gmsh.pg ${TEX_DIR}/gmsh.toc
1865+ ${TEX_DIR}/gmsh.tp ${TEX_DIR}/gmsh.tps ${TEX_DIR}/gmsh.txt ${TEX_DIR}/gmsh.vr)
1866+
1867+macro(unix2dos VARNAME)
1868+ file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/unix2dos)
1869+ set(UNIX2DOS_FILES)
1870+ foreach(FILE ${${VARNAME}})
1871+ file(READ ${FILE} F0)
1872+ get_filename_component(N ${FILE} NAME)
1873+ if(CYGWIN)
1874+ string(REGEX REPLACE "\n" "\r\n" F1 "${F0}")
1875+ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N} "${F1}")
1876+ else() # if not in Cygwin, cmake adds '\r's automatically
1877+ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N} "${F0}")
1878+ endif()
1879+ list(APPEND UNIX2DOS_FILES ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N})
1880+ endforeach()
1881+ set(${VARNAME} ${UNIX2DOS_FILES})
1882+endmacro()
1883+
1884+if(WIN32)
1885+ if(ENABLE_OS_SPECIFIC_INSTALL)
1886+ set(GMSH_BIN .)
1887+ set(GMSH_LIB .)
1888+ set(GMSH_DOC .)
1889+ set(GMSH_MAN .)
1890+ set(GMSH_INC .)
1891+ else()
1892+ include(GNUInstallDirs)
1893+ set(GMSH_BIN ${CMAKE_INSTALL_BINDIR})
1894+ set(GMSH_LIB ${CMAKE_INSTALL_LIBDIR})
1895+ set(GMSH_DOC ${CMAKE_INSTALL_DOCDIR})
1896+ set(GMSH_MAN ${CMAKE_INSTALL_MANDIR}/man1)
1897+ set(GMSH_INC ${CMAKE_INSTALL_INCLUDEDIR})
1898+ endif()
1899+ if(CYGWIN)
1900+ unix2dos(GMSH_API)
1901+ if(ENABLE_PRIVATE_API)
1902+ unix2dos(GMSH_PRIVATE_API)
1903+ endif()
1904+ unix2dos(WELCOME_FILE)
1905+ unix2dos(SDK_FILE)
1906+ unix2dos(LICENSE_FILE)
1907+ unix2dos(CREDITS_FILE)
1908+ unix2dos(CHANGELOG_FILE)
1909+ unix2dos(TUTORIAL_GEO_FILES)
1910+ unix2dos(TUTORIAL_CPP_FILES)
1911+ unix2dos(TUTORIAL_C_FILES)
1912+ unix2dos(TUTORIAL_PY_FILES)
1913+ unix2dos(TUTORIAL_JL_FILES)
1914+ foreach(DIR ${DEMOS_DIRS})
1915+ file(GLOB DEMO_FILES ${DIR}/?*.*)
1916+ unix2dos(DEMO_FILES)
1917+ endforeach()
1918+ endif()
1919+elseif(APPLE AND ENABLE_OS_SPECIFIC_INSTALL)
1920+ # set these so that the files get installed nicely in the MacOSX
1921+ # .app bundle
1922+ set(GMSH_BIN ../MacOS)
1923+ set(GMSH_LIB ../MacOS)
1924+ set(GMSH_DOC ../../..)
1925+ set(GMSH_MAN ../../..)
1926+ set(GMSH_INC ../MacOS)
1927+else()
1928+ include(GNUInstallDirs)
1929+ set(GMSH_BIN ${CMAKE_INSTALL_BINDIR})
1930+ set(GMSH_LIB ${CMAKE_INSTALL_LIBDIR})
1931+ set(GMSH_DOC ${CMAKE_INSTALL_DOCDIR})
1932+ set(GMSH_MAN ${CMAKE_INSTALL_MANDIR}/man1)
1933+ set(GMSH_INC ${CMAKE_INSTALL_INCLUDEDIR})
1934+endif()
1935+
1936+# mark targets as optional so we can install them separately if needed
1937+# (e.g. "make lib" or "make shared" followed by "make install/fast")
1938+install(TARGETS gmsh DESTINATION ${GMSH_BIN} OPTIONAL)
1939+if(ENABLE_BUILD_LIB)
1940+ install(TARGETS lib DESTINATION ${GMSH_LIB} OPTIONAL)
1941+endif()
1942+if(ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
1943+ install(TARGETS shared DESTINATION ${GMSH_LIB} OPTIONAL)
1944+endif()
1945+
1946+if(ENABLE_ONELAB)
1947+ install(FILES ${ONELAB_PY} DESTINATION ${GMSH_BIN})
1948+endif()
1949+if(ENABLE_BUILD_LIB OR ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
1950+ install(FILES ${GMSH_API} DESTINATION ${GMSH_INC})
1951+ install(FILES ${GMSH_PY} DESTINATION ${GMSH_LIB})
1952+ install(FILES ${GMSH_JL} DESTINATION ${GMSH_LIB})
1953+ if(ENABLE_PRIVATE_API)
1954+ install(FILES ${GMSH_PRIVATE_API} DESTINATION ${GMSH_INC}/gmsh)
1955+ endif()
1956+endif()
1957+if(INSTALL_SDK_README)
1958+ configure_file(${SDK_FILE} ${CMAKE_CURRENT_BINARY_DIR}/README.txt)
1959+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/README.txt DESTINATION .)
1960+endif()
1961+install(FILES ${WELCOME_FILE} DESTINATION ${GMSH_DOC} RENAME README.txt)
1962+install(FILES ${LICENSE_FILE} DESTINATION ${GMSH_DOC})
1963+install(FILES ${CREDITS_FILE} DESTINATION ${GMSH_DOC})
1964+install(FILES ${CHANGELOG_FILE} DESTINATION ${GMSH_DOC})
1965+install(FILES ${TUTORIAL_GEO_FILES} DESTINATION ${GMSH_DOC}/tutorial)
1966+install(FILES ${TUTORIAL_CPP_FILES} DESTINATION ${GMSH_DOC}/tutorial/c++)
1967+install(FILES ${TUTORIAL_C_FILES} DESTINATION ${GMSH_DOC}/tutorial/c)
1968+install(FILES ${TUTORIAL_PY_FILES} DESTINATION ${GMSH_DOC}/tutorial/python)
1969+install(FILES ${TUTORIAL_JL_FILES} DESTINATION ${GMSH_DOC}/tutorial/julia)
1970+foreach(DIR ${DEMOS_DIRS})
1971+ get_filename_component(DEMOS_DIR_NAME ${DIR} NAME)
1972+ file(GLOB DEMO_FILES ${DIR}/?*.*)
1973+ install(FILES ${DEMO_FILES} DESTINATION ${GMSH_DOC}/demos/${DEMOS_DIR_NAME})
1974+endforeach()
1975+if(UNIX AND NOT CYGWIN)
1976+ install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/doc/gmsh.1 DESTINATION ${GMSH_MAN})
1977+endif()
1978+
1979+add_custom_target(get_headers
1980+ COMMAND ${CMAKE_COMMAND} -E make_directory Headers/gmsh
1981+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
1982+foreach(FILE ${GMSH_API})
1983+ add_custom_command(TARGET get_headers POST_BUILD COMMAND ${CMAKE_COMMAND}
1984+ -E copy_if_different ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/Headers/
1985+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
1986+endforeach()
1987+if(ENABLE_PRIVATE_API)
1988+ foreach(FILE ${GMSH_PRIVATE_API})
1989+ add_custom_command(TARGET get_headers POST_BUILD COMMAND ${CMAKE_COMMAND}
1990+ -E copy_if_different ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/Headers/gmsh/
1991+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
1992+ endforeach()
1993+endif()
1994+
1995+find_program(MAKEINFO makeinfo)
1996+if(MAKEINFO)
1997+ add_custom_command(OUTPUT ${TEX_DIR}/gmsh.info DEPENDS ${TEX_SRC}
1998+ COMMAND ${MAKEINFO} --split-size 1000000
1999+ ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
2000+ add_custom_target(info DEPENDS ${TEX_DIR}/gmsh.info)
2001+ add_custom_command(OUTPUT ${TEX_DIR}/gmsh.txt DEPENDS ${TEX_SRC}
2002+ COMMAND ${MAKEINFO} --plaintext -o gmsh.txt
2003+ ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
2004+ add_custom_target(txt DEPENDS ${TEX_DIR}/gmsh.txt)
2005+ add_custom_command(OUTPUT ${TEX_DIR}/gmsh.html DEPENDS ${TEX_SRC}
2006+ COMMAND ${MAKEINFO} --html --css-ref=/gmsh.css
2007+ --no-split --set-customization-variable
2008+ EXTRA_HEAD='<meta name="viewport" content="width=device-width,initial-scale=1.0">'
2009+ ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
2010+ add_custom_target(html DEPENDS ${TEX_DIR}/gmsh.html)
2011+ install(FILES ${TEX_DIR}/gmsh.html DESTINATION ${GMSH_DOC} OPTIONAL)
2012+else()
2013+ add_custom_target(html COMMAND ${CMAKE_COMMAND} -E touch ${TEX_DIR}/gmsh.html)
2014+endif()
2015+
2016+find_program(TEXI2PDF texi2pdf)
2017+if(TEXI2PDF)
2018+ add_custom_command(OUTPUT ${TEX_DIR}/gmsh.pdf DEPENDS ${TEX_SRC}
2019+ COMMAND ${TEXI2PDF} ARGS gmsh.texi
2020+ WORKING_DIRECTORY ${TEX_DIR})
2021+ add_custom_target(pdf DEPENDS ${TEX_DIR}/gmsh.pdf)
2022+ install(FILES ${TEX_DIR}/gmsh.pdf DESTINATION ${GMSH_DOC} OPTIONAL)
2023+endif()
2024+
2025+execute_process(COMMAND ${CMAKE_COMMAND} -E echo
2026+ "@c This file was generated by cmake: do not edit manually!\n${OPT_TEXI}"
2027+ OUTPUT_FILE cmake_options.texi)
2028+
2029+if(MAKEINFO AND TEXI2PDF)
2030+ add_custom_target(doc COMMAND ${CMAKE_COMMAND} -E tar zcf
2031+ ${CMAKE_CURRENT_BINARY_DIR}/gmsh-${GMSH_VERSION}-doc.tgz
2032+ CREDITS.txt LICENSE.txt CHANGELOG.txt
2033+ doc/gmsh.1 doc/texinfo/gmsh.html doc/texinfo/gmsh.info
2034+ doc/texinfo/gmsh.pdf doc/texinfo/gmsh.txt
2035+ COMMAND ${CMAKE_COMMAND} -E remove ${TEX_OBJ}
2036+ DEPENDS ${TEX_DIR}/gmsh.info ${TEX_DIR}/gmsh.txt
2037+ ${TEX_DIR}/gmsh.html ${TEX_DIR}/gmsh.pdf
2038+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
2039+endif()
2040+
2041+if(MAKEINFO OR TEXI2PDF)
2042+ add_custom_target(clean_doc COMMAND ${CMAKE_COMMAND} -E remove ${TEX_OBJ})
2043+endif()
2044+
2045+if(APPLE AND ENABLE_BUILD_LIB)
2046+ file(READ ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_framework.plist F0)
2047+ string(REPLACE GMSH_VERSION "${GMSH_VERSION}" F1 "${F0}")
2048+ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/Info_framework.plist "${F1}")
2049+ set(LIBNAME $<TARGET_FILE:lib>)
2050+ add_custom_target(framework DEPENDS lib
2051+ COMMAND ${CMAKE_COMMAND} -E remove_directory gmsh.framework
2052+ COMMAND ${CMAKE_COMMAND} -E make_directory gmsh.framework/Headers
2053+ COMMAND ${CMAKE_COMMAND} -E make_directory gmsh.framework/Resources
2054+ COMMAND ${CMAKE_COMMAND} -E copy ${LIBNAME} gmsh.framework/gmsh
2055+ COMMAND ${CMAKE_COMMAND} -E copy Info_framework.plist
2056+ gmsh.framework/Resources/Info.plist
2057+ COMMAND ${CMAKE_COMMAND} -E create_symlink . gmsh.framework/Headers/gmsh
2058+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
2059+ foreach(FILE ${GMSH_API})
2060+ add_custom_command(TARGET framework POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy
2061+ ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/gmsh.framework/Headers/
2062+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
2063+ endforeach()
2064+ if(ENABLE_PRIVATE_API)
2065+ foreach(FILE ${GMSH_PRIVATE_API})
2066+ add_custom_command(TARGET framework POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy
2067+ ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/gmsh.framework/Headers/
2068+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
2069+ endforeach()
2070+ endif()
2071+endif()
2072+
2073+set(CPACK_PACKAGE_VENDOR "Christophe Geuzaine and Jean-Francois Remacle")
2074+set(CPACK_PACKAGE_VERSION_MAJOR ${GMSH_MAJOR_VERSION})
2075+set(CPACK_PACKAGE_VERSION_MINOR ${GMSH_MINOR_VERSION})
2076+set(CPACK_PACKAGE_VERSION_PATCH ${GMSH_PATCH_VERSION})
2077+set(CPACK_PACKAGE_DESCRIPTION_FILE ${WELCOME_FILE})
2078+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
2079+ "3D finite element mesh generator with built-in CAD engine and post-processor")
2080+if(GMSH_EXTRA_VERSION MATCHES "-git.*") # so that we'll overwrite the archives
2081+ set(CPACK_PACKAGE_FILE_NAME gmsh${GMSH_EXTRA_VERSION_ORIG}-git-${GMSH_OS})
2082+ set(CPACK_SOURCE_PACKAGE_FILE_NAME gmsh${GMSH_EXTRA_VERSION_ORIG}-git-source)
2083+else()
2084+ set(CPACK_PACKAGE_FILE_NAME gmsh-${GMSH_VERSION}-${GMSH_OS})
2085+ set(CPACK_SOURCE_PACKAGE_FILE_NAME gmsh-${GMSH_VERSION}-source)
2086+endif()
2087+set(CPACK_PACKAGE_INSTALL_DIRECTORY "gmsh")
2088+set(CPACK_RESOURCE_FILE_LICENSE ${LICENSE_FILE})
2089+set(CPACK_RESOURCE_FILE_README ${WELCOME_FILE})
2090+set(CPACK_RESOURCE_FILE_WELCOME ${WELCOME_FILE})
2091+set(CPACK_PACKAGE_EXECUTABLE "gmsh")
2092+if(ENABLE_PACKAGE_STRIP)
2093+ set(CPACK_STRIP_FILES TRUE)
2094+else()
2095+ set(CPACK_STRIP_FILES FALSE)
2096+endif()
2097+set(CPACK_SOURCE_GENERATOR TGZ)
2098+set(CPACK_SOURCE_IGNORE_FILES "${CMAKE_CURRENT_BINARY_DIR}" "/CVS/" "/.svn" "/.git"
2099+ "~$" "DS_Store$" "GmshConfig.h$" "GmshVersion.h$" "/benchmarks/" "/tmp/"
2100+ "/bin/" "/lib/" "/nightly/" "GPATH" "GRTAGS" "GSYMS" "GTAGS" "/HTML/"
2101+ "/contrib/3M/" "/contrib/Parasolid/")
2102+
2103+if(UNIX)
2104+ # make sure we remove previous installs before doing the next one (on Mac for
2105+ # example "make package; make package_source" would lead to huge file lists
2106+ # getting generated due to the 'Applications' symlink in the bundle)
2107+ set(CPACK_INSTALL_COMMANDS "rm -rf ${CMAKE_CURRENT_BINARY_DIR}/_CPack_Packages")
2108+endif()
2109+
2110+if(APPLE AND ENABLE_OS_SPECIFIC_INSTALL)
2111+ set(CPACK_GENERATOR Bundle)
2112+ set(CPACK_BUNDLE_NAME Gmsh)
2113+ file(READ ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_app.plist F0)
2114+ string(REPLACE GMSH_VERSION "${GMSH_VERSION}" F1 "${F0}")
2115+ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/Info.plist "${F1}")
2116+ set(CPACK_BUNDLE_PLIST ${CMAKE_CURRENT_BINARY_DIR}/Info.plist)
2117+ set(CPACK_BUNDLE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIcons.icns)
2118+ if(PACKAGER STREQUAL "geuzaine - removed: we sign on a separate machine")
2119+ # codesigning requires CMake >= 3.2
2120+ set(CPACK_BUNDLE_APPLE_CERT_APP "Developer ID Application: Christophe Geuzaine")
2121+ endif()
2122+ install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsGeo.icns DESTINATION .
2123+ RENAME GmshGeo.icns)
2124+ install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsMsh.icns DESTINATION .
2125+ RENAME GmshMsh.icns)
2126+ install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsSol.icns DESTINATION .
2127+ RENAME GmshSol.icns)
2128+ install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsPos.icns DESTINATION .
2129+ RENAME GmshPos.icns)
2130+ set(CPACK_PACKAGE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIcons.icns)
2131+elseif(WIN32)
2132+ set(CPACK_GENERATOR ZIP)
2133+else()
2134+ set(CPACK_GENERATOR TGZ)
2135+endif()
2136+
2137+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/utils/wrappers/gmshpy AND
2138+ ENABLE_PRIVATE_API AND ENABLE_WRAP_PYTHON AND HAVE_PYTHON)
2139+ add_subdirectory(utils/wrappers/gmshpy)
2140+endif()
2141+
2142+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/utils/wrappers/java AND
2143+ ENABLE_PRIVATE_API AND ENABLE_WRAP_JAVA)
2144+ add_subdirectory(utils/wrappers/java)
2145+endif()
2146+
2147+include(CPack)
2148+
2149+macro(filter_tests IN OUT)
2150+ unset(${OUT})
2151+ foreach(FILE ${IN})
2152+ unset(BAD1)
2153+ unset(BAD2)
2154+ unset(BAD3)
2155+ # OS-specific
2156+ if(${GMSH_OS} MATCHES "Linux32")
2157+ # OCC STL generation crashes on our Linux32 docker
2158+ string(REGEX MATCH "t18" BAD1 ${FILE})
2159+ endif()
2160+ # OpenCASCADE
2161+ if(NOT HAVE_OCC AND NOT BAD1 AND NOT BAD2 AND NOT BAD3)
2162+ file(STRINGS ${FILE} BAD1 REGEX "^SetFactory.*OpenCASCADE.*")
2163+ file(STRINGS ${FILE} BAD2 REGEX ".*occ\\.synchronize.*")
2164+ file(STRINGS ${FILE} BAD3 REGEX ".*occ::synchronize.*")
2165+ endif()
2166+ # Metis
2167+ if(NOT HAVE_METIS AND NOT BAD1 AND NOT BAD2 AND NOT BAD3)
2168+ file(STRINGS ${FILE} BAD1 REGEX ".*PartitionMesh.*")
2169+ file(STRINGS ${FILE} BAD2 REGEX ".*mesh\\.partition.*")
2170+ file(STRINGS ${FILE} BAD3 REGEX ".*mesh::partition.*")
2171+ endif()
2172+ if(BAD1 OR BAD2 OR BAD3)
2173+ message("Skipping test " ${FILE})
2174+ else()
2175+ list(APPEND ${OUT} ${FILE})
2176+ endif()
2177+ endforeach()
2178+endmacro()
2179+
2180+if(NOT DISABLE_GMSH_TESTS)
2181+ # disabling tests is useful when including this CMakeLists in an external project
2182+ include(CTest)
2183+ file(GLOB_RECURSE ALLFILES
2184+ tutorial/*.geo demos/*.geo benchmarks/?d/*.geo benchmarks/extrude/*.geo
2185+ benchmarks/occ/*.geo)
2186+ filter_tests("${ALLFILES}" TESTFILES)
2187+ foreach(TESTFILE ${TESTFILES})
2188+ # use relative path for Cygwin/MinGW (the pure win exe built with the MinGW
2189+ # compilers does not understand a full Cygwin-style path)
2190+ FILE(RELATIVE_PATH TEST ${CMAKE_CURRENT_BINARY_DIR} ${TESTFILE})
2191+ add_test(${TEST} ./gmsh ${TEST} -3 -nopopup -o ./tmp.msh)
2192+ endforeach()
2193+ # test c++ api tutorials with dynamic builds (except on 32 bit windows for
2194+ # now: our win32 setup does not currently handle exceptions)
2195+ if(ENABLE_BUILD_DYNAMIC AND NOT ${GMSH_OS} MATCHES "Windows32")
2196+ file(GLOB_RECURSE ALLFILES tutorial/c++/*.cpp)
2197+ filter_tests("${ALLFILES}" TESTFILES)
2198+ foreach(TESTFILE ${TESTFILES})
2199+ get_filename_component(TEST ${TESTFILE} NAME_WE)
2200+ add_executable(${TEST} WIN32 ${TESTFILE})
2201+ target_link_libraries(${TEST} shared)
2202+ if(WIN32 AND NOT MSVC)
2203+ set(FLAGS "-static")
2204+ if(HAVE_FLTK)
2205+ set(FLAGS "${FLAGS} -mwindows")
2206+ else()
2207+ set(FLAGS "${FLAGS} -mconsole")
2208+ endif()
2209+ set_target_properties(${TEST} PROPERTIES LINK_FLAGS "${FLAGS}")
2210+ endif()
2211+ add_test(${TEST}_cpp ${TEST} -nopopup)
2212+ endforeach()
2213+ endif()
2214+ # enable this once we have worked out the path issues on the build machines
2215+ if(0 AND ENABLE_BUILD_DYNAMIC)
2216+ find_package(PythonInterp)
2217+ if(PYTHONINTERP_FOUND)
2218+ file(GLOB_RECURSE ALLFILES tutorial/python/*.py demos/api/*.py)
2219+ filter_tests("${ALLFILES}" TESTFILES)
2220+ foreach(TESTFILE ${TESTFILES})
2221+ get_filename_component(TEST ${TESTFILE} NAME_WE)
2222+ add_test(NAME ${TEST}_py COMMAND ${PYTHON_EXECUTABLE} ${TESTFILE} -nopopup)
2223+ set_property(TEST ${TEST}_py APPEND PROPERTY ENVIRONMENT
2224+ "PYTHONPATH=${CMAKE_SOURCE_DIR}/api")
2225+ set_property(TEST ${TEST}_py APPEND PROPERTY ENVIRONMENT
2226+ "LD_LIBRARY_PATH=${CMAKE_CURRENT_BINARY_DIR}")
2227+ endforeach()
2228+ endif()
2229+ endif()
2230+endif()
2231+
2232+message(STATUS "")
2233+message(STATUS "Gmsh ${GMSH_VERSION} has been configured for ${GMSH_OS}")
2234+message(STATUS "")
2235+message(STATUS " * Build options:" ${GMSH_CONFIG_OPTIONS})
2236+message(STATUS " * Build type: " ${CMAKE_BUILD_TYPE})
2237+message(STATUS " * C compiler: " ${CMAKE_C_COMPILER})
2238+message(STATUS " * C++ compiler: " ${CMAKE_CXX_COMPILER})
2239+message(STATUS " * Install prefix: " ${CMAKE_INSTALL_PREFIX})
2240+message(STATUS "")
2241+
2242+mark_as_advanced(ANN_INC ANN_LIB CAIRO_LIB CAIRO_INC CGNS_INC GMM_INC
2243+ GMP_INC GMP_LIB MMG_INC MMG_LIB HDF5_LIB
2244+ MED_LIB OCC_INC SZ_LIB
2245+ PETSC_LIBS SLEPC_INC SLEPC_INC2 SLEPC_LIB
2246+ BISON FLEX MAKEINFO TEXI2PDF FLTK_CONFIG_SCRIPT
2247+ GMSH_EXTERNAL_INCLUDE_DIRS GMSH_EXTERNAL_LIBRARIES)
2248Index: ../trunk-jpl/externalpackages/gmsh/configs/4.5.6/static/CMakeLists.txt
2249===================================================================
2250--- ../trunk-jpl/externalpackages/gmsh/configs/4.5.6/static/CMakeLists.txt (nonexistent)
2251+++ ../trunk-jpl/externalpackages/gmsh/configs/4.5.6/static/CMakeLists.txt (revision 25791)
2252@@ -0,0 +1,2141 @@
2253+# Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle
2254+#
2255+# See the LICENSE.txt file for license information. Please report all
2256+# issues on https://gitlab.onelab.info/gmsh/gmsh/issues.
2257+
2258+cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
2259+
2260+# do not warn about non-definition of WIN32 on Cygwin
2261+set(CMAKE_LEGACY_CYGWIN_WIN32 0)
2262+
2263+# if CMAKE_BUILD_TYPE is specified use it; otherwise set the default
2264+# build type to "RelWithDebInfo" ("-O2 -g" with gcc) prior to calling
2265+# project()
2266+if(DEFINED CMAKE_BUILD_TYPE)
2267+ set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Choose build type")
2268+else()
2269+ set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose build type")
2270+endif()
2271+
2272+project(gmsh CXX C)
2273+
2274+# this variable controls the default value of the options which are normally set
2275+# to ON (useful if you want to configure a minimal version of Gmsh: e.g. "cmake
2276+# -DDEFAULT=0 -DENABLE_POST=1 -DENABLE_PARSER=1")
2277+set(DEFAULT ON CACHE INTERNAL "Default value for enabled-by-default options")
2278+
2279+macro(opt OPTION HELP VALUE)
2280+ option(ENABLE_${OPTION} ${HELP} ${VALUE})
2281+ set(OPT_TEXI "${OPT_TEXI}\n@item ENABLE_${OPTION}\n${HELP} (default: ${VALUE})")
2282+endmacro()
2283+
2284+opt(3M "Enable proprietary 3M extension" OFF)
2285+opt(ACIS "Enable ACIS geometrical models (experimental)" ${DEFAULT})
2286+opt(ALGLIB "Enable ALGLIB (used by some mesh optimizers)" ${DEFAULT})
2287+opt(ANN "Enable ANN (used for fast point search in mesh/post)" ${DEFAULT})
2288+opt(BAMG "Enable Bamg 2D anisotropic mesh generator" ${DEFAULT})
2289+opt(BLAS_LAPACK "Enable BLAS/Lapack for linear algebra (required for meshing)" ON)
2290+opt(BLOSSOM "Enable Blossom algorithm (needed for full quad meshing)" ${DEFAULT})
2291+opt(BUILD_LIB "Enable 'lib' target for building static Gmsh library" OFF)
2292+opt(BUILD_SHARED "Enable 'shared' target for building shared Gmsh library" OFF)
2293+opt(BUILD_DYNAMIC "Enable dynamic Gmsh executable (linked with shared library)" OFF)
2294+opt(BUILD_ANDROID "Enable Android NDK library target (experimental)" OFF)
2295+opt(BUILD_IOS "Enable iOS library target (experimental)" OFF)
2296+opt(CGNS "Enable CGNS import/export (experimental)" ${DEFAULT})
2297+opt(CGNS_CPEX0045 "Enable high-order CGNS import/export following CPEX0045 (experimental)" OFF)
2298+opt(CAIRO "Enable Cairo to render fonts (experimental)" ${DEFAULT})
2299+opt(CXX11 "Enable C++11" ON)
2300+opt(C99 "Enable C99" ON)
2301+opt(PROFILE "Enable profiling compiler flags" OFF)
2302+opt(DINTEGRATION "Enable discrete integration (needed for levelsets)" ${DEFAULT})
2303+opt(DOMHEX "Enable experimental DOMHEX code" ${DEFAULT})
2304+opt(FLTK "Enable FLTK graphical user interface (requires mesh/post)" ${DEFAULT})
2305+opt(GETDP "Enable GetDP solver (linked as a library, experimental)" ${DEFAULT})
2306+opt(GMM "Enable GMM linear solvers (simple alternative to PETSc)" ${DEFAULT})
2307+opt(GMP "Enable GMP for Kbipack (advanced)" ON)
2308+opt(GRAPHICS "Enable building graphics lib even without GUI (advanced)" OFF)
2309+opt(HXT "Enable HXT library (for reparametrization and meshing)" ${DEFAULT})
2310+opt(KBIPACK "Enable Kbipack (neeeded by homology solver)" ${DEFAULT})
2311+opt(MATHEX "Enable Mathex expression parser (used by plugins and options)" ${DEFAULT})
2312+opt(MED "Enable MED mesh and post file formats" ${DEFAULT})
2313+opt(MESH "Enable mesh module (required by GUI)" ${DEFAULT})
2314+opt(METIS "Enable Metis mesh partitioner" ${DEFAULT})
2315+opt(MMG3D "Enable MMG3D 3D anisotropic mesh refinement" ${DEFAULT})
2316+opt(MPEG_ENCODE "Enable built-in MPEG movie encoder" ${DEFAULT})
2317+opt(MPI "Enable MPI (experimental, not used for meshing)" OFF)
2318+opt(MSVC_STATIC_RUNTIME "Enable static Visual C++ runtime" OFF)
2319+opt(MUMPS "Enable MUMPS sparse direct linear solver" OFF)
2320+opt(NETGEN "Enable Netgen 3D frontal mesh generator" ${DEFAULT})
2321+opt(NUMPY "Enable fullMatrix and numpy array conversion for private API" OFF)
2322+opt(PETSC4PY "Enable petsc4py wrappers for petsc matrices for private API" OFF)
2323+opt(OCC "Enable OpenCASCADE CAD kernel" ${DEFAULT})
2324+opt(OCC_CAF "Enable OpenCASCADE CAF module (for STEP/IGES attributes)" ${DEFAULT})
2325+opt(OCC_STATIC "Link OpenCASCADE static instead of dynamic libraries (requires ENABLE_OCC)" OFF)
2326+opt(OCC_TBB "Add TBB libraries in list of OCC libraries" OFF)
2327+opt(ONELAB "Enable ONELAB solver interface" ${DEFAULT})
2328+opt(ONELAB_METAMODEL "Enable ONELAB metamodels (experimental)" ${DEFAULT})
2329+opt(OPENACC "Enable OpenACC" OFF)
2330+opt(OPENMP "Enable OpenMP" OFF)
2331+opt(OPTHOM "Enable high-order mesh optimization tools" ${DEFAULT})
2332+opt(OS_SPECIFIC_INSTALL "Enable OS-specific (e.g. app bundle) installation" OFF)
2333+opt(OSMESA "Enable OSMesa for offscreen rendering (experimental)" OFF)
2334+opt(P4EST "Enable p4est for enabling automatic mesh size firld (experimental)" OFF)
2335+opt(PACKAGE_STRIP "Strip symbols in install packages to reduce install size" ON)
2336+opt(PARSER "Enable GEO file parser (required for .geo/.pos files)" ${DEFAULT})
2337+opt(PETSC "Enable PETSc linear solvers (required for SLEPc)" OFF)
2338+opt(PLUGINS "Enable post-processing plugins" ${DEFAULT})
2339+opt(POST "Enable post-processing module (required by GUI)" ${DEFAULT})
2340+opt(POPPLER "Enable Poppler for displaying PDF documents (experimental)" OFF)
2341+opt(PRIVATE_API "Enable private API" OFF)
2342+opt(QUADTRI "Enable QuadTri structured meshing extensions" ${DEFAULT})
2343+opt(REVOROPT "Enable Revoropt (used for CVT remeshing)" OFF)
2344+opt(SLEPC "Enable SLEPc eigensolvers" OFF)
2345+opt(SOLVER "Enable built-in finite element solvers (required for compounds)" ${DEFAULT})
2346+opt(SYSTEM_CONTRIB "Use system versions of contrib libraries, when possible" OFF)
2347+opt(TCMALLOC "Enable libtcmalloc (fast malloc that does not release memory)" OFF)
2348+opt(TOUCHBAR "Enable Apple Touch bar" ${DEFAULT})
2349+opt(VISUDEV "Enable additional visualization capabilities for development purposes" OFF)
2350+opt(VOROPP "Enable voro++ (for hex meshing, experimental)" ${DEFAULT})
2351+opt(WRAP_JAVA "Enable generation of Java wrappers for private API" OFF)
2352+opt(WRAP_PYTHON "Enable generation of Python wrappers for private API" OFF)
2353+opt(ZIPPER "Enable Zip file compression/decompression" OFF)
2354+
2355+set(GMSH_MAJOR_VERSION 4)
2356+set(GMSH_MINOR_VERSION 5)
2357+set(GMSH_PATCH_VERSION 6)
2358+set(GMSH_EXTRA_VERSION "")
2359+set(GMSH_EXTRA_VERSION_TEXI "${GMSH_EXTRA_VERSION}")
2360+
2361+if(NOT GMSH_RELEASE)
2362+ find_package(Git)
2363+ if(GIT_FOUND)
2364+ execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --format=%h
2365+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ERROR_QUIET
2366+ OUTPUT_VARIABLE GIT_COMMIT_HASH
2367+ OUTPUT_STRIP_TRAILING_WHITESPACE)
2368+ endif()
2369+ if(GIT_COMMIT_HASH)
2370+ set(GMSH_EXTRA_VERSION "${GMSH_EXTRA_VERSION}-git-${GIT_COMMIT_HASH}")
2371+ endif()
2372+ set(GMSH_EXTRA_VERSION_TEXI "${GMSH_EXTRA_VERSION_TEXI} (development version)")
2373+endif()
2374+
2375+set(GMSH_VERSION "${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}")
2376+set(GMSH_VERSION "${GMSH_VERSION}.${GMSH_PATCH_VERSION}${GMSH_EXTRA_VERSION}")
2377+set(GMSH_SHORT_LICENSE "GNU General Public License")
2378+
2379+set(GMSH_API api/gmsh.h api/gmshc.h api/gmsh.h_cwrap)
2380+
2381+if(ENABLE_PRIVATE_API)
2382+ message(WARNING "The private API is unsupported and undocumented. It is meant "
2383+ "for expert Gmsh developers, not for regular Gmsh users, who should rely "
2384+ "on the stable public API (gmsh/api) instead. If you are repackaging Gmsh, "
2385+ "e.g. for a Linux distribution, please DO NOT distribute the private API "
2386+ "(i.e. all the internal headers) and ship the stable public API instead "
2387+ "(i.e. only the headers and modules in gmsh/api).")
2388+ file(GLOB_RECURSE HEADERS Common/*.h Numeric/*.h Geo/*.h Mesh/*.h Solver/*.h
2389+ Post/*.h Graphics/*.h contrib/kbipack/*.h contrib/DiscreteIntegration/*.h
2390+ contrib/HighOrderMeshOptimizer/*.h contrib/MeshOptimizer/*.h
2391+ contrib/MeshQualityOptimizer/*.h)
2392+ set(GMSH_PRIVATE_API ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshConfig.h
2393+ ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshVersion.h ${HEADERS})
2394+ get_property(IAMCHILD DIRECTORY PROPERTY PARENT_DIRECTORY)
2395+ if(IAMCHILD)
2396+ set(GMSH_PRIVATE_API ${GMSH_PRIVATE_API} PARENT_SCOPE)
2397+ endif()
2398+endif()
2399+
2400+set(ONELAB_PY contrib/onelab/python/onelab.py)
2401+set(GMSH_PY api/gmsh.py)
2402+set(GMSH_JL api/gmsh.jl)
2403+
2404+if(${CMAKE_MAJOR_VERSION} GREATER 2)
2405+ string(TIMESTAMP DATE "%Y%m%d")
2406+else()
2407+ execute_process(COMMAND date "+%Y%m%d" OUTPUT_VARIABLE DATE
2408+ OUTPUT_STRIP_TRAILING_WHITESPACE)
2409+endif()
2410+
2411+if(NOT DATE)
2412+ set(DATE "unknown")
2413+endif()
2414+set(GMSH_DATE "${DATE}")
2415+
2416+if(NOT GMSH_HOST)
2417+ execute_process(COMMAND hostname OUTPUT_VARIABLE HOSTNAME
2418+ OUTPUT_STRIP_TRAILING_WHITESPACE)
2419+ if(NOT HOSTNAME)
2420+ set(HOSTNAME "unknown")
2421+ endif()
2422+ set(GMSH_HOST "${HOSTNAME}")
2423+endif()
2424+
2425+if(NOT GMSH_PACKAGER)
2426+ execute_process(COMMAND whoami OUTPUT_VARIABLE PACKAGER
2427+ OUTPUT_STRIP_TRAILING_WHITESPACE)
2428+ if(NOT PACKAGER)
2429+ set(PACKAGER "unknown")
2430+ endif()
2431+ string(REPLACE "\\" " " PACKAGER ${PACKAGER})
2432+ set(GMSH_PACKAGER "${PACKAGER}")
2433+endif()
2434+
2435+if(APPLE)
2436+ set(GMSH_OS "MacOSX")
2437+elseif(CYGWIN OR MSYS)
2438+ # detect if we use the MinGW compilers on Cygwin - if we do, handle the build
2439+ # as a pure Windows build
2440+ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
2441+ CMAKE_CXX_COMPILER_ID MATCHES "Clang")
2442+ execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine
2443+ OUTPUT_VARIABLE CXX_COMPILER_MACHINE
2444+ OUTPUT_STRIP_TRAILING_WHITESPACE)
2445+ if(CXX_COMPILER_MACHINE MATCHES "mingw")
2446+ set(GMSH_OS "Windows")
2447+ set(WIN32 1)
2448+ add_definitions(-DWIN32)
2449+ endif()
2450+ endif()
2451+else()
2452+ set(GMSH_OS "${CMAKE_SYSTEM_NAME}")
2453+endif()
2454+
2455+include(CheckTypeSize)
2456+include(CheckFunctionExists)
2457+include(CheckIncludeFile)
2458+include(CheckCXXCompilerFlag)
2459+include(CheckCCompilerFlag)
2460+
2461+macro(set_config_option VARNAME STRING)
2462+ set(${VARNAME} TRUE)
2463+ list(APPEND CONFIG_OPTIONS ${STRING})
2464+ message(STATUS "Found " ${STRING})
2465+endmacro()
2466+
2467+# check if the machine is 64 bits (this is more reliable than using
2468+# CMAKE_SIZEOF_VOID_P, which does not seem to work e.g. on some Suse
2469+# machines)
2470+check_type_size("void*" SIZEOF_VOID_P)
2471+if(SIZEOF_VOID_P EQUAL 8)
2472+ set_config_option(HAVE_64BIT_SIZE_T "64Bit")
2473+endif()
2474+
2475+# append 32/64 to the build name on Linux and Windows
2476+if(NOT APPLE)
2477+ if(HAVE_64BIT_SIZE_T)
2478+ set(GMSH_OS "${GMSH_OS}64")
2479+ else()
2480+ set(GMSH_OS "${GMSH_OS}32")
2481+ endif()
2482+endif()
2483+
2484+if(NOT ENABLE_BUILD_SHARED)
2485+ if(ENABLE_WRAP_PYTHON OR ENABLE_WRAP_JAVA)
2486+ set(ENABLE_BUILD_DYNAMIC ON)
2487+ endif()
2488+endif()
2489+
2490+if(ENABLE_BUILD_DYNAMIC)
2491+ set(GMSH_OS "${GMSH_OS}-sdk")
2492+endif()
2493+
2494+if(APPLE)
2495+ # FIXME: change this once we understand rpaths - the options below do not work
2496+ set(CMAKE_MACOSX_RPATH 0)
2497+else()
2498+ # make sure that dynamic libraries can be found when installing/ displacing the
2499+ # binaries: from https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/
2500+ # RPATH-handling:
2501+
2502+ # use, i.e. don't skip the full RPATH for the build tree
2503+ set(CMAKE_SKIP_BUILD_RPATH FALSE)
2504+
2505+ # when building, don't use the install RPATH already (but later on when
2506+ # installing)
2507+ set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
2508+ set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
2509+
2510+ # add the automatically determined parts of the RPATH which point to
2511+ # directories outside the build tree to the install RPATH
2512+ set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
2513+
2514+ # the RPATH to be used when installing, but only if it's not a system directory
2515+ list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib"
2516+ isSystemDir)
2517+ if("${isSystemDir}" STREQUAL "-1")
2518+ set(CMAKE_INSTALL_RPATH "\\\$ORIGIN/../lib")
2519+ endif()
2520+endif()
2521+
2522+if(MSVC)
2523+ # remove annoying warning about bool/int cast performance
2524+ set(GMSH_CONFIG_PRAGMAS "#pragma warning(disable:4800 4244 4267)")
2525+ foreach(VAR
2526+ CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
2527+ CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO
2528+ CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
2529+ CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
2530+ if(ENABLE_MSVC_STATIC_RUNTIME AND ${VAR} MATCHES "/MD")
2531+ string(REGEX REPLACE "/MD" "/MT" ${VAR} "${${VAR}}")
2532+ endif()
2533+ if(NOT ${VAR} MATCHES "/MP") # enable parallel compilation
2534+ set(${VAR} "${${VAR}} /MP")
2535+ endif()
2536+ endforeach()
2537+ if(ENABLE_PRIVATE_API)
2538+ if(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
2539+ # automatically export .def file with all symbols (requires CMake 3.4);
2540+ # depending on the compiling options this might lead to more than 64k export
2541+ # symbols; just trim the .def file to keep the ones you need
2542+ set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
2543+ endif()
2544+ endif()
2545+endif()
2546+
2547+if(ENABLE_OPENMP)
2548+ find_package(OpenMP)
2549+ if(OpenMP_FOUND)
2550+ set_config_option(HAVE_OPENMP "OpenMP")
2551+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
2552+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
2553+ elseif(APPLE AND EXISTS "/opt/local/lib/libomp")
2554+ # just for testing the official Apple compiler with macports' libomp
2555+ set_config_option(HAVE_OPENMP "OpenMP[MacPorts]")
2556+ set(CMAKE_C_FLAGS
2557+ "${CMAKE_C_FLAGS} -Xpreprocessor -fopenmp -I/opt/local/include/libomp")
2558+ set(CMAKE_CXX_FLAGS
2559+ "${CMAKE_CXX_FLAGS} -Xpreprocessor -fopenmp -I/opt/local/include/libomp")
2560+ list(APPEND EXTERNAL_LIBRARIES "-L/opt/local/lib/libomp -lomp")
2561+ elseif(APPLE AND EXISTS "/usr/local/lib/libomp.dylib")
2562+ set_config_option(HAVE_OPENMP "OpenMP[usr/local]")
2563+ set(CMAKE_C_FLAGS
2564+ "${CMAKE_C_FLAGS} -Xpreprocessor -fopenmp")
2565+ set(CMAKE_CXX_FLAGS
2566+ "${CMAKE_CXX_FLAGS} -Xpreprocessor -fopenmp")
2567+ list(APPEND EXTERNAL_LIBRARIES "-lomp")
2568+ endif()
2569+endif()
2570+
2571+if(ENABLE_OPENACC)
2572+ find_package(OpenACC)
2573+ if(OpenACC_C_FOUND AND OpenACC_CXX_FOUND)
2574+ set_config_option(HAVE_OPENACC "OpenACC")
2575+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenACC_C_FLAGS}")
2576+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenACC_CXX_FLAGS}")
2577+ endif()
2578+endif()
2579+
2580+if(ENABLE_CXX11)
2581+ # in recent cmake versions we could do e.g. set(CMAKE_CXX_STANDARD 11)
2582+ check_cxx_compiler_flag("-std=c++11" STDCXX11)
2583+ if(STDCXX11)
2584+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
2585+ endif()
2586+endif()
2587+
2588+if(ENABLE_C99)
2589+ # in recent cmake versions we could do e.g. set(CMAKE_C_STANDARD 99)
2590+ check_c_compiler_flag("-std=c99" STDC99)
2591+ if(STDC99)
2592+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
2593+ endif()
2594+endif()
2595+
2596+if(ENABLE_PROFILE)
2597+ # Using the perf set of profiling tools doesn't work without the frame
2598+ # pointer and a common optimisation is to remove it
2599+ check_cxx_compiler_flag("-fno-omit-frame-pointer" FNOFP)
2600+ if(FNOFP)
2601+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
2602+ endif()
2603+endif()
2604+
2605+macro(append_gmsh_src DIRNAME FILES)
2606+ foreach(FILE ${FILES})
2607+ list(APPEND LIST ${DIRNAME}/${FILE})
2608+ endforeach()
2609+ set(GMSH_SRC ${GMSH_SRC};${LIST} PARENT_SCOPE)
2610+ set(GMSH_DIRS ${GMSH_DIRS};${DIRNAME} PARENT_SCOPE)
2611+endmacro()
2612+
2613+macro(find_all_libraries VARNAME LISTNAME PATH SUFFIX)
2614+ set(${VARNAME})
2615+ list(LENGTH ${LISTNAME} NUM_LIST)
2616+ foreach(LIB ${${LISTNAME}})
2617+ if("${PATH}" STREQUAL "")
2618+ find_library(FOUND_LIB ${LIB} PATH_SUFFIXES ${SUFFIX})
2619+ else()
2620+ find_library(FOUND_LIB ${LIB} PATHS ${PATH} NO_DEFAULT_PATH)
2621+ endif()
2622+ if(FOUND_LIB)
2623+ list(APPEND ${VARNAME} ${FOUND_LIB})
2624+ endif()
2625+ unset(FOUND_LIB CACHE)
2626+ endforeach()
2627+ list(LENGTH ${VARNAME} NUM_FOUND_LIBRARIES)
2628+ if(NUM_FOUND_LIBRARIES LESS NUM_LIST)
2629+ set(${VARNAME})
2630+ endif()
2631+endmacro()
2632+
2633+macro(set_compile_flags LISTNAME FLAGS)
2634+ foreach(FILE ${${LISTNAME}})
2635+ get_source_file_property(PROP ${FILE} COMPILE_FLAGS)
2636+ if(PROP)
2637+ set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS "${PROP} ${FLAGS}")
2638+ else()
2639+ set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS "${FLAGS}")
2640+ endif()
2641+ endforeach()
2642+endmacro()
2643+
2644+if(ENABLE_BLAS_LAPACK)
2645+ if(BLAS_LAPACK_LIBRARIES)
2646+ # use libs as specified in the BLAS_LAPACK_LIBRARIES variable
2647+ set_config_option(HAVE_BLAS "Blas[custom]")
2648+ set_config_option(HAVE_LAPACK "Lapack[custom]")
2649+ set(LAPACK_LIBRARIES ${BLAS_LAPACK_LIBRARIES})
2650+ else()
2651+ if(MSVC)
2652+ # on Windows with Visual C++ try really hard to find blas/lapack *without*
2653+ # requiring a Fortran compiler: 1) try to find the Intel MKL libs using
2654+ # the standard search path; if not found 2) try to get the reference
2655+ # blas/lapack libs (useful for users with no Fortran compiler and no MKL
2656+ # license, who can just download our precompiled "gmsh-dep" package)
2657+ if(HAVE_64BIT_SIZE_T)
2658+ set(MKL_PATH em64t/lib)
2659+ set(MKL_LIBS_REQUIRED libguide40 mkl_intel_lp64 mkl_intel_thread mkl_core)
2660+ else()
2661+ set(MKL_PATH ia32/lib)
2662+ set(MKL_LIBS_REQUIRED libguide40 mkl_intel_c mkl_intel_thread mkl_core)
2663+ endif()
2664+ find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
2665+ if(LAPACK_LIBRARIES)
2666+ set_config_option(HAVE_BLAS "Blas[mkl]")
2667+ set_config_option(HAVE_LAPACK "Lapack[mkl]")
2668+ else()
2669+ set(REFLAPACK_LIBS_REQUIRED lapack blas g2c gcc)
2670+ find_all_libraries(LAPACK_LIBRARIES REFLAPACK_LIBS_REQUIRED "" "")
2671+ if(LAPACK_LIBRARIES)
2672+ set_config_option(HAVE_BLAS "Blas[ref]")
2673+ set_config_option(HAVE_LAPACK "Lapack[ref]")
2674+ endif()
2675+ endif()
2676+ elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
2677+ # on Linux try to find the Intel MKL without a Fortran compiler
2678+ if(HAVE_64BIT_SIZE_T)
2679+ set(MKL_PATH lib/em64t)
2680+ else()
2681+ set(MKL_PATH lib/32)
2682+ endif()
2683+ set(MKL_LIBS_REQUIRED mkl_gf_lp64 iomp5 mkl_gnu_thread mkl_core guide pthread)
2684+ find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
2685+ if(NOT LAPACK_LIBRARIES)
2686+ # match lapack 9.0 on 64bit
2687+ set(MKL_LIBS_REQUIRED mkl_lapack mkl_em64t guide)
2688+ find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
2689+ endif()
2690+ if(LAPACK_LIBRARIES)
2691+ set_config_option(HAVE_BLAS "Blas[mkl]")
2692+ set_config_option(HAVE_LAPACK "Lapack[mkl]")
2693+ else()
2694+ # on Linux also try to find ATLAS without a Fortran compiler, because
2695+ # cmake ships with a buggy FindBLAS e.g. on Ubuntu Lucid Lynx
2696+ set(ATLAS_LIBS_REQUIRED lapack f77blas cblas atlas)
2697+ find_all_libraries(LAPACK_LIBRARIES ATLAS_LIBS_REQUIRED "" "")
2698+ if(LAPACK_LIBRARIES)
2699+ set_config_option(HAVE_BLAS "Blas[atlas]")
2700+ set_config_option(HAVE_LAPACK "Lapack[atlas]")
2701+ else()
2702+ # try with generic names
2703+ set(GENERIC_LIBS_REQUIRED lapack blas pthread)
2704+ find_all_libraries(LAPACK_LIBRARIES GENERIC_LIBS_REQUIRED "" "")
2705+ if(LAPACK_LIBRARIES)
2706+ set_config_option(HAVE_BLAS "Blas[generic]")
2707+ set_config_option(HAVE_LAPACK "Lapack[generic]")
2708+ find_library(GFORTRAN_LIB gfortran)
2709+ if(GFORTRAN_LIB)
2710+ list(APPEND LAPACK_LIBRARIES ${GFORTRAN_LIB})
2711+ endif()
2712+ endif()
2713+ endif()
2714+ endif()
2715+ elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
2716+ # on SunOS we know blas and lapack are available in sunperf
2717+ set(LAPACK_LIBRARIES -library=sunperf)
2718+ set_config_option(HAVE_BLAS "Blas[sunperf]")
2719+ set_config_option(HAVE_LAPACK "Lapack[sunperf]")
2720+ elseif(APPLE)
2721+ # on Mac we also know that blas and lapack are available
2722+ set(LAPACK_LIBRARIES "-llapack -lblas")
2723+ set_config_option(HAVE_BLAS "Blas[veclib]")
2724+ set_config_option(HAVE_LAPACK "Lapack[veclib]")
2725+ endif()
2726+
2727+ if(NOT HAVE_BLAS OR NOT HAVE_LAPACK)
2728+ # if we haven't found blas and lapack check for OpenBlas
2729+ set(OPENBLAS_LIBS_REQUIRED openblas)
2730+ find_all_libraries(LAPACK_LIBRARIES OPENBLAS_LIBS_REQUIRED "" "")
2731+ if(LAPACK_LIBRARIES)
2732+ set_config_option(HAVE_BLAS "Blas[openblas]")
2733+ set_config_option(HAVE_LAPACK "Lapack[openblas]")
2734+ find_library(GFORTRAN_LIB gfortran)
2735+ if(GFORTRAN_LIB)
2736+ list(APPEND LAPACK_LIBRARIES ${GFORTRAN_LIB})
2737+ endif()
2738+ endif()
2739+ endif()
2740+
2741+ if(NOT HAVE_BLAS OR NOT HAVE_LAPACK)
2742+ # if we still haven't found blas and lapack, use the standard cmake tests,
2743+ # which require a working Fortran compiler
2744+ enable_language(Fortran)
2745+ find_package(BLAS)
2746+ if(BLAS_FOUND)
2747+ set_config_option(HAVE_BLAS "Blas")
2748+ find_package(LAPACK)
2749+ if(LAPACK_FOUND)
2750+ set_config_option(HAVE_LAPACK "Lapack")
2751+ else()
2752+ set(LAPACK_LIBRARIES ${BLAS_LIBRARIES})
2753+ endif()
2754+ if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
2755+ if(CMAKE_Fortran_COMPILER MATCHES "gfortran")
2756+ list(APPEND LAPACK_LIBRARIES gfortran)
2757+ elseif(CMAKE_Fortran_COMPILER MATCHES "f95")
2758+ list(APPEND LAPACK_LIBRARIES gfortran)
2759+ elseif(CMAKE_Fortran_COMPILER MATCHES "g77")
2760+ list(APPEND LAPACK_LIBRARIES g2c)
2761+ endif()
2762+ elseif(CMAKE_Fortran_COMPILER MATCHES "pgi")
2763+ list(APPEND LAPACK_LIBRARIES -pgf77libs)
2764+ endif()
2765+ endif()
2766+ endif()
2767+
2768+ if(NOT HAVE_BLAS OR NOT HAVE_LAPACK)
2769+ message(WARNING "Could not find Blas or Lapack: most meshing algorithms "
2770+ "will not be functional")
2771+ endif()
2772+
2773+ endif()
2774+endif()
2775+
2776+if(ENABLE_TCMALLOC)
2777+ find_library(TCMALLOC tcmalloc)
2778+ if(TCMALLOC)
2779+ set_config_option(HAVE_TCMALLOC "TCMalloc")
2780+ list(APPEND EXTERNAL_LIBRARIES ${TCMALLOC})
2781+ endif()
2782+endif()
2783+
2784+add_subdirectory(Common)
2785+add_subdirectory(Numeric)
2786+add_subdirectory(Geo)
2787+
2788+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Mesh AND ENABLE_MESH)
2789+ add_subdirectory(Mesh)
2790+ set_config_option(HAVE_MESH "Mesh")
2791+endif()
2792+
2793+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Solver AND ENABLE_SOLVER)
2794+ add_subdirectory(Solver)
2795+ set_config_option(HAVE_SOLVER "Solver")
2796+endif()
2797+
2798+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Post AND ENABLE_POST)
2799+ add_subdirectory(Post)
2800+ set_config_option(HAVE_POST "Post")
2801+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Plugin AND ENABLE_PLUGINS)
2802+ add_subdirectory(Plugin)
2803+ set_config_option(HAVE_PLUGINS "Plugins")
2804+ endif()
2805+endif()
2806+
2807+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Parser AND ENABLE_PARSER)
2808+ add_subdirectory(Parser)
2809+ set_config_option(HAVE_PARSER "Parser")
2810+endif()
2811+
2812+if(ENABLE_VISUDEV)
2813+ set_config_option(HAVE_VISUDEV "VisuDev")
2814+endif()
2815+
2816+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Fltk AND ENABLE_FLTK)
2817+ # first, try to use fltk-config for fltk >= 1.3 (FindFLTK is buggy on Unix,
2818+ # where e.g. xft and xinerama options are not dealt with)
2819+ find_program(FLTK_CONFIG_SCRIPT fltk-config)
2820+ if(FLTK_CONFIG_SCRIPT)
2821+ execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --api-version
2822+ OUTPUT_VARIABLE FLTK_VERSION)
2823+ string(STRIP "${FLTK_VERSION}" FLTK_VERSION)
2824+ if(FLTK_VERSION VERSION_GREATER 1.1)
2825+ add_subdirectory(Fltk)
2826+ set_config_option(HAVE_FLTK "Fltk")
2827+ message(STATUS "Using fltk-config script for Fltk " ${FLTK_VERSION})
2828+ execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --use-gl --use-images --includedir
2829+ OUTPUT_VARIABLE FLTK_INCLUDE_DIR)
2830+ string(STRIP ${FLTK_INCLUDE_DIR} FLTK_INCLUDE_DIR)
2831+ list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR})
2832+ # On linux (at least OpenSuSE) the following directories are
2833+ # not existing (everything is in /usr/include). To avoid warnings
2834+ # check existance of these directories before adding them
2835+ if(EXISTS ${FLTK_INCLUDE_DIR}/FL/images)
2836+ list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/FL/images)
2837+ endif()
2838+ if(EXISTS ${FLTK_INCLUDE_DIR}/jpeg)
2839+ list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/jpeg)
2840+ endif()
2841+ if(EXISTS ${FLTK_INCLUDE_DIR}/zlib)
2842+ list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/zlib)
2843+ endif()
2844+ if(EXISTS ${FLTK_INCLUDE_DIR}/png)
2845+ list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/png)
2846+ endif()
2847+ execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --use-gl --use-images --ldflags
2848+ OUTPUT_VARIABLE FLTK_LIBRARIES)
2849+ string(STRIP ${FLTK_LIBRARIES} FLTK_LIBRARIES)
2850+ string(REGEX MATCH "fltk[_ ]jpeg" FLTK_JPEG ${FLTK_LIBRARIES})
2851+ string(REGEX MATCH "fltk[_ ]z" FLTK_Z ${FLTK_LIBRARIES})
2852+ string(REGEX MATCH "fltk[_ ]png" FLTK_PNG ${FLTK_LIBRARIES})
2853+ endif()
2854+ endif()
2855+ # then try the built-in FindFLTK module
2856+ if(NOT HAVE_FLTK)
2857+ set(FLTK_SKIP_FORMS TRUE)
2858+ set(FLTK_SKIP_FLUID TRUE)
2859+ find_package(FLTK)
2860+ if(FLTK_FOUND)
2861+ add_subdirectory(Fltk)
2862+ set_config_option(HAVE_FLTK "Fltk")
2863+ list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR})
2864+ # find fltk jpeg
2865+ find_library(FLTK_JPEG NAMES fltk_jpeg fltkjpeg)
2866+ if(FLTK_JPEG)
2867+ list(APPEND EXTERNAL_LIBRARIES ${FLTK_JPEG})
2868+ foreach(DIR ${FLTK_INCLUDE_DIR})
2869+ list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/jpeg)
2870+ endforeach()
2871+ endif()
2872+ # find fltk zlib
2873+ find_library(FLTK_Z NAMES fltk_z fltkz)
2874+ if(FLTK_Z)
2875+ list(APPEND EXTERNAL_LIBRARIES ${FLTK_Z})
2876+ foreach(DIR ${FLTK_INCLUDE_DIR})
2877+ list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/zlib)
2878+ endforeach()
2879+ endif()
2880+ # find fltk png
2881+ find_library(FLTK_PNG NAMES fltk_png fltkpng)
2882+ if(FLTK_PNG)
2883+ list(APPEND EXTERNAL_LIBRARIES ${FLTK_PNG})
2884+ foreach(DIR ${FLTK_INCLUDE_DIR})
2885+ list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/png)
2886+ endforeach()
2887+ endif()
2888+ endif()
2889+ endif()
2890+ # workaround for Fedora/Suse messing up fltk-config (see issue #417)
2891+ if(HAVE_FLTK AND ${CMAKE_SYSTEM_NAME} MATCHES "Linux")
2892+ string(REGEX MATCH "X11" FLTK_X11 ${FLTK_LIBRARIES})
2893+ if(NOT FLTK_X11)
2894+ find_package(X11)
2895+ if(X11_FOUND)
2896+ list(APPEND EXTERNAL_INCLUDES ${X11_INCLUDE_DIR})
2897+ list(APPEND EXTERNAL_LIBRARIES ${X11_LIBRARIES})
2898+ endif()
2899+ endif()
2900+ endif()
2901+endif()
2902+
2903+if(APPLE AND HAVE_FLTK AND ENABLE_TOUCHBAR)
2904+ if(CMAKE_OSX_DEPLOYMENT_TARGET)
2905+ if(${CMAKE_OSX_DEPLOYMENT_TARGET} VERSION_GREATER 10.11)
2906+ set(GMSH_SRC ${GMSH_SRC};Fltk/touchBar.mm)
2907+ set_config_option(HAVE_TOUCHBAR "TouchBar")
2908+ endif()
2909+ endif()
2910+endif()
2911+
2912+if(ENABLE_ONELAB)
2913+ set_config_option(HAVE_ONELAB "ONELAB")
2914+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/onelab)
2915+ if(ENABLE_ONELAB_METAMODEL)
2916+ add_subdirectory(contrib/onelab)
2917+ include_directories(contrib/onelab)
2918+ set_config_option(HAVE_ONELAB_METAMODEL "ONELABMetamodel")
2919+ endif()
2920+ file(COPY ${ONELAB_PY} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
2921+ endif()
2922+endif()
2923+
2924+if(ENABLE_BUILD_IOS)
2925+ find_file(CMAKE_TOOLCHAIN_FILE "ios.cmake")
2926+ if(NOT CMAKE_TOOLCHAIN_FILE)
2927+ message(FATAL_ERROR "Cannot compile Gmsh for iOS without a toolchain")
2928+ endif()
2929+ add_definitions(-DBUILD_IOS)
2930+endif()
2931+
2932+if(HAVE_FLTK OR ENABLE_GRAPHICS)
2933+ if(NOT HAVE_MESH OR NOT HAVE_POST OR NOT HAVE_PLUGINS OR NOT HAVE_ONELAB)
2934+ message(SEND_ERROR "Cannot compile GUI without Mesh, Post, Plugin and ONELAB")
2935+ endif()
2936+
2937+ if(FLTK_JPEG)
2938+ set_config_option(HAVE_LIBJPEG "Jpeg[fltk]")
2939+ else()
2940+ find_package(JPEG)
2941+ if(JPEG_FOUND)
2942+ set_config_option(HAVE_LIBJPEG "Jpeg")
2943+ list(APPEND EXTERNAL_LIBRARIES ${JPEG_LIBRARIES})
2944+ list(APPEND EXTERNAL_INCLUDES ${JPEG_INCLUDE_DIR})
2945+ endif()
2946+ endif()
2947+
2948+ if(FLTK_Z)
2949+ set_config_option(HAVE_LIBZ "Zlib[fltk]")
2950+ else()
2951+ find_package(ZLIB)
2952+ if(ZLIB_FOUND)
2953+ set_config_option(HAVE_LIBZ "Zlib")
2954+ list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
2955+ list(APPEND EXTERNAL_INCLUDES ${ZLIB_INCLUDE_DIR})
2956+ endif()
2957+ endif()
2958+
2959+ if(HAVE_LIBZ)
2960+ if(FLTK_PNG)
2961+ set_config_option(HAVE_LIBPNG "Png[fltk]")
2962+ else()
2963+ find_package(PNG)
2964+ if(PNG_FOUND)
2965+ set_config_option(HAVE_LIBPNG "Png")
2966+ list(APPEND EXTERNAL_LIBRARIES ${PNG_LIBRARIES})
2967+ list(APPEND EXTERNAL_INCLUDES ${PNG_INCLUDE_DIR})
2968+ endif()
2969+ endif()
2970+ endif()
2971+
2972+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/mpeg_encode AND
2973+ ENABLE_MPEG_ENCODE)
2974+ add_subdirectory(contrib/mpeg_encode)
2975+ include_directories(contrib/mpeg_encode/headers)
2976+ set_config_option(HAVE_MPEG_ENCODE "Mpeg")
2977+ endif()
2978+
2979+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/3M AND ENABLE_3M)
2980+ add_subdirectory(contrib/3M)
2981+ include_directories(contrib/3M)
2982+ set_config_option(HAVE_3M "3M")
2983+ endif()
2984+
2985+ if(ENABLE_OSMESA)
2986+ find_library(OSMESA_LIB OSMesa)
2987+ if(OSMESA_LIB)
2988+ set_config_option(HAVE_OSMESA "OSMesa")
2989+ list(APPEND EXTERNAL_LIBRARIES ${OSMESA_LIB})
2990+ endif()
2991+ endif()
2992+
2993+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Graphics)
2994+ set(OpenGL_GL_PREFERENCE "LEGACY")
2995+ find_package(OpenGL REQUIRED)
2996+ if(OPENGL_GLU_FOUND AND OPENGL_FOUND)
2997+ add_subdirectory(Graphics)
2998+ set_config_option(HAVE_OPENGL "OpenGL")
2999+ else()
3000+ message(SEND_ERROR "Could not find GLU: disabling OpenGL support")
3001+ endif()
3002+ endif()
3003+endif()
3004+
3005+if(ENABLE_ANN)
3006+ find_library(ANN_LIB ANN PATH_SUFFIXES lib)
3007+ find_path(ANN_INC "ANN.h" PATH_SUFFIXES src include ANN)
3008+ if(ENABLE_SYSTEM_CONTRIB AND ANN_LIB AND ANN_INC)
3009+ message(STATUS "Using system version of ANN")
3010+ list(APPEND EXTERNAL_LIBRARIES ${ANN_LIB})
3011+ list(APPEND EXTERNAL_INCLUDES ${ANN_INC})
3012+ set_config_option(HAVE_ANN "Ann[system]")
3013+ elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/ANN)
3014+ add_subdirectory(contrib/ANN)
3015+ include_directories(contrib/ANN/include)
3016+ set_config_option(HAVE_ANN "Ann")
3017+ endif()
3018+endif()
3019+
3020+if(ENABLE_ALGLIB)
3021+ find_library(ALGLIB_LIB alglib PATH_SUFFIXES lib)
3022+ find_path(ALGLIB_INC "stdafx.h" PATH_SUFFIXES include)
3023+ if(ENABLE_SYSTEM_CONTRIB AND ALGLIB_LIB AND ALGLIB_INC)
3024+ list(APPEND EXTERNAL_LIBRARIES ${ALGLIB_LIB})
3025+ list(APPEND EXTERNAL_INCLUDES ${ALGLIB_INC})
3026+ set_config_option(HAVE_ALGLIB "ALGLIB[system]")
3027+ elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/ALGLIB)
3028+ add_subdirectory(contrib/ALGLIB)
3029+ include_directories(contrib/ALGLIB)
3030+ set_config_option(HAVE_ALGLIB "ALGLIB")
3031+ endif()
3032+endif()
3033+
3034+if(HAVE_FLTK AND ENABLE_CAIRO)
3035+ find_library(CAIRO_LIB cairo)
3036+ find_path(CAIRO_INC "cairo/cairo.h" PATH_SUFFIXES include)
3037+ if(CAIRO_INC AND CAIRO_LIB)
3038+ set_config_option(HAVE_CAIRO "Cairo")
3039+ list(APPEND EXTERNAL_LIBRARIES ${CAIRO_LIB})
3040+ list(APPEND EXTERNAL_INCLUDES ${CAIRO_INC})
3041+ endif()
3042+endif()
3043+
3044+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/DiscreteIntegration AND
3045+ ENABLE_DINTEGRATION)
3046+ add_subdirectory(contrib/DiscreteIntegration)
3047+ include_directories(contrib/DiscreteIntegration)
3048+ set_config_option(HAVE_DINTEGRATION "DIntegration")
3049+endif()
3050+
3051+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/HighOrderMeshOptimizer AND
3052+ EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MeshOptimizer AND
3053+ EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MeshQualityOptimizer AND
3054+ ENABLE_OPTHOM AND HAVE_MESH)
3055+ add_subdirectory(contrib/HighOrderMeshOptimizer)
3056+ include_directories(contrib/HighOrderMeshOptimizer)
3057+ add_subdirectory(contrib/MeshOptimizer)
3058+ include_directories(contrib/MeshOptimizer)
3059+ include_directories(${CMAKE_CURRENT_BINARY_DIR}/contrib/MeshOptimizer)
3060+ add_subdirectory(contrib/MeshQualityOptimizer)
3061+ include_directories(contrib/MeshQualityOptimizer)
3062+ set_config_option(HAVE_OPTHOM "OptHom")
3063+endif()
3064+
3065+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/domhex AND
3066+ ENABLE_DOMHEX AND HAVE_MESH)
3067+ add_subdirectory(contrib/domhex)
3068+ include_directories(contrib/domhex)
3069+ set_config_option(HAVE_DOMHEX "DomHex")
3070+endif()
3071+
3072+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/QuadTri AND
3073+ ENABLE_QUADTRI AND HAVE_MESH)
3074+ add_subdirectory(contrib/QuadTri)
3075+ include_directories(contrib/QuadTri)
3076+ set_config_option(HAVE_QUADTRI "QuadTri")
3077+endif()
3078+
3079+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/kbipack AND ENABLE_KBIPACK)
3080+ set_config_option(HAVE_KBIPACK "Kbipack")
3081+ add_subdirectory(contrib/kbipack)
3082+ include_directories(contrib/kbipack)
3083+ if(ENABLE_GMP)
3084+ find_library(GMP_LIB libgmp.a)
3085+ find_path(GMP_INC "gmp.h" PATH_SUFFIXES src include)
3086+ endif()
3087+ if(GMP_LIB AND GMP_INC)
3088+ set_config_option(HAVE_GMP "GMP")
3089+ list(APPEND EXTERNAL_LIBRARIES ${GMP_LIB})
3090+ list(APPEND EXTERNAL_INCLUDES ${GMP_INC})
3091+ else()
3092+ message(STATUS "GMP not found: Kbipack uses long int")
3093+ endif()
3094+endif()
3095+
3096+if(ENABLE_MATHEX)
3097+ find_library(MATHEX_LIB mathex PATH_SUFFIXES lib)
3098+ find_path(MATHEX_INC "mathex.h" PATH_SUFFIXES src include)
3099+ if(ENABLE_SYSTEM_CONTRIB AND MATHEX_LIB AND MATHEX_INC)
3100+ list(APPEND EXTERNAL_LIBRARIES ${MATHEX_LIB})
3101+ list(APPEND EXTERNAL_INCLUDES ${MATHEX_INC})
3102+ set_config_option(HAVE_MATHEX "MathEx[system]")
3103+ elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MathEx)
3104+ add_subdirectory(contrib/MathEx)
3105+ include_directories(contrib/MathEx)
3106+ set_config_option(HAVE_MATHEX "MathEx")
3107+ endif()
3108+endif()
3109+
3110+if(ENABLE_MPI)
3111+ find_package(MPI)
3112+ if(MPI_FOUND)
3113+ set_config_option(HAVE_MPI "MPI")
3114+ list(APPEND EXTERNAL_INCLUDES ${MPI_CXX_INCLUDE_PATH})
3115+ list(APPEND EXTERNAL_LIBRARIES ${MPI_CXX_LIBRARIES})
3116+ set(CMAKE_C_COMPILER ${MPI_C_COMPILER})
3117+ set(CMAKE_CXX_COMPILER ${MPI_CXX_COMPILER})
3118+ set(CMAKE_Fortran_COMPILER ${MPI_Fortran_COMPILER})
3119+ endif()
3120+endif()
3121+
3122+if(ENABLE_POPPLER)
3123+ find_library(POPPLER_LIB poppler)
3124+ find_library(POPPLER_CPP_LIB poppler-cpp)
3125+ find_path(POPPLER_INC "poppler/cpp/poppler-document.h" PATH_SUFFIXES src include)
3126+ if(POPPLER_LIB AND POPPLER_INC)
3127+ set_config_option(HAVE_POPPLER "Poppler")
3128+ list(APPEND EXTERNAL_LIBRARIES ${POPPLER_LIB})
3129+ list(APPEND EXTERNAL_LIBRARIES ${POPPLER_CPP_LIB})
3130+ list(APPEND EXTERNAL_INCLUDES ${POPPLER_INC})
3131+ endif()
3132+endif()
3133+
3134+if(ENABLE_P4EST)
3135+ find_library(P4EST_LIB p4est)
3136+ find_path(P4EST_INC "p4est.h" PATH_SUFFIXES src)
3137+ find_library(SC_LIB sc)
3138+ if(P4EST_LIB AND P4EST_INC AND SC_LIB)
3139+ set_config_option(HAVE_P4EST "P4est")
3140+ list(APPEND EXTERNAL_LIBRARIES ${P4EST_LIB} ${SC_LIB})
3141+ list(APPEND EXTERNAL_INCLUDES ${P4EST_INC})
3142+ endif()
3143+endif()
3144+
3145+if(HAVE_MESH OR HAVE_SOLVER)
3146+ if(ENABLE_METIS)
3147+ if(METIS_ROOT)
3148+ find_library(METIS_LIB metis PATHS ${METIS_ROOT} PATH_SUFFIXES lib)
3149+ find_path(METIS_INC "metis.h" PATHS ${METIS_ROOT} PATH_SUFFIXES include)
3150+ list(APPEND EXTERNAL_LIBRARIES ${METIS_LIB})
3151+ list(APPEND EXTERNAL_INCLUDES ${METIS_INC})
3152+ set_config_option(HAVE_METIS "Metis")
3153+ else()
3154+ find_library(METIS_LIB metis PATH_SUFFIXES lib)
3155+ find_path(METIS_INC "metis.h" PATH_SUFFIXES include)
3156+ if(ENABLE_SYSTEM_CONTRIB AND METIS_LIB AND METIS_INC)
3157+ message(STATUS "Using system version of METIS")
3158+ list(APPEND EXTERNAL_LIBRARIES ${METIS_LIB})
3159+ list(APPEND EXTERNAL_INCLUDES ${METIS_INC})
3160+ set_config_option(HAVE_METIS "Metis[system]")
3161+ elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/metis)
3162+ add_definitions(-DUSE_GKREGEX)
3163+ add_subdirectory(contrib/metis)
3164+ include_directories(contrib/metis/include contrib/metis/libmetis
3165+ contrib/metis/GKlib)
3166+ set_config_option(HAVE_METIS "Metis")
3167+ endif()
3168+ endif()
3169+ endif()
3170+endif()
3171+
3172+if(HAVE_MESH)
3173+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Mesh/tetgenBR.cxx)
3174+ set_config_option(HAVE_TETGENBR "TetGen/BR")
3175+ endif()
3176+
3177+ if(ENABLE_VOROPP)
3178+ find_library(VOROPP_LIB voro++ PATH_SUFFIXES lib)
3179+ find_path(VOROPP_INC "voro++.hh" PATH_SUFFIXES include)
3180+ if(ENABLE_SYSTEM_CONTRIB AND VOROPP_LIB AND VOROPP_INC)
3181+ message(STATUS "Using system version of voro++")
3182+ list(APPEND EXTERNAL_LIBRARIES ${VOROPP_LIB})
3183+ list(APPEND EXTERNAL_INCLUDES ${VOROPP_INC})
3184+ set_config_option(HAVE_VOROPP "Voro++[system]")
3185+ elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/voro++)
3186+ add_subdirectory(contrib/voro++)
3187+ include_directories(contrib/voro++/src)
3188+ set_config_option(HAVE_VOROPP "Voro++")
3189+ endif()
3190+ endif()
3191+
3192+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/blossom AND ENABLE_BLOSSOM)
3193+ add_subdirectory(contrib/blossom)
3194+ include_directories(contrib/blossom/MATCH contrib/blossom/concorde97
3195+ contrib/blossom/concorde97/INCLUDE)
3196+ set_config_option(HAVE_BLOSSOM "Blossom")
3197+ endif()
3198+
3199+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/Netgen AND ENABLE_NETGEN)
3200+ add_subdirectory(contrib/Netgen)
3201+ include_directories(contrib/Netgen contrib/Netgen/libsrc/include
3202+ contrib/Netgen/nglib)
3203+ set_config_option(HAVE_NETGEN "Netgen")
3204+ add_definitions(-DNO_PARALLEL_THREADS -DNOTCL)
3205+ endif()
3206+
3207+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/bamg AND ENABLE_BAMG)
3208+ add_subdirectory(contrib/bamg)
3209+ include_directories(contrib/bamg contrib/bamg/bamglib)
3210+ set_config_option(HAVE_BAMG "Bamg")
3211+ endif()
3212+
3213+ if(ENABLE_MMG3D)
3214+ find_library(MMG3D_LIB mmg3d PATH_SUFFIXES lib)
3215+ find_path(MMG3D_INC "libmmg3d.h" PATH_SUFFIXES src include)
3216+ if(ENABLE_SYSTEM_CONTRIB AND MMG3D_LIB AND MMG3D_INC)
3217+ list(APPEND EXTERNAL_LIBRARIES ${MMG3D_LIB})
3218+ list(APPEND EXTERNAL_INCLUDES ${MMG3D_INC})
3219+ set_config_option(HAVE_MMG3D "Mmg3d[system]")
3220+ elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/mmg3d)
3221+ add_subdirectory(contrib/mmg3d)
3222+ include_directories(contrib/mmg3d/build/sources)
3223+ set_config_option(HAVE_MMG3D "Mmg3d")
3224+ endif()
3225+ endif()
3226+endif()
3227+
3228+if(ENABLE_MED OR ENABLE_CGNS)
3229+ find_package(HDF5)
3230+ if(HDF5_FOUND)
3231+ set(HDF5_LIB "${HDF5_C_LIBRARIES}")
3232+ list(APPEND EXTERNAL_INCLUDES ${HDF5_INCLUDE_DIRS})
3233+ if(ENABLE_MED)
3234+ find_library(MED_LIB medC)
3235+ if(MED_LIB)
3236+ set_config_option(HAVE_MED "Med")
3237+ list(APPEND EXTERNAL_LIBRARIES ${MED_LIB})
3238+ endif()
3239+ endif()
3240+ if(ENABLE_CGNS)
3241+ find_library(CGNS_LIB cgns HINTS ENV CGNS_ROOT PATH_SUFFIXES lib)
3242+ find_path(CGNS_INC "cgnslib.h" HINTS ENV CGNS_ROOT PATH_SUFFIXES include)
3243+ if(CGNS_LIB AND CGNS_INC)
3244+ set_config_option(HAVE_LIBCGNS "Cgns")
3245+ list(APPEND EXTERNAL_LIBRARIES ${CGNS_LIB})
3246+ list(APPEND EXTERNAL_INCLUDES ${CGNS_INC})
3247+ if(ENABLE_CGNS_CPEX0045)
3248+ set_config_option(HAVE_LIBCGNS_CPEX0045 "Cgns_CPEX0045")
3249+ endif()
3250+ endif()
3251+ endif()
3252+ if(MED_LIB OR CGNS_LIB)
3253+ list(APPEND EXTERNAL_LIBRARIES ${HDF5_LIB})
3254+ find_library(SZ_LIB NAMES szlib sz)
3255+ if(SZ_LIB)
3256+ list(APPEND EXTERNAL_LIBRARIES ${SZ_LIB})
3257+ endif()
3258+ if(NOT HAVE_LIBZ) # necessary for non-GUI builds
3259+ find_package(ZLIB)
3260+ if(ZLIB_FOUND)
3261+ set_config_option(HAVE_LIBZ "Zlib")
3262+ list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
3263+ endif()
3264+ endif()
3265+ endif()
3266+ else()
3267+ message(STATUS "HDF5 not found")
3268+ endif()
3269+endif()
3270+
3271+if(HAVE_SOLVER)
3272+ if(ENABLE_GMM)
3273+ find_path(GMM_INC "gmm.h" PATH_SUFFIXES src include include/gmm)
3274+ if(ENABLE_SYSTEM_CONTRIB AND GMM_INC)
3275+ message(STATUS "Using system version of GMM")
3276+ list(APPEND EXTERNAL_INCLUDES ${GMM_INC})
3277+ set_config_option(HAVE_GMM "Gmm[system]")
3278+ elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/gmm)
3279+ include_directories(contrib/gmm)
3280+ set_config_option(HAVE_GMM "Gmm")
3281+ endif()
3282+ endif()
3283+
3284+ if(ENABLE_PETSC)
3285+ if(PETSC_DIR)
3286+ set(ENV_PETSC_DIR ${PETSC_DIR})
3287+ else()
3288+ set(ENV_PETSC_DIR $ENV{PETSC_DIR})
3289+ endif()
3290+ if(PETSC_ARCH)
3291+ set(ENV_PETSC_ARCH ${PETSC_ARCH})
3292+ else()
3293+ set(ENV_PETSC_ARCH $ENV{PETSC_ARCH})
3294+ endif()
3295+ set(PETSC_POSSIBLE_CONF_FILES
3296+ ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/conf/petscvariables
3297+ ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib/petsc-conf/petscvariables
3298+ ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib/petsc/conf/petscvariables)
3299+ foreach(FILE ${PETSC_POSSIBLE_CONF_FILES})
3300+ if(EXISTS ${FILE})
3301+ # old-style PETSc installations (using PETSC_DIR and PETSC_ARCH)
3302+ message(STATUS "Using PETSc dir: ${ENV_PETSC_DIR}")
3303+ message(STATUS "Using PETSc arch: ${ENV_PETSC_ARCH}")
3304+ # find includes by parsing the petscvariables file
3305+ file(STRINGS ${FILE} PETSC_VARIABLES NEWLINE_CONSUME)
3306+ endif()
3307+ endforeach()
3308+ if(PETSC_VARIABLES)
3309+ # try to find PETSC_CC_INCLUDES for PETSc >= 3.4
3310+ string(REGEX MATCH "PETSC_CC_INCLUDES = [^\n\r]*" PETSC_PACKAGES_INCLUDES
3311+ ${PETSC_VARIABLES})
3312+ if(PETSC_PACKAGES_INCLUDES)
3313+ string(REPLACE "PETSC_CC_INCLUDES = " "" PETSC_PACKAGES_INCLUDES
3314+ ${PETSC_PACKAGES_INCLUDES})
3315+ else()
3316+ # try to find PETSC_PACKAGES_INCLUDES in older versions
3317+ list(APPEND EXTERNAL_INCLUDES ${ENV_PETSC_DIR}/include)
3318+ list(APPEND EXTERNAL_INCLUDES ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/include)
3319+ string(REGEX MATCH "PACKAGES_INCLUDES = [^\n\r]*" PETSC_PACKAGES_INCLUDES
3320+ ${PETSC_VARIABLES})
3321+ string(REPLACE "PACKAGES_INCLUDES = " "" PETSC_PACKAGES_INCLUDES
3322+ ${PETSC_PACKAGES_INCLUDES})
3323+ endif()
3324+ if(PETSC_PACKAGES_INCLUDES)
3325+ if(PETSC_PACKAGES_INCLUDES)
3326+ string(REPLACE "-I" "" PETSC_PACKAGES_INCLUDES ${PETSC_PACKAGES_INCLUDES})
3327+ string(REPLACE " " ";" PETSC_PACKAGES_INCLUDES ${PETSC_PACKAGES_INCLUDES})
3328+ foreach(VAR ${PETSC_PACKAGES_INCLUDES})
3329+ # seem to include unexisting directories (/usr/include/lib64)
3330+ # check to avoid warnings
3331+ if(EXISTS ${VAR})
3332+ list(APPEND EXTERNAL_INCLUDES ${VAR})
3333+ endif()
3334+ endforeach()
3335+ endif()
3336+ endif()
3337+ # find libraries (<= 3.0)
3338+ set(PETSC_LIBS_REQUIRED petscksp petscdm petscmat petscvec petsc)
3339+ find_all_libraries(PETSC_LIBS PETSC_LIBS_REQUIRED
3340+ ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib "")
3341+ # petsc 3.1 creates only one library (libpetsc)
3342+ if(NOT PETSC_LIBS)
3343+ find_library(PETSC_LIBS petsc PATHS ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib
3344+ NO_DEFAULT_PATH)
3345+ endif()
3346+ if(PETSC_LIBS)
3347+ set_config_option(HAVE_PETSC "PETSc")
3348+ if(NOT HAVE_BLAS)
3349+ set_config_option(HAVE_BLAS "Blas[petsc]")
3350+ endif()
3351+ if(NOT HAVE_LAPACK)
3352+ set_config_option(HAVE_LAPACK "Lapack[petsc]")
3353+ endif()
3354+ endif()
3355+ # find slepc (needs to be linked in before petsc)
3356+ if(ENABLE_SLEPC)
3357+ if(SLEPC_DIR)
3358+ set(ENV_SLEPC_DIR ${SLEPC_DIR})
3359+ else()
3360+ set(ENV_SLEPC_DIR $ENV{SLEPC_DIR})
3361+ endif()
3362+ find_library(SLEPC_LIB slepc PATHS ${ENV_SLEPC_DIR}/${ENV_PETSC_ARCH}/lib
3363+ NO_DEFAULT_PATH)
3364+ if(SLEPC_LIB)
3365+ find_path(SLEPC_INC "slepc.h" PATHS ${ENV_SLEPC_DIR} PATH_SUFFIXES include
3366+ ${ENV_PETSC_ARCH}/include include/slepc NO_DEFAULT_PATH)
3367+ if(SLEPC_INC)
3368+ message(STATUS "Using SLEPc dir: ${ENV_SLEPC_DIR}")
3369+ set_config_option(HAVE_SLEPC "SLEPc")
3370+ list(APPEND EXTERNAL_LIBRARIES ${SLEPC_LIB})
3371+ list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC})
3372+ find_path(SLEPC_INC2 "slepcconf.h" PATHS ${ENV_SLEPC_DIR}
3373+ PATH_SUFFIXES ${ENV_PETSC_ARCH}/include NO_DEFAULT_PATH)
3374+ if(SLEPC_INC2)
3375+ list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC2})
3376+ endif()
3377+ endif()
3378+ endif()
3379+ endif()
3380+ list(APPEND EXTERNAL_LIBRARIES ${PETSC_LIBS})
3381+ # find additional libraries to link with
3382+ string(REGEX MATCH "PACKAGES_LIBS = [^\n\r]*" PLIBS ${PETSC_VARIABLES})
3383+ if(PLIBS)
3384+ string(REPLACE "PACKAGES_LIBS = " "" PLIBS ${PLIBS})
3385+ string(STRIP ${PLIBS} PLIBS)
3386+ list(APPEND EXTERNAL_LIBRARIES "${PLIBS}")
3387+ endif()
3388+ string(REGEX MATCH "PETSC_EXTERNAL_LIB_BASIC = [^\n\r]*" PLIBS_BASIC ${PETSC_VARIABLES})
3389+ if(PLIBS_BASIC)
3390+ string(REPLACE "PETSC_EXTERNAL_LIB_BASIC = " "" PLIBS_BASIC ${PLIBS_BASIC})
3391+ string(STRIP ${PLIBS_BASIC} PLIBS_BASIC)
3392+ separate_arguments(PLIBS_BASIC)
3393+ list(APPEND EXTERNAL_LIBRARIES "${PLIBS_BASIC}")
3394+ endif()
3395+ string(REGEX MATCH "PCC_LINKER_LIBS = [^\n\r]*" LLIBS ${PETSC_VARIABLES})
3396+ if(LLIBS)
3397+ string(REPLACE "PCC_LINKER_LIBS = " "" LLIBS ${LLIBS})
3398+ string(STRIP ${LLIBS} LLIBS)
3399+ list(APPEND EXTERNAL_LIBRARIES "${LLIBS}")
3400+ endif()
3401+ else()
3402+ # new-style PETSc installations (in standard system directories)
3403+ find_library(PETSC_LIBS petsc)
3404+ find_path(PETSC_INC "petsc.h" PATH_SUFFIXES include/petsc)
3405+ if(PETSC_LIBS AND PETSC_INC)
3406+ set_config_option(HAVE_PETSC "PETSc")
3407+ if(ENABLE_SLEPC)
3408+ find_library(SLEPC_LIB slepc)
3409+ find_path(SLEPC_INC "slepc.h" PATH_SUFFIXES include/slepc)
3410+ if(SLEPC_LIB AND SLEPC_INC)
3411+ set_config_option(HAVE_SLEPC "SLEPc")
3412+ list(APPEND EXTERNAL_LIBRARIES ${SLEPC_LIB})
3413+ list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC})
3414+ endif()
3415+ endif()
3416+ list(APPEND EXTERNAL_LIBRARIES ${PETSC_LIBS})
3417+ list(APPEND EXTERNAL_INCLUDES ${PETSC_INC})
3418+ endif()
3419+ endif()
3420+ endif()
3421+
3422+ if(ENABLE_MUMPS AND HAVE_BLAS AND HAVE_LAPACK)
3423+ set(MUMPS_LIBS_REQUIRED smumps dmumps cmumps zmumps mumps_common pord)
3424+ if(NOT ENABLE_MPI)
3425+ list(APPEND MUMPS_LIBS_REQUIRED mpiseq)
3426+ endif()
3427+ find_all_libraries(MUMPS_LIBRARIES MUMPS_LIBS_REQUIRED "" "lib")
3428+ find_path(SMUMPS_INC "smumps_c.h" PATH_SUFFIXES src include)
3429+ find_path(DMUMPS_INC "dmumps_c.h" PATH_SUFFIXES src include)
3430+ find_path(CMUMPS_INC "cmumps_c.h" PATH_SUFFIXES src include)
3431+ find_path(ZMUMPS_INC "zmumps_c.h" PATH_SUFFIXES src include)
3432+ if(MUMPS_LIBRARIES AND SMUMPS_INC AND DMUMPS_INC AND CMUMPS_INC AND ZMUMPS_INC)
3433+ set_config_option(HAVE_MUMPS "MUMPS")
3434+ list(APPEND EXTERNAL_LIBRARIES ${MUMPS_LIBRARIES})
3435+ list(APPEND EXTERNAL_INCLUDES ${SMUMPS_INC})
3436+ list(APPEND EXTERNAL_INCLUDES ${DMUMPS_INC})
3437+ list(APPEND EXTERNAL_INCLUDES ${CMUMPS_INC})
3438+ list(APPEND EXTERNAL_INCLUDES ${ZMUMPS_INC})
3439+ find_library(GFORTRAN_LIB gfortran)
3440+ if(GFORTRAN_LIB)
3441+ list(APPEND EXTERNAL_LIBRARIES ${GFORTRAN_LIB})
3442+ endif()
3443+ if(ENABLE_GMM) # use GMM/MUMPS interface
3444+ add_definitions(-DGMM_USES_MUMPS)
3445+ endif()
3446+ endif()
3447+ endif()
3448+
3449+ if(ENABLE_GETDP)
3450+ find_library(GETDP_LIB GetDP)
3451+ find_path(GETDP_INC "GetDP.h" PATH_SUFFIXES getdp)
3452+ if(GETDP_LIB AND GETDP_INC)
3453+ set_config_option(HAVE_GETDP "GetDP")
3454+ list(APPEND EXTERNAL_LIBRARIES ${GETDP_LIB})
3455+ list(APPEND EXTERNAL_INCLUDES ${GETDP_INC})
3456+ endif()
3457+ endif()
3458+endif()
3459+
3460+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt AND
3461+ ENABLE_HXT AND HAVE_METIS)
3462+ set_config_option(HAVE_HXT "Hxt")
3463+ add_subdirectory(contrib/hxt)
3464+ include_directories(BEFORE contrib/hxt)
3465+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt/hxt_tetDelaunay.c)
3466+ set_config_option(HAVE_HXT3D "Hxt3D")
3467+ endif()
3468+ if(MSVC)
3469+ # Visual C++ does not support C99 - force compilation as C++ code
3470+ file(GLOB_RECURSE HXT_SRC contrib/hxt/*.c)
3471+ set_compile_flags(HXT_SRC "/TP")
3472+ endif()
3473+ check_include_file("immintrin.h" HAVE_IMMINTRIN_H)
3474+ if(NOT HAVE_IMMINTRIN_H)
3475+ add_definitions(-DHAVE_NO_IMMINTRIN_H)
3476+ endif()
3477+ if(HAVE_PETSC)
3478+ add_definitions(-DHXT_HAVE_PETSC)
3479+ endif()
3480+ if(CMAKE_C_COMPILER MATCHES "pgi")
3481+ add_definitions(-DHAVE_NO_OPENMP_SIMD)
3482+ endif()
3483+endif()
3484+
3485+if(ENABLE_OCC)
3486+ set(OCC_MINIMAL_VERSION "6.9.1")
3487+ if(WIN32)
3488+ if(HAVE_64BIT_SIZE_T)
3489+ set(OCC_SYS_NAME win64)
3490+ else()
3491+ set(OCC_SYS_NAME win32)
3492+ endif()
3493+ else()
3494+ set(OCC_SYS_NAME ${CMAKE_SYSTEM_NAME})
3495+ endif()
3496+ find_path(OCC_INC "Standard_Version.hxx" HINTS ENV CASROOT PATH_SUFFIXES
3497+ inc include include/oce opencascade include/opencascade
3498+ occt include/occt)
3499+ if(OCC_INC)
3500+ file(STRINGS ${OCC_INC}/Standard_Version.hxx
3501+ OCC_MAJOR REGEX "#define OCC_VERSION_MAJOR.*")
3502+ file(STRINGS ${OCC_INC}/Standard_Version.hxx
3503+ OCC_MINOR REGEX "#define OCC_VERSION_MINOR.*")
3504+ file(STRINGS ${OCC_INC}/Standard_Version.hxx
3505+ OCC_MAINT REGEX "#define OCC_VERSION_MAINTENANCE.*")
3506+ if(OCC_MAJOR AND OCC_MINOR AND OCC_MAINT)
3507+ string(REGEX MATCH "[0-9]+" OCC_MAJOR "${OCC_MAJOR}")
3508+ string(REGEX MATCH "[0-9]+" OCC_MINOR "${OCC_MINOR}")
3509+ string(REGEX MATCH "[0-9]+" OCC_MAINT "${OCC_MAINT}")
3510+ set(OCC_VERSION "${OCC_MAJOR}.${OCC_MINOR}.${OCC_MAINT}")
3511+ message(STATUS "Found OpenCASCADE version ${OCC_VERSION} in ${OCC_INC}")
3512+ endif()
3513+ endif()
3514+ if(OCC_VERSION AND OCC_VERSION STRLESS ${OCC_MINIMAL_VERSION})
3515+ message(WARNING "Gmsh requires OpenCASCADE >= ${OCC_MINIMAL_VERSION}. "
3516+ "Use CMAKE_PREFIX_PATH or the CASROOT environment variable "
3517+ "to explicitely specify the installation path of OpenCASCADE")
3518+ elseif(OCC_INC)
3519+ set(OCC_LIBS_REQUIRED
3520+ # subset of DataExchange
3521+ TKSTEP TKSTEP209 TKSTEPAttr TKSTEPBase TKIGES TKXSBase
3522+ # ModelingAlgorithms
3523+ TKOffset TKFeat TKFillet TKBool TKMesh TKHLR TKBO TKPrim TKShHealing
3524+ TKTopAlgo TKGeomAlgo
3525+ # ModelingData
3526+ TKBRep TKGeomBase TKG3d TKG2d
3527+ # FoundationClasses
3528+ TKMath TKernel)
3529+ if(ENABLE_OCC_TBB)
3530+ list(APPEND OCC_LIBS_REQUIRED tbb tbbmalloc)
3531+ endif()
3532+ list(LENGTH OCC_LIBS_REQUIRED NUM_OCC_LIBS_REQUIRED)
3533+ if(OCC_LIBS)
3534+ message(STATUS "OCC libraries specified explicitly: " ${OCC_LIBS})
3535+ list(LENGTH OCC_LIBS_REQUIRED NUM_OCC_LIBS)
3536+ else()
3537+ set(OCC_LIBS)
3538+ foreach(OCC ${OCC_LIBS_REQUIRED})
3539+ if(ENABLE_OCC_STATIC)
3540+ set(LIBNAME lib${OCC}.a)
3541+ else()
3542+ set(LIBNAME ${OCC})
3543+ endif()
3544+ find_library(OCC_LIB ${LIBNAME} HINTS ENV CASROOT PATH_SUFFIXES
3545+ lib ${OCC_SYS_NAME}/lib ${OCC_SYS_NAME}/vc8/lib)
3546+ if(OCC_LIB)
3547+ list(APPEND OCC_LIBS ${OCC_LIB})
3548+ else()
3549+ message(STATUS "OCC lib " ${LIBNAME} " not Found")
3550+ endif()
3551+ unset(OCC_LIB CACHE)
3552+ endforeach()
3553+ list(LENGTH OCC_LIBS NUM_OCC_LIBS)
3554+ endif()
3555+ endif()
3556+
3557+ # additional OCC libraries to handle reading of STEP/IGES attributes. Oh my...
3558+ if(ENABLE_OCC_CAF)
3559+ find_package(Freetype)
3560+ if(FREETYPE_FOUND)
3561+ set(OCC_CAF_LIBS_REQUIRED
3562+ TKXDESTEP TKXDEIGES TKXCAF TKLCAF TKVCAF TKCAF TKV3d TKService TKCDF)
3563+ list(LENGTH OCC_CAF_LIBS_REQUIRED NUM_OCC_CAF_LIBS_REQUIRED)
3564+ set(OCC_CAF_LIBS)
3565+ foreach(OCC ${OCC_CAF_LIBS_REQUIRED})
3566+ find_library(OCC_CAF_LIB ${OCC} HINTS ENV CASROOT PATH_SUFFIXES
3567+ lib ${OCC_SYS_NAME}/lib ${OCC_SYS_NAME}/vc8/lib)
3568+ if(OCC_CAF_LIB)
3569+ list(APPEND OCC_CAF_LIBS ${OCC_CAF_LIB})
3570+ else()
3571+ message(STATUS "OCC CAF lib " ${OCC} " not Found")
3572+ endif()
3573+ unset(OCC_CAF_LIB CACHE)
3574+ endforeach()
3575+ list(LENGTH OCC_CAF_LIBS NUM_OCC_CAF_LIBS)
3576+ endif()
3577+ endif()
3578+
3579+ # append OCC CAF libraries first...
3580+ if(NUM_OCC_CAF_LIBS EQUAL NUM_OCC_CAF_LIBS_REQUIRED)
3581+ set_config_option(HAVE_OCC_CAF "OpenCASCADE-CAF")
3582+ list(APPEND EXTERNAL_LIBRARIES ${OCC_CAF_LIBS} ${FREETYPE_LIBRARIES})
3583+ list(APPEND EXTERNAL_INCLUDES ${FREETYPE_INCLUDE_DIRS})
3584+ if(WIN32)
3585+ list(APPEND EXTERNAL_LIBRARIES "windowscodecs")
3586+ list(APPEND EXTERNAL_LIBRARIES "ole32")
3587+ endif()
3588+ endif()
3589+
3590+ # then append OCC libraries
3591+ if(NUM_OCC_LIBS EQUAL NUM_OCC_LIBS_REQUIRED)
3592+ set_config_option(HAVE_OCC "OpenCASCADE")
3593+ list(APPEND EXTERNAL_LIBRARIES ${OCC_LIBS})
3594+ list(APPEND EXTERNAL_INCLUDES ${OCC_INC})
3595+ if(HAVE_64BIT_SIZE_T)
3596+ add_definitions(-D_OCC64)
3597+ endif()
3598+ if(WIN32)
3599+ list(APPEND EXTERNAL_LIBRARIES "winspool")
3600+ add_definitions(-DOCC_CONVERT_SIGNALS)
3601+ elseif(MSVC)
3602+ add_definitions(-DWNT)
3603+ endif()
3604+ endif()
3605+endif()
3606+
3607+if(ENABLE_ACIS)
3608+ find_library(ACIS_LIB SpaACIS PATH_SUFFIXES bin/maci386)
3609+ if(ACIS_LIB)
3610+ find_path(ACIS_INC "kernapi.hxx" PATH_SUFFIXES include)
3611+ if(ACIS_INC)
3612+ set_config_option(HAVE_ACIS "Acis")
3613+ list(APPEND EXTERNAL_LIBRARIES ${ACIS_LIB})
3614+ list(APPEND EXTERNAL_INCLUDES ${ACIS_INC})
3615+ endif()
3616+ endif()
3617+endif()
3618+
3619+if(ENABLE_ZIPPER)
3620+ if(ENABLE_BUILD_IOS)
3621+ set_config_option(HAVE_LIBZ "Zlib")
3622+ endif()
3623+ if(NOT HAVE_LIBZ) # necessary for non-GUI builds
3624+ find_package(ZLIB)
3625+ if(ZLIB_FOUND)
3626+ set_config_option(HAVE_LIBZ "Zlib")
3627+ list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
3628+ list(APPEND EXTERNAL_INCLUDES ${ZLIB_INCLUDE_DIR})
3629+ endif()
3630+ endif()
3631+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/zipper AND HAVE_LIBZ)
3632+ add_subdirectory(contrib/zipper)
3633+ include_directories(contrib/zipper)
3634+ set_config_option(HAVE_ZIPPER "Zipper")
3635+ endif()
3636+endif()
3637+
3638+if(ENABLE_PRIVATE_API AND ENABLE_WRAP_PYTHON)
3639+ find_package(SWIG REQUIRED)
3640+ include(${SWIG_USE_FILE})
3641+ find_package(PythonLibs)
3642+ if(SWIG_FOUND AND PYTHONLIBS_FOUND)
3643+ message(STATUS "Found SWIG version " ${SWIG_VERSION})
3644+ find_package(PythonInterp)
3645+ string(SUBSTRING ${SWIG_VERSION} 0 1 SWIG_MAJOR_VERSION)
3646+ if(SWIG_MAJOR_VERSION EQUAL 1)
3647+ message(WARNING "Python bindings require SWIG >= 2: disabling Python")
3648+ else()
3649+ set_config_option(HAVE_PYTHON "Python")
3650+ mark_as_advanced(CLEAR PYTHON_LIBRARY PYTHON_INCLUDE_DIR)
3651+ if(ENABLE_NUMPY)
3652+ if (NOT NUMPY_INC)
3653+ EXEC_PROGRAM (${PYTHON_EXECUTABLE}
3654+ ARGS "-c \"import numpy; print(numpy.get_include())\""
3655+ OUTPUT_VARIABLE NUMPY_INC
3656+ RETURN_VALUE NUMPY_NOT_FOUND)
3657+ endif()
3658+ if(NUMPY_INC)
3659+ list(APPEND EXTERNAL_INCLUDES ${NUMPY_INC})
3660+ set_config_option(HAVE_NUMPY "Numpy")
3661+ endif()
3662+ endif()
3663+ if(HAVE_PETSC)
3664+ if(ENABLE_PETSC4PY)
3665+ EXECUTE_PROCESS(
3666+ COMMAND ${PYTHON_EXECUTABLE} -c "import petsc4py; print(petsc4py.get_include())"
3667+ OUTPUT_VARIABLE PETSC4PY_INC
3668+ RESULT_VARIABLE PETSC4PY_NOT_FOUND
3669+ ERROR_QUIET
3670+ OUTPUT_STRIP_TRAILING_WHITESPACE)
3671+ if(PETSC4PY_INC)
3672+ list(APPEND EXTERNAL_INCLUDES ${PETSC4PY_INC})
3673+ set_config_option(HAVE_PETSC4PY "PETSc4py")
3674+ endif()
3675+ endif()
3676+ endif()
3677+ endif()
3678+ endif()
3679+endif()
3680+
3681+check_function_exists(vsnprintf HAVE_VSNPRINTF)
3682+if(NOT HAVE_VSNPRINTF AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
3683+ set_config_option(HAVE_NO_VSNPRINTF "NoVsnprintf")
3684+endif()
3685+
3686+check_include_file(sys/socket.h HAVE_SYS_SOCKET_H)
3687+if(HAVE_SYS_SOCKET_H)
3688+ set(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h)
3689+endif()
3690+check_type_size(socklen_t SOCKLEN_T_SIZE)
3691+set(CMAKE_EXTRA_INCLUDE_FILES)
3692+if(NOT SOCKLEN_T_SIZE AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
3693+ set_config_option(HAVE_NO_SOCKLEN_T "NoSocklenT")
3694+endif()
3695+
3696+check_include_file(stdint.h HAVE_STDINT_H)
3697+if(HAVE_STDINT_H)
3698+ set(CMAKE_EXTRA_INCLUDE_FILES stdint.h)
3699+else()
3700+ set_config_option(HAVE_NO_STDINT_H "NoStdintH")
3701+endif()
3702+check_type_size(intptr_t INTPTR_T_SIZE)
3703+set(CMAKE_EXTRA_INCLUDE_FILES)
3704+if(NOT INTPTR_T_SIZE AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
3705+ set_config_option(HAVE_NO_INTPTR_T "NoIntptrT")
3706+endif()
3707+
3708+check_include_file(dlfcn.h DLFCN_H)
3709+if(DLFCN_H)
3710+ set_config_option(HAVE_DLOPEN "Dlopen")
3711+ list(APPEND EXTERNAL_LIBRARIES ${CMAKE_DL_LIBS})
3712+endif()
3713+
3714+if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
3715+ check_include_file(linux/joystick.h LINUX_JOYSTICK_H)
3716+ if(LINUX_JOYSTICK_H)
3717+ set_config_option(HAVE_LINUX_JOYSTICK "LinuxJoystick")
3718+ endif()
3719+endif()
3720+
3721+if(WIN32)
3722+ add_definitions(-D_USE_MATH_DEFINES)
3723+ list(APPEND EXTERNAL_LIBRARIES winmm wsock32 ws2_32 psapi)
3724+endif()
3725+
3726+if(MSVC)
3727+ add_definitions(-DNOMINMAX -D_CRT_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_DEPRECATE)
3728+endif()
3729+
3730+# add C functions API
3731+set(GMSH_SRC ${GMSH_SRC};api/gmshc.cpp)
3732+
3733+# force full warnings to encourage everybody to write clean(er) code
3734+check_cxx_compiler_flag("-Wall" WALL)
3735+if(WALL AND NOT MSVC)
3736+ file(GLOB_RECURSE WALL_SRC Common/*.cpp Fltk/*.cpp FunctionSpace/*.cpp
3737+ Geo/*.cpp Graphics/*.cpp Mesh/*.cpp Numeric/*.cpp Parser/*.cpp
3738+ Plugin/*.cpp Post/*.cpp Solver/*.cpp)
3739+ set(WF "-Wall")
3740+ check_cxx_compiler_flag("-Wint-to-void-pointer-cast" WCAST)
3741+ if(WCAST)
3742+ set(WF "${WF} -Wno-int-to-void-pointer-cast")
3743+ endif()
3744+ check_cxx_compiler_flag("-Wdeprecated-declarations" WDEPREC)
3745+ if(WDEPREC)
3746+ # FIXME: remove this when we have fixed the deprecated GLU code for OpenGL3
3747+ set(WF "${WF} -Wno-deprecated-declarations")
3748+ endif()
3749+ check_cxx_compiler_flag("-Wmisleading-indentation" WIND)
3750+ if(WIND)
3751+ set(WF "${WF} -Wno-misleading-indentation")
3752+ endif()
3753+ set_compile_flags(WALL_SRC ${WF})
3754+endif()
3755+
3756+# don't issue warnings for contributed libraries
3757+check_cxx_compiler_flag("-w" NOWARN)
3758+if(NOWARN)
3759+ file(GLOB_RECURSE NOWARN_SRC contrib/*.cpp contrib/*.cc contrib/*.cxx contrib/*.c)
3760+ set_compile_flags(NOWARN_SRC "-w")
3761+endif()
3762+
3763+# disable compile optimization on some known problematic files
3764+check_cxx_compiler_flag("-O0" NOOPT)
3765+if(NOOPT OR ENABLE_BUILD_IOS)
3766+ if(ENABLE_BUILD_IOS) # optimized iOS 10 64 bits screws somewhere in Geo
3767+ file(GLOB_RECURSE NOOPT_SRC Numeric/robustPredicates.cpp Geo/G*.cpp Mesh/BDS.cpp
3768+ Parser/Gmsh.tab.cpp contrib/blossom/* Mesh/Background*)
3769+ else()
3770+ file(GLOB_RECURSE NOOPT_SRC Numeric/robustPredicates.cpp Mesh/BDS.cpp
3771+ Parser/Gmsh.tab.cpp contrib/blossom/* contrib/bamg/* Mesh/Background*)
3772+ endif()
3773+ set_compile_flags(NOOPT_SRC "-O0")
3774+endif()
3775+
3776+# do not use arithmetic contraction in predicates.cpp
3777+# if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
3778+# set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
3779+# COMPILE_FLAGS "/fp:strict")
3780+# elseif(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
3781+# set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
3782+# COMPILE_FLAGS "-fno-unsafe-math-optimizations -ffp-contract=off")
3783+# elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel")
3784+# set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
3785+# COMPILE_FLAGS "-fp-model strict")
3786+# endif()
3787+
3788+# enable Revoropt and set compile flags for the corresponding plugin
3789+if(ENABLE_REVOROPT)
3790+ find_path(EIGEN3_INC "eigen3/Eigen/Dense")
3791+ if(EIGEN3_INC AND HAVE_MESH AND HAVE_PLUGINS AND HAVE_ANN AND HAVE_ALGLIB)
3792+ list(APPEND EXTERNAL_INCLUDES ${EIGEN3_INC} contrib/Revoropt/include)
3793+ message(STATUS "using contrib/Revoropt")
3794+ set_config_option(HAVE_REVOROPT "Revoropt")
3795+ add_definitions(-DUSE_ANN)
3796+ get_source_file_property(PROP Plugin/CVTRemesh.cpp COMPILE_FLAGS)
3797+ if(PROP)
3798+ set_source_files_properties(Plugin/CVTRemesh.cpp PROPERTIES
3799+ COMPILE_FLAGS "${PROP} -std=c++11")
3800+ else()
3801+ set_source_files_properties(Plugin/CVTRemesh.cpp PROPERTIES
3802+ COMPILE_FLAGS "-std=c++11")
3803+ endif()
3804+ else()
3805+ message(WARNING "Revoropt requires Eigen3, Mesh, Plugins, ANN and ALGLIB")
3806+ endif()
3807+endif()
3808+
3809+list(SORT CONFIG_OPTIONS)
3810+set(GMSH_CONFIG_OPTIONS "")
3811+foreach(OPT ${CONFIG_OPTIONS})
3812+ set(GMSH_CONFIG_OPTIONS "${GMSH_CONFIG_OPTIONS} ${OPT}")
3813+endforeach()
3814+
3815+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Common/GmshConfig.h.in
3816+ ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshConfig.h)
3817+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Common/GmshVersion.h.in
3818+ ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshVersion.h)
3819+
3820+# the texi version file is modified in the source directory (not ideal, but
3821+# since git tracks the contents of the file this is acceptable as it will only
3822+# change when the actual version is changed - not for each git hash)
3823+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo/version.texi.in
3824+ ${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo/version.texi)
3825+
3826+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/version.txt
3827+ ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}.${GMSH_PATCH_VERSION})
3828+
3829+# process cmake environment variables so we can append them to the -I include
3830+# commands. This is not recommended (we should only use the cache variables) but
3831+# it is very convenient: otherwise we have to remember providing the
3832+# -D... options to cmake for each new build.
3833+set(ENV_CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH})
3834+set(ENV_CMAKE_INCLUDE_PATH $ENV{CMAKE_INCLUDE_PATH})
3835+if(UNIX)
3836+ if(ENV_CMAKE_PREFIX_PATH)
3837+ string(REPLACE ":" ";" ENV_CMAKE_PREFIX_PATH ${ENV_CMAKE_PREFIX_PATH})
3838+ endif()
3839+ if(ENV_CMAKE_INCLUDE_PATH)
3840+ string(REPLACE ":" ";" ENV_CMAKE_INCLUDE_PATH ${ENV_CMAKE_INCLUDE_PATH})
3841+ endif()
3842+endif()
3843+list(APPEND EXTERNAL_INCLUDES ${CMAKE_INCLUDE_PATH} ${ENV_CMAKE_INCLUDE_PATH})
3844+list(APPEND EXTERNAL_INCLUDES ${CMAKE_PREFIX_PATH} ${ENV_CMAKE_PREFIX_PATH})
3845+foreach(DIR ${CMAKE_PREFIX_PATH} ${ENV_CMAKE_PREFIX_PATH})
3846+ list(APPEND EXTERNAL_INCLUDES ${DIR}/include)
3847+endforeach()
3848+
3849+if(EXTERNAL_INCLUDES)
3850+ list(REMOVE_DUPLICATES EXTERNAL_INCLUDES)
3851+endif()
3852+
3853+if(HAVE_FLTK)
3854+ set(LINK_LIBRARIES ${FLTK_LIBRARIES} ${EXTERNAL_LIBRARIES}
3855+ ${OPENGL_LIBRARIES} ${LAPACK_LIBRARIES})
3856+elseif(HAVE_OPENGL)
3857+ set(LINK_LIBRARIES ${EXTERNAL_LIBRARIES} ${OPENGL_LIBRARIES}
3858+ ${LAPACK_LIBRARIES})
3859+else()
3860+ set(LINK_LIBRARIES ${EXTERNAL_LIBRARIES} ${LAPACK_LIBRARIES})
3861+endif()
3862+
3863+# try to use static gfortran on static builds (cannot do this on dynamic builds
3864+# as e.g. Debian compiles libgfortran.a without -fPIC: sigh...)
3865+if(NOT ENABLE_BUILD_DYNAMIC AND NOT ENABLE_BUILD_SHARED)
3866+ find_library(GFORTRAN_STATIC libgfortran.a)
3867+ if(GFORTRAN_STATIC)
3868+ set(CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES)
3869+ message(STATUS "Using static libgfortran")
3870+ foreach(STR ${LINK_LIBRARIES})
3871+ string(REPLACE "-lgfortran" ${GFORTRAN_STATIC} STR2 ${STR})
3872+ list(APPEND LINK_LIBRARIES2 ${STR2})
3873+ endforeach()
3874+ set(LINK_LIBRARIES ${LINK_LIBRARIES2})
3875+ endif()
3876+endif()
3877+
3878+# Linux-specific linking
3879+if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
3880+ if(HAVE_OCC)
3881+ find_library(RT_LIB rt)
3882+ if(RT_LIB)
3883+ list(APPEND LINK_LIBRARIES ${RT_LIB})
3884+ endif()
3885+ endif()
3886+ if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Intel")
3887+ add_definitions(-fPIC)
3888+ endif()
3889+endif()
3890+
3891+# we could specify include dirs more selectively, but this is simpler
3892+include_directories(Common Fltk Geo Graphics Mesh Solver Numeric Parser
3893+ Plugin Post api ${EXTERNAL_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR}/Common)
3894+
3895+# set this for external codes that might include this CMakeList file
3896+set(GMSH_EXTERNAL_INCLUDE_DIRS ${EXTERNAL_INCLUDES} CACHE
3897+ STRING "External include directories" FORCE)
3898+set(GMSH_EXTERNAL_LIBRARIES ${LINK_LIBRARIES} CACHE
3899+ STRING "External libraries" FORCE)
3900+
3901+# group sources for easier navigation in IDEs
3902+foreach(DIR ${GMSH_DIRS})
3903+ string(REGEX REPLACE "\\+" "\\\\+" DIR ${DIR})
3904+ source_group(${DIR} REGULAR_EXPRESSION ${DIR}/.*)
3905+endforeach()
3906+
3907+# static library target
3908+if(ENABLE_BUILD_LIB)
3909+ add_library(lib STATIC ${GMSH_SRC})
3910+ set_target_properties(lib PROPERTIES OUTPUT_NAME gmsh)
3911+ if(MSVC)
3912+ set_target_properties(lib PROPERTIES DEBUG_POSTFIX d)
3913+ if(ENABLE_MSVC_STATIC_RUNTIME)
3914+ set_target_properties(lib PROPERTIES LINK_FLAGS_RELEASE "/nodefaultlib:LIBCMT")
3915+ endif()
3916+ endif()
3917+endif()
3918+
3919+# shared library target
3920+if(ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
3921+ add_library(shared SHARED ${GMSH_SRC})
3922+ set_target_properties(shared PROPERTIES OUTPUT_NAME gmsh
3923+ VERSION ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}.${GMSH_PATCH_VERSION}
3924+ SOVERSION ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION})
3925+ if(WIN32)
3926+ set_target_properties(shared PROPERTIES PREFIX "" IMPORT_PREFIX ""
3927+ IMPORT_SUFFIX ".lib" COMPILE_FLAGS "-DGMSH_DLL -DGMSH_DLL_EXPORT")
3928+ endif()
3929+ target_link_libraries(shared ${LINK_LIBRARIES})
3930+ if(MSVC AND ENABLE_MSVC_STATIC_RUNTIME)
3931+ message(STATUS "Note: By enabling ENABLE_MSVC_STATIC_RUNTIME, shared library "
3932+ "won't link. In MSVC change /MT to /MD in the shared project properties")
3933+ endif()
3934+endif()
3935+
3936+# binary targets
3937+if(HAVE_FLTK)
3938+ if(ENABLE_BUILD_DYNAMIC)
3939+ add_executable(gmsh WIN32 Common/Main.cpp)
3940+ target_link_libraries(gmsh shared)
3941+ else()
3942+ add_executable(gmsh WIN32 Common/Main.cpp ${GMSH_SRC})
3943+ endif()
3944+ # we could add this to create a minimal app bundle even without install
3945+ # if(APPLE AND NOT ENABLE_OS_SPECIFIC_INSTALL)
3946+ # set_target_properties(gmsh PROPERTIES MACOSX_BUNDLE ON
3947+ # MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_dev.plist)
3948+ # endif()
3949+else()
3950+ if(ENABLE_BUILD_DYNAMIC)
3951+ add_executable(gmsh Common/Main.cpp)
3952+ target_link_libraries(gmsh shared)
3953+ else()
3954+ add_executable(gmsh Common/Main.cpp ${GMSH_SRC})
3955+ endif()
3956+endif()
3957+target_link_libraries(gmsh ${LINK_LIBRARIES})
3958+
3959+# Windows specific linker options
3960+if(WIN32 AND NOT MSVC)
3961+ set(FLAGS "-Wl,--stack,16777216 -mwindows")
3962+ if(HAVE_64BIT_SIZE_T)
3963+ set(FLAGS "${FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/Win64Icon.res")
3964+ else()
3965+ set(FLAGS "${FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/Win32Icon.res")
3966+ endif()
3967+ set_target_properties(gmsh PROPERTIES LINK_FLAGS "${FLAGS} -static")
3968+ if(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
3969+ set_target_properties(shared PROPERTIES LINK_FLAGS -static)
3970+ endif()
3971+ # remove -Wl,-Bdynamic flags
3972+ set(CMAKE_EXE_LINK_DYNAMIC_C_FLAGS)
3973+ set(CMAKE_EXE_LINK_DYNAMIC_CXX_FLAGS)
3974+elseif(MSVC)
3975+ set_target_properties(gmsh PROPERTIES LINK_FLAGS "/STACK:16777216 /SAFESEH:NO")
3976+endif()
3977+
3978+# android target
3979+if(ENABLE_BUILD_ANDROID)
3980+ find_file(CMAKE_TOOLCHAIN_FILE "android.toolchain.cmake")
3981+ if(NOT CMAKE_TOOLCHAIN_FILE)
3982+ message(FATAL_ERROR "Cannot compile Gmsh for android without android-cmake")
3983+ endif()
3984+ add_definitions(-D_GLIBCXX_USE_C99_MATH=1)
3985+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
3986+ set(CMAKE_BUILD_TYPE Release)
3987+ set(LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_CURRENT_BINARY_DIR})
3988+ set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/libs/)
3989+ add_definitions(-DBUILD_ANDROID)
3990+ add_definitions(-DPICOJSON_USE_LOCALE=0)
3991+ add_library(androidGmsh SHARED ${GMSH_SRC})
3992+ set_target_properties(androidGmsh PROPERTIES OUTPUT_NAME gmsh)
3993+ target_link_libraries(androidGmsh ${EXTERNAL_LIBRARIES} ${LAPACK_LIBRARIES})
3994+ add_custom_command(TARGET androidGmsh POST_BUILD COMMAND
3995+ ${CMAKE_STRIP} ${LIBRARY_OUTPUT_PATH}/libgmsh.so)
3996+endif()
3997+
3998+# parser target
3999+find_program(BISON bison)
4000+find_program(FLEX flex)
4001+if(BISON AND FLEX)
4002+ add_custom_target(parser
4003+ COMMAND ${BISON} -p gmsh_yy --output Gmsh.tab.cpp -d Gmsh.y
4004+ COMMAND ${FLEX} -P gmsh_yy -o Gmsh.yy.cpp Gmsh.l
4005+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Parser)
4006+endif()
4007+
4008+if(UNIX)
4009+ # cannot use cmake's file search functions here (they would only find files
4010+ # existing at configuration time)
4011+ add_custom_target(purge
4012+ COMMAND rm -f `find . -name *~ -o -name *~~`
4013+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
4014+ add_custom_target(etags
4015+ COMMAND etags `find . -name *.cpp -o -name *.h -o -name *.y`
4016+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
4017+endif()
4018+
4019+if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
4020+ CMAKE_CXX_COMPILER_ID MATCHES "Clang")
4021+ execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion
4022+ OUTPUT_VARIABLE CXX_COMPILER_VERSION
4023+ OUTPUT_STRIP_TRAILING_WHITESPACE)
4024+else()
4025+ set(CXX_COMPILER_VERSION "Unknown")
4026+endif()
4027+
4028+set(WELCOME_FILE ${CMAKE_CURRENT_SOURCE_DIR}/doc/WELCOME.txt)
4029+set(SDK_FILE ${CMAKE_CURRENT_SOURCE_DIR}/doc/SDK.txt)
4030+set(LICENSE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt)
4031+set(CREDITS_FILE ${CMAKE_CURRENT_SOURCE_DIR}/CREDITS.txt)
4032+set(CHANGELOG_FILE ${CMAKE_CURRENT_SOURCE_DIR}/CHANGELOG.txt)
4033+file(GLOB TUTORIAL_GEO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/?*.*)
4034+file(GLOB TUTORIAL_CPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/c++/?*.*)
4035+file(GLOB TUTORIAL_C_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/c/?*.*)
4036+file(GLOB TUTORIAL_PY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/python/?*.*)
4037+file(GLOB TUTORIAL_JL_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/julia/?*.*)
4038+file(GLOB DEMOS ${CMAKE_CURRENT_SOURCE_DIR}/demos/*)
4039+foreach(SUBDIR ${DEMOS})
4040+ if(IS_DIRECTORY ${SUBDIR})
4041+ list(APPEND DEMOS_DIRS ${SUBDIR})
4042+ endif()
4043+endforeach()
4044+set(TEX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo)
4045+file(GLOB TEX_SRC ${TEX_DIR}/*.texi)
4046+set(TEX_OBJ ${TEX_DIR}/gmsh.aux ${TEX_DIR}/gmsh.cp ${TEX_DIR}/gmsh.cps
4047+ ${TEX_DIR}/gmsh.fn ${TEX_DIR}/gmsh.html ${TEX_DIR}/gmsh.info ${TEX_DIR}/gmsh.ky
4048+ ${TEX_DIR}/gmsh.log ${TEX_DIR}/gmsh.pdf ${TEX_DIR}/gmsh.pg ${TEX_DIR}/gmsh.toc
4049+ ${TEX_DIR}/gmsh.tp ${TEX_DIR}/gmsh.tps ${TEX_DIR}/gmsh.txt ${TEX_DIR}/gmsh.vr)
4050+
4051+macro(unix2dos VARNAME)
4052+ file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/unix2dos)
4053+ set(UNIX2DOS_FILES)
4054+ foreach(FILE ${${VARNAME}})
4055+ file(READ ${FILE} F0)
4056+ get_filename_component(N ${FILE} NAME)
4057+ if(CYGWIN)
4058+ string(REGEX REPLACE "\n" "\r\n" F1 "${F0}")
4059+ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N} "${F1}")
4060+ else() # if not in Cygwin, cmake adds '\r's automatically
4061+ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N} "${F0}")
4062+ endif()
4063+ list(APPEND UNIX2DOS_FILES ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N})
4064+ endforeach()
4065+ set(${VARNAME} ${UNIX2DOS_FILES})
4066+endmacro()
4067+
4068+if(WIN32)
4069+ if(ENABLE_OS_SPECIFIC_INSTALL)
4070+ set(GMSH_BIN .)
4071+ set(GMSH_LIB .)
4072+ set(GMSH_DOC .)
4073+ set(GMSH_MAN .)
4074+ set(GMSH_INC .)
4075+ else()
4076+ include(GNUInstallDirs)
4077+ set(GMSH_BIN ${CMAKE_INSTALL_BINDIR})
4078+ set(GMSH_LIB ${CMAKE_INSTALL_LIBDIR})
4079+ set(GMSH_DOC ${CMAKE_INSTALL_DOCDIR})
4080+ set(GMSH_MAN ${CMAKE_INSTALL_MANDIR}/man1)
4081+ set(GMSH_INC ${CMAKE_INSTALL_INCLUDEDIR})
4082+ endif()
4083+ if(CYGWIN)
4084+ unix2dos(GMSH_API)
4085+ if(ENABLE_PRIVATE_API)
4086+ unix2dos(GMSH_PRIVATE_API)
4087+ endif()
4088+ unix2dos(WELCOME_FILE)
4089+ unix2dos(SDK_FILE)
4090+ unix2dos(LICENSE_FILE)
4091+ unix2dos(CREDITS_FILE)
4092+ unix2dos(CHANGELOG_FILE)
4093+ unix2dos(TUTORIAL_GEO_FILES)
4094+ unix2dos(TUTORIAL_CPP_FILES)
4095+ unix2dos(TUTORIAL_C_FILES)
4096+ unix2dos(TUTORIAL_PY_FILES)
4097+ unix2dos(TUTORIAL_JL_FILES)
4098+ foreach(DIR ${DEMOS_DIRS})
4099+ file(GLOB DEMO_FILES ${DIR}/?*.*)
4100+ unix2dos(DEMO_FILES)
4101+ endforeach()
4102+ endif()
4103+elseif(APPLE AND ENABLE_OS_SPECIFIC_INSTALL)
4104+ # set these so that the files get installed nicely in the MacOSX
4105+ # .app bundle
4106+ set(GMSH_BIN ../MacOS)
4107+ set(GMSH_LIB ../MacOS)
4108+ set(GMSH_DOC ../../..)
4109+ set(GMSH_MAN ../../..)
4110+ set(GMSH_INC ../MacOS)
4111+else()
4112+ include(GNUInstallDirs)
4113+ set(GMSH_BIN ${CMAKE_INSTALL_BINDIR})
4114+ set(GMSH_LIB ${CMAKE_INSTALL_LIBDIR})
4115+ set(GMSH_DOC ${CMAKE_INSTALL_DOCDIR})
4116+ set(GMSH_MAN ${CMAKE_INSTALL_MANDIR}/man1)
4117+ set(GMSH_INC ${CMAKE_INSTALL_INCLUDEDIR})
4118+endif()
4119+
4120+# FIXME: change this once we understand rpaths
4121+if(APPLE)
4122+ if(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
4123+ set_target_properties(shared PROPERTIES INSTALL_NAME_DIR
4124+ ${CMAKE_INSTALL_PREFIX}/${GMSH_LIB})
4125+ endif()
4126+endif()
4127+
4128+# mark targets as optional so we can install them separately if needed
4129+# (e.g. "make lib" or "make shared" followed by "make install/fast")
4130+install(TARGETS gmsh DESTINATION ${GMSH_BIN} OPTIONAL)
4131+if(ENABLE_BUILD_LIB)
4132+ install(TARGETS lib DESTINATION ${GMSH_LIB} OPTIONAL)
4133+endif()
4134+if(ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
4135+ install(TARGETS shared DESTINATION ${GMSH_LIB} OPTIONAL)
4136+endif()
4137+
4138+if(ENABLE_ONELAB)
4139+ install(FILES ${ONELAB_PY} DESTINATION ${GMSH_BIN})
4140+endif()
4141+if(ENABLE_BUILD_LIB OR ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
4142+ install(FILES ${GMSH_API} DESTINATION ${GMSH_INC})
4143+ install(FILES ${GMSH_PY} DESTINATION ${GMSH_LIB})
4144+ install(FILES ${GMSH_JL} DESTINATION ${GMSH_LIB})
4145+ if(ENABLE_PRIVATE_API)
4146+ install(FILES ${GMSH_PRIVATE_API} DESTINATION ${GMSH_INC}/gmsh)
4147+ endif()
4148+endif()
4149+if(INSTALL_SDK_README)
4150+ configure_file(${SDK_FILE} ${CMAKE_CURRENT_BINARY_DIR}/README.txt)
4151+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/README.txt DESTINATION .)
4152+endif()
4153+install(FILES ${WELCOME_FILE} DESTINATION ${GMSH_DOC} RENAME README.txt)
4154+install(FILES ${LICENSE_FILE} DESTINATION ${GMSH_DOC})
4155+install(FILES ${CREDITS_FILE} DESTINATION ${GMSH_DOC})
4156+install(FILES ${CHANGELOG_FILE} DESTINATION ${GMSH_DOC})
4157+install(FILES ${TUTORIAL_GEO_FILES} DESTINATION ${GMSH_DOC}/tutorial)
4158+install(FILES ${TUTORIAL_CPP_FILES} DESTINATION ${GMSH_DOC}/tutorial/c++)
4159+install(FILES ${TUTORIAL_C_FILES} DESTINATION ${GMSH_DOC}/tutorial/c)
4160+install(FILES ${TUTORIAL_PY_FILES} DESTINATION ${GMSH_DOC}/tutorial/python)
4161+install(FILES ${TUTORIAL_JL_FILES} DESTINATION ${GMSH_DOC}/tutorial/julia)
4162+foreach(DIR ${DEMOS_DIRS})
4163+ get_filename_component(DEMOS_DIR_NAME ${DIR} NAME)
4164+ file(GLOB DEMO_FILES ${DIR}/?*.*)
4165+ install(FILES ${DEMO_FILES} DESTINATION ${GMSH_DOC}/demos/${DEMOS_DIR_NAME})
4166+endforeach()
4167+if(UNIX AND NOT CYGWIN)
4168+ install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/doc/gmsh.1 DESTINATION ${GMSH_MAN})
4169+endif()
4170+
4171+add_custom_target(get_headers
4172+ COMMAND ${CMAKE_COMMAND} -E make_directory Headers/gmsh
4173+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
4174+foreach(FILE ${GMSH_API})
4175+ add_custom_command(TARGET get_headers POST_BUILD COMMAND ${CMAKE_COMMAND}
4176+ -E copy_if_different ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/Headers/
4177+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
4178+endforeach()
4179+if(ENABLE_PRIVATE_API)
4180+ foreach(FILE ${GMSH_PRIVATE_API})
4181+ add_custom_command(TARGET get_headers POST_BUILD COMMAND ${CMAKE_COMMAND}
4182+ -E copy_if_different ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/Headers/gmsh/
4183+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
4184+ endforeach()
4185+endif()
4186+
4187+find_program(MAKEINFO makeinfo)
4188+if(MAKEINFO)
4189+ add_custom_command(OUTPUT ${TEX_DIR}/gmsh.info DEPENDS ${TEX_SRC}
4190+ COMMAND ${MAKEINFO} --split-size 1000000
4191+ ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
4192+ add_custom_target(info DEPENDS ${TEX_DIR}/gmsh.info)
4193+ add_custom_command(OUTPUT ${TEX_DIR}/gmsh.txt DEPENDS ${TEX_SRC}
4194+ COMMAND ${MAKEINFO} --plaintext -o gmsh.txt
4195+ ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
4196+ add_custom_target(txt DEPENDS ${TEX_DIR}/gmsh.txt)
4197+ add_custom_command(OUTPUT ${TEX_DIR}/gmsh.html DEPENDS ${TEX_SRC}
4198+ COMMAND ${MAKEINFO} --html --css-ref=http://gmsh.info/gmsh.css
4199+ --no-split --set-customization-variable
4200+ EXTRA_HEAD='<meta name="viewport" content="width=device-width,initial-scale=1.0">'
4201+ ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
4202+ add_custom_target(html DEPENDS ${TEX_DIR}/gmsh.html)
4203+ install(FILES ${TEX_DIR}/gmsh.html DESTINATION ${GMSH_DOC} OPTIONAL)
4204+else()
4205+ add_custom_target(html COMMAND ${CMAKE_COMMAND} -E touch ${TEX_DIR}/gmsh.html)
4206+endif()
4207+
4208+find_program(TEXI2PDF texi2pdf)
4209+if(TEXI2PDF)
4210+ add_custom_command(OUTPUT ${TEX_DIR}/gmsh.pdf DEPENDS ${TEX_SRC}
4211+ COMMAND ${TEXI2PDF} ARGS gmsh.texi
4212+ WORKING_DIRECTORY ${TEX_DIR})
4213+ add_custom_target(pdf DEPENDS ${TEX_DIR}/gmsh.pdf)
4214+ install(FILES ${TEX_DIR}/gmsh.pdf DESTINATION ${GMSH_DOC} OPTIONAL)
4215+endif()
4216+
4217+execute_process(COMMAND ${CMAKE_COMMAND} -E echo
4218+ "@c This file was generated by cmake: do not edit manually!\n${OPT_TEXI}"
4219+ OUTPUT_FILE cmake_options.texi)
4220+
4221+if(MAKEINFO AND TEXI2PDF)
4222+ add_custom_target(doc COMMAND ${CMAKE_COMMAND} -E tar zcf
4223+ ${CMAKE_CURRENT_BINARY_DIR}/gmsh-${GMSH_VERSION}-doc.tgz
4224+ CREDITS.txt LICENSE.txt CHANGELOG.txt
4225+ doc/gmsh.1 doc/texinfo/gmsh.html doc/texinfo/gmsh.info
4226+ doc/texinfo/gmsh.pdf doc/texinfo/gmsh.txt
4227+ COMMAND ${CMAKE_COMMAND} -E remove ${TEX_OBJ}
4228+ DEPENDS ${TEX_DIR}/gmsh.info ${TEX_DIR}/gmsh.txt
4229+ ${TEX_DIR}/gmsh.html ${TEX_DIR}/gmsh.pdf
4230+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
4231+endif()
4232+
4233+if(MAKEINFO OR TEXI2PDF)
4234+ add_custom_target(clean_doc COMMAND ${CMAKE_COMMAND} -E remove ${TEX_OBJ})
4235+endif()
4236+
4237+if(APPLE AND ENABLE_BUILD_LIB)
4238+ file(READ ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_framework.plist F0)
4239+ string(REPLACE GMSH_VERSION "${GMSH_VERSION}" F1 "${F0}")
4240+ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/Info_framework.plist "${F1}")
4241+ get_target_property(LIBNAME lib LOCATION) # depracated
4242+ #set(LIBNAME $<TARGET_FILE:lib>) # FIXME: use this in the future
4243+ add_custom_target(framework DEPENDS lib
4244+ COMMAND ${CMAKE_COMMAND} -E remove_directory gmsh.framework
4245+ COMMAND ${CMAKE_COMMAND} -E make_directory gmsh.framework/Headers
4246+ COMMAND ${CMAKE_COMMAND} -E make_directory gmsh.framework/Resources
4247+ COMMAND ${CMAKE_COMMAND} -E copy ${LIBNAME} gmsh.framework/gmsh
4248+ COMMAND ${CMAKE_COMMAND} -E copy Info_framework.plist
4249+ gmsh.framework/Resources/Info.plist
4250+ COMMAND ${CMAKE_COMMAND} -E create_symlink . gmsh.framework/Headers/gmsh
4251+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
4252+ foreach(FILE ${GMSH_API})
4253+ add_custom_command(TARGET framework POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy
4254+ ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/gmsh.framework/Headers/
4255+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
4256+ endforeach()
4257+ if(ENABLE_PRIVATE_API)
4258+ foreach(FILE ${GMSH_PRIVATE_API})
4259+ add_custom_command(TARGET framework POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy
4260+ ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/gmsh.framework/Headers/
4261+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
4262+ endforeach()
4263+ endif()
4264+endif()
4265+
4266+set(CPACK_PACKAGE_VENDOR "Christophe Geuzaine and Jean-Francois Remacle")
4267+set(CPACK_PACKAGE_VERSION_MAJOR ${GMSH_MAJOR_VERSION})
4268+set(CPACK_PACKAGE_VERSION_MINOR ${GMSH_MINOR_VERSION})
4269+set(CPACK_PACKAGE_VERSION_PATCH ${GMSH_PATCH_VERSION})
4270+set(CPACK_PACKAGE_DESCRIPTION_FILE ${WELCOME_FILE})
4271+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
4272+ "3D finite element mesh generator with built-in CAD engine and post-processor")
4273+if(GMSH_EXTRA_VERSION MATCHES "-git.*") # so that we'll overwrite the archives
4274+ set(CPACK_PACKAGE_FILE_NAME gmsh-git-${GMSH_OS})
4275+ set(CPACK_SOURCE_PACKAGE_FILE_NAME gmsh-git-source)
4276+else()
4277+ set(CPACK_PACKAGE_FILE_NAME gmsh-${GMSH_VERSION}-${GMSH_OS})
4278+ set(CPACK_SOURCE_PACKAGE_FILE_NAME gmsh-${GMSH_VERSION}-source)
4279+endif()
4280+set(CPACK_PACKAGE_INSTALL_DIRECTORY "gmsh")
4281+set(CPACK_RESOURCE_FILE_LICENSE ${LICENSE_FILE})
4282+set(CPACK_RESOURCE_FILE_README ${WELCOME_FILE})
4283+set(CPACK_RESOURCE_FILE_WELCOME ${WELCOME_FILE})
4284+set(CPACK_PACKAGE_EXECUTABLE "gmsh")
4285+if(ENABLE_PACKAGE_STRIP)
4286+ set(CPACK_STRIP_FILES TRUE)
4287+else()
4288+ set(CPACK_STRIP_FILES FALSE)
4289+endif()
4290+set(CPACK_SOURCE_GENERATOR TGZ)
4291+set(CPACK_SOURCE_IGNORE_FILES "${CMAKE_CURRENT_BINARY_DIR}" "/CVS/" "/.svn" "/.git"
4292+ "~$" "DS_Store$" "GmshConfig.h$" "GmshVersion.h$" "/benchmarks/" "/tmp/"
4293+ "/bin/" "/lib/" "/nightly/" "GPATH" "GRTAGS" "GSYMS" "GTAGS" "/HTML/"
4294+ "/contrib/3M/" "/contrib/Parasolid/")
4295+
4296+if(UNIX)
4297+ # make sure we remove previous installs before doing the next one (on Mac for
4298+ # example "make package; make package_source" would lead to huge file lists
4299+ # getting generated due to the 'Applications' symlink in the bundle)
4300+ set(CPACK_INSTALL_COMMANDS "rm -rf ${CMAKE_CURRENT_BINARY_DIR}/_CPack_Packages")
4301+endif()
4302+
4303+if(APPLE AND ENABLE_OS_SPECIFIC_INSTALL)
4304+ set(CPACK_GENERATOR Bundle)
4305+ set(CPACK_BUNDLE_NAME Gmsh)
4306+ file(READ ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_app.plist F0)
4307+ string(REPLACE GMSH_VERSION "${GMSH_VERSION}" F1 "${F0}")
4308+ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/Info.plist "${F1}")
4309+ set(CPACK_BUNDLE_PLIST ${CMAKE_CURRENT_BINARY_DIR}/Info.plist)
4310+ set(CPACK_BUNDLE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIcons.icns)
4311+ if(PACKAGER STREQUAL "geuzaine - removed: we sign on a separate machine")
4312+ # codesigning requires CMake >= 3.2
4313+ set(CPACK_BUNDLE_APPLE_CERT_APP "Developer ID Application: Christophe Geuzaine")
4314+ endif()
4315+ install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsGeo.icns DESTINATION .
4316+ RENAME GmshGeo.icns)
4317+ install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsMsh.icns DESTINATION .
4318+ RENAME GmshMsh.icns)
4319+ install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsSol.icns DESTINATION .
4320+ RENAME GmshSol.icns)
4321+ install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsPos.icns DESTINATION .
4322+ RENAME GmshPos.icns)
4323+ set(CPACK_PACKAGE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIcons.icns)
4324+elseif(WIN32)
4325+ set(CPACK_GENERATOR ZIP)
4326+else()
4327+ set(CPACK_GENERATOR TGZ)
4328+endif()
4329+
4330+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/utils/wrappers/gmshpy AND
4331+ ENABLE_PRIVATE_API AND ENABLE_WRAP_PYTHON AND HAVE_PYTHON)
4332+ add_subdirectory(utils/wrappers/gmshpy)
4333+endif()
4334+
4335+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/utils/wrappers/java AND
4336+ ENABLE_PRIVATE_API AND ENABLE_WRAP_JAVA)
4337+ add_subdirectory(utils/wrappers/java)
4338+endif()
4339+
4340+include(CPack)
4341+
4342+if(NOT DISABLE_GMSH_TESTS)
4343+ # disabling tests is useful when including this CMakeLists in an external project
4344+ include(CTest)
4345+ file(GLOB_RECURSE TESTFILES
4346+ tutorial/*.geo demos/*.geo benchmarks/?d/*.geo benchmarks/extrude/*.geo
4347+ benchmarks/occ/*.geo)
4348+ # disable this test for now on our Linux32 machine - the current config
4349+ # crashes on the OCC STL generation
4350+ if(${GMSH_OS} MATCHES "Linux32")
4351+ list(REMOVE_ITEM TESTFILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/t18.geo)
4352+ endif()
4353+ foreach(TESTFILE ${TESTFILES})
4354+ # use relative path for Cygwin/MinGW (the pure win exe built with the MinGW
4355+ # compilers does not understand a full Cygwin-style path)
4356+ FILE(RELATIVE_PATH TEST ${CMAKE_CURRENT_BINARY_DIR} ${TESTFILE})
4357+ if(HAVE_OCC OR NOT ${TEST} MATCHES "boolean" OR NOT ${TEST} MATCHES "occ")
4358+ add_test(${TEST} ./gmsh ${TEST} -3 -nopopup -o ./tmp.msh)
4359+ endif()
4360+ endforeach()
4361+ # test c++ api tutorials with dynamic builds (except on 32 bit windows for
4362+ # now: our win32 setup does not currently handle exceptions)
4363+ if(ENABLE_BUILD_DYNAMIC AND NOT ${GMSH_OS} MATCHES "Windows32")
4364+ file(GLOB_RECURSE TESTFILES tutorial/c++/*.cpp)
4365+ foreach(TESTFILE ${TESTFILES})
4366+ get_filename_component(TEST ${TESTFILE} NAME_WE)
4367+ add_executable(${TEST} WIN32 ${TESTFILE})
4368+ target_link_libraries(${TEST} shared)
4369+ if(WIN32 AND NOT MSVC)
4370+ set_target_properties(${TEST} PROPERTIES LINK_FLAGS "-mwindows -static")
4371+ endif()
4372+ add_test(${TEST}_cpp ${TEST})
4373+ endforeach()
4374+ endif()
4375+endif()
4376+
4377+message(STATUS "")
4378+message(STATUS "Gmsh ${GMSH_VERSION} has been configured for ${GMSH_OS}")
4379+message(STATUS "")
4380+message(STATUS " * Build options:" ${GMSH_CONFIG_OPTIONS})
4381+message(STATUS " * Build type: " ${CMAKE_BUILD_TYPE})
4382+message(STATUS " * C compiler: " ${CMAKE_C_COMPILER})
4383+message(STATUS " * C++ compiler: " ${CMAKE_CXX_COMPILER})
4384+message(STATUS " * Install prefix: " ${CMAKE_INSTALL_PREFIX})
4385+message(STATUS "")
4386+
4387+mark_as_advanced(GMSH_EXTRA_VERSION
4388+ ACIS_LIB ANN_INC ANN_LIB CAIRO_LIB CAIRO_INC CGNS_INC GMM_INC
4389+ GMP_INC GMP_LIB MMG3D_INC MMG3D_LIB HDF5_LIB
4390+ MED_LIB OCC_INC SZ_LIB
4391+ PETSC_LIBS SLEPC_INC SLEPC_INC2 SLEPC_LIB
4392+ BISON FLEX MAKEINFO TEXI2PDF FLTK_CONFIG_SCRIPT
4393+ GMSH_EXTERNAL_INCLUDE_DIRS GMSH_EXTERNAL_LIBRARIES)
4394Index: ../trunk-jpl/packagers/linux/package-issm-linux-binaries-matlab.sh
4395===================================================================
4396--- ../trunk-jpl/packagers/linux/package-issm-linux-binaries-matlab.sh (nonexistent)
4397+++ ../trunk-jpl/packagers/linux/package-issm-linux-binaries-matlab.sh (revision 25791)
4398@@ -0,0 +1,178 @@
4399+#!/bin/bash
4400+
4401+################################################################################
4402+# To be used after running,
4403+#
4404+# ${ISSM_DIR}/jenkins/jenkins.sh ${ISSM_DIR}/jenkins/ross-debian_linux-binaries-matlab
4405+#
4406+# in the context of a Jenkins project.
4407+#
4408+# When no runtime errors occur, performs the following:
4409+# - Checks resulting executables and libraries against test suite.
4410+# - Packages and compresses executables and libraries.
4411+# - Transmits it to ISSM Web site for distribution.
4412+################################################################################
4413+
4414+# Expand aliases within the context of this script
4415+shopt -s expand_aliases
4416+
4417+## Override certain aliases
4418+#
4419+alias grep=$(which grep)
4420+
4421+## Constants
4422+#
4423+LIBGFORTRAN="/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0" # Important that this is the library itself
4424+LIBGFORTRAN_DIST="${ISSM_DIR}/lib/libgfortran.so.5" # Important the file name matches the SONAME entry in the binaries and other shared libraries which link to it
4425+MATLAB_NROPTIONS="'benchmark','all','exclude',[125,126,234,235,418,420,435,444,445,701,702,703,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1201,1202,1203,1204,1205,1206,1207,1208,1301,1302,1303,1304,1401,1402,1601,1602,2002,2003,2005,2006,2010,2020,2021,2051,2052,2053,2101,2102,3001:3200,3201,3202,3300,3480,3481,4001,4002,4003]" # NOTE: Combination of test suites from basic, Dakota, and Solid Earth builds, with tests that require a restart and those that require the JVM excluded
4426+MATLAB_PATH="/usr/local/MATLAB/R2019b"
4427+PKG="ISSM-Linux-MATLAB" # Name of directory to copy distributable files to
4428+
4429+COMPRESSED_PKG="${PKG}.tar.gz"
4430+
4431+## Environment
4432+#
4433+export PATH="${ISSM_DIR}/bin:$(getconf PATH)" # Ensure that we pick up binaries from 'bin' directory rather than 'externalpackages'
4434+
4435+## Parse options
4436+#
4437+if [ $# -gt 1 ]; then
4438+ echo "Can use only one option at a time"
4439+ exit 1
4440+fi
4441+
4442+skip_tests=0
4443+transfer_only=0
4444+while [ $# -gt 0 ]; do
4445+ case $1 in
4446+ -s|--skiptests) skip_tests=1; shift ;;
4447+ -t|--transferonly) transfer_only=1; shift ;;
4448+ *) echo "Unknown parameter passed: $1"; exit 1 ;;
4449+ esac
4450+ shift
4451+done
4452+
4453+if [ ${transfer_only} -eq 0 ]; then
4454+ # Check if MATLAB exists
4455+ if ! [ -d ${MATLAB_PATH} ]; then
4456+ echo "${MATLAB_PATH} does not point to a MATLAB installation! Please modify MATLAB_PATH variable in $(basename $0) and try again."
4457+ exit 1
4458+ fi
4459+
4460+ # Clean up from previous packaging
4461+ echo "Cleaning up existing assets"
4462+ cd ${ISSM_DIR}
4463+ rm -rf ${PKG} ${COMPRESSED_PKG}
4464+ mkdir ${PKG}
4465+
4466+ # Add/modify required binaries and libraries
4467+ cd ${ISSM_DIR}/bin
4468+
4469+ echo "Modify generic"
4470+ cat generic_static.m | sed -e "s/generic_static/generic/g" > generic.m
4471+
4472+ echo "Moving MPICH binaries to bin/"
4473+ if [ -f ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec ]; then
4474+ cp ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec .
4475+ cp ${ISSM_DIR}/externalpackages/petsc/install/bin/hydra_pmi_proxy .
4476+ elif [ -f ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec ]; then
4477+ cp ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec .
4478+ cp ${ISSM_DIR}/externalpackages/mpich/install/bin/hydra_pmi_proxy .
4479+ else
4480+ echo "MPICH not found"
4481+ exit 1
4482+ fi
4483+
4484+ echo "Moving GDAL binaries to bin/"
4485+ if [ -f ${ISSM_DIR}/externalpackages/gdal/install/bin/gdal-config ]; then
4486+ cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdalsrsinfo .
4487+ cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdaltransform .
4488+ else
4489+ echo "GDAL not found"
4490+ exit 1
4491+ fi
4492+
4493+ echo "Moving GMT binaries to bin/"
4494+ if [ -f ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt-config ]; then
4495+ cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt .
4496+ cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmtselect .
4497+ else
4498+ echo "GMT not found"
4499+ exit 1
4500+ fi
4501+
4502+ echo "Moving Gmsh binaries to bin/"
4503+ if [ -f ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh ]; then
4504+ cp ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh .
4505+ else
4506+ echo "Gmsh not found"
4507+ exit 1
4508+ fi
4509+
4510+ echo "Moving libgfortran to lib/"
4511+ cp ${LIBGFORTRAN} ${LIBGFORTRAN_DIST} 2> /dev/null
4512+
4513+
4514+ # Run tests
4515+ if [ ${skip_tests} -eq 0 ]; then
4516+ echo "Running tests"
4517+ cd ${ISSM_DIR}/test/NightlyRun
4518+ rm matlab.log 2> /dev/null
4519+
4520+ # Run tests, redirecting output to logfile and suppressing output to console
4521+ ${MATLAB_PATH}/bin/matlab -nojvm -nosplash -r "try, addpath ${ISSM_DIR}/bin ${ISSM_DIR}/lib; runme(${MATLAB_NROPTIONS}); exit; catch me,fprintf('%s',getReport(me)); exit; end" -logfile matlab.log &> /dev/null
4522+
4523+ # Check that MATLAB did not exit in error
4524+ matlabExitCode=`echo $?`
4525+ matlabExitedInError=`grep -E "Activation cannot proceed|license|Error" matlab.log | wc -l`
4526+
4527+ if [[ ${matlabExitCode} -ne 0 || ${matlabExitedInError} -ne 0 ]]; then
4528+ echo "----------MATLAB exited in error!----------"
4529+ cat matlab.log
4530+ echo "-----------End of matlab.log-----------"
4531+
4532+ # Clean up execution directory
4533+ rm -rf ${ISSM_DIR}/execution/*
4534+
4535+ exit 1
4536+ fi
4537+
4538+ # Check that all tests passed
4539+ numTestsFailed=`cat matlab.log | grep -c -e "FAILED|ERROR"`
4540+
4541+ if [[ ${numTestsFailed} -ne 0 ]]; then
4542+ echo "One or more tests FAILED"
4543+ exit 1
4544+ else
4545+ echo "All tests PASSED"
4546+ fi
4547+ else
4548+ echo "Skipping tests"
4549+ fi
4550+
4551+ # Create package
4552+ cd ${ISSM_DIR}
4553+ svn cleanup --remove-ignored --remove-unversioned test # Clean up test directory (before copying to package)
4554+ echo "Copying assets to package: ${PKG}"
4555+ cp -rf bin examples lib scripts test ${PKG}/
4556+ mkdir ${PKG}/execution
4557+ echo "Cleaning up unneeded/unwanted files"
4558+ rm -f ${PKG}/bin/generic_static.* # Remove static versions of generic cluster classes
4559+ rm -f ${PKG}/lib/*.a # Remove static libraries from package
4560+ rm -f ${PKG}/lib/*.la # Remove libtool libraries from package
4561+ rm -rf ${PKG}/test/SandBox # Remove testing sandbox from package
4562+
4563+ # Compress package
4564+ echo "Compressing package"
4565+ tar -czf ${COMPRESSED_PKG} ${PKG}
4566+ ls -lah ${ISSM_DIR}/${COMPRESSED_PKG}
4567+fi
4568+
4569+# Transfer package to ISSM Web site
4570+echo "Transferring package to ISSM Web site"
4571+scp -i ~/.ssh/debian_linux-vm_to_ross ${COMPRESSED_PKG} jenkins@ross.ics.uci.edu:/var/www/html/${COMPRESSED_PKG}
4572+
4573+if [ $? -ne 0 ]; then
4574+ echo "Transfer failed! Verify connection then build this project again."
4575+ exit 1
4576+fi
4577
4578Property changes on: ../trunk-jpl/packagers/linux/package-issm-linux-binaries-matlab.sh
4579___________________________________________________________________
4580Added: svn:executable
4581## -0,0 +1 ##
4582+*
4583\ No newline at end of property
4584Index: ../trunk-jpl/jenkins/ross-debian_linux-binaries-matlab
4585===================================================================
4586--- ../trunk-jpl/jenkins/ross-debian_linux-binaries-matlab (nonexistent)
4587+++ ../trunk-jpl/jenkins/ross-debian_linux-binaries-matlab (revision 25791)
4588@@ -0,0 +1,88 @@
4589+#--------------------#
4590+# ISSM Configuration #
4591+#--------------------#
4592+
4593+MATLAB_PATH="/usr/local/MATLAB/R2019b"
4594+
4595+# NOTE:
4596+# - We can disable dependency tracking in the Autotools because the binaries
4597+# should always be a one-time build.
4598+# - libgfortran will not be available in $ISSM_DIR/lib at compile time: it is
4599+# copied by packaging script.
4600+#
4601+ISSM_CONFIG='\
4602+ --prefix=${ISSM_DIR} \
4603+ --enable-standalone-executables \
4604+ --enable-standalone-modules \
4605+ --enable-standalone-libraries \
4606+ --disable-dependency-tracking \
4607+ --with-pic \
4608+ --with-matlab-dir=${MATLAB_PATH} \
4609+ --with-fortran-lib="-L${ISSM_DIR}/lib -lgfortran" \
4610+ --with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
4611+ --with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
4612+ --with-blas-lapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
4613+ --with-metis-dir=${ISSM_DIR}/externalpackages/petsc/install \
4614+ --with-scalapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
4615+ --with-mumps-dir=${ISSM_DIR}/externalpackages/petsc/install \
4616+ --with-hdf5-dir=${ISSM_DIR}/externalpackages/petsc/install \
4617+ --with-petsc-dir=${ISSM_DIR}/externalpackages/petsc/install \
4618+ --with-gsl-dir=${ISSM_DIR}/externalpackages/gsl/install \
4619+ --with-boost-dir=${ISSM_DIR}/externalpackages/boost/install \
4620+ --with-dakota-dir=${ISSM_DIR}/externalpackages/dakota/install \
4621+ --with-triangle-dir=${ISSM_DIR}/externalpackages/triangle/install \
4622+ --with-chaco-dir=${ISSM_DIR}/externalpackages/chaco/install \
4623+ --with-m1qn3-dir=${ISSM_DIR}/externalpackages/m1qn3/install \
4624+ --with-semic-dir=${ISSM_DIR}/externalpackages/semic/install \
4625+'
4626+#-------------------#
4627+# External Packages #
4628+#-------------------#
4629+
4630+EXTERNALPACKAGES="
4631+ autotools install-debian-linux.sh
4632+ cmake install.sh
4633+ petsc install-3.12-linux-static.sh
4634+ gsl install-static.sh
4635+ boost install-1.7-linux-static.sh
4636+ dakota install-6.2-linux-static.sh
4637+ curl install-7-static.sh
4638+ netcdf install-4.7-parallel-static.sh
4639+ proj install-6.2-static.sh
4640+ gdal install-3-netcdf-static.sh
4641+ gshhg install.sh
4642+ gmt install-6-linux-static.sh
4643+ gmsh install-4-linux-static.sh
4644+ triangle install-linux-static.sh
4645+ chaco install.sh
4646+ m1qn3 install.sh
4647+ semic install.sh
4648+ shell2junit install.sh
4649+"
4650+
4651+#---------#
4652+# Testing #
4653+#---------#
4654+
4655+# Test suites
4656+MATLAB_TEST=0
4657+PYTHON_TEST=0
4658+JAVASCRIPT_TEST=0
4659+EXAMPLES_TEST=0
4660+
4661+# Number of CPUs used in ISSM compilation
4662+#
4663+# NOTE: One is usually safer as some packages are very sensitive to parallel
4664+# compilation.
4665+#
4666+NUMCPUS_INSTALL=8
4667+
4668+# Number of CPUs used in the nightly runs
4669+NUMCPUS_RUN=1
4670+
4671+# Nightly run options
4672+#
4673+# See documentation in test/NightlyRun/runme.* for more information.
4674+#
4675+MATLAB_NROPTIONS=""
4676+PYTHON_NROPTIONS=""
4677
4678Property changes on: ../trunk-jpl/jenkins/ross-debian_linux-binaries-matlab
4679___________________________________________________________________
4680Added: svn:executable
4681## -0,0 +1 ##
4682+*
4683\ No newline at end of property
Note: See TracBrowser for help on using the repository browser.