From 552ee2c66ff9a4037837f5af47f45b8c14fae165 Mon Sep 17 00:00:00 2001 From: zombocoder Date: Thu, 16 Oct 2025 18:43:22 +0300 Subject: [PATCH 1/4] Add Windows support to CI workflow --- .github/workflows/ci.yml | 47 ++++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5ac7f77..39742f3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, macos-latest] + os: [ubuntu-latest, macos-latest, windows-latest] build_type: [Debug, Release] include: - os: ubuntu-latest @@ -20,6 +20,9 @@ jobs: - os: macos-latest cc: clang cxx: clang++ + - os: windows-latest + cc: cl + cxx: cl runs-on: ${{ matrix.os }} @@ -39,6 +42,13 @@ jobs: brew install clang-format zstd libsodium || true # cmake is already available on macOS runners + - name: Install dependencies (Windows) + if: matrix.os == 'windows-latest' + run: | + # Install vcpkg dependencies + vcpkg install zstd:x64-windows libsodium:x64-windows + # Visual Studio Build Tools are already available + - name: Set up environment run: | echo "CC=${{ matrix.cc }}" >> $GITHUB_ENV @@ -46,23 +56,41 @@ jobs: - name: Configure CMake run: | - cmake -B build \ - -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \ - -DCMAKE_C_COMPILER=${{ matrix.cc }} \ - -DCMAKE_CXX_COMPILER=${{ matrix.cxx }} \ - -DBFC_WITH_ZSTD=ON \ - -DBFC_WITH_SODIUM=ON + if [ "${{ matrix.os }}" = "windows-latest" ]; then + cmake -B build \ + -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \ + -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake \ + -DBFC_WITH_ZSTD=ON \ + -DBFC_WITH_SODIUM=ON + else + cmake -B build \ + -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \ + -DCMAKE_C_COMPILER=${{ matrix.cc }} \ + -DCMAKE_CXX_COMPILER=${{ matrix.cxx }} \ + -DBFC_WITH_ZSTD=ON \ + -DBFC_WITH_SODIUM=ON + fi - name: Build - run: cmake --build build --config ${{ matrix.build_type }} -j$(nproc 2>/dev/null || sysctl -n hw.ncpu) + run: | + if [ "${{ matrix.os }}" = "windows-latest" ]; then + cmake --build build --config ${{ matrix.build_type }} --parallel + else + cmake --build build --config ${{ matrix.build_type }} -j$(nproc 2>/dev/null || sysctl -n hw.ncpu) + fi - name: Run tests if: matrix.build_type == 'Debug' run: | cd build - ctest --output-on-failure --parallel $(nproc 2>/dev/null || sysctl -n hw.ncpu) + if [ "${{ matrix.os }}" = "windows-latest" ]; then + ctest --output-on-failure --parallel --config ${{ matrix.build_type }} + else + ctest --output-on-failure --parallel $(nproc 2>/dev/null || sysctl -n hw.ncpu) + fi - name: Test CLI functionality + if: matrix.os != 'windows-latest' run: | # Create test data mkdir -p test_data @@ -219,6 +247,7 @@ jobs: rm -rf test_encrypted.bfc test_keyfile.bfc test_enc_comp.bfc test.key - name: Run benchmarks + if: matrix.os != 'windows-latest' run: | cd build/benchmarks ./benchmark_crc32c From fd7ba1d03bbea6c1940c103e89c65ac2bb85ed7c Mon Sep 17 00:00:00 2001 From: zombocoder Date: Thu, 16 Oct 2025 18:48:38 +0300 Subject: [PATCH 2/4] Update CMake configuration and build steps for Windows --- .github/workflows/ci.yml | 58 +++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 39742f3..4779daa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,40 +54,42 @@ jobs: echo "CC=${{ matrix.cc }}" >> $GITHUB_ENV echo "CXX=${{ matrix.cxx }}" >> $GITHUB_ENV - - name: Configure CMake + - name: Configure CMake (Windows) + if: matrix.os == 'windows-latest' + shell: cmd + run: cmake -B build -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DBFC_WITH_ZSTD=ON -DBFC_WITH_SODIUM=ON + + - name: Configure CMake (Unix) + if: matrix.os != 'windows-latest' run: | - if [ "${{ matrix.os }}" = "windows-latest" ]; then - cmake -B build \ - -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \ - -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake \ - -DBFC_WITH_ZSTD=ON \ - -DBFC_WITH_SODIUM=ON - else - cmake -B build \ - -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \ - -DCMAKE_C_COMPILER=${{ matrix.cc }} \ - -DCMAKE_CXX_COMPILER=${{ matrix.cxx }} \ - -DBFC_WITH_ZSTD=ON \ - -DBFC_WITH_SODIUM=ON - fi + cmake -B build \ + -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} \ + -DCMAKE_C_COMPILER=${{ matrix.cc }} \ + -DCMAKE_CXX_COMPILER=${{ matrix.cxx }} \ + -DBFC_WITH_ZSTD=ON \ + -DBFC_WITH_SODIUM=ON - - name: Build + - name: Build (Windows) + if: matrix.os == 'windows-latest' + shell: cmd + run: cmake --build build --config ${{ matrix.build_type }} --parallel + + - name: Build (Unix) + if: matrix.os != 'windows-latest' + run: cmake --build build --config ${{ matrix.build_type }} -j$(nproc 2>/dev/null || sysctl -n hw.ncpu) + + - name: Run tests (Windows) + if: matrix.build_type == 'Debug' && matrix.os == 'windows-latest' + shell: cmd run: | - if [ "${{ matrix.os }}" = "windows-latest" ]; then - cmake --build build --config ${{ matrix.build_type }} --parallel - else - cmake --build build --config ${{ matrix.build_type }} -j$(nproc 2>/dev/null || sysctl -n hw.ncpu) - fi + cd build + ctest --output-on-failure --parallel --config ${{ matrix.build_type }} - - name: Run tests - if: matrix.build_type == 'Debug' + - name: Run tests (Unix) + if: matrix.build_type == 'Debug' && matrix.os != 'windows-latest' run: | cd build - if [ "${{ matrix.os }}" = "windows-latest" ]; then - ctest --output-on-failure --parallel --config ${{ matrix.build_type }} - else - ctest --output-on-failure --parallel $(nproc 2>/dev/null || sysctl -n hw.ncpu) - fi + ctest --output-on-failure --parallel $(nproc 2>/dev/null || sysctl -n hw.ncpu) - name: Test CLI functionality if: matrix.os != 'windows-latest' From 0214c195d7f101d4f90408706ae5553511a13833 Mon Sep 17 00:00:00 2001 From: zombocoder Date: Thu, 16 Oct 2025 18:56:54 +0300 Subject: [PATCH 3/4] Add missing POSIX constants for Windows in bfc_os.h --- src/lib/bfc_crc32c.c | 4 ++++ src/lib/bfc_os.h | 5 +++++ src/lib/bfc_reader.c | 5 +++++ 3 files changed, 14 insertions(+) diff --git a/src/lib/bfc_crc32c.c b/src/lib/bfc_crc32c.c index c3e8ea9..22459ca 100644 --- a/src/lib/bfc_crc32c.c +++ b/src/lib/bfc_crc32c.c @@ -19,7 +19,11 @@ #include #if defined(__x86_64__) || defined(_M_X64) +#ifdef _WIN32 +#include +#else #include +#endif #include #define HAS_X86_64 1 #elif defined(__aarch64__) || defined(_M_ARM64) diff --git a/src/lib/bfc_os.h b/src/lib/bfc_os.h index 7ccac47..14f69fa 100644 --- a/src/lib/bfc_os.h +++ b/src/lib/bfc_os.h @@ -21,7 +21,12 @@ #include #ifdef _WIN32 +#include #include +// Define missing POSIX constants for Windows +#ifndef S_IFLNK +#define S_IFLNK 0120000 // Symbolic link file type +#endif #else #include #include diff --git a/src/lib/bfc_reader.c b/src/lib/bfc_reader.c index 7e842ab..4571f96 100644 --- a/src/lib/bfc_reader.c +++ b/src/lib/bfc_reader.c @@ -25,7 +25,12 @@ #include #include #include +#ifdef _WIN32 +#include +#define access _access +#else #include +#endif #define READ_BUFFER_SIZE 65536 From 24751b8f1a74d664f8f6195c8ee53cd82bec79a5 Mon Sep 17 00:00:00 2001 From: zombocoder Date: Thu, 16 Oct 2025 19:04:50 +0300 Subject: [PATCH 4/4] Add support for detecting SSE4.2 on Windows OS --- src/lib/bfc_crc32c.c | 7 +++++++ src/lib/bfc_os.h | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/src/lib/bfc_crc32c.c b/src/lib/bfc_crc32c.c index 22459ca..5fbbe4e 100644 --- a/src/lib/bfc_crc32c.c +++ b/src/lib/bfc_crc32c.c @@ -56,10 +56,17 @@ static void init_crc32c_table(void) { #ifdef HAS_X86_64 static int detect_sse42_support(void) { unsigned int eax, ebx, ecx, edx; +#ifdef _WIN32 + int cpuinfo[4]; + __cpuid(cpuinfo, 1); + ecx = cpuinfo[2]; + return (ecx & (1 << 20)) != 0; // SSE4.2 bit +#else if (__get_cpuid(1, &eax, &ebx, &ecx, &edx)) { return (ecx & bit_SSE4_2) != 0; } return 0; +#endif } static uint32_t crc32c_hw_x86(uint32_t crc, const void* data, size_t len) { diff --git a/src/lib/bfc_os.h b/src/lib/bfc_os.h index 14f69fa..b24ff04 100644 --- a/src/lib/bfc_os.h +++ b/src/lib/bfc_os.h @@ -21,12 +21,17 @@ #include #ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN #include #include // Define missing POSIX constants for Windows #ifndef S_IFLNK #define S_IFLNK 0120000 // Symbolic link file type #endif +// Define missing POSIX types for Windows +#ifndef ssize_t +typedef SSIZE_T ssize_t; +#endif #else #include #include