Skip to content

Commit a1075a6

Browse files
Implement heuristic to resolve import/shared libraries on Windows
1 parent 8575711 commit a1075a6

File tree

1 file changed

+93
-24
lines changed

1 file changed

+93
-24
lines changed

cmake/modules/FindTBB.cmake

Lines changed: 93 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -137,21 +137,27 @@ if(NOT TBB_FOUND)
137137
set(TBB_ARCHITECTURE "ia32")
138138
endif()
139139

140-
# Set the TBB search library path search suffix based on the version of VC
140+
# Set the TBB search library/runtime path search suffix based on the version of VC
141141
if(WINDOWS_STORE)
142142
set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc11_ui")
143+
set(TBB_RUNTIME_PATH_SUFFIX "bin/${TBB_ARCHITECTURE}/vc11_ui")
143144
elseif(MSVC14)
144145
set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc14")
146+
set(TBB_RUNTIME_PATH_SUFFIX "bin/${TBB_ARCHITECTURE}/vc14")
145147
elseif(MSVC12)
146148
set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc12")
149+
set(TBB_RUNTIME_PATH_SUFFIX "bin/${TBB_ARCHITECTURE}/vc12")
147150
elseif(MSVC11)
148151
set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc11")
152+
set(TBB_RUNTIME_PATH_SUFFIX "bin/${TBB_ARCHITECTURE}/vc11")
149153
elseif(MSVC10)
150154
set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc10")
155+
set(TBB_RUNTIME_PATH_SUFFIX "bin/${TBB_ARCHITECTURE}/vc10")
151156
endif()
152157

153-
# Add the library path search suffix for the VC independent version of TBB
158+
# Add the library/runtime path search suffix for the VC independent version of TBB
154159
list(APPEND TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc_mt")
160+
list(APPEND TBB_RUNTIME_PATH_SUFFIX "bin/${TBB_ARCHITECTURE}/vc_mt")
155161

156162
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
157163
# OS X
@@ -176,12 +182,13 @@ if(NOT TBB_FOUND)
176182
endif()
177183
endif()
178184

179-
# The above TBB_LIB_PATH_SUFFIX is based on where Intel puts the libraries
185+
# The above TBB_LIB_PATH_SUFFIX/TBB_RUNTIME_PATH_SUFFIX is based on where Intel puts the libraries
180186
# in the package of prebuilt libraries it distributes. However, users may
181-
# install these shared libraries into the more conventional "lib" directory
187+
# install these shared libraries into the more conventional "lib"/"bin" directory
182188
# (especially when building from source), so we add that as an additional
183189
# location to search.
184190
list(APPEND TBB_LIB_PATH_SUFFIX "lib")
191+
list(APPEND TBB_RUNTIME_PATH_SUFFIX "bin")
185192

186193
##################################
187194
# Find the TBB include dir
@@ -250,6 +257,32 @@ if(NOT TBB_FOUND)
250257
PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH
251258
PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX})
252259

260+
# On Windows platforms also looks for .dll binaries.
261+
# If we find some, assume TBB is built as a shared library with the .lib/.dll pair,
262+
# otherwise assume it is built as a static library
263+
set(TBB_${_comp}_TARGET_TYPE SHARED)
264+
if(WIN32)
265+
find_file(TBB_${_comp}_SHARED_LIBRARY_RELEASE
266+
NAMES ${CMAKE_SHARED_LIBRARY_PREFIX}${_lib_name}${CMAKE_SHARED_LIBRARY_SUFFIX}
267+
HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR}
268+
PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH
269+
PATH_SUFFIXES ${TBB_RUNTIME_PATH_SUFFIX})
270+
271+
find_file(TBB_${_comp}_SHARED_LIBRARY_DEBUG
272+
NAMES ${CMAKE_SHARED_LIBRARY_PREFIX}${_lib_name}_debug${CMAKE_SHARED_LIBRARY_SUFFIX}
273+
HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR}
274+
PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH
275+
PATH_SUFFIXES ${TBB_RUNTIME_PATH_SUFFIX})
276+
277+
if(TBB_${_comp}_LIBRARY_RELEASE AND TBB_${_comp}_SHARED_LIBRARY_RELEASE)
278+
set(TBB_${_comp}_TARGET_TYPE SHARED)
279+
elseif(TBB_${_comp}_LIBRARY_DEBUG AND TBB_${_comp}_SHARED_LIBRARY_DEBUG)
280+
set(TBB_${_comp}_TARGET_TYPE SHARED)
281+
else()
282+
set(TBB_${_comp}_TARGET_TYPE STATIC)
283+
endif()
284+
endif()
285+
253286
if(TBB_${_comp}_LIBRARY_DEBUG)
254287
list(APPEND TBB_LIBRARIES_DEBUG "${TBB_${_comp}_LIBRARY_DEBUG}")
255288
endif()
@@ -270,6 +303,7 @@ if(NOT TBB_FOUND)
270303
mark_as_advanced(TBB_${_comp}_LIBRARY_RELEASE)
271304
mark_as_advanced(TBB_${_comp}_LIBRARY_DEBUG)
272305
mark_as_advanced(TBB_${_comp}_LIBRARY)
306+
mark_as_advanced(TBB_${_comp}_TARGET_TYPE)
273307

274308
endif()
275309
endforeach()
@@ -302,26 +336,61 @@ if(NOT TBB_FOUND)
302336
##################################
303337

