build: use async version

This commit is contained in:
2024-06-23 19:54:13 +08:00
parent 7551cc2ae4
commit a2f4ed522f
2 changed files with 47 additions and 41 deletions

View File

@@ -1,27 +1,27 @@
export interface PackageTask { export interface PackageTask {
name: string; name: string;
patchPhase?: (task: PackageTask) => void; patchPhase?: (task: PackageTask) => Promise<void>;
configurePhase?: (task: PackageTask) => void; configurePhase?: (task: PackageTask) => Promise<void>;
buildPhase?: (task: PackageTask) => void; buildPhase?: (task: PackageTask) => Promise<void>;
installPhase?: (task: PackageTask) => void; installPhase?: (task: PackageTask) => Promise<void>;
[key: string]: any; [key: string]: any;
} }
export function buildPackage(task: PackageTask) { export async function buildPackage(task: PackageTask) {
if (task.patchPhase) { if (task.patchPhase) {
console.log(`${task.name}/patchPhase`); console.log(`${task.name}/patchPhase`);
task.patchPhase(task); await task.patchPhase(task);
} }
if (task.configurePhase) { if (task.configurePhase) {
console.log(`${task.name}/configurePhase`); console.log(`${task.name}/configurePhase`);
task.configurePhase(task); await task.configurePhase(task);
} }
if (task.buildPhase) { if (task.buildPhase) {
console.log(`${task.name}/buildPhase`); console.log(`${task.name}/buildPhase`);
task.buildPhase(task); await task.buildPhase(task);
} }
if (task.installPhase) { if (task.installPhase) {
console.log(`${task.name}/installPhase`); console.log(`${task.name}/installPhase`);
task.installPhase(task); await task.installPhase(task);
} }
} }

View File

@@ -2,7 +2,7 @@ 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 { SYSROOT_PREFIX, projectRoot } from "lyc/environment";
import { PackageTask, buildPackage } from "./build"; import { PackageTask, buildPackage } from "./build";
import { checkedSpawnSync } 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";
@@ -39,29 +39,29 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[]
cwd: src, cwd: src,
}; };
const mkBuildPhase = (build: string) => { const mkBuildPhase = (build: string) => (async () => {
checkedSpawnSync(cmake, ["--build", build], spawnOptions); await promisifySpawn(spawn(cmake, ["--build", build], spawnOptions));
}; });
const mkInstallPhase = (build: string) => { const mkInstallPhase = (build: string) => (async () => {
checkedSpawnSync(cmake, ["--build", build, "--target", "install"], spawnOptions); await promisifySpawn(spawn(cmake, ["--build", build, "--target", "install"], spawnOptions));
}; });
function mkLLVMPackage(): PackageTask { function mkLLVMPackage(): PackageTask {
const build = path.join(LLVM_BUILD, "llvm"); const build = path.join(LLVM_BUILD, "llvm");
return { return {
name: "llvm", name: "llvm",
patchPhase: () => { patchPhase: async () => {
// Apply llvm omp patch // Apply llvm omp patch
checkedSpawnSync("git", await promisifySpawn(spawn("git",
[ [
"apply", "apply",
path.resolve(projectRoot, "assets", "omp.diff"), path.resolve(projectRoot, "assets", "omp.diff"),
], spawnOptions); ], spawnOptions));
}, },
configurePhase: () => { configurePhase: async () => {
// Configure // Configure
checkedSpawnSync(cmake, command({ await promisifySpawn(spawn(cmake, command({
definitions: variable({ definitions: variable({
...llvmVar, ...llvmVar,
...general, ...general,
@@ -70,10 +70,10 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[]
// LLVM cmake root is under /llvm directory // LLVM cmake root is under /llvm directory
pathToSource: path.join(src, "llvm"), pathToSource: path.join(src, "llvm"),
pathToBuild: build, pathToBuild: build,
}), spawnOptions); }), spawnOptions));
}, },
buildPhase: () => mkBuildPhase(build), buildPhase: mkBuildPhase(build),
installPhase: () => mkInstallPhase(build), installPhase: mkInstallPhase(build),
}; };
} }
@@ -81,11 +81,11 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[]
const build = path.join(LLVM_BUILD, "libpgmath"); const build = path.join(LLVM_BUILD, "libpgmath");
return { return {
name: "libpgmath", name: "libpgmath",
configurePhase: () => { configurePhase: async () => {
checkedSpawnSync(rm, ["-rf", build], spawnOptions); await promisifySpawn(spawn(rm, ["-rf", build], spawnOptions));
// Configure libpgmath. // Configure libpgmath.
checkedSpawnSync(cmake, command({ await promisifySpawn(spawn(cmake, command({
definitions: variable({ definitions: variable({
...general, ...general,
...{ ...{
@@ -98,10 +98,10 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[]
generator: "Ninja", generator: "Ninja",
pathToSource: path.join(src, "cflang", "runtime", "libpgmath"), pathToSource: path.join(src, "cflang", "runtime", "libpgmath"),
pathToBuild: build, pathToBuild: build,
}), spawnOptions); }), spawnOptions));
}, },
buildPhase: () => mkBuildPhase(build), buildPhase: mkBuildPhase(build),
installPhase: () => mkInstallPhase(build), installPhase: mkInstallPhase(build),
}; };
} }
@@ -109,11 +109,11 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[]
const build = path.join(LLVM_BUILD, "cflang"); const build = path.join(LLVM_BUILD, "cflang");
return { return {
name: "cflang", name: "cflang",
configurePhase: () => { configurePhase: async () => {
checkedSpawnSync(rm, ["-rf", build], spawnOptions); await promisifySpawn(spawn(rm, ["-rf", build], spawnOptions));
// Configure cflang. // Configure cflang.
checkedSpawnSync(cmake, command({ await promisifySpawn(spawn(cmake, command({
definitions: variable({ definitions: variable({
...llvmVar, ...llvmVar,
...general, ...general,
@@ -132,23 +132,29 @@ export function llvmPackages(src: string, installPrefix: string): PackageTask[]
generator: "Unix Makefiles", generator: "Unix Makefiles",
pathToSource: path.join(src, "cflang"), pathToSource: path.join(src, "cflang"),
pathToBuild: build, pathToBuild: build,
}), spawnOptions); }), spawnOptions));
}, },
buildPhase: () => mkBuildPhase(build), buildPhase: mkBuildPhase(build),
installPhase: () => mkInstallPhase(build), installPhase: mkInstallPhase(build),
}; };
} }
return [mkLLVMPackage(), mkLibpgmathPackage(), mkCflangPackage()]; return [mkLLVMPackage(), mkLibpgmathPackage(), mkCflangPackage()];
}
} export function buildLLVMHash(src: string, rev: string) { export async function buildLLVMHash(src: string, rev: string) {
// Checkout a git rev in some git repo. // Checkout a git rev in some git repo.
checkedSpawnSync("git", ["checkout", rev], { stdio: "inherit", cwd: src }); await promisifySpawn(spawn("git", ["checkout", rev], { stdio: "inherit", cwd: src }));
checkedSpawnSync("git", ["reset", "--hard", "HEAD"], { stdio: "inherit", cwd: src }); await promisifySpawn(spawn("git", ["reset", "--hard", "HEAD"], { stdio: "inherit", cwd: src }));
const llvmInstall = path.join(src, "local", "installed"); const llvmInstall = path.join(src, "local", "installed");
llvmPackages(src, path.join(llvmInstall, rev))
.forEach(buildPackage); const packages = llvmPackages(src, path.join(llvmInstall, rev));
// Packages must be built in-order.
for (const pkg of packages) {
await buildPackage(pkg);
}
} }