mirror of
https://github.com/tauri-apps/tauri.git
synced 2025-01-05 09:52:50 +03:00
Merge remote-tracking branch 'origin/dev' into next
This commit is contained in:
commit
11d50e8474
5
.changes/codegen-check-target.md
Normal file
5
.changes/codegen-check-target.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"tauri-codegen": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Use `TARGET` environment variable for code generation inside build scripts.
|
@ -28,6 +28,7 @@ pub struct ContextData {
|
|||||||
|
|
||||||
fn map_core_assets(
|
fn map_core_assets(
|
||||||
options: &AssetOptions,
|
options: &AssetOptions,
|
||||||
|
target: Target,
|
||||||
) -> impl Fn(&AssetKey, &Path, &mut Vec<u8>, &mut CspHashes) -> Result<(), EmbeddedAssetsError> {
|
) -> impl Fn(&AssetKey, &Path, &mut Vec<u8>, &mut CspHashes) -> Result<(), EmbeddedAssetsError> {
|
||||||
#[cfg(feature = "isolation")]
|
#[cfg(feature = "isolation")]
|
||||||
let pattern = tauri_utils::html::PatternObject::from(&options.pattern);
|
let pattern = tauri_utils::html::PatternObject::from(&options.pattern);
|
||||||
@ -40,8 +41,9 @@ fn map_core_assets(
|
|||||||
|
|
||||||
#[allow(clippy::collapsible_if)]
|
#[allow(clippy::collapsible_if)]
|
||||||
if csp {
|
if csp {
|
||||||
#[cfg(target_os = "linux")]
|
if target == Target::Linux {
|
||||||
::tauri_utils::html::inject_csp_token(&mut document);
|
::tauri_utils::html::inject_csp_token(&mut document);
|
||||||
|
}
|
||||||
|
|
||||||
inject_nonce_token(&mut document, &dangerous_disable_asset_csp_modification);
|
inject_nonce_token(&mut document, &dangerous_disable_asset_csp_modification);
|
||||||
|
|
||||||
@ -106,6 +108,16 @@ fn map_isolation(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(PartialEq, Eq, Clone, Copy)]
|
||||||
|
enum Target {
|
||||||
|
Linux,
|
||||||
|
Windows,
|
||||||
|
Darwin,
|
||||||
|
Android,
|
||||||
|
// iOS.
|
||||||
|
Ios,
|
||||||
|
}
|
||||||
|
|
||||||
/// Build a `tauri::Context` for including in application code.
|
/// Build a `tauri::Context` for including in application code.
|
||||||
pub fn context_codegen(data: ContextData) -> Result<TokenStream, EmbeddedAssetsError> {
|
pub fn context_codegen(data: ContextData) -> Result<TokenStream, EmbeddedAssetsError> {
|
||||||
let ContextData {
|
let ContextData {
|
||||||
@ -115,6 +127,34 @@ pub fn context_codegen(data: ContextData) -> Result<TokenStream, EmbeddedAssetsE
|
|||||||
root,
|
root,
|
||||||
} = data;
|
} = data;
|
||||||
|
|
||||||
|
let target = if let Ok(target) = std::env::var("TARGET") {
|
||||||
|
if target.contains("unknown-linux") {
|
||||||
|
Target::Linux
|
||||||
|
} else if target.contains("pc-windows") {
|
||||||
|
Target::Windows
|
||||||
|
} else if target.contains("apple-darwin") {
|
||||||
|
Target::Darwin
|
||||||
|
} else if target.contains("android") {
|
||||||
|
Target::Android
|
||||||
|
} else if target.contains("apple-ios") {
|
||||||
|
Target::Ios
|
||||||
|
} else {
|
||||||
|
panic!("unknown codegen target {}", target);
|
||||||
|
}
|
||||||
|
} else if cfg!(target_os = "linux") {
|
||||||
|
Target::Linux
|
||||||
|
} else if cfg!(windows) {
|
||||||
|
Target::Windows
|
||||||
|
} else if cfg!(target_os = "macos") {
|
||||||
|
Target::Darwin
|
||||||
|
} else if cfg!(target_os = "android") {
|
||||||
|
Target::Android
|
||||||
|
} else if cfg!(target_os = "ios") {
|
||||||
|
Target::Ios
|
||||||
|
} else {
|
||||||
|
panic!("unknown codegen target");
|
||||||
|
};
|
||||||
|
|
||||||
let mut options = AssetOptions::new(config.tauri.pattern.clone())
|
let mut options = AssetOptions::new(config.tauri.pattern.clone())
|
||||||
.freeze_prototype(config.tauri.security.freeze_prototype)
|
.freeze_prototype(config.tauri.security.freeze_prototype)
|
||||||
.dangerous_disable_asset_csp_modification(
|
.dangerous_disable_asset_csp_modification(
|
||||||
@ -162,7 +202,7 @@ pub fn context_codegen(data: ContextData) -> Result<TokenStream, EmbeddedAssetsE
|
|||||||
path
|
path
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
EmbeddedAssets::new(assets_path, &options, map_core_assets(&options))?
|
EmbeddedAssets::new(assets_path, &options, map_core_assets(&options, target))?
|
||||||
}
|
}
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
},
|
},
|
||||||
@ -172,7 +212,7 @@ pub fn context_codegen(data: ContextData) -> Result<TokenStream, EmbeddedAssetsE
|
|||||||
.map(|p| config_parent.join(p))
|
.map(|p| config_parent.join(p))
|
||||||
.collect::<Vec<_>>(),
|
.collect::<Vec<_>>(),
|
||||||
&options,
|
&options,
|
||||||
map_core_assets(&options),
|
map_core_assets(&options, target),
|
||||||
)?,
|
)?,
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
};
|
};
|
||||||
@ -189,18 +229,28 @@ pub fn context_codegen(data: ContextData) -> Result<TokenStream, EmbeddedAssetsE
|
|||||||
out_dir
|
out_dir
|
||||||
};
|
};
|
||||||
|
|
||||||
// handle default window icons for Windows targets
|
|
||||||
#[cfg(windows)]
|
|
||||||
let default_window_icon = {
|
let default_window_icon = {
|
||||||
let icon_path = find_icon(
|
if target == Target::Windows {
|
||||||
&config,
|
// handle default window icons for Windows targets
|
||||||
&config_parent,
|
let icon_path = find_icon(
|
||||||
|i| i.ends_with(".ico"),
|
&config,
|
||||||
"icons/icon.ico",
|
&config_parent,
|
||||||
);
|
|i| i.ends_with(".ico"),
|
||||||
if icon_path.exists() {
|
"icons/icon.ico",
|
||||||
ico_icon(&root, &out_dir, icon_path)?
|
);
|
||||||
} else {
|
if icon_path.exists() {
|
||||||
|
ico_icon(&root, &out_dir, icon_path)?
|
||||||
|
} else {
|
||||||
|
let icon_path = find_icon(
|
||||||
|
&config,
|
||||||
|
&config_parent,
|
||||||
|
|i| i.ends_with(".png"),
|
||||||
|
"icons/icon.png",
|
||||||
|
);
|
||||||
|
png_icon(&root, &out_dir, icon_path)?
|
||||||
|
}
|
||||||
|
} else if target == Target::Linux {
|
||||||
|
// handle default window icons for Linux targets
|
||||||
let icon_path = find_icon(
|
let icon_path = find_icon(
|
||||||
&config,
|
&config,
|
||||||
&config_parent,
|
&config_parent,
|
||||||
@ -208,23 +258,12 @@ pub fn context_codegen(data: ContextData) -> Result<TokenStream, EmbeddedAssetsE
|
|||||||
"icons/icon.png",
|
"icons/icon.png",
|
||||||
);
|
);
|
||||||
png_icon(&root, &out_dir, icon_path)?
|
png_icon(&root, &out_dir, icon_path)?
|
||||||
|
} else {
|
||||||
|
quote!(None)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#[cfg(target_os = "linux")]
|
|
||||||
let default_window_icon = {
|
|
||||||
let icon_path = find_icon(
|
|
||||||
&config,
|
|
||||||
&config_parent,
|
|
||||||
|i| i.ends_with(".png"),
|
|
||||||
"icons/icon.png",
|
|
||||||
);
|
|
||||||
png_icon(&root, &out_dir, icon_path)?
|
|
||||||
};
|
|
||||||
#[cfg(not(any(windows, target_os = "linux")))]
|
|
||||||
let default_window_icon = quote!(None);
|
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
let app_icon = if target == Target::Darwin && dev {
|
||||||
let app_icon = if dev {
|
|
||||||
let mut icon_path = find_icon(
|
let mut icon_path = find_icon(
|
||||||
&config,
|
&config,
|
||||||
&config_parent,
|
&config_parent,
|
||||||
@ -243,8 +282,6 @@ pub fn context_codegen(data: ContextData) -> Result<TokenStream, EmbeddedAssetsE
|
|||||||
} else {
|
} else {
|
||||||
quote!(None)
|
quote!(None)
|
||||||
};
|
};
|
||||||
#[cfg(not(target_os = "macos"))]
|
|
||||||
let app_icon = quote!(None);
|
|
||||||
|
|
||||||
let package_name = if let Some(product_name) = &config.package.product_name {
|
let package_name = if let Some(product_name) = &config.package.product_name {
|
||||||
quote!(#product_name.to_string())
|
quote!(#product_name.to_string())
|
||||||
@ -283,43 +320,40 @@ pub fn context_codegen(data: ContextData) -> Result<TokenStream, EmbeddedAssetsE
|
|||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
let info_plist = {
|
let info_plist = if target == Target::Darwin && dev {
|
||||||
if dev {
|
let info_plist_path = config_parent.join("Info.plist");
|
||||||
let info_plist_path = config_parent.join("Info.plist");
|
let mut info_plist = if info_plist_path.exists() {
|
||||||
let mut info_plist = if info_plist_path.exists() {
|
plist::Value::from_file(&info_plist_path)
|
||||||
plist::Value::from_file(&info_plist_path)
|
.unwrap_or_else(|e| panic!("failed to read plist {}: {}", info_plist_path.display(), e))
|
||||||
.unwrap_or_else(|e| panic!("failed to read plist {}: {}", info_plist_path.display(), e))
|
|
||||||
} else {
|
|
||||||
plist::Value::Dictionary(Default::default())
|
|
||||||
};
|
|
||||||
|
|
||||||
if let Some(plist) = info_plist.as_dictionary_mut() {
|
|
||||||
if let Some(product_name) = &config.package.product_name {
|
|
||||||
plist.insert("CFBundleName".into(), product_name.clone().into());
|
|
||||||
}
|
|
||||||
if let Some(version) = &config.package.version {
|
|
||||||
plist.insert("CFBundleShortVersionString".into(), version.clone().into());
|
|
||||||
}
|
|
||||||
let format =
|
|
||||||
time::format_description::parse("[year][month][day].[hour][minute][second]").unwrap();
|
|
||||||
if let Ok(build_number) = time::OffsetDateTime::now_utc().format(&format) {
|
|
||||||
plist.insert("CFBundleVersion".into(), build_number.into());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let out_path = out_dir.join("Info.plist");
|
|
||||||
info_plist
|
|
||||||
.to_file_xml(&out_path)
|
|
||||||
.expect("failed to write Info.plist");
|
|
||||||
|
|
||||||
let info_plist_path = out_path.display().to_string();
|
|
||||||
quote!({
|
|
||||||
#[cfg(desktop)]
|
|
||||||
tauri::embed_plist::embed_info_plist!(#info_plist_path);
|
|
||||||
})
|
|
||||||
} else {
|
} else {
|
||||||
quote!(())
|
plist::Value::Dictionary(Default::default())
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(plist) = info_plist.as_dictionary_mut() {
|
||||||
|
if let Some(product_name) = &config.package.product_name {
|
||||||
|
plist.insert("CFBundleName".into(), product_name.clone().into());
|
||||||
|
}
|
||||||
|
if let Some(version) = &config.package.version {
|
||||||
|
plist.insert("CFBundleShortVersionString".into(), version.clone().into());
|
||||||
|
}
|
||||||
|
let format =
|
||||||
|
time::format_description::parse("[year][month][day].[hour][minute][second]").unwrap();
|
||||||
|
if let Ok(build_number) = time::OffsetDateTime::now_utc().format(&format) {
|
||||||
|
plist.insert("CFBundleVersion".into(), build_number.into());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let out_path = out_dir.join("Info.plist");
|
||||||
|
info_plist
|
||||||
|
.to_file_xml(&out_path)
|
||||||
|
.expect("failed to write Info.plist");
|
||||||
|
|
||||||
|
let info_plist_path = out_path.display().to_string();
|
||||||
|
quote!({
|
||||||
|
tauri::embed_plist::embed_info_plist!(#info_plist_path);
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
quote!(())
|
||||||
};
|
};
|
||||||
#[cfg(not(target_os = "macos"))]
|
#[cfg(not(target_os = "macos"))]
|
||||||
let info_plist = quote!(());
|
let info_plist = quote!(());
|
||||||
@ -443,7 +477,6 @@ fn ico_icon<P: AsRef<Path>>(
|
|||||||
Ok(icon)
|
Ok(icon)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
|
||||||
fn raw_icon<P: AsRef<Path>>(out_dir: &Path, path: P) -> Result<TokenStream, EmbeddedAssetsError> {
|
fn raw_icon<P: AsRef<Path>>(out_dir: &Path, path: P) -> Result<TokenStream, EmbeddedAssetsError> {
|
||||||
let path = path.as_ref();
|
let path = path.as_ref();
|
||||||
let bytes = std::fs::read(&path)
|
let bytes = std::fs::read(&path)
|
||||||
@ -508,7 +541,6 @@ fn write_if_changed(out_path: &Path, data: &[u8]) -> std::io::Result<()> {
|
|||||||
out_file.write_all(data)
|
out_file.write_all(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(windows, target_os = "macos", target_os = "linux"))]
|
|
||||||
fn find_icon<F: Fn(&&String) -> bool>(
|
fn find_icon<F: Fn(&&String) -> bool>(
|
||||||
config: &Config,
|
config: &Config,
|
||||||
config_parent: &Path,
|
config_parent: &Path,
|
||||||
|
@ -187,7 +187,7 @@ declare global {
|
|||||||
enum UserAttentionType {
|
enum UserAttentionType {
|
||||||
/**
|
/**
|
||||||
* #### Platform-specific
|
* #### Platform-specific
|
||||||
* - **macOS:** Bounces the dock icon until the application is in focus.
|
* - **macOS:** Bounces the dock icon until the application is in focus.
|
||||||
* - **Windows:** Flashes both the window and the taskbar button until the application is in focus.
|
* - **Windows:** Flashes both the window and the taskbar button until the application is in focus.
|
||||||
*/
|
*/
|
||||||
Critical = 1,
|
Critical = 1,
|
||||||
|
Loading…
Reference in New Issue
Block a user