Skip to content

Conversation

@1000copy
Copy link
Contributor

PR说明

  1. 本目录内代码为Zig构建系统解析系列文章的配套代码,这些配套代码都是可以通过$zig build以及zig build run来构建和运行的
  2. Zig构建系统解析共三个部分,配套代码分别在三个子目录内,分别为part1,part2,part3
  3. 文章发内的代码段都有编号,编号在代码块的第一行的标注内,此编号对应代码工程文件的目录,比如代码编号为1.1的,对于的代码在part1/1.1
  4. 每一个代码块的对应工程目录内都有一个build.zig文件,当你看到此文件,就意味着可以使用$zig build run命令来构建并运行
  5. build.zig依赖的zig文件,c文件,m文件等都在对应目录之内,可以查看build.zig了解工程依赖的文件清单

@1000copy 1000copy mentioned this pull request Jan 15, 2024
@jinzhongjia
Copy link
Member

ci测试未完全通过,为了保证规范性,请修改一下

@jiacai2050
Copy link
Member

两个问题:

  1. 不要把 dylib 这种二进制文件提交上来
  2. 文件内容还是太多了,以后我们要适配到 0.12,是个不小的工作量

我想了一下,是不是可以这么做,不用每个示例都给一个 demo,每篇文章,我们给一个大而全的 demo 就够了,这样也方便用户按需拷贝。

@1000copy
Copy link
Contributor Author

谢谢大家帮助更完善和规范文档以及配套代码。😄

我也是边做边学,比如bash的代码,以前没用过,这次直接抄run-all.sh,批量构建是方便。开心。

提到的两个问题,表达下我的观点:

问题1: 建议不这样做。删除此二进制文件很容易。但是会引入新的问题,就是程序正确性--无法构建运行。这个怎么办?为了可以构建,只能在build.zig内做手脚,或者brew install ,或者导入libbass源代码,导致更多文件需要导入,引入更多的读者阅读复杂度。

问题2: 建议不这样做。合并文件后文件数量少了,但是引入新的问题,就是增加读者的阅读负担。这个怎么办?此代码是文章配套代码,辅助读者理解文章,读者本可以看那个代码片段不懂就按图索骥的去仓库看可执行代码,如果懂了,那么代码文件再多也不需要他看,不会增加他的负担。现在需要自己去把一大坨代码分开找到自己想看的代码。以第二章为例,编译objc和c和c++ 的代码的三个build完全不相关,读者本来可能只是c的没看懂,现在要一起看代码,在分离代码。且合并在一起是偶然聚合,也是触发代码洁癖--高内聚低耦合。

我的看法是以下规范标准是有优先级的 > 程序正确性>程序自动化验证 >工程组织洁癖 >代码文件内组织洁癖。不能解决了低优先级的,影响了高优先级的。

你们再看看呢。我把我的考虑和遇到问题的分析摆出来,有什么我没有考虑到的更好的方法,可以提出来,满足全部需求当然最好。😄

@jiacai2050
Copy link
Member

先说第二点吧,这个比较重要,改动量会大些。

减少文件数不仅仅是代码洁癖,我其实更关注的是可维护性,文件这么多,将来适配新版本工作量也大。

我理解混淆在一起可读性也不会差很多,注释是少不了的,大部分人看完文章就可以了,不需要执行代码,把文章中的代码单独拿出来,我一开始的目的也是为了保证代码正确,且能够适配新版本的 API 改动。

有了这个目标的前提,是不是你的第二个问题就解决了?

@chenrui333
Copy link
Contributor

  • 不要把 dylib 这种二进制文件提交上来

indeed, no need to chcckin artifact

  • 文件内容还是太多了,以后我们要适配到 0.12,是个不小的工作量

如果是有 pattern 也还好 每一个例子只要突出一下就好了

@chenrui333
Copy link
Contributor

  • 文件内容还是太多了,以后我们要适配到 0.12,是个不小的工作量

