Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
7ed715a
Add CSQLite shim header including <sqlite3.h>
colemancda Jul 28, 2026
1aebd96
Add CSQLite module map linking the system sqlite3 library
colemancda Jul 28, 2026
0dbd6a9
Link the system SQLite on Linux via the CSQLite system library target
colemancda Jul 28, 2026
a53bc69
Import CSQLite instead of SwiftToolchainCSQLite in AggregateFunction.…
colemancda Jul 28, 2026
bd95312
Import CSQLite instead of SwiftToolchainCSQLite in Backup.swift
colemancda Jul 28, 2026
7bd63d6
Import CSQLite instead of SwiftToolchainCSQLite in Collation.swift
colemancda Jul 28, 2026
6a93dba
Import CSQLite instead of SwiftToolchainCSQLite in Connection.swift
colemancda Jul 28, 2026
f2a0d4e
Import CSQLite instead of SwiftToolchainCSQLite in Constants.swift
colemancda Jul 28, 2026
1e4f970
Import CSQLite instead of SwiftToolchainCSQLite in Error.swift
colemancda Jul 28, 2026
6884255
Import CSQLite instead of SwiftToolchainCSQLite in Function.swift
colemancda Jul 28, 2026
fc39923
Import CSQLite instead of SwiftToolchainCSQLite in IncrementalBlob.swift
colemancda Jul 28, 2026
455d912
Import CSQLite instead of SwiftToolchainCSQLite in PreparedStatement.…
colemancda Jul 28, 2026
6ede7ca
Import CSQLite instead of SwiftToolchainCSQLite in Statement.swift
colemancda Jul 28, 2026
a1ddfc6
Import CSQLite instead of SwiftToolchainCSQLite in TypeAffinity.swift
colemancda Jul 28, 2026
37170ee
Import CSQLite instead of SwiftToolchainCSQLite in WAL.swift
colemancda Jul 28, 2026
ee79e73
Import CSQLite instead of SwiftToolchainCSQLite in WindowFunction.swift
colemancda Jul 28, 2026
d14c4d5
Install libsqlite3-dev and pkg-config in the Linux CI job
colemancda Jul 28, 2026
aa19bcd
Document the Linux system SQLite requirement
colemancda Jul 28, 2026
5a67f25
Make the system SQLite on Linux opt-in via SWIFT_BUILD_SYSTEM_SQLITE
colemancda Jul 28, 2026
8d24f3e
Add a Linux CI job covering the system SQLite build
colemancda Jul 28, 2026
2752e9e
Document the system SQLite opt-in on Linux
colemancda Jul 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,25 @@ jobs:
- name: Test
run: swift test -v

linux-system-sqlite:
name: Linux (system SQLite)
runs-on: ubuntu-latest
container: swift:6.3.3
env:
SWIFT_BUILD_SYSTEM_SQLITE: '1'
steps:
- uses: actions/checkout@v4
- name: Install SQLite
run: |
apt-get update
apt-get install -y --no-install-recommends libsqlite3-dev pkg-config
- name: Swift version
run: swift --version
- name: Build
run: swift build -v
- name: Test
run: swift test -v

android:
runs-on: ubuntu-latest
steps:
Expand Down
49 changes: 39 additions & 10 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,44 @@ import class Foundation.ProcessInfo
// get environment variables
let environment = ProcessInfo.processInfo.environment
let dynamicLibrary = environment["SWIFT_BUILD_DYNAMIC_LIBRARY"] == "1"
let systemSQLite = environment["SWIFT_BUILD_SYSTEM_SQLITE"] == "1"

// force building as dynamic library
let libraryType: PackageDescription.Product.Library.LibraryType? = dynamicLibrary ? .dynamic : nil

// Linux uses the embedded SQLite build by default, like the other non-Darwin
// platforms. Set `SWIFT_BUILD_SYSTEM_SQLITE=1` to link the system SQLite
// (`libsqlite3-dev` / `sqlite-devel`) there instead.
let embeddedSQLitePlatforms: [Platform] = systemSQLite
? [.android, .windows, .wasi, .openbsd]
: [.linux, .android, .windows, .wasi, .openbsd]

var sqliteDependencies: [Target.Dependency] = [
.product(
name: "SQLCipher",
package: "swift-sqlcipher",
condition: .when(platforms: embeddedSQLitePlatforms)
)
]

var sqliteTargets: [Target] = []

if systemSQLite {
sqliteDependencies.append(
.target(name: "CSQLite", condition: .when(platforms: [.linux]))
)
sqliteTargets.append(
.systemLibrary(
name: "CSQLite",
pkgConfig: "sqlite3",
providers: [
.apt(["libsqlite3-dev"]),
.yum(["sqlite-devel"])
]
)
)
}

