aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/ci.yml30
-rw-r--r--c/CMakeLists.txt168
-rw-r--r--c/blake3-config.cmake.in5
3 files changed, 136 insertions, 67 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 06cbaa7..603a82b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -278,17 +278,23 @@ jobs:
# CMake build test (Library only), current macOS/Linux only.
cmake_build:
- name: CMake ${{ matrix.os }}
- runs-on: ${{ matrix.os }}
- strategy:
- fail-fast: false
- matrix:
- os: ["ubuntu-latest", "macOS-latest"]
- steps:
+ name: CMake ${{ matrix.os }}
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ os: ["ubuntu-latest", "macOS-latest", "windows-latest"]
+ compiler: [gcc, clang, cl]
+ exclude:
+ - os: windows-latest
+ compiler: gcc
+ - os: ubuntu-latest
+ compiler: msvc
+ - os: macOS-latest
+ compiler: msvc
+ steps:
- uses: actions/checkout@v3
- name: CMake generation
- run: cmake . -Bbuild
- working-directory: ./c
- - name: CMake build
- run: cmake --build build/
- working-directory: ./c
+ run: cmake -S c -B c/build -DCMAKE_INSTALL_PREFIX=${{github.workspace}}/target
+ - name: CMake build / install
+ run: cmake --build c/build --target install
diff --git a/c/CMakeLists.txt b/c/CMakeLists.txt
index 7266345..fd348b8 100644
--- a/c/CMakeLists.txt
+++ b/c/CMakeLists.txt
@@ -1,74 +1,132 @@
cmake_minimum_required(VERSION 3.9)
-project(libblake3 VERSION 0.1.0 DESCRIPTION "BLAKE3 C implementation")
-enable_language(C ASM)
+project(libblake3
+ VERSION 0.1.0
+ DESCRIPTION "BLAKE3 C implementation"
+ LANGUAGES C ASM
+)
include(GNUInstallDirs)
-option(BLAKE3_STATIC ON)
+# default SIMD compiler flag configuration (can be overriden by toolchains or CLI)
+if(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
+ set(BLAKE3_CFLAGS_SSE2 "/arch:SSE2" CACHE STRING "the compiler flags to enable SSE2")
+ # MSVC has no dedicated sse4.1 flag (see https://learn.microsoft.com/en-us/cpp/build/reference/arch-x86?view=msvc-170)
+ set(BLAKE3_CFLAGS_SSE4.1 "/arch:AVX" CACHE STRING "the compiler flags to enable SSE4.1")
+ set(BLAKE3_CFLAGS_AVX2 "/arch:AVX2" CACHE STRING "the compiler flags to enable AVX2")
+ set(BLAKE3_CFLAGS_AVX512 "/arch:AVX512" CACHE STRING "the compiler flags to enable AVX512")
-set(blake3_SOURCES)
-list(APPEND blake3_SOURCES
+elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU"
+ OR CMAKE_C_COMPILER_ID STREQUAL "Clang"
+ OR CMAKE_C_COMPILER_ID STREQUAL "AppleClang")
+ set(BLAKE3_CFLAGS_SSE2 "-msse2" CACHE STRING "the compiler flags to enable SSE2")
+ set(BLAKE3_CFLAGS_SSE4.1 "-msse4.1" CACHE STRING "the compiler flags to enable SSE4.1")
+ set(BLAKE3_CFLAGS_AVX2 "-mavx2" CACHE STRING "the compiler flags to enable AVX2")
+ set(BLAKE3_CFLAGS_AVX512 "-mavx512f -mavx512vl" CACHE STRING "the compiler flags to enable AVX512")
+ set(BLAKE3_CFLAGS_NEON "-mfpu=neon" CACHE STRING "the compiler flags to enable NEON")
+endif()
+
+# library target
+add_library(blake3
blake3.c
blake3_dispatch.c
- blake3_portable.c)
+ blake3_portable.c
+)
+add_library(BLAKE3::blake3 ALIAS blake3)
-if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64)
- list(APPEND blake3_SOURCES
- blake3_avx2_x86-64_unix.S
- blake3_avx512_x86-64_unix.S
- blake3_sse2_x86-64_unix.S
- blake3_sse41_x86-64_unix.S)
+# library configuration
+target_include_directories(blake3 PUBLIC $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
+set_target_properties(blake3 PROPERTIES
+ VERSION ${PROJECT_VERSION}
+ SOVERSION 0
+)
-elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL i686)
- list(APPEND blake3_SOURCES
- blake3_avx2.c
- blake3_avx512.c
- blake3_sse2.c
- blake3_sse41.c)
- set_source_files_properties(blake3_avx2.c PROPERTIES COMPILE_FLAGS -mavx2)
- set_source_files_properties(blake3_avx512.c PROPERTIES COMPILE_FLAGS "-mavx512f -mavx512vl")
- set_source_files_properties(blake3_sse2.c PROPERTIES COMPILE_FLAGS -msse2)
- set_source_files_properties(blake3_sse41.c PROPERTIES COMPILE_FLAGS -msse4.1)
+# optional SIMD sources
+if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64"
+ OR CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64")
+ if(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
+ enable_language(ASM_MASM)
+ target_sources(blake3 PRIVATE
+ blake3_avx2_x86-64_windows_msvc.asm
+ blake3_avx512_x86-64_windows_msvc.asm
+ blake3_sse2_x86-64_windows_msvc.asm
+ blake3_sse41_x86-64_windows_msvc.asm
+ )
-elseif((ANDROID_ABI STREQUAL armeabi-v7a) OR
- (CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) OR
- (CMAKE_SYSTEM_PROCESSOR STREQUAL arm64) # For M1 macs
+ elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU"
+ OR CMAKE_C_COMPILER_ID STREQUAL "Clang"
+ OR CMAKE_C_COMPILER_ID STREQUAL "AppleClang")
+ if (WIN32)
+ target_sources(blake3 PRIVATE
+ blake3_avx2_x86-64_windows_gnu.S
+ blake3_avx512_x86-64_windows_gnu.S
+ blake3_sse2_x86-64_windows_gnu.S
+ blake3_sse41_x86-64_windows_gnu.S
)
- list(APPEND blake3_SOURCES blake3_neon.c)
- set_source_files_properties(blake3_dispatch.c PROPERTIES COMPILE_FLAGS -DBLAKE3_USE_NEON=1)
- set_source_files_properties(blake3_neon.c PROPERTIES COMPILE_FLAGS -mfpu=neon)
-endif()
-configure_file(libblake3.pc.in libblake3.pc @ONLY)
-install(FILES ${CMAKE_BINARY_DIR}/libblake3.pc
- DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
+ elseif(UNIX)
+ target_sources(blake3 PRIVATE
+ blake3_avx2_x86-64_unix.S
+ blake3_avx512_x86-64_unix.S
+ blake3_sse2_x86-64_unix.S
+ blake3_sse41_x86-64_unix.S
+ )
+ endif()
+ endif()
-if(BLAKE3_STATIC)
- add_library(blake3-static STATIC ${blake3_SOURCES})
- set_target_properties(blake3-static PROPERTIES OUTPUT_NAME blake3)
- set_target_properties(blake3-static PROPERTIES VERSION ${PROJECT_VERSION})
- set_target_properties(blake3-static PROPERTIES SOVERSION 0)
- set_target_properties(blake3-static PROPERTIES PUBLIC_HEADER blake3.h)
- set_target_properties(blake3-static PROPERTIES COMPILE_FLAGS -fPIC)
- target_include_directories(blake3-static PUBLIC .)
+elseif((CMAKE_SYSTEM_PROCESSOR STREQUAL "i686"
+ OR CMAKE_SYSTEM_PROCESSOR STREQUAL "X86")
+ AND DEFINED BLAKE3_CFLAGS_SSE2
+ AND DEFINED BLAKE3_CFLAGS_SSE4.1
+ AND DEFINED BLAKE3_CFLAGS_AVX2
+ AND DEFINED BLAKE3_CFLAGS_AVX512)
+ target_sources(blake3 PRIVATE
+ blake3_avx2.c
+ blake3_avx512.c
+ blake3_sse2.c
+ blake3_sse41.c
+ )
+ set_source_files_properties(blake3_avx2.c PROPERTIES COMPILE_FLAGS "${BLAKE3_CFLAGS_AVX2}")
+ set_source_files_properties(blake3_avx512.c PROPERTIES COMPILE_FLAGS "${BLAKE3_CFLAGS_AVX512}")
+ set_source_files_properties(blake3_sse2.c PROPERTIES COMPILE_FLAGS "${BLAKE3_CFLAGS_SSE2}")
+ set_source_files_properties(blake3_sse41.c PROPERTIES COMPILE_FLAGS "${BLAKE3_CFLAGS_SSE4.1}")
- install(TARGETS blake3-static
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
- PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+elseif((ANDROID_ABI STREQUAL "armeabi-v7a"
+ OR CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64"
+ OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") # For M1 macs
+ AND DEFINED BLAKE3_CFLAGS_NEON)
+ target_sources(blake3 PRIVATE
+ blake3_neon.c
+ )
+ set_source_files_properties(blake3_dispatch.c PROPERTIES COMPILE_DEFINITIONS BLAKE3_USE_NEON=1)
+ set_source_files_properties(blake3_neon.c PROPERTIES COMPILE_FLAGS "${BLAKE3_CFLAGS_NEON}")
+endif()
-else()
+# cmake install support
+install(FILES blake3.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
+install(TARGETS blake3 EXPORT blake3-targets)
+install(EXPORT blake3-targets
+ NAMESPACE BLAKE3::
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/blake3"
+)
- add_library(blake3-shared SHARED ${blake3_SOURCES})
- set_target_properties(blake3-shared PROPERTIES VERSION ${PROJECT_VERSION})
- set_target_properties(blake3-shared PROPERTIES SOVERSION 0)
- set_target_properties(blake3-shared PROPERTIES PUBLIC_HEADER blake3.h)
- target_include_directories(blake3-shared PUBLIC .)
-
- install(TARGETS blake3-shared
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
- PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+include(CMakePackageConfigHelpers)
+configure_package_config_file(blake3-config.cmake.in
+ "${CMAKE_CURRENT_BINARY_DIR}/blake3-config.cmake"
-endif(BLAKE3_STATIC)
+ INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/blake3"
+)
+write_basic_package_version_file(
+ "${CMAKE_CURRENT_BINARY_DIR}/blake3-config-version.cmake"
+ VERSION ${libblake3_VERSION}
+ COMPATIBILITY SameMinorVersion # as long as libblake3_VERSION < 1.0.0
+)
+install(FILES
+ "${CMAKE_CURRENT_BINARY_DIR}/blake3-config.cmake"
+ "${CMAKE_CURRENT_BINARY_DIR}/blake3-config-version.cmake"
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/blake3"
+)
-unset(BLAKE3_STATIC) \ No newline at end of file
+configure_file(libblake3.pc.in libblake3.pc @ONLY)
+install(FILES "${CMAKE_BINARY_DIR}/libblake3.pc"
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
diff --git a/c/blake3-config.cmake.in b/c/blake3-config.cmake.in
new file mode 100644
index 0000000..071552b
--- /dev/null
+++ b/c/blake3-config.cmake.in
@@ -0,0 +1,5 @@
+@PACKAGE_INIT@
+
+include("${CMAKE_CURRENT_LIST_DIR}/blake3-targets.cmake")
+
+check_required_components(blake3) \ No newline at end of file