Skip to content

Commit f70b285

Browse files
authored
feat(cli): ensure mobile Rust targets are installed (#14093)
currently we only install Rust targets for mobile when initializing the projects. Users can commit the Android/iOS projects, so running the init command is not a requirement to develop mobile apps. This change ensures the Rust targets are installed before trying to compile them.
1 parent c23bec6 commit f70b285

File tree

7 files changed

+52
-3
lines changed

7 files changed

+52
-3
lines changed

.changes/ensure-targets-mobile.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@tauri-apps/cli": patch:enhance
3+
"tauri-cli": patch:enhance
4+
---
5+
6+
Ensure Rust targets for mobile are installed when running the dev and build commands (previously only checked on init).

crates/tauri-cli/src/mobile/android/android_studio_script.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,21 @@ pub fn command(options: Options) -> Result<()> {
132132

133133
let mut validated_lib = false;
134134

135+
let installed_targets =
136+
crate::interface::rust::installation::installed_targets().unwrap_or_default();
137+
135138
call_for_targets_with_fallback(
136139
options.targets.unwrap_or_default().iter(),
137140
&detect_target_ok,
138141
&env,
139142
|target: &Target| {
143+
if !installed_targets.contains(&target.triple().into()) {
144+
log::info!("Installing target {}", target.triple());
145+
target
146+
.install()
147+
.context("failed to install target with rustup")?;
148+
}
149+
140150
target.build(
141151
&config,
142152
&metadata,

crates/tauri-cli/src/mobile/android/build.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,15 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> {
167167

168168
crate::build::setup(&interface, &mut build_options, tauri_config.clone(), true)?;
169169

170+
let installed_targets =
171+
crate::interface::rust::installation::installed_targets().unwrap_or_default();
172+
173+
if !installed_targets.contains(&first_target.triple().into()) {
174+
log::info!("Installing target {}", first_target.triple());
175+
first_target
176+
.install()
177+
.context("failed to install target with rustup")?;
178+
}
170179
// run an initial build to initialize plugins
171180
first_target.build(&config, &metadata, &env, noise_level, true, profile)?;
172181

crates/tauri-cli/src/mobile/android/dev.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,12 +252,22 @@ fn run_dev(
252252

253253
configure_cargo(&mut env, config)?;
254254

255+
let installed_targets =
256+
crate::interface::rust::installation::installed_targets().unwrap_or_default();
257+
255258
// run an initial build to initialize plugins
256259
let target_triple = dev_options.target.as_ref().unwrap();
257260
let target = Target::all()
258261
.values()
259262
.find(|t| t.triple == target_triple)
260263
.unwrap_or_else(|| Target::all().values().next().unwrap());
264+
if !installed_targets.contains(&target.triple().into()) {
265+
log::info!("Installing target {}", target.triple());
266+
target
267+
.install()
268+
.context("failed to install target with rustup")?;
269+
}
270+
261271
target.build(
262272
config,
263273
metadata,

crates/tauri-cli/src/mobile/android/project.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@ pub fn gen(
4545
.collect::<Vec<&Target>>();
4646

4747
if !missing_targets.is_empty() {
48-
println!("Installing Android Rust toolchains...");
48+
log::info!("Installing Android Rust targets...");
4949
for target in missing_targets {
50+
log::info!("Installing target {}", target.triple());
5051
target
5152
.install()
5253
.context("failed to install target with rustup")?;

crates/tauri-cli/src/mobile/ios/project.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,9 @@ pub fn gen(
5050
.collect::<Vec<&Target>>();
5151

5252
if !missing_targets.is_empty() {
53-
println!("Installing iOS Rust toolchains...");
53+
log::info!("Installing iOS Rust targets...");
5454
for target in missing_targets {
55+
log::info!("Installing target {}", target.triple());
5556
target
5657
.install()
5758
.context("failed to install target with rustup")?;

crates/tauri-cli/src/mobile/ios/xcode_script.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::{
1111
};
1212

1313
use anyhow::Context;
14-
use cargo_mobile2::{apple::target::Target, opts::Profile};
14+
use cargo_mobile2::{apple::target::Target, opts::Profile, target::TargetTrait};
1515
use clap::{ArgAction, Parser};
1616
use object::{Object, ObjectSymbol};
1717

@@ -209,6 +209,10 @@ pub fn command(options: Options) -> Result<()> {
209209
} else {
210210
options.arches
211211
};
212+
213+
let installed_targets =
214+
crate::interface::rust::installation::installed_targets().unwrap_or_default();
215+
212216
for arch in arches {
213217
// Set target-specific flags
214218
let (env_triple, rust_triple) = match arch.as_str() {
@@ -251,6 +255,14 @@ pub fn command(options: Options) -> Result<()> {
251255
)
252256
})?
253257
};
258+
259+
if !installed_targets.contains(&rust_triple.into()) {
260+
log::info!("Installing target {}", target.triple());
261+
target
262+
.install()
263+
.context("failed to install target with rustup")?;
264+
}
265+
254266
target.compile_lib(
255267
&config,
256268
&metadata,

0 commit comments

Comments
 (0)