Fork of daniellemaywood.uk/gleam — Wasm codegen work
2.4 kB
81 lines
1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: 2021 The Gleam contributors
3
4use std::{rc::Rc, time::Instant};
5
6use gleam_core::{
7 Result,
8 build::{Built, Codegen, NullTelemetry, Options, ProjectCompiler, Telemetry},
9 manifest::Manifest,
10 paths::ProjectPaths,
11 warning::WarningEmitterIO,
12};
13
14use crate::{
15 build_lock::BuildLock,
16 cli, dependencies,
17 fs::{self, ConsoleWarningEmitter},
18};
19
20pub fn download_dependencies(paths: &ProjectPaths, telemetry: impl Telemetry) -> Result<Manifest> {
21 dependencies::resolve_and_download(
22 paths,
23 telemetry,
24 None,
25 Vec::new(),
26 dependencies::DependencyManagerConfig {
27 use_manifest: dependencies::UseManifest::Yes,
28 check_major_versions: dependencies::CheckMajorVersions::No,
29 },
30 )
31}
32
33pub fn main(paths: &ProjectPaths, options: Options, manifest: Manifest) -> Result<Built> {
34 main_with_warnings(paths, options, manifest, Rc::new(ConsoleWarningEmitter))
35}
36
37pub(crate) fn main_with_warnings(
38 paths: &ProjectPaths,
39 options: Options,
40 manifest: Manifest,
41 warnings: Rc<dyn WarningEmitterIO>,
42) -> Result<Built> {
43 let perform_codegen = options.codegen;
44 let root_config = crate::config::root_config(paths)?;
45 let telemetry: &'static dyn Telemetry = if options.no_print_progress {
46 &NullTelemetry
47 } else {
48 &cli::Reporter
49 };
50 let target = options.target.unwrap_or(root_config.target);
51 let io = fs::ProjectIO::new();
52 // Initialise the BEAM compiler instance eagerly, so we don't have to wait
53 // for it to boot when we come to use it for the first time.
54 if target.is_erlang() {
55 io.initialise_beam_compiler()?;
56 }
57 let start = Instant::now();
58 let lock = BuildLock::new_target(paths, options.mode, target)?;
59
60 tracing::info!("Compiling packages");
61 let result = {
62 let _guard = lock.lock(telemetry);
63 let compiler = ProjectCompiler::new(
64 root_config,
65 options,
66 manifest.packages,
67 telemetry,
68 warnings,
69 paths.clone(),
70 io,
71 );
72 compiler.compile()?
73 };
74
75 match perform_codegen {
76 Codegen::All | Codegen::DepsOnly => telemetry.compiled_package(start.elapsed()),
77 Codegen::None => telemetry.checked_package(start.elapsed()),
78 };
79
80 Ok(result)
81}