Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 39 additions & 50 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Build CI

on:
push:
branches: ["main"]
branches: ['main']
pull_request:
workflow_dispatch:

Expand All @@ -23,33 +23,32 @@ jobs:
os: ubuntu
os-version: 24.04

- name: MacOS
- name: MacOS
os: macos
os-version: 13

- name: MacOS (Arm64)
os: macos
os-version: 14


steps:
- uses: actions/checkout@v4
with:
fetch-depth: "0"
fetch-depth: '0'

- uses: actions/checkout@v4
name: Checkout OOPetris main repo
name: Checkout OOPetris main repo
with:
fetch-depth: "0"
fetch-depth: '0'
repository: OpenBrickProtocolFoundation/oopetris
ref: main
path: ./oopetris
submodules: false

- uses: actions/checkout@v4
name: Checkout C Wrapper
with:
fetch-depth: "0"
fetch-depth: '0'
repository: Totto16/oopetris_wrapper_c
ref: main
path: ./oopetris_c_wrapper
Expand All @@ -69,11 +68,21 @@ jobs:
version: 14
platform: x64

- name: Setup GCC Environment (Linux)
if: matrix.config.os == 'ubuntu'
run: |
echo "CC=gcc" >> "$GITHUB_ENV"
echo "CXX=g++" >> "$GITHUB_ENV"
echo "CC_LD=gold" >> "$GITHUB_ENV"
echo "CXX_LD=gold" >> "$GITHUB_ENV"
echo "LD=gold" >> "$GITHUB_ENV"

- name: Setup Clang (MacOS)
if: matrix.config.os == 'macos'
run: |
brew update
brew install llvm@18
# TODO annotate with lld@19, after that is accepted, we don't want to use lld@20 without manually updating it !
brew install llvm@19 lld
echo "$(brew --prefix)/opt/llvm/bin" >> $GITHUB_PATH
echo "LDFLAGS=-L$(brew --prefix)/opt/llvm/lib -L$(brew --prefix)/opt/llvm/lib/c++ -Wl,-rpath,$(brew --prefix)/opt/llvm/lib/c++" >> "$GITHUB_ENV"
echo "CPPFLAGS=-I$(brew --prefix)/opt/llvm/include" >> "$GITHUB_ENV"
Expand All @@ -83,13 +92,14 @@ jobs:
echo "CC_LD=lld" >> "$GITHUB_ENV"
echo "CXX_LD=lld" >> "$GITHUB_ENV"
echo "OBJC_LD=lld" >> "$GITHUB_ENV"
echo "LD=lld" >> "$GITHUB_ENV"

- name: Setup meson (MacOS)
if: matrix.config.os == 'macos'
if: matrix.config.os == 'macos'
run: |
brew update
brew install meson

# NOTE: meson has no dependencies, so --break-system-packages doesn't really break anything!
- name: Setup meson
if: matrix.config.os != 'macos'
Expand All @@ -100,60 +110,39 @@ jobs:
if: matrix.config.os == 'ubuntu'
run: |
sudo apt-get update
sudo apt-get install ninja-build -y
sudo apt-get install ninja-build -y --no-install-recommends
sudo pip install meson --break-system-packages

- name: Fix pkg-config (Windows)
if: matrix.config.os == 'windows'
run: |
Remove-Item -Path C:\Strawberry\ -Recurse
Remove-Item -Path C:\Strawberry\ -Recurse
choco install pkgconfiglite
echo "PKG_CONFIG_PATH=C:/lib/pkgconfig" | Out-File -FilePath $env:GITHUB_ENV -Append

- name: Configure
run: |
cd oopetris
meson setup build -Dbuildtype=release -Ddefault_library=static -Dclang_libcpp=${{ matrix.config.os == 'macos' && 'enabled' || 'disabled' }} -Donly_build_libs=true ${{ matrix.config.os == 'windows' && '-Db_vscrt=static_from_buildtype' || '' }}

- name: Build and install Libs
if: matrix.config.os != 'ubuntu'
run: |
cd oopetris
meson install -C build

- name: Build and install Libs (Linux)
if: matrix.config.os == 'ubuntu'
run: |
cd oopetris
sudo meson install -C build
echo "C:/bin" | Out-File -FilePath $env:GITHUB_PATH -Append

- name: Build C Wrapper
run: |
cd oopetris_c_wrapper
meson setup -Dtests=false -Dexample=false build -Dbuildtype=release -Ddefault_library=static
meson compile -C build


