compiler_llvm_builder/platforms/
x86_64_linux_gnu.rs

1//!
2//! The ZKsync LLVM amd64 `linux-gnu` builder.
3//!
4
5use std::collections::HashSet;
6use std::process::Command;
7
8use crate::build_type::BuildType;
9use crate::ccache_variant::CcacheVariant;
10use crate::llvm_path::LLVMPath;
11use crate::llvm_project::LLVMProject;
12use crate::platforms::Platform;
13use crate::sanitizer::Sanitizer;
14use crate::target_triple::TargetTriple;
15
16///
17/// The building sequence.
18///
19#[allow(clippy::too_many_arguments)]
20pub fn build(
21    build_type: BuildType,
22    targets: HashSet<Platform>,
23    llvm_projects: HashSet<LLVMProject>,
24    enable_rtti: bool,
25    default_target: Option<TargetTriple>,
26    enable_tests: bool,
27    enable_coverage: bool,
28    extra_args: Vec<String>,
29    ccache_variant: Option<CcacheVariant>,
30    enable_assertions: bool,
31    sanitizer: Option<Sanitizer>,
32    enable_valgrind: bool,
33    valgrind_options: Vec<String>,
34) -> anyhow::Result<()> {
35    crate::utils::check_presence("cmake")?;
36    crate::utils::check_presence("clang")?;
37    crate::utils::check_presence("clang++")?;
38    crate::utils::check_presence("lld")?;
39    crate::utils::check_presence("ninja")?;
40
41    let llvm_module_llvm = LLVMPath::llvm_module_llvm()?;
42    let llvm_build_final = LLVMPath::llvm_build_final()?;
43    let llvm_target_final = LLVMPath::llvm_target_final()?;
44
45    crate::utils::command(
46        Command::new("cmake")
47            .args([
48                "-S",
49                llvm_module_llvm.to_string_lossy().as_ref(),
50                "-B",
51                llvm_build_final.to_string_lossy().as_ref(),
52                "-G",
53                "Ninja",
54                format!(
55                    "-DCMAKE_INSTALL_PREFIX='{}'",
56                    llvm_target_final.to_string_lossy().as_ref(),
57                )
58                .as_str(),
59                format!("-DCMAKE_BUILD_TYPE='{build_type}'").as_str(),
60                "-DCMAKE_C_COMPILER='clang'",
61                "-DCMAKE_CXX_COMPILER='clang++'",
62                format!(
63                    "-DLLVM_TARGETS_TO_BUILD='{}'",
64                    targets
65                        .into_iter()
66                        .map(|platform| platform.to_string())
67                        .collect::<Vec<String>>()
68                        .join(";")
69                )
70                .as_str(),
71                format!(
72                    "-DLLVM_ENABLE_PROJECTS='{}'",
73                    llvm_projects
74                        .into_iter()
75                        .map(|project| project.to_string())
76                        .collect::<Vec<String>>()
77                        .join(";")
78                )
79                .as_str(),
80                "-DLLVM_USE_LINKER='lld'",
81            ])
82            .args(crate::platforms::shared::shared_build_opts_default_target(
83                default_target,
84            ))
85            .args(crate::platforms::shared::shared_build_opts_tests(
86                enable_tests,
87            ))
88            .args(crate::platforms::shared::shared_build_opts_coverage(
89                enable_coverage,
90            ))
91            .args(crate::platforms::shared::shared_build_opts_ccache(
92                ccache_variant,
93            ))
94            .args(crate::platforms::shared::SHARED_BUILD_OPTS)
95            .args(crate::platforms::shared::SHARED_BUILD_OPTS_NOT_MUSL)
96            .args(crate::platforms::shared::shared_build_opts_werror())
97            .args(extra_args)
98            .args(crate::platforms::shared::shared_build_opts_assertions(
99                enable_assertions,
100            ))
101            .args(crate::platforms::shared::shared_build_opts_rtti(
102                enable_rtti,
103            ))
104            .args(crate::platforms::shared::shared_build_opts_sanitizers(
105                sanitizer,
106            ))
107            .args(crate::platforms::shared::shared_build_opts_valgrind(
108                enable_valgrind,
109                valgrind_options,
110            )),
111        "LLVM building cmake",
112    )?;
113    crate::utils::ninja(llvm_build_final.as_ref())?;
114    Ok(())
115}