| ... | @@ -18,13 +18,13 @@ const tmp_dir_name = "docgen_tmp"; | ... | @@ -18,13 +18,13 @@ const tmp_dir_name = "docgen_tmp"; |
| 18 | const test_out_path = tmp_dir_name ++ fs.path.sep_str ++ "test" ++ exe_ext; | 18 | const test_out_path = tmp_dir_name ++ fs.path.sep_str ++ "test" ++ exe_ext; |
| 19 | | 19 | |
| 20 | const usage = | 20 | const usage = |
| 21 | \\Usage: docgen [--zig] [--skip-code-test] input output" | 21 | \\Usage: docgen [--zig] [--skip-code-tests] input output" |
| 22 | \\ | 22 | \\ |
| 23 | \\ Generates an HTML document from a docgen template. | 23 | \\ Generates an HTML document from a docgen template. |
| 24 | \\ | 24 | \\ |
| 25 | \\Options: | 25 | \\Options: |
| 26 | \\ -h, --help Print this help and exit | 26 | \\ -h, --help Print this help and exit |
| 27 | \\ --skip-code-test Skip the doctests | 27 | \\ --skip-code-tests Skip the doctests |
| 28 | \\ | 28 | \\ |
| 29 | ; | 29 | ; |
| 30 | | 30 | |
| ... | @@ -329,6 +329,7 @@ const Code = struct { | ... | @@ -329,6 +329,7 @@ const Code = struct { |
| 329 | link_mode: ?std.builtin.LinkMode, | 329 | link_mode: ?std.builtin.LinkMode, |
| 330 | disable_cache: bool, | 330 | disable_cache: bool, |
| 331 | verbose_cimport: bool, | 331 | verbose_cimport: bool, |
| | 332 | additional_options: []const []const u8, |
| 332 | | 333 | |
| 333 | const Id = union(enum) { | 334 | const Id = union(enum) { |
| 334 | Test, | 335 | Test, |
| ... | @@ -596,6 +597,8 @@ fn genToc(allocator: Allocator, tokenizer: *Tokenizer) !Toc { | ... | @@ -596,6 +597,8 @@ fn genToc(allocator: Allocator, tokenizer: *Tokenizer) !Toc { |
| 596 | var disable_cache = false; | 597 | var disable_cache = false; |
| 597 | var verbose_cimport = false; | 598 | var verbose_cimport = false; |
| 598 | var backend_stage1 = false; | 599 | var backend_stage1 = false; |
| | 600 | var additional_options = std.ArrayList([]const u8).init(allocator); |
| | 601 | defer additional_options.deinit(); |
| 599 | | 602 | |
| 600 | const source_token = while (true) { | 603 | const source_token = while (true) { |
| 601 | const content_tok = try eatToken(tokenizer, Token.Id.Content); | 604 | const content_tok = try eatToken(tokenizer, Token.Id.Content); |
| ... | @@ -630,6 +633,10 @@ fn genToc(allocator: Allocator, tokenizer: *Tokenizer) !Toc { | ... | @@ -630,6 +633,10 @@ fn genToc(allocator: Allocator, tokenizer: *Tokenizer) !Toc { |
| 630 | link_mode = .Dynamic; | 633 | link_mode = .Dynamic; |
| 631 | } else if (mem.eql(u8, end_tag_name, "backend_stage1")) { | 634 | } else if (mem.eql(u8, end_tag_name, "backend_stage1")) { |
| 632 | backend_stage1 = true; | 635 | backend_stage1 = true; |
| | 636 | } else if (mem.eql(u8, end_tag_name, "additonal_option")) { |
| | 637 | _ = try eatToken(tokenizer, Token.Id.Separator); |
| | 638 | const option = try eatToken(tokenizer, Token.Id.TagContent); |
| | 639 | try additional_options.append(tokenizer.buffer[option.start..option.end]); |
| 633 | } else if (mem.eql(u8, end_tag_name, "code_end")) { | 640 | } else if (mem.eql(u8, end_tag_name, "code_end")) { |
| 634 | _ = try eatToken(tokenizer, Token.Id.BracketClose); | 641 | _ = try eatToken(tokenizer, Token.Id.BracketClose); |
| 635 | break content_tok; | 642 | break content_tok; |
| ... | @@ -657,6 +664,7 @@ fn genToc(allocator: Allocator, tokenizer: *Tokenizer) !Toc { | ... | @@ -657,6 +664,7 @@ fn genToc(allocator: Allocator, tokenizer: *Tokenizer) !Toc { |
| 657 | .link_mode = link_mode, | 664 | .link_mode = link_mode, |
| 658 | .disable_cache = disable_cache, | 665 | .disable_cache = disable_cache, |
| 659 | .verbose_cimport = verbose_cimport, | 666 | .verbose_cimport = verbose_cimport, |
| | 667 | .additional_options = try additional_options.toOwnedSlice(), |
| 660 | }, | 668 | }, |
| 661 | }); | 669 | }); |
| 662 | tokenizer.code_node_count += 1; | 670 | tokenizer.code_node_count += 1; |
| ... | @@ -1418,6 +1426,10 @@ fn genHtml( | ... | @@ -1418,6 +1426,10 @@ fn genHtml( |
| 1418 | try build_args.append("--verbose-cimport"); | 1426 | try build_args.append("--verbose-cimport"); |
| 1419 | try shell_out.print("--verbose-cimport ", .{}); | 1427 | try shell_out.print("--verbose-cimport ", .{}); |
| 1420 | } | 1428 | } |
| | 1429 | for (code.additional_options) |option| { |
| | 1430 | try build_args.append(option); |
| | 1431 | try shell_out.print("{s} ", .{option}); |
| | 1432 | } |
| 1421 | | 1433 | |
| 1422 | try shell_out.print("\n", .{}); | 1434 | try shell_out.print("\n", .{}); |
| 1423 | | 1435 | |
| ... | @@ -1729,6 +1741,10 @@ fn genHtml( | ... | @@ -1729,6 +1741,10 @@ fn genHtml( |
| 1729 | try build_args.appendSlice(&[_][]const u8{ "-target", triple }); | 1741 | try build_args.appendSlice(&[_][]const u8{ "-target", triple }); |
| 1730 | try shell_out.print("-target {s} ", .{triple}); | 1742 | try shell_out.print("-target {s} ", .{triple}); |
| 1731 | } | 1743 | } |
| | 1744 | for (code.additional_options) |option| { |
| | 1745 | try build_args.append(option); |
| | 1746 | try shell_out.print("{s} ", .{option}); |
| | 1747 | } |
| 1732 | | 1748 | |
| 1733 | if (maybe_error_match) |error_match| { | 1749 | if (maybe_error_match) |error_match| { |
| 1734 | const result = try ChildProcess.exec(.{ | 1750 | const result = try ChildProcess.exec(.{ |
| ... | @@ -1811,6 +1827,10 @@ fn genHtml( | ... | @@ -1811,6 +1827,10 @@ fn genHtml( |
| 1811 | }, | 1827 | }, |
| 1812 | } | 1828 | } |
| 1813 | } | 1829 | } |
| | 1830 | for (code.additional_options) |option| { |
| | 1831 | try test_args.append(option); |
| | 1832 | try shell_out.print("{s} ", .{option}); |
| | 1833 | } |
| 1814 | const result = exec(allocator, &env_map, test_args.items) catch return parseError(tokenizer, code.source_token, "test failed", .{}); | 1834 | const result = exec(allocator, &env_map, test_args.items) catch return parseError(tokenizer, code.source_token, "test failed", .{}); |
| 1815 | const escaped_stderr = try escapeHtml(allocator, result.stderr); | 1835 | const escaped_stderr = try escapeHtml(allocator, result.stderr); |
| 1816 | const escaped_stdout = try escapeHtml(allocator, result.stdout); | 1836 | const escaped_stdout = try escapeHtml(allocator, result.stdout); |