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 $) +set_target_properties(blake3 PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION 0 +) -elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL i686) - list(APPEND blake3_SOURCES +# 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(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 + ) + + 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() + +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 -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) + 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}") -elseif((ANDROID_ABI STREQUAL armeabi-v7a) OR - (CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) OR - (CMAKE_SYSTEM_PROCESSOR STREQUAL arm64) # For M1 macs - ) - 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) +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() +# 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" +) + +include(CMakePackageConfigHelpers) +configure_package_config_file(blake3-config.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/blake3-config.cmake" + + 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" +) + configure_file(libblake3.pc.in libblake3.pc @ONLY) -install(FILES ${CMAKE_BINARY_DIR}/libblake3.pc - DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) - -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 .) - - install(TARGETS blake3-static - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) - -else() - - 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}) - -endif(BLAKE3_STATIC) - -unset(BLAKE3_STATIC) \ No newline at end of file +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