| ... | @@ -34,7 +34,7 @@ pub fn create_depszig(dir: []const u8, top_module: u.Module, list: *std.ArrayLis | ... | @@ -34,7 +34,7 @@ pub fn create_depszig(dir: []const u8, top_module: u.Module, list: *std.ArrayLis |
| 34 | const w = f.writer(); | 34 | const w = f.writer(); |
| 35 | try w.writeAll("const std = @import(\"std\");\n"); | 35 | try w.writeAll("const std = @import(\"std\");\n"); |
| 36 | try w.writeAll("const Pkg = std.build.Pkg;\n"); | 36 | try w.writeAll("const Pkg = std.build.Pkg;\n"); |
| 37 | try w.writeAll("const FileSource = std.build.FileSource;\n"); | 37 | try w.writeAll("const string = []const u8;\n"); |
| 38 | try w.writeAll("\n"); | 38 | try w.writeAll("\n"); |
| 39 | try w.print("pub const cache = \"{}\";\n", .{std.zig.fmtEscapes(dir)}); | 39 | try w.print("pub const cache = \"{}\";\n", .{std.zig.fmtEscapes(dir)}); |
| 40 | try w.writeAll("\n"); | 40 | try w.writeAll("\n"); |
| ... | @@ -42,34 +42,45 @@ pub fn create_depszig(dir: []const u8, top_module: u.Module, list: *std.ArrayLis | ... | @@ -42,34 +42,45 @@ pub fn create_depszig(dir: []const u8, top_module: u.Module, list: *std.ArrayLis |
| 42 | \\pub fn addAllTo(exe: *std.build.LibExeObjStep) void { | 42 | \\pub fn addAllTo(exe: *std.build.LibExeObjStep) void { |
| 43 | \\ @setEvalBranchQuota(1_000_000); | 43 | \\ @setEvalBranchQuota(1_000_000); |
| 44 | \\ for (packages) |pkg| { | 44 | \\ for (packages) |pkg| { |
| 45 | \\ exe.addPackage(pkg); | 45 | \\ exe.addPackage(pkg.pkg.?); |
| 46 | \\ } | 46 | \\ } |
| 47 | \\ if (c_include_dirs.len > 0 or c_source_files.len > 0) { | 47 | \\ inline for (std.meta.declarations(package_data)) |decl| { |
| 48 | \\ exe.linkLibC(); | 48 | \\ const pkg = @as(Package, @field(package_data, decl.name)); |
| 49 | \\ } | 49 | \\ var llc = false; |
| 50 | \\ for (c_include_dirs) |dir| { | 50 | \\ inline for (pkg.system_libs) |item| { |
| 51 | \\ exe.addIncludeDir(dir); | 51 | \\ exe.linkSystemLibrary(item); |
| 52 | \\ } | 52 | \\ llc = true; |
| 53 | \\ inline for (c_source_files) |fpath| { | 53 | \\ } |
| 54 | \\ exe.addCSourceFile(fpath[1], @field(c_source_flags, fpath[0])); | 54 | \\ inline for (pkg.c_include_dirs) |item| { |
| 55 | \\ } | 55 | \\ exe.addIncludeDir(@field(dirs, decl.name) ++ "/" ++ item); |
| 56 | \\ for (system_libs) |lib| { | 56 | \\ llc = true; |
| 57 | \\ exe.linkSystemLibrary(lib); | 57 | \\ } |
| | 58 | \\ inline for (pkg.c_source_files) |item| { |
| | 59 | \\ exe.addCSourceFile(@field(dirs, decl.name) ++ "/" ++ item, pkg.c_source_flags); |
| | 60 | \\ llc = true; |
| | 61 | \\ } |
| | 62 | \\ if (llc) { |
| | 63 | \\ exe.linkLibC(); |
| | 64 | \\ } |
| 58 | \\ } | 65 | \\ } |
| 59 | \\} | 66 | \\} |
| 60 | \\ | 67 | \\ |
| 61 | \\fn get_flags(comptime index: usize) []const u8 { | 68 | \\pub const Package = struct { |
| 62 | \\ return @field(c_source_flags, _paths[index]); | 69 | \\ pkg: ?Pkg = null, |
| 63 | \\} | 70 | \\ c_include_dirs: []const string = &.{}, |
| | 71 | \\ c_source_files: []const string = &.{}, |
| | 72 | \\ c_source_flags: []const string = &.{}, |
| | 73 | \\ system_libs: []const string = &.{}, |
| | 74 | \\}; |
| 64 | \\ | 75 | \\ |
| 65 | }); | 76 | }); |
| 66 | | 77 | |
| 67 | try w.writeAll("pub const _ids = .{\n"); | 78 | // try w.writeAll("pub const _ids = .{\n"); |
| 68 | try print_ids(w, list.items); | 79 | // try print_ids(w, list.items); |
| 69 | try w.writeAll("};\n\n"); | 80 | // try w.writeAll("};\n\n"); |
| 70 | | 81 | |
| 71 | try w.print("pub const _paths = {s}\n", .{".{"}); | 82 | try w.writeAll("pub const dirs = struct {\n"); |
| 72 | try print_paths(w, list.items); | 83 | try print_dirs(w, list.items); |
| 73 | try w.writeAll("};\n\n"); | 84 | try w.writeAll("};\n\n"); |
| 74 | | 85 | |
| 75 | try w.writeAll("pub const package_data = struct {\n"); | 86 | try w.writeAll("pub const package_data = struct {\n"); |
| ... | @@ -78,37 +89,18 @@ pub fn create_depszig(dir: []const u8, top_module: u.Module, list: *std.ArrayLis | ... | @@ -78,37 +89,18 @@ pub fn create_depszig(dir: []const u8, top_module: u.Module, list: *std.ArrayLis |
| 78 | if (std.mem.eql(u8, mod.id, "root")) { | 89 | if (std.mem.eql(u8, mod.id, "root")) { |
| 79 | continue; | 90 | continue; |
| 80 | } | 91 | } |
| 81 | if (mod.main.len == 0) { | | |
| 82 | continue; | | |
| 83 | } | | |
| 84 | try duped.append(mod); | 92 | try duped.append(mod); |
| 85 | } | 93 | } |
| 86 | try print_pkg_data_to(w, duped, &std.ArrayList(u.Module).init(gpa)); | 94 | try print_pkg_data_to(w, duped, &std.ArrayList(u.Module).init(gpa)); |
| 87 | try w.writeAll("};\n\n"); | 95 | try w.writeAll("};\n\n"); |
| 88 | | 96 | |
| 89 | try w.writeAll("pub const packages = "); | 97 | try w.writeAll("pub const packages = "); |
| 90 | try print_deps(w, dir, top_module, 0, true); | 98 | try print_deps(w, top_module); |
| 91 | try w.writeAll(";\n\n"); | 99 | try w.writeAll(";\n\n"); |
| 92 | | 100 | |
| 93 | try w.writeAll("pub const pkgs = "); | 101 | try w.writeAll("pub const pkgs = "); |
| 94 | try print_deps(w, dir, top_module, 0, false); | 102 | try print_pkgs(w, top_module); |
| 95 | try w.writeAll(";\n\n"); | 103 | try w.writeAll(";\n\n"); |
| 96 | | | |
| 97 | try w.writeAll("pub const c_include_dirs = &[_][]const u8{\n"); | | |
| 98 | try print_incl_dirs_to(w, list.items); | | |
| 99 | try w.writeAll("};\n\n"); | | |
| 100 | | | |
| 101 | try w.writeAll("pub const c_source_flags = struct {\n"); | | |
| 102 | try print_csrc_flags_to(w, list.items); | | |
| 103 | try w.writeAll("};\n\n"); | | |
| 104 | | | |
| 105 | try w.writeAll("pub const c_source_files = &[_][2][]const u8{\n"); | | |
| 106 | try print_csrc_dirs_to(w, list.items); | | |
| 107 | try w.writeAll("};\n\n"); | | |
| 108 | | | |
| 109 | try w.writeAll("pub const system_libs = &[_][]const u8{\n"); | | |
| 110 | try print_sys_libs_to(w, list.items, &std.ArrayList([]const u8).init(gpa)); | | |
| 111 | try w.writeAll("};\n\n"); | | |
| 112 | } | 104 | } |
| 113 | | 105 | |
| 114 | fn create_lockfile(list: *std.ArrayList(u.Module), dir: []const u8) !void { | 106 | fn create_lockfile(list: *std.ArrayList(u.Module), dir: []const u8) !void { |
| ... | @@ -129,119 +121,24 @@ fn create_lockfile(list: *std.ArrayList(u.Module), dir: []const u8) !void { | ... | @@ -129,119 +121,24 @@ fn create_lockfile(list: *std.ArrayList(u.Module), dir: []const u8) !void { |
| 129 | } | 121 | } |
| 130 | } | 122 | } |
| 131 | | 123 | |
| 132 | fn print_ids(w: std.fs.File.Writer, list: []u.Module) !void { | 124 | fn print_dirs(w: std.fs.File.Writer, list: []const u.Module) !void { |
| 133 | for (list) |mod| { | | |
| 134 | if (std.mem.eql(u8, mod.id, "root")) { | | |
| 135 | continue; | | |
| 136 | } | | |
| 137 | if (mod.is_sys_lib) { | | |
| 138 | continue; | | |
| 139 | } | | |
| 140 | try w.print(" \"{s}\",\n", .{mod.id[0..12]}); | | |
| 141 | } | | |
| 142 | } | | |
| 143 | | | |
| 144 | fn print_paths(w: std.fs.File.Writer, list: []u.Module) !void { | | |
| 145 | for (list) |mod| { | 125 | for (list) |mod| { |
| 146 | if (std.mem.eql(u8, mod.id, "root")) { | 126 | if (std.mem.eql(u8, mod.id, "root")) { |
| 147 | continue; | 127 | continue; |
| 148 | } | 128 | } |
| 149 | if (mod.is_sys_lib) { | 129 | try w.print(" pub const _{s} = cache ++ \"/{}\";\n", .{ mod.id[0..12], std.zig.fmtEscapes(mod.clean_path) }); |
| 150 | continue; | | |
| 151 | } | | |
| 152 | if (mod.clean_path.len == 0) { | | |
| 153 | try w.print(" \"\",\n", .{}); | | |
| 154 | } else { | | |
| 155 | const s = std.fs.path.sep_str; | | |
| 156 | try w.print(" \"{}{}{}\",\n", .{ std.zig.fmtEscapes(s), std.zig.fmtEscapes(mod.clean_path), std.zig.fmtEscapes(s) }); | | |
| 157 | } | | |
| 158 | } | 130 | } |
| 159 | } | 131 | } |
| 160 | | 132 | |
| 161 | fn print_deps(w: std.fs.File.Writer, dir: []const u8, m: u.Module, tabs: i32, array: bool) !void { | 133 | fn print_deps(w: std.fs.File.Writer, m: u.Module) !void { |
| 162 | _ = dir; | 134 | try u.print_all(w, .{"&[_]Package{"}, true); |
| 163 | | 135 | for (m.deps) |d| { |
| 164 | if (m.has_no_zig_deps() and tabs > 0) { | | |
| 165 | try w.print("null", .{}); | | |
| 166 | return; | | |
| 167 | } | | |
| 168 | if (array) { | | |
| 169 | try u.print_all(w, .{"&[_]Pkg{"}, true); | | |
| 170 | } else { | | |
| 171 | try u.print_all(w, .{"struct {"}, true); | | |
| 172 | } | | |
| 173 | const t = " "; | | |
| 174 | const r = try u.repeat(t, tabs); | | |
| 175 | for (m.deps) |d, i| { | | |
| 176 | if (d.main.len == 0) { | 136 | if (d.main.len == 0) { |
| 177 | continue; | 137 | continue; |
| 178 | } | 138 | } |
| 179 | if (!array) { | 139 | try w.print(" package_data._{s},\n", .{d.id[0..12]}); |
| 180 | const r1 = try std.mem.replaceOwned(u8, gpa, d.name, "-", "_"); | | |
| 181 | const r2 = try std.mem.replaceOwned(u8, gpa, r1, "/", "_"); | | |
| 182 | try w.print(" pub const {s} = packages[{}];\n", .{ r2, i }); | | |
| 183 | } else { | | |
| 184 | try w.print(" package_data._{s},\n", .{d.id[0..12]}); | | |
| 185 | } | | |
| 186 | } | | |
| 187 | try w.print("{s}", .{try u.concat(&.{ r, "}" })}); | | |
| 188 | } | | |
| 189 | | | |
| 190 | fn print_incl_dirs_to(w: std.fs.File.Writer, list: []u.Module) !void { | | |
| 191 | for (list) |mod, i| { | | |
| 192 | if (mod.is_sys_lib) { | | |
| 193 | continue; | | |
| 194 | } | | |
| 195 | for (mod.c_include_dirs) |it| { | | |
| 196 | if (i > 0) { | | |
| 197 | try w.print(" cache ++ _paths[{}] ++ \"{}\",\n", .{ i - 1, std.zig.fmtEscapes(it) }); | | |
| 198 | } else { | | |
| 199 | try w.print(" \"{}\",\n", .{std.zig.fmtEscapes(it)}); | | |
| 200 | } | | |
| 201 | } | | |
| 202 | } | | |
| 203 | } | | |
| 204 | | | |
| 205 | fn print_csrc_dirs_to(w: std.fs.File.Writer, list: []u.Module) !void { | | |
| 206 | for (list) |mod, i| { | | |
| 207 | if (mod.is_sys_lib) { | | |
| 208 | continue; | | |
| 209 | } | | |
| 210 | for (mod.c_source_files) |it| { | | |
| 211 | if (i > 0) { | | |
| 212 | try w.print(" {s}_ids[{}], cache ++ _paths[{}] ++ \"{s}\"{s},\n", .{ "[_][]const u8{", i - 1, i - 1, it, "}" }); | | |
| 213 | } else { | | |
| 214 | try w.print(" {s}_ids[{}], \".{}/{s}\"{s},\n", .{ "[_][]const u8{", i - 1, std.zig.fmtEscapes(mod.clean_path), it, "}" }); | | |
| 215 | } | | |
| 216 | } | | |
| 217 | } | | |
| 218 | } | | |
| 219 | | | |
| 220 | fn print_csrc_flags_to(w: std.fs.File.Writer, list: []u.Module) !void { | | |
| 221 | for (list) |mod| { | | |
| 222 | if (mod.is_sys_lib) { | | |
| 223 | continue; | | |
| 224 | } | | |
| 225 | if (mod.c_source_flags.len == 0 and mod.c_source_files.len == 0) { | | |
| 226 | continue; | | |
| 227 | } | | |
| 228 | try w.print(" pub const @\"{s}\" = {s}", .{ mod.id[0..12], "&.{" }); | | |
| 229 | for (mod.c_source_flags) |it| { | | |
| 230 | try w.print("\"{}\",", .{std.zig.fmtEscapes(it)}); | | |
| 231 | } | | |
| 232 | try w.print("{s};\n", .{"}"}); | | |
| 233 | } | | |
| 234 | } | | |
| 235 | | | |
| 236 | fn print_sys_libs_to(w: std.fs.File.Writer, list: []u.Module, list2: *std.ArrayList([]const u8)) !void { | | |
| 237 | _ = list2; | | |
| 238 | | | |
| 239 | for (list) |mod| { | | |
| 240 | if (!mod.is_sys_lib) { | | |
| 241 | continue; | | |
| 242 | } | | |
| 243 | try w.print(" \"{s}\",\n", .{mod.name}); | | |
| 244 | } | 140 | } |
| | 141 | try w.writeAll("}"); |
| 245 | } | 142 | } |
| 246 | | 143 | |
| 247 | fn print_pkg_data_to(w: std.fs.File.Writer, notdone: *std.ArrayList(u.Module), done: *std.ArrayList(u.Module)) !void { | 144 | fn print_pkg_data_to(w: std.fs.File.Writer, notdone: *std.ArrayList(u.Module), done: *std.ArrayList(u.Module)) !void { |
| ... | @@ -249,13 +146,66 @@ fn print_pkg_data_to(w: std.fs.File.Writer, notdone: *std.ArrayList(u.Module), d | ... | @@ -249,13 +146,66 @@ fn print_pkg_data_to(w: std.fs.File.Writer, notdone: *std.ArrayList(u.Module), d |
| 249 | while (notdone.items.len > 0) { | 146 | while (notdone.items.len > 0) { |
| 250 | for (notdone.items) |mod, i| { | 147 | for (notdone.items) |mod, i| { |
| 251 | if (contains_all(mod.deps, done.items)) { | 148 | if (contains_all(mod.deps, done.items)) { |
| 252 | try w.print(" pub const _{s} = Pkg{{ .name = \"{s}\", .path = FileSource{{ .path = cache ++ \"/{}/{s}\" }}, .dependencies = &[_]Pkg{{", .{ mod.id[0..12], mod.name, std.zig.fmtEscapes(mod.clean_path), mod.main }); | 149 | try w.print( |
| 253 | for (mod.deps) |d| { | 150 | \\ pub const _{s} = Package{{ |
| 254 | if (d.main.len > 0) { | 151 | \\ |
| 255 | try w.print(" _{s},", .{d.id[0..12]}); | 152 | , .{ |
| | 153 | mod.id[0..12], |
| | 154 | }); |
| | 155 | if (mod.main.len > 0) { |
| | 156 | try w.print( |
| | 157 | \\ .pkg = Pkg{{ .name = "{s}", .path = .{{ .path = dirs._{s} ++ "/{s}" }}, .dependencies = |
| | 158 | , .{ |
| | 159 | mod.name, |
| | 160 | mod.id[0..12], |
| | 161 | mod.main, |
| | 162 | }); |
| | 163 | if (mod.has_no_zig_deps()) { |
| | 164 | try w.writeAll(" null },\n"); |
| | 165 | } else { |
| | 166 | try w.writeAll(" &.{"); |
| | 167 | for (mod.deps) |moddep, j| { |
| | 168 | if (moddep.main.len == 0) continue; |
| | 169 | try w.print(" _{s}.pkg.?", .{moddep.id[0..12]}); |
| | 170 | if (j != mod.deps.len - 1) try w.writeAll(","); |
| | 171 | } |
| | 172 | try w.writeAll(" } },\n"); |
| | 173 | } |
| | 174 | } |
| | 175 | if (mod.c_include_dirs.len > 0) { |
| | 176 | try w.writeAll(" .c_include_dirs = &.{"); |
| | 177 | for (mod.c_include_dirs) |item, j| { |
| | 178 | try w.print(" \"{}\"", .{std.zig.fmtEscapes(item)}); |
| | 179 | if (j != mod.c_include_dirs.len - 1) try w.writeAll(","); |
| | 180 | } |
| | 181 | try w.writeAll(" },\n"); |
| | 182 | } |
| | 183 | if (mod.c_source_files.len > 0) { |
| | 184 | try w.writeAll(" .c_source_files = &.{"); |
| | 185 | for (mod.c_source_files) |item, j| { |
| | 186 | try w.print(" \"{}\"", .{std.zig.fmtEscapes(item)}); |
| | 187 | if (j != mod.c_source_files.len - 1) try w.writeAll(","); |
| | 188 | } |
| | 189 | try w.writeAll(" },\n"); |
| | 190 | } |
| | 191 | if (mod.c_source_flags.len > 0) { |
| | 192 | try w.writeAll(" .c_source_flags = &.{"); |
| | 193 | for (mod.c_source_flags) |item, j| { |
| | 194 | try w.print(" \"{}\"", .{std.zig.fmtEscapes(item)}); |
| | 195 | if (j != mod.c_source_flags.len - 1) try w.writeAll(","); |
| | 196 | } |
| | 197 | try w.writeAll(" },\n"); |
| | 198 | } |
| | 199 | if (mod.has_syslib_deps()) { |
| | 200 | try w.writeAll(" .system_libs = &.{"); |
| | 201 | for (mod.deps) |item, j| { |
| | 202 | if (!mod.is_sys_lib) continue; |
| | 203 | try w.print(" \"{}\"", .{std.zig.fmtEscapes(item.name)}); |
| | 204 | if (j != mod.deps.len - 1) try w.writeAll(","); |
| 256 | } | 205 | } |
| | 206 | try w.writeAll(" },\n"); |
| 257 | } | 207 | } |
| 258 | try w.print(" }} }};\n", .{}); | 208 | try w.writeAll(" };\n\n"); |
| 259 | | 209 | |
| 260 | try done.append(mod); | 210 | try done.append(mod); |
| 261 | _ = notdone.orderedRemove(i); | 211 | _ = notdone.orderedRemove(i); |
| ... | @@ -278,3 +228,16 @@ fn contains_all(needles: []u.Module, haystack: []const u.Module) bool { | ... | @@ -278,3 +228,16 @@ fn contains_all(needles: []u.Module, haystack: []const u.Module) bool { |
| 278 | } | 228 | } |
| 279 | return true; | 229 | return true; |
| 280 | } | 230 | } |
| | 231 | |
| | 232 | fn print_pkgs(w: std.fs.File.Writer, m: u.Module) !void { |
| | 233 | try w.writeAll("struct {\n"); |
| | 234 | for (m.deps) |d| { |
| | 235 | if (d.main.len == 0) { |
| | 236 | continue; |
| | 237 | } |
| | 238 | const r1 = try std.mem.replaceOwned(u8, gpa, d.name, "-", "_"); |
| | 239 | const r2 = try std.mem.replaceOwned(u8, gpa, r1, "/", "_"); |
| | 240 | try w.print(" pub const {s} = package_data._{s};\n", .{ r2, d.id[0..12] }); |
| | 241 | } |
| | 242 | try w.writeAll("}"); |
| | 243 | } |