Merge remote-tracking branch 'origin/dev' into next

This commit is contained in:
Lucas Nogueira 2022-08-12 20:09:23 -03:00
commit 11d50e8474
No known key found for this signature in database
GPG Key ID: FFEA6C72E73482F1
3 changed files with 106 additions and 69 deletions

View File

@ -0,0 +1,5 @@
---
"tauri-codegen": patch
---
Use `TARGET` environment variable for code generation inside build scripts.

View File

@ -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,

View File

@ -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,