aboutsummaryrefslogtreecommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2023-01-10 20:21:58 -0700
committerAndrew Kelley <andrew@ziglang.org>2023-01-11 15:39:49 -0800
commitcfcf9771c1bde357ad64d81cda9d61ba72d80b15 (patch)
tree143a7434666e186bc79989c9108fdc3ab1c16741 /src/main.zig
parenta0f2e6a29f4d5c084a248d24b25fae9f30707001 (diff)
downloadzig-cfcf9771c1bde357ad64d81cda9d61ba72d80b15.tar.gz
zig-cfcf9771c1bde357ad64d81cda9d61ba72d80b15.zip
zig build: support dependencies
The `zig build` command now makes `@import("@dependencies")` available to the build runner package. It contains all the dependencies in a generated file that looks something like this: ```zig pub const imports = struct { pub const foo = @import("foo"); pub const @"bar.baz" = @import("bar.baz"); }; pub const build_root = struct { pub const foo = "<path>"; pub const @"bar.baz" = "<path>"; }; ``` The build runner exports this import so that `std.build.Builder` can access it. `std.build.Builder` uses it to implement the new `dependency` function which can be used like so: ```zig const libz_dep = b.dependency("libz", .{}); const libmp3lame_dep = b.dependency("libmp3lame", .{}); // ... lib.linkLibrary(libz_dep.artifact("z")); lib.linkLibrary(libmp3lame_dep.artifact("mp3lame")); ``` The `dependency` function calls the build.zig file of the dependency as a child Builder, and then can be ransacked for its build steps via the `artifact` function. This commit also renames `dependency.id` to `dependency.name` in the `build.zig.ini` file.
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig53
1 files changed, 42 insertions, 11 deletions
diff --git a/src/main.zig b/src/main.zig
index 739f8093e1..976ea26064 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -3983,11 +3983,6 @@ pub fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !voi
};
defer zig_lib_directory.handle.close();
- var main_pkg: Package = .{
- .root_src_directory = zig_lib_directory,
- .root_src_path = "build_runner.zig",
- };
-
var cleanup_build_dir: ?fs.Dir = null;
defer if (cleanup_build_dir) |*dir| dir.close();
@@ -4031,12 +4026,6 @@ pub fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !voi
};
child_argv.items[argv_index_build_file] = build_directory.path orelse cwd_path;
- var build_pkg: Package = .{
- .root_src_directory = build_directory,
- .root_src_path = build_zig_basename,
- };
- try main_pkg.addAndAdopt(arena, "@build", &build_pkg);
-
var global_cache_directory: Compilation.Directory = l: {
const p = override_global_cache_dir orelse try introspect.resolveGlobalCacheDir(arena);
break :l .{
@@ -4083,23 +4072,65 @@ pub fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !voi
try thread_pool.init(gpa);
defer thread_pool.deinit();
+ var main_pkg: Package = .{
+ .root_src_directory = zig_lib_directory,
+ .root_src_path = "build_runner.zig",
+ };
+
if (!build_options.omit_pkg_fetching_code) {
var http_client: std.http.Client = .{ .allocator = gpa };
defer http_client.deinit();
try http_client.rescanRootCertificates();
+ // Here we provide an import to the build runner that allows using reflection to find
+ // all of the dependencies. Without this, there would be no way to use `@import` to
+ // access dependencies by name, since `@import` requires string literals.
+ var dependencies_source = std.ArrayList(u8).init(gpa);
+ defer dependencies_source.deinit();
+ try dependencies_source.appendSlice("pub const imports = struct {\n");
+
+ // This will go into the same package. It contains the file system paths
+ // to all the build.zig files.
+ var build_roots_source = std.ArrayList(u8).init(gpa);
+ defer build_roots_source.deinit();
+
+ // Here we borrow main package's table and will replace it with a fresh
+ // one after this process completes.
main_pkg.fetchAndAddDependencies(
&thread_pool,
&http_client,
build_directory,
global_cache_directory,
local_cache_directory,
+ &dependencies_source,
+ &build_roots_source,
+ "",
) catch |err| switch (err) {
error.PackageFetchFailed => process.exit(1),
else => |e| return e,
};
+
+ try dependencies_source.appendSlice("};\npub const build_root = struct {\n");
+ try dependencies_source.appendSlice(build_roots_source.items);
+ try dependencies_source.appendSlice("};\n");
+
+ const deps_pkg = try Package.createFilePkg(
+ gpa,
+ global_cache_directory,
+ "dependencies.zig",
+ dependencies_source.items,
+ );
+
+ mem.swap(Package.Table, &main_pkg.table, &deps_pkg.table);
+ try main_pkg.addAndAdopt(gpa, "@dependencies", deps_pkg);
}
+ var build_pkg: Package = .{
+ .root_src_directory = build_directory,
+ .root_src_path = build_zig_basename,
+ };
+ try main_pkg.addAndAdopt(gpa, "@build", &build_pkg);
+
const comp = Compilation.create(gpa, .{
.zig_lib_directory = zig_lib_directory,
.local_cache_directory = local_cache_directory,