@git.zone/tsrust 1.13.2 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/.smartconfig.json +4 -0
  2. package/assets/notices/gcc-gpl-3.0.txt +674 -0
  3. package/assets/notices/gcc-runtime-library-exception-3.1.txt +73 -0
  4. package/assets/notices/glibc-lgpl-2.1.txt +502 -0
  5. package/assets/notices/musl-copyright.txt +193 -0
  6. package/dist_ts/00_commitinfo_data.js +1 -1
  7. package/dist_ts/index.d.ts +1 -0
  8. package/dist_ts/index.js +2 -1
  9. package/dist_ts/mod_cli/classes.tsrustcli.d.ts +10 -0
  10. package/dist_ts/mod_cli/classes.tsrustcli.js +91 -11
  11. package/dist_ts/mod_cli/helpers.targets.d.ts +2 -0
  12. package/dist_ts/mod_cli/helpers.targets.js +1 -1
  13. package/dist_ts/mod_matrix/classes.nativematrixbuilder.d.ts +6 -0
  14. package/dist_ts/mod_matrix/classes.nativematrixbuilder.js +44 -1
  15. package/dist_ts/mod_notices/classes.nativenoticesgenerator.d.ts +102 -0
  16. package/dist_ts/mod_notices/classes.nativenoticesgenerator.js +946 -0
  17. package/dist_ts/mod_notices/classes.noticetoolchain.d.ts +30 -0
  18. package/dist_ts/mod_notices/classes.noticetoolchain.js +69 -0
  19. package/dist_ts/mod_notices/helpers.licensetext.d.ts +12 -0
  20. package/dist_ts/mod_notices/helpers.licensetext.js +81 -0
  21. package/dist_ts/mod_notices/helpers.muslversion.d.ts +6 -0
  22. package/dist_ts/mod_notices/helpers.muslversion.js +47 -0
  23. package/dist_ts/mod_notices/helpers.noticesconfig.d.ts +71 -0
  24. package/dist_ts/mod_notices/helpers.noticesconfig.js +133 -0
  25. package/dist_ts/mod_notices/helpers.runtimetexts.d.ts +9 -0
  26. package/dist_ts/mod_notices/helpers.runtimetexts.js +45 -0
  27. package/dist_ts/mod_notices/helpers.spdx.d.ts +21 -0
  28. package/dist_ts/mod_notices/helpers.spdx.js +88 -0
  29. package/dist_ts/mod_notices/helpers.staticglibc.d.ts +26 -0
  30. package/dist_ts/mod_notices/helpers.staticglibc.js +45 -0
  31. package/dist_ts/mod_notices/index.d.ts +8 -0
  32. package/dist_ts/mod_notices/index.js +9 -0
  33. package/package.json +5 -5
  34. package/readme.md +123 -13
  35. package/ts/00_commitinfo_data.ts +1 -1
  36. package/ts/index.ts +1 -0
  37. package/ts/mod_cli/classes.tsrustcli.ts +104 -10
  38. package/ts/mod_cli/helpers.targets.ts +2 -0
  39. package/ts/mod_matrix/classes.nativematrixbuilder.ts +44 -0
  40. package/ts/mod_notices/classes.nativenoticesgenerator.ts +1201 -0
  41. package/ts/mod_notices/classes.noticetoolchain.ts +92 -0
  42. package/ts/mod_notices/helpers.licensetext.ts +111 -0
  43. package/ts/mod_notices/helpers.muslversion.ts +46 -0
  44. package/ts/mod_notices/helpers.noticesconfig.ts +235 -0
  45. package/ts/mod_notices/helpers.runtimetexts.ts +63 -0
  46. package/ts/mod_notices/helpers.spdx.ts +107 -0
  47. package/ts/mod_notices/helpers.staticglibc.ts +79 -0
  48. package/ts/mod_notices/index.ts +8 -0
