build/llvmPackages: refactor for better options
This commit is contained in:
@@ -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 () => {
|
||||||
|
if (platform.buildPlatform.arch !== 'x86_64'
|
||||||
|
&& platform.buildPlatform.arch !== 'aarch64') {
|
||||||
// Apply llvm omp patch
|
// Apply llvm omp patch
|
||||||
await promisifySpawn(spawn("git",
|
await promisifySpawn(spawn("git",
|
||||||
[
|
[
|
||||||
"apply",
|
"apply",
|
||||||
path.resolve(projectRoot, "assets", "omp.diff"),
|
path.resolve(projectRoot, "assets", "omp.diff"),
|
||||||
], spawnOptions));
|
], 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user