diff --git a/src/cmd_fetch.zig b/src/cmd_fetch.zig index 1d6cbab6518387eb2bc2edd161cfa403ba5e6982..84aee3fe37df014ebabd17ed40b562c7883ccd21 100644 --- a/src/cmd_fetch.zig +++ b/src/cmd_fetch.zig @@ -30,12 +30,26 @@ pub fn execute(args: [][]u8) !void { \\ for (packages) |pkg| { \\ exe.addPackage(pkg); \\ } + \\ for (c_inlude_dirs) |dir| { + \\ exe.addIncludeDir(dir); + \\ } + \\ for (c_source_files) |fpath| { + \\ exe.addCSourceFile(fpath, &[_][]const u8{}); + \\ } \\} }); try w.print("\n", .{}); try w.print("pub const packages = ", .{}); try print_deps(w, dir, top_module, 0); try w.print(";\n", .{}); + try w.print("\n", .{}); + try w.print("{}\n", .{"pub const c_inlude_dirs = &[_][]const u8{"}); + try print_incl_dirs_to(w, top_module); + try w.print("{};\n", .{"}"}); + try w.print("\n", .{}); + try w.print("{}\n", .{"pub const c_source_files = &[_][]const u8{"}); + try print_csrc_dirs_to(w, top_module); + try w.print("{};\n", .{"}"}); } fn fetch_deps(dir: []const u8, mpath: []const u8) anyerror!u.Module { @@ -66,6 +80,8 @@ fn fetch_deps(dir: []const u8, mpath: []const u8) anyerror!u.Module { return u.Module{ .name = m.name, .main = m.main, + .c_include_dirs = m.c_include_dirs, + .c_source_files = m.c_source_files, .deps = moduledeps.items, .clean_path = "", }; @@ -99,3 +115,21 @@ fn print_deps(w: std.fs.File.Writer, dir: []const u8, m: u.Module, tabs: i32) an } try w.print("{}", .{try u.concat(&[_][]const u8{r,"}"})}); } + +fn print_incl_dirs_to(w: std.fs.File.Writer, mod: u.Module) anyerror!void { + for (mod.c_include_dirs) |it| { + try w.print(" cache ++ \"/{}/{}\",\n", .{mod.clean_path, it}); + } + for (mod.deps) |d| { + try print_incl_dirs_to(w, d); + } +} + +fn print_csrc_dirs_to(w: std.fs.File.Writer, mod: u.Module) anyerror!void { + for (mod.c_source_files) |it| { + try w.print(" cache ++ \"/{}/{}\",\n", .{mod.clean_path, it}); + } + for (mod.deps) |d| { + try print_csrc_dirs_to(w, d); + } +} diff --git a/src/util/modfile.zig b/src/util/modfile.zig index 5cf80995211f99e55a5fa3bfcdac913bb241fc99..c029a6ba062b71a35e917262b83fb1724cf5b7fb 100644 --- a/src/util/modfile.zig +++ b/src/util/modfile.zig @@ -16,6 +16,8 @@ pub const ModFile = struct { alloc: *std.mem.Allocator, name: []const u8, main: []const u8, + c_include_dirs: [][]const u8, + c_source_files: [][]const u8, deps: []u.Dep, pub fn init(alloc: *std.mem.Allocator, fpath: []const u8) !Self { @@ -29,6 +31,26 @@ pub const ModFile = struct { const name = doc.mapping.get("name").?.string; const main = doc.mapping.get("main").?.string; + const cinclude_list = &std.ArrayList([]const u8).init(alloc); + if (doc.mapping.get("c_include_dirs")) |val| { + if (val == .sequence) { + for (val.sequence) |item, i| { + u.assert(item == .string, "modfile: {}[{}] is not a string", .{"c_include_dirs", i}); + try cinclude_list.append(item.string); + } + } + } + + const csrc_list = &std.ArrayList([]const u8).init(alloc); + if (doc.mapping.get("c_source_files")) |val| { + if (val == .sequence) { + for (val.sequence) |item, i| { + u.assert(item == .string, "modfile: {}[{}] is not a string", .{"c_source_files", i}); + try csrc_list.append(item.string); + } + } + } + const dep_list = &std.ArrayList(u.Dep).init(alloc); if (doc.mapping.get("dependencies")) |dep_seq| { if (dep_seq == .sequence) { @@ -49,6 +71,8 @@ pub const ModFile = struct { .alloc = alloc, .name = name, .main = main, + .c_include_dirs = cinclude_list.items, + .c_source_files = csrc_list.items, .deps = dep_list.items, }; } diff --git a/src/util/module.zig b/src/util/module.zig index 5ab2d224390b74270e959d41dba54f668624fd22..e92f94697f9dd22c639661cfb9ad02f6bfd51459 100644 --- a/src/util/module.zig +++ b/src/util/module.zig @@ -6,6 +6,8 @@ const std = @import("std"); pub const Module = struct { name: []const u8, main: []const u8, + c_include_dirs: [][]const u8, + c_source_files: [][]const u8, deps: []Module, clean_path: []const u8,