diff --git a/Gruntfile.js b/Gruntfile.js index c354249f8b69..eba38704f3ee 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -24,9 +24,9 @@ module.exports = function (grunt) { cmd: 'node', args: ['tools/gen_version'], }, - 'generate-listings': { + 'generate-listings-and-webworkers': { cmd: 'node', - args: ['tools/gen_listings', 'gen/', ...kAllSuites.map(s => 'src/' + s)], + args: ['tools/gen_listings_and_webworkers', 'gen/', ...kAllSuites.map(s => 'src/' + s)], }, validate: { cmd: 'node', @@ -159,14 +159,14 @@ module.exports = function (grunt) { // Must run after generate-common and run:build-out. files: [ { expand: true, dest: 'out/', cwd: 'gen', src: 'common/internal/version.js' }, - { expand: true, dest: 'out/', cwd: 'gen', src: '*/listing.js' }, + { expand: true, dest: 'out/', cwd: 'gen', src: '*/**/*.js' }, ], }, 'gen-to-out-wpt': { // Must run after generate-common and run:build-out-wpt. files: [ { expand: true, dest: 'out-wpt/', cwd: 'gen', src: 'common/internal/version.js' }, - { expand: true, dest: 'out-wpt/', cwd: 'gen', src: 'webgpu/listing.js' }, + { expand: true, dest: 'out-wpt/', cwd: 'gen', src: 'webgpu/**/*.js' }, ], }, 'htmlfiles-to-out': { @@ -243,7 +243,7 @@ module.exports = function (grunt) { grunt.registerTask('generate-common', 'Generate files into gen/ and src/', [ 'run:generate-version', - 'run:generate-listings', + 'run:generate-listings-and-webworkers', 'run:generate-cache', ]); grunt.registerTask('build-standalone', 'Build out/ (no checks; run after generate-common)', [ diff --git a/src/common/tools/gen_listings_and_webworkers.ts b/src/common/tools/gen_listings_and_webworkers.ts new file mode 100644 index 000000000000..ca1f9ff99049 --- /dev/null +++ b/src/common/tools/gen_listings_and_webworkers.ts @@ -0,0 +1,91 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import * as process from 'process'; + +import { crawl } from './crawl.js'; + +function usage(rc: number): void { + console.error(`Usage: tools/gen_listings [options] [OUT_DIR] [SUITE_DIRS...] + +For each suite in SUITE_DIRS, generate listings into OUT_DIR/{suite}/listing.js, +and generate Web Worker proxies in OUT_DIR/{suite}/webworker/**/*.worker.js for +every .spec.js file. (Note {suite}/webworker/ is reserved for this purpose.) + +Example: + tools/gen_listings gen/ src/unittests/ src/webgpu/ + +Options: + --help Print this message and exit. +`); + process.exit(rc); +} + +const argv = process.argv; +if (argv.indexOf('--help') !== -1) { + usage(0); +} + +{ + // Ignore old argument that is now the default + const i = argv.indexOf('--no-validate'); + if (i !== -1) { + argv.splice(i, 1); + } +} + +if (argv.length < 4) { + usage(0); +} + +const myself = 'src/common/tools/gen_listings.ts'; + +const outDir = argv[2]; + +for (const suiteDir of argv.slice(3)) { + // Run concurrently for each suite (might be a tiny bit more efficient) + void crawl(suiteDir, false).then(listing => { + const suite = path.basename(suiteDir); + + // Write listing.js + const outFile = path.normalize(path.join(outDir, `${suite}/listing.js`)); + fs.mkdirSync(path.join(outDir, suite), { recursive: true }); + fs.writeFileSync( + outFile, + `\ +// AUTO-GENERATED - DO NOT EDIT. See ${myself}. + +export const listing = ${JSON.stringify(listing, undefined, 2)}; +` + ); + + // Write suite/webworker/**/*.worker.js + for (const entry of listing) { + if ('readme' in entry) continue; + + const outFileDir = path.join( + outDir, + suite, + 'webworker', + ...entry.file.slice(0, entry.file.length - 1) + ); + const outFile = path.join(outDir, suite, 'webworker', ...entry.file) + '.worker.js'; + + const relPathToSuiteRoot = Array(entry.file.length).fill('..').join('/'); + + fs.mkdirSync(outFileDir, { recursive: true }); + fs.writeFileSync( + outFile, + `\ +// AUTO-GENERATED - DO NOT EDIT. See ${myself}. + +// oldG is a TestGroup object (defined in common/internal/test_group.ts). +import { g as oldG } from '${relPathToSuiteRoot}/${entry.file.join('/')}.spec.js'; + +// FIXME: Expose a proxied test interface. I think this can completely replace test_worker-worker.js +// (using this instead of that), but if not then hopefully it can at least share code with it. +console.log(oldG.iterate()); +` + ); + } + }); +} diff --git a/src/demo/webworker/.gitignore b/src/demo/webworker/.gitignore new file mode 100644 index 000000000000..8496277ad72e --- /dev/null +++ b/src/demo/webworker/.gitignore @@ -0,0 +1,2 @@ +# DIRECTORY RESERVED FOR GENERATED FILES. See gen_listings_and_webworkers. +* diff --git a/src/manual/webworker/.gitignore b/src/manual/webworker/.gitignore new file mode 100644 index 000000000000..8496277ad72e --- /dev/null +++ b/src/manual/webworker/.gitignore @@ -0,0 +1,2 @@ +# DIRECTORY RESERVED FOR GENERATED FILES. See gen_listings_and_webworkers. +* diff --git a/src/stress/webworker/.gitignore b/src/stress/webworker/.gitignore new file mode 100644 index 000000000000..8496277ad72e --- /dev/null +++ b/src/stress/webworker/.gitignore @@ -0,0 +1,2 @@ +# DIRECTORY RESERVED FOR GENERATED FILES. See gen_listings_and_webworkers. +* diff --git a/src/unittests/webworker/.gitignore b/src/unittests/webworker/.gitignore new file mode 100644 index 000000000000..8496277ad72e --- /dev/null +++ b/src/unittests/webworker/.gitignore @@ -0,0 +1,2 @@ +# DIRECTORY RESERVED FOR GENERATED FILES. See gen_listings_and_webworkers. +* diff --git a/src/webgpu/webworker/.gitignore b/src/webgpu/webworker/.gitignore new file mode 100644 index 000000000000..8496277ad72e --- /dev/null +++ b/src/webgpu/webworker/.gitignore @@ -0,0 +1,2 @@ +# DIRECTORY RESERVED FOR GENERATED FILES. See gen_listings_and_webworkers. +* diff --git a/tools/gen_listings b/tools/gen_listings deleted file mode 100755 index 6c25622423a1..000000000000 --- a/tools/gen_listings +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node - -// Crawl a suite directory (e.g. src/webgpu/) to generate a listing.js containing -// the listing of test files in the suite. - -require('../src/common/tools/setup-ts-in-node.js'); -require('../src/common/tools/gen_listings.ts'); diff --git a/tools/gen_listings_and_webworkers b/tools/gen_listings_and_webworkers new file mode 100755 index 000000000000..285df3657d2a --- /dev/null +++ b/tools/gen_listings_and_webworkers @@ -0,0 +1,8 @@ +#!/usr/bin/env node + +// Crawl a suite directory (e.g. src/webgpu/) to generate a listing.js containing +// the listing of test files in the suite, and some generated test files +// (like suite/serviceworker/**/*.spec.js). + +require('../src/common/tools/setup-ts-in-node.js'); +require('../src/common/tools/gen_listings_and_webworkers.ts');