@@ -39,9 +39,8 @@ class CompilerResolver {
3939 var result = await _tryLoadCompilerFromInput ();
4040
4141 // 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);
4544 }
4645
4746 if (result != null ) {
@@ -57,46 +56,36 @@ class CompilerResolver {
5756 throw ToolError (errorMessage);
5857 }
5958
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 * {
6261 final targetOS = codeConfig.targetOS;
6362 final targetArch = codeConfig.targetArchitecture;
6463
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;
9788 }
98-
99- return null ;
10089 }
10190
10291 Future <ToolInstance ?> _tryLoadCompilerFromInput () async {
0 commit comments