let package = Package(
name: "SQLite",
products: [
Expand All @@ -21,26 +55,21 @@ let package = Package(
],
dependencies: [
// Darwin platforms link the system SQLite3.framework; everywhere else
// has no system SQLite, so this package's embedded copy is used instead.
// uses this package's embedded copy, unless Linux opts into the system
// libsqlite3 with `SWIFT_BUILD_SYSTEM_SQLITE=1`.
.package(
url: "https://github.com/PureSwift/swift-sqlcipher",
from: "0.1.0"
)
],
targets: [
targets: sqliteTargets + [
.target(
name: "SQLite",
dependencies: [
.product(
name: "SQLCipher",
package: "swift-sqlcipher",
condition: .when(platforms: [.linux, .android, .windows, .wasi, .openbsd])
)
],
dependencies: sqliteDependencies,
swiftSettings: [
.define(
"SQLITE_SWIFT_SQLCIPHER",
.when(platforms: [.linux, .android, .windows, .wasi, .openbsd])
.when(platforms: embeddedSQLitePlatforms)
)
]
),
Expand Down
19 changes: 18 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,24 @@ DSL.
- `Blob`, `Data`, `UUID`, and `Date` binding conversions
- Cross-platform: uses the system `SQLite3` on Apple platforms and the embedded
[swift-sqlcipher](https://github.com/PureSwift/swift-sqlcipher) build
everywhere else (Linux, Android, Windows, WASI, OpenBSD)
everywhere else (Linux, Android, Windows, WASI, OpenBSD), with Linux able to
link the system `libsqlite3` instead

## System SQLite on Linux

Linux uses the embedded SQLite build by default. To link the system SQLite
instead, install the development package and build with
`SWIFT_BUILD_SYSTEM_SQLITE=1`:

```sh
apt-get install libsqlite3-dev pkg-config # Debian / Ubuntu
dnf install sqlite-devel pkgconf-pkg-config # Fedora / RHEL

SWIFT_BUILD_SYSTEM_SQLITE=1 swift build
```

`pkg-config` is required in addition to the headers, since the system library
target resolves its flags through it.

## Installation

Expand Down
5 changes: 5 additions & 0 deletions Sources/CSQLite/module.modulemap
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module CSQLite [system] {
header "shim.h"
link "sqlite3"
export *
}
1 change: 1 addition & 0 deletions Sources/CSQLite/shim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#include <sqlite3.h>
2 changes: 1 addition & 1 deletion Sources/SQLite/AggregateFunction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import sqlite3
#elseif SQLITE_SWIFT_SQLCIPHER
import SQLCipher
#elseif os(Linux)
import SwiftToolchainCSQLite
import CSQLite
#else
import SQLite3
#endif
Expand Down
2 changes: 1 addition & 1 deletion Sources/SQLite/Backup.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import sqlite3
#elseif SQLITE_SWIFT_SQLCIPHER
import SQLCipher
#elseif os(Linux)
import SwiftToolchainCSQLite
import CSQLite
#else
import SQLite3
#endif
Expand Down
2 changes: 1 addition & 1 deletion Sources/SQLite/Collation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import sqlite3
#elseif SQLITE_SWIFT_SQLCIPHER
import SQLCipher
#elseif os(Linux)
import SwiftToolchainCSQLite
import CSQLite
#else
import SQLite3
#endif
Expand Down
2 changes: 1 addition & 1 deletion Sources/SQLite/Connection.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import sqlite3
#elseif SQLITE_SWIFT_SQLCIPHER
import SQLCipher
#elseif os(Linux)
import SwiftToolchainCSQLite
import CSQLite
#else
import SQLite3
#endif
Expand Down
2 changes: 1 addition & 1 deletion Sources/SQLite/Constants.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import sqlite3
#elseif SQLITE_SWIFT_SQLCIPHER
import SQLCipher
#elseif os(Linux)
import SwiftToolchainCSQLite
import CSQLite
#else
import SQLite3
#endif
Expand Down
2 changes: 1 addition & 1 deletion Sources/SQLite/Error.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import sqlite3
#elseif SQLITE_SWIFT_SQLCIPHER
import SQLCipher
#elseif os(Linux)
import SwiftToolchainCSQLite
import CSQLite
#else
import SQLite3
#endif
Expand Down
2 changes: 1 addition & 1 deletion Sources/SQLite/Function.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import sqlite3
#elseif SQLITE_SWIFT_SQLCIPHER
import SQLCipher
#elseif os(Linux)
import SwiftToolchainCSQLite
import CSQLite
#else
import SQLite3
#endif
Expand Down
2 changes: 1 addition & 1 deletion Sources/SQLite/IncrementalBlob.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import sqlite3
#elseif SQLITE_SWIFT_SQLCIPHER
import SQLCipher
#elseif os(Linux)
import SwiftToolchainCSQLite
import CSQLite
#else
import SQLite3
#endif
Expand Down
2 changes: 1 addition & 1 deletion Sources/SQLite/PreparedStatement.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import sqlite3
#elseif SQLITE_SWIFT_SQLCIPHER
import SQLCipher
#elseif os(Linux)
import SwiftToolchainCSQLite
import CSQLite
#else
import SQLite3
#endif
Expand Down
2 changes: 1 addition & 1 deletion Sources/SQLite/Statement.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import sqlite3
#elseif SQLITE_SWIFT_SQLCIPHER
import SQLCipher
#elseif os(Linux)
import SwiftToolchainCSQLite
import CSQLite
#else
import SQLite3
#endif
Expand Down
2 changes: 1 addition & 1 deletion Sources/SQLite/TypeAffinity.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import sqlite3
#elseif SQLITE_SWIFT_SQLCIPHER
import SQLCipher
#elseif os(Linux)
import SwiftToolchainCSQLite
import CSQLite
#else
import SQLite3
#endif
Expand Down
2 changes: 1 addition & 1 deletion Sources/SQLite/WAL.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import sqlite3
#elseif SQLITE_SWIFT_SQLCIPHER
import SQLCipher
#elseif os(Linux)
import SwiftToolchainCSQLite
import CSQLite
#else
import SQLite3
#endif
Expand Down
2 changes: 1 addition & 1 deletion Sources/SQLite/WindowFunction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import sqlite3
#elseif SQLITE_SWIFT_SQLCIPHER
import SQLCipher
#elseif os(Linux)
import SwiftToolchainCSQLite
import CSQLite
#else
import SQLite3
#endif
Expand Down
Loading