Fork of daniellemaywood.uk/gleam — Wasm codegen work
2

Configure Feed

Select the types of activity you want to include in your feed.

gleam / compiler-cli / src / compile_package.rs
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}