如果是有 pattern 也还好 每一个例子只要突出一下就好了

我感觉这也有点是 zig 本身的问题 并没有 project/workspace 的概念

@1000copy
Copy link
Contributor Author

1000copy commented Jan 16, 2024

我想了一下,是不是可以这么做,不用每个示例都给一个 demo,每篇文章,我们给一个大而全的 demo 就够了。。。

我今天刚好有空,花了半个上午和整个下午的时间,按你的思路做了下:把原来的几个位于不同目录的build.zig文件合并到1个build内(当然函数需要改名,从build改成b1,b2,b3...)

遇到了主要的问题:

  1. 之前多个build,我到那个目录,执行zig build就执行那个build;现在无法指定那一个了
  2. 之前的每一个构建的step名字可以重复比如任何一个构建都可以有一个compile的步骤,现在不允许了
  3. 之前每一个可以指定自己的target,optimzie;现在也不行了,因为会panic

核心原因是:build的入口函数的参数是一个指针类型,这意味着b1,b2,b3内创建的步骤不能重名,当然生成的文件的名字也不能重复。

我现在进度会一直卡在这里。
所以,我建议,其他同学如果有也对这块感兴趣的,可以安排他们也同步做起来。到时候谁的更合适用谁的都行的。

ps:我发布下我目前实验到的代码如下,供有需要的同学可以参考:

    const std = @import("std");
const CrossTarget = std.zig.CrossTarget;
pub fn build(b: *std.Build) void {
    const target = b.standardTargetOptions(.{});
    const optimize = b.standardOptimizeOption(.{});
    b1(b, target, optimize);
    b2(b);
    b3(b, target, optimize);
    b4(b, target, optimize);
}
// 代码块1.1
pub fn b1(b: *std.Build, target: CrossTarget, optimize: std.builtin.Mode) void {
    const exe = b.addExecutable(.{
        .name = "b1",
        .root_source_file = .{ .path = "src/main.zig" },
        .target = target,
        .optimize = optimize,
    });
    b.installArtifact(exe);
    const run_cmd = b.addRunArtifact(exe);
    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);
    const unit_tests = b.addTest(.{
        .root_source_file = .{ .path = "src/main.zig" },
        .target = target,
        .optimize = optimize,
    });

    const run_unit_tests = b.addRunArtifact(unit_tests);
    const test_step = b.step("test", "Run unit tests");
    test_step.dependOn(&run_unit_tests.step);
}
// 代码块1.2
pub fn b2(b: *std.build.Builder) void {
    const named_step = b.step("step-name", "This is what is shown in help");
    _ = named_step;
}
// 代码块1.3
pub fn b3(b: *std.build.Builder, target: CrossTarget, optimize: std.builtin.Mode) void {
    const exe = b.addExecutable(.{
        .name = "b3",
        .root_source_file = .{ .path = "src/main.zig" },
        .target = target,
        .optimize = optimize,
    });

    const compile_step = b.step("compile", "Compiles src/main.zig");
    compile_step.dependOn(&exe.step);
}
pub fn b4(b: *std.build.Builder, target: CrossTarget, optimize: std.builtin.Mode) void {
    _ = optimize;
    _ = target;

    const exe = b.addExecutable(.{
        .name = "b4",
        .root_source_file = .{ .path = "src/main.zig" },
        .optimize = .ReleaseSafe,
    });
    const compile_step = b.step("compile", "Compiles src/main.zig");
    compile_step.dependOn(&exe.step);
}

@jiacai2050
Copy link
Member

所以,我建议,其他同学如果有也对这块感兴趣的,可以安排他们也同步做起来。到时候谁的更合适用谁的都行的。

好的,这个分支先保持不动了吧,后续我看看找更多人进来,看看怎么处理下。辛苦了!👍

@jiacai2050
Copy link
Member

Deprecated since 0.12 is out.

@jiacai2050 jiacai2050 closed this May 4, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants