首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用zig编译器作为库

使用zig编译器作为库
EN

Stack Overflow用户
提问于 2021-08-01 11:23:48
回答 1查看 467关注 0票数 2

是否有一种方法可以将zig编译器用作zig内部的库?在查看了文档、问题和互联网之后,我找不到这个问题的答案。

在其中一个问题上,据说目前可以做到这一点,但我找不到如何做到这一点的任何例子。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-11 20:29:30

目前使用zig编译器作为库并不容易,因为很难包含具有复杂构建需求的库。一旦包管理器发布,它可能会变得容易得多。

现在,我建议将zig编译器称为系统命令。

代码语言:javascript
复制
var zig = std.ChildProcess.init(&.{"zig", "build-exe", "demo.zig"}, allocator);
try zig.spawn();
try zig.wait();

但是,如果您真的想要这样做,下面是如何使用zig 0.9.0-dev.1611+f3ba72cf5作为库

在发布包管理器之前不这样做的原因:

  • 这需要将build.zig文件弄得一团糟,build.zig文件必须与编译器的build.zig文件保持同步。
  • 这将使您的项目构建非常缓慢,因为当前stage1 zig编译器的速度很慢。
  • 此示例没有说明如何在其生成的zig包中启用stage1和LLVM扩展。启用stage1和LLVM扩展将需要查看zig的build.zig文件,并复制链接库的内容,并包含目录和c源代码等内容。

这个build.zig是通过在zig编译器的build.zig中找到.addOption的所有实例并在我们自己的build.zig文件中重新创建的。

代码语言:javascript
复制
// build.zig

const std = @import("std");

pub fn build(b: *std.build.Builder) !void {
    const target = b.standardTargetOptions(.{});

    const mode = b.standardReleaseOptions();

    const exe_options = b.addOptions();

    const mem_leak_frames: u32 = b.option(u32, "mem-leak-frames", "How many stack frames to print when a memory leak occurs. Tests get 2x this amount.") orelse 4;
    const skip_non_native = b.option(bool, "skip-non-native", "Main test suite skips non-native builds") orelse false;

    const enable_logging = b.option(bool, "log", "Whether to enable logging") orelse false;
    const enable_link_snapshots = b.option(bool, "link-snapshot", "Whether to enable linker state snapshots") orelse false;

    exe_options.addOption(u32, "mem_leak_frames", mem_leak_frames);
    exe_options.addOption(bool, "skip_non_native", skip_non_native);
    exe_options.addOption(bool, "have_llvm", false);
    exe_options.addOption(bool, "llvm_has_m68k", false);
    exe_options.addOption(bool, "llvm_has_csky", false);
    exe_options.addOption(bool, "llvm_has_ve", false);
    exe_options.addOption(bool, "llvm_has_arc", false);

    const version = "0.0.0";

    exe_options.addOption([:0]const u8, "version", try b.allocator.dupeZ(u8, version));

    const semver = try std.SemanticVersion.parse(version);
    exe_options.addOption(std.SemanticVersion, "semver", semver);

    exe_options.addOption(bool, "enable_logging", enable_logging);
    exe_options.addOption(bool, "enable_link_snapshots", enable_link_snapshots);
    exe_options.addOption(bool, "enable_tracy", false);
    exe_options.addOption(bool, "enable_tracy_callstack", false);
    exe_options.addOption(bool, "enable_tracy_allocation", false);
    exe_options.addOption(bool, "is_stage1", false);
    exe_options.addOption(bool, "omit_stage2", false);

    const exe = b.addExecutable("tmp", "sample.zig");
    exe.setTarget(target);
    exe.setBuildMode(mode);
    exe.addOptions("build_options", exe_options);
    exe.addPackage(.{
        .name = "zig",
        .path = .{ .path = "src/main.zig" },
        .dependencies = &[_]std.build.Pkg{
            .{ .name = "build_options", .path = exe_options.getSource() },
        },
    });
    exe.install();

    const run_cmd = exe.run();
    run_cmd.step.dependOn(b.getInstallStep());
    if (b.args) |args| {
        run_cmd.addArgs(args);
    }

    const run_step = b.step("run", "Run the app");
    run_step.dependOn(&run_cmd.step);
}
代码语言:javascript
复制
// sample.zig

const zig = @import("zig");

pub fn main() !void {
    return zig.main(); // just calls into the zig compiler main function. you'll have to look into how https://github.com/ziglang/zig/blob/master/src/main.zig works in order to do more complicated stuff.
}

注意:我建议使用-Dskip非本机构建此程序,否则由于当前stage1编译器的速度,构建过程将花费很长时间。

zig build run -Dskip-non-native -- build-exe demo.zig

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68609919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档