@@ -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