/src/WasmEdge/lib/driver/uniTool.cpp
Line | Count | Source |
1 | | // SPDX-License-Identifier: Apache-2.0 |
2 | | // SPDX-FileCopyrightText: Copyright The WasmEdge Authors |
3 | | |
4 | | #include "driver/unitool.h" |
5 | | #include "common/spdlog.h" |
6 | | #include "common/version.h" |
7 | | #include "driver/compiler.h" |
8 | | #include "driver/tool.h" |
9 | | #include "plugin/plugin.h" |
10 | | #include "po/argument_parser.h" |
11 | | |
12 | | #include <cstdlib> |
13 | | #include <string_view> |
14 | | |
15 | | namespace WasmEdge { |
16 | | namespace Driver { |
17 | | |
18 | 0 | int UniTool(int Argc, const char *Argv[], const ToolType ToolSelect) noexcept { |
19 | 0 | using namespace std::literals; |
20 | |
|
21 | 0 | std::ios::sync_with_stdio(false); |
22 | |
|
23 | 0 | auto Parser = PO::ArgumentParser(); |
24 | |
|
25 | 0 | PO::SubCommand ToolSubCommand( |
26 | 0 | PO::Description("Wasmedge runtime tool subcommand"sv)); |
27 | 0 | PO::SubCommand CompilerSubCommand( |
28 | 0 | PO::Description("Wasmedge compiler subcommand"sv)); |
29 | 0 | PO::SubCommand ParseSubCommand( |
30 | 0 | PO::Description("Wasmedge parse tool subcommand"sv)); |
31 | 0 | PO::SubCommand InstantiateSubCommand( |
32 | 0 | PO::Description("Wasmedge instantiate tool subcommand"sv)); |
33 | 0 | PO::SubCommand ValidateSubCommand( |
34 | 0 | PO::Description("Wasmedge validate tool subcommand"sv)); |
35 | 0 | struct DriverToolOptions ToolOptions; |
36 | 0 | struct DriverCompilerOptions CompilerOptions; |
37 | 0 | struct DriverToolOptions ParseOptions; |
38 | 0 | struct DriverToolOptions InstantiateOptions; |
39 | 0 | struct DriverToolOptions ValidateOptions; |
40 | |
|
41 | 0 | auto AddOptions = [&](const ToolType Type) noexcept { |
42 | 0 | switch (Type) { |
43 | 0 | case ToolType::Tool: |
44 | 0 | ToolOptions.addOptions(Parser); |
45 | 0 | return true; |
46 | 0 | case ToolType::Compiler: |
47 | 0 | CompilerOptions.addOptions(Parser); |
48 | 0 | return true; |
49 | 0 | case ToolType::Parse: |
50 | 0 | ParseOptions.addParserOptions(Parser); |
51 | 0 | return true; |
52 | 0 | case ToolType::Instantiate: |
53 | 0 | InstantiateOptions.addLinkerOptions(Parser); |
54 | 0 | return true; |
55 | 0 | case ToolType::Validate: |
56 | 0 | ValidateOptions.addParserOptions(Parser); |
57 | 0 | return true; |
58 | 0 | default: |
59 | 0 | return false; |
60 | 0 | } |
61 | 0 | }; |
62 | 0 | auto AddSubCommand = [&](PO::SubCommand &SubCommand, std::string_view Name, |
63 | 0 | const ToolType Type) noexcept { |
64 | 0 | Parser.begin_subcommand(SubCommand, Name); |
65 | 0 | AddOptions(Type); |
66 | 0 | Parser.end_subcommand(); |
67 | 0 | }; |
68 | | |
69 | | // Construct Parser Subcommands and Options |
70 | 0 | if (ToolSelect == ToolType::All) { |
71 | 0 | AddOptions(ToolType::Tool); |
72 | 0 | AddSubCommand(CompilerSubCommand, "compile"sv, ToolType::Compiler); |
73 | 0 | AddSubCommand(ToolSubCommand, "run"sv, ToolType::Tool); |
74 | 0 | AddSubCommand(ParseSubCommand, "parse"sv, ToolType::Parse); |
75 | 0 | AddSubCommand(InstantiateSubCommand, "instantiate"sv, |
76 | 0 | ToolType::Instantiate); |
77 | 0 | AddSubCommand(ValidateSubCommand, "validate"sv, ToolType::Validate); |
78 | 0 | } else if (!AddOptions(ToolSelect)) { |
79 | 0 | return EXIT_FAILURE; |
80 | 0 | } |
81 | | |
82 | | // Parse |
83 | 0 | if (!Parser.parse(stdout, Argc, Argv)) { |
84 | 0 | return EXIT_FAILURE; |
85 | 0 | } |
86 | 0 | if (Parser.isVersion()) { |
87 | 0 | fmt::print("{} version {}\n"sv, Argv[0], kVersionString); |
88 | 0 | for (const auto &Plugin : Plugin::Plugin::plugins()) { |
89 | 0 | auto PluginVersion = Plugin.version(); |
90 | 0 | fmt::print("{} (plugin \"{}\") version {}.{}.{}.{}\n"sv, |
91 | 0 | Plugin.path().string(), Plugin.name(), PluginVersion.Major, |
92 | 0 | PluginVersion.Minor, PluginVersion.Patch, PluginVersion.Build); |
93 | 0 | } |
94 | 0 | return EXIT_SUCCESS; |
95 | 0 | } |
96 | 0 | if (Parser.isHelp()) { |
97 | 0 | return EXIT_SUCCESS; |
98 | 0 | } |
99 | | |
100 | | // Forward Results |
101 | 0 | ToolType Selected = ToolSelect; |
102 | 0 | if (ToolSelect == ToolType::All) { |
103 | 0 | if (CompilerSubCommand.is_selected()) { |
104 | 0 | Selected = ToolType::Compiler; |
105 | 0 | } else if (ParseSubCommand.is_selected()) { |
106 | 0 | Selected = ToolType::Parse; |
107 | 0 | } else if (InstantiateSubCommand.is_selected()) { |
108 | 0 | Selected = ToolType::Instantiate; |
109 | 0 | } else if (ValidateSubCommand.is_selected()) { |
110 | 0 | Selected = ToolType::Validate; |
111 | 0 | } else { |
112 | 0 | Selected = ToolType::Tool; |
113 | 0 | } |
114 | 0 | } |
115 | 0 | switch (Selected) { |
116 | 0 | case ToolType::Compiler: |
117 | 0 | CompilerOptions.inheritLoggingOptions(ToolOptions); |
118 | 0 | return Compiler(CompilerOptions); |
119 | 0 | case ToolType::Parse: |
120 | 0 | ParseOptions.inheritGlobalOptions(ToolOptions); |
121 | 0 | return ParseTool(ParseOptions); |
122 | 0 | case ToolType::Instantiate: |
123 | 0 | InstantiateOptions.inheritGlobalOptions(ToolOptions); |
124 | 0 | return InstantiateTool(InstantiateOptions); |
125 | 0 | case ToolType::Validate: |
126 | 0 | ValidateOptions.inheritGlobalOptions(ToolOptions); |
127 | 0 | return ValidateTool(ValidateOptions); |
128 | 0 | default: |
129 | 0 | return Tool(ToolOptions); |
130 | 0 | } |
131 | 0 | } |
132 | | |
133 | | } // namespace Driver |
134 | | } // namespace WasmEdge |