| ... | ... | @@ -265,6 +265,7 @@ const SeeAlsoItem = struct { |
| 265 | 265 | const ExpectedOutcome = enum { |
| 266 | 266 | Succeed, |
| 267 | 267 | Fail, |
| 268 | BuildFail, |
| 268 | 269 | }; |
| 269 | 270 | |
| 270 | 271 | const Code = struct { |
| ... | ... | @@ -468,6 +469,8 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc { |
| 468 | 469 | code_kind_id = Code.Id{ .Exe = ExpectedOutcome.Succeed }; |
| 469 | 470 | } else if (mem.eql(u8, code_kind_str, "exe_err")) { |
| 470 | 471 | code_kind_id = Code.Id{ .Exe = ExpectedOutcome.Fail }; |
| 472 | } else if (mem.eql(u8, code_kind_str, "exe_build_err")) { |
| 473 | code_kind_id = Code.Id{ .Exe = ExpectedOutcome.BuildFail }; |
| 471 | 474 | } else if (mem.eql(u8, code_kind_str, "test")) { |
| 472 | 475 | code_kind_id = Code.Id.Test; |
| 473 | 476 | } else if (mem.eql(u8, code_kind_str, "test_err")) { |
| ... | ... | @@ -1025,6 +1028,8 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var |
| 1025 | 1028 | tmp_dir_name, |
| 1026 | 1029 | "--name", |
| 1027 | 1030 | code.name, |
| 1031 | "--color", |
| 1032 | "on", |
| 1028 | 1033 | }); |
| 1029 | 1034 | try out.print("<pre><code class=\"shell\">$ zig build-exe {}.zig", code.name); |
| 1030 | 1035 | switch (code.mode) { |
| ... | ... | @@ -1060,6 +1065,39 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var |
| 1060 | 1065 | if (code.target_str) |triple| { |
| 1061 | 1066 | try build_args.appendSlice([][]const u8{ "-target", triple }); |
| 1062 | 1067 | } |
| 1068 | if (expected_outcome == .BuildFail) { |
| 1069 | const result = try os.ChildProcess.exec( |
| 1070 | allocator, |
| 1071 | build_args.toSliceConst(), |
| 1072 | null, |
| 1073 | &env_map, |
| 1074 | max_doc_file_size, |
| 1075 | ); |
| 1076 | switch (result.term) { |
| 1077 | os.ChildProcess.Term.Exited => |exit_code| { |
| 1078 | if (exit_code == 0) { |
| 1079 | warn("{}\nThe following command incorrectly succeeded:\n", result.stderr); |
| 1080 | for (build_args.toSliceConst()) |arg| |
| 1081 | warn("{} ", arg) |
| 1082 | else |
| 1083 | warn("\n"); |
| 1084 | return parseError(tokenizer, code.source_token, "example incorrectly compiled"); |
| 1085 | } |
| 1086 | }, |
| 1087 | else => { |
| 1088 | warn("{}\nThe following command crashed:\n", result.stderr); |
| 1089 | for (build_args.toSliceConst()) |arg| |
| 1090 | warn("{} ", arg) |
| 1091 | else |
| 1092 | warn("\n"); |
| 1093 | return parseError(tokenizer, code.source_token, "example compile crashed"); |
| 1094 | }, |
| 1095 | } |
| 1096 | const escaped_stderr = try escapeHtml(allocator, result.stderr); |
| 1097 | const colored_stderr = try termColor(allocator, escaped_stderr); |
| 1098 | try out.print("\n{}</code></pre>\n", colored_stderr); |
| 1099 | break :code_block; |
| 1100 | } |
| 1063 | 1101 | _ = exec(allocator, &env_map, build_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "example failed to compile"); |
| 1064 | 1102 | |
| 1065 | 1103 | if (code.target_str) |triple| { |