lynnswap/zdlibffi
ZDLibffi packages libffi v3.8.0 for Apple platforms and supports modular imports.
Introduction
ZDLibffi packages libffi v3.8.0 for Apple platforms and supports modular imports.
Installation
CocoaPods
Add the pod in your Podfile:
pod 'ZDLibffi'Swift Package Manager
Add the dependency in your Package.swift:
dependencies: [
.package(url: "https://github.com/faimin/ZDLibffi.git", from: "0.380.0")
]Or add it via Xcode: File → Add Package Dependencies, then enter the repository URL.
CI
This project uses GitHub Actions for continuous integration. The workflow runs automatically on pushes to main/master and on all pull requests.
What CI Checks
| Job | Description | |-----|-------------| | Pod Lib Lint | Validates the podspec on each Apple platform (ios, macos, watchos, tvos, visionos), both with and without modular headers | | SPM Build | Validates Package.swift and builds the package with SwiftPM |
Running CI Locally
You can replicate the CI checks on your machine:
# CocoaPods lint (replace PLATFORM with ios/macos/watchos/tvos/visionos)
pod lib lint ZDLibffi.podspec --allow-warnings --platforms=ios --skip-tests
pod lib lint ZDLibffi.podspec --allow-warnings --platforms=ios --use-modular-headers --skip-tests
# SwiftPM
swift package describe
swift build
# Check arm64/arm64e code generation and run scalar, aggregate, and closure calls
python3 scripts/test_pointer_authentication.pyWith a toolchain that supports arm64e.x1, add --architectures arm64 arm64e arm64e.x1 to check that slice's code generation too. Cross-compilation does not replace execution on supported hardware. Tests/PointerAuthentication.c can also be compiled with ZD_TEST_NO_MAIN and called from a signed device test host.
Triggering CI
- Push to
mainormasterbranch - Open or update a pull request targeting any branch
One-Click Upgrade
Use the built-in script to upgrade libffi source and regenerate the xcframework:
./scripts/upgrade_libffi.sh --libffi-version 3.8.0 --pod-version 0.380.0What this script does:
- Downloads the official
libffirelease tarball. - Regenerates
Source/headers and source files for modern Apple architectures. - Builds
XCFramework/ZDLibffi.xcframework. - Updates version references in
ZDLibffi.podspecandREADME.md.
Options:
| Flag | Description | |------|-------------| | --libffi-version | Target libffi version (e.g. 3.8.0) | | --pod-version | Pod version string (defaults to 0.<version_digits>.0) | | --skip-xcframework | Skip the xcframework build step |
Upgrade via CI
You can also upgrade without a local environment. Go to Actions → Upgrade libffi → Run workflow, enter the target version number (e.g. 3.8.0), and a PR will be created automatically with:
- Regenerated
Source/from the new release - Updated version references in podspec and README
- SPM build verification
XCFramework
ZDLibffi.xcframework is no longer committed to the repository. You can build it locally or download it from a release.
Build Locally
python3 scripts/build_xcframework.py \
--source Source \
--output XCFramework/ZDLibffi.xcframework \
--build-dir build/xcframeworkDownload from Release
Pushing a tag triggers CI to build the xcframework for all platforms and publish it as a GitHub Release asset (ZDLibffi.xcframework.zip).
Supported Slices
- iOS (device)
- iOS Simulator
- macOS
- Mac Catalyst
- tvOS (device)
- tvOS Simulator
- watchOS (device)
- watchOS Simulator
- visionOS (device)
- visionOS Simulator
Thanks
License
ZDLibffi is available under the MIT license. See the LICENSE file for more info.
Package Metadata
Repository: lynnswap/zdlibffi
Default branch: main
README: README.md