From d4e42514ff41e91a84415145edcb3b12a054ce7f Mon Sep 17 00:00:00 2001 From: Kasper Sauramo Date: Tue, 21 Oct 2025 23:25:49 +0300 Subject: [PATCH] reorganize project (wip) We can build omt again, but something weird happens on import --- build.zig | 149 +++--------------- build.zig.zon | 42 +---- omt/build.zig | 91 +++++------ omt/build.zig.zon | 81 ++++++++++ .../california-1080-uyvy.yuv | 0 src/main.zig | 6 + 6 files changed, 147 insertions(+), 222 deletions(-) create mode 100644 omt/build.zig.zon rename california-1080-uyvy.yuv => omt/california-1080-uyvy.yuv (100%) create mode 100644 src/main.zig diff --git a/build.zig b/build.zig index 312eef5..0c6be46 100644 --- a/build.zig +++ b/build.zig @@ -15,144 +15,33 @@ pub fn build(b: *std.Build) void { const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); - const triple = target.result; - if (triple.os.tag != .linux or triple.cpu.arch != .x86_64) { - std.log.warn("The build file only supports Linux x86-64 right now.\n", .{}); - std.log.warn( - "You can extend the build.zig to call the appropriate platform scripts " ++ - "in 3rd/libomtnet/build/ and 3rd/libomt/build and 3rd/libvmx/build/ " ++ - "and modifying the install scripts", - .{}, - ); - return; - } - - { - // This comes from the libomt build scripts - const omt_out_path = "3rd/libomt/bin/Release/net8.0/linux-x64/publish/"; - - // Build libomtnet - const libomtnet_build_script = b.addSystemCommand(&.{"bash"}); - libomtnet_build_script.cwd = b.path("3rd/libomtnet/build"); - libomtnet_build_script.addFileArg(b.path("3rd/libomtnet/build/buildall.sh")); - - // Build libomt - const libomt_build_script = b.addSystemCommand(&.{"bash"}); - libomt_build_script.cwd = b.path("3rd/libomt/build"); - libomt_build_script.addFileArg(b.path("3rd/libomt/build/buildlinuxx64.sh")); - libomt_build_script.step.dependOn(&libomtnet_build_script.step); - - // Install libomt - const install_omt_h = b.addInstallHeaderFile( - b.path(b.pathJoin(&.{ omt_out_path, "libomt.h" })), - "libomt.h", - ); - install_omt_h.step.dependOn(&libomt_build_script.step); - - const install_omt_so = b.addInstallLibFile( - b.path(b.pathJoin(&.{ omt_out_path, "libomt.so" })), - "libomt.so", - ); - install_omt_so.step.dependOn(&libomt_build_script.step); - - // Build libvmx - const libvmx_build = b.addSystemCommand(&.{"bash"}); - libvmx_build.cwd = b.path("3rd/libvmx/build"); - libvmx_build.addFileArg(b.path("3rd/libvmx/build/buildlinuxx64.sh")); - - // Install libvmx - const install_vmx_so = b.addInstallLibFile( - b.path("3rd/libvmx/build/libvmx.so"), - "libvmx.so", - ); - install_vmx_so.step.dependOn(&libvmx_build.step); - - { - // Manual build step for libomt dependencies - const build_omt_step = b.step("omt", "Build libomtnet, libomt and libvmx"); - build_omt_step.dependOn(&install_omt_h.step); - build_omt_step.dependOn(&install_omt_so.step); - build_omt_step.dependOn(&install_vmx_so.step); - } - } - - // The output lib and header directories - const lib_output_path: std.Build.LazyPath = .{ - .cwd_relative = b.lib_dir, - }; - const include_output_path: std.Build.LazyPath = .{ - .cwd_relative = b.h_dir, - }; - - // Zig omt module - const omt_module = b.addModule("omt", .{ - .root_source_file = b.path("src/omt.zig"), + const zomt = b.dependency("omt", .{ .target = target, .optimize = optimize, }); - omt_module.linkSystemLibrary("omt", .{}); - omt_module.addLibraryPath(lib_output_path); - omt_module.addIncludePath(include_output_path); + const exe = b.addExecutable((.{ + .name = "omtoy", + .root_module = b.createModule(.{ + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }), + })); - { - // Define executables - const sender_exe = b.addExecutable(.{ - .name = "omtoy-sender", - .root_module = b.createModule(.{ - .root_source_file = b.path("utils/sender.zig"), - .target = target, - .optimize = optimize, - }), - }); - sender_exe.root_module.addImport("omt", omt_module); + exe.root_module.addImport("omt", zomt.module("zomt")); + exe.addLibraryPath(b.path("omt/zig-out/lib/")); - sender_exe.root_module.addLibraryPath(lib_output_path); - sender_exe.root_module.addIncludePath(include_output_path); - sender_exe.linkSystemLibrary("omt"); - sender_exe.linkLibC(); + b.installArtifact(exe); - b.installArtifact(sender_exe); + // Run step + const run_step = b.step("run", "Run Omtoy"); + const run_cmd = b.addRunArtifact(exe); + run_step.dependOn(&run_cmd.step); + run_cmd.step.dependOn(b.getInstallStep()); - // Add run step for sender - const run_sender_step = b.step("sender-run", "Run the sender client"); - const run_sender_cmd = b.addRunArtifact(sender_exe); - run_sender_step.dependOn(&run_sender_cmd.step); - run_sender_cmd.step.dependOn(b.getInstallStep()); - - // Don't actually have arguments, so this is moot - if (b.args) |args| { - run_sender_cmd.addArgs(args); - } - } - - { - const receiver_exe = b.addExecutable(.{ - .name = "omtoy-receiver", - .root_module = b.createModule(.{ - .root_source_file = b.path("utils/receiver.zig"), - .target = target, - .optimize = optimize, - }), - }); - receiver_exe.root_module.addImport("omt", omt_module); - - receiver_exe.root_module.addLibraryPath(lib_output_path); - receiver_exe.root_module.addIncludePath(include_output_path); - receiver_exe.linkSystemLibrary("omt"); - receiver_exe.linkLibC(); - - b.installArtifact(receiver_exe); - - const run_receiver_step = b.step("receiver-run", "Run the receiver client"); - const run_receiver_cmd = b.addRunArtifact(receiver_exe); - run_receiver_step.dependOn(&run_receiver_cmd.step); - run_receiver_cmd.step.dependOn(b.getInstallStep()); - - // Don't actually have arguments so this is moot - if (b.args) |args| { - run_receiver_cmd.addArgs(args); - } + if (b.args) |args| { + run_cmd.addArgs(args); } // TODO: write tests and stuff diff --git a/build.zig.zon b/build.zig.zon index d49b6f4..0d8998b 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -9,7 +9,7 @@ .name = .omtoy, // 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.1", // Together with name, this represents a globally unique package // identifier. This field is generated by the Zig toolchain when the // package is first created, and then *never changes*. This allows @@ -32,44 +32,10 @@ // Once all dependencies are fetched, `zig build` no longer requires // internet connectivity. .dependencies = .{ - // See `zig fetch --save ` for a command-line interface for adding dependencies. - //.example = .{ - // // When updating this field to a new URL, be sure to delete the corresponding - // // `hash`, otherwise you are communicating that you expect to find the old hash at - // // the new URL. If the contents of a URL change this will result in a hash mismatch - // // which will prevent zig from using it. - // .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", - // - // // When this is set to `true`, a package is declared to be lazily - // // fetched. This makes the dependency only get fetched if it is - // // actually used. - // .lazy = false, - //}, + .omt = .{ + .path = "omt/", + }, }, - // 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. Only files listed here will remain on disk - // when using the zig package manager. As a rule of thumb, one should list - // files required for compilation plus any license(s). - // 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 = .{ "build.zig", "build.zig.zon", diff --git a/omt/build.zig b/omt/build.zig index 104dfe1..244d9c6 100644 --- a/omt/build.zig +++ b/omt/build.zig @@ -27,6 +27,31 @@ pub fn build(b: *std.Build) void { return; } + // The output lib and header directories + const lib_output_path: std.Build.LazyPath = .{ + .cwd_relative = b.lib_dir, + }; + const include_output_path: std.Build.LazyPath = .{ + .cwd_relative = b.h_dir, + }; + + const omt_module = b.addModule("zomt", .{ + .root_source_file = b.path("src/omt.zig"), + .target = target, + .optimize = optimize, + }); + + const omt = b.addLibrary(.{ + .name = "zomt", + .linkage = .static, + .root_module = omt_module, + }); + + omt.root_module.linkSystemLibrary("omt", .{}); + omt.root_module.addLibraryPath(lib_output_path); + omt.root_module.addIncludePath(include_output_path); + b.installArtifact(omt); + { // This comes from the libomt build scripts const omt_out_path = "3rd/libomt/bin/Release/net8.0/linux-x64/publish/"; @@ -67,6 +92,12 @@ pub fn build(b: *std.Build) void { ); install_vmx_so.step.dependOn(&libvmx_build.step); + { + // Module dependencies + omt.step.dependOn(&install_omt_h.step); + omt.step.dependOn(&install_omt_so.step); + omt.step.dependOn(&install_vmx_so.step); + } { // Manual build step for libomt dependencies const build_omt_step = b.step("omt", "Build libomtnet, libomt and libvmx"); @@ -76,36 +107,18 @@ pub fn build(b: *std.Build) void { } } - // The output lib and header directories - const lib_output_path: std.Build.LazyPath = .{ - .cwd_relative = b.lib_dir, - }; - const include_output_path: std.Build.LazyPath = .{ - .cwd_relative = b.h_dir, - }; - - // Zig omt module - const omt_module = b.addModule("omt", .{ - .root_source_file = b.path("src/omt.zig"), - .target = target, - .optimize = optimize, - }); - - omt_module.linkSystemLibrary("omt", .{}); - omt_module.addLibraryPath(lib_output_path); - omt_module.addIncludePath(include_output_path); - { // Define executables const sender_exe = b.addExecutable(.{ - .name = "omtoy-sender", + .name = "sender", .root_module = b.createModule(.{ .root_source_file = b.path("utils/sender.zig"), .target = target, .optimize = optimize, }), }); - sender_exe.root_module.addImport("omt", omt_module); + // sender_exe.root_module.addImport("omt", omt); + sender_exe.root_module.linkLibrary(omt); sender_exe.root_module.addLibraryPath(lib_output_path); sender_exe.root_module.addIncludePath(include_output_path); @@ -113,29 +126,19 @@ pub fn build(b: *std.Build) void { sender_exe.linkLibC(); b.installArtifact(sender_exe); - - // Add run step for sender - const run_sender_step = b.step("sender-run", "Run the sender client"); - const run_sender_cmd = b.addRunArtifact(sender_exe); - run_sender_step.dependOn(&run_sender_cmd.step); - run_sender_cmd.step.dependOn(b.getInstallStep()); - - // Don't actually have arguments, so this is moot - if (b.args) |args| { - run_sender_cmd.addArgs(args); - } } { const receiver_exe = b.addExecutable(.{ - .name = "omtoy-receiver", + .name = "receiver", .root_module = b.createModule(.{ .root_source_file = b.path("utils/receiver.zig"), .target = target, .optimize = optimize, }), }); - receiver_exe.root_module.addImport("omt", omt_module); + receiver_exe.root_module.linkLibrary(omt); + receiver_exe.root_module.addImport("omt", omt.root_module); receiver_exe.root_module.addLibraryPath(lib_output_path); receiver_exe.root_module.addIncludePath(include_output_path); @@ -143,25 +146,5 @@ pub fn build(b: *std.Build) void { receiver_exe.linkLibC(); b.installArtifact(receiver_exe); - - const run_receiver_step = b.step("receiver-run", "Run the receiver client"); - const run_receiver_cmd = b.addRunArtifact(receiver_exe); - run_receiver_step.dependOn(&run_receiver_cmd.step); - run_receiver_cmd.step.dependOn(b.getInstallStep()); - - // Don't actually have arguments so this is moot - if (b.args) |args| { - run_receiver_cmd.addArgs(args); - } } - - // TODO: write tests and stuff - // const exe_tests = b.addTest(.{ - // .root_module = sender_exe.root_module, - // }); - - // const run_exe_tests = b.addRunArtifact(exe_tests); - - // const test_step = b.step("test", "Run tests"); - // test_step.dependOn(&run_exe_tests.step); } diff --git a/omt/build.zig.zon b/omt/build.zig.zon new file mode 100644 index 0000000..7ed950b --- /dev/null +++ b/omt/build.zig.zon @@ -0,0 +1,81 @@ +.{ + // This is the default name used by packages depending on this one. For + // example, when a user runs `zig fetch --save `, this field is used + // as the key in the `dependencies` table. Although the user can choose a + // different name, most users will stick with this provided value. + // + // It is redundant to include "zig" in this name because it is already + // within the Zig package namespace. + .name = .omt, + // This is a [Semantic Version](https://semver.org/). + // In a future version of Zig it will be used for package deduplication. + .version = "0.0.1", + // Together with name, this represents a globally unique package + // identifier. This field is generated by the Zig toolchain when the + // package is first created, and then *never changes*. This allows + // unambiguous detection of one package being an updated version of + // another. + // + // When forking a Zig project, this id should be regenerated (delete the + // field and run `zig build`) if the upstream project is still maintained. + // Otherwise, the fork is *hostile*, attempting to take control over the + // original project's identity. Thus it is recommended to leave the comment + // on the following line intact, so that it shows up in code reviews that + // modify the field. + .fingerprint = 0x3bf1f5c0d8810f0f, // Changing this has security and trust implications. + // Tracks the earliest Zig version that the package considers to be a + // supported use case. + .minimum_zig_version = "0.16.0-dev.699+529aa9f27", + // 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 = .{ + // See `zig fetch --save ` for a command-line interface for adding dependencies. + //.example = .{ + // // When updating this field to a new URL, be sure to delete the corresponding + // // `hash`, otherwise you are communicating that you expect to find the old hash at + // // the new URL. If the contents of a URL change this will result in a hash mismatch + // // which will prevent zig from using it. + // .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", + // + // // When this is set to `true`, a package is declared to be lazily + // // fetched. This makes the dependency only get fetched if it is + // // actually used. + // .lazy = false, + //}, + }, + // 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. Only files listed here will remain on disk + // when using the zig package manager. As a rule of thumb, one should list + // files required for compilation plus any license(s). + // 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 = .{ + "build.zig", + "build.zig.zon", + "src", + // For example... + //"LICENSE", + //"README.md", + }, +} diff --git a/california-1080-uyvy.yuv b/omt/california-1080-uyvy.yuv similarity index 100% rename from california-1080-uyvy.yuv rename to omt/california-1080-uyvy.yuv diff --git a/src/main.zig b/src/main.zig new file mode 100644 index 0000000..b77a5dc --- /dev/null +++ b/src/main.zig @@ -0,0 +1,6 @@ +const std = @import("std"); +const omt = @import("omt"); + +pub fn main() !void { + std.log.info("Starting omtoy...", .{}); +}