gen-libc++-filenames.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. const chalk = require('chalk');
  2. const fs = require('node:fs');
  3. const path = require('node:path');
  4. const check = process.argv.includes('--check');
  5. function findAllHeaders (basePath) {
  6. const allFiles = fs.readdirSync(basePath);
  7. allFiles.sort();
  8. const toReturn = [];
  9. for (const file of allFiles) {
  10. const absPath = path.resolve(basePath, file);
  11. if (fs.statSync(absPath).isDirectory()) {
  12. toReturn.push(...findAllHeaders(absPath));
  13. } else {
  14. toReturn.push(absPath);
  15. }
  16. }
  17. return toReturn;
  18. }
  19. const diff = (array1, array2) => {
  20. const set1 = new Set(array1);
  21. const set2 = new Set(array2);
  22. const added = array1.filter(item => !set2.has(item));
  23. const removed = array2.filter(item => !set1.has(item));
  24. console.log(chalk.white.bgGreen.bold('Files Added:'));
  25. added.forEach(item => console.log(chalk.green.bold(`+ ${item}`)));
  26. console.log(chalk.white.bgRed.bold('Files Removed:'));
  27. removed.forEach(item => console.log(chalk.red.bold(`- ${item}`)));
  28. };
  29. const parseHeaders = (name, content) => {
  30. const pattern = new RegExp(`${name}_headers\\s*=\\s*\\[(.*?)\\]`, 's');
  31. const headers = content.match(pattern);
  32. if (!headers) return [];
  33. return headers[1].split(',')
  34. .map(item => item.trim().replace(/"/g, ''))
  35. .filter(item => item.length > 0);
  36. };
  37. for (const folder of ['libc++', 'libc++abi']) {
  38. const prettyName = folder.replace(/\+/g, 'x');
  39. const libcxxIncludeDir = path.resolve(__dirname, '..', '..', 'third_party', folder, 'src', 'include');
  40. const gclientPath = `third_party/${folder}/src/include`;
  41. const headers = findAllHeaders(libcxxIncludeDir).map(absPath => path.relative(path.resolve(__dirname, '../..', gclientPath), absPath).replaceAll('\\', '/'));
  42. const newHeaders = headers.map(f => `//${path.posix.join(gclientPath, f)}`);
  43. const content = `${prettyName}_headers = [
  44. ${newHeaders.map(h => `"${h}"`).join(',\n ')},
  45. ]
  46. ${prettyName}_licenses = [ "//third_party/${folder}/src/LICENSE.TXT" ]
  47. `;
  48. const file = `filenames.${prettyName}.gni`;
  49. const filenamesPath = path.resolve(__dirname, '..', file);
  50. if (check) {
  51. const currentContent = fs.readFileSync(filenamesPath, 'utf8');
  52. if (currentContent !== content) {
  53. const currentHeaders = parseHeaders(prettyName, currentContent);
  54. console.error(chalk.bold(`${file} contents are not up to date:\n`));
  55. diff(currentHeaders, newHeaders);
  56. console.error(chalk.bold(`\nRun node gen-libc++-filenames.js to regenerate ${file}`));
  57. process.exit(1);
  58. }
  59. } else {
  60. console.log(filenamesPath);
  61. fs.writeFileSync(filenamesPath, content);
  62. }
  63. }