- name: Install C Wrapper
if: matrix.config.os != 'ubuntu'
run: |
cd oopetris_c_wrapper
meson install -C build
- name: Build and Install OOPetris
run: |
cd oopetris
meson setup build -Dbuildtype=release -Ddefault_library=shared -Dclang_libcpp=${{ matrix.config.os == 'macos' && 'enabled' || 'disabled' }} -Donly_build_libs=true ${{ matrix.config.os == 'windows' && '-Db_vscrt=from_buildtype' || '' }}
${{ matrix.config.os == 'ubuntu' && 'sudo' || '' }} meson install -C build

- name: Build and install Libs (Linux)
if: matrix.config.os == 'ubuntu'
run: |
cd oopetris_c_wrapper
sudo meson install -C build
- name: Build and Install C Wrapper
run: |
cd oopetris_c_wrapper
meson setup -Dtests=false -Dexample=false build -Dbuildtype=release -Ddefault_library=shared
${{ matrix.config.os == 'ubuntu' && 'sudo' || '' }} meson install -C build
${{ matrix.config.os == 'ubuntu' && 'sudo ldconfig' || '' }}

- uses: haskell-actions/setup@v2
with:
ghc-version: '9.6.5'
ghc-version: '9.6.6'
enable-stack: true
stack-version: 'latest'

- name: Build Wrapper
run: |
- name: Build and Test Wrapper
run: |
stack build
stack test
stack run -- test/files/correct.rec

8 changes: 4 additions & 4 deletions oopetris-haskell-wrapper.cabal
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
cabal-version: 1.12

-- This file has been generated from package.yaml by hpack version 0.36.0.
-- This file has been generated from package.yaml by hpack version 0.37.0.
--
-- see: https://github.com/sol/hpack

Expand Down Expand Up @@ -37,7 +37,7 @@ library
build-depends:
base >=4.7 && <5
, c-storable-deriving >=0.1.3
, hashmap >=1.3.3
, unordered-containers >=0.2.20
default-language: Haskell2010

executable oopetris-haskell-wrapper-exe
Expand All @@ -50,8 +50,8 @@ executable oopetris-haskell-wrapper-exe
build-depends:
base >=4.7 && <5
, c-storable-deriving >=0.1.3
, hashmap >=1.3.3
, oopetris-haskell-wrapper
, unordered-containers >=0.2.20
default-language: Haskell2010

test-suite oopetris-haskell-wrapper-test
Expand All @@ -65,6 +65,6 @@ test-suite oopetris-haskell-wrapper-test
build-depends:
base >=4.7 && <5
, c-storable-deriving >=0.1.3
, hashmap >=1.3.3
, oopetris-haskell-wrapper
, unordered-containers >=0.2.20
default-language: Haskell2010
2 changes: 1 addition & 1 deletion package.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ description: Please see the README.md
dependencies:
- base >= 4.7 && < 5
- c-storable-deriving >= 0.1.3
- hashmap >= 1.3.3
- unordered-containers >= 0.2.20

ghc-options:
- -Wall
Expand Down
54 changes: 27 additions & 27 deletions src/FFI.hs
Original file line number Diff line number Diff line change
Expand Up @@ -40,56 +40,56 @@ import StdInt (CI32, CI64, CI8, CU32, CU64, CU8)
import Structs (GridPropertiesC, RecordingInformationC)
import Types (AdditionalInformationC, AdditionalInformationFieldC, EnumTypeC, RecordingReturnValueC)

foreign import capi "oopetris/oopetris_wrapper.h oopetris_is_recording_file" c_is_recording_file :: ConstPtr CChar -> IO CBool
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_is_recording_file" c_is_recording_file :: ConstPtr CChar -> IO CBool

foreign import capi "oopetris/oopetris_wrapper.h oopetris_additional_information_get_keys" c_additional_information_get_keys :: Ptr AdditionalInformationC -> IO (ConstPtr (Ptr CChar))
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_additional_information_get_keys" c_additional_information_get_keys :: Ptr AdditionalInformationC -> IO (ConstPtr (Ptr CChar))

foreign import capi "oopetris/oopetris_wrapper.h &oopetris_additional_information_keys_free" c_additional_information_keys_free :: FunPtr (Ptr (Ptr CChar) -> IO ())
foreign import capi "oopetris/c_wrapper/wrapper.h &oopetris_additional_information_keys_free" c_additional_information_keys_free :: FunPtr (Ptr (Ptr CChar) -> IO ())

