vscode/build/gulpfile.scan.ts
Matt Bierner e779f86b17
Build script cleanup
For #277526

Quick cleanup pass after converting these scripts
2025-11-24 14:07:28 -08:00

132 lines
4.1 KiB
TypeScript

/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import gulp from 'gulp';
import * as path from 'path';
import * as task from './lib/task.ts';
import * as util from './lib/util.ts';
import electron from '@vscode/gulp-electron';
import { config } from './lib/electron.ts';
import filter from 'gulp-filter';
import * as deps from './lib/dependencies.ts';
import { existsSync, readdirSync } from 'fs';
const root = path.dirname(import.meta.dirname);
const BUILD_TARGETS = [
{ platform: 'win32', arch: 'x64' },
{ platform: 'win32', arch: 'arm64' },
{ platform: 'darwin', arch: null, opts: { stats: true } },
{ platform: 'linux', arch: 'x64' },
{ platform: 'linux', arch: 'armhf' },
{ platform: 'linux', arch: 'arm64' },
];
// The following files do not have PDBs downloaded for them during the download symbols process.
const excludedCheckList = [
'd3dcompiler_47.dll',
'dxil.dll',
'dxcompiler.dll',
];
BUILD_TARGETS.forEach(buildTarget => {
const dashed = (str: string | null) => (str ? `-${str}` : ``);
const platform = buildTarget.platform;
const arch = buildTarget.arch;
const destinationExe = path.join(path.dirname(root), 'scanbin', `VSCode${dashed(platform)}${dashed(arch)}`, 'bin');
const destinationPdb = path.join(path.dirname(root), 'scanbin', `VSCode${dashed(platform)}${dashed(arch)}`, 'pdb');
const tasks: task.Task[] = [];
// removal tasks
tasks.push(util.rimraf(destinationExe), util.rimraf(destinationPdb));
// electron
tasks.push(() => electron.dest(destinationExe, { ...config, platform, arch: arch === 'armhf' ? 'arm' : arch }));
// pdbs for windows
if (platform === 'win32') {
tasks.push(
() => electron.dest(destinationPdb, { ...config, platform, arch: arch === 'armhf' ? 'arm' : arch, pdbs: true }),
() => confirmPdbsExist(destinationExe, destinationPdb)
);
}
if (platform === 'linux') {
tasks.push(
() => electron.dest(destinationPdb, { ...config, platform, arch: arch === 'armhf' ? 'arm' : arch, symbols: true })
);
}
// node modules
tasks.push(
nodeModules(destinationExe, destinationPdb, platform)
);
const setupSymbolsTask = task.define(`vscode-symbols${dashed(platform)}${dashed(arch)}`,
task.series(...tasks)
);
gulp.task(setupSymbolsTask);
});
function getProductionDependencySources() {
const productionDependencies = deps.getProductionDependencies(root);
return productionDependencies.map(d => path.relative(root, d)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`]).flat();
}
function nodeModules(destinationExe: string, destinationPdb: string, platform: string): task.CallbackTask {
const exe = () => {
return gulp.src(getProductionDependencySources(), { base: '.', dot: true })
.pipe(filter([
'**/*.node',
// Exclude these paths.
// We don't build the prebuilt node files so we don't scan them
'!**/prebuilds/**/*.node'
]))
.pipe(gulp.dest(destinationExe));
};
if (platform === 'win32') {
const pdb = () => {
return gulp.src(getProductionDependencySources(), { base: '.', dot: true })
.pipe(filter(['**/*.pdb']))
.pipe(gulp.dest(destinationPdb));
};
return gulp.parallel(exe, pdb) as task.CallbackTask;
}
if (platform === 'linux') {
const pdb = () => {
return gulp.src(getProductionDependencySources(), { base: '.', dot: true })
.pipe(filter(['**/*.sym']))
.pipe(gulp.dest(destinationPdb));
};
return gulp.parallel(exe, pdb) as task.CallbackTask;
}
return exe;
}
function confirmPdbsExist(destinationExe: string, destinationPdb: string) {
readdirSync(destinationExe).forEach(file => {
if (excludedCheckList.includes(file)) {
return;
}
if (file.endsWith('.dll') || file.endsWith('.exe')) {
const pdb = `${file}.pdb`;
if (!existsSync(path.join(destinationPdb, pdb))) {
throw new Error(`Missing pdb file for ${file}. Tried searching for ${pdb} in ${destinationPdb}.`);
}
}
});
return Promise.resolve();
}