Salome HOME
bos #18711 Adapt NETGEN detection procedure for version 6x: manage case when NETGEN...
[tools/configuration.git] / cmake / FindNetgen.cmake
index 51db70002a93e462c9c4b6a076daf142975ae00d..4a9d6c798c373b0e73d556f94057ac58be15b6e3 100644 (file)
@@ -1,14 +1,12 @@
 # - Find NETGEN
 # Sets the following variables:
+#   NETGEN_DEFINITIONS  - compile flags
 #   NETGEN_INCLUDE_DIRS - path to the NETGEN include directories
 #   NETGEN_LIBRARIES    - path to the NETGEN libraries to be linked against
 #
 
 #########################################################################
-# Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
-#
-# Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+# Copyright (C) 2007-2021  CEA/DEN, EDF R&D, OPEN CASCADE
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -38,74 +36,81 @@ ENDIF()
 SET(NETGEN_ROOT_DIR $ENV{NETGEN_ROOT_DIR})
 
 IF(NETGEN_ROOT_DIR)
- LIST(APPEND CMAKE_PREFIX_PATH "${NETGEN_ROOT_DIR}")
 LIST(APPEND CMAKE_PREFIX_PATH "${NETGEN_ROOT_DIR}")
 ENDIF(NETGEN_ROOT_DIR)
 
+# Windows specific stuff:
+# Since netgen-5.3.1 uses zlib, try to detect it
+IF(WIN32)
+  IF(EXISTS ${NETGEN_ROOT_DIR}/cmake/FindZlib.cmake)
+    FILE(TO_CMAKE_PATH ${NETGEN_ROOT_DIR}/cmake NETGEN_CMAKE_FILES)
+    LIST(APPEND CMAKE_MODULE_PATH ${NETGEN_CMAKE_FILES})
+    SET(ZLIB_ROOT_DIR $ENV{ZLIB_ROOT_DIR})
+    INCLUDE(FindZlib)
+  ENDIF()
+ENDIF()
+
 FIND_PATH(_netgen_base_inc_dir nglib.h)
-SET(NETGEN_INCLUDE_DIRS ${_netgen_base_inc_dir})
-FIND_PATH(_netgen_add_inc_dir occgeom.hpp HINTS ${_netgen_base_inc_dir} PATH_SUFFIXES share/netgen/include)
-LIST(APPEND NETGEN_INCLUDE_DIRS ${_netgen_add_inc_dir})
-LIST(REMOVE_DUPLICATES NETGEN_INCLUDE_DIRS)
+SET(NETGEN_INCLUDE_DIRS ${_netgen_base_inc_dir} ${ZLIB_INCLUDE_DIRS})
+FIND_PATH(_netgen_add_inc_dir1 occgeom.hpp HINTS ${_netgen_base_inc_dir} PATH_SUFFIXES share/netgen/include include)
+IF(_netgen_add_inc_dir1)
+  LIST(APPEND NETGEN_INCLUDE_DIRS ${_netgen_add_inc_dir1})
+ENDIF()
+FIND_PATH(_netgen_add_inc_dir2 exception.hpp HINTS ${_netgen_base_inc_dir} PATH_SUFFIXES share/netgen/include share/netgen/include/core include include/core)
+IF(_netgen_add_inc_dir2)
+  LIST(APPEND NETGEN_INCLUDE_DIRS ${_netgen_add_inc_dir2})
+ENDIF()
 
-FIND_LIBRARY(NETGEN_nglib NAMES nglib)
-IF(WIN32)
-  FIND_LIBRARY(NETGEN_csg NAMES csg)
-  FIND_LIBRARY(NETGEN_gen NAMES gen)
-  FIND_LIBRARY(NETGEN_geom2d NAMES geom2d)
-  FIND_LIBRARY(NETGEN_gprim NAMES gprim)
-  FIND_LIBRARY(NETGEN_interface NAMES interface)
-  FIND_LIBRARY(NETGEN_la NAMES la)
-  FIND_LIBRARY(NETGEN_mesh NAMES mesh)
-  FIND_LIBRARY(NETGEN_occ NAMES occ)
-  FIND_LIBRARY(NETGEN_stl NAMES stl)
-ENDIF(WIN32)
-
-SET(NETGEN_LIBRARIES ${NETGEN_nglib})
+FOREACH(_lib nglib csg gen geom2d gprim interface la mesh occ stl ngcore)
 
-IF(WIN32)
-  SET(NETGEN_LIBRARIES ${NETGEN_LIBRARIES}
-      ${NETGEN_csg}
-      ${NETGEN_gen}
-      ${NETGEN_geom2d}
-      ${NETGEN_gprim}
-      ${NETGEN_interface}
-      ${NETGEN_la}
-      ${NETGEN_mesh}
-      ${NETGEN_occ}
-      ${NETGEN_stl}
-   )
-ENDIF(WIN32)
+  FIND_LIBRARY(NETGEN_${_lib} NAMES ${_lib})
+  IF(NETGEN_${_lib})
+    LIST(APPEND NETGEN_LIBRARIES ${NETGEN_${_lib}})
+  ENDIF()
+
+ENDFOREACH()
 
 INCLUDE(FindPackageHandleStandardArgs)
 FIND_PACKAGE_HANDLE_STANDARD_ARGS(NETGEN REQUIRED_VARS NETGEN_INCLUDE_DIRS NETGEN_LIBRARIES)
 
 INCLUDE(CheckCXXSourceCompiles)
+INCLUDE(CMakePushCheckState)
 
 IF(NETGEN_FOUND)
+  CMAKE_PUSH_CHECK_STATE()
 
+  # Detect NETGEN V5
   SET(CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES} ${NETGEN_INCLUDE_DIRS}")
   SET(CMAKE_REQUIRED_LIBRARIES "${NETGEN_LIBRARIES}")
   CHECK_CXX_SOURCE_COMPILES("
     #include <meshing.hpp>
-    
     int main()
     {
-      netgen::Mesh* ngMesh;
+      netgen::Mesh* ngMesh = 0;
       ngMesh->CalcLocalH(1.0);
     }
 " NETGEN_V5
     )
+  # Detect NETGEN V6
+  SET(CMAKE_REQUIRED_FLAGS "-std=c++17")
+  CHECK_CXX_SOURCE_COMPILES("
+    //using namespace std;
+    #include <meshing.hpp>
+    int main()
+    {
+       netgen::MeshingParameters mp;
+       return !mp.meshsizefilename.empty();
+    }
+" NETGEN_V6
+    )
+
+  CMAKE_POP_CHECK_STATE()
 
   IF(NOT Netgen_FIND_QUIETLY)
     MESSAGE(STATUS "Netgen library: ${NETGEN_LIBRARIES}")
   ENDIF()
   SET(NETGEN_DEFINITIONS "-DOCCGEOMETRY")
 
-  IF(NETGEN_V5)
-    MESSAGE(STATUS "NETGEN V5 or later found")
-    SET(NETGEN_DEFINITIONS "${NETGEN_DEFINITIONS} -DNETGEN_V5")
-  ENDIF(NETGEN_V5)
-
   #RNV:  currently on windows use netgen without thread support.
   #TODO: check support of the multithreading on windows
   IF(WIN32)