@@ -0,0 +1,946 @@
1
+ import * as crypto from 'node:crypto';
2
+ import * as fs from 'node:fs';
3
+ import * as os from 'node:os';
4
+ import * as path from 'node:path';
5
+ import * as smolToml from 'smol-toml';
6
+ import { configuredAssemblyTargets } from '../mod_cli/helpers.targets.js';
7
+ import { muslSelfContainedLibc, resolveNoticeToolchain, rustSourceLockfile, ShellNoticeCommandRunner, } from './classes.noticetoolchain.js';
8
+ import { classifyLicenseText, describeUncoveredTerms, licenseAlternativesCovered, } from './helpers.licensetext.js';
9
+ import { readMuslVersion } from './helpers.muslversion.js';
10
+ import { assertNoStaticGlibc } from './helpers.staticglibc.js';
11
+ import { resolveNoticesConfig, } from './helpers.noticesconfig.js';
12
+ import { knownMuslVersions, readRuntimeLicenseText } from './helpers.runtimetexts.js';
13
+ import { parseSpdxExpression } from './helpers.spdx.js';
14
+ const noticesFormat = 'tsrust.native-notices';
15
+ const maximumNoticeFileBytes = 4 * 1024 * 1024;
16
+ const maximumLibcArchiveBytes = 64 * 1024 * 1024;
17
+ const licenseFilePattern = /^(?:licen[cs]e|copying|notice|copyright|unlicense)/i;
18
+ const acceptedFilesEntries = (directoryArg) => [
19
+ directoryArg,
20
+ `${directoryArg}/`,
21
+ `${directoryArg}/**`,
22
+ `${directoryArg}/**/*`,
23
+ ];
24
+ const sha256 = (contentsArg) => crypto.createHash('sha256').update(contentsArg).digest('hex');
25
+ const compareStrings = (leftArg, rightArg) => leftArg < rightArg ? -1 : leftArg > rightArg ? 1 : 0;
26
+ const packageKey = (nameArg, versionArg) => `${nameArg}@${versionArg}`;
27
+ const toPosix = (pathArg) => pathArg.split(path.sep).join('/');
28
+ const isInside = (baseArg, candidateArg) => {
29
+ const relative = path.relative(baseArg, candidateArg);
30
+ return relative !== '' && !relative.startsWith('..') && !path.isAbsolute(relative);
31
+ };
32
+ const glibcComponent = {
33
+ id: 'glibc',
34
+ name: 'glibc',
35
+ license: 'LGPL-2.1-or-later',
36
+ files: ['runtime/glibc/lgpl-2.1.txt'],
37
+ };
38
+ const gccComponent = {
39
+ id: 'gcc',
40
+ name: 'gcc',
41
+ license: 'GPL-3.0-or-later WITH GCC-exception-3.1',
42
+ files: ['runtime/gcc/gpl-3.0.txt', 'runtime/gcc/runtime-library-exception-3.1.txt'],
43
+ };
44
+ /**
45
+ * Generates the third-party notices for the native executables tsrust builds:
46
+ * the license files of every Cargo package compiled for a configured target,
47
+ * the bundled C libraries those packages declare, the Rust standard library
48
+ * runtime, and the C runtime implied by each target's linkage.
49
+ */
50
+ export class NativeNoticesGenerator {
51
+ options;
52
+ projectDir;
53
+ rustDir;
54
+ notices;
55
+ files = new Map();
56
+ usedOverrideKeys = new Set();
57
+ /**
58
+ * `resolve` may download Cargo packages; `verify` works offline from the
59
+ * local Cargo cache and the committed bundle, and downloads nothing.
60
+ */
61
+ mode = 'resolve';
62
+ constructor(options) {
63
+ this.options = options;
64
+ this.projectDir = path.resolve(options.projectDir);
65
+ this.rustDir = path.resolve(options.rustDir);
66
+ if (options.config.notices === undefined) {
67
+ throw new Error('Native notices are not configured: add "notices" to the @git.zone/tsrust configuration');
68
+ }
69
+ this.notices = resolveNoticesConfig(options.config.notices);
70
+ }
71
+ get directory() {
72
+ return path.join(this.projectDir, ...this.notices.directory.split('/'));
73
+ }
74
+ /** Builds the complete bundle in memory, downloading what it needs. */
75
+ async generate() {
76
+ return this.assemble('resolve');
77
+ }
78
+ async assemble(modeArg) {
79
+ this.mode = modeArg;
80
+ this.files.clear();
81
+ this.usedOverrideKeys.clear();
82
+ const targets = this.resolveTargets();
83
+ await this.assertPackageFilesShipDirectory();
84
+ for (const target of this.notices.runtime.keys()) {
85
+ if (!targets.some((candidate) => candidate.friendly === target)) {
86
+ throw new Error(`notices.runtime.${target} is not a notices target; configured targets: ${targets
87
+ .map((entry) => entry.friendly)
88
+ .join(', ')}`);
89
+ }
90
+ }
91
+ const packagesByKey = new Map();
92
+ const manifestTargets = [];
93
+ const runtimeDefinitions = new Map();
94
+ for (const target of targets) {
95
+ const closure = await this.readTargetClosure(target.triple);
96
+ for (const entry of closure) {
97
+ const key = packageKey(entry.name, entry.version);
98
+ const known = packagesByKey.get(key);
99
+ if (known && known.source !== entry.source) {
100
+ throw new Error(`${key} resolves from two different sources`);
101
+ }
102
+ packagesByKey.set(key, entry);
103
+ }
104
+ const runtime = await this.runtimeFor(target);
105
+ for (const definition of runtime) {
106
+ const known = runtimeDefinitions.get(definition.component.id);
107
+ if (known && JSON.stringify(known.component) !== JSON.stringify(definition.component)) {
108
+ throw new Error(`Runtime component ${definition.component.id} is declared differently for two targets`);
109
+ }
110
+ runtimeDefinitions.set(definition.component.id, definition);
111
+ }
112
+ manifestTargets.push({
113
+ target: target.friendly,
114
+ triple: target.triple,
115
+ linkage: target.linkage,
116
+ packages: closure.map((entry) => packageKey(entry.name, entry.version)).sort(compareStrings),
117
+ runtime: runtime.map((definition) => definition.component.id).sort(compareStrings),
118
+ });
119
+ }
120
+ const packages = [];
121
+ for (const key of [...packagesByKey.keys()].sort(compareStrings)) {
122
+ packages.push(await this.collectPackage(packagesByKey.get(key), 'crates'));
123
+ }
124
+ const standardLibrary = await this.collectStandardLibrary();
125
+ const unused = [...this.notices.packages.keys()].filter((key) => !this.usedOverrideKeys.has(key));
126
+ if (unused.length > 0) {
127
+ throw new Error(`Unused notices.packages overrides (no such package is compiled): ${unused.join(', ')}`);
128
+ }
129
+ for (const definition of [...runtimeDefinitions.values()]) {
130
+ for (const [name, contents] of definition.contents)
131
+ this.addFile(name, contents);
132
+ }
133
+ const runtime = [...runtimeDefinitions.values()]
134
+ .map((definition) => definition.component)
135
+ .sort((left, right) => compareStrings(left.id, right.id));
136
+ this.addFile('readme.md', Buffer.from(this.renderReadme(manifestTargets, packages, standardLibrary.packages, runtime)));
137
+ const fileHashes = Object.fromEntries([...this.files.keys()].sort(compareStrings).map((name) => [name, sha256(this.files.get(name))]));
138
+ const manifest = {
139
+ format: noticesFormat,
140
+ rust: { release: this.options.toolchain.release, commitHash: this.options.toolchain.commitHash },
141
+ targets: manifestTargets,
142
+ packages,
143
+ rustStandardLibrary: standardLibrary,
144
+ runtime,
145
+ files: fileHashes,
146
+ };
147
+ this.addFile('manifest.json', Buffer.from(`${JSON.stringify(manifest, null, 2)}\n`));
148
+ const files = new Map([...this.files.keys()].sort(compareStrings).map((name) => [name, this.files.get(name)]));
149
+ return { directory: this.directory, files };
150
+ }
151
+ /** Generates the bundle and replaces the notices directory with it. */
152
+ async write() {
153
+ const bundle = await this.generate();
154
+ const directory = bundle.directory;
155
+ const parent = path.dirname(directory);
156
+ await fs.promises.mkdir(parent, { recursive: true });
157
+ const existing = await this.lstatOptional(directory);
158
+ if (existing && (!existing.isDirectory() || existing.isSymbolicLink())) {
159
+ throw new Error(`Notices path is not a regular directory: ${directory}`);
160
+ }
161
+ const staging = await fs.promises.mkdtemp(path.join(parent, `.${path.basename(directory)}.tsrust-`));
162
+ let published = false;
163
+ try {
164
+ await fs.promises.chmod(staging, 0o755);
165
+ for (const [name, contents] of bundle.files) {
166
+ const target = path.join(staging, ...name.split('/'));
167
+ await fs.promises.mkdir(path.dirname(target), { recursive: true });
168
+ await fs.promises.writeFile(target, contents, { flag: 'wx' });
169
+ }
170
+ if (existing) {
171
+ const previous = `${staging}-previous`;
172
+ await fs.promises.rename(directory, previous);
173
+ await fs.promises.rename(staging, directory);
174
+ published = true;
175
+ await fs.promises.rm(previous, { recursive: true });
176
+ }
177
+ else {
178
+ await fs.promises.rename(staging, directory);
179
+ published = true;
180
+ }
181
+ }
182
+ finally {
183
+ if (!published)
184
+ await fs.promises.rm(staging, { recursive: true, force: true });
185
+ }
186
+ return bundle;
187
+ }
188
+ /**
189
+ * Verifies that the notices directory matches the bundle byte for byte,
190
+ * offline: it reads the local Cargo cache and the toolchain, verifies the
191
+ * committed standard-library notices against the toolchain's checksums,
192
+ * and downloads or installs nothing.
193
+ */
194
+ async check() {
195
+ const existing = await this.lstatOptional(this.directory);
196
+ if (!existing) {
197
+ throw new Error(`Native notices are missing at ${this.relativeDirectory}; run \`tsrust notices\` and commit the result`);
198
+ }
199
+ if (!existing.isDirectory() || existing.isSymbolicLink()) {
200
+ throw new Error(`Notices path is not a regular directory: ${this.directory}`);
201
+ }
202
+ const bundle = await this.assemble('verify');
203
+ const actual = await this.readDirectoryFiles(bundle.directory);
204
+ const differences = [];
205
+ for (const [name, contents] of bundle.files) {
206
+ const present = actual.get(name);
207
+ if (!present)
208
+ differences.push(`missing: ${name}`);
209
+ else if (!present.equals(contents))
210
+ differences.push(`differs: ${name}`);
211
+ }
212
+ for (const name of actual.keys()) {
213
+ if (!bundle.files.has(name))
214
+ differences.push(`unexpected: ${name}`);
215
+ }
216
+ if (differences.length > 0)
217
+ throw this.outOfDate(differences);
218
+ return bundle;
219
+ }
220
+ get relativeDirectory() {
221
+ return toPosix(path.relative(this.projectDir, this.directory));
222
+ }
223
+ outOfDate(differencesArg) {
224
+ return new Error(`Native notices at ${this.relativeDirectory} are out of date; run \`tsrust notices\` and review the diff:\n ${differencesArg
225
+ .sort(compareStrings)
226
+ .slice(0, 40)
227
+ .join('\n ')}`);
228
+ }
229
+ // -------------------------------------------------------------------------
230
+ // Targets and packaging
231
+ // -------------------------------------------------------------------------
232
+ resolveTargets() {
233
+ const targets = configuredAssemblyTargets(this.options.config);
234
+ if (targets.length === 0) {
235
+ throw new Error('Native notices require configured targets (targets or targetsByHost)');
236
+ }
237
+ return targets
238
+ .map(({ triple, friendly }) => {
239
+ if (triple.endsWith('-linux-gnu')) {
240
+ if (this.options.staticLinking) {
241
+ assertNoStaticGlibc({ targets: [{ triple, friendly }], staticLinking: true, rustflags: [], environment: {} });
242
+ }
243
+ return { triple, friendly, linkage: 'gnu-dynamic' };
244
+ }
245
+ if (triple.endsWith('-linux-musl'))
246
+ return { triple, friendly, linkage: 'musl-static' };
247
+ if (triple.endsWith('-apple-darwin'))
248
+ return { triple, friendly, linkage: 'darwin' };
249
+ throw new Error(`Native notices do not support target ${friendly} (${triple})`);
250
+ })
251
+ .sort((left, right) => compareStrings(left.friendly, right.friendly));
252
+ }
253
+ async assertPackageFilesShipDirectory() {
254
+ const directory = this.notices.directory;
255
+ let packageJson;
256
+ try {
257
+ packageJson = JSON.parse(await fs.promises.readFile(path.join(this.projectDir, 'package.json'), 'utf8'));
258
+ }
259
+ catch (error) {
260
+ throw new Error(`Native notices require a readable package.json: ${error.message}`);
261
+ }
262
+ const files = packageJson.files;
263
+ const entries = Array.isArray(files) ? files.filter((entry) => typeof entry === 'string') : [];
264
+ const excluded = entries.some((entry) => entry.startsWith(`!${directory}`));
265
+ if (excluded || !entries.some((entry) => acceptedFilesEntries(directory).includes(entry))) {
266
+ throw new Error(`package.json "files" must include "${directory}/**/*" (and exclude none of it) so the native notices ship with the package`);
267
+ }
268
+ }
269
+ // -------------------------------------------------------------------------
270
+ // Cargo packages
271
+ // -------------------------------------------------------------------------
272
+ parseMetadata(outputArg) {
273
+ let metadata;
274
+ try {
275
+ metadata = JSON.parse(outputArg);
276
+ }
277
+ catch {
278
+ throw new Error('cargo metadata returned invalid JSON');
279
+ }
280
+ if (!Array.isArray(metadata?.packages) || !Array.isArray(metadata.workspace_members)) {
281
+ throw new Error('cargo metadata returned an unexpected shape');
282
+ }
283
+ return metadata;
284
+ }
285
+ /**
286
+ * Resolves every non-workspace package compiled for a target: the normal
287
+ * and build dependencies of the workspace's binary packages, transitively,
288
+ * including procedural macros. Development dependencies are excluded.
289
+ */
290
+ async readTargetClosure(tripleArg) {
291
+ const offline = this.mode === 'verify' ? ['--offline'] : [];
292
+ let output;
293
+ try {
294
+ output = await this.options.commandRunner.run('cargo', ['metadata', '--format-version', '1', '--locked', ...offline, '--filter-platform', tripleArg], this.rustDir);
295
+ }
296
+ catch (error) {
297
+ if (this.mode !== 'verify')
298
+ throw error;
299
+ const rustDir = toPosix(path.relative(this.projectDir, this.rustDir)) || '.';
300
+ throw new Error(`\`tsrust notices --check\` never downloads, and cargo metadata --offline failed. If Cargo packages are ` +
301
+ `missing from the local Cargo cache, run \`cargo fetch --locked\` in ${rustDir} (or \`tsrust notices\`) ` +
302
+ `and check again.\n${error.message}`);
303
+ }
304
+ const metadata = this.parseMetadata(output);
305
+ if (!Array.isArray(metadata.resolve?.nodes))
306
+ throw new Error('cargo metadata returned no dependency resolution');
307
+ const packagesById = new Map(metadata.packages.map((entry) => [entry.id, entry]));
308
+ const nodesById = new Map(metadata.resolve.nodes.map((node) => [node.id, node]));
309
+ const workspace = new Set(metadata.workspace_members);
310
+ const roots = metadata.workspace_members.filter((id) => packagesById.get(id)?.targets.some((target) => target.kind.includes('bin')));
311
+ if (roots.length === 0)
312
+ throw new Error('The Cargo workspace has no binary package');
313
+ const reached = new Set();
314
+ const pending = [...roots];
315
+ while (pending.length > 0) {
316
+ const id = pending.pop();
317
+ if (reached.has(id))
318
+ continue;
319
+ reached.add(id);
320
+ const node = nodesById.get(id);
321
+ if (!node)
322
+ throw new Error(`cargo metadata has no resolution for ${id}`);
323
+ for (const dependency of node.deps) {
324
+ if (dependency.dep_kinds.some((kind) => kind.kind === null || kind.kind === 'build')) {
325
+ pending.push(dependency.pkg);
326
+ }
327
+ }
328
+ }
329
+ return [...reached]
330
+ .filter((id) => !workspace.has(id))
331
+ .map((id) => {
332
+ const entry = packagesById.get(id);
333
+ if (!entry)
334
+ throw new Error(`cargo metadata has no package ${id}`);
335
+ return entry;
336
+ });
337
+ }
338
+ licenseExpressionFor(packageArg, overrideArg) {
339
+ const key = packageKey(packageArg.name, packageArg.version);
340
+ const declared = packageArg.license;
341
+ let declaredError;
342
+ if (declared) {
343
+ let alternatives;
344
+ try {
345
+ alternatives = parseSpdxExpression(declared).alternatives;
346
+ }
347
+ catch (error) {
348
+ declaredError = error.message;
349
+ }
350
+ if (alternatives) {
351
+ if (overrideArg?.license !== undefined) {
352
+ throw new Error(`${key} declares "${declared}"; remove notices.packages["${key}"].license`);
353
+ }
354
+ return { expression: declared, alternatives };
355
+ }
356
+ }
357
+ if (overrideArg?.license !== undefined) {
358
+ try {
359
+ return { expression: overrideArg.license, alternatives: parseSpdxExpression(overrideArg.license).alternatives };
360
+ }
361
+ catch (error) {
362
+ throw new Error(`notices.packages["${key}"].license: ${error.message}`);
363
+ }
364
+ }
365
+ if (declaredError)
366
+ throw new Error(`${key}: ${declaredError}; set notices.packages["${key}"].license`);
367
+ throw new Error(`${key} declares no license; set notices.packages["${key}"].license`);
368
+ }
369
+ async readRegularFile(fileArg, baseArg, scopeArg, labelArg, maximumBytesArg = maximumNoticeFileBytes) {
370
+ if (!isInside(baseArg, fileArg))
371
+ throw new Error(`${labelArg} must stay inside the ${scopeArg}`);
372
+ const stat = await this.lstatOptional(fileArg);
373
+ if (!stat)
374
+ throw new Error(`${labelArg} does not exist: ${fileArg}`);
375
+ if (!stat.isFile() || stat.isSymbolicLink())
376
+ throw new Error(`${labelArg} is not a regular file: ${fileArg}`);
377
+ if (stat.size > maximumBytesArg)
378
+ throw new Error(`${labelArg} exceeds its size limit: ${fileArg}`);
379
+ const [realBase, realFile] = await Promise.all([fs.promises.realpath(baseArg), fs.promises.realpath(fileArg)]);
380
+ if (!isInside(realBase, realFile))
381
+ throw new Error(`${labelArg} must stay inside the ${scopeArg}`);
382
+ return fs.promises.readFile(fileArg);
383
+ }
384
+ async collectPackage(packageArg, prefixArg) {
385
+ const key = packageKey(packageArg.name, packageArg.version);
386
+ const override = this.notices.packages.get(key);
387
+ if (override)
388
+ this.usedOverrideKeys.add(key);
389
+ const { expression, alternatives } = this.licenseExpressionFor(packageArg, override);
390
+ const crateRoot = path.dirname(path.resolve(packageArg.manifest_path));
391
+ const directory = `${prefixArg}/${packageArg.name}-${packageArg.version}`;
392
+ const collected = new Map();
393
+ const addCollected = (sourceArg, contentsArg, licensesArg) => {
394
+ const known = collected.get(sourceArg);
395
+ if (known) {
396
+ for (const license of licensesArg)
397
+ known.licenses.add(license);
398
+ return;
399
+ }
400
+ const name = path.basename(sourceArg).toLowerCase();
401
+ if ([...collected.values()].some((entry) => entry.name === name)) {
402
+ throw new Error(`${key} has two license files named ${name}`);
403
+ }
404
+ collected.set(sourceArg, {
405
+ name,
406
+ contents: contentsArg,
407
+ licenses: new Set([...classifyLicenseText(contentsArg), ...licensesArg]),
408
+ });
409
+ };
410
+ const rootEntries = (await fs.promises.readdir(crateRoot, { withFileTypes: true }))
411
+ .filter((entry) => licenseFilePattern.test(entry.name) && !entry.isDirectory())
412
+ .map((entry) => path.join(crateRoot, entry.name));
413
+ if (packageArg.license_file)
414
+ rootEntries.push(path.resolve(crateRoot, packageArg.license_file));
415
+ for (const file of [...new Set(rootEntries)].sort(compareStrings)) {
416
+ addCollected(file, await this.readRegularFile(file, crateRoot, 'crate', `${key} license file`), []);
417
+ }
418
+ const families = () => new Set([...collected.values()].flatMap((entry) => [...entry.licenses]));
419
+ if (override?.files) {
420
+ if (licenseAlternativesCovered(alternatives, families())) {
421
+ throw new Error(`notices.packages["${key}"].files is no longer needed: the package's own files cover "${expression}"`);
422
+ }
423
+ for (const [index, file] of override.files.entries()) {
424
+ const base = file.from === 'project' ? this.projectDir : crateRoot;
425
+ const source = path.resolve(base, file.path);
426
+ addCollected(source, await this.readRegularFile(source, base, file.from, `notices.packages["${key}"].files[${index}]`), file.licenses);
427
+ }
428
+ }
429
+ if (!licenseAlternativesCovered(alternatives, families())) {
430
+ const found = [...collected.values()]
431
+ .map((entry) => `${entry.name} [${[...entry.licenses].sort(compareStrings).join(', ')}]`)
432
+ .join(', ');
433
+ throw new Error(`${key} (${expression}): no license text covers ${describeUncoveredTerms(alternatives, families())}; ` +
434
+ `found ${found || 'no license files'}. Declare reviewed texts in notices.packages["${key}"].files`);
435
+ }
436
+ const files = [...collected.values()]
437
+ .sort((left, right) => compareStrings(left.name, right.name))
438
+ .map((entry) => {
439
+ const filePath = `${directory}/${entry.name}`;
440
+ this.addFile(filePath, entry.contents);
441
+ return { path: filePath, licenses: [...entry.licenses].sort(compareStrings) };
442
+ });
443
+ const result = {
444
+ name: packageArg.name,
445
+ version: packageArg.version,
446
+ source: packageArg.source ?? 'local',
447
+ license: expression,
448
+ files,
449
+ };
450
+ if (packageArg.links && override?.native === undefined) {
451
+ throw new Error(`${key} links native library "${packageArg.links}"; declare the C/C++ libraries it compiles in ` +
452
+ `notices.packages["${key}"].native ([] when it bundles none)`);
453
+ }
454
+ if (override?.native && override.native.length > 0) {
455
+ result.native = [];
456
+ for (const component of override.native) {
457
+ result.native.push(await this.collectNativeComponent(key, packageArg, crateRoot, component));
458
+ }
459
+ }
460
+ const extraTexts = await this.collectExtraTexts(key, directory, override);
461
+ if (extraTexts.length > 0)
462
+ result.extraTexts = extraTexts;
463
+ return result;
464
+ }
465
+ /**
466
+ * Copies the reviewed extra texts the project declares for a package into
467
+ * `<directory>/extra/`, after verifying each against its SHA-256 pin. They
468
+ * are collected after the coverage check and never count towards it.
469
+ */
470
+ async collectExtraTexts(keyArg, directoryArg, overrideArg) {
471
+ const extraTexts = [];
472
+ for (const [index, text] of (overrideArg?.extraTexts || []).entries()) {
473
+ const label = `notices.packages["${keyArg}"].extraTexts[${index}] (${text.path})`;
474
+ const contents = await this.readRegularFile(path.resolve(this.projectDir, text.path), this.projectDir, 'project', label);
475
+ const digest = sha256(contents);
476
+ if (digest !== text.sha256) {
477
+ throw new Error(`${label} has SHA-256 ${digest}, but its pin is ${text.sha256}; review the text and update the pin`);
478
+ }
479
+ const filePath = `${directoryArg}/extra/${path.posix.basename(text.path).toLowerCase()}`;
480
+ if (extraTexts.some((entry) => entry.path === filePath)) {
481
+ throw new Error(`notices.packages["${keyArg}"].extraTexts has two files named ${path.posix.basename(filePath)}`);
482
+ }
483
+ this.addFile(filePath, contents);
484
+ extraTexts.push({ path: filePath, kind: text.kind, ...(text.component ? { component: text.component } : {}) });
485
+ }
486
+ return extraTexts.sort((left, right) => compareStrings(left.path, right.path));
487
+ }
488
+ async collectNativeComponent(keyArg, packageArg, crateRootArg, componentArg) {
489
+ const label = `${keyArg} native component ${componentArg.name}@${componentArg.version}`;
490
+ let alternatives;
491
+ try {
492
+ alternatives = parseSpdxExpression(componentArg.license).alternatives;
493
+ }
494
+ catch (error) {
495
+ throw new Error(`${label}: ${error.message}`);
496
+ }
497
+ const directory = `native/${packageArg.name}-${packageArg.version}/${componentArg.name}-${componentArg.version}`;
498
+ const files = [];
499
+ const families = new Set();
500
+ for (const file of componentArg.files) {
501
+ const contents = await this.readRegularFile(path.resolve(crateRootArg, file), crateRootArg, 'crate', `${label} file ${file}`);
502
+ const licenses = classifyLicenseText(contents).sort(compareStrings);
503
+ for (const license of licenses)
504
+ families.add(license);
505
+ const filePath = `${directory}/${file.toLowerCase().split('/').join('-')}`;
506
+ if (files.some((entry) => entry.path === filePath))
507
+ throw new Error(`${label} lists ${file} twice`);
508
+ this.addFile(filePath, contents);
509
+ files.push({ path: filePath, licenses });
510
+ }
511
+ if (!licenseAlternativesCovered(alternatives, families)) {
512
+ throw new Error(`${label} (${componentArg.license}): no license text covers ${describeUncoveredTerms(alternatives, families)}`);
513
+ }
514
+ return {
515
+ name: componentArg.name,
516
+ version: componentArg.version,
517
+ license: componentArg.license,
518
+ files: files.sort((left, right) => compareStrings(left.path, right.path)),
519
+ };
520
+ }
521
+ // -------------------------------------------------------------------------
522
+ // Rust standard library
523
+ // -------------------------------------------------------------------------
524
+ async collectStandardLibrary() {
525
+ const sysroot = this.options.toolchain.sysroot;
526
+ const documentation = path.join(sysroot, 'share', 'doc', 'rust');
527
+ const release = this.options.toolchain.release;
528
+ const files = [];
529
+ const addSysrootFile = async (sourceArg, targetArg) => {
530
+ this.addFile(targetArg, await this.readRegularFile(sourceArg, sysroot, 'toolchain', `Rust ${release} runtime notice`));
531
+ files.push(targetArg);
532
+ };
533
+ const copyright = path.join(documentation, 'COPYRIGHT-library.html');
534
+ await addSysrootFile(copyright, 'rust/copyright-library.html');
535
+ const licenses = (await fs.promises.readdir(path.join(documentation, 'licenses'), { withFileTypes: true }))
536
+ .filter((entry) => !entry.isDirectory())
537
+ .map((entry) => entry.name)
538
+ .sort(compareStrings);
539
+ if (licenses.length === 0)
540
+ throw new Error(`Rust ${release} ships no license texts in ${documentation}`);
541
+ for (const license of licenses) {
542
+ await addSysrootFile(path.join(documentation, 'licenses', license), `rust/licenses/${license.toLowerCase()}`);
543
+ }
544
+ const lockfile = smolToml.parse(await fs.promises.readFile(rustSourceLockfile(sysroot), 'utf8'));
545
+ const registryPackages = [];
546
+ for (const entry of lockfile.package || []) {
547
+ if (typeof entry.source !== 'string' || !entry.source.startsWith('registry+'))
548
+ continue;
549
+ if (typeof entry.name !== 'string' || typeof entry.version !== 'string' || typeof entry.checksum !== 'string') {
550
+ throw new Error(`Rust ${release} library/Cargo.lock has an incomplete registry package`);
551
+ }
552
+ registryPackages.push({ name: entry.name, version: entry.version, checksum: entry.checksum });
553
+ }
554
+ const builtins = path.join(path.dirname(rustSourceLockfile(sysroot)), 'compiler-builtins', 'LICENSE.txt');
555
+ if (await this.lstatOptional(builtins)) {
556
+ await addSysrootFile(builtins, 'rust/compiler-builtins-license.txt');
557
+ }
558
+ else if (!registryPackages.some((entry) => entry.name === 'compiler_builtins')) {
559
+ throw new Error(`Rust ${release} rust-src has no compiler-builtins license`);
560
+ }
561
+ // The toolchain inventory lists the standard library's crates.io
562
+ // dependencies, but not all of them; fetch the license files of the rest.
563
+ const inventory = await fs.promises.readFile(copyright, 'utf8');
564
+ const listed = new Set([...inventory.matchAll(/📦 ([^<\s]+)<\/h3>/gu)].map((match) => match[1]));
565
+ if (listed.size === 0)
566
+ throw new Error(`Rust ${release} COPYRIGHT-library.html has an unrecognised format`);
567
+ const gaps = registryPackages
568
+ .filter((entry) => !listed.has(`${entry.name}-${entry.version}`))
569
+ .sort((left, right) => compareStrings(packageKey(left.name, left.version), packageKey(right.name, right.version)));
570
+ if (this.mode === 'verify') {
571
+ return { files, packages: await this.committedStandardLibraryPackages(gaps) };
572
+ }
573
+ const packages = [];
574
+ const resolved = await this.resolveStandardLibraryGaps(gaps);
575
+ for (const [index, entry] of resolved.entries()) {
576
+ const collected = await this.collectPackage(entry, 'rust/crates');
577
+ packages.push({
578
+ name: collected.name,
579
+ version: collected.version,
580
+ source: collected.source,
581
+ checksum: gaps[index].checksum,
582
+ license: collected.license,
583
+ files: collected.files,
584
+ ...(collected.native ? { native: collected.native } : {}),
585
+ ...(collected.extraTexts ? { extraTexts: collected.extraTexts } : {}),
586
+ });
587
+ }
588
+ return { files, packages };
589
+ }
590
+ /**
591
+ * Offline counterpart of `resolveStandardLibraryGaps`: the committed notices
592
+ * must cover exactly the toolchain's uninventoried dependencies with the
593
+ * checksums of its library/Cargo.lock, and their files must match the
594
+ * committed digests.
595
+ */
596
+ async committedStandardLibraryPackages(gapsArg) {
597
+ const stale = (detailArg) => new Error(`${detailArg}; run \`tsrust notices\` and review the diff`);
598
+ let committed;
599
+ try {
600
+ committed = JSON.parse(await fs.promises.readFile(path.join(this.directory, 'manifest.json'), 'utf8'));
601
+ }
602
+ catch {
603
+ throw stale(`Native notices at ${this.relativeDirectory} have no readable manifest.json`);
604
+ }
605
+ const entries = committed.rustStandardLibrary?.packages;
606
+ const hashes = committed.files;
607
+ if (!Array.isArray(entries) || !hashes || typeof hashes !== 'object' || Array.isArray(hashes)) {
608
+ throw stale(`Native notices at ${this.relativeDirectory} have a malformed manifest.json`);
609
+ }
610
+ const isString = (valueArg) => typeof valueArg === 'string' && valueArg.length > 0;
611
+ const readFiles = (valueArg) => {
612
+ if (!Array.isArray(valueArg))
613
+ throw stale('manifest.json lists malformed standard-library files');
614
+ return valueArg.map((file) => {
615
+ const entry = file;
616
+ if (!isString(entry.path) || !Array.isArray(entry.licenses) || !entry.licenses.every(isString)) {
617
+ throw stale('manifest.json lists malformed standard-library files');
618
+ }
619
+ return { path: entry.path, licenses: entry.licenses };
620
+ });
621
+ };
622
+ const packages = entries.map((raw) => {
623
+ const entry = raw;
624
+ if (![entry.name, entry.version, entry.source, entry.checksum, entry.license].every(isString)) {
625
+ throw stale('manifest.json lists a malformed standard-library package');
626
+ }
627
+ const result = {
628
+ name: entry.name,
629
+ version: entry.version,
630
+ source: entry.source,
631
+ checksum: entry.checksum,
632
+ license: entry.license,
633
+ files: readFiles(entry.files),
634
+ };
635
+ if (entry.native !== undefined) {
636
+ if (!Array.isArray(entry.native))
637
+ throw stale('manifest.json lists malformed native components');
638
+ result.native = entry.native.map((nativeRaw) => {
639
+ const component = nativeRaw;
640
+ if (![component.name, component.version, component.license].every(isString)) {
641
+ throw stale('manifest.json lists malformed native components');
642
+ }
643
+ return {
644
+ name: component.name,
645
+ version: component.version,
646
+ license: component.license,
647
+ files: readFiles(component.files),
648
+ };
649
+ });
650
+ }
651
+ return result;
652
+ });
653
+ const describe = (listArg) => listArg.map((entry) => `${packageKey(entry.name, entry.version)} (${entry.checksum})`).join(', ') || 'none';
654
+ if (describe(packages) !== describe(gapsArg)) {
655
+ throw stale(`The standard-library dependencies of Rust ${this.options.toolchain.release} missing from its inventory ` +
656
+ `are ${describe(gapsArg)}, but the committed notices cover ${describe(packages)}`);
657
+ }
658
+ const differences = [];
659
+ for (const entry of packages) {
660
+ const key = packageKey(entry.name, entry.version);
661
+ const override = this.notices.packages.get(key);
662
+ if (override)
663
+ this.usedOverrideKeys.add(key);
664
+ // Licenses are re-derived as `collectPackage` derives them: the text's
665
+ // classification plus the identifiers an override declares for it.
666
+ const declared = new Map();
667
+ for (const file of override?.files || []) {
668
+ const name = path.posix.basename(file.path).toLowerCase();
669
+ declared.set(name, [...(declared.get(name) || []), ...file.licenses]);
670
+ }
671
+ const fileGroups = [
672
+ { prefix: `rust/crates/${entry.name}-${entry.version}/`, files: entry.files, declared },
673
+ ...(entry.native || []).map((component) => ({
674
+ prefix: `native/${entry.name}-${entry.version}/${component.name}-${component.version}/`,
675
+ files: component.files,
676
+ declared: new Map(),
677
+ })),
678
+ ];
679
+ for (const group of fileGroups) {
680
+ for (const file of group.files) {
681
+ if (!file.path.startsWith(group.prefix) || file.path.split('/').some((segment) => segment === '..')) {
682
+ throw stale(`manifest.json lists ${file.path} outside ${group.prefix}`);
683
+ }
684
+ const committedFile = path.join(this.directory, ...file.path.split('/'));
685
+ const stat = await this.lstatOptional(committedFile);
686
+ if (!stat || !stat.isFile() || stat.isSymbolicLink()) {
687
+ differences.push(`missing: ${file.path}`);
688
+ continue;
689
+ }
690
+ const contents = await fs.promises.readFile(committedFile);
691
+ if (sha256(contents) !== hashes[file.path]) {
692
+ differences.push(`differs: ${file.path}`);
693
+ continue;
694
+ }
695
+ this.addFile(file.path, contents);
696
+ file.licenses = [
697
+ ...new Set([...classifyLicenseText(contents), ...(group.declared.get(path.posix.basename(file.path)) || [])]),
698
+ ].sort(compareStrings);
699
+ }
700
+ }
701
+ const families = new Set(entry.files.flatMap((file) => file.licenses));
702
+ let alternatives;
703
+ try {
704
+ alternatives = parseSpdxExpression(entry.license).alternatives;
705
+ }
706
+ catch (error) {
707
+ throw stale(`${key}: ${error.message}`);
708
+ }
709
+ if (!licenseAlternativesCovered(alternatives, families)) {
710
+ throw stale(`${key} (${entry.license}): the committed texts do not cover ${describeUncoveredTerms(alternatives, families)}`);
711
+ }
712
+ // Extra texts are read from the project and verified against their pins.
713
+ const extraTexts = await this.collectExtraTexts(key, `rust/crates/${entry.name}-${entry.version}`, override);
714
+ if (extraTexts.length > 0)
715
+ entry.extraTexts = extraTexts;
716
+ }
717
+ if (differences.length > 0)
718
+ throw this.outOfDate(differences);
719
+ return packages;
720
+ }
721
+ async resolveStandardLibraryGaps(gapsArg) {
722
+ if (gapsArg.length === 0)
723
+ return [];
724
+ const workspace = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'tsrust-notices-std-'));
725
+ try {
726
+ const dependencies = gapsArg
727
+ .map((entry, index) => `dependency${index} = { package = "${entry.name}", version = "=${entry.version}", default-features = false }`)
728
+ .join('\n');
729
+ await fs.promises.writeFile(path.join(workspace, 'Cargo.toml'), `[package]\nname = "tsrust-notices-standard-library"\nversion = "0.0.0"\nedition = "2021"\npublish = false\n\n[lib]\npath = "lib.rs"\n\n[dependencies]\n${dependencies}\n`);
730
+ await fs.promises.writeFile(path.join(workspace, 'lib.rs'), '');
731
+ // Run from the Rust directory so the project's Cargo configuration
732
+ // (registry mirrors, vendored sources) applies.
733
+ const metadata = this.parseMetadata(await this.options.commandRunner.run('cargo', ['metadata', '--format-version', '1', '--manifest-path', path.join(workspace, 'Cargo.toml')], this.rustDir));
734
+ const lockfile = smolToml.parse(await fs.promises.readFile(path.join(workspace, 'Cargo.lock'), 'utf8'));
735
+ return gapsArg.map((gap) => {
736
+ const key = packageKey(gap.name, gap.version);
737
+ const resolved = metadata.packages.find((entry) => entry.name === gap.name && entry.version === gap.version && entry.source?.startsWith('registry+'));
738
+ const locked = (lockfile.package || []).find((entry) => entry.name === gap.name && entry.version === gap.version);
739
+ if (!resolved || !locked)
740
+ throw new Error(`Could not resolve standard-library dependency ${key}`);
741
+ if (locked.checksum !== gap.checksum) {
742
+ throw new Error(`Standard-library dependency ${key} resolved with checksum ${String(locked.checksum)}, but the toolchain records ${gap.checksum}`);
743
+ }
744
+ return resolved;
745
+ });
746
+ }
747
+ finally {
748
+ await fs.promises.rm(workspace, { recursive: true, force: true });
749
+ }
750
+ }
751
+ // -------------------------------------------------------------------------
752
+ // C runtime
753
+ // -------------------------------------------------------------------------
754
+ async runtimeFor(targetArg) {
755
+ const definitions = [];
756
+ if (targetArg.linkage === 'musl-static') {
757
+ const libc = muslSelfContainedLibc(this.options.toolchain.sysroot, targetArg.triple);
758
+ const version = readMuslVersion(await this.readRegularFile(libc, this.options.toolchain.sysroot, 'toolchain', `musl libc for ${targetArg.friendly}`, maximumLibcArchiveBytes));
759
+ if (!knownMuslVersions.includes(version)) {
760
+ throw new Error(`Rust ${this.options.toolchain.release} links musl ${version} into ${targetArg.friendly}; tsrust has no reviewed copyright text for musl ${version}`);
761
+ }
762
+ const file = `runtime/musl-${version}/copyright`;
763
+ definitions.push({
764
+ component: { id: `musl-${version}`, name: 'musl', version, license: 'MIT', files: [file] },
765
+ contents: new Map([[file, await readRuntimeLicenseText('musl')]]),
766
+ });
767
+ }
768
+ if (targetArg.linkage === 'gnu-dynamic') {
769
+ definitions.push({
770
+ component: glibcComponent,
771
+ contents: new Map([[glibcComponent.files[0], await readRuntimeLicenseText('glibc-lgpl-2.1')]]),
772
+ });
773
+ }
774
+ if (targetArg.linkage !== 'darwin') {
775
+ definitions.push({
776
+ component: gccComponent,
777
+ contents: new Map([
778
+ [gccComponent.files[0], await readRuntimeLicenseText('gcc-gpl-3.0')],
779
+ [gccComponent.files[1], await readRuntimeLicenseText('gcc-runtime-library-exception-3.1')],
780
+ ]),
781
+ });
782
+ }
783
+ for (const component of this.notices.runtime.get(targetArg.friendly) || []) {
784
+ definitions.push(await this.configuredRuntime(targetArg, component));
785
+ }
786
+ const ids = definitions.map((definition) => definition.component.id);
787
+ if (new Set(ids).size !== ids.length) {
788
+ throw new Error(`notices.runtime.${targetArg.friendly} repeats a runtime component: ${ids.join(', ')}`);
789
+ }
790
+ return definitions;
791
+ }
792
+ async configuredRuntime(targetArg, componentArg) {
793
+ const id = componentArg.version ? `${componentArg.name}-${componentArg.version}` : componentArg.name;
794
+ const label = `notices.runtime.${targetArg.friendly} component ${id}`;
795
+ let alternatives;
796
+ try {
797
+ alternatives = parseSpdxExpression(componentArg.license).alternatives;
798
+ }
799
+ catch (error) {
800
+ throw new Error(`${label}: ${error.message}`);
801
+ }
802
+ const contents = new Map();
803
+ const families = new Set();
804
+ for (const file of componentArg.files) {
805
+ const data = await this.readRegularFile(path.resolve(this.projectDir, file), this.projectDir, 'project', `${label} file ${file}`);
806
+ for (const license of classifyLicenseText(data))
807
+ families.add(license);
808
+ const name = `runtime/${id}/${path.posix.basename(file).toLowerCase()}`;
809
+ if (contents.has(name))
810
+ throw new Error(`${label} has two files named ${path.posix.basename(name)}`);
811
+ contents.set(name, data);
812
+ }
813
+ if (!licenseAlternativesCovered(alternatives, families)) {
814
+ throw new Error(`${label} (${componentArg.license}): no license text covers ${describeUncoveredTerms(alternatives, families)}`);
815
+ }
816
+ return {
817
+ component: {
818
+ id,
819
+ name: componentArg.name,
820
+ ...(componentArg.version ? { version: componentArg.version } : {}),
821
+ license: componentArg.license,
822
+ files: [...contents.keys()].sort(compareStrings),
823
+ },
824
+ contents,
825
+ };
826
+ }
827
+ // -------------------------------------------------------------------------
828
+ // Output
829
+ // -------------------------------------------------------------------------
830
+ addFile(nameArg, contentsArg) {
831
+ const known = this.files.get(nameArg);
832
+ if (known && !known.equals(contentsArg))
833
+ throw new Error(`Two different notices map to ${nameArg}`);
834
+ this.files.set(nameArg, contentsArg);
835
+ }
836
+ renderReadme(targetsArg, packagesArg, standardLibraryPackagesArg, runtimeArg) {
837
+ const toolchain = this.options.toolchain;
838
+ const lockfile = toPosix(path.relative(this.projectDir, path.join(this.rustDir, 'Cargo.lock')));
839
+ const linkageLabel = {
840
+ 'gnu-dynamic': 'dynamic glibc',
841
+ 'musl-static': 'static musl',
842
+ darwin: 'macOS system libraries',
843
+ };
844
+ const lines = [
845
+ '# Native distribution notices',
846
+ '',
847
+ `Generated by \`tsrust notices\` from \`${lockfile}\`, the Rust ${toolchain.release} toolchain`,
848
+ `(commit \`${toolchain.commitHash}\`)`,
849
+ 'and the `@git.zone/tsrust` configuration. Do not edit these files by hand:',
850
+ '`tsrust notices --check` verifies them before every build.',
851
+ '',
852
+ 'These notices accompany the native executables built for the targets below. The',
853
+ "package's own code is covered by its own license.",
854
+ '',
855
+ '## Targets',
856
+ '',
857
+ '| Target | Rust target | Linkage | Cargo packages |',
858
+ '| --- | --- | --- | --- |',
859
+ ...targetsArg.map((target) => `| ${target.target} | ${target.triple} | ${linkageLabel[target.linkage]} | ${target.packages.length} |`),
860
+ '',
861
+ '## Contents',
862
+ '',
863
+ `- \`crates/\`: the license and notice files of the ${packagesArg.length} third-party Cargo packages compiled`,
864
+ ' for these targets (normal and build dependencies, including procedural macros;',
865
+ ' development dependencies are excluded), copied verbatim. `manifest.json` records each',
866
+ " package's license expression, the texts that cover it, and the targets it is built for.",
867
+ ];
868
+ if ([...packagesArg, ...standardLibraryPackagesArg].some((entry) => entry.extraTexts)) {
869
+ lines.push('- `crates/<package>/extra/` (and `rust/crates/<package>/extra/`): reviewed texts the project ships', ' with a package beyond those that cover its license, such as the licenses of components it', ' vendors or attributions reproduced from its sources. `manifest.json` records their kind.');
870
+ }
871
+ if (packagesArg.some((entry) => entry.native)) {
872
+ lines.push('- `native/`: the license files of C and C++ libraries that Cargo packages compile into', ' the executables.');
873
+ }
874
+ lines.push('- `rust/`: the Rust standard library copyright inventory and license texts from the', " toolchain, and compiler-builtins' license.");
875
+ if (standardLibraryPackagesArg.length > 0) {
876
+ lines.push(` \`rust/crates/\` holds the license files of ${standardLibraryPackagesArg.length} standard-library dependencies the`, ' inventory does not list.');
877
+ }
878
+ if (runtimeArg.length > 0) {
879
+ lines.push('- `runtime/`: license texts of the C runtime described below.');
880
+ }
881
+ lines.push('- `manifest.json`: the inventory and the SHA-256 digest of every other file.', '', '## Runtime libraries', '');
882
+ for (const component of runtimeArg) {
883
+ if (component.name === 'musl') {
884
+ lines.push(`The static musl executables contain musl ${component.version}, the C library shipped with the Rust`, `toolchain, under the MIT license (\`${component.files[0]}\`).`, '');
885
+ }
886
+ else if (component.id === 'glibc') {
887
+ lines.push('The glibc executables load the GNU C Library, licensed under the GNU Lesser General Public', `License version 2.1 or later (\`${component.files[0]}\`), from the host system at run time. glibc is`, 'not redistributed with this package, and users may replace it with a modified,', 'interface-compatible version.', '');
888
+ }
889
+ else if (component.id === 'gcc') {
890
+ lines.push('The Linux executables may contain GCC runtime startup code and support routines, licensed', 'under the GNU General Public License version 3 or later with the GCC Runtime Library', `Exception 3.1 (\`runtime/gcc/\`). The exception permits distributing the executables under`, "the package's own terms.", '');
891
+ }
892
+ else {
893
+ lines.push(`${component.name}${component.version ? ` ${component.version}` : ''} (${component.license}) is declared by the project; its`, `license texts are in \`runtime/${component.id}/\`.`, '');
894
+ }
895
+ }
896
+ if (targetsArg.some((target) => target.linkage === 'darwin')) {
897
+ lines.push("The macOS executables link Apple's system libraries, which are not redistributed with", 'this package.', '');
898
+ }
899
+ lines.push('The Rust standard library and its runtime (including LLVM libunwind in static musl', 'executables) are covered by `rust/`.', '');
900
+ return lines.join('\n');
901
+ }
902
+ async readDirectoryFiles(directoryArg) {
903
+ const result = new Map();
904
+ const walk = async (currentArg) => {
905
+ for (const entry of await fs.promises.readdir(currentArg, { withFileTypes: true })) {
906
+ const entryPath = path.join(currentArg, entry.name);
907
+ const name = toPosix(path.relative(directoryArg, entryPath));
908
+ if (entry.isDirectory())
909
+ await walk(entryPath);
910
+ else if (entry.isFile())
911
+ result.set(name, await fs.promises.readFile(entryPath));
912
+ else
913
+ throw new Error(`Notices directory contains a non-regular entry: ${name}`);
914
+ }
915
+ };
916
+ await walk(directoryArg);
917
+ return result;
918
+ }
919
+ async lstatOptional(pathArg) {
920
+ try {
921
+ return await fs.promises.lstat(pathArg);
922
+ }
923
+ catch (error) {
924
+ if (error.code === 'ENOENT')
925
+ return undefined;
926
+ throw error;
927
+ }
928
+ }
929
+ }
930
+ /**
931
+ * Creates a generator for a project built with the toolchain behind
932
+ * `envPrefix`, installing the toolchain components notices read from.
933
+ */
934
+ export async function createProjectNoticesGenerator(optionsArg) {
935
+ const commandRunner = new ShellNoticeCommandRunner(optionsArg.envPrefix);
936
+ const toolchain = await resolveNoticeToolchain(commandRunner, optionsArg.rustDir, configuredAssemblyTargets(optionsArg.config).map((target) => target.triple), optionsArg.install);
937
+ return new NativeNoticesGenerator({
938
+ projectDir: optionsArg.projectDir,
939
+ rustDir: optionsArg.rustDir,
940
+ config: optionsArg.config,
941
+ staticLinking: optionsArg.staticLinking,
942
+ toolchain,
943
+ commandRunner,
944
+ });
945
+ }
946
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5uYXRpdmVub3RpY2VzZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbW9kX25vdGljZXMvY2xhc3Nlcy5uYXRpdmVub3RpY2VzZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxRQUFRLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSx5QkFBeUIsRUFBc0IsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIsd0JBQXdCLEdBR3pCLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIsMEJBQTBCLEdBQzNCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFDTCxvQkFBb0IsR0FLckIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN0RixPQUFPLEVBQUUsbUJBQW1CLEVBQWtCLE1BQU0sbUJBQW1CLENBQUM7QUF5R3hFLE1BQU0sYUFBYSxHQUFHLHVCQUF1QixDQUFDO0FBQzlDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDL0MsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLEdB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