Skip to content

Commit 56f6d12

Browse files
committed
feat: add watchos support
1 parent 32384f7 commit 56f6d12

File tree

12 files changed

+183
-32
lines changed

12 files changed

+183
-32
lines changed

.cargo/config.toml

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
# Previously we added this to rustflags for all linux builds:
32
# "-C", "link-arg=-lgcc_eh"
43
# It was to fix this error when loading the loadable extension:
@@ -86,3 +85,18 @@ rustflags = [
8685
rustflags = [
8786
"-C", "link-arg=-Wl,-soname,libpowersync.so",
8887
]
88+
89+
[target.aarch64-apple-watchos]
90+
rustflags = [
91+
"-C", "link-arg=-mwatchos-version-min=7.0",
92+
]
93+
94+
[target.aarch64-apple-watchos-sim]
95+
rustflags = [
96+
"-C", "link-arg=-mwatchsimulator-version-min=7.0",
97+
]
98+
99+
[target.x86_64-apple-watchos]
100+
rustflags = [
101+
"-C", "link-arg=-mwatchos-version-min=7.0",
102+
]

.github/workflows/ios.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ jobs:
2121
aarch64-apple-darwin \
2222
aarch64-apple-ios \
2323
aarch64-apple-ios-sim \
24-
x86_64-apple-ios
25-
24+
x86_64-apple-ios \
25+
aarch64-apple-watchos \
26+
aarch64-apple-watchos-sim \
27+
x86_64-apple-watchos
2628
- name: setup-cocoapods
2729
uses: maxim-lobanov/setup-cocoapods@v1
2830
with:

.github/workflows/release.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,10 @@ jobs:
9191
aarch64-apple-darwin \
9292
aarch64-apple-ios \
9393
aarch64-apple-ios-sim \
94-
x86_64-apple-ios
95-
94+
x86_64-apple-ios \
95+
aarch64-apple-watchos \
96+
aarch64-apple-watchos-sim \
97+
x86_64-apple-watchos
9698
- name: setup-cocoapods
9799
uses: maxim-lobanov/setup-cocoapods@v1
98100
with:

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,4 @@ repository = "https://github.com/powersync-ja/powersync-sqlite-core"
3939

4040
[workspace.dependencies]
4141
sqlite_nostd = { path="./sqlite-rs-embedded/sqlite_nostd" }
42+

crates/shell/Cargo.toml

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,23 @@ license.workspace = true
88
authors.workspace = true
99
keywords.workspace = true
1010

11+
[lib]
12+
name = "powersync_sqlite"
13+
path = "src/main.rs"
14+
crate-type = ["staticlib"]
15+
16+
[[bin]]
17+
name = "powersync_sqlite"
18+
path = "src/main.rs"
19+
required-features = ["shell"]
20+
1121
[dependencies]
12-
powersync_core = { path="../core" }
13-
sqlite_nostd = { workspace=true }
22+
powersync_core = { path="../core", default-features = false, features = ["static", "omit_load_extension"] }
23+
sqlite_nostd = { workspace=true, features = ["static", "omit_load_extension"] }
1424

1525
[features]
16-
default = ["powersync_core/static", "powersync_core/omit_load_extension", "sqlite_nostd/static", "sqlite_nostd/omit_load_extension"]
26+
default = []
27+
shell = []
1728

1829
[build-dependencies]
1930
cc = "1.0.46"

crates/shell/build.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
21
fn main() {
32
let mut cfg = cc::Build::new();
3+
let target = std::env::var("TARGET").unwrap();
4+
let is_watchos = target.contains("watchos") || target.contains("watchsimulator");
45

56
// Compile the SQLite source
67
cfg.file("../sqlite/sqlite/sqlite3.c");
7-
cfg.file("../sqlite/sqlite/shell.c");
88
cfg.include("../sqlite/sqlite");
99

1010
// General SQLite options
@@ -14,15 +14,22 @@ fn main() {
1414
// Call core_init() in main.rs
1515
cfg.define("SQLITE_EXTRA_INIT", Some("core_init"));
1616

17-
// Compile with readline support (also requires -lreadline / cargo:rustc-link-lib=readline below)
18-
cfg.define("HAVE_READLINE", Some("1"));
17+
if is_watchos {
18+
// For watchOS, don't build the shell and disable readline
19+
cfg.define("HAVE_READLINE", Some("0"));
20+
cfg.define("HAVE_EDITLINE", Some("0"));
21+
cfg.define("SQLITE_OMIT_SYSTEM", Some("1"));
22+
} else {
23+
// For other platforms, build the shell with readline
24+
cfg.file("../sqlite/sqlite/shell.c");
25+
cfg.define("HAVE_READLINE", Some("1"));
26+
println!("cargo:rustc-link-lib=readline");
27+
}
1928

2029
// Silence warnings generated for SQLite
2130
cfg.flag("-Wno-implicit-fallthrough");
2231
cfg.flag("-Wno-unused-parameter");
2332
cfg.flag("-Wno-null-pointer-subtraction");
2433

2534
cfg.compile("sqlite-ps");
26-
27-
println!("cargo:rustc-link-lib=readline");
2835
}

crates/shell/src/main.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ fn panic(_info: &core::panic::PanicInfo) -> ! {
2828
#[lang = "eh_personality"]
2929
extern "C" fn eh_personality() {}
3030

31-
3231
#[no_mangle]
3332
pub extern "C" fn core_init(_dummy: *mut c_char) -> c_int {
3433
powersync_init_static()

crates/sqlite/Cargo.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,21 @@ license.workspace = true
88
authors.workspace = true
99
keywords.workspace = true
1010

11+
[lib]
12+
name = "sqlite3"
13+
path = "src/main.rs"
14+
crate-type = ["staticlib"]
15+
16+
[[bin]]
17+
name = "sqlite3"
18+
path = "src/main.rs"
19+
required-features = ["shell"]
20+
1121
[dependencies]
1222

1323
[features]
24+
default = []
25+
shell = []
1426

1527
[build-dependencies]
1628
cc = "1.0.46"

crates/sqlite/build.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,32 @@
11
fn main() {
22
let mut cfg = cc::Build::new();
3+
let target = std::env::var("TARGET").unwrap();
4+
let is_watchos = target.contains("watchos") || target.contains("watchsimulator");
35

46
// Compile the SQLite source
57
cfg.file("./sqlite/sqlite3.c");
6-
cfg.file("./sqlite/shell.c");
78
cfg.include("./sqlite");
89

910
// General SQLite options
1011
cfg.define("SQLITE_THREADSAFE", Some("0"));
1112
cfg.define("SQLITE_ENABLE_BYTECODE_VTAB", Some("1"));
1213

13-
// Compile with readline support (also requires -lreadline / cargo:rustc-link-lib=readline below)
14-
cfg.define("HAVE_READLINE", Some("1"));
14+
if is_watchos {
15+
// For watchOS, don't build the shell and disable readline
16+
cfg.define("HAVE_READLINE", Some("0"));
17+
cfg.define("HAVE_EDITLINE", Some("0"));
18+
cfg.define("SQLITE_OMIT_SYSTEM", Some("1"));
19+
} else {
20+
// For other platforms, build the shell with readline
21+
cfg.file("./sqlite/shell.c");
22+
cfg.define("HAVE_READLINE", Some("1"));
23+
println!("cargo:rustc-link-lib=readline");
24+
}
1525

1626
// Silence warnings generated for SQLite
1727
cfg.flag("-Wno-implicit-fallthrough");
1828
cfg.flag("-Wno-unused-parameter");
1929
cfg.flag("-Wno-null-pointer-subtraction");
2030

2131
cfg.compile("sqlite");
22-
23-
println!("cargo:rustc-link-lib=readline");
2432
}

powersync-sqlite-core.podspec

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@ PowerSync extension for SQLite.
1313
s.source = { :http => "https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v#{s.version}/powersync-sqlite-core.xcframework.zip" }
1414
s.vendored_frameworks = 'powersync-sqlite-core.xcframework'
1515

16-
1716
s.ios.deployment_target = '11.0'
1817
s.osx.deployment_target = '10.13'
18+
s.watchos.deployment_target = '7.0'
19+
20+
# Ensure no asset catalogs are included for watchOS
21+
s.watchos.resource_bundles = {}
22+
s.watchos.resources = []
1923
end

tool/build_xcframework.sh

Lines changed: 101 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@ set -e
33

44
# Adapted from https://github.com/vlcn-io/cr-sqlite/blob/main/core/all-ios-loadable.sh
55

6-
76
BUILD_DIR=./build
8-
DIST_PACKAGE_DIR=./dist
97

108
function createXcframework() {
11-
plist=$(cat << EOF
9+
ios_plist=$(
10+
cat <<EOF
1211
<?xml version="1.0" encoding="UTF-8"?>
1312
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
1413
<plist version="1.0">
@@ -34,26 +33,76 @@ function createXcframework() {
3433
</dict>
3534
</plist>
3635
EOF
37-
)
36+
)
37+
38+
watchos_plist=$(
39+
cat <<EOF
40+
<?xml version="1.0" encoding="UTF-8"?>
41+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
42+
<plist version="1.0">
43+
<dict>
44+
<key>CFBundleDevelopmentRegion</key>
45+
<string>en</string>
46+
<key>CFBundleExecutable</key>
47+
<string>powersync-sqlite-core</string>
48+
<key>CFBundleIdentifier</key>
49+
<string>co.powersync.sqlitecore</string>
50+
<key>CFBundleInfoDictionaryVersion</key>
51+
<string>6.0</string>
52+
<key>CFBundlePackageType</key>
53+
<string>FMWK</string>
54+
<key>CFBundleSignature</key>
55+
<string>????</string>
56+
<key>MinimumOSVersion</key>
57+
<string>7.0</string>
58+
<key>CFBundleVersion</key>
59+
<string>0.3.12</string>
60+
<key>CFBundleShortVersionString</key>
61+
<string>0.3.12</string>
62+
<key>UIDeviceFamily</key>
63+
<array>
64+
<integer>4</integer>
65+
</array>
66+
<key>DTSDKName</key>
67+
<string>watchos</string>
68+
<key>DTPlatformName</key>
69+
<string>watchos</string>
70+
<key>DTPlatformVersion</key>
71+
<string>7.0</string>
72+
<key>DTXcode</key>
73+
<string>1500</string>
74+
<key>DTXcodeBuild</key>
75+
<string>15A240d</string>
76+
<key>DTCompiler</key>
77+
<string>com.apple.compilers.llvm.clang.1_0</string>
78+
<key>DTPlatformBuild</key>
79+
<string>21R355</string>
80+
<key>BuildMachineOSBuild</key>
81+
<string>23D60</string>
82+
</dict>
83+
</plist>
84+
EOF
85+
)
86+
3887
echo "===================== create ios device framework ====================="
3988
mkdir -p "${BUILD_DIR}/ios-arm64/powersync-sqlite-core.framework"
40-
echo "${plist}" > "${BUILD_DIR}/ios-arm64/powersync-sqlite-core.framework/Info.plist"
89+
echo "${ios_plist}" >"${BUILD_DIR}/ios-arm64/powersync-sqlite-core.framework/Info.plist"
4190
cp -f "./target/aarch64-apple-ios/release_apple/libpowersync.dylib" "${BUILD_DIR}/ios-arm64/powersync-sqlite-core.framework/powersync-sqlite-core"
4291
install_name_tool -id "@rpath/powersync-sqlite-core.framework/powersync-sqlite-core" "${BUILD_DIR}/ios-arm64/powersync-sqlite-core.framework/powersync-sqlite-core"
4392
# Generate dSYM for iOS Device
4493
dsymutil "${BUILD_DIR}/ios-arm64/powersync-sqlite-core.framework/powersync-sqlite-core" -o "${BUILD_DIR}/ios-arm64/powersync-sqlite-core.framework.dSYM"
4594

4695
echo "===================== create ios simulator framework ====================="
4796
mkdir -p "${BUILD_DIR}/ios-arm64_x86_64-simulator/powersync-sqlite-core.framework"
48-
echo "${plist}" > "${BUILD_DIR}/ios-arm64_x86_64-simulator/powersync-sqlite-core.framework/Info.plist"
97+
echo "${ios_plist}" >"${BUILD_DIR}/ios-arm64_x86_64-simulator/powersync-sqlite-core.framework/Info.plist"
4998
lipo ./target/aarch64-apple-ios-sim/release_apple/libpowersync.dylib ./target/x86_64-apple-ios/release_apple/libpowersync.dylib -create -output "${BUILD_DIR}/ios-arm64_x86_64-simulator/powersync-sqlite-core.framework/powersync-sqlite-core"
5099
install_name_tool -id "@rpath/powersync-sqlite-core.framework/powersync-sqlite-core" "${BUILD_DIR}/ios-arm64_x86_64-simulator/powersync-sqlite-core.framework/powersync-sqlite-core"
51100
# Generate dSYM for iOS Simulator
52101
dsymutil "${BUILD_DIR}/ios-arm64_x86_64-simulator/powersync-sqlite-core.framework/powersync-sqlite-core" -o "${BUILD_DIR}/ios-arm64_x86_64-simulator/powersync-sqlite-core.framework.dSYM"
53102

54103
echo "===================== create macos framework ====================="
55104
mkdir -p "${BUILD_DIR}/macos-arm64_x86_64/powersync-sqlite-core.framework/Versions/A/Resources"
56-
echo "${plist}" > "${BUILD_DIR}/macos-arm64_x86_64/powersync-sqlite-core.framework/Versions/A/Resources/Info.plist"
105+
echo "${ios_plist}" >"${BUILD_DIR}/macos-arm64_x86_64/powersync-sqlite-core.framework/Versions/A/Resources/Info.plist"
57106
lipo ./target/x86_64-apple-darwin/release_apple/libpowersync.dylib ./target/aarch64-apple-darwin/release_apple/libpowersync.dylib -create -output "${BUILD_DIR}/macos-arm64_x86_64/powersync-sqlite-core.framework/Versions/A/powersync-sqlite-core"
58107
install_name_tool -id "@rpath/powersync-sqlite-core.framework/powersync-sqlite-core" "${BUILD_DIR}/macos-arm64_x86_64/powersync-sqlite-core.framework/Versions/A/powersync-sqlite-core"
59108
ln -sf A "${BUILD_DIR}/macos-arm64_x86_64/powersync-sqlite-core.framework/Versions/Current"
@@ -62,20 +111,51 @@ EOF
62111
# Generate dSYM for macOS
63112
dsymutil "${BUILD_DIR}/macos-arm64_x86_64/powersync-sqlite-core.framework/Versions/A/powersync-sqlite-core" -o "${BUILD_DIR}/macos-arm64_x86_64/powersync-sqlite-core.framework.dSYM"
64113

114+
echo "===================== create watchos device framework ====================="
115+
mkdir -p "${BUILD_DIR}/watchos-arm64/powersync-sqlite-core.framework/Versions/A/Resources"
116+
echo "${watchos_plist}" >"${BUILD_DIR}/watchos-arm64/powersync-sqlite-core.framework/Versions/A/Resources/Info.plist"
117+
cp -f "./target/aarch64-apple-watchos/release_apple/libpowersync.dylib" "${BUILD_DIR}/watchos-arm64/powersync-sqlite-core.framework/Versions/A/powersync-sqlite-core"
118+
install_name_tool -id "@rpath/powersync-sqlite-core.framework/powersync-sqlite-core" "${BUILD_DIR}/watchos-arm64/powersync-sqlite-core.framework/Versions/A/powersync-sqlite-core"
119+
ln -sf A "${BUILD_DIR}/watchos-arm64/powersync-sqlite-core.framework/Versions/Current"
120+
ln -sf Versions/Current/powersync-sqlite-core "${BUILD_DIR}/watchos-arm64/powersync-sqlite-core.framework/powersync-sqlite-core"
121+
ln -sf Versions/Current/Resources "${BUILD_DIR}/watchos-arm64/powersync-sqlite-core.framework/Resources"
122+
# Generate dSYM for watchOS device
123+
dsymutil "${BUILD_DIR}/watchos-arm64/powersync-sqlite-core.framework/Versions/A/powersync-sqlite-core" -o "${BUILD_DIR}/watchos-arm64/powersync-sqlite-core.framework.dSYM"
124+
125+
echo "===================== create watchos simulator framework ====================="
126+
mkdir -p "${BUILD_DIR}/watchos-arm64-simulator/powersync-sqlite-core.framework/Versions/A/Resources"
127+
echo "${watchos_plist}" >"${BUILD_DIR}/watchos-arm64-simulator/powersync-sqlite-core.framework/Versions/A/Resources/Info.plist"
128+
cp -f "./target/aarch64-apple-watchos-sim/release_apple/libpowersync.dylib" "${BUILD_DIR}/watchos-arm64-simulator/powersync-sqlite-core.framework/Versions/A/powersync-sqlite-core"
129+
install_name_tool -id "@rpath/powersync-sqlite-core.framework/powersync-sqlite-core" "${BUILD_DIR}/watchos-arm64-simulator/powersync-sqlite-core.framework/Versions/A/powersync-sqlite-core"
130+
ln -sf A "${BUILD_DIR}/watchos-arm64-simulator/powersync-sqlite-core.framework/Versions/Current"
131+
ln -sf Versions/Current/powersync-sqlite-core "${BUILD_DIR}/watchos-arm64-simulator/powersync-sqlite-core.framework/powersync-sqlite-core"
132+
ln -sf Versions/Current/Resources "${BUILD_DIR}/watchos-arm64-simulator/powersync-sqlite-core.framework/Resources"
133+
# Generate dSYM for watchOS simulator
134+
dsymutil "${BUILD_DIR}/watchos-arm64-simulator/powersync-sqlite-core.framework/Versions/A/powersync-sqlite-core" -o "${BUILD_DIR}/watchos-arm64-simulator/powersync-sqlite-core.framework.dSYM"
135+
65136
echo "===================== create xcframework ====================="
66137
rm -rf "${BUILD_DIR}/powersync-sqlite-core.xcframework"
67-
# "-debug-symbols" requires the absolute path
138+
# Create iOS/macOS XCFramework
68139
xcodebuild -create-xcframework \
69140
-framework "${BUILD_DIR}/ios-arm64/powersync-sqlite-core.framework" \
70141
-debug-symbols "$(pwd -P)/${BUILD_DIR}/ios-arm64/powersync-sqlite-core.framework.dSYM" \
71142
-framework "${BUILD_DIR}/ios-arm64_x86_64-simulator/powersync-sqlite-core.framework" \
72143
-debug-symbols "$(pwd -P)/${BUILD_DIR}/ios-arm64_x86_64-simulator/powersync-sqlite-core.framework.dSYM" \
73144
-framework "${BUILD_DIR}/macos-arm64_x86_64/powersync-sqlite-core.framework" \
74145
-debug-symbols "$(pwd -P)/${BUILD_DIR}/macos-arm64_x86_64/powersync-sqlite-core.framework.dSYM" \
75-
-output "${BUILD_DIR}/powersync-sqlite-core.xcframework" \
146+
-output "${BUILD_DIR}/powersync-sqlite-core.xcframework"
76147

148+
# Create watchOS XCFramework
149+
xcodebuild -create-xcframework \
150+
-framework "${BUILD_DIR}/watchos-arm64/powersync-sqlite-core.framework" \
151+
-framework "${BUILD_DIR}/watchos-arm64-simulator/powersync-sqlite-core.framework" \
152+
-output "${BUILD_DIR}/powersync-sqlite-core-watchos.xcframework"
153+
154+
# Copy the iOS/macOS XCFramework to the final location
77155
cp -Rf "${BUILD_DIR}/powersync-sqlite-core.xcframework" "powersync-sqlite-core.xcframework"
78-
zip -r --symlinks powersync-sqlite-core.xcframework.zip powersync-sqlite-core.xcframework LICENSE README.md
156+
157+
# Create a zip file with both XCFrameworks
158+
zip -r --symlinks powersync-sqlite-core.xcframework.zip powersync-sqlite-core.xcframework powersync-sqlite-core-watchos.xcframework LICENSE README.md
79159
rm -rf ${BUILD_DIR}
80160
}
81161

@@ -92,5 +172,16 @@ cargo build -p powersync_loadable --profile release_apple --target x86_64-apple-
92172
# macOS
93173
cargo build -p powersync_loadable --profile release_apple --target aarch64-apple-darwin -Zbuild-std
94174
cargo build -p powersync_loadable --profile release_apple --target x86_64-apple-darwin -Zbuild-std
175+
# watchOS
176+
export SDKROOT=$(xcrun --sdk watchos --show-sdk-path)
177+
export CARGO_TARGET_AARCH64_APPLE_WATCHOS_LINKER=$(xcrun --sdk watchos --find clang)
178+
export CARGO_TARGET_AARCH64_APPLE_WATCHOS_AR=$(xcrun --sdk watchos --find ar)
179+
export CARGO_TARGET_AARCH64_APPLE_WATCHOS_RANLIB=$(xcrun --sdk watchos --find ranlib)
180+
cargo build -p powersync_loadable --profile release_apple -Zbuild-std=std,panic_abort --target aarch64-apple-watchos
181+
export SDKROOT=$(xcrun --sdk watchsimulator --show-sdk-path)
182+
export CARGO_TARGET_AARCH64_APPLE_WATCHOS_SIM_LINKER=$(xcrun --sdk watchsimulator --find clang)
183+
export CARGO_TARGET_AARCH64_APPLE_WATCHOS_SIM_AR=$(xcrun --sdk watchsimulator --find ar)
184+
export CARGO_TARGET_AARCH64_APPLE_WATCHOS_SIM_RANLIB=$(xcrun --sdk watchsimulator --find ranlib)
185+
cargo build -p powersync_loadable --profile release_apple -Zbuild-std=std,panic_abort --target aarch64-apple-watchos-sim
95186

96187
createXcframework

0 commit comments

Comments
 (0)