chromium: init, misc build sripts

This commit is contained in:
2024-12-03 21:59:38 +08:00
parent b3c9f7a0ff
commit f9a8cd0036
9 changed files with 5427 additions and 17 deletions

2603
assets/chromium/gn/no-rca.gn Normal file

File diff suppressed because it is too large Load Diff

2594
assets/chromium/gn/scalar.gn Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -64,27 +64,39 @@ function gnArgsToList(o: GNArgs) {
'dcheck_always_on=false',
'enable_libaom=false',
`clang_base_path="${o.clangBasePath}"`,
...undefList(o.symbolLevel, x => `symbol_level=${x}`),
...undefList(o.symbolLevel, x => [ `symbol_level=${x}` ]),
];
}
export interface ConfigureOptions {
source: string;
gnExe: string;
outDir: string;
gnArgs: GNArgs;
buildProfile: "simd" | "norca";
}
/**
* Invoke meta-build system "gn", returns the process.
*/
export function configure(source: string, gnExe: string, outDir: string, gnArgs: GNArgs) {
export async function configure({ source, gnExe, outDir, gnArgs, buildProfile }: ConfigureOptions) {
const assets = path.resolve(projectRoot, 'assets');
const chromiumBuildGN = path.resolve(chromiumSource, 'build', 'config', 'compiler', 'BUILD.gn');
const replacerGN = (() => {
const gnDir = path.resolve(assets, "chromium", "gn");
if (buildProfile == "norca") {
return path.resolve(gnDir, "no-rca.gn");
} else if (buildProfile == "simd") {
return path.resolve(gnDir, "simd.gn");
}
return path.resolve(gnDir, "scalar.gn");
})();
await fs.promises.copyFile(replacerGN, chromiumBuildGN);
return spawn(gnExe, [
'gen',
outDir,
...gn.generalOptions({ args: gnArgsToList(gnArgs) }),
], { cwd: source });
}
export async function enableSIMDFromSource() {
const assets = path.resolve(projectRoot, 'assets');
const chromiumSIMDGN = path.resolve(assets, 'chromium', 'build-simd.gn');
const chromiumBuildGN = path.resolve(chromiumSource, 'build', 'config', 'compiler', 'BUILD.gn');
await fs.promises.copyFile(chromiumSIMDGN, chromiumBuildGN);
}

View File

@@ -0,0 +1,55 @@
/**
* -close-rca-pass=true with 3fff408f20f8497b6ff511f7f37b0da96b19a16c compiler.
*/
import path from 'path';
import { chromiumGN } from '../../bin/lib.js';
import { chromiumSource } from '../../chromium.js';
import * as chromiumConfigure from "../configure.js";
import { mkdir } from 'fs/promises';
import { promisifySpawn } from '../../cli.js';
import { spawn } from 'child_process';
import { systemdRunOptions } from '../../commands/systemd.js';
import { randomUUID } from 'crypto';
const hash = '3fff408f20f8497b6ff511f7f37b0da96b19a16c';
const llvmPrefix = `/tmp/llvm-ly-install/${hash}`;
const outDir = path.resolve(chromiumSource, "out", "simd", "close-rca", hash);
await mkdir(outDir, { recursive: true });
const configureProcess = await chromiumConfigure.configure({
source: chromiumSource,
gnExe: chromiumGN,
outDir,
gnArgs: {
clangBasePath: llvmPrefix,
},
buildProfile: "norca"
});
configureProcess.stdout.pipe(process.stdout);
configureProcess.stderr.pipe(process.stderr);
await promisifySpawn(configureProcess);
const uuid = randomUUID();
// Invoke ninja build
const systemdUnitName = uuid;
console.log(`Running chromium build (hash: ${hash}) as ${systemdUnitName}`);
await promisifySpawn(spawn('systemd-run',
[
...systemdRunOptions({ user: true, unit: systemdUnitName }),
'ninja',
'-C',
outDir,
'chrome'
]
));

View File

@@ -0,0 +1,56 @@
/**
* -close-rca-pass=true with 3fff408f20f8497b6ff511f7f37b0da96b19a16c compiler.
*/
import path from 'path';
import { chromiumGN } from '../../bin/lib.js';
import { chromiumSource } from '../../chromium.js';
import * as chromiumConfigure from "../configure.js";
import { mkdir } from 'fs/promises';
import { promisifySpawn } from '../../cli.js';
import { spawn } from 'child_process';
import { systemdRunOptions } from '../../commands/systemd.js';
import { randomUUID } from 'crypto';
const hash = '3fff408f20f8497b6ff511f7f37b0da96b19a16c';
const llvmPrefix = `/tmp/llvm-ly-install/${hash}`;
const outDir = path.resolve(chromiumSource, "out", "simd", "symbolic", hash);
await mkdir(outDir, { recursive: true });
const configureProcess = await chromiumConfigure.configure({
source: chromiumSource,
gnExe: chromiumGN,
outDir,
gnArgs: {
clangBasePath: llvmPrefix,
symbolLevel: 2,
},
buildProfile: "norca"
});
configureProcess.stdout.pipe(process.stdout);
configureProcess.stderr.pipe(process.stderr);
await promisifySpawn(configureProcess);
const uuid = randomUUID();
// Invoke ninja build
const systemdUnitName = uuid;
console.log(`Running chromium build (hash: ${hash}) as ${systemdUnitName}`);
await promisifySpawn(spawn('systemd-run',
[
...systemdRunOptions({ user: true, unit: systemdUnitName }),
'ninja',
'-C',
outDir,
'chrome'
]
));

82
src/chromium/link.ts Normal file
View File

@@ -0,0 +1,82 @@
import { spawn } from 'child_process';
/**
* Link "chrome" executable
*/
export function linkChrome(linker: string, cwd: string) {
return spawn("python3", [
"../../../build/toolchain/gcc_link_wrapper.py",
"--output=./chrome",
"--",
linker,
"-Wl,--version-script=../../../build/linux/chrome.map",
"-Wl,--fatal-warnings",
"-Wl,--build-id",
"-fPIC",
"-Wl,-z,noexecstack",
"-Wl,-z,relro",
"-Wl,-z,now",
"-no-canonical-prefixes",
"-Wl,-O2",
"-Wl,--gc-sections",
"-rdynamic",
"-Wl,-z,defs",
"-Wl,--as-needed",
"-nostdlib++",
"-pie",
"-Wl,--disable-new-dtags",
"-o",
"./chrome",
"-Wl,--start-group",
"@./chrome.rsp",
"-Wl,--end-group",
"-ldl",
"-lpthread",
"-lrt",
"-lgmodule-2.0",
"-lgobject-2.0",
"-lgthread-2.0",
"-lglib-2.0",
"-lnss3",
"-lnssutil3",
"-lsmime3",
"-lplds4",
"-lplc4",
"-lnspr4",
"-latk-1.0",
"-latk-bridge-2.0",
"-lcups",
"-lgio-2.0",
"-ldbus-1",
"-latomic",
"-lresolv",
"-ljpeg",
"-lexpat",
"-luuid",
"-ldrm",
"-lm",
"-lX11",
"-lXcomposite",
"-lXdamage",
"-lXext",
"-lXfixes",
"-lXrender",
"-lXrandr",
"-lXtst",
"-lxcb",
"-lxkbcommon",
"-lgbm",
"-lwayland-client",
"-lpangocairo-1.0",
"-lpango-1.0",
"-lcairo",
"-lasound",
"-lpulse",
"-lXi",
"-lpci",
"-lz",
"-latspi",
"-lxshmfence",
"-llcms2",
], { cwd });
}

View File

@@ -6,6 +6,8 @@
import path from 'path';
import { chromiumSource } from '../../chromium.js';
import * as fs from 'fs';
import { linkChrome } from '../link.js';
import { promisifySpawn } from '../../cli.js';
const objects = [
"obj/skia/skia_core_and_effects/SkBlitRow_D32.o",
@@ -17,7 +19,13 @@ const objects = [
const scalarBuild = path.resolve(chromiumSource, "out", "Release");
const simdBuild = path.resolve(chromiumSource, "out", "c9094783eb43868cdbcf26b3266b0231d8fbd6e6", "Release");
await Promise.all(objects.map(async x => {
// Copy object from scalar directory to simd directory
await fs.promises.copyFile(path.resolve(scalarBuild, x), path.resolve(simdBuild, x));
}))
// await Promise.all(objects.map(async x => {
// // Copy object from scalar directory to simd directory
// await fs.promises.copyFile(path.resolve(scalarBuild, x), path.resolve(simdBuild, x));
// }));
// Invoke chromium linking command.
const linker = linkChrome('/tmp/llvm-ly-install/c9094783eb43868cdbcf26b3266b0231d8fbd6e6/bin/clang++', simdBuild);
linker.stdout.pipe(process.stdout);
linker.stderr.pipe(process.stderr);
await promisifySpawn(linker);

View File

@@ -9,6 +9,6 @@ export interface GeneralOptions {
export function generalOptions(o: GeneralOptions) {
return [
...optFlagEq("--args", o.args?.join(' ')),
...optFlagEq("--args", o.args?.join("\n")),
]
}