Skip to content

Commit 9eedbc6

Browse files
committed
FindOpenCASCADE - fix linking issue with non-configs #7390
Unexpected consequence of #7365 - previously `OPENCASCADE_LIBRARIES` supposed to be a list of libraries filepaths, but after refactor `OpenCASCADE_LIBRARIES` end up being both list of library names and list of filepaths. And since link directories for the names was not provided, it failed to find the libraries to link. If using OpenCASCADEconfig it wouldn't fail as cmake would evaluate library names as imported target names. To fix it and simplify it even further, in case of manually provided paths, it now creates `OpenCASCADE_INTERFACE` target and stores it in `OpenCASCADE_LIBRARIES` - target will automatically have all the includes, library names and library dirs.
1 parent 68b021b commit 9eedbc6

File tree

4 files changed

+38
-44
lines changed

4 files changed

+38
-44
lines changed

cmake/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ endif(MSVC)
489489
find_package(Eigen3 REQUIRED)
490490
link_libraries(Eigen3::Eigen)
491491

492-
include_directories(${INCLUDE_DIRECTORIES} ${OCC_INCLUDE_DIR} ${OPENCOLLADA_INCLUDE_DIRS}
492+
include_directories(${INCLUDE_DIRECTORIES} ${OPENCOLLADA_INCLUDE_DIRS}
493493
${Boost_INCLUDE_DIRS} ${LIBXML2_INCLUDE_DIR} ${JSON_INCLUDE_DIR} ${HDF5_INCLUDE_DIR}
494494
${CGAL_INCLUDE_DIR} ${GMP_INCLUDE_DIR} ${MPFR_INCLUDE_DIR} ${USD_INCLUDE_DIR}
495495
${TBB_INCLUDE_DIR}
@@ -657,7 +657,7 @@ if(BUILD_IFCGEOM)
657657
find_package(Threads)
658658
endif()
659659

660-
target_link_libraries(IfcGeom IfcParse ${mapping_libraries} ${CMAKE_THREAD_LIBS_INIT})
660+
target_link_libraries(IfcGeom IfcParse ${mapping_libraries} ${CMAKE_THREAD_LIBS_INIT} ${OpenCASCADE_LIBRARIES})
661661

662662
endif(BUILD_IFCGEOM)
663663

cmake/FindOpenCASCADE.cmake

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
# If input variables are not specified, try to find OpenCASCADE config.
66
# Input variables could also be provided as environment variables.
77
#
8-
# Output variables:
9-
# - `OCC_INCLUDE_DIR`
10-
# - `OCC_LIBRARY_DIR`
8+
# Output variables
119
# - `OpenCASCADE_LIBRARIES`
1210
#
1311

@@ -24,6 +22,17 @@ if(OCC_LIBRARY_DIR)
2422
message(STATUS "Looking for Open CASCADE library files in: ${OCC_LIBRARY_DIR}")
2523
endif()
2624

25+
26+
if(NOT OCC_INCLUDE_DIR AND NOT OCC_LIBRARY_DIR)
27+
# OCE is not supported for find_package, because it's using a different name (`oce`)
28+
# and also has an odd directory structure (install/lib/oce-0.18/*.cmake).
29+
# find_package creates variables:
30+
# - `OpenCASCADE_INCLUDE_DIR`
31+
# - `OpenCASCADE_LIBRARIES`
32+
find_package(OpenCASCADE CONFIG REQUIRED)
33+
return()
34+
endif()
35+
2736
# No specific paths specified, try to find package.
2837
if(OCC_INCLUDE_DIR AND OCC_LIBRARY_DIR)
2938
message(
@@ -45,23 +54,6 @@ if(OCC_INCLUDE_DIR AND OCC_LIBRARY_DIR)
4554
)
4655
string(REGEX MATCH "[0-9]+" OCC_MAINT ${OCC_MAINT})
4756
set(OCC_VERSION_STRING "${OCC_MAJOR}.${OCC_MINOR}.${OCC_MAINT}")
48-
elseif(NOT OCC_INCLUDE_DIR AND NOT OCC_LIBRARY_DIR)
49-
# OCE is not supported for find_package, because it's using a different name (`oce`)
50-
# and also has an odd directory structure (install/lib/oce-0.18/*.cmake).
51-
find_package(OpenCASCADE CONFIG REQUIRED)
52-
set(OCC_INCLUDE_DIR ${OpenCASCADE_INCLUDE_DIR})
53-
# Do not use OpenCASCADE_LIBRARY_DIR for OCC_LIBRARY_DIR - check target property explicitly.
54-
# On Windows there is a case with OpenCASCADE_LIBRARY_DIR points to `lib` folder,
55-
# while TKernel is actually in `libi`.
56-
get_target_property(TKERNEL_LIB_PATH TKernel LOCATION)
57-
get_filename_component(OCC_LIBRARY_DIR "${TKERNEL_LIB_PATH}" DIRECTORY)
58-
set(OCC_VERSION_STRING ${OpenCASCADE_VERSION})
59-
message(
60-
STATUS
61-
"Found Open CASCADE package at '${OpenCASCADE_DIR}', "
62-
"deducing from it OCC_INCLUDE_DIR: '${OCC_INCLUDE_DIR}' "
63-
"and OCC_LIBRARY_DIR: '${OCC_LIBRARY_DIR}'."
64-
)
6557
else()
6658
message(
6759
FATAL_ERROR
@@ -99,15 +91,6 @@ else()
9991
)
10092
endif()
10193

102-
# Use the found libTKernel as a template for all other OCC libraries
103-
# TODO Extract this into macro/function
104-
foreach(lib ${OpenCASCADE_LIBRARIES})
105-
# Make sure we'll handle the Windows/MSVC debug postfix convention too.
106-
string(REPLACE TKerneld "${lib}" lib_path "${libTKernel}")
107-
string(REPLACE TKernel "${lib}" lib_path "${lib_path}")
108-
list(APPEND OpenCASCADE_LIBRARIES "${lib_path}")
109-
endforeach()
110-
11194
if(MSVC)
11295
add_definitions(-DHAVE_NO_DLL)
11396
add_debug_variants(OpenCASCADE_LIBRARIES "${OpenCASCADE_LIBRARIES}" d)
@@ -147,3 +130,9 @@ if(OCCT_STATIC)
147130
set(OpenCASCADE_LIBRARIES ${OpenCASCADE_LIBRARIES} "dl")
148131
endif()
149132
endif()
133+
134+
add_library(OpenCASCADE_INTERFACE INTERFACE IMPORTED)
135+
target_include_directories(OpenCASCADE_INTERFACE INTERFACE "${OCC_INCLUDE_DIR}")
136+
target_link_libraries(OpenCASCADE_INTERFACE INTERFACE ${OpenCASCADE_LIBRARIES})
137+
target_link_directories(OpenCASCADE_INTERFACE INTERFACE "${OCC_LIBRARY_DIR}")
138+
set(OpenCASCADE_LIBRARIES OpenCASCADE_INTERFACE)

src/ifcgeom/kernels/CMakeLists.txt

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,34 @@ foreach(kernel ${GEOMETRY_KERNELS})
44
file(GLOB IFCGEOM_CPP_FILES ${kernel}/*.cpp)
55
set(IFCGEOM_FILES ${IFCGEOM_CPP_FILES} ${IFCGEOM_H_FILES})
66

7-
add_library(geometry_kernel_${kernel} OBJECT ${IFCGEOM_FILES})
8-
set_property(TARGET geometry_kernel_${kernel} APPEND PROPERTY COMPILE_FLAGS "-DIFC_GEOM_EXPORTS")
9-
list(APPEND kernel_libraries geometry_kernel_${kernel})
10-
target_link_libraries(geometry_kernel_${kernel} ${${KERNEL_UPPER}_LIBRARIES})
7+
set(KERNEL_TARGET "geometry_kernel_${kernel}")
118

12-
install(TARGETS geometry_kernel_${kernel}
9+
add_library(${KERNEL_TARGET} OBJECT ${IFCGEOM_FILES})
10+
set_property(TARGET ${KERNEL_TARGET} APPEND PROPERTY COMPILE_FLAGS "-DIFC_GEOM_EXPORTS")
11+
list(APPEND kernel_libraries ${KERNEL_TARGET})
12+
target_link_libraries(${KERNEL_TARGET} ${${KERNEL_UPPER}_LIBRARIES})
13+
14+
install(TARGETS ${KERNEL_TARGET}
1315
ARCHIVE DESTINATION ${LIBDIR}
1416
LIBRARY DESTINATION ${LIBDIR}
1517
RUNTIME DESTINATION ${BINDIR}
1618
)
1719

1820
if(${kernel} STREQUAL "cgal")
19-
set_property(TARGET geometry_kernel_${kernel} APPEND_STRING PROPERTY COMPILE_FLAGS " -DCGAL_HAS_THREADS")
21+
set_property(TARGET ${KERNEL_TARGET} APPEND_STRING PROPERTY COMPILE_FLAGS " -DCGAL_HAS_THREADS")
2022

21-
add_library(geometry_kernel_${kernel}_simple OBJECT ${IFCGEOM_FILES})
22-
set_target_properties(geometry_kernel_${kernel}_simple PROPERTIES COMPILE_FLAGS "-DIFC_GEOM_EXPORTS -DIFOPSH_SIMPLE_KERNEL -DCGAL_HAS_THREADS")
23-
list(APPEND kernel_libraries geometry_kernel_${kernel}_simple)
24-
target_link_libraries(geometry_kernel_${kernel}_simple ${${KERNEL_UPPER}_LIBRARIES} Eigen3::Eigen)
25-
install(TARGETS geometry_kernel_${kernel}_simple
23+
set(KERNEL_TARGET_SIMPLE "${KERNEL_TARGET}_simple")
24+
add_library(${KERNEL_TARGET_SIMPLE} OBJECT ${IFCGEOM_FILES})
25+
set_target_properties(${KERNEL_TARGET_SIMPLE} PROPERTIES COMPILE_FLAGS "-DIFC_GEOM_EXPORTS -DIFOPSH_SIMPLE_KERNEL -DCGAL_HAS_THREADS")
26+
list(APPEND kernel_libraries ${KERNEL_TARGET_SIMPLE})
27+
target_link_libraries(${KERNEL_TARGET_SIMPLE} ${${KERNEL_UPPER}_LIBRARIES} Eigen3::Eigen)
28+
install(TARGETS ${KERNEL_TARGET_SIMPLE}
2629
ARCHIVE DESTINATION ${LIBDIR}
2730
LIBRARY DESTINATION ${LIBDIR}
2831
RUNTIME DESTINATION ${BINDIR}
2932
)
33+
elseif(${kernel} STREQUAL "opencascade")
34+
target_link_libraries(${KERNEL_TARGET} ${OpenCASCADE_LIBRARIES})
3035
endif()
3136

3237
install(FILES ${IFCGEOM_H_FILES}

src/ifcmax/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ if(HAS_MAX)
3535

3636
message(STATUS "Building IFCMax library for Autodesk 3ds Max SDK ${max_year}")
3737

38-
include_directories(${INCLUDE_DIRECTORIES} ${OCC_INCLUDE_DIR} ${OPENCOLLADA_INCLUDE_DIRS} ${ICU_INCLUDE_DIR}
38+
include_directories(${INCLUDE_DIRECTORIES} ${OPENCOLLADA_INCLUDE_DIRS} ${ICU_INCLUDE_DIR}
3939
${Boost_INCLUDE_DIRS} ${max_sdk}/include
4040
)
4141

4242
# All recent versions of 3ds Max (2014 and newer) are 64-bit only so assume lib/x64 directory
43-
link_directories(${LINK_DIRECTORIES} ${IfcOpenShell_BINARY_DIR} ${OCC_LIBRARY_DIR} ${OPENCOLLADA_LIBRARY_DIR}
43+
link_directories(${LINK_DIRECTORIES} ${IfcOpenShell_BINARY_DIR} ${OPENCOLLADA_LIBRARY_DIR}
4444
${ICU_LIBRARY_DIR} ${Boost_LIBRARY_DIRS} ${max_sdk}/lib/x64/Release
4545
)
4646

0 commit comments

Comments
 (0)