Skip to content

Commit 6015fc3

Browse files
notmandatorytnull
authored andcommitted
Update generate swift bindings script to create swift package
1 parent 3df24df commit 6015fc3

File tree

10 files changed

+171
-1
lines changed

10 files changed

+171
-1
lines changed

.gitignore

+14
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,17 @@ Cargo.lock
88

99
# These are backup files generated by rustfmt
1010
**/*.rs.bk
11+
12+
# Ignore generated swift related files
13+
.swiftpm/
14+
ldk_nodeFFI.*
15+
ldk_node.swift
16+
libldk_node.dylib
17+
LightningDevKitNode.swift
18+
ldk_node.swiftmodule
19+
swift.swiftsourceinfo
20+
swift.abi.json
21+
swift.swiftdoc
22+
23+
# Ignore ldk_nodeFFI.xcframework files
24+
/bindings/swift/ldk_nodeFFI.xcframework

bindings/swift/Package.swift

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// swift-tools-version:5.5
2+
// The swift-tools-version declares the minimum version of Swift required to build this package.
3+
4+
import PackageDescription
5+
6+
let package = Package(
7+
name: "ldk-node",
8+
platforms: [
9+
.macOS(.v12),
10+
.iOS(.v15)
11+
],
12+
products: [
13+
// Products define the executables and libraries a package produces, and make them visible to other packages.
14+
.library(
15+
name: "LightningDevKitNode",
16+
targets: ["ldk_nodeFFI", "LightningDevKitNode"]),
17+
],
18+
dependencies: [
19+
// Dependencies declare other packages that this package depends on.
20+
// .package(url: /* package url */, from: "1.0.0"),
21+
],
22+
targets: [
23+
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
24+
// Targets can depend on other targets in this package, and on products in packages this package depends on.
25+
// .binaryTarget(
26+
// name: "ldk_nodeFFI",
27+
// url: "https://github.com/lightningdevkit/ldk-node/releases/download/0.3.0/ldk_nodeFFI.xcframework.zip",
28+
// checksum: "<TBD>"),
29+
.binaryTarget(name: "ldk_nodeFFI", path: "./ldk_nodeFFI.xcframework"),
30+
.target(
31+
name: "LightningDevKitNode",
32+
dependencies: ["ldk_nodeFFI"]),
33+
// .testTarget(
34+
// name: "LightningDevKitNodeTests",
35+
// dependencies: ["LightningDevKitNode"]),
36+
]
37+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>AvailableLibraries</key>
6+
<array>
7+
<dict>
8+
<key>LibraryIdentifier</key>
9+
<string>macos-arm64_x86_64</string>
10+
<key>LibraryPath</key>
11+
<string>ldk_nodeFFI.framework</string>
12+
<key>SupportedArchitectures</key>
13+
<array>
14+
<string>arm64</string>
15+
<string>x86_64</string>
16+
</array>
17+
<key>SupportedPlatform</key>
18+
<string>macos</string>
19+
</dict>
20+
<dict>
21+
<key>LibraryIdentifier</key>
22+
<string>ios-arm64_x86_64-simulator</string>
23+
<key>LibraryPath</key>
24+
<string>ldk_nodeFFI.framework</string>
25+
<key>SupportedArchitectures</key>
26+
<array>
27+
<string>arm64</string>
28+
<string>x86_64</string>
29+
</array>
30+
<key>SupportedPlatform</key>
31+
<string>ios</string>
32+
<key>SupportedPlatformVariant</key>
33+
<string>simulator</string>
34+
</dict>
35+
<dict>
36+
<key>LibraryIdentifier</key>
37+
<string>ios-arm64</string>
38+
<key>LibraryPath</key>
39+
<string>ldk_nodeFFI.framework</string>
40+
<key>SupportedArchitectures</key>
41+
<array>
42+
<string>arm64</string>
43+
</array>
44+
<key>SupportedPlatform</key>
45+
<string>ios</string>
46+
</dict>
47+
</array>
48+
<key>CFBundlePackageType</key>
49+
<string>XFWK</string>
50+
<key>XCFrameworkFormatVersion</key>
51+
<string>1.0</string>
52+
</dict>
53+
</plist>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// This is the "umbrella header" for our combined Rust code library.
2+
// It needs to import all of the individual headers.
3+
4+
#import "ldk_nodeFFI.h"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
framework module ldk_nodeFFI {
2+
umbrella header "ldk_nodeFFI-umbrella.h"
3+
4+
export *
5+
module * { export * }
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// This is the "umbrella header" for our combined Rust code library.
2+
// It needs to import all of the individual headers.
3+
4+
#import "ldk_nodeFFI.h"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
framework module ldk_nodeFFI {
2+
umbrella header "ldk_nodeFFI-umbrella.h"
3+
4+
export *
5+
module * { export * }
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// This is the "umbrella header" for our combined Rust code library.
2+
// It needs to import all of the individual headers.
3+
4+
#import "ldk_nodeFFI.h"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
framework module ldk_nodeFFI {
2+
umbrella header "ldk_nodeFFI-umbrella.h"
3+
4+
export *
5+
module * { export * }
6+
}

scripts/uniffi_bindgen_generate_swift.sh

+37-1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,40 @@ $UNIFFI_BINDGEN_BIN generate bindings/ldk_node.udl --language swift -o "$BINDING
77

88
mkdir -p $BINDINGS_DIR
99

10-
swiftc -module-name ldk_node -emit-library -o "$BINDINGS_DIR"/libldk_node.dylib -emit-module -emit-module-path "$BINDINGS_DIR" -parse-as-library -L ./target/release -lldk_node -Xcc -fmodule-map-file="$BINDINGS_DIR"/ldk_nodeFFI.modulemap "$BINDINGS_DIR"/ldk_node.swift -v
10+
# Install rust target toolchains
11+
rustup install nightly-x86_64-apple-darwin
12+
rustup component add rust-src --toolchain nightly-x86_64-apple-darwin
13+
rustup target add aarch64-apple-ios x86_64-apple-ios
14+
rustup target add aarch64-apple-ios-sim --toolchain nightly
15+
rustup target add aarch64-apple-darwin x86_64-apple-darwin
16+
17+
# Build rust target libs
18+
cargo build --profile release-smaller || exit 1
19+
cargo build --profile release-smaller --target x86_64-apple-darwin || exit 1
20+
cargo build --profile release-smaller --target aarch64-apple-darwin || exit 1
21+
cargo build --profile release-smaller --target x86_64-apple-ios || exit 1
22+
cargo build --profile release-smaller --target aarch64-apple-ios || exit 1
23+
cargo +nightly build --release --target aarch64-apple-ios-sim || exit 1
24+
25+
# Combine ios-sim and apple-darwin (macos) libs for x86_64 and aarch64 (m1)
26+
mkdir -p target/lipo-ios-sim/release-smaller || exit 1
27+
lipo target/aarch64-apple-ios-sim/release/libldk_node.a target/x86_64-apple-ios/release-smaller/libldk_node.a -create -output target/lipo-ios-sim/release-smaller/libldk_node.a || exit 1
28+
mkdir -p target/lipo-macos/release-smaller || exit 1
29+
lipo target/aarch64-apple-darwin/release-smaller/libldk_node.a target/x86_64-apple-darwin/release-smaller/libldk_node.a -create -output target/lipo-macos/release-smaller/libldk_node.a || exit 1
30+
31+
$UNIFFI_BINDGEN_BIN generate bindings/ldk_node.udl --language swift -o "$BINDINGS_DIR" || exit 1
32+
33+
swiftc -module-name ldk_node -emit-library -o "$BINDINGS_DIR"/libldk_node.dylib -emit-module -emit-module-path "$BINDINGS_DIR" -parse-as-library -L ./target/release-smaller -lldk_node -Xcc -fmodule-map-file="$BINDINGS_DIR"/ldk_nodeFFI.modulemap "$BINDINGS_DIR"/ldk_node.swift -v || exit 1
34+
35+
# Create xcframework from bindings Swift file and libs
36+
mkdir -p "$BINDINGS_DIR"/Sources/LightningDevKitNode || exit 1
37+
mv "$BINDINGS_DIR"/ldk_node.swift "$BINDINGS_DIR"/Sources/LightningDevKitNode/LightningDevKitNode.swift || exit 1
38+
cp "$BINDINGS_DIR"/ldk_nodeFFI.h "$BINDINGS_DIR"/ldk_nodeFFI.xcframework/ios-arm64/ldk_nodeFFI.framework/Headers || exit 1
39+
cp "$BINDINGS_DIR"/ldk_nodeFFI.h "$BINDINGS_DIR"/ldk_nodeFFI.xcframework/ios-arm64_x86_64-simulator/ldk_nodeFFI.framework/Headers || exit 1
40+
cp "$BINDINGS_DIR"/ldk_nodeFFI.h "$BINDINGS_DIR"/ldk_nodeFFI.xcframework/macos-arm64_x86_64/ldk_nodeFFI.framework/Headers || exit 1
41+
cp target/aarch64-apple-ios/release-smaller/libldk_node.a "$BINDINGS_DIR"/ldk_nodeFFI.xcframework/ios-arm64/ldk_nodeFFI.framework/ldk_nodeFFI || exit 1
42+
cp target/lipo-ios-sim/release-smaller/libldk_node.a "$BINDINGS_DIR"/ldk_nodeFFI.xcframework/ios-arm64_x86_64-simulator/ldk_nodeFFI.framework/ldk_nodeFFI || exit 1
43+
cp target/lipo-macos/release-smaller/libldk_node.a "$BINDINGS_DIR"/ldk_nodeFFI.xcframework/macos-arm64_x86_64/ldk_nodeFFI.framework/ldk_nodeFFI || exit 1
44+
# rm "$BINDINGS_DIR"/ldk_nodeFFI.h || exit 1
45+
# rm "$BINDINGS_DIR"/ldk_nodeFFI.modulemap || exit 1
46+
echo finished successfully!

0 commit comments

Comments
 (0)