Bridgecraft (homophone for "witchcraft") is a command line tool for generating the Swift interface for ObjC bridging headers. This comes handy if you have a mixed Swift-ObjC codebase and you want to use code generation tools (e.g. Sourcery) that only support Swift.
Xcode already supports generating a Swift interface for any ObjC source file:
Unfortunately, this functionality tends to be flaky to the point that one cannot rely on it. Another disadvantage is that it is not exposed on the CLI and so it's rather difficult to use it in an automated manner.
Bridgecraft reproduces the steps needed for the interface generation with some additional safeguards to provide a reliable output, namely:
Binary distribution
Download the latest prebuilt binary (Bridgecraft-A.B.C.zip) from Releases. Unzip the archive and run bin/bridgecraft
.
Cocoapods
Add pod 'Bridgecraft'
to your Podfile and run pod update Bridgecraft
. This will download the latest release binary and place it in your project's CocoaPods path so you can run it with $PODS_ROOT/Bridgecraft/bin/bridgecraft
Manual build
Using Xcode
Open Bridgecraft.xcodeproj
and build the Bridgecraft
scheme. This will produce the Bridgecraft.app
artifact in the derived data folder. The executable is under Bridgecraft.app/Contents/MacOS/Bridgecraft
Using the Swift package manager
In the root folder, run:
$ swift build -c release -Xswiftc -static-stdlib
This will create a .build/release
folder and produce the bridgecraft
executable.
Bridgecraft is a command-line tool without UI, so you can invoke it from the shell:
$ Bridgecraft.app/Contents/MacOS/Bridgecraft <command> ...
or
$ bridgecraft <command> ...
depending on which build method you used.
Available commands:
generate
: generates the Swift interface from an ObjC bridging headerpatch
: injects a Swift source file into an Xcode projectFor details and available options run:
$ bridgecraft --help
To build: Xcode 10, Swift 4.2
To run: macOS 10.10
NS_ASSUME_NONNULL
macros which would result in implicitly unwrapped optionals all over the place. To circumvent that, use the --assume-nonnull
option but make sure all the referenced headers have previously been audited for nullability.If your target platform is iOS/tvOS/watchOS, chances are the command will fail because it will try to build for the device instead of the simulator. As a workaround, specify the -configuration
, -sdk
, -destination
or any other options that you want to send to the xcodebuild with the usual values, e.g.
$ bridgecraft generate <path_to_xcodeproj> <target_name> -- \
-configuration Debug \
-sdk iphonesimulator \
-destination 'platform=iOS Simulator,name=iPhone 6,OS=latest'
MIT