304338
if(NOT CMAKE_VERSION VERSION_LESS 3.0 AND TBB_FOUND)
305-
add_library(TBB::tbb SHARED IMPORTED)
306-
set_target_properties(TBB::tbb PROPERTIES
307-
INTERFACE_INCLUDE_DIRECTORIES ${TBB_INCLUDE_DIRS}
308-
IMPORTED_LOCATION ${TBB_LIBRARIES})
309-
if(TBB_LIBRARIES_RELEASE AND TBB_LIBRARIES_DEBUG)
310-
set_target_properties(TBB::tbb PROPERTIES
311-
INTERFACE_COMPILE_DEFINITIONS "$<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:TBB_USE_DEBUG=1>"
312-
IMPORTED_LOCATION_DEBUG ${TBB_LIBRARIES_DEBUG}
313-
IMPORTED_LOCATION_RELWITHDEBINFO ${TBB_LIBRARIES_DEBUG}
314-
IMPORTED_LOCATION_RELEASE ${TBB_LIBRARIES_RELEASE}
315-
IMPORTED_LOCATION_MINSIZEREL ${TBB_LIBRARIES_RELEASE}
316-
)
317-
elseif(TBB_LIBRARIES_RELEASE)
318-
set_target_properties(TBB::tbb PROPERTIES IMPORTED_LOCATION ${TBB_LIBRARIES_RELEASE})
319-
else()
320-
set_target_properties(TBB::tbb PROPERTIES
321-
INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS_DEBUG}"
322-
IMPORTED_LOCATION ${TBB_LIBRARIES_DEBUG}
323-
)
324-
endif()
339+
340+
foreach(_comp ${TBB_SEARCH_COMPONENTS})
341+
if(";${TBB_FIND_COMPONENTS};tbb" MATCHES ";${_comp};")
342+
343+
add_library(TBB::${_comp} ${TBB_${_comp}_TARGET_TYPE} IMPORTED)
344+
set_property(TARGET TBB::${_comp} APPEND PROPERTY
345+
INTERFACE_INCLUDE_DIRECTORIES ${TBB_INCLUDE_DIRS}
346+
)
347+
348+
if(WIN32 AND TBB_${_comp}_SHARED_LIBRARY_${TBB_BUILD_TYPE})
349+
set_target_properties(TBB::${_comp} PROPERTIES
350+
IMPORTED_IMPLIB ${TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE}}
351+
IMPORTED_LOCATION ${TBB_${_comp}_SHARED_LIBRARY_${TBB_BUILD_TYPE}})
352+
else()
353+
set_target_properties(TBB::${_comp} PROPERTIES
354+
IMPORTED_LOCATION ${TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE}})
355+
endif()
356+
357+
if(TBB_${_comp}_LIBRARY_DEBUG)
358+
set_property(TARGET TBB::${_comp} APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
359+
set_property(TARGET TBB::${_comp} APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS "$<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:TBB_USE_DEBUG=1>")
360+
361+
if(WIN32 AND TBB_${_comp}_SHARED_LIBRARY_DEBUG)
362+
set_target_properties(TBB::${_comp} PROPERTIES
363+
IMPORTED_IMPLIB_DEBUG ${TBB_${_comp}_LIBRARY_DEBUG}
364+
IMPORTED_IMPLIB_RELWITHDEBINFO ${TBB_${_comp}_LIBRARY_DEBUG}
365+
366+
IMPORTED_LOCATION_DEBUG ${TBB_${_comp}_SHARED_LIBRARY_DEBUG}
367+
IMPORTED_LOCATION_RELWITHDEBINFO ${TBB_${_comp}_SHARED_LIBRARY_DEBUG})
368+
else()
369+
set_target_properties(TBB::${_comp} PROPERTIES
370+
IMPORTED_LOCATION_DEBUG ${TBB_${_comp}_LIBRARY_DEBUG}
371+
IMPORTED_LOCATION_RELWITHDEBINFO ${TBB_${_comp}_LIBRARY_DEBUG})
372+
endif()
373+
endif()
374+
375+
if(TBB_${_comp}_LIBRARY_RELEASE)
376+
set_property(TARGET TBB::${_comp} APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
377+
378+
if(WIN32 AND TBB_${_comp}_SHARED_LIBRARY_RELEASE)
379+
set_target_properties(TBB::${_comp} PROPERTIES
380+
IMPORTED_IMPLIB_RELEASE ${TBB_${_comp}_LIBRARY_RELEASE}
381+
IMPORTED_IMPLIB_MINSIZEREL ${TBB_${_comp}_LIBRARY_RELEASE}
382+
383+
IMPORTED_LOCATION_RELEASE ${TBB_${_comp}_SHARED_LIBRARY_RELEASE}
384+
IMPORTED_LOCATION_MINSIZEREL ${TBB_${_comp}_SHARED_LIBRARY_RELEASE})
385+
else()
386+
set_target_properties(TBB::${_comp} PROPERTIES
387+
IMPORTED_LOCATION_RELEASE ${TBB_${_comp}_LIBRARY_RELEASE}
388+
IMPORTED_LOCATION_MINSIZEREL ${TBB_${_comp}_LIBRARY_RELEASE})
389+
endif()
390+
endif()
391+
392+
endif()
393+
endforeach()
325394
endif()
326395

327396
mark_as_advanced(TBB_INCLUDE_DIRS TBB_LIBRARIES)

0 commit comments

Comments
 (0)