diff --git a/dist/index.js b/dist/index.js index c918c41..a2d9956 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1853,6 +1853,87 @@ __exportStar(__nccwpck_require__(39787), exports); __exportStar(__nccwpck_require__(81893), exports); +/***/ }), + +/***/ 1333: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VisualStudio = void 0; +const os = __importStar(__nccwpck_require__(22037)); +const path = __importStar(__nccwpck_require__(71017)); +const exec_1 = __nccwpck_require__(71514); +class VisualStudio { + constructor(installationPath, installationVersion, catalog, properties) { + this.installationPath = installationPath; + this.installationVersion = installationVersion; + this.catalog = catalog; + this.properties = properties; + } + // eslint-disable-next-line no-explicit-any + static createFromJSON(json) { + return new VisualStudio(json.installationPath, json.installationVersion, json.catalog, json.properties); + } + env() { + return __awaiter(this, void 0, void 0, function* () { + /// https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-170 + const nativeToolsScriptx86 = path.join(this.installationPath, 'Common7', 'Tools', 'VsDevCmd.bat'); + const { stdout } = yield (0, exec_1.getExecOutput)('cmd', [ + '/k', + nativeToolsScriptx86, + `-arch=${os.arch()}`, + '&&', + 'set', + '&&', + 'exit' + ], { failOnStdErr: true }); + return Object.fromEntries(stdout + .split(os.EOL) + .filter(s => s.indexOf('=')) + .map(s => s.trim()) + .map(s => s.split('=', 2)) + .filter(s => s.length === 2) + .map(s => [s[0].trim(), s[1].trim()])); + }); + } +} +exports.VisualStudio = VisualStudio; + + /***/ }), /***/ 81893: @@ -1875,6 +1956,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; Object.defineProperty(exports, "__esModule", ({ value: true })); +__exportStar(__nccwpck_require__(1333), exports); __exportStar(__nccwpck_require__(19482), exports); __exportStar(__nccwpck_require__(48777), exports); @@ -1919,69 +2001,62 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.VisualStudio = void 0; const core = __importStar(__nccwpck_require__(42186)); const exec_1 = __nccwpck_require__(71514); +const base_1 = __nccwpck_require__(1333); const vswhere_1 = __nccwpck_require__(82167); -class VisualStudio { - constructor(installationPath, installationVersion, catalog, properties) { - this.installationPath = installationPath; - this.installationVersion = installationVersion; - this.catalog = catalog; - this.properties = properties; - } - // eslint-disable-next-line no-explicit-any - static createFromJSON(json) { - return new VisualStudio(json.installationPath, json.installationVersion, json.catalog, json.properties); - } -} -exports.VisualStudio = VisualStudio; -// eslint-disable-next-line no-redeclare -(function (VisualStudio) { - let self; - /// set up required visual studio tools for swift on windows - function setup(requirement) { - return __awaiter(this, void 0, void 0, function* () { - if (self) { - return self; - } - /// https://github.com/microsoft/vswhere/wiki/Find-MSBuild - /// get visual studio properties - const vswhereExe = yield vswhere_1.VSWhere.get(); - // execute the find putting the result of the command in the options vsInstallPath - core.debug(`Fetching Visual Studio installation for version "${requirement.version}"`); - const { stdout } = yield (0, exec_1.getExecOutput)(`"${vswhereExe}"`, [ - '-products', - '*', - '-format', - 'json', - '-utf8', - '-latest', - '-version', - requirement.version - ]); - const vs = VisualStudio.createFromJSON(JSON.parse(stdout)[0]); - if (!vs.installationPath) { - throw new Error(`Unable to find any Visual Studio installation for version: ${requirement.version}.`); - } - /// https://docs.microsoft.com/en-us/visualstudio/install/use-command-line-parameters-to-install-visual-studio?view=vs-2022 - /// install required visual studio components - core.debug(`Installing Visual Studio components "${requirement.components}" at "${vs.installationPath}"`); - yield (0, exec_1.exec)(`"${vs.properties.setupEngineFilePath}"`, [ - 'modify', - '--installPath', - vs.installationPath, - ...requirement.components.flatMap(component => ['--add', component]), - '--installWhileDownloading', - '--force', - '--quiet' - ]); - self = vs; +let shared; +/// set up required visual studio tools for swift on windows +base_1.VisualStudio.setup = function (requirement) { + return __awaiter(this, void 0, void 0, function* () { + if (shared) { + return shared; + } + /// https://github.com/microsoft/vswhere/wiki/Find-MSBuild + /// get visual studio properties + const vswhereExe = yield vswhere_1.VSWhere.get(); + // execute the find putting the result of the command in the options vsInstallPath + core.debug(`Fetching Visual Studio installation for version "${requirement.version}"`); + const { stdout } = yield (0, exec_1.getExecOutput)(`"${vswhereExe}"`, [ + '-products', + '*', + '-format', + 'json', + '-utf8', + '-latest', + '-version', + requirement.version + ]); + const vs = base_1.VisualStudio.createFromJSON(JSON.parse(stdout)[0]); + if (!vs.installationPath) { + throw new Error(`Unable to find any Visual Studio installation for version: ${requirement.version}.`); + } + const vsEnv = yield vs.env(); + const comps = requirement.components; + if (vsEnv.UCRTVersion && + vsEnv.UniversalCRTSdkDir && + vsEnv.VCToolsInstallDir && + comps.length < 3) { + core.debug('VS components already setup, skipping installation'); + shared = vs; return vs; - }); - } - VisualStudio.setup = setup; -})(VisualStudio || (exports.VisualStudio = VisualStudio = {})); + } + /// https://docs.microsoft.com/en-us/visualstudio/install/use-command-line-parameters-to-install-visual-studio?view=vs-2022 + /// install required visual studio components + core.debug(`Installing VS components "${comps}" at "${vs.installationPath}"`); + yield (0, exec_1.exec)(`"${vs.properties.setupEngineFilePath}"`, [ + 'modify', + '--installPath', + vs.installationPath, + ...requirement.components.flatMap(component => ['--add', component]), + '--installWhileDownloading', + '--force', + '--quiet' + ]); + shared = vs; + return vs; + }); +}; /***/ }), @@ -2024,38 +2099,19 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); -const os = __importStar(__nccwpck_require__(22037)); const path = __importStar(__nccwpck_require__(71017)); const fs_1 = __nccwpck_require__(57147); const core = __importStar(__nccwpck_require__(42186)); -const exec_1 = __nccwpck_require__(71514); -const setup_1 = __nccwpck_require__(19482); +const base_1 = __nccwpck_require__(1333); /// Update swift version based additional support files setup -setup_1.VisualStudio.prototype.update = function (sdkroot) { +base_1.VisualStudio.prototype.update = function (sdkroot) { return __awaiter(this, void 0, void 0, function* () { - /// https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-170 - const nativeToolsScriptx86 = path.join(this.installationPath, 'Common7', 'Tools', 'VsDevCmd.bat'); - const { stdout } = yield (0, exec_1.getExecOutput)('cmd', [ - '/k', - nativeToolsScriptx86, - `-arch=${os.arch()}`, - '&&', - 'set', - '&&', - 'exit' - ], { failOnStdErr: true }); - const vsEnvs = Object.fromEntries(stdout - .split(os.EOL) - .filter(s => s.indexOf('=')) - .map(s => s.trim()) - .map(s => s.split('=', 2)) - .filter(s => s.length === 2) - .map(s => [s[0].trim(), s[1].trim()])); - const universalCRTSdkDir = vsEnvs.UniversalCRTSdkDir; - const uCRTVersion = vsEnvs.UCRTVersion; - const vCToolsInstallDir = vsEnvs.VCToolsInstallDir; + const vsEnv = yield this.env(); + const universalCRTSdkDir = vsEnv.UniversalCRTSdkDir; + const uCRTVersion = vsEnv.UCRTVersion; + const vCToolsInstallDir = vsEnv.VCToolsInstallDir; if (!(universalCRTSdkDir && uCRTVersion && vCToolsInstallDir)) { - throw new Error(`Failed to find paths from "${JSON.stringify(vsEnvs)}"`); + throw new Error(`Failed to find paths from "${JSON.stringify(vsEnv)}"`); } const sdkshare = path.join(sdkroot, 'usr', 'share'); const winsdk = path.join(universalCRTSdkDir, 'Include', uCRTVersion); @@ -2081,11 +2137,11 @@ setup_1.VisualStudio.prototype.update = function (sdkroot) { yield fs_1.promises.copyFile(modulemap, vcModulemap); yield fs_1.promises.copyFile(apinotes, path.join(vcToolsInclude, runtimenotes)); } - for (const property in vsEnvs) { - if (vsEnvs[property] === process.env[property]) { + for (const property in vsEnv) { + if (vsEnv[property] === process.env[property]) { continue; } - core.exportVariable(property, vsEnvs[property]); + core.exportVariable(property, vsEnv[property]); } }); }; diff --git a/src/utils/visual_studio/base.ts b/src/utils/visual_studio/base.ts new file mode 100644 index 0000000..a2598ce --- /dev/null +++ b/src/utils/visual_studio/base.ts @@ -0,0 +1,74 @@ +import * as os from 'os' +import * as path from 'path' +import {getExecOutput} from '@actions/exec' + +export class VisualStudio { + private constructor( + readonly installationPath: string, + readonly installationVersion: string, + readonly catalog: VisualStudioCatalog, + readonly properties: VisualStudioProperties + ) {} + + // eslint-disable-next-line no-explicit-any + static createFromJSON(json: any) { + return new VisualStudio( + json.installationPath, + json.installationVersion, + json.catalog, + json.properties + ) + } + + async env() { + /// https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-170 + const nativeToolsScriptx86 = path.join( + this.installationPath, + 'Common7', + 'Tools', + 'VsDevCmd.bat' + ) + const {stdout} = await getExecOutput( + 'cmd', + [ + '/k', + nativeToolsScriptx86, + `-arch=${os.arch()}`, + '&&', + 'set', + '&&', + 'exit' + ], + {failOnStdErr: true} + ) + return Object.fromEntries( + stdout + .split(os.EOL) + .filter(s => s.indexOf('=')) + .map(s => s.trim()) + .map(s => s.split('=', 2)) + .filter(s => s.length === 2) + .map(s => [s[0].trim(), s[1].trim()] as const) + ) as VisualStudioEnv + } +} + +export interface VisualStudioCatalog { + productDisplayVersion: string +} + +export interface VisualStudioProperties { + setupEngineFilePath: string +} + +export interface VisualStudioRequirement { + version: string + components: string[] +} + +export interface VisualStudioEnv { + readonly UniversalCRTSdkDir?: string + readonly UCRTVersion?: string + readonly VCToolsInstallDir?: string + readonly [name: string]: string | undefined +} diff --git a/src/utils/visual_studio/index.ts b/src/utils/visual_studio/index.ts index 4a906ad..30e99c9 100644 --- a/src/utils/visual_studio/index.ts +++ b/src/utils/visual_studio/index.ts @@ -1,2 +1,3 @@ +export * from './base' export * from './setup' export * from './update' diff --git a/src/utils/visual_studio/setup.ts b/src/utils/visual_studio/setup.ts index cc4a62d..f5a0445 100644 --- a/src/utils/visual_studio/setup.ts +++ b/src/utils/visual_studio/setup.ts @@ -1,88 +1,72 @@ import * as core from '@actions/core' import {exec, getExecOutput} from '@actions/exec' +import {VisualStudio, VisualStudioRequirement} from './base' import {VSWhere} from './vswhere' -export class VisualStudio { - private constructor( - readonly installationPath: string, - readonly installationVersion: string, - readonly catalog: VisualStudioCatalog, - readonly properties: VisualStudioProperties - ) {} - - // eslint-disable-next-line no-explicit-any - static createFromJSON(json: any) { - return new VisualStudio( - json.installationPath, - json.installationVersion, - json.catalog, - json.properties - ) +declare module './base' { + // eslint-disable-next-line no-shadow + export namespace VisualStudio { + function setup(requirement: VisualStudioRequirement): Promise } } -export interface VisualStudioCatalog { - productDisplayVersion: string -} - -export interface VisualStudioProperties { - setupEngineFilePath: string -} - -export interface VisualStudioRequirement { - version: string - components: string[] -} - -// eslint-disable-next-line no-redeclare -export namespace VisualStudio { - let self: VisualStudio +let shared: VisualStudio - /// set up required visual studio tools for swift on windows - export async function setup(requirement: VisualStudioRequirement) { - if (self) { - return self - } - /// https://github.com/microsoft/vswhere/wiki/Find-MSBuild - /// get visual studio properties - const vswhereExe = await VSWhere.get() +/// set up required visual studio tools for swift on windows +VisualStudio.setup = async function (requirement: VisualStudioRequirement) { + if (shared) { + return shared + } + /// https://github.com/microsoft/vswhere/wiki/Find-MSBuild + /// get visual studio properties + const vswhereExe = await VSWhere.get() - // execute the find putting the result of the command in the options vsInstallPath - core.debug( - `Fetching Visual Studio installation for version "${requirement.version}"` + // execute the find putting the result of the command in the options vsInstallPath + core.debug( + `Fetching Visual Studio installation for version "${requirement.version}"` + ) + const {stdout} = await getExecOutput(`"${vswhereExe}"`, [ + '-products', + '*', + '-format', + 'json', + '-utf8', + '-latest', + '-version', + requirement.version + ]) + const vs = VisualStudio.createFromJSON(JSON.parse(stdout)[0]) + if (!vs.installationPath) { + throw new Error( + `Unable to find any Visual Studio installation for version: ${requirement.version}.` ) - const {stdout} = await getExecOutput(`"${vswhereExe}"`, [ - '-products', - '*', - '-format', - 'json', - '-utf8', - '-latest', - '-version', - requirement.version - ]) - const vs = VisualStudio.createFromJSON(JSON.parse(stdout)[0]) - if (!vs.installationPath) { - throw new Error( - `Unable to find any Visual Studio installation for version: ${requirement.version}.` - ) - } + } - /// https://docs.microsoft.com/en-us/visualstudio/install/use-command-line-parameters-to-install-visual-studio?view=vs-2022 - /// install required visual studio components - core.debug( - `Installing Visual Studio components "${requirement.components}" at "${vs.installationPath}"` - ) - await exec(`"${vs.properties.setupEngineFilePath}"`, [ - 'modify', - '--installPath', - vs.installationPath, - ...requirement.components.flatMap(component => ['--add', component]), - '--installWhileDownloading', - '--force', - '--quiet' - ]) - self = vs + const vsEnv = await vs.env() + const comps = requirement.components + if ( + vsEnv.UCRTVersion && + vsEnv.UniversalCRTSdkDir && + vsEnv.VCToolsInstallDir && + comps.length < 3 + ) { + core.debug('VS components already setup, skipping installation') + shared = vs return vs } + + /// https://docs.microsoft.com/en-us/visualstudio/install/use-command-line-parameters-to-install-visual-studio?view=vs-2022 + /// install required visual studio components + core.debug(`Installing VS components "${comps}" at "${vs.installationPath}"`) + await exec(`"${vs.properties.setupEngineFilePath}"`, [ + 'modify', + '--installPath', + vs.installationPath, + ...requirement.components.flatMap(component => ['--add', component]), + '--installWhileDownloading', + '--force', + '--quiet' + ]) + shared = vs + return vs } diff --git a/src/utils/visual_studio/update.ts b/src/utils/visual_studio/update.ts index 73885e5..3ed0403 100644 --- a/src/utils/visual_studio/update.ts +++ b/src/utils/visual_studio/update.ts @@ -1,11 +1,9 @@ -import * as os from 'os' import * as path from 'path' import {promises as fs} from 'fs' import * as core from '@actions/core' -import {getExecOutput} from '@actions/exec' -import {VisualStudio} from './setup' +import {VisualStudio} from './base' -declare module './setup' { +declare module './base' { // eslint-disable-next-line no-shadow export interface VisualStudio { update(sdkroot: string): Promise @@ -14,40 +12,12 @@ declare module './setup' { /// Update swift version based additional support files setup VisualStudio.prototype.update = async function (sdkroot: string) { - /// https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-170 - const nativeToolsScriptx86 = path.join( - this.installationPath, - 'Common7', - 'Tools', - 'VsDevCmd.bat' - ) - const {stdout} = await getExecOutput( - 'cmd', - [ - '/k', - nativeToolsScriptx86, - `-arch=${os.arch()}`, - '&&', - 'set', - '&&', - 'exit' - ], - {failOnStdErr: true} - ) - const vsEnvs = Object.fromEntries( - stdout - .split(os.EOL) - .filter(s => s.indexOf('=')) - .map(s => s.trim()) - .map(s => s.split('=', 2)) - .filter(s => s.length === 2) - .map(s => [s[0].trim(), s[1].trim()] as const) - ) - const universalCRTSdkDir = vsEnvs.UniversalCRTSdkDir - const uCRTVersion = vsEnvs.UCRTVersion - const vCToolsInstallDir = vsEnvs.VCToolsInstallDir + const vsEnv = await this.env() + const universalCRTSdkDir = vsEnv.UniversalCRTSdkDir + const uCRTVersion = vsEnv.UCRTVersion + const vCToolsInstallDir = vsEnv.VCToolsInstallDir if (!(universalCRTSdkDir && uCRTVersion && vCToolsInstallDir)) { - throw new Error(`Failed to find paths from "${JSON.stringify(vsEnvs)}"`) + throw new Error(`Failed to find paths from "${JSON.stringify(vsEnv)}"`) } const sdkshare = path.join(sdkroot, 'usr', 'share') @@ -73,10 +43,10 @@ VisualStudio.prototype.update = async function (sdkroot: string) { await fs.copyFile(modulemap, vcModulemap) await fs.copyFile(apinotes, path.join(vcToolsInclude, runtimenotes)) } - for (const property in vsEnvs) { - if (vsEnvs[property] === process.env[property]) { + for (const property in vsEnv) { + if (vsEnv[property] === process.env[property]) { continue } - core.exportVariable(property, vsEnvs[property]) + core.exportVariable(property, vsEnv[property]) } }