File size: 6,503 Bytes
985c397
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# Try to find nglib/netgen
#
# Optional input NETGENDATA is path to the netgen libsrc source tree - this is
# required due to some headers not being installed by netgen.
#
# Once done this will define
#
# NGLIB_INCLUDE_DIR   - where the nglib include directory can be found
# NGLIB_LIBRARIES     - Link this to use nglib
# NETGEN_INCLUDE_DIRS - where the netgen include directories can be found
# NETGEN_DEFINITIONS  - C++ compiler defines required to use netgen/nglib
#
# See also: http://git.salome-platform.org/gitweb/?p=NETGENPLUGIN_SRC.git;a=summary


find_package(Netgen CONFIG)
IF (Netgen_FOUND)
    set(NGLIB_INCLUDE_DIR ${NETGEN_INCLUDE_DIRS})
    set(NGLIB_LIBRARIES nglib)
    set(NETGEN_DEFINITIONS -DNO_PARALLEL_THREADS -DOCCGEOMETRY)
    # for external smesh only the following two variables are needed:
    set(NETGEN_FOUND True)
    set(NETGEN_INCLUDE_DIRS ${NETGEN_INCLUDE_DIRS})

ELSE ()

    SET(NETGEN_DEFINITIONS -DNO_PARALLEL_THREADS -DOCCGEOMETRY)

    IF (WIN32)
        FIND_PATH(NGLIB_INCLUDE_DIR NAMES nglib.h PATHS ${NETGEN_INCLUDEDIR})
        SET(NETGEN_LIBS nglib mesh occ interface)
        SET(NGLIB_LIBRARIES "")
        FOREACH (it ${NETGEN_LIBS})
            FIND_LIBRARY(NGLIB ${it} PATHS ${NETGEN_LIBDIR})
            FIND_LIBRARY(NGLIBD ${it}d PATHS ${NETGEN_LIBDIR})
            IF (NGLIBD AND NGLIB)
                SET(NG_LIB optimized ${NGLIB}
                        debug ${NGLIBD})
                SET(NGLIB_LIBRARIES ${NGLIB_LIBRARIES} ${NG_LIB})
                UNSET(NGLIB CACHE)
                UNSET(NGLIBD CACHE)
            ELSEIF (NGLIB)
                SET(NGLIB_LIBRARIES ${NGLIB_LIBRARIES} ${NGLIB})
                UNSET(NGLIB CACHE)
            ENDIF ()
        ENDFOREACH ()

        IF (NOT NETGENDATA)
            SET(NETGENDATA netgen)
        ENDIF (NOT NETGENDATA)

    ELSEIF (DEFINED MACPORTS_PREFIX OR DEFINED HOMEBREW_PREFIX)
        IF (NETGEN_ROOT)
            SET(NETGEN_INCLUDEDIR ${NETGEN_ROOT}/include)
            SET(NETGEN_LIBDIR ${NETGEN_ROOT}/lib)
            # allow to customize if NETGEN_ROOT is used
            IF (NOT NETGENDATA)
                SET(NETGENDATA ${NETGEN_ROOT}/libsrc)
            ENDIF ()
        ENDIF ()

        FIND_PATH(NGLIB_INCLUDE_DIR NAMES nglib.h PATHS ${NETGEN_INCLUDEDIR} /usr/include /usr/include/netgen-mesher)
        FIND_LIBRARY(NGLIB_LIBNGLIB nglib PATHS ${NETGEN_LIBDIR} /usr/lib /usr/lib64 /usr/local/lib)
        SET(NGLIB_LIBRARIES ${NGLIB_LIBNGLIB})
        FIND_LIBRARY(NGLIB_LIBMESH NAMES mesh ngmesh PATHS ${NETGEN_LIBDIR} /usr/lib /usr/lib64 /usr/local/lib)
        IF (NGLIB_LIBMESH)
            SET(NGLIB_LIBRARIES ${NGLIB_LIBRARIES} ${NGLIB_LIBMESH})
        ENDIF ()
        FIND_LIBRARY(NGLIB_LIBOCC NAMES occ ngocc PATHS ${NETGEN_LIBDIR} /usr/lib /usr/lib64 /usr/local/lib)
        IF (NGLIB_LIBOCC)
            SET(NGLIB_LIBRARIES ${NGLIB_LIBRARIES} ${NGLIB_LIBOCC})
        ENDIF ()
        FIND_LIBRARY(NGLIB_LIBINTERFACE NAMES interface nginterface PATHS ${NETGEN_LIBDIR} /usr/lib /usr/lib64 /usr/local/lib)
        IF (NGLIB_LIBINTERFACE)
            SET(NGLIB_LIBRARIES ${NGLIB_LIBRARIES} ${NGLIB_LIBINTERFACE})
        ENDIF ()

        IF (NOT NETGENDATA)
            SET(NETGENDATA /usr/share/netgen/libsrc)
        ENDIF ()
    ENDIF ()

    FIND_PATH(NETGEN_DIR_include NAMES mydefs.hpp NO_DEFAULT_PATH PATHS ${NGLIB_INCLUDE_DIR}/include ${NETGENDATA}/include ${NETGEN_INCLUDEDIR} ${NGLIB_INCLUDE_DIR})

    IF (NOT NGLIB_INCLUDE_DIR AND NOT NETGEN_DIR_include)
        MESSAGE(STATUS "Cannot find NETGEN header files.")
    ELSEIF (NOT NETGEN_VERSION)
        file(STRINGS ${NETGEN_DIR_include}/mydefs.hpp NETGEN_VERSION REGEX "#define PACKAGE_VERSION.*")
    ENDIF ()

    IF (NOT NGLIB_LIBRARIES)
        MESSAGE(STATUS "Cannot find NETGEN library.")
    ENDIF ()

    IF (NGLIB_INCLUDE_DIR AND NGLIB_LIBRARIES)
        SET(Netgen_FOUND TRUE)
        SET(NETGEN_INCLUDE_DIRS ${NETGEN_DIR_include} ${NGLIB_INCLUDE_DIR})
        LIST(REMOVE_DUPLICATES NETGEN_INCLUDE_DIRS)
    ELSE ()
        SET(Netgen_FOUND FALSE)
    ENDIF ()
ENDIF ()

# Package-provided cMake file is not enough
IF (Netgen_FOUND)
    IF (NOT NETGEN_VERSION_MAJOR)
        IF (NETGEN_VERSION)
            string(REGEX MATCHALL "[0-9]+" NETGEN_VERSION_expr ${NETGEN_VERSION})
            list(LENGTH NETGEN_VERSION_expr NETGEN_VERSION_COUNT)
            list(GET NETGEN_VERSION_expr 0 NETGEN_VERSION_MAJOR)
            IF (NETGEN_VERSION_COUNT GREATER 1)
                list(GET NETGEN_VERSION_expr 1 NETGEN_VERSION_MINOR)
            ELSE ()
                set(NETGEN_VERSION_MINOR 0)
            ENDIF ()
        ELSE ()  # workaround for netgen 6.2 and newer. currently there is no easy way to detect the version
            # better use "find_package(netgen CONFIG REQUIRED)"
            set(NETGEN_VERSION_MAJOR 6)
            set(NETGEN_VERSION_MINOR 2)
        ENDIF ()
        set(NETGEN_VERSION_PATCH 0)
    ENDIF ()

    MATH(EXPR NETGEN_VERSION_C "(${NETGEN_VERSION_MAJOR} << 16) + (${NETGEN_VERSION_MINOR} << 8) + (${NETGEN_VERSION_PATCH})")
    MATH(EXPR NETGEN_VERSION_62 "(6 << 16) + (2 << 8)")
    MATH(EXPR NETGEN_VERSION_62_2004 "(6 << 16) + (2 << 8) + (2004)")
    IF (NOT NETGEN_VERSION_C LESS NETGEN_VERSION_62) # Version >= 6.2
        IF (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
            # Clang sometimes fails to include <cstdio>
            include(CMakePushCheckState)
            cmake_push_check_state(RESET)
            set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${NETGEN_CXX_FLAGS}")
            check_cxx_source_compiles("#include <cstdio>\nint main(){}" CSTDIO_INCLUDE_TRY1)
            IF (NOT CSTDIO_INCLUDE_TRY1)
                # Ugly hack to make <stdio.h> building gets function
                set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -U__cplusplus -D__cplusplus=201103L")
                check_cxx_source_compiles("#include <cstdio>\nint main(){}" CSTDIO_INCLUDE_TRY2)
                IF (NOT CSTDIO_INCLUDE_TRY2)
                    message(FATAL_ERROR "Cannot #include <cstdio>.")
                ELSE ()
                    set(NETGEN_CXX_FLAGS "${NETGEN_CXX_FLAGS} -U__cplusplus -D__cplusplus=201103L")
                ENDIF ()
            ENDIF ()
            cmake_pop_check_state()
        ENDIF ()
    ENDIF ()
    MESSAGE(STATUS "Found NETGEN version ${NETGEN_VERSION_MAJOR}.${NETGEN_VERSION_MINOR}, calculated: ${NETGEN_VERSION_C}")
    LIST(APPEND NETGEN_DEFINITIONS -DNETGEN_VERSION=${NETGEN_VERSION_C})
ENDIF ()