Extract sigil-ffi from sigil monorepo
First standalone release, extracted via git filter-repo with the two-path twist that preserves vendored dyncall at vendor/dyncall/ (monorepo-root level, not inside the package dir).
Scaffolding: - README.md (API table + dyncall license note) - .gitignore (build/, .sigil/, vendor/dyncall/build/) - manifest.scm (gcc-toolchain + make + pkg-config) - dev-redirects.sgl (codeberg:sigil/sigil -> ../sigil for sigil-stdlib)
package.sgl changes: - version: "0.13.1" added - url: -> https://codeberg.org/sigil/sigil-ffi - sigil-stdlib swapped to from-git monorepo-resident ^0.13.1 - c-sources / include-dirs paths rewritten ../../vendor/dyncall/... -> vendor/dyncall/... (dyncall now lives at vendor/dyncall/ relative to the extracted repo root) - ../sigil-lib/include + ../sigil-lib/src dropped from include-dirs - compile-c-sources flags wrapped in (with-sigil-c-flags ...) per procedures/sigil-package-extraction §6a (native package needs sigil-lib's include paths auto-injected)
Build clean (dyncall + dyncallback compiled, libsigil-ffi.a created, sigil/ffi.sgl compiled). Tests: 20/20 passed.
.gitignore | 3 +++
README.md | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
dev-redirects.sgl | 6 ++++++
manifest.scm | 7 +++++++
package.sgl | 69 +++++++++++++++++++++++++++++++++++----------------------------------
sigil.lock | 8 ++++++++
6 files changed, 156 insertions(+), 34 deletions(-).gitignoreadded
build/.sigil/vendor/dyncall/build/README.mdadded
# sigil-ffiDynamic Foreign Function Interface for [Sigil](https://codeberg.org/sigil/sigil).Call C library functions from Sigil at runtime without writing gluecode. Built on a vendored dyncall, which provides portable callingconventions including struct-by-value passing on every supported arch(x86_64, aarch64, arm32, riscv, mips, ppc, sparc, s390, …).## Modules| Module | Purpose ||--------------|----------------------------------------------------|| `(sigil ffi)`| Library load, symbol lookup, call, structs, callbacks |## API summary| Procedure | Purpose ||------------------------------------|----------------------------------------------|| `c-library` | Open a shared library by name || `c-library-close` | Close a previously opened library || `c-symbol` | Resolve a symbol in a library || `c-function` | Bind a function with arg-types and ret-type || `define-c-library` | Convenience macro for binding many functions || `c-sizeof` / `c-alignof` | Query size/alignment of an FFI type || `make-pointer` / `pointer-address` | Build/read raw pointer values || `pointer-ref` / `pointer-set!` | Dereference a pointer at a typed offset || `string->pointer` / `pointer->string` | String/pointer round-trip || `pointer->bytevector` / `bytevector->pointer` | Bytevector bridge || `c-alloc` / `c-free` / `with-c-alloc` | Manual memory || `c-errno` / `c-strerror` | errno + strerror access || `c-struct-layout` / `c-struct-ref` / `c-struct-set!` | Struct field access || `c-struct->dict` / `dict->c-struct` | Struct/dict marshalling || `c-callback` / `c-callback-release` | Bind a Scheme procedure as a C callback |FFI type constants: `ffi/void`, `ffi/bool`, `ffi/int8`..`ffi/uint64`,`ffi/float`, `ffi/double`, `ffi/pointer`, `ffi/string`, plusarch-relative `ffi/int`, `ffi/uint`, `ffi/long`, `ffi/ulong`,`ffi/size-t`.## System prerequisitesA working C toolchain. dyncall is vendored under `vendor/dyncall/` andcompiled in-tree; no system `libdyncall` required. Your platform mustbe one dyncall supports — see `vendor/dyncall/dyncall/README*` for thearch matrix.## Dependencies- sigil-stdlib## Build```shsigil deps installsigil buildsigil test --report```The first build compiles dyncall + dyncallback (`vendor/dyncall/`)plus `native/ffi.c`. Subsequent builds hit the cache.## Usage```scheme(import (sigil ffi))(define libm (c-library "libm"))(define cbrt (c-function libm "cbrt" (list ffi/double) ffi/double))(cbrt 27.0) ; => 3.0(define libc (c-library "libc"))(define getenv (c-function libc "getenv" (list ffi/string) ffi/string))(getenv "HOME") ; => "/home/you"````define-c-library` collapses the bind-many-functions pattern:```scheme(import (sigil ffi))(define-c-library libm "libm" (cbrt (ffi/double) ffi/double) (sqrt (ffi/double) ffi/double) (pow (ffi/double ffi/double) ffi/double))(cbrt 27.0) ; => 3.0(pow 2.0 10.0) ; => 1024.0```## LicenseBSD-3-Clause.Vendored dyncall (under `vendor/dyncall/`) is distributed under apermissive ISC-style license — see `vendor/dyncall/LICENSE`.sigil-ffi's own sources are BSD-3-Clause.dev-redirects.sgladded
;; Development redirects — point dependencies at local Sigil checkout(redirects repos: (list (for-repo url: "codeberg:sigil/sigil" use: (from-path dir: "../sigil"))))manifest.scmadded
;; sigil-ffi Development Environment;; Use with: guix shell -m manifest.scm(specifications->manifest '("gcc-toolchain" "make" "pkg-config"))package.sglmodified
(package name: "sigil-ffi" version: "0.13.1" description: "Dynamic foreign function interface for Sigil" url: "https://codeberg.org/sigil/sigil" url: "https://codeberg.org/sigil/sigil-ffi" license: "BSD-3-Clause" authors: (list "David Wilson <[email protected]>") dependencies: (list (from-workspace name: "sigil-stdlib")) (from-git url: "codeberg:sigil/sigil" package: "sigil-stdlib" version: "^0.13.1")) ;; Native library definition libraries: (list (library name: 'sigil-ffi c-sources: '("native/ffi.c" "../../vendor/dyncall/dyncall/dyncall_api.c" "../../vendor/dyncall/dyncall/dyncall_callvm.c" "../../vendor/dyncall/dyncall/dyncall_callvm_base.c" "../../vendor/dyncall/dyncall/dyncall_vector.c" "../../vendor/dyncall/dyncall/dyncall_callf.c" "../../vendor/dyncall/dyncall/dyncall_aggregate.c" "../../vendor/dyncall/dyncall/dyncall_call.S" "../../vendor/dyncall/dyncallback/dyncall_callback.c" "../../vendor/dyncall/dyncallback/dyncall_thunk.c" "../../vendor/dyncall/dyncallback/dyncall_args.c" "../../vendor/dyncall/dyncallback/dyncall_alloc_wx.c" "../../vendor/dyncall/dyncallback/dyncall_callback_arch.S") "vendor/dyncall/dyncall/dyncall_api.c" "vendor/dyncall/dyncall/dyncall_callvm.c" "vendor/dyncall/dyncall/dyncall_callvm_base.c" "vendor/dyncall/dyncall/dyncall_vector.c" "vendor/dyncall/dyncall/dyncall_callf.c" "vendor/dyncall/dyncall/dyncall_aggregate.c" "vendor/dyncall/dyncall/dyncall_call.S" "vendor/dyncall/dyncallback/dyncall_callback.c" "vendor/dyncall/dyncallback/dyncall_thunk.c" "vendor/dyncall/dyncallback/dyncall_args.c" "vendor/dyncall/dyncallback/dyncall_alloc_wx.c" "vendor/dyncall/dyncallback/dyncall_callback_arch.S") native-init: "sigil__init_sigil_ffi_module")) tasks: (list ;; Compile FFI native code + vendored dyncall (compile-c-sources sources: '("native/ffi.c" "../../vendor/dyncall/dyncall/dyncall_api.c" "../../vendor/dyncall/dyncall/dyncall_callvm.c" "../../vendor/dyncall/dyncall/dyncall_callvm_base.c" "../../vendor/dyncall/dyncall/dyncall_vector.c" "../../vendor/dyncall/dyncall/dyncall_callf.c" "../../vendor/dyncall/dyncall/dyncall_aggregate.c" "../../vendor/dyncall/dyncall/dyncall_call.S" "../../vendor/dyncall/dyncallback/dyncall_callback.c" "../../vendor/dyncall/dyncallback/dyncall_thunk.c" "../../vendor/dyncall/dyncallback/dyncall_args.c" "../../vendor/dyncall/dyncallback/dyncall_alloc_wx.c" "../../vendor/dyncall/dyncallback/dyncall_callback_arch.S") include-dirs: '("../sigil-lib/include" "../sigil-lib/src" "../../vendor/dyncall/dyncall" "../../vendor/dyncall/dyncallback") flags: '("-std=c99" "-Wall" "-Wextra" "-Wno-unused-parameter" "-D_GNU_SOURCE")) "vendor/dyncall/dyncall/dyncall_api.c" "vendor/dyncall/dyncall/dyncall_callvm.c" "vendor/dyncall/dyncall/dyncall_callvm_base.c" "vendor/dyncall/dyncall/dyncall_vector.c" "vendor/dyncall/dyncall/dyncall_callf.c" "vendor/dyncall/dyncall/dyncall_aggregate.c" "vendor/dyncall/dyncall/dyncall_call.S" "vendor/dyncall/dyncallback/dyncall_callback.c" "vendor/dyncall/dyncallback/dyncall_thunk.c" "vendor/dyncall/dyncallback/dyncall_args.c" "vendor/dyncall/dyncallback/dyncall_alloc_wx.c" "vendor/dyncall/dyncallback/dyncall_callback_arch.S") include-dirs: '("vendor/dyncall/dyncall" "vendor/dyncall/dyncallback") flags: (with-sigil-c-flags '("-std=c99" "-Wall" "-Wextra" "-Wno-unused-parameter" "-D_GNU_SOURCE"))) ;; Create static library (create-static-librarysigil.lockadded
;; Auto-generated by sigil deps install. Do not edit.(lock (package name: "sigil-stdlib" url: "codeberg:sigil/sigil" ref: "^0.13.1" sha: "1aea1cecd3487bf07d071da2c1e7eb3cf4bbdb21" package-selector: "sigil-stdlib"))