| ... | @@ -61,6 +61,13 @@ rename_step_with_output_arg: bool = true, | ... | @@ -61,6 +61,13 @@ rename_step_with_output_arg: bool = true, |
| 61 | /// nothing. | 61 | /// nothing. |
| 62 | skip_foreign_checks: bool = false, | 62 | skip_foreign_checks: bool = false, |
| 63 | | 63 | |
| | 64 | /// If this is true, failing to execute a foreign binary will be considered an |
| | 65 | /// error. However if this is false, the step will be skipped on failure instead. |
| | 66 | /// |
| | 67 | /// This allows for a Run step to attempt to execute a foreign binary using an |
| | 68 | /// external executor (such as qemu) but not fail if the executor is unavailable. |
| | 69 | failing_to_execute_foreign_is_an_error: bool = true, |
| | 70 | |
| 64 | /// If stderr or stdout exceeds this amount, the child process is killed and | 71 | /// If stderr or stdout exceeds this amount, the child process is killed and |
| 65 | /// the step fails. | 72 | /// the step fails. |
| 66 | max_stdio_size: usize = 10 * 1024 * 1024, | 73 | max_stdio_size: usize = 10 * 1024 * 1024, |
| ... | @@ -680,6 +687,8 @@ fn runCommand( | ... | @@ -680,6 +687,8 @@ fn runCommand( |
| 680 | try Step.handleVerbose2(step.owner, self.cwd, self.env_map, interp_argv.items); | 687 | try Step.handleVerbose2(step.owner, self.cwd, self.env_map, interp_argv.items); |
| 681 | | 688 | |
| 682 | break :term spawnChildAndCollect(self, interp_argv.items, has_side_effects, prog_node) catch |e| { | 689 | break :term spawnChildAndCollect(self, interp_argv.items, has_side_effects, prog_node) catch |e| { |
| | 690 | if (!self.failing_to_execute_foreign_is_an_error) return error.MakeSkipped; |
| | 691 | |
| 683 | return step.fail("unable to spawn interpreter {s}: {s}", .{ | 692 | return step.fail("unable to spawn interpreter {s}: {s}", .{ |
| 684 | interp_argv.items[0], @errorName(e), | 693 | interp_argv.items[0], @errorName(e), |
| 685 | }); | 694 | }); |