mirror of
https://github.com/aaru-dps/libaaruformat.git
synced 2025-12-16 19:24:40 +00:00
106 lines
5.0 KiB
CMake
106 lines
5.0 KiB
CMake
# 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.
|