diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 06fb8162d5..eaa65994d5 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -490,141 +490,7 @@ if(BUILD_IFCGEOM) # Open CASCADE if(WITH_OPENCASCADE) - if(OCC_INCLUDE_DIR) - set(OCC_INCLUDE_DIR ${OCC_INCLUDE_DIR} CACHE FILEPATH "Open CASCADE header files") - message(STATUS "Looking for Open CASCADE include files in: ${OCC_INCLUDE_DIR}") - endif() - - if(OCC_LIBRARY_DIR) - set(OCC_LIBRARY_DIR ${OCC_LIBRARY_DIR} CACHE FILEPATH "Open CASCADE library files") - message(STATUS "Looking for Open CASCADE library files in: ${OCC_LIBRARY_DIR}") - endif() - - # No specific paths specified, try to find package. - if(OCC_INCLUDE_DIR AND OCC_LIBRARY_DIR) - message( - STATUS - "Using provided OCC_INCLUDE_DIR ('${OCC_INCLUDE_DIR}') " - "and OCC_LIBRARY_DIR ('${OCC_LIBRARY_DIR}')." - ) - # Parse OCC_VERSION_STRING. - file(STRINGS ${OCC_INCLUDE_DIR}/Standard_Version.hxx OCC_MAJOR - REGEX "#define OCC_VERSION_MAJOR.*" - ) - string(REGEX MATCH "[0-9]+" OCC_MAJOR ${OCC_MAJOR}) - file(STRINGS ${OCC_INCLUDE_DIR}/Standard_Version.hxx OCC_MINOR - REGEX "#define OCC_VERSION_MINOR.*" - ) - string(REGEX MATCH "[0-9]+" OCC_MINOR ${OCC_MINOR}) - file(STRINGS ${OCC_INCLUDE_DIR}/Standard_Version.hxx OCC_MAINT - REGEX "#define OCC_VERSION_MAINTENANCE.*" - ) - string(REGEX MATCH "[0-9]+" OCC_MAINT ${OCC_MAINT}) - set(OCC_VERSION_STRING "${OCC_MAJOR}.${OCC_MINOR}.${OCC_MAINT}") - elseif(NOT OCC_INCLUDE_DIR AND NOT OCC_LIBRARY_DIR) - # OCE is not supported for find_package, because it's using a different name (`oce`) - # and also has an odd directory structure (install/lib/oce-0.18/*.cmake). - find_package(OpenCASCADE CONFIG REQUIRED) - set(OCC_INCLUDE_DIR ${OpenCASCADE_INCLUDE_DIR}) - # Do not use OpenCASCADE_LIBRARY_DIR for OCC_LIBRARY_DIR - check target property explicitly. - # On Windows there is a case with OpenCASCADE_LIBRARY_DIR points to `lib` folder, - # while TKernel is actually in `libi`. - get_target_property(TKERNEL_LIB_PATH TKernel LOCATION) - get_filename_component(OCC_LIBRARY_DIR "${TKERNEL_LIB_PATH}" DIRECTORY) - set(OCC_VERSION_STRING ${OpenCASCADE_VERSION}) - message( - STATUS - "Found Open CASCADE package at '${OpenCASCADE_DIR}', " - "deducing from it OCC_INCLUDE_DIR: '${OCC_INCLUDE_DIR}' " - "and OCC_LIBRARY_DIR: '${OCC_LIBRARY_DIR}'." - ) - else() - message( - FATAL_ERROR - "Couldn't find Open CASCADE installation. " - "Either both OCC_INCLUDE_DIR ('${OCC_INCLUDE_DIR}') and OCC_LIBRARY_DIR ('${OCC_LIBRARY_DIR}') " - "must be specified or OpenCASCADE package should be discoverable. " - "If you're using OCE, then providing a package is not available " - "and you need to provide OCE_INCLUDE_DIR and OCE_LIBRARY_DIR directly." - ) - endif() - - set( - OPENCASCADE_LIBRARY_NAMES - TKernel TKMath TKBRep TKGeomBase TKGeomAlgo TKG3d TKG2d TKShHealing TKTopAlgo TKMesh TKPrim TKBool TKBO - TKFillet TKXSBase TKOffset TKHLR - - # @todo investigate the exact conditions when this is necessary - TKBin - ) - - if(OCC_VERSION_STRING VERSION_LESS 7.8.0) - list(APPEND OPENCASCADE_LIBRARY_NAMES TKIGES TKSTEPBase TKSTEPAttr TKSTEP209 TKSTEP) - else(OCC_VERSION_STRING VERSION_LESS 7.8.0) - list(APPEND OPENCASCADE_LIBRARY_NAMES TKDESTEP TKDEIGES) - endif(OCC_VERSION_STRING VERSION_LESS 7.8.0) - - clear_wasm_sysroot() - find_library(libTKernel NAMES TKernel TKerneld PATHS ${OCC_LIBRARY_DIR} NO_DEFAULT_PATH) - restore_wasm_sysroot() - - if(libTKernel) - message(STATUS "Required Open Cascade Library files found") - else() - message( - FATAL_ERROR - "Unable to find Open Cascade library files in OCC_LIBRARY_DIR ('${OCC_LIBRARY_DIR}'), aborting" - ) - endif() - - # Use the found libTKernel as a template for all other OCC libraries - # TODO Extract this into macro/function - foreach(lib ${OPENCASCADE_LIBRARY_NAMES}) - # Make sure we'll handle the Windows/MSVC debug postfix convention too. - string(REPLACE TKerneld "${lib}" lib_path "${libTKernel}") - string(REPLACE TKernel "${lib}" lib_path "${lib_path}") - list(APPEND OPENCASCADE_LIBRARIES "${lib_path}") - endforeach() - - if(MSVC) - add_definitions(-DHAVE_NO_DLL) - add_debug_variants(OPENCASCADE_LIBRARIES "${OPENCASCADE_LIBRARIES}" d) - endif() - - if(WIN32) - # OCC might require linking to Winsock depending on the version and build configuration - list(APPEND OPENCASCADE_LIBRARIES ws2_32.lib) - endif() - - # Make sure cross-referenced symbols between static OCC libraries get - # resolved. Also add thread and rt libraries. - get_filename_component(libTKernelExt ${libTKernel} EXT) - if("${libTKernelExt}" STREQUAL ".a") - set(OCCT_STATIC ON) - endif() - - if(OCCT_STATIC) - find_package(Threads) - - if(WASM_BUILD) - set(OPENCASCADE_LIBRARIES ${OPENCASCADE_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) - else() - # OPENCASCADE_LIBRARIES repeated N times below in order to fix cyclic dependencies - # tfk: --start-group ... --end-group didn't work on the apple linker when last tested - if(APPLE) - set(OPENCASCADE_LIBRARIES ${OPENCASCADE_LIBRARIES} ${OPENCASCADE_LIBRARIES} ${OPENCASCADE_LIBRARIES} ${OPENCASCADE_LIBRARIES} ${OPENCASCADE_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) - else() - set(OPENCASCADE_LIBRARIES -Wl,--start-group ${OPENCASCADE_LIBRARIES} -Wl,--end-group ${CMAKE_THREAD_LIBS_INIT}) - endif() - endif() - - if(NOT APPLE AND NOT WIN32) - set(OPENCASCADE_LIBRARIES ${OPENCASCADE_LIBRARIES} "rt") - endif() - if(NOT WIN32) - set(OPENCASCADE_LIBRARIES ${OPENCASCADE_LIBRARIES} "dl") - endif() - endif() + find_package(OpenCASCADE REQUIRED) endif(WITH_OPENCASCADE) endif(BUILD_IFCGEOM) @@ -969,7 +835,7 @@ if(BUILD_CONVERT OR BUILD_IFCPYTHON) add_library(geometry_serializer_ifc${schema} STATIC ../src/ifcgeom/Serialization/schema/Serialization.cpp) set_target_properties(geometry_serializer_ifc${schema} PROPERTIES COMPILE_FLAGS "-DIFC_GEOMSERIALIZATION_EXPORTS -DIfcSchema=Ifc${schema}") - target_link_libraries(geometry_serializer_ifc${schema} ${OPENCASCADE_LIBRARIES}) + target_link_libraries(geometry_serializer_ifc${schema} ${OpenCASCADE_LIBRARIES}) list(APPEND geometry_serializer_libraries geometry_serializer_ifc${schema}) endforeach() diff --git a/cmake/FindOpenCASCADE.cmake b/cmake/FindOpenCASCADE.cmake new file mode 100644 index 0000000000..0d992b57d1 --- /dev/null +++ b/cmake/FindOpenCASCADE.cmake @@ -0,0 +1,135 @@ +if(OCC_INCLUDE_DIR) + set(OCC_INCLUDE_DIR ${OCC_INCLUDE_DIR} CACHE FILEPATH "Open CASCADE header files") + message(STATUS "Looking for Open CASCADE include files in: ${OCC_INCLUDE_DIR}") +endif() + +if(OCC_LIBRARY_DIR) + set(OCC_LIBRARY_DIR ${OCC_LIBRARY_DIR} CACHE FILEPATH "Open CASCADE library files") + message(STATUS "Looking for Open CASCADE library files in: ${OCC_LIBRARY_DIR}") +endif() + +# No specific paths specified, try to find package. +if(OCC_INCLUDE_DIR AND OCC_LIBRARY_DIR) + message( + STATUS + "Using provided OCC_INCLUDE_DIR ('${OCC_INCLUDE_DIR}') " + "and OCC_LIBRARY_DIR ('${OCC_LIBRARY_DIR}')." + ) + # Parse OCC_VERSION_STRING. + file(STRINGS ${OCC_INCLUDE_DIR}/Standard_Version.hxx OCC_MAJOR + REGEX "#define OCC_VERSION_MAJOR.*" + ) + string(REGEX MATCH "[0-9]+" OCC_MAJOR ${OCC_MAJOR}) + file(STRINGS ${OCC_INCLUDE_DIR}/Standard_Version.hxx OCC_MINOR + REGEX "#define OCC_VERSION_MINOR.*" + ) + string(REGEX MATCH "[0-9]+" OCC_MINOR ${OCC_MINOR}) + file(STRINGS ${OCC_INCLUDE_DIR}/Standard_Version.hxx OCC_MAINT + REGEX "#define OCC_VERSION_MAINTENANCE.*" + ) + string(REGEX MATCH "[0-9]+" OCC_MAINT ${OCC_MAINT}) + set(OCC_VERSION_STRING "${OCC_MAJOR}.${OCC_MINOR}.${OCC_MAINT}") +elseif(NOT OCC_INCLUDE_DIR AND NOT OCC_LIBRARY_DIR) + # OCE is not supported for find_package, because it's using a different name (`oce`) + # and also has an odd directory structure (install/lib/oce-0.18/*.cmake). + find_package(OpenCASCADE CONFIG REQUIRED) + set(OCC_INCLUDE_DIR ${OpenCASCADE_INCLUDE_DIR}) + # Do not use OpenCASCADE_LIBRARY_DIR for OCC_LIBRARY_DIR - check target property explicitly. + # On Windows there is a case with OpenCASCADE_LIBRARY_DIR points to `lib` folder, + # while TKernel is actually in `libi`. + get_target_property(TKERNEL_LIB_PATH TKernel LOCATION) + get_filename_component(OCC_LIBRARY_DIR "${TKERNEL_LIB_PATH}" DIRECTORY) + set(OCC_VERSION_STRING ${OpenCASCADE_VERSION}) + message( + STATUS + "Found Open CASCADE package at '${OpenCASCADE_DIR}', " + "deducing from it OCC_INCLUDE_DIR: '${OCC_INCLUDE_DIR}' " + "and OCC_LIBRARY_DIR: '${OCC_LIBRARY_DIR}'." + ) +else() + message( + FATAL_ERROR + "Couldn't find Open CASCADE installation. " + "Either both OCC_INCLUDE_DIR ('${OCC_INCLUDE_DIR}') and OCC_LIBRARY_DIR ('${OCC_LIBRARY_DIR}') " + "must be specified or OpenCASCADE package should be discoverable. " + "If you're using OCE, then providing a package is not available " + "and you need to provide OCE_INCLUDE_DIR and OCE_LIBRARY_DIR directly." + ) +endif() + +set( + OpenCASCADE_LIBRARIES + TKernel TKMath TKBRep TKGeomBase TKGeomAlgo TKG3d TKG2d TKShHealing TKTopAlgo TKMesh TKPrim TKBool TKBO + TKFillet TKXSBase TKOffset TKHLR + + # @todo investigate the exact conditions when this is necessary + TKBin +) + +if(OCC_VERSION_STRING VERSION_LESS 7.8.0) + list(APPEND OpenCASCADE_LIBRARIES TKIGES TKSTEPBase TKSTEPAttr TKSTEP209 TKSTEP) +else(OCC_VERSION_STRING VERSION_LESS 7.8.0) + list(APPEND OpenCASCADE_LIBRARIES TKDESTEP TKDEIGES) +endif(OCC_VERSION_STRING VERSION_LESS 7.8.0) + +clear_wasm_sysroot() +find_library(libTKernel NAMES TKernel TKerneld PATHS ${OCC_LIBRARY_DIR} NO_DEFAULT_PATH) +restore_wasm_sysroot() + +if(libTKernel) + message(STATUS "Required Open Cascade Library files found") +else() + message( + FATAL_ERROR + "Unable to find Open Cascade library files in OCC_LIBRARY_DIR ('${OCC_LIBRARY_DIR}'), aborting" + ) +endif() + +# Use the found libTKernel as a template for all other OCC libraries +# TODO Extract this into macro/function +foreach(lib ${OpenCASCADE_LIBRARIES}) + # Make sure we'll handle the Windows/MSVC debug postfix convention too. + string(REPLACE TKerneld "${lib}" lib_path "${libTKernel}") + string(REPLACE TKernel "${lib}" lib_path "${lib_path}") + list(APPEND OpenCASCADE_LIBRARIES "${lib_path}") +endforeach() + +if(MSVC) + add_definitions(-DHAVE_NO_DLL) + add_debug_variants(OpenCASCADE_LIBRARIES "${OpenCASCADE_LIBRARIES}" d) +endif() + +if(WIN32) + # OCC might require linking to Winsock depending on the version and build configuration + list(APPEND OpenCASCADE_LIBRARIES ws2_32.lib) +endif() + +# Make sure cross-referenced symbols between static OCC libraries get +# resolved. Also add thread and rt libraries. +get_filename_component(libTKernelExt ${libTKernel} EXT) +if("${libTKernelExt}" STREQUAL ".a") + set(OCCT_STATIC ON) +endif() + +if(OCCT_STATIC) + find_package(Threads) + + if(WASM_BUILD) + set(OpenCASCADE_LIBRARIES ${OpenCASCADE_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) + else() + # OpenCASCADE_LIBRARIES repeated N times below in order to fix cyclic dependencies + # tfk: --start-group ... --end-group didn't work on the apple linker when last tested + if(APPLE) + set(OpenCASCADE_LIBRARIES ${OpenCASCADE_LIBRARIES} ${OpenCASCADE_LIBRARIES} ${OpenCASCADE_LIBRARIES} ${OpenCASCADE_LIBRARIES} ${OpenCASCADE_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) + else() + set(OpenCASCADE_LIBRARIES -Wl,--start-group ${OpenCASCADE_LIBRARIES} -Wl,--end-group ${CMAKE_THREAD_LIBS_INIT}) + endif() + endif() + + if(NOT APPLE AND NOT WIN32) + set(OpenCASCADE_LIBRARIES ${OpenCASCADE_LIBRARIES} "rt") + endif() + if(NOT WIN32) + set(OpenCASCADE_LIBRARIES ${OpenCASCADE_LIBRARIES} "dl") + endif() +endif() diff --git a/src/examples/CMakeLists.txt b/src/examples/CMakeLists.txt index ae5fc1aa11..eee834f5c7 100644 --- a/src/examples/CMakeLists.txt +++ b/src/examples/CMakeLists.txt @@ -26,11 +26,11 @@ target_compile_features(IfcParseExamples PUBLIC cxx_std_17) if (WITH_OPENCASCADE) ADD_EXECUTABLE(IfcOpenHouse IfcOpenHouse.cpp) -TARGET_LINK_LIBRARIES(IfcOpenHouse ${IFCOPENSHELL_LIBRARIES} ${OPENCASCADE_LIBRARIES}) +TARGET_LINK_LIBRARIES(IfcOpenHouse ${IFCOPENSHELL_LIBRARIES} ${OpenCASCADE_LIBRARIES}) set_target_properties(IfcOpenHouse PROPERTIES FOLDER Examples) ADD_EXECUTABLE(IfcAdvancedHouse IfcAdvancedHouse.cpp) -TARGET_LINK_LIBRARIES(IfcAdvancedHouse ${IFCOPENSHELL_LIBRARIES} ${OPENCASCADE_LIBRARIES}) +TARGET_LINK_LIBRARIES(IfcAdvancedHouse ${IFCOPENSHELL_LIBRARIES} ${OpenCASCADE_LIBRARIES}) set_target_properties(IfcAdvancedHouse PROPERTIES FOLDER Examples) endif() diff --git a/src/ifcconvert/CMakeLists.txt b/src/ifcconvert/CMakeLists.txt index 56794e44ca..108e0e7588 100644 --- a/src/ifcconvert/CMakeLists.txt +++ b/src/ifcconvert/CMakeLists.txt @@ -9,7 +9,7 @@ endif() set(IFCCONVERT_FILES ${IFCCONVERT_CPP_FILES} ${IFCCONVERT_H_FILES}) add_executable(IfcConvert ${IFCCONVERT_FILES}) -target_link_libraries(IfcConvert IfcGeom IfcParse Serializers ${OPENCASCADE_LIBRARIES} ${Boost_LIBRARIES} ${HDF5_LIBRARIES} ${USD_LIBRARIES}) +target_link_libraries(IfcConvert IfcGeom IfcParse Serializers ${OpenCASCADE_LIBRARIES} ${Boost_LIBRARIES} ${HDF5_LIBRARIES} ${USD_LIBRARIES}) if(WITH_RELATIONSHIP_VALIDATION) set_property(TARGET IfcConvert APPEND_STRING PROPERTY COMPILE_FLAGS " -DWITH_RELATIONSHIP_VALIDATION") endif() diff --git a/src/ifcgeomserver/CMakeLists.txt b/src/ifcgeomserver/CMakeLists.txt index 24137c2555..ff56607ff2 100644 --- a/src/ifcgeomserver/CMakeLists.txt +++ b/src/ifcgeomserver/CMakeLists.txt @@ -3,6 +3,6 @@ find_package(Boost REQUIRED) file(GLOB CPP_FILES *.cpp) set(SOURCE_FILES ${CPP_FILES}) add_executable(IfcGeomServer ${SOURCE_FILES}) -target_link_libraries(IfcGeomServer IfcGeom ${kernel_libraries} ${OPENCASCADE_LIBRARIES}) +target_link_libraries(IfcGeomServer IfcGeom ${kernel_libraries} ${OpenCASCADE_LIBRARIES}) install(TARGETS IfcGeomServer) diff --git a/src/ifcmax/CMakeLists.txt b/src/ifcmax/CMakeLists.txt index 5ecadc882c..354ac34433 100644 --- a/src/ifcmax/CMakeLists.txt +++ b/src/ifcmax/CMakeLists.txt @@ -74,7 +74,7 @@ if(HAS_MAX) tessint.lib viewfile.lib zlibdll.lib - ${OPENCASCADE_LIBRARIES} + ${OpenCASCADE_LIBRARIES} ) set_target_properties(IfcMax_${max_year} PROPERTIES SUFFIX ".dli") diff --git a/src/ifcwrap/CMakeLists.txt b/src/ifcwrap/CMakeLists.txt index 149810216e..c0e74e2b1b 100644 --- a/src/ifcwrap/CMakeLists.txt +++ b/src/ifcwrap/CMakeLists.txt @@ -130,7 +130,7 @@ if (WASM_BUILD) endif() if("$ENV{LDFLAGS}" MATCHES ".undefined.suppress") # On osx there is some state in the python dylib. With `-Wl,undefined,suppress` we can ignore the missing symbols at compile time. -target_link_libraries(ifcopenshell_wrapper PRIVATE ${IFCOPENSHELL_LIBRARIES} ${OPENCASCADE_LIBRARIES} ${Boost_LIBRARIES} ${LIBSVGFILL}) +target_link_libraries(ifcopenshell_wrapper PRIVATE ${IFCOPENSHELL_LIBRARIES} ${OpenCASCADE_LIBRARIES} ${Boost_LIBRARIES} ${LIBSVGFILL}) else() target_link_libraries(ifcopenshell_wrapper PRIVATE ${IFCOPENSHELL_LIBRARIES} ${LIBSVGFILL}) endif() diff --git a/src/qtviewer/CMakeLists.txt b/src/qtviewer/CMakeLists.txt index 978d5f116b..809070ebad 100644 --- a/src/qtviewer/CMakeLists.txt +++ b/src/qtviewer/CMakeLists.txt @@ -84,7 +84,7 @@ set_target_properties(${targetName} PROPERTIES target_link_libraries(${targetName} ${IFCOPENSHELL_LIBRARIES} - ${OPENCASCADE_LIBRARIES} + ${OpenCASCADE_LIBRARIES} ${OPENSCENEGRAPH_LIBRARIES} Qt${QT_VERSION}::Core Qt${QT_VERSION}::Gui