build/llvmPackages: refactor for better options

This commit is contained in:
2024-07-04 15:44:57 +08:00
parent e03aaa2347
commit 900a8c26a1

View File

@@ -1,13 +1,51 @@
import path from "path"; import path from "path";
import { GeneralVariable, LLVMVariable, command, variable } from "lyc/commands/cmake"; import { GeneralVariable, LLVMVariable, command, variable } from "lyc/commands/cmake";
import { SYSROOT_PREFIX, projectRoot } from "lyc/environment"; import { projectRoot } from "lyc/environment";
import { PackageTask, buildPackage } from "./build"; import { PackagePlatform, PackageTask } from "./build";
import { promisifySpawn } from "lyc/cli"; import { promisifySpawn } from "lyc/cli";
import os from "os"; import os from "os";
import { SpawnOptions, spawn } from "child_process"; import { SpawnOptions, spawn } from "child_process";
export function llvmPackages(src: string, installPrefix: string): PackageTask[] { export interface LLVMPackageOptions {
const LLVM_BUILD = path.join(src, "build-dev"); 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 rm = "rm";
const cmake = "cmake"; const cmake = "cmake";
@@ -21,16 +59,11 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[]
const general: GeneralVariable = { const general: GeneralVariable = {
CMAKE_BUILD_TYPE: "Release", CMAKE_BUILD_TYPE: "Release",
CMAKE_INSTALL_PREFIX: installPrefix, CMAKE_INSTALL_PREFIX: installPrefix,
CMAKE_SYSROOT: SYSROOT_PREFIX,
}; };
const env = { const env = {
...process.env, ...process.env,
MAKEFLAGS: ["-j", os.cpus().length].join(" "), MAKEFLAGS: ["-j", os.cpus().length].join(" "),
LD_LIBRARY_PATH: [
path.join(SYSROOT_PREFIX, 'usr', 'lib'),
path.join(SYSROOT_PREFIX, 'lib'),
].join(':'),
}; };
const spawnOptions: SpawnOptions = { const spawnOptions: SpawnOptions = {
@@ -48,16 +81,20 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[]
}); });
function mkLLVMPackage(): PackageTask { function mkLLVMPackage(): PackageTask {
const build = path.join(LLVM_BUILD, "llvm"); const build = buildDirs.llvm;
return { return {
name: "llvm", name: "llvm",
platform,
patchPhase: async () => { patchPhase: async () => {
// Apply llvm omp patch if (platform.buildPlatform.arch !== 'x86_64'
await promisifySpawn(spawn("git", && platform.buildPlatform.arch !== 'aarch64') {
[ // Apply llvm omp patch
"apply", await promisifySpawn(spawn("git",
path.resolve(projectRoot, "assets", "omp.diff"), [
], spawnOptions)); "apply",
path.resolve(projectRoot, "assets", "omp.diff"),
], spawnOptions));
}
}, },
configurePhase: async () => { configurePhase: async () => {
// Configure // Configure
@@ -65,6 +102,9 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[]
definitions: variable({ definitions: variable({
...llvmVar, ...llvmVar,
...general, ...general,
CMAKE_C_COMPILER: toolchains.llvm.CC,
CMAKE_CXX_COMPILER: toolchains.llvm.CXX,
...cmakeDefinitionOverrides?.llvm || {},
}), }),
generator: "Ninja", generator: "Ninja",
// LLVM cmake root is under /llvm directory // LLVM cmake root is under /llvm directory
@@ -78,7 +118,7 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[]
} }
function mkLibpgmathPackage(): PackageTask { function mkLibpgmathPackage(): PackageTask {
const build = path.join(LLVM_BUILD, "libpgmath"); const build = buildDirs.libpgmath;
return { return {
name: "libpgmath", name: "libpgmath",
configurePhase: async () => { configurePhase: async () => {
@@ -94,6 +134,7 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[]
CMAKE_C_COMPILER: path.join(installPrefix, "bin", "clang"), CMAKE_C_COMPILER: path.join(installPrefix, "bin", "clang"),
CMAKE_CXX_COMPILER: path.join(installPrefix, "bin", "clang++"), CMAKE_CXX_COMPILER: path.join(installPrefix, "bin", "clang++"),
} as GeneralVariable, } as GeneralVariable,
...cmakeDefinitionOverrides?.libpgmath || {},
}), }),
generator: "Ninja", generator: "Ninja",
pathToSource: path.join(src, "cflang", "runtime", "libpgmath"), pathToSource: path.join(src, "cflang", "runtime", "libpgmath"),
@@ -106,7 +147,7 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[]
} }
function mkCflangPackage(): PackageTask { function mkCflangPackage(): PackageTask {
const build = path.join(LLVM_BUILD, "cflang"); const build = buildDirs.cflang;
return { return {
name: "cflang", name: "cflang",
configurePhase: async () => { configurePhase: async () => {
@@ -128,6 +169,7 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[]
FLANG_LLVM_EXTENSIONS: true, FLANG_LLVM_EXTENSIONS: true,
WITH_WERROR: false, WITH_WERROR: false,
LLVM_CONFIG: path.join(installPrefix, "bin", "llvm-config"), LLVM_CONFIG: path.join(installPrefix, "bin", "llvm-config"),
...cmakeDefinitionOverrides?.cflang || {},
}), }),
generator: "Unix Makefiles", generator: "Unix Makefiles",
pathToSource: path.join(src, "cflang"), 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);
}
}