Skip to content

Commit

Permalink
Implement heuristic to resolve import/shared libraries on Windows
Browse files Browse the repository at this point in the history
  • Loading branch information
theblackunknown committed Aug 6, 2024
1 parent 8575711 commit a1075a6
Showing 1 changed file with 93 additions and 24 deletions.
117 changes: 93 additions & 24 deletions cmake/modules/FindTBB.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -137,21 +137,27 @@ if(NOT TBB_FOUND)
set(TBB_ARCHITECTURE "ia32")
endif()

# Set the TBB search library path search suffix based on the version of VC
# Set the TBB search library/runtime path search suffix based on the version of VC
if(WINDOWS_STORE)
set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc11_ui")
set(TBB_RUNTIME_PATH_SUFFIX "bin/${TBB_ARCHITECTURE}/vc11_ui")
elseif(MSVC14)
set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc14")
set(TBB_RUNTIME_PATH_SUFFIX "bin/${TBB_ARCHITECTURE}/vc14")
elseif(MSVC12)
set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc12")
set(TBB_RUNTIME_PATH_SUFFIX "bin/${TBB_ARCHITECTURE}/vc12")
elseif(MSVC11)
set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc11")
set(TBB_RUNTIME_PATH_SUFFIX "bin/${TBB_ARCHITECTURE}/vc11")
elseif(MSVC10)
set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc10")
set(TBB_RUNTIME_PATH_SUFFIX "bin/${TBB_ARCHITECTURE}/vc10")
endif()

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

elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
# OS X
Expand All @@ -176,12 +182,13 @@ if(NOT TBB_FOUND)
endif()
endif()

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

##################################
# Find the TBB include dir
Expand Down Expand Up @@ -250,6 +257,32 @@ if(NOT TBB_FOUND)
PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH
PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX})

# On Windows platforms also looks for .dll binaries.
# If we find some, assume TBB is built as a shared library with the .lib/.dll pair,
# otherwise assume it is built as a static library
set(TBB_${_comp}_TARGET_TYPE SHARED)
if(WIN32)
find_file(TBB_${_comp}_SHARED_LIBRARY_RELEASE
NAMES ${CMAKE_SHARED_LIBRARY_PREFIX}${_lib_name}${CMAKE_SHARED_LIBRARY_SUFFIX}
HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR}
PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH
PATH_SUFFIXES ${TBB_RUNTIME_PATH_SUFFIX})

find_file(TBB_${_comp}_SHARED_LIBRARY_DEBUG
NAMES ${CMAKE_SHARED_LIBRARY_PREFIX}${_lib_name}_debug${CMAKE_SHARED_LIBRARY_SUFFIX}
HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR}
PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH
PATH_SUFFIXES ${TBB_RUNTIME_PATH_SUFFIX})

if(TBB_${_comp}_LIBRARY_RELEASE AND TBB_${_comp}_SHARED_LIBRARY_RELEASE)
set(TBB_${_comp}_TARGET_TYPE SHARED)
elseif(TBB_${_comp}_LIBRARY_DEBUG AND TBB_${_comp}_SHARED_LIBRARY_DEBUG)
set(TBB_${_comp}_TARGET_TYPE SHARED)
else()
set(TBB_${_comp}_TARGET_TYPE STATIC)
endif()
endif()

if(TBB_${_comp}_LIBRARY_DEBUG)
list(APPEND TBB_LIBRARIES_DEBUG "${TBB_${_comp}_LIBRARY_DEBUG}")
endif()
Expand All @@ -270,6 +303,7 @@ if(NOT TBB_FOUND)
mark_as_advanced(TBB_${_comp}_LIBRARY_RELEASE)
mark_as_advanced(TBB_${_comp}_LIBRARY_DEBUG)
mark_as_advanced(TBB_${_comp}_LIBRARY)
mark_as_advanced(TBB_${_comp}_TARGET_TYPE)

endif()
endforeach()
Expand Down Expand Up @@ -302,26 +336,61 @@ if(NOT TBB_FOUND)
##################################

