Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GCC-14 #15

Merged
merged 11 commits into from
Aug 28, 2024
156 changes: 21 additions & 135 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -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
6 changes: 3 additions & 3 deletions leopard/leopard.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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):
Expand Down
9 changes: 6 additions & 3 deletions leopard/wrapper.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down