Skip to content

Commit

Permalink
[onetbb] added hwloc / tbbbind support
Browse files Browse the repository at this point in the history
  • Loading branch information
ilya-lavrenov committed Jul 10, 2023
1 parent 71e9889 commit 038ae96
Show file tree
Hide file tree
Showing 3 changed files with 143 additions and 0 deletions.
3 changes: 3 additions & 0 deletions recipes/onetbb/all/conandata.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,6 @@ patches:
patch_type: "portability"
patch_source: "https://github.com/oneapi-src/oneTBB/pull/716.diff"
patch_file: "patches/fix-overeager-stripping-of-compile-flag.diff"
- patch_description: "Use pkg_search_module with IMPORTED_TARGET"
patch_type: "portability"
patch_file: "patches/pkg-search-module-use-imported-target.diff"
43 changes: 43 additions & 0 deletions recipes/onetbb/all/conanfile.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from conan import ConanFile
from conan.errors import ConanInvalidConfiguration
from conan.tools.build import cross_building
from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout
from conan.tools.files import apply_conandata_patches, export_conandata_patches, copy, get, load, rmdir
from conan.tools.gnu import PkgConfigDeps
from conan.tools.scm import Version
import os
import re
Expand All @@ -26,22 +28,45 @@ class OneTBBConan(ConanFile):
"fPIC": [True, False],
"tbbmalloc": [True, False],
"tbbproxy": [True, False],
"tbbbind": [True, False],
"interprocedural_optimization": [True, False],
}
default_options = {
"shared": True,
"fPIC": True,
"tbbmalloc": True,
"tbbproxy": True,
"tbbbind": True,
"interprocedural_optimization": True,
}

@property
def _tbbbind_hwloc_version(self):
# TBB expects different variables depending on the version
return "2_5" if Version(self.version) >= "2021.4.0" else "2_4"

@property
def _tbbbind_supported(self):
return Version(self.version) >= "2021.1.1" and not self.settings.os == "Macos"

@property
def _tbbbind_build(self):
return self.options.get_safe("tbbbind", False) and self._tbbbind_supported

@property
def _tbbbind_explicit_hwloc(self):
# during cross-compilation, oneTBB does not search for HWLOC and we need to specify it explicitly
# but then oneTBB creates an imported SHARED target from provided paths, so we have to set shared=True
return self._tbbbind_build and cross_building(self)

def export_sources(self):
export_conandata_patches(self)

def config_options(self):
if self.settings.os == "Windows":
del self.options.fPIC
if not self._tbbbind_supported:
del self.options.tbbbind
if Version(self.version) < "2021.6.0" or self.settings.os == "Android":
del self.options.interprocedural_optimization
if Version(self.version) < "2021.2.0":
Expand All @@ -53,8 +78,15 @@ def configure(self):
self.options.rm_safe("fPIC")
else:
del self.options.tbbproxy
del self.options.rm_safe("tbbbind")

Check failure on line 81 in recipes/onetbb/all/conanfile.py

View workflow job for this annotation

GitHub Actions / Lint changed conanfile.py (v2 migration)

cannot delete function call (<unknown>, line 81)
if not self.options.tbbmalloc:
self.options.rm_safe("tbbproxy")
if self._tbbbind_explicit_hwloc:
self.options["hwloc"].shared = True

def requirements(self):
if self._tbbbind_build:
self.requires("hwloc/2.9.1")

def layout(self):
cmake_layout(self, src_folder="src")
Expand Down Expand Up @@ -90,6 +122,17 @@ def generate(self):
toolchain.variables["TBB_ENABLE_IPO"] = self.options.interprocedural_optimization
if Version(self.version) >= "2021.6.0" and self.options.get_safe("tbbproxy"):
toolchain.variables["TBBMALLOC_PROXY_BUILD"] = self.options.tbbproxy
toolchain.variables["TBB_DISABLE_HWLOC_AUTOMATIC_SEARCH"] = not self._tbbbind_build
if self._tbbbind_build:
deps = PkgConfigDeps(self)
deps.generate()
if self._tbbbind_explicit_hwloc:
hwloc_package_folder = self.dependencies["hwloc"].package_folder.replace("\\", "/")
hwloc_lib_name = "hwloc.lib" if self.settings.os == "Windows" else "libhwloc.so"
toolchain.variables[f"CMAKE_HWLOC_{self._tbbbind_hwloc_version}_LIBRARY_PATH"] = os.path.join(hwloc_package_folder, "lib", hwloc_lib_name)
toolchain.variables[f"CMAKE_HWLOC_{self._tbbbind_hwloc_version}_INCLUDE_PATH"] = os.path.join(hwloc_package_folder, "include")
if self.settings.os == "Windows":
toolchain.variables[f"CMAKE_HWLOC_{self._tbbbind_hwloc_version}_DLL_PATH"] = os.path.join(hwloc_package_folder, "bin", "hwloc.dll")
toolchain.generate()

