This commit is contained in:
David Allemang
2024-03-05 12:48:16 -05:00
parent 3b79a87095
commit 24f32f5725
5 changed files with 35 additions and 113 deletions

View File

@@ -1,33 +1,32 @@
const std = @import("std"); const std = @import("std");
// Although this function looks imperative, note that its job is to
// declaratively construct a build graph that will be executed by an external
// runner.
pub fn build(b: *std.Build) void { pub fn build(b: *std.Build) void {
// Standard target options allows the person running `zig build` to choose
// what target to build for. Here we do not override the defaults, which
// means any target is allowed, and the default is native. Other options
// for restricting supported target set are available.
const target = b.standardTargetOptions(.{}); const target = b.standardTargetOptions(.{});
// Standard optimization options allow the person running `zig build` to select
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. Here we do not
// set a preferred release mode, allowing the user to decide how to optimize.
const optimize = b.standardOptimizeOption(.{}); const optimize = b.standardOptimizeOption(.{});
const lib = b.addStaticLibrary(.{ const enet_real = b.dependency("enet_real", .{});
.name = "learnzig", const enet = b.createModule(.{
// In this case the main source file is merely a path, however, in more .root_source_file = .{ .path = "src/enet.zig" },
// complicated build scripts, this could be a generated file.
.root_source_file = .{ .path = "src/root.zig" },
.target = target, .target = target,
.optimize = optimize, .optimize = optimize,
.link_libc = true,
}); });
enet.addCSourceFiles(.{
// This declares intent for the library to be installed into the standard .root = enet_real.path(""),
// location when the user invokes the "install" step (the default step when .files = &.{
// running `zig build`). "callbacks.c",
b.installArtifact(lib); "compress.c",
"host.c",
"list.c",
"packet.c",
"peer.c",
"protocol.c",
"unix.c",
"win32.c",
},
});
enet.addIncludePath(enet_real.path("include"));
const exe = b.addExecutable(.{ const exe = b.addExecutable(.{
.name = "learnzig", .name = "learnzig",
@@ -35,57 +34,30 @@ pub fn build(b: *std.Build) void {
.target = target, .target = target,
.optimize = optimize, .optimize = optimize,
}); });
exe.root_module.addImport("enet", enet);
// This declares intent for the executable to be installed into the
// standard location when the user invokes the "install" step (the default
// step when running `zig build`).
b.installArtifact(exe); b.installArtifact(exe);
// This *creates* a Run step in the build graph, to be executed when another
// step is evaluated that depends on it. The next line below will establish
// such a dependency.
const run_cmd = b.addRunArtifact(exe); const run_cmd = b.addRunArtifact(exe);
// By making the run step depend on the install step, it will be run from the
// installation directory rather than directly from within the cache directory.
// This is not necessary, however, if the application depends on other installed
// files, this ensures they will be present and in the expected location.
run_cmd.step.dependOn(b.getInstallStep()); run_cmd.step.dependOn(b.getInstallStep());
// This allows the user to pass arguments to the application in the build
// command itself, like this: `zig build run -- arg1 arg2 etc`
if (b.args) |args| { if (b.args) |args| {
run_cmd.addArgs(args); run_cmd.addArgs(args);
} }
// This creates a build step. It will be visible in the `zig build --help` menu,
// and can be selected like this: `zig build run`
// This will evaluate the `run` step rather than the default, which is "install".
const run_step = b.step("run", "Run the app"); const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step); run_step.dependOn(&run_cmd.step);
// Creates a step for unit testing. This only builds the test executable
// but does not run it.
const lib_unit_tests = b.addTest(.{
.root_source_file = .{ .path = "src/root.zig" },
.target = target,
.optimize = optimize,
});
const run_lib_unit_tests = b.addRunArtifact(lib_unit_tests);
const exe_unit_tests = b.addTest(.{ const exe_unit_tests = b.addTest(.{
.root_source_file = .{ .path = "src/main.zig" }, .root_source_file = .{ .path = "src/main.zig" },
.target = target, .target = target,
.optimize = optimize, .optimize = optimize,
}); });
exe_unit_tests.root_module.addImport("enet", enet);
const run_exe_unit_tests = b.addRunArtifact(exe_unit_tests); const run_exe_unit_tests = b.addRunArtifact(exe_unit_tests);
// Similar to creating the run step earlier, this exposes a `test` step to
// the `zig build --help` menu, providing a way for the user to request
// running the unit tests.
const test_step = b.step("test", "Run unit tests"); const test_step = b.step("test", "Run unit tests");
test_step.dependOn(&run_lib_unit_tests.step);
test_step.dependOn(&run_exe_unit_tests.step); test_step.dependOn(&run_exe_unit_tests.step);
} }

