mirror of
https://github.com/DioxusLabs/dioxus
synced 2024-11-22 04:03:04 +00:00
properly expose all symbls in manganis without linker intercept (#3230)
* force a volatile read of manganis symbols to preserve them in the final binary
This commit is contained in:
parent
017478d212
commit
493c5c7532
4 changed files with 12 additions and 25 deletions
|
@ -7,7 +7,6 @@ use crate::{AppBundle, Platform};
|
||||||
use anyhow::Context;
|
use anyhow::Context;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use std::{
|
use std::{
|
||||||
ffi::OsStr,
|
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
process::Stdio,
|
process::Stdio,
|
||||||
time::Instant,
|
time::Instant,
|
||||||
|
@ -225,30 +224,6 @@ impl BuildRequest {
|
||||||
// walk every file in the incremental cache dir, reading and inserting items into the manifest.
|
// walk every file in the incremental cache dir, reading and inserting items into the manifest.
|
||||||
let mut manifest = AssetManifest::default();
|
let mut manifest = AssetManifest::default();
|
||||||
|
|
||||||
// Add from the deps folder where the rlibs are stored for dependencies
|
|
||||||
let deps_folder = exe.parent().unwrap().join("deps");
|
|
||||||
tracing::trace!("Adding assets from deps folder: {deps_folder:?}");
|
|
||||||
for entry in deps_folder.read_dir()?.flatten() {
|
|
||||||
if entry.path().extension() == Some(OsStr::new("rlib")) {
|
|
||||||
_ = manifest.add_from_object_path(&entry.path());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add from the incremental cache folder by recursively walking the folder
|
|
||||||
// it seems that this sticks around no matter what - and cargo doesn't clean it up since the .os are cached anyway
|
|
||||||
fn recursive_add(manifest: &mut AssetManifest, path: &Path) -> Result<()> {
|
|
||||||
if path.extension() == Some(OsStr::new("o")) {
|
|
||||||
_ = manifest.add_from_object_path(path);
|
|
||||||
} else if let Ok(dir) = path.read_dir() {
|
|
||||||
for entry in dir.flatten() {
|
|
||||||
recursive_add(manifest, &entry.path())?;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
recursive_add(&mut manifest, &exe.parent().unwrap().join("incremental"))?;
|
|
||||||
|
|
||||||
// And then add from the exe directly, just in case it's LTO compiled and has no incremental cache
|
// And then add from the exe directly, just in case it's LTO compiled and has no incremental cache
|
||||||
_ = manifest.add_from_object_path(exe);
|
_ = manifest.add_from_object_path(exe);
|
||||||
|
|
||||||
|
|
|
@ -104,6 +104,8 @@ impl ToTokens for AssetParser {
|
||||||
|
|
||||||
// "/blahcss123.css"
|
// "/blahcss123.css"
|
||||||
bundled: #bundled,
|
bundled: #bundled,
|
||||||
|
|
||||||
|
metadata: __volatile_reader as fn() -> u8,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
) #option_source
|
) #option_source
|
||||||
|
|
|
@ -17,5 +17,9 @@ pub fn generate_link_section(asset: &impl Serialize) -> TokenStream2 {
|
||||||
#[link_section = #section_name]
|
#[link_section = #section_name]
|
||||||
#[used]
|
#[used]
|
||||||
static ASSET: [u8; #len] = * #asset_bytes;
|
static ASSET: [u8; #len] = * #asset_bytes;
|
||||||
|
|
||||||
|
fn __volatile_reader() -> u8 {
|
||||||
|
unsafe { std::ptr::read_volatile(ASSET.as_ptr()) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,9 @@ pub struct Asset {
|
||||||
///
|
///
|
||||||
/// `blah-123.css``
|
/// `blah-123.css``
|
||||||
pub bundled: &'static str,
|
pub bundled: &'static str,
|
||||||
|
|
||||||
|
/// The metadata for this asset plumbed by the compiler
|
||||||
|
pub metadata: fn() -> u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Asset {
|
impl Asset {
|
||||||
|
@ -47,6 +50,9 @@ impl Asset {
|
||||||
/// Attempts to resolve it against an `assets` folder in the current directory.
|
/// Attempts to resolve it against an `assets` folder in the current directory.
|
||||||
/// If that doesn't exist, it will resolve against the cargo manifest dir
|
/// If that doesn't exist, it will resolve against the cargo manifest dir
|
||||||
pub fn resolve(&self) -> PathBuf {
|
pub fn resolve(&self) -> PathBuf {
|
||||||
|
// Force a volatile read of the metadata to ensure the symbol makes it into the binary
|
||||||
|
(self.metadata)();
|
||||||
|
|
||||||
// If the asset is relative, we resolve the asset at the current directory
|
// If the asset is relative, we resolve the asset at the current directory
|
||||||
if !dioxus_core_types::is_bundled_app() {
|
if !dioxus_core_types::is_bundled_app() {
|
||||||
return PathBuf::from(self.local);
|
return PathBuf::from(self.local);
|
||||||
|
|
Loading…
Reference in a new issue