foreign import capi "oopetris/oopetris_wrapper.h oopetris_additional_information_get_field" c_additional_information_get_field :: Ptr AdditionalInformationC -> ConstPtr CChar -> ConstPtr AdditionalInformationFieldC
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_additional_information_get_field" c_additional_information_get_field :: Ptr AdditionalInformationC -> ConstPtr CChar -> ConstPtr AdditionalInformationFieldC

foreign import capi "oopetris/oopetris_wrapper.h oopetris_additional_information_field_get_type" c_additional_information_field_get_type :: ConstPtr AdditionalInformationFieldC -> EnumTypeC
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_additional_information_field_get_type" c_additional_information_field_get_type :: ConstPtr AdditionalInformationFieldC -> EnumTypeC

foreign import capi "oopetris/oopetris_wrapper.h oopetris_additional_information_field_get_string" c_additional_information_field_get_string :: ConstPtr AdditionalInformationFieldC -> ConstPtr CChar
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_additional_information_field_get_string" c_additional_information_field_get_string :: ConstPtr AdditionalInformationFieldC -> ConstPtr CChar

foreign import capi "oopetris/oopetris_wrapper.h oopetris_additional_information_field_get_float" c_additional_information_field_get_float :: ConstPtr AdditionalInformationFieldC -> CFloat
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_additional_information_field_get_float" c_additional_information_field_get_float :: ConstPtr AdditionalInformationFieldC -> CFloat

foreign import capi "oopetris/oopetris_wrapper.h oopetris_additional_information_field_get_double" c_additional_information_field_get_double :: ConstPtr AdditionalInformationFieldC -> CDouble
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_additional_information_field_get_double" c_additional_information_field_get_double :: ConstPtr AdditionalInformationFieldC -> CDouble

foreign import capi "oopetris/oopetris_wrapper.h oopetris_additional_information_field_get_bool" c_additional_information_field_get_bool :: ConstPtr AdditionalInformationFieldC -> CBool
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_additional_information_field_get_bool" c_additional_information_field_get_bool :: ConstPtr AdditionalInformationFieldC -> CBool

foreign import capi "oopetris/oopetris_wrapper.h oopetris_additional_information_field_get_u8" c_additional_information_field_get_u8 :: ConstPtr AdditionalInformationFieldC -> CU8
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_additional_information_field_get_u8" c_additional_information_field_get_u8 :: ConstPtr AdditionalInformationFieldC -> CU8

foreign import capi "oopetris/oopetris_wrapper.h oopetris_additional_information_field_get_i8" c_additional_information_field_get_i8 :: ConstPtr AdditionalInformationFieldC -> CI8
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_additional_information_field_get_i8" c_additional_information_field_get_i8 :: ConstPtr AdditionalInformationFieldC -> CI8

foreign import capi "oopetris/oopetris_wrapper.h oopetris_additional_information_field_get_u32" c_additional_information_field_get_u32 :: ConstPtr AdditionalInformationFieldC -> CU32
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_additional_information_field_get_u32" c_additional_information_field_get_u32 :: ConstPtr AdditionalInformationFieldC -> CU32

foreign import capi "oopetris/oopetris_wrapper.h oopetris_additional_information_field_get_i32" c_additional_information_field_get_i32 :: ConstPtr AdditionalInformationFieldC -> CI32
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_additional_information_field_get_i32" c_additional_information_field_get_i32 :: ConstPtr AdditionalInformationFieldC -> CI32

foreign import capi "oopetris/oopetris_wrapper.h oopetris_additional_information_field_get_u64" c_additional_information_field_get_u64 :: ConstPtr AdditionalInformationFieldC -> CU64
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_additional_information_field_get_u64" c_additional_information_field_get_u64 :: ConstPtr AdditionalInformationFieldC -> CU64

foreign import capi "oopetris/oopetris_wrapper.h oopetris_additional_information_field_get_i64" c_additional_information_field_get_i64 :: ConstPtr AdditionalInformationFieldC -> CI64
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_additional_information_field_get_i64" c_additional_information_field_get_i64 :: ConstPtr AdditionalInformationFieldC -> CI64

foreign import capi "oopetris/oopetris_wrapper.h oopetris_additional_information_field_get_vector" c_additional_information_field_get_vector :: ConstPtr AdditionalInformationFieldC -> ConstPtr (ConstPtr AdditionalInformationFieldC)
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_additional_information_field_get_vector" c_additional_information_field_get_vector :: ConstPtr AdditionalInformationFieldC -> ConstPtr (ConstPtr AdditionalInformationFieldC)

