@@ -7,33 +7,79 @@ import semverMajor from "semver/functions/major"
7
7
import semverCoerce from "semver/functions/coerce"
8
8
import { setupMacOSSDK } from "../macos-sdk/macos-sdk"
9
9
import path from "path"
10
- import { warning , info } from "../utils/io/io"
10
+ import { warning , info , notice } from "../utils/io/io"
11
11
import { isGitHubCI } from "../utils/env/isci"
12
12
import { addBinExtension } from "../utils/extension/extension"
13
+ import { InstallationInfo , PackageInfo , setupBin } from "../utils/setup/setupBin"
14
+ import { extract7Zip } from "../utils/setup/extract"
15
+
16
+ interface MingwInfo {
17
+ mingwVersion : string
18
+ llvmVersion ?: string
19
+ number : string
20
+ runtime : "ucrt" | "msvcrt" // ucrt is the modern runtime and should be preferred
21
+ }
22
+
23
+ const GccToMingwInfo = {
24
+ "12" : { mingwVersion : "10.0.0" , number : "r1" , runtime : "msvcrt" } ,
25
+ "12.1.0-msvcrt" : { mingwVersion : "10.0.0" , number : "r1" , runtime : "msvcrt" } ,
26
+ "11" : { mingwVersion : "10.0.0" , llvmVersion : "14.0.3" , number : "r3" , runtime : "ucrt" } ,
27
+ "11.3.0-ucrt" : { mingwVersion : "10.0.0" , llvmVersion : "14.0.3" , number : "r3" , runtime : "ucrt" } ,
28
+ "11.3.0-msvcrt" : { mingwVersion : "10.0.0" , llvmVersion : "14.0.3" , number : "r3" , runtime : "msvcrt" } ,
29
+ "11.2.0-ucrt" : { mingwVersion : "9.0.0" , number : "r5" , runtime : "ucrt" } ,
30
+ "11.2.0-msvcrt" : { mingwVersion : "9.0.0" , number : "r6" , runtime : "msvcrt" } , // TODO -w64-
31
+ } as Record < string , MingwInfo | undefined >
32
+
33
+ function getGccPackageInfo ( version : string , platform : NodeJS . Platform , arch : string ) : PackageInfo {
34
+ switch ( platform ) {
35
+ case "win32" : {
36
+ const mingwInfo = GccToMingwInfo [ version ]
37
+ if ( mingwInfo === undefined ) {
38
+ throw new Error ( `mingw version ${ version } is not supported` )
39
+ }
40
+ const mingwArch = arch === "ia32" ? "i686" : "x86_64"
41
+ const llvmVersionString = mingwInfo . llvmVersion !== undefined ? `${ mingwInfo . llvmVersion } -` : ""
42
+ return {
43
+ binRelativeDir : "./bin" ,
44
+ binFileName : addBinExtension ( "g++" ) ,
45
+ extractedFolderName : "mingw64" ,
46
+ extractFunction : extract7Zip ,
47
+ url : `https://github.com/brechtsanders/winlibs_mingw/releases/download/${ version } -${ llvmVersionString } ${ mingwInfo . mingwVersion } -${ mingwInfo . runtime } -${ mingwInfo . number } /winlibs-${ mingwArch } -posix-seh-gcc-${ version } -mingw-w64${ mingwInfo . runtime } -${ mingwInfo . mingwVersion } -${ mingwInfo . number } .7z` ,
48
+ }
49
+ }
50
+ default :
51
+ throw new Error ( `Unsupported platform '${ platform } '` )
52
+ }
53
+ }
13
54
14
55
// eslint-disable-next-line @typescript-eslint/no-unused-vars
15
- export async function setupGcc ( version : string , _setupDir : string , arch : string ) {
16
- let binDir : string | undefined
56
+ export async function setupGcc ( version : string , setupDir : string , arch : string ) {
57
+ let installationInfo : InstallationInfo | undefined
17
58
switch ( process . platform ) {
18
59
case "win32" : {
19
60
if ( arch === "arm" || arch === "arm64" ) {
20
61
await setupChocoPack ( "gcc-arm-embedded" , version )
21
62
}
22
- binDir = await setupChocoMingw ( version , arch )
63
+ try {
64
+ installationInfo = await setupBin ( "g++" , version , getGccPackageInfo , setupDir , arch )
65
+ } catch ( err ) {
66
+ notice ( `Failed to download g++ binary. ${ err } . Falling back to chocolatey.` )
67
+ installationInfo = await setupChocoMingw ( version , arch )
68
+ }
23
69
break
24
70
}
25
71
case "darwin" : {
26
- binDir = setupBrewPack ( "gcc" , version ) . binDir
72
+ installationInfo = setupBrewPack ( "gcc" , version )
27
73
break
28
74
}
29
75
case "linux" : {
30
76
if ( arch === "x64" ) {
31
77
setupAptPack ( "gcc" , version , [ "ppa:ubuntu-toolchain-r/test" ] )
32
- binDir = setupAptPack ( "g++" , version , [ ] ) . binDir
78
+ installationInfo = setupAptPack ( "g++" , version , [ ] )
33
79
} else {
34
80
info ( `Install g++-multilib because gcc for ${ arch } was requested` )
35
81
setupAptPack ( "gcc-multilib" , version , [ "ppa:ubuntu-toolchain-r/test" ] )
36
- binDir = setupAptPack ( "g++-multilib" , version , [ ] ) . binDir
82
+ installationInfo = setupAptPack ( "g++-multilib" , version , [ ] )
37
83
}
38
84
break
39
85
}
@@ -52,14 +98,14 @@ export async function setupGcc(version: string, _setupDir: string, arch: string)
52
98
throw new Error ( `Unsupported platform for ${ arch } ` )
53
99
}
54
100
}
55
- if ( binDir !== undefined ) {
56
- await activateGcc ( version , binDir )
57
- return { binDir }
101
+ if ( installationInfo !== undefined ) {
102
+ await activateGcc ( version , installationInfo . binDir )
103
+ return installationInfo
58
104
}
59
105
return undefined
60
106
}
61
107
62
- async function setupChocoMingw ( version : string , arch : string ) {
108
+ async function setupChocoMingw ( version : string , arch : string ) : Promise < InstallationInfo | undefined > {
63
109
await setupChocoPack ( "mingw" , version )
64
110
let binDir : string | undefined
65
111
if ( arch === "x64" && existsSync ( "C:/tools/mingw64/bin" ) ) {
@@ -71,7 +117,10 @@ async function setupChocoMingw(version: string, arch: string) {
71
117
} else if ( existsSync ( `${ process . env . ChocolateyInstall ?? "C:/ProgramData/chocolatey" } /bin/g++.exe` ) ) {
72
118
binDir = `${ process . env . ChocolateyInstall ?? "C:/ProgramData/chocolatey" } /bin`
73
119
}
74
- return binDir
120
+ if ( binDir !== undefined ) {
121
+ return { binDir }
122
+ }
123
+ return undefined
75
124
}
76
125
77
126
async function activateGcc ( version : string , binDir : string ) {
0 commit comments