From 900a8c26a1e1bac87126c63d13bdb2d3bb15954d Mon Sep 17 00:00:00 2001 From: Yingchi Long Date: Thu, 4 Jul 2024 15:44:57 +0800 Subject: [PATCH] build/llvmPackages: refactor for better options --- src/build/llvmPackages.ts | 93 +++++++++++++++++++++++++-------------- 1 file changed, 60 insertions(+), 33 deletions(-) diff --git a/src/build/llvmPackages.ts b/src/build/llvmPackages.ts index eed2fc1..f3998c5 100644 --- a/src/build/llvmPackages.ts +++ b/src/build/llvmPackages.ts @@ -1,13 +1,51 @@ import path from "path"; import { GeneralVariable, LLVMVariable, command, variable } from "lyc/commands/cmake"; -import { SYSROOT_PREFIX, projectRoot } from "lyc/environment"; -import { PackageTask, buildPackage } from "./build"; +import { projectRoot } from "lyc/environment"; +import { PackagePlatform, PackageTask } from "./build"; import { promisifySpawn } from "lyc/cli"; import os from "os"; import { SpawnOptions, spawn } from "child_process"; -export function llvmPackages(src: string, installPrefix: string): PackageTask[] { - const LLVM_BUILD = path.join(src, "build-dev"); +export interface LLVMPackageOptions { + src: string; + installPrefix: string; + + /** + * Build directories suitable for these three packages. + */ + buildDirs: { + llvm: string; + cflang: string; + libpgmath: string; + }; + + /** + * Misc toolchain settings for compiling LLVM. + */ + toolchains: { + llvm: { + CC: string; + CXX: string; + }; + }; + + cmakeDefinitionOverrides?: { + llvm?: Object, + libpgmath?: Object, + cflang?: Object, + }; + + platform: PackagePlatform; +}; + +export function llvmPackages({ + src, + installPrefix, + toolchains, + platform, + buildDirs, + cmakeDefinitionOverrides, +}: LLVMPackageOptions): PackageTask[] { const rm = "rm"; const cmake = "cmake"; @@ -21,16 +59,11 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[] const general: GeneralVariable = { CMAKE_BUILD_TYPE: "Release", CMAKE_INSTALL_PREFIX: installPrefix, - CMAKE_SYSROOT: SYSROOT_PREFIX, }; const env = { ...process.env, MAKEFLAGS: ["-j", os.cpus().length].join(" "), - LD_LIBRARY_PATH: [ - path.join(SYSROOT_PREFIX, 'usr', 'lib'), - path.join(SYSROOT_PREFIX, 'lib'), - ].join(':'), }; const spawnOptions: SpawnOptions = { @@ -48,16 +81,20 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[] }); function mkLLVMPackage(): PackageTask { - const build = path.join(LLVM_BUILD, "llvm"); + const build = buildDirs.llvm; return { name: "llvm", + platform, patchPhase: async () => { - // Apply llvm omp patch - await promisifySpawn(spawn("git", - [ - "apply", - path.resolve(projectRoot, "assets", "omp.diff"), - ], spawnOptions)); + if (platform.buildPlatform.arch !== 'x86_64' + && platform.buildPlatform.arch !== 'aarch64') { + // Apply llvm omp patch + await promisifySpawn(spawn("git", + [ + "apply", + path.resolve(projectRoot, "assets", "omp.diff"), + ], spawnOptions)); + } }, configurePhase: async () => { // Configure @@ -65,6 +102,9 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[] definitions: variable({ ...llvmVar, ...general, + CMAKE_C_COMPILER: toolchains.llvm.CC, + CMAKE_CXX_COMPILER: toolchains.llvm.CXX, + ...cmakeDefinitionOverrides?.llvm || {}, }), generator: "Ninja", // LLVM cmake root is under /llvm directory @@ -78,7 +118,7 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[] } function mkLibpgmathPackage(): PackageTask { - const build = path.join(LLVM_BUILD, "libpgmath"); + const build = buildDirs.libpgmath; return { name: "libpgmath", configurePhase: async () => { @@ -94,6 +134,7 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[] CMAKE_C_COMPILER: path.join(installPrefix, "bin", "clang"), CMAKE_CXX_COMPILER: path.join(installPrefix, "bin", "clang++"), } as GeneralVariable, + ...cmakeDefinitionOverrides?.libpgmath || {}, }), generator: "Ninja", pathToSource: path.join(src, "cflang", "runtime", "libpgmath"), @@ -106,7 +147,7 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[] } function mkCflangPackage(): PackageTask { - const build = path.join(LLVM_BUILD, "cflang"); + const build = buildDirs.cflang; return { name: "cflang", configurePhase: async () => { @@ -128,6 +169,7 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[] FLANG_LLVM_EXTENSIONS: true, WITH_WERROR: false, LLVM_CONFIG: path.join(installPrefix, "bin", "llvm-config"), + ...cmakeDefinitionOverrides?.cflang || {}, }), generator: "Unix Makefiles", pathToSource: path.join(src, "cflang"), @@ -143,18 +185,3 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[] } -export async function buildLLVMHash(src: string, rev: string) { - // Checkout a git rev in some git repo. - await promisifySpawn(spawn("git", ["checkout", rev], { stdio: "inherit", cwd: src })); - await promisifySpawn(spawn("git", ["reset", "--hard", "HEAD"], { stdio: "inherit", cwd: src })); - - const llvmInstall = path.join(src, "local", "installed"); - - - const packages = llvmPackages(src, path.join(llvmInstall, rev)); - - // Packages must be built in-order. - for (const pkg of packages) { - await buildPackage(pkg); - } -}