foreign import capi "oopetris/oopetris_wrapper.h oopetris_get_recording_information" c_get_recording_information :: ConstPtr CChar -> IO (Ptr RecordingReturnValueC)
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_get_recording_information" c_get_recording_information :: ConstPtr CChar -> IO (Ptr RecordingReturnValueC)

foreign import capi "oopetris/oopetris_wrapper.h oopetris_is_error" c_is_error :: Ptr RecordingReturnValueC -> CBool
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_is_error" c_is_error :: Ptr RecordingReturnValueC -> CBool

foreign import capi "oopetris/oopetris_wrapper.h oopetris_get_error" c_get_error :: Ptr RecordingReturnValueC -> ConstPtr CChar
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_get_error" c_get_error :: Ptr RecordingReturnValueC -> ConstPtr CChar

foreign import capi "oopetris/oopetris_wrapper.h oopetris_get_information" c_get_information :: Ptr RecordingReturnValueC -> Ptr RecordingInformationC
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_get_information" c_get_information :: Ptr RecordingReturnValueC -> Ptr RecordingInformationC

foreign import capi "oopetris/oopetris_wrapper.h &oopetris_free_recording_information" c_free_recording_information :: FunPtr (Ptr RecordingInformationC -> IO ())
foreign import capi "oopetris/c_wrapper/wrapper.h &oopetris_free_recording_information" c_free_recording_information :: FunPtr (Ptr RecordingInformationC -> IO ())

foreign import capi "oopetris/oopetris_wrapper.h &oopetris_free_recording_value_only" c_free_recording_value_only :: FunPtr (Ptr RecordingReturnValueC -> IO ())
foreign import capi "oopetris/c_wrapper/wrapper.h &oopetris_free_recording_value_only" c_free_recording_value_only :: FunPtr (Ptr RecordingReturnValueC -> IO ())

foreign import capi "oopetris/oopetris_wrapper.h &oopetris_free_recording_value_whole" c_free_recording_value_whole :: FunPtr (Ptr RecordingReturnValueC -> IO ())
foreign import capi "oopetris/c_wrapper/wrapper.h &oopetris_free_recording_value_whole" c_free_recording_value_whole :: FunPtr (Ptr RecordingReturnValueC -> IO ())

foreign import capi "oopetris/oopetris_wrapper.h oopetris_get_lib_version" c_get_lib_version :: ConstPtr CChar
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_get_lib_version" c_get_lib_version :: ConstPtr CChar

foreign import capi "oopetris/oopetris_wrapper.h oopetris_get_grid_properties" c_get_grid_properties :: IO (Ptr GridPropertiesC)
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_get_grid_properties" c_get_grid_properties :: IO (Ptr GridPropertiesC)

foreign import capi "oopetris/oopetris_wrapper.h &oopetris_free_grid_properties" c_free_grid_properties :: FunPtr (Ptr GridPropertiesC -> IO ())
foreign import capi "oopetris/c_wrapper/wrapper.h &oopetris_free_grid_properties" c_free_grid_properties :: FunPtr (Ptr GridPropertiesC -> IO ())

foreign import capi "oopetris/oopetris_wrapper.h oopetris_array_len" c_array_len :: Ptr () -> CSize
foreign import capi "oopetris/c_wrapper/wrapper.h oopetris_array_len" c_array_len :: Ptr () -> CSize
2 changes: 1 addition & 1 deletion src/Lib.hs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module Lib (isRecordingFile, getLibVersion, getGridProperties, getRecordingInformation, RecordingReturnValue (..)) where

import qualified AdditionalInformationType as AdType
import Data.HashMap (fromList)
import Data.HashMap.Strict (fromList)
import FFI (c_additional_information_field_get_bool, c_additional_information_field_get_double, c_additional_information_field_get_float, c_additional_information_field_get_i32, c_additional_information_field_get_i64, c_additional_information_field_get_i8, c_additional_information_field_get_string, c_additional_information_field_get_type, c_additional_information_field_get_u32, c_additional_information_field_get_u64, c_additional_information_field_get_u8, c_additional_information_field_get_vector, c_additional_information_get_field, c_additional_information_get_keys, c_additional_information_keys_free, c_array_len, c_free_grid_properties, c_free_recording_value_whole, c_get_error, c_get_grid_properties, c_get_information, c_get_lib_version, c_get_recording_information, c_is_error, c_is_recording_file)
import Foreign (Storable (sizeOf), withForeignPtr)
import Foreign.C (CChar (), CDouble (CDouble), CFloat (CFloat), withCString)
Expand Down
Loading
Loading