Skip to content

Conversation

@jberkel
Copy link
Collaborator

@jberkel jberkel commented Jan 12, 2026

Instead of guessing the right configuration based on the platform, we should use traits to configure SQLite.swift. The consuming packages can then do the guessing (if needed) and enable the right configuration themselves.

Package.swift Outdated

let applePlatforms: [PackageDescription.Platform] = [.iOS, .macOS, .watchOS, .tvOS, .visionOS]
let sqlcipherTraitBuildSettingCondition: BuildSettingCondition? = .when(platforms: applePlatforms, traits: ["SQLCipher"])
let cSettings: [CSetting] = [.define("SQLITE_HAS_CODEC", to: nil, sqlcipherTraitBuildSettingCondition)]
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@R4N does this define actually need to be set? There are no C files to be compiled in this project.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, in the sqlite3.h header that SQLCipher exposes, we'll need that other c flag to enable sqlite3_key* and sqlite3_rekey*. If you remove it, you should see errors along the lines of:

Cannot find 'sqlite3_key_v2' in scope
Cannot find 'sqlite3_rekey_v2' in scope

description: "Enables SQLCipher encryption when a key is supplied to Connection"),
.trait(name: "SwiftToolchainCSQLite",
description: "Uses the SQLite from SwiftToolchain")
.default(enabledTraits: ["SystemSQLite"])
Copy link
Contributor

@R4N R4N Jan 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use caution with relying on default enabledTraits. Xcode UI still hasn't caught up and doesn't respect the default enabled traits. All the swift command line commands work properly with it, but for direct Xcode integrators it won't work. I'd recommend leaving the desired default as "trait-less" so that it works out of the box when adding the package in the Xcode UI.

Copy link
Collaborator Author

@jberkel jberkel Jan 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, yes I'm hesitant about this. Right now it should be OK because the defines in the code don't check explicitly for this:

#if StandaloneSQLite
import sqlite3
#elseif SQLCipher
import SQLCipher
#elseif SwiftToolchainCSQLite
import SwiftToolchainCSQLite
#else
import SQLite3 // SystemSQLite
#endif

But if it's not needed maybe it's safer to leave this out (for now, until Xcode catches up)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh yes, excellent. That looks good to me. I should have looked closer at the rest of the commit for the adjusted import conditional prior to commenting.

Copy link
Collaborator Author

@jberkel jberkel Jan 15, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FYI, this is unrelated, but thought I'd mention it to you:
Since I started using the package with the SQLCipher changes (without using the trait),I keep seeing the warning

binary target 'SQLCipher' could not be mapped to an artifact with expected name 'SQLCipher'

in the logs during package resolve (just a warning, it seems).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is that integrating into an Xcode project using the Xcode interface to add the package, calling swift package resolve from within the SQLite.swift folder, or consuming it as referenced from another Package.swift?

If it's using the Xcode interface, which version of Xcode are you using?

I tried using Xcode 26.2 consuming the package on the simplify-trait branch both from a local checkout and referencing it from the GitHub url, but didn't see that warning in Resolve Packages.

I wonder if resetting the package caches in Xcode would help at all via File > Packages > Reset Package Caches if you haven't tried that yet?

Running swift package resolve --very-verbose from the SQLite.swift checkout simplify-trait branch didn't produce the warning for me either.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was from within Xcode (16.4), when updating packages. I've tried to reproduce it, but it's gone now, probably just some temporary thing. If it turns up again I'll let you know.

@jberkel jberkel changed the title Traits automatically set up define with the trait name Add more traits to Package.swift Jan 13, 2026
@jberkel jberkel merged commit d4e3e33 into master Jan 14, 2026
4 checks passed
@jberkel jberkel deleted the simplify-trait branch January 21, 2026 22:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants