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

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

CHG: added 24684-25833

File size: 179.4 KB
  • ../trunk-jpl/externalpackages/gmsh/install-4-linux-python-static.sh

     
    3333rm -rf gmsh-${VER}-source
    3434
    3535# Copy customized source and config files to 'src' directory
    36 cp configs/4/linux/static/CMakeLists.txt src
     36cp configs/${VER}/static/CMakeLists.txt src
    3737
    3838# Configure
    3939#
     
    5555        -DENABLE_MPEG_ENCODE=0 \
    5656        -DENABLE_MPI=1 \
    5757        -DENABLE_OCC=0 \
    58         -DENABLE_TOUCHBAR=0 \
    5958        -DMETIS_ROOT="${PETSC_ROOT}"
    6059
    6160# Compile and install
  • ../trunk-jpl/externalpackages/gmsh/install-4-linux-static.sh

     
    3131rm -rf gmsh-${VER}-source
    3232
    3333# Copy customized source and config files to 'src' directory
    34 cp configs/4/mac/static/CMakeLists.txt src
     34cp configs/${VER}/static/CMakeLists.txt src
    3535
    3636# Configure
    3737#
     
    4141#       movies.
    4242# - Option -DENABLE_OCC=0 is used because we do not need CAD kernel and are not
    4343#       importing STEP/IGES files.
    44 # - Option -DENABLE_TOUCHBAR=0 is used because we do not have GUI, therefore we
    45 #       do not need to support Apple Touch bar.
    4644#
    4745cd install
    4846cmake ../src \
     
    5351        -DENABLE_MPEG_ENCODE=0 \
    5452        -DENABLE_MPI=1 \
    5553        -DENABLE_OCC=0 \
    56         -DENABLE_TOUCHBAR=0 \
    5754        -DMETIS_ROOT="${PETSC_ROOT}"
    5855
    5956# Compile and install
  • ../trunk-jpl/externalpackages/gmsh/configs/4.7.0/static/CMakeLists.txt

     
     1# Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle
     2#
     3# See the LICENSE.txt file for license information. Please report all
     4# issues on https://gitlab.onelab.info/gmsh/gmsh/issues.
     5
     6cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
     7
     8# if CMAKE_BUILD_TYPE is specified use it; otherwise set the default
     9# build type to "RelWithDebInfo" ("-O2 -g" with gcc) prior to calling
     10# project()
     11if(DEFINED CMAKE_BUILD_TYPE)
     12  set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Choose build type")
     13else()
     14  set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose build type")
     15endif()
     16
     17project(gmsh CXX C)
     18
     19# require C++11 and request C99
     20set(CMAKE_CXX_STANDARD 11)
     21set(CMAKE_CXX_STANDARD_REQUIRED ON)
     22set(CMAKE_C_STANDARD 99)
     23
     24# this variable controls the default value of the options which are normally set
     25# to ON (useful if you want to configure a minimal version of Gmsh: e.g. "cmake
     26# -DDEFAULT=0 -DENABLE_POST=1 -DENABLE_PARSER=1")
     27set(DEFAULT ON CACHE INTERNAL "Default value for enabled-by-default options")
     28
     29macro(opt OPTION HELP VALUE)
     30  option(ENABLE_${OPTION} ${HELP} ${VALUE})
     31  set(OPT_TEXI "${OPT_TEXI}\n@item ENABLE_${OPTION}\n${HELP} (default: ${VALUE})")
     32endmacro()
     33
     34opt(3M "Enable proprietary 3M extension" OFF)
     35opt(ALGLIB "Enable ALGLIB (used by some mesh optimizers)" ${DEFAULT})
     36opt(ANN "Enable ANN (used for fast point search in mesh/post)" ${DEFAULT})
     37opt(BAMG "Enable Bamg 2D anisotropic mesh generator" ${DEFAULT})
     38opt(BLAS_LAPACK "Enable BLAS/Lapack for linear algebra (if Eigen if disabled)" OFF)
     39opt(BLOSSOM "Enable Blossom algorithm (needed for full quad meshing)" ${DEFAULT})
     40opt(BUILD_LIB "Enable 'lib' target for building static Gmsh library" OFF)
     41opt(BUILD_SHARED "Enable 'shared' target for building shared Gmsh library" OFF)
     42opt(BUILD_DYNAMIC "Enable dynamic Gmsh executable (linked with shared library)" OFF)
     43opt(BUILD_ANDROID "Enable Android NDK library target (experimental)" OFF)
     44opt(BUILD_IOS "Enable iOS library target (experimental)" OFF)
     45opt(CGNS "Enable CGNS import/export (experimental)" ${DEFAULT})
     46opt(CGNS_CPEX0045 "Enable high-order CGNS import/export following CPEX0045 (experimental)" OFF)
     47opt(CAIRO "Enable Cairo to render fonts (experimental)" ${DEFAULT})
     48opt(PROFILE "Enable profiling compiler flags" OFF)
     49opt(DINTEGRATION "Enable discrete integration (needed for levelsets)" ${DEFAULT})
     50opt(DOMHEX "Enable experimental DOMHEX code" ${DEFAULT})
     51opt(EIGEN "Enable Eigen for linear algebra (instead of Blas/Lapack)" ON)
     52opt(FLTK "Enable FLTK graphical user interface (requires mesh/post)" ${DEFAULT})
     53opt(GETDP "Enable GetDP solver (linked as a library, experimental)" ${DEFAULT})
     54opt(GMM "Enable GMM linear solvers (simple alternative to PETSc)" ${DEFAULT})
     55opt(GMP "Enable GMP for Kbipack (advanced)" ON)
     56opt(GRAPHICS "Enable building graphics lib even without GUI (advanced)" OFF)
     57opt(HXT "Enable HXT library (for reparametrization and meshing)" ${DEFAULT})
     58opt(KBIPACK "Enable Kbipack (neeeded by homology solver)" ${DEFAULT})
     59opt(MATHEX "Enable Mathex expression parser (used by plugins and options)" ${DEFAULT})
     60opt(MED "Enable MED mesh and post file formats" ${DEFAULT})
     61opt(MESH "Enable mesh module (required by GUI)" ${DEFAULT})
     62opt(METIS "Enable Metis mesh partitioner" ${DEFAULT})
     63opt(MMG "Enable Mmg mesh adaptation interface" ${DEFAULT})
     64opt(MPEG_ENCODE "Enable built-in MPEG movie encoder" ${DEFAULT})
     65opt(MPI "Enable MPI (experimental, not used for meshing)" OFF)
     66opt(MSVC_STATIC_RUNTIME "Enable static Visual C++ runtime" OFF)
     67opt(MUMPS "Enable MUMPS sparse direct linear solver" OFF)
     68opt(NETGEN "Enable Netgen 3D frontal mesh generator" ${DEFAULT})
     69opt(NUMPY "Enable fullMatrix and numpy array conversion for private API" OFF)
     70opt(PETSC4PY "Enable petsc4py wrappers for petsc matrices for private API" OFF)
     71opt(OCC "Enable OpenCASCADE CAD kernel" ${DEFAULT})
     72opt(OCC_CAF "Enable OpenCASCADE CAF module (for STEP/IGES attributes)" ${DEFAULT})
     73opt(OCC_STATIC "Link OpenCASCADE static instead of dynamic libraries (requires ENABLE_OCC)" OFF)
     74opt(OCC_TBB "Add TBB libraries in list of OCC libraries" OFF)
     75opt(ONELAB "Enable ONELAB solver interface" ${DEFAULT})
     76opt(ONELAB_METAMODEL "Enable ONELAB metamodels (experimental)" ${DEFAULT})
     77opt(OPENACC "Enable OpenACC" OFF)
     78opt(OPENMP "Enable OpenMP" OFF)
     79opt(OPTHOM "Enable high-order mesh optimization tools" ${DEFAULT})
     80opt(OS_SPECIFIC_INSTALL "Enable OS-specific (e.g. app bundle) installation" OFF)
     81opt(OSMESA "Enable OSMesa for offscreen rendering (experimental)" OFF)
     82opt(P4EST "Enable p4est for enabling automatic mesh size field (experimental)" OFF)
     83opt(PACKAGE_STRIP "Strip symbols in install packages to reduce install size" ON)
     84opt(PARSER "Enable GEO file parser (required for .geo/.pos scripts)" ${DEFAULT})
     85opt(PETSC "Enable PETSc linear solvers (required for SLEPc)" OFF)
     86opt(PLUGINS "Enable post-processing plugins" ${DEFAULT})
     87opt(POST "Enable post-processing module (required by GUI)" ${DEFAULT})
     88opt(POPPLER "Enable Poppler for displaying PDF documents (experimental)" OFF)
     89opt(PRIVATE_API "Enable private API" OFF)
     90opt(PRO "Enable PRO extensions" ${DEFAULT})
     91opt(QUADTRI "Enable QuadTri structured meshing extensions" ${DEFAULT})
     92opt(REVOROPT "Enable Revoropt (used for CVT remeshing)" OFF)
     93opt(RPATH "Use RPATH in dynamically linked targets" ON)
     94opt(SLEPC "Enable SLEPc eigensolvers" OFF)
     95opt(SOLVER "Enable built-in finite element solvers (required for reparametrization)" ${DEFAULT})
     96opt(SYSTEM_CONTRIB "Use system versions of contrib libraries, when possible" OFF)
     97opt(TCMALLOC "Enable libtcmalloc (fast malloc that does not release memory)" OFF)
     98opt(TOUCHBAR "Enable Apple Touch bar" ${DEFAULT})
     99opt(VISUDEV "Enable additional visualization capabilities for development purposes" OFF)
     100opt(VOROPP "Enable voro++ (for hex meshing, experimental)" ${DEFAULT})
     101opt(WRAP_JAVA "Generate SWIG Java wrappers for private API" OFF)
     102opt(WRAP_PYTHON "Generate SWIG Python wrappers for private API (not used by public API)" OFF)
     103opt(ZIPPER "Enable Zip file compression/decompression" OFF)
     104
     105set(GMSH_MAJOR_VERSION 4)
     106set(GMSH_MINOR_VERSION 7)
     107set(GMSH_PATCH_VERSION 0)
     108if(NOT GMSH_EXTRA_VERSION)
     109  set(GMSH_EXTRA_VERSION "")
     110endif()
     111set(GMSH_EXTRA_VERSION_TEXI "${GMSH_EXTRA_VERSION}")
     112set(GMSH_EXTRA_VERSION_ORIG ${GMSH_EXTRA_VERSION})
     113
     114if(NOT GMSH_RELEASE)
     115  find_package(Git)
     116  if(GIT_FOUND)
     117    execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --format=%h
     118                    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ERROR_QUIET
     119                    OUTPUT_VARIABLE GIT_COMMIT_HASH
     120                    OUTPUT_STRIP_TRAILING_WHITESPACE)
     121  endif()
     122  if(GIT_COMMIT_HASH)
     123    set(GMSH_EXTRA_VERSION "${GMSH_EXTRA_VERSION}-git-${GIT_COMMIT_HASH}")
     124  endif()
     125  set(GMSH_EXTRA_VERSION_TEXI "${GMSH_EXTRA_VERSION_TEXI} (development version)")
     126endif()
     127
     128set(GMSH_SHORT_VERSION
     129    "${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}.${GMSH_PATCH_VERSION}")
     130set(GMSH_VERSION "${GMSH_SHORT_VERSION}${GMSH_EXTRA_VERSION}")
     131set(GMSH_SHORT_LICENSE "GNU General Public License")
     132
     133set(GMSH_GITLAB_PREFIX "https://gitlab.onelab.info/gmsh/gmsh")
     134if(GMSH_RELEASE)
     135  set(GMSH_GITLAB_PREFIX "${GMSH_GITLAB_PREFIX}/blob/gmsh_${GMSH_SHORT_VERSION}")
     136else()
     137  set(GMSH_GITLAB_PREFIX "${GMSH_GITLAB_PREFIX}/blob/master")
     138endif()
     139
     140set(GMSH_API api/gmsh.h api/gmshc.h api/gmsh.h_cwrap)
     141
     142if(ENABLE_PRIVATE_API)
     143  message(WARNING "The private API is unsupported and undocumented. It is meant "
     144          "for expert Gmsh developers, not for regular Gmsh users, who should rely "
     145          "on the stable public API (gmsh/api) instead.")
     146  file(GLOB_RECURSE HEADERS Common/*.h Numeric/*.h Geo/*.h Mesh/*.h Solver/*.h
     147    Post/*.h Plugin/*.h Graphics/*.h contrib/kbipack/*.h
     148    contrib/DiscreteIntegration/*.h contrib/HighOrderMeshOptimizer/*.h
     149    contrib/MeshOptimizer/*.h contrib/MeshQualityOptimizer/*.h)
     150  set(GMSH_PRIVATE_API ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshConfig.h
     151      ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshVersion.h ${HEADERS})
     152  get_property(IAMCHILD DIRECTORY PROPERTY PARENT_DIRECTORY)
     153  if(IAMCHILD)
     154    set(GMSH_PRIVATE_API ${GMSH_PRIVATE_API} PARENT_SCOPE)
     155  endif()
     156  if(ENABLE_WRAP_PYTHON OR ENABLE_WRAP_JAVA)
     157    set(ENABLE_BUILD_DYNAMIC ON)
     158    message(WARNING "SWIG wrappers for the private API are unsupported and "
     159            "undocumented. The stable public Python API does not required SWIG.")
     160  endif()
     161endif()
     162
     163set(ONELAB_PY contrib/onelab/python/onelab.py)
     164set(GMSH_PY api/gmsh.py)
     165set(GMSH_JL api/gmsh.jl)
     166
     167if(${CMAKE_MAJOR_VERSION} GREATER 2)
     168  string(TIMESTAMP DATE "%Y%m%d")
     169else()
     170  execute_process(COMMAND date "+%Y%m%d" OUTPUT_VARIABLE DATE
     171                  OUTPUT_STRIP_TRAILING_WHITESPACE)
     172endif()
     173
     174if(NOT DATE)
     175  set(DATE "unknown")
     176endif()
     177set(GMSH_DATE "${DATE}")
     178
     179if(NOT GMSH_HOST)
     180  execute_process(COMMAND hostname OUTPUT_VARIABLE HOST
     181                  OUTPUT_STRIP_TRAILING_WHITESPACE)
     182  if(NOT HOST)
     183    set(HOST "unknown")
     184  endif()
     185  set(GMSH_HOST "${HOST}")
     186endif()
     187
     188if(NOT GMSH_PACKAGER)
     189  execute_process(COMMAND whoami OUTPUT_VARIABLE PACKAGER
     190                  OUTPUT_STRIP_TRAILING_WHITESPACE)
     191  if(NOT PACKAGER)
     192    set(PACKAGER "unknown")
     193  endif()
     194  string(REPLACE "\\" " " PACKAGER ${PACKAGER})
     195  set(GMSH_PACKAGER "${PACKAGER}")
     196endif()
     197
     198if(APPLE)
     199  set(GMSH_OS "MacOSX")
     200elseif(CYGWIN OR MSYS)
     201  # detect if we use the MinGW compilers on Cygwin - if we do, handle the build
     202  # as a pure Windows build and make cmake find pure Windows import libraries
     203  # (.lib)
     204  if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
     205     CMAKE_CXX_COMPILER_ID MATCHES "Clang")
     206    execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine
     207                    OUTPUT_VARIABLE CXX_COMPILER_MACHINE
     208                    OUTPUT_STRIP_TRAILING_WHITESPACE)
     209    if(CXX_COMPILER_MACHINE MATCHES "mingw")
     210      set(GMSH_OS "Windows")
     211      set(WIN32 1)
     212      add_definitions(-DWIN32)
     213      set(CMAKE_FIND_LIBRARY_PREFIXES "lib" "")
     214      set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".so" ".lib" ".LIB" ".dll" ".DLL" ".dll.a")
     215    endif()
     216  endif()
     217else()
     218  set(GMSH_OS "${CMAKE_SYSTEM_NAME}")
     219endif()
     220
     221include(CheckTypeSize)
     222include(CheckFunctionExists)
     223include(CheckIncludeFile)
     224include(CheckCXXCompilerFlag)
     225include(CheckCCompilerFlag)
     226
     227macro(set_config_option VARNAME STRING)
     228  set(${VARNAME} TRUE)
     229  list(APPEND CONFIG_OPTIONS ${STRING})
     230  message(STATUS "Found " ${STRING})
     231endmacro()
     232
     233# check the size of size_t
     234check_type_size("size_t" SIZEOF_SIZE_T)
     235if(SIZEOF_SIZE_T EQUAL 8)
     236  set_config_option(HAVE_64BIT_SIZE_T "64Bit")
     237endif()
     238
     239# append 32/64 to the build name on Linux and Windows
     240if(NOT APPLE)
     241  if(HAVE_64BIT_SIZE_T)
     242    set(GMSH_OS "${GMSH_OS}64")
     243  else()
     244    set(GMSH_OS "${GMSH_OS}32")
     245  endif()
     246endif()
     247
     248if(ENABLE_BUILD_DYNAMIC)
     249  set(GMSH_OS "${GMSH_OS}-sdk")
     250endif()
     251
     252if(ENABLE_RPATH)
     253  set(CMAKE_MACOSX_RPATH 1)
     254
     255  # make sure that dynamic libraries can be found when installing/ displacing
     256  # the binaries: from https://gitlab.kitware.com/cmake/community/wikis/doc/
     257  # cmake/RPATH-handling:
     258
     259  # use, i.e. don't skip the full RPATH for the build tree
     260  set(CMAKE_SKIP_BUILD_RPATH FALSE)
     261
     262  # when building, don't use the install RPATH already (but later on when
     263  # installing)
     264  set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
     265  set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
     266
     267  # add the automatically determined parts of the RPATH which point to
     268  # directories outside the build tree to the install RPATH
     269  set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
     270
     271  # the RPATH to be used when installing, but only if it's not a system directory
     272  list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib"
     273       isSystemDir)
     274  if("${isSystemDir}" STREQUAL "-1")
     275    if(APPLE)
     276      set(CMAKE_INSTALL_RPATH "@executable_path/../lib")
     277    else()
     278      set(CMAKE_INSTALL_RPATH "\\\$ORIGIN/../lib")
     279    endif()
     280  endif()
     281else()
     282  set(CMAKE_MACOSX_RPATH 0)
     283  set(CMAKE_SKIP_BUILD_RPATH TRUE)
     284endif()
     285
     286if(MSVC)
     287  # remove annoying warning about bool/int cast performance
     288  set(GMSH_CONFIG_PRAGMAS "#pragma warning(disable:4800 4244 4267)")
     289  foreach(VAR
     290          CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
     291          CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO
     292          CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
     293          CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
     294    if(ENABLE_MSVC_STATIC_RUNTIME AND ${VAR} MATCHES "/MD")
     295      string(REGEX REPLACE "/MD" "/MT" ${VAR} "${${VAR}}")
     296    endif()
     297    if(NOT ${VAR} MATCHES "/MP") # enable parallel compilation
     298      set(${VAR} "${${VAR}} /MP")
     299    endif()
     300  endforeach()
     301  if(ENABLE_PRIVATE_API)
     302    if(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
     303      # automatically export .def file with all symbols (requires CMake 3.4);
     304      # depending on the compiling options this might lead to more than 64k export
     305      # symbols; just trim the .def file to keep the ones you need
     306      set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
     307    endif()
     308  endif()
     309endif()
     310
     311# reduce memory usage of GCC on 32 bit systems
     312if(NOT HAVE_64BIT_SIZE_T AND CMAKE_CXX_COMPILER_ID MATCHES "GNU")
     313  set(CMAKE_CXX_FLAGS
     314      "${CMAKE_CXX_FLAGS} --param ggc-min-expand=1 --param ggc-min-heapsize=512000")
     315endif()
     316
     317if(ENABLE_OPENMP)
     318  find_package(OpenMP)
     319  if(OpenMP_FOUND OR OPENMP_FOUND)
     320    set_config_option(HAVE_OPENMP "OpenMP")
     321    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
     322    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
     323  elseif(APPLE AND EXISTS "/opt/local/lib/libomp")
     324    # official Apple compiler with macports' libomp
     325    set_config_option(HAVE_OPENMP "OpenMP[MacPorts]")
     326    set(CMAKE_C_FLAGS
     327        "${CMAKE_C_FLAGS} -Xpreprocessor -fopenmp -I/opt/local/include/libomp")
     328    set(CMAKE_CXX_FLAGS
     329        "${CMAKE_CXX_FLAGS} -Xpreprocessor -fopenmp -I/opt/local/include/libomp")
     330    list(APPEND EXTERNAL_LIBRARIES "-L/opt/local/lib/libomp -lomp")
     331  elseif(APPLE AND EXISTS "/usr/local/lib/libomp.dylib")
     332    # official Apple compiler with homebrew's libomp
     333    set_config_option(HAVE_OPENMP "OpenMP[Homebrew]")
     334    set(CMAKE_C_FLAGS
     335        "${CMAKE_C_FLAGS} -Xpreprocessor -fopenmp")
     336    set(CMAKE_CXX_FLAGS
     337        "${CMAKE_CXX_FLAGS} -Xpreprocessor -fopenmp")
     338    list(APPEND EXTERNAL_LIBRARIES "-L/usr/local/lib -lomp")
     339  endif()
     340endif()
     341
     342if(ENABLE_OPENACC)
     343  find_package(OpenACC)
     344  if(OpenACC_C_FOUND AND OpenACC_CXX_FOUND)
     345    set_config_option(HAVE_OPENACC "OpenACC")
     346    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenACC_C_FLAGS}")
     347    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenACC_CXX_FLAGS}")
     348  endif()
     349endif()
     350
     351if(ENABLE_PROFILE)
     352    # Using the perf set of profiling tools doesn't work without the frame
     353    # pointer and a common optimisation is to remove it
     354    check_cxx_compiler_flag("-fno-omit-frame-pointer" FNOFP)
     355    if(FNOFP)
     356        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
     357    endif()
     358endif()
     359
     360macro(append_gmsh_src DIRNAME FILES)
     361  foreach(FILE ${FILES})
     362    list(APPEND LIST ${DIRNAME}/${FILE})
     363  endforeach()
     364  set(GMSH_SRC ${GMSH_SRC};${LIST} PARENT_SCOPE)
     365  set(GMSH_DIRS ${GMSH_DIRS};${DIRNAME} PARENT_SCOPE)
     366endmacro()
     367
     368macro(find_all_libraries VARNAME LISTNAME PATH SUFFIX)
     369  set(${VARNAME})
     370  list(LENGTH ${LISTNAME} NUM_LIST)
     371  foreach(LIB ${${LISTNAME}})
     372    if("${PATH}" STREQUAL "")
     373      find_library(FOUND_LIB ${LIB} PATH_SUFFIXES ${SUFFIX})
     374    else()
     375      find_library(FOUND_LIB ${LIB} PATHS ${PATH} NO_DEFAULT_PATH)
     376    endif()
     377    if(FOUND_LIB)
     378      list(APPEND ${VARNAME} ${FOUND_LIB})
     379    endif()
     380    unset(FOUND_LIB CACHE)
     381  endforeach()
     382  list(LENGTH ${VARNAME} NUM_FOUND_LIBRARIES)
     383  if(NUM_FOUND_LIBRARIES LESS NUM_LIST)
     384    set(${VARNAME})
     385  endif()
     386endmacro()
     387
     388macro(set_compile_flags LISTNAME FLAGS)
     389  foreach(FILE ${${LISTNAME}})
     390    get_source_file_property(PROP ${FILE} COMPILE_FLAGS)
     391    if(PROP)
     392      set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS "${PROP} ${FLAGS}")
     393    else()
     394      set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS "${FLAGS}")
     395    endif()
     396  endforeach()
     397endmacro()
     398
     399if(ENABLE_EIGEN)
     400  if(ENABLE_SYSTEM_CONTRIB)
     401    find_path(EIGEN_INC "Eigen/Dense" HINTS eigen3)
     402    if(EIGEN_INC)
     403      include_directories(${EIGEN_INC})
     404      set_config_option(HAVE_EIGEN "Eigen[system]")
     405    endif()
     406  endif()
     407  if(NOT HAVE_EIGEN)
     408    include_directories(contrib/eigen)
     409    set_config_option(HAVE_EIGEN "Eigen")
     410  endif()
     411  # We could also add an option to use BLAS with Eigen
     412  # add_definitions(-DEIGEN_USE_BLAS)
     413elseif(ENABLE_BLAS_LAPACK)
     414  if(BLAS_LAPACK_LIBRARIES)
     415    # use libs as specified in the BLAS_LAPACK_LIBRARIES variable
     416    set_config_option(HAVE_BLAS "Blas[custom]")
     417    set_config_option(HAVE_LAPACK "Lapack[custom]")
     418    set(LAPACK_LIBRARIES ${BLAS_LAPACK_LIBRARIES})
     419  else()
     420    if(MSVC)
     421      # on Windows with Visual C++ try really hard to find blas/lapack *without*
     422      # requiring a Fortran compiler: 1) try to find the Intel MKL libs using
     423      # the standard search path; if not found 2) try to get the reference
     424      # blas/lapack libs (useful for users with no Fortran compiler and no MKL
     425      # license, who can just download our precompiled "gmsh-dep" package)
     426      if(HAVE_64BIT_SIZE_T)
     427        set(MKL_PATH em64t/lib)
     428        set(MKL_LIBS_REQUIRED libguide40 mkl_intel_lp64 mkl_intel_thread mkl_core)
     429      else()
     430        set(MKL_PATH ia32/lib)
     431        set(MKL_LIBS_REQUIRED libguide40 mkl_intel_c mkl_intel_thread mkl_core)
     432      endif()
     433      find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
     434      if(LAPACK_LIBRARIES)
     435        set_config_option(HAVE_BLAS "Blas[mkl]")
     436        set_config_option(HAVE_LAPACK "Lapack[mkl]")
     437      else()
     438        set(REFLAPACK_LIBS_REQUIRED lapack blas g2c gcc)
     439        find_all_libraries(LAPACK_LIBRARIES REFLAPACK_LIBS_REQUIRED "" "")
     440        if(LAPACK_LIBRARIES)
     441          set_config_option(HAVE_BLAS "Blas[ref]")
     442          set_config_option(HAVE_LAPACK "Lapack[ref]")
     443        endif()
     444      endif()
     445    elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
     446      # on Linux try to find the Intel MKL without a Fortran compiler
     447      if(HAVE_64BIT_SIZE_T)
     448        set(MKL_PATH lib/em64t)
     449      else()
     450        set(MKL_PATH lib/32)
     451      endif()
     452      set(MKL_LIBS_REQUIRED mkl_gf_lp64 iomp5 mkl_gnu_thread mkl_core guide pthread)
     453      find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
     454      if(NOT LAPACK_LIBRARIES)
     455        # match lapack 9.0 on 64bit
     456        set(MKL_LIBS_REQUIRED mkl_lapack mkl_em64t guide)
     457        find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
     458      endif()
     459      if(LAPACK_LIBRARIES)
     460        set_config_option(HAVE_BLAS "Blas[mkl]")
     461        set_config_option(HAVE_LAPACK "Lapack[mkl]")
     462      else()
     463        # on Linux also try to find ATLAS without a Fortran compiler, because
     464        # cmake ships with a buggy FindBLAS e.g. on Ubuntu Lucid Lynx
     465        set(ATLAS_LIBS_REQUIRED lapack f77blas cblas atlas)
     466        find_all_libraries(LAPACK_LIBRARIES ATLAS_LIBS_REQUIRED "" "")
     467        if(LAPACK_LIBRARIES)
     468          set_config_option(HAVE_BLAS "Blas[atlas]")
     469          set_config_option(HAVE_LAPACK "Lapack[atlas]")
     470        else()
     471          # try with generic names
     472          set(GENERIC_LIBS_REQUIRED lapack blas pthread)
     473          find_all_libraries(LAPACK_LIBRARIES GENERIC_LIBS_REQUIRED "" "")
     474          if(LAPACK_LIBRARIES)
     475            set_config_option(HAVE_BLAS "Blas[generic]")
     476            set_config_option(HAVE_LAPACK "Lapack[generic]")
     477            find_library(GFORTRAN_LIB gfortran)
     478            if(GFORTRAN_LIB)
     479              list(APPEND LAPACK_LIBRARIES ${GFORTRAN_LIB})
     480            endif()
     481          endif()
     482        endif()
     483      endif()
     484    elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
     485      # on SunOS we know blas and lapack are available in sunperf
     486      set(LAPACK_LIBRARIES -library=sunperf)
     487      set_config_option(HAVE_BLAS "Blas[sunperf]")
     488      set_config_option(HAVE_LAPACK "Lapack[sunperf]")
     489    elseif(APPLE)
     490      # on Mac we also know that blas and lapack are available
     491      set(LAPACK_LIBRARIES "-llapack -lblas")
     492      set_config_option(HAVE_BLAS "Blas[veclib]")
     493      set_config_option(HAVE_LAPACK "Lapack[veclib]")
     494    endif()
     495
     496    if(NOT HAVE_BLAS OR NOT HAVE_LAPACK)
     497      # if we haven't found blas and lapack check for OpenBlas
     498      set(OPENBLAS_LIBS_REQUIRED openblas)
     499      find_all_libraries(LAPACK_LIBRARIES OPENBLAS_LIBS_REQUIRED "" "")
     500      if(LAPACK_LIBRARIES)
     501        set_config_option(HAVE_BLAS "Blas[openblas]")
     502        set_config_option(HAVE_LAPACK "Lapack[openblas]")
     503        find_library(GFORTRAN_LIB gfortran)
     504        if(GFORTRAN_LIB)
     505          list(APPEND LAPACK_LIBRARIES ${GFORTRAN_LIB})
     506        endif()
     507      endif()
     508    endif()
     509
     510    if(NOT HAVE_BLAS OR NOT HAVE_LAPACK)
     511      # if we still haven't found blas and lapack, use the standard cmake tests,
     512      # which require a working Fortran compiler
     513      enable_language(Fortran)
     514      find_package(BLAS)
     515      if(BLAS_FOUND)
     516        set_config_option(HAVE_BLAS "Blas")
     517        find_package(LAPACK)
     518        if(LAPACK_FOUND)
     519          set_config_option(HAVE_LAPACK "Lapack")
     520        else()
     521          set(LAPACK_LIBRARIES ${BLAS_LIBRARIES})
     522        endif()
     523        if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
     524          if(CMAKE_Fortran_COMPILER MATCHES "gfortran")
     525            list(APPEND LAPACK_LIBRARIES gfortran)
     526          elseif(CMAKE_Fortran_COMPILER MATCHES "f95")
     527            list(APPEND LAPACK_LIBRARIES gfortran)
     528          elseif(CMAKE_Fortran_COMPILER MATCHES "g77")
     529            list(APPEND LAPACK_LIBRARIES g2c)
     530          endif()
     531        elseif(CMAKE_Fortran_COMPILER MATCHES "pgi")
     532          list(APPEND LAPACK_LIBRARIES -pgf77libs)
     533        endif()
     534      endif()
     535    endif()
     536  endif()
     537endif()
     538
     539if(ENABLE_TCMALLOC)
     540  find_library(TCMALLOC tcmalloc)
     541  if(TCMALLOC)
     542    set_config_option(HAVE_TCMALLOC "TCMalloc")
     543    list(APPEND EXTERNAL_LIBRARIES ${TCMALLOC})
     544  endif()
     545endif()
     546
     547add_subdirectory(Common)
     548add_subdirectory(Numeric)
     549add_subdirectory(Geo)
     550
     551if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Mesh AND ENABLE_MESH)
     552  add_subdirectory(Mesh)
     553  set_config_option(HAVE_MESH "Mesh")
     554endif()
     555
     556if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Solver AND ENABLE_SOLVER)
     557  add_subdirectory(Solver)
     558  set_config_option(HAVE_SOLVER "Solver")
     559endif()
     560
     561if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Post AND ENABLE_POST)
     562  add_subdirectory(Post)
     563  set_config_option(HAVE_POST "Post")
     564  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Plugin AND ENABLE_PLUGINS)
     565    add_subdirectory(Plugin)
     566    set_config_option(HAVE_PLUGINS "Plugins")
     567  endif()
     568endif()
     569
     570if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Parser AND ENABLE_PARSER)
     571  add_subdirectory(Parser)
     572  set_config_option(HAVE_PARSER "Parser")
     573endif()
     574
     575if(ENABLE_VISUDEV)
     576  set_config_option(HAVE_VISUDEV "VisuDev")
     577endif()
     578
     579if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Fltk AND ENABLE_FLTK)
     580  # first, try to use fltk-config for fltk >= 1.3 (FindFLTK is buggy on Unix,
     581  # where e.g. xft and xinerama options are not dealt with)
     582  find_program(FLTK_CONFIG_SCRIPT fltk-config)
     583  if(FLTK_CONFIG_SCRIPT)
     584    execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --api-version
     585                    OUTPUT_VARIABLE FLTK_VERSION)
     586    string(STRIP "${FLTK_VERSION}" FLTK_VERSION)
     587    if(FLTK_VERSION VERSION_GREATER 1.1)
     588      add_subdirectory(Fltk)
     589      set_config_option(HAVE_FLTK "Fltk")
     590      message(STATUS "Using fltk-config script for Fltk " ${FLTK_VERSION})
     591      execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --use-gl --use-images --includedir
     592                      OUTPUT_VARIABLE FLTK_INCLUDE_DIR)
     593      string(STRIP ${FLTK_INCLUDE_DIR} FLTK_INCLUDE_DIR)
     594      list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR})
     595      # On linux (at least OpenSuSE) the following directories are
     596      # not existing (everything is in /usr/include). To avoid warnings
     597      # check existance of these directories before adding them
     598      if(EXISTS ${FLTK_INCLUDE_DIR}/FL/images)
     599        list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/FL/images)
     600      endif()
     601      if(EXISTS ${FLTK_INCLUDE_DIR}/jpeg)
     602        list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/jpeg)
     603      endif()
     604      if(EXISTS ${FLTK_INCLUDE_DIR}/zlib)
     605        list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/zlib)
     606      endif()
     607      if(EXISTS ${FLTK_INCLUDE_DIR}/png)
     608        list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/png)
     609      endif()
     610      execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --use-gl --use-images --ldflags
     611                      OUTPUT_VARIABLE FLTK_LIBRARIES)
     612      string(STRIP ${FLTK_LIBRARIES} FLTK_LIBRARIES)
     613      string(REGEX MATCH "fltk[_ ]jpeg" FLTK_JPEG ${FLTK_LIBRARIES})
     614      string(REGEX MATCH "fltk[_ ]z" FLTK_Z ${FLTK_LIBRARIES})
     615      string(REGEX MATCH "fltk[_ ]png" FLTK_PNG ${FLTK_LIBRARIES})
     616    endif()
     617  endif()
     618  # then try the built-in FindFLTK module
     619  if(NOT HAVE_FLTK)
     620    set(FLTK_SKIP_FORMS TRUE)
     621    set(FLTK_SKIP_FLUID TRUE)
     622    find_package(FLTK)
     623    if(FLTK_FOUND)
     624      add_subdirectory(Fltk)
     625      set_config_option(HAVE_FLTK "Fltk")
     626      list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR})
     627      # find fltk jpeg
     628      find_library(FLTK_JPEG NAMES fltk_jpeg fltkjpeg)
     629      if(FLTK_JPEG)
     630        list(APPEND EXTERNAL_LIBRARIES ${FLTK_JPEG})
     631        foreach(DIR ${FLTK_INCLUDE_DIR})
     632          list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/jpeg)
     633        endforeach()
     634      endif()
     635      # find fltk zlib
     636      find_library(FLTK_Z NAMES fltk_z fltkz)
     637      if(FLTK_Z)
     638        list(APPEND EXTERNAL_LIBRARIES ${FLTK_Z})
     639        foreach(DIR ${FLTK_INCLUDE_DIR})
     640          list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/zlib)
     641        endforeach()
     642      endif()
     643      # find fltk png
     644      find_library(FLTK_PNG NAMES fltk_png fltkpng)
     645      if(FLTK_PNG)
     646        list(APPEND EXTERNAL_LIBRARIES ${FLTK_PNG})
     647        foreach(DIR ${FLTK_INCLUDE_DIR})
     648          list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/png)
     649        endforeach()
     650      endif()
     651    endif()
     652  endif()
     653  # workaround for Fedora/Suse messing up fltk-config (see issue #417)
     654  if(HAVE_FLTK AND ${CMAKE_SYSTEM_NAME} MATCHES "Linux")
     655    string(REGEX MATCH "X11" FLTK_X11 ${FLTK_LIBRARIES})
     656    if(NOT FLTK_X11)
     657      find_package(X11)
     658      if(X11_FOUND)
     659        list(APPEND EXTERNAL_INCLUDES ${X11_INCLUDE_DIR})
     660        list(APPEND EXTERNAL_LIBRARIES ${X11_LIBRARIES})
     661      endif()
     662    endif()
     663  endif()
     664endif()
     665
     666if(APPLE AND HAVE_FLTK AND ENABLE_TOUCHBAR)
     667  STRING(REGEX MATCH "([0-9]+.[0-9]+)" OSX_SDK_VERSION "${CMAKE_OSX_SYSROOT}")
     668  if(OSX_SDK_VERSION)
     669    if(${OSX_SDK_VERSION} VERSION_GREATER 10.11)
     670      set(GMSH_SRC ${GMSH_SRC};Fltk/touchBar.mm)
     671      set_config_option(HAVE_TOUCHBAR "TouchBar")
     672    endif()
     673  endif()
     674endif()
     675
     676if(ENABLE_ONELAB)
     677  set_config_option(HAVE_ONELAB "ONELAB")
     678  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/onelab)
     679    if(ENABLE_ONELAB_METAMODEL)
     680      add_subdirectory(contrib/onelab)
     681      include_directories(contrib/onelab)
     682      set_config_option(HAVE_ONELAB_METAMODEL "ONELABMetamodel")
     683    endif()
     684    file(COPY ${ONELAB_PY} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
     685  endif()
     686endif()
     687
     688if(ENABLE_BUILD_IOS)
     689  find_file(CMAKE_TOOLCHAIN_FILE "ios.cmake")
     690  if(NOT CMAKE_TOOLCHAIN_FILE)
     691    message(FATAL_ERROR "Cannot compile Gmsh for iOS without a toolchain")
     692  endif()
     693  add_definitions(-DBUILD_IOS)
     694endif()
     695
     696if(HAVE_FLTK OR ENABLE_GRAPHICS)
     697  if(NOT HAVE_MESH OR NOT HAVE_POST OR NOT HAVE_PLUGINS OR NOT HAVE_ONELAB)
     698    message(SEND_ERROR "Cannot compile GUI without Mesh, Post, Plugin and ONELAB")
     699  endif()
     700
     701  if(FLTK_JPEG)
     702    set_config_option(HAVE_LIBJPEG "Jpeg[fltk]")
     703  else()
     704    find_package(JPEG)
     705    if(JPEG_FOUND)
     706      set_config_option(HAVE_LIBJPEG "Jpeg")
     707      list(APPEND EXTERNAL_LIBRARIES ${JPEG_LIBRARIES})
     708      list(APPEND EXTERNAL_INCLUDES ${JPEG_INCLUDE_DIR})
     709    endif()
     710  endif()
     711
     712  if(FLTK_Z)
     713    set_config_option(HAVE_LIBZ "Zlib[fltk]")
     714  else()
     715    find_package(ZLIB)
     716    if(ZLIB_FOUND)
     717      set_config_option(HAVE_LIBZ "Zlib")
     718      list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
     719      list(APPEND EXTERNAL_INCLUDES ${ZLIB_INCLUDE_DIR})
     720    endif()
     721  endif()
     722
     723  if(HAVE_LIBZ)
     724    if(FLTK_PNG)
     725      set_config_option(HAVE_LIBPNG "Png[fltk]")
     726    else()
     727      find_package(PNG)
     728      if(PNG_FOUND)
     729        set_config_option(HAVE_LIBPNG "Png")
     730        list(APPEND EXTERNAL_LIBRARIES ${PNG_LIBRARIES})
     731        list(APPEND EXTERNAL_INCLUDES ${PNG_INCLUDE_DIR})
     732      endif()
     733    endif()
     734  endif()
     735
     736  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/mpeg_encode AND
     737     ENABLE_MPEG_ENCODE)
     738    add_subdirectory(contrib/mpeg_encode)
     739    include_directories(contrib/mpeg_encode/headers)
     740    set_config_option(HAVE_MPEG_ENCODE "Mpeg")
     741  endif()
     742
     743  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/3M AND ENABLE_3M)
     744    add_subdirectory(contrib/3M)
     745    include_directories(contrib/3M)
     746    set_config_option(HAVE_3M "3M")
     747  endif()
     748
     749  if(ENABLE_OSMESA)
     750    find_library(OSMESA_LIB OSMesa)
     751    if(OSMESA_LIB)
     752      set_config_option(HAVE_OSMESA "OSMesa")
     753      list(APPEND EXTERNAL_LIBRARIES ${OSMESA_LIB})
     754    endif()
     755  endif()
     756
     757  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Graphics)
     758    set(OpenGL_GL_PREFERENCE "LEGACY")
     759    find_package(OpenGL REQUIRED)
     760    if(OPENGL_GLU_FOUND AND OPENGL_FOUND)
     761      add_subdirectory(Graphics)
     762      set_config_option(HAVE_OPENGL "OpenGL")
     763    else()
     764      message(SEND_ERROR "Could not find GLU: disabling OpenGL support")
     765    endif()
     766  endif()
     767endif()
     768
     769if(ENABLE_ANN)
     770  find_library(ANN_LIB ANN PATH_SUFFIXES lib)
     771  find_path(ANN_INC "ANN.h" PATH_SUFFIXES src include ANN)
     772  if(ENABLE_SYSTEM_CONTRIB AND ANN_LIB AND ANN_INC)
     773    message(STATUS "Using system version of ANN")
     774    list(APPEND EXTERNAL_LIBRARIES ${ANN_LIB})
     775    list(APPEND EXTERNAL_INCLUDES ${ANN_INC})
     776    set_config_option(HAVE_ANN "ANN[system]")
     777  elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/ANN)
     778    add_subdirectory(contrib/ANN)
     779    include_directories(contrib/ANN/include)
     780    set_config_option(HAVE_ANN "ANN")
     781  endif()
     782endif()
     783
     784if(ENABLE_ALGLIB)
     785  find_library(ALGLIB_LIB alglib)
     786  find_path(ALGLIB_INC "stdafx.h" PATH_SUFFIXES libalglib)
     787  if(ENABLE_SYSTEM_CONTRIB AND ALGLIB_LIB AND ALGLIB_INC)
     788    list(APPEND EXTERNAL_LIBRARIES ${ALGLIB_LIB})
     789    list(APPEND EXTERNAL_INCLUDES ${ALGLIB_INC})
     790    set_config_option(HAVE_ALGLIB "ALGLIB[system]")
     791  elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/ALGLIB)
     792    add_subdirectory(contrib/ALGLIB)
     793    include_directories(contrib/ALGLIB)
     794    set_config_option(HAVE_ALGLIB "ALGLIB")
     795  endif()
     796endif()
     797
     798if(HAVE_FLTK AND ENABLE_CAIRO)
     799  find_library(CAIRO_LIB cairo)
     800  find_path(CAIRO_INC "cairo/cairo.h" PATH_SUFFIXES include)
     801  if(CAIRO_INC AND CAIRO_LIB)
     802     set_config_option(HAVE_CAIRO "Cairo")
     803     list(APPEND EXTERNAL_LIBRARIES ${CAIRO_LIB})
     804     list(APPEND EXTERNAL_INCLUDES ${CAIRO_INC})
     805  endif()
     806endif()
     807
     808if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/DiscreteIntegration AND
     809   ENABLE_DINTEGRATION)
     810  add_subdirectory(contrib/DiscreteIntegration)
     811  include_directories(contrib/DiscreteIntegration)
     812  set_config_option(HAVE_DINTEGRATION "DIntegration")
     813endif()
     814
     815if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/HighOrderMeshOptimizer AND
     816   EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MeshOptimizer AND
     817   EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MeshQualityOptimizer AND
     818   ENABLE_OPTHOM AND HAVE_MESH)
     819  add_subdirectory(contrib/HighOrderMeshOptimizer)
     820  include_directories(contrib/HighOrderMeshOptimizer)
     821  add_subdirectory(contrib/MeshOptimizer)
     822  include_directories(contrib/MeshOptimizer)
     823  include_directories(${CMAKE_CURRENT_BINARY_DIR}/contrib/MeshOptimizer)
     824  add_subdirectory(contrib/MeshQualityOptimizer)
     825  include_directories(contrib/MeshQualityOptimizer)
     826  set_config_option(HAVE_OPTHOM "OptHom")
     827endif()
     828
     829if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/domhex AND
     830   ENABLE_DOMHEX AND HAVE_MESH)
     831  add_subdirectory(contrib/domhex)
     832  include_directories(contrib/domhex)
     833  set_config_option(HAVE_DOMHEX "DomHex")
     834endif()
     835
     836if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/QuadTri AND
     837   ENABLE_QUADTRI AND HAVE_MESH)
     838  add_subdirectory(contrib/QuadTri)
     839  include_directories(contrib/QuadTri)
     840  set_config_option(HAVE_QUADTRI "QuadTri")
     841endif()
     842
     843if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/kbipack AND ENABLE_KBIPACK)
     844  set_config_option(HAVE_KBIPACK "Kbipack")
     845  add_subdirectory(contrib/kbipack)
     846  include_directories(contrib/kbipack)
     847  if(ENABLE_GMP)
     848    find_library(GMP_LIB libgmp.a)
     849    find_path(GMP_INC "gmp.h" PATH_SUFFIXES src include)
     850  endif()
     851  if(GMP_LIB AND GMP_INC)
     852    set_config_option(HAVE_GMP "GMP")
     853    list(APPEND EXTERNAL_LIBRARIES ${GMP_LIB})
     854    list(APPEND EXTERNAL_INCLUDES ${GMP_INC})
     855  else()
     856    message(STATUS "GMP not found: Kbipack uses long int")
     857  endif()
     858endif()
     859
     860if(ENABLE_MATHEX)
     861  find_library(MATHEX_LIB mathex PATH_SUFFIXES lib)
     862  find_path(MATHEX_INC "mathex.h" PATH_SUFFIXES src include)
     863  if(ENABLE_SYSTEM_CONTRIB AND MATHEX_LIB AND MATHEX_INC)
     864    list(APPEND EXTERNAL_LIBRARIES ${MATHEX_LIB})
     865    list(APPEND EXTERNAL_INCLUDES ${MATHEX_INC})
     866    set_config_option(HAVE_MATHEX "MathEx[system]")
     867  elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MathEx)
     868    add_subdirectory(contrib/MathEx)
     869    include_directories(contrib/MathEx)
     870    set_config_option(HAVE_MATHEX "MathEx")
     871  endif()
     872endif()
     873
     874if(ENABLE_MPI)
     875  find_package(MPI)
     876  if(MPI_FOUND)
     877    set_config_option(HAVE_MPI "MPI")
     878    list(APPEND EXTERNAL_INCLUDES ${MPI_CXX_INCLUDE_PATH})
     879    list(APPEND EXTERNAL_LIBRARIES ${MPI_CXX_LIBRARIES})
     880    set(CMAKE_C_COMPILER ${MPI_C_COMPILER})
     881    set(CMAKE_CXX_COMPILER ${MPI_CXX_COMPILER})
     882    set(CMAKE_Fortran_COMPILER ${MPI_Fortran_COMPILER})
     883  endif()
     884endif()
     885
     886if(ENABLE_POPPLER)
     887  find_library(POPPLER_LIB poppler)
     888  find_library(POPPLER_CPP_LIB poppler-cpp)
     889  find_path(POPPLER_INC "poppler/cpp/poppler-document.h" PATH_SUFFIXES src include)
     890  if(POPPLER_LIB AND POPPLER_INC)
     891    set_config_option(HAVE_POPPLER "Poppler")
     892    list(APPEND EXTERNAL_LIBRARIES ${POPPLER_LIB})
     893    list(APPEND EXTERNAL_LIBRARIES ${POPPLER_CPP_LIB})
     894    list(APPEND EXTERNAL_INCLUDES ${POPPLER_INC})
     895  endif()
     896endif()
     897
     898if(ENABLE_P4EST)
     899  find_library(P4EST_LIB p4est)
     900  find_path(P4EST_INC "p4est.h" PATH_SUFFIXES src)
     901  find_library(SC_LIB sc)
     902  if(P4EST_LIB AND P4EST_INC AND SC_LIB)
     903    set_config_option(HAVE_P4EST "P4est")
     904    list(APPEND EXTERNAL_LIBRARIES ${P4EST_LIB} ${SC_LIB})
     905    list(APPEND EXTERNAL_INCLUDES ${P4EST_INC})
     906  endif()
     907endif()
     908
     909if(HAVE_MESH OR HAVE_SOLVER)
     910  if(ENABLE_METIS)
     911    if(METIS_LIB AND METIS_INC)
     912      list(APPEND EXTERNAL_LIBRARIES ${METIS_LIB})
     913      list(APPEND EXTERNAL_INCLUDES ${METIS_INC})
     914      set_config_option(HAVE_METIS "Metis")
     915    else()
     916      find_library(METIS_LIB metis PATH_SUFFIXES lib)
     917      find_path(METIS_INC "metis.h" PATH_SUFFIXES include)
     918      if(ENABLE_SYSTEM_CONTRIB AND METIS_LIB AND METIS_INC)
     919        message(STATUS "Using system version of METIS")
     920        list(APPEND EXTERNAL_LIBRARIES ${METIS_LIB})
     921        list(APPEND EXTERNAL_INCLUDES ${METIS_INC})
     922        set_config_option(HAVE_METIS "Metis[system]")
     923      elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/metis)
     924        add_definitions(-DUSE_GKREGEX)
     925        add_subdirectory(contrib/metis)
     926        include_directories(contrib/metis/include contrib/metis/libmetis
     927                          contrib/metis/GKlib)
     928        set_config_option(HAVE_METIS "Metis")
     929      endif()
     930    endif()
     931  endif()
     932endif()
     933
     934if(HAVE_MESH)
     935  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Mesh/tetgenBR.cxx)
     936    set_config_option(HAVE_TETGENBR "TetGen/BR")
     937  endif()
     938
     939  if(ENABLE_VOROPP)
     940    find_library(VOROPP_LIB voro++)
     941    find_path(VOROPP_INC "voro++.hh" PATH_SUFFIXES voro++)
     942    if(ENABLE_SYSTEM_CONTRIB AND VOROPP_LIB AND VOROPP_INC)
     943      message(STATUS "Using system version of voro++")
     944      list(APPEND EXTERNAL_LIBRARIES ${VOROPP_LIB})
     945      list(APPEND EXTERNAL_INCLUDES ${VOROPP_INC})
     946      set_config_option(HAVE_VOROPP "Voro++[system]")
     947    elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/voro++)
     948      add_subdirectory(contrib/voro++)
     949      include_directories(contrib/voro++/src)
     950      set_config_option(HAVE_VOROPP "Voro++")
     951    endif()
     952  endif()
     953
     954  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/blossom AND ENABLE_BLOSSOM)
     955    add_subdirectory(contrib/blossom)
     956    include_directories(contrib/blossom/MATCH contrib/blossom/concorde97
     957                        contrib/blossom/concorde97/INCLUDE)
     958    set_config_option(HAVE_BLOSSOM "Blossom")
     959  endif()
     960
     961  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/Netgen AND ENABLE_NETGEN)
     962    add_subdirectory(contrib/Netgen)
     963    include_directories(contrib/Netgen contrib/Netgen/libsrc/include
     964                        contrib/Netgen/nglib)
     965    set_config_option(HAVE_NETGEN "Netgen")
     966    add_definitions(-DNO_PARALLEL_THREADS -DNOTCL)
     967  endif()
     968
     969  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/bamg AND ENABLE_BAMG)
     970    add_subdirectory(contrib/bamg)
     971    include_directories(contrib/bamg contrib/bamg/bamglib)
     972    set_config_option(HAVE_BAMG "Bamg")
     973  endif()
     974
     975  if(ENABLE_MMG)
     976    find_library(MMG_LIB NAMES Mmg mmg)
     977    find_path(MMG_INC "libmmg.h" PATH_SUFFIXES mmg)
     978    if(MMG_LIB AND MMG_INC)
     979      list(APPEND EXTERNAL_LIBRARIES ${MMG_LIB})
     980      list(APPEND EXTERNAL_INCLUDES ${MMG_INC})
     981      set_config_option(HAVE_MMG "Mmg")
     982    endif()
     983  endif()
     984endif()
     985
     986if(ENABLE_MED OR ENABLE_CGNS)
     987  find_package(HDF5)
     988  if(HDF5_FOUND)
     989    set(HDF5_LIB "${HDF5_C_LIBRARIES}")
     990    list(APPEND EXTERNAL_INCLUDES ${HDF5_INCLUDE_DIRS})
     991    if(ENABLE_MED)
     992      find_library(MED_LIB medC)
     993      if(MED_LIB)
     994        set_config_option(HAVE_MED "Med")
     995        list(APPEND EXTERNAL_LIBRARIES ${MED_LIB})
     996      endif()
     997    endif()
     998    if(ENABLE_CGNS)
     999      find_library(CGNS_LIB cgns HINTS ENV CGNS_ROOT PATH_SUFFIXES lib)
     1000      find_path(CGNS_INC "cgnslib.h" HINTS ENV CGNS_ROOT PATH_SUFFIXES include)
     1001      if(CGNS_LIB AND CGNS_INC)
     1002        set_config_option(HAVE_LIBCGNS "Cgns")
     1003        list(APPEND EXTERNAL_LIBRARIES ${CGNS_LIB})
     1004        list(APPEND EXTERNAL_INCLUDES ${CGNS_INC})
     1005        if(ENABLE_CGNS_CPEX0045)
     1006          set_config_option(HAVE_LIBCGNS_CPEX0045 "Cgns_CPEX0045")
     1007        endif()
     1008      endif()
     1009    endif()
     1010    if(MED_LIB OR CGNS_LIB)
     1011      list(APPEND EXTERNAL_LIBRARIES ${HDF5_LIB})
     1012      find_library(SZ_LIB NAMES szlib sz)
     1013      if(SZ_LIB)
     1014        list(APPEND EXTERNAL_LIBRARIES ${SZ_LIB})
     1015      endif()
     1016      if(NOT HAVE_LIBZ) # necessary for non-GUI builds
     1017        find_package(ZLIB)
     1018        if(ZLIB_FOUND)
     1019          set_config_option(HAVE_LIBZ "Zlib")
     1020          list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
     1021        endif()
     1022      endif()
     1023    endif()
     1024  else()
     1025    message(STATUS "HDF5 not found")
     1026  endif()
     1027endif()
     1028
     1029if(HAVE_SOLVER)
     1030  if(ENABLE_GMM)
     1031    find_path(GMM_INC "gmm.h" PATH_SUFFIXES src include include/gmm)
     1032    if(ENABLE_SYSTEM_CONTRIB AND GMM_INC)
     1033      message(STATUS "Using system version of GMM")
     1034      list(APPEND EXTERNAL_INCLUDES ${GMM_INC})
     1035      set_config_option(HAVE_GMM "Gmm[system]")
     1036    elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/gmm)
     1037      include_directories(contrib/gmm)
     1038      set_config_option(HAVE_GMM "Gmm")
     1039    endif()
     1040  endif()
     1041
     1042  if(ENABLE_PETSC)
     1043    if(PETSC_DIR)
     1044      set(ENV_PETSC_DIR ${PETSC_DIR})
     1045    else()
     1046      set(ENV_PETSC_DIR $ENV{PETSC_DIR})
     1047    endif()
     1048    if(PETSC_ARCH)
     1049      set(ENV_PETSC_ARCH ${PETSC_ARCH})
     1050    else()
     1051      set(ENV_PETSC_ARCH $ENV{PETSC_ARCH})
     1052    endif()
     1053    set(PETSC_POSSIBLE_CONF_FILES
     1054        ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/conf/petscvariables
     1055        ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib/petsc-conf/petscvariables
     1056        ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib/petsc/conf/petscvariables)
     1057    foreach(FILE ${PETSC_POSSIBLE_CONF_FILES})
     1058      if(EXISTS ${FILE})
     1059        # old-style PETSc installations (using PETSC_DIR and PETSC_ARCH)
     1060        message(STATUS "Using PETSc dir: ${ENV_PETSC_DIR}")
     1061        message(STATUS "Using PETSc arch: ${ENV_PETSC_ARCH}")
     1062        # find includes by parsing the petscvariables file
     1063        file(STRINGS ${FILE} PETSC_VARIABLES NEWLINE_CONSUME)
     1064      endif()
     1065    endforeach()
     1066    if(PETSC_VARIABLES)
     1067      # try to find PETSC_CC_INCLUDES for PETSc >= 3.4
     1068      string(REGEX MATCH "PETSC_CC_INCLUDES = [^\n\r]*" PETSC_PACKAGES_INCLUDES
     1069             ${PETSC_VARIABLES})
     1070      if(PETSC_PACKAGES_INCLUDES)
     1071        string(REPLACE "PETSC_CC_INCLUDES = " "" PETSC_PACKAGES_INCLUDES
     1072               ${PETSC_PACKAGES_INCLUDES})
     1073      else()
     1074        # try to find PETSC_PACKAGES_INCLUDES in older versions
     1075        list(APPEND EXTERNAL_INCLUDES ${ENV_PETSC_DIR}/include)
     1076        list(APPEND EXTERNAL_INCLUDES ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/include)
     1077        string(REGEX MATCH "PACKAGES_INCLUDES = [^\n\r]*" PETSC_PACKAGES_INCLUDES
     1078               ${PETSC_VARIABLES})
     1079        string(REPLACE "PACKAGES_INCLUDES = " "" PETSC_PACKAGES_INCLUDES
     1080               ${PETSC_PACKAGES_INCLUDES})
     1081      endif()
     1082      if(PETSC_PACKAGES_INCLUDES)
     1083        if(PETSC_PACKAGES_INCLUDES)
     1084          string(REPLACE "-I" "" PETSC_PACKAGES_INCLUDES ${PETSC_PACKAGES_INCLUDES})
     1085          string(REPLACE " " ";" PETSC_PACKAGES_INCLUDES ${PETSC_PACKAGES_INCLUDES})
     1086          foreach(VAR ${PETSC_PACKAGES_INCLUDES})
     1087            # seem to include unexisting directories (/usr/include/lib64)
     1088            # check to avoid warnings
     1089            if(EXISTS ${VAR})
     1090              list(APPEND EXTERNAL_INCLUDES ${VAR})
     1091            endif()
     1092          endforeach()
     1093        endif()
     1094      endif()
     1095      # find libraries (<= 3.0)
     1096      set(PETSC_LIBS_REQUIRED petscksp petscdm petscmat petscvec petsc)
     1097      find_all_libraries(PETSC_LIBS PETSC_LIBS_REQUIRED
     1098                         ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib "")
     1099      # petsc 3.1 creates only one library (libpetsc)
     1100      if(NOT PETSC_LIBS)
     1101        find_library(PETSC_LIBS petsc PATHS ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib
     1102                     NO_DEFAULT_PATH)
     1103      endif()
     1104      if(PETSC_LIBS)
     1105        set_config_option(HAVE_PETSC "PETSc")
     1106        if(NOT HAVE_BLAS)
     1107          set_config_option(HAVE_BLAS "Blas[petsc]")
     1108        endif()
     1109        if(NOT HAVE_LAPACK)
     1110          set_config_option(HAVE_LAPACK "Lapack[petsc]")
     1111        endif()
     1112      endif()
     1113      # find slepc (needs to be linked in before petsc)
     1114      if(ENABLE_SLEPC)
     1115        if(SLEPC_DIR)
     1116          set(ENV_SLEPC_DIR ${SLEPC_DIR})
     1117         else()
     1118          set(ENV_SLEPC_DIR $ENV{SLEPC_DIR})
     1119        endif()
     1120        find_library(SLEPC_LIB slepc PATHS ${ENV_SLEPC_DIR}/${ENV_PETSC_ARCH}/lib
     1121                     NO_DEFAULT_PATH)
     1122        if(SLEPC_LIB)
     1123          find_path(SLEPC_INC "slepc.h" PATHS ${ENV_SLEPC_DIR} PATH_SUFFIXES include
     1124                    ${ENV_PETSC_ARCH}/include include/slepc NO_DEFAULT_PATH)
     1125          if(SLEPC_INC)
     1126            message(STATUS "Using SLEPc dir: ${ENV_SLEPC_DIR}")
     1127            set_config_option(HAVE_SLEPC "SLEPc")
     1128            list(APPEND EXTERNAL_LIBRARIES ${SLEPC_LIB})
     1129            list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC})
     1130            find_path(SLEPC_INC2 "slepcconf.h" PATHS ${ENV_SLEPC_DIR}
     1131                      PATH_SUFFIXES ${ENV_PETSC_ARCH}/include NO_DEFAULT_PATH)
     1132            if(SLEPC_INC2)
     1133              list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC2})
     1134            endif()
     1135          endif()
     1136        endif()
     1137      endif()
     1138      list(APPEND EXTERNAL_LIBRARIES ${PETSC_LIBS})
     1139      # find additional libraries to link with
     1140      string(REGEX MATCH "PACKAGES_LIBS = [^\n\r]*" PLIBS ${PETSC_VARIABLES})
     1141      if(PLIBS)
     1142        string(REPLACE "PACKAGES_LIBS = " "" PLIBS ${PLIBS})
     1143        string(STRIP ${PLIBS} PLIBS)
     1144        list(APPEND EXTERNAL_LIBRARIES "${PLIBS}")
     1145      endif()
     1146      string(REGEX MATCH "PETSC_EXTERNAL_LIB_BASIC = [^\n\r]*" PLIBS_BASIC ${PETSC_VARIABLES})
     1147      if(PLIBS_BASIC)
     1148        string(REPLACE "PETSC_EXTERNAL_LIB_BASIC = " "" PLIBS_BASIC ${PLIBS_BASIC})
     1149        string(STRIP ${PLIBS_BASIC} PLIBS_BASIC)
     1150        separate_arguments(PLIBS_BASIC)
     1151        list(APPEND EXTERNAL_LIBRARIES "${PLIBS_BASIC}")
     1152      endif()
     1153      string(REGEX MATCH "PCC_LINKER_LIBS = [^\n\r]*" LLIBS ${PETSC_VARIABLES})
     1154      if(LLIBS)
     1155        string(REPLACE "PCC_LINKER_LIBS = " "" LLIBS ${LLIBS})
     1156        string(STRIP ${LLIBS} LLIBS)
     1157        list(APPEND EXTERNAL_LIBRARIES "${LLIBS}")
     1158      endif()
     1159    else()
     1160      # new-style PETSc installations (in standard system directories)
     1161      find_library(PETSC_LIBS petsc)
     1162      find_path(PETSC_INC "petsc.h" PATH_SUFFIXES include/petsc)
     1163      if(PETSC_LIBS AND PETSC_INC)
     1164        set_config_option(HAVE_PETSC "PETSc")
     1165        if(ENABLE_SLEPC)
     1166          find_library(SLEPC_LIB slepc)
     1167          find_path(SLEPC_INC "slepc.h" PATH_SUFFIXES include/slepc)
     1168          if(SLEPC_LIB AND SLEPC_INC)
     1169            set_config_option(HAVE_SLEPC "SLEPc")
     1170            list(APPEND EXTERNAL_LIBRARIES ${SLEPC_LIB})
     1171            list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC})
     1172          endif()
     1173        endif()
     1174        list(APPEND EXTERNAL_LIBRARIES ${PETSC_LIBS})
     1175        list(APPEND EXTERNAL_INCLUDES ${PETSC_INC})
     1176      endif()
     1177    endif()
     1178  endif()
     1179
     1180  if(ENABLE_MUMPS AND HAVE_BLAS AND HAVE_LAPACK)
     1181    set(MUMPS_LIBS_REQUIRED smumps dmumps cmumps zmumps mumps_common pord)
     1182    if(NOT ENABLE_MPI)
     1183      list(APPEND MUMPS_LIBS_REQUIRED mpiseq)
     1184    endif()
     1185    find_all_libraries(MUMPS_LIBRARIES MUMPS_LIBS_REQUIRED "" "lib")
     1186    find_path(SMUMPS_INC "smumps_c.h" PATH_SUFFIXES src include)
     1187    find_path(DMUMPS_INC "dmumps_c.h" PATH_SUFFIXES src include)
     1188    find_path(CMUMPS_INC "cmumps_c.h" PATH_SUFFIXES src include)
     1189    find_path(ZMUMPS_INC "zmumps_c.h" PATH_SUFFIXES src include)
     1190    if(MUMPS_LIBRARIES AND SMUMPS_INC AND DMUMPS_INC AND CMUMPS_INC AND ZMUMPS_INC)
     1191      set_config_option(HAVE_MUMPS "MUMPS")
     1192      list(APPEND EXTERNAL_LIBRARIES ${MUMPS_LIBRARIES})
     1193      list(APPEND EXTERNAL_INCLUDES ${SMUMPS_INC})
     1194      list(APPEND EXTERNAL_INCLUDES ${DMUMPS_INC})
     1195      list(APPEND EXTERNAL_INCLUDES ${CMUMPS_INC})
     1196      list(APPEND EXTERNAL_INCLUDES ${ZMUMPS_INC})
     1197      find_library(GFORTRAN_LIB gfortran)
     1198      if(GFORTRAN_LIB)
     1199        list(APPEND EXTERNAL_LIBRARIES ${GFORTRAN_LIB})
     1200      endif()
     1201      if(ENABLE_GMM) # use GMM/MUMPS interface
     1202        add_definitions(-DGMM_USES_MUMPS)
     1203      endif()
     1204    endif()
     1205  endif()
     1206
     1207  if(ENABLE_GETDP)
     1208    find_library(GETDP_LIB GetDP)
     1209    find_path(GETDP_INC "GetDP.h" PATH_SUFFIXES getdp)
     1210    if(GETDP_LIB AND GETDP_INC)
     1211      set_config_option(HAVE_GETDP "GetDP")
     1212      list(APPEND EXTERNAL_LIBRARIES ${GETDP_LIB})
     1213      list(APPEND EXTERNAL_INCLUDES ${GETDP_INC})
     1214    endif()
     1215  endif()
     1216endif()
     1217
     1218if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt AND ENABLE_HXT)
     1219  add_subdirectory(contrib/hxt)
     1220  include_directories(BEFORE ${HXT_INC_DIRS})
     1221  set_config_option(HAVE_HXT "Hxt")
     1222  # do not use arithmetic contraction in predicates.c
     1223  if(MSVC OR (CMAKE_C_COMPILER_ID STREQUAL "Intel" AND WIN32))
     1224    set_source_files_properties(
     1225        "${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt/predicates/src/predicates.c"
     1226        PROPERTIES COMPILE_FLAGS "/fp:strict")
     1227  elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel")
     1228    set_source_files_properties(
     1229        "${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt/predicates/src/predicates.c"
     1230        PROPERTIES COMPILE_FLAGS "-fp-model strict")
     1231  elseif(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
     1232    set_source_files_properties(
     1233        "${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt/predicates/src/predicates.c"
     1234        PROPERTIES COMPILE_FLAGS  "-fno-unsafe-math-optimizations -ffp-contract=off")
     1235  else()
     1236    message(WARNING
     1237      "Unsupported compiler !
     1238       Make sure compiled functions from predicates.c
     1239       do NOT use extended double precision and follow IEEE754 standard.
     1240       It is crucial for the robustness of geometric predicates.")
     1241  endif()
     1242endif()
     1243
     1244if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/pro AND ENABLE_PRO)
     1245  add_subdirectory(pro)
     1246endif()
     1247
     1248if(ENABLE_OCC)
     1249  set(OCC_MINIMAL_VERSION "6.9.1")
     1250  if(WIN32)
     1251    if(HAVE_64BIT_SIZE_T)
     1252      set(OCC_SYS_NAME win64)
     1253    else()
     1254      set(OCC_SYS_NAME win32)
     1255    endif()
     1256  else()
     1257    set(OCC_SYS_NAME ${CMAKE_SYSTEM_NAME})
     1258  endif()
     1259  find_path(OCC_INC "Standard_Version.hxx" HINTS ENV CASROOT PATH_SUFFIXES
     1260            inc include include/oce opencascade include/opencascade
     1261            occt include/occt)
     1262  if(OCC_INC)
     1263    file(STRINGS ${OCC_INC}/Standard_Version.hxx
     1264         OCC_MAJOR REGEX "#define OCC_VERSION_MAJOR.*")
     1265    file(STRINGS ${OCC_INC}/Standard_Version.hxx
     1266         OCC_MINOR REGEX "#define OCC_VERSION_MINOR.*")
     1267    file(STRINGS ${OCC_INC}/Standard_Version.hxx
     1268         OCC_MAINT REGEX "#define OCC_VERSION_MAINTENANCE.*")
     1269    if(OCC_MAJOR AND OCC_MINOR AND OCC_MAINT)
     1270      string(REGEX MATCH "[0-9]+" OCC_MAJOR "${OCC_MAJOR}")
     1271      string(REGEX MATCH "[0-9]+" OCC_MINOR "${OCC_MINOR}")
     1272      string(REGEX MATCH "[0-9]+" OCC_MAINT "${OCC_MAINT}")
     1273      set(OCC_VERSION "${OCC_MAJOR}.${OCC_MINOR}.${OCC_MAINT}")
     1274      message(STATUS "Found OpenCASCADE version ${OCC_VERSION} in ${OCC_INC}")
     1275    endif()
     1276  endif()
     1277  if(OCC_VERSION AND OCC_VERSION STRLESS ${OCC_MINIMAL_VERSION})
     1278    message(WARNING "Gmsh requires OpenCASCADE >= ${OCC_MINIMAL_VERSION}. "
     1279        "Use CMAKE_PREFIX_PATH or the CASROOT environment variable "
     1280        "to explicitely specify the installation path of OpenCASCADE")
     1281  elseif(OCC_INC)
     1282    set(OCC_LIBS_REQUIRED
     1283        # subset of DataExchange
     1284        TKSTEP TKSTEP209 TKSTEPAttr TKSTEPBase TKIGES TKXSBase
     1285        # ModelingAlgorithms
     1286        TKOffset TKFeat TKFillet TKBool TKMesh TKHLR TKBO TKPrim TKShHealing
     1287        TKTopAlgo TKGeomAlgo
     1288        # ModelingData
     1289        TKBRep TKGeomBase TKG3d TKG2d
     1290        # FoundationClasses
     1291        TKMath TKernel)
     1292    if(ENABLE_OCC_TBB)
     1293      list(APPEND OCC_LIBS_REQUIRED tbb tbbmalloc)
     1294    endif()
     1295    list(LENGTH OCC_LIBS_REQUIRED NUM_OCC_LIBS_REQUIRED)
     1296    if(OCC_LIBS)
     1297      message(STATUS "OCC libraries specified explicitly: " ${OCC_LIBS})
     1298      list(LENGTH OCC_LIBS_REQUIRED NUM_OCC_LIBS)
     1299    else()
     1300      set(OCC_LIBS)
     1301      foreach(OCC ${OCC_LIBS_REQUIRED})
     1302        find_library(OCC_LIB ${OCC} HINTS ENV CASROOT PATH_SUFFIXES
     1303                     lib ${OCC_SYS_NAME}/lib ${OCC_SYS_NAME}/vc8/lib
     1304                     ${OCC_SYS_NAME}/gcc/lib ${OCC_SYS_NAME}/gcc/bin)
     1305        if(OCC_LIB)
     1306          list(APPEND OCC_LIBS ${OCC_LIB})
     1307        else()
     1308          message(STATUS "OCC lib " ${OCC} " not Found")
     1309        endif()
     1310        unset(OCC_LIB CACHE)
     1311      endforeach()
     1312      list(LENGTH OCC_LIBS NUM_OCC_LIBS)
     1313    endif()
     1314  endif()
     1315
     1316  # additional OCC libraries to handle reading of STEP/IGES attributes. Oh my...
     1317  if(ENABLE_OCC_CAF)
     1318    find_package(Freetype)
     1319    if(FREETYPE_FOUND)
     1320      set(OCC_CAF_LIBS_REQUIRED
     1321          TKXDESTEP TKXDEIGES TKXCAF TKLCAF TKVCAF TKCAF TKV3d TKService TKCDF)
     1322      list(LENGTH OCC_CAF_LIBS_REQUIRED NUM_OCC_CAF_LIBS_REQUIRED)
     1323      set(OCC_CAF_LIBS)
     1324      foreach(OCC ${OCC_CAF_LIBS_REQUIRED})
     1325        find_library(OCC_CAF_LIB ${OCC} HINTS ENV CASROOT PATH_SUFFIXES
     1326                     lib ${OCC_SYS_NAME}/lib ${OCC_SYS_NAME}/vc8/lib
     1327                     ${OCC_SYS_NAME}/gcc/lib ${OCC_SYS_NAME}/gcc/bin)
     1328        if(OCC_CAF_LIB)
     1329          list(APPEND OCC_CAF_LIBS ${OCC_CAF_LIB})
     1330        else()
     1331          message(STATUS "OCC CAF lib " ${OCC} " not Found")
     1332        endif()
     1333        unset(OCC_CAF_LIB CACHE)
     1334      endforeach()
     1335      list(LENGTH OCC_CAF_LIBS NUM_OCC_CAF_LIBS)
     1336    endif()
     1337  endif()
     1338
     1339  if(NUM_OCC_LIBS EQUAL NUM_OCC_LIBS_REQUIRED)
     1340    # append OCC CAF libraries first...
     1341    if(NUM_OCC_CAF_LIBS EQUAL NUM_OCC_CAF_LIBS_REQUIRED)
     1342      set_config_option(HAVE_OCC_CAF "OpenCASCADE-CAF")
     1343      list(APPEND EXTERNAL_LIBRARIES ${OCC_CAF_LIBS} ${FREETYPE_LIBRARIES})
     1344      list(APPEND EXTERNAL_INCLUDES ${FREETYPE_INCLUDE_DIRS})
     1345      if(WIN32)
     1346        list(APPEND EXTERNAL_LIBRARIES "windowscodecs")
     1347        list(APPEND EXTERNAL_LIBRARIES "ole32")
     1348      endif()
     1349    endif()
     1350    # then append OCC libraries
     1351    set_config_option(HAVE_OCC "OpenCASCADE")
     1352    list(APPEND EXTERNAL_LIBRARIES ${OCC_LIBS})
     1353    list(APPEND EXTERNAL_INCLUDES ${OCC_INC})
     1354    if(HAVE_64BIT_SIZE_T)
     1355      add_definitions(-D_OCC64)
     1356    endif()
     1357    if(WIN32)
     1358      list(APPEND EXTERNAL_LIBRARIES "winspool")
     1359      add_definitions(-DOCC_CONVERT_SIGNALS)
     1360    elseif(MSVC)
     1361      add_definitions(-DWNT)
     1362    endif()
     1363  endif()
     1364endif()
     1365
     1366if(ENABLE_ZIPPER)
     1367  if(ENABLE_BUILD_IOS)
     1368    set_config_option(HAVE_LIBZ "Zlib")
     1369  endif()
     1370  if(NOT HAVE_LIBZ) # necessary for non-GUI builds
     1371    find_package(ZLIB)
     1372    if(ZLIB_FOUND)
     1373      set_config_option(HAVE_LIBZ "Zlib")
     1374      list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
     1375      list(APPEND EXTERNAL_INCLUDES ${ZLIB_INCLUDE_DIR})
     1376    endif()
     1377  endif()
     1378  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/zipper AND HAVE_LIBZ)
     1379    add_subdirectory(contrib/zipper)
     1380    include_directories(contrib/zipper)
     1381    set_config_option(HAVE_ZIPPER "Zipper")
     1382  endif()
     1383endif()
     1384
     1385if(ENABLE_PRIVATE_API AND ENABLE_WRAP_PYTHON)
     1386  find_package(SWIG REQUIRED)
     1387  include(${SWIG_USE_FILE})
     1388  find_package(PythonLibs)
     1389  if(SWIG_FOUND AND PYTHONLIBS_FOUND)
     1390    message(STATUS "Found SWIG version " ${SWIG_VERSION})
     1391    find_package(PythonInterp)
     1392    string(SUBSTRING ${SWIG_VERSION} 0 1 SWIG_MAJOR_VERSION)
     1393    if(SWIG_MAJOR_VERSION EQUAL 1)
     1394      message(WARNING "Python bindings require SWIG >= 2: disabling Python")
     1395    else()
     1396      set_config_option(HAVE_PYTHON "Python")
     1397      mark_as_advanced(CLEAR PYTHON_LIBRARY PYTHON_INCLUDE_DIR)
     1398      if(ENABLE_NUMPY)
     1399        if (NOT NUMPY_INC)
     1400          EXEC_PROGRAM (${PYTHON_EXECUTABLE}
     1401            ARGS "-c \"import numpy; print(numpy.get_include())\""
     1402            OUTPUT_VARIABLE NUMPY_INC
     1403            RETURN_VALUE NUMPY_NOT_FOUND)
     1404        endif()
     1405        if(NUMPY_INC)
     1406          list(APPEND EXTERNAL_INCLUDES ${NUMPY_INC})
     1407          set_config_option(HAVE_NUMPY "Numpy")
     1408        endif()
     1409      endif()
     1410      if(HAVE_PETSC)
     1411        if(ENABLE_PETSC4PY)
     1412          EXECUTE_PROCESS(
     1413            COMMAND ${PYTHON_EXECUTABLE} -c "import petsc4py; print(petsc4py.get_include())"
     1414            OUTPUT_VARIABLE PETSC4PY_INC
     1415            RESULT_VARIABLE PETSC4PY_NOT_FOUND
     1416            ERROR_QUIET
     1417            OUTPUT_STRIP_TRAILING_WHITESPACE)
     1418          if(PETSC4PY_INC)
     1419            list(APPEND EXTERNAL_INCLUDES ${PETSC4PY_INC})
     1420            set_config_option(HAVE_PETSC4PY "PETSc4py")
     1421          endif()
     1422        endif()
     1423      endif()
     1424    endif()
     1425  endif()
     1426endif()
     1427
     1428check_function_exists(vsnprintf HAVE_VSNPRINTF)
     1429if(NOT HAVE_VSNPRINTF AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
     1430  set_config_option(HAVE_NO_VSNPRINTF "NoVsnprintf")
     1431endif()
     1432
     1433check_include_file(sys/socket.h HAVE_SYS_SOCKET_H)
     1434if(HAVE_SYS_SOCKET_H)
     1435  set(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h)
     1436endif()
     1437check_type_size(socklen_t SOCKLEN_T_SIZE)
     1438set(CMAKE_EXTRA_INCLUDE_FILES)
     1439if(NOT SOCKLEN_T_SIZE AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
     1440  set_config_option(HAVE_NO_SOCKLEN_T "NoSocklenT")
     1441endif()
     1442
     1443check_include_file(stdint.h HAVE_STDINT_H)
     1444if(HAVE_STDINT_H)
     1445  set(CMAKE_EXTRA_INCLUDE_FILES stdint.h)
     1446else()
     1447  set_config_option(HAVE_NO_STDINT_H "NoStdintH")
     1448endif()
     1449check_type_size(intptr_t INTPTR_T_SIZE)
     1450set(CMAKE_EXTRA_INCLUDE_FILES)
     1451if(NOT INTPTR_T_SIZE AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
     1452  set_config_option(HAVE_NO_INTPTR_T "NoIntptrT")
     1453endif()
     1454
     1455check_include_file(dlfcn.h DLFCN_H)
     1456if(DLFCN_H)
     1457  set_config_option(HAVE_DLOPEN "Dlopen")
     1458  list(APPEND EXTERNAL_LIBRARIES ${CMAKE_DL_LIBS})
     1459endif()
     1460
     1461if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
     1462  check_include_file(linux/joystick.h LINUX_JOYSTICK_H)
     1463  if(LINUX_JOYSTICK_H)
     1464    set_config_option(HAVE_LINUX_JOYSTICK "LinuxJoystick")
     1465  endif()
     1466endif()
     1467
     1468if(WIN32)
     1469  add_definitions(-D_USE_MATH_DEFINES)
     1470  list(APPEND EXTERNAL_LIBRARIES winmm wsock32 ws2_32 psapi)
     1471endif()
     1472
     1473if(MSVC)
     1474  add_definitions(-DNOMINMAX -D_CRT_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_DEPRECATE)
     1475endif()
     1476
     1477# add C functions API
     1478set(GMSH_SRC ${GMSH_SRC};api/gmshc.cpp)
     1479
     1480# force full warnings to encourage everybody to write clean(er) code
     1481check_cxx_compiler_flag("-Wall" WALL)
     1482if(WALL AND NOT MSVC)
     1483  file(GLOB_RECURSE WALL_SRC Common/*.cpp Fltk/*.cpp FunctionSpace/*.cpp
     1484       Geo/*.cpp Graphics/*.cpp Mesh/*.cpp Numeric/*.cpp Parser/*.cpp
     1485       Plugin/*.cpp Post/*.cpp Solver/*.cpp)
     1486  set(WF "-Wall")
     1487  check_cxx_compiler_flag("-Wint-to-void-pointer-cast" WCAST)
     1488  if(WCAST)
     1489    set(WF "${WF} -Wno-int-to-void-pointer-cast")
     1490  endif()
     1491  check_cxx_compiler_flag("-Wdeprecated-declarations" WDEPREC)
     1492  if(WDEPREC)
     1493    # FIXME: remove this when we have fixed the deprecated GLU code for OpenGL3
     1494    set(WF "${WF} -Wno-deprecated-declarations")
     1495  endif()
     1496  check_cxx_compiler_flag("-Wmisleading-indentation" WIND)
     1497  if(WIND)
     1498    set(WF "${WF} -Wno-misleading-indentation")
     1499  endif()
     1500  check_cxx_compiler_flag("-Wno-attributes" WATTR)
     1501  if(WATTR)
     1502    # FIXME: remove this when GCC behaves more intelligently
     1503    set(WF "${WF} -Wno-attributes")
     1504  endif()
     1505  set_compile_flags(WALL_SRC ${WF})
     1506endif()
     1507
     1508# don't issue warnings for contributed libraries
     1509check_cxx_compiler_flag("-w" NOWARN)
     1510if(NOWARN)
     1511  file(GLOB_RECURSE NOWARN_SRC contrib/*.cpp contrib/*.cc contrib/*.cxx contrib/*.c)
     1512  set_compile_flags(NOWARN_SRC "-w")
     1513endif()
     1514
     1515# disable compile optimization on some known problematic files
     1516check_cxx_compiler_flag("-O0" NOOPT)
     1517if(NOOPT OR ENABLE_BUILD_IOS)
     1518  if(ENABLE_BUILD_IOS) # optimized iOS 10 64 bits screws somewhere in Geo
     1519    file(GLOB_RECURSE NOOPT_SRC Numeric/robustPredicates.cpp Geo/G*.cpp Mesh/BDS.cpp
     1520         Parser/Gmsh.tab.cpp contrib/blossom/* Mesh/Background*)
     1521  else()
     1522    file(GLOB_RECURSE NOOPT_SRC Numeric/robustPredicates.cpp Mesh/BDS.cpp
     1523         Parser/Gmsh.tab.cpp contrib/blossom/* contrib/bamg/* Mesh/Background*)
     1524  endif()
     1525  set_compile_flags(NOOPT_SRC "-O0")
     1526endif()
     1527
     1528# do not use arithmetic contraction in predicates.cpp
     1529# if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
     1530#   set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
     1531#     COMPILE_FLAGS "/fp:strict")
     1532# elseif(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
     1533#   set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
     1534#     COMPILE_FLAGS "-fno-unsafe-math-optimizations -ffp-contract=off")
     1535# elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel")
     1536#   set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
     1537#     COMPILE_FLAGS "-fp-model strict")
     1538# endif()
     1539
     1540# enable Revoropt and set compile flags for the corresponding plugin
     1541if(ENABLE_REVOROPT)
     1542  if(HAVE_EIGEN AND HAVE_MESH AND HAVE_PLUGINS AND HAVE_ANN AND HAVE_ALGLIB)
     1543    list(APPEND EXTERNAL_INCLUDES contrib/Revoropt/include)
     1544    set_config_option(HAVE_REVOROPT "Revoropt")
     1545    add_definitions(-DUSE_ANN)
     1546  else()
     1547    message(WARNING "Revoropt requires Eigen, Mesh, Plugins, ANN and ALGLIB")
     1548  endif()
     1549endif()
     1550
     1551if(HAVE_MESH AND NOT HAVE_EIGEN AND NOT HAVE_LAPACK)
     1552  message(WARNING "Most meshing algorithms will not be functional without "
     1553          "Eigen or Lapack")
     1554endif()
     1555
     1556list(SORT CONFIG_OPTIONS)
     1557set(GMSH_CONFIG_OPTIONS "")
     1558foreach(OPT ${CONFIG_OPTIONS})
     1559  set(GMSH_CONFIG_OPTIONS "${GMSH_CONFIG_OPTIONS} ${OPT}")
     1560endforeach()
     1561
     1562configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Common/GmshConfig.h.in
     1563               ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshConfig.h)
     1564configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Common/GmshVersion.h.in
     1565               ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshVersion.h)
     1566
     1567# the texi and pypi version files are modified in the source directory (not
     1568# ideal for version.texi, but since git tracks the contents of the file this is
     1569# acceptable as it will only change when the actual version is changed - not for
     1570# each git hash; setup.py is not under version control)
     1571configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo/version.texi.in
     1572               ${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo/version.texi)
     1573configure_file(${CMAKE_CURRENT_SOURCE_DIR}/utils/pypi/gmsh/setup.py.in
     1574               ${CMAKE_CURRENT_SOURCE_DIR}/utils/pypi/gmsh/setup.py)
     1575configure_file(${CMAKE_CURRENT_SOURCE_DIR}/utils/pypi/gmsh-dev/setup.py.in
     1576               ${CMAKE_CURRENT_SOURCE_DIR}/utils/pypi/gmsh-dev/setup.py)
     1577
     1578file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/version.txt ${GMSH_SHORT_VERSION})
     1579
     1580# process cmake environment variables so we can append them to the -I include
     1581# commands. This is not recommended (we should only use the cache variables) but
     1582# it is very convenient: otherwise we have to remember providing the
     1583# -D... options to cmake for each new build.
     1584set(ENV_CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH})
     1585set(ENV_CMAKE_INCLUDE_PATH $ENV{CMAKE_INCLUDE_PATH})
     1586if(UNIX)
     1587  if(ENV_CMAKE_PREFIX_PATH)
     1588    string(REPLACE ":" ";" ENV_CMAKE_PREFIX_PATH ${ENV_CMAKE_PREFIX_PATH})
     1589  endif()
     1590  if(ENV_CMAKE_INCLUDE_PATH)
     1591    string(REPLACE ":" ";" ENV_CMAKE_INCLUDE_PATH ${ENV_CMAKE_INCLUDE_PATH})
     1592  endif()
     1593endif()
     1594list(APPEND EXTERNAL_INCLUDES ${CMAKE_INCLUDE_PATH} ${ENV_CMAKE_INCLUDE_PATH})
     1595list(APPEND EXTERNAL_INCLUDES ${CMAKE_PREFIX_PATH} ${ENV_CMAKE_PREFIX_PATH})
     1596foreach(DIR ${CMAKE_PREFIX_PATH} ${ENV_CMAKE_PREFIX_PATH})
     1597  list(APPEND EXTERNAL_INCLUDES ${DIR}/include)
     1598endforeach()
     1599
     1600if(EXTERNAL_INCLUDES)
     1601  list(REMOVE_DUPLICATES EXTERNAL_INCLUDES)
     1602endif()
     1603
     1604if(HAVE_FLTK)
     1605  set(LINK_LIBRARIES ${FLTK_LIBRARIES} ${EXTERNAL_LIBRARIES}
     1606                     ${OPENGL_LIBRARIES} ${LAPACK_LIBRARIES})
     1607elseif(HAVE_OPENGL)
     1608  set(LINK_LIBRARIES ${EXTERNAL_LIBRARIES} ${OPENGL_LIBRARIES}
     1609                     ${LAPACK_LIBRARIES})
     1610else()
     1611  set(LINK_LIBRARIES ${EXTERNAL_LIBRARIES} ${LAPACK_LIBRARIES})
     1612endif()
     1613
     1614# try to use static gfortran on static builds (cannot do this on dynamic builds
     1615# as e.g. Debian compiles libgfortran.a without -fPIC: sigh...)
     1616if(NOT ENABLE_BUILD_DYNAMIC AND NOT ENABLE_BUILD_SHARED)
     1617  find_library(GFORTRAN_STATIC libgfortran.a)
     1618  if(GFORTRAN_STATIC)
     1619    set(CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES)
     1620    message(STATUS "Using static libgfortran")
     1621    foreach(STR ${LINK_LIBRARIES})
     1622      string(REPLACE "-lgfortran" ${GFORTRAN_STATIC} STR2 ${STR})
     1623      list(APPEND LINK_LIBRARIES2 ${STR2})
     1624    endforeach()
     1625    set(LINK_LIBRARIES ${LINK_LIBRARIES2})
     1626  endif()
     1627endif()
     1628
     1629# Linux-specific linker options
     1630if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
     1631  if(HAVE_OCC)
     1632    find_library(RT_LIB rt)
     1633    if(RT_LIB)
     1634      list(APPEND LINK_LIBRARIES ${RT_LIB})
     1635    endif()
     1636  endif()
     1637  if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Intel")
     1638    add_definitions(-fPIC)
     1639  endif()
     1640endif()
     1641
     1642# we could specify include dirs more selectively, but this is simpler
     1643include_directories(Common Fltk Geo Graphics Mesh Solver Numeric Parser
     1644  Plugin Post api ${EXTERNAL_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR}/Common)
     1645
     1646# set this for external codes that might include this CMakeList file
     1647set(GMSH_EXTERNAL_INCLUDE_DIRS ${EXTERNAL_INCLUDES} CACHE
     1648    STRING "External include directories" FORCE)
     1649set(GMSH_EXTERNAL_LIBRARIES ${LINK_LIBRARIES} CACHE
     1650    STRING "External libraries" FORCE)
     1651
     1652# group sources for easier navigation in IDEs
     1653foreach(DIR ${GMSH_DIRS})
     1654  string(REGEX REPLACE "\\+" "\\\\+" DIR ${DIR})
     1655  source_group(${DIR} REGULAR_EXPRESSION ${DIR}/.*)
     1656endforeach()
     1657
     1658# static library target
     1659if(ENABLE_BUILD_LIB)
     1660  add_library(lib STATIC ${GMSH_SRC})
     1661  set_target_properties(lib PROPERTIES OUTPUT_NAME gmsh)
     1662  if(MSVC)
     1663    set_target_properties(lib PROPERTIES DEBUG_POSTFIX d)
     1664    if(ENABLE_MSVC_STATIC_RUNTIME)
     1665      set_target_properties(lib PROPERTIES LINK_FLAGS_RELEASE "/nodefaultlib:LIBCMT")
     1666    endif()
     1667  endif()
     1668endif()
     1669
     1670# shared library target
     1671if(ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
     1672  add_library(shared SHARED ${GMSH_SRC})
     1673  set_target_properties(shared PROPERTIES OUTPUT_NAME gmsh
     1674     VERSION ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}.${GMSH_PATCH_VERSION}
     1675     SOVERSION ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION})
     1676  if(WIN32)
     1677    set_target_properties(shared PROPERTIES PREFIX "" IMPORT_PREFIX ""
     1678      IMPORT_SUFFIX ".lib" COMPILE_FLAGS "-DGMSH_DLL -DGMSH_DLL_EXPORT")
     1679  endif()
     1680  target_link_libraries(shared ${LINK_LIBRARIES})
     1681  # don't define LC_RPATH in dylib for development, to not get endless warnings
     1682  # about code signing
     1683  if(APPLE AND NOT GMSH_RELEASE)
     1684    set_target_properties(shared PROPERTIES INSTALL_RPATH "")
     1685  endif()
     1686  if(MSVC AND ENABLE_MSVC_STATIC_RUNTIME)
     1687    message(STATUS "Note: By enabling ENABLE_MSVC_STATIC_RUNTIME, shared library "
     1688            "won't link. In MSVC change /MT to /MD in the shared project properties")
     1689  endif()
     1690endif()
     1691
     1692# binary targets
     1693if(HAVE_FLTK)
     1694  if(ENABLE_BUILD_DYNAMIC)
     1695    add_executable(gmsh WIN32 Common/Main.cpp)
     1696    target_link_libraries(gmsh shared)
     1697  else()
     1698    add_executable(gmsh WIN32 Common/Main.cpp ${GMSH_SRC})
     1699  endif()
     1700  # we could add this to create a minimal app bundle even without install
     1701  # if(APPLE AND NOT ENABLE_OS_SPECIFIC_INSTALL)
     1702  #  set_target_properties(gmsh PROPERTIES MACOSX_BUNDLE ON
     1703  #    MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_dev.plist)
     1704  # endif()
     1705else()
     1706  if(ENABLE_BUILD_DYNAMIC)
     1707    add_executable(gmsh Common/Main.cpp)
     1708    target_link_libraries(gmsh shared)
     1709  else()
     1710    add_executable(gmsh Common/Main.cpp ${GMSH_SRC})
     1711  endif()
     1712endif()
     1713target_link_libraries(gmsh ${LINK_LIBRARIES})
     1714
     1715# Windows specific linker options
     1716if(WIN32 AND NOT MSVC)
     1717  set(FLAGS "-Wl,--stack,16777216 -static -municode")
     1718  if(HAVE_FLTK)
     1719    set(FLAGS "${FLAGS} -mwindows")
     1720  else()
     1721    set(FLAGS "${FLAGS} -mconsole")
     1722  endif()
     1723  if(HAVE_64BIT_SIZE_T)
     1724    set(FLAGS "${FLAGS} \"${CMAKE_CURRENT_SOURCE_DIR}/Fltk/Win64Icon.res\"")
     1725  else()
     1726    set(FLAGS "${FLAGS} \"${CMAKE_CURRENT_SOURCE_DIR}/Fltk/Win32Icon.res\"")
     1727  endif()
     1728  set_target_properties(gmsh PROPERTIES LINK_FLAGS "${FLAGS}")
     1729  if(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
     1730    set_target_properties(shared PROPERTIES LINK_FLAGS -static)
     1731  endif()
     1732  # remove -Wl,-Bdynamic flags
     1733  set(CMAKE_EXE_LINK_DYNAMIC_C_FLAGS)
     1734  set(CMAKE_EXE_LINK_DYNAMIC_CXX_FLAGS)
     1735elseif(MSVC)
     1736  set_target_properties(gmsh PROPERTIES LINK_FLAGS "/STACK:16777216 /SAFESEH:NO")
     1737endif()
     1738
     1739# android target
     1740if(ENABLE_BUILD_ANDROID)
     1741  find_file(CMAKE_TOOLCHAIN_FILE "android.toolchain.cmake")
     1742  if(NOT CMAKE_TOOLCHAIN_FILE)
     1743    message(FATAL_ERROR "Cannot compile Gmsh for android without android-cmake")
     1744  endif()
     1745  add_definitions(-D_GLIBCXX_USE_C99_MATH=1)
     1746  set(CMAKE_BUILD_TYPE Release)
     1747  set(LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_CURRENT_BINARY_DIR})
     1748  set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/libs/)
     1749  add_definitions(-DBUILD_ANDROID)
     1750  add_definitions(-DPICOJSON_USE_LOCALE=0)
     1751  add_library(androidGmsh SHARED ${GMSH_SRC})
     1752  set_target_properties(androidGmsh PROPERTIES OUTPUT_NAME gmsh)
     1753  target_link_libraries(androidGmsh ${EXTERNAL_LIBRARIES} ${LAPACK_LIBRARIES})
     1754  add_custom_command(TARGET androidGmsh POST_BUILD COMMAND
     1755                     ${CMAKE_STRIP} ${LIBRARY_OUTPUT_PATH}/libgmsh.so)
     1756endif()
     1757
     1758# parser target
     1759find_program(BISON bison)
     1760find_program(FLEX flex)
     1761if(BISON AND FLEX)
     1762  add_custom_target(parser
     1763                    COMMAND ${BISON} -p gmsh_yy --output Gmsh.tab.cpp -d Gmsh.y
     1764                    COMMAND ${FLEX} -P gmsh_yy -o Gmsh.yy.cpp Gmsh.l
     1765                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Parser)
     1766endif()
     1767
     1768if(UNIX)
     1769  # cannot use cmake's file search functions here (they would only find files
     1770  # existing at configuration time)
     1771  add_custom_target(purge
     1772                    COMMAND rm -f `find . -name *~ -o -name *~~`
     1773                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
     1774  add_custom_target(etags
     1775                    COMMAND etags `find . -name *.cpp -o -name *.h -o -name *.y`
     1776                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
     1777endif()
     1778
     1779if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
     1780   CMAKE_CXX_COMPILER_ID MATCHES "Clang")
     1781  execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion
     1782                  OUTPUT_VARIABLE CXX_COMPILER_VERSION
     1783                  OUTPUT_STRIP_TRAILING_WHITESPACE)
     1784else()
     1785  set(CXX_COMPILER_VERSION "Unknown")
     1786endif()
     1787
     1788set(WELCOME_FILE ${CMAKE_CURRENT_SOURCE_DIR}/doc/WELCOME.txt)
     1789set(SDK_FILE ${CMAKE_CURRENT_SOURCE_DIR}/doc/SDK.txt)
     1790set(LICENSE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt)
     1791set(CREDITS_FILE ${CMAKE_CURRENT_SOURCE_DIR}/CREDITS.txt)
     1792set(CHANGELOG_FILE ${CMAKE_CURRENT_SOURCE_DIR}/CHANGELOG.txt)
     1793file(GLOB TUTORIAL_GEO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/?*.*)
     1794file(GLOB TUTORIAL_CPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/c++/?*.*)
     1795file(GLOB TUTORIAL_C_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/c/?*.*)
     1796file(GLOB TUTORIAL_PY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/python/?*.*)
     1797file(GLOB TUTORIAL_JL_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/julia/?*.*)
     1798file(GLOB DEMOS ${CMAKE_CURRENT_SOURCE_DIR}/demos/*)
     1799foreach(SUBDIR ${DEMOS})
     1800  if(IS_DIRECTORY ${SUBDIR})
     1801    list(APPEND DEMOS_DIRS ${SUBDIR})
     1802  endif()
     1803endforeach()
     1804set(TEX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo)
     1805file(GLOB TEX_SRC ${TEX_DIR}/*.texi)
     1806set(TEX_OBJ ${TEX_DIR}/gmsh.aux ${TEX_DIR}/gmsh.cp ${TEX_DIR}/gmsh.cps
     1807    ${TEX_DIR}/gmsh.fn ${TEX_DIR}/gmsh.html ${TEX_DIR}/gmsh.info ${TEX_DIR}/gmsh.ky
     1808    ${TEX_DIR}/gmsh.log ${TEX_DIR}/gmsh.pdf ${TEX_DIR}/gmsh.pg ${TEX_DIR}/gmsh.toc
     1809    ${TEX_DIR}/gmsh.tp ${TEX_DIR}/gmsh.tps ${TEX_DIR}/gmsh.txt ${TEX_DIR}/gmsh.vr)
     1810
     1811macro(unix2dos VARNAME)
     1812  file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/unix2dos)
     1813  set(UNIX2DOS_FILES)
     1814  foreach(FILE ${${VARNAME}})
     1815    file(READ ${FILE} F0)
     1816    get_filename_component(N ${FILE} NAME)
     1817    if(CYGWIN)
     1818      string(REGEX REPLACE "\n" "\r\n" F1 "${F0}")
     1819      file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N} "${F1}")
     1820    else() # if not in Cygwin, cmake adds '\r's automatically
     1821      file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N} "${F0}")
     1822    endif()
     1823    list(APPEND UNIX2DOS_FILES ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N})
     1824  endforeach()
     1825  set(${VARNAME} ${UNIX2DOS_FILES})
     1826endmacro()
     1827
     1828if(WIN32)
     1829  if(ENABLE_OS_SPECIFIC_INSTALL)
     1830    set(GMSH_BIN .)
     1831    set(GMSH_LIB .)
     1832    set(GMSH_DOC .)
     1833    set(GMSH_MAN .)
     1834    set(GMSH_INC .)
     1835  else()
     1836    include(GNUInstallDirs)
     1837    set(GMSH_BIN ${CMAKE_INSTALL_BINDIR})
     1838    set(GMSH_LIB ${CMAKE_INSTALL_LIBDIR})
     1839    set(GMSH_DOC ${CMAKE_INSTALL_DOCDIR})
     1840    set(GMSH_MAN ${CMAKE_INSTALL_MANDIR}/man1)
     1841    set(GMSH_INC ${CMAKE_INSTALL_INCLUDEDIR})
     1842  endif()
     1843  if(CYGWIN)
     1844    unix2dos(GMSH_API)
     1845    if(ENABLE_PRIVATE_API)
     1846      unix2dos(GMSH_PRIVATE_API)
     1847    endif()
     1848    unix2dos(WELCOME_FILE)
     1849    unix2dos(SDK_FILE)
     1850    unix2dos(LICENSE_FILE)
     1851    unix2dos(CREDITS_FILE)
     1852    unix2dos(CHANGELOG_FILE)
     1853    unix2dos(TUTORIAL_GEO_FILES)
     1854    unix2dos(TUTORIAL_CPP_FILES)
     1855    unix2dos(TUTORIAL_C_FILES)
     1856    unix2dos(TUTORIAL_PY_FILES)
     1857    unix2dos(TUTORIAL_JL_FILES)
     1858    foreach(DIR ${DEMOS_DIRS})
     1859      file(GLOB DEMO_FILES ${DIR}/?*.*)
     1860      unix2dos(DEMO_FILES)
     1861    endforeach()
     1862  endif()
     1863elseif(APPLE AND ENABLE_OS_SPECIFIC_INSTALL)
     1864  # set these so that the files get installed nicely in the MacOSX
     1865  # .app bundle
     1866  set(GMSH_BIN ../MacOS)
     1867  set(GMSH_LIB ../MacOS)
     1868  set(GMSH_DOC ../../..)
     1869  set(GMSH_MAN ../../..)
     1870  set(GMSH_INC ../MacOS)
     1871else()
     1872  include(GNUInstallDirs)
     1873  set(GMSH_BIN ${CMAKE_INSTALL_BINDIR})
     1874  set(GMSH_LIB ${CMAKE_INSTALL_LIBDIR})
     1875  set(GMSH_DOC ${CMAKE_INSTALL_DOCDIR})
     1876  set(GMSH_MAN ${CMAKE_INSTALL_MANDIR}/man1)
     1877  set(GMSH_INC ${CMAKE_INSTALL_INCLUDEDIR})
     1878endif()
     1879
     1880# mark targets as optional so we can install them separately if needed
     1881# (e.g. "make lib" or "make shared" followed by "make install/fast")
     1882install(TARGETS gmsh DESTINATION ${GMSH_BIN} OPTIONAL)
     1883if(ENABLE_BUILD_LIB)
     1884  install(TARGETS lib DESTINATION ${GMSH_LIB} OPTIONAL)
     1885endif()
     1886if(ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
     1887  install(TARGETS shared DESTINATION ${GMSH_LIB} OPTIONAL)
     1888endif()
     1889
     1890if(ENABLE_ONELAB)
     1891  install(FILES ${ONELAB_PY} DESTINATION ${GMSH_BIN})
     1892endif()
     1893if(ENABLE_BUILD_LIB OR ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
     1894  install(FILES ${GMSH_API} DESTINATION ${GMSH_INC})
     1895  install(FILES ${GMSH_PY} DESTINATION ${GMSH_LIB})
     1896  install(FILES ${GMSH_JL} DESTINATION ${GMSH_LIB})
     1897  if(ENABLE_PRIVATE_API)
     1898    install(FILES ${GMSH_PRIVATE_API} DESTINATION ${GMSH_INC}/gmsh)
     1899  endif()
     1900endif()
     1901if(INSTALL_SDK_README)
     1902  configure_file(${SDK_FILE} ${CMAKE_CURRENT_BINARY_DIR}/README.txt)
     1903  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/README.txt DESTINATION .)
     1904endif()
     1905install(FILES ${WELCOME_FILE} DESTINATION ${GMSH_DOC} RENAME README.txt)
     1906install(FILES ${LICENSE_FILE} DESTINATION ${GMSH_DOC})
     1907install(FILES ${CREDITS_FILE} DESTINATION ${GMSH_DOC})
     1908install(FILES ${CHANGELOG_FILE} DESTINATION ${GMSH_DOC})
     1909install(FILES ${TUTORIAL_GEO_FILES} DESTINATION ${GMSH_DOC}/tutorial)
     1910install(FILES ${TUTORIAL_CPP_FILES} DESTINATION ${GMSH_DOC}/tutorial/c++)
     1911install(FILES ${TUTORIAL_C_FILES} DESTINATION ${GMSH_DOC}/tutorial/c)
     1912install(FILES ${TUTORIAL_PY_FILES} DESTINATION ${GMSH_DOC}/tutorial/python)
     1913install(FILES ${TUTORIAL_JL_FILES} DESTINATION ${GMSH_DOC}/tutorial/julia)
     1914foreach(DIR ${DEMOS_DIRS})
     1915  get_filename_component(DEMOS_DIR_NAME ${DIR} NAME)
     1916  file(GLOB DEMO_FILES ${DIR}/?*.*)
     1917  install(FILES ${DEMO_FILES} DESTINATION ${GMSH_DOC}/demos/${DEMOS_DIR_NAME})
     1918endforeach()
     1919if(UNIX AND NOT CYGWIN)
     1920  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/doc/gmsh.1 DESTINATION ${GMSH_MAN})
     1921endif()
     1922
     1923add_custom_target(get_headers
     1924  COMMAND ${CMAKE_COMMAND} -E make_directory Headers/gmsh
     1925  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
     1926foreach(FILE ${GMSH_API})
     1927  add_custom_command(TARGET get_headers POST_BUILD COMMAND ${CMAKE_COMMAND}
     1928    -E copy_if_different ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/Headers/
     1929    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
     1930endforeach()
     1931if(ENABLE_PRIVATE_API)
     1932  foreach(FILE ${GMSH_PRIVATE_API})
     1933    add_custom_command(TARGET get_headers POST_BUILD COMMAND ${CMAKE_COMMAND}
     1934      -E copy_if_different ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/Headers/gmsh/
     1935      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
     1936  endforeach()
     1937endif()
     1938
     1939find_program(MAKEINFO makeinfo)
     1940if(MAKEINFO)
     1941  add_custom_command(OUTPUT ${TEX_DIR}/gmsh.info DEPENDS ${TEX_SRC}
     1942                     COMMAND ${MAKEINFO} --split-size 1000000
     1943                     ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
     1944  add_custom_target(info DEPENDS ${TEX_DIR}/gmsh.info)
     1945  add_custom_command(OUTPUT ${TEX_DIR}/gmsh.txt DEPENDS ${TEX_SRC}
     1946                     COMMAND ${MAKEINFO} --plaintext -o gmsh.txt
     1947                     ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
     1948  add_custom_target(txt DEPENDS ${TEX_DIR}/gmsh.txt)
     1949  add_custom_command(OUTPUT ${TEX_DIR}/gmsh.html DEPENDS ${TEX_SRC}
     1950    COMMAND ${MAKEINFO} --html --css-ref=/gmsh.css
     1951    --no-split --set-customization-variable
     1952    EXTRA_HEAD='<meta name="viewport" content="width=device-width,initial-scale=1.0">'
     1953    ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
     1954  add_custom_target(html DEPENDS ${TEX_DIR}/gmsh.html)
     1955  install(FILES ${TEX_DIR}/gmsh.html DESTINATION ${GMSH_DOC} OPTIONAL)
     1956else()
     1957  add_custom_target(html COMMAND ${CMAKE_COMMAND} -E touch ${TEX_DIR}/gmsh.html)
     1958endif()
     1959
     1960find_program(TEXI2PDF texi2pdf)
     1961if(TEXI2PDF)
     1962  add_custom_command(OUTPUT ${TEX_DIR}/gmsh.pdf DEPENDS ${TEX_SRC}
     1963                     COMMAND ${TEXI2PDF} ARGS gmsh.texi
     1964                     WORKING_DIRECTORY ${TEX_DIR})
     1965  add_custom_target(pdf DEPENDS ${TEX_DIR}/gmsh.pdf)
     1966  install(FILES ${TEX_DIR}/gmsh.pdf DESTINATION ${GMSH_DOC} OPTIONAL)
     1967endif()
     1968
     1969execute_process(COMMAND ${CMAKE_COMMAND} -E echo
     1970  "@c This file was generated by cmake: do not edit manually!\n${OPT_TEXI}"
     1971  OUTPUT_FILE cmake_options.texi)
     1972
     1973if(MAKEINFO AND TEXI2PDF)
     1974  add_custom_target(doc COMMAND ${CMAKE_COMMAND} -E tar zcf
     1975                    ${CMAKE_CURRENT_BINARY_DIR}/gmsh-${GMSH_VERSION}-doc.tgz
     1976                    CREDITS.txt LICENSE.txt CHANGELOG.txt
     1977                    doc/gmsh.1 doc/texinfo/gmsh.html doc/texinfo/gmsh.info
     1978                    doc/texinfo/gmsh.pdf doc/texinfo/gmsh.txt
     1979                    COMMAND ${CMAKE_COMMAND} -E remove ${TEX_OBJ}
     1980                    DEPENDS ${TEX_DIR}/gmsh.info ${TEX_DIR}/gmsh.txt
     1981                    ${TEX_DIR}/gmsh.html ${TEX_DIR}/gmsh.pdf
     1982                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
     1983endif()
     1984
     1985if(MAKEINFO OR TEXI2PDF)
     1986  add_custom_target(clean_doc COMMAND ${CMAKE_COMMAND} -E remove ${TEX_OBJ})
     1987endif()
     1988
     1989if(APPLE AND ENABLE_BUILD_LIB)
     1990  file(READ ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_framework.plist F0)
     1991  string(REPLACE GMSH_VERSION "${GMSH_VERSION}" F1 "${F0}")
     1992  file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/Info_framework.plist "${F1}")
     1993  set(LIBNAME $<TARGET_FILE:lib>)
     1994  add_custom_target(framework DEPENDS lib
     1995    COMMAND ${CMAKE_COMMAND} -E remove_directory gmsh.framework
     1996    COMMAND ${CMAKE_COMMAND} -E make_directory gmsh.framework/Headers
     1997    COMMAND ${CMAKE_COMMAND} -E make_directory gmsh.framework/Resources
     1998    COMMAND ${CMAKE_COMMAND} -E copy ${LIBNAME} gmsh.framework/gmsh
     1999    COMMAND ${CMAKE_COMMAND} -E copy Info_framework.plist
     2000                                     gmsh.framework/Resources/Info.plist
     2001    COMMAND ${CMAKE_COMMAND} -E create_symlink . gmsh.framework/Headers/gmsh
     2002    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
     2003  foreach(FILE ${GMSH_API})
     2004    add_custom_command(TARGET framework POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy
     2005        ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/gmsh.framework/Headers/
     2006        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
     2007  endforeach()
     2008  if(ENABLE_PRIVATE_API)
     2009    foreach(FILE ${GMSH_PRIVATE_API})
     2010      add_custom_command(TARGET framework POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy
     2011          ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/gmsh.framework/Headers/
     2012          WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
     2013    endforeach()
     2014  endif()
     2015endif()
     2016
     2017set(CPACK_PACKAGE_VENDOR "Christophe Geuzaine and Jean-Francois Remacle")
     2018set(CPACK_PACKAGE_VERSION_MAJOR ${GMSH_MAJOR_VERSION})
     2019set(CPACK_PACKAGE_VERSION_MINOR ${GMSH_MINOR_VERSION})
     2020set(CPACK_PACKAGE_VERSION_PATCH ${GMSH_PATCH_VERSION})
     2021set(CPACK_PACKAGE_DESCRIPTION_FILE ${WELCOME_FILE})
     2022set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
     2023    "3D finite element mesh generator with built-in CAD engine and post-processor")
     2024if(GMSH_EXTRA_VERSION MATCHES "-git.*") # so that we'll overwrite the archives
     2025  set(CPACK_PACKAGE_FILE_NAME gmsh${GMSH_EXTRA_VERSION_ORIG}-git-${GMSH_OS})
     2026  set(CPACK_SOURCE_PACKAGE_FILE_NAME gmsh${GMSH_EXTRA_VERSION_ORIG}-git-source)
     2027else()
     2028  set(CPACK_PACKAGE_FILE_NAME gmsh-${GMSH_VERSION}-${GMSH_OS})
     2029  set(CPACK_SOURCE_PACKAGE_FILE_NAME gmsh-${GMSH_VERSION}-source)
     2030endif()
     2031set(CPACK_PACKAGE_INSTALL_DIRECTORY "gmsh")
     2032set(CPACK_RESOURCE_FILE_LICENSE ${LICENSE_FILE})
     2033set(CPACK_RESOURCE_FILE_README ${WELCOME_FILE})
     2034set(CPACK_RESOURCE_FILE_WELCOME ${WELCOME_FILE})
     2035set(CPACK_PACKAGE_EXECUTABLE "gmsh")
     2036if(ENABLE_PACKAGE_STRIP)
     2037  set(CPACK_STRIP_FILES TRUE)
     2038else()
     2039  set(CPACK_STRIP_FILES FALSE)
     2040endif()
     2041set(CPACK_SOURCE_GENERATOR TGZ)
     2042set(CPACK_SOURCE_IGNORE_FILES "${CMAKE_CURRENT_BINARY_DIR}" "/CVS/" "/.svn" "/.git"
     2043    "~$" "DS_Store$" "GmshConfig.h$" "GmshVersion.h$" "/benchmarks/" "/tmp/"
     2044    "/bin/" "/lib/" "/nightly/" "GPATH" "GRTAGS" "GSYMS" "GTAGS" "/HTML/"
     2045    "/contrib/3M/" "/contrib/Parasolid/")
     2046
     2047if(UNIX)
     2048  # make sure we remove previous installs before doing the next one (on Mac for
     2049  # example "make package; make package_source" would lead to huge file lists
     2050  # getting generated due to the 'Applications' symlink in the bundle)
     2051  set(CPACK_INSTALL_COMMANDS "rm -rf ${CMAKE_CURRENT_BINARY_DIR}/_CPack_Packages")
     2052endif()
     2053
     2054if(APPLE AND ENABLE_OS_SPECIFIC_INSTALL)
     2055  set(CPACK_GENERATOR Bundle)
     2056  set(CPACK_BUNDLE_NAME Gmsh)
     2057  file(READ ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_app.plist F0)
     2058  string(REPLACE GMSH_VERSION "${GMSH_VERSION}" F1 "${F0}")
     2059  file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/Info.plist "${F1}")
     2060  set(CPACK_BUNDLE_PLIST ${CMAKE_CURRENT_BINARY_DIR}/Info.plist)
     2061  set(CPACK_BUNDLE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIcons.icns)
     2062  if(PACKAGER STREQUAL "geuzaine - removed: we sign on a separate machine")
     2063    # codesigning requires CMake >= 3.2
     2064    set(CPACK_BUNDLE_APPLE_CERT_APP "Developer ID Application: Christophe Geuzaine")
     2065  endif()
     2066  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsGeo.icns DESTINATION .
     2067          RENAME GmshGeo.icns)
     2068  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsMsh.icns DESTINATION .
     2069          RENAME GmshMsh.icns)
     2070  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsSol.icns DESTINATION .
     2071          RENAME GmshSol.icns)
     2072  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsPos.icns DESTINATION .
     2073          RENAME GmshPos.icns)
     2074  set(CPACK_PACKAGE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIcons.icns)
     2075elseif(WIN32)
     2076  set(CPACK_GENERATOR ZIP)
     2077else()
     2078  set(CPACK_GENERATOR TGZ)
     2079endif()
     2080
     2081if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/utils/wrappers/gmshpy AND
     2082   ENABLE_PRIVATE_API AND ENABLE_WRAP_PYTHON AND HAVE_PYTHON)
     2083  add_subdirectory(utils/wrappers/gmshpy)
     2084endif()
     2085
     2086if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/utils/wrappers/java AND
     2087   ENABLE_PRIVATE_API AND ENABLE_WRAP_JAVA)
     2088  add_subdirectory(utils/wrappers/java)
     2089endif()
     2090
     2091include(CPack)
     2092
     2093macro(filter_tests IN OUT)
     2094  unset(${OUT})
     2095  foreach(FILE ${IN})
     2096    unset(BAD1)
     2097    unset(BAD2)
     2098    unset(BAD3)
     2099    # OS-specific
     2100    if(${GMSH_OS} MATCHES "Linux32")
     2101      # OCC STL generation crashes on our Linux32 docker
     2102      string(REGEX MATCH "t18" BAD1 ${FILE})
     2103    endif()
     2104    # OpenCASCADE
     2105    if(NOT HAVE_OCC AND NOT BAD1 AND NOT BAD2 AND NOT BAD3)
     2106      file(STRINGS ${FILE} BAD1 REGEX "^SetFactory.*OpenCASCADE.*")
     2107      file(STRINGS ${FILE} BAD2 REGEX ".*occ\\.synchronize.*")
     2108      file(STRINGS ${FILE} BAD3 REGEX ".*occ::synchronize.*")
     2109    endif()
     2110    # Metis
     2111    if(NOT HAVE_METIS AND NOT BAD1 AND NOT BAD2 AND NOT BAD3)
     2112      file(STRINGS ${FILE} BAD1 REGEX ".*PartitionMesh.*")
     2113      file(STRINGS ${FILE} BAD2 REGEX ".*mesh\\.partition.*")
     2114      file(STRINGS ${FILE} BAD3 REGEX ".*mesh::partition.*")
     2115    endif()
     2116    if(BAD1 OR BAD2 OR BAD3)
     2117      message("Skipping test " ${FILE})
     2118    else()
     2119      list(APPEND ${OUT} ${FILE})
     2120    endif()
     2121  endforeach()
     2122endmacro()
     2123
     2124if(NOT DISABLE_GMSH_TESTS)
     2125  # disabling tests is useful when including this CMakeLists in an external project
     2126  include(CTest)
     2127  file(GLOB_RECURSE ALLFILES
     2128       tutorial/*.geo demos/*.geo benchmarks/?d/*.geo benchmarks/extrude/*.geo
     2129       benchmarks/occ/*.geo)
     2130  filter_tests("${ALLFILES}" TESTFILES)
     2131  foreach(TESTFILE ${TESTFILES})
     2132    # use relative path for Cygwin/MinGW (the pure win exe built with the MinGW
     2133    # compilers does not understand a full Cygwin-style path)
     2134    FILE(RELATIVE_PATH TEST ${CMAKE_CURRENT_BINARY_DIR} ${TESTFILE})
     2135    add_test(${TEST} ./gmsh ${TEST} -3 -nopopup -o ./tmp.msh)
     2136  endforeach()
     2137  # test c++ api tutorials with dynamic builds (except on 32 bit windows for
     2138  # now: our win32 setup does not currently handle exceptions)
     2139  if(ENABLE_BUILD_DYNAMIC AND NOT ${GMSH_OS} MATCHES "Windows32")
     2140    file(GLOB_RECURSE ALLFILES tutorial/c++/*.cpp)
     2141    filter_tests("${ALLFILES}" TESTFILES)
     2142    foreach(TESTFILE ${TESTFILES})
     2143      get_filename_component(TEST ${TESTFILE} NAME_WE)
     2144      add_executable(${TEST} WIN32 ${TESTFILE})
     2145      target_link_libraries(${TEST} shared)
     2146      if(WIN32 AND NOT MSVC)
     2147        set(FLAGS "-static")
     2148        if(HAVE_FLTK)
     2149          set(FLAGS "${FLAGS} -mwindows")
     2150        else()
     2151          set(FLAGS "${FLAGS} -mconsole")
     2152        endif()
     2153        set_target_properties(${TEST} PROPERTIES LINK_FLAGS "${FLAGS}")
     2154      endif()
     2155      add_test(${TEST}_cpp ${TEST} -nopopup)
     2156    endforeach()
     2157  endif()
     2158  # enable this once we have worked out the path issues on the build machines
     2159  if(0 AND ENABLE_BUILD_DYNAMIC)
     2160    find_package(PythonInterp)
     2161    if(PYTHONINTERP_FOUND)
     2162      file(GLOB_RECURSE ALLFILES tutorial/python/*.py demos/api/*.py)
     2163      filter_tests("${ALLFILES}" TESTFILES)
     2164      foreach(TESTFILE ${TESTFILES})
     2165        get_filename_component(TEST ${TESTFILE} NAME_WE)
     2166        add_test(NAME ${TEST}_py COMMAND ${PYTHON_EXECUTABLE} ${TESTFILE} -nopopup)
     2167        set_property(TEST ${TEST}_py APPEND PROPERTY ENVIRONMENT
     2168                     "PYTHONPATH=${CMAKE_SOURCE_DIR}/api")
     2169        set_property(TEST ${TEST}_py APPEND PROPERTY ENVIRONMENT
     2170                     "LD_LIBRARY_PATH=${CMAKE_CURRENT_BINARY_DIR}")
     2171        endforeach()
     2172    endif()
     2173  endif()
     2174endif()
     2175
     2176message(STATUS "")
     2177message(STATUS "Gmsh ${GMSH_VERSION} has been configured for ${GMSH_OS}")
     2178message(STATUS "")
     2179message(STATUS " * Build options:" ${GMSH_CONFIG_OPTIONS})
     2180message(STATUS " * Build type: " ${CMAKE_BUILD_TYPE})
     2181message(STATUS " * C compiler: " ${CMAKE_C_COMPILER})
     2182message(STATUS " * C++ compiler: " ${CMAKE_CXX_COMPILER})
     2183message(STATUS " * Install prefix: " ${CMAKE_INSTALL_PREFIX})
     2184message(STATUS "")
     2185
     2186mark_as_advanced(ANN_INC ANN_LIB CAIRO_LIB CAIRO_INC CGNS_INC GMM_INC
     2187                 GMP_INC GMP_LIB MMG_INC MMG_LIB HDF5_LIB
     2188                 MED_LIB OCC_INC SZ_LIB
     2189                 PETSC_LIBS SLEPC_INC SLEPC_INC2 SLEPC_LIB
     2190                 BISON FLEX MAKEINFO TEXI2PDF FLTK_CONFIG_SCRIPT
     2191                 GMSH_EXTERNAL_INCLUDE_DIRS GMSH_EXTERNAL_LIBRARIES)
  • ../trunk-jpl/externalpackages/gmsh/configs/4.5.6/static/CMakeLists.txt

     
     1# Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle
     2#
     3# See the LICENSE.txt file for license information. Please report all
     4# issues on https://gitlab.onelab.info/gmsh/gmsh/issues.
     5
     6cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
     7
     8# do not warn about non-definition of WIN32 on Cygwin
     9set(CMAKE_LEGACY_CYGWIN_WIN32 0)
     10
     11# if CMAKE_BUILD_TYPE is specified use it; otherwise set the default
     12# build type to "RelWithDebInfo" ("-O2 -g" with gcc) prior to calling
     13# project()
     14if(DEFINED CMAKE_BUILD_TYPE)
     15  set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Choose build type")
     16else()
     17  set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose build type")
     18endif()
     19
     20project(gmsh CXX C)
     21
     22# this variable controls the default value of the options which are normally set
     23# to ON (useful if you want to configure a minimal version of Gmsh: e.g. "cmake
     24# -DDEFAULT=0 -DENABLE_POST=1 -DENABLE_PARSER=1")
     25set(DEFAULT ON CACHE INTERNAL "Default value for enabled-by-default options")
     26
     27macro(opt OPTION HELP VALUE)
     28  option(ENABLE_${OPTION} ${HELP} ${VALUE})
     29  set(OPT_TEXI "${OPT_TEXI}\n@item ENABLE_${OPTION}\n${HELP} (default: ${VALUE})")
     30endmacro()
     31
     32opt(3M "Enable proprietary 3M extension" OFF)
     33opt(ACIS "Enable ACIS geometrical models (experimental)" ${DEFAULT})
     34opt(ALGLIB "Enable ALGLIB (used by some mesh optimizers)" ${DEFAULT})
     35opt(ANN "Enable ANN (used for fast point search in mesh/post)" ${DEFAULT})
     36opt(BAMG "Enable Bamg 2D anisotropic mesh generator" ${DEFAULT})
     37opt(BLAS_LAPACK "Enable BLAS/Lapack for linear algebra (required for meshing)" ON)
     38opt(BLOSSOM "Enable Blossom algorithm (needed for full quad meshing)" ${DEFAULT})
     39opt(BUILD_LIB "Enable 'lib' target for building static Gmsh library" OFF)
     40opt(BUILD_SHARED "Enable 'shared' target for building shared Gmsh library" OFF)
     41opt(BUILD_DYNAMIC "Enable dynamic Gmsh executable (linked with shared library)" OFF)
     42opt(BUILD_ANDROID "Enable Android NDK library target (experimental)" OFF)
     43opt(BUILD_IOS "Enable iOS library target (experimental)" OFF)
     44opt(CGNS "Enable CGNS import/export (experimental)" ${DEFAULT})
     45opt(CGNS_CPEX0045 "Enable high-order CGNS import/export following CPEX0045 (experimental)" OFF)
     46opt(CAIRO "Enable Cairo to render fonts (experimental)" ${DEFAULT})
     47opt(CXX11 "Enable C++11" ON)
     48opt(C99 "Enable C99" ON)
     49opt(PROFILE "Enable profiling compiler flags" OFF)
     50opt(DINTEGRATION "Enable discrete integration (needed for levelsets)" ${DEFAULT})
     51opt(DOMHEX "Enable experimental DOMHEX code" ${DEFAULT})
     52opt(FLTK "Enable FLTK graphical user interface (requires mesh/post)" ${DEFAULT})
     53opt(GETDP "Enable GetDP solver (linked as a library, experimental)" ${DEFAULT})
     54opt(GMM "Enable GMM linear solvers (simple alternative to PETSc)" ${DEFAULT})
     55opt(GMP "Enable GMP for Kbipack (advanced)" ON)
     56opt(GRAPHICS "Enable building graphics lib even without GUI (advanced)" OFF)
     57opt(HXT "Enable HXT library (for reparametrization and meshing)" ${DEFAULT})
     58opt(KBIPACK "Enable Kbipack (neeeded by homology solver)" ${DEFAULT})
     59opt(MATHEX "Enable Mathex expression parser (used by plugins and options)" ${DEFAULT})
     60opt(MED "Enable MED mesh and post file formats" ${DEFAULT})
     61opt(MESH "Enable mesh module (required by GUI)" ${DEFAULT})
     62opt(METIS "Enable Metis mesh partitioner" ${DEFAULT})
     63opt(MMG3D "Enable MMG3D 3D anisotropic mesh refinement" ${DEFAULT})
     64opt(MPEG_ENCODE "Enable built-in MPEG movie encoder" ${DEFAULT})
     65opt(MPI "Enable MPI (experimental, not used for meshing)" OFF)
     66opt(MSVC_STATIC_RUNTIME "Enable static Visual C++ runtime" OFF)
     67opt(MUMPS "Enable MUMPS sparse direct linear solver" OFF)
     68opt(NETGEN "Enable Netgen 3D frontal mesh generator" ${DEFAULT})
     69opt(NUMPY "Enable fullMatrix and numpy array conversion for private API" OFF)
     70opt(PETSC4PY "Enable petsc4py wrappers for petsc matrices for private API" OFF)
     71opt(OCC "Enable OpenCASCADE CAD kernel" ${DEFAULT})
     72opt(OCC_CAF "Enable OpenCASCADE CAF module (for STEP/IGES attributes)" ${DEFAULT})
     73opt(OCC_STATIC "Link OpenCASCADE static instead of dynamic libraries (requires ENABLE_OCC)" OFF)
     74opt(OCC_TBB "Add TBB libraries in list of OCC libraries" OFF)
     75opt(ONELAB "Enable ONELAB solver interface" ${DEFAULT})
     76opt(ONELAB_METAMODEL "Enable ONELAB metamodels (experimental)" ${DEFAULT})
     77opt(OPENACC "Enable OpenACC" OFF)
     78opt(OPENMP "Enable OpenMP" OFF)
     79opt(OPTHOM "Enable high-order mesh optimization tools" ${DEFAULT})
     80opt(OS_SPECIFIC_INSTALL "Enable OS-specific (e.g. app bundle) installation" OFF)
     81opt(OSMESA "Enable OSMesa for offscreen rendering (experimental)" OFF)
     82opt(P4EST "Enable p4est for enabling automatic mesh size firld (experimental)" OFF)
     83opt(PACKAGE_STRIP "Strip symbols in install packages to reduce install size" ON)
     84opt(PARSER "Enable GEO file parser (required for .geo/.pos files)" ${DEFAULT})
     85opt(PETSC "Enable PETSc linear solvers (required for SLEPc)" OFF)
     86opt(PLUGINS "Enable post-processing plugins" ${DEFAULT})
     87opt(POST "Enable post-processing module (required by GUI)" ${DEFAULT})
     88opt(POPPLER "Enable Poppler for displaying PDF documents (experimental)" OFF)
     89opt(PRIVATE_API "Enable private API" OFF)
     90opt(QUADTRI "Enable QuadTri structured meshing extensions" ${DEFAULT})
     91opt(REVOROPT "Enable Revoropt (used for CVT remeshing)" OFF)
     92opt(SLEPC "Enable SLEPc eigensolvers" OFF)
     93opt(SOLVER "Enable built-in finite element solvers (required for compounds)" ${DEFAULT})
     94opt(SYSTEM_CONTRIB "Use system versions of contrib libraries, when possible" OFF)
     95opt(TCMALLOC "Enable libtcmalloc (fast malloc that does not release memory)" OFF)
     96opt(TOUCHBAR "Enable Apple Touch bar" ${DEFAULT})
     97opt(VISUDEV "Enable additional visualization capabilities for development purposes" OFF)
     98opt(VOROPP "Enable voro++ (for hex meshing, experimental)" ${DEFAULT})
     99opt(WRAP_JAVA "Enable generation of Java wrappers for private API" OFF)
     100opt(WRAP_PYTHON "Enable generation of Python wrappers for private API" OFF)
     101opt(ZIPPER "Enable Zip file compression/decompression" OFF)
     102
     103set(GMSH_MAJOR_VERSION 4)
     104set(GMSH_MINOR_VERSION 5)
     105set(GMSH_PATCH_VERSION 6)
     106set(GMSH_EXTRA_VERSION "")
     107set(GMSH_EXTRA_VERSION_TEXI "${GMSH_EXTRA_VERSION}")
     108
     109if(NOT GMSH_RELEASE)
     110  find_package(Git)
     111  if(GIT_FOUND)
     112    execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --format=%h
     113                    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ERROR_QUIET
     114                    OUTPUT_VARIABLE GIT_COMMIT_HASH
     115                    OUTPUT_STRIP_TRAILING_WHITESPACE)
     116  endif()
     117  if(GIT_COMMIT_HASH)
     118    set(GMSH_EXTRA_VERSION "${GMSH_EXTRA_VERSION}-git-${GIT_COMMIT_HASH}")
     119  endif()
     120  set(GMSH_EXTRA_VERSION_TEXI "${GMSH_EXTRA_VERSION_TEXI} (development version)")
     121endif()
     122
     123set(GMSH_VERSION "${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}")
     124set(GMSH_VERSION "${GMSH_VERSION}.${GMSH_PATCH_VERSION}${GMSH_EXTRA_VERSION}")
     125set(GMSH_SHORT_LICENSE "GNU General Public License")
     126
     127set(GMSH_API api/gmsh.h api/gmshc.h api/gmsh.h_cwrap)
     128
     129if(ENABLE_PRIVATE_API)
     130  message(WARNING "The private API is unsupported and undocumented. It is meant "
     131          "for expert Gmsh developers, not for regular Gmsh users, who should rely "
     132          "on the stable public API (gmsh/api) instead. If you are repackaging Gmsh, "
     133          "e.g. for a Linux distribution, please DO NOT distribute the private API "
     134          "(i.e. all the internal headers) and ship the stable public API instead "
     135          "(i.e. only the headers and modules in gmsh/api).")
     136  file(GLOB_RECURSE HEADERS Common/*.h Numeric/*.h Geo/*.h Mesh/*.h Solver/*.h
     137    Post/*.h Graphics/*.h contrib/kbipack/*.h contrib/DiscreteIntegration/*.h
     138    contrib/HighOrderMeshOptimizer/*.h contrib/MeshOptimizer/*.h
     139    contrib/MeshQualityOptimizer/*.h)
     140  set(GMSH_PRIVATE_API ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshConfig.h
     141      ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshVersion.h ${HEADERS})
     142  get_property(IAMCHILD DIRECTORY PROPERTY PARENT_DIRECTORY)
     143  if(IAMCHILD)
     144    set(GMSH_PRIVATE_API ${GMSH_PRIVATE_API} PARENT_SCOPE)
     145  endif()
     146endif()
     147
     148set(ONELAB_PY contrib/onelab/python/onelab.py)
     149set(GMSH_PY api/gmsh.py)
     150set(GMSH_JL api/gmsh.jl)
     151
     152if(${CMAKE_MAJOR_VERSION} GREATER 2)
     153  string(TIMESTAMP DATE "%Y%m%d")
     154else()
     155  execute_process(COMMAND date "+%Y%m%d" OUTPUT_VARIABLE DATE
     156                  OUTPUT_STRIP_TRAILING_WHITESPACE)
     157endif()
     158
     159if(NOT DATE)
     160  set(DATE "unknown")
     161endif()
     162set(GMSH_DATE "${DATE}")
     163
     164if(NOT GMSH_HOST)
     165  execute_process(COMMAND hostname OUTPUT_VARIABLE HOSTNAME
     166                  OUTPUT_STRIP_TRAILING_WHITESPACE)
     167  if(NOT HOSTNAME)
     168    set(HOSTNAME "unknown")
     169  endif()
     170  set(GMSH_HOST "${HOSTNAME}")
     171endif()
     172
     173if(NOT GMSH_PACKAGER)
     174  execute_process(COMMAND whoami OUTPUT_VARIABLE PACKAGER
     175                  OUTPUT_STRIP_TRAILING_WHITESPACE)
     176  if(NOT PACKAGER)
     177    set(PACKAGER "unknown")
     178  endif()
     179  string(REPLACE "\\" " " PACKAGER ${PACKAGER})
     180  set(GMSH_PACKAGER "${PACKAGER}")
     181endif()
     182
     183if(APPLE)
     184  set(GMSH_OS "MacOSX")
     185elseif(CYGWIN OR MSYS)
     186  # detect if we use the MinGW compilers on Cygwin - if we do, handle the build
     187  # as a pure Windows build
     188  if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
     189     CMAKE_CXX_COMPILER_ID MATCHES "Clang")
     190    execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine
     191                    OUTPUT_VARIABLE CXX_COMPILER_MACHINE
     192                    OUTPUT_STRIP_TRAILING_WHITESPACE)
     193    if(CXX_COMPILER_MACHINE MATCHES "mingw")
     194      set(GMSH_OS "Windows")
     195      set(WIN32 1)
     196      add_definitions(-DWIN32)
     197    endif()
     198  endif()
     199else()
     200  set(GMSH_OS "${CMAKE_SYSTEM_NAME}")
     201endif()
     202
     203include(CheckTypeSize)
     204include(CheckFunctionExists)
     205include(CheckIncludeFile)
     206include(CheckCXXCompilerFlag)
     207include(CheckCCompilerFlag)
     208
     209macro(set_config_option VARNAME STRING)
     210  set(${VARNAME} TRUE)
     211  list(APPEND CONFIG_OPTIONS ${STRING})
     212  message(STATUS "Found " ${STRING})
     213endmacro()
     214
     215# check if the machine is 64 bits (this is more reliable than using
     216# CMAKE_SIZEOF_VOID_P, which does not seem to work e.g. on some Suse
     217# machines)
     218check_type_size("void*" SIZEOF_VOID_P)
     219if(SIZEOF_VOID_P EQUAL 8)
     220  set_config_option(HAVE_64BIT_SIZE_T "64Bit")
     221endif()
     222
     223# append 32/64 to the build name on Linux and Windows
     224if(NOT APPLE)
     225  if(HAVE_64BIT_SIZE_T)
     226    set(GMSH_OS "${GMSH_OS}64")
     227  else()
     228    set(GMSH_OS "${GMSH_OS}32")
     229  endif()
     230endif()
     231
     232if(NOT ENABLE_BUILD_SHARED)
     233  if(ENABLE_WRAP_PYTHON OR ENABLE_WRAP_JAVA)
     234    set(ENABLE_BUILD_DYNAMIC ON)
     235  endif()
     236endif()
     237
     238if(ENABLE_BUILD_DYNAMIC)
     239  set(GMSH_OS "${GMSH_OS}-sdk")
     240endif()
     241
     242if(APPLE)
     243  # FIXME: change this once we understand rpaths - the options below do not work
     244  set(CMAKE_MACOSX_RPATH 0)
     245else()
     246  # make sure that dynamic libraries can be found when installing/ displacing the
     247  # binaries: from https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/
     248  # RPATH-handling:
     249
     250  # use, i.e. don't skip the full RPATH for the build tree
     251  set(CMAKE_SKIP_BUILD_RPATH  FALSE)
     252
     253  # when building, don't use the install RPATH already (but later on when
     254  # installing)
     255  set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
     256  set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
     257
     258  # add the automatically determined parts of the RPATH which point to
     259  # directories outside the build tree to the install RPATH
     260  set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
     261
     262  # the RPATH to be used when installing, but only if it's not a system directory
     263  list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib"
     264       isSystemDir)
     265  if("${isSystemDir}" STREQUAL "-1")
     266     set(CMAKE_INSTALL_RPATH "\\\$ORIGIN/../lib")
     267  endif()
     268endif()
     269
     270if(MSVC)
     271  # remove annoying warning about bool/int cast performance
     272  set(GMSH_CONFIG_PRAGMAS "#pragma warning(disable:4800 4244 4267)")
     273  foreach(VAR
     274          CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
     275          CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO
     276          CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
     277          CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
     278    if(ENABLE_MSVC_STATIC_RUNTIME AND ${VAR} MATCHES "/MD")
     279      string(REGEX REPLACE "/MD" "/MT" ${VAR} "${${VAR}}")
     280    endif()
     281    if(NOT ${VAR} MATCHES "/MP") # enable parallel compilation
     282      set(${VAR} "${${VAR}} /MP")
     283    endif()
     284  endforeach()
     285  if(ENABLE_PRIVATE_API)
     286    if(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
     287      # automatically export .def file with all symbols (requires CMake 3.4);
     288      # depending on the compiling options this might lead to more than 64k export
     289      # symbols; just trim the .def file to keep the ones you need
     290      set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
     291    endif()
     292  endif()
     293endif()
     294
     295if(ENABLE_OPENMP)
     296  find_package(OpenMP)
     297  if(OpenMP_FOUND)
     298    set_config_option(HAVE_OPENMP "OpenMP")
     299    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
     300    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
     301  elseif(APPLE AND EXISTS "/opt/local/lib/libomp")
     302    # just for testing the official Apple compiler with macports' libomp
     303    set_config_option(HAVE_OPENMP "OpenMP[MacPorts]")
     304    set(CMAKE_C_FLAGS
     305        "${CMAKE_C_FLAGS} -Xpreprocessor -fopenmp -I/opt/local/include/libomp")
     306    set(CMAKE_CXX_FLAGS
     307        "${CMAKE_CXX_FLAGS} -Xpreprocessor -fopenmp -I/opt/local/include/libomp")
     308    list(APPEND EXTERNAL_LIBRARIES "-L/opt/local/lib/libomp -lomp")
     309  elseif(APPLE AND EXISTS "/usr/local/lib/libomp.dylib")
     310    set_config_option(HAVE_OPENMP "OpenMP[usr/local]")
     311    set(CMAKE_C_FLAGS
     312        "${CMAKE_C_FLAGS} -Xpreprocessor -fopenmp")
     313    set(CMAKE_CXX_FLAGS
     314        "${CMAKE_CXX_FLAGS} -Xpreprocessor -fopenmp")
     315    list(APPEND EXTERNAL_LIBRARIES "-lomp")
     316  endif()
     317endif()
     318
     319if(ENABLE_OPENACC)
     320  find_package(OpenACC)
     321  if(OpenACC_C_FOUND AND OpenACC_CXX_FOUND)
     322    set_config_option(HAVE_OPENACC "OpenACC")
     323    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenACC_C_FLAGS}")
     324    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenACC_CXX_FLAGS}")
     325  endif()
     326endif()
     327
     328if(ENABLE_CXX11)
     329  # in recent cmake versions we could do e.g. set(CMAKE_CXX_STANDARD 11)
     330  check_cxx_compiler_flag("-std=c++11" STDCXX11)
     331  if(STDCXX11)
     332    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
     333  endif()
     334endif()
     335
     336if(ENABLE_C99)
     337  # in recent cmake versions we could do e.g. set(CMAKE_C_STANDARD 99)
     338  check_c_compiler_flag("-std=c99" STDC99)
     339  if(STDC99)
     340    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
     341  endif()
     342endif()
     343
     344if(ENABLE_PROFILE)
     345    # Using the perf set of profiling tools doesn't work without the frame
     346    # pointer and a common optimisation is to remove it
     347    check_cxx_compiler_flag("-fno-omit-frame-pointer" FNOFP)
     348    if(FNOFP)
     349        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
     350    endif()
     351endif()
     352
     353macro(append_gmsh_src DIRNAME FILES)
     354  foreach(FILE ${FILES})
     355    list(APPEND LIST ${DIRNAME}/${FILE})
     356  endforeach()
     357  set(GMSH_SRC ${GMSH_SRC};${LIST} PARENT_SCOPE)
     358  set(GMSH_DIRS ${GMSH_DIRS};${DIRNAME} PARENT_SCOPE)
     359endmacro()
     360
     361macro(find_all_libraries VARNAME LISTNAME PATH SUFFIX)
     362  set(${VARNAME})
     363  list(LENGTH ${LISTNAME} NUM_LIST)
     364  foreach(LIB ${${LISTNAME}})
     365    if("${PATH}" STREQUAL "")
     366      find_library(FOUND_LIB ${LIB} PATH_SUFFIXES ${SUFFIX})
     367    else()
     368      find_library(FOUND_LIB ${LIB} PATHS ${PATH} NO_DEFAULT_PATH)
     369    endif()
     370    if(FOUND_LIB)
     371      list(APPEND ${VARNAME} ${FOUND_LIB})
     372    endif()
     373    unset(FOUND_LIB CACHE)
     374  endforeach()
     375  list(LENGTH ${VARNAME} NUM_FOUND_LIBRARIES)
     376  if(NUM_FOUND_LIBRARIES LESS NUM_LIST)
     377    set(${VARNAME})
     378  endif()
     379endmacro()
     380
     381macro(set_compile_flags LISTNAME FLAGS)
     382  foreach(FILE ${${LISTNAME}})
     383    get_source_file_property(PROP ${FILE} COMPILE_FLAGS)
     384    if(PROP)
     385      set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS "${PROP} ${FLAGS}")
     386    else()
     387      set_source_files_properties(${FILE} PROPERTIES COMPILE_FLAGS "${FLAGS}")
     388    endif()
     389  endforeach()
     390endmacro()
     391
     392if(ENABLE_BLAS_LAPACK)
     393  if(BLAS_LAPACK_LIBRARIES)
     394    # use libs as specified in the BLAS_LAPACK_LIBRARIES variable
     395    set_config_option(HAVE_BLAS "Blas[custom]")
     396    set_config_option(HAVE_LAPACK "Lapack[custom]")
     397    set(LAPACK_LIBRARIES ${BLAS_LAPACK_LIBRARIES})
     398  else()
     399    if(MSVC)
     400      # on Windows with Visual C++ try really hard to find blas/lapack *without*
     401      # requiring a Fortran compiler: 1) try to find the Intel MKL libs using
     402      # the standard search path; if not found 2) try to get the reference
     403      # blas/lapack libs (useful for users with no Fortran compiler and no MKL
     404      # license, who can just download our precompiled "gmsh-dep" package)
     405      if(HAVE_64BIT_SIZE_T)
     406        set(MKL_PATH em64t/lib)
     407        set(MKL_LIBS_REQUIRED libguide40 mkl_intel_lp64 mkl_intel_thread mkl_core)
     408      else()
     409        set(MKL_PATH ia32/lib)
     410        set(MKL_LIBS_REQUIRED libguide40 mkl_intel_c mkl_intel_thread mkl_core)
     411      endif()
     412      find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
     413      if(LAPACK_LIBRARIES)
     414        set_config_option(HAVE_BLAS "Blas[mkl]")
     415        set_config_option(HAVE_LAPACK "Lapack[mkl]")
     416      else()
     417        set(REFLAPACK_LIBS_REQUIRED lapack blas g2c gcc)
     418        find_all_libraries(LAPACK_LIBRARIES REFLAPACK_LIBS_REQUIRED "" "")
     419        if(LAPACK_LIBRARIES)
     420          set_config_option(HAVE_BLAS "Blas[ref]")
     421          set_config_option(HAVE_LAPACK "Lapack[ref]")
     422        endif()
     423      endif()
     424    elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
     425      # on Linux try to find the Intel MKL without a Fortran compiler
     426      if(HAVE_64BIT_SIZE_T)
     427        set(MKL_PATH lib/em64t)
     428      else()
     429        set(MKL_PATH lib/32)
     430      endif()
     431      set(MKL_LIBS_REQUIRED mkl_gf_lp64 iomp5 mkl_gnu_thread mkl_core guide pthread)
     432      find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
     433      if(NOT LAPACK_LIBRARIES)
     434        # match lapack 9.0 on 64bit
     435        set(MKL_LIBS_REQUIRED mkl_lapack mkl_em64t guide)
     436        find_all_libraries(LAPACK_LIBRARIES MKL_LIBS_REQUIRED "" ${MKL_PATH})
     437      endif()
     438      if(LAPACK_LIBRARIES)
     439        set_config_option(HAVE_BLAS "Blas[mkl]")
     440        set_config_option(HAVE_LAPACK "Lapack[mkl]")
     441      else()
     442        # on Linux also try to find ATLAS without a Fortran compiler, because
     443        # cmake ships with a buggy FindBLAS e.g. on Ubuntu Lucid Lynx
     444        set(ATLAS_LIBS_REQUIRED lapack f77blas cblas atlas)
     445        find_all_libraries(LAPACK_LIBRARIES ATLAS_LIBS_REQUIRED "" "")
     446        if(LAPACK_LIBRARIES)
     447          set_config_option(HAVE_BLAS "Blas[atlas]")
     448          set_config_option(HAVE_LAPACK "Lapack[atlas]")
     449        else()
     450          # try with generic names
     451          set(GENERIC_LIBS_REQUIRED lapack blas pthread)
     452          find_all_libraries(LAPACK_LIBRARIES GENERIC_LIBS_REQUIRED "" "")
     453          if(LAPACK_LIBRARIES)
     454            set_config_option(HAVE_BLAS "Blas[generic]")
     455            set_config_option(HAVE_LAPACK "Lapack[generic]")
     456            find_library(GFORTRAN_LIB gfortran)
     457            if(GFORTRAN_LIB)
     458              list(APPEND LAPACK_LIBRARIES ${GFORTRAN_LIB})
     459            endif()
     460          endif()
     461        endif()
     462      endif()
     463    elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
     464      # on SunOS we know blas and lapack are available in sunperf
     465      set(LAPACK_LIBRARIES -library=sunperf)
     466      set_config_option(HAVE_BLAS "Blas[sunperf]")
     467      set_config_option(HAVE_LAPACK "Lapack[sunperf]")
     468    elseif(APPLE)
     469      # on Mac we also know that blas and lapack are available
     470      set(LAPACK_LIBRARIES "-llapack -lblas")
     471      set_config_option(HAVE_BLAS "Blas[veclib]")
     472      set_config_option(HAVE_LAPACK "Lapack[veclib]")
     473    endif()
     474
     475    if(NOT HAVE_BLAS OR NOT HAVE_LAPACK)
     476      # if we haven't found blas and lapack check for OpenBlas
     477      set(OPENBLAS_LIBS_REQUIRED openblas)
     478      find_all_libraries(LAPACK_LIBRARIES OPENBLAS_LIBS_REQUIRED "" "")
     479      if(LAPACK_LIBRARIES)
     480        set_config_option(HAVE_BLAS "Blas[openblas]")
     481        set_config_option(HAVE_LAPACK "Lapack[openblas]")
     482        find_library(GFORTRAN_LIB gfortran)
     483        if(GFORTRAN_LIB)
     484          list(APPEND LAPACK_LIBRARIES ${GFORTRAN_LIB})
     485        endif()
     486      endif()
     487    endif()
     488
     489    if(NOT HAVE_BLAS OR NOT HAVE_LAPACK)
     490      # if we still haven't found blas and lapack, use the standard cmake tests,
     491      # which require a working Fortran compiler
     492      enable_language(Fortran)
     493      find_package(BLAS)
     494      if(BLAS_FOUND)
     495        set_config_option(HAVE_BLAS "Blas")
     496        find_package(LAPACK)
     497        if(LAPACK_FOUND)
     498          set_config_option(HAVE_LAPACK "Lapack")
     499        else()
     500          set(LAPACK_LIBRARIES ${BLAS_LIBRARIES})
     501        endif()
     502        if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
     503          if(CMAKE_Fortran_COMPILER MATCHES "gfortran")
     504            list(APPEND LAPACK_LIBRARIES gfortran)
     505          elseif(CMAKE_Fortran_COMPILER MATCHES "f95")
     506            list(APPEND LAPACK_LIBRARIES gfortran)
     507          elseif(CMAKE_Fortran_COMPILER MATCHES "g77")
     508            list(APPEND LAPACK_LIBRARIES g2c)
     509          endif()
     510        elseif(CMAKE_Fortran_COMPILER MATCHES "pgi")
     511          list(APPEND LAPACK_LIBRARIES -pgf77libs)
     512        endif()
     513      endif()
     514    endif()
     515
     516    if(NOT HAVE_BLAS OR NOT HAVE_LAPACK)
     517      message(WARNING "Could not find Blas or Lapack: most meshing algorithms "
     518              "will not be functional")
     519    endif()
     520
     521  endif()
     522endif()
     523
     524if(ENABLE_TCMALLOC)
     525  find_library(TCMALLOC tcmalloc)
     526  if(TCMALLOC)
     527    set_config_option(HAVE_TCMALLOC "TCMalloc")
     528    list(APPEND EXTERNAL_LIBRARIES ${TCMALLOC})
     529  endif()
     530endif()
     531
     532add_subdirectory(Common)
     533add_subdirectory(Numeric)
     534add_subdirectory(Geo)
     535
     536if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Mesh AND ENABLE_MESH)
     537  add_subdirectory(Mesh)
     538  set_config_option(HAVE_MESH "Mesh")
     539endif()
     540
     541if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Solver AND ENABLE_SOLVER)
     542  add_subdirectory(Solver)
     543  set_config_option(HAVE_SOLVER "Solver")
     544endif()
     545
     546if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Post AND ENABLE_POST)
     547  add_subdirectory(Post)
     548  set_config_option(HAVE_POST "Post")
     549  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Plugin AND ENABLE_PLUGINS)
     550    add_subdirectory(Plugin)
     551    set_config_option(HAVE_PLUGINS "Plugins")
     552  endif()
     553endif()
     554
     555if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Parser AND ENABLE_PARSER)
     556  add_subdirectory(Parser)
     557  set_config_option(HAVE_PARSER "Parser")
     558endif()
     559
     560if(ENABLE_VISUDEV)
     561  set_config_option(HAVE_VISUDEV "VisuDev")
     562endif()
     563
     564if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Fltk AND ENABLE_FLTK)
     565  # first, try to use fltk-config for fltk >= 1.3 (FindFLTK is buggy on Unix,
     566  # where e.g. xft and xinerama options are not dealt with)
     567  find_program(FLTK_CONFIG_SCRIPT fltk-config)
     568  if(FLTK_CONFIG_SCRIPT)
     569    execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --api-version
     570                    OUTPUT_VARIABLE FLTK_VERSION)
     571    string(STRIP "${FLTK_VERSION}" FLTK_VERSION)
     572    if(FLTK_VERSION VERSION_GREATER 1.1)
     573      add_subdirectory(Fltk)
     574      set_config_option(HAVE_FLTK "Fltk")
     575      message(STATUS "Using fltk-config script for Fltk " ${FLTK_VERSION})
     576      execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --use-gl --use-images --includedir
     577                      OUTPUT_VARIABLE FLTK_INCLUDE_DIR)
     578      string(STRIP ${FLTK_INCLUDE_DIR} FLTK_INCLUDE_DIR)
     579      list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR})
     580      # On linux (at least OpenSuSE) the following directories are
     581      # not existing (everything is in /usr/include). To avoid warnings
     582      # check existance of these directories before adding them
     583      if(EXISTS ${FLTK_INCLUDE_DIR}/FL/images)
     584        list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/FL/images)
     585      endif()
     586      if(EXISTS ${FLTK_INCLUDE_DIR}/jpeg)
     587        list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/jpeg)
     588      endif()
     589      if(EXISTS ${FLTK_INCLUDE_DIR}/zlib)
     590        list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/zlib)
     591      endif()
     592      if(EXISTS ${FLTK_INCLUDE_DIR}/png)
     593        list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR}/png)
     594      endif()
     595      execute_process(COMMAND ${FLTK_CONFIG_SCRIPT} --use-gl --use-images --ldflags
     596                      OUTPUT_VARIABLE FLTK_LIBRARIES)
     597      string(STRIP ${FLTK_LIBRARIES} FLTK_LIBRARIES)
     598      string(REGEX MATCH "fltk[_ ]jpeg" FLTK_JPEG ${FLTK_LIBRARIES})
     599      string(REGEX MATCH "fltk[_ ]z" FLTK_Z ${FLTK_LIBRARIES})
     600      string(REGEX MATCH "fltk[_ ]png" FLTK_PNG ${FLTK_LIBRARIES})
     601    endif()
     602  endif()
     603  # then try the built-in FindFLTK module
     604  if(NOT HAVE_FLTK)
     605    set(FLTK_SKIP_FORMS TRUE)
     606    set(FLTK_SKIP_FLUID TRUE)
     607    find_package(FLTK)
     608    if(FLTK_FOUND)
     609      add_subdirectory(Fltk)
     610      set_config_option(HAVE_FLTK "Fltk")
     611      list(APPEND EXTERNAL_INCLUDES ${FLTK_INCLUDE_DIR})
     612      # find fltk jpeg
     613      find_library(FLTK_JPEG NAMES fltk_jpeg fltkjpeg)
     614      if(FLTK_JPEG)
     615        list(APPEND EXTERNAL_LIBRARIES ${FLTK_JPEG})
     616        foreach(DIR ${FLTK_INCLUDE_DIR})
     617          list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/jpeg)
     618        endforeach()
     619      endif()
     620      # find fltk zlib
     621      find_library(FLTK_Z NAMES fltk_z fltkz)
     622      if(FLTK_Z)
     623        list(APPEND EXTERNAL_LIBRARIES ${FLTK_Z})
     624        foreach(DIR ${FLTK_INCLUDE_DIR})
     625          list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/zlib)
     626        endforeach()
     627      endif()
     628      # find fltk png
     629      find_library(FLTK_PNG NAMES fltk_png fltkpng)
     630      if(FLTK_PNG)
     631        list(APPEND EXTERNAL_LIBRARIES ${FLTK_PNG})
     632        foreach(DIR ${FLTK_INCLUDE_DIR})
     633          list(APPEND EXTERNAL_INCLUDES ${DIR}/FL/images ${DIR}/png)
     634        endforeach()
     635      endif()
     636    endif()
     637  endif()
     638  # workaround for Fedora/Suse messing up fltk-config (see issue #417)
     639  if(HAVE_FLTK AND ${CMAKE_SYSTEM_NAME} MATCHES "Linux")
     640    string(REGEX MATCH "X11" FLTK_X11 ${FLTK_LIBRARIES})
     641    if(NOT FLTK_X11)
     642      find_package(X11)
     643      if(X11_FOUND)
     644        list(APPEND EXTERNAL_INCLUDES ${X11_INCLUDE_DIR})
     645        list(APPEND EXTERNAL_LIBRARIES ${X11_LIBRARIES})
     646      endif()
     647    endif()
     648  endif()
     649endif()
     650
     651if(APPLE AND HAVE_FLTK AND ENABLE_TOUCHBAR)
     652  if(CMAKE_OSX_DEPLOYMENT_TARGET)
     653    if(${CMAKE_OSX_DEPLOYMENT_TARGET} VERSION_GREATER 10.11)
     654      set(GMSH_SRC ${GMSH_SRC};Fltk/touchBar.mm)
     655      set_config_option(HAVE_TOUCHBAR "TouchBar")
     656    endif()
     657  endif()
     658endif()
     659
     660if(ENABLE_ONELAB)
     661  set_config_option(HAVE_ONELAB "ONELAB")
     662  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/onelab)
     663    if(ENABLE_ONELAB_METAMODEL)
     664      add_subdirectory(contrib/onelab)
     665      include_directories(contrib/onelab)
     666      set_config_option(HAVE_ONELAB_METAMODEL "ONELABMetamodel")
     667    endif()
     668    file(COPY ${ONELAB_PY} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
     669  endif()
     670endif()
     671
     672if(ENABLE_BUILD_IOS)
     673  find_file(CMAKE_TOOLCHAIN_FILE "ios.cmake")
     674  if(NOT CMAKE_TOOLCHAIN_FILE)
     675    message(FATAL_ERROR "Cannot compile Gmsh for iOS without a toolchain")
     676  endif()
     677  add_definitions(-DBUILD_IOS)
     678endif()
     679
     680if(HAVE_FLTK OR ENABLE_GRAPHICS)
     681  if(NOT HAVE_MESH OR NOT HAVE_POST OR NOT HAVE_PLUGINS OR NOT HAVE_ONELAB)
     682    message(SEND_ERROR "Cannot compile GUI without Mesh, Post, Plugin and ONELAB")
     683  endif()
     684
     685  if(FLTK_JPEG)
     686    set_config_option(HAVE_LIBJPEG "Jpeg[fltk]")
     687  else()
     688    find_package(JPEG)
     689    if(JPEG_FOUND)
     690      set_config_option(HAVE_LIBJPEG "Jpeg")
     691      list(APPEND EXTERNAL_LIBRARIES ${JPEG_LIBRARIES})
     692      list(APPEND EXTERNAL_INCLUDES ${JPEG_INCLUDE_DIR})
     693    endif()
     694  endif()
     695
     696  if(FLTK_Z)
     697    set_config_option(HAVE_LIBZ "Zlib[fltk]")
     698  else()
     699    find_package(ZLIB)
     700    if(ZLIB_FOUND)
     701      set_config_option(HAVE_LIBZ "Zlib")
     702      list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
     703      list(APPEND EXTERNAL_INCLUDES ${ZLIB_INCLUDE_DIR})
     704    endif()
     705  endif()
     706
     707  if(HAVE_LIBZ)
     708    if(FLTK_PNG)
     709      set_config_option(HAVE_LIBPNG "Png[fltk]")
     710    else()
     711      find_package(PNG)
     712      if(PNG_FOUND)
     713        set_config_option(HAVE_LIBPNG "Png")
     714        list(APPEND EXTERNAL_LIBRARIES ${PNG_LIBRARIES})
     715        list(APPEND EXTERNAL_INCLUDES ${PNG_INCLUDE_DIR})
     716      endif()
     717    endif()
     718  endif()
     719
     720  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/mpeg_encode AND
     721     ENABLE_MPEG_ENCODE)
     722    add_subdirectory(contrib/mpeg_encode)
     723    include_directories(contrib/mpeg_encode/headers)
     724    set_config_option(HAVE_MPEG_ENCODE "Mpeg")
     725  endif()
     726
     727  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/3M AND ENABLE_3M)
     728    add_subdirectory(contrib/3M)
     729    include_directories(contrib/3M)
     730    set_config_option(HAVE_3M "3M")
     731  endif()
     732
     733  if(ENABLE_OSMESA)
     734    find_library(OSMESA_LIB OSMesa)
     735    if(OSMESA_LIB)
     736      set_config_option(HAVE_OSMESA "OSMesa")
     737      list(APPEND EXTERNAL_LIBRARIES ${OSMESA_LIB})
     738    endif()
     739  endif()
     740
     741  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Graphics)
     742    set(OpenGL_GL_PREFERENCE "LEGACY")
     743    find_package(OpenGL REQUIRED)
     744    if(OPENGL_GLU_FOUND AND OPENGL_FOUND)
     745      add_subdirectory(Graphics)
     746      set_config_option(HAVE_OPENGL "OpenGL")
     747    else()
     748      message(SEND_ERROR "Could not find GLU: disabling OpenGL support")
     749    endif()
     750  endif()
     751endif()
     752
     753if(ENABLE_ANN)
     754  find_library(ANN_LIB ANN PATH_SUFFIXES lib)
     755  find_path(ANN_INC "ANN.h" PATH_SUFFIXES src include ANN)
     756  if(ENABLE_SYSTEM_CONTRIB AND ANN_LIB AND ANN_INC)
     757    message(STATUS "Using system version of ANN")
     758    list(APPEND EXTERNAL_LIBRARIES ${ANN_LIB})
     759    list(APPEND EXTERNAL_INCLUDES ${ANN_INC})
     760    set_config_option(HAVE_ANN "Ann[system]")
     761  elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/ANN)
     762    add_subdirectory(contrib/ANN)
     763    include_directories(contrib/ANN/include)
     764    set_config_option(HAVE_ANN "Ann")
     765  endif()
     766endif()
     767
     768if(ENABLE_ALGLIB)
     769  find_library(ALGLIB_LIB alglib PATH_SUFFIXES lib)
     770  find_path(ALGLIB_INC "stdafx.h" PATH_SUFFIXES include)
     771  if(ENABLE_SYSTEM_CONTRIB AND ALGLIB_LIB AND ALGLIB_INC)
     772    list(APPEND EXTERNAL_LIBRARIES ${ALGLIB_LIB})
     773    list(APPEND EXTERNAL_INCLUDES ${ALGLIB_INC})
     774    set_config_option(HAVE_ALGLIB "ALGLIB[system]")
     775  elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/ALGLIB)
     776    add_subdirectory(contrib/ALGLIB)
     777    include_directories(contrib/ALGLIB)
     778    set_config_option(HAVE_ALGLIB "ALGLIB")
     779  endif()
     780endif()
     781
     782if(HAVE_FLTK AND ENABLE_CAIRO)
     783  find_library(CAIRO_LIB cairo)
     784  find_path(CAIRO_INC "cairo/cairo.h" PATH_SUFFIXES include)
     785  if(CAIRO_INC AND CAIRO_LIB)
     786     set_config_option(HAVE_CAIRO "Cairo")
     787     list(APPEND EXTERNAL_LIBRARIES ${CAIRO_LIB})
     788     list(APPEND EXTERNAL_INCLUDES ${CAIRO_INC})
     789  endif()
     790endif()
     791
     792if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/DiscreteIntegration AND
     793   ENABLE_DINTEGRATION)
     794  add_subdirectory(contrib/DiscreteIntegration)
     795  include_directories(contrib/DiscreteIntegration)
     796  set_config_option(HAVE_DINTEGRATION "DIntegration")
     797endif()
     798
     799if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/HighOrderMeshOptimizer AND
     800   EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MeshOptimizer AND
     801   EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MeshQualityOptimizer AND
     802   ENABLE_OPTHOM AND HAVE_MESH)
     803  add_subdirectory(contrib/HighOrderMeshOptimizer)
     804  include_directories(contrib/HighOrderMeshOptimizer)
     805  add_subdirectory(contrib/MeshOptimizer)
     806  include_directories(contrib/MeshOptimizer)
     807  include_directories(${CMAKE_CURRENT_BINARY_DIR}/contrib/MeshOptimizer)
     808  add_subdirectory(contrib/MeshQualityOptimizer)
     809  include_directories(contrib/MeshQualityOptimizer)
     810  set_config_option(HAVE_OPTHOM "OptHom")
     811endif()
     812
     813if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/domhex AND
     814   ENABLE_DOMHEX AND HAVE_MESH)
     815  add_subdirectory(contrib/domhex)
     816  include_directories(contrib/domhex)
     817  set_config_option(HAVE_DOMHEX "DomHex")
     818endif()
     819
     820if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/QuadTri AND
     821   ENABLE_QUADTRI AND HAVE_MESH)
     822  add_subdirectory(contrib/QuadTri)
     823  include_directories(contrib/QuadTri)
     824  set_config_option(HAVE_QUADTRI "QuadTri")
     825endif()
     826
     827if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/kbipack AND ENABLE_KBIPACK)
     828  set_config_option(HAVE_KBIPACK "Kbipack")
     829  add_subdirectory(contrib/kbipack)
     830  include_directories(contrib/kbipack)
     831  if(ENABLE_GMP)
     832    find_library(GMP_LIB libgmp.a)
     833    find_path(GMP_INC "gmp.h" PATH_SUFFIXES src include)
     834  endif()
     835  if(GMP_LIB AND GMP_INC)
     836    set_config_option(HAVE_GMP "GMP")
     837    list(APPEND EXTERNAL_LIBRARIES ${GMP_LIB})
     838    list(APPEND EXTERNAL_INCLUDES ${GMP_INC})
     839  else()
     840    message(STATUS "GMP not found: Kbipack uses long int")
     841  endif()
     842endif()
     843
     844if(ENABLE_MATHEX)
     845  find_library(MATHEX_LIB mathex PATH_SUFFIXES lib)
     846  find_path(MATHEX_INC "mathex.h" PATH_SUFFIXES src include)
     847  if(ENABLE_SYSTEM_CONTRIB AND MATHEX_LIB AND MATHEX_INC)
     848    list(APPEND EXTERNAL_LIBRARIES ${MATHEX_LIB})
     849    list(APPEND EXTERNAL_INCLUDES ${MATHEX_INC})
     850    set_config_option(HAVE_MATHEX "MathEx[system]")
     851  elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/MathEx)
     852    add_subdirectory(contrib/MathEx)
     853    include_directories(contrib/MathEx)
     854    set_config_option(HAVE_MATHEX "MathEx")
     855  endif()
     856endif()
     857
     858if(ENABLE_MPI)
     859  find_package(MPI)
     860  if(MPI_FOUND)
     861    set_config_option(HAVE_MPI "MPI")
     862    list(APPEND EXTERNAL_INCLUDES ${MPI_CXX_INCLUDE_PATH})
     863    list(APPEND EXTERNAL_LIBRARIES ${MPI_CXX_LIBRARIES})
     864    set(CMAKE_C_COMPILER ${MPI_C_COMPILER})
     865    set(CMAKE_CXX_COMPILER ${MPI_CXX_COMPILER})
     866    set(CMAKE_Fortran_COMPILER ${MPI_Fortran_COMPILER})
     867  endif()
     868endif()
     869
     870if(ENABLE_POPPLER)
     871  find_library(POPPLER_LIB poppler)
     872  find_library(POPPLER_CPP_LIB poppler-cpp)
     873  find_path(POPPLER_INC "poppler/cpp/poppler-document.h" PATH_SUFFIXES src include)
     874  if(POPPLER_LIB AND POPPLER_INC)
     875    set_config_option(HAVE_POPPLER "Poppler")
     876    list(APPEND EXTERNAL_LIBRARIES ${POPPLER_LIB})
     877    list(APPEND EXTERNAL_LIBRARIES ${POPPLER_CPP_LIB})
     878    list(APPEND EXTERNAL_INCLUDES ${POPPLER_INC})
     879  endif()
     880endif()
     881
     882if(ENABLE_P4EST)
     883  find_library(P4EST_LIB p4est)
     884  find_path(P4EST_INC "p4est.h" PATH_SUFFIXES src)
     885  find_library(SC_LIB sc)
     886  if(P4EST_LIB AND P4EST_INC AND SC_LIB)
     887    set_config_option(HAVE_P4EST "P4est")
     888    list(APPEND EXTERNAL_LIBRARIES ${P4EST_LIB} ${SC_LIB})
     889    list(APPEND EXTERNAL_INCLUDES ${P4EST_INC})
     890  endif()
     891endif()
     892
     893if(HAVE_MESH OR HAVE_SOLVER)
     894  if(ENABLE_METIS)
     895    if(METIS_ROOT)
     896      find_library(METIS_LIB metis PATHS ${METIS_ROOT} PATH_SUFFIXES lib)
     897      find_path(METIS_INC "metis.h" PATHS ${METIS_ROOT} PATH_SUFFIXES include)
     898      list(APPEND EXTERNAL_LIBRARIES ${METIS_LIB})
     899      list(APPEND EXTERNAL_INCLUDES ${METIS_INC})
     900      set_config_option(HAVE_METIS "Metis")
     901    else()
     902      find_library(METIS_LIB metis PATH_SUFFIXES lib)
     903      find_path(METIS_INC "metis.h" PATH_SUFFIXES include)
     904      if(ENABLE_SYSTEM_CONTRIB AND METIS_LIB AND METIS_INC)
     905        message(STATUS "Using system version of METIS")
     906        list(APPEND EXTERNAL_LIBRARIES ${METIS_LIB})
     907        list(APPEND EXTERNAL_INCLUDES ${METIS_INC})
     908        set_config_option(HAVE_METIS "Metis[system]")
     909      elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/metis)
     910        add_definitions(-DUSE_GKREGEX)
     911        add_subdirectory(contrib/metis)
     912        include_directories(contrib/metis/include contrib/metis/libmetis
     913                          contrib/metis/GKlib)
     914        set_config_option(HAVE_METIS "Metis")
     915      endif()
     916    endif()
     917  endif()
     918endif()
     919
     920if(HAVE_MESH)
     921  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Mesh/tetgenBR.cxx)
     922    set_config_option(HAVE_TETGENBR "TetGen/BR")
     923  endif()
     924
     925  if(ENABLE_VOROPP)
     926    find_library(VOROPP_LIB voro++ PATH_SUFFIXES lib)
     927    find_path(VOROPP_INC "voro++.hh" PATH_SUFFIXES include)
     928    if(ENABLE_SYSTEM_CONTRIB AND VOROPP_LIB AND VOROPP_INC)
     929      message(STATUS "Using system version of voro++")
     930      list(APPEND EXTERNAL_LIBRARIES ${VOROPP_LIB})
     931      list(APPEND EXTERNAL_INCLUDES ${VOROPP_INC})
     932      set_config_option(HAVE_VOROPP "Voro++[system]")
     933    elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/voro++)
     934      add_subdirectory(contrib/voro++)
     935      include_directories(contrib/voro++/src)
     936      set_config_option(HAVE_VOROPP "Voro++")
     937    endif()
     938  endif()
     939
     940  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/blossom AND ENABLE_BLOSSOM)
     941    add_subdirectory(contrib/blossom)
     942    include_directories(contrib/blossom/MATCH contrib/blossom/concorde97
     943                        contrib/blossom/concorde97/INCLUDE)
     944    set_config_option(HAVE_BLOSSOM "Blossom")
     945  endif()
     946
     947  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/Netgen AND ENABLE_NETGEN)
     948    add_subdirectory(contrib/Netgen)
     949    include_directories(contrib/Netgen contrib/Netgen/libsrc/include
     950                        contrib/Netgen/nglib)
     951    set_config_option(HAVE_NETGEN "Netgen")
     952    add_definitions(-DNO_PARALLEL_THREADS -DNOTCL)
     953  endif()
     954
     955  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/bamg AND ENABLE_BAMG)
     956    add_subdirectory(contrib/bamg)
     957    include_directories(contrib/bamg contrib/bamg/bamglib)
     958    set_config_option(HAVE_BAMG "Bamg")
     959  endif()
     960
     961  if(ENABLE_MMG3D)
     962    find_library(MMG3D_LIB mmg3d PATH_SUFFIXES lib)
     963    find_path(MMG3D_INC "libmmg3d.h" PATH_SUFFIXES src include)
     964    if(ENABLE_SYSTEM_CONTRIB AND MMG3D_LIB AND MMG3D_INC)
     965      list(APPEND EXTERNAL_LIBRARIES ${MMG3D_LIB})
     966      list(APPEND EXTERNAL_INCLUDES ${MMG3D_INC})
     967      set_config_option(HAVE_MMG3D "Mmg3d[system]")
     968    elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/mmg3d)
     969      add_subdirectory(contrib/mmg3d)
     970      include_directories(contrib/mmg3d/build/sources)
     971      set_config_option(HAVE_MMG3D "Mmg3d")
     972    endif()
     973  endif()
     974endif()
     975
     976if(ENABLE_MED OR ENABLE_CGNS)
     977  find_package(HDF5)
     978  if(HDF5_FOUND)
     979    set(HDF5_LIB "${HDF5_C_LIBRARIES}")
     980    list(APPEND EXTERNAL_INCLUDES ${HDF5_INCLUDE_DIRS})
     981    if(ENABLE_MED)
     982      find_library(MED_LIB medC)
     983      if(MED_LIB)
     984        set_config_option(HAVE_MED "Med")
     985        list(APPEND EXTERNAL_LIBRARIES ${MED_LIB})
     986      endif()
     987    endif()
     988    if(ENABLE_CGNS)
     989      find_library(CGNS_LIB cgns HINTS ENV CGNS_ROOT PATH_SUFFIXES lib)
     990      find_path(CGNS_INC "cgnslib.h" HINTS ENV CGNS_ROOT PATH_SUFFIXES include)
     991      if(CGNS_LIB AND CGNS_INC)
     992        set_config_option(HAVE_LIBCGNS "Cgns")
     993        list(APPEND EXTERNAL_LIBRARIES ${CGNS_LIB})
     994        list(APPEND EXTERNAL_INCLUDES ${CGNS_INC})
     995        if(ENABLE_CGNS_CPEX0045)
     996          set_config_option(HAVE_LIBCGNS_CPEX0045 "Cgns_CPEX0045")
     997        endif()
     998      endif()
     999    endif()
     1000    if(MED_LIB OR CGNS_LIB)
     1001      list(APPEND EXTERNAL_LIBRARIES ${HDF5_LIB})
     1002      find_library(SZ_LIB NAMES szlib sz)
     1003      if(SZ_LIB)
     1004        list(APPEND EXTERNAL_LIBRARIES ${SZ_LIB})
     1005      endif()
     1006      if(NOT HAVE_LIBZ) # necessary for non-GUI builds
     1007        find_package(ZLIB)
     1008        if(ZLIB_FOUND)
     1009          set_config_option(HAVE_LIBZ "Zlib")
     1010          list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
     1011        endif()
     1012      endif()
     1013    endif()
     1014  else()
     1015    message(STATUS "HDF5 not found")
     1016  endif()
     1017endif()
     1018
     1019if(HAVE_SOLVER)
     1020  if(ENABLE_GMM)
     1021    find_path(GMM_INC "gmm.h" PATH_SUFFIXES src include include/gmm)
     1022    if(ENABLE_SYSTEM_CONTRIB AND GMM_INC)
     1023      message(STATUS "Using system version of GMM")
     1024      list(APPEND EXTERNAL_INCLUDES ${GMM_INC})
     1025      set_config_option(HAVE_GMM "Gmm[system]")
     1026    elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/gmm)
     1027      include_directories(contrib/gmm)
     1028      set_config_option(HAVE_GMM "Gmm")
     1029    endif()
     1030  endif()
     1031
     1032  if(ENABLE_PETSC)
     1033    if(PETSC_DIR)
     1034      set(ENV_PETSC_DIR ${PETSC_DIR})
     1035    else()
     1036      set(ENV_PETSC_DIR $ENV{PETSC_DIR})
     1037    endif()
     1038    if(PETSC_ARCH)
     1039      set(ENV_PETSC_ARCH ${PETSC_ARCH})
     1040    else()
     1041      set(ENV_PETSC_ARCH $ENV{PETSC_ARCH})
     1042    endif()
     1043    set(PETSC_POSSIBLE_CONF_FILES
     1044        ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/conf/petscvariables
     1045        ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib/petsc-conf/petscvariables
     1046        ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib/petsc/conf/petscvariables)
     1047    foreach(FILE ${PETSC_POSSIBLE_CONF_FILES})
     1048      if(EXISTS ${FILE})
     1049        # old-style PETSc installations (using PETSC_DIR and PETSC_ARCH)
     1050        message(STATUS "Using PETSc dir: ${ENV_PETSC_DIR}")
     1051        message(STATUS "Using PETSc arch: ${ENV_PETSC_ARCH}")
     1052        # find includes by parsing the petscvariables file
     1053        file(STRINGS ${FILE} PETSC_VARIABLES NEWLINE_CONSUME)
     1054      endif()
     1055    endforeach()
     1056    if(PETSC_VARIABLES)
     1057      # try to find PETSC_CC_INCLUDES for PETSc >= 3.4
     1058      string(REGEX MATCH "PETSC_CC_INCLUDES = [^\n\r]*" PETSC_PACKAGES_INCLUDES
     1059             ${PETSC_VARIABLES})
     1060      if(PETSC_PACKAGES_INCLUDES)
     1061        string(REPLACE "PETSC_CC_INCLUDES = " "" PETSC_PACKAGES_INCLUDES
     1062               ${PETSC_PACKAGES_INCLUDES})
     1063      else()
     1064        # try to find PETSC_PACKAGES_INCLUDES in older versions
     1065        list(APPEND EXTERNAL_INCLUDES ${ENV_PETSC_DIR}/include)
     1066        list(APPEND EXTERNAL_INCLUDES ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/include)
     1067        string(REGEX MATCH "PACKAGES_INCLUDES = [^\n\r]*" PETSC_PACKAGES_INCLUDES
     1068               ${PETSC_VARIABLES})
     1069        string(REPLACE "PACKAGES_INCLUDES = " "" PETSC_PACKAGES_INCLUDES
     1070               ${PETSC_PACKAGES_INCLUDES})
     1071      endif()
     1072      if(PETSC_PACKAGES_INCLUDES)
     1073        if(PETSC_PACKAGES_INCLUDES)
     1074          string(REPLACE "-I" "" PETSC_PACKAGES_INCLUDES ${PETSC_PACKAGES_INCLUDES})
     1075          string(REPLACE " " ";" PETSC_PACKAGES_INCLUDES ${PETSC_PACKAGES_INCLUDES})
     1076          foreach(VAR ${PETSC_PACKAGES_INCLUDES})
     1077            # seem to include unexisting directories (/usr/include/lib64)
     1078            # check to avoid warnings
     1079            if(EXISTS ${VAR})
     1080              list(APPEND EXTERNAL_INCLUDES ${VAR})
     1081            endif()
     1082          endforeach()
     1083        endif()
     1084      endif()
     1085      # find libraries (<= 3.0)
     1086      set(PETSC_LIBS_REQUIRED petscksp petscdm petscmat petscvec petsc)
     1087      find_all_libraries(PETSC_LIBS PETSC_LIBS_REQUIRED
     1088                         ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib "")
     1089      # petsc 3.1 creates only one library (libpetsc)
     1090      if(NOT PETSC_LIBS)
     1091        find_library(PETSC_LIBS petsc PATHS ${ENV_PETSC_DIR}/${ENV_PETSC_ARCH}/lib
     1092                     NO_DEFAULT_PATH)
     1093      endif()
     1094      if(PETSC_LIBS)
     1095        set_config_option(HAVE_PETSC "PETSc")
     1096        if(NOT HAVE_BLAS)
     1097          set_config_option(HAVE_BLAS "Blas[petsc]")
     1098        endif()
     1099        if(NOT HAVE_LAPACK)
     1100          set_config_option(HAVE_LAPACK "Lapack[petsc]")
     1101        endif()
     1102      endif()
     1103      # find slepc (needs to be linked in before petsc)
     1104      if(ENABLE_SLEPC)
     1105        if(SLEPC_DIR)
     1106          set(ENV_SLEPC_DIR ${SLEPC_DIR})
     1107         else()
     1108          set(ENV_SLEPC_DIR $ENV{SLEPC_DIR})
     1109        endif()
     1110        find_library(SLEPC_LIB slepc PATHS ${ENV_SLEPC_DIR}/${ENV_PETSC_ARCH}/lib
     1111                     NO_DEFAULT_PATH)
     1112        if(SLEPC_LIB)
     1113          find_path(SLEPC_INC "slepc.h" PATHS ${ENV_SLEPC_DIR} PATH_SUFFIXES include
     1114                    ${ENV_PETSC_ARCH}/include include/slepc NO_DEFAULT_PATH)
     1115          if(SLEPC_INC)
     1116            message(STATUS "Using SLEPc dir: ${ENV_SLEPC_DIR}")
     1117            set_config_option(HAVE_SLEPC "SLEPc")
     1118            list(APPEND EXTERNAL_LIBRARIES ${SLEPC_LIB})
     1119            list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC})
     1120            find_path(SLEPC_INC2 "slepcconf.h" PATHS ${ENV_SLEPC_DIR}
     1121                      PATH_SUFFIXES ${ENV_PETSC_ARCH}/include NO_DEFAULT_PATH)
     1122            if(SLEPC_INC2)
     1123              list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC2})
     1124            endif()
     1125          endif()
     1126        endif()
     1127      endif()
     1128      list(APPEND EXTERNAL_LIBRARIES ${PETSC_LIBS})
     1129      # find additional libraries to link with
     1130      string(REGEX MATCH "PACKAGES_LIBS = [^\n\r]*" PLIBS ${PETSC_VARIABLES})
     1131      if(PLIBS)
     1132        string(REPLACE "PACKAGES_LIBS = " "" PLIBS ${PLIBS})
     1133        string(STRIP ${PLIBS} PLIBS)
     1134        list(APPEND EXTERNAL_LIBRARIES "${PLIBS}")
     1135      endif()
     1136      string(REGEX MATCH "PETSC_EXTERNAL_LIB_BASIC = [^\n\r]*" PLIBS_BASIC ${PETSC_VARIABLES})
     1137      if(PLIBS_BASIC)
     1138        string(REPLACE "PETSC_EXTERNAL_LIB_BASIC = " "" PLIBS_BASIC ${PLIBS_BASIC})
     1139        string(STRIP ${PLIBS_BASIC} PLIBS_BASIC)
     1140        separate_arguments(PLIBS_BASIC)
     1141        list(APPEND EXTERNAL_LIBRARIES "${PLIBS_BASIC}")
     1142      endif()
     1143      string(REGEX MATCH "PCC_LINKER_LIBS = [^\n\r]*" LLIBS ${PETSC_VARIABLES})
     1144      if(LLIBS)
     1145        string(REPLACE "PCC_LINKER_LIBS = " "" LLIBS ${LLIBS})
     1146        string(STRIP ${LLIBS} LLIBS)
     1147        list(APPEND EXTERNAL_LIBRARIES "${LLIBS}")
     1148      endif()
     1149    else()
     1150      # new-style PETSc installations (in standard system directories)
     1151      find_library(PETSC_LIBS petsc)
     1152      find_path(PETSC_INC "petsc.h" PATH_SUFFIXES include/petsc)
     1153      if(PETSC_LIBS AND PETSC_INC)
     1154        set_config_option(HAVE_PETSC "PETSc")
     1155        if(ENABLE_SLEPC)
     1156          find_library(SLEPC_LIB slepc)
     1157          find_path(SLEPC_INC "slepc.h" PATH_SUFFIXES include/slepc)
     1158          if(SLEPC_LIB AND SLEPC_INC)
     1159            set_config_option(HAVE_SLEPC "SLEPc")
     1160            list(APPEND EXTERNAL_LIBRARIES ${SLEPC_LIB})
     1161            list(APPEND EXTERNAL_INCLUDES ${SLEPC_INC})
     1162          endif()
     1163        endif()
     1164        list(APPEND EXTERNAL_LIBRARIES ${PETSC_LIBS})
     1165        list(APPEND EXTERNAL_INCLUDES ${PETSC_INC})
     1166      endif()
     1167    endif()
     1168  endif()
     1169
     1170  if(ENABLE_MUMPS AND HAVE_BLAS AND HAVE_LAPACK)
     1171    set(MUMPS_LIBS_REQUIRED smumps dmumps cmumps zmumps mumps_common pord)
     1172    if(NOT ENABLE_MPI)
     1173      list(APPEND MUMPS_LIBS_REQUIRED mpiseq)
     1174    endif()
     1175    find_all_libraries(MUMPS_LIBRARIES MUMPS_LIBS_REQUIRED "" "lib")
     1176    find_path(SMUMPS_INC "smumps_c.h" PATH_SUFFIXES src include)
     1177    find_path(DMUMPS_INC "dmumps_c.h" PATH_SUFFIXES src include)
     1178    find_path(CMUMPS_INC "cmumps_c.h" PATH_SUFFIXES src include)
     1179    find_path(ZMUMPS_INC "zmumps_c.h" PATH_SUFFIXES src include)
     1180    if(MUMPS_LIBRARIES AND SMUMPS_INC AND DMUMPS_INC AND CMUMPS_INC AND ZMUMPS_INC)
     1181      set_config_option(HAVE_MUMPS "MUMPS")
     1182      list(APPEND EXTERNAL_LIBRARIES ${MUMPS_LIBRARIES})
     1183      list(APPEND EXTERNAL_INCLUDES ${SMUMPS_INC})
     1184      list(APPEND EXTERNAL_INCLUDES ${DMUMPS_INC})
     1185      list(APPEND EXTERNAL_INCLUDES ${CMUMPS_INC})
     1186      list(APPEND EXTERNAL_INCLUDES ${ZMUMPS_INC})
     1187      find_library(GFORTRAN_LIB gfortran)
     1188      if(GFORTRAN_LIB)
     1189        list(APPEND EXTERNAL_LIBRARIES ${GFORTRAN_LIB})
     1190      endif()
     1191      if(ENABLE_GMM) # use GMM/MUMPS interface
     1192        add_definitions(-DGMM_USES_MUMPS)
     1193      endif()
     1194    endif()
     1195  endif()
     1196
     1197  if(ENABLE_GETDP)
     1198    find_library(GETDP_LIB GetDP)
     1199    find_path(GETDP_INC "GetDP.h" PATH_SUFFIXES getdp)
     1200    if(GETDP_LIB AND GETDP_INC)
     1201      set_config_option(HAVE_GETDP "GetDP")
     1202      list(APPEND EXTERNAL_LIBRARIES ${GETDP_LIB})
     1203      list(APPEND EXTERNAL_INCLUDES ${GETDP_INC})
     1204    endif()
     1205  endif()
     1206endif()
     1207
     1208if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt AND
     1209   ENABLE_HXT AND HAVE_METIS)
     1210  set_config_option(HAVE_HXT "Hxt")
     1211  add_subdirectory(contrib/hxt)
     1212  include_directories(BEFORE contrib/hxt)
     1213  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/hxt/hxt_tetDelaunay.c)
     1214    set_config_option(HAVE_HXT3D "Hxt3D")
     1215  endif()
     1216  if(MSVC)
     1217    # Visual C++ does not support C99 - force compilation as C++ code
     1218    file(GLOB_RECURSE HXT_SRC contrib/hxt/*.c)
     1219    set_compile_flags(HXT_SRC "/TP")
     1220  endif()
     1221  check_include_file("immintrin.h" HAVE_IMMINTRIN_H)
     1222  if(NOT HAVE_IMMINTRIN_H)
     1223    add_definitions(-DHAVE_NO_IMMINTRIN_H)
     1224  endif()
     1225  if(HAVE_PETSC)
     1226    add_definitions(-DHXT_HAVE_PETSC)
     1227  endif()
     1228  if(CMAKE_C_COMPILER MATCHES "pgi")
     1229    add_definitions(-DHAVE_NO_OPENMP_SIMD)
     1230  endif()
     1231endif()
     1232
     1233if(ENABLE_OCC)
     1234  set(OCC_MINIMAL_VERSION "6.9.1")
     1235  if(WIN32)
     1236    if(HAVE_64BIT_SIZE_T)
     1237      set(OCC_SYS_NAME win64)
     1238    else()
     1239      set(OCC_SYS_NAME win32)
     1240    endif()
     1241  else()
     1242    set(OCC_SYS_NAME ${CMAKE_SYSTEM_NAME})
     1243  endif()
     1244  find_path(OCC_INC "Standard_Version.hxx" HINTS ENV CASROOT PATH_SUFFIXES
     1245            inc include include/oce opencascade include/opencascade
     1246            occt include/occt)
     1247  if(OCC_INC)
     1248    file(STRINGS ${OCC_INC}/Standard_Version.hxx
     1249         OCC_MAJOR REGEX "#define OCC_VERSION_MAJOR.*")
     1250    file(STRINGS ${OCC_INC}/Standard_Version.hxx
     1251         OCC_MINOR REGEX "#define OCC_VERSION_MINOR.*")
     1252    file(STRINGS ${OCC_INC}/Standard_Version.hxx
     1253         OCC_MAINT REGEX "#define OCC_VERSION_MAINTENANCE.*")
     1254    if(OCC_MAJOR AND OCC_MINOR AND OCC_MAINT)
     1255      string(REGEX MATCH "[0-9]+" OCC_MAJOR "${OCC_MAJOR}")
     1256      string(REGEX MATCH "[0-9]+" OCC_MINOR "${OCC_MINOR}")
     1257      string(REGEX MATCH "[0-9]+" OCC_MAINT "${OCC_MAINT}")
     1258      set(OCC_VERSION "${OCC_MAJOR}.${OCC_MINOR}.${OCC_MAINT}")
     1259      message(STATUS "Found OpenCASCADE version ${OCC_VERSION} in ${OCC_INC}")
     1260    endif()
     1261  endif()
     1262  if(OCC_VERSION AND OCC_VERSION STRLESS ${OCC_MINIMAL_VERSION})
     1263    message(WARNING "Gmsh requires OpenCASCADE >= ${OCC_MINIMAL_VERSION}. "
     1264        "Use CMAKE_PREFIX_PATH or the CASROOT environment variable "
     1265        "to explicitely specify the installation path of OpenCASCADE")
     1266  elseif(OCC_INC)
     1267    set(OCC_LIBS_REQUIRED
     1268        # subset of DataExchange
     1269        TKSTEP TKSTEP209 TKSTEPAttr TKSTEPBase TKIGES TKXSBase
     1270        # ModelingAlgorithms
     1271        TKOffset TKFeat TKFillet TKBool TKMesh TKHLR TKBO TKPrim TKShHealing
     1272        TKTopAlgo TKGeomAlgo
     1273        # ModelingData
     1274        TKBRep TKGeomBase TKG3d TKG2d
     1275        # FoundationClasses
     1276        TKMath TKernel)
     1277    if(ENABLE_OCC_TBB)
     1278      list(APPEND OCC_LIBS_REQUIRED tbb tbbmalloc)
     1279    endif()
     1280    list(LENGTH OCC_LIBS_REQUIRED NUM_OCC_LIBS_REQUIRED)
     1281    if(OCC_LIBS)
     1282      message(STATUS "OCC libraries specified explicitly: " ${OCC_LIBS})
     1283      list(LENGTH OCC_LIBS_REQUIRED NUM_OCC_LIBS)
     1284    else()
     1285      set(OCC_LIBS)
     1286      foreach(OCC ${OCC_LIBS_REQUIRED})
     1287        if(ENABLE_OCC_STATIC)
     1288          set(LIBNAME lib${OCC}.a)
     1289        else()
     1290          set(LIBNAME ${OCC})
     1291        endif()
     1292        find_library(OCC_LIB ${LIBNAME} HINTS ENV CASROOT PATH_SUFFIXES
     1293                     lib ${OCC_SYS_NAME}/lib ${OCC_SYS_NAME}/vc8/lib)
     1294        if(OCC_LIB)
     1295          list(APPEND OCC_LIBS ${OCC_LIB})
     1296        else()
     1297          message(STATUS "OCC lib " ${LIBNAME} " not Found")
     1298        endif()
     1299        unset(OCC_LIB CACHE)
     1300      endforeach()
     1301      list(LENGTH OCC_LIBS NUM_OCC_LIBS)
     1302    endif()
     1303  endif()
     1304
     1305  # additional OCC libraries to handle reading of STEP/IGES attributes. Oh my...
     1306  if(ENABLE_OCC_CAF)
     1307    find_package(Freetype)
     1308    if(FREETYPE_FOUND)
     1309      set(OCC_CAF_LIBS_REQUIRED
     1310          TKXDESTEP TKXDEIGES TKXCAF TKLCAF TKVCAF TKCAF TKV3d TKService TKCDF)
     1311      list(LENGTH OCC_CAF_LIBS_REQUIRED NUM_OCC_CAF_LIBS_REQUIRED)
     1312      set(OCC_CAF_LIBS)
     1313      foreach(OCC ${OCC_CAF_LIBS_REQUIRED})
     1314        find_library(OCC_CAF_LIB ${OCC} HINTS ENV CASROOT PATH_SUFFIXES
     1315                     lib ${OCC_SYS_NAME}/lib ${OCC_SYS_NAME}/vc8/lib)
     1316        if(OCC_CAF_LIB)
     1317          list(APPEND OCC_CAF_LIBS ${OCC_CAF_LIB})
     1318        else()
     1319          message(STATUS "OCC CAF lib " ${OCC} " not Found")
     1320        endif()
     1321        unset(OCC_CAF_LIB CACHE)
     1322      endforeach()
     1323      list(LENGTH OCC_CAF_LIBS NUM_OCC_CAF_LIBS)
     1324    endif()
     1325  endif()
     1326
     1327  # append OCC CAF libraries first...
     1328  if(NUM_OCC_CAF_LIBS EQUAL NUM_OCC_CAF_LIBS_REQUIRED)
     1329    set_config_option(HAVE_OCC_CAF "OpenCASCADE-CAF")
     1330    list(APPEND EXTERNAL_LIBRARIES ${OCC_CAF_LIBS} ${FREETYPE_LIBRARIES})
     1331    list(APPEND EXTERNAL_INCLUDES ${FREETYPE_INCLUDE_DIRS})
     1332    if(WIN32)
     1333      list(APPEND EXTERNAL_LIBRARIES "windowscodecs")
     1334      list(APPEND EXTERNAL_LIBRARIES "ole32")
     1335    endif()
     1336  endif()
     1337
     1338  # then append OCC libraries
     1339  if(NUM_OCC_LIBS EQUAL NUM_OCC_LIBS_REQUIRED)
     1340    set_config_option(HAVE_OCC "OpenCASCADE")
     1341    list(APPEND EXTERNAL_LIBRARIES ${OCC_LIBS})
     1342    list(APPEND EXTERNAL_INCLUDES ${OCC_INC})
     1343    if(HAVE_64BIT_SIZE_T)
     1344      add_definitions(-D_OCC64)
     1345    endif()
     1346    if(WIN32)
     1347      list(APPEND EXTERNAL_LIBRARIES "winspool")
     1348      add_definitions(-DOCC_CONVERT_SIGNALS)
     1349    elseif(MSVC)
     1350      add_definitions(-DWNT)
     1351    endif()
     1352  endif()
     1353endif()
     1354
     1355if(ENABLE_ACIS)
     1356  find_library(ACIS_LIB SpaACIS PATH_SUFFIXES bin/maci386)
     1357  if(ACIS_LIB)
     1358    find_path(ACIS_INC "kernapi.hxx" PATH_SUFFIXES include)
     1359    if(ACIS_INC)
     1360      set_config_option(HAVE_ACIS "Acis")
     1361      list(APPEND EXTERNAL_LIBRARIES ${ACIS_LIB})
     1362      list(APPEND EXTERNAL_INCLUDES ${ACIS_INC})
     1363    endif()
     1364  endif()
     1365endif()
     1366
     1367if(ENABLE_ZIPPER)
     1368  if(ENABLE_BUILD_IOS)
     1369    set_config_option(HAVE_LIBZ "Zlib")
     1370  endif()
     1371  if(NOT HAVE_LIBZ) # necessary for non-GUI builds
     1372    find_package(ZLIB)
     1373    if(ZLIB_FOUND)
     1374      set_config_option(HAVE_LIBZ "Zlib")
     1375      list(APPEND EXTERNAL_LIBRARIES ${ZLIB_LIBRARIES})
     1376      list(APPEND EXTERNAL_INCLUDES ${ZLIB_INCLUDE_DIR})
     1377    endif()
     1378  endif()
     1379  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/zipper AND HAVE_LIBZ)
     1380    add_subdirectory(contrib/zipper)
     1381    include_directories(contrib/zipper)
     1382    set_config_option(HAVE_ZIPPER "Zipper")
     1383  endif()
     1384endif()
     1385
     1386if(ENABLE_PRIVATE_API AND ENABLE_WRAP_PYTHON)
     1387  find_package(SWIG REQUIRED)
     1388  include(${SWIG_USE_FILE})
     1389  find_package(PythonLibs)
     1390  if(SWIG_FOUND AND PYTHONLIBS_FOUND)
     1391    message(STATUS "Found SWIG version " ${SWIG_VERSION})
     1392    find_package(PythonInterp)
     1393    string(SUBSTRING ${SWIG_VERSION} 0 1 SWIG_MAJOR_VERSION)
     1394    if(SWIG_MAJOR_VERSION EQUAL 1)
     1395      message(WARNING "Python bindings require SWIG >= 2: disabling Python")
     1396    else()
     1397      set_config_option(HAVE_PYTHON "Python")
     1398      mark_as_advanced(CLEAR PYTHON_LIBRARY PYTHON_INCLUDE_DIR)
     1399      if(ENABLE_NUMPY)
     1400        if (NOT NUMPY_INC)
     1401          EXEC_PROGRAM (${PYTHON_EXECUTABLE}
     1402            ARGS "-c \"import numpy; print(numpy.get_include())\""
     1403            OUTPUT_VARIABLE NUMPY_INC
     1404            RETURN_VALUE NUMPY_NOT_FOUND)
     1405        endif()
     1406        if(NUMPY_INC)
     1407          list(APPEND EXTERNAL_INCLUDES ${NUMPY_INC})
     1408          set_config_option(HAVE_NUMPY "Numpy")
     1409        endif()
     1410      endif()
     1411      if(HAVE_PETSC)
     1412        if(ENABLE_PETSC4PY)
     1413          EXECUTE_PROCESS(
     1414            COMMAND ${PYTHON_EXECUTABLE} -c "import petsc4py; print(petsc4py.get_include())"
     1415            OUTPUT_VARIABLE PETSC4PY_INC
     1416            RESULT_VARIABLE PETSC4PY_NOT_FOUND
     1417            ERROR_QUIET
     1418            OUTPUT_STRIP_TRAILING_WHITESPACE)
     1419          if(PETSC4PY_INC)
     1420            list(APPEND EXTERNAL_INCLUDES ${PETSC4PY_INC})
     1421            set_config_option(HAVE_PETSC4PY "PETSc4py")
     1422          endif()
     1423        endif()
     1424      endif()
     1425    endif()
     1426  endif()
     1427endif()
     1428
     1429check_function_exists(vsnprintf HAVE_VSNPRINTF)
     1430if(NOT HAVE_VSNPRINTF AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
     1431  set_config_option(HAVE_NO_VSNPRINTF "NoVsnprintf")
     1432endif()
     1433
     1434check_include_file(sys/socket.h HAVE_SYS_SOCKET_H)
     1435if(HAVE_SYS_SOCKET_H)
     1436  set(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h)
     1437endif()
     1438check_type_size(socklen_t SOCKLEN_T_SIZE)
     1439set(CMAKE_EXTRA_INCLUDE_FILES)
     1440if(NOT SOCKLEN_T_SIZE AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
     1441  set_config_option(HAVE_NO_SOCKLEN_T "NoSocklenT")
     1442endif()
     1443
     1444check_include_file(stdint.h HAVE_STDINT_H)
     1445if(HAVE_STDINT_H)
     1446  set(CMAKE_EXTRA_INCLUDE_FILES stdint.h)
     1447else()
     1448  set_config_option(HAVE_NO_STDINT_H "NoStdintH")
     1449endif()
     1450check_type_size(intptr_t INTPTR_T_SIZE)
     1451set(CMAKE_EXTRA_INCLUDE_FILES)
     1452if(NOT INTPTR_T_SIZE AND NOT ENABLE_BUILD_IOS AND NOT ENABLE_BUILD_ANDROID)
     1453  set_config_option(HAVE_NO_INTPTR_T "NoIntptrT")
     1454endif()
     1455
     1456check_include_file(dlfcn.h DLFCN_H)
     1457if(DLFCN_H)
     1458  set_config_option(HAVE_DLOPEN "Dlopen")
     1459  list(APPEND EXTERNAL_LIBRARIES ${CMAKE_DL_LIBS})
     1460endif()
     1461
     1462if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
     1463  check_include_file(linux/joystick.h LINUX_JOYSTICK_H)
     1464  if(LINUX_JOYSTICK_H)
     1465    set_config_option(HAVE_LINUX_JOYSTICK "LinuxJoystick")
     1466  endif()
     1467endif()
     1468
     1469if(WIN32)
     1470  add_definitions(-D_USE_MATH_DEFINES)
     1471  list(APPEND EXTERNAL_LIBRARIES winmm wsock32 ws2_32 psapi)
     1472endif()
     1473
     1474if(MSVC)
     1475  add_definitions(-DNOMINMAX -D_CRT_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_DEPRECATE)
     1476endif()
     1477
     1478# add C functions API
     1479set(GMSH_SRC ${GMSH_SRC};api/gmshc.cpp)
     1480
     1481# force full warnings to encourage everybody to write clean(er) code
     1482check_cxx_compiler_flag("-Wall" WALL)
     1483if(WALL AND NOT MSVC)
     1484  file(GLOB_RECURSE WALL_SRC Common/*.cpp Fltk/*.cpp FunctionSpace/*.cpp
     1485       Geo/*.cpp Graphics/*.cpp Mesh/*.cpp Numeric/*.cpp Parser/*.cpp
     1486       Plugin/*.cpp Post/*.cpp Solver/*.cpp)
     1487  set(WF "-Wall")
     1488  check_cxx_compiler_flag("-Wint-to-void-pointer-cast" WCAST)
     1489  if(WCAST)
     1490    set(WF "${WF} -Wno-int-to-void-pointer-cast")
     1491  endif()
     1492  check_cxx_compiler_flag("-Wdeprecated-declarations" WDEPREC)
     1493  if(WDEPREC)
     1494    # FIXME: remove this when we have fixed the deprecated GLU code for OpenGL3
     1495    set(WF "${WF} -Wno-deprecated-declarations")
     1496  endif()
     1497  check_cxx_compiler_flag("-Wmisleading-indentation" WIND)
     1498  if(WIND)
     1499    set(WF "${WF} -Wno-misleading-indentation")
     1500  endif()
     1501  set_compile_flags(WALL_SRC ${WF})
     1502endif()
     1503
     1504# don't issue warnings for contributed libraries
     1505check_cxx_compiler_flag("-w" NOWARN)
     1506if(NOWARN)
     1507  file(GLOB_RECURSE NOWARN_SRC contrib/*.cpp contrib/*.cc contrib/*.cxx contrib/*.c)
     1508  set_compile_flags(NOWARN_SRC "-w")
     1509endif()
     1510
     1511# disable compile optimization on some known problematic files
     1512check_cxx_compiler_flag("-O0" NOOPT)
     1513if(NOOPT OR ENABLE_BUILD_IOS)
     1514  if(ENABLE_BUILD_IOS) # optimized iOS 10 64 bits screws somewhere in Geo
     1515    file(GLOB_RECURSE NOOPT_SRC Numeric/robustPredicates.cpp Geo/G*.cpp Mesh/BDS.cpp
     1516         Parser/Gmsh.tab.cpp contrib/blossom/* Mesh/Background*)
     1517  else()
     1518    file(GLOB_RECURSE NOOPT_SRC Numeric/robustPredicates.cpp Mesh/BDS.cpp
     1519         Parser/Gmsh.tab.cpp contrib/blossom/* contrib/bamg/* Mesh/Background*)
     1520  endif()
     1521  set_compile_flags(NOOPT_SRC "-O0")
     1522endif()
     1523
     1524# do not use arithmetic contraction in predicates.cpp
     1525# if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
     1526#   set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
     1527#     COMPILE_FLAGS "/fp:strict")
     1528# elseif(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
     1529#   set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
     1530#     COMPILE_FLAGS "-fno-unsafe-math-optimizations -ffp-contract=off")
     1531# elseif(CMAKE_C_COMPILER_ID STREQUAL "Intel")
     1532#   set_source_files_properties(Numeric/robustPredicates.cpp PROPERTIES
     1533#     COMPILE_FLAGS "-fp-model strict")
     1534# endif()
     1535
     1536# enable Revoropt and set compile flags for the corresponding plugin
     1537if(ENABLE_REVOROPT)
     1538  find_path(EIGEN3_INC "eigen3/Eigen/Dense")
     1539  if(EIGEN3_INC AND HAVE_MESH AND HAVE_PLUGINS AND HAVE_ANN AND HAVE_ALGLIB)
     1540    list(APPEND EXTERNAL_INCLUDES ${EIGEN3_INC} contrib/Revoropt/include)
     1541    message(STATUS "using contrib/Revoropt")
     1542    set_config_option(HAVE_REVOROPT "Revoropt")
     1543    add_definitions(-DUSE_ANN)
     1544    get_source_file_property(PROP Plugin/CVTRemesh.cpp COMPILE_FLAGS)
     1545    if(PROP)
     1546      set_source_files_properties(Plugin/CVTRemesh.cpp PROPERTIES
     1547                                  COMPILE_FLAGS "${PROP} -std=c++11")
     1548    else()
     1549      set_source_files_properties(Plugin/CVTRemesh.cpp PROPERTIES
     1550                                  COMPILE_FLAGS "-std=c++11")
     1551    endif()
     1552  else()
     1553    message(WARNING "Revoropt requires Eigen3, Mesh, Plugins, ANN and ALGLIB")
     1554  endif()
     1555endif()
     1556
     1557list(SORT CONFIG_OPTIONS)
     1558set(GMSH_CONFIG_OPTIONS "")
     1559foreach(OPT ${CONFIG_OPTIONS})
     1560  set(GMSH_CONFIG_OPTIONS "${GMSH_CONFIG_OPTIONS} ${OPT}")
     1561endforeach()
     1562
     1563configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Common/GmshConfig.h.in
     1564               ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshConfig.h)
     1565configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Common/GmshVersion.h.in
     1566               ${CMAKE_CURRENT_BINARY_DIR}/Common/GmshVersion.h)
     1567
     1568# the texi version file is modified in the source directory (not ideal, but
     1569# since git tracks the contents of the file this is acceptable as it will only
     1570# change when the actual version is changed - not for each git hash)
     1571configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo/version.texi.in
     1572               ${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo/version.texi)
     1573
     1574file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/version.txt
     1575     ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}.${GMSH_PATCH_VERSION})
     1576
     1577# process cmake environment variables so we can append them to the -I include
     1578# commands. This is not recommended (we should only use the cache variables) but
     1579# it is very convenient: otherwise we have to remember providing the
     1580# -D... options to cmake for each new build.
     1581set(ENV_CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH})
     1582set(ENV_CMAKE_INCLUDE_PATH $ENV{CMAKE_INCLUDE_PATH})
     1583if(UNIX)
     1584  if(ENV_CMAKE_PREFIX_PATH)
     1585    string(REPLACE ":" ";" ENV_CMAKE_PREFIX_PATH ${ENV_CMAKE_PREFIX_PATH})
     1586  endif()
     1587  if(ENV_CMAKE_INCLUDE_PATH)
     1588    string(REPLACE ":" ";" ENV_CMAKE_INCLUDE_PATH ${ENV_CMAKE_INCLUDE_PATH})
     1589  endif()
     1590endif()
     1591list(APPEND EXTERNAL_INCLUDES ${CMAKE_INCLUDE_PATH} ${ENV_CMAKE_INCLUDE_PATH})
     1592list(APPEND EXTERNAL_INCLUDES ${CMAKE_PREFIX_PATH} ${ENV_CMAKE_PREFIX_PATH})
     1593foreach(DIR ${CMAKE_PREFIX_PATH} ${ENV_CMAKE_PREFIX_PATH})
     1594  list(APPEND EXTERNAL_INCLUDES ${DIR}/include)
     1595endforeach()
     1596
     1597if(EXTERNAL_INCLUDES)
     1598  list(REMOVE_DUPLICATES EXTERNAL_INCLUDES)
     1599endif()
     1600
     1601if(HAVE_FLTK)
     1602  set(LINK_LIBRARIES ${FLTK_LIBRARIES} ${EXTERNAL_LIBRARIES}
     1603                     ${OPENGL_LIBRARIES} ${LAPACK_LIBRARIES})
     1604elseif(HAVE_OPENGL)
     1605  set(LINK_LIBRARIES ${EXTERNAL_LIBRARIES} ${OPENGL_LIBRARIES}
     1606                     ${LAPACK_LIBRARIES})
     1607else()
     1608  set(LINK_LIBRARIES ${EXTERNAL_LIBRARIES} ${LAPACK_LIBRARIES})
     1609endif()
     1610
     1611# try to use static gfortran on static builds (cannot do this on dynamic builds
     1612# as e.g. Debian compiles libgfortran.a without -fPIC: sigh...)
     1613if(NOT ENABLE_BUILD_DYNAMIC AND NOT ENABLE_BUILD_SHARED)
     1614  find_library(GFORTRAN_STATIC libgfortran.a)
     1615  if(GFORTRAN_STATIC)
     1616    set(CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES)
     1617    message(STATUS "Using static libgfortran")
     1618    foreach(STR ${LINK_LIBRARIES})
     1619      string(REPLACE "-lgfortran" ${GFORTRAN_STATIC} STR2 ${STR})
     1620      list(APPEND LINK_LIBRARIES2 ${STR2})
     1621    endforeach()
     1622    set(LINK_LIBRARIES ${LINK_LIBRARIES2})
     1623  endif()
     1624endif()
     1625
     1626# Linux-specific linking
     1627if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
     1628  if(HAVE_OCC)
     1629    find_library(RT_LIB rt)
     1630    if(RT_LIB)
     1631      list(APPEND LINK_LIBRARIES ${RT_LIB})
     1632    endif()
     1633  endif()
     1634  if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Intel")
     1635    add_definitions(-fPIC)
     1636  endif()
     1637endif()
     1638
     1639# we could specify include dirs more selectively, but this is simpler
     1640include_directories(Common Fltk Geo Graphics Mesh Solver Numeric Parser
     1641  Plugin Post api ${EXTERNAL_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR}/Common)
     1642
     1643# set this for external codes that might include this CMakeList file
     1644set(GMSH_EXTERNAL_INCLUDE_DIRS ${EXTERNAL_INCLUDES} CACHE
     1645    STRING "External include directories" FORCE)
     1646set(GMSH_EXTERNAL_LIBRARIES ${LINK_LIBRARIES} CACHE
     1647    STRING "External libraries" FORCE)
     1648
     1649# group sources for easier navigation in IDEs
     1650foreach(DIR ${GMSH_DIRS})
     1651  string(REGEX REPLACE "\\+" "\\\\+" DIR ${DIR})
     1652  source_group(${DIR} REGULAR_EXPRESSION ${DIR}/.*)
     1653endforeach()
     1654
     1655# static library target
     1656if(ENABLE_BUILD_LIB)
     1657  add_library(lib STATIC ${GMSH_SRC})
     1658  set_target_properties(lib PROPERTIES OUTPUT_NAME gmsh)
     1659  if(MSVC)
     1660    set_target_properties(lib PROPERTIES DEBUG_POSTFIX d)
     1661    if(ENABLE_MSVC_STATIC_RUNTIME)
     1662      set_target_properties(lib PROPERTIES LINK_FLAGS_RELEASE "/nodefaultlib:LIBCMT")
     1663    endif()
     1664  endif()
     1665endif()
     1666
     1667# shared library target
     1668if(ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
     1669  add_library(shared SHARED ${GMSH_SRC})
     1670  set_target_properties(shared PROPERTIES OUTPUT_NAME gmsh
     1671     VERSION ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}.${GMSH_PATCH_VERSION}
     1672     SOVERSION ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION})
     1673  if(WIN32)
     1674    set_target_properties(shared PROPERTIES PREFIX "" IMPORT_PREFIX ""
     1675      IMPORT_SUFFIX ".lib" COMPILE_FLAGS "-DGMSH_DLL -DGMSH_DLL_EXPORT")
     1676  endif()
     1677  target_link_libraries(shared ${LINK_LIBRARIES})
     1678  if(MSVC AND ENABLE_MSVC_STATIC_RUNTIME)
     1679    message(STATUS "Note: By enabling ENABLE_MSVC_STATIC_RUNTIME, shared library "
     1680            "won't link. In MSVC change /MT to /MD in the shared project properties")
     1681  endif()
     1682endif()
     1683
     1684# binary targets
     1685if(HAVE_FLTK)
     1686  if(ENABLE_BUILD_DYNAMIC)
     1687    add_executable(gmsh WIN32 Common/Main.cpp)
     1688    target_link_libraries(gmsh shared)
     1689  else()
     1690    add_executable(gmsh WIN32 Common/Main.cpp ${GMSH_SRC})
     1691  endif()
     1692  # we could add this to create a minimal app bundle even without install
     1693  # if(APPLE AND NOT ENABLE_OS_SPECIFIC_INSTALL)
     1694  #  set_target_properties(gmsh PROPERTIES MACOSX_BUNDLE ON
     1695  #    MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_dev.plist)
     1696  # endif()
     1697else()
     1698  if(ENABLE_BUILD_DYNAMIC)
     1699    add_executable(gmsh Common/Main.cpp)
     1700    target_link_libraries(gmsh shared)
     1701  else()
     1702    add_executable(gmsh Common/Main.cpp ${GMSH_SRC})
     1703  endif()
     1704endif()
     1705target_link_libraries(gmsh ${LINK_LIBRARIES})
     1706
     1707# Windows specific linker options
     1708if(WIN32 AND NOT MSVC)
     1709  set(FLAGS "-Wl,--stack,16777216 -mwindows")
     1710  if(HAVE_64BIT_SIZE_T)
     1711    set(FLAGS "${FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/Win64Icon.res")
     1712  else()
     1713    set(FLAGS "${FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/Win32Icon.res")
     1714  endif()
     1715  set_target_properties(gmsh PROPERTIES LINK_FLAGS "${FLAGS} -static")
     1716  if(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
     1717    set_target_properties(shared PROPERTIES LINK_FLAGS -static)
     1718  endif()
     1719  # remove -Wl,-Bdynamic flags
     1720  set(CMAKE_EXE_LINK_DYNAMIC_C_FLAGS)
     1721  set(CMAKE_EXE_LINK_DYNAMIC_CXX_FLAGS)
     1722elseif(MSVC)
     1723  set_target_properties(gmsh PROPERTIES LINK_FLAGS "/STACK:16777216 /SAFESEH:NO")
     1724endif()
     1725
     1726# android target
     1727if(ENABLE_BUILD_ANDROID)
     1728  find_file(CMAKE_TOOLCHAIN_FILE "android.toolchain.cmake")
     1729  if(NOT CMAKE_TOOLCHAIN_FILE)
     1730    message(FATAL_ERROR "Cannot compile Gmsh for android without android-cmake")
     1731  endif()
     1732  add_definitions(-D_GLIBCXX_USE_C99_MATH=1)
     1733  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
     1734  set(CMAKE_BUILD_TYPE Release)
     1735  set(LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_CURRENT_BINARY_DIR})
     1736  set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/libs/)
     1737  add_definitions(-DBUILD_ANDROID)
     1738  add_definitions(-DPICOJSON_USE_LOCALE=0)
     1739  add_library(androidGmsh SHARED ${GMSH_SRC})
     1740  set_target_properties(androidGmsh PROPERTIES OUTPUT_NAME gmsh)
     1741  target_link_libraries(androidGmsh ${EXTERNAL_LIBRARIES} ${LAPACK_LIBRARIES})
     1742  add_custom_command(TARGET androidGmsh POST_BUILD COMMAND
     1743                     ${CMAKE_STRIP} ${LIBRARY_OUTPUT_PATH}/libgmsh.so)
     1744endif()
     1745
     1746# parser target
     1747find_program(BISON bison)
     1748find_program(FLEX flex)
     1749if(BISON AND FLEX)
     1750  add_custom_target(parser
     1751                    COMMAND ${BISON} -p gmsh_yy --output Gmsh.tab.cpp -d Gmsh.y
     1752                    COMMAND ${FLEX} -P gmsh_yy -o Gmsh.yy.cpp Gmsh.l
     1753                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Parser)
     1754endif()
     1755
     1756if(UNIX)
     1757  # cannot use cmake's file search functions here (they would only find files
     1758  # existing at configuration time)
     1759  add_custom_target(purge
     1760                    COMMAND rm -f `find . -name *~ -o -name *~~`
     1761                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
     1762  add_custom_target(etags
     1763                    COMMAND etags `find . -name *.cpp -o -name *.h -o -name *.y`
     1764                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
     1765endif()
     1766
     1767if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR
     1768   CMAKE_CXX_COMPILER_ID MATCHES "Clang")
     1769  execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion
     1770                  OUTPUT_VARIABLE CXX_COMPILER_VERSION
     1771                  OUTPUT_STRIP_TRAILING_WHITESPACE)
     1772else()
     1773  set(CXX_COMPILER_VERSION "Unknown")
     1774endif()
     1775
     1776set(WELCOME_FILE ${CMAKE_CURRENT_SOURCE_DIR}/doc/WELCOME.txt)
     1777set(SDK_FILE ${CMAKE_CURRENT_SOURCE_DIR}/doc/SDK.txt)
     1778set(LICENSE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt)
     1779set(CREDITS_FILE ${CMAKE_CURRENT_SOURCE_DIR}/CREDITS.txt)
     1780set(CHANGELOG_FILE ${CMAKE_CURRENT_SOURCE_DIR}/CHANGELOG.txt)
     1781file(GLOB TUTORIAL_GEO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/?*.*)
     1782file(GLOB TUTORIAL_CPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/c++/?*.*)
     1783file(GLOB TUTORIAL_C_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/c/?*.*)
     1784file(GLOB TUTORIAL_PY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/python/?*.*)
     1785file(GLOB TUTORIAL_JL_FILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/julia/?*.*)
     1786file(GLOB DEMOS ${CMAKE_CURRENT_SOURCE_DIR}/demos/*)
     1787foreach(SUBDIR ${DEMOS})
     1788  if(IS_DIRECTORY ${SUBDIR})
     1789    list(APPEND DEMOS_DIRS ${SUBDIR})
     1790  endif()
     1791endforeach()
     1792set(TEX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/doc/texinfo)
     1793file(GLOB TEX_SRC ${TEX_DIR}/*.texi)
     1794set(TEX_OBJ ${TEX_DIR}/gmsh.aux ${TEX_DIR}/gmsh.cp ${TEX_DIR}/gmsh.cps
     1795    ${TEX_DIR}/gmsh.fn ${TEX_DIR}/gmsh.html ${TEX_DIR}/gmsh.info ${TEX_DIR}/gmsh.ky
     1796    ${TEX_DIR}/gmsh.log ${TEX_DIR}/gmsh.pdf ${TEX_DIR}/gmsh.pg ${TEX_DIR}/gmsh.toc
     1797    ${TEX_DIR}/gmsh.tp ${TEX_DIR}/gmsh.tps ${TEX_DIR}/gmsh.txt ${TEX_DIR}/gmsh.vr)
     1798
     1799macro(unix2dos VARNAME)
     1800  file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/unix2dos)
     1801  set(UNIX2DOS_FILES)
     1802  foreach(FILE ${${VARNAME}})
     1803    file(READ ${FILE} F0)
     1804    get_filename_component(N ${FILE} NAME)
     1805    if(CYGWIN)
     1806      string(REGEX REPLACE "\n" "\r\n" F1 "${F0}")
     1807      file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N} "${F1}")
     1808    else() # if not in Cygwin, cmake adds '\r's automatically
     1809      file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N} "${F0}")
     1810    endif()
     1811    list(APPEND UNIX2DOS_FILES ${CMAKE_CURRENT_BINARY_DIR}/unix2dos/${N})
     1812  endforeach()
     1813  set(${VARNAME} ${UNIX2DOS_FILES})
     1814endmacro()
     1815
     1816if(WIN32)
     1817  if(ENABLE_OS_SPECIFIC_INSTALL)
     1818    set(GMSH_BIN .)
     1819    set(GMSH_LIB .)
     1820    set(GMSH_DOC .)
     1821    set(GMSH_MAN .)
     1822    set(GMSH_INC .)
     1823  else()
     1824    include(GNUInstallDirs)
     1825    set(GMSH_BIN ${CMAKE_INSTALL_BINDIR})
     1826    set(GMSH_LIB ${CMAKE_INSTALL_LIBDIR})
     1827    set(GMSH_DOC ${CMAKE_INSTALL_DOCDIR})
     1828    set(GMSH_MAN ${CMAKE_INSTALL_MANDIR}/man1)
     1829    set(GMSH_INC ${CMAKE_INSTALL_INCLUDEDIR})
     1830  endif()
     1831  if(CYGWIN)
     1832    unix2dos(GMSH_API)
     1833    if(ENABLE_PRIVATE_API)
     1834      unix2dos(GMSH_PRIVATE_API)
     1835    endif()
     1836    unix2dos(WELCOME_FILE)
     1837    unix2dos(SDK_FILE)
     1838    unix2dos(LICENSE_FILE)
     1839    unix2dos(CREDITS_FILE)
     1840    unix2dos(CHANGELOG_FILE)
     1841    unix2dos(TUTORIAL_GEO_FILES)
     1842    unix2dos(TUTORIAL_CPP_FILES)
     1843    unix2dos(TUTORIAL_C_FILES)
     1844    unix2dos(TUTORIAL_PY_FILES)
     1845    unix2dos(TUTORIAL_JL_FILES)
     1846    foreach(DIR ${DEMOS_DIRS})
     1847      file(GLOB DEMO_FILES ${DIR}/?*.*)
     1848      unix2dos(DEMO_FILES)
     1849    endforeach()
     1850  endif()
     1851elseif(APPLE AND ENABLE_OS_SPECIFIC_INSTALL)
     1852  # set these so that the files get installed nicely in the MacOSX
     1853  # .app bundle
     1854  set(GMSH_BIN ../MacOS)
     1855  set(GMSH_LIB ../MacOS)
     1856  set(GMSH_DOC ../../..)
     1857  set(GMSH_MAN ../../..)
     1858  set(GMSH_INC ../MacOS)
     1859else()
     1860  include(GNUInstallDirs)
     1861  set(GMSH_BIN ${CMAKE_INSTALL_BINDIR})
     1862  set(GMSH_LIB ${CMAKE_INSTALL_LIBDIR})
     1863  set(GMSH_DOC ${CMAKE_INSTALL_DOCDIR})
     1864  set(GMSH_MAN ${CMAKE_INSTALL_MANDIR}/man1)
     1865  set(GMSH_INC ${CMAKE_INSTALL_INCLUDEDIR})
     1866endif()
     1867
     1868# FIXME: change this once we understand rpaths
     1869if(APPLE)
     1870  if(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
     1871    set_target_properties(shared PROPERTIES INSTALL_NAME_DIR
     1872                          ${CMAKE_INSTALL_PREFIX}/${GMSH_LIB})
     1873  endif()
     1874endif()
     1875
     1876# mark targets as optional so we can install them separately if needed
     1877# (e.g. "make lib" or "make shared" followed by "make install/fast")
     1878install(TARGETS gmsh DESTINATION ${GMSH_BIN} OPTIONAL)
     1879if(ENABLE_BUILD_LIB)
     1880  install(TARGETS lib DESTINATION ${GMSH_LIB} OPTIONAL)
     1881endif()
     1882if(ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
     1883  install(TARGETS shared DESTINATION ${GMSH_LIB} OPTIONAL)
     1884endif()
     1885
     1886if(ENABLE_ONELAB)
     1887  install(FILES ${ONELAB_PY} DESTINATION ${GMSH_BIN})
     1888endif()
     1889if(ENABLE_BUILD_LIB OR ENABLE_BUILD_SHARED OR ENABLE_BUILD_DYNAMIC)
     1890  install(FILES ${GMSH_API} DESTINATION ${GMSH_INC})
     1891  install(FILES ${GMSH_PY} DESTINATION ${GMSH_LIB})
     1892  install(FILES ${GMSH_JL} DESTINATION ${GMSH_LIB})
     1893  if(ENABLE_PRIVATE_API)
     1894    install(FILES ${GMSH_PRIVATE_API} DESTINATION ${GMSH_INC}/gmsh)
     1895  endif()
     1896endif()
     1897if(INSTALL_SDK_README)
     1898  configure_file(${SDK_FILE} ${CMAKE_CURRENT_BINARY_DIR}/README.txt)
     1899  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/README.txt DESTINATION .)
     1900endif()
     1901install(FILES ${WELCOME_FILE} DESTINATION ${GMSH_DOC} RENAME README.txt)
     1902install(FILES ${LICENSE_FILE} DESTINATION ${GMSH_DOC})
     1903install(FILES ${CREDITS_FILE} DESTINATION ${GMSH_DOC})
     1904install(FILES ${CHANGELOG_FILE} DESTINATION ${GMSH_DOC})
     1905install(FILES ${TUTORIAL_GEO_FILES} DESTINATION ${GMSH_DOC}/tutorial)
     1906install(FILES ${TUTORIAL_CPP_FILES} DESTINATION ${GMSH_DOC}/tutorial/c++)
     1907install(FILES ${TUTORIAL_C_FILES} DESTINATION ${GMSH_DOC}/tutorial/c)
     1908install(FILES ${TUTORIAL_PY_FILES} DESTINATION ${GMSH_DOC}/tutorial/python)
     1909install(FILES ${TUTORIAL_JL_FILES} DESTINATION ${GMSH_DOC}/tutorial/julia)
     1910foreach(DIR ${DEMOS_DIRS})
     1911  get_filename_component(DEMOS_DIR_NAME ${DIR} NAME)
     1912  file(GLOB DEMO_FILES ${DIR}/?*.*)
     1913  install(FILES ${DEMO_FILES} DESTINATION ${GMSH_DOC}/demos/${DEMOS_DIR_NAME})
     1914endforeach()
     1915if(UNIX AND NOT CYGWIN)
     1916  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/doc/gmsh.1 DESTINATION ${GMSH_MAN})
     1917endif()
     1918
     1919add_custom_target(get_headers
     1920  COMMAND ${CMAKE_COMMAND} -E make_directory Headers/gmsh
     1921  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
     1922foreach(FILE ${GMSH_API})
     1923  add_custom_command(TARGET get_headers POST_BUILD COMMAND ${CMAKE_COMMAND}
     1924    -E copy_if_different ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/Headers/
     1925    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
     1926endforeach()
     1927if(ENABLE_PRIVATE_API)
     1928  foreach(FILE ${GMSH_PRIVATE_API})
     1929    add_custom_command(TARGET get_headers POST_BUILD COMMAND ${CMAKE_COMMAND}
     1930      -E copy_if_different ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/Headers/gmsh/
     1931      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
     1932  endforeach()
     1933endif()
     1934
     1935find_program(MAKEINFO makeinfo)
     1936if(MAKEINFO)
     1937  add_custom_command(OUTPUT ${TEX_DIR}/gmsh.info DEPENDS ${TEX_SRC}
     1938                     COMMAND ${MAKEINFO} --split-size 1000000
     1939                     ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
     1940  add_custom_target(info DEPENDS ${TEX_DIR}/gmsh.info)
     1941  add_custom_command(OUTPUT ${TEX_DIR}/gmsh.txt DEPENDS ${TEX_SRC}
     1942                     COMMAND ${MAKEINFO} --plaintext -o gmsh.txt
     1943                     ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
     1944  add_custom_target(txt DEPENDS ${TEX_DIR}/gmsh.txt)
     1945  add_custom_command(OUTPUT ${TEX_DIR}/gmsh.html DEPENDS ${TEX_SRC}
     1946    COMMAND ${MAKEINFO} --html --css-ref=http://gmsh.info/gmsh.css
     1947    --no-split --set-customization-variable
     1948    EXTRA_HEAD='<meta name="viewport" content="width=device-width,initial-scale=1.0">'
     1949    ARGS ${TEX_DIR}/gmsh.texi WORKING_DIRECTORY ${TEX_DIR})
     1950  add_custom_target(html DEPENDS ${TEX_DIR}/gmsh.html)
     1951  install(FILES ${TEX_DIR}/gmsh.html DESTINATION ${GMSH_DOC} OPTIONAL)
     1952else()
     1953  add_custom_target(html COMMAND ${CMAKE_COMMAND} -E touch ${TEX_DIR}/gmsh.html)
     1954endif()
     1955
     1956find_program(TEXI2PDF texi2pdf)
     1957if(TEXI2PDF)
     1958  add_custom_command(OUTPUT ${TEX_DIR}/gmsh.pdf DEPENDS ${TEX_SRC}
     1959                     COMMAND ${TEXI2PDF} ARGS gmsh.texi
     1960                     WORKING_DIRECTORY ${TEX_DIR})
     1961  add_custom_target(pdf DEPENDS ${TEX_DIR}/gmsh.pdf)
     1962  install(FILES ${TEX_DIR}/gmsh.pdf DESTINATION ${GMSH_DOC} OPTIONAL)
     1963endif()
     1964
     1965execute_process(COMMAND ${CMAKE_COMMAND} -E echo
     1966  "@c This file was generated by cmake: do not edit manually!\n${OPT_TEXI}"
     1967  OUTPUT_FILE cmake_options.texi)
     1968
     1969if(MAKEINFO AND TEXI2PDF)
     1970  add_custom_target(doc COMMAND ${CMAKE_COMMAND} -E tar zcf
     1971                    ${CMAKE_CURRENT_BINARY_DIR}/gmsh-${GMSH_VERSION}-doc.tgz
     1972                    CREDITS.txt LICENSE.txt CHANGELOG.txt
     1973                    doc/gmsh.1 doc/texinfo/gmsh.html doc/texinfo/gmsh.info
     1974                    doc/texinfo/gmsh.pdf doc/texinfo/gmsh.txt
     1975                    COMMAND ${CMAKE_COMMAND} -E remove ${TEX_OBJ}
     1976                    DEPENDS ${TEX_DIR}/gmsh.info ${TEX_DIR}/gmsh.txt
     1977                    ${TEX_DIR}/gmsh.html ${TEX_DIR}/gmsh.pdf
     1978                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
     1979endif()
     1980
     1981if(MAKEINFO OR TEXI2PDF)
     1982  add_custom_target(clean_doc COMMAND ${CMAKE_COMMAND} -E remove ${TEX_OBJ})
     1983endif()
     1984
     1985if(APPLE AND ENABLE_BUILD_LIB)
     1986  file(READ ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_framework.plist F0)
     1987  string(REPLACE GMSH_VERSION "${GMSH_VERSION}" F1 "${F0}")
     1988  file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/Info_framework.plist "${F1}")
     1989  get_target_property(LIBNAME lib LOCATION) # depracated
     1990  #set(LIBNAME $<TARGET_FILE:lib>) # FIXME: use this in the future
     1991  add_custom_target(framework DEPENDS lib
     1992    COMMAND ${CMAKE_COMMAND} -E remove_directory gmsh.framework
     1993    COMMAND ${CMAKE_COMMAND} -E make_directory gmsh.framework/Headers
     1994    COMMAND ${CMAKE_COMMAND} -E make_directory gmsh.framework/Resources
     1995    COMMAND ${CMAKE_COMMAND} -E copy ${LIBNAME} gmsh.framework/gmsh
     1996    COMMAND ${CMAKE_COMMAND} -E copy Info_framework.plist
     1997                                     gmsh.framework/Resources/Info.plist
     1998    COMMAND ${CMAKE_COMMAND} -E create_symlink . gmsh.framework/Headers/gmsh
     1999    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
     2000  foreach(FILE ${GMSH_API})
     2001    add_custom_command(TARGET framework POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy
     2002        ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/gmsh.framework/Headers/
     2003        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
     2004  endforeach()
     2005  if(ENABLE_PRIVATE_API)
     2006    foreach(FILE ${GMSH_PRIVATE_API})
     2007      add_custom_command(TARGET framework POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy
     2008          ${FILE} ${CMAKE_CURRENT_BINARY_DIR}/gmsh.framework/Headers/
     2009          WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
     2010    endforeach()
     2011  endif()
     2012endif()
     2013
     2014set(CPACK_PACKAGE_VENDOR "Christophe Geuzaine and Jean-Francois Remacle")
     2015set(CPACK_PACKAGE_VERSION_MAJOR ${GMSH_MAJOR_VERSION})
     2016set(CPACK_PACKAGE_VERSION_MINOR ${GMSH_MINOR_VERSION})
     2017set(CPACK_PACKAGE_VERSION_PATCH ${GMSH_PATCH_VERSION})
     2018set(CPACK_PACKAGE_DESCRIPTION_FILE ${WELCOME_FILE})
     2019set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
     2020    "3D finite element mesh generator with built-in CAD engine and post-processor")
     2021if(GMSH_EXTRA_VERSION MATCHES "-git.*") # so that we'll overwrite the archives
     2022  set(CPACK_PACKAGE_FILE_NAME gmsh-git-${GMSH_OS})
     2023  set(CPACK_SOURCE_PACKAGE_FILE_NAME gmsh-git-source)
     2024else()
     2025  set(CPACK_PACKAGE_FILE_NAME gmsh-${GMSH_VERSION}-${GMSH_OS})
     2026  set(CPACK_SOURCE_PACKAGE_FILE_NAME gmsh-${GMSH_VERSION}-source)
     2027endif()
     2028set(CPACK_PACKAGE_INSTALL_DIRECTORY "gmsh")
     2029set(CPACK_RESOURCE_FILE_LICENSE ${LICENSE_FILE})
     2030set(CPACK_RESOURCE_FILE_README ${WELCOME_FILE})
     2031set(CPACK_RESOURCE_FILE_WELCOME ${WELCOME_FILE})
     2032set(CPACK_PACKAGE_EXECUTABLE "gmsh")
     2033if(ENABLE_PACKAGE_STRIP)
     2034  set(CPACK_STRIP_FILES TRUE)
     2035else()
     2036  set(CPACK_STRIP_FILES FALSE)
     2037endif()
     2038set(CPACK_SOURCE_GENERATOR TGZ)
     2039set(CPACK_SOURCE_IGNORE_FILES "${CMAKE_CURRENT_BINARY_DIR}" "/CVS/" "/.svn" "/.git"
     2040    "~$" "DS_Store$" "GmshConfig.h$" "GmshVersion.h$" "/benchmarks/" "/tmp/"
     2041    "/bin/" "/lib/" "/nightly/" "GPATH" "GRTAGS" "GSYMS" "GTAGS" "/HTML/"
     2042    "/contrib/3M/" "/contrib/Parasolid/")
     2043
     2044if(UNIX)
     2045  # make sure we remove previous installs before doing the next one (on Mac for
     2046  # example "make package; make package_source" would lead to huge file lists
     2047  # getting generated due to the 'Applications' symlink in the bundle)
     2048  set(CPACK_INSTALL_COMMANDS "rm -rf ${CMAKE_CURRENT_BINARY_DIR}/_CPack_Packages")
     2049endif()
     2050
     2051if(APPLE AND ENABLE_OS_SPECIFIC_INSTALL)
     2052  set(CPACK_GENERATOR Bundle)
     2053  set(CPACK_BUNDLE_NAME Gmsh)
     2054  file(READ ${CMAKE_CURRENT_SOURCE_DIR}/utils/misc/gmsh_app.plist F0)
     2055  string(REPLACE GMSH_VERSION "${GMSH_VERSION}" F1 "${F0}")
     2056  file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/Info.plist "${F1}")
     2057  set(CPACK_BUNDLE_PLIST ${CMAKE_CURRENT_BINARY_DIR}/Info.plist)
     2058  set(CPACK_BUNDLE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIcons.icns)
     2059  if(PACKAGER STREQUAL "geuzaine - removed: we sign on a separate machine")
     2060    # codesigning requires CMake >= 3.2
     2061    set(CPACK_BUNDLE_APPLE_CERT_APP "Developer ID Application: Christophe Geuzaine")
     2062  endif()
     2063  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsGeo.icns DESTINATION .
     2064          RENAME GmshGeo.icns)
     2065  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsMsh.icns DESTINATION .
     2066          RENAME GmshMsh.icns)
     2067  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsSol.icns DESTINATION .
     2068          RENAME GmshSol.icns)
     2069  install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIconsPos.icns DESTINATION .
     2070          RENAME GmshPos.icns)
     2071  set(CPACK_PACKAGE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/Fltk/MacIcons.icns)
     2072elseif(WIN32)
     2073  set(CPACK_GENERATOR ZIP)
     2074else()
     2075  set(CPACK_GENERATOR TGZ)
     2076endif()
     2077
     2078if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/utils/wrappers/gmshpy AND
     2079   ENABLE_PRIVATE_API AND ENABLE_WRAP_PYTHON AND HAVE_PYTHON)
     2080  add_subdirectory(utils/wrappers/gmshpy)
     2081endif()
     2082
     2083if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/utils/wrappers/java AND
     2084   ENABLE_PRIVATE_API AND ENABLE_WRAP_JAVA)
     2085  add_subdirectory(utils/wrappers/java)
     2086endif()
     2087
     2088include(CPack)
     2089
     2090if(NOT DISABLE_GMSH_TESTS)
     2091  # disabling tests is useful when including this CMakeLists in an external project
     2092  include(CTest)
     2093  file(GLOB_RECURSE TESTFILES
     2094       tutorial/*.geo demos/*.geo benchmarks/?d/*.geo benchmarks/extrude/*.geo
     2095       benchmarks/occ/*.geo)
     2096  # disable this test for now on our Linux32 machine - the current config
     2097  # crashes on the OCC STL generation
     2098  if(${GMSH_OS} MATCHES "Linux32")
     2099    list(REMOVE_ITEM TESTFILES ${CMAKE_CURRENT_SOURCE_DIR}/tutorial/t18.geo)
     2100  endif()
     2101  foreach(TESTFILE ${TESTFILES})
     2102    # use relative path for Cygwin/MinGW (the pure win exe built with the MinGW
     2103    # compilers does not understand a full Cygwin-style path)
     2104    FILE(RELATIVE_PATH TEST ${CMAKE_CURRENT_BINARY_DIR} ${TESTFILE})
     2105    if(HAVE_OCC OR NOT ${TEST} MATCHES "boolean" OR NOT ${TEST} MATCHES "occ")
     2106      add_test(${TEST} ./gmsh ${TEST} -3 -nopopup -o ./tmp.msh)
     2107    endif()
     2108  endforeach()
     2109  # test c++ api tutorials with dynamic builds (except on 32 bit windows for
     2110  # now: our win32 setup does not currently handle exceptions)
     2111  if(ENABLE_BUILD_DYNAMIC AND NOT ${GMSH_OS} MATCHES "Windows32")
     2112    file(GLOB_RECURSE TESTFILES tutorial/c++/*.cpp)
     2113    foreach(TESTFILE ${TESTFILES})
     2114      get_filename_component(TEST ${TESTFILE} NAME_WE)
     2115      add_executable(${TEST} WIN32 ${TESTFILE})
     2116      target_link_libraries(${TEST} shared)
     2117      if(WIN32 AND NOT MSVC)
     2118        set_target_properties(${TEST} PROPERTIES LINK_FLAGS "-mwindows -static")
     2119      endif()
     2120      add_test(${TEST}_cpp ${TEST})
     2121    endforeach()
     2122  endif()
     2123endif()
     2124
     2125message(STATUS "")
     2126message(STATUS "Gmsh ${GMSH_VERSION} has been configured for ${GMSH_OS}")
     2127message(STATUS "")
     2128message(STATUS " * Build options:" ${GMSH_CONFIG_OPTIONS})
     2129message(STATUS " * Build type: " ${CMAKE_BUILD_TYPE})
     2130message(STATUS " * C compiler: " ${CMAKE_C_COMPILER})
     2131message(STATUS " * C++ compiler: " ${CMAKE_CXX_COMPILER})
     2132message(STATUS " * Install prefix: " ${CMAKE_INSTALL_PREFIX})
     2133message(STATUS "")
     2134
     2135mark_as_advanced(GMSH_EXTRA_VERSION
     2136                 ACIS_LIB ANN_INC ANN_LIB CAIRO_LIB CAIRO_INC CGNS_INC GMM_INC
     2137                 GMP_INC GMP_LIB MMG3D_INC MMG3D_LIB HDF5_LIB
     2138                 MED_LIB OCC_INC SZ_LIB
     2139                 PETSC_LIBS SLEPC_INC SLEPC_INC2 SLEPC_LIB
     2140                 BISON FLEX MAKEINFO TEXI2PDF FLTK_CONFIG_SCRIPT
     2141                 GMSH_EXTERNAL_INCLUDE_DIRS GMSH_EXTERNAL_LIBRARIES)
  • ../trunk-jpl/packagers/linux/package-issm-linux-binaries-matlab.sh

     
     1#!/bin/bash
     2
     3################################################################################
     4# To be used after running,
     5#
     6#       ${ISSM_DIR}/jenkins/jenkins.sh ${ISSM_DIR}/jenkins/ross-debian_linux-binaries-matlab
     7#
     8# in the context of a Jenkins project.
     9#
     10# When no runtime errors occur, performs the following:
     11# - Checks resulting executables and libraries against test suite.
     12# - Packages and compresses executables and libraries.
     13# - Transmits it to ISSM Web site for distribution.
     14################################################################################
     15
     16# Expand aliases within the context of this script
     17shopt -s expand_aliases
     18
     19## Override certain aliases
     20#
     21alias grep=$(which grep)
     22
     23## Constants
     24#
     25LIBGFORTRAN="/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0" # Important that this is the library itself
     26LIBGFORTRAN_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
     27MATLAB_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
     28MATLAB_PATH="/usr/local/MATLAB/R2019b"
     29PKG="ISSM-Linux-MATLAB" # Name of directory to copy distributable files to
     30
     31COMPRESSED_PKG="${PKG}.tar.gz"
     32
     33## Environment
     34#
     35export PATH="${ISSM_DIR}/bin:$(getconf PATH)" # Ensure that we pick up binaries from 'bin' directory rather than 'externalpackages'
     36
     37## Parse options
     38#
     39if [ $# -gt 1 ]; then
     40        echo "Can use only one option at a time"
     41        exit 1
     42fi
     43
     44skip_tests=0
     45transfer_only=0
     46while [ $# -gt 0 ]; do
     47    case $1 in
     48        -s|--skiptests) skip_tests=1; shift ;;
     49        -t|--transferonly) transfer_only=1; shift ;;
     50        *) echo "Unknown parameter passed: $1"; exit 1 ;;
     51    esac
     52    shift
     53done
     54
     55if [ ${transfer_only} -eq 0 ]; then
     56        # Check if MATLAB exists
     57        if ! [ -d ${MATLAB_PATH} ]; then
     58                echo "${MATLAB_PATH} does not point to a MATLAB installation! Please modify MATLAB_PATH variable in $(basename $0) and try again."
     59                exit 1
     60        fi
     61
     62        # Clean up from previous packaging
     63        echo "Cleaning up existing assets"
     64        cd ${ISSM_DIR}
     65        rm -rf ${PKG} ${COMPRESSED_PKG}
     66        mkdir ${PKG}
     67
     68        # Add/modify required binaries and libraries
     69        cd ${ISSM_DIR}/bin
     70
     71        echo "Modify generic"
     72        cat generic_static.m | sed -e "s/generic_static/generic/g" > generic.m
     73
     74        echo "Moving MPICH binaries to bin/"
     75        if [ -f ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec ]; then
     76                cp ${ISSM_DIR}/externalpackages/petsc/install/bin/mpiexec .
     77                cp ${ISSM_DIR}/externalpackages/petsc/install/bin/hydra_pmi_proxy .
     78        elif [ -f ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec ]; then
     79                cp ${ISSM_DIR}/externalpackages/mpich/install/bin/mpiexec .
     80                cp ${ISSM_DIR}/externalpackages/mpich/install/bin/hydra_pmi_proxy .
     81        else
     82                echo "MPICH not found"
     83                exit 1
     84        fi
     85
     86        echo "Moving GDAL binaries to bin/"
     87        if [ -f ${ISSM_DIR}/externalpackages/gdal/install/bin/gdal-config ]; then
     88                cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdalsrsinfo .
     89                cp ${ISSM_DIR}/externalpackages/gdal/install/bin/gdaltransform .
     90        else
     91                echo "GDAL not found"
     92                exit 1
     93        fi
     94
     95        echo "Moving GMT binaries to bin/"
     96        if [ -f ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt-config ]; then
     97                cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmt .
     98                cp ${ISSM_DIR}/externalpackages/gmt/install/bin/gmtselect .
     99        else
     100                echo "GMT not found"
     101                exit 1
     102        fi
     103
     104        echo "Moving Gmsh binaries to bin/"
     105        if [ -f ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh ]; then
     106                cp ${ISSM_DIR}/externalpackages/gmsh/install/bin/gmsh .
     107        else
     108                echo "Gmsh not found"
     109                exit 1
     110        fi
     111
     112        echo "Moving libgfortran to lib/"
     113        cp ${LIBGFORTRAN} ${LIBGFORTRAN_DIST} 2> /dev/null
     114
     115
     116        # Run tests
     117        if [ ${skip_tests} -eq 0 ]; then
     118                echo "Running tests"
     119                cd ${ISSM_DIR}/test/NightlyRun
     120                rm matlab.log 2> /dev/null
     121
     122                # Run tests, redirecting output to logfile and suppressing output to console
     123                ${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
     124
     125                # Check that MATLAB did not exit in error
     126                matlabExitCode=`echo $?`
     127                matlabExitedInError=`grep -E "Activation cannot proceed|license|Error" matlab.log | wc -l`
     128
     129                if [[ ${matlabExitCode} -ne 0 || ${matlabExitedInError} -ne 0 ]]; then
     130                        echo "----------MATLAB exited in error!----------"
     131                        cat matlab.log
     132                        echo "-----------End of matlab.log-----------"
     133
     134                        # Clean up execution directory
     135                        rm -rf ${ISSM_DIR}/execution/*
     136
     137                        exit 1
     138                fi
     139
     140                # Check that all tests passed
     141                numTestsFailed=`cat matlab.log | grep -c -e "FAILED|ERROR"`
     142
     143                if [[ ${numTestsFailed} -ne 0 ]]; then
     144                        echo "One or more tests FAILED"
     145                        exit 1
     146                else
     147                        echo "All tests PASSED"
     148                fi
     149        else
     150                echo "Skipping tests"
     151        fi
     152
     153        # Create package
     154        cd ${ISSM_DIR}
     155        svn cleanup --remove-ignored --remove-unversioned test # Clean up test directory (before copying to package)
     156        echo "Copying assets to package: ${PKG}"
     157        cp -rf bin examples lib scripts test ${PKG}/
     158        mkdir ${PKG}/execution
     159        echo "Cleaning up unneeded/unwanted files"
     160        rm -f ${PKG}/bin/generic_static.* # Remove static versions of generic cluster classes
     161        rm -f ${PKG}/lib/*.a # Remove static libraries from package
     162        rm -f ${PKG}/lib/*.la # Remove libtool libraries from package
     163        rm -rf ${PKG}/test/SandBox # Remove testing sandbox from package
     164
     165        # Compress package
     166        echo "Compressing package"
     167        tar -czf ${COMPRESSED_PKG} ${PKG}
     168        ls -lah ${ISSM_DIR}/${COMPRESSED_PKG}
     169fi
     170
     171# Transfer package to ISSM Web site
     172echo "Transferring package to ISSM Web site"
     173scp -i ~/.ssh/debian_linux-vm_to_ross ${COMPRESSED_PKG} jenkins@ross.ics.uci.edu:/var/www/html/${COMPRESSED_PKG}
     174
     175if [ $? -ne 0 ]; then
     176        echo "Transfer failed! Verify connection then build this project again."
     177        exit 1
     178fi
  • ../trunk-jpl/jenkins/ross-debian_linux-binaries-matlab

    Property changes on: ../trunk-jpl/packagers/linux/package-issm-linux-binaries-matlab.sh
    ___________________________________________________________________
    Added: svn:executable
    ## -0,0 +1 ##
    +*
    \ No newline at end of property
     
     1#--------------------#
     2# ISSM Configuration #
     3#--------------------#
     4
     5MATLAB_PATH="/usr/local/MATLAB/R2019b"
     6
     7# NOTE:
     8# - We can disable dependency tracking in the Autotools because the binaries
     9#       should always be a one-time build.
     10# - libgfortran will not be available in $ISSM_DIR/lib at compile time: it is
     11#       copied by packaging script.
     12#
     13ISSM_CONFIG='\
     14        --prefix=${ISSM_DIR} \
     15        --enable-standalone-executables \
     16        --enable-standalone-modules \
     17        --enable-standalone-libraries \
     18        --disable-dependency-tracking \
     19        --with-pic \
     20        --with-matlab-dir=${MATLAB_PATH} \
     21        --with-fortran-lib="-L${ISSM_DIR}/lib -lgfortran" \
     22        --with-mpi-include=${ISSM_DIR}/externalpackages/petsc/install/include \
     23        --with-mpi-libflags="-L${ISSM_DIR}/externalpackages/petsc/install/lib -lmpi -lmpicxx -lmpifort" \
     24        --with-blas-lapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
     25        --with-metis-dir=${ISSM_DIR}/externalpackages/petsc/install \
     26        --with-scalapack-dir=${ISSM_DIR}/externalpackages/petsc/install \
     27        --with-mumps-dir=${ISSM_DIR}/externalpackages/petsc/install \
     28        --with-hdf5-dir=${ISSM_DIR}/externalpackages/petsc/install \
     29        --with-petsc-dir=${ISSM_DIR}/externalpackages/petsc/install \
     30        --with-gsl-dir=${ISSM_DIR}/externalpackages/gsl/install \
     31        --with-boost-dir=${ISSM_DIR}/externalpackages/boost/install \
     32        --with-dakota-dir=${ISSM_DIR}/externalpackages/dakota/install \
     33        --with-triangle-dir=${ISSM_DIR}/externalpackages/triangle/install \
     34        --with-chaco-dir=${ISSM_DIR}/externalpackages/chaco/install \
     35        --with-m1qn3-dir=${ISSM_DIR}/externalpackages/m1qn3/install \
     36        --with-semic-dir=${ISSM_DIR}/externalpackages/semic/install \
     37'
     38#-------------------#
     39# External Packages #
     40#-------------------#
     41
     42EXTERNALPACKAGES="
     43        autotools       install-debian-linux.sh
     44        cmake           install.sh
     45        petsc           install-3.12-linux-static.sh
     46        gsl                     install-static.sh
     47        boost           install-1.7-linux-static.sh
     48        dakota          install-6.2-linux-static.sh
     49        curl            install-7-static.sh
     50        netcdf          install-4.7-parallel-static.sh
     51        proj            install-6.2-static.sh
     52        gdal            install-3-netcdf-static.sh
     53        gshhg           install.sh
     54        gmt                     install-6-linux-static.sh
     55        gmsh            install-4-linux-static.sh
     56        triangle        install-linux-static.sh
     57        chaco           install.sh
     58        m1qn3           install.sh
     59        semic           install.sh
     60        shell2junit     install.sh
     61"
     62
     63#---------#
     64# Testing #
     65#---------#
     66
     67# Test suites
     68MATLAB_TEST=0
     69PYTHON_TEST=0
     70JAVASCRIPT_TEST=0
     71EXAMPLES_TEST=0
     72
     73# Number of CPUs used in ISSM compilation
     74#
     75# NOTE: One is usually safer as some packages are very sensitive to parallel
     76#               compilation.
     77#
     78NUMCPUS_INSTALL=8
     79
     80# Number of CPUs used in the nightly runs
     81NUMCPUS_RUN=1
     82
     83# Nightly run options
     84#
     85# See documentation in test/NightlyRun/runme.* for more information.
     86#
     87MATLAB_NROPTIONS=""
     88PYTHON_NROPTIONS=""
Note: See TracBrowser for help on using the repository browser.