aboutsummaryrefslogtreecommitdiff
path: root/c/CMakeLists.txt
diff options
context:
space:
mode:
authorsilvanshade <[email protected]>2025-02-08 05:28:20 -0700
committerJack O'Connor <[email protected]>2025-03-09 16:00:11 -0700
commitd9b49df0757f8bdfaa542e7181013fbf1555ff89 (patch)
treeb0b3323bd07e22d39fb032e53b019386be9fb640 /c/CMakeLists.txt
parenta31e519869d5751370f50c39a99340660ee95bf7 (diff)
Implement TBB-based parallelism for C lib
Diffstat (limited to 'c/CMakeLists.txt')
-rw-r--r--c/CMakeLists.txt84
1 files changed, 83 insertions, 1 deletions
diff --git a/c/CMakeLists.txt b/c/CMakeLists.txt
index 76c8947..ba88ed3 100644
--- a/c/CMakeLists.txt
+++ b/c/CMakeLists.txt
@@ -12,12 +12,20 @@ endif()
project(libblake3
VERSION 1.6.1
DESCRIPTION "BLAKE3 C implementation"
- LANGUAGES C ASM
+ LANGUAGES C CXX ASM
)
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
+
+option(BLAKE3_USE_TBB "Enable oneTBB parallelism" OFF)
+option(BLAKE3_FETCH_TBB "Allow fetching oneTBB from GitHub if not found on system" OFF)
+
+include(CTest)
include(FeatureSummary)
include(GNUInstallDirs)
+add_subdirectory(dependencies)
+
# architecture lists for which to enable assembly / SIMD sources
set(BLAKE3_AMD64_NAMES amd64 AMD64 x86_64)
set(BLAKE3_X86_NAMES i686 x86 X86)
@@ -138,6 +146,11 @@ set_target_properties(blake3 PROPERTIES
C_EXTENSIONS OFF
)
target_compile_features(blake3 PUBLIC c_std_99)
+if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.12)
+ target_compile_features(blake3 PUBLIC cxx_std_20)
+ # else: add it further below through `BLAKE3_CMAKE_CXXFLAGS_*`
+endif()
+
# ensure C_EXTENSIONS OFF is respected without overriding CMAKE_C_STANDARD
# which may be set by the user or toolchain file
if (NOT POLICY CMP0128 AND NOT DEFINED CMAKE_C_STANDARD)
@@ -204,6 +217,67 @@ else()
message(FATAL_ERROR "BLAKE3_SIMD_TYPE is set to an unknown value: '${BLAKE3_SIMD_TYPE}'")
endif()
+if(BLAKE3_USE_TBB)
+ find_package(TBB 2021.11.0 QUIET)
+ if(NOT TBB_FOUND AND NOT TARGET TBB::tbb)
+ message(WARNING
+ "oneTBB not found; disabling BLAKE3_USE_TBB\n"
+ "Enable BLAKE3_FETCH_TBB to automatically fetch and build oneTBB"
+ )
+ set(BLAKE3_USE_TBB OFF)
+ else()
+ target_sources(blake3
+ PRIVATE
+ blake3_tbb.cpp)
+ target_link_libraries(blake3
+ PUBLIC
+ # Make shared TBB a transitive dependency. The consuming program is technically not required
+ # to link TBB in order for libblake3 to function but we do this in order to prevent the
+ # possibility of multiple separate TBB runtimes being linked into a final program in case
+ # the consuming program also happens to already use TBB.
+ TBB::tbb)
+ target_compile_definitions(blake3
+ PUBLIC
+ BLAKE3_USE_TBB)
+ endif()
+endif()
+
+if(BLAKE3_USE_TBB)
+ # Define some scratch variables for building appropriate flags per compiler
+ if(CMAKE_VERSION VERSION_LESS 3.12)
+ set(APPEND BLAKE3_CXX_STANDARD_FLAGS_GNU -std=c++20)
+ set(APPEND BLAKE3_CXX_STANDARD_FLAGS_MSVC /std:c++20)
+ endif()
+ set(BLAKE3_CXXFLAGS_GNU "-fno-exceptions;-fno-rtti;${BLAKE3_CXX_STANDARD_FLAGS_GNU}" CACHE STRING "C++ flags used for compiling private BLAKE3 library components with GNU-like compiler frontends.")
+ set(BLAKE3_CXXFLAGS_MSVC "/EHs-c-;/GR;${BLAKE3_CXX_STANDARD_FLAGS_MSVC}" CACHE STRING "C++ flags used for compiling private BLAKE3 library components with MSVC-like compiler frontends.")
+ # Get the C++ compiler name without extension
+ get_filename_component(BLAKE3_CMAKE_CXX_COMPILER_NAME "${CMAKE_CXX_COMPILER}" NAME_WE)
+ # Strip any trailing versioning from the C++ compiler name
+ string(REGEX MATCH "^(clang\\+\\+|clang-cl)" BLAKE3_CMAKE_CXX_COMPILER_NAME "${BLAKE3_CMAKE_CXX_COMPILER_NAME}")
+
+ # TODO: Simplify with CMAKE_CXX_COMPILER_FRONTEND_VARIANT once min CMake version is 3.14.
+ if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
+ target_compile_options(blake3 PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${BLAKE3_CXXFLAGS_GNU}>)
+ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+ if(BLAKE3_CMAKE_CXX_COMPILER_NAME STREQUAL "clang++")
+ target_compile_options(blake3 PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${BLAKE3_CXXFLAGS_GNU}>)
+ elseif(BLAKE3_CMAKE_CXX_COMPILER_NAME STREQUAL "clang-cl")
+ target_compile_options(blake3 PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${BLAKE3_CXXFLAGS_MSVC}>)
+ endif()
+ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+ target_compile_options(blake3 PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${BLAKE3_CXXFLAGS_GNU}>)
+ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
+ target_compile_options(blake3 PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${BLAKE3_CXXFLAGS_MSVC}>)
+ endif()
+
+ # Undefine scratch variables
+ unset(BLAKE3_CXX_STANDARD_FLAGS_GNU)
+ unset(BLAKE3_CXX_STANDARD_FLAGS_MSVC)
+ unset(BLAKE3_CMAKE_CXX_COMPILER_NAME)
+ unset(BLAKE3_CXXFLAGS_GNU)
+ unset(BLAKE3_CXXFLAGS_MSVC)
+endif()
+
# cmake install support
install(FILES blake3.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
install(TARGETS blake3 EXPORT blake3-targets
@@ -267,4 +341,12 @@ install(FILES "${CMAKE_BINARY_DIR}/libblake3.pc"
add_feature_info("AMD64 assembly" BLAKE3_SIMD_AMD64_ASM "The library uses hand written amd64 SIMD assembly.")
add_feature_info("x86 SIMD intrinsics" BLAKE3_SIMD_X86_INTRINSICS "The library uses x86 SIMD intrinsics.")
add_feature_info("NEON SIMD intrinsics" BLAKE3_SIMD_NEON_INTRINSICS "The library uses NEON SIMD intrinsics.")
+add_feature_info("oneTBB parallelism" BLAKE3_USE_TBB "The library uses oneTBB parallelism.")
feature_summary(WHAT ENABLED_FEATURES)
+
+if(BLAKE3_EXAMPLES)
+ include(BLAKE3/Examples)
+endif()
+if(BLAKE3_TESTING)
+ include(BLAKE3/Testing)
+endif()