(build: &mut Build, metadata: &CargoMetadata)
| 38 | |
| 39 | #[tracing::instrument(skip(build, metadata), target = "cargo_lambda")] |
| 40 | pub async fn run(build: &mut Build, metadata: &CargoMetadata) -> Result<()> { |
| 41 | tracing::trace!(options = ?build, "building project"); |
| 42 | |
| 43 | if (build.arm64 || build.x86_64) && !build.cargo_opts.target.is_empty() { |
| 44 | Err(BuildError::InvalidTargetOptions)?; |
| 45 | } |
| 46 | |
| 47 | let target_arch = if build.arm64 { |
| 48 | TargetArch::arm64() |
| 49 | } else if build.x86_64 { |
| 50 | TargetArch::x86_64() |
| 51 | } else { |
| 52 | // let build_target = build.cargo_opts.target.first().or(metadata.target.as_ref()); |
| 53 | match build.cargo_opts.target.first() { |
| 54 | Some(target) => { |
| 55 | validate_linux_target(target)?; |
| 56 | TargetArch::from_str(target)? |
| 57 | } |
| 58 | None => TargetArch::from_host()?, |
| 59 | } |
| 60 | }; |
| 61 | |
| 62 | build.cargo_opts.target = vec![target_arch.to_string()]; |
| 63 | |
| 64 | let build_examples = build.cargo_opts.examples || !build.cargo_opts.example.is_empty(); |
| 65 | let binaries = binary_targets_from_metadata(metadata, build_examples); |
| 66 | debug!(binaries = ?binaries, "found new target binaries to build"); |
| 67 | |
| 68 | let binaries = if !build.cargo_opts.bin.is_empty() { |
| 69 | let mut final_binaries = HashSet::with_capacity(binaries.len()); |
| 70 | |
| 71 | for name in &build.cargo_opts.bin { |
| 72 | if !binaries.contains(name) { |
| 73 | return Err(BuildError::FunctionBinaryMissing(name.into()).into()); |
| 74 | } |
| 75 | final_binaries.insert(name.into()); |
| 76 | } |
| 77 | |
| 78 | final_binaries |
| 79 | } else { |
| 80 | binaries |
| 81 | }; |
| 82 | |
| 83 | let compiler_option = build.compiler.clone().unwrap_or_default(); |
| 84 | if compiler_option.is_local_cargo() { |
| 85 | // This check only makes sense when the build host is local. |
| 86 | // If the build host was ever going to be remote, like in a container, |
| 87 | // this is not checked |
| 88 | if !target_arch.compatible_host_linker() && !target_arch.is_static_linking() { |
| 89 | return Err(BuildError::InvalidCompilerOption.into()); |
| 90 | } |
| 91 | } |
| 92 | |
| 93 | if is_release_profile(build) && !build.disable_optimizations { |
| 94 | let release_optimizations = |
| 95 | cargo_release_profile_config(metadata).map_err(BuildError::MetadataError)?; |
| 96 | build.cargo_opts.config.extend( |
| 97 | release_optimizations |
no test coverage detected