| ... | @@ -204,55 +204,24 @@ pub const Builder = struct { | ... | @@ -204,55 +204,24 @@ pub const Builder = struct { |
| 204 | self.h_dir = fs.path.join(self.allocator, &[_][]const u8{ self.install_path, "include" }) catch unreachable; | 204 | self.h_dir = fs.path.join(self.allocator, &[_][]const u8{ self.install_path, "include" }) catch unreachable; |
| 205 | } | 205 | } |
| 206 | | 206 | |
| 207 | pub fn addExecutable(self: *Builder, name: []const u8, root_src: ?[]const u8) *LibExeObjStep { | 207 | fn convertOptionalPathToFileSource(path: ?[]const u8) ?FileSource { |
| 208 | return LibExeObjStep.createExecutable( | 208 | return if (path) |p| |
| 209 | self, | 209 | FileSource.relative(p) |
| 210 | name, | 210 | else |
| 211 | if (root_src) |p| FileSource{ .path = p } else null, | 211 | null; |
| 212 | false, | | |
| 213 | ); | | |
| 214 | } | 212 | } |
| 215 | | 213 | |
| 216 | pub fn addExecutableFromWriteFileStep( | 214 | pub fn addExecutable(self: *Builder, name: []const u8, root_src: ?[]const u8) *LibExeObjStep { |
| 217 | self: *Builder, | 215 | return addExecutableSource(self, name, convertOptionalPathToFileSource(root_src), false); |
| 218 | name: []const u8, | | |
| 219 | wfs: *WriteFileStep, | | |
| 220 | basename: []const u8, | | |
| 221 | ) *LibExeObjStep { | | |
| 222 | return LibExeObjStep.createExecutable(self, name, @as(FileSource, .{ | | |
| 223 | .write_file = .{ | | |
| 224 | .step = wfs, | | |
| 225 | .basename = basename, | | |
| 226 | }, | | |
| 227 | }), false); | | |
| 228 | } | 216 | } |
| 229 | | 217 | |
| 230 | pub fn addExecutableSource( | 218 | pub const addExecutableSource = LibExeObjStep.createExecutable; |
| 231 | self: *Builder, | | |
| 232 | name: []const u8, | | |
| 233 | root_src: ?FileSource, | | |
| 234 | ) *LibExeObjStep { | | |
| 235 | return LibExeObjStep.createExecutable(self, name, root_src, false); | | |
| 236 | } | | |
| 237 | | 219 | |
| 238 | pub fn addObject(self: *Builder, name: []const u8, root_src: ?[]const u8) *LibExeObjStep { | 220 | pub fn addObject(self: *Builder, name: []const u8, root_src: ?[]const u8) *LibExeObjStep { |
| 239 | const root_src_param = if (root_src) |p| @as(FileSource, .{ .path = p }) else null; | 221 | return addObjectSource(self, name, convertOptionalPathToFileSource(root_src)); |
| 240 | return LibExeObjStep.createObject(self, name, root_src_param); | | |
| 241 | } | 222 | } |
| 242 | | 223 | |
| 243 | pub fn addObjectFromWriteFileStep( | 224 | pub const addObjectSource = LibExeObjStep.createObject; |
| 244 | self: *Builder, | | |
| 245 | name: []const u8, | | |
| 246 | wfs: *WriteFileStep, | | |
| 247 | basename: []const u8, | | |
| 248 | ) *LibExeObjStep { | | |
| 249 | return LibExeObjStep.createObject(self, name, @as(FileSource, .{ | | |
| 250 | .write_file = .{ | | |
| 251 | .step = wfs, | | |
| 252 | .basename = basename, | | |
| 253 | }, | | |
| 254 | })); | | |
| 255 | } | | |
| 256 | | 225 | |
| 257 | pub fn addSharedLibrary( | 226 | pub fn addSharedLibrary( |
| 258 | self: *Builder, | 227 | self: *Builder, |
| ... | @@ -260,64 +229,33 @@ pub const Builder = struct { | ... | @@ -260,64 +229,33 @@ pub const Builder = struct { |
| 260 | root_src: ?[]const u8, | 229 | root_src: ?[]const u8, |
| 261 | kind: LibExeObjStep.SharedLibKind, | 230 | kind: LibExeObjStep.SharedLibKind, |
| 262 | ) *LibExeObjStep { | 231 | ) *LibExeObjStep { |
| 263 | const root_src_param = if (root_src) |p| @as(FileSource, .{ .path = p }) else null; | 232 | return addSharedLibrarySource(self, name, convertOptionalPathToFileSource(root_src), kind); |
| 264 | return LibExeObjStep.createSharedLibrary(self, name, root_src_param, kind); | | |
| 265 | } | 233 | } |
| 266 | | 234 | |
| 267 | pub fn addSharedLibraryFromWriteFileStep( | 235 | pub const addSharedLibrarySource = LibExeObjStep.createSharedLibrary; |
| 268 | self: *Builder, | | |
| 269 | name: []const u8, | | |
| 270 | wfs: *WriteFileStep, | | |
| 271 | basename: []const u8, | | |
| 272 | kind: LibExeObjStep.SharedLibKind, | | |
| 273 | ) *LibExeObjStep { | | |
| 274 | return LibExeObjStep.createSharedLibrary(self, name, @as(FileSource, .{ | | |
| 275 | .write_file = .{ | | |
| 276 | .step = wfs, | | |
| 277 | .basename = basename, | | |
| 278 | }, | | |
| 279 | }), kind); | | |
| 280 | } | | |
| 281 | | 236 | |
| 282 | pub fn addStaticLibrary(self: *Builder, name: []const u8, root_src: ?[]const u8) *LibExeObjStep { | 237 | pub fn addStaticLibrary(self: *Builder, name: []const u8, root_src: ?[]const u8) *LibExeObjStep { |
| 283 | const root_src_param = if (root_src) |p| @as(FileSource, .{ .path = p }) else null; | 238 | const root_src_param = if (root_src) |p| @as(FileSource, .{ .path = p }) else null; |
| 284 | return LibExeObjStep.createStaticLibrary(self, name, root_src_param); | 239 | return LibExeObjStep.createStaticLibrary(self, name, root_src_param); |
| 285 | } | 240 | } |
| 286 | | 241 | |
| 287 | pub fn addStaticLibraryFromWriteFileStep( | 242 | pub const addStaticLibrarySource = LibExeObjStep.createStaticLibrary; |
| 288 | self: *Builder, | | |
| 289 | name: []const u8, | | |
| 290 | wfs: *WriteFileStep, | | |
| 291 | basename: []const u8, | | |
| 292 | ) *LibExeObjStep { | | |
| 293 | return LibExeObjStep.createStaticLibrary(self, name, @as(FileSource, .{ | | |
| 294 | .write_file = .{ | | |
| 295 | .step = wfs, | | |
| 296 | .basename = basename, | | |
| 297 | }, | | |
| 298 | })); | | |
| 299 | } | | |
| 300 | | 243 | |
| 301 | pub fn addTest(self: *Builder, root_src: []const u8) *LibExeObjStep { | 244 | pub fn addTest(self: *Builder, root_src: []const u8) *LibExeObjStep { |
| 302 | return LibExeObjStep.createTest(self, "test", .{ .path = root_src }); | 245 | return LibExeObjStep.createTest(self, "test", .{ .path = root_src }); |
| 303 | } | 246 | } |
| 304 | | 247 | |
| 305 | pub fn addTestFromWriteFileStep( | 248 | pub fn addTestSource(self: *Builder, root_src: FileSource) *LibExeObjStep { |
| 306 | self: *Builder, | 249 | return LibExeObjStep.createTest(self, "test", root_src); |
| 307 | wfs: *WriteFileStep, | | |
| 308 | basename: []const u8, | | |
| 309 | ) *LibExeObjStep { | | |
| 310 | return LibExeObjStep.createTest(self, "test", @as(FileSource, .{ | | |
| 311 | .write_file = .{ | | |
| 312 | .step = wfs, | | |
| 313 | .basename = basename, | | |
| 314 | }, | | |
| 315 | })); | | |
| 316 | } | 250 | } |
| 317 | | 251 | |
| 318 | pub fn addAssemble(self: *Builder, name: []const u8, src: []const u8) *LibExeObjStep { | 252 | pub fn addAssemble(self: *Builder, name: []const u8, src: []const u8) *LibExeObjStep { |
| | 253 | return addAssembleSource(self, name, FileSource.relative(src)); |
| | 254 | } |
| | 255 | |
| | 256 | pub fn addAssembleSource(self: *Builder, name: []const u8, src: FileSource) *LibExeObjStep { |
| 319 | const obj_step = LibExeObjStep.createObject(self, name, null); | 257 | const obj_step = LibExeObjStep.createObject(self, name, null); |
| 320 | obj_step.addAssemblyFile(src); | 258 | obj_step.addAssemblyFileSource(src); |
| 321 | return obj_step; | 259 | return obj_step; |
| 322 | } | 260 | } |
| 323 | | 261 | |
| ... | @@ -938,7 +876,7 @@ pub const Builder = struct { | ... | @@ -938,7 +876,7 @@ pub const Builder = struct { |
| 938 | | 876 | |
| 939 | ///`dest_rel_path` is relative to prefix path | 877 | ///`dest_rel_path` is relative to prefix path |
| 940 | pub fn installFile(self: *Builder, src_path: []const u8, dest_rel_path: []const u8) void { | 878 | pub fn installFile(self: *Builder, src_path: []const u8, dest_rel_path: []const u8) void { |
| 941 | self.getInstallStep().dependOn(&self.addInstallFileWithDir(src_path, .Prefix, dest_rel_path).step); | 879 | self.getInstallStep().dependOn(&self.addInstallFileWithDir(FileSource.relative(src_path), .Prefix, dest_rel_path).step); |
| 942 | } | 880 | } |
| 943 | | 881 | |
| 944 | pub fn installDirectory(self: *Builder, options: InstallDirectoryOptions) void { | 882 | pub fn installDirectory(self: *Builder, options: InstallDirectoryOptions) void { |
| ... | @@ -947,12 +885,12 @@ pub const Builder = struct { | ... | @@ -947,12 +885,12 @@ pub const Builder = struct { |
| 947 | | 885 | |
| 948 | ///`dest_rel_path` is relative to bin path | 886 | ///`dest_rel_path` is relative to bin path |
| 949 | pub fn installBinFile(self: *Builder, src_path: []const u8, dest_rel_path: []const u8) void { | 887 | pub fn installBinFile(self: *Builder, src_path: []const u8, dest_rel_path: []const u8) void { |
| 950 | self.getInstallStep().dependOn(&self.addInstallFileWithDir(src_path, .Bin, dest_rel_path).step); | 888 | self.getInstallStep().dependOn(&self.addInstallFileWithDir(FileSource.relative(src_path), .Bin, dest_rel_path).step); |
| 951 | } | 889 | } |
| 952 | | 890 | |
| 953 | ///`dest_rel_path` is relative to lib path | 891 | ///`dest_rel_path` is relative to lib path |
| 954 | pub fn installLibFile(self: *Builder, src_path: []const u8, dest_rel_path: []const u8) void { | 892 | pub fn installLibFile(self: *Builder, src_path: []const u8, dest_rel_path: []const u8) void { |
| 955 | self.getInstallStep().dependOn(&self.addInstallFileWithDir(src_path, .Lib, dest_rel_path).step); | 893 | self.getInstallStep().dependOn(&self.addInstallFileWithDir(FileSource.relative(src_path), .Lib, dest_rel_path).step); |
| 956 | } | 894 | } |
| 957 | | 895 | |
| 958 | pub fn installRaw(self: *Builder, artifact: *LibExeObjStep, dest_filename: []const u8) void { | 896 | pub fn installRaw(self: *Builder, artifact: *LibExeObjStep, dest_filename: []const u8) void { |
| ... | @@ -961,17 +899,17 @@ pub const Builder = struct { | ... | @@ -961,17 +899,17 @@ pub const Builder = struct { |
| 961 | | 899 | |
| 962 | ///`dest_rel_path` is relative to install prefix path | 900 | ///`dest_rel_path` is relative to install prefix path |
| 963 | pub fn addInstallFile(self: *Builder, src_path: []const u8, dest_rel_path: []const u8) *InstallFileStep { | 901 | pub fn addInstallFile(self: *Builder, src_path: []const u8, dest_rel_path: []const u8) *InstallFileStep { |
| 964 | return self.addInstallFileWithDir(src_path, .Prefix, dest_rel_path); | 902 | return self.addInstallFileWithDir(FileSource.relative(src_path), .Prefix, dest_rel_path); |
| 965 | } | 903 | } |
| 966 | | 904 | |
| 967 | ///`dest_rel_path` is relative to bin path | 905 | ///`dest_rel_path` is relative to bin path |
| 968 | pub fn addInstallBinFile(self: *Builder, src_path: []const u8, dest_rel_path: []const u8) *InstallFileStep { | 906 | pub fn addInstallBinFile(self: *Builder, src_path: []const u8, dest_rel_path: []const u8) *InstallFileStep { |
| 969 | return self.addInstallFileWithDir(src_path, .Bin, dest_rel_path); | 907 | return self.addInstallFileWithDir(FileSource.relative(src_path), .Bin, dest_rel_path); |
| 970 | } | 908 | } |
| 971 | | 909 | |
| 972 | ///`dest_rel_path` is relative to lib path | 910 | ///`dest_rel_path` is relative to lib path |
| 973 | pub fn addInstallLibFile(self: *Builder, src_path: []const u8, dest_rel_path: []const u8) *InstallFileStep { | 911 | pub fn addInstallLibFile(self: *Builder, src_path: []const u8, dest_rel_path: []const u8) *InstallFileStep { |
| 974 | return self.addInstallFileWithDir(src_path, .Lib, dest_rel_path); | 912 | return self.addInstallFileWithDir(FileSource.relative(src_path), .Lib, dest_rel_path); |
| 975 | } | 913 | } |
| 976 | | 914 | |
| 977 | pub fn addInstallRaw(self: *Builder, artifact: *LibExeObjStep, dest_filename: []const u8) *InstallRawStep { | 915 | pub fn addInstallRaw(self: *Builder, artifact: *LibExeObjStep, dest_filename: []const u8) *InstallRawStep { |
| ... | @@ -980,7 +918,7 @@ pub const Builder = struct { | ... | @@ -980,7 +918,7 @@ pub const Builder = struct { |
| 980 | | 918 | |
| 981 | pub fn addInstallFileWithDir( | 919 | pub fn addInstallFileWithDir( |
| 982 | self: *Builder, | 920 | self: *Builder, |
| 983 | src_path: []const u8, | 921 | source: FileSource, |
| 984 | install_dir: InstallDir, | 922 | install_dir: InstallDir, |
| 985 | dest_rel_path: []const u8, | 923 | dest_rel_path: []const u8, |
| 986 | ) *InstallFileStep { | 924 | ) *InstallFileStep { |
| ... | @@ -988,7 +926,7 @@ pub const Builder = struct { | ... | @@ -988,7 +926,7 @@ pub const Builder = struct { |
| 988 | panic("dest_rel_path must be non-empty", .{}); | 926 | panic("dest_rel_path must be non-empty", .{}); |
| 989 | } | 927 | } |
| 990 | const install_step = self.allocator.create(InstallFileStep) catch unreachable; | 928 | const install_step = self.allocator.create(InstallFileStep) catch unreachable; |
| 991 | install_step.* = InstallFileStep.init(self, src_path, install_dir, dest_rel_path); | 929 | install_step.* = InstallFileStep.init(self, source, install_dir, dest_rel_path); |
| 992 | return install_step; | 930 | return install_step; |
| 993 | } | 931 | } |
| 994 | | 932 | |
| ... | @@ -1301,42 +1239,41 @@ pub const GeneratedFile = struct { | ... | @@ -1301,42 +1239,41 @@ pub const GeneratedFile = struct { |
| 1301 | pub const FileSource = union(enum) { | 1239 | pub const FileSource = union(enum) { |
| 1302 | /// Relative to build root | 1240 | /// Relative to build root |
| 1303 | path: []const u8, | 1241 | path: []const u8, |
| 1304 | write_file: struct { | | |
| 1305 | step: *WriteFileStep, | | |
| 1306 | basename: []const u8, | | |
| 1307 | }, | | |
| 1308 | generated: *const GeneratedFile, | 1242 | generated: *const GeneratedFile, |
| 1309 | | 1243 | |
| 1310 | pub fn relative(path: []const u8) FileSource { | 1244 | pub fn relative(path: []const u8) FileSource { |
| 1311 | return FileSource{ .path = path }; | 1245 | return FileSource{ .path = path }; |
| 1312 | } | 1246 | } |
| 1313 | | 1247 | |
| | 1248 | /// Returns a string that can be shown to represent the file source. |
| | 1249 | /// Either returns the path or `"generated"`. |
| | 1250 | pub fn getDisplayName(self: FileSource) []const u8 { |
| | 1251 | return switch (self) { |
| | 1252 | .path => self.path, |
| | 1253 | .generated => "generated", |
| | 1254 | }; |
| | 1255 | } |
| | 1256 | |
| 1314 | pub fn addStepDependencies(self: FileSource, step: *Step) void { | 1257 | pub fn addStepDependencies(self: FileSource, step: *Step) void { |
| 1315 | switch (self) { | 1258 | switch (self) { |
| 1316 | .path => {}, | 1259 | .path => {}, |
| 1317 | .write_file => |wf| step.dependOn(&wf.step.step), | | |
| 1318 | .generated => |gen| step.dependOn(gen.step), | 1260 | .generated => |gen| step.dependOn(gen.step), |
| 1319 | } | 1261 | } |
| 1320 | } | 1262 | } |
| 1321 | | 1263 | |
| 1322 | /// Should only be called during make() | 1264 | /// Should only be called during make(), returns an absolute path to the file. |
| 1323 | pub fn getPath(self: FileSource, builder: *Builder) []const u8 { | 1265 | pub fn getPath(self: FileSource, builder: *Builder) []const u8 { |
| 1324 | return switch (self) { | 1266 | const path = switch (self) { |
| 1325 | .path => |p| builder.pathFromRoot(p), | 1267 | .path => |p| builder.pathFromRoot(p), |
| 1326 | .write_file => |wf| wf.step.getOutputPath(wf.basename), | | |
| 1327 | .generated => |gen| gen.getPath(), | 1268 | .generated => |gen| gen.getPath(), |
| 1328 | }; | 1269 | }; |
| | 1270 | std.debug.assert(std.fs.path.isAbsolute(path)); |
| | 1271 | return path; |
| 1329 | } | 1272 | } |
| 1330 | | 1273 | |
| 1331 | pub fn dupe(self: FileSource, b: *Builder) FileSource { | 1274 | pub fn dupe(self: FileSource, b: *Builder) FileSource { |
| 1332 | return switch (self) { | 1275 | return switch (self) { |
| 1333 | .path => |p| .{ .path = b.dupePath(p) }, | 1276 | .path => |p| .{ .path = b.dupePath(p) }, |
| 1334 | .write_file => |wf| .{ | | |
| 1335 | .write_file = .{ | | |
| 1336 | .step = wf.step, | | |
| 1337 | .basename = b.dupe(wf.basename), | | |
| 1338 | }, | | |
| 1339 | }, | | |
| 1340 | .generated => |gen| .{ .generated = gen }, | 1277 | .generated => |gen| .{ .generated = gen }, |
| 1341 | }; | 1278 | }; |
| 1342 | } | 1279 | } |
| ... | @@ -1967,15 +1904,6 @@ pub const LibExeObjStep = struct { | ... | @@ -1967,15 +1904,6 @@ pub const LibExeObjStep = struct { |
| 1967 | }) catch unreachable; | 1904 | }) catch unreachable; |
| 1968 | } | 1905 | } |
| 1969 | | 1906 | |
| 1970 | pub fn addAssemblyFileFromWriteFileStep(self: *LibExeObjStep, wfs: *WriteFileStep, basename: []const u8) void { | | |
| 1971 | self.addAssemblyFileSource(.{ | | |
| 1972 | .write_file = .{ | | |
| 1973 | .step = wfs, | | |
| 1974 | .basename = self.builder.dupe(basename), | | |
| 1975 | }, | | |
| 1976 | }); | | |
| 1977 | } | | |
| 1978 | | | |
| 1979 | pub fn addAssemblyFileSource(self: *LibExeObjStep, source: FileSource) void { | 1907 | pub fn addAssemblyFileSource(self: *LibExeObjStep, source: FileSource) void { |
| 1980 | const source_duped = source.dupe(self.builder); | 1908 | const source_duped = source.dupe(self.builder); |
| 1981 | self.link_objects.append(LinkObject{ .AssemblyFile = source_duped }) catch unreachable; | 1909 | self.link_objects.append(LinkObject{ .AssemblyFile = source_duped }) catch unreachable; |
| ... | @@ -2834,21 +2762,21 @@ pub const InstallArtifactStep = struct { | ... | @@ -2834,21 +2762,21 @@ pub const InstallArtifactStep = struct { |
| 2834 | pub const InstallFileStep = struct { | 2762 | pub const InstallFileStep = struct { |
| 2835 | step: Step, | 2763 | step: Step, |
| 2836 | builder: *Builder, | 2764 | builder: *Builder, |
| 2837 | src_path: []const u8, | 2765 | source: FileSource, |
| 2838 | dir: InstallDir, | 2766 | dir: InstallDir, |
| 2839 | dest_rel_path: []const u8, | 2767 | dest_rel_path: []const u8, |
| 2840 | | 2768 | |
| 2841 | pub fn init( | 2769 | pub fn init( |
| 2842 | builder: *Builder, | 2770 | builder: *Builder, |
| 2843 | src_path: []const u8, | 2771 | source: FileSource, |
| 2844 | dir: InstallDir, | 2772 | dir: InstallDir, |
| 2845 | dest_rel_path: []const u8, | 2773 | dest_rel_path: []const u8, |
| 2846 | ) InstallFileStep { | 2774 | ) InstallFileStep { |
| 2847 | builder.pushInstalledFile(dir, dest_rel_path); | 2775 | builder.pushInstalledFile(dir, dest_rel_path); |
| 2848 | return InstallFileStep{ | 2776 | return InstallFileStep{ |
| 2849 | .builder = builder, | 2777 | .builder = builder, |
| 2850 | .step = Step.init(.InstallFile, builder.fmt("install {s}", .{src_path}), builder.allocator, make), | 2778 | .step = Step.init(.InstallFile, builder.fmt("install {s} to {s}", .{ source.getDisplayName(), dest_rel_path }), builder.allocator, make), |
| 2851 | .src_path = builder.dupePath(src_path), | 2779 | .source = source.dupe(builder), |
| 2852 | .dir = dir.dupe(builder), | 2780 | .dir = dir.dupe(builder), |
| 2853 | .dest_rel_path = builder.dupePath(dest_rel_path), | 2781 | .dest_rel_path = builder.dupePath(dest_rel_path), |
| 2854 | }; | 2782 | }; |
| ... | @@ -2857,7 +2785,7 @@ pub const InstallFileStep = struct { | ... | @@ -2857,7 +2785,7 @@ pub const InstallFileStep = struct { |
| 2857 | fn make(step: *Step) !void { | 2785 | fn make(step: *Step) !void { |
| 2858 | const self = @fieldParentPtr(InstallFileStep, "step", step); | 2786 | const self = @fieldParentPtr(InstallFileStep, "step", step); |
| 2859 | const full_dest_path = self.builder.getInstallPath(self.dir, self.dest_rel_path); | 2787 | const full_dest_path = self.builder.getInstallPath(self.dir, self.dest_rel_path); |
| 2860 | const full_src_path = self.builder.pathFromRoot(self.src_path); | 2788 | const full_src_path = self.source.getPath(self.builder); |
| 2861 | try self.builder.updateFile(full_src_path, full_dest_path); | 2789 | try self.builder.updateFile(full_src_path, full_dest_path); |
| 2862 | } | 2790 | } |
| 2863 | }; | 2791 | }; |