def build(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 34a23d40..d569d57e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -100,6 +100,8 @@ option(TBB_NO_APPCONTAINER "Apply /APPCONTAINER:NO (for testing binaries for Win
option(TBB4PY_BUILD "Enable tbb4py build" OFF)
option(TBB_CPF "Enable preview features of the library" OFF)
option(TBB_FIND_PACKAGE "Enable search for external oneTBB using find_package instead of build from sources" OFF)
+option(TBB_DISABLE_HWLOC_AUTOMATIC_SEARCH "Disable HWLOC automatic search by pkg-config tool" OFF)
+

if (NOT DEFINED BUILD_SHARED_LIBS)
set(BUILD_SHARED_LIBS ON)
@@ -194,7 +196,7 @@ else()
if (NOT "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "mips")
add_subdirectory(src/tbbmalloc)
add_subdirectory(src/tbbmalloc_proxy)
- if (APPLE)
+ if (APPLE OR NOT BUILD_SHARED_LIBS)
message(STATUS "TBBBind build target is disabled due to unsupported environment")
else()
add_subdirectory(src/tbbbind)
diff --git a/cmake/hwloc_detection.cmake b/cmake/hwloc_detection.cmake
index f1740662..e1806a0f 100644
--- a/cmake/hwloc_detection.cmake
+++ b/cmake/hwloc_detection.cmake
@@ -45,11 +45,15 @@ endforeach()

unset(HWLOC_TARGET_NAME)

-if (NOT HWLOC_TARGET_EXPLICITLY_DEFINED)
+if (NOT HWLOC_TARGET_EXPLICITLY_DEFINED AND
+ # No hwloc auto detection for cross compilation
+ NOT CMAKE_CROSSCOMPILING AND
+ NOT TBB_DISABLE_HWLOC_AUTOMATIC_SEARCH
+)
find_package(PkgConfig QUIET)
- if (PKG_CONFIG_FOUND)
- pkg_search_module(HWLOC hwloc)
- if (HWLOC_FOUND)
+ if (PKG_CONFIG_FOUND AND NOT CMAKE_VERSION VERSION_LESS 3.6)
+ pkg_search_module(HWLOC hwloc IMPORTED_TARGET)
+ if (TARGET PkgConfig::HWLOC)
if (HWLOC_VERSION VERSION_LESS 2)
set(TBBBIND_LIBRARY_NAME tbbbind)
elseif(HWLOC_VERSION VERSION_LESS 2.4)
@@ -60,4 +64,3 @@ if (NOT HWLOC_TARGET_EXPLICITLY_DEFINED)
endif()
endif()
endif()
-
diff --git a/src/tbbbind/CMakeLists.txt b/src/tbbbind/CMakeLists.txt
index da9dabfe..1a4c6ca0 100644
--- a/src/tbbbind/CMakeLists.txt
+++ b/src/tbbbind/CMakeLists.txt
@@ -18,12 +18,13 @@ endif()
set(CMAKE_SKIP_BUILD_RPATH TRUE)

function(tbbbind_build TBBBIND_NAME REQUIRED_HWLOC_TARGET)
- if (NOT TARGET ${REQUIRED_HWLOC_TARGET} AND NOT DEFINED HWLOC_LIBRARIES)
+ if (NOT TARGET ${REQUIRED_HWLOC_TARGET})
message(STATUS "HWLOC target ${REQUIRED_HWLOC_TARGET} doesn't exist."
" The ${TBBBIND_NAME} target cannot be created")
return()
endif()
add_library(${TBBBIND_NAME} tbb_bind.cpp)
+
add_library(TBB::${TBBBIND_NAME} ALIAS ${TBBBIND_NAME})

target_compile_definitions(${TBBBIND_NAME}
@@ -64,14 +65,12 @@ function(tbbbind_build TBBBIND_NAME REQUIRED_HWLOC_TARGET)
PRIVATE
${TBB_LIB_LINK_FLAGS}
${TBB_COMMON_LINK_FLAGS}
- ${HWLOC_LIBRARY_DIRS} # pkg-config defined
)
else()
target_link_libraries(${TBBBIND_NAME}
PRIVATE
${TBB_LIB_LINK_FLAGS}
${TBB_COMMON_LINK_FLAGS}
- ${HWLOC_LIBRARY_DIRS} # pkg-config defined
)
endif()

@@ -90,9 +89,9 @@ function(tbbbind_build TBBBIND_NAME REQUIRED_HWLOC_TARGET)
endif()
endfunction()

-if (NOT DEFINED HWLOC_TARGET_EXPLICITLY_DEFINED AND DEFINED HWLOC_LIBRARIES)
+if (NOT DEFINED HWLOC_TARGET_EXPLICITLY_DEFINED AND TARGET PkgConfig::HWLOC)
message(STATUS "The ${TBBBIND_LIBRARY_NAME} target will be configured using the HWLOC ${HWLOC_VERSION}")
- tbbbind_build(${TBBBIND_LIBRARY_NAME} ${HWLOC_LIBRARIES})
+ tbbbind_build(${TBBBIND_LIBRARY_NAME} PkgConfig::HWLOC)
else()
tbbbind_build(tbbbind HWLOC::hwloc_1_11)
tbbbind_build(tbbbind_2_0 HWLOC::hwloc_2 )

0 comments on commit 038ae96

Please sign in to comment.