Fork of daniellemaywood.uk/gleam — Wasm codegen work
2.4 kB
77 lines
1use crate::{
2 config,
3 fs::{self, ConsoleWarningEmitter, ProjectIO},
4 CompilePackage,
5};
6use camino::Utf8Path;
7use gleam_core::{
8 build::{Mode, PackageCompiler, StaleTracker, Target, TargetCodegenConfiguration},
9 metadata,
10 paths::{self, ProjectPaths},
11 type_::ModuleInterface,
12 uid::UniqueIdGenerator,
13 warning::WarningEmitter,
14 Result,
15};
16use smol_str::SmolStr;
17use std::sync::Arc;
18
19pub fn command(options: CompilePackage) -> Result<()> {
20 let ids = UniqueIdGenerator::new();
21 let mut type_manifests = load_libraries(&ids, &options.libraries_directory)?;
22 let mut defined_modules = im::HashMap::new();
23 let warnings = WarningEmitter::new(Arc::new(ConsoleWarningEmitter));
24 let paths = ProjectPaths::new(options.package_directory.clone());
25 let config = config::read(paths.root_config())?;
26 let target = match options.target {
27 Target::Erlang => TargetCodegenConfiguration::Erlang { app_file: None },
28 Target::JavaScript => TargetCodegenConfiguration::JavaScript {
29 emit_typescript_definitions: false,
30 },
31 };
32
33 tracing::info!("Compiling package");
34
35 let mut compiler = PackageCompiler::new(
36 &config,
37 Mode::Dev,
38 &options.package_directory,
39 &options.output_directory,
40 &options.libraries_directory,
41 &target,
42 ids,
43 ProjectIO::new(),
44 );
45 compiler.write_entrypoint = false;
46 compiler.write_metadata = true;
47 compiler.compile_beam_bytecode = !options.skip_beam_compilation;
48 let _ = compiler.compile(
49 &warnings,
50 &mut type_manifests,
51 &mut defined_modules,
52 &mut StaleTracker::default(),
53 )?;
54
55 Ok(())
56}
57
58fn load_libraries(
59 ids: &UniqueIdGenerator,
60 lib: &Utf8Path,
61) -> Result<im::HashMap<SmolStr, ModuleInterface>> {
62 tracing::info!("Reading precompiled module metadata files");
63 let mut manifests = im::HashMap::new();
64 for lib in fs::read_dir(lib)?.filter_map(Result::ok) {
65 let path = lib.path().join(paths::ARTEFACT_DIRECTORY_NAME);
66 if !path.is_dir() {
67 continue;
68 }
69 for module in fs::module_caches_paths(path)? {
70 let reader = fs::buffered_reader(module)?;
71 let module = metadata::ModuleDecoder::new(ids.clone()).read(reader)?;
72 let _ = manifests.insert(module.name.clone(), module);
73 }
74 }
75
76 Ok(manifests)
77}