Files
fil/packages/swift/BUILDING.md
Henrik Jess Nielsen b4c07d3693
All checks were successful
Deploy fil (kreuzberg) / deploy (push) Successful in 49s
Nomad changes
2026-06-01 23:40:55 +02:00

2.8 KiB
Generated

Building Kreuzberg

The Swift package wraps a Rust library via swift-bridge. SwiftPM cannot invoke Cargo directly, so you must run the cargo build step first.

Workflow

1. Build the Rust binding crate

From the repository root:

cargo build -p kreuzberg-swift

This compiles target/debug/libkreuzberg_swift.a and runs swift-bridge-build in build.rs, which writes generated Swift and C sources into target/debug/build/kreuzberg-swift-*/out/.

2. Copy generated sources into the SwiftPM targets

The package uses two internal targets:

  • Sources/RustBridgeC/ — pure C target with the combined C header
  • Sources/RustBridge/ — Swift bridge files that import RustBridgeC
OUT=$(ls -dt target/debug/build/kreuzberg-swift-*/out 2>/dev/null | head -1)

# Combine C headers into the RustBridgeC target
cat "$OUT/SwiftBridgeCore.h" "$OUT/kreuzberg-swift/kreuzberg-swift.h" \
    > packages/swift/Sources/RustBridgeC/RustBridgeC.h

# Copy Swift bridge files, prepending "import RustBridgeC" so they see the C types.
# Use `{ echo ...; cat ...; }` rather than `printf "...$(cat)..."` because printf
# interprets `%` and `\` sequences in its format string, which would corrupt the
# generated Swift sources.
{ echo "import RustBridgeC"; cat "$OUT/SwiftBridgeCore.swift"; } \
    > packages/swift/Sources/RustBridge/SwiftBridgeCore.swift
{ echo "import RustBridgeC"; cat "$OUT/kreuzberg-swift/kreuzberg-swift.swift"; } \
    > packages/swift/Sources/RustBridge/kreuzberg-swift.swift

If the glob kreuzberg-swift-*/out matches multiple directories, ls -dt ... | head -1 picks the most recently modified one.

3. Build and test the Swift package

swift build --package-path packages/swift
swift test --package-path packages/swift

Release builds

Replace target/debug with target/release and pass --configuration release to swift build:

cargo build --release -p kreuzberg-swift
OUT=$(ls -dt target/release/build/kreuzberg-swift-*/out 2>/dev/null | head -1)

cat "$OUT/SwiftBridgeCore.h" "$OUT/kreuzberg-swift/kreuzberg-swift.h" \
    > packages/swift/Sources/RustBridgeC/RustBridgeC.h
{ echo "import RustBridgeC"; cat "$OUT/SwiftBridgeCore.swift"; } \
    > packages/swift/Sources/RustBridge/SwiftBridgeCore.swift
{ echo "import RustBridgeC"; cat "$OUT/kreuzberg-swift/kreuzberg-swift.swift"; } \
    > packages/swift/Sources/RustBridge/kreuzberg-swift.swift

swift build --package-path packages/swift --configuration release

Notes

  • Files in Sources/RustBridgeC/ and the generated Swift files in Sources/RustBridge/ are generated artifacts — overwritten by the copy step.
  • Sources/RustBridge/RustBridge.swift is a placeholder and is overwritten.
  • target/ is in .gitignore; regenerate after every cargo clean.