XCFramework build for apple (#93)

This commit is contained in:
Ebrahim Tahernejad 2024-02-29 07:08:44 +03:30 committed by GitHub
parent 01a0d9164d
commit 4ab6f1a9bc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 85 additions and 15 deletions

View file

@ -25,6 +25,12 @@ Clone the repository and `cd` into the project folder. Then run the following:
cargo build --release
```
### Building Framework for Apple Devices
To build an XCFramework for macOS and iOS, run the following:
```
./build-apple.sh
```
## Installation
### Install from binary

View file

@ -19,11 +19,11 @@
verbose:(bool)verbose {
ArgDns dns_strategy = dns_over_tcp ? OverTcp : Direct;
ArgVerbosity v = verbose ? Trace : Info;
tun2proxy_run_with_fd(proxy_url.UTF8String, tun_fd, tun_mtu, dns_strategy, v);
tun2proxy_with_fd_run(proxy_url.UTF8String, tun_fd, tun_mtu, dns_strategy, v);
}
+ (void)shutdown {
tun2proxy_stop();
tun2proxy_with_fd_stop();
}
@end

44
build-apple.sh Executable file
View file

@ -0,0 +1,44 @@
#! /bin/sh
echo "Setting up the rust environment..."
rustup target add aarch64-apple-ios aarch64-apple-ios-sim x86_64-apple-ios x86_64-apple-darwin aarch64-apple-darwin
cargo install cbindgen
echo "Building..."
cargo build --release --target x86_64-apple-darwin
cargo build --release --target aarch64-apple-darwin
cargo build --release --target aarch64-apple-ios
cargo build --release --target x86_64-apple-ios
cargo build --release --target aarch64-apple-ios-sim
echo "Generating includes..."
mkdir -p target/include/
cbindgen --config cbindgen.toml -l C -o target/include/tun2proxy.h
cat > target/include/module.modulemap <<EOF
framework module Tun2Proxy {
umbrella header "tun2proxy.h"
export *
module * { export * }
}
EOF
echo "lipo..."
echo "Simulator"
lipo -create \
target/aarch64-apple-ios-sim/release/libtun2proxy.a \
target/x86_64-apple-ios/release/libtun2proxy.a \
-output ./target/libtun2proxy-ios-sim.a
echo "MacOS"
lipo -create \
target/aarch64-apple-darwin/release/libtun2proxy.a \
target/x86_64-apple-darwin/release/libtun2proxy.a \
-output ./target/libtun2proxy-macos.a
echo "Creating XCFramework"
rm -rf ./target/Tun2Proxy.xcframework
xcodebuild -create-xcframework \
-library ./target/aarch64-apple-ios/release/libtun2proxy.a -headers ./target/include/ \
-library ./target/libtun2proxy-ios-sim.a -headers ./target/include/ \
-library ./target/libtun2proxy-macos.a -headers ./target/include/ \
-output ./target/Tun2Proxy.xcframework

View file

@ -1,8 +1,9 @@
[export]
include = [
"tun2proxy_run_with_fd",
"tun2proxy_run_with_name",
"tun2proxy_stop",
"tun2proxy_with_fd_run",
"tun2proxy_with_name_run",
"tun2proxy_with_name_stop",
"tun2proxy_with_fd_stop",
"tun2proxy_set_log_callback",
]
exclude = [

View file

@ -1,4 +1,4 @@
#![cfg(target_os = "ios")]
#![cfg(any(target_os = "ios", target_os = "macos"))]
use crate::{
args::{ArgDns, ArgProxy},
@ -9,8 +9,14 @@ use std::os::raw::{c_char, c_int, c_ushort};
/// # Safety
///
/// Run the tun2proxy component with some arguments.
/// Parameters:
/// - proxy_url: the proxy url, e.g. "socks5://127.0.0.1:1080"
/// - tun_fd: the tun file descriptor
/// - tun_mtu: the tun mtu
/// - dns_strategy: the dns strategy, see ArgDns enum
/// - verbosity: the verbosity level, see ArgVerbosity enum
#[no_mangle]
pub unsafe extern "C" fn tun2proxy_run_with_fd(
pub unsafe extern "C" fn tun2proxy_with_fd_run(
proxy_url: *const c_char,
tun_fd: c_int,
tun_mtu: c_ushort,
@ -33,6 +39,6 @@ pub unsafe extern "C" fn tun2proxy_run_with_fd(
///
/// Shutdown the tun2proxy component.
#[no_mangle]
pub unsafe extern "C" fn tun2proxy_stop() -> c_int {
pub unsafe extern "C" fn tun2proxy_with_fd_stop() -> c_int {
crate::mobile_api::mobile_stop()
}

View file

@ -13,8 +13,15 @@ static TUN_QUIT: std::sync::Mutex<Option<tokio_util::sync::CancellationToken>> =
/// # Safety
///
/// Run the tun2proxy component with some arguments.
/// Parameters:
/// - proxy_url: the proxy url, e.g. "socks5://127.0.0.1:1080"
/// - tun: the tun device name, e.g. "utun5"
/// - bypass: the bypass ip, e.g. "123.45.67.89"
/// - dns_strategy: the dns strategy, see ArgDns enum
/// - root_privilege: whether to run with root privilege
/// - verbosity: the verbosity level, see ArgVerbosity enum
#[no_mangle]
pub unsafe extern "C" fn tun2proxy_run_with_name(
pub unsafe extern "C" fn tun2proxy_with_name_run(
proxy_url: *const c_char,
tun: *const c_char,
bypass: *const c_char,
@ -142,7 +149,7 @@ pub async fn desktop_run_async(args: Args, shutdown_token: tokio_util::sync::Can
///
/// Shutdown the tun2proxy component.
#[no_mangle]
pub unsafe extern "C" fn tun2proxy_stop() -> c_int {
pub unsafe extern "C" fn tun2proxy_with_name_stop() -> c_int {
if let Ok(lock) = TUN_QUIT.lock() {
if let Some(shutdown_token) = lock.as_ref() {
shutdown_token.cancel();

View file

@ -29,7 +29,11 @@ pub use desktop_api::desktop_run_async;
#[cfg(any(target_os = "ios", target_os = "android"))]
pub use mobile_api::{desktop_run_async, mobile_run, mobile_stop};
#[cfg(target_os = "macos")]
pub use mobile_api::{mobile_run, mobile_stop};
mod android;
mod apple;
mod args;
mod desktop_api;
mod directions;
@ -37,7 +41,6 @@ mod dns;
mod dump_logger;
mod error;
mod http;
mod ios;
mod mobile_api;
mod proxy_handler;
mod session_info;

View file

@ -1,4 +1,4 @@
#![cfg(any(target_os = "ios", target_os = "android"))]
#![cfg(any(target_os = "ios", target_os = "android", target_os = "macos"))]
use crate::Args;
use std::os::raw::c_int;
@ -7,6 +7,7 @@ static TUN_QUIT: std::sync::Mutex<Option<tokio_util::sync::CancellationToken>> =
/// Dummy function to make the build pass.
#[doc(hidden)]
#[cfg(not(target_os = "macos"))]
pub async fn desktop_run_async(_: Args, _: tokio_util::sync::CancellationToken) -> std::io::Result<()> {
Ok(())
}
@ -28,11 +29,13 @@ pub fn mobile_run(args: Args, tun_mtu: u16) -> c_int {
#[cfg(unix)]
if let Some(fd) = args.tun_fd {
config.raw_fd(fd);
} else {
config.name(&args.tun);
} else if let Some(ref tun) = args.tun {
config.tun_name(tun);
}
#[cfg(windows)]
config.name(&args.tun);
if let Some(ref tun) = args.tun {
config.tun_name(tun);
}
let device = tun2::create_as_async(&config).map_err(std::io::Error::from)?;
let join_handle = tokio::spawn(crate::run(device, tun_mtu, args, shutdown_token));