if(NOT CMAKE_VERSION VERSION_LESS 3.0 AND TBB_FOUND)
add_library(TBB::tbb SHARED IMPORTED)
set_target_properties(TBB::tbb PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${TBB_INCLUDE_DIRS}
IMPORTED_LOCATION ${TBB_LIBRARIES})
if(TBB_LIBRARIES_RELEASE AND TBB_LIBRARIES_DEBUG)
set_target_properties(TBB::tbb PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "$<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:TBB_USE_DEBUG=1>"
IMPORTED_LOCATION_DEBUG ${TBB_LIBRARIES_DEBUG}
IMPORTED_LOCATION_RELWITHDEBINFO ${TBB_LIBRARIES_DEBUG}
IMPORTED_LOCATION_RELEASE ${TBB_LIBRARIES_RELEASE}
IMPORTED_LOCATION_MINSIZEREL ${TBB_LIBRARIES_RELEASE}
)
elseif(TBB_LIBRARIES_RELEASE)
set_target_properties(TBB::tbb PROPERTIES IMPORTED_LOCATION ${TBB_LIBRARIES_RELEASE})
else()
set_target_properties(TBB::tbb PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS_DEBUG}"
IMPORTED_LOCATION ${TBB_LIBRARIES_DEBUG}
)
endif()

foreach(_comp ${TBB_SEARCH_COMPONENTS})
if(";${TBB_FIND_COMPONENTS};tbb" MATCHES ";${_comp};")

add_library(TBB::${_comp} ${TBB_${_comp}_TARGET_TYPE} IMPORTED)
set_property(TARGET TBB::${_comp} APPEND PROPERTY
INTERFACE_INCLUDE_DIRECTORIES ${TBB_INCLUDE_DIRS}
)

if(WIN32 AND TBB_${_comp}_SHARED_LIBRARY_${TBB_BUILD_TYPE})
set_target_properties(TBB::${_comp} PROPERTIES
IMPORTED_IMPLIB ${TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE}}
IMPORTED_LOCATION ${TBB_${_comp}_SHARED_LIBRARY_${TBB_BUILD_TYPE}})
else()
set_target_properties(TBB::${_comp} PROPERTIES
IMPORTED_LOCATION ${TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE}})
endif()

if(TBB_${_comp}_LIBRARY_DEBUG)
set_property(TARGET TBB::${_comp} APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
set_property(TARGET TBB::${_comp} APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS "$<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:TBB_USE_DEBUG=1>")

if(WIN32 AND TBB_${_comp}_SHARED_LIBRARY_DEBUG)
set_target_properties(TBB::${_comp} PROPERTIES
IMPORTED_IMPLIB_DEBUG ${TBB_${_comp}_LIBRARY_DEBUG}
IMPORTED_IMPLIB_RELWITHDEBINFO ${TBB_${_comp}_LIBRARY_DEBUG}

IMPORTED_LOCATION_DEBUG ${TBB_${_comp}_SHARED_LIBRARY_DEBUG}
IMPORTED_LOCATION_RELWITHDEBINFO ${TBB_${_comp}_SHARED_LIBRARY_DEBUG})
else()
set_target_properties(TBB::${_comp} PROPERTIES
IMPORTED_LOCATION_DEBUG ${TBB_${_comp}_LIBRARY_DEBUG}
IMPORTED_LOCATION_RELWITHDEBINFO ${TBB_${_comp}_LIBRARY_DEBUG})
endif()
endif()

if(TBB_${_comp}_LIBRARY_RELEASE)
set_property(TARGET TBB::${_comp} APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)

if(WIN32 AND TBB_${_comp}_SHARED_LIBRARY_RELEASE)
set_target_properties(TBB::${_comp} PROPERTIES
IMPORTED_IMPLIB_RELEASE ${TBB_${_comp}_LIBRARY_RELEASE}
IMPORTED_IMPLIB_MINSIZEREL ${TBB_${_comp}_LIBRARY_RELEASE}

IMPORTED_LOCATION_RELEASE ${TBB_${_comp}_SHARED_LIBRARY_RELEASE}
IMPORTED_LOCATION_MINSIZEREL ${TBB_${_comp}_SHARED_LIBRARY_RELEASE})
else()
set_target_properties(TBB::${_comp} PROPERTIES
IMPORTED_LOCATION_RELEASE ${TBB_${_comp}_LIBRARY_RELEASE}
IMPORTED_LOCATION_MINSIZEREL ${TBB_${_comp}_LIBRARY_RELEASE})
endif()
endif()

endif()
endforeach()
endif()

mark_as_advanced(TBB_INCLUDE_DIRS TBB_LIBRARIES)
Expand Down

0 comments on commit a1075a6

Please sign in to comment.