@pkmn/engine 0.1.0-dev.84cc1a02 → 0.1.0-dev.8b192003
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -3
- package/README.md +135 -71
- package/build/pkg/addon.d.ts +7 -0
- package/build/pkg/addon.js +111 -0
- package/build/pkg/addon.js.map +1 -0
- package/build/pkg/data/ids.json +12 -12
- package/build/pkg/data/layout.json +27 -5
- package/build/pkg/data/protocol.json +69 -12
- package/build/pkg/data.d.ts +5 -6
- package/build/pkg/data.js +3 -5
- package/build/pkg/data.js.map +1 -1
- package/build/pkg/gen1.d.ts +5 -4
- package/build/pkg/gen1.js +49 -33
- package/build/pkg/gen1.js.map +1 -1
- package/build/pkg/index.d.ts +17 -13
- package/build/pkg/index.js.map +1 -1
- package/build/pkg/protocol.d.ts +4 -2
- package/build/pkg/protocol.js +65 -44
- package/build/pkg/protocol.js.map +1 -1
- package/build/test/display.js +400 -0
- package/build/test/display.js.map +1 -0
- package/build/tools/debug.js +134 -0
- package/build/tools/debug.js.map +1 -0
- package/build.zig +161 -147
- package/package.json +86 -46
- package/src/bin/install-pkmn-engine +67 -35
- package/src/bin/pkmn-debug +62 -0
- package/src/lib/common/battle.zig +17 -0
- package/src/lib/common/data.zig +19 -31
- package/src/lib/common/debug.zig +23 -13
- package/src/lib/common/js.zig +118 -0
- package/src/lib/common/optional.zig +67 -0
- package/src/lib/common/options.zig +14 -3
- package/src/lib/common/protocol.zig +942 -403
- package/src/lib/common/rational.zig +447 -0
- package/src/lib/common/rng.zig +35 -26
- package/src/lib/common/util.zig +12 -0
- package/src/lib/gen1/calc.zig +812 -0
- package/src/lib/gen1/chance.zig +827 -0
- package/src/lib/gen1/data/moves.zig +202 -190
- package/src/lib/gen1/data/species.zig +5 -5
- package/src/lib/gen1/data/types.zig +10 -10
- package/src/lib/gen1/data.zig +108 -94
- package/src/lib/gen1/helpers.zig +136 -37
- package/src/lib/gen1/mechanics.zig +1188 -835
- package/src/lib/gen2/calc.zig +143 -0
- package/src/lib/gen2/chance.zig +882 -0
- package/src/lib/gen2/data/items.zig +14 -20
- package/src/lib/gen2/data/moves.zig +664 -570
- package/src/lib/gen2/data/species.zig +2 -2
- package/src/lib/gen2/data/types.zig +137 -34
- package/src/lib/gen2/data.zig +134 -96
- package/src/lib/gen2/generated.zig +806 -0
- package/src/lib/gen2/helpers.zig +50 -26
- package/src/lib/gen2/mechanics.zig +3564 -12
- package/src/lib/node.zig +131 -0
- package/src/lib/pkmn.zig +86 -12
- package/src/lib/wasm.zig +13 -0
- package/src/test/display/pkmn.html.tmpl +368 -0
- package/src/lib/binding/node.zig +0 -229
- package/src/lib/binding/wasm.zig +0 -10
- package/src/lib/gen1/README.md +0 -778
- package/src/lib/gen2/README.md +0 -309
package/build.zig
CHANGED
|
@@ -1,19 +1,6 @@
|
|
|
1
1
|
const std = @import("std");
|
|
2
2
|
const builtin = @import("builtin");
|
|
3
3
|
|
|
4
|
-
pub const Options = struct { showdown: ?bool = null, trace: ?bool = null };
|
|
5
|
-
|
|
6
|
-
pub fn module(b: *std.Build, options: Options) *std.Build.Module {
|
|
7
|
-
const dirname = comptime std.fs.path.dirname(@src().file) orelse ".";
|
|
8
|
-
const build_options = b.addOptions();
|
|
9
|
-
build_options.addOption(?bool, "showdown", options.showdown);
|
|
10
|
-
build_options.addOption(?bool, "trace", options.trace);
|
|
11
|
-
return b.createModule(.{
|
|
12
|
-
.source_file = .{ .path = dirname ++ "/src/lib/pkmn.zig" },
|
|
13
|
-
.dependencies = &.{.{ .name = "build_options", .module = build_options.createModule() }},
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
|
|
17
4
|
pub fn build(b: *std.Build) !void {
|
|
18
5
|
const target = b.standardTargetOptions(.{});
|
|
19
6
|
const optimize = b.standardOptimizeOption(.{});
|
|
@@ -25,132 +12,169 @@ pub fn build(b: *std.Build) !void {
|
|
|
25
12
|
const wasm_stack_size =
|
|
26
13
|
b.option(u64, "wasm-stack-size", "The size of WASM stack") orelse std.wasm.page_size;
|
|
27
14
|
const dynamic = b.option(bool, "dynamic", "Build a dynamic library") orelse false;
|
|
28
|
-
const strip = b.option(bool, "strip", "Strip debugging symbols from binary")
|
|
29
|
-
const pic = b.option(bool, "pic", "Force position independent code")
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
|
|
15
|
+
const strip = b.option(bool, "strip", "Strip debugging symbols from binary");
|
|
16
|
+
const pic = b.option(bool, "pic", "Force position independent code");
|
|
17
|
+
const emit_asm = b.option(bool, "emit-asm", "Output .s (assembly code)") orelse false;
|
|
18
|
+
const emit_ll = b.option(bool, "emit-ll", "Output .ll (LLVM IR)") orelse false;
|
|
19
|
+
|
|
20
|
+
const cmd = b.findProgram(&.{"strip"}, &.{}) catch null;
|
|
21
|
+
|
|
22
|
+
const json = @embedFile("package.json");
|
|
23
|
+
var parsed = try std.json.parseFromSlice(std.json.Value, b.allocator, json, .{});
|
|
24
|
+
defer parsed.deinit();
|
|
25
|
+
const version = parsed.value.object.get("version").?.string;
|
|
26
|
+
const description = parsed.value.object.get("description").?.string;
|
|
27
|
+
var repository = std.mem.splitSequence(u8, parsed.value.object.get("repository").?.string, ":");
|
|
40
28
|
std.debug.assert(std.mem.eql(u8, repository.first(), "github"));
|
|
41
29
|
|
|
42
30
|
const showdown =
|
|
43
31
|
b.option(bool, "showdown", "Enable Pokémon Showdown compatibility mode") orelse false;
|
|
44
|
-
const
|
|
32
|
+
const log = b.option(bool, "log", "Enable protocol message logging") orelse false;
|
|
33
|
+
const chance = b.option(bool, "chance", "Enable update probability tracking") orelse false;
|
|
34
|
+
const calc = b.option(bool, "calc", "Enable damage calculator support") orelse false;
|
|
45
35
|
|
|
46
36
|
const options = b.addOptions();
|
|
47
37
|
options.addOption(?bool, "showdown", showdown);
|
|
48
|
-
options.addOption(?bool, "
|
|
38
|
+
options.addOption(?bool, "log", log);
|
|
39
|
+
options.addOption(?bool, "chance", chance);
|
|
40
|
+
options.addOption(?bool, "calc", calc);
|
|
49
41
|
|
|
50
42
|
const name = if (showdown) "pkmn-showdown" else "pkmn";
|
|
51
43
|
|
|
44
|
+
const module = b.addModule("pkmn", .{
|
|
45
|
+
.root_source_file = b.path("src/lib/pkmn.zig"),
|
|
46
|
+
.optimize = optimize,
|
|
47
|
+
.target = target,
|
|
48
|
+
.imports = &.{.{ .name = "build_options", .module = options.createModule() }},
|
|
49
|
+
});
|
|
50
|
+
|
|
52
51
|
var c = false;
|
|
53
52
|
if (node_headers) |headers| {
|
|
54
53
|
const addon = b.fmt("{s}.node", .{name});
|
|
55
54
|
const lib = b.addSharedLibrary(.{
|
|
56
55
|
.name = addon,
|
|
57
|
-
.root_source_file = .
|
|
56
|
+
.root_source_file = b.path("src/lib/node.zig"),
|
|
58
57
|
.optimize = optimize,
|
|
59
58
|
.target = target,
|
|
59
|
+
.strip = strip,
|
|
60
|
+
.pic = pic,
|
|
60
61
|
});
|
|
61
|
-
lib.addOptions("build_options", options);
|
|
62
|
-
lib.
|
|
63
|
-
lib.addSystemIncludePath(headers);
|
|
62
|
+
lib.root_module.addOptions("build_options", options);
|
|
63
|
+
lib.addSystemIncludePath(b.path(headers));
|
|
64
64
|
lib.linkLibC();
|
|
65
65
|
if (node_import_lib) |il| {
|
|
66
|
-
lib.addObjectFile(il);
|
|
67
|
-
} else if (
|
|
66
|
+
lib.addObjectFile(b.path(il));
|
|
67
|
+
} else if (target.result.os.tag == .windows) {
|
|
68
68
|
try std.io.getStdErr().writeAll("Must provide --node-import-library path on Windows\n");
|
|
69
69
|
std.process.exit(1);
|
|
70
70
|
}
|
|
71
71
|
lib.linker_allow_shlib_undefined = true;
|
|
72
72
|
maybeStrip(b, lib, b.getInstallStep(), strip, cmd);
|
|
73
|
-
if (pic) lib.force_pic = pic;
|
|
74
73
|
// Always emit to build/lib because this is where the driver code expects to find it
|
|
75
|
-
// TODO
|
|
74
|
+
// TODO: ziglang/zig#2231 - using the following used to work (though was hacky):
|
|
76
75
|
//
|
|
77
76
|
// lib.emit_bin = .{ .emit_to = b.fmt("build/lib/{s}", .{addon}) };
|
|
78
77
|
// b.getInstallStep().dependOn(&lib.step);
|
|
79
78
|
//
|
|
80
79
|
// But ziglang/zig#14647 broke this so we now need to do an install() and then manually
|
|
81
80
|
// rename the file ourself in install-pkmn-engine
|
|
82
|
-
|
|
81
|
+
b.installArtifact(lib);
|
|
83
82
|
} else if (wasm) {
|
|
84
|
-
const
|
|
83
|
+
const exe = b.addExecutable(.{
|
|
85
84
|
.name = name,
|
|
86
|
-
.root_source_file = .
|
|
85
|
+
.root_source_file = b.path("src/lib/wasm.zig"),
|
|
87
86
|
.optimize = switch (optimize) {
|
|
88
87
|
.ReleaseFast, .ReleaseSafe => .ReleaseSmall,
|
|
89
88
|
else => optimize,
|
|
90
89
|
},
|
|
91
|
-
.target = .{ .cpu_arch = .wasm32, .os_tag = .freestanding },
|
|
90
|
+
.target = b.resolveTargetQuery(.{ .cpu_arch = .wasm32, .os_tag = .freestanding }),
|
|
91
|
+
.strip = strip,
|
|
92
|
+
.pic = pic,
|
|
92
93
|
});
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
94
|
+
exe.root_module.addOptions("build_options", options);
|
|
95
|
+
exe.root_module.export_symbol_names = &[_][]const u8{
|
|
96
|
+
"SHOWDOWN",
|
|
97
|
+
"LOG",
|
|
98
|
+
"CHANCE",
|
|
99
|
+
"CALC",
|
|
100
|
+
"GEN1_CHOICES_SIZE",
|
|
101
|
+
"GEN1_LOGS_SIZE",
|
|
102
|
+
};
|
|
103
|
+
exe.entry = .disabled;
|
|
104
|
+
exe.stack_size = wasm_stack_size;
|
|
105
|
+
const opt = b.findProgram(&.{"wasm-opt"}, &.{"./node_modules/.bin"}) catch null;
|
|
103
106
|
if (optimize != .Debug and opt != null) {
|
|
104
107
|
const out = b.fmt("build/lib/{s}.wasm", .{name});
|
|
105
|
-
const sh = b.addSystemCommand(
|
|
106
|
-
sh.addArtifactArg(
|
|
108
|
+
const sh = b.addSystemCommand(&.{ opt.?, "-O4" });
|
|
109
|
+
sh.addArtifactArg(exe);
|
|
107
110
|
sh.addArg("-o");
|
|
108
|
-
sh.
|
|
111
|
+
sh.addFileArg(b.path(out));
|
|
109
112
|
b.getInstallStep().dependOn(&sh.step);
|
|
113
|
+
} else {
|
|
114
|
+
b.getInstallStep().dependOn(&b.addInstallArtifact(exe, .{
|
|
115
|
+
.dest_dir = .{ .override = std.Build.InstallDir{ .lib = {} } },
|
|
116
|
+
}).step);
|
|
110
117
|
}
|
|
111
|
-
lib.install();
|
|
112
118
|
} else if (dynamic) {
|
|
113
119
|
const lib = b.addSharedLibrary(.{
|
|
114
120
|
.name = name,
|
|
115
|
-
.root_source_file = .
|
|
116
|
-
.version = try std.
|
|
121
|
+
.root_source_file = b.path("src/lib/c.zig"),
|
|
122
|
+
.version = try std.SemanticVersion.parse(version),
|
|
117
123
|
.optimize = optimize,
|
|
118
124
|
.target = target,
|
|
125
|
+
.strip = strip,
|
|
126
|
+
.pic = pic,
|
|
119
127
|
});
|
|
120
|
-
lib.addOptions("build_options", options);
|
|
121
|
-
lib.
|
|
122
|
-
lib.addIncludePath("src/include");
|
|
128
|
+
lib.root_module.addOptions("build_options", options);
|
|
129
|
+
lib.addIncludePath(b.path("src/include"));
|
|
123
130
|
maybeStrip(b, lib, b.getInstallStep(), strip, cmd);
|
|
124
|
-
|
|
125
|
-
lib.install();
|
|
131
|
+
b.installArtifact(lib);
|
|
126
132
|
c = true;
|
|
127
133
|
} else {
|
|
128
134
|
const lib = b.addStaticLibrary(.{
|
|
129
135
|
.name = name,
|
|
130
|
-
.root_source_file = .
|
|
136
|
+
.root_source_file = b.path("src/lib/c.zig"),
|
|
131
137
|
.optimize = optimize,
|
|
132
138
|
.target = target,
|
|
139
|
+
.strip = strip,
|
|
140
|
+
.pic = pic,
|
|
133
141
|
});
|
|
134
|
-
lib.addOptions("build_options", options);
|
|
135
|
-
lib.
|
|
136
|
-
lib.addIncludePath("src/include");
|
|
142
|
+
lib.root_module.addOptions("build_options", options);
|
|
143
|
+
lib.addIncludePath(b.path("src/include"));
|
|
137
144
|
lib.bundle_compiler_rt = true;
|
|
138
145
|
maybeStrip(b, lib, b.getInstallStep(), strip, cmd);
|
|
139
|
-
if (
|
|
140
|
-
|
|
146
|
+
if (emit_asm) {
|
|
147
|
+
b.getInstallStep().dependOn(&b.addInstallFileWithDir(
|
|
148
|
+
lib.getEmittedAsm(),
|
|
149
|
+
.prefix,
|
|
150
|
+
b.fmt("{s}.s", .{name}),
|
|
151
|
+
).step);
|
|
152
|
+
}
|
|
153
|
+
if (emit_ll) {
|
|
154
|
+
b.getInstallStep().dependOn(&b.addInstallFileWithDir(
|
|
155
|
+
lib.getEmittedLlvmIr(),
|
|
156
|
+
.prefix,
|
|
157
|
+
b.fmt("{s}.ll", .{name}),
|
|
158
|
+
).step);
|
|
159
|
+
}
|
|
160
|
+
b.installArtifact(lib);
|
|
141
161
|
c = true;
|
|
142
162
|
}
|
|
143
163
|
|
|
144
164
|
if (c) {
|
|
145
165
|
const header = b.addInstallFileWithDir(
|
|
146
|
-
.
|
|
166
|
+
b.path("src/include/pkmn.h"),
|
|
147
167
|
.header,
|
|
148
168
|
"pkmn.h",
|
|
149
169
|
);
|
|
150
170
|
b.getInstallStep().dependOn(&header.step);
|
|
151
171
|
|
|
152
172
|
const pc = b.fmt("lib{s}.pc", .{name});
|
|
153
|
-
const file = try
|
|
173
|
+
const file = try std.fs.path.relative(
|
|
174
|
+
b.allocator,
|
|
175
|
+
try std.process.getCwdAlloc(b.allocator),
|
|
176
|
+
try b.cache_root.join(b.allocator, &.{pc}),
|
|
177
|
+
);
|
|
154
178
|
const pkgconfig_file = try std.fs.cwd().createFile(file, .{});
|
|
155
179
|
|
|
156
180
|
const dirname = comptime std.fs.path.dirname(@src().file) orelse ".";
|
|
@@ -179,14 +203,16 @@ pub fn build(b: *std.Build) !void {
|
|
|
179
203
|
.strip = strip,
|
|
180
204
|
.cmd = cmd,
|
|
181
205
|
};
|
|
206
|
+
|
|
207
|
+
// TODO: tests can be run multiple times due to @imports
|
|
182
208
|
const tests = TestStep.create(b, options, config);
|
|
183
209
|
|
|
184
|
-
var exes = std.ArrayList(*std.Build.
|
|
210
|
+
var exes = std.ArrayList(*std.Build.Step.Compile).init(b.allocator);
|
|
185
211
|
const tools: ToolConfig = .{
|
|
212
|
+
.showdown = showdown,
|
|
213
|
+
.module = module,
|
|
186
214
|
.general = config,
|
|
187
215
|
.tool = .{
|
|
188
|
-
.showdown = showdown,
|
|
189
|
-
.trace = trace,
|
|
190
216
|
.tests = if (tests.build) tests else null,
|
|
191
217
|
.exes = &exes,
|
|
192
218
|
},
|
|
@@ -195,141 +221,129 @@ pub fn build(b: *std.Build) !void {
|
|
|
195
221
|
var benchmark_config = tools;
|
|
196
222
|
benchmark_config.general.optimize = .ReleaseFast;
|
|
197
223
|
benchmark_config.general.strip = true;
|
|
198
|
-
const benchmark = tool(b, "src/test/benchmark.zig", benchmark_config);
|
|
224
|
+
const benchmark = try tool(b, "src/test/benchmark.zig", benchmark_config);
|
|
199
225
|
|
|
200
226
|
var fuzz_config = tools;
|
|
201
227
|
fuzz_config.general.strip = false;
|
|
202
228
|
fuzz_config.tool.name = "fuzz";
|
|
203
|
-
const fuzz = tool(b, "src/test/
|
|
204
|
-
|
|
205
|
-
const
|
|
206
|
-
const
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
b.step("
|
|
215
|
-
b.step("
|
|
216
|
-
b.step("
|
|
217
|
-
b.step("
|
|
229
|
+
const fuzz = try tool(b, "src/test/fuzz.zig", fuzz_config);
|
|
230
|
+
|
|
231
|
+
const analyze = try tool(b, "src/tools/analyze.zig", tools);
|
|
232
|
+
const dump = try tool(b, "src/tools/dump.zig", tools);
|
|
233
|
+
const transitions = try tool(b, "src/tools/transitions.zig", tools);
|
|
234
|
+
|
|
235
|
+
// FIXME: serde randomly fails to build in some release configurations
|
|
236
|
+
var hack = tools;
|
|
237
|
+
if (optimize != .Debug) hack.tool.tests = null;
|
|
238
|
+
const serde = try tool(b, "src/tools/serde.zig", hack);
|
|
239
|
+
|
|
240
|
+
if (analyze) |t| b.step("analyze", "Run LLVM analysis tool").dependOn(&t.step);
|
|
241
|
+
if (benchmark) |t| b.step("benchmark", "Run benchmark code").dependOn(&t.step);
|
|
242
|
+
if (dump) |t| b.step("dump", "Run protocol dump tool").dependOn(&t.step);
|
|
243
|
+
if (fuzz) |t| b.step("fuzz", "Run fuzz tester").dependOn(&t.step);
|
|
244
|
+
if (serde) |t| b.step("serde", "Run serialization/deserialization tool").dependOn(&t.step);
|
|
218
245
|
b.step("test", "Run all tests").dependOn(&tests.step);
|
|
219
246
|
b.step("tools", "Install tools").dependOn(&ToolsStep.create(b, &exes).step);
|
|
247
|
+
if (transitions) |t| {
|
|
248
|
+
b.step("transitions", "Visualize transitions algorithm search").dependOn(&t.step);
|
|
249
|
+
}
|
|
220
250
|
}
|
|
221
251
|
|
|
222
252
|
fn maybeStrip(
|
|
223
253
|
b: *std.Build,
|
|
224
|
-
artifact: *std.Build.
|
|
254
|
+
artifact: *std.Build.Step.Compile,
|
|
225
255
|
step: *std.Build.Step,
|
|
226
|
-
strip: bool,
|
|
256
|
+
strip: ?bool,
|
|
227
257
|
cmd: ?[]const u8,
|
|
228
258
|
) void {
|
|
229
|
-
|
|
230
|
-
if (!strip or cmd == null) return;
|
|
259
|
+
if (!(strip orelse false) or cmd == null) return;
|
|
231
260
|
// Using `strip -r -u` for dynamic libraries is supposed to work on macOS but doesn't...
|
|
232
261
|
const mac = builtin.os.tag == .macos;
|
|
233
262
|
if (mac and artifact.isDynamicLibrary()) return;
|
|
234
263
|
// Assuming GNU strip, which complains "illegal pathname found in archive member"...
|
|
235
264
|
if (!mac and artifact.isStaticLibrary()) return;
|
|
236
|
-
const sh = b.addSystemCommand(
|
|
265
|
+
const sh = b.addSystemCommand(&.{ cmd.?, if (mac) "-x" else "-s" });
|
|
237
266
|
sh.addArtifactArg(artifact);
|
|
238
267
|
step.dependOn(&sh.step);
|
|
239
268
|
}
|
|
240
269
|
|
|
241
270
|
const Config = struct {
|
|
242
|
-
target: std.
|
|
271
|
+
target: std.Build.ResolvedTarget,
|
|
243
272
|
optimize: std.builtin.OptimizeMode,
|
|
244
|
-
pic: bool,
|
|
245
|
-
strip: bool,
|
|
273
|
+
pic: ?bool,
|
|
274
|
+
strip: ?bool,
|
|
246
275
|
cmd: ?[]const u8,
|
|
247
276
|
};
|
|
248
277
|
|
|
249
|
-
const TESTS = [_][]const u8{
|
|
250
|
-
"src/lib/common/test.zig",
|
|
251
|
-
"src/lib/gen1/test.zig",
|
|
252
|
-
"src/lib/gen2/test.zig",
|
|
253
|
-
};
|
|
254
|
-
|
|
255
278
|
const TestStep = struct {
|
|
256
279
|
step: std.Build.Step,
|
|
257
280
|
build: bool,
|
|
258
281
|
|
|
259
|
-
pub fn create(b: *std.Build, options: *std.Build.
|
|
282
|
+
pub fn create(b: *std.Build, options: *std.Build.Step.Options, config: Config) *TestStep {
|
|
260
283
|
const coverage = b.option([]const u8, "test-coverage", "Generate test coverage");
|
|
261
|
-
const test_file = b.option([]const u8, "test-file", "Input file for test");
|
|
262
|
-
const test_bin = b.option([]const u8, "test-bin", "Emit test binary to");
|
|
263
284
|
const test_filter =
|
|
264
285
|
b.option([]const u8, "test-filter", "Skip tests that do not match filter");
|
|
265
|
-
const test_no_exec =
|
|
266
|
-
b.option(bool, "test-no-exec", "Compiles test binary without running it") orelse false;
|
|
267
286
|
|
|
268
287
|
const self = b.allocator.create(TestStep) catch @panic("OOM");
|
|
269
288
|
const step = std.Build.Step.init(.{ .id = .custom, .name = "Run all tests", .owner = b });
|
|
270
|
-
self.* =
|
|
271
|
-
|
|
272
|
-
const
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
tests.
|
|
285
|
-
maybeStrip(b, tests, &tests.step, config.strip, config.cmd);
|
|
286
|
-
if (config.pic) tests.force_pic = config.pic;
|
|
287
|
-
if (test_bin) |bin| {
|
|
288
|
-
tests.name = std.fs.path.basename(bin);
|
|
289
|
-
if (std.fs.path.dirname(bin)) |dir| tests.setOutputDir(dir);
|
|
290
|
-
}
|
|
291
|
-
if (coverage) |c| {
|
|
292
|
-
tests.setExecCmd(&.{ "kcov", "--include-pattern=src/lib", c, null });
|
|
293
|
-
}
|
|
294
|
-
self.step.dependOn(if (test_no_exec) &tests.step else &tests.run().step);
|
|
289
|
+
self.* = .{ .step = step, .build = test_filter == null };
|
|
290
|
+
|
|
291
|
+
const tests = b.addTest(.{
|
|
292
|
+
.root_source_file = b.path("src/lib/test.zig"),
|
|
293
|
+
.optimize = config.optimize,
|
|
294
|
+
.target = config.target,
|
|
295
|
+
.filter = test_filter,
|
|
296
|
+
.single_threaded = true,
|
|
297
|
+
.strip = config.strip,
|
|
298
|
+
.pic = config.pic,
|
|
299
|
+
});
|
|
300
|
+
tests.root_module.addOptions("build_options", options);
|
|
301
|
+
maybeStrip(b, tests, &tests.step, config.strip, config.cmd);
|
|
302
|
+
if (coverage) |c| {
|
|
303
|
+
tests.setExecCmd(&.{ "kcov", "--include-pattern=src/lib", c, null });
|
|
295
304
|
}
|
|
305
|
+
self.step.dependOn(&b.addRunArtifact(tests).step);
|
|
306
|
+
|
|
296
307
|
return self;
|
|
297
308
|
}
|
|
298
309
|
};
|
|
299
310
|
|
|
300
311
|
const ToolConfig = struct {
|
|
312
|
+
showdown: ?bool,
|
|
313
|
+
module: *std.Build.Module,
|
|
301
314
|
general: Config,
|
|
302
315
|
tool: struct {
|
|
303
|
-
showdown: bool,
|
|
304
|
-
trace: bool,
|
|
305
316
|
tests: ?*TestStep,
|
|
306
317
|
name: ?[]const u8 = null,
|
|
307
|
-
exes: *std.ArrayList(*std.Build.
|
|
318
|
+
exes: *std.ArrayList(*std.Build.Step.Compile),
|
|
308
319
|
},
|
|
309
320
|
};
|
|
310
321
|
|
|
311
|
-
fn tool(b: *std.Build, path: []const u8, config: ToolConfig)
|
|
322
|
+
fn tool(b: *std.Build, path: []const u8, config: ToolConfig) !?*std.Build.Step.Run {
|
|
323
|
+
std.fs.cwd().access(path, .{}) catch |err| switch (err) {
|
|
324
|
+
error.FileNotFound => return null,
|
|
325
|
+
else => |e| return e,
|
|
326
|
+
};
|
|
312
327
|
var name = config.tool.name orelse std.fs.path.basename(path);
|
|
313
328
|
const index = std.mem.lastIndexOfScalar(u8, name, '.');
|
|
314
329
|
if (index) |i| name = name[0..i];
|
|
315
|
-
if (config.
|
|
330
|
+
if (config.showdown orelse false) name = b.fmt("{s}-showdown", .{name});
|
|
316
331
|
|
|
317
332
|
const exe = b.addExecutable(.{
|
|
318
333
|
.name = name,
|
|
319
|
-
.root_source_file = .
|
|
334
|
+
.root_source_file = b.path(path),
|
|
320
335
|
.target = config.general.target,
|
|
321
336
|
.optimize = config.general.optimize,
|
|
337
|
+
.single_threaded = true,
|
|
338
|
+
.strip = config.general.strip,
|
|
339
|
+
.pic = config.general.pic,
|
|
322
340
|
});
|
|
323
|
-
exe.
|
|
324
|
-
|
|
325
|
-
.trace = config.tool.trace,
|
|
326
|
-
}));
|
|
327
|
-
exe.single_threaded = true;
|
|
328
|
-
if (config.general.pic) exe.force_pic = config.general.pic;
|
|
341
|
+
exe.root_module.addImport("pkmn", config.module);
|
|
342
|
+
|
|
329
343
|
if (config.tool.tests) |ts| ts.step.dependOn(&exe.step);
|
|
330
344
|
config.tool.exes.append(exe) catch @panic("OOM");
|
|
331
345
|
|
|
332
|
-
const run =
|
|
346
|
+
const run = b.addRunArtifact(exe);
|
|
333
347
|
maybeStrip(b, exe, &run.step, config.general.strip, config.general.cmd);
|
|
334
348
|
if (b.args) |args| run.addArgs(args);
|
|
335
349
|
|
|
@@ -339,11 +353,11 @@ fn tool(b: *std.Build, path: []const u8, config: ToolConfig) *std.Build.RunStep
|
|
|
339
353
|
const ToolsStep = struct {
|
|
340
354
|
step: std.Build.Step,
|
|
341
355
|
|
|
342
|
-
pub fn create(b: *std.Build, exes: *std.ArrayList(*std.Build.
|
|
356
|
+
pub fn create(b: *std.Build, exes: *std.ArrayList(*std.Build.Step.Compile)) *ToolsStep {
|
|
343
357
|
const self = b.allocator.create(ToolsStep) catch @panic("OOM");
|
|
344
358
|
const step = std.Build.Step.init(.{ .id = .custom, .name = "Install tools", .owner = b });
|
|
345
|
-
self.* =
|
|
346
|
-
for (exes.items) |t| self.step.dependOn(&b.addInstallArtifact(t).step);
|
|
359
|
+
self.* = .{ .step = step };
|
|
360
|
+
for (exes.items) |t| self.step.dependOn(&b.addInstallArtifact(t, .{}).step);
|
|
347
361
|
return self;
|
|
348
362
|
}
|
|
349
363
|
};
|