mirror of
https://github.com/aaru-dps/libaaruformat.git
synced 2025-12-16 11:14:39 +00:00
Add BLAKE3 cryptographic hash function integration
This commit is contained in:
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -13,3 +13,6 @@
|
||||
[submodule "3rdparty/xxHash"]
|
||||
path = 3rdparty/xxHash
|
||||
url = https://github.com/Cyan4973/xxHash
|
||||
[submodule "3rdparty/BLAKE3"]
|
||||
path = 3rdparty/BLAKE3
|
||||
url = https://github.com/BLAKE3-team/BLAKE3
|
||||
|
||||
1
3rdparty/BLAKE3
vendored
Submodule
1
3rdparty/BLAKE3
vendored
Submodule
Submodule 3rdparty/BLAKE3 added at f8dbfe0b18
105
3rdparty/blake3.cmake
vendored
Normal file
105
3rdparty/blake3.cmake
vendored
Normal file
@@ -0,0 +1,105 @@
|
||||
# BLAKE3 - cryptographic hash function (https://github.com/BLAKE3-team/BLAKE3)
|
||||
# Lightweight static library integration (pure C + optional assembly) for libaaruformat.
|
||||
|
||||
# Option to use hand-written x86-64 assembly when available
|
||||
option(ENABLE_BLAKE3_ASM "Use hand-written x86-64 assembly for BLAKE3" ON)
|
||||
|
||||
set(BLAKE3_C_DIRECTORY "3rdparty/BLAKE3/c")
|
||||
|
||||
# Prevent redefinition if included multiple times
|
||||
if(TARGET blake3)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "BLAKE3: Building static library (custom minimal integration)")
|
||||
|
||||
add_library(blake3 STATIC)
|
||||
|
||||
# Core required sources (portable implementation + dispatcher)
|
||||
set(BLAKE3_CORE_SOURCES
|
||||
${BLAKE3_C_DIRECTORY}/blake3.c
|
||||
${BLAKE3_C_DIRECTORY}/blake3_dispatch.c
|
||||
${BLAKE3_C_DIRECTORY}/blake3_portable.c
|
||||
)
|
||||
|
||||
target_sources(blake3 PRIVATE ${BLAKE3_CORE_SOURCES})
|
||||
|
||||
# Architecture-specific optimizations / assembly
|
||||
if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
|
||||
# MSVC path: decide between assembly or portable-only (no intrinsics C files if assembly enabled)
|
||||
if(ENABLE_BLAKE3_ASM AND (CMAKE_SYSTEM_PROCESSOR MATCHES "[Xx]64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64"))
|
||||
message(STATUS "BLAKE3: Using MSVC x86-64 MASM assembly implementation")
|
||||
enable_language(ASM_MASM)
|
||||
target_sources(blake3 PRIVATE
|
||||
${BLAKE3_C_DIRECTORY}/blake3_avx2_x86-64_windows_msvc.asm
|
||||
${BLAKE3_C_DIRECTORY}/blake3_avx512_x86-64_windows_msvc.asm
|
||||
${BLAKE3_C_DIRECTORY}/blake3_sse2_x86-64_windows_msvc.asm
|
||||
${BLAKE3_C_DIRECTORY}/blake3_sse41_x86-64_windows_msvc.asm)
|
||||
else()
|
||||
message(STATUS "BLAKE3: Using portable-only (MSVC minimal) variant")
|
||||
endif()
|
||||
else()
|
||||
# Non-MSVC compilers (Clang/GCC/AppleClang)
|
||||
if(ENABLE_BLAKE3_ASM AND (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64") AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
# Choose correct assembly source variants
|
||||
if(WIN32)
|
||||
message(STATUS "BLAKE3: Using x86-64 GNU (Windows) assembly implementation")
|
||||
set(_BLAKE3_ASM_SOURCES
|
||||
${BLAKE3_C_DIRECTORY}/blake3_avx2_x86-64_windows_gnu.S
|
||||
${BLAKE3_C_DIRECTORY}/blake3_avx512_x86-64_windows_gnu.S
|
||||
${BLAKE3_C_DIRECTORY}/blake3_sse2_x86-64_windows_gnu.S
|
||||
${BLAKE3_C_DIRECTORY}/blake3_sse41_x86-64_windows_gnu.S)
|
||||
else()
|
||||
message(STATUS "BLAKE3: Using x86-64 UNIX assembly implementation")
|
||||
set(_BLAKE3_ASM_SOURCES
|
||||
${BLAKE3_C_DIRECTORY}/blake3_avx2_x86-64_unix.S
|
||||
${BLAKE3_C_DIRECTORY}/blake3_avx512_x86-64_unix.S
|
||||
${BLAKE3_C_DIRECTORY}/blake3_sse2_x86-64_unix.S
|
||||
${BLAKE3_C_DIRECTORY}/blake3_sse41_x86-64_unix.S)
|
||||
endif()
|
||||
# Enable generic ASM language (GNU/Clang handle preprocessed .S automatically, but be explicit)
|
||||
enable_language(ASM)
|
||||
target_sources(blake3 PRIVATE ${_BLAKE3_ASM_SOURCES})
|
||||
unset(_BLAKE3_ASM_SOURCES)
|
||||
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i386" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686")
|
||||
# Fallback to intrinsics C sources (no assembly or disabled)
|
||||
message(STATUS "BLAKE3: Enabling x86/x64 intrinsics (SSE2,SSE4.1,AVX2,AVX512*)")
|
||||
target_sources(blake3 PRIVATE
|
||||
${BLAKE3_C_DIRECTORY}/blake3_sse2.c
|
||||
${BLAKE3_C_DIRECTORY}/blake3_sse41.c
|
||||
${BLAKE3_C_DIRECTORY}/blake3_avx2.c)
|
||||
set_source_files_properties(${BLAKE3_C_DIRECTORY}/blake3_sse2.c PROPERTIES COMPILE_OPTIONS "-msse2")
|
||||
set_source_files_properties(${BLAKE3_C_DIRECTORY}/blake3_sse41.c PROPERTIES COMPILE_OPTIONS "-msse4.1")
|
||||
set_source_files_properties(${BLAKE3_C_DIRECTORY}/blake3_avx2.c PROPERTIES COMPILE_OPTIONS "-mavx2")
|
||||
if(NOT CMAKE_C_COMPILER_ID STREQUAL "AppleClang")
|
||||
target_sources(blake3 PRIVATE ${BLAKE3_C_DIRECTORY}/blake3_avx512.c)
|
||||
set_source_files_properties(${BLAKE3_C_DIRECTORY}/blake3_avx512.c PROPERTIES COMPILE_OPTIONS "-mavx512f;-mavx512vl")
|
||||
endif()
|
||||
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "arm64")
|
||||
message(STATUS "BLAKE3: Enabling NEON for AArch64")
|
||||
target_sources(blake3 PRIVATE ${BLAKE3_C_DIRECTORY}/blake3_neon.c)
|
||||
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
|
||||
message(STATUS "BLAKE3: Attempting NEON on 32-bit ARM")
|
||||
target_sources(blake3 PRIVATE ${BLAKE3_C_DIRECTORY}/blake3_neon.c)
|
||||
target_compile_options(blake3 PRIVATE -mfpu=neon)
|
||||
else()
|
||||
message(STATUS "BLAKE3: Unknown arch -> portable only")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Public include for blake3.h
|
||||
target_include_directories(blake3 PUBLIC ${BLAKE3_C_DIRECTORY})
|
||||
|
||||
# PIC for inclusion into shared library
|
||||
set_property(TARGET blake3 PROPERTY POSITION_INDEPENDENT_CODE TRUE)
|
||||
|
||||
# Optimize in Release
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Release")
|
||||
if(MSVC)
|
||||
target_compile_options(blake3 PRIVATE /O2)
|
||||
else()
|
||||
target_compile_options(blake3 PRIVATE -O3 -ffast-math)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Do NOT link aaruformat here; top-level handles linkage.
|
||||
@@ -138,6 +138,10 @@ include_directories(include include/aaruformat 3rdparty/uthash/include 3rdparty/
|
||||
include(3rdparty/flac.cmake)
|
||||
include(3rdparty/lzma.cmake)
|
||||
include(3rdparty/xxhash.cmake)
|
||||
include(3rdparty/blake3.cmake)
|
||||
if(TARGET blake3)
|
||||
target_link_libraries(aaruformat blake3)
|
||||
endif()
|
||||
|
||||
macro(TARGET_LINK_LIBRARIES_WHOLE_ARCHIVE target)
|
||||
if(MSVC)
|
||||
|
||||
Reference in New Issue
Block a user