UNPKG

6.25 kBJavaScriptView Raw
1"use strict";
2var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3 if (k2 === undefined) k2 = k;
4 Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5}) : (function(o, m, k, k2) {
6 if (k2 === undefined) k2 = k;
7 o[k2] = m[k];
8}));
9var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10 Object.defineProperty(o, "default", { enumerable: true, value: v });
11}) : function(o, v) {
12 o["default"] = v;
13});
14var __importStar = (this && this.__importStar) || function (mod) {
15 if (mod && mod.__esModule) return mod;
16 var result = {};
17 if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18 __setModuleDefault(result, mod);
19 return result;
20};
21var __importDefault = (this && this.__importDefault) || function (mod) {
22 return (mod && mod.__esModule) ? mod : { "default": mod };
23};
24Object.defineProperty(exports, "__esModule", { value: true });
25exports.getClangEnvironmentVars = void 0;
26const cp = __importStar(require("child_process"));
27const debug_1 = __importDefault(require("debug"));
28const fs = __importStar(require("fs-extra"));
29const path = __importStar(require("path"));
30const tar = __importStar(require("tar"));
31const zlib = __importStar(require("zlib"));
32const constants_1 = require("./constants");
33const fetcher_1 = require("./fetcher");
34const sysroot_fetcher_1 = require("./sysroot-fetcher");
35const d = (0, debug_1.default)('electron-rebuild');
36const CDS_URL = 'https://commondatastorage.googleapis.com/chromium-browser-clang';
37function getPlatformUrlPrefix(hostOS) {
38 const prefixMap = {
39 'linux': 'Linux_x64',
40 'darwin': 'Mac',
41 'win32': 'Win',
42 };
43 return CDS_URL + '/' + prefixMap[hostOS] + '/';
44}
45function getClangDownloadURL(packageFile, packageVersion, hostOS) {
46 const cdsFile = `${packageFile}-${packageVersion}.tgz`;
47 return getPlatformUrlPrefix(hostOS) + cdsFile;
48}
49function getSDKRoot() {
50 if (process.env.SDKROOT)
51 return process.env.SDKROOT;
52 const output = cp.execFileSync('xcrun', ['--sdk', 'macosx', '--show-sdk-path']);
53 return output.toString().trim();
54}
55async function getClangEnvironmentVars(electronVersion, targetArch) {
56 const clangDownloadDir = await downloadClangVersion(electronVersion);
57 const clangDir = path.resolve(clangDownloadDir, 'bin');
58 const clangArgs = [];
59 if (process.platform === 'darwin') {
60 clangArgs.push('-isysroot', getSDKRoot());
61 }
62 const gypArgs = [];
63 if (process.platform === 'win32') {
64 console.log(fs.readdirSync(clangDir));
65 gypArgs.push(`/p:CLToolExe=clang-cl.exe`, `/p:CLToolPath=${clangDir}`);
66 }
67 if (process.platform === 'linux') {
68 const sysrootPath = await (0, sysroot_fetcher_1.downloadLinuxSysroot)(electronVersion, targetArch);
69 clangArgs.push('--sysroot', sysrootPath);
70 }
71 return {
72 env: {
73 CC: `"${path.resolve(clangDir, 'clang')}" ${clangArgs.join(' ')}`,
74 CXX: `"${path.resolve(clangDir, 'clang++')}" ${clangArgs.join(' ')}`,
75 },
76 args: gypArgs,
77 };
78}
79exports.getClangEnvironmentVars = getClangEnvironmentVars;
80function clangVersionFromRevision(update) {
81 const regex = /CLANG_REVISION = '([^']+)'\nCLANG_SUB_REVISION = (\d+)\n/g;
82 const clangVersionMatch = regex.exec(update);
83 if (!clangVersionMatch)
84 return null;
85 const [, clangVersion, clangSubRevision] = clangVersionMatch;
86 return `${clangVersion}-${clangSubRevision}`;
87}
88function clangVersionFromSVN(update) {
89 const regex = /CLANG_REVISION = '([^']+)'\nCLANG_SVN_REVISION = '([^']+)'\nCLANG_SUB_REVISION = (\d+)\n/g;
90 const clangVersionMatch = regex.exec(update);
91 if (!clangVersionMatch)
92 return null;
93 const [, clangVersion, clangSvn, clangSubRevision] = clangVersionMatch;
94 return `${clangSvn}-${clangVersion.substr(0, 8)}-${clangSubRevision}`;
95}
96async function downloadClangVersion(electronVersion) {
97 d('fetching clang for Electron:', electronVersion);
98 const clangDirPath = path.resolve(constants_1.ELECTRON_GYP_DIR, `${electronVersion}-clang`);
99 if (await fs.pathExists(path.resolve(clangDirPath, 'bin', 'clang')))
100 return clangDirPath;
101 if (!await fs.pathExists(constants_1.ELECTRON_GYP_DIR))
102 await fs.mkdirp(constants_1.ELECTRON_GYP_DIR);
103 const electronDeps = await (0, fetcher_1.fetch)(`https://raw.githubusercontent.com/electron/electron/v${electronVersion}/DEPS`, 'text');
104 const chromiumRevisionExtractor = /'chromium_version':\n\s+'([^']+)/g;
105 const chromiumRevisionMatch = chromiumRevisionExtractor.exec(electronDeps);
106 if (!chromiumRevisionMatch)
107 throw new Error('Failed to determine Chromium revision for given Electron version');
108 const chromiumRevision = chromiumRevisionMatch[1];
109 d('fetching clang for Chromium:', chromiumRevision);
110 const base64ClangUpdate = await (0, fetcher_1.fetch)(`https://chromium.googlesource.com/chromium/src.git/+/${chromiumRevision}/tools/clang/scripts/update.py?format=TEXT`, 'text');
111 const clangUpdate = Buffer.from(base64ClangUpdate, 'base64').toString('utf8');
112 const clangVersionString = clangVersionFromRevision(clangUpdate) || clangVersionFromSVN(clangUpdate);
113 if (!clangVersionString)
114 throw new Error('Failed to determine Clang revision from Electron version');
115 d('fetching clang:', clangVersionString);
116 const clangDownloadURL = getClangDownloadURL('clang', clangVersionString, process.platform);
117 const contents = await (0, fetcher_1.fetch)(clangDownloadURL, 'buffer');
118 d('deflating clang');
119 zlib.deflateSync(contents);
120 const tarPath = path.resolve(constants_1.ELECTRON_GYP_DIR, `${electronVersion}-clang.tar`);
121 if (await fs.pathExists(tarPath))
122 await fs.remove(tarPath);
123 await fs.writeFile(tarPath, Buffer.from(contents));
124 await fs.mkdirp(clangDirPath);
125 d('tar running on clang');
126 await tar.x({
127 file: tarPath,
128 cwd: clangDirPath,
129 });
130 await fs.remove(tarPath);
131 d('cleaning up clang tar file');
132 return clangDirPath;
133}
134//# sourceMappingURL=clang-fetcher.js.map
\No newline at end of file