Integrate connlib build into apple build (#1759)

This PR improves the build process for the macOS / iOS apps by building
connlib as part of the macOS / iOS app build.

Fixes firezone/product#625.

This is how the build would work after this PR:
- `build-rust.sh` creates `libconnlib.a` for the appropriate target
triples only. lipo is not used. When creating macOS debug builds, it’s
built only for the native architecture.
- The network extension targets in the Xcode project set a library
search path as the cargo target dir, so that the Xcode build for a
target triple can pickup the appropriate `libconnlib.a` at link time.

Swift code reorganizations:
  - connlib’s Adapter has moved to the main app
- connlib’s CallbackHandler’s logic has moved to Adapter, which is set
as CallbackHandler’s delegate. The CallbackHandler serves as an
interface to receive callbacks from the FFI. In case we need to change
the FFI, CallbackHandler should change as well, so it remains in the
connlib directory. In case of changes to the Rust FFI, as part of the
Rust FFI change PR, we can modify the CallbackHandler class and leave
the delegate unchanged, so that the app can continue to be built without
errors.
- `Connlib.xcodeproject` and build scripts for building
`Connlib.xcframework` are removed
- Connlib headers and Swift files are copied to
`FirezoneNetworkExtension/Connlib` as part of the build process, and
used from there.

Rust build changes:
- The rust target dir remains the same, but it’s ~~passed explicitly as
`--target-dir`~~ used to set `CARGO_TARGET_DIR`, so that the same target
dir can be used to populate Xcode’s library search paths
- The `build.rs` for connlib-apple had lots of code to build Swift code
as part of the Rust build. This PR reverts it to the previous simple
version. With this PR, building connlib-apple (i.e. running
`build-rust.sh`) only builds the Rust code.
- ~~We set `cargo:rerun-if-env-changed=CONNLIB_MOCK`.~~ We don't set
this because it's not required.
- The Rust CI job for building connlib-apple is removed. It's built when
the macOS / iOS apps are built in swift.yml. This means that with this
PR, connlib-apple is tested only when `rust/connlib/**` changes, not
when `rust/**` changes. Is that ok?

Other changes not directly related to the build process change but part
of this PR:
  - There’s a cleanup script: `./cleanup.sh`
  - Fixed a typo in `swift-pass-checks.yml`: “paths-ginore”
This commit is contained in:
Roopesh Chander
2023-07-13 10:53:24 +05:30
committed by GitHub
parent 3023c716c9
commit 9ad557f568
32 changed files with 475 additions and 995 deletions

View File

@@ -116,47 +116,6 @@ jobs:
path: |
./rust/connlib-${{ needs.draft-release.outputs.tag_name }}.aar
rust_build-apple:
needs:
- rust_draft-release
runs-on: macos-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v3
- uses: Swatinem/rust-cache@v2
with:
workspaces: ./rust
- name: Update toolchain
run: rustup show
- name: Setup lipo
run: cargo install cargo-lipo
- uses: actions/cache@v3
with:
path: apple/.build
key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }}
restore-keys: |
${{ runner.os }}-spm-
- name: Build Connlib.xcframework.zip
env:
CONFIGURATION: Release
PROJECT_DIR: .
working-directory: ./rust/connlib/clients/apple
run: |
# build-xcframework.sh calls build-rust.sh indirectly via `xcodebuild`, but it pollutes the environment
# to the point that it causes the `ring` build to fail for the aarch64-apple-darwin target. So, explicitly
# build first. See https://github.com/briansmith/ring/issues/1332
./build-rust.sh
./build-xcframework.sh
mv Connlib.xcframework.zip ../../../../Connlib-${{ needs.draft-release.outputs.tag_name }}.xcframework.zip
mv Connlib.xcframework.zip.checksum.txt ../../../../Connlib-${{ needs.draft-release.outputs.tag_name }}.xcframework.zip.checksum.txt
- uses: actions/upload-artifact@v3
with:
name: connlib-apple
path: |
./Connlib-${{ needs.draft-release.outputs.tag_name }}.xcframework.zip
./Connlib-${{ needs.draft-release.outputs.tag_name }}.xcframework.zip.checksum.txt
rust_cross-compile-relay: # cross is separate from test because cross-compiling yields different artifacts and we cannot reuse the cache.
runs-on: ubuntu-latest
steps:

View File

@@ -3,7 +3,7 @@
name: Swift
on:
pull_request:
paths-ginore:
paths-ignore:
- "swift/**"
- "rust/connlib/**"
- ".github/workflows/swift.yml"

View File

@@ -47,26 +47,12 @@ jobs:
save-if: ${{ github.ref == 'refs/heads/cloud' }}
- name: Update toolchain
run: rustup show
- name: Setup lipo
run: cargo install cargo-lipo
- uses: actions/cache@v3
with:
path: apple/.build
key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }}
restore-keys: |
${{ runner.os }}-spm-
- name: Build Connlib.xcframework
env:
CONFIGURATION: Release
PROJECT_DIR: .
working-directory: ./rust/connlib/clients/apple
run: |
# build-xcframework.sh calls build-rust.sh indirectly via `xcodebuild`, but it pollutes the environment
# to the point that it causes the `ring` build to fail for the aarch64-apple-darwin target. So, explicitly
# build first. See https://github.com/briansmith/ring/issues/1332
PLATFORM_NAME=macosx ./build-rust.sh
PLATFORM_NAME=iphoneos ./build-rust.sh
./build-xcframework-dev.sh
- name: Select Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
@@ -74,10 +60,10 @@ jobs:
- name: Build app for macOS
working-directory: ./swift/apple
run: |
cp Firezone/Developer.xcconfig.ci-macOS Firezone/Developer.xcconfig
xcodebuild build -scheme Firezone -sdk macosx -destination 'platform=macOS' CODE_SIGNING_ALLOWED=NO
cp Firezone/xcconfig/Developer.xcconfig.ci-macOS Firezone/xcconfig/Developer.xcconfig
xcodebuild archive -scheme Firezone -sdk macosx -destination 'platform=macOS' CODE_SIGNING_ALLOWED=NO
- name: Build app for iOS
working-directory: ./swift/apple
run: |
cp Firezone/Developer.xcconfig.ci-iOS Firezone/Developer.xcconfig
xcodebuild build -scheme Firezone -sdk iphoneos -destination 'generic/platform=iOS' CODE_SIGNING_ALLOWED=NO
cp Firezone/xcconfig/Developer.xcconfig.ci-iOS Firezone/xcconfig/Developer.xcconfig
xcodebuild archive -scheme Firezone -sdk iphoneos -destination 'generic/platform=iOS' CODE_SIGNING_ALLOWED=NO

View File

@@ -1,19 +1,6 @@
# Connlib Apple Wrapper
Apple Package wrapper for Connlib distributed as a binary XCFramework for
inclusion in the Firezone Apple client.
Apple Package wrapper for Connlib for inclusion in the Firezone Apple
client.
## Prerequisites
1. Install [ stable rust ](https://www.rust-lang.org/tools/install) for your
platform
1. Install `llvm` from Homebrew:
```
brew install llvm
```
This fixes build issues with Apple's command line tools. See
https://github.com/briansmith/ring/issues/1374
This is built as part of the Apple client build.

View File

@@ -1,17 +0,0 @@
// This header is used in `build.rs`, and is exactly the same as
// `BridgingHeader.h` *except* the `include` paths are relative.
//
// Attempting to build an `xcframework` with a quoted `include` violates rules
// around non-modular imports, as only headers specified as part of the module
// can be included.
//
// However, SwiftPM has no equivalent to "modular headers", so we can only rely
// on normal, simple `include` paths.
#ifndef BridgingHeader_h
#define BridgingHeader_h
#include "Generated/SwiftBridgeCore.h"
#include "Generated/connlib-apple/connlib-apple.h"
#endif

View File

@@ -1,7 +0,0 @@
#ifndef BridgingHeader_h
#define BridgingHeader_h
#include <connlib/SwiftBridgeCore.h>
#include <connlib/connlib-apple.h>
#endif

View File

@@ -8,100 +8,42 @@
import NetworkExtension
import os.log
// When the FFI changes from the Rust side, change the CallbackHandler
// functions along with that, but not the delegate protocol.
// When the app gets updated to use the FFI, the delegate protocol
// shall get updated.
// This is so that the app stays buildable even when the FFI changes.
// TODO: https://github.com/chinedufn/swift-bridge/issues/150
extension SwiftConnlibError: @unchecked Sendable {}
extension SwiftConnlibError: Error {}
public protocol CallbackHandlerDelegate: AnyObject {
func didUpdateResources(_ resourceList: ResourceList)
func onConnect(tunnelAddressIPv4: String, tunnelAddressIPv6: String)
func onUpdateResources(resourceList: String)
func onDisconnect()
func onError(error: Error, isRecoverable: Bool)
}
public class CallbackHandler {
// TODO: Add a table view property here to update?
var adapter: Adapter?
public weak var delegate: CallbackHandlerDelegate?
init(adapter: Adapter) {
self.adapter = adapter
func onUpdateResources(resourceList: ResourceList) {
delegate?.onUpdateResources(resourceList: resourceList.resources.toString())
}
func onUpdateResources(resourceList: ResourceList) -> Bool {
// If there's any entity that assigned itself as this callbackHandler's delegate, it will be called every time this `onUpdateResources` method is, allowing that entity to react to resource updates and do whatever they want.
delegate?.didUpdateResources(resourceList)
let addresses4 =
self.adapter?.lastNetworkSettings?.ipv4Settings?.addresses ?? ["100.100.111.2"]
let addresses6 =
self.adapter?.lastNetworkSettings?.ipv6Settings?.addresses ?? [
"fd00:0222:2021:1111::2"
]
// TODO: Use actual passed in resources to achieve split tunnel
let ipv4Routes = [NEIPv4Route(destinationAddress: "100.64.0.0", subnetMask: "255.192.0.0")]
let ipv6Routes = [
NEIPv6Route(destinationAddress: "fd00:0222:2021:1111::0", networkPrefixLength: 64)
]
return setTunnelSettingsKeepingSomeExisting(
addresses4: addresses4, addresses6: addresses6, ipv4Routes: ipv4Routes, ipv6Routes: ipv6Routes
)
}
func onConnect(tunnelAddresses: TunnelAddresses) -> Bool {
let addresses4 = [tunnelAddresses.address4.toString()]
let addresses6 = [tunnelAddresses.address6.toString()]
let ipv4Routes =
Adapter.currentAdapter?.lastNetworkSettings?.ipv4Settings?.includedRoutes ?? []
let ipv6Routes =
Adapter.currentAdapter?.lastNetworkSettings?.ipv6Settings?.includedRoutes ?? []
return setTunnelSettingsKeepingSomeExisting(
addresses4: addresses4, addresses6: addresses6, ipv4Routes: ipv4Routes, ipv6Routes: ipv6Routes
func onConnect(tunnelAddresses: TunnelAddresses) {
delegate?.onConnect(
tunnelAddressIPv4: tunnelAddresses.address4.toString(),
tunnelAddressIPv6: tunnelAddresses.address6.toString()
)
}
func onDisconnect() {
// TODO: handle disconnect
}
private func setTunnelSettingsKeepingSomeExisting(
addresses4: [String], addresses6: [String], ipv4Routes: [NEIPv4Route], ipv6Routes: [NEIPv6Route]
) -> Bool {
let logger = Logger(subsystem: "dev.firezone.firezone", category: "packet-tunnel")
if self.adapter != nil {
do {
/* If the tunnel interface addresses are being updated, it's impossible for the tunnel to
stay up due to the way WireGuard works. Still, we try not to change the tunnel's routes
here Just In Case.
*/
try self.adapter!.setNetworkSettings(
self.adapter!.generateNetworkSettings(
addresses4: addresses4,
addresses6: addresses6,
ipv4Routes: ipv4Routes,
ipv6Routes: ipv6Routes
)
)
return true
} catch let error {
logger.log(level: .debug, "Error setting adapter settings: \(String(describing: error))")
return false
}
} else {
logger.log(level: .debug, "Adapter not initialized!")
return false
}
delegate?.onDisconnect()
}
func onError(error: SwiftConnlibError, error_type: SwiftErrorType) {
// TODO: handle/report errors
let logger = Logger(subsystem: "dev.firezone.firezone", category: "packet-tunnel")
logger.log(level: .error, "Internal connlib error: \(String(describing: error), privacy: .public)")
delegate?.onError(error: error, isRecoverable: error_type == .Recoverable)
}
}

View File

@@ -1,18 +1,9 @@
//
// connlib.h
// connlib
//
// Created by Jamil Bou Kheir on 4/3/23.
//
// Umbrella header for connlib
#import <Foundation/Foundation.h>
#ifndef connlib_h
#define connlib_h
//! Project version number for connlib.
FOUNDATION_EXPORT double connlibVersionNumber;
#include "Generated/SwiftBridgeCore.h"
#include "Generated/connlib-apple/connlib-apple.h"
//! Project version string for connlib.
FOUNDATION_EXPORT const unsigned char connlibVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <connlib/PublicHeader.h>
#import <connlib/BridgingHeader.h>
#endif

View File

@@ -4,12 +4,16 @@
# We call this from an Xcode run script.
##################################################
set -ex
set -e
if [[ $1 == "clean" ]]; then
echo "Skipping build during 'clean'"
exit 0
fi
# Default PLATFORM_NAME to macosx if not set.
: "${PLATFORM_NAME:=macosx}"
export PATH="$HOME/.cargo/bin:$PATH"
base_dir=$(xcrun --sdk $PLATFORM_NAME --show-sdk-path)
@@ -22,12 +26,36 @@ export INCLUDE_PATH="${base_dir}/usr/include"
export CFLAGS="-L ${LIBRARY_PATH} -I ${INCLUDE_PATH} -Qunused-arguments"
export RUSTFLAGS="-C link-arg=-F$base_dir/System/Library/Frameworks"
TARGETS=""
TARGETS=()
if [[ "$PLATFORM_NAME" = "macosx" ]]; then
TARGETS="aarch64-apple-darwin,x86_64-apple-darwin"
if [[ $CONFIGURATION == "Release" ]] || [[ -z "$NATIVE_ARCH" ]]; then
TARGETS=("aarch64-apple-darwin" "x86_64-apple-darwin")
else
if [[ $NATIVE_ARCH == "arm64" ]]; then
TARGETS=("aarch64-apple-darwin")
else
if [[ $NATIVE_ARCH == "x86_64" ]]; then
TARGETS=("x86_64-apple-darwin")
else
echo "Unsupported native arch for $PLATFORM_NAME: $NATIVE_ARCH"
fi
fi
fi
else
if [[ "$PLATFORM_NAME" = "iphonesimulator" ]]; then
TARGETS="aarch64-apple-ios-sim,x86_64-apple-ios"
if [[ $CONFIGURATION == "Release" ]] || [[ -z "$NATIVE_ARCH" ]]; then
TARGETS=("aarch64-apple-ios-sim" "x86_64-apple-ios")
else
if [[ $NATIVE_ARCH == "arm64" ]]; then
TARGETS=("aarch64-apple-ios-sim")
else
if [[ $NATIVE_ARCH == "x86_64" ]]; then
TARGETS=("x86_64-apple-ios")
else
echo "Unsupported native arch for $PLATFORM_NAME: $NATIVE_ARCH"
fi
fi
fi
else
if [[ "$PLATFORM_NAME" = "iphoneos" ]]; then
TARGETS="aarch64-apple-ios"
@@ -38,22 +66,29 @@ else
fi
fi
MESSAGE="Building Connlib"
if [[ -n "$CONNLIB_MOCK" ]]; then
LIPO_ARGS="--features mock"
MESSAGE="${MESSAGE} (mock)"
FEATURE_ARGS="--features mock"
fi
# if [ $ENABLE_PREVIEWS == "NO" ]; then
if [[ $CONFIGURATION == "Release" ]]; then
echo "${MESSAGE} for Release"
CONFIGURATION_ARGS="--release"
else
echo "${MESSAGE} for Debug"
fi
if [[ $CONFIGURATION == "Release" ]]; then
echo "BUILDING FOR RELEASE ($TARGETS)"
if [[ -n "$CONNLIB_TARGET_DIR" ]]; then
set -x
CARGO_TARGET_DIR=$CONNLIB_TARGET_DIR
set +x
fi
cargo lipo --release --manifest-path ./Cargo.toml --targets $TARGETS $LIPO_ARGS
else
echo "BUILDING FOR DEBUG ($TARGETS)"
cargo lipo --manifest-path ./Cargo.toml --targets $TARGETS $LIPO_ARGS
fi
# else
# echo "Skipping the script because of preview mode"
# fi
for target in "${TARGETS[@]}"
do
set -x
cargo build --target $target $FEATURE_ARGS $CONFIGURATION_ARGS
set +x
done

View File

@@ -1,29 +0,0 @@
# For more info:
# https://github.com/firezone/firezone-apple/blob/main/USING_UNRELEASED_CONNLIB.md
#!/bin/bash
set -ex
echo $SRC_ROOT
for sdk in macosx iphoneos; do
echo "Building for $sdk"
xcodebuild archive \
-scheme Connlib \
-destination "generic/platform=$sdk" \
-sdk $sdk \
-archivePath ./connlib-$sdk \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
done
rm -rf ./Connlib.xcframework
xcodebuild -create-xcframework \
-framework ./connlib-iphoneos.xcarchive/Products/Library/Frameworks/connlib.framework \
-framework ./connlib-macosx.xcarchive/Products/Library/Frameworks/connlib.framework \
-output ./Connlib.xcframework
echo "Build successful. Removing temporary archives"
rm -rf ./connlib-iphoneos.xcarchive
rm -rf ./connlib-macosx.xcarchive

View File

@@ -1,33 +0,0 @@
#!/bin/bash
set -ex
for sdk in macosx iphoneos iphonesimulator; do
echo "Building for $sdk"
xcodebuild archive \
-scheme Connlib \
-destination "generic/platform=$sdk" \
-sdk $sdk \
-archivePath ./connlib-$sdk \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
done
xcodebuild -create-xcframework \
-framework ./connlib-iphoneos.xcarchive/Products/Library/Frameworks/connlib.framework \
-framework ./connlib-iphonesimulator.xcarchive/Products/Library/Frameworks/connlib.framework \
-framework ./connlib-macosx.xcarchive/Products/Library/Frameworks/connlib.framework \
-output ./Connlib.xcframework
echo "Build successful. Removing temporary archives"
rm -rf ./connlib-iphoneos.xcarchive
rm -rf ./connlib-iphonesimulator.xcarchive
rm -rf ./connlib-macosx.xcarchive
echo "Computing checksum"
touch Package.swift
zip -r -y Connlib.xcframework.zip Connlib.xcframework
swift package compute-checksum Connlib.xcframework.zip > Connlib.xcframework.zip.checksum.txt
rm Package.swift
rm -rf Connlib.xcframework

View File

@@ -1,145 +1,14 @@
// Referenced from https://github.com/chinedufn/swift-bridge/blob/master/examples/rust-binary-calls-swift-package/build.rs
const XCODE_CONFIGURATION_ENV: &str = "CONFIGURATION";
use std::path::PathBuf;
use walkdir::WalkDir;
fn main() {
let out_dir = "Sources/Connlib/Generated";
static XCODE_CONFIGURATION_ENV: &str = "CONFIGURATION";
static SWIFT_PKG_NAME: &str = "Connlib";
static SWIFT_LIB_NAME: &str = "libConnlib.a";
static BRIDGE_SRCS: &[&str] = &["src/lib.rs"];
static BRIDGING_HEADER: &str = "BridgingHeader-SwiftPM.h";
static MACOSX_DEPLOYMENT_TARGET: &str = "12.4";
static IPHONEOS_DEPLOYMENT_TARGET: &str = "15.6";
mod sdk {
pub static MACOS: &str = "macosx";
pub static IOS: &str = "iphoneos";
pub static IOS_SIM: &str = "iphonesimulator";
}
struct Env {
swift_pkg_dir: PathBuf,
swift_src_dir: PathBuf,
bridge_dst_dir: PathBuf,
swift_built_lib_dir: PathBuf,
release: bool,
triple: String,
sdk: &'static str,
}
impl Env {
fn gather() -> Self {
let manifest_dir = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap());
let swift_pkg_dir = manifest_dir;
let swift_src_dir = swift_pkg_dir.join("Sources").join(SWIFT_PKG_NAME);
let bridge_dst_dir = swift_src_dir.join("Generated");
let release = std::env::var("PROFILE").unwrap() == "release";
let target = std::env::var("TARGET").unwrap();
let (triple, sdk) = match target.as_str() {
"aarch64-apple-darwin" => (
format!("arm64-apple-macosx{MACOSX_DEPLOYMENT_TARGET}"),
sdk::MACOS,
),
"x86_64-apple-darwin" => (
format!("x86_64-apple-macosx{MACOSX_DEPLOYMENT_TARGET}"),
sdk::MACOS,
),
"aarch64-apple-ios" => (
format!("arm64-apple-ios{IPHONEOS_DEPLOYMENT_TARGET}"),
sdk::IOS,
),
"aarch64-apple-ios-sim" => (
format!("arm64-apple-ios{IPHONEOS_DEPLOYMENT_TARGET}-simulator"),
sdk::IOS_SIM,
),
"x86_64-apple-ios" | "x86_64-apple-ios-sim" => (
format!("x86_64-apple-ios{IPHONEOS_DEPLOYMENT_TARGET}-simulator"),
sdk::IOS_SIM,
),
_ => todo!("unsupported target triple: {target:?}"),
};
let swift_built_lib_dir = swift_pkg_dir.join(".build").join(&triple).join(if release {
"release"
} else {
"debug"
});
Self {
swift_pkg_dir,
swift_src_dir,
bridge_dst_dir,
swift_built_lib_dir,
release,
triple,
sdk,
}
let bridges = vec!["src/lib.rs"];
for path in &bridges {
println!("cargo:rerun-if-changed={}", path);
}
}
println!("cargo:rerun-if-env-changed={}", XCODE_CONFIGURATION_ENV);
fn gen_bridges(env: &Env) {
for path in BRIDGE_SRCS {
println!("cargo:rerun-if-changed={path}");
}
swift_bridge_build::parse_bridges(BRIDGE_SRCS)
.write_all_concatenated(&env.bridge_dst_dir, env!("CARGO_PKG_NAME"));
}
// We use `swiftc` instead of SwiftPM/`swift build` because of this limitation:
// https://github.com/apple/swift-package-manager/pull/6572
fn compile_swift(env: &Env) -> anyhow::Result<()> {
let swift_sdk = diva::Command::parse("xcrun --show-sdk-path --sdk")
.with_arg(env.sdk)
.run_and_wait_for_trimmed()?;
let swift_src_files = WalkDir::new(&env.swift_src_dir)
.into_iter()
.filter_map(Result::ok)
.filter_map(|entry| {
(entry.path().extension() == Some("swift".as_ref())).then(|| entry.path().to_owned())
});
std::fs::create_dir_all(&env.swift_built_lib_dir)?;
diva::Command::parse("swiftc -emit-library -static")
.with_args(["-module-name", SWIFT_PKG_NAME])
.with_arg("-import-objc-header")
.with_arg(env.swift_src_dir.join(BRIDGING_HEADER))
.with_arg("-sdk")
.with_arg(swift_sdk)
.with_args(["-target", &env.triple])
// https://github.com/apple/swift-package-manager/blob/55006dce81ae70cd8f2b78479038423eeebde1e4/Documentation/Usage.md#setting-the-build-configuration
.with_parsed_args(if !env.release {
"-Onone -g -enable-testing"
} else {
"-O -whole-module-optimization"
})
.with_arg("-o")
.with_arg(env.swift_built_lib_dir.join(SWIFT_LIB_NAME))
.with_args(swift_src_files)
.with_cwd(&env.swift_pkg_dir)
.run_and_wait()?;
Ok(())
}
fn link_swift(env: &Env) {
println!("cargo:rustc-link-lib=static={SWIFT_PKG_NAME}");
println!(
"cargo:rustc-link-search={}",
env.swift_built_lib_dir.display()
);
let xcode_path = diva::Command::parse("xcode-select --print-path")
.run_and_wait_for_trimmed()
.unwrap_or_else(|_| "/Applications/Xcode.app/Contents/Developer".to_owned());
println!("cargo:rustc-link-search={xcode_path}/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/");
println!("cargo:rustc-link-search=/usr/lib/swift");
}
fn main() -> anyhow::Result<()> {
// Early exit build script to avoid errors on non-Apple platforms.
if std::env::var("CARGO_CFG_TARGET_VENDOR").as_deref() != Ok("apple") {
return Ok(());
}
println!("cargo:rerun-if-env-changed={XCODE_CONFIGURATION_ENV}");
let env = Env::gather();
gen_bridges(&env);
compile_swift(&env)?;
link_swift(&env);
Ok(())
swift_bridge_build::parse_bridges(bridges)
.write_all_concatenated(out_dir, env!("CARGO_PKG_NAME"));
}

View File

@@ -1,466 +0,0 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 56;
objects = {
/* Begin PBXBuildFile section */
1DAA1D872A3142BC00D84E07 /* BridgingHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DAA1D862A3142BC00D84E07 /* BridgingHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };
8D46EDDF29DBC29800FF01CA /* Adapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D46EDD729DBC29800FF01CA /* Adapter.swift */; };
8D46EDE029DBC29800FF01CA /* CallbackHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D46EDD829DBC29800FF01CA /* CallbackHandler.swift */; };
8D967B2B29DBA064000B9D58 /* libconnlib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D967B2A29DBA03F000B9D58 /* libconnlib.a */; };
8DA207F829DBD80C00703A4A /* connlib-apple.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DA207F329DBD80C00703A4A /* connlib-apple.swift */; };
8DA207F929DBD80C00703A4A /* connlib-apple.h in Headers */ = {isa = PBXBuildFile; fileRef = 8DA207F429DBD80C00703A4A /* connlib-apple.h */; settings = {ATTRIBUTES = (Public, ); }; };
8DA207FA29DBD80C00703A4A /* .gitignore in Resources */ = {isa = PBXBuildFile; fileRef = 8DA207F529DBD80C00703A4A /* .gitignore */; };
8DA207FC29DBD80C00703A4A /* SwiftBridgeCore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DA207F729DBD80C00703A4A /* SwiftBridgeCore.swift */; };
8DA207FD29DBD86100703A4A /* SwiftBridgeCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 8DA207F629DBD80C00703A4A /* SwiftBridgeCore.h */; settings = {ATTRIBUTES = (Public, ); }; };
8DA207FE29DBD86100703A4A /* connlib.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D4BADD129DBD6CC00940F0D /* connlib.h */; settings = {ATTRIBUTES = (Public, ); }; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
1DAA1D862A3142BC00D84E07 /* BridgingHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BridgingHeader.h; sourceTree = "<group>"; };
8D209DCE29DBE96B00B68D27 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.4.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; };
8D46EDD729DBC29800FF01CA /* Adapter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Adapter.swift; sourceTree = "<group>"; };
8D46EDD829DBC29800FF01CA /* CallbackHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallbackHandler.swift; sourceTree = "<group>"; };
8D4BADD129DBD6CC00940F0D /* connlib.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = connlib.h; sourceTree = "<group>"; };
8D7D983129DB8437007B8198 /* connlib.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = connlib.framework; sourceTree = BUILT_PRODUCTS_DIR; };
8D967B2629DB9A3B000B9D58 /* build-rust.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "build-rust.sh"; sourceTree = "<group>"; };
8D967B2A29DBA03F000B9D58 /* libconnlib.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libconnlib.a; path = ../../target/universal/debug/libconnlib.a; sourceTree = "<group>"; };
8DA207F329DBD80C00703A4A /* connlib-apple.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "connlib-apple.swift"; sourceTree = "<group>"; };
8DA207F429DBD80C00703A4A /* connlib-apple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "connlib-apple.h"; sourceTree = "<group>"; };
8DA207F529DBD80C00703A4A /* .gitignore */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .gitignore; sourceTree = "<group>"; };
8DA207F629DBD80C00703A4A /* SwiftBridgeCore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SwiftBridgeCore.h; sourceTree = "<group>"; };
8DA207F729DBD80C00703A4A /* SwiftBridgeCore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftBridgeCore.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
8D7D982E29DB8437007B8198 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
8D967B2B29DBA064000B9D58 /* libconnlib.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
8D46EDCE29DBC29800FF01CA /* Connlib */ = {
isa = PBXGroup;
children = (
8DA207F129DBD80C00703A4A /* Generated */,
8D4BADD129DBD6CC00940F0D /* connlib.h */,
1DAA1D862A3142BC00D84E07 /* BridgingHeader.h */,
8D46EDD729DBC29800FF01CA /* Adapter.swift */,
8D46EDD829DBC29800FF01CA /* CallbackHandler.swift */,
);
path = Connlib;
sourceTree = "<group>";
};
8D7D982729DB8437007B8198 = {
isa = PBXGroup;
children = (
8D967B3E29DBA34C000B9D58 /* Tests */,
8D967B3D29DBA344000B9D58 /* Sources */,
8D967B2629DB9A3B000B9D58 /* build-rust.sh */,
8D7D983229DB8437007B8198 /* Products */,
8D967B2929DBA03F000B9D58 /* Frameworks */,
);
sourceTree = "<group>";
};
8D7D983229DB8437007B8198 /* Products */ = {
isa = PBXGroup;
children = (
8D7D983129DB8437007B8198 /* connlib.framework */,
);
name = Products;
sourceTree = "<group>";
};
8D967B2929DBA03F000B9D58 /* Frameworks */ = {
isa = PBXGroup;
children = (
8D209DCE29DBE96B00B68D27 /* Security.framework */,
8D967B2A29DBA03F000B9D58 /* libconnlib.a */,
);
name = Frameworks;
sourceTree = "<group>";
};
8D967B3D29DBA344000B9D58 /* Sources */ = {
isa = PBXGroup;
children = (
8D46EDCE29DBC29800FF01CA /* Connlib */,
);
path = Sources;
sourceTree = "<group>";
};
8D967B3E29DBA34C000B9D58 /* Tests */ = {
isa = PBXGroup;
children = (
);
path = Tests;
sourceTree = "<group>";
};
8DA207F129DBD80C00703A4A /* Generated */ = {
isa = PBXGroup;
children = (
8DA207F229DBD80C00703A4A /* connlib-apple */,
8DA207F529DBD80C00703A4A /* .gitignore */,
8DA207F629DBD80C00703A4A /* SwiftBridgeCore.h */,
8DA207F729DBD80C00703A4A /* SwiftBridgeCore.swift */,
);
path = Generated;
sourceTree = "<group>";
};
8DA207F229DBD80C00703A4A /* connlib-apple */ = {
isa = PBXGroup;
children = (
8DA207F329DBD80C00703A4A /* connlib-apple.swift */,
8DA207F429DBD80C00703A4A /* connlib-apple.h */,
);
path = "connlib-apple";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
8D7D982C29DB8437007B8198 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
8DA207F929DBD80C00703A4A /* connlib-apple.h in Headers */,
1DAA1D872A3142BC00D84E07 /* BridgingHeader.h in Headers */,
8DA207FD29DBD86100703A4A /* SwiftBridgeCore.h in Headers */,
8DA207FE29DBD86100703A4A /* connlib.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
8D7D983029DB8437007B8198 /* connlib */ = {
isa = PBXNativeTarget;
buildConfigurationList = 8D7D984529DB8437007B8198 /* Build configuration list for PBXNativeTarget "connlib" */;
buildPhases = (
8D7D982C29DB8437007B8198 /* Headers */,
8D967B2829DB9A91000B9D58 /* ShellScript */,
8D7D982D29DB8437007B8198 /* Sources */,
8D7D982E29DB8437007B8198 /* Frameworks */,
8D7D982F29DB8437007B8198 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = connlib;
productName = connlib;
productReference = 8D7D983129DB8437007B8198 /* connlib.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
8D7D982829DB8437007B8198 /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 1430;
LastUpgradeCheck = 1430;
TargetAttributes = {
8D7D983029DB8437007B8198 = {
CreatedOnToolsVersion = 14.3;
};
};
};
buildConfigurationList = 8D7D982B29DB8437007B8198 /* Build configuration list for PBXProject "connlib" */;
compatibilityVersion = "Xcode 14.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 8D7D982729DB8437007B8198;
productRefGroup = 8D7D983229DB8437007B8198 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
8D7D983029DB8437007B8198 /* connlib */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
8D7D982F29DB8437007B8198 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8DA207FA29DBD80C00703A4A /* .gitignore in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
8D967B2829DB9A91000B9D58 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "./build-rust.sh\n";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
8D7D982D29DB8437007B8198 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8DA207F829DBD80C00703A4A /* connlib-apple.swift in Sources */,
8D46EDDF29DBC29800FF01CA /* Adapter.swift in Sources */,
8D46EDE029DBC29800FF01CA /* CallbackHandler.swift in Sources */,
8DA207FC29DBD80C00703A4A /* SwiftBridgeCore.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
8D7D984329DB8437007B8198 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
8D7D984429DB8437007B8198 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
8D7D984629DB8437007B8198 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 15.6;
LD_RUNPATH_SEARCH_PATHS = (
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
"LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = (
"@executable_path/../Frameworks",
"@loader_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/../../../target/universal/debug";
MACOSX_DEPLOYMENT_TARGET = 12.4;
MARKETING_VERSION = 1.0;
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20";
PRODUCT_BUNDLE_IDENTIFIER = dev.firezone.connlib;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = auto;
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
8D7D984729DB8437007B8198 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 15.6;
LD_RUNPATH_SEARCH_PATHS = (
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
"LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = (
"@executable_path/../Frameworks",
"@loader_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = (
"$(PROJECT_DIR)/../../../target/universal/release",
"$(PROJECT_DIR)/../../../target/universal/debug",
);
MACOSX_DEPLOYMENT_TARGET = 12.4;
MARKETING_VERSION = 1.0;
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20";
PRODUCT_BUNDLE_IDENTIFIER = dev.firezone.connlib;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = auto;
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
8D7D982B29DB8437007B8198 /* Build configuration list for PBXProject "connlib" */ = {
isa = XCConfigurationList;
buildConfigurations = (
8D7D984329DB8437007B8198 /* Debug */,
8D7D984429DB8437007B8198 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
8D7D984529DB8437007B8198 /* Build configuration list for PBXNativeTarget "connlib" */ = {
isa = XCConfigurationList;
buildConfigurations = (
8D7D984629DB8437007B8198 /* Debug */,
8D7D984729DB8437007B8198 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 8D7D982829DB8437007B8198 /* Project object */;
}

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@@ -1,66 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1430"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8D7D983029DB8437007B8198"
BuildableName = "connlib.framework"
BlueprintName = "connlib"
ReferencedContainer = "container:connlib.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8D7D983029DB8437007B8198"
BuildableName = "connlib.framework"
BlueprintName = "connlib"
ReferencedContainer = "container:connlib.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -5,4 +5,5 @@ DerivedData/
xcuserdata/
**/*.xcuserstate
Firezone/Developer.xcconfig
Firezone/xcconfig/Developer.xcconfig
FirezoneNetworkExtension/Connlib

View File

@@ -14,6 +14,15 @@
05CF1D16290B1FE700CF4755 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05833DFA28F73B070008FAB0 /* PacketTunnelProvider.swift */; };
05CF1D17290B1FE700CF4755 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05833DFA28F73B070008FAB0 /* PacketTunnelProvider.swift */; };
05D3BB2128FDE9C000BC3727 /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05D3BB1628FDBD8A00BC3727 /* NetworkExtension.framework */; };
6F68E44C2A588522003C7D08 /* AllConfigs.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 6F68E44B2A588522003C7D08 /* AllConfigs.xcconfig */; };
6FE454F62A5BFB93006549B1 /* Adapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FE454EA2A5BFABA006549B1 /* Adapter.swift */; };
6FE454F72A5BFB93006549B1 /* Adapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FE454EA2A5BFABA006549B1 /* Adapter.swift */; };
6FE455092A5D110D006549B1 /* CallbackHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FE455082A5D110D006549B1 /* CallbackHandler.swift */; };
6FE4550A2A5D110D006549B1 /* CallbackHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FE455082A5D110D006549B1 /* CallbackHandler.swift */; };
6FE4550C2A5D111E006549B1 /* SwiftBridgeCore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FE4550B2A5D111D006549B1 /* SwiftBridgeCore.swift */; };
6FE4550D2A5D111E006549B1 /* SwiftBridgeCore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FE4550B2A5D111D006549B1 /* SwiftBridgeCore.swift */; };
6FE4550F2A5D112C006549B1 /* connlib-apple.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FE4550E2A5D112C006549B1 /* connlib-apple.swift */; };
6FE455102A5D112C006549B1 /* connlib-apple.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FE4550E2A5D112C006549B1 /* connlib-apple.swift */; };
794C38152970A2660029F38F /* FirezoneKit in Frameworks */ = {isa = PBXBuildFile; productRef = 794C38142970A2660029F38F /* FirezoneKit */; };
794C38172970A26A0029F38F /* FirezoneKit in Frameworks */ = {isa = PBXBuildFile; productRef = 794C38162970A26A0029F38F /* FirezoneKit */; };
79756C6629704A7A0018E2D5 /* FirezoneKit in Frameworks */ = {isa = PBXBuildFile; productRef = 79756C6529704A7A0018E2D5 /* FirezoneKit */; };
@@ -37,6 +46,20 @@
remoteGlobalIDString = 05CF1D02290B1DCD00CF4755;
remoteInfo = FirezoneNetworkExtensionmacOS;
};
6F3E231B2A5DC0DB00737CF1 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 8DCC021128D512AC007E12D2 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 6FE454BC2A5BC5F3006549B1;
remoteInfo = "Build Connlib";
};
6F3E231D2A5DC0DF00737CF1 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 8DCC021128D512AC007E12D2 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 6FE454BC2A5BC5F3006549B1;
remoteInfo = "Build Connlib";
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
@@ -73,8 +96,12 @@
05CF1CF6290B1CEE00CF4755 /* FirezoneNetworkExtension_iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = FirezoneNetworkExtension_iOS.entitlements; sourceTree = "<group>"; };
05CF1D03290B1DCD00CF4755 /* FirezoneNetworkExtensionmacOS.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = FirezoneNetworkExtensionmacOS.appex; sourceTree = BUILT_PRODUCTS_DIR; };
05D3BB1628FDBD8A00BC3727 /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; };
79BA2AF229A00F8800A2E6DC /* Developer.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Developer.xcconfig; sourceTree = "<group>"; };
79C88B24296F494500261800 /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = "<group>"; };
6F68E44B2A588522003C7D08 /* AllConfigs.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = AllConfigs.xcconfig; path = xcconfig/AllConfigs.xcconfig; sourceTree = "<group>"; };
6FE454EA2A5BFABA006549B1 /* Adapter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Adapter.swift; sourceTree = "<group>"; };
6FE455082A5D110D006549B1 /* CallbackHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CallbackHandler.swift; path = Connlib/CallbackHandler.swift; sourceTree = "<group>"; };
6FE4550B2A5D111D006549B1 /* SwiftBridgeCore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftBridgeCore.swift; path = Connlib/Generated/SwiftBridgeCore.swift; sourceTree = "<group>"; };
6FE4550E2A5D112C006549B1 /* connlib-apple.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "connlib-apple.swift"; path = "Connlib/Generated/connlib-apple/connlib-apple.swift"; sourceTree = "<group>"; };
6FE455112A5D13A2006549B1 /* FirezoneNetworkExtension-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "FirezoneNetworkExtension-Bridging-Header.h"; sourceTree = "<group>"; };
8DCC021928D512AC007E12D2 /* Firezone.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Firezone.app; sourceTree = BUILT_PRODUCTS_DIR; };
8DCC021C28D512AC007E12D2 /* FirezoneApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirezoneApp.swift; sourceTree = "<group>"; };
8DCC022528D512AE007E12D2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
@@ -128,6 +155,11 @@
05CF1CF6290B1CEE00CF4755 /* FirezoneNetworkExtension_iOS.entitlements */,
05CF1CDE290B1A9000CF4755 /* FirezoneNetworkExtension_macOS.entitlements */,
05833DFA28F73B070008FAB0 /* PacketTunnelProvider.swift */,
6FE454EA2A5BFABA006549B1 /* Adapter.swift */,
6FE455082A5D110D006549B1 /* CallbackHandler.swift */,
6FE4550B2A5D111D006549B1 /* SwiftBridgeCore.swift */,
6FE4550E2A5D112C006549B1 /* connlib-apple.swift */,
6FE455112A5D13A2006549B1 /* FirezoneNetworkExtension-Bridging-Header.h */,
);
path = FirezoneNetworkExtension;
sourceTree = "<group>";
@@ -173,10 +205,9 @@
8DCC021B28D512AC007E12D2 /* Firezone */ = {
isa = PBXGroup;
children = (
6F68E44B2A588522003C7D08 /* AllConfigs.xcconfig */,
05E1505F28FF398000170F82 /* Application */,
8DCC022528D512AE007E12D2 /* Assets.xcassets */,
79C88B24296F494500261800 /* Config.xcconfig */,
79BA2AF229A00F8800A2E6DC /* Developer.xcconfig */,
8DCC022728D512AE007E12D2 /* Firezone.entitlements */,
05CF1C39290995DA00CF4755 /* Info.plist */,
8DCC022828D512AE007E12D2 /* Preview Content */,
@@ -202,11 +233,29 @@
};
/* End PBXGroup section */
/* Begin PBXLegacyTarget section */
6FE454BC2A5BC5F3006549B1 /* Build Connlib */ = {
isa = PBXLegacyTarget;
buildArgumentsString = "$(ACTION)";
buildConfigurationList = 6FE454BD2A5BC5F3006549B1 /* Build configuration list for PBXLegacyTarget "Build Connlib" */;
buildPhases = (
);
buildToolPath = "${CONNLIB_SOURCE_DIR}/build-rust.sh";
buildWorkingDirectory = "${CONNLIB_SOURCE_DIR}";
dependencies = (
);
name = "Build Connlib";
passBuildSettingsInEnvironment = 1;
productName = "Build Connlib";
};
/* End PBXLegacyTarget section */
/* Begin PBXNativeTarget section */
05CF1CEF290B1CEE00CF4755 /* FirezoneNetworkExtensioniOS */ = {
isa = PBXNativeTarget;
buildConfigurationList = 05CF1CFA290B1CEE00CF4755 /* Build configuration list for PBXNativeTarget "FirezoneNetworkExtensioniOS" */;
buildPhases = (
6F3E231A2A5D830D00737CF1 /* Copy Connlib Headers and Swift Files */,
05CF1CEC290B1CEE00CF4755 /* Sources */,
05CF1CED290B1CEE00CF4755 /* Frameworks */,
05CF1CEE290B1CEE00CF4755 /* Resources */,
@@ -214,6 +263,7 @@
buildRules = (
);
dependencies = (
6F3E231C2A5DC0DB00737CF1 /* PBXTargetDependency */,
);
name = FirezoneNetworkExtensioniOS;
packageProductDependencies = (
@@ -227,6 +277,7 @@
isa = PBXNativeTarget;
buildConfigurationList = 05CF1D0D290B1DCD00CF4755 /* Build configuration list for PBXNativeTarget "FirezoneNetworkExtensionmacOS" */;
buildPhases = (
6F3E23192A5D823500737CF1 /* Copy Connlib Headers and Swift Files */,
05CF1CFF290B1DCD00CF4755 /* Sources */,
05CF1D00290B1DCD00CF4755 /* Frameworks */,
05CF1D01290B1DCD00CF4755 /* Resources */,
@@ -234,6 +285,7 @@
buildRules = (
);
dependencies = (
6F3E231E2A5DC0DF00737CF1 /* PBXTargetDependency */,
);
name = FirezoneNetworkExtensionmacOS;
packageProductDependencies = (
@@ -279,9 +331,14 @@
TargetAttributes = {
05CF1CEF290B1CEE00CF4755 = {
CreatedOnToolsVersion = 14.0.1;
LastSwiftMigration = 1430;
};
05CF1D02290B1DCD00CF4755 = {
CreatedOnToolsVersion = 14.0.1;
LastSwiftMigration = 1430;
};
6FE454BC2A5BC5F3006549B1 = {
CreatedOnToolsVersion = 14.3;
};
8DCC021828D512AC007E12D2 = {
CreatedOnToolsVersion = 14.0;
@@ -307,6 +364,7 @@
8DCC021828D512AC007E12D2 /* Firezone */,
05CF1CEF290B1CEE00CF4755 /* FirezoneNetworkExtensioniOS */,
05CF1D02290B1DCD00CF4755 /* FirezoneNetworkExtensionmacOS */,
6FE454BC2A5BC5F3006549B1 /* Build Connlib */,
);
};
/* End PBXProject section */
@@ -332,17 +390,67 @@
files = (
8DCC022A28D512AE007E12D2 /* Preview Assets.xcassets in Resources */,
8DCC022628D512AE007E12D2 /* Assets.xcassets in Resources */,
6F68E44C2A588522003C7D08 /* AllConfigs.xcconfig in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
6F3E23192A5D823500737CF1 /* Copy Connlib Headers and Swift Files */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Copy Connlib Headers and Swift Files";
outputFileListPaths = (
"$(SRCROOT)/FirezoneNetworkExtension/Connlib.xcfilelist",
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n./copy_generated_connlib_files.sh\n";
showEnvVarsInLog = 0;
};
6F3E231A2A5D830D00737CF1 /* Copy Connlib Headers and Swift Files */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Copy Connlib Headers and Swift Files";
outputFileListPaths = (
"$(SRCROOT)/FirezoneNetworkExtension/Connlib.xcfilelist",
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n./copy_generated_connlib_files.sh\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
05CF1CEC290B1CEE00CF4755 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
6FE455092A5D110D006549B1 /* CallbackHandler.swift in Sources */,
6FE4550F2A5D112C006549B1 /* connlib-apple.swift in Sources */,
05CF1D17290B1FE700CF4755 /* PacketTunnelProvider.swift in Sources */,
6FE454F62A5BFB93006549B1 /* Adapter.swift in Sources */,
6FE4550C2A5D111E006549B1 /* SwiftBridgeCore.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -350,7 +458,11 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
6FE4550A2A5D110D006549B1 /* CallbackHandler.swift in Sources */,
6FE455102A5D112C006549B1 /* connlib-apple.swift in Sources */,
05CF1D16290B1FE700CF4755 /* PacketTunnelProvider.swift in Sources */,
6FE454F72A5BFB93006549B1 /* Adapter.swift in Sources */,
6FE4550D2A5D111E006549B1 /* SwiftBridgeCore.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -379,12 +491,23 @@
target = 05CF1D02290B1DCD00CF4755 /* FirezoneNetworkExtensionmacOS */;
targetProxy = 05CF1D0A290B1DCD00CF4755 /* PBXContainerItemProxy */;
};
6F3E231C2A5DC0DB00737CF1 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 6FE454BC2A5BC5F3006549B1 /* Build Connlib */;
targetProxy = 6F3E231B2A5DC0DB00737CF1 /* PBXContainerItemProxy */;
};
6F3E231E2A5DC0DF00737CF1 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 6FE454BC2A5BC5F3006549B1 /* Build Connlib */;
targetProxy = 6F3E231D2A5DC0DF00737CF1 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
05CF1CFB290B1CEE00CF4755 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = FirezoneNetworkExtension/FirezoneNetworkExtension_iOS.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
@@ -398,16 +521,24 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
"LIBRARY_SEARCH_PATHS[sdk=iphoneos*]" = "${CONNLIB_TARGET_DIR}/aarch64-apple-ios/debug";
"LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*]" = (
"${CONNLIB_TARGET_DIR}/aarch64-apple-ios-sim/debug",
"${CONNLIB_TARGET_DIR}/x86_64-apple-ios/debug",
);
MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)";
MARKETING_VERSION = 1.0;
ONLY_ACTIVE_ARCH = YES;
OTHER_LDFLAGS = "-lconnlib";
PRODUCT_BUNDLE_IDENTIFIER = "$(inherited).network-extension";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "FirezoneNetworkExtension/FirezoneNetworkExtension-Bridging-Header.h";
SWIFT_OBJC_INTERFACE_HEADER_NAME = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TVOS_DEPLOYMENT_TARGET = "";
@@ -418,6 +549,7 @@
05CF1CFC290B1CEE00CF4755 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = FirezoneNetworkExtension/FirezoneNetworkExtension_iOS.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
@@ -431,14 +563,21 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
"LIBRARY_SEARCH_PATHS[sdk=iphoneos*]" = "${CONNLIB_TARGET_DIR}/aarch64-apple-ios/release";
"LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*]" = (
"${CONNLIB_TARGET_DIR}/aarch64-apple-ios-sim/release",
"${CONNLIB_TARGET_DIR}/x86_64-apple-ios/release",
);
MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)";
MARKETING_VERSION = 1.0;
OTHER_LDFLAGS = "-lconnlib";
PRODUCT_BUNDLE_IDENTIFIER = "$(inherited).network-extension";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "FirezoneNetworkExtension/FirezoneNetworkExtension-Bridging-Header.h";
SWIFT_OBJC_INTERFACE_HEADER_NAME = "";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
@@ -451,6 +590,7 @@
05CF1D0E290B1DCD00CF4755 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = FirezoneNetworkExtension/FirezoneNetworkExtension_macOS.entitlements;
CODE_SIGN_IDENTITY = "-";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
@@ -468,14 +608,20 @@
"@executable_path/../Frameworks",
"@executable_path/../../../../Frameworks",
);
"LIBRARY_SEARCH_PATHS[arch=arm64]" = "$(CONNLIB_TARGET_DIR)/aarch64-apple-darwin/debug";
"LIBRARY_SEARCH_PATHS[arch=arm64e]" = "$(CONNLIB_TARGET_DIR)/aarch64-apple-darwin/debug";
"LIBRARY_SEARCH_PATHS[arch=x86_64]" = "$(CONNLIB_TARGET_DIR)/x86_64-apple-darwin/debug";
MARKETING_VERSION = 1.0;
OTHER_LDFLAGS = "-lconnlib";
PRODUCT_BUNDLE_IDENTIFIER = "$(inherited).network-extension";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = macosx;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "FirezoneNetworkExtension/FirezoneNetworkExtension-Bridging-Header.h";
SWIFT_OBJC_INTERFACE_HEADER_NAME = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TVOS_DEPLOYMENT_TARGET = "";
WATCHOS_DEPLOYMENT_TARGET = "";
@@ -485,6 +631,7 @@
05CF1D0F290B1DCD00CF4755 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = FirezoneNetworkExtension/FirezoneNetworkExtension_macOS.entitlements;
CODE_SIGN_IDENTITY = "-";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
@@ -502,13 +649,18 @@
"@executable_path/../Frameworks",
"@executable_path/../../../../Frameworks",
);
"LIBRARY_SEARCH_PATHS[arch=arm64]" = "$(CONNLIB_TARGET_DIR)/aarch64-apple-darwin/release";
"LIBRARY_SEARCH_PATHS[arch=arm64e]" = "$(CONNLIB_TARGET_DIR)/aarch64-apple-darwin/release";
"LIBRARY_SEARCH_PATHS[arch=x86_64]" = "$(CONNLIB_TARGET_DIR)/x86_64-apple-darwin/release";
MARKETING_VERSION = 1.0;
OTHER_LDFLAGS = "-lconnlib";
PRODUCT_BUNDLE_IDENTIFIER = "$(inherited).network-extension";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = macosx;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "FirezoneNetworkExtension/FirezoneNetworkExtension-Bridging-Header.h";
SWIFT_OBJC_INTERFACE_HEADER_NAME = "";
SWIFT_VERSION = 5.0;
TVOS_DEPLOYMENT_TARGET = "";
@@ -516,9 +668,34 @@
};
name = Release;
};
6FE454BE2A5BC5F3006549B1 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
DEBUGGING_SYMBOLS = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
OTHER_CFLAGS = "";
OTHER_LDFLAGS = "";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
6FE454BF2A5BC5F3006549B1 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
OTHER_CFLAGS = "";
OTHER_LDFLAGS = "";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
8DCC024128D512AE007E12D2 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 79C88B24296F494500261800 /* Config.xcconfig */;
baseConfigurationReference = 6F68E44B2A588522003C7D08 /* AllConfigs.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
@@ -581,7 +758,7 @@
};
8DCC024228D512AE007E12D2 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 79C88B24296F494500261800 /* Config.xcconfig */;
baseConfigurationReference = 6F68E44B2A588522003C7D08 /* AllConfigs.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
@@ -758,6 +935,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
6FE454BD2A5BC5F3006549B1 /* Build configuration list for PBXLegacyTarget "Build Connlib" */ = {
isa = XCConfigurationList;
buildConfigurations = (
6FE454BE2A5BC5F3006549B1 /* Debug */,
6FE454BF2A5BC5F3006549B1 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
8DCC021428D512AC007E12D2 /* Build configuration list for PBXProject "Firezone" */ = {
isa = XCConfigurationList;
buildConfigurations = (

View File

@@ -1 +1,2 @@
#include "Developer.xcconfig"
#include "Build.xcconfig"

View File

@@ -0,0 +1,2 @@
CONNLIB_SOURCE_DIR=${PROJECT_DIR}/../../rust/connlib/clients/apple
CONNLIB_TARGET_DIR=${PROJECT_DIR}/../../rust/target

View File

@@ -5,3 +5,7 @@ DEVELOPMENT_TEAM = <team_id>
// Should be an app id created at developer.apple.com
// with Network Extensions capability.
PRODUCT_BUNDLE_IDENTIFIER = <app_id>
// If you want to build Connlib with mocks,
// enable it here.
// CONNLIB_MOCK=1

View File

@@ -9,7 +9,7 @@ let package = Package(
products: [
// Products define the executables and libraries a package produces, and make them visible to
// other packages.
.library(name: "FirezoneKit", targets: ["FirezoneKit", "Connlib"]),
.library(name: "FirezoneKit", targets: ["FirezoneKit"]),
],
dependencies: [
// Dependencies declare other packages that this package depends on.
@@ -18,10 +18,6 @@ let package = Package(
.package(url: "https://github.com/auth0/JWTDecode.swift", from: "3.0.0"),
],
targets: [
.binaryTarget(
name: "Connlib",
path: "../../../rust/connlib/clients/apple/Connlib.xcframework"
),
.target(
name: "FirezoneKit",
dependencies: [

View File

@@ -57,7 +57,8 @@ public class Adapter {
// There must be a better way than making this a static class var...
Self.currentAdapter = self
Self.callbackHandler = CallbackHandler(adapter: self)
Self.callbackHandler = CallbackHandler()
Self.callbackHandler?.delegate = self
}
deinit {
@@ -291,3 +292,74 @@ public class Adapter {
#endif
}
}
extension Adapter: CallbackHandlerDelegate {
public func onConnect(tunnelAddressIPv4: String, tunnelAddressIPv6: String) {
let addresses4 = [tunnelAddressIPv4]
let addresses6 = [tunnelAddressIPv6]
let ipv4Routes =
Adapter.currentAdapter?.lastNetworkSettings?.ipv4Settings?.includedRoutes ?? []
let ipv6Routes =
Adapter.currentAdapter?.lastNetworkSettings?.ipv6Settings?.includedRoutes ?? []
_ = setTunnelSettingsKeepingSomeExisting(
addresses4: addresses4, addresses6: addresses6, ipv4Routes: ipv4Routes, ipv6Routes: ipv6Routes
)
}
public func onUpdateResources(resourceList: String) {
let addresses4 =
self.lastNetworkSettings?.ipv4Settings?.addresses ?? ["100.100.111.2"]
let addresses6 =
self.lastNetworkSettings?.ipv6Settings?.addresses ?? [
"fd00:0222:2021:1111::2"
]
// TODO: Use actual passed in resources to achieve split tunnel
let ipv4Routes = [NEIPv4Route(destinationAddress: "100.64.0.0", subnetMask: "255.192.0.0")]
let ipv6Routes = [
NEIPv6Route(destinationAddress: "fd00:0222:2021:1111::0", networkPrefixLength: 64)
]
_ = setTunnelSettingsKeepingSomeExisting(
addresses4: addresses4, addresses6: addresses6, ipv4Routes: ipv4Routes, ipv6Routes: ipv6Routes
)
}
public func onDisconnect() {
// Unimplemented
}
public func onError(error: Error, isRecoverable: Bool) {
let logger = Logger(subsystem: "dev.firezone.firezone", category: "packet-tunnel")
logger.log(level: .error, "Internal connlib error: \(String(describing: error), privacy: .public)")
}
private func setTunnelSettingsKeepingSomeExisting(
addresses4: [String], addresses6: [String], ipv4Routes: [NEIPv4Route], ipv6Routes: [NEIPv6Route]
) -> Bool {
let logger = Logger(subsystem: "dev.firezone.firezone", category: "packet-tunnel")
do {
/* If the tunnel interface addresses are being updated, it's impossible for the tunnel to
stay up due to the way WireGuard works. Still, we try not to change the tunnel's routes
here Just In Case.
*/
try self.setNetworkSettings(
self.generateNetworkSettings(
addresses4: addresses4,
addresses6: addresses6,
ipv4Routes: ipv4Routes,
ipv6Routes: ipv6Routes
)
)
return true
} catch let error {
logger.log(level: .debug, "Error setting adapter settings: \(String(describing: error))")
return false
}
}
}

View File

@@ -0,0 +1,6 @@
$(PROJECT_DIR)/FirezoneNetworkExtension/Connlib/Generated/connlib-apple/connlib-apple.swift
$(PROJECT_DIR)/FirezoneNetworkExtension/Connlib/Generated/connlib-apple/connlib-apple.h
$(PROJECT_DIR)/FirezoneNetworkExtension/Connlib/Generated/SwiftBridgeCore.h
$(PROJECT_DIR)/FirezoneNetworkExtension/Connlib/Generated/SwiftBridgeCore.swift
$(PROJECT_DIR)/FirezoneNetworkExtension/Connlib/CallbackHandler.swift
$(PROJECT_DIR)/FirezoneNetworkExtension/Connlib/connlib.h

View File

@@ -0,0 +1,5 @@
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
#include "Connlib/connlib.h"

View File

@@ -4,7 +4,6 @@
// LICENSE: Apache-2.0
//
import connlib
import Dependencies
import NetworkExtension
import os

View File

@@ -2,33 +2,52 @@
Firezone app clients for macOS and iOS.
## Builidng
## Pre-requisites
Clone this repo:
- Rust
## Building
1. Clone this repo:
```bash
git clone https://github.com/firezone/firezone
```
2. `cd` to the Apple clients code
```bash
cd swift/apple
```
3. Rename and populate developer team ID file:
```bash
cp Firezone/xcconfig/Developer.xcconfig.template Firezone/xcconfig/Developer.xcconfig
vim Firezone/xcconfig/Developer.xcconfig
```
4. Open project in Xcode:
```bash
open Firezone.xcodeproj
```
Build the Firezone target
## Cleaning up
To cleanup Swift build objects:
```bash
git clone https://github.com/firezone/firezone
cd swift/apple
./cleanup.sh
```
Build Connlib:
```bash
cd rust/connlib/clients/apple
PLATFORM_NAME=macosx ./build-rust.sh # For macOS
PLATFORM_NAME=iphoneos ./build-rust.sh # For iOS
./build-xcframework-dev.sh
```
Rename and populate developer team ID file:
To cleanup both Swift and Rust build objects:
```bash
cp Firezone/Developer.xcconfig.template Firezone/Developer.xcconfig
vim Firezone/Developer.xcconfig
cd swift/apple
./cleanup.sh all
```
Open project in Xcode:
```bash
open Firezone.xcodeproj
```
Build the Firezone target

30
swift/apple/cleanup.sh Executable file
View File

@@ -0,0 +1,30 @@
#!/bin/bash
set -e
ARG=$1
if [[ -z "$ARG" ]]; then
ARG="swift"
fi
if [[ $ARG == "all" ]] || [[ $ARG == "swift" ]] || [[ $ARG == "rust" ]]; then
echo "Cleaning up $ARG build artifacts";
else
echo "Usage: $0 [ all | swift | rust ]"
echo " (Default: swift)"
fi
if [[ $ARG == "swift" ]] || [[ $ARG == "all" ]]; then
set -x
xcodebuild clean
rm -rf ./FirezoneNetworkExtension/Connlib
set +x
fi
if [[ $ARG == "rust" ]] || [[ $ARG == "all" ]]; then
set -x
cd ../../rust/connlib/clients/apple && cargo clean
cd Sources/Connlib/Generated && git clean -df
set +x
fi

View File

@@ -0,0 +1,23 @@
#!/bin/bash
##################################################
# We call this from an Xcode run script.
##################################################
set -e
if [[ $1 == "clean" ]]; then
echo "Skipping copy during 'clean'"
exit 0
fi
DEST=./FirezoneNetworkExtension/Connlib
if [[ -n "$CONNLIB_SOURCE_DIR" ]]; then
set -x
rm -rf ${DEST}
find ${CONNLIB_SOURCE_DIR}/Sources/Connlib
cp -r ${CONNLIB_SOURCE_DIR}/Sources/Connlib ${DEST}
set +x
else
echo "CONNLIB_SOURCE_DIR is not set. Is this being invoked from Xcode?"
fi