Index: /issm/trunk-jpl/externalpackages/gmsh/configs/4.5.6/static/CMakeLists.txt
===================================================================
--- /issm/trunk-jpl/externalpackages/gmsh/configs/4.5.6/static/CMakeLists.txt	(revision 25791)
+++ /issm/trunk-jpl/externalpackages/gmsh/configs/4.5.6/static/CMakeLists.txt	(revision 25791)
@@ -0,0 +1,2141 @@
+# Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle
+#
+# See the LICENSE.txt file for license information. Please report all
+# issues on https://gitlab.onelab.info/gmsh/gmsh/issues.
+
+cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
+
+# do not warn about non-definition of WIN32 on Cygwin
+set(CMAKE_LEGACY_CYGWIN_WIN32 0)
+
+# if CMAKE_BUILD_TYPE is specified use it; otherwise set the default
+# build type to "RelWithDebInfo" ("-O2 -g" with gcc) prior to calling
+# project()
+if(DEFINED CMAKE_BUILD_TYPE)
+  set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Choose build type")
+else()
+  set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose build type")
+endif()
+
+project(gmsh CXX C)
+
+# this variable controls the default value of the options which are normally set
+# to ON (useful if you want to configure a minimal version of Gmsh: e.g. "cmake
+# -DDEFAULT=0 -DENABLE_POST=1 -DENABLE_PARSER=1")
+set(DEFAULT ON CACHE INTERNAL "Default value for enabled-by-default options")
+
+macro(opt OPTION HELP VALUE)
+  option(ENABLE_${OPTION} ${HELP} ${VALUE})
+  set(OPT_TEXI "${OPT_TEXI}\n@item ENABLE_${OPTION}\n${HELP} (default: ${VALUE})")
+endmacro()
+
+opt(3M "Enable proprietary 3M extension" OFF)
+opt(ACIS "Enable ACIS geometrical models (experimental)" ${DEFAULT})
+opt(ALGLIB "Enable ALGLIB (used by some mesh optimizers)" ${DEFAULT})
+opt(ANN "Enable ANN (used for fast point search in mesh/post)" ${DEFAULT})
+opt(BAMG "Enable Bamg 2D anisotropic mesh generator" ${DEFAULT})
+opt(BLAS_LAPACK "Enable BLAS/Lapack for linear algebra (required for meshing)" ON)
+opt(BLOSSOM "Enable Blossom algorithm (needed for full quad meshing)" ${DEFAULT})
+opt(BUILD_LIB "Enable 'lib' target for building static Gmsh library" OFF)
+opt(BUILD_SHARED "Enable 'shared' target for building shared Gmsh library" OFF)
+opt(BUILD_DYNAMIC "Enable dynamic Gmsh executable (linked with shared library)" OFF)
+opt(BUILD_ANDROID "Enable Android NDK library target (experimental)" OFF)
+opt(BUILD_IOS "Enable iOS library target (experimental)" OFF)
+opt(CGNS "Enable CGNS import/export (experimental)" ${DEFAULT})
+opt(CGNS_CPEX0045 "Enable high-order CGNS import/export following CPEX0045 (experimental)" OFF)
+opt(CAIRO "Enable Cairo to render fonts (experimental)" ${DEFAULT})
+opt(CXX11 "Enable C++11" ON)
+opt(C99 "Enable C99" ON)
+opt(PROFILE "Enable profiling compiler flags" OFF)
+opt(DINTEGRATION "Enable discrete integration (needed for levelsets)" ${DEFAULT})
+opt(DOMHEX "Enable experimental DOMHEX code" ${DEFAULT})
+opt(FLTK "Enable FLTK graphical user interface (requires mesh/post)" ${DEFAULT})
+opt(GETDP "Enable GetDP solver (linked as a library, experimental)" ${DEFAULT})
+opt(GMM "Enable GMM linear solvers (simple alternative to PETSc)" ${DEFAULT})
+opt(GMP "Enable GMP for Kbipack (advanced)" ON)
+opt(GRAPHICS "Enable building graphics lib even without GUI (advanced)" OFF)
+opt(HXT "Enable HXT library (for reparametrization and meshing)" ${DEFAULT})
+opt(KBIPACK "Enable Kbipack (neeeded by homology solver)" ${DEFAULT})
+opt(MATHEX "Enable Mathex expression parser (used by plugins and options)" ${DEFAULT})
+opt(MED "Enable MED mesh and post file formats" ${DEFAULT})
+opt(MESH "Enable mesh module (required by GUI)" ${DEFAULT})
+opt(METIS "Enable Metis mesh partitioner" ${DEFAULT})
+opt(MMG3D "Enable MMG3D 3D anisotropic mesh refinement" ${DEFAULT})
+opt(MPEG_ENCODE "Enable built-in MPEG movie encoder" ${DEFAULT})
+opt(MPI "Enable MPI (experimental, not used for meshing)" OFF)
+opt(MSVC_STATIC_RUNTIME "Enable static Visual C++ runtime" OFF)
+opt(MUMPS "Enable MUMPS sparse direct linear solver" OFF)
+opt(NETGEN "Enable Netgen 3D frontal mesh generator" ${DEFAULT})
+opt(NUMPY "Enable fullMatrix and numpy array conversion for private API" OFF)
+opt(PETSC4PY "Enable petsc4py wrappers for petsc matrices for private API" OFF)
+opt(OCC "Enable OpenCASCADE CAD kernel" ${DEFAULT})
+opt(OCC_CAF "Enable OpenCASCADE CAF module (for STEP/IGES attributes)" ${DEFAULT})
+opt(OCC_STATIC "Link OpenCASCADE static instead of dynamic libraries (requires ENABLE_OCC)" OFF)
+opt(OCC_TBB "Add TBB libraries in list of OCC libraries" OFF)
+opt(ONELAB "Enable ONELAB solver interface" ${DEFAULT})
+opt(ONELAB_METAMODEL "Enable ONELAB metamodels (experimental)" ${DEFAULT})
+opt(OPENACC "Enable OpenACC" OFF)
+opt(OPENMP "Enable OpenMP" OFF)
+opt(OPTHOM "Enable high-order mesh optimization tools" ${DEFAULT})
+opt(OS_SPECIFIC_INSTALL "Enable OS-specific (e.g. app bundle) installation" OFF)
+opt(OSMESA "Enable OSMesa for offscreen rendering (experimental)" OFF)
+opt(P4EST "Enable p4est for enabling automatic mesh size firld (experimental)" OFF)
+opt(PACKAGE_STRIP "Strip symbols in install packages to reduce install size" ON)
+opt(PARSER "Enable GEO file parser (required for .geo/.pos files)" ${DEFAULT})
+opt(PETSC "Enable PETSc linear solvers (required for SLEPc)" OFF)
+opt(PLUGINS "Enable post-processing plugins" ${DEFAULT})
+opt(POST "Enable post-processing module (required by GUI)" ${DEFAULT})
+opt(POPPLER "Enable Poppler for displaying PDF documents (experimental)" OFF)
+opt(PRIVATE_API "Enable private API" OFF)
+opt(QUADTRI "Enable QuadTri structured meshing extensions" ${DEFAULT})
+opt(REVOROPT "Enable Revoropt (used for CVT remeshing)" OFF)
+opt(SLEPC "Enable SLEPc eigensolvers" OFF)
+opt(SOLVER "Enable built-in finite element solvers (required for compounds)" ${DEFAULT})
+opt(SYSTEM_CONTRIB "Use system versions of contrib libraries, when possible" OFF)
+opt(TCMALLOC "Enable libtcmalloc (fast malloc that does not release memory)" OFF)
+opt(TOUCHBAR "Enable Apple Touch bar" ${DEFAULT})
+opt(VISUDEV "Enable additional visualization capabilities for development purposes" OFF)
+opt(VOROPP "Enable voro++ (for hex meshing, experimental)" ${DEFAULT})
+opt(WRAP_JAVA "Enable generation of Java wrappers for private API" OFF)
+opt(WRAP_PYTHON "Enable generation of Python wrappers for private API" OFF)
+opt(ZIPPER "Enable Zip file compression/decompression" OFF)
+
+set(GMSH_MAJOR_VERSION 4)
+set(GMSH_MINOR_VERSION 5)
+set(GMSH_PATCH_VERSION 6)
+set(GMSH_EXTRA_VERSION "")
+set(GMSH_EXTRA_VERSION_TEXI "${GMSH_EXTRA_VERSION}")
+
+if(NOT GMSH_RELEASE)
+  find_package(Git)
+  if(GIT_FOUND)
+    execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --format=%h
+                    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ERROR_QUIET
+                    OUTPUT_VARIABLE GIT_COMMIT_HASH
+                    OUTPUT_STRIP_TRAILING_WHITESPACE)
+  endif()
+  if(GIT_COMMIT_HASH)
+    set(GMSH_EXTRA_VERSION "${GMSH_EXTRA_VERSION}-git-${GIT_COMMIT_HASH}")
+  endif()
+  set(GMSH_EXTRA_VERSION_TEXI "${GMSH_EXTRA_VERSION_TEXI} (development version)")
+endif()
+
+set(GMSH_VERSION "${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}")
+set(GMSH_VERSION "${GMSH_VERSION}.${GMSH_PATCH_VERSION}${GMSH_EXTRA_VERSION}")
+set(GMSH_SHORT_LICENSE "GNU General Public License")
+
+set(GMSH_API api/gmsh.h api/gmshc.h api/gmsh.h_cwrap)
+
+if(ENABLE_PRIVATE_API)
+  message(WARNING "The private API is unsupported and undocumented. It is meant "
+          "for expert Gmsh developers, not for regular Gmsh users, who should rely "
+          "on the stable public API (gmsh/api) instead. If you are repackaging Gmsh, "
+          "e.g. for a Linux distribution, please DO NOT distribute the private API "
+          "(i.e. all the internal headers) and ship the stable public API instead "
+          "(i.e. only the headers and modules in gmsh/api).")
+  file(GLOB_RECURSE HEADERS Common/*.h Numeric/*.h Geo/*.h Mesh/*.h Solver/*.h
+    Post/*.h Graphics/*.h contrib/kbipack/*.h contrib/DiscreteIntegration/*.h
+    contrib/HighOrderMeshOptimizer/*.h contrib/MeshOptimizer/*.h
+    contrib/MeshQualityOptimizer/*.h)
+  set(GMSH_PRIVATE_API ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshConfig.h
+      ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshVersion.h ${HEADERS})
+  get_property(IAMCHILD DIRECTORY PROPERTY PARENT_DIRECTORY)
+  if(IAMCHILD)
+    set(GMSH_PRIVATE_API ${GMSH_PRIVATE_API} PARENT_SCOPE)
+  endif()
+endif()
+
+set(ONELAB_PY contrib/onelab/python/onelab.py)
+set(GMSH_PY api/gmsh.py)
+set(GMSH_JL api/gmsh.jl)
+
+if(${CMAKE_MAJOR_VERSION} GREATER 2)
+  string(TIMESTAMP DATE "%Y%m%d")
+else()
+  execute_process(COMMAND date "+%Y%m%d" OUTPUT_VARIABLE DATE
+                  OUTPUT_STRIP_TRAILING_WHITESPACE)
+endif()
+
+if(NOT DATE)
+  set(DATE "unknown")
+endif()
+set(GMSH_DATE "${DATE}")
+
+if(NOT GMSH_HOST)
+  execute_process(COMMAND hostname OUTPUT_VARIABLE HOSTNAME
+                  OUTPUT_STRIP_TRAILING_WHITESPACE)
+  if(NOT HOSTNAME)
+    set(HOSTNAME "unknown")
+  endif()
+  set(GMSH_HOST "${HOSTNAME}")
+endif()
+
+if(NOT GMSH_PACKAGER)
+  execute_process(COMMAND whoami OUTPUT_VARIABLE PACKAGER
+                  OUTPUT_STRIP_TRAILING_WHITESPACE)
+  if(NOT PACKAGER)
+    set(PACKAGER "unknown")
+  endif()
+  string(REPLACE "\\" " " PACKAGER ${PACKAGER})
+  set(GMSH_PACKAGER "${PACKAGER}")
+endif()
+
+if(APPLE)
+  set(GMSH_OS "MacOSX")
+elseif(CYGWIN OR MSYS)
+  # detect if we use the MinGW compilers on Cygwin - if we do, handle the build
+  # as a pure Windows build
+  if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
+     CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+    execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine
+                    OUTPUT_VARIABLE CXX_COMPILER_MACHINE
+                    OUTPUT_STRIP_TRAILING_WHITESPACE)
+    if(CXX_COMPILER_MACHINE MATCHES "mingw")
+      set(GMSH_OS "Windows")
+      set(WIN32 1)
+      add_definitions(-DWIN32)
+    endif()
+  endif()
+else()
+  set(GMSH_OS "${CMAKE_SYSTEM_NAME}")
+endif()
+
+include(CheckTypeSize)
+include(CheckFunctionExists)
+include(CheckIncludeFile)
+include(CheckCXXCompilerFlag)
+include(CheckCCompilerFlag)
+
+macro(set_config_option VARNAME STRING)
+  set(${VARNAME} TRUE)
+  list(APPEND CONFIG_OPTIONS ${STRING})
+  message(STATUS "Found " ${STRING})
+endmacro()
+
+# check if the machine is 64 bits (this is more reliable than using
+# CMAKE_SIZEOF_VOID_P, which does not seem to work e.g. on some Suse
+# machines)
+check_type_size("void*" SIZEOF_VOID_P)
+if(SIZEOF_VOID_P EQUAL 8)
+  set_config_option(HAVE_64BIT_SIZE_T "64Bit")
+endif()
+
+# append 32/64 to the build name on Linux and Windows
+if(NOT APPLE)
+  if(HAVE_64BIT_SIZE_T)
+    set(GMSH_OS "${GMSH_OS}64")
+  else()
+    set(GMSH_OS "${GMSH_OS}32")
+  endif()
+endif()
+
+if(NOT ENABLE_BUILD_SHARED)
+  if(ENABLE_WRAP_PYTHON OR ENABLE_WRAP_JAVA)
+    set(ENABLE_BUILD_DYNAMIC ON)
+  endif()
+endif()
+
+if(ENABLE_BUILD_DYNAMIC)
+  set(GMSH_OS "${GMSH_OS}-sdk")
+endif()
+
+if(APPLE)
+  # FIXME: change this once we understand rpaths - the options below do not work
+  set(CMAKE_MACOSX_RPATH 0)
+else()
+  # make sure that dynamic libraries can be found when installing/ displacing the
+  # binaries: from https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/
+  # RPATH-handling:
+
+  # use, i.e. don't skip the full RPATH for the build tree
+  set(CMAKE_SKIP_BUILD_RPATH  FALSE)
+
+  # when building, don't use the install RPATH already (but later on when
+  # installing)
+  set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
+  set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+
+  # add the automatically determined parts of the RPATH which point to
+  # directories outside the build tree to the install RPATH
+  set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+
+  # the RPATH to be used when installing, but only if it's not a system directory
+  list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib"
+       isSystemDir)
+  if("${isSystemDir}" STREQUAL "-1")
+     set(CMAKE_INSTALL_RPATH "\\\$ORIGIN/../lib")
+  endif()
+endif()
+
+if(MSVC)
+  # remove annoying warning about bool/int cast performance
+  set(GMSH_CONFIG_PRAGMAS "#pragma warning(disable:4800 4244 4267)")
+  foreach(VAR
+          CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
+          CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO
+          CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
+          CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
+    if(ENABLE_MSVC_STATIC_RUNTIME AND ${VAR} MATCHES "/MD")
+      string(REGEX REPLACE "/MD" "/MT" ${VAR} "${${VAR}}")
+    endif()
+    if(NOT ${VAR} MATCHES "/MP") # enable parallel compilation
+      set(${VAR} "${${VAR}} /MP")
+    endif()
+  endforeach()
+  if(ENABLE_PRIVATE_API)
+    if(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
+      # automatically export .def file with all symbols (requires CMake 3.4);
+      # depending on the compiling options this might lead to more than 64k export
+      # symbols; just trim the .def file to keep the ones you need
+      set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
+    endif()
+  endif()
+endif()
+
+if(ENABLE_OPENMP)
+  find_package(OpenMP)
+  if(OpenMP_FOUND)
+    set_config_option(HAVE_OPENMP "OpenMP")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
+  elseif(APPLE AND EXISTS "/opt/local/lib/libomp")
+    # just for testing the official Apple compiler with macports' libomp
+    set_config_option(HAVE_OPENMP "OpenMP[MacPorts]")
+    set(CMAKE_C_FLAGS
+        "${CMAKE_C_FLAGS} -Xpreprocessor -fopenmp -I/opt/local/include/libomp")
+    set(CMAKE_CXX_FLAGS
+        "${CMAKE_CXX_FLAGS} -Xpreprocessor -fopenmp -I/opt/local/include/libomp")
+    list(APPEND EXTERNAL_LIBRARIES "-L/opt/local/lib/libomp -lomp")
+  elseif(APPLE AND EXISTS "/usr/local/lib/libomp.dylib")
+    set_config_option(HAVE_OPENMP "OpenMP[usr/local]")
+    set(CMAKE_C_FLAGS
+        "${CMAKE_C_FLAGS} -Xpreprocessor -fopenmp")
+    set(CMAKE_CXX_FLAGS
+        "${CMAKE_CXX_FLAGS} -Xpreprocessor -fopenmp")
+    list(APPEND EXTERNAL_LIBRARIES "-lomp")
+  endif()
+endif()
+
+if(ENABLE_OPENACC)
+  find_package(OpenACC)
+  if(OpenACC_C_FOUND AND OpenACC_CXX_FOUND)
+    set_config_option(HAVE_OPENACC "OpenACC")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenACC_C_FLAGS}")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenACC_CXX_FLAGS}")
+  endif()
+endif()
+
+if(ENABLE_CXX11)
+  # in recent cmake versions we could do e.g. set(CMAKE_CXX_STANDARD 11)
+  check_cxx_compiler_flag("-std=c++11" STDCXX11)
+  if(STDCXX11)
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+  endif()
+endif()
+
+if(ENABLE_C99)
+  # in recent cmake versions we could do e.g. set(CMAKE_C_STANDARD 99)
+  check_c_compiler_flag("-std=c99" STDC99)
+  if(STDC99)
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
+  endif()
+endif()
+
+if(ENABLE_PROFILE)
+    # Using the perf set of profiling tools doesn't work without the frame
+    # pointer and a common optimisation is to remove it
+    check_cxx_compiler_flag("-fno-omit-frame-pointer" FNOFP)
+    if(FNOFP)
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
+    endif()
+endif()
+
+macro(append_gmsh_src DIRNAME FILES)
+  foreach(FILE ${FILES})
+    list(APPEND LIST ${DIRNAME}/${FILE})
+  endforeach()
+  set(GMSH_SRC ${GMSH_SRC};${LIST} PARENT_SCOPE)
+  set(GMSH_DIRS ${GMSH_DIRS};${DIRNAME} PARENT_SCOPE)
+endmacro()
+
+macro(find_all_libraries VARNAME LISTNAME PATH SUFFIX)
+  set(${VARNAME})
+  list(LENGTH ${LISTNAME} NUM_LIST)
+  foreach(LIB ${${LISTNAME}})
+    if("${PATH}" STREQUAL "")
+      find_library(FOUND_LIB ${LIB} PATH_SUFFIXES ${SUFFIX})
+    else()
+      find_library(FOUND_LIB ${LIB} PATHS ${PATH} NO_DEFAULT_PATH)
+    endif()
+    if(FOUND_LIB)
+      list(APPEND ${VARNAME} ${FOUND_LIB})
+    endif()
+    unset(FOUND_LIB CACHE)
+  endforeach()
+  list(LENGTH ${VARNAME} NUM_FOUND_LIBRARIES)
+  if(NUM_FOUND_LIBRARIES LESS NUM_LIST)
+    set(${VARNAME})
+  endif()
+endmacro()
+
+macro(set_compile_flags LISTNAME FLAGS)
+  foreach(FILE ${${LISTNAME}})
+    get_source_file_property(PROP ${FILE} COMPILE_FLAGS)
+    if(PROP)
+      set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS "${PROP} ${FLAGS}")
+    else()
+      set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS "${FLAGS}")
+    endif()
+  endforeach()
+endmacro()
+
+if(ENABLE_BLAS_LAPACK)
+  if(BLAS_LAPACK_LIBRARIES)
+    # use libs as specified in the BLAS_LAPACK_LIBRARIES variable
+    set_config_option(HAVE_BLAS "Blas[custom]")
+    set_config_option(HAVE_LAPACK "Lapack[custom]")
+    set(LAPACK_LIBRARIES ${BLAS_LAPACK_LIBRARIES})
+  else()
+    if(MSVC)
+      # on Windows with Visual C++ try really hard to find blas/lapack *without*
+      # requiring a Fortran compiler: 1) try to find the Intel MKL libs using
+      # the standard search path; if not found 2) try to get the reference
+      # blas/lapack libs (useful for users with no Fortran compiler and no MKL
+      # license, who can just download our precompiled "gmsh-dep" package)
+      if(HAVE_64BIT_SIZE_T)
+        set(MKL_PATH em64t/lib)
+        set(MKL_LIBS_REQUIRED libguide40 mkl_intel_lp64 mkl_intel_thread mkl_core)
+      else()
+        set(MKL_PATH ia32/lib)
+        set(MKL_LIBS_REQUIRED libguide40 mkl_intel_c mkl_intel_thread mkl_core)
+      endif()
+      find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
+      if(LAPACK_LIBRARIES)
+        set_config_option(HAVE_BLAS "Blas[mkl]")
+        set_config_option(HAVE_LAPACK "Lapack[mkl]")
+      else()
+        set(REFLAPACK_LIBS_REQUIRED lapack blas g2c gcc)
+        find_all_libraries(LAPACK_LIBRARIES REFLAPACK_LIBS_REQUIRED "" "")
+        if(LAPACK_LIBRARIES)
+          set_config_option(HAVE_BLAS "Blas[ref]")
+          set_config_option(HAVE_LAPACK "Lapack[ref]")
+        endif()
+      endif()
+    elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
+      # on Linux try to find the Intel MKL without a Fortran compiler
+      if(HAVE_64BIT_SIZE_T)
+        set(MKL_PATH lib/em64t)
+      else()
+        set(MKL_PATH lib/32)
+      endif()
+      set(MKL_LIBS_REQUIRED mkl_gf_lp64 iomp5 mkl_gnu_thread mkl_core guide pthread)
+      find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
+      if(NOT LAPACK_LIBRARIES)
+        # match lapack 9.0 on 64bit
+        set(MKL_LIBS_REQUIRED mkl_lapack mkl_em64t guide)
+        find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
+      endif()
+      if(LAPACK_LIBRARIES)
+        set_config_option(HAVE_BLAS "Blas[mkl]")
+        set_config_option(HAVE_LAPACK "Lapack[mkl]")
+      else()
+        # on Linux also try to find ATLAS without a Fortran compiler, because
+        # cmake ships with a buggy FindBLAS e.g. on Ubuntu Lucid Lynx
+        set(ATLAS_LIBS_REQUIRED lapack f77blas cblas atlas)
+        find_all_libraries(LAPACK_LIBRARIES ATLAS_LIBS_REQUIRED "" "")
+        if(LAPACK_LIBRARIES)
+          set_config_option(HAVE_BLAS "Blas[atlas]")
+          set_config_option(HAVE_LAPACK "Lapack[atlas]")
+        else()
+          # try with generic names
+          set(GENERIC_LIBS_REQUIRED lapack blas pthread)
+          find_all_libraries(LAPACK_LIBRARIES GENERIC_LIBS_REQUIRED "" "")
+          if(LAPACK_LIBRARIES)
+            set_config_option(HAVE_BLAS "Blas[generic]")
+            set_config_option(HAVE_LAPACK "Lapack[generic]")
+            find_library(GFORTRAN_LIB gfortran)
+            if(GFORTRAN_LIB)
+              list(APPEND LAPACK_LIBRARIES ${GFORTRAN_LIB})
+            endif()
+          endif()
+        endif()
+      endif()
+    elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
+      # on SunOS we know blas and lapack are available in sunperf
+      set(LAPACK_LIBRARIES -library=sunperf)
+      set_config_option(HAVE_BLAS "Blas[sunperf]")
+      set_config_option(HAVE_LAPACK "Lapack[sunperf]")
+    elseif(APPLE)
+      # on Mac we also know that blas and lapack are available
+      set(LAPACK_LIBRARIES "-llapack -lblas")
+      set_config_option(HAVE_BLAS "Blas[veclib]")
+      set_config_option(HAVE_LAPACK "Lapack[veclib]")
+    endif()
+
+    if(NOT HAVE_BLAS OR NOT HAVE_LAPACK)
+      # if we haven't found blas and lapack check for OpenBlas
+      set(OPENBLAS_LIBS_REQUIRED openblas)
+      find_all_libraries(LAPACK_LIBRARIES OPENBLAS_LIBS_REQUIRED "" "")
+      if(LAPACK_LIBRARIES)
+        set_config_option(HAVE_BLAS "Blas[openblas]")
+        set_config_option(HAVE_LAPACK "Lapack[openblas]")
+        find_library(GFORTRAN_LIB gfortran)
+        if(GFORTRAN_LIB)
+          list(APPEND LAPACK_LIBRARIES ${GFORTRAN_LIB})
+        endif()
+      endif()
+    endif()
+
+    if(NOT HAVE_BLAS OR NOT HAVE_LAPACK)
+      # if we still haven't found blas and lapack, use the standard cmake tests,
+      # which require a working Fortran compiler
+      enable_language(Fortran)
+      find_package(BLAS)
+      if(BLAS_FOUND)
+        set_config_option(HAVE_BLAS "Blas")
+        find_package(LAPACK)
+        if(LAPACK_FOUND)
+          set_config_option(HAVE_LAPACK "Lapack")
+        else()
+          set(LAPACK_LIBRARIES ${BLAS_LIBRARIES})
+        endif()
+        if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
+          if(CMAKE_Fortran_COMPILER MATCHES "gfortran")
+            list(APPEND LAPACK_LIBRARIES gfortran)
+          elseif(CMAKE_Fortran_COMPILER MATCHES "f95")
+            list(APPEND LAPACK_LIBRARIES gfortran)
+          elseif(CMAKE_Fortran_COMPILER MATCHES "g77")
+            list(APPEND LAPACK_LIBRARIES g2c)
+          endif()
+        elseif(CMAKE_Fortran_COMPILER MATCHES "pgi")
+          list(APPEND LAPACK_LIBRARIES -pgf77libs)
+        endif()
+      endif()
+    endif()
+
+    if(NOT HAVE_BLAS OR NOT HAVE_LAPACK)
+      message(WARNING "Could not find Blas or Lapack: most meshing algorithms "
+              "will not be functional")
+    endif()
+
+  endif()
+endif()
+
+if(ENABLE_TCMALLOC)
+  find_library(TCMALLOC tcmalloc)
+  if(TCMALLOC)
+    set_config_option(HAVE_TCMALLOC "TCMalloc")
+    list(APPEND EXTERNAL_LIBRARIES ${TCMALLOC})
+  endif()
+endif()
+
+add_subdirectory(Common)
+add_subdirectory(Numeric)
+add_subdirectory(Geo)
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Mesh AND ENABLE_MESH)
+  add_subdirectory(Mesh)
+  set_config_option(HAVE_MESH "Mesh")
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Solver AND ENABLE_SOLVER)
+  add_subdirectory(Solver)
+  set_config_option(HAVE_SOLVER "Solver")
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Post AND ENABLE_POST)
+  add_subdirectory(Post)
+  set_config_option(HAVE_POST "Post")
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Plugin AND ENABLE_PLUGINS)
+    add_subdirectory(Plugin)
+    set_config_option(HAVE_PLUGINS "Plugins")
+  endif()
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Parser AND ENABLE_PARSER)
+  add_subdirectory(Parser)
+  set_config_option(HAVE_PARSER "Parser")
+endif()
+
+if(ENABLE_VISUDEV)
+  set_config_option(HAVE_VISUDEV "VisuDev")
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Fltk AND ENABLE_FLTK)
+  # first, try to use fltk-config for fltk >= 1.3 (FindFLTK is buggy on Unix,
+  # where e.g. xft and xinerama options are not dealt with)
+  find_program(FLTK_CONFIG_SCRIPT fltk-config)
+  if(FLTK_CONFIG_SCRIPT)
+    execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --api-version
+                    OUTPUT_VARIABLE FLTK_VERSION)
+    string(STRIP "${FLTK_VERSION}" FLTK_VERSION)
+    if(FLTK_VERSION VERSION_GREATER 1.1)
+      add_subdirectory(Fltk)
+      set_config_option(HAVE_FLTK "Fltk")
+      message(STATUS "Using fltk-config script for Fltk " ${FLTK_VERSION})
+      execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --use-gl --use-images --includedir
+                      OUTPUT_VARIABLE FLTK_INCLUDE_DIR)
+      string(STRIP ${FLTK_INCLUDE_DIR} FLTK_INCLUDE_DIR)
+      list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR})
+      # On linux (at least OpenSuSE) the following directories are
+      # not existing (everything is in /usr/include). To avoid warnings
+      # check existance of these directories before adding them
+      if(EXISTS ${FLTK_INCLUDE_DIR}/FL/images)
+        list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/FL/images)
+      endif()
+      if(EXISTS ${FLTK_INCLUDE_DIR}/jpeg)
+        list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/jpeg)
+      endif()
+      if(EXISTS ${FLTK_INCLUDE_DIR}/zlib)
+        list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/zlib)
+      endif()
+      if(EXISTS ${FLTK_INCLUDE_DIR}/png)
+        list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/png)
+      endif()
+      execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --use-gl --use-images --ldflags
+                      OUTPUT_VARIABLE FLTK_LIBRARIES)
+      string(STRIP ${FLTK_LIBRARIES} FLTK_LIBRARIES)
+      string(REGEX MATCH "fltk[_ ]jpeg" FLTK_JPEG ${FLTK_LIBRARIES})
+      string(REGEX MATCH "fltk[_ ]z" FLTK_Z ${FLTK_LIBRARIES})
+      string(REGEX MATCH "fltk[_ ]png" FLTK_PNG ${FLTK_LIBRARIES})
+    endif()
+  endif()
+  # then try the built-in FindFLTK module
+  if(NOT HAVE_FLTK)
+    set(FLTK_SKIP_FORMS TRUE)
+    set(FLTK_SKIP_FLUID TRUE)
+    find_package(FLTK)
+    if(FLTK_FOUND)
+      add_subdirectory(Fltk)
+      set_config_option(HAVE_FLTK "Fltk")
+      list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR})
+      # find fltk jpeg
+      find_library(FLTK_JPEG NAMES fltk_jpeg fltkjpeg)
+      if(FLTK_JPEG)
+        list(APPEND EXTERNAL_LIBRARIES ${FLTK_JPEG})
+        foreach(DIR ${FLTK_INCLUDE_DIR})
+          list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/jpeg)
+        endforeach()
+      endif()
+      # find fltk zlib
+      find_library(FLTK_Z NAMES fltk_z fltkz)
+      if(FLTK_Z)
+        list(APPEND EXTERNAL_LIBRARIES ${FLTK_Z})
+        foreach(DIR ${FLTK_INCLUDE_DIR})
+          list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/zlib)
+        endforeach()
+      endif()
+      # find fltk png
+      find_library(FLTK_PNG NAMES fltk_png fltkpng)
+      if(FLTK_PNG)
+        list(APPEND EXTERNAL_LIBRARIES ${FLTK_PNG})
+        foreach(DIR ${FLTK_INCLUDE_DIR})
+          list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/png)
+        endforeach()
+      endif()
+    endif()
+  endif()
+  # workaround for Fedora/Suse messing up fltk-config (see issue #417)
+  if(HAVE_FLTK AND ${CMAKE_SYSTEM_NAME} MATCHES "Linux")
+    string(REGEX MATCH "X11" FLTK_X11 ${FLTK_LIBRARIES})
+    if(NOT FLTK_X11)
+      find_package(X11)
+      if(X11_FOUND)
+        list(APPEND EXTERNAL_INCLUDES ${X11_INCLUDE_DIR})
+        list(APPEND EXTERNAL_LIBRARIES ${X11_LIBRARIES})
+      endif()
+    endif()
+  endif()
+endif()
+
+if(APPLE AND HAVE_FLTK AND ENABLE_TOUCHBAR)
+  if(CMAKE_OSX_DEPLOYMENT_TARGET)
+    if(${CMAKE_OSX_DEPLOYMENT_TARGET} VERSION_GREATER 10.11)
+      set(GMSH_SRC ${GMSH_SRC};Fltk/touchBar.mm)
+      set_config_option(HAVE_TOUCHBAR "TouchBar")
+    endif()
+  endif()
+endif()
+
+if(ENABLE_ONELAB)
+  set_config_option(HAVE_ONELAB "ONELAB")
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/onelab)
+    if(ENABLE_ONELAB_METAMODEL)
+      add_subdirectory(contrib/onelab)
+      include_directories(contrib/onelab)
+      set_config_option(HAVE_ONELAB_METAMODEL "ONELABMetamodel")
+    endif()
+    file(COPY ${ONELAB_PY} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+  endif()
+endif()
+
+if(ENABLE_BUILD_IOS)
+  find_file(CMAKE_TOOLCHAIN_FILE "ios.cmake")
+  if(NOT CMAKE_TOOLCHAIN_FILE)
+    message(FATAL_ERROR "Cannot compile Gmsh for iOS without a toolchain")
+  endif()
+  add_definitions(-DBUILD_IOS)
+endif()
+
+if(HAVE_FLTK OR ENABLE_GRAPHICS)
+  if(NOT HAVE_MESH OR NOT HAVE_POST OR NOT HAVE_PLUGINS OR NOT HAVE_ONELAB)
+    message(SEND_ERROR "Cannot compile GUI without Mesh, Post, Plugin and ONELAB")
+  endif()
+
+  if(FLTK_JPEG)
+    set_config_option(HAVE_LIBJPEG "Jpeg[fltk]")
+  else()
+    find_package(JPEG)
+    if(JPEG_FOUND)
+      set_config_option(HAVE_LIBJPEG "Jpeg")
+      list(APPEND EXTERNAL_LIBRARIES ${JPEG_LIBRARIES})
+      list(APPEND EXTERNAL_INCLUDES ${JPEG_INCLUDE_DIR})
+    endif()
+  endif()
+
+  if(FLTK_Z)
+    set_config_option(HAVE_LIBZ "Zlib[fltk]")
+  else()
+    find_package(ZLIB)
+    if(ZLIB_FOUND)
+      set_config_option(HAVE_LIBZ "Zlib")
+      list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
+      list(APPEND EXTERNAL_INCLUDES ${ZLIB_INCLUDE_DIR})
+    endif()
+  endif()
+
+  if(HAVE_LIBZ)
+    if(FLTK_PNG)
+      set_config_option(HAVE_LIBPNG "Png[fltk]")
+    else()
+      find_package(PNG)
+      if(PNG_FOUND)
+        set_config_option(HAVE_LIBPNG "Png")
+        list(APPEND EXTERNAL_LIBRARIES ${PNG_LIBRARIES})
+        list(APPEND EXTERNAL_INCLUDES ${PNG_INCLUDE_DIR})
+      endif()
+    endif()
+  endif()
+
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/mpeg_encode AND
+     ENABLE_MPEG_ENCODE)
+    add_subdirectory(contrib/mpeg_encode)
+    include_directories(contrib/mpeg_encode/headers)
+    set_config_option(HAVE_MPEG_ENCODE "Mpeg")
+  endif()
+
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/3M AND ENABLE_3M)
+    add_subdirectory(contrib/3M)
+    include_directories(contrib/3M)
+    set_config_option(HAVE_3M "3M")
+  endif()
+
+  if(ENABLE_OSMESA)
+    find_library(OSMESA_LIB OSMesa)
+    if(OSMESA_LIB)
+      set_config_option(HAVE_OSMESA "OSMesa")
+      list(APPEND EXTERNAL_LIBRARIES ${OSMESA_LIB})
+    endif()
+  endif()
+
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Graphics)
+    set(OpenGL_GL_PREFERENCE "LEGACY")
+    find_package(OpenGL REQUIRED)
+    if(OPENGL_GLU_FOUND AND OPENGL_FOUND)
+      add_subdirectory(Graphics)
+      set_config_option(HAVE_OPENGL "OpenGL")
+    else()
+      message(SEND_ERROR "Could not find GLU: disabling OpenGL support")
+    endif()
+  endif()
+endif()
+
+if(ENABLE_ANN)
+  find_library(ANN_LIB ANN PATH_SUFFIXES lib)
+  find_path(ANN_INC "ANN.h" PATH_SUFFIXES src include ANN)
+  if(ENABLE_SYSTEM_CONTRIB AND ANN_LIB AND ANN_INC)
+    message(STATUS "Using system version of ANN")
+    list(APPEND EXTERNAL_LIBRARIES ${ANN_LIB})
+    list(APPEND EXTERNAL_INCLUDES ${ANN_INC})
+    set_config_option(HAVE_ANN "Ann[system]")
+  elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/ANN)
+    add_subdirectory(contrib/ANN)
+    include_directories(contrib/ANN/include)
+    set_config_option(HAVE_ANN "Ann")
+  endif()
+endif()
+
+if(ENABLE_ALGLIB)
+  find_library(ALGLIB_LIB alglib PATH_SUFFIXES lib)
+  find_path(ALGLIB_INC "stdafx.h" PATH_SUFFIXES include)
+  if(ENABLE_SYSTEM_CONTRIB AND ALGLIB_LIB AND ALGLIB_INC)
+    list(APPEND EXTERNAL_LIBRARIES ${ALGLIB_LIB})
+    list(APPEND EXTERNAL_INCLUDES ${ALGLIB_INC})
+    set_config_option(HAVE_ALGLIB "ALGLIB[system]")
+  elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/ALGLIB)
+    add_subdirectory(contrib/ALGLIB)
+    include_directories(contrib/ALGLIB)
+    set_config_option(HAVE_ALGLIB "ALGLIB")
+  endif()
+endif()
+
+if(HAVE_FLTK AND ENABLE_CAIRO)
+  find_library(CAIRO_LIB cairo)
+  find_path(CAIRO_INC "cairo/cairo.h" PATH_SUFFIXES include)
+  if(CAIRO_INC AND CAIRO_LIB)
+     set_config_option(HAVE_CAIRO "Cairo")
+     list(APPEND EXTERNAL_LIBRARIES ${CAIRO_LIB})
+     list(APPEND EXTERNAL_INCLUDES ${CAIRO_INC})
+  endif()
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/DiscreteIntegration AND
+   ENABLE_DINTEGRATION)
+  add_subdirectory(contrib/DiscreteIntegration)
+  include_directories(contrib/DiscreteIntegration)
+  set_config_option(HAVE_DINTEGRATION "DIntegration")
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/HighOrderMeshOptimizer AND
+   EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MeshOptimizer AND
+   EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MeshQualityOptimizer AND
+   ENABLE_OPTHOM AND HAVE_MESH)
+  add_subdirectory(contrib/HighOrderMeshOptimizer)
+  include_directories(contrib/HighOrderMeshOptimizer)
+  add_subdirectory(contrib/MeshOptimizer)
+  include_directories(contrib/MeshOptimizer)
+  include_directories(${CMAKE_CURRENT_BINARY_DIR}/contrib/MeshOptimizer)
+  add_subdirectory(contrib/MeshQualityOptimizer)
+  include_directories(contrib/MeshQualityOptimizer)
+  set_config_option(HAVE_OPTHOM "OptHom")
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/domhex AND
+   ENABLE_DOMHEX AND HAVE_MESH)
+  add_subdirectory(contrib/domhex)
+  include_directories(contrib/domhex)
+  set_config_option(HAVE_DOMHEX "DomHex")
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/QuadTri AND
+   ENABLE_QUADTRI AND HAVE_MESH)
+  add_subdirectory(contrib/QuadTri)
+  include_directories(contrib/QuadTri)
+  set_config_option(HAVE_QUADTRI "QuadTri")
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/kbipack AND ENABLE_KBIPACK)
+  set_config_option(HAVE_KBIPACK "Kbipack")
+  add_subdirectory(contrib/kbipack)
+  include_directories(contrib/kbipack)
+  if(ENABLE_GMP)
+    find_library(GMP_LIB libgmp.a)
+    find_path(GMP_INC "gmp.h" PATH_SUFFIXES src include)
+  endif()
+  if(GMP_LIB AND GMP_INC)
+    set_config_option(HAVE_GMP "GMP")
+    list(APPEND EXTERNAL_LIBRARIES ${GMP_LIB})
+    list(APPEND EXTERNAL_INCLUDES ${GMP_INC})
+  else()
+    message(STATUS "GMP not found: Kbipack uses long int")
+  endif()
+endif()
+
+if(ENABLE_MATHEX)
+  find_library(MATHEX_LIB mathex PATH_SUFFIXES lib)
+  find_path(MATHEX_INC "mathex.h" PATH_SUFFIXES src include)
+  if(ENABLE_SYSTEM_CONTRIB AND MATHEX_LIB AND MATHEX_INC)
+    list(APPEND EXTERNAL_LIBRARIES ${MATHEX_LIB})
+    list(APPEND EXTERNAL_INCLUDES ${MATHEX_INC})
+    set_config_option(HAVE_MATHEX "MathEx[system]")
+  elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MathEx)
+    add_subdirectory(contrib/MathEx)
+    include_directories(contrib/MathEx)
+    set_config_option(HAVE_MATHEX "MathEx")
+  endif()
+endif()
+
+if(ENABLE_MPI)
+  find_package(MPI)
+  if(MPI_FOUND)
+    set_config_option(HAVE_MPI "MPI")
+    list(APPEND EXTERNAL_INCLUDES ${MPI_CXX_INCLUDE_PATH})
+    list(APPEND EXTERNAL_LIBRARIES ${MPI_CXX_LIBRARIES})
+    set(CMAKE_C_COMPILER ${MPI_C_COMPILER})
+    set(CMAKE_CXX_COMPILER ${MPI_CXX_COMPILER})
+    set(CMAKE_Fortran_COMPILER ${MPI_Fortran_COMPILER})
+  endif()
+endif()
+
+if(ENABLE_POPPLER)
+  find_library(POPPLER_LIB poppler)
+  find_library(POPPLER_CPP_LIB poppler-cpp)
+  find_path(POPPLER_INC "poppler/cpp/poppler-document.h" PATH_SUFFIXES src include)
+  if(POPPLER_LIB AND POPPLER_INC)
+    set_config_option(HAVE_POPPLER "Poppler")
+    list(APPEND EXTERNAL_LIBRARIES ${POPPLER_LIB})
+    list(APPEND EXTERNAL_LIBRARIES ${POPPLER_CPP_LIB})
+    list(APPEND EXTERNAL_INCLUDES ${POPPLER_INC})
+  endif()
+endif()
+
+if(ENABLE_P4EST)
+  find_library(P4EST_LIB p4est)
+  find_path(P4EST_INC "p4est.h" PATH_SUFFIXES src)
+  find_library(SC_LIB sc)
+  if(P4EST_LIB AND P4EST_INC AND SC_LIB)
+    set_config_option(HAVE_P4EST "P4est")
+    list(APPEND EXTERNAL_LIBRARIES ${P4EST_LIB} ${SC_LIB})
+    list(APPEND EXTERNAL_INCLUDES ${P4EST_INC})
+  endif()
+endif()
+
+if(HAVE_MESH OR HAVE_SOLVER)
+  if(ENABLE_METIS)
+    if(METIS_ROOT)
+      find_library(METIS_LIB metis PATHS ${METIS_ROOT} PATH_SUFFIXES lib)
+      find_path(METIS_INC "metis.h" PATHS ${METIS_ROOT} PATH_SUFFIXES include)
+      list(APPEND EXTERNAL_LIBRARIES ${METIS_LIB})
+      list(APPEND EXTERNAL_INCLUDES ${METIS_INC})
+      set_config_option(HAVE_METIS "Metis")
+    else()
+      find_library(METIS_LIB metis PATH_SUFFIXES lib)
+      find_path(METIS_INC "metis.h" PATH_SUFFIXES include)
+      if(ENABLE_SYSTEM_CONTRIB AND METIS_LIB AND METIS_INC)
+        message(STATUS "Using system version of METIS")
+        list(APPEND EXTERNAL_LIBRARIES ${METIS_LIB})
+        list(APPEND EXTERNAL_INCLUDES ${METIS_INC})
+        set_config_option(HAVE_METIS "Metis[system]")
+      elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/metis)
+        add_definitions(-DUSE_GKREGEX)
+        add_subdirectory(contrib/metis)
+        include_directories(contrib/metis/include contrib/metis/libmetis
+                          contrib/metis/GKlib)
+        set_config_option(HAVE_METIS "Metis")
+      endif()
+    endif()
+  endif()
+endif()
+
+if(HAVE_MESH)
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Mesh/tetgenBR.cxx)
+    set_config_option(HAVE_TETGENBR "TetGen/BR")
+  endif()
+
+  if(ENABLE_VOROPP)
+    find_library(VOROPP_LIB voro++ PATH_SUFFIXES lib)
+    find_path(VOROPP_INC "voro++.hh" PATH_SUFFIXES include)
+    if(ENABLE_SYSTEM_CONTRIB AND VOROPP_LIB AND VOROPP_INC)
+      message(STATUS "Using system version of voro++")
+      list(APPEND EXTERNAL_LIBRARIES ${VOROPP_LIB})
+      list(APPEND EXTERNAL_INCLUDES ${VOROPP_INC})
+      set_config_option(HAVE_VOROPP "Voro++[system]")
+    elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/voro++)
+      add_subdirectory(contrib/voro++)
+      include_directories(contrib/voro++/src)
+      set_config_option(HAVE_VOROPP "Voro++")
+    endif()
+  endif()
+
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/blossom AND ENABLE_BLOSSOM)
+    add_subdirectory(contrib/blossom)
+    include_directories(contrib/blossom/MATCH contrib/blossom/concorde97
+                        contrib/blossom/concorde97/INCLUDE)
+    set_config_option(HAVE_BLOSSOM "Blossom")
+  endif()
+
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/Netgen AND ENABLE_NETGEN)
+    add_subdirectory(contrib/Netgen)
+    include_directories(contrib/Netgen contrib/Netgen/libsrc/include
+                        contrib/Netgen/nglib)
+    set_config_option(HAVE_NETGEN "Netgen")
+    add_definitions(-DNO_PARALLEL_THREADS -DNOTCL)
+  endif()
+
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/bamg AND ENABLE_BAMG)
+    add_subdirectory(contrib/bamg)
+    include_directories(contrib/bamg contrib/bamg/bamglib)
+    set_config_option(HAVE_BAMG "Bamg")
+  endif()
+
+  if(ENABLE_MMG3D)
+    find_library(MMG3D_LIB mmg3d PATH_SUFFIXES lib)
+    find_path(MMG3D_INC "libmmg3d.h" PATH_SUFFIXES src include)
+    if(ENABLE_SYSTEM_CONTRIB AND MMG3D_LIB AND MMG3D_INC)
+      list(APPEND EXTERNAL_LIBRARIES ${MMG3D_LIB})
+      list(APPEND EXTERNAL_INCLUDES ${MMG3D_INC})
+      set_config_option(HAVE_MMG3D "Mmg3d[system]")
+    elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/mmg3d)
+      add_subdirectory(contrib/mmg3d)
+      include_directories(contrib/mmg3d/build/sources)
+      set_config_option(HAVE_MMG3D "Mmg3d")
+    endif()
+  endif()
+endif()
+
+if(ENABLE_MED OR ENABLE_CGNS)
+  find_package(HDF5)
+  if(HDF5_FOUND)
+    set(HDF5_LIB "${HDF5_C_LIBRARIES}")
+    list(APPEND EXTERNAL_INCLUDES ${HDF5_INCLUDE_DIRS})
+    if(ENABLE_MED)
+      find_library(MED_LIB medC)
+      if(MED_LIB)
+        set_config_option(HAVE_MED "Med")
+        list(APPEND EXTERNAL_LIBRARIES ${MED_LIB})
+      endif()
+    endif()
+    if(ENABLE_CGNS)
+      find_library(CGNS_LIB cgns HINTS ENV CGNS_ROOT PATH_SUFFIXES lib)
+      find_path(CGNS_INC "cgnslib.h" HINTS ENV CGNS_ROOT PATH_SUFFIXES include)
+      if(CGNS_LIB AND CGNS_INC)
+        set_config_option(HAVE_LIBCGNS "Cgns")
+        list(APPEND EXTERNAL_LIBRARIES ${CGNS_LIB})
+        list(APPEND EXTERNAL_INCLUDES ${CGNS_INC})
+        if(ENABLE_CGNS_CPEX0045)
+          set_config_option(HAVE_LIBCGNS_CPEX0045 "Cgns_CPEX0045")
+        endif()
+      endif()
+    endif()
+    if(MED_LIB OR CGNS_LIB)
+      list(APPEND EXTERNAL_LIBRARIES ${HDF5_LIB})
+      find_library(SZ_LIB NAMES szlib sz)
+      if(SZ_LIB)
+        list(APPEND EXTERNAL_LIBRARIES ${SZ_LIB})
+      endif()
+      if(NOT HAVE_LIBZ) # necessary for non-GUI builds
+        find_package(ZLIB)
+        if(ZLIB_FOUND)
+          set_config_option(HAVE_LIBZ "Zlib")
+          list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
+        endif()
+      endif()
+    endif()
+  else()
+    message(STATUS "HDF5 not found")
+  endif()
+endif()
+
+if(HAVE_SOLVER)
+  if(ENABLE_GMM)
+    find_path(GMM_INC "gmm.h" PATH_SUFFIXES src include include/gmm)
+    if(ENABLE_SYSTEM_CONTRIB AND GMM_INC)
+      message(STATUS "Using system version of GMM")
+      list(APPEND EXTERNAL_INCLUDES ${GMM_INC})
+      set_config_option(HAVE_GMM "Gmm[system]")
+    elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/gmm)
+      include_directories(contrib/gmm)
+      set_config_option(HAVE_GMM "Gmm")
+    endif()
+  endif()
+
+  if(ENABLE_PETSC)
+    if(PETSC_DIR)
+      set(ENV_PETSC_DIR ${PETSC_DIR})
+    else()
+      set(ENV_PETSC_DIR $ENV{PETSC_DIR})
+    endif()
+    if(PETSC_ARCH)
+      set(ENV_PETSC_ARCH ${PETSC_ARCH})
+    else()
+      set(ENV_PETSC_ARCH $ENV{PETSC_ARCH})
+    endif()
+    set(PETSC_POSSIBLE_CONF_FILES
+        ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/conf/petscvariables
+        ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib/petsc-conf/petscvariables
+        ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib/petsc/conf/petscvariables)
+    foreach(FILE ${PETSC_POSSIBLE_CONF_FILES})
+      if(EXISTS ${FILE})
+        # old-style PETSc installations (using PETSC_DIR and PETSC_ARCH)
+        message(STATUS "Using PETSc dir: ${ENV_PETSC_DIR}")
+        message(STATUS "Using PETSc arch: ${ENV_PETSC_ARCH}")
+        # find includes by parsing the petscvariables file
+        file(STRINGS ${FILE} PETSC_VARIABLES NEWLINE_CONSUME)
+      endif()
+    endforeach()
+    if(PETSC_VARIABLES)
+      # try to find PETSC_CC_INCLUDES for PETSc >= 3.4
+      string(REGEX MATCH "PETSC_CC_INCLUDES = [^\n\r]*" PETSC_PACKAGES_INCLUDES
+             ${PETSC_VARIABLES})
+      if(PETSC_PACKAGES_INCLUDES)
+        string(REPLACE "PETSC_CC_INCLUDES = " "" PETSC_PACKAGES_INCLUDES
+               ${PETSC_PACKAGES_INCLUDES})
+      else()
+        # try to find PETSC_PACKAGES_INCLUDES in older versions
+        list(APPEND EXTERNAL_INCLUDES ${ENV_PETSC_DIR}/include)
+        list(APPEND EXTERNAL_INCLUDES ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/include)
+        string(REGEX MATCH "PACKAGES_INCLUDES = [^\n\r]*" PETSC_PACKAGES_INCLUDES
+               ${PETSC_VARIABLES})
+        string(REPLACE "PACKAGES_INCLUDES = " "" PETSC_PACKAGES_INCLUDES
+               ${PETSC_PACKAGES_INCLUDES})
+      endif()
+      if(PETSC_PACKAGES_INCLUDES)
+        if(PETSC_PACKAGES_INCLUDES)
+          string(REPLACE "-I" "" PETSC_PACKAGES_INCLUDES ${PETSC_PACKAGES_INCLUDES})
+          string(REPLACE " " ";" PETSC_PACKAGES_INCLUDES ${PETSC_PACKAGES_INCLUDES})
+          foreach(VAR ${PETSC_PACKAGES_INCLUDES})
+            # seem to include unexisting directories (/usr/include/lib64)
+	    # check to avoid warnings
+	    if(EXISTS ${VAR})
+	      list(APPEND EXTERNAL_INCLUDES ${VAR})
+            endif()
+          endforeach()
+        endif()
+      endif()
+      # find libraries (<= 3.0)
+      set(PETSC_LIBS_REQUIRED petscksp petscdm petscmat petscvec petsc)
+      find_all_libraries(PETSC_LIBS PETSC_LIBS_REQUIRED
+                         ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib "")
+      # petsc 3.1 creates only one library (libpetsc)
+      if(NOT PETSC_LIBS)
+        find_library(PETSC_LIBS petsc PATHS ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib
+                     NO_DEFAULT_PATH)
+      endif()
+      if(PETSC_LIBS)
+        set_config_option(HAVE_PETSC "PETSc")
+	if(NOT HAVE_BLAS)
+          set_config_option(HAVE_BLAS "Blas[petsc]")
+        endif()
+	if(NOT HAVE_LAPACK)
+          set_config_option(HAVE_LAPACK "Lapack[petsc]")
+        endif()
+      endif()
+      # find slepc (needs to be linked in before petsc)
+      if(ENABLE_SLEPC)
+        if(SLEPC_DIR)
+          set(ENV_SLEPC_DIR ${SLEPC_DIR})
+         else()
+          set(ENV_SLEPC_DIR $ENV{SLEPC_DIR})
+        endif()
+        find_library(SLEPC_LIB slepc PATHS ${ENV_SLEPC_DIR}/${ENV_PETSC_ARCH}/lib
+                     NO_DEFAULT_PATH)
+        if(SLEPC_LIB)
+          find_path(SLEPC_INC "slepc.h" PATHS ${ENV_SLEPC_DIR} PATH_SUFFIXES include
+                    ${ENV_PETSC_ARCH}/include include/slepc NO_DEFAULT_PATH)
+          if(SLEPC_INC)
+            message(STATUS "Using SLEPc dir: ${ENV_SLEPC_DIR}")
+            set_config_option(HAVE_SLEPC "SLEPc")
+            list(APPEND EXTERNAL_LIBRARIES ${SLEPC_LIB})
+            list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC})
+            find_path(SLEPC_INC2 "slepcconf.h" PATHS ${ENV_SLEPC_DIR}
+                      PATH_SUFFIXES ${ENV_PETSC_ARCH}/include NO_DEFAULT_PATH)
+            if(SLEPC_INC2)
+              list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC2})
+            endif()
+          endif()
+        endif()
+      endif()
+      list(APPEND EXTERNAL_LIBRARIES ${PETSC_LIBS})
+      # find additional libraries to link with
+      string(REGEX MATCH "PACKAGES_LIBS = [^\n\r]*" PLIBS ${PETSC_VARIABLES})
+      if(PLIBS)
+        string(REPLACE "PACKAGES_LIBS = " "" PLIBS ${PLIBS})
+        string(STRIP ${PLIBS} PLIBS)
+        list(APPEND EXTERNAL_LIBRARIES "${PLIBS}")
+      endif()
+      string(REGEX MATCH "PETSC_EXTERNAL_LIB_BASIC = [^\n\r]*" PLIBS_BASIC ${PETSC_VARIABLES})
+      if(PLIBS_BASIC)
+        string(REPLACE "PETSC_EXTERNAL_LIB_BASIC = " "" PLIBS_BASIC ${PLIBS_BASIC})
+        string(STRIP ${PLIBS_BASIC} PLIBS_BASIC)
+        separate_arguments(PLIBS_BASIC)
+        list(APPEND EXTERNAL_LIBRARIES "${PLIBS_BASIC}")
+      endif()
+      string(REGEX MATCH "PCC_LINKER_LIBS = [^\n\r]*" LLIBS ${PETSC_VARIABLES})
+      if(LLIBS)
+        string(REPLACE "PCC_LINKER_LIBS = " "" LLIBS ${LLIBS})
+        string(STRIP ${LLIBS} LLIBS)
+        list(APPEND EXTERNAL_LIBRARIES "${LLIBS}")
+      endif()
+    else()
+      # new-style PETSc installations (in standard system directories)
+      find_library(PETSC_LIBS petsc)
+      find_path(PETSC_INC "petsc.h" PATH_SUFFIXES include/petsc)
+      if(PETSC_LIBS AND PETSC_INC)
+        set_config_option(HAVE_PETSC "PETSc")
+        if(ENABLE_SLEPC)
+          find_library(SLEPC_LIB slepc)
+          find_path(SLEPC_INC "slepc.h" PATH_SUFFIXES include/slepc)
+          if(SLEPC_LIB AND SLEPC_INC)
+            set_config_option(HAVE_SLEPC "SLEPc")
+            list(APPEND EXTERNAL_LIBRARIES ${SLEPC_LIB})
+            list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC})
+          endif()
+        endif()
+        list(APPEND EXTERNAL_LIBRARIES ${PETSC_LIBS})
+        list(APPEND EXTERNAL_INCLUDES ${PETSC_INC})
+      endif()
+    endif()
+  endif()
+
+  if(ENABLE_MUMPS AND HAVE_BLAS AND HAVE_LAPACK)
+    set(MUMPS_LIBS_REQUIRED smumps dmumps cmumps zmumps mumps_common pord)
+    if(NOT ENABLE_MPI)
+      list(APPEND MUMPS_LIBS_REQUIRED mpiseq)
+    endif()
+    find_all_libraries(MUMPS_LIBRARIES MUMPS_LIBS_REQUIRED "" "lib")
+    find_path(SMUMPS_INC "smumps_c.h" PATH_SUFFIXES src include)
+    find_path(DMUMPS_INC "dmumps_c.h" PATH_SUFFIXES src include)
+    find_path(CMUMPS_INC "cmumps_c.h" PATH_SUFFIXES src include)
+    find_path(ZMUMPS_INC "zmumps_c.h" PATH_SUFFIXES src include)
+    if(MUMPS_LIBRARIES AND SMUMPS_INC AND DMUMPS_INC AND CMUMPS_INC AND ZMUMPS_INC)
+      set_config_option(HAVE_MUMPS "MUMPS")
+      list(APPEND EXTERNAL_LIBRARIES ${MUMPS_LIBRARIES})
+      list(APPEND EXTERNAL_INCLUDES ${SMUMPS_INC})
+      list(APPEND EXTERNAL_INCLUDES ${DMUMPS_INC})
+      list(APPEND EXTERNAL_INCLUDES ${CMUMPS_INC})
+      list(APPEND EXTERNAL_INCLUDES ${ZMUMPS_INC})
+      find_library(GFORTRAN_LIB gfortran)
+      if(GFORTRAN_LIB)
+        list(APPEND EXTERNAL_LIBRARIES ${GFORTRAN_LIB})
+      endif()
+      if(ENABLE_GMM) # use GMM/MUMPS interface
+        add_definitions(-DGMM_USES_MUMPS)
+      endif()
+    endif()
+  endif()
+
+  if(ENABLE_GETDP)
+    find_library(GETDP_LIB GetDP)
+    find_path(GETDP_INC "GetDP.h" PATH_SUFFIXES getdp)
+    if(GETDP_LIB AND GETDP_INC)
+      set_config_option(HAVE_GETDP "GetDP")
+      list(APPEND EXTERNAL_LIBRARIES ${GETDP_LIB})
+      list(APPEND EXTERNAL_INCLUDES ${GETDP_INC})
+    endif()
+  endif()
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt AND
+   ENABLE_HXT AND HAVE_METIS)
+  set_config_option(HAVE_HXT "Hxt")
+  add_subdirectory(contrib/hxt)
+  include_directories(BEFORE contrib/hxt)
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt/hxt_tetDelaunay.c)
+    set_config_option(HAVE_HXT3D "Hxt3D")
+  endif()
+  if(MSVC)
+    # Visual C++ does not support C99 - force compilation as C++ code
+    file(GLOB_RECURSE HXT_SRC contrib/hxt/*.c)
+    set_compile_flags(HXT_SRC "/TP")
+  endif()
+  check_include_file("immintrin.h" HAVE_IMMINTRIN_H)
+  if(NOT HAVE_IMMINTRIN_H)
+    add_definitions(-DHAVE_NO_IMMINTRIN_H)
+  endif()
+  if(HAVE_PETSC)
+    add_definitions(-DHXT_HAVE_PETSC)
+  endif()
+  if(CMAKE_C_COMPILER MATCHES "pgi")
+    add_definitions(-DHAVE_NO_OPENMP_SIMD)
+  endif()
+endif()
+
+if(ENABLE_OCC)
+  set(OCC_MINIMAL_VERSION "6.9.1")
+  if(WIN32)
+    if(HAVE_64BIT_SIZE_T)
+      set(OCC_SYS_NAME win64)
+    else()
+      set(OCC_SYS_NAME win32)
+    endif()
+  else()
+    set(OCC_SYS_NAME ${CMAKE_SYSTEM_NAME})
+  endif()
+  find_path(OCC_INC "Standard_Version.hxx" HINTS ENV CASROOT PATH_SUFFIXES
+            inc include include/oce opencascade include/opencascade
+            occt include/occt)
+  if(OCC_INC)
+    file(STRINGS ${OCC_INC}/Standard_Version.hxx
+         OCC_MAJOR REGEX "#define OCC_VERSION_MAJOR.*")
+    file(STRINGS ${OCC_INC}/Standard_Version.hxx
+         OCC_MINOR REGEX "#define OCC_VERSION_MINOR.*")
+    file(STRINGS ${OCC_INC}/Standard_Version.hxx
+         OCC_MAINT REGEX "#define OCC_VERSION_MAINTENANCE.*")
+    if(OCC_MAJOR AND OCC_MINOR AND OCC_MAINT)
+      string(REGEX MATCH "[0-9]+" OCC_MAJOR "${OCC_MAJOR}")
+      string(REGEX MATCH "[0-9]+" OCC_MINOR "${OCC_MINOR}")
+      string(REGEX MATCH "[0-9]+" OCC_MAINT "${OCC_MAINT}")
+      set(OCC_VERSION "${OCC_MAJOR}.${OCC_MINOR}.${OCC_MAINT}")
+      message(STATUS "Found OpenCASCADE version ${OCC_VERSION} in ${OCC_INC}")
+    endif()
+  endif()
+  if(OCC_VERSION AND OCC_VERSION STRLESS ${OCC_MINIMAL_VERSION})
+    message(WARNING "Gmsh requires OpenCASCADE >= ${OCC_MINIMAL_VERSION}. "
+        "Use CMAKE_PREFIX_PATH or the CASROOT environment variable "
+        "to explicitely specify the installation path of OpenCASCADE")
+  elseif(OCC_INC)
+    set(OCC_LIBS_REQUIRED
+	# subset of DataExchange
+      	TKSTEP TKSTEP209 TKSTEPAttr TKSTEPBase TKIGES TKXSBase
+      	# ModelingAlgorithms
+      	TKOffset TKFeat TKFillet TKBool TKMesh TKHLR TKBO TKPrim TKShHealing
+      	TKTopAlgo TKGeomAlgo
+      	# ModelingData
+      	TKBRep TKGeomBase TKG3d TKG2d
+      	# FoundationClasses
+      	TKMath TKernel)
+    if(ENABLE_OCC_TBB)
+      list(APPEND OCC_LIBS_REQUIRED tbb tbbmalloc)
+    endif()
+    list(LENGTH OCC_LIBS_REQUIRED NUM_OCC_LIBS_REQUIRED)
+    if(OCC_LIBS)
+      message(STATUS "OCC libraries specified explicitly: " ${OCC_LIBS})
+      list(LENGTH OCC_LIBS_REQUIRED NUM_OCC_LIBS)
+    else()
+      set(OCC_LIBS)
+      foreach(OCC ${OCC_LIBS_REQUIRED})
+        if(ENABLE_OCC_STATIC)
+          set(LIBNAME lib${OCC}.a)
+        else()
+          set(LIBNAME ${OCC})
+        endif()
+        find_library(OCC_LIB ${LIBNAME} HINTS ENV CASROOT PATH_SUFFIXES
+                     lib ${OCC_SYS_NAME}/lib ${OCC_SYS_NAME}/vc8/lib)
+        if(OCC_LIB)
+	  list(APPEND OCC_LIBS ${OCC_LIB})
+        else()
+          message(STATUS "OCC lib " ${LIBNAME} " not Found")
+        endif()
+        unset(OCC_LIB CACHE)
+      endforeach()
+      list(LENGTH OCC_LIBS NUM_OCC_LIBS)
+    endif()
+  endif()
+
+  # additional OCC libraries to handle reading of STEP/IGES attributes. Oh my...
+  if(ENABLE_OCC_CAF)
+    find_package(Freetype)
+    if(FREETYPE_FOUND)
+      set(OCC_CAF_LIBS_REQUIRED
+          TKXDESTEP TKXDEIGES TKXCAF TKLCAF TKVCAF TKCAF TKV3d TKService TKCDF)
+      list(LENGTH OCC_CAF_LIBS_REQUIRED NUM_OCC_CAF_LIBS_REQUIRED)
+      set(OCC_CAF_LIBS)
+      foreach(OCC ${OCC_CAF_LIBS_REQUIRED})
+        find_library(OCC_CAF_LIB ${OCC} HINTS ENV CASROOT PATH_SUFFIXES
+                     lib ${OCC_SYS_NAME}/lib ${OCC_SYS_NAME}/vc8/lib)
+        if(OCC_CAF_LIB)
+          list(APPEND OCC_CAF_LIBS ${OCC_CAF_LIB})
+        else()
+          message(STATUS "OCC CAF lib " ${OCC} " not Found")
+        endif()
+        unset(OCC_CAF_LIB CACHE)
+      endforeach()
+      list(LENGTH OCC_CAF_LIBS NUM_OCC_CAF_LIBS)
+    endif()
+  endif()
+
+  # append OCC CAF libraries first...
+  if(NUM_OCC_CAF_LIBS EQUAL NUM_OCC_CAF_LIBS_REQUIRED)
+    set_config_option(HAVE_OCC_CAF "OpenCASCADE-CAF")
+    list(APPEND EXTERNAL_LIBRARIES ${OCC_CAF_LIBS} ${FREETYPE_LIBRARIES})
+    list(APPEND EXTERNAL_INCLUDES ${FREETYPE_INCLUDE_DIRS})
+    if(WIN32)
+      list(APPEND EXTERNAL_LIBRARIES "windowscodecs")
+      list(APPEND EXTERNAL_LIBRARIES "ole32")
+    endif()
+  endif()
+
+  # then append OCC libraries
+  if(NUM_OCC_LIBS EQUAL NUM_OCC_LIBS_REQUIRED)
+    set_config_option(HAVE_OCC "OpenCASCADE")
+    list(APPEND EXTERNAL_LIBRARIES ${OCC_LIBS})
+    list(APPEND EXTERNAL_INCLUDES ${OCC_INC})
+    if(HAVE_64BIT_SIZE_T)
+      add_definitions(-D_OCC64)
+    endif()
+    if(WIN32)
+      list(APPEND EXTERNAL_LIBRARIES "winspool")
+      add_definitions(-DOCC_CONVERT_SIGNALS)
+    elseif(MSVC)
+      add_definitions(-DWNT)
+    endif()
+  endif()
+endif()
+
+if(ENABLE_ACIS)
+  find_library(ACIS_LIB SpaACIS PATH_SUFFIXES bin/maci386)
+  if(ACIS_LIB)
+    find_path(ACIS_INC "kernapi.hxx" PATH_SUFFIXES include)
+    if(ACIS_INC)
+      set_config_option(HAVE_ACIS "Acis")
+      list(APPEND EXTERNAL_LIBRARIES ${ACIS_LIB})
+      list(APPEND EXTERNAL_INCLUDES ${ACIS_INC})
+    endif()
+  endif()
+endif()
+
+if(ENABLE_ZIPPER)
+  if(ENABLE_BUILD_IOS)
+    set_config_option(HAVE_LIBZ "Zlib")
+  endif()
+  if(NOT HAVE_LIBZ) # necessary for non-GUI builds
+    find_package(ZLIB)
+    if(ZLIB_FOUND)
+      set_config_option(HAVE_LIBZ "Zlib")
+      list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
+      list(APPEND EXTERNAL_INCLUDES ${ZLIB_INCLUDE_DIR})
+    endif()
+  endif()
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/zipper AND HAVE_LIBZ)
+    add_subdirectory(contrib/zipper)
+    include_directories(contrib/zipper)
+    set_config_option(HAVE_ZIPPER "Zipper")
+  endif()
+endif()
+
+if(ENABLE_PRIVATE_API AND ENABLE_WRAP_PYTHON)
+  find_package(SWIG REQUIRED)
+  include(${SWIG_USE_FILE})
+  find_package(PythonLibs)
+  if(SWIG_FOUND AND PYTHONLIBS_FOUND)
+    message(STATUS "Found SWIG version " ${SWIG_VERSION})
+    find_package(PythonInterp)
+    string(SUBSTRING ${SWIG_VERSION} 0 1 SWIG_MAJOR_VERSION)
+    if(SWIG_MAJOR_VERSION EQUAL 1)
+      message(WARNING "Python bindings require SWIG >= 2: disabling Python")
+    else()
+      set_config_option(HAVE_PYTHON "Python")
+      mark_as_advanced(CLEAR PYTHON_LIBRARY PYTHON_INCLUDE_DIR)
+      if(ENABLE_NUMPY)
+        if (NOT NUMPY_INC)
+          EXEC_PROGRAM (${PYTHON_EXECUTABLE}
+            ARGS "-c \"import numpy; print(numpy.get_include())\""
+            OUTPUT_VARIABLE NUMPY_INC
+            RETURN_VALUE NUMPY_NOT_FOUND)
+        endif()
+        if(NUMPY_INC)
+          list(APPEND EXTERNAL_INCLUDES ${NUMPY_INC})
+          set_config_option(HAVE_NUMPY "Numpy")
+        endif()
+      endif()
+      if(HAVE_PETSC)
+        if(ENABLE_PETSC4PY)
+          EXECUTE_PROCESS(
+            COMMAND ${PYTHON_EXECUTABLE} -c "import petsc4py; print(petsc4py.get_include())"
+            OUTPUT_VARIABLE PETSC4PY_INC
+            RESULT_VARIABLE PETSC4PY_NOT_FOUND
+            ERROR_QUIET
+            OUTPUT_STRIP_TRAILING_WHITESPACE)
+          if(PETSC4PY_INC)
+            list(APPEND EXTERNAL_INCLUDES ${PETSC4PY_INC})
+            set_config_option(HAVE_PETSC4PY "PETSc4py")
+          endif()
+        endif()
+      endif()
+    endif()
+  endif()
+endif()
+
+check_function_exists(vsnprintf HAVE_VSNPRINTF)
+if(NOT HAVE_VSNPRINTF AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
+  set_config_option(HAVE_NO_VSNPRINTF "NoVsnprintf")
+endif()
+
+check_include_file(sys/socket.h HAVE_SYS_SOCKET_H)
+if(HAVE_SYS_SOCKET_H)
+  set(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h)
+endif()
+check_type_size(socklen_t SOCKLEN_T_SIZE)
+set(CMAKE_EXTRA_INCLUDE_FILES)
+if(NOT SOCKLEN_T_SIZE AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
+  set_config_option(HAVE_NO_SOCKLEN_T "NoSocklenT")
+endif()
+
+check_include_file(stdint.h HAVE_STDINT_H)
+if(HAVE_STDINT_H)
+  set(CMAKE_EXTRA_INCLUDE_FILES stdint.h)
+else()
+  set_config_option(HAVE_NO_STDINT_H "NoStdintH")
+endif()
+check_type_size(intptr_t INTPTR_T_SIZE)
+set(CMAKE_EXTRA_INCLUDE_FILES)
+if(NOT INTPTR_T_SIZE AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
+  set_config_option(HAVE_NO_INTPTR_T "NoIntptrT")
+endif()
+
+check_include_file(dlfcn.h DLFCN_H)
+if(DLFCN_H)
+  set_config_option(HAVE_DLOPEN "Dlopen")
+  list(APPEND EXTERNAL_LIBRARIES ${CMAKE_DL_LIBS})
+endif()
+
+if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
+  check_include_file(linux/joystick.h LINUX_JOYSTICK_H)
+  if(LINUX_JOYSTICK_H)
+    set_config_option(HAVE_LINUX_JOYSTICK "LinuxJoystick")
+  endif()
+endif()
+
+if(WIN32)
+  add_definitions(-D_USE_MATH_DEFINES)
+  list(APPEND EXTERNAL_LIBRARIES winmm wsock32 ws2_32 psapi)
+endif()
+
+if(MSVC)
+  add_definitions(-DNOMINMAX -D_CRT_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_DEPRECATE)
+endif()
+
+# add C functions API
+set(GMSH_SRC ${GMSH_SRC};api/gmshc.cpp)
+
+# force full warnings to encourage everybody to write clean(er) code
+check_cxx_compiler_flag("-Wall" WALL)
+if(WALL AND NOT MSVC)
+  file(GLOB_RECURSE WALL_SRC Common/*.cpp Fltk/*.cpp FunctionSpace/*.cpp
+       Geo/*.cpp Graphics/*.cpp Mesh/*.cpp Numeric/*.cpp Parser/*.cpp
+       Plugin/*.cpp Post/*.cpp Solver/*.cpp)
+  set(WF "-Wall")
+  check_cxx_compiler_flag("-Wint-to-void-pointer-cast" WCAST)
+  if(WCAST)
+    set(WF "${WF} -Wno-int-to-void-pointer-cast")
+  endif()
+  check_cxx_compiler_flag("-Wdeprecated-declarations" WDEPREC)
+  if(WDEPREC)
+    # FIXME: remove this when we have fixed the deprecated GLU code for OpenGL3
+    set(WF "${WF} -Wno-deprecated-declarations")
+  endif()
+  check_cxx_compiler_flag("-Wmisleading-indentation" WIND)
+  if(WIND)
+    set(WF "${WF} -Wno-misleading-indentation")
+  endif()
+  set_compile_flags(WALL_SRC ${WF})
+endif()
+
+# don't issue warnings for contributed libraries
+check_cxx_compiler_flag("-w" NOWARN)
+if(NOWARN)
+  file(GLOB_RECURSE NOWARN_SRC contrib/*.cpp contrib/*.cc contrib/*.cxx contrib/*.c)
+  set_compile_flags(NOWARN_SRC "-w")
+endif()
+
+# disable compile optimization on some known problematic files
+check_cxx_compiler_flag("-O0" NOOPT)
+if(NOOPT OR ENABLE_BUILD_IOS)
+  if(ENABLE_BUILD_IOS) # optimized iOS 10 64 bits screws somewhere in Geo
+    file(GLOB_RECURSE NOOPT_SRC Numeric/robustPredicates.cpp Geo/G*.cpp Mesh/BDS.cpp
+         Parser/Gmsh.tab.cpp contrib/blossom/* Mesh/Background*)
+  else()
+    file(GLOB_RECURSE NOOPT_SRC Numeric/robustPredicates.cpp Mesh/BDS.cpp
+         Parser/Gmsh.tab.cpp contrib/blossom/* contrib/bamg/* Mesh/Background*)
+  endif()
+  set_compile_flags(NOOPT_SRC "-O0")
+endif()
+
+# do not use arithmetic contraction in predicates.cpp
+# if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
+#   set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
+#     COMPILE_FLAGS "/fp:strict")
+# elseif(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
+#   set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
+#     COMPILE_FLAGS "-fno-unsafe-math-optimizations -ffp-contract=off")
+# elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel")
+#   set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
+#     COMPILE_FLAGS "-fp-model strict")
+# endif()
+
+# enable Revoropt and set compile flags for the corresponding plugin
+if(ENABLE_REVOROPT)
+  find_path(EIGEN3_INC "eigen3/Eigen/Dense")
+  if(EIGEN3_INC AND HAVE_MESH AND HAVE_PLUGINS AND HAVE_ANN AND HAVE_ALGLIB)
+    list(APPEND EXTERNAL_INCLUDES ${EIGEN3_INC} contrib/Revoropt/include)
+    message(STATUS "using contrib/Revoropt")
+    set_config_option(HAVE_REVOROPT "Revoropt")
+    add_definitions(-DUSE_ANN)
+    get_source_file_property(PROP Plugin/CVTRemesh.cpp COMPILE_FLAGS)
+    if(PROP)
+      set_source_files_properties(Plugin/CVTRemesh.cpp PROPERTIES
+                                  COMPILE_FLAGS "${PROP} -std=c++11")
+    else()
+      set_source_files_properties(Plugin/CVTRemesh.cpp PROPERTIES
+                                  COMPILE_FLAGS "-std=c++11")
+    endif()
+  else()
+    message(WARNING "Revoropt requires Eigen3, Mesh, Plugins, ANN and ALGLIB")
+  endif()
+endif()
+
+list(SORT CONFIG_OPTIONS)
+set(GMSH_CONFIG_OPTIONS "")
+foreach(OPT ${CONFIG_OPTIONS})
+  set(GMSH_CONFIG_OPTIONS "${GMSH_CONFIG_OPTIONS} ${OPT}")
+endforeach()
+
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Common/GmshConfig.h.in
+               ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshConfig.h)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Common/GmshVersion.h.in
+               ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshVersion.h)
+
+# the texi version file is modified in the source directory (not ideal, but
+# since git tracks the contents of the file this is acceptable as it will only
+# change when the actual version is changed - not for each git hash)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo/version.texi.in
+               ${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo/version.texi)
+
+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/version.txt
+     ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}.${GMSH_PATCH_VERSION})
+
+# process cmake environment variables so we can append them to the -I include
+# commands. This is not recommended (we should only use the cache variables) but
+# it is very convenient: otherwise we have to remember providing the
+# -D... options to cmake for each new build.
+set(ENV_CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH})
+set(ENV_CMAKE_INCLUDE_PATH $ENV{CMAKE_INCLUDE_PATH})
+if(UNIX)
+  if(ENV_CMAKE_PREFIX_PATH)
+    string(REPLACE ":" ";" ENV_CMAKE_PREFIX_PATH ${ENV_CMAKE_PREFIX_PATH})
+  endif()
+  if(ENV_CMAKE_INCLUDE_PATH)
+    string(REPLACE ":" ";" ENV_CMAKE_INCLUDE_PATH ${ENV_CMAKE_INCLUDE_PATH})
+  endif()
+endif()
+list(APPEND EXTERNAL_INCLUDES ${CMAKE_INCLUDE_PATH} ${ENV_CMAKE_INCLUDE_PATH})
+list(APPEND EXTERNAL_INCLUDES ${CMAKE_PREFIX_PATH} ${ENV_CMAKE_PREFIX_PATH})
+foreach(DIR ${CMAKE_PREFIX_PATH} ${ENV_CMAKE_PREFIX_PATH})
+  list(APPEND EXTERNAL_INCLUDES ${DIR}/include)
+endforeach()
+
+if(EXTERNAL_INCLUDES)
+  list(REMOVE_DUPLICATES EXTERNAL_INCLUDES)
+endif()
+
+if(HAVE_FLTK)
+  set(LINK_LIBRARIES ${FLTK_LIBRARIES} ${EXTERNAL_LIBRARIES}
+                     ${OPENGL_LIBRARIES} ${LAPACK_LIBRARIES})
+elseif(HAVE_OPENGL)
+  set(LINK_LIBRARIES ${EXTERNAL_LIBRARIES} ${OPENGL_LIBRARIES}
+                     ${LAPACK_LIBRARIES})
+else()
+  set(LINK_LIBRARIES ${EXTERNAL_LIBRARIES} ${LAPACK_LIBRARIES})
+endif()
+
+# try to use static gfortran on static builds (cannot do this on dynamic builds
+# as e.g. Debian compiles libgfortran.a without -fPIC: sigh...)
+if(NOT ENABLE_BUILD_DYNAMIC AND NOT ENABLE_BUILD_SHARED)
+  find_library(GFORTRAN_STATIC libgfortran.a)
+  if(GFORTRAN_STATIC)
+    set(CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES)
+    message(STATUS "Using static libgfortran")
+    foreach(STR ${LINK_LIBRARIES})
+      string(REPLACE "-lgfortran" ${GFORTRAN_STATIC} STR2 ${STR})
+      list(APPEND LINK_LIBRARIES2 ${STR2})
+    endforeach()
+    set(LINK_LIBRARIES ${LINK_LIBRARIES2})
+  endif()
+endif()
+
+# Linux-specific linking
+if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
+  if(HAVE_OCC)
+    find_library(RT_LIB rt)
+    if(RT_LIB)
+      list(APPEND LINK_LIBRARIES ${RT_LIB})
+    endif()
+  endif()
+  if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Intel")
+    add_definitions(-fPIC)
+  endif()
+endif()
+
+# we could specify include dirs more selectively, but this is simpler
+include_directories(Common Fltk Geo Graphics Mesh Solver Numeric Parser
+  Plugin Post api ${EXTERNAL_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR}/Common)
+
+# set this for external codes that might include this CMakeList file
+set(GMSH_EXTERNAL_INCLUDE_DIRS ${EXTERNAL_INCLUDES} CACHE
+    STRING "External include directories" FORCE)
+set(GMSH_EXTERNAL_LIBRARIES ${LINK_LIBRARIES} CACHE
+    STRING "External libraries" FORCE)
+
+# group sources for easier navigation in IDEs
+foreach(DIR ${GMSH_DIRS})
+  string(REGEX REPLACE "\\+" "\\\\+" DIR ${DIR})
+  source_group(${DIR} REGULAR_EXPRESSION ${DIR}/.*)
+endforeach()
+
+# static library target
+if(ENABLE_BUILD_LIB)
+  add_library(lib STATIC ${GMSH_SRC})
+  set_target_properties(lib PROPERTIES OUTPUT_NAME gmsh)
+  if(MSVC)
+    set_target_properties(lib PROPERTIES DEBUG_POSTFIX d)
+    if(ENABLE_MSVC_STATIC_RUNTIME)
+      set_target_properties(lib PROPERTIES LINK_FLAGS_RELEASE "/nodefaultlib:LIBCMT")
+    endif()
+  endif()
+endif()
+
+# shared library target
+if(ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
+  add_library(shared SHARED ${GMSH_SRC})
+  set_target_properties(shared PROPERTIES OUTPUT_NAME gmsh
+     VERSION ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}.${GMSH_PATCH_VERSION}
+     SOVERSION ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION})
+  if(WIN32)
+    set_target_properties(shared PROPERTIES PREFIX "" IMPORT_PREFIX ""
+      IMPORT_SUFFIX ".lib" COMPILE_FLAGS "-DGMSH_DLL -DGMSH_DLL_EXPORT")
+  endif()
+  target_link_libraries(shared ${LINK_LIBRARIES})
+  if(MSVC AND ENABLE_MSVC_STATIC_RUNTIME)
+    message(STATUS "Note: By enabling ENABLE_MSVC_STATIC_RUNTIME, shared library "
+            "won't link. In MSVC change /MT to /MD in the shared project properties")
+  endif()
+endif()
+
+# binary targets
+if(HAVE_FLTK)
+  if(ENABLE_BUILD_DYNAMIC)
+    add_executable(gmsh WIN32 Common/Main.cpp)
+    target_link_libraries(gmsh shared)
+  else()
+    add_executable(gmsh WIN32 Common/Main.cpp ${GMSH_SRC})
+  endif()
+  # we could add this to create a minimal app bundle even without install
+  # if(APPLE AND NOT ENABLE_OS_SPECIFIC_INSTALL)
+  #  set_target_properties(gmsh PROPERTIES MACOSX_BUNDLE ON
+  #    MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_dev.plist)
+  # endif()
+else()
+  if(ENABLE_BUILD_DYNAMIC)
+    add_executable(gmsh Common/Main.cpp)
+    target_link_libraries(gmsh shared)
+  else()
+    add_executable(gmsh Common/Main.cpp ${GMSH_SRC})
+  endif()
+endif()
+target_link_libraries(gmsh ${LINK_LIBRARIES})
+
+# Windows specific linker options
+if(WIN32 AND NOT MSVC)
+  set(FLAGS "-Wl,--stack,16777216 -mwindows")
+  if(HAVE_64BIT_SIZE_T)
+    set(FLAGS "${FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/Win64Icon.res")
+  else()
+    set(FLAGS "${FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/Win32Icon.res")
+  endif()
+  set_target_properties(gmsh PROPERTIES LINK_FLAGS "${FLAGS} -static")
+  if(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
+    set_target_properties(shared PROPERTIES LINK_FLAGS -static)
+  endif()
+  # remove -Wl,-Bdynamic flags
+  set(CMAKE_EXE_LINK_DYNAMIC_C_FLAGS)
+  set(CMAKE_EXE_LINK_DYNAMIC_CXX_FLAGS)
+elseif(MSVC)
+  set_target_properties(gmsh PROPERTIES LINK_FLAGS "/STACK:16777216 /SAFESEH:NO")
+endif()
+
+# android target
+if(ENABLE_BUILD_ANDROID)
+  find_file(CMAKE_TOOLCHAIN_FILE "android.toolchain.cmake")
+  if(NOT CMAKE_TOOLCHAIN_FILE)
+    message(FATAL_ERROR "Cannot compile Gmsh for android without android-cmake")
+  endif()
+  add_definitions(-D_GLIBCXX_USE_C99_MATH=1)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+  set(CMAKE_BUILD_TYPE Release)
+  set(LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_CURRENT_BINARY_DIR})
+  set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/libs/)
+  add_definitions(-DBUILD_ANDROID)
+  add_definitions(-DPICOJSON_USE_LOCALE=0)
+  add_library(androidGmsh SHARED ${GMSH_SRC})
+  set_target_properties(androidGmsh PROPERTIES OUTPUT_NAME gmsh)
+  target_link_libraries(androidGmsh ${EXTERNAL_LIBRARIES} ${LAPACK_LIBRARIES})
+  add_custom_command(TARGET androidGmsh POST_BUILD COMMAND
+                     ${CMAKE_STRIP} ${LIBRARY_OUTPUT_PATH}/libgmsh.so)
+endif()
+
+# parser target
+find_program(BISON bison)
+find_program(FLEX flex)
+if(BISON AND FLEX)
+  add_custom_target(parser
+                    COMMAND ${BISON} -p gmsh_yy --output Gmsh.tab.cpp -d Gmsh.y
+                    COMMAND ${FLEX} -P gmsh_yy -o Gmsh.yy.cpp Gmsh.l
+                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Parser)
+endif()
+
+if(UNIX)
+  # cannot use cmake's file search functions here (they would only find files
+  # existing at configuration time)
+  add_custom_target(purge
+                    COMMAND rm -f `find . -name *~ -o -name *~~`
+                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+  add_custom_target(etags
+                    COMMAND etags `find . -name *.cpp -o -name *.h -o -name *.y`
+                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+endif()
+
+if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
+   CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+  execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion
+                  OUTPUT_VARIABLE CXX_COMPILER_VERSION
+                  OUTPUT_STRIP_TRAILING_WHITESPACE)
+else()
+  set(CXX_COMPILER_VERSION "Unknown")
+endif()
+
+set(WELCOME_FILE ${CMAKE_CURRENT_SOURCE_DIR}/doc/WELCOME.txt)
+set(SDK_FILE ${CMAKE_CURRENT_SOURCE_DIR}/doc/SDK.txt)
+set(LICENSE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt)
+set(CREDITS_FILE ${CMAKE_CURRENT_SOURCE_DIR}/CREDITS.txt)
+set(CHANGELOG_FILE ${CMAKE_CURRENT_SOURCE_DIR}/CHANGELOG.txt)
+file(GLOB TUTORIAL_GEO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/?*.*)
+file(GLOB TUTORIAL_CPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/c++/?*.*)
+file(GLOB TUTORIAL_C_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/c/?*.*)
+file(GLOB TUTORIAL_PY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/python/?*.*)
+file(GLOB TUTORIAL_JL_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/julia/?*.*)
+file(GLOB DEMOS ${CMAKE_CURRENT_SOURCE_DIR}/demos/*)
+foreach(SUBDIR ${DEMOS})
+  if(IS_DIRECTORY ${SUBDIR})
+    list(APPEND DEMOS_DIRS ${SUBDIR})
+  endif()
+endforeach()
+set(TEX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo)
+file(GLOB TEX_SRC ${TEX_DIR}/*.texi)
+set(TEX_OBJ ${TEX_DIR}/gmsh.aux ${TEX_DIR}/gmsh.cp ${TEX_DIR}/gmsh.cps
+    ${TEX_DIR}/gmsh.fn ${TEX_DIR}/gmsh.html ${TEX_DIR}/gmsh.info ${TEX_DIR}/gmsh.ky
+    ${TEX_DIR}/gmsh.log ${TEX_DIR}/gmsh.pdf ${TEX_DIR}/gmsh.pg ${TEX_DIR}/gmsh.toc
+    ${TEX_DIR}/gmsh.tp ${TEX_DIR}/gmsh.tps ${TEX_DIR}/gmsh.txt ${TEX_DIR}/gmsh.vr)
+
+macro(unix2dos VARNAME)
+  file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/unix2dos)
+  set(UNIX2DOS_FILES)
+  foreach(FILE ${${VARNAME}})
+    file(READ ${FILE} F0)
+    get_filename_component(N ${FILE} NAME)
+    if(CYGWIN)
+      string(REGEX REPLACE "\n" "\r\n" F1 "${F0}")
+      file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N} "${F1}")
+    else() # if not in Cygwin, cmake adds '\r's automatically
+      file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N} "${F0}")
+    endif()
+    list(APPEND UNIX2DOS_FILES ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N})
+  endforeach()
+  set(${VARNAME} ${UNIX2DOS_FILES})
+endmacro()
+
+if(WIN32)
+  if(ENABLE_OS_SPECIFIC_INSTALL)
+    set(GMSH_BIN .)
+    set(GMSH_LIB .)
+    set(GMSH_DOC .)
+    set(GMSH_MAN .)
+    set(GMSH_INC .)
+  else()
+    include(GNUInstallDirs)
+    set(GMSH_BIN ${CMAKE_INSTALL_BINDIR})
+    set(GMSH_LIB ${CMAKE_INSTALL_LIBDIR})
+    set(GMSH_DOC ${CMAKE_INSTALL_DOCDIR})
+    set(GMSH_MAN ${CMAKE_INSTALL_MANDIR}/man1)
+    set(GMSH_INC ${CMAKE_INSTALL_INCLUDEDIR})
+  endif()
+  if(CYGWIN)
+    unix2dos(GMSH_API)
+    if(ENABLE_PRIVATE_API)
+      unix2dos(GMSH_PRIVATE_API)
+    endif()
+    unix2dos(WELCOME_FILE)
+    unix2dos(SDK_FILE)
+    unix2dos(LICENSE_FILE)
+    unix2dos(CREDITS_FILE)
+    unix2dos(CHANGELOG_FILE)
+    unix2dos(TUTORIAL_GEO_FILES)
+    unix2dos(TUTORIAL_CPP_FILES)
+    unix2dos(TUTORIAL_C_FILES)
+    unix2dos(TUTORIAL_PY_FILES)
+    unix2dos(TUTORIAL_JL_FILES)
+    foreach(DIR ${DEMOS_DIRS})
+      file(GLOB DEMO_FILES ${DIR}/?*.*)
+      unix2dos(DEMO_FILES)
+    endforeach()
+  endif()
+elseif(APPLE AND ENABLE_OS_SPECIFIC_INSTALL)
+  # set these so that the files get installed nicely in the MacOSX
+  # .app bundle
+  set(GMSH_BIN ../MacOS)
+  set(GMSH_LIB ../MacOS)
+  set(GMSH_DOC ../../..)
+  set(GMSH_MAN ../../..)
+  set(GMSH_INC ../MacOS)
+else()
+  include(GNUInstallDirs)
+  set(GMSH_BIN ${CMAKE_INSTALL_BINDIR})
+  set(GMSH_LIB ${CMAKE_INSTALL_LIBDIR})
+  set(GMSH_DOC ${CMAKE_INSTALL_DOCDIR})
+  set(GMSH_MAN ${CMAKE_INSTALL_MANDIR}/man1)
+  set(GMSH_INC ${CMAKE_INSTALL_INCLUDEDIR})
+endif()
+
+# FIXME: change this once we understand rpaths
+if(APPLE)
+  if(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
+    set_target_properties(shared PROPERTIES INSTALL_NAME_DIR
+                          ${CMAKE_INSTALL_PREFIX}/${GMSH_LIB})
+  endif()
+endif()
+
+# mark targets as optional so we can install them separately if needed
+# (e.g. "make lib" or "make shared" followed by "make install/fast")
+install(TARGETS gmsh DESTINATION ${GMSH_BIN} OPTIONAL)
+if(ENABLE_BUILD_LIB)
+  install(TARGETS lib DESTINATION ${GMSH_LIB} OPTIONAL)
+endif()
+if(ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
+  install(TARGETS shared DESTINATION ${GMSH_LIB} OPTIONAL)
+endif()
+
+if(ENABLE_ONELAB)
+  install(FILES ${ONELAB_PY} DESTINATION ${GMSH_BIN})
+endif()
+if(ENABLE_BUILD_LIB OR ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
+  install(FILES ${GMSH_API} DESTINATION ${GMSH_INC})
+  install(FILES ${GMSH_PY} DESTINATION ${GMSH_LIB})
+  install(FILES ${GMSH_JL} DESTINATION ${GMSH_LIB})
+  if(ENABLE_PRIVATE_API)
+    install(FILES ${GMSH_PRIVATE_API} DESTINATION ${GMSH_INC}/gmsh)
+  endif()
+endif()
+if(INSTALL_SDK_README)
+  configure_file(${SDK_FILE} ${CMAKE_CURRENT_BINARY_DIR}/README.txt)
+  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/README.txt DESTINATION .)
+endif()
+install(FILES ${WELCOME_FILE} DESTINATION ${GMSH_DOC} RENAME README.txt)
+install(FILES ${LICENSE_FILE} DESTINATION ${GMSH_DOC})
+install(FILES ${CREDITS_FILE} DESTINATION ${GMSH_DOC})
+install(FILES ${CHANGELOG_FILE} DESTINATION ${GMSH_DOC})
+install(FILES ${TUTORIAL_GEO_FILES} DESTINATION ${GMSH_DOC}/tutorial)
+install(FILES ${TUTORIAL_CPP_FILES} DESTINATION ${GMSH_DOC}/tutorial/c++)
+install(FILES ${TUTORIAL_C_FILES} DESTINATION ${GMSH_DOC}/tutorial/c)
+install(FILES ${TUTORIAL_PY_FILES} DESTINATION ${GMSH_DOC}/tutorial/python)
+install(FILES ${TUTORIAL_JL_FILES} DESTINATION ${GMSH_DOC}/tutorial/julia)
+foreach(DIR ${DEMOS_DIRS})
+  get_filename_component(DEMOS_DIR_NAME ${DIR} NAME)
+  file(GLOB DEMO_FILES ${DIR}/?*.*)
+  install(FILES ${DEMO_FILES} DESTINATION ${GMSH_DOC}/demos/${DEMOS_DIR_NAME})
+endforeach()
+if(UNIX AND NOT CYGWIN)
+  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/doc/gmsh.1 DESTINATION ${GMSH_MAN})
+endif()
+
+add_custom_target(get_headers
+  COMMAND ${CMAKE_COMMAND} -E make_directory Headers/gmsh
+  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+foreach(FILE ${GMSH_API})
+  add_custom_command(TARGET get_headers POST_BUILD COMMAND ${CMAKE_COMMAND}
+    -E copy_if_different ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/Headers/
+    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+endforeach()
+if(ENABLE_PRIVATE_API)
+  foreach(FILE ${GMSH_PRIVATE_API})
+    add_custom_command(TARGET get_headers POST_BUILD COMMAND ${CMAKE_COMMAND}
+      -E copy_if_different ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/Headers/gmsh/
+      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+  endforeach()
+endif()
+
+find_program(MAKEINFO makeinfo)
+if(MAKEINFO)
+  add_custom_command(OUTPUT ${TEX_DIR}/gmsh.info DEPENDS ${TEX_SRC}
+                     COMMAND ${MAKEINFO} --split-size 1000000
+                     ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
+  add_custom_target(info DEPENDS ${TEX_DIR}/gmsh.info)
+  add_custom_command(OUTPUT ${TEX_DIR}/gmsh.txt DEPENDS ${TEX_SRC}
+                     COMMAND ${MAKEINFO} --plaintext -o gmsh.txt
+                     ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
+  add_custom_target(txt DEPENDS ${TEX_DIR}/gmsh.txt)
+  add_custom_command(OUTPUT ${TEX_DIR}/gmsh.html DEPENDS ${TEX_SRC}
+    COMMAND ${MAKEINFO} --html --css-ref=http://gmsh.info/gmsh.css
+    --no-split --set-customization-variable
+    EXTRA_HEAD='<meta name="viewport" content="width=device-width,initial-scale=1.0">'
+    ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
+  add_custom_target(html DEPENDS ${TEX_DIR}/gmsh.html)
+  install(FILES ${TEX_DIR}/gmsh.html DESTINATION ${GMSH_DOC} OPTIONAL)
+else()
+  add_custom_target(html COMMAND ${CMAKE_COMMAND} -E touch ${TEX_DIR}/gmsh.html)
+endif()
+
+find_program(TEXI2PDF texi2pdf)
+if(TEXI2PDF)
+  add_custom_command(OUTPUT ${TEX_DIR}/gmsh.pdf DEPENDS ${TEX_SRC}
+                     COMMAND ${TEXI2PDF} ARGS gmsh.texi
+                     WORKING_DIRECTORY ${TEX_DIR})
+  add_custom_target(pdf DEPENDS ${TEX_DIR}/gmsh.pdf)
+  install(FILES ${TEX_DIR}/gmsh.pdf DESTINATION ${GMSH_DOC} OPTIONAL)
+endif()
+
+execute_process(COMMAND ${CMAKE_COMMAND} -E echo
+  "@c This file was generated by cmake: do not edit manually!\n${OPT_TEXI}"
+  OUTPUT_FILE cmake_options.texi)
+
+if(MAKEINFO AND TEXI2PDF)
+  add_custom_target(doc COMMAND ${CMAKE_COMMAND} -E tar zcf
+                    ${CMAKE_CURRENT_BINARY_DIR}/gmsh-${GMSH_VERSION}-doc.tgz
+                    CREDITS.txt LICENSE.txt CHANGELOG.txt
+                    doc/gmsh.1 doc/texinfo/gmsh.html doc/texinfo/gmsh.info
+                    doc/texinfo/gmsh.pdf doc/texinfo/gmsh.txt
+                    COMMAND ${CMAKE_COMMAND} -E remove ${TEX_OBJ}
+                    DEPENDS ${TEX_DIR}/gmsh.info ${TEX_DIR}/gmsh.txt
+                    ${TEX_DIR}/gmsh.html ${TEX_DIR}/gmsh.pdf
+                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+endif()
+
+if(MAKEINFO OR TEXI2PDF)
+  add_custom_target(clean_doc COMMAND ${CMAKE_COMMAND} -E remove ${TEX_OBJ})
+endif()
+
+if(APPLE AND ENABLE_BUILD_LIB)
+  file(READ ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_framework.plist F0)
+  string(REPLACE GMSH_VERSION "${GMSH_VERSION}" F1 "${F0}")
+  file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/Info_framework.plist "${F1}")
+  get_target_property(LIBNAME lib LOCATION) # depracated
+  #set(LIBNAME $<TARGET_FILE:lib>) # FIXME: use this in the future
+  add_custom_target(framework DEPENDS lib
+    COMMAND ${CMAKE_COMMAND} -E remove_directory gmsh.framework
+    COMMAND ${CMAKE_COMMAND} -E make_directory gmsh.framework/Headers
+    COMMAND ${CMAKE_COMMAND} -E make_directory gmsh.framework/Resources
+    COMMAND ${CMAKE_COMMAND} -E copy ${LIBNAME} gmsh.framework/gmsh
+    COMMAND ${CMAKE_COMMAND} -E copy Info_framework.plist
+                                     gmsh.framework/Resources/Info.plist
+    COMMAND ${CMAKE_COMMAND} -E create_symlink . gmsh.framework/Headers/gmsh
+    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+  foreach(FILE ${GMSH_API})
+    add_custom_command(TARGET framework POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy
+        ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/gmsh.framework/Headers/
+        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+  endforeach()
+  if(ENABLE_PRIVATE_API)
+    foreach(FILE ${GMSH_PRIVATE_API})
+      add_custom_command(TARGET framework POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy
+          ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/gmsh.framework/Headers/
+          WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+    endforeach()
+  endif()
+endif()
+
+set(CPACK_PACKAGE_VENDOR "Christophe Geuzaine and Jean-Francois Remacle")
+set(CPACK_PACKAGE_VERSION_MAJOR ${GMSH_MAJOR_VERSION})
+set(CPACK_PACKAGE_VERSION_MINOR ${GMSH_MINOR_VERSION})
+set(CPACK_PACKAGE_VERSION_PATCH ${GMSH_PATCH_VERSION})
+set(CPACK_PACKAGE_DESCRIPTION_FILE ${WELCOME_FILE})
+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
+    "3D finite element mesh generator with built-in CAD engine and post-processor")
+if(GMSH_EXTRA_VERSION MATCHES "-git.*") # so that we'll overwrite the archives
+  set(CPACK_PACKAGE_FILE_NAME gmsh-git-${GMSH_OS})
+  set(CPACK_SOURCE_PACKAGE_FILE_NAME gmsh-git-source)
+else()
+  set(CPACK_PACKAGE_FILE_NAME gmsh-${GMSH_VERSION}-${GMSH_OS})
+  set(CPACK_SOURCE_PACKAGE_FILE_NAME gmsh-${GMSH_VERSION}-source)
+endif()
+set(CPACK_PACKAGE_INSTALL_DIRECTORY "gmsh")
+set(CPACK_RESOURCE_FILE_LICENSE ${LICENSE_FILE})
+set(CPACK_RESOURCE_FILE_README ${WELCOME_FILE})
+set(CPACK_RESOURCE_FILE_WELCOME ${WELCOME_FILE})
+set(CPACK_PACKAGE_EXECUTABLE "gmsh")
+if(ENABLE_PACKAGE_STRIP)
+  set(CPACK_STRIP_FILES TRUE)
+else()
+  set(CPACK_STRIP_FILES FALSE)
+endif()
+set(CPACK_SOURCE_GENERATOR TGZ)
+set(CPACK_SOURCE_IGNORE_FILES "${CMAKE_CURRENT_BINARY_DIR}" "/CVS/" "/.svn" "/.git"
+    "~$" "DS_Store$" "GmshConfig.h$" "GmshVersion.h$" "/benchmarks/" "/tmp/"
+    "/bin/" "/lib/" "/nightly/" "GPATH" "GRTAGS" "GSYMS" "GTAGS" "/HTML/"
+    "/contrib/3M/" "/contrib/Parasolid/")
+
+if(UNIX)
+  # make sure we remove previous installs before doing the next one (on Mac for
+  # example "make package; make package_source" would lead to huge file lists
+  # getting generated due to the 'Applications' symlink in the bundle)
+  set(CPACK_INSTALL_COMMANDS "rm -rf ${CMAKE_CURRENT_BINARY_DIR}/_CPack_Packages")
+endif()
+
+if(APPLE AND ENABLE_OS_SPECIFIC_INSTALL)
+  set(CPACK_GENERATOR Bundle)
+  set(CPACK_BUNDLE_NAME Gmsh)
+  file(READ ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_app.plist F0)
+  string(REPLACE GMSH_VERSION "${GMSH_VERSION}" F1 "${F0}")
+  file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/Info.plist "${F1}")
+  set(CPACK_BUNDLE_PLIST ${CMAKE_CURRENT_BINARY_DIR}/Info.plist)
+  set(CPACK_BUNDLE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIcons.icns)
+  if(PACKAGER STREQUAL "geuzaine - removed: we sign on a separate machine")
+    # codesigning requires CMake >= 3.2
+    set(CPACK_BUNDLE_APPLE_CERT_APP "Developer ID Application: Christophe Geuzaine")
+  endif()
+  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsGeo.icns DESTINATION .
+          RENAME GmshGeo.icns)
+  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsMsh.icns DESTINATION .
+          RENAME GmshMsh.icns)
+  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsSol.icns DESTINATION .
+          RENAME GmshSol.icns)
+  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsPos.icns DESTINATION .
+          RENAME GmshPos.icns)
+  set(CPACK_PACKAGE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIcons.icns)
+elseif(WIN32)
+  set(CPACK_GENERATOR ZIP)
+else()
+  set(CPACK_GENERATOR TGZ)
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/utils/wrappers/gmshpy AND
+   ENABLE_PRIVATE_API AND ENABLE_WRAP_PYTHON AND HAVE_PYTHON)
+  add_subdirectory(utils/wrappers/gmshpy)
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/utils/wrappers/java AND
+   ENABLE_PRIVATE_API AND ENABLE_WRAP_JAVA)
+  add_subdirectory(utils/wrappers/java)
+endif()
+
+include(CPack)
+
+if(NOT DISABLE_GMSH_TESTS)
+  # disabling tests is useful when including this CMakeLists in an external project
+  include(CTest)
+  file(GLOB_RECURSE TESTFILES
+       tutorial/*.geo demos/*.geo benchmarks/?d/*.geo benchmarks/extrude/*.geo
+       benchmarks/occ/*.geo)
+  # disable this test for now on our Linux32 machine - the current config
+  # crashes on the OCC STL generation
+  if(${GMSH_OS} MATCHES "Linux32")
+    list(REMOVE_ITEM TESTFILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/t18.geo)
+  endif()
+  foreach(TESTFILE ${TESTFILES})
+    # use relative path for Cygwin/MinGW (the pure win exe built with the MinGW
+    # compilers does not understand a full Cygwin-style path)
+    FILE(RELATIVE_PATH TEST ${CMAKE_CURRENT_BINARY_DIR} ${TESTFILE})
+    if(HAVE_OCC OR NOT ${TEST} MATCHES "boolean" OR NOT ${TEST} MATCHES "occ")
+      add_test(${TEST} ./gmsh ${TEST} -3 -nopopup -o ./tmp.msh)
+    endif()
+  endforeach()
+  # test c++ api tutorials with dynamic builds (except on 32 bit windows for
+  # now: our win32 setup does not currently handle exceptions)
+  if(ENABLE_BUILD_DYNAMIC AND NOT ${GMSH_OS} MATCHES "Windows32")
+    file(GLOB_RECURSE TESTFILES tutorial/c++/*.cpp)
+    foreach(TESTFILE ${TESTFILES})
+      get_filename_component(TEST ${TESTFILE} NAME_WE)
+      add_executable(${TEST} WIN32 ${TESTFILE})
+      target_link_libraries(${TEST} shared)
+      if(WIN32 AND NOT MSVC)
+        set_target_properties(${TEST} PROPERTIES LINK_FLAGS "-mwindows -static")
+      endif()
+      add_test(${TEST}_cpp ${TEST})
+    endforeach()
+  endif()
+endif()
+
+message(STATUS "")
+message(STATUS "Gmsh ${GMSH_VERSION} has been configured for ${GMSH_OS}")
+message(STATUS "")
+message(STATUS " * Build options:" ${GMSH_CONFIG_OPTIONS})
+message(STATUS " * Build type: " ${CMAKE_BUILD_TYPE})
+message(STATUS " * C compiler: " ${CMAKE_C_COMPILER})
+message(STATUS " * C++ compiler: " ${CMAKE_CXX_COMPILER})
+message(STATUS " * Install prefix: " ${CMAKE_INSTALL_PREFIX})
+message(STATUS "")
+
+mark_as_advanced(GMSH_EXTRA_VERSION
+                 ACIS_LIB ANN_INC ANN_LIB CAIRO_LIB CAIRO_INC CGNS_INC GMM_INC
+                 GMP_INC GMP_LIB MMG3D_INC MMG3D_LIB HDF5_LIB
+                 MED_LIB OCC_INC SZ_LIB
+                 PETSC_LIBS SLEPC_INC SLEPC_INC2 SLEPC_LIB
+                 BISON FLEX MAKEINFO TEXI2PDF FLTK_CONFIG_SCRIPT
+                 GMSH_EXTERNAL_INCLUDE_DIRS GMSH_EXTERNAL_LIBRARIES)
Index: /issm/trunk-jpl/externalpackages/gmsh/configs/4.7.0/static/CMakeLists.txt
===================================================================
--- /issm/trunk-jpl/externalpackages/gmsh/configs/4.7.0/static/CMakeLists.txt	(revision 25791)
+++ /issm/trunk-jpl/externalpackages/gmsh/configs/4.7.0/static/CMakeLists.txt	(revision 25791)
@@ -0,0 +1,2191 @@
+# Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle
+#
+# See the LICENSE.txt file for license information. Please report all
+# issues on https://gitlab.onelab.info/gmsh/gmsh/issues.
+
+cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
+
+# if CMAKE_BUILD_TYPE is specified use it; otherwise set the default
+# build type to "RelWithDebInfo" ("-O2 -g" with gcc) prior to calling
+# project()
+if(DEFINED CMAKE_BUILD_TYPE)
+  set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Choose build type")
+else()
+  set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose build type")
+endif()
+
+project(gmsh CXX C)
+
+# require C++11 and request C99
+set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_C_STANDARD 99)
+
+# this variable controls the default value of the options which are normally set
+# to ON (useful if you want to configure a minimal version of Gmsh: e.g. "cmake
+# -DDEFAULT=0 -DENABLE_POST=1 -DENABLE_PARSER=1")
+set(DEFAULT ON CACHE INTERNAL "Default value for enabled-by-default options")
+
+macro(opt OPTION HELP VALUE)
+  option(ENABLE_${OPTION} ${HELP} ${VALUE})
+  set(OPT_TEXI "${OPT_TEXI}\n@item ENABLE_${OPTION}\n${HELP} (default: ${VALUE})")
+endmacro()
+
+opt(3M "Enable proprietary 3M extension" OFF)
+opt(ALGLIB "Enable ALGLIB (used by some mesh optimizers)" ${DEFAULT})
+opt(ANN "Enable ANN (used for fast point search in mesh/post)" ${DEFAULT})
+opt(BAMG "Enable Bamg 2D anisotropic mesh generator" ${DEFAULT})
+opt(BLAS_LAPACK "Enable BLAS/Lapack for linear algebra (if Eigen if disabled)" OFF)
+opt(BLOSSOM "Enable Blossom algorithm (needed for full quad meshing)" ${DEFAULT})
+opt(BUILD_LIB "Enable 'lib' target for building static Gmsh library" OFF)
+opt(BUILD_SHARED "Enable 'shared' target for building shared Gmsh library" OFF)
+opt(BUILD_DYNAMIC "Enable dynamic Gmsh executable (linked with shared library)" OFF)
+opt(BUILD_ANDROID "Enable Android NDK library target (experimental)" OFF)
+opt(BUILD_IOS "Enable iOS library target (experimental)" OFF)
+opt(CGNS "Enable CGNS import/export (experimental)" ${DEFAULT})
+opt(CGNS_CPEX0045 "Enable high-order CGNS import/export following CPEX0045 (experimental)" OFF)
+opt(CAIRO "Enable Cairo to render fonts (experimental)" ${DEFAULT})
+opt(PROFILE "Enable profiling compiler flags" OFF)
+opt(DINTEGRATION "Enable discrete integration (needed for levelsets)" ${DEFAULT})
+opt(DOMHEX "Enable experimental DOMHEX code" ${DEFAULT})
+opt(EIGEN "Enable Eigen for linear algebra (instead of Blas/Lapack)" ON)
+opt(FLTK "Enable FLTK graphical user interface (requires mesh/post)" ${DEFAULT})
+opt(GETDP "Enable GetDP solver (linked as a library, experimental)" ${DEFAULT})
+opt(GMM "Enable GMM linear solvers (simple alternative to PETSc)" ${DEFAULT})
+opt(GMP "Enable GMP for Kbipack (advanced)" ON)
+opt(GRAPHICS "Enable building graphics lib even without GUI (advanced)" OFF)
+opt(HXT "Enable HXT library (for reparametrization and meshing)" ${DEFAULT})
+opt(KBIPACK "Enable Kbipack (neeeded by homology solver)" ${DEFAULT})
+opt(MATHEX "Enable Mathex expression parser (used by plugins and options)" ${DEFAULT})
+opt(MED "Enable MED mesh and post file formats" ${DEFAULT})
+opt(MESH "Enable mesh module (required by GUI)" ${DEFAULT})
+opt(METIS "Enable Metis mesh partitioner" ${DEFAULT})
+opt(MMG "Enable Mmg mesh adaptation interface" ${DEFAULT})
+opt(MPEG_ENCODE "Enable built-in MPEG movie encoder" ${DEFAULT})
+opt(MPI "Enable MPI (experimental, not used for meshing)" OFF)
+opt(MSVC_STATIC_RUNTIME "Enable static Visual C++ runtime" OFF)
+opt(MUMPS "Enable MUMPS sparse direct linear solver" OFF)
+opt(NETGEN "Enable Netgen 3D frontal mesh generator" ${DEFAULT})
+opt(NUMPY "Enable fullMatrix and numpy array conversion for private API" OFF)
+opt(PETSC4PY "Enable petsc4py wrappers for petsc matrices for private API" OFF)
+opt(OCC "Enable OpenCASCADE CAD kernel" ${DEFAULT})
+opt(OCC_CAF "Enable OpenCASCADE CAF module (for STEP/IGES attributes)" ${DEFAULT})
+opt(OCC_STATIC "Link OpenCASCADE static instead of dynamic libraries (requires ENABLE_OCC)" OFF)
+opt(OCC_TBB "Add TBB libraries in list of OCC libraries" OFF)
+opt(ONELAB "Enable ONELAB solver interface" ${DEFAULT})
+opt(ONELAB_METAMODEL "Enable ONELAB metamodels (experimental)" ${DEFAULT})
+opt(OPENACC "Enable OpenACC" OFF)
+opt(OPENMP "Enable OpenMP" OFF)
+opt(OPTHOM "Enable high-order mesh optimization tools" ${DEFAULT})
+opt(OS_SPECIFIC_INSTALL "Enable OS-specific (e.g. app bundle) installation" OFF)
+opt(OSMESA "Enable OSMesa for offscreen rendering (experimental)" OFF)
+opt(P4EST "Enable p4est for enabling automatic mesh size field (experimental)" OFF)
+opt(PACKAGE_STRIP "Strip symbols in install packages to reduce install size" ON)
+opt(PARSER "Enable GEO file parser (required for .geo/.pos scripts)" ${DEFAULT})
+opt(PETSC "Enable PETSc linear solvers (required for SLEPc)" OFF)
+opt(PLUGINS "Enable post-processing plugins" ${DEFAULT})
+opt(POST "Enable post-processing module (required by GUI)" ${DEFAULT})
+opt(POPPLER "Enable Poppler for displaying PDF documents (experimental)" OFF)
+opt(PRIVATE_API "Enable private API" OFF)
+opt(PRO "Enable PRO extensions" ${DEFAULT})
+opt(QUADTRI "Enable QuadTri structured meshing extensions" ${DEFAULT})
+opt(REVOROPT "Enable Revoropt (used for CVT remeshing)" OFF)
+opt(RPATH "Use RPATH in dynamically linked targets" ON)
+opt(SLEPC "Enable SLEPc eigensolvers" OFF)
+opt(SOLVER "Enable built-in finite element solvers (required for reparametrization)" ${DEFAULT})
+opt(SYSTEM_CONTRIB "Use system versions of contrib libraries, when possible" OFF)
+opt(TCMALLOC "Enable libtcmalloc (fast malloc that does not release memory)" OFF)
+opt(TOUCHBAR "Enable Apple Touch bar" ${DEFAULT})
+opt(VISUDEV "Enable additional visualization capabilities for development purposes" OFF)
+opt(VOROPP "Enable voro++ (for hex meshing, experimental)" ${DEFAULT})
+opt(WRAP_JAVA "Generate SWIG Java wrappers for private API" OFF)
+opt(WRAP_PYTHON "Generate SWIG Python wrappers for private API (not used by public API)" OFF)
+opt(ZIPPER "Enable Zip file compression/decompression" OFF)
+
+set(GMSH_MAJOR_VERSION 4)
+set(GMSH_MINOR_VERSION 7)
+set(GMSH_PATCH_VERSION 0)
+if(NOT GMSH_EXTRA_VERSION)
+  set(GMSH_EXTRA_VERSION "")
+endif()
+set(GMSH_EXTRA_VERSION_TEXI "${GMSH_EXTRA_VERSION}")
+set(GMSH_EXTRA_VERSION_ORIG ${GMSH_EXTRA_VERSION})
+
+if(NOT GMSH_RELEASE)
+  find_package(Git)
+  if(GIT_FOUND)
+    execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --format=%h
+                    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ERROR_QUIET
+                    OUTPUT_VARIABLE GIT_COMMIT_HASH
+                    OUTPUT_STRIP_TRAILING_WHITESPACE)
+  endif()
+  if(GIT_COMMIT_HASH)
+    set(GMSH_EXTRA_VERSION "${GMSH_EXTRA_VERSION}-git-${GIT_COMMIT_HASH}")
+  endif()
+  set(GMSH_EXTRA_VERSION_TEXI "${GMSH_EXTRA_VERSION_TEXI} (development version)")
+endif()
+
+set(GMSH_SHORT_VERSION
+    "${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}.${GMSH_PATCH_VERSION}")
+set(GMSH_VERSION "${GMSH_SHORT_VERSION}${GMSH_EXTRA_VERSION}")
+set(GMSH_SHORT_LICENSE "GNU General Public License")
+
+set(GMSH_GITLAB_PREFIX "https://gitlab.onelab.info/gmsh/gmsh")
+if(GMSH_RELEASE)
+  set(GMSH_GITLAB_PREFIX "${GMSH_GITLAB_PREFIX}/blob/gmsh_${GMSH_SHORT_VERSION}")
+else()
+  set(GMSH_GITLAB_PREFIX "${GMSH_GITLAB_PREFIX}/blob/master")
+endif()
+
+set(GMSH_API api/gmsh.h api/gmshc.h api/gmsh.h_cwrap)
+
+if(ENABLE_PRIVATE_API)
+  message(WARNING "The private API is unsupported and undocumented. It is meant "
+          "for expert Gmsh developers, not for regular Gmsh users, who should rely "
+          "on the stable public API (gmsh/api) instead.")
+  file(GLOB_RECURSE HEADERS Common/*.h Numeric/*.h Geo/*.h Mesh/*.h Solver/*.h
+    Post/*.h Plugin/*.h Graphics/*.h contrib/kbipack/*.h
+    contrib/DiscreteIntegration/*.h contrib/HighOrderMeshOptimizer/*.h
+    contrib/MeshOptimizer/*.h contrib/MeshQualityOptimizer/*.h)
+  set(GMSH_PRIVATE_API ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshConfig.h
+      ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshVersion.h ${HEADERS})
+  get_property(IAMCHILD DIRECTORY PROPERTY PARENT_DIRECTORY)
+  if(IAMCHILD)
+    set(GMSH_PRIVATE_API ${GMSH_PRIVATE_API} PARENT_SCOPE)
+  endif()
+  if(ENABLE_WRAP_PYTHON OR ENABLE_WRAP_JAVA)
+    set(ENABLE_BUILD_DYNAMIC ON)
+    message(WARNING "SWIG wrappers for the private API are unsupported and "
+            "undocumented. The stable public Python API does not required SWIG.")
+  endif()
+endif()
+
+set(ONELAB_PY contrib/onelab/python/onelab.py)
+set(GMSH_PY api/gmsh.py)
+set(GMSH_JL api/gmsh.jl)
+
+if(${CMAKE_MAJOR_VERSION} GREATER 2)
+  string(TIMESTAMP DATE "%Y%m%d")
+else()
+  execute_process(COMMAND date "+%Y%m%d" OUTPUT_VARIABLE DATE
+                  OUTPUT_STRIP_TRAILING_WHITESPACE)
+endif()
+
+if(NOT DATE)
+  set(DATE "unknown")
+endif()
+set(GMSH_DATE "${DATE}")
+
+if(NOT GMSH_HOST)
+  execute_process(COMMAND hostname OUTPUT_VARIABLE HOST
+                  OUTPUT_STRIP_TRAILING_WHITESPACE)
+  if(NOT HOST)
+    set(HOST "unknown")
+  endif()
+  set(GMSH_HOST "${HOST}")
+endif()
+
+if(NOT GMSH_PACKAGER)
+  execute_process(COMMAND whoami OUTPUT_VARIABLE PACKAGER
+                  OUTPUT_STRIP_TRAILING_WHITESPACE)
+  if(NOT PACKAGER)
+    set(PACKAGER "unknown")
+  endif()
+  string(REPLACE "\\" " " PACKAGER ${PACKAGER})
+  set(GMSH_PACKAGER "${PACKAGER}")
+endif()
+
+if(APPLE)
+  set(GMSH_OS "MacOSX")
+elseif(CYGWIN OR MSYS)
+  # detect if we use the MinGW compilers on Cygwin - if we do, handle the build
+  # as a pure Windows build and make cmake find pure Windows import libraries
+  # (.lib)
+  if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
+     CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+    execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine
+                    OUTPUT_VARIABLE CXX_COMPILER_MACHINE
+                    OUTPUT_STRIP_TRAILING_WHITESPACE)
+    if(CXX_COMPILER_MACHINE MATCHES "mingw")
+      set(GMSH_OS "Windows")
+      set(WIN32 1)
+      add_definitions(-DWIN32)
+      set(CMAKE_FIND_LIBRARY_PREFIXES "lib" "")
+      set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".so" ".lib" ".LIB" ".dll" ".DLL" ".dll.a")
+    endif()
+  endif()
+else()
+  set(GMSH_OS "${CMAKE_SYSTEM_NAME}")
+endif()
+
+include(CheckTypeSize)
+include(CheckFunctionExists)
+include(CheckIncludeFile)
+include(CheckCXXCompilerFlag)
+include(CheckCCompilerFlag)
+
+macro(set_config_option VARNAME STRING)
+  set(${VARNAME} TRUE)
+  list(APPEND CONFIG_OPTIONS ${STRING})
+  message(STATUS "Found " ${STRING})
+endmacro()
+
+# check the size of size_t
+check_type_size("size_t" SIZEOF_SIZE_T)
+if(SIZEOF_SIZE_T EQUAL 8)
+  set_config_option(HAVE_64BIT_SIZE_T "64Bit")
+endif()
+
+# append 32/64 to the build name on Linux and Windows
+if(NOT APPLE)
+  if(HAVE_64BIT_SIZE_T)
+    set(GMSH_OS "${GMSH_OS}64")
+  else()
+    set(GMSH_OS "${GMSH_OS}32")
+  endif()
+endif()
+
+if(ENABLE_BUILD_DYNAMIC)
+  set(GMSH_OS "${GMSH_OS}-sdk")
+endif()
+
+if(ENABLE_RPATH)
+  set(CMAKE_MACOSX_RPATH 1)
+
+  # make sure that dynamic libraries can be found when installing/ displacing
+  # the binaries: from https://gitlab.kitware.com/cmake/community/wikis/doc/
+  # cmake/RPATH-handling:
+
+  # use, i.e. don't skip the full RPATH for the build tree
+  set(CMAKE_SKIP_BUILD_RPATH FALSE)
+
+  # when building, don't use the install RPATH already (but later on when
+  # installing)
+  set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
+  set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+
+  # add the automatically determined parts of the RPATH which point to
+  # directories outside the build tree to the install RPATH
+  set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+
+  # the RPATH to be used when installing, but only if it's not a system directory
+  list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib"
+       isSystemDir)
+  if("${isSystemDir}" STREQUAL "-1")
+    if(APPLE)
+      set(CMAKE_INSTALL_RPATH "@executable_path/../lib")
+    else()
+      set(CMAKE_INSTALL_RPATH "\\\$ORIGIN/../lib")
+    endif()
+  endif()
+else()
+  set(CMAKE_MACOSX_RPATH 0)
+  set(CMAKE_SKIP_BUILD_RPATH TRUE)
+endif()
+
+if(MSVC)
+  # remove annoying warning about bool/int cast performance
+  set(GMSH_CONFIG_PRAGMAS "#pragma warning(disable:4800 4244 4267)")
+  foreach(VAR
+          CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
+          CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO
+          CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
+          CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
+    if(ENABLE_MSVC_STATIC_RUNTIME AND ${VAR} MATCHES "/MD")
+      string(REGEX REPLACE "/MD" "/MT" ${VAR} "${${VAR}}")
+    endif()
+    if(NOT ${VAR} MATCHES "/MP") # enable parallel compilation
+      set(${VAR} "${${VAR}} /MP")
+    endif()
+  endforeach()
+  if(ENABLE_PRIVATE_API)
+    if(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
+      # automatically export .def file with all symbols (requires CMake 3.4);
+      # depending on the compiling options this might lead to more than 64k export
+      # symbols; just trim the .def file to keep the ones you need
+      set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
+    endif()
+  endif()
+endif()
+
+# reduce memory usage of GCC on 32 bit systems
+if(NOT HAVE_64BIT_SIZE_T AND CMAKE_CXX_COMPILER_ID MATCHES "GNU")
+  set(CMAKE_CXX_FLAGS
+      "${CMAKE_CXX_FLAGS} --param ggc-min-expand=1 --param ggc-min-heapsize=512000")
+endif()
+
+if(ENABLE_OPENMP)
+  find_package(OpenMP)
+  if(OpenMP_FOUND OR OPENMP_FOUND)
+    set_config_option(HAVE_OPENMP "OpenMP")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
+  elseif(APPLE AND EXISTS "/opt/local/lib/libomp")
+    # official Apple compiler with macports' libomp
+    set_config_option(HAVE_OPENMP "OpenMP[MacPorts]")
+    set(CMAKE_C_FLAGS
+        "${CMAKE_C_FLAGS} -Xpreprocessor -fopenmp -I/opt/local/include/libomp")
+    set(CMAKE_CXX_FLAGS
+        "${CMAKE_CXX_FLAGS} -Xpreprocessor -fopenmp -I/opt/local/include/libomp")
+    list(APPEND EXTERNAL_LIBRARIES "-L/opt/local/lib/libomp -lomp")
+  elseif(APPLE AND EXISTS "/usr/local/lib/libomp.dylib")
+    # official Apple compiler with homebrew's libomp
+    set_config_option(HAVE_OPENMP "OpenMP[Homebrew]")
+    set(CMAKE_C_FLAGS
+        "${CMAKE_C_FLAGS} -Xpreprocessor -fopenmp")
+    set(CMAKE_CXX_FLAGS
+        "${CMAKE_CXX_FLAGS} -Xpreprocessor -fopenmp")
+    list(APPEND EXTERNAL_LIBRARIES "-L/usr/local/lib -lomp")
+  endif()
+endif()
+
+if(ENABLE_OPENACC)
+  find_package(OpenACC)
+  if(OpenACC_C_FOUND AND OpenACC_CXX_FOUND)
+    set_config_option(HAVE_OPENACC "OpenACC")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenACC_C_FLAGS}")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenACC_CXX_FLAGS}")
+  endif()
+endif()
+
+if(ENABLE_PROFILE)
+    # Using the perf set of profiling tools doesn't work without the frame
+    # pointer and a common optimisation is to remove it
+    check_cxx_compiler_flag("-fno-omit-frame-pointer" FNOFP)
+    if(FNOFP)
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
+    endif()
+endif()
+
+macro(append_gmsh_src DIRNAME FILES)
+  foreach(FILE ${FILES})
+    list(APPEND LIST ${DIRNAME}/${FILE})
+  endforeach()
+  set(GMSH_SRC ${GMSH_SRC};${LIST} PARENT_SCOPE)
+  set(GMSH_DIRS ${GMSH_DIRS};${DIRNAME} PARENT_SCOPE)
+endmacro()
+
+macro(find_all_libraries VARNAME LISTNAME PATH SUFFIX)
+  set(${VARNAME})
+  list(LENGTH ${LISTNAME} NUM_LIST)
+  foreach(LIB ${${LISTNAME}})
+    if("${PATH}" STREQUAL "")
+      find_library(FOUND_LIB ${LIB} PATH_SUFFIXES ${SUFFIX})
+    else()
+      find_library(FOUND_LIB ${LIB} PATHS ${PATH} NO_DEFAULT_PATH)
+    endif()
+    if(FOUND_LIB)
+      list(APPEND ${VARNAME} ${FOUND_LIB})
+    endif()
+    unset(FOUND_LIB CACHE)
+  endforeach()
+  list(LENGTH ${VARNAME} NUM_FOUND_LIBRARIES)
+  if(NUM_FOUND_LIBRARIES LESS NUM_LIST)
+    set(${VARNAME})
+  endif()
+endmacro()
+
+macro(set_compile_flags LISTNAME FLAGS)
+  foreach(FILE ${${LISTNAME}})
+    get_source_file_property(PROP ${FILE} COMPILE_FLAGS)
+    if(PROP)
+      set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS "${PROP} ${FLAGS}")
+    else()
+      set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS "${FLAGS}")
+    endif()
+  endforeach()
+endmacro()
+
+if(ENABLE_EIGEN)
+  if(ENABLE_SYSTEM_CONTRIB)
+    find_path(EIGEN_INC "Eigen/Dense" HINTS eigen3)
+    if(EIGEN_INC)
+      include_directories(${EIGEN_INC})
+      set_config_option(HAVE_EIGEN "Eigen[system]")
+    endif()
+  endif()
+  if(NOT HAVE_EIGEN)
+    include_directories(contrib/eigen)
+    set_config_option(HAVE_EIGEN "Eigen")
+  endif()
+  # We could also add an option to use BLAS with Eigen
+  # add_definitions(-DEIGEN_USE_BLAS)
+elseif(ENABLE_BLAS_LAPACK)
+  if(BLAS_LAPACK_LIBRARIES)
+    # use libs as specified in the BLAS_LAPACK_LIBRARIES variable
+    set_config_option(HAVE_BLAS "Blas[custom]")
+    set_config_option(HAVE_LAPACK "Lapack[custom]")
+    set(LAPACK_LIBRARIES ${BLAS_LAPACK_LIBRARIES})
+  else()
+    if(MSVC)
+      # on Windows with Visual C++ try really hard to find blas/lapack *without*
+      # requiring a Fortran compiler: 1) try to find the Intel MKL libs using
+      # the standard search path; if not found 2) try to get the reference
+      # blas/lapack libs (useful for users with no Fortran compiler and no MKL
+      # license, who can just download our precompiled "gmsh-dep" package)
+      if(HAVE_64BIT_SIZE_T)
+        set(MKL_PATH em64t/lib)
+        set(MKL_LIBS_REQUIRED libguide40 mkl_intel_lp64 mkl_intel_thread mkl_core)
+      else()
+        set(MKL_PATH ia32/lib)
+        set(MKL_LIBS_REQUIRED libguide40 mkl_intel_c mkl_intel_thread mkl_core)
+      endif()
+      find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
+      if(LAPACK_LIBRARIES)
+        set_config_option(HAVE_BLAS "Blas[mkl]")
+        set_config_option(HAVE_LAPACK "Lapack[mkl]")
+      else()
+        set(REFLAPACK_LIBS_REQUIRED lapack blas g2c gcc)
+        find_all_libraries(LAPACK_LIBRARIES REFLAPACK_LIBS_REQUIRED "" "")
+        if(LAPACK_LIBRARIES)
+          set_config_option(HAVE_BLAS "Blas[ref]")
+          set_config_option(HAVE_LAPACK "Lapack[ref]")
+        endif()
+      endif()
+    elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
+      # on Linux try to find the Intel MKL without a Fortran compiler
+      if(HAVE_64BIT_SIZE_T)
+        set(MKL_PATH lib/em64t)
+      else()
+        set(MKL_PATH lib/32)
+      endif()
+      set(MKL_LIBS_REQUIRED mkl_gf_lp64 iomp5 mkl_gnu_thread mkl_core guide pthread)
+      find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
+      if(NOT LAPACK_LIBRARIES)
+        # match lapack 9.0 on 64bit
+        set(MKL_LIBS_REQUIRED mkl_lapack mkl_em64t guide)
+        find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
+      endif()
+      if(LAPACK_LIBRARIES)
+        set_config_option(HAVE_BLAS "Blas[mkl]")
+        set_config_option(HAVE_LAPACK "Lapack[mkl]")
+      else()
+        # on Linux also try to find ATLAS without a Fortran compiler, because
+        # cmake ships with a buggy FindBLAS e.g. on Ubuntu Lucid Lynx
+        set(ATLAS_LIBS_REQUIRED lapack f77blas cblas atlas)
+        find_all_libraries(LAPACK_LIBRARIES ATLAS_LIBS_REQUIRED "" "")
+        if(LAPACK_LIBRARIES)
+          set_config_option(HAVE_BLAS "Blas[atlas]")
+          set_config_option(HAVE_LAPACK "Lapack[atlas]")
+        else()
+          # try with generic names
+          set(GENERIC_LIBS_REQUIRED lapack blas pthread)
+          find_all_libraries(LAPACK_LIBRARIES GENERIC_LIBS_REQUIRED "" "")
+          if(LAPACK_LIBRARIES)
+            set_config_option(HAVE_BLAS "Blas[generic]")
+            set_config_option(HAVE_LAPACK "Lapack[generic]")
+            find_library(GFORTRAN_LIB gfortran)
+            if(GFORTRAN_LIB)
+              list(APPEND LAPACK_LIBRARIES ${GFORTRAN_LIB})
+            endif()
+          endif()
+        endif()
+      endif()
+    elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
+      # on SunOS we know blas and lapack are available in sunperf
+      set(LAPACK_LIBRARIES -library=sunperf)
+      set_config_option(HAVE_BLAS "Blas[sunperf]")
+      set_config_option(HAVE_LAPACK "Lapack[sunperf]")
+    elseif(APPLE)
+      # on Mac we also know that blas and lapack are available
+      set(LAPACK_LIBRARIES "-llapack -lblas")
+      set_config_option(HAVE_BLAS "Blas[veclib]")
+      set_config_option(HAVE_LAPACK "Lapack[veclib]")
+    endif()
+
+    if(NOT HAVE_BLAS OR NOT HAVE_LAPACK)
+      # if we haven't found blas and lapack check for OpenBlas
+      set(OPENBLAS_LIBS_REQUIRED openblas)
+      find_all_libraries(LAPACK_LIBRARIES OPENBLAS_LIBS_REQUIRED "" "")
+      if(LAPACK_LIBRARIES)
+        set_config_option(HAVE_BLAS "Blas[openblas]")
+        set_config_option(HAVE_LAPACK "Lapack[openblas]")
+        find_library(GFORTRAN_LIB gfortran)
+        if(GFORTRAN_LIB)
+          list(APPEND LAPACK_LIBRARIES ${GFORTRAN_LIB})
+        endif()
+      endif()
+    endif()
+
+    if(NOT HAVE_BLAS OR NOT HAVE_LAPACK)
+      # if we still haven't found blas and lapack, use the standard cmake tests,
+      # which require a working Fortran compiler
+      enable_language(Fortran)
+      find_package(BLAS)
+      if(BLAS_FOUND)
+        set_config_option(HAVE_BLAS "Blas")
+        find_package(LAPACK)
+        if(LAPACK_FOUND)
+          set_config_option(HAVE_LAPACK "Lapack")
+        else()
+          set(LAPACK_LIBRARIES ${BLAS_LIBRARIES})
+        endif()
+        if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
+          if(CMAKE_Fortran_COMPILER MATCHES "gfortran")
+            list(APPEND LAPACK_LIBRARIES gfortran)
+          elseif(CMAKE_Fortran_COMPILER MATCHES "f95")
+            list(APPEND LAPACK_LIBRARIES gfortran)
+          elseif(CMAKE_Fortran_COMPILER MATCHES "g77")
+            list(APPEND LAPACK_LIBRARIES g2c)
+          endif()
+        elseif(CMAKE_Fortran_COMPILER MATCHES "pgi")
+          list(APPEND LAPACK_LIBRARIES -pgf77libs)
+        endif()
+      endif()
+    endif()
+  endif()
+endif()
+
+if(ENABLE_TCMALLOC)
+  find_library(TCMALLOC tcmalloc)
+  if(TCMALLOC)
+    set_config_option(HAVE_TCMALLOC "TCMalloc")
+    list(APPEND EXTERNAL_LIBRARIES ${TCMALLOC})
+  endif()
+endif()
+
+add_subdirectory(Common)
+add_subdirectory(Numeric)
+add_subdirectory(Geo)
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Mesh AND ENABLE_MESH)
+  add_subdirectory(Mesh)
+  set_config_option(HAVE_MESH "Mesh")
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Solver AND ENABLE_SOLVER)
+  add_subdirectory(Solver)
+  set_config_option(HAVE_SOLVER "Solver")
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Post AND ENABLE_POST)
+  add_subdirectory(Post)
+  set_config_option(HAVE_POST "Post")
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Plugin AND ENABLE_PLUGINS)
+    add_subdirectory(Plugin)
+    set_config_option(HAVE_PLUGINS "Plugins")
+  endif()
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Parser AND ENABLE_PARSER)
+  add_subdirectory(Parser)
+  set_config_option(HAVE_PARSER "Parser")
+endif()
+
+if(ENABLE_VISUDEV)
+  set_config_option(HAVE_VISUDEV "VisuDev")
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Fltk AND ENABLE_FLTK)
+  # first, try to use fltk-config for fltk >= 1.3 (FindFLTK is buggy on Unix,
+  # where e.g. xft and xinerama options are not dealt with)
+  find_program(FLTK_CONFIG_SCRIPT fltk-config)
+  if(FLTK_CONFIG_SCRIPT)
+    execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --api-version
+                    OUTPUT_VARIABLE FLTK_VERSION)
+    string(STRIP "${FLTK_VERSION}" FLTK_VERSION)
+    if(FLTK_VERSION VERSION_GREATER 1.1)
+      add_subdirectory(Fltk)
+      set_config_option(HAVE_FLTK "Fltk")
+      message(STATUS "Using fltk-config script for Fltk " ${FLTK_VERSION})
+      execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --use-gl --use-images --includedir
+                      OUTPUT_VARIABLE FLTK_INCLUDE_DIR)
+      string(STRIP ${FLTK_INCLUDE_DIR} FLTK_INCLUDE_DIR)
+      list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR})
+      # On linux (at least OpenSuSE) the following directories are
+      # not existing (everything is in /usr/include). To avoid warnings
+      # check existance of these directories before adding them
+      if(EXISTS ${FLTK_INCLUDE_DIR}/FL/images)
+        list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/FL/images)
+      endif()
+      if(EXISTS ${FLTK_INCLUDE_DIR}/jpeg)
+        list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/jpeg)
+      endif()
+      if(EXISTS ${FLTK_INCLUDE_DIR}/zlib)
+        list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/zlib)
+      endif()
+      if(EXISTS ${FLTK_INCLUDE_DIR}/png)
+        list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/png)
+      endif()
+      execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --use-gl --use-images --ldflags
+                      OUTPUT_VARIABLE FLTK_LIBRARIES)
+      string(STRIP ${FLTK_LIBRARIES} FLTK_LIBRARIES)
+      string(REGEX MATCH "fltk[_ ]jpeg" FLTK_JPEG ${FLTK_LIBRARIES})
+      string(REGEX MATCH "fltk[_ ]z" FLTK_Z ${FLTK_LIBRARIES})
+      string(REGEX MATCH "fltk[_ ]png" FLTK_PNG ${FLTK_LIBRARIES})
+    endif()
+  endif()
+  # then try the built-in FindFLTK module
+  if(NOT HAVE_FLTK)
+    set(FLTK_SKIP_FORMS TRUE)
+    set(FLTK_SKIP_FLUID TRUE)
+    find_package(FLTK)
+    if(FLTK_FOUND)
+      add_subdirectory(Fltk)
+      set_config_option(HAVE_FLTK "Fltk")
+      list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR})
+      # find fltk jpeg
+      find_library(FLTK_JPEG NAMES fltk_jpeg fltkjpeg)
+      if(FLTK_JPEG)
+        list(APPEND EXTERNAL_LIBRARIES ${FLTK_JPEG})
+        foreach(DIR ${FLTK_INCLUDE_DIR})
+          list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/jpeg)
+        endforeach()
+      endif()
+      # find fltk zlib
+      find_library(FLTK_Z NAMES fltk_z fltkz)
+      if(FLTK_Z)
+        list(APPEND EXTERNAL_LIBRARIES ${FLTK_Z})
+        foreach(DIR ${FLTK_INCLUDE_DIR})
+          list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/zlib)
+        endforeach()
+      endif()
+      # find fltk png
+      find_library(FLTK_PNG NAMES fltk_png fltkpng)
+      if(FLTK_PNG)
+        list(APPEND EXTERNAL_LIBRARIES ${FLTK_PNG})
+        foreach(DIR ${FLTK_INCLUDE_DIR})
+          list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/png)
+        endforeach()
+      endif()
+    endif()
+  endif()
+  # workaround for Fedora/Suse messing up fltk-config (see issue #417)
+  if(HAVE_FLTK AND ${CMAKE_SYSTEM_NAME} MATCHES "Linux")
+    string(REGEX MATCH "X11" FLTK_X11 ${FLTK_LIBRARIES})
+    if(NOT FLTK_X11)
+      find_package(X11)
+      if(X11_FOUND)
+        list(APPEND EXTERNAL_INCLUDES ${X11_INCLUDE_DIR})
+        list(APPEND EXTERNAL_LIBRARIES ${X11_LIBRARIES})
+      endif()
+    endif()
+  endif()
+endif()
+
+if(APPLE AND HAVE_FLTK AND ENABLE_TOUCHBAR)
+  STRING(REGEX MATCH "([0-9]+.[0-9]+)" OSX_SDK_VERSION "${CMAKE_OSX_SYSROOT}")
+  if(OSX_SDK_VERSION)
+    if(${OSX_SDK_VERSION} VERSION_GREATER 10.11)
+      set(GMSH_SRC ${GMSH_SRC};Fltk/touchBar.mm)
+      set_config_option(HAVE_TOUCHBAR "TouchBar")
+    endif()
+  endif()
+endif()
+
+if(ENABLE_ONELAB)
+  set_config_option(HAVE_ONELAB "ONELAB")
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/onelab)
+    if(ENABLE_ONELAB_METAMODEL)
+      add_subdirectory(contrib/onelab)
+      include_directories(contrib/onelab)
+      set_config_option(HAVE_ONELAB_METAMODEL "ONELABMetamodel")
+    endif()
+    file(COPY ${ONELAB_PY} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+  endif()
+endif()
+
+if(ENABLE_BUILD_IOS)
+  find_file(CMAKE_TOOLCHAIN_FILE "ios.cmake")
+  if(NOT CMAKE_TOOLCHAIN_FILE)
+    message(FATAL_ERROR "Cannot compile Gmsh for iOS without a toolchain")
+  endif()
+  add_definitions(-DBUILD_IOS)
+endif()
+
+if(HAVE_FLTK OR ENABLE_GRAPHICS)
+  if(NOT HAVE_MESH OR NOT HAVE_POST OR NOT HAVE_PLUGINS OR NOT HAVE_ONELAB)
+    message(SEND_ERROR "Cannot compile GUI without Mesh, Post, Plugin and ONELAB")
+  endif()
+
+  if(FLTK_JPEG)
+    set_config_option(HAVE_LIBJPEG "Jpeg[fltk]")
+  else()
+    find_package(JPEG)
+    if(JPEG_FOUND)
+      set_config_option(HAVE_LIBJPEG "Jpeg")
+      list(APPEND EXTERNAL_LIBRARIES ${JPEG_LIBRARIES})
+      list(APPEND EXTERNAL_INCLUDES ${JPEG_INCLUDE_DIR})
+    endif()
+  endif()
+
+  if(FLTK_Z)
+    set_config_option(HAVE_LIBZ "Zlib[fltk]")
+  else()
+    find_package(ZLIB)
+    if(ZLIB_FOUND)
+      set_config_option(HAVE_LIBZ "Zlib")
+      list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
+      list(APPEND EXTERNAL_INCLUDES ${ZLIB_INCLUDE_DIR})
+    endif()
+  endif()
+
+  if(HAVE_LIBZ)
+    if(FLTK_PNG)
+      set_config_option(HAVE_LIBPNG "Png[fltk]")
+    else()
+      find_package(PNG)
+      if(PNG_FOUND)
+        set_config_option(HAVE_LIBPNG "Png")
+        list(APPEND EXTERNAL_LIBRARIES ${PNG_LIBRARIES})
+        list(APPEND EXTERNAL_INCLUDES ${PNG_INCLUDE_DIR})
+      endif()
+    endif()
+  endif()
+
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/mpeg_encode AND
+     ENABLE_MPEG_ENCODE)
+    add_subdirectory(contrib/mpeg_encode)
+    include_directories(contrib/mpeg_encode/headers)
+    set_config_option(HAVE_MPEG_ENCODE "Mpeg")
+  endif()
+
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/3M AND ENABLE_3M)
+    add_subdirectory(contrib/3M)
+    include_directories(contrib/3M)
+    set_config_option(HAVE_3M "3M")
+  endif()
+
+  if(ENABLE_OSMESA)
+    find_library(OSMESA_LIB OSMesa)
+    if(OSMESA_LIB)
+      set_config_option(HAVE_OSMESA "OSMesa")
+      list(APPEND EXTERNAL_LIBRARIES ${OSMESA_LIB})
+    endif()
+  endif()
+
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Graphics)
+    set(OpenGL_GL_PREFERENCE "LEGACY")
+    find_package(OpenGL REQUIRED)
+    if(OPENGL_GLU_FOUND AND OPENGL_FOUND)
+      add_subdirectory(Graphics)
+      set_config_option(HAVE_OPENGL "OpenGL")
+    else()
+      message(SEND_ERROR "Could not find GLU: disabling OpenGL support")
+    endif()
+  endif()
+endif()
+
+if(ENABLE_ANN)
+  find_library(ANN_LIB ANN PATH_SUFFIXES lib)
+  find_path(ANN_INC "ANN.h" PATH_SUFFIXES src include ANN)
+  if(ENABLE_SYSTEM_CONTRIB AND ANN_LIB AND ANN_INC)
+    message(STATUS "Using system version of ANN")
+    list(APPEND EXTERNAL_LIBRARIES ${ANN_LIB})
+    list(APPEND EXTERNAL_INCLUDES ${ANN_INC})
+    set_config_option(HAVE_ANN "ANN[system]")
+  elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/ANN)
+    add_subdirectory(contrib/ANN)
+    include_directories(contrib/ANN/include)
+    set_config_option(HAVE_ANN "ANN")
+  endif()
+endif()
+
+if(ENABLE_ALGLIB)
+  find_library(ALGLIB_LIB alglib)
+  find_path(ALGLIB_INC "stdafx.h" PATH_SUFFIXES libalglib)
+  if(ENABLE_SYSTEM_CONTRIB AND ALGLIB_LIB AND ALGLIB_INC)
+    list(APPEND EXTERNAL_LIBRARIES ${ALGLIB_LIB})
+    list(APPEND EXTERNAL_INCLUDES ${ALGLIB_INC})
+    set_config_option(HAVE_ALGLIB "ALGLIB[system]")
+  elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/ALGLIB)
+    add_subdirectory(contrib/ALGLIB)
+    include_directories(contrib/ALGLIB)
+    set_config_option(HAVE_ALGLIB "ALGLIB")
+  endif()
+endif()
+
+if(HAVE_FLTK AND ENABLE_CAIRO)
+  find_library(CAIRO_LIB cairo)
+  find_path(CAIRO_INC "cairo/cairo.h" PATH_SUFFIXES include)
+  if(CAIRO_INC AND CAIRO_LIB)
+     set_config_option(HAVE_CAIRO "Cairo")
+     list(APPEND EXTERNAL_LIBRARIES ${CAIRO_LIB})
+     list(APPEND EXTERNAL_INCLUDES ${CAIRO_INC})
+  endif()
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/DiscreteIntegration AND
+   ENABLE_DINTEGRATION)
+  add_subdirectory(contrib/DiscreteIntegration)
+  include_directories(contrib/DiscreteIntegration)
+  set_config_option(HAVE_DINTEGRATION "DIntegration")
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/HighOrderMeshOptimizer AND
+   EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MeshOptimizer AND
+   EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MeshQualityOptimizer AND
+   ENABLE_OPTHOM AND HAVE_MESH)
+  add_subdirectory(contrib/HighOrderMeshOptimizer)
+  include_directories(contrib/HighOrderMeshOptimizer)
+  add_subdirectory(contrib/MeshOptimizer)
+  include_directories(contrib/MeshOptimizer)
+  include_directories(${CMAKE_CURRENT_BINARY_DIR}/contrib/MeshOptimizer)
+  add_subdirectory(contrib/MeshQualityOptimizer)
+  include_directories(contrib/MeshQualityOptimizer)
+  set_config_option(HAVE_OPTHOM "OptHom")
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/domhex AND
+   ENABLE_DOMHEX AND HAVE_MESH)
+  add_subdirectory(contrib/domhex)
+  include_directories(contrib/domhex)
+  set_config_option(HAVE_DOMHEX "DomHex")
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/QuadTri AND
+   ENABLE_QUADTRI AND HAVE_MESH)
+  add_subdirectory(contrib/QuadTri)
+  include_directories(contrib/QuadTri)
+  set_config_option(HAVE_QUADTRI "QuadTri")
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/kbipack AND ENABLE_KBIPACK)
+  set_config_option(HAVE_KBIPACK "Kbipack")
+  add_subdirectory(contrib/kbipack)
+  include_directories(contrib/kbipack)
+  if(ENABLE_GMP)
+    find_library(GMP_LIB libgmp.a)
+    find_path(GMP_INC "gmp.h" PATH_SUFFIXES src include)
+  endif()
+  if(GMP_LIB AND GMP_INC)
+    set_config_option(HAVE_GMP "GMP")
+    list(APPEND EXTERNAL_LIBRARIES ${GMP_LIB})
+    list(APPEND EXTERNAL_INCLUDES ${GMP_INC})
+  else()
+    message(STATUS "GMP not found: Kbipack uses long int")
+  endif()
+endif()
+
+if(ENABLE_MATHEX)
+  find_library(MATHEX_LIB mathex PATH_SUFFIXES lib)
+  find_path(MATHEX_INC "mathex.h" PATH_SUFFIXES src include)
+  if(ENABLE_SYSTEM_CONTRIB AND MATHEX_LIB AND MATHEX_INC)
+    list(APPEND EXTERNAL_LIBRARIES ${MATHEX_LIB})
+    list(APPEND EXTERNAL_INCLUDES ${MATHEX_INC})
+    set_config_option(HAVE_MATHEX "MathEx[system]")
+  elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MathEx)
+    add_subdirectory(contrib/MathEx)
+    include_directories(contrib/MathEx)
+    set_config_option(HAVE_MATHEX "MathEx")
+  endif()
+endif()
+
+if(ENABLE_MPI)
+  find_package(MPI)
+  if(MPI_FOUND)
+    set_config_option(HAVE_MPI "MPI")
+    list(APPEND EXTERNAL_INCLUDES ${MPI_CXX_INCLUDE_PATH})
+    list(APPEND EXTERNAL_LIBRARIES ${MPI_CXX_LIBRARIES})
+    set(CMAKE_C_COMPILER ${MPI_C_COMPILER})
+    set(CMAKE_CXX_COMPILER ${MPI_CXX_COMPILER})
+    set(CMAKE_Fortran_COMPILER ${MPI_Fortran_COMPILER})
+  endif()
+endif()
+
+if(ENABLE_POPPLER)
+  find_library(POPPLER_LIB poppler)
+  find_library(POPPLER_CPP_LIB poppler-cpp)
+  find_path(POPPLER_INC "poppler/cpp/poppler-document.h" PATH_SUFFIXES src include)
+  if(POPPLER_LIB AND POPPLER_INC)
+    set_config_option(HAVE_POPPLER "Poppler")
+    list(APPEND EXTERNAL_LIBRARIES ${POPPLER_LIB})
+    list(APPEND EXTERNAL_LIBRARIES ${POPPLER_CPP_LIB})
+    list(APPEND EXTERNAL_INCLUDES ${POPPLER_INC})
+  endif()
+endif()
+
+if(ENABLE_P4EST)
+  find_library(P4EST_LIB p4est)
+  find_path(P4EST_INC "p4est.h" PATH_SUFFIXES src)
+  find_library(SC_LIB sc)
+  if(P4EST_LIB AND P4EST_INC AND SC_LIB)
+    set_config_option(HAVE_P4EST "P4est")
+    list(APPEND EXTERNAL_LIBRARIES ${P4EST_LIB} ${SC_LIB})
+    list(APPEND EXTERNAL_INCLUDES ${P4EST_INC})
+  endif()
+endif()
+
+if(HAVE_MESH OR HAVE_SOLVER)
+  if(ENABLE_METIS)
+    if(METIS_LIB AND METIS_INC)
+      list(APPEND EXTERNAL_LIBRARIES ${METIS_LIB})
+      list(APPEND EXTERNAL_INCLUDES ${METIS_INC})
+      set_config_option(HAVE_METIS "Metis")
+    else()
+      find_library(METIS_LIB metis PATH_SUFFIXES lib)
+      find_path(METIS_INC "metis.h" PATH_SUFFIXES include)
+      if(ENABLE_SYSTEM_CONTRIB AND METIS_LIB AND METIS_INC)
+        message(STATUS "Using system version of METIS")
+        list(APPEND EXTERNAL_LIBRARIES ${METIS_LIB})
+        list(APPEND EXTERNAL_INCLUDES ${METIS_INC})
+        set_config_option(HAVE_METIS "Metis[system]")
+      elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/metis)
+        add_definitions(-DUSE_GKREGEX)
+        add_subdirectory(contrib/metis)
+        include_directories(contrib/metis/include contrib/metis/libmetis
+                          contrib/metis/GKlib)
+        set_config_option(HAVE_METIS "Metis")
+      endif()
+    endif()
+  endif()
+endif()
+
+if(HAVE_MESH)
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Mesh/tetgenBR.cxx)
+    set_config_option(HAVE_TETGENBR "TetGen/BR")
+  endif()
+
+  if(ENABLE_VOROPP)
+    find_library(VOROPP_LIB voro++)
+    find_path(VOROPP_INC "voro++.hh" PATH_SUFFIXES voro++)
+    if(ENABLE_SYSTEM_CONTRIB AND VOROPP_LIB AND VOROPP_INC)
+      message(STATUS "Using system version of voro++")
+      list(APPEND EXTERNAL_LIBRARIES ${VOROPP_LIB})
+      list(APPEND EXTERNAL_INCLUDES ${VOROPP_INC})
+      set_config_option(HAVE_VOROPP "Voro++[system]")
+    elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/voro++)
+      add_subdirectory(contrib/voro++)
+      include_directories(contrib/voro++/src)
+      set_config_option(HAVE_VOROPP "Voro++")
+    endif()
+  endif()
+
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/blossom AND ENABLE_BLOSSOM)
+    add_subdirectory(contrib/blossom)
+    include_directories(contrib/blossom/MATCH contrib/blossom/concorde97
+                        contrib/blossom/concorde97/INCLUDE)
+    set_config_option(HAVE_BLOSSOM "Blossom")
+  endif()
+
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/Netgen AND ENABLE_NETGEN)
+    add_subdirectory(contrib/Netgen)
+    include_directories(contrib/Netgen contrib/Netgen/libsrc/include
+                        contrib/Netgen/nglib)
+    set_config_option(HAVE_NETGEN "Netgen")
+    add_definitions(-DNO_PARALLEL_THREADS -DNOTCL)
+  endif()
+
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/bamg AND ENABLE_BAMG)
+    add_subdirectory(contrib/bamg)
+    include_directories(contrib/bamg contrib/bamg/bamglib)
+    set_config_option(HAVE_BAMG "Bamg")
+  endif()
+
+  if(ENABLE_MMG)
+    find_library(MMG_LIB NAMES Mmg mmg)
+    find_path(MMG_INC "libmmg.h" PATH_SUFFIXES mmg)
+    if(MMG_LIB AND MMG_INC)
+      list(APPEND EXTERNAL_LIBRARIES ${MMG_LIB})
+      list(APPEND EXTERNAL_INCLUDES ${MMG_INC})
+      set_config_option(HAVE_MMG "Mmg")
+    endif()
+  endif()
+endif()
+
+if(ENABLE_MED OR ENABLE_CGNS)
+  find_package(HDF5)
+  if(HDF5_FOUND)
+    set(HDF5_LIB "${HDF5_C_LIBRARIES}")
+    list(APPEND EXTERNAL_INCLUDES ${HDF5_INCLUDE_DIRS})
+    if(ENABLE_MED)
+      find_library(MED_LIB medC)
+      if(MED_LIB)
+        set_config_option(HAVE_MED "Med")
+        list(APPEND EXTERNAL_LIBRARIES ${MED_LIB})
+      endif()
+    endif()
+    if(ENABLE_CGNS)
+      find_library(CGNS_LIB cgns HINTS ENV CGNS_ROOT PATH_SUFFIXES lib)
+      find_path(CGNS_INC "cgnslib.h" HINTS ENV CGNS_ROOT PATH_SUFFIXES include)
+      if(CGNS_LIB AND CGNS_INC)
+        set_config_option(HAVE_LIBCGNS "Cgns")
+        list(APPEND EXTERNAL_LIBRARIES ${CGNS_LIB})
+        list(APPEND EXTERNAL_INCLUDES ${CGNS_INC})
+        if(ENABLE_CGNS_CPEX0045)
+          set_config_option(HAVE_LIBCGNS_CPEX0045 "Cgns_CPEX0045")
+        endif()
+      endif()
+    endif()
+    if(MED_LIB OR CGNS_LIB)
+      list(APPEND EXTERNAL_LIBRARIES ${HDF5_LIB})
+      find_library(SZ_LIB NAMES szlib sz)
+      if(SZ_LIB)
+        list(APPEND EXTERNAL_LIBRARIES ${SZ_LIB})
+      endif()
+      if(NOT HAVE_LIBZ) # necessary for non-GUI builds
+        find_package(ZLIB)
+        if(ZLIB_FOUND)
+          set_config_option(HAVE_LIBZ "Zlib")
+          list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
+        endif()
+      endif()
+    endif()
+  else()
+    message(STATUS "HDF5 not found")
+  endif()
+endif()
+
+if(HAVE_SOLVER)
+  if(ENABLE_GMM)
+    find_path(GMM_INC "gmm.h" PATH_SUFFIXES src include include/gmm)
+    if(ENABLE_SYSTEM_CONTRIB AND GMM_INC)
+      message(STATUS "Using system version of GMM")
+      list(APPEND EXTERNAL_INCLUDES ${GMM_INC})
+      set_config_option(HAVE_GMM "Gmm[system]")
+    elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/gmm)
+      include_directories(contrib/gmm)
+      set_config_option(HAVE_GMM "Gmm")
+    endif()
+  endif()
+
+  if(ENABLE_PETSC)
+    if(PETSC_DIR)
+      set(ENV_PETSC_DIR ${PETSC_DIR})
+    else()
+      set(ENV_PETSC_DIR $ENV{PETSC_DIR})
+    endif()
+    if(PETSC_ARCH)
+      set(ENV_PETSC_ARCH ${PETSC_ARCH})
+    else()
+      set(ENV_PETSC_ARCH $ENV{PETSC_ARCH})
+    endif()
+    set(PETSC_POSSIBLE_CONF_FILES
+        ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/conf/petscvariables
+        ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib/petsc-conf/petscvariables
+        ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib/petsc/conf/petscvariables)
+    foreach(FILE ${PETSC_POSSIBLE_CONF_FILES})
+      if(EXISTS ${FILE})
+        # old-style PETSc installations (using PETSC_DIR and PETSC_ARCH)
+        message(STATUS "Using PETSc dir: ${ENV_PETSC_DIR}")
+        message(STATUS "Using PETSc arch: ${ENV_PETSC_ARCH}")
+        # find includes by parsing the petscvariables file
+        file(STRINGS ${FILE} PETSC_VARIABLES NEWLINE_CONSUME)
+      endif()
+    endforeach()
+    if(PETSC_VARIABLES)
+      # try to find PETSC_CC_INCLUDES for PETSc >= 3.4
+      string(REGEX MATCH "PETSC_CC_INCLUDES = [^\n\r]*" PETSC_PACKAGES_INCLUDES
+             ${PETSC_VARIABLES})
+      if(PETSC_PACKAGES_INCLUDES)
+        string(REPLACE "PETSC_CC_INCLUDES = " "" PETSC_PACKAGES_INCLUDES
+               ${PETSC_PACKAGES_INCLUDES})
+      else()
+        # try to find PETSC_PACKAGES_INCLUDES in older versions
+        list(APPEND EXTERNAL_INCLUDES ${ENV_PETSC_DIR}/include)
+        list(APPEND EXTERNAL_INCLUDES ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/include)
+        string(REGEX MATCH "PACKAGES_INCLUDES = [^\n\r]*" PETSC_PACKAGES_INCLUDES
+               ${PETSC_VARIABLES})
+        string(REPLACE "PACKAGES_INCLUDES = " "" PETSC_PACKAGES_INCLUDES
+               ${PETSC_PACKAGES_INCLUDES})
+      endif()
+      if(PETSC_PACKAGES_INCLUDES)
+        if(PETSC_PACKAGES_INCLUDES)
+          string(REPLACE "-I" "" PETSC_PACKAGES_INCLUDES ${PETSC_PACKAGES_INCLUDES})
+          string(REPLACE " " ";" PETSC_PACKAGES_INCLUDES ${PETSC_PACKAGES_INCLUDES})
+          foreach(VAR ${PETSC_PACKAGES_INCLUDES})
+            # seem to include unexisting directories (/usr/include/lib64)
+	    # check to avoid warnings
+	    if(EXISTS ${VAR})
+	      list(APPEND EXTERNAL_INCLUDES ${VAR})
+            endif()
+          endforeach()
+        endif()
+      endif()
+      # find libraries (<= 3.0)
+      set(PETSC_LIBS_REQUIRED petscksp petscdm petscmat petscvec petsc)
+      find_all_libraries(PETSC_LIBS PETSC_LIBS_REQUIRED
+                         ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib "")
+      # petsc 3.1 creates only one library (libpetsc)
+      if(NOT PETSC_LIBS)
+        find_library(PETSC_LIBS petsc PATHS ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib
+                     NO_DEFAULT_PATH)
+      endif()
+      if(PETSC_LIBS)
+        set_config_option(HAVE_PETSC "PETSc")
+	if(NOT HAVE_BLAS)
+          set_config_option(HAVE_BLAS "Blas[petsc]")
+        endif()
+	if(NOT HAVE_LAPACK)
+          set_config_option(HAVE_LAPACK "Lapack[petsc]")
+        endif()
+      endif()
+      # find slepc (needs to be linked in before petsc)
+      if(ENABLE_SLEPC)
+        if(SLEPC_DIR)
+          set(ENV_SLEPC_DIR ${SLEPC_DIR})
+         else()
+          set(ENV_SLEPC_DIR $ENV{SLEPC_DIR})
+        endif()
+        find_library(SLEPC_LIB slepc PATHS ${ENV_SLEPC_DIR}/${ENV_PETSC_ARCH}/lib
+                     NO_DEFAULT_PATH)
+        if(SLEPC_LIB)
+          find_path(SLEPC_INC "slepc.h" PATHS ${ENV_SLEPC_DIR} PATH_SUFFIXES include
+                    ${ENV_PETSC_ARCH}/include include/slepc NO_DEFAULT_PATH)
+          if(SLEPC_INC)
+            message(STATUS "Using SLEPc dir: ${ENV_SLEPC_DIR}")
+            set_config_option(HAVE_SLEPC "SLEPc")
+            list(APPEND EXTERNAL_LIBRARIES ${SLEPC_LIB})
+            list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC})
+            find_path(SLEPC_INC2 "slepcconf.h" PATHS ${ENV_SLEPC_DIR}
+                      PATH_SUFFIXES ${ENV_PETSC_ARCH}/include NO_DEFAULT_PATH)
+            if(SLEPC_INC2)
+              list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC2})
+            endif()
+          endif()
+        endif()
+      endif()
+      list(APPEND EXTERNAL_LIBRARIES ${PETSC_LIBS})
+      # find additional libraries to link with
+      string(REGEX MATCH "PACKAGES_LIBS = [^\n\r]*" PLIBS ${PETSC_VARIABLES})
+      if(PLIBS)
+        string(REPLACE "PACKAGES_LIBS = " "" PLIBS ${PLIBS})
+        string(STRIP ${PLIBS} PLIBS)
+        list(APPEND EXTERNAL_LIBRARIES "${PLIBS}")
+      endif()
+      string(REGEX MATCH "PETSC_EXTERNAL_LIB_BASIC = [^\n\r]*" PLIBS_BASIC ${PETSC_VARIABLES})
+      if(PLIBS_BASIC)
+        string(REPLACE "PETSC_EXTERNAL_LIB_BASIC = " "" PLIBS_BASIC ${PLIBS_BASIC})
+        string(STRIP ${PLIBS_BASIC} PLIBS_BASIC)
+        separate_arguments(PLIBS_BASIC)
+        list(APPEND EXTERNAL_LIBRARIES "${PLIBS_BASIC}")
+      endif()
+      string(REGEX MATCH "PCC_LINKER_LIBS = [^\n\r]*" LLIBS ${PETSC_VARIABLES})
+      if(LLIBS)
+        string(REPLACE "PCC_LINKER_LIBS = " "" LLIBS ${LLIBS})
+        string(STRIP ${LLIBS} LLIBS)
+        list(APPEND EXTERNAL_LIBRARIES "${LLIBS}")
+      endif()
+    else()
+      # new-style PETSc installations (in standard system directories)
+      find_library(PETSC_LIBS petsc)
+      find_path(PETSC_INC "petsc.h" PATH_SUFFIXES include/petsc)
+      if(PETSC_LIBS AND PETSC_INC)
+        set_config_option(HAVE_PETSC "PETSc")
+        if(ENABLE_SLEPC)
+          find_library(SLEPC_LIB slepc)
+          find_path(SLEPC_INC "slepc.h" PATH_SUFFIXES include/slepc)
+          if(SLEPC_LIB AND SLEPC_INC)
+            set_config_option(HAVE_SLEPC "SLEPc")
+            list(APPEND EXTERNAL_LIBRARIES ${SLEPC_LIB})
+            list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC})
+          endif()
+        endif()
+        list(APPEND EXTERNAL_LIBRARIES ${PETSC_LIBS})
+        list(APPEND EXTERNAL_INCLUDES ${PETSC_INC})
+      endif()
+    endif()
+  endif()
+
+  if(ENABLE_MUMPS AND HAVE_BLAS AND HAVE_LAPACK)
+    set(MUMPS_LIBS_REQUIRED smumps dmumps cmumps zmumps mumps_common pord)
+    if(NOT ENABLE_MPI)
+      list(APPEND MUMPS_LIBS_REQUIRED mpiseq)
+    endif()
+    find_all_libraries(MUMPS_LIBRARIES MUMPS_LIBS_REQUIRED "" "lib")
+    find_path(SMUMPS_INC "smumps_c.h" PATH_SUFFIXES src include)
+    find_path(DMUMPS_INC "dmumps_c.h" PATH_SUFFIXES src include)
+    find_path(CMUMPS_INC "cmumps_c.h" PATH_SUFFIXES src include)
+    find_path(ZMUMPS_INC "zmumps_c.h" PATH_SUFFIXES src include)
+    if(MUMPS_LIBRARIES AND SMUMPS_INC AND DMUMPS_INC AND CMUMPS_INC AND ZMUMPS_INC)
+      set_config_option(HAVE_MUMPS "MUMPS")
+      list(APPEND EXTERNAL_LIBRARIES ${MUMPS_LIBRARIES})
+      list(APPEND EXTERNAL_INCLUDES ${SMUMPS_INC})
+      list(APPEND EXTERNAL_INCLUDES ${DMUMPS_INC})
+      list(APPEND EXTERNAL_INCLUDES ${CMUMPS_INC})
+      list(APPEND EXTERNAL_INCLUDES ${ZMUMPS_INC})
+      find_library(GFORTRAN_LIB gfortran)
+      if(GFORTRAN_LIB)
+        list(APPEND EXTERNAL_LIBRARIES ${GFORTRAN_LIB})
+      endif()
+      if(ENABLE_GMM) # use GMM/MUMPS interface
+        add_definitions(-DGMM_USES_MUMPS)
+      endif()
+    endif()
+  endif()
+
+  if(ENABLE_GETDP)
+    find_library(GETDP_LIB GetDP)
+    find_path(GETDP_INC "GetDP.h" PATH_SUFFIXES getdp)
+    if(GETDP_LIB AND GETDP_INC)
+      set_config_option(HAVE_GETDP "GetDP")
+      list(APPEND EXTERNAL_LIBRARIES ${GETDP_LIB})
+      list(APPEND EXTERNAL_INCLUDES ${GETDP_INC})
+    endif()
+  endif()
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt AND ENABLE_HXT)
+  add_subdirectory(contrib/hxt)
+  include_directories(BEFORE ${HXT_INC_DIRS})
+  set_config_option(HAVE_HXT "Hxt")
+  # do not use arithmetic contraction in predicates.c
+  if(MSVC OR (CMAKE_C_COMPILER_ID STREQUAL "Intel" AND WIN32))
+    set_source_files_properties(
+        "${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt/predicates/src/predicates.c"
+        PROPERTIES COMPILE_FLAGS "/fp:strict")
+  elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel")
+    set_source_files_properties(
+        "${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt/predicates/src/predicates.c"
+        PROPERTIES COMPILE_FLAGS "-fp-model strict")
+  elseif(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
+    set_source_files_properties(
+        "${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt/predicates/src/predicates.c"
+        PROPERTIES COMPILE_FLAGS  "-fno-unsafe-math-optimizations -ffp-contract=off")
+  else()
+    message(WARNING
+      "Unsupported compiler !
+       Make sure compiled functions from predicates.c
+       do NOT use extended double precision and follow IEEE754 standard.
+       It is crucial for the robustness of geometric predicates.")
+  endif()
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/pro AND ENABLE_PRO)
+  add_subdirectory(pro)
+endif()
+
+if(ENABLE_OCC)
+  set(OCC_MINIMAL_VERSION "6.9.1")
+  if(WIN32)
+    if(HAVE_64BIT_SIZE_T)
+      set(OCC_SYS_NAME win64)
+    else()
+      set(OCC_SYS_NAME win32)
+    endif()
+  else()
+    set(OCC_SYS_NAME ${CMAKE_SYSTEM_NAME})
+  endif()
+  find_path(OCC_INC "Standard_Version.hxx" HINTS ENV CASROOT PATH_SUFFIXES
+            inc include include/oce opencascade include/opencascade
+            occt include/occt)
+  if(OCC_INC)
+    file(STRINGS ${OCC_INC}/Standard_Version.hxx
+         OCC_MAJOR REGEX "#define OCC_VERSION_MAJOR.*")
+    file(STRINGS ${OCC_INC}/Standard_Version.hxx
+         OCC_MINOR REGEX "#define OCC_VERSION_MINOR.*")
+    file(STRINGS ${OCC_INC}/Standard_Version.hxx
+         OCC_MAINT REGEX "#define OCC_VERSION_MAINTENANCE.*")
+    if(OCC_MAJOR AND OCC_MINOR AND OCC_MAINT)
+      string(REGEX MATCH "[0-9]+" OCC_MAJOR "${OCC_MAJOR}")
+      string(REGEX MATCH "[0-9]+" OCC_MINOR "${OCC_MINOR}")
+      string(REGEX MATCH "[0-9]+" OCC_MAINT "${OCC_MAINT}")
+      set(OCC_VERSION "${OCC_MAJOR}.${OCC_MINOR}.${OCC_MAINT}")
+      message(STATUS "Found OpenCASCADE version ${OCC_VERSION} in ${OCC_INC}")
+    endif()
+  endif()
+  if(OCC_VERSION AND OCC_VERSION STRLESS ${OCC_MINIMAL_VERSION})
+    message(WARNING "Gmsh requires OpenCASCADE >= ${OCC_MINIMAL_VERSION}. "
+        "Use CMAKE_PREFIX_PATH or the CASROOT environment variable "
+        "to explicitely specify the installation path of OpenCASCADE")
+  elseif(OCC_INC)
+    set(OCC_LIBS_REQUIRED
+	# subset of DataExchange
+      	TKSTEP TKSTEP209 TKSTEPAttr TKSTEPBase TKIGES TKXSBase
+      	# ModelingAlgorithms
+      	TKOffset TKFeat TKFillet TKBool TKMesh TKHLR TKBO TKPrim TKShHealing
+      	TKTopAlgo TKGeomAlgo
+      	# ModelingData
+      	TKBRep TKGeomBase TKG3d TKG2d
+      	# FoundationClasses
+      	TKMath TKernel)
+    if(ENABLE_OCC_TBB)
+      list(APPEND OCC_LIBS_REQUIRED tbb tbbmalloc)
+    endif()
+    list(LENGTH OCC_LIBS_REQUIRED NUM_OCC_LIBS_REQUIRED)
+    if(OCC_LIBS)
+      message(STATUS "OCC libraries specified explicitly: " ${OCC_LIBS})
+      list(LENGTH OCC_LIBS_REQUIRED NUM_OCC_LIBS)
+    else()
+      set(OCC_LIBS)
+      foreach(OCC ${OCC_LIBS_REQUIRED})
+        find_library(OCC_LIB ${OCC} HINTS ENV CASROOT PATH_SUFFIXES
+                     lib ${OCC_SYS_NAME}/lib ${OCC_SYS_NAME}/vc8/lib
+                     ${OCC_SYS_NAME}/gcc/lib ${OCC_SYS_NAME}/gcc/bin)
+        if(OCC_LIB)
+	  list(APPEND OCC_LIBS ${OCC_LIB})
+        else()
+          message(STATUS "OCC lib " ${OCC} " not Found")
+        endif()
+        unset(OCC_LIB CACHE)
+      endforeach()
+      list(LENGTH OCC_LIBS NUM_OCC_LIBS)
+    endif()
+  endif()
+
+  # additional OCC libraries to handle reading of STEP/IGES attributes. Oh my...
+  if(ENABLE_OCC_CAF)
+    find_package(Freetype)
+    if(FREETYPE_FOUND)
+      set(OCC_CAF_LIBS_REQUIRED
+          TKXDESTEP TKXDEIGES TKXCAF TKLCAF TKVCAF TKCAF TKV3d TKService TKCDF)
+      list(LENGTH OCC_CAF_LIBS_REQUIRED NUM_OCC_CAF_LIBS_REQUIRED)
+      set(OCC_CAF_LIBS)
+      foreach(OCC ${OCC_CAF_LIBS_REQUIRED})
+        find_library(OCC_CAF_LIB ${OCC} HINTS ENV CASROOT PATH_SUFFIXES
+                     lib ${OCC_SYS_NAME}/lib ${OCC_SYS_NAME}/vc8/lib
+                     ${OCC_SYS_NAME}/gcc/lib ${OCC_SYS_NAME}/gcc/bin)
+        if(OCC_CAF_LIB)
+          list(APPEND OCC_CAF_LIBS ${OCC_CAF_LIB})
+        else()
+          message(STATUS "OCC CAF lib " ${OCC} " not Found")
+        endif()
+        unset(OCC_CAF_LIB CACHE)
+      endforeach()
+      list(LENGTH OCC_CAF_LIBS NUM_OCC_CAF_LIBS)
+    endif()
+  endif()
+
+  if(NUM_OCC_LIBS EQUAL NUM_OCC_LIBS_REQUIRED)
+    # append OCC CAF libraries first...
+    if(NUM_OCC_CAF_LIBS EQUAL NUM_OCC_CAF_LIBS_REQUIRED)
+      set_config_option(HAVE_OCC_CAF "OpenCASCADE-CAF")
+      list(APPEND EXTERNAL_LIBRARIES ${OCC_CAF_LIBS} ${FREETYPE_LIBRARIES})
+      list(APPEND EXTERNAL_INCLUDES ${FREETYPE_INCLUDE_DIRS})
+      if(WIN32)
+        list(APPEND EXTERNAL_LIBRARIES "windowscodecs")
+        list(APPEND EXTERNAL_LIBRARIES "ole32")
+      endif()
+    endif()
+    # then append OCC libraries
+    set_config_option(HAVE_OCC "OpenCASCADE")
+    list(APPEND EXTERNAL_LIBRARIES ${OCC_LIBS})
+    list(APPEND EXTERNAL_INCLUDES ${OCC_INC})
+    if(HAVE_64BIT_SIZE_T)
+      add_definitions(-D_OCC64)
+    endif()
+    if(WIN32)
+      list(APPEND EXTERNAL_LIBRARIES "winspool")
+      add_definitions(-DOCC_CONVERT_SIGNALS)
+    elseif(MSVC)
+      add_definitions(-DWNT)
+    endif()
+  endif()
+endif()
+
+if(ENABLE_ZIPPER)
+  if(ENABLE_BUILD_IOS)
+    set_config_option(HAVE_LIBZ "Zlib")
+  endif()
+  if(NOT HAVE_LIBZ) # necessary for non-GUI builds
+    find_package(ZLIB)
+    if(ZLIB_FOUND)
+      set_config_option(HAVE_LIBZ "Zlib")
+      list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
+      list(APPEND EXTERNAL_INCLUDES ${ZLIB_INCLUDE_DIR})
+    endif()
+  endif()
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/zipper AND HAVE_LIBZ)
+    add_subdirectory(contrib/zipper)
+    include_directories(contrib/zipper)
+    set_config_option(HAVE_ZIPPER "Zipper")
+  endif()
+endif()
+
+if(ENABLE_PRIVATE_API AND ENABLE_WRAP_PYTHON)
+  find_package(SWIG REQUIRED)
+  include(${SWIG_USE_FILE})
+  find_package(PythonLibs)
+  if(SWIG_FOUND AND PYTHONLIBS_FOUND)
+    message(STATUS "Found SWIG version " ${SWIG_VERSION})
+    find_package(PythonInterp)
+    string(SUBSTRING ${SWIG_VERSION} 0 1 SWIG_MAJOR_VERSION)
+    if(SWIG_MAJOR_VERSION EQUAL 1)
+      message(WARNING "Python bindings require SWIG >= 2: disabling Python")
+    else()
+      set_config_option(HAVE_PYTHON "Python")
+      mark_as_advanced(CLEAR PYTHON_LIBRARY PYTHON_INCLUDE_DIR)
+      if(ENABLE_NUMPY)
+        if (NOT NUMPY_INC)
+          EXEC_PROGRAM (${PYTHON_EXECUTABLE}
+            ARGS "-c \"import numpy; print(numpy.get_include())\""
+            OUTPUT_VARIABLE NUMPY_INC
+            RETURN_VALUE NUMPY_NOT_FOUND)
+        endif()
+        if(NUMPY_INC)
+          list(APPEND EXTERNAL_INCLUDES ${NUMPY_INC})
+          set_config_option(HAVE_NUMPY "Numpy")
+        endif()
+      endif()
+      if(HAVE_PETSC)
+        if(ENABLE_PETSC4PY)
+          EXECUTE_PROCESS(
+            COMMAND ${PYTHON_EXECUTABLE} -c "import petsc4py; print(petsc4py.get_include())"
+            OUTPUT_VARIABLE PETSC4PY_INC
+            RESULT_VARIABLE PETSC4PY_NOT_FOUND
+            ERROR_QUIET
+            OUTPUT_STRIP_TRAILING_WHITESPACE)
+          if(PETSC4PY_INC)
+            list(APPEND EXTERNAL_INCLUDES ${PETSC4PY_INC})
+            set_config_option(HAVE_PETSC4PY "PETSc4py")
+          endif()
+        endif()
+      endif()
+    endif()
+  endif()
+endif()
+
+check_function_exists(vsnprintf HAVE_VSNPRINTF)
+if(NOT HAVE_VSNPRINTF AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
+  set_config_option(HAVE_NO_VSNPRINTF "NoVsnprintf")
+endif()
+
+check_include_file(sys/socket.h HAVE_SYS_SOCKET_H)
+if(HAVE_SYS_SOCKET_H)
+  set(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h)
+endif()
+check_type_size(socklen_t SOCKLEN_T_SIZE)
+set(CMAKE_EXTRA_INCLUDE_FILES)
+if(NOT SOCKLEN_T_SIZE AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
+  set_config_option(HAVE_NO_SOCKLEN_T "NoSocklenT")
+endif()
+
+check_include_file(stdint.h HAVE_STDINT_H)
+if(HAVE_STDINT_H)
+  set(CMAKE_EXTRA_INCLUDE_FILES stdint.h)
+else()
+  set_config_option(HAVE_NO_STDINT_H "NoStdintH")
+endif()
+check_type_size(intptr_t INTPTR_T_SIZE)
+set(CMAKE_EXTRA_INCLUDE_FILES)
+if(NOT INTPTR_T_SIZE AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
+  set_config_option(HAVE_NO_INTPTR_T "NoIntptrT")
+endif()
+
+check_include_file(dlfcn.h DLFCN_H)
+if(DLFCN_H)
+  set_config_option(HAVE_DLOPEN "Dlopen")
+  list(APPEND EXTERNAL_LIBRARIES ${CMAKE_DL_LIBS})
+endif()
+
+if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
+  check_include_file(linux/joystick.h LINUX_JOYSTICK_H)
+  if(LINUX_JOYSTICK_H)
+    set_config_option(HAVE_LINUX_JOYSTICK "LinuxJoystick")
+  endif()
+endif()
+
+if(WIN32)
+  add_definitions(-D_USE_MATH_DEFINES)
+  list(APPEND EXTERNAL_LIBRARIES winmm wsock32 ws2_32 psapi)
+endif()
+
+if(MSVC)
+  add_definitions(-DNOMINMAX -D_CRT_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_DEPRECATE)
+endif()
+
+# add C functions API
+set(GMSH_SRC ${GMSH_SRC};api/gmshc.cpp)
+
+# force full warnings to encourage everybody to write clean(er) code
+check_cxx_compiler_flag("-Wall" WALL)
+if(WALL AND NOT MSVC)
+  file(GLOB_RECURSE WALL_SRC Common/*.cpp Fltk/*.cpp FunctionSpace/*.cpp
+       Geo/*.cpp Graphics/*.cpp Mesh/*.cpp Numeric/*.cpp Parser/*.cpp
+       Plugin/*.cpp Post/*.cpp Solver/*.cpp)
+  set(WF "-Wall")
+  check_cxx_compiler_flag("-Wint-to-void-pointer-cast" WCAST)
+  if(WCAST)
+    set(WF "${WF} -Wno-int-to-void-pointer-cast")
+  endif()
+  check_cxx_compiler_flag("-Wdeprecated-declarations" WDEPREC)
+  if(WDEPREC)
+    # FIXME: remove this when we have fixed the deprecated GLU code for OpenGL3
+    set(WF "${WF} -Wno-deprecated-declarations")
+  endif()
+  check_cxx_compiler_flag("-Wmisleading-indentation" WIND)
+  if(WIND)
+    set(WF "${WF} -Wno-misleading-indentation")
+  endif()
+  check_cxx_compiler_flag("-Wno-attributes" WATTR)
+  if(WATTR)
+    # FIXME: remove this when GCC behaves more intelligently
+    set(WF "${WF} -Wno-attributes")
+  endif()
+  set_compile_flags(WALL_SRC ${WF})
+endif()
+
+# don't issue warnings for contributed libraries
+check_cxx_compiler_flag("-w" NOWARN)
+if(NOWARN)
+  file(GLOB_RECURSE NOWARN_SRC contrib/*.cpp contrib/*.cc contrib/*.cxx contrib/*.c)
+  set_compile_flags(NOWARN_SRC "-w")
+endif()
+
+# disable compile optimization on some known problematic files
+check_cxx_compiler_flag("-O0" NOOPT)
+if(NOOPT OR ENABLE_BUILD_IOS)
+  if(ENABLE_BUILD_IOS) # optimized iOS 10 64 bits screws somewhere in Geo
+    file(GLOB_RECURSE NOOPT_SRC Numeric/robustPredicates.cpp Geo/G*.cpp Mesh/BDS.cpp
+         Parser/Gmsh.tab.cpp contrib/blossom/* Mesh/Background*)
+  else()
+    file(GLOB_RECURSE NOOPT_SRC Numeric/robustPredicates.cpp Mesh/BDS.cpp
+         Parser/Gmsh.tab.cpp contrib/blossom/* contrib/bamg/* Mesh/Background*)
+  endif()
+  set_compile_flags(NOOPT_SRC "-O0")
+endif()
+
+# do not use arithmetic contraction in predicates.cpp
+# if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
+#   set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
+#     COMPILE_FLAGS "/fp:strict")
+# elseif(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
+#   set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
+#     COMPILE_FLAGS "-fno-unsafe-math-optimizations -ffp-contract=off")
+# elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel")
+#   set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
+#     COMPILE_FLAGS "-fp-model strict")
+# endif()
+
+# enable Revoropt and set compile flags for the corresponding plugin
+if(ENABLE_REVOROPT)
+  if(HAVE_EIGEN AND HAVE_MESH AND HAVE_PLUGINS AND HAVE_ANN AND HAVE_ALGLIB)
+    list(APPEND EXTERNAL_INCLUDES contrib/Revoropt/include)
+    set_config_option(HAVE_REVOROPT "Revoropt")
+    add_definitions(-DUSE_ANN)
+  else()
+    message(WARNING "Revoropt requires Eigen, Mesh, Plugins, ANN and ALGLIB")
+  endif()
+endif()
+
+if(HAVE_MESH AND NOT HAVE_EIGEN AND NOT HAVE_LAPACK)
+  message(WARNING "Most meshing algorithms will not be functional without "
+          "Eigen or Lapack")
+endif()
+
+list(SORT CONFIG_OPTIONS)
+set(GMSH_CONFIG_OPTIONS "")
+foreach(OPT ${CONFIG_OPTIONS})
+  set(GMSH_CONFIG_OPTIONS "${GMSH_CONFIG_OPTIONS} ${OPT}")
+endforeach()
+
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Common/GmshConfig.h.in
+               ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshConfig.h)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Common/GmshVersion.h.in
+               ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshVersion.h)
+
+# the texi and pypi version files are modified in the source directory (not
+# ideal for version.texi, but since git tracks the contents of the file this is
+# acceptable as it will only change when the actual version is changed - not for
+# each git hash; setup.py is not under version control)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo/version.texi.in
+               ${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo/version.texi)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/utils/pypi/gmsh/setup.py.in
+               ${CMAKE_CURRENT_SOURCE_DIR}/utils/pypi/gmsh/setup.py)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/utils/pypi/gmsh-dev/setup.py.in
+               ${CMAKE_CURRENT_SOURCE_DIR}/utils/pypi/gmsh-dev/setup.py)
+
+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/version.txt ${GMSH_SHORT_VERSION})
+
+# process cmake environment variables so we can append them to the -I include
+# commands. This is not recommended (we should only use the cache variables) but
+# it is very convenient: otherwise we have to remember providing the
+# -D... options to cmake for each new build.
+set(ENV_CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH})
+set(ENV_CMAKE_INCLUDE_PATH $ENV{CMAKE_INCLUDE_PATH})
+if(UNIX)
+  if(ENV_CMAKE_PREFIX_PATH)
+    string(REPLACE ":" ";" ENV_CMAKE_PREFIX_PATH ${ENV_CMAKE_PREFIX_PATH})
+  endif()
+  if(ENV_CMAKE_INCLUDE_PATH)
+    string(REPLACE ":" ";" ENV_CMAKE_INCLUDE_PATH ${ENV_CMAKE_INCLUDE_PATH})
+  endif()
+endif()
+list(APPEND EXTERNAL_INCLUDES ${CMAKE_INCLUDE_PATH} ${ENV_CMAKE_INCLUDE_PATH})
+list(APPEND EXTERNAL_INCLUDES ${CMAKE_PREFIX_PATH} ${ENV_CMAKE_PREFIX_PATH})
+foreach(DIR ${CMAKE_PREFIX_PATH} ${ENV_CMAKE_PREFIX_PATH})
+  list(APPEND EXTERNAL_INCLUDES ${DIR}/include)
+endforeach()
+
+if(EXTERNAL_INCLUDES)
+  list(REMOVE_DUPLICATES EXTERNAL_INCLUDES)
+endif()
+
+if(HAVE_FLTK)
+  set(LINK_LIBRARIES ${FLTK_LIBRARIES} ${EXTERNAL_LIBRARIES}
+                     ${OPENGL_LIBRARIES} ${LAPACK_LIBRARIES})
+elseif(HAVE_OPENGL)
+  set(LINK_LIBRARIES ${EXTERNAL_LIBRARIES} ${OPENGL_LIBRARIES}
+                     ${LAPACK_LIBRARIES})
+else()
+  set(LINK_LIBRARIES ${EXTERNAL_LIBRARIES} ${LAPACK_LIBRARIES})
+endif()
+
+# try to use static gfortran on static builds (cannot do this on dynamic builds
+# as e.g. Debian compiles libgfortran.a without -fPIC: sigh...)
+if(NOT ENABLE_BUILD_DYNAMIC AND NOT ENABLE_BUILD_SHARED)
+  find_library(GFORTRAN_STATIC libgfortran.a)
+  if(GFORTRAN_STATIC)
+    set(CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES)
+    message(STATUS "Using static libgfortran")
+    foreach(STR ${LINK_LIBRARIES})
+      string(REPLACE "-lgfortran" ${GFORTRAN_STATIC} STR2 ${STR})
+      list(APPEND LINK_LIBRARIES2 ${STR2})
+    endforeach()
+    set(LINK_LIBRARIES ${LINK_LIBRARIES2})
+  endif()
+endif()
+
+# Linux-specific linker options
+if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
+  if(HAVE_OCC)
+    find_library(RT_LIB rt)
+    if(RT_LIB)
+      list(APPEND LINK_LIBRARIES ${RT_LIB})
+    endif()
+  endif()
+  if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Intel")
+    add_definitions(-fPIC)
+  endif()
+endif()
+
+# we could specify include dirs more selectively, but this is simpler
+include_directories(Common Fltk Geo Graphics Mesh Solver Numeric Parser
+  Plugin Post api ${EXTERNAL_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR}/Common)
+
+# set this for external codes that might include this CMakeList file
+set(GMSH_EXTERNAL_INCLUDE_DIRS ${EXTERNAL_INCLUDES} CACHE
+    STRING "External include directories" FORCE)
+set(GMSH_EXTERNAL_LIBRARIES ${LINK_LIBRARIES} CACHE
+    STRING "External libraries" FORCE)
+
+# group sources for easier navigation in IDEs
+foreach(DIR ${GMSH_DIRS})
+  string(REGEX REPLACE "\\+" "\\\\+" DIR ${DIR})
+  source_group(${DIR} REGULAR_EXPRESSION ${DIR}/.*)
+endforeach()
+
+# static library target
+if(ENABLE_BUILD_LIB)
+  add_library(lib STATIC ${GMSH_SRC})
+  set_target_properties(lib PROPERTIES OUTPUT_NAME gmsh)
+  if(MSVC)
+    set_target_properties(lib PROPERTIES DEBUG_POSTFIX d)
+    if(ENABLE_MSVC_STATIC_RUNTIME)
+      set_target_properties(lib PROPERTIES LINK_FLAGS_RELEASE "/nodefaultlib:LIBCMT")
+    endif()
+  endif()
+endif()
+
+# shared library target
+if(ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
+  add_library(shared SHARED ${GMSH_SRC})
+  set_target_properties(shared PROPERTIES OUTPUT_NAME gmsh
+     VERSION ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}.${GMSH_PATCH_VERSION}
+     SOVERSION ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION})
+  if(WIN32)
+    set_target_properties(shared PROPERTIES PREFIX "" IMPORT_PREFIX ""
+      IMPORT_SUFFIX ".lib" COMPILE_FLAGS "-DGMSH_DLL -DGMSH_DLL_EXPORT")
+  endif()
+  target_link_libraries(shared ${LINK_LIBRARIES})
+  # don't define LC_RPATH in dylib for development, to not get endless warnings
+  # about code signing
+  if(APPLE AND NOT GMSH_RELEASE)
+    set_target_properties(shared PROPERTIES INSTALL_RPATH "")
+  endif()
+  if(MSVC AND ENABLE_MSVC_STATIC_RUNTIME)
+    message(STATUS "Note: By enabling ENABLE_MSVC_STATIC_RUNTIME, shared library "
+            "won't link. In MSVC change /MT to /MD in the shared project properties")
+  endif()
+endif()
+
+# binary targets
+if(HAVE_FLTK)
+  if(ENABLE_BUILD_DYNAMIC)
+    add_executable(gmsh WIN32 Common/Main.cpp)
+    target_link_libraries(gmsh shared)
+  else()
+    add_executable(gmsh WIN32 Common/Main.cpp ${GMSH_SRC})
+  endif()
+  # we could add this to create a minimal app bundle even without install
+  # if(APPLE AND NOT ENABLE_OS_SPECIFIC_INSTALL)
+  #  set_target_properties(gmsh PROPERTIES MACOSX_BUNDLE ON
+  #    MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_dev.plist)
+  # endif()
+else()
+  if(ENABLE_BUILD_DYNAMIC)
+    add_executable(gmsh Common/Main.cpp)
+    target_link_libraries(gmsh shared)
+  else()
+    add_executable(gmsh Common/Main.cpp ${GMSH_SRC})
+  endif()
+endif()
+target_link_libraries(gmsh ${LINK_LIBRARIES})
+
+# Windows specific linker options
+if(WIN32 AND NOT MSVC)
+  set(FLAGS "-Wl,--stack,16777216 -static -municode")
+  if(HAVE_FLTK)
+    set(FLAGS "${FLAGS} -mwindows")
+  else()
+    set(FLAGS "${FLAGS} -mconsole")
+  endif()
+  if(HAVE_64BIT_SIZE_T)
+    set(FLAGS "${FLAGS} \"${CMAKE_CURRENT_SOURCE_DIR}/Fltk/Win64Icon.res\"")
+  else()
+    set(FLAGS "${FLAGS} \"${CMAKE_CURRENT_SOURCE_DIR}/Fltk/Win32Icon.res\"")
+  endif()
+  set_target_properties(gmsh PROPERTIES LINK_FLAGS "${FLAGS}")
+  if(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
+    set_target_properties(shared PROPERTIES LINK_FLAGS -static)
+  endif()
+  # remove -Wl,-Bdynamic flags
+  set(CMAKE_EXE_LINK_DYNAMIC_C_FLAGS)
+  set(CMAKE_EXE_LINK_DYNAMIC_CXX_FLAGS)
+elseif(MSVC)
+  set_target_properties(gmsh PROPERTIES LINK_FLAGS "/STACK:16777216 /SAFESEH:NO")
+endif()
+
+# android target
+if(ENABLE_BUILD_ANDROID)
+  find_file(CMAKE_TOOLCHAIN_FILE "android.toolchain.cmake")
+  if(NOT CMAKE_TOOLCHAIN_FILE)
+    message(FATAL_ERROR "Cannot compile Gmsh for android without android-cmake")
+  endif()
+  add_definitions(-D_GLIBCXX_USE_C99_MATH=1)
+  set(CMAKE_BUILD_TYPE Release)
+  set(LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_CURRENT_BINARY_DIR})
+  set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/libs/)
+  add_definitions(-DBUILD_ANDROID)
+  add_definitions(-DPICOJSON_USE_LOCALE=0)
+  add_library(androidGmsh SHARED ${GMSH_SRC})
+  set_target_properties(androidGmsh PROPERTIES OUTPUT_NAME gmsh)
+  target_link_libraries(androidGmsh ${EXTERNAL_LIBRARIES} ${LAPACK_LIBRARIES})
+  add_custom_command(TARGET androidGmsh POST_BUILD COMMAND
+                     ${CMAKE_STRIP} ${LIBRARY_OUTPUT_PATH}/libgmsh.so)
+endif()
+
+# parser target
+find_program(BISON bison)
+find_program(FLEX flex)
+if(BISON AND FLEX)
+  add_custom_target(parser
+                    COMMAND ${BISON} -p gmsh_yy --output Gmsh.tab.cpp -d Gmsh.y
+                    COMMAND ${FLEX} -P gmsh_yy -o Gmsh.yy.cpp Gmsh.l
+                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Parser)
+endif()
+
+if(UNIX)
+  # cannot use cmake's file search functions here (they would only find files
+  # existing at configuration time)
+  add_custom_target(purge
+                    COMMAND rm -f `find . -name *~ -o -name *~~`
+                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+  add_custom_target(etags
+                    COMMAND etags `find . -name *.cpp -o -name *.h -o -name *.y`
+                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+endif()
+
+if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
+   CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+  execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion
+                  OUTPUT_VARIABLE CXX_COMPILER_VERSION
+                  OUTPUT_STRIP_TRAILING_WHITESPACE)
+else()
+  set(CXX_COMPILER_VERSION "Unknown")
+endif()
+
+set(WELCOME_FILE ${CMAKE_CURRENT_SOURCE_DIR}/doc/WELCOME.txt)
+set(SDK_FILE ${CMAKE_CURRENT_SOURCE_DIR}/doc/SDK.txt)
+set(LICENSE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt)
+set(CREDITS_FILE ${CMAKE_CURRENT_SOURCE_DIR}/CREDITS.txt)
+set(CHANGELOG_FILE ${CMAKE_CURRENT_SOURCE_DIR}/CHANGELOG.txt)
+file(GLOB TUTORIAL_GEO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/?*.*)
+file(GLOB TUTORIAL_CPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/c++/?*.*)
+file(GLOB TUTORIAL_C_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/c/?*.*)
+file(GLOB TUTORIAL_PY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/python/?*.*)
+file(GLOB TUTORIAL_JL_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/julia/?*.*)
+file(GLOB DEMOS ${CMAKE_CURRENT_SOURCE_DIR}/demos/*)
+foreach(SUBDIR ${DEMOS})
+  if(IS_DIRECTORY ${SUBDIR})
+    list(APPEND DEMOS_DIRS ${SUBDIR})
+  endif()
+endforeach()
+set(TEX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo)
+file(GLOB TEX_SRC ${TEX_DIR}/*.texi)
+set(TEX_OBJ ${TEX_DIR}/gmsh.aux ${TEX_DIR}/gmsh.cp ${TEX_DIR}/gmsh.cps
+    ${TEX_DIR}/gmsh.fn ${TEX_DIR}/gmsh.html ${TEX_DIR}/gmsh.info ${TEX_DIR}/gmsh.ky
+    ${TEX_DIR}/gmsh.log ${TEX_DIR}/gmsh.pdf ${TEX_DIR}/gmsh.pg ${TEX_DIR}/gmsh.toc
+    ${TEX_DIR}/gmsh.tp ${TEX_DIR}/gmsh.tps ${TEX_DIR}/gmsh.txt ${TEX_DIR}/gmsh.vr)
+
+macro(unix2dos VARNAME)
+  file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/unix2dos)
+  set(UNIX2DOS_FILES)
+  foreach(FILE ${${VARNAME}})
+    file(READ ${FILE} F0)
+    get_filename_component(N ${FILE} NAME)
+    if(CYGWIN)
+      string(REGEX REPLACE "\n" "\r\n" F1 "${F0}")
+      file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N} "${F1}")
+    else() # if not in Cygwin, cmake adds '\r's automatically
+      file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N} "${F0}")
+    endif()
+    list(APPEND UNIX2DOS_FILES ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N})
+  endforeach()
+  set(${VARNAME} ${UNIX2DOS_FILES})
+endmacro()
+
+if(WIN32)
+  if(ENABLE_OS_SPECIFIC_INSTALL)
+    set(GMSH_BIN .)
+    set(GMSH_LIB .)
+    set(GMSH_DOC .)
+    set(GMSH_MAN .)
+    set(GMSH_INC .)
+  else()
+    include(GNUInstallDirs)
+    set(GMSH_BIN ${CMAKE_INSTALL_BINDIR})
+    set(GMSH_LIB ${CMAKE_INSTALL_LIBDIR})
+    set(GMSH_DOC ${CMAKE_INSTALL_DOCDIR})
+    set(GMSH_MAN ${CMAKE_INSTALL_MANDIR}/man1)
+    set(GMSH_INC ${CMAKE_INSTALL_INCLUDEDIR})
+  endif()
+  if(CYGWIN)
+    unix2dos(GMSH_API)
+    if(ENABLE_PRIVATE_API)
+      unix2dos(GMSH_PRIVATE_API)
+    endif()
+    unix2dos(WELCOME_FILE)
+    unix2dos(SDK_FILE)
+    unix2dos(LICENSE_FILE)
+    unix2dos(CREDITS_FILE)
+    unix2dos(CHANGELOG_FILE)
+    unix2dos(TUTORIAL_GEO_FILES)
+    unix2dos(TUTORIAL_CPP_FILES)
+    unix2dos(TUTORIAL_C_FILES)
+    unix2dos(TUTORIAL_PY_FILES)
+    unix2dos(TUTORIAL_JL_FILES)
+    foreach(DIR ${DEMOS_DIRS})
+      file(GLOB DEMO_FILES ${DIR}/?*.*)
+      unix2dos(DEMO_FILES)
+    endforeach()
+  endif()
+elseif(APPLE AND ENABLE_OS_SPECIFIC_INSTALL)
+  # set these so that the files get installed nicely in the MacOSX
+  # .app bundle
+  set(GMSH_BIN ../MacOS)
+  set(GMSH_LIB ../MacOS)
+  set(GMSH_DOC ../../..)
+  set(GMSH_MAN ../../..)
+  set(GMSH_INC ../MacOS)
+else()
+  include(GNUInstallDirs)
+  set(GMSH_BIN ${CMAKE_INSTALL_BINDIR})
+  set(GMSH_LIB ${CMAKE_INSTALL_LIBDIR})
+  set(GMSH_DOC ${CMAKE_INSTALL_DOCDIR})
+  set(GMSH_MAN ${CMAKE_INSTALL_MANDIR}/man1)
+  set(GMSH_INC ${CMAKE_INSTALL_INCLUDEDIR})
+endif()
+
+# mark targets as optional so we can install them separately if needed
+# (e.g. "make lib" or "make shared" followed by "make install/fast")
+install(TARGETS gmsh DESTINATION ${GMSH_BIN} OPTIONAL)
+if(ENABLE_BUILD_LIB)
+  install(TARGETS lib DESTINATION ${GMSH_LIB} OPTIONAL)
+endif()
+if(ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
+  install(TARGETS shared DESTINATION ${GMSH_LIB} OPTIONAL)
+endif()
+
+if(ENABLE_ONELAB)
+  install(FILES ${ONELAB_PY} DESTINATION ${GMSH_BIN})
+endif()
+if(ENABLE_BUILD_LIB OR ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
+  install(FILES ${GMSH_API} DESTINATION ${GMSH_INC})
+  install(FILES ${GMSH_PY} DESTINATION ${GMSH_LIB})
+  install(FILES ${GMSH_JL} DESTINATION ${GMSH_LIB})
+  if(ENABLE_PRIVATE_API)
+    install(FILES ${GMSH_PRIVATE_API} DESTINATION ${GMSH_INC}/gmsh)
+  endif()
+endif()
+if(INSTALL_SDK_README)
+  configure_file(${SDK_FILE} ${CMAKE_CURRENT_BINARY_DIR}/README.txt)
+  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/README.txt DESTINATION .)
+endif()
+install(FILES ${WELCOME_FILE} DESTINATION ${GMSH_DOC} RENAME README.txt)
+install(FILES ${LICENSE_FILE} DESTINATION ${GMSH_DOC})
+install(FILES ${CREDITS_FILE} DESTINATION ${GMSH_DOC})
+install(FILES ${CHANGELOG_FILE} DESTINATION ${GMSH_DOC})
+install(FILES ${TUTORIAL_GEO_FILES} DESTINATION ${GMSH_DOC}/tutorial)
+install(FILES ${TUTORIAL_CPP_FILES} DESTINATION ${GMSH_DOC}/tutorial/c++)
+install(FILES ${TUTORIAL_C_FILES} DESTINATION ${GMSH_DOC}/tutorial/c)
+install(FILES ${TUTORIAL_PY_FILES} DESTINATION ${GMSH_DOC}/tutorial/python)
+install(FILES ${TUTORIAL_JL_FILES} DESTINATION ${GMSH_DOC}/tutorial/julia)
+foreach(DIR ${DEMOS_DIRS})
+  get_filename_component(DEMOS_DIR_NAME ${DIR} NAME)
+  file(GLOB DEMO_FILES ${DIR}/?*.*)
+  install(FILES ${DEMO_FILES} DESTINATION ${GMSH_DOC}/demos/${DEMOS_DIR_NAME})
+endforeach()
+if(UNIX AND NOT CYGWIN)
+  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/doc/gmsh.1 DESTINATION ${GMSH_MAN})
+endif()
+
+add_custom_target(get_headers
+  COMMAND ${CMAKE_COMMAND} -E make_directory Headers/gmsh
+  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+foreach(FILE ${GMSH_API})
+  add_custom_command(TARGET get_headers POST_BUILD COMMAND ${CMAKE_COMMAND}
+    -E copy_if_different ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/Headers/
+    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+endforeach()
+if(ENABLE_PRIVATE_API)
+  foreach(FILE ${GMSH_PRIVATE_API})
+    add_custom_command(TARGET get_headers POST_BUILD COMMAND ${CMAKE_COMMAND}
+      -E copy_if_different ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/Headers/gmsh/
+      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+  endforeach()
+endif()
+
+find_program(MAKEINFO makeinfo)
+if(MAKEINFO)
+  add_custom_command(OUTPUT ${TEX_DIR}/gmsh.info DEPENDS ${TEX_SRC}
+                     COMMAND ${MAKEINFO} --split-size 1000000
+                     ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
+  add_custom_target(info DEPENDS ${TEX_DIR}/gmsh.info)
+  add_custom_command(OUTPUT ${TEX_DIR}/gmsh.txt DEPENDS ${TEX_SRC}
+                     COMMAND ${MAKEINFO} --plaintext -o gmsh.txt
+                     ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
+  add_custom_target(txt DEPENDS ${TEX_DIR}/gmsh.txt)
+  add_custom_command(OUTPUT ${TEX_DIR}/gmsh.html DEPENDS ${TEX_SRC}
+    COMMAND ${MAKEINFO} --html --css-ref=/gmsh.css
+    --no-split --set-customization-variable
+    EXTRA_HEAD='<meta name="viewport" content="width=device-width,initial-scale=1.0">'
+    ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
+  add_custom_target(html DEPENDS ${TEX_DIR}/gmsh.html)
+  install(FILES ${TEX_DIR}/gmsh.html DESTINATION ${GMSH_DOC} OPTIONAL)
+else()
+  add_custom_target(html COMMAND ${CMAKE_COMMAND} -E touch ${TEX_DIR}/gmsh.html)
+endif()
+
+find_program(TEXI2PDF texi2pdf)
+if(TEXI2PDF)
+  add_custom_command(OUTPUT ${TEX_DIR}/gmsh.pdf DEPENDS ${TEX_SRC}
+                     COMMAND ${TEXI2PDF} ARGS gmsh.texi
+                     WORKING_DIRECTORY ${TEX_DIR})
+  add_custom_target(pdf DEPENDS ${TEX_DIR}/gmsh.pdf)
+  install(FILES ${TEX_DIR}/gmsh.pdf DESTINATION ${GMSH_DOC} OPTIONAL)
+endif()
+
+execute_process(COMMAND ${CMAKE_COMMAND} -E echo
+  "@c This file was generated by cmake: do not edit manually!\n${OPT_TEXI}"
+  OUTPUT_FILE cmake_options.texi)
+
+if(MAKEINFO AND TEXI2PDF)
+  add_custom_target(doc COMMAND ${CMAKE_COMMAND} -E tar zcf
+                    ${CMAKE_CURRENT_BINARY_DIR}/gmsh-${GMSH_VERSION}-doc.tgz
+                    CREDITS.txt LICENSE.txt CHANGELOG.txt
+                    doc/gmsh.1 doc/texinfo/gmsh.html doc/texinfo/gmsh.info
+                    doc/texinfo/gmsh.pdf doc/texinfo/gmsh.txt
+                    COMMAND ${CMAKE_COMMAND} -E remove ${TEX_OBJ}
+                    DEPENDS ${TEX_DIR}/gmsh.info ${TEX_DIR}/gmsh.txt
+                    ${TEX_DIR}/gmsh.html ${TEX_DIR}/gmsh.pdf
+                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+endif()
+
+if(MAKEINFO OR TEXI2PDF)
+  add_custom_target(clean_doc COMMAND ${CMAKE_COMMAND} -E remove ${TEX_OBJ})
+endif()
+
+if(APPLE AND ENABLE_BUILD_LIB)
+  file(READ ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_framework.plist F0)
+  string(REPLACE GMSH_VERSION "${GMSH_VERSION}" F1 "${F0}")
+  file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/Info_framework.plist "${F1}")
+  set(LIBNAME $<TARGET_FILE:lib>)
+  add_custom_target(framework DEPENDS lib
+    COMMAND ${CMAKE_COMMAND} -E remove_directory gmsh.framework
+    COMMAND ${CMAKE_COMMAND} -E make_directory gmsh.framework/Headers
+    COMMAND ${CMAKE_COMMAND} -E make_directory gmsh.framework/Resources
+    COMMAND ${CMAKE_COMMAND} -E copy ${LIBNAME} gmsh.framework/gmsh
+    COMMAND ${CMAKE_COMMAND} -E copy Info_framework.plist
+                                     gmsh.framework/Resources/Info.plist
+    COMMAND ${CMAKE_COMMAND} -E create_symlink . gmsh.framework/Headers/gmsh
+    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+  foreach(FILE ${GMSH_API})
+    add_custom_command(TARGET framework POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy
+        ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/gmsh.framework/Headers/
+        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+  endforeach()
+  if(ENABLE_PRIVATE_API)
+    foreach(FILE ${GMSH_PRIVATE_API})
+      add_custom_command(TARGET framework POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy
+          ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/gmsh.framework/Headers/
+          WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
+    endforeach()
+  endif()
+endif()
+
+set(CPACK_PACKAGE_VENDOR "Christophe Geuzaine and Jean-Francois Remacle")
+set(CPACK_PACKAGE_VERSION_MAJOR ${GMSH_MAJOR_VERSION})
+set(CPACK_PACKAGE_VERSION_MINOR ${GMSH_MINOR_VERSION})
+set(CPACK_PACKAGE_VERSION_PATCH ${GMSH_PATCH_VERSION})
+set(CPACK_PACKAGE_DESCRIPTION_FILE ${WELCOME_FILE})
+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
+    "3D finite element mesh generator with built-in CAD engine and post-processor")
+if(GMSH_EXTRA_VERSION MATCHES "-git.*") # so that we'll overwrite the archives
+  set(CPACK_PACKAGE_FILE_NAME gmsh${GMSH_EXTRA_VERSION_ORIG}-git-${GMSH_OS})
+  set(CPACK_SOURCE_PACKAGE_FILE_NAME gmsh${GMSH_EXTRA_VERSION_ORIG}-git-source)
+else()
+  set(CPACK_PACKAGE_FILE_NAME gmsh-${GMSH_VERSION}-${GMSH_OS})
+  set(CPACK_SOURCE_PACKAGE_FILE_NAME gmsh-${GMSH_VERSION}-source)
+endif()
+set(CPACK_PACKAGE_INSTALL_DIRECTORY "gmsh")
+set(CPACK_RESOURCE_FILE_LICENSE ${LICENSE_FILE})
+set(CPACK_RESOURCE_FILE_README ${WELCOME_FILE})
+set(CPACK_RESOURCE_FILE_WELCOME ${WELCOME_FILE})
+set(CPACK_PACKAGE_EXECUTABLE "gmsh")
+if(ENABLE_PACKAGE_STRIP)
+  set(CPACK_STRIP_FILES TRUE)
+else()
+  set(CPACK_STRIP_FILES FALSE)
+endif()
+set(CPACK_SOURCE_GENERATOR TGZ)
+set(CPACK_SOURCE_IGNORE_FILES "${CMAKE_CURRENT_BINARY_DIR}" "/CVS/" "/.svn" "/.git"
+    "~$" "DS_Store$" "GmshConfig.h$" "GmshVersion.h$" "/benchmarks/" "/tmp/"
+    "/bin/" "/lib/" "/nightly/" "GPATH" "GRTAGS" "GSYMS" "GTAGS" "/HTML/"
+    "/contrib/3M/" "/contrib/Parasolid/")
+
+if(UNIX)
+  # make sure we remove previous installs before doing the next one (on Mac for
+  # example "make package; make package_source" would lead to huge file lists
+  # getting generated due to the 'Applications' symlink in the bundle)
+  set(CPACK_INSTALL_COMMANDS "rm -rf ${CMAKE_CURRENT_BINARY_DIR}/_CPack_Packages")
+endif()
+
+if(APPLE AND ENABLE_OS_SPECIFIC_INSTALL)
+  set(CPACK_GENERATOR Bundle)
+  set(CPACK_BUNDLE_NAME Gmsh)
+  file(READ ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_app.plist F0)
+  string(REPLACE GMSH_VERSION "${GMSH_VERSION}" F1 "${F0}")
+  file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/Info.plist "${F1}")
+  set(CPACK_BUNDLE_PLIST ${CMAKE_CURRENT_BINARY_DIR}/Info.plist)
+  set(CPACK_BUNDLE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIcons.icns)
+  if(PACKAGER STREQUAL "geuzaine - removed: we sign on a separate machine")
+    # codesigning requires CMake >= 3.2
+    set(CPACK_BUNDLE_APPLE_CERT_APP "Developer ID Application: Christophe Geuzaine")
+  endif()
+  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsGeo.icns DESTINATION .
+          RENAME GmshGeo.icns)
+  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsMsh.icns DESTINATION .
+          RENAME GmshMsh.icns)
+  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsSol.icns DESTINATION .
+          RENAME GmshSol.icns)
+  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsPos.icns DESTINATION .
+          RENAME GmshPos.icns)
+  set(CPACK_PACKAGE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIcons.icns)
+elseif(WIN32)
+  set(CPACK_GENERATOR ZIP)
+else()
+  set(CPACK_GENERATOR TGZ)
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/utils/wrappers/gmshpy AND
+   ENABLE_PRIVATE_API AND ENABLE_WRAP_PYTHON AND HAVE_PYTHON)
+  add_subdirectory(utils/wrappers/gmshpy)
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/utils/wrappers/java AND
+   ENABLE_PRIVATE_API AND ENABLE_WRAP_JAVA)
+  add_subdirectory(utils/wrappers/java)
+endif()
+
+include(CPack)
+
+macro(filter_tests IN OUT)
+  unset(${OUT})
+  foreach(FILE ${IN})
+    unset(BAD1)
+    unset(BAD2)
+    unset(BAD3)
+    # OS-specific
+    if(${GMSH_OS} MATCHES "Linux32")
+      # OCC STL generation crashes on our Linux32 docker
+      string(REGEX MATCH "t18" BAD1 ${FILE})
+    endif()
+    # OpenCASCADE
+    if(NOT HAVE_OCC AND NOT BAD1 AND NOT BAD2 AND NOT BAD3)
+      file(STRINGS ${FILE} BAD1 REGEX "^SetFactory.*OpenCASCADE.*")
+      file(STRINGS ${FILE} BAD2 REGEX ".*occ\\.synchronize.*")
+      file(STRINGS ${FILE} BAD3 REGEX ".*occ::synchronize.*")
+    endif()
+    # Metis
+    if(NOT HAVE_METIS AND NOT BAD1 AND NOT BAD2 AND NOT BAD3)
+      file(STRINGS ${FILE} BAD1 REGEX ".*PartitionMesh.*")
+      file(STRINGS ${FILE} BAD2 REGEX ".*mesh\\.partition.*")
+      file(STRINGS ${FILE} BAD3 REGEX ".*mesh::partition.*")
+    endif()
+    if(BAD1 OR BAD2 OR BAD3)
+      message("Skipping test " ${FILE})
+    else()
+      list(APPEND ${OUT} ${FILE})
+    endif()
+  endforeach()
+endmacro()
+
+if(NOT DISABLE_GMSH_TESTS)
+  # disabling tests is useful when including this CMakeLists in an external project
+  include(CTest)
+  file(GLOB_RECURSE ALLFILES
+       tutorial/*.geo demos/*.geo benchmarks/?d/*.geo benchmarks/extrude/*.geo
+       benchmarks/occ/*.geo)
+  filter_tests("${ALLFILES}" TESTFILES)
+  foreach(TESTFILE ${TESTFILES})
+    # use relative path for Cygwin/MinGW (the pure win exe built with the MinGW
+    # compilers does not understand a full Cygwin-style path)
+    FILE(RELATIVE_PATH TEST ${CMAKE_CURRENT_BINARY_DIR} ${TESTFILE})
+    add_test(${TEST} ./gmsh ${TEST} -3 -nopopup -o ./tmp.msh)
+  endforeach()
+  # test c++ api tutorials with dynamic builds (except on 32 bit windows for
+  # now: our win32 setup does not currently handle exceptions)
+  if(ENABLE_BUILD_DYNAMIC AND NOT ${GMSH_OS} MATCHES "Windows32")
+    file(GLOB_RECURSE ALLFILES tutorial/c++/*.cpp)
+    filter_tests("${ALLFILES}" TESTFILES)
+    foreach(TESTFILE ${TESTFILES})
+      get_filename_component(TEST ${TESTFILE} NAME_WE)
+      add_executable(${TEST} WIN32 ${TESTFILE})
+      target_link_libraries(${TEST} shared)
+      if(WIN32 AND NOT MSVC)
+        set(FLAGS "-static")
+        if(HAVE_FLTK)
+          set(FLAGS "${FLAGS} -mwindows")
+        else()
+          set(FLAGS "${FLAGS} -mconsole")
+        endif()
+        set_target_properties(${TEST} PROPERTIES LINK_FLAGS "${FLAGS}")
+      endif()
+      add_test(${TEST}_cpp ${TEST} -nopopup)
+    endforeach()
+  endif()
+  # enable this once we have worked out the path issues on the build machines
+  if(0 AND ENABLE_BUILD_DYNAMIC)
+    find_package(PythonInterp)
+    if(PYTHONINTERP_FOUND)
+      file(GLOB_RECURSE ALLFILES tutorial/python/*.py demos/api/*.py)
+      filter_tests("${ALLFILES}" TESTFILES)
+      foreach(TESTFILE ${TESTFILES})
+        get_filename_component(TEST ${TESTFILE} NAME_WE)
+        add_test(NAME ${TEST}_py COMMAND ${PYTHON_EXECUTABLE} ${TESTFILE} -nopopup)
+        set_property(TEST ${TEST}_py APPEND PROPERTY ENVIRONMENT
+                     "PYTHONPATH=${CMAKE_SOURCE_DIR}/api")
+        set_property(TEST ${TEST}_py APPEND PROPERTY ENVIRONMENT
+                     "LD_LIBRARY_PATH=${CMAKE_CURRENT_BINARY_DIR}")
+        endforeach()
+    endif()
+  endif()
+endif()
+
+message(STATUS "")
+message(STATUS "Gmsh ${GMSH_VERSION} has been configured for ${GMSH_OS}")
+message(STATUS "")
+message(STATUS " * Build options:" ${GMSH_CONFIG_OPTIONS})
+message(STATUS " * Build type: " ${CMAKE_BUILD_TYPE})
+message(STATUS " * C compiler: " ${CMAKE_C_COMPILER})
+message(STATUS " * C++ compiler: " ${CMAKE_CXX_COMPILER})
+message(STATUS " * Install prefix: " ${CMAKE_INSTALL_PREFIX})
+message(STATUS "")
+
+mark_as_advanced(ANN_INC ANN_LIB CAIRO_LIB CAIRO_INC CGNS_INC GMM_INC
+                 GMP_INC GMP_LIB MMG_INC MMG_LIB HDF5_LIB
+                 MED_LIB OCC_INC SZ_LIB
+                 PETSC_LIBS SLEPC_INC SLEPC_INC2 SLEPC_LIB
+                 BISON FLEX MAKEINFO TEXI2PDF FLTK_CONFIG_SCRIPT
+                 GMSH_EXTERNAL_INCLUDE_DIRS GMSH_EXTERNAL_LIBRARIES)
Index: /issm/trunk-jpl/externalpackages/gmsh/install-4-linux-python-static.sh
===================================================================
--- /issm/trunk-jpl/externalpackages/gmsh/install-4-linux-python-static.sh	(revision 25790)
+++ /issm/trunk-jpl/externalpackages/gmsh/install-4-linux-python-static.sh	(revision 25791)
@@ -34,5 +34,5 @@
 
 # Copy customized source and config files to 'src' directory
-cp configs/4/linux/static/CMakeLists.txt src
+cp configs/${VER}/static/CMakeLists.txt src
 
 # Configure
@@ -56,5 +56,4 @@
 	-DENABLE_MPI=1 \
 	-DENABLE_OCC=0 \
-	-DENABLE_TOUCHBAR=0 \
 	-DMETIS_ROOT="${PETSC_ROOT}"
 
Index: /issm/trunk-jpl/externalpackages/gmsh/install-4-linux-static.sh
===================================================================
--- /issm/trunk-jpl/externalpackages/gmsh/install-4-linux-static.sh	(revision 25790)
+++ /issm/trunk-jpl/externalpackages/gmsh/install-4-linux-static.sh	(revision 25791)
@@ -32,5 +32,5 @@
 
 # Copy customized source and config files to 'src' directory
-cp configs/4/mac/static/CMakeLists.txt src
+cp configs/${VER}/static/CMakeLists.txt src
 
 # Configure
@@ -42,6 +42,4 @@
 # - Option -DENABLE_OCC=0 is used because we do not need CAD kernel and are not 
 #	importing STEP/IGES files.
-# - Option -DENABLE_TOUCHBAR=0 is used because we do not have GUI, therefore we 
-#	do not need to support Apple Touch bar.
 #
 cd install
@@ -54,5 +52,4 @@
 	-DENABLE_MPI=1 \
 	-DENABLE_OCC=0 \
-	-DENABLE_TOUCHBAR=0 \
 	-DMETIS_ROOT="${PETSC_ROOT}"
 
Index: /issm/trunk-jpl/jenkins/ross-debian_linux-binaries-matlab
===================================================================
--- /issm/trunk-jpl/jenkins/ross-debian_linux-binaries-matlab	(revision 25791)
+++ /issm/trunk-jpl/jenkins/ross-debian_linux-binaries-matlab	(revision 25791)
@@ -0,0 +1,88 @@
+#--------------------#
+# ISSM Configuration #
+#--------------------#
+
+MATLAB_PATH="/usr/local/MATLAB/R2019b"
+
+# NOTE:
+# - We can disable dependency tracking in the Autotools because the binaries
+#	should always be a one-time build.
+# - libgfortran will not be available in $ISSM_DIR/lib at compile time: it is
+#	copied by packaging script.
+#
+ISSM_CONFIG='\
+	--prefix=${ISSM_DIR} \
+	--enable-standalone-executables \
+	--enable-standalone-modules \
+	--enable-standalone-libraries \
+	--disable-dependency-tracking \
+	--with-pic \
+	--with-matlab-dir=${MATLAB_PATH} \
+	--with-fortran-lib="-L${ISSM_DIR}/lib -lgfortran" \
+	--with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
+	--with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
+	--with-blas-lapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-metis-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-scalapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-mumps-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-hdf5-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-petsc-dir=${ISSM_DIR}/externalpackages/petsc/install \
+	--with-gsl-dir=${ISSM_DIR}/externalpackages/gsl/install \
+	--with-boost-dir=${ISSM_DIR}/externalpackages/boost/install \
+	--with-dakota-dir=${ISSM_DIR}/externalpackages/dakota/install \
+	--with-triangle-dir=${ISSM_DIR}/externalpackages/triangle/install \
+	--with-chaco-dir=${ISSM_DIR}/externalpackages/chaco/install \
+	--with-m1qn3-dir=${ISSM_DIR}/externalpackages/m1qn3/install \
+	--with-semic-dir=${ISSM_DIR}/externalpackages/semic/install \
+'
+#-------------------#
+# External Packages #
+#-------------------#
+
+EXTERNALPACKAGES="
+	autotools	install-debian-linux.sh
+	cmake		install.sh
+	petsc		install-3.12-linux-static.sh
+	gsl			install-static.sh
+	boost		install-1.7-linux-static.sh
+	dakota		install-6.2-linux-static.sh
+	curl		install-7-static.sh
+	netcdf		install-4.7-parallel-static.sh
+	proj		install-6.2-static.sh
+	gdal		install-3-netcdf-static.sh
+	gshhg		install.sh
+	gmt			install-6-linux-static.sh
+	gmsh		install-4-linux-static.sh
+	triangle	install-linux-static.sh
+	chaco		install.sh
+	m1qn3		install.sh
+	semic		install.sh
+	shell2junit	install.sh
+"
+
+#---------#
+# Testing #
+#---------#
+
+# Test suites
+MATLAB_TEST=0
+PYTHON_TEST=0
+JAVASCRIPT_TEST=0
+EXAMPLES_TEST=0
+
+# Number of CPUs used in ISSM compilation
+#
+# NOTE: One is usually safer as some packages are very sensitive to parallel
+# 		compilation.
+#
+NUMCPUS_INSTALL=8
+
+# Number of CPUs used in the nightly runs
+NUMCPUS_RUN=1
+
+# Nightly run options
+#
+# See documentation in test/NightlyRun/runme.* for more information.
+#
+MATLAB_NROPTIONS=""
+PYTHON_NROPTIONS=""
Index: /issm/trunk-jpl/packagers/linux/package-issm-linux-binaries-matlab.sh
===================================================================
--- /issm/trunk-jpl/packagers/linux/package-issm-linux-binaries-matlab.sh	(revision 25791)
+++ /issm/trunk-jpl/packagers/linux/package-issm-linux-binaries-matlab.sh	(revision 25791)
@@ -0,0 +1,178 @@
+#!/bin/bash
+
+################################################################################
+# To be used after running,
+#
+#	${ISSM_DIR}/jenkins/jenkins.sh ${ISSM_DIR}/jenkins/ross-debian_linux-binaries-matlab
+#
+# in the context of a Jenkins project.
+#
+# When no runtime errors occur, performs the following:
+# - Checks resulting executables and libraries against test suite.
+# - Packages and compresses executables and libraries.
+# - Transmits it to ISSM Web site for distribution.
+################################################################################
+
+# Expand aliases within the context of this script
+shopt -s expand_aliases
+
+## Override certain aliases
+#
+alias grep=$(which grep)
+
+## Constants
+#
+LIBGFORTRAN="/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0" # Important that this is the library itself
+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
+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
+MATLAB_PATH="/usr/local/MATLAB/R2019b"
+PKG="ISSM-Linux-MATLAB" # Name of directory to copy distributable files to
+
+COMPRESSED_PKG="${PKG}.tar.gz"
+
+## Environment
+#
+export PATH="${ISSM_DIR}/bin:$(getconf PATH)" # Ensure that we pick up binaries from 'bin' directory rather than 'externalpackages'
+
+## Parse options
+#
+if [ $# -gt 1 ]; then
+	echo "Can use only one option at a time"
+	exit 1
+fi
+
+skip_tests=0
+transfer_only=0
+while [ $# -gt 0 ]; do
+    case $1 in
+        -s|--skiptests) skip_tests=1; shift ;;
+        -t|--transferonly) transfer_only=1; shift ;;
+        *) echo "Unknown parameter passed: $1"; exit 1 ;;
+    esac
+    shift
+done
+
+if [ ${transfer_only} -eq 0 ]; then
+	# Check if MATLAB exists
+	if ! [ -d ${MATLAB_PATH} ]; then
+		echo "${MATLAB_PATH} does not point to a MATLAB installation! Please modify MATLAB_PATH variable in $(basename $0) and try again."
+		exit 1
+	fi
+
+	# Clean up from previous packaging
+	echo "Cleaning up existing assets"
+	cd ${ISSM_DIR}
+	rm -rf ${PKG} ${COMPRESSED_PKG}
+	mkdir ${PKG}
+
+	# Add/modify required binaries and libraries
+	cd ${ISSM_DIR}/bin
+
+	echo "Modify generic"
+	cat generic_static.m | sed -e "s/generic_static/generic/g" > generic.m
+
+	echo "Moving MPICH binaries to bin/"
+	if [ -f ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec ]; then
+		cp ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec .
+		cp ${ISSM_DIR}/externalpackages/petsc/install/bin/hydra_pmi_proxy .
+	elif [ -f ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec ]; then
+		cp ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec .
+		cp ${ISSM_DIR}/externalpackages/mpich/install/bin/hydra_pmi_proxy .
+	else
+		echo "MPICH not found"
+		exit 1
+	fi
+
+	echo "Moving GDAL binaries to bin/"
+	if [ -f ${ISSM_DIR}/externalpackages/gdal/install/bin/gdal-config ]; then
+		cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdalsrsinfo .
+		cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdaltransform .
+	else
+		echo "GDAL not found"
+		exit 1
+	fi
+
+	echo "Moving GMT binaries to bin/"
+	if [ -f ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt-config ]; then
+		cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt .
+		cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmtselect .
+	else
+		echo "GMT not found"
+		exit 1
+	fi
+
+	echo "Moving Gmsh binaries to bin/"
+	if [ -f ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh ]; then
+		cp ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh .
+	else
+		echo "Gmsh not found"
+		exit 1
+	fi
+
+	echo "Moving libgfortran to lib/"
+	cp ${LIBGFORTRAN} ${LIBGFORTRAN_DIST} 2> /dev/null
+
+
+	# Run tests
+	if [ ${skip_tests} -eq 0 ]; then
+		echo "Running tests"
+		cd ${ISSM_DIR}/test/NightlyRun
+		rm matlab.log 2> /dev/null
+
+		# Run tests, redirecting output to logfile and suppressing output to console
+		${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
+
+		# Check that MATLAB did not exit in error
+		matlabExitCode=`echo $?`
+		matlabExitedInError=`grep -E "Activation cannot proceed|license|Error" matlab.log | wc -l`
+
+		if [[ ${matlabExitCode} -ne 0 || ${matlabExitedInError} -ne 0 ]]; then
+			echo "----------MATLAB exited in error!----------"
+			cat matlab.log
+			echo "-----------End of matlab.log-----------"
+
+			# Clean up execution directory
+			rm -rf ${ISSM_DIR}/execution/*
+
+			exit 1
+		fi
+
+		# Check that all tests passed
+		numTestsFailed=`cat matlab.log | grep -c -e "FAILED|ERROR"`
+
+		if [[ ${numTestsFailed} -ne 0 ]]; then
+			echo "One or more tests FAILED"
+			exit 1
+		else
+			echo "All tests PASSED"
+		fi
+	else
+		echo "Skipping tests"
+	fi
+
+	# Create package
+	cd ${ISSM_DIR}
+	svn cleanup --remove-ignored --remove-unversioned test # Clean up test directory (before copying to package)
+	echo "Copying assets to package: ${PKG}"
+	cp -rf bin examples lib scripts test ${PKG}/
+	mkdir ${PKG}/execution
+	echo "Cleaning up unneeded/unwanted files"
+	rm -f ${PKG}/bin/generic_static.* # Remove static versions of generic cluster classes
+	rm -f ${PKG}/lib/*.a # Remove static libraries from package
+	rm -f ${PKG}/lib/*.la # Remove libtool libraries from package
+	rm -rf ${PKG}/test/SandBox # Remove testing sandbox from package
+
+	# Compress package
+	echo "Compressing package"
+	tar -czf ${COMPRESSED_PKG} ${PKG}
+	ls -lah ${ISSM_DIR}/${COMPRESSED_PKG}
+fi
+
+# Transfer package to ISSM Web site
+echo "Transferring package to ISSM Web site"
+scp -i ~/.ssh/debian_linux-vm_to_ross ${COMPRESSED_PKG} jenkins@ross.ics.uci.edu:/var/www/html/${COMPRESSED_PKG}
+
+if [ $? -ne 0 ]; then
+	echo "Transfer failed! Verify connection then build this project again."
+	exit 1
+fi
