mirror of
https://github.com/mii443/wasmer.git
synced 2025-12-16 17:18:57 +00:00
Add create_header_files_in_dir step
This commit is contained in:
11
Cargo.lock
generated
11
Cargo.lock
generated
@@ -2253,6 +2253,16 @@ dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "object"
|
||||
version = "0.30.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "239da7f290cfa979f43f85a8efeee9a8a76d0827c356d37f9d3d7254d6b537fb"
|
||||
dependencies = [
|
||||
"flate2",
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.16.0"
|
||||
@@ -4318,6 +4328,7 @@ dependencies = [
|
||||
"log",
|
||||
"minisign",
|
||||
"nuke-dir",
|
||||
"object 0.30.0",
|
||||
"pathdiff",
|
||||
"prettytable-rs",
|
||||
"regex",
|
||||
|
||||
@@ -87,6 +87,7 @@ semver = "1.0.14"
|
||||
rpassword = "7.2.0"
|
||||
pathdiff = "0.2.1"
|
||||
sha2 = "0.10.6"
|
||||
object = "0.30.0"
|
||||
|
||||
[build-dependencies]
|
||||
chrono = { version = "^0.4", default-features = false, features = [ "std", "clock" ] }
|
||||
|
||||
@@ -724,6 +724,88 @@ pub(super) fn prepare_directory_from_single_wasm_file(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Create the static_defs.h header files in the /include directory
|
||||
fn create_header_files_in_dir(
|
||||
directory: &Path,
|
||||
atoms: &[(String, Vec<u8>)],
|
||||
entrypoint: &Entrypoint,
|
||||
prefixes: &[String],
|
||||
object_format: ObjectFormat,
|
||||
) -> anyhow::Result<()> {
|
||||
use object::{Object, ObjectSection};
|
||||
use wasmer_types::compilation::symbols::ModuleMetadataSymbolRegistry;
|
||||
|
||||
if object_format == ObjectFormat::Serialized {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
std::fs::create_dir_all(directory.join("include")).map_err(|e| {
|
||||
anyhow::anyhow!("cannot create /include dir in {}: {e}", directory.display())
|
||||
})?;
|
||||
|
||||
let prefix_map = entrypoint
|
||||
.atoms
|
||||
.iter()
|
||||
.map(|a| (a.atom.clone(), Vec::new()))
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let prefixes = PrefixMapCompilation::from_input(&prefix_map, prefixes, false)?;
|
||||
|
||||
for atom in entrypoint.atoms.iter() {
|
||||
let atom_name = &atom.atom;
|
||||
let prefix = prefixes
|
||||
.get_prefix_for_atom(&atom_name)
|
||||
.ok_or_else(|| anyhow::anyhow!("cannot get prefix for atom {atom_name}"))?;
|
||||
|
||||
let atom_bytes = atoms
|
||||
.iter()
|
||||
.find_map(|(name, bytes)| if name == atom_name { Some(bytes) } else { None })
|
||||
.ok_or_else(|| {
|
||||
anyhow::anyhow!("could not find bytes for atom {atom_name} in generate-header step")
|
||||
})?;
|
||||
|
||||
let object_file_src = directory.join(&atom.path);
|
||||
let object_file = std::fs::read(&object_file_src)
|
||||
.map_err(|e| anyhow::anyhow!("could not read {}: {e}", object_file_src.display()))?;
|
||||
let module_name = format!("WASMER_{prefix}_METADATA");
|
||||
let obj_file = object::File::parse(&*object_file)?;
|
||||
let section = obj_file.section_by_name(&module_name).ok_or_else(|| {
|
||||
anyhow::anyhow!(
|
||||
"missing section {module_name} in object file {}",
|
||||
object_file_src.display()
|
||||
)
|
||||
})?;
|
||||
let metadata_length = section.size();
|
||||
|
||||
let store = Store::default();
|
||||
let module_info =
|
||||
unsafe { Module::deserialize(&store, atom_bytes.as_slice()) }.map_err(|e| {
|
||||
anyhow::anyhow!(
|
||||
"could not deserialized module {atom_name} in generate-header step: {e}"
|
||||
)
|
||||
})?;
|
||||
|
||||
let header_file_path = directory
|
||||
.join("include")
|
||||
.join(format!("static_defs_{prefix}.h"));
|
||||
|
||||
let header_file_src = crate::c_gen::staticlib_header::generate_header_file(
|
||||
&atom_name,
|
||||
&format!("WASMER_{prefix}_METADATA"),
|
||||
&module_info.info(),
|
||||
&ModuleMetadataSymbolRegistry { prefix },
|
||||
metadata_length as usize,
|
||||
);
|
||||
|
||||
std::fs::write(&header_file_path, &header_file_src).map_err(|e| {
|
||||
anyhow::anyhow!(
|
||||
"could not write static_defs.h for atom {atom_name} in generate-header step: {e}"
|
||||
)
|
||||
})?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Given a directory, links all the objects from the directory appropriately
|
||||
fn link_exe_from_dir(
|
||||
directory: &Path,
|
||||
|
||||
Reference in New Issue
Block a user