Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(core&cli): activate default features in build script instead of CLI #11098

Closed
7 changes: 7 additions & 0 deletions .changes/feature-flags-build-script.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'tauri-cli': 'patch:enhance'
'@tauri-apps/cli': 'patch:enhance'
'tauri': 'patch:enhance'
---

Set Cargo feature flags in tauri build script instead of relying on the CLI.
3 changes: 2 additions & 1 deletion crates/tauri-cli/src/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,8 @@ pub fn setup(
.features
.get_or_insert(Vec::new())
.extend(config_.build.features.clone().unwrap_or_default());
interface.build_options(&mut options.args, &mut options.features, mobile);

interface.build_options(&mut options.args, mobile);

Ok(())
}
34 changes: 4 additions & 30 deletions crates/tauri-cli/src/interface/rust.rs
Original file line number Diff line number Diff line change
Expand Up @@ -362,29 +362,11 @@ fn lookup<F: FnMut(FileType, PathBuf)>(dir: &Path, mut f: F) {
}
}

fn shared_options(
mobile: bool,
args: &mut Vec<String>,
features: &mut Option<Vec<String>>,
app_settings: &RustAppSettings,
) {
fn shared_options(mobile: bool, args: &mut Vec<String>) {
if mobile {
args.push("--lib".into());
features
.get_or_insert(Vec::new())
.push("tauri/rustls-tls".into());
} else {
args.push("--bins".into());
let all_features = app_settings
.manifest
.lock()
.unwrap()
.all_enabled_features(if let Some(f) = features { f } else { &[] });
if !all_features.contains(&"tauri/rustls-tls".into()) {
features
.get_or_insert(Vec::new())
.push("tauri/native-tls".into());
}
}
}

Expand All @@ -408,7 +390,7 @@ fn dev_options(
}
*args = dev_args;

shared_options(mobile, args, features, app_settings);
shared_options(mobile, args);

if !args.contains(&"--no-default-features".into()) {
let manifest_features = app_settings.manifest.lock().unwrap().features();
Expand Down Expand Up @@ -479,16 +461,8 @@ fn get_watch_folders() -> crate::Result<Vec<PathBuf>> {
}

impl Rust {
pub fn build_options(
&self,
args: &mut Vec<String>,
features: &mut Option<Vec<String>>,
mobile: bool,
) {
features
.get_or_insert(Vec::new())
.push("tauri/custom-protocol".into());
shared_options(mobile, args, features, &self.app_settings);
pub fn build_options(&self, args: &mut Vec<String>, mobile: bool) {
shared_options(mobile, args);
}

fn run_dev<F: Fn(Option<i32>, ExitReason) + Send + Sync + 'static>(
Expand Down
15 changes: 13 additions & 2 deletions crates/tauri-cli/src/interface/rust/desktop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ fn build_dev_app<F: FnOnce(Option<i32>, ExitReason) + Send + 'static>(
config_features: Vec<String>,
on_exit: F,
) -> crate::Result<Arc<SharedChild>> {
let mut build_cmd = build_command(options, available_targets, config_features)?;
let mut build_cmd = build_command(options, available_targets, config_features, true)?;
let runner = build_cmd.get_program().to_string_lossy().into_owned();
build_cmd
.env(
Expand Down Expand Up @@ -267,7 +267,7 @@ fn build_production_app(
available_targets: &mut Option<Vec<RustupTarget>>,
config_features: Vec<String>,
) -> crate::Result<()> {
let mut build_cmd = build_command(options, available_targets, config_features)?;
let mut build_cmd = build_command(options, available_targets, config_features, false)?;
let runner = build_cmd.get_program().to_string_lossy().into_owned();
match build_cmd.piped() {
Ok(status) if status.success() => Ok(()),
Expand All @@ -289,6 +289,7 @@ fn build_command(
options: Options,
available_targets: &mut Option<Vec<RustupTarget>>,
config_features: Vec<String>,
dev: bool,
) -> crate::Result<Command> {
let runner = options.runner.unwrap_or_else(|| "cargo".into());

Expand All @@ -308,6 +309,16 @@ fn build_command(
if let Some(f) = options.features {
features.extend(f);
}
// custom-protocol is handled in tauri's build.rs script
// which makes `cargo build` same as `tauri dev`
// and `cargo build --release` same as `tauri build`
// but for `tauri build --debug` we need to build the code
// in `debug` profile and activate `custom-protocol` feature.
let custom_protocol_feat = "tauri/custom-protocol".to_string();
if !dev && !features.contains(&custom_protocol_feat) {
features.push(custom_protocol_feat);
}

if !features.is_empty() {
args.push("--features".into());
args.push(features.join(","));
Expand Down
2 changes: 1 addition & 1 deletion crates/tauri-cli/src/mobile/android/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> {
let tauri_config_ = tauri_config_guard.as_ref().unwrap();

let interface = AppInterface::new(tauri_config_, build_options.target.clone())?;
interface.build_options(&mut Vec::new(), &mut build_options.features, true);
interface.build_options(&mut Vec::new(), true);

let app = get_app(MobileTarget::Android, tauri_config_, &interface);
let (config, metadata) = get_config(
Expand Down
2 changes: 1 addition & 1 deletion crates/tauri-cli/src/mobile/ios/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> {
let tauri_config_ = tauri_config_guard.as_ref().unwrap();

let interface = AppInterface::new(tauri_config_, build_options.target.clone())?;
interface.build_options(&mut Vec::new(), &mut build_options.features, true);
interface.build_options(&mut Vec::new(), true);

let app = get_app(MobileTarget::Ios, tauri_config_, &interface);
let (config, _metadata) = get_config(
Expand Down
35 changes: 29 additions & 6 deletions crates/tauri/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -226,18 +226,41 @@ fn alias(alias: &str, has_feature: bool) {
}

fn main() {
let custom_protocol = has_feature("custom-protocol");
let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap();
let mobile = target_os == "ios" || target_os == "android";
alias("desktop", !mobile);
alias("mobile", mobile);

let has_default = has_feature("default");

// a workaround for default features activation based on target platform
// https://github.com/rust-lang/cargo/issues/1197
if has_default
&& ["native-tls", "native-tls-vendored", "rustls-tls"]
.iter()
.all(|f| !has_feature(f))
{
if mobile {
println!("cargo:rustc-cfg=feature=\"rustls-tls\"");
} else {
println!("cargo:rustc-cfg=feature=\"native-tls\"");
}
}

// a workaround for default features activation based on profile
let custom_protocol = if has_default && env::var("PROFILE").as_deref() == Ok("release") {
println!("cargo:rustc-cfg=feature=\"custom-protocol\"");
true
} else {
has_feature("custom-protocol")
};

let dev = !custom_protocol;
alias("custom_protocol", custom_protocol);
alias("dev", dev);

println!("cargo:dev={dev}");

let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap();
let mobile = target_os == "ios" || target_os == "android";
alias("desktop", !mobile);
alias("mobile", mobile);

let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());

let checked_features_out_path = out_dir.join("checked_features");
Expand Down
Loading