View File

@@ -1,62 +1,15 @@
.{ .{
.name = "learnzig", .name = "learnzig",
// This is a [Semantic Version](https://semver.org/).
// In a future version of Zig it will be used for package deduplication.
.version = "0.0.0", .version = "0.0.0",
// This field is optional.
// This is currently advisory only; Zig does not yet do anything
// with this value.
//.minimum_zig_version = "0.11.0",
// This field is optional.
// Each dependency must either provide a `url` and `hash`, or a `path`.
// `zig build --fetch` can be used to fetch all dependencies of a package, recursively.
// Once all dependencies are fetched, `zig build` no longer requires
// internet connectivity.
.dependencies = .{ .dependencies = .{
// See `zig fetch --save <url>` for a command-line interface for adding dependencies. .enet_real = .{
//.example = .{ .url = "https://github.com/lsalzman/enet/archive/c44b7d0f7ff21edb702745e4c019d0537928c373.tar.gz",
// // When updating this field to a new URL, be sure to delete the corresponding .hash = "1220b65591d2f97033626dfff25a37926b250c7892e812397668769f84ef408cd02e",
// // `hash`, otherwise you are communicating that you expect to find the old hash at },
// // the new URL.
// .url = "https://example.com/foo.tar.gz",
//
// // This is computed from the file contents of the directory of files that is
// // obtained after fetching `url` and applying the inclusion rules given by
// // `paths`.
// //
// // This field is the source of truth; packages do not come from a `url`; they
// // come from a `hash`. `url` is just one of many possible mirrors for how to
// // obtain a package matching this `hash`.
// //
// // Uses the [multihash](https://multiformats.io/multihash/) format.
// .hash = "...",
//
// // When this is provided, the package is found in a directory relative to the
// // build root. In this case the package's hash is irrelevant and therefore not
// // computed. This field and `url` are mutually exclusive.
// .path = "foo",
//},
}, },
// Specifies the set of files and directories that are included in this package.
// Only files and directories listed here are included in the `hash` that
// is computed for this package.
// Paths are relative to the build root. Use the empty string (`""`) to refer to
// the build root itself.
// A directory listed here means that all files within, recursively, are included.
.paths = .{ .paths = .{
// This makes *all* files, recursively, included in this package. It is generally
// better to explicitly list the files and directories instead, to insure that
// fetching from tarballs, file system paths, and version control all result
// in the same contents hash.
"", "",
// For example...
//"build.zig",
//"build.zig.zon",
//"src",
//"LICENSE",
//"README.md",
}, },
} }

3
src/enet.zig Normal file
View File

@@ -0,0 +1,3 @@
pub usingnamespace @cImport({
@cInclude("enet/enet.h");
});

View File

@@ -1,4 +1,5 @@
const std = @import("std"); const std = @import("std");
const enet = @import("enet");
const DH = std.crypto.dh.X25519; const DH = std.crypto.dh.X25519;
const AES = std.crypto.aead.aes_gcm.Aes256Gcm; const AES = std.crypto.aead.aes_gcm.Aes256Gcm;
@@ -62,6 +63,9 @@ const Packet = struct {
}; };
pub fn main() !void { pub fn main() !void {
if (enet.enet_initialize() != 0) return error.ENetInitFailed;
defer enet.enet_deinitialize();
const bob = try Encryptor.init(); const bob = try Encryptor.init();
const alice = try Encryptor.init(); const alice = try Encryptor.init();
@@ -106,9 +110,9 @@ pub fn main() !void {
std.debug.print( std.debug.print(
"Packet: {s} {s} {s}\n", "Packet: {s} {s} {s}\n",
.{ .{
try digest(ally, pkt.cipher_text, .lower), try digest(ally, pkt.cipher_text, .lower),
try digest(ally, &pkt.nonce, .lower), try digest(ally, &pkt.nonce, .lower),
try digest(ally, &pkt.tag, .lower), try digest(ally, &pkt.tag, .lower),
}, },
); );
std.debug.assert(!std.mem.eql(u8, pkt.cipher_text, msg)); std.debug.assert(!std.mem.eql(u8, pkt.cipher_text, msg));

View File

@@ -1,10 +0,0 @@
const std = @import("std");
const testing = std.testing;
export fn add(a: i32, b: i32) i32 {
return a + b;
}
test "basic add functionality" {
try testing.expect(add(3, 7) == 10);
}