diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 146a73f..6867b7d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,158 +1,44 @@ name: Tests - -on: [pull_request, push] - +on: [push, pull_request] jobs: - tests: - env: - NPROC: 2 + test: strategy: - fail-fast: false matrix: - cache_nonce: [ 1 ] - nim_version: [ 1.6.20 ] # add stable for testing 2.0+ platform: - { icon: 🐧, label: Linux, os: ubuntu, - runner: ubuntu-latest, - shell: bash --noprofile --norc -eo pipefail + runner: ubuntu-latest } - { icon: 🍎, label: macOS, os: macos, - runner: macos-13, # x86 - shell: bash --noprofile --norc -eo pipefail + runner: macos-13 # x86 } - { icon: 🏁, label: Windows, os: windows, - runner: windows-latest, - shell: msys2 + runner: windows-latest } - name: ${{ matrix.platform.icon }} ${{ matrix.platform.label }} - Nim v${{ matrix.nim_version }} - runs-on: ${{ matrix.platform.runner }} + nim: [1.6.18] + name: ${{ matrix.platform.icon }} ${{ matrix.platform.label }} - Nim v${{ matrix.nim }} + runs-on: ${{ matrix.platform.os }}-latest defaults: run: - shell: ${{ matrix.platform.shell }} {0} - + shell: bash steps: - # - name: Install tools and libraries via APT (Linux) - # if: matrix.platform.os == 'ubuntu' - # run: | - # sudo apt update - # sudo apt install -y \ - # ... - - - name: Install tools and libraries via Homebrew (macOS) - if: matrix.platform.os == 'macos' - run: | - brew update - brew install \ - findutils \ - libomp \ - llvm@14 - - - name: Install tools and libraries via MSYS2 (Windows) - if: matrix.platform.os == 'windows' - uses: msys2/setup-msys2@v2 - with: - msystem: UCRT64 - install: > - base-devel - git - mingw-w64-ucrt-x86_64-cmake - mingw-w64-ucrt-x86_64-toolchain - - - name: Checkout sources from GitHub - uses: actions/checkout@v2 - with: - submodules: true - - - name: Calculate cache member paths - id: calc-paths - run: | - if [[ ${{ matrix.platform.os }} = windows ]]; then - echo "::set-output name=bash_env::$(cygpath -m "${HOME}")/.bash_env" - echo "::set-output name=choosenim::$(cygpath -m "${USERPROFILE}")/.choosenim" - echo "::set-output name=nimble::$(cygpath -m "${HOME}")/.nimble" - else - echo "::set-output name=bash_env::${HOME}/.bash_env" - echo "::set-output name=choosenim::${HOME}/.choosenim" - echo "::set-output name=nimble::${HOME}/.nimble" - fi - - - name: Restore choosenim and Nim tooling from cache - id: choosenim-nim-tooling-cache - uses: actions/cache@v2 - with: - path: | - ${{ steps.calc-paths.outputs.bash_env }} - ${{ steps.calc-paths.outputs.choosenim }} - ${{ steps.calc-paths.outputs.nimble }}/bin - key: ${{ matrix.platform.os }}-nim_version:${{ matrix.nim_version }}-cache_nonce:${{ matrix.cache_nonce }} - - - name: Install choosenim and Nim tooling - if: steps.choosenim-nim-tooling-cache.outputs.cache-hit != 'true' - run: | - mkdir -p "${HOME}/Downloads" - cd "${HOME}/Downloads" - curl https://nim-lang.org/choosenim/init.sh -sSf -O - chmod +x init.sh - if [[ ${{ matrix.platform.os }} = windows ]]; then - mkdir -p "$(cygpath "${USERPROFILE}")/.nimble/bin" - fi - CHOOSENIM_CHOOSE_VERSION=${{ matrix.nim_version }} ./init.sh -y - if [[ ${{ matrix.platform.os }} = windows ]]; then - mv "$(cygpath "${USERPROFILE}")/.nimble" "${HOME}/" - # intention is to rely only on libs provided by the OS and MSYS2 env - rm -rf "${HOME}/.nimble/bin/"*.dll - rm -rf "${HOME}/.nimble/bin/"*.pem - fi - echo 'export NIMBLE_DIR="${HOME}/.nimble"' >> "${HOME}/.bash_env" - echo 'export PATH="${NIMBLE_DIR}/bin:${PATH}"' >> "${HOME}/.bash_env" - - - name: Install project dependencies - run: | - source "${HOME}/.bash_env" - cd "${NIMBLE_DIR}/bin" - # delete broken symlinks, which can arise because e.g. the cache - # restored a symlink that points to an executable within - # ../pkgs/foo-1.2.3/ but the project's .nimble file has been updated - # to install foo-#head; in the case of a broken symlink, nimble's - # auto-overwrite fails - if [[ ${{ matrix.platform.os }} = macos ]]; then - gfind . -xtype l -delete - else - find . -xtype l -delete - fi - cd - - nimble --accept install - - - name: Build and run tests - run: | - source "${HOME}/.bash_env" - if [[ ${{ matrix.platform.os }} = windows ]]; then - touch tests/testleopard.exe - else - touch tests/testleopard - fi - if [[ ${{ matrix.platform.os }} = macos ]]; then - export PATH="$(brew --prefix llvm@14)/bin:${PATH}" - export LDFLAGS="-L$(brew --prefix libomp)/lib -L$(brew --prefix llvm@14)/lib -Wl,-rpath,$(brew --prefix llvm@14)/lib" - compiler_extra_options="-d:LeopardCmakeFlags='-DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=$(brew --prefix llvm@14)/bin/clang -DCMAKE_CXX_COMPILER=$(brew --prefix llvm@14)/bin/clang++' -d:LeopardExtraCompilerlags='-fopenmp' -d:LeopardExtraLinkerFlags='-fopenmp -L$(brew --prefix libomp)/lib'" - fi - eval nimble --verbose test -d:release --mm:refc ${compiler_extra_options} - eval nimble --verbose test -d:release --mm:orc ${compiler_extra_options} - if [[ ${{ matrix.platform.os }} = macos ]]; then - echo - echo otool -L tests/testleopard - otool -L tests/testleopard - else - echo - echo ldd tests/testleopard - ldd tests/testleopard - fi + - uses: actions/checkout@v4 + with: + submodules: true + - uses: iffy/install-nim@v4 + with: + version: ${{ matrix.nim }} + - name: Install + run: nimble install -y + - name: Build and run tests + run: | + eval nimble --verbose test -d:release --mm:refc + eval nimble --verbose test -d:release --mm:orc diff --git a/leopard/leopard.nim b/leopard/leopard.nim index dd749b9..615f7ad 100644 --- a/leopard/leopard.nim +++ b/leopard/leopard.nim @@ -77,7 +77,7 @@ func encode*( self.buffers.cuint, self.parity.cuint, self.workBufferCount.cuint, - cast[ptr pointer](addr self.dataBufferPtr[0]), + cast[LeoDataPtr](addr self.dataBufferPtr[0]), cast[ptr pointer](addr self.workBufferPtr[0])) if ord(res) != ord(LeopardSuccess): @@ -148,8 +148,8 @@ func decode*( self.buffers.cuint, self.parity.cuint, self.decodeBufferCount.cuint, - cast[ptr pointer](addr dataPtr[0]), - cast[ptr pointer](addr parityPtr[0]), + cast[LeoDataPtr](addr dataPtr[0]), + cast[LeoDataPtr](addr parityPtr[0]), cast[ptr pointer](addr self.decodeBufferPtr[0])) if ord(res) != ord(LeopardSuccess): diff --git a/leopard/wrapper.nim b/leopard/wrapper.nim index da29704..90d8b5a 100644 --- a/leopard/wrapper.nim +++ b/leopard/wrapper.nim @@ -67,6 +67,9 @@ import std/compilesettings import std/os import std/strutils +type + LeoDataPtr* {.importc: "const void* const*", bycopy.} = pointer + const LeopardCmakeFlags {.strdefine.} = when defined(macosx): @@ -225,7 +228,7 @@ proc leoEncode*( originalCount: cuint; recoveryCount: cuint; workCount: cuint; - originalData: ptr pointer; + originalData: LeoDataPtr; workData: ptr pointer): LeopardResult {.leo, importc: "leo_encode".} ## Number of bytes in each data buffer ## Number of original_data[] buffer pointers @@ -277,8 +280,8 @@ proc leoDecode*( originalCount: cuint; recoveryCount: cuint; workCount: cuint; - originalData: ptr pointer; - recoveryData: ptr pointer; + originalData: LeoDataPtr; + recoveryData: LeoDataPtr; workData: ptr pointer): LeopardResult {.leo, importc: "leo_decode".} ## Number of bytes in each data buffer ## Number of original_data[] buffer pointers