diff --git a/.changes/ensure-targets-mobile.md b/.changes/ensure-targets-mobile.md new file mode 100644 index 000000000..b4a091c6e --- /dev/null +++ b/.changes/ensure-targets-mobile.md @@ -0,0 +1,6 @@ +--- +"@tauri-apps/cli": patch:enhance +"tauri-cli": patch:enhance +--- + +Ensure Rust targets for mobile are installed when running the dev and build commands (previously only checked on init). diff --git a/crates/tauri-cli/src/mobile/android/android_studio_script.rs b/crates/tauri-cli/src/mobile/android/android_studio_script.rs index 7c9938852..65ffd61ec 100644 --- a/crates/tauri-cli/src/mobile/android/android_studio_script.rs +++ b/crates/tauri-cli/src/mobile/android/android_studio_script.rs @@ -132,11 +132,21 @@ pub fn command(options: Options) -> Result<()> { let mut validated_lib = false; + let installed_targets = + crate::interface::rust::installation::installed_targets().unwrap_or_default(); + call_for_targets_with_fallback( options.targets.unwrap_or_default().iter(), &detect_target_ok, &env, |target: &Target| { + if !installed_targets.contains(&target.triple().into()) { + log::info!("Installing target {}", target.triple()); + target + .install() + .context("failed to install target with rustup")?; + } + target.build( &config, &metadata, diff --git a/crates/tauri-cli/src/mobile/android/build.rs b/crates/tauri-cli/src/mobile/android/build.rs index 16a614cf2..e042979b9 100644 --- a/crates/tauri-cli/src/mobile/android/build.rs +++ b/crates/tauri-cli/src/mobile/android/build.rs @@ -167,6 +167,15 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { crate::build::setup(&interface, &mut build_options, tauri_config.clone(), true)?; + let installed_targets = + crate::interface::rust::installation::installed_targets().unwrap_or_default(); + + if !installed_targets.contains(&first_target.triple().into()) { + log::info!("Installing target {}", first_target.triple()); + first_target + .install() + .context("failed to install target with rustup")?; + } // run an initial build to initialize plugins first_target.build(&config, &metadata, &env, noise_level, true, profile)?; diff --git a/crates/tauri-cli/src/mobile/android/dev.rs b/crates/tauri-cli/src/mobile/android/dev.rs index a6d339884..c667e7a1c 100644 --- a/crates/tauri-cli/src/mobile/android/dev.rs +++ b/crates/tauri-cli/src/mobile/android/dev.rs @@ -252,12 +252,22 @@ fn run_dev( configure_cargo(&mut env, config)?; + let installed_targets = + crate::interface::rust::installation::installed_targets().unwrap_or_default(); + // run an initial build to initialize plugins let target_triple = dev_options.target.as_ref().unwrap(); let target = Target::all() .values() .find(|t| t.triple == target_triple) .unwrap_or_else(|| Target::all().values().next().unwrap()); + if !installed_targets.contains(&target.triple().into()) { + log::info!("Installing target {}", target.triple()); + target + .install() + .context("failed to install target with rustup")?; + } + target.build( config, metadata, diff --git a/crates/tauri-cli/src/mobile/android/project.rs b/crates/tauri-cli/src/mobile/android/project.rs index 144c20346..ee6f4df0d 100644 --- a/crates/tauri-cli/src/mobile/android/project.rs +++ b/crates/tauri-cli/src/mobile/android/project.rs @@ -45,8 +45,9 @@ pub fn gen( .collect::>(); if !missing_targets.is_empty() { - println!("Installing Android Rust toolchains..."); + log::info!("Installing Android Rust targets..."); for target in missing_targets { + log::info!("Installing target {}", target.triple()); target .install() .context("failed to install target with rustup")?; diff --git a/crates/tauri-cli/src/mobile/ios/project.rs b/crates/tauri-cli/src/mobile/ios/project.rs index 62eef4b78..9b4efec3e 100644 --- a/crates/tauri-cli/src/mobile/ios/project.rs +++ b/crates/tauri-cli/src/mobile/ios/project.rs @@ -50,8 +50,9 @@ pub fn gen( .collect::>(); if !missing_targets.is_empty() { - println!("Installing iOS Rust toolchains..."); + log::info!("Installing iOS Rust targets..."); for target in missing_targets { + log::info!("Installing target {}", target.triple()); target .install() .context("failed to install target with rustup")?; diff --git a/crates/tauri-cli/src/mobile/ios/xcode_script.rs b/crates/tauri-cli/src/mobile/ios/xcode_script.rs index 7b226d3c0..dc911f04b 100644 --- a/crates/tauri-cli/src/mobile/ios/xcode_script.rs +++ b/crates/tauri-cli/src/mobile/ios/xcode_script.rs @@ -11,7 +11,7 @@ use crate::{ }; use anyhow::Context; -use cargo_mobile2::{apple::target::Target, opts::Profile}; +use cargo_mobile2::{apple::target::Target, opts::Profile, target::TargetTrait}; use clap::{ArgAction, Parser}; use object::{Object, ObjectSymbol}; @@ -209,6 +209,10 @@ pub fn command(options: Options) -> Result<()> { } else { options.arches }; + + let installed_targets = + crate::interface::rust::installation::installed_targets().unwrap_or_default(); + for arch in arches { // Set target-specific flags let (env_triple, rust_triple) = match arch.as_str() { @@ -251,6 +255,14 @@ pub fn command(options: Options) -> Result<()> { ) })? }; + + if !installed_targets.contains(&rust_triple.into()) { + log::info!("Installing target {}", target.triple()); + target + .install() + .context("failed to install target with rustup")?; + } + target.compile_lib( &config, &metadata,