@@ -142,22 +142,18 @@ ELSE()
142142 MESSAGE (STATUS "Looking for opencascade include files in: ${OCC_INCLUDE_DIR} " )
143143ENDIF ()
144144
145- FIND_FILE (gp_Pnt_hxx "gp_Pnt.hxx" ${OCC_INCLUDE_DIR} /usr/inc /usr/local/inc /usr/local/include/oce )
145+ FIND_FILE (gp_Pnt_hxx "gp_Pnt.hxx" ${OCC_INCLUDE_DIR} )
146146IF (gp_Pnt_hxx)
147147 MESSAGE (STATUS "Header files found" )
148148ELSE ()
149149 MESSAGE (FATAL_ERROR "Unable to find header files, aborting" )
150150ENDIF ()
151151
152- SET (OPENCASCADE_LIBRARIES
152+ SET (OPENCASCADE_LIBRARY_NAMES
153153 TKernel TKMath TKBRep TKGeomBase TKGeomAlgo TKG3d TKG2d TKShHealing TKTopAlgo TKMesh TKPrim TKBool TKBO
154154 TKFillet TKSTEP TKSTEPBase TKSTEPAttr TKXSBase TKSTEP209 TKIGES TKOffset
155155)
156156
157- IF (MSVC )
158- ADD_DEBUG_VARIANTS (OPENCASCADE_LIBRARIES "${OPENCASCADE_LIBRARIES} " "d" )
159- ENDIF ()
160-
161157IF ("${OCC_LIBRARY_DIR} " STREQUAL "" )
162158 SET (OCC_LIBRARY_DIR "/usr/lib/" CACHE FILEPATH "Open CASCADE library files" )
163159 MESSAGE (STATUS "Looking for opencascade library files in: ${OCC_LIBRARY_DIR} " )
@@ -167,41 +163,53 @@ ELSE()
167163 MESSAGE (STATUS "Looking for opencascade library files in: ${OCC_LIBRARY_DIR} " )
168164ENDIF ()
169165
170- FIND_LIBRARY (libTKernel NAMES TKernel TKerneld PATHS ${OCC_LIBRARY_DIR} /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 )
166+ FIND_LIBRARY (libTKernel NAMES TKernel TKerneld PATHS ${OCC_LIBRARY_DIR} NO_DEFAULT_PATH )
171167IF (libTKernel)
172168 MESSAGE (STATUS "Library files found" )
173169ELSE ()
174170 MESSAGE (FATAL_ERROR "Unable to find library files, aborting" )
175171ENDIF ()
176172
173+ # Use the found libTKernel as a template for all other OCC libraries
174+ foreach (lib ${OPENCASCADE_LIBRARY_NAMES} )
175+ string (REPLACE TKernel "${lib} " lib_path "${libTKernel} " )
176+ list (APPEND OPENCASCADE_LIBRARIES "${lib_path} " )
177+ endforeach ()
178+
179+ IF (MSVC )
180+ ADD_DEBUG_VARIANTS (OPENCASCADE_LIBRARIES "${OPENCASCADE_LIBRARIES} " "d" )
181+ ENDIF ()
182+
177183IF (UNICODE_SUPPORT)
178184 # Find ICU
179185 IF ("${ICU_INCLUDE_DIR} " STREQUAL "" )
180186 MESSAGE (STATUS "No ICU include directory specified" )
181- ElSE ()
182- SET (ICU_INCLUDE_DIR "${ICU_INCLUDE_DIR} " CACHE FILEPATH "ICU header files" )
183187 ENDIF ()
184188
185189 IF ("${ICU_LIBRARY_DIR} " STREQUAL "" )
186190 MESSAGE (STATUS "No ICU library directory specified" )
187- ElSE ()
188- SET (ICU_LIBRARY_DIR "${ICU_LIBRARY_DIR} " CACHE FILEPATH "ICU library files" )
191+ FIND_LIBRARY (icu NAMES icuuc icuucd PATHS ${ICU_LIBRARY_DIR} )
192+ ELSE ()
193+ FIND_LIBRARY (icu NAMES icuuc icuucd PATHS ${ICU_LIBRARY_DIR} NO_DEFAULT_PATH )
189194 ENDIF ()
190195
191- FIND_LIBRARY (icu NAMES icuuc icuucd PATHS /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib ${ICU_LIBRARY_DIR} )
192-
193196 IF (icu)
197+ GET_FILENAME_COMPONENT (ICU_LIBRARY_DIR ${icu} PATH )
198+
194199 ADD_DEFINITIONS (-DHAVE_ICU )
195200 MESSAGE (STATUS "ICU libraries found" )
196201 # NOTE icudata appears to be icudt on Windows/MSVC and icudata on others
197202 # dl is included to resolve dlopen and friends symbols
198203 IF (WIN32 )
199- SET (ICU_LIBRARIES icuuc icudt)
204+ FIND_LIBRARY (icudt NAMES icudt PATHS ${ICU_LIBRARY_DIR} NO_DEFAULT_PATH )
205+ SET (ICU_LIBRARIES ${icu} ${icudt} )
200206 ADD_DEBUG_VARIANTS (ICU_LIBRARIES "${ICU_LIBRARIES} " "d" )
201- # TODO MinGW build would appear to be using dynamic ICU regardless of this definition.
202- ADD_DEFINITIONS (-DU_STATIC_IMPLEMENTATION ) # required for static ICU
207+ # TODO MinGW build would appear to be using dynamic ICU regardless of this definition.
208+ ADD_DEFINITIONS (-DU_STATIC_IMPLEMENTATION ) # required for static ICU
203209 ELSE ()
204- SET (ICU_LIBRARIES icuuc icudata dl)
210+ FIND_LIBRARY (icudt NAMES icudata PATHS ${ICU_LIBRARY_DIR} NO_DEFAULT_PATH )
211+ FIND_LIBRARY (dl NAMES dl )
212+ SET (ICU_LIBRARIES ${icu} ${icudt} ${dl} )
205213 ENDIF ()
206214 ELSE ()
207215 MESSAGE (FATAL_ERROR "UNICODE_SUPPORT enabled, but unable to find ICU. Disable UNICODE_SUPPORT or fix ICU paths to proceed." )
@@ -219,9 +227,13 @@ IF(COLLADA_SUPPORT)
219227
220228 IF ("${OPENCOLLADA_LIBRARY_DIR} " STREQUAL "" )
221229 MESSAGE (STATUS "No OpenCOLLADA library directory specified" )
222- FIND_LIBRARY (OPENCOLLADA_FRAMEWORK_LIB NAMES OpenCOLLADAFramework PATHS /usr/lib64/opencollada /usr/lib/opencollada /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib )
230+ FIND_LIBRARY (OPENCOLLADA_FRAMEWORK_LIB NAMES OpenCOLLADAFramework
231+ PATHS /usr/lib64/opencollada /usr/lib/opencollada /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib )
223232 GET_FILENAME_COMPONENT (OPENCOLLADA_LIBRARY_DIR ${OPENCOLLADA_FRAMEWORK_LIB} PATH )
224233 ENDIF ()
234+
235+ FIND_LIBRARY (OpenCOLLADAFramework NAMES OpenCOLLADAFramework PATHS ${OPENCOLLADA_LIBRARY_DIR} NO_DEFAULT_PATH )
236+
225237 SET (OPENCOLLADA_LIBRARY_DIR "${OPENCOLLADA_LIBRARY_DIR} " CACHE FILEPATH "OpenCOLLADA library files" )
226238
227239 SET (OPENCOLLADA_INCLUDE_DIRS "${OPENCOLLADA_INCLUDE_DIR} /COLLADABaseUtils" "${OPENCOLLADA_INCLUDE_DIR} /COLLADAStreamWriter" )
@@ -230,13 +242,29 @@ IF(COLLADA_SUPPORT)
230242 IF (COLLADASWStreamWriter_h)
231243 MESSAGE (STATUS "OpenCOLLADA header files found" )
232244 ADD_DEFINITIONS (-DWITH_OPENCOLLADA )
233- SET (OPENCOLLADA_LIBRARIES
245+ SET (OPENCOLLADA_LIBRARY_NAMES
234246 GeneratedSaxParser MathMLSolver OpenCOLLADABaseUtils OpenCOLLADAFramework OpenCOLLADASaxFrameworkLoader
235- OpenCOLLADAStreamWriter UTF buffer ftoa pcre
247+ OpenCOLLADAStreamWriter UTF buffer ftoa
236248 )
237- IF (NOT "${PCRE_LIBRARY_DIR} " STREQUAL "" )
249+
250+ # Use the found libTKernel as a template for all other OCC libraries
251+ foreach (lib ${OPENCOLLADA_LIBRARY_NAMES} )
252+ string (REPLACE OpenCOLLADAFramework "${lib} " lib_path "${OpenCOLLADAFramework} " )
253+ list (APPEND OPENCOLLADA_LIBRARIES "${lib_path} " )
254+ endforeach ()
255+
256+ IF ("${PCRE_LIBRARY_DIR} " STREQUAL "" )
257+ find_library (pcre_library NAMES pcre PATHS ${OPENCOLLADA_LIBRARY_DIR} )
258+ GET_FILENAME_COMPONENT (PCRE_LIBRARY_DIR ${pcre_library} PATH )
259+ else ()
260+ find_library (pcre_library NAMES pcre PATHS ${PCRE_LIBRARY_DIR} NO_DEFAULT_PATH )
261+ endif ()
262+
263+ if (${pcre_library} )
238264 SET (OPENCOLLADA_LIBRARY_DIR ${OPENCOLLADA_LIBRARY_DIR} ${PCRE_LIBRARY_DIR} )
239- ENDIF ()
265+ list (APPEND OPENCOLLADA_LIBRARIES "${pcre_library} " )
266+ endif ()
267+
240268 IF (MSVC )
241269 ADD_DEBUG_VARIANTS (OPENCOLLADA_LIBRARIES "${OPENCOLLADA_LIBRARIES} " "d" )
242270 ENDIF ()
@@ -322,7 +350,6 @@ IF(MSVC)
322350ElSE ()
323351 add_definitions (-Wno-non-virtual-dtor -Wall )
324352 # TODO Preferably use -Wextra too, but currently too much warning spam coming from the dependencies' headers.
325- add_definitions (-std=c++03 )
326353 # -fPIC is not relevant on Windows and creates pointless warnings
327354 if (UNIX )
328355 add_definitions (-fPIC )
@@ -332,9 +359,6 @@ ENDIF()
332359INCLUDE_DIRECTORIES (${INCLUDE_DIRECTORIES} ${OCC_INCLUDE_DIR} ${OPENCOLLADA_INCLUDE_DIRS}
333360 ${ICU_INCLUDE_DIR} ${Boost_INCLUDE_DIRS}
334361)
335- if (NOT WIN32 )
336- INCLUDE_DIRECTORIES (${INCLUDE_DIRECTORIES} /usr/inc /usr/local/inc /usr/local/include/oce )
337- endif ()
338362
339363function (files_for_ifc_version IFC_VERSION RESULT_NAME )
340364 set (IFC_PARSE_DIR ${CMAKE_CURRENT_SOURCE_DIR} /../src/ifcparse)
@@ -418,11 +442,52 @@ if(NOT Boost_VERSION LESS 105800)
418442 add_definitions (-DBOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE )
419443endif ()
420444
421- LINK_DIRECTORIES (${LINK_DIRECTORIES} ${IfcOpenShell_BINARY_DIR} ${OCC_LIBRARY_DIR} ${OPENCOLLADA_LIBRARY_DIR}
422- ${ICU_LIBRARY_DIR} ${Boost_LIBRARY_DIRS}
423- )
424- if (NOT WIN32 )
425- LINK_DIRECTORIES (${LINK_DIRECTORIES} /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 )
445+ # Detect OCC version on gcc/clang/mingw as
446+ # -std=c++11 is needed for OCCT >= 7.0.0
447+ if (NOT MSVC )
448+ FIND_FILE (Standard_Version "Standard_Version.hxx" ${OCC_INCLUDE_DIR} )
449+
450+ set (CMAKE_CONFIGURABLE_FILE_CONTENT "
451+ #include <Standard_Version.hxx>
452+ #include <iostream>
453+ int main(int argc, char** argv) {
454+ std::cout << OCC_VERSION_COMPLETE;
455+ }" )
456+ configure_file (
457+ "${CMAKE_ROOT} /Modules/CMakeConfigurableFile.in"
458+ "${CMAKE_BINARY_DIR} /version.cxx" @ONLY )
459+
460+ try_compile (VERSION_CHECK
461+ ${CMAKE_BINARY_DIR}
462+ "${CMAKE_BINARY_DIR} /version.cxx"
463+ CMAKE_FLAGS "-DINCLUDE_DIRECTORIES=${OCC_INCLUDE_DIR} "
464+ COPY_FILE "${CMAKE_BINARY_DIR} /version"
465+ OUTPUT_VARIABLE OUT
466+ COPY_FILE_ERROR ERR
467+ )
468+
469+ if (${VERSION_CHECK} )
470+ EXECUTE_PROCESS (COMMAND ${CMAKE_BINARY_DIR} /version OUTPUT_VARIABLE OCC_VERSION )
471+ else ()
472+ message (FATAL_ERROR "Failed to compile OCC version test:
473+ ${OUT}
474+ ------
475+ ${ERR} " )
476+ endif ()
477+
478+ MESSAGE (STATUS "OCC version is ${OCC_VERSION} . Detected from: ${Standard_Version} " )
479+
480+ if (NOT ("${OCC_VERSION} " LESS "7.0.0" ))
481+ include (CheckCXXCompilerFlag )
482+ CHECK_CXX_COMPILER_FLAG ("-std=c++11" COMPILER_SUPPORTS_CXX11 )
483+ if (COMPILER_SUPPORTS_CXX11)
484+ add_definitions (-std=c++11 )
485+ else ()
486+ message (FATAL_ERROR "OCCT7 requires a compiler with C++11 support" )
487+ endif ()
488+ else ()
489+ add_definitions (-std=c++03 )
490+ endif ()
426491endif ()
427492
428493set (IFCOPENSHELL_LIBRARIES IfcParse IfcGeom)
0 commit comments