@@ -39,9 +39,8 @@ class CompilerResolver {
39
39
var result = await _tryLoadCompilerFromInput ();
40
40
41
41
// Then, try to detect on the host machine.
42
- final tool = _selectCompiler ();
43
- if (tool != null ) {
44
- result ?? = await _tryLoadToolFromNativeToolchain (tool);
42
+ for (final possibleTool in _selectPossibleCompilers ()) {
43
+ result ?? = await _tryLoadToolFromNativeToolchain (possibleTool);
45
44
}
46
45
47
46
if (result != null ) {
@@ -57,46 +56,36 @@ class CompilerResolver {
57
56
throw ToolError (errorMessage);
58
57
}
59
58
60
- /// Select the right compiler for cross compiling to the specified target.
61
- Tool ? _selectCompiler () {
59
+ /// Select possible compilers for cross compiling to the specified target.
60
+ Iterable < Tool > _selectPossibleCompilers () sync * {
62
61
final targetOS = codeConfig.targetOS;
63
62
final targetArch = codeConfig.targetArchitecture;
64
63
65
- // TODO(dacoharkes): Support falling back on other tools.
66
- if (targetArch == hostArchitecture &&
67
- targetOS == hostOS &&
68
- hostOS == OS .linux) {
69
- return clang;
70
- }
71
- if (targetOS == OS .macOS || targetOS == OS .iOS) return appleClang;
72
- if (targetOS == OS .android) return androidNdkClang;
73
- if (hostOS == OS .linux) {
74
- switch (targetArch) {
75
- case Architecture .arm:
76
- return armLinuxGnueabihfGcc;
77
- case Architecture .arm64:
78
- return aarch64LinuxGnuGcc;
79
- case Architecture .ia32:
80
- return i686LinuxGnuGcc;
81
- case Architecture .x64:
82
- return x86_64LinuxGnuGcc;
83
- case Architecture .riscv64:
84
- return riscv64LinuxGnuGcc;
85
- }
86
- }
87
-
88
- if (hostOS == OS .windows) {
89
- switch (targetArch) {
90
- case Architecture .ia32:
91
- return clIA32;
92
- case Architecture .arm64:
93
- return clArm64;
94
- case Architecture .x64:
95
- return cl;
96
- }
64
+ switch ((hostOS, targetOS, targetArch)) {
65
+ case (_, OS .android, _):
66
+ yield androidNdkClang;
67
+ case (OS .macOS, OS .macOS || OS .iOS, _):
68
+ yield appleClang;
69
+ yield clang;
70
+ case (OS .linux, OS .linux, _) when hostArchitecture == targetArch:
71
+ yield clang;
72
+ case (OS .linux, _, Architecture .arm):
73
+ yield armLinuxGnueabihfGcc;
74
+ case (OS .linux, _, Architecture .arm64):
75
+ yield aarch64LinuxGnuGcc;
76
+ case (OS .linux, _, Architecture .ia32):
77
+ yield i686LinuxGnuGcc;
78
+ case (OS .linux, _, Architecture .x64):
79
+ yield x86_64LinuxGnuGcc;
80
+ case (OS .linux, _, Architecture .riscv64):
81
+ yield riscv64LinuxGnuGcc;
82
+ case (OS .windows, _, Architecture .ia32):
83
+ yield clIA32;
84
+ case (OS .windows, _, Architecture .arm64):
85
+ yield clArm64;
86
+ case (OS .windows, _, Architecture .x64):
87
+ yield cl;
97
88
}
98
-
99
- return null ;
100
89
}
101
90
102
91
Future <ToolInstance ?> _tryLoadCompilerFromInput () async {
0 commit comments