| ... | ... | @@ -204,55 +204,24 @@ pub const Builder = struct { |
| 204 | 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 { |
| 208 | | return LibExeObjStep.createExecutable( |
| 209 | | self, |
| 210 | | name, |
| 211 | | if (root_src) |p| FileSource{ .path = p } else null, |
| 212 | | false, |
| 213 | | ); |
| 207 | fn convertOptionalPathToFileSource(path: ?[]const u8) ?FileSource { |
| 208 | return if (path) |p| |
| 209 | FileSource.relative(p) |
| 210 | else |
| 211 | null; |
| 214 | 212 | } |
| 215 | 213 | |
| 216 | | pub fn addExecutableFromWriteFileStep( |
| 217 | | self: *Builder, |
| 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); |
| 214 | pub fn addExecutable(self: *Builder, name: []const u8, root_src: ?[]const u8) *LibExeObjStep { |
| 215 | return addExecutableSource(self, name, convertOptionalPathToFileSource(root_src), false); |
| 228 | 216 | } |
| 229 | 217 | |
| 230 | | pub fn addExecutableSource( |
| 231 | | self: *Builder, |
| 232 | | name: []const u8, |
| 233 | | root_src: ?FileSource, |
| 234 | | ) *LibExeObjStep { |
| 235 | | return LibExeObjStep.createExecutable(self, name, root_src, false); |
| 236 | | } |
| 218 | pub const addExecutableSource = LibExeObjStep.createExecutable; |
| 237 | 219 | |
| 238 | 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; |
| 240 | | return LibExeObjStep.createObject(self, name, root_src_param); |
| 221 | return addObjectSource(self, name, convertOptionalPathToFileSource(root_src)); |
| 241 | 222 | } |
| 242 | 223 | |
| 243 | | pub fn addObjectFromWriteFileStep( |
| 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 | | } |
| 224 | pub const addObjectSource = LibExeObjStep.createObject; |
| 256 | 225 | |
| 257 | 226 | pub fn addSharedLibrary( |
| 258 | 227 | self: *Builder, |
| ... | ... | @@ -260,64 +229,33 @@ pub const Builder = struct { |
| 260 | 229 | root_src: ?[]const u8, |
| 261 | 230 | kind: LibExeObjStep.SharedLibKind, |
| 262 | 231 | ) *LibExeObjStep { |
| 263 | | const root_src_param = if (root_src) |p| @as(FileSource, .{ .path = p }) else null; |
| 264 | | return LibExeObjStep.createSharedLibrary(self, name, root_src_param, kind); |
| 232 | return addSharedLibrarySource(self, name, convertOptionalPathToFileSource(root_src), kind); |
| 265 | 233 | } |
| 266 | 234 | |
| 267 | | pub fn addSharedLibraryFromWriteFileStep( |
| 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 | | } |
| 235 | pub const addSharedLibrarySource = LibExeObjStep.createSharedLibrary; |
| 281 | 236 | |
| 282 | 237 | pub fn addStaticLibrary(self: *Builder, name: []const u8, root_src: ?[]const u8) *LibExeObjStep { |
| 283 | 238 | const root_src_param = if (root_src) |p| @as(FileSource, .{ .path = p }) else null; |
| 284 | 239 | return LibExeObjStep.createStaticLibrary(self, name, root_src_param); |
| 285 | 240 | } |
| 286 | 241 | |
| 287 | | pub fn addStaticLibraryFromWriteFileStep( |
| 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 | | } |
| 242 | pub const addStaticLibrarySource = LibExeObjStep.createStaticLibrary; |
| 300 | 243 | |
| 301 | 244 | pub fn addTest(self: *Builder, root_src: []const u8) *LibExeObjStep { |
| 302 | 245 | return LibExeObjStep.createTest(self, "test", .{ .path = root_src }); |
| 303 | 246 | } |
| 304 | 247 | |
| 305 | | pub fn addTestFromWriteFileStep( |
| 306 | | self: *Builder, |
| 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 | | })); |
| 248 | pub fn addTestSource(self: *Builder, root_src: FileSource) *LibExeObjStep { |
| 249 | return LibExeObjStep.createTest(self, "test", root_src); |
| 316 | 250 | } |
| 317 | 251 | |
| 318 | 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 | 257 | const obj_step = LibExeObjStep.createObject(self, name, null); |
| 320 | | obj_step.addAssemblyFile(src); |
| 258 | obj_step.addAssemblyFileSource(src); |
| 321 | 259 | return obj_step; |
| 322 | 260 | } |
| 323 | 261 | |
| ... | ... | @@ -938,7 +876,7 @@ pub const Builder = struct { |
| 938 | 876 | |
| 939 | 877 | ///`dest_rel_path` is relative to prefix path |
| 940 | 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 | 882 | pub fn installDirectory(self: *Builder, options: InstallDirectoryOptions) void { |
| ... | ... | @@ -947,12 +885,12 @@ pub const Builder = struct { |
| 947 | 885 | |
| 948 | 886 | ///`dest_rel_path` is relative to bin path |
| 949 | 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 | 891 | ///`dest_rel_path` is relative to lib path |
| 954 | 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 | 896 | pub fn installRaw(self: *Builder, artifact: *LibExeObjStep, dest_filename: []const u8) void { |
| ... | ... | @@ -961,17 +899,17 @@ pub const Builder = struct { |
| 961 | 899 | |
| 962 | 900 | ///`dest_rel_path` is relative to install prefix path |
| 963 | 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 | 905 | ///`dest_rel_path` is relative to bin path |
| 968 | 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 | 910 | ///`dest_rel_path` is relative to lib path |
| 973 | 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 | 915 | pub fn addInstallRaw(self: *Builder, artifact: *LibExeObjStep, dest_filename: []const u8) *InstallRawStep { |
| ... | ... | @@ -980,7 +918,7 @@ pub const Builder = struct { |
| 980 | 918 | |
| 981 | 919 | pub fn addInstallFileWithDir( |
| 982 | 920 | self: *Builder, |
| 983 | | src_path: []const u8, |
| 921 | source: FileSource, |
| 984 | 922 | install_dir: InstallDir, |
| 985 | 923 | dest_rel_path: []const u8, |
| 986 | 924 | ) *InstallFileStep { |
| ... | ... | @@ -988,7 +926,7 @@ pub const Builder = struct { |
| 988 | 926 | panic("dest_rel_path must be non-empty", .{}); |
| 989 | 927 | } |
| 990 | 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 | 930 | return install_step; |
| 993 | 931 | } |
| 994 | 932 | |
| ... | ... | @@ -1301,42 +1239,41 @@ pub const GeneratedFile = struct { |
| 1301 | 1239 | pub const FileSource = union(enum) { |
| 1302 | 1240 | /// Relative to build root |
| 1303 | 1241 | path: []const u8, |
| 1304 | | write_file: struct { |
| 1305 | | step: *WriteFileStep, |
| 1306 | | basename: []const u8, |
| 1307 | | }, |
| 1308 | 1242 | generated: *const GeneratedFile, |
| 1309 | 1243 | |
| 1310 | 1244 | pub fn relative(path: []const u8) FileSource { |
| 1311 | 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 | 1257 | pub fn addStepDependencies(self: FileSource, step: *Step) void { |
| 1315 | 1258 | switch (self) { |
| 1316 | 1259 | .path => {}, |
| 1317 | | .write_file => |wf| step.dependOn(&wf.step.step), |
| 1318 | 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 | 1265 | pub fn getPath(self: FileSource, builder: *Builder) []const u8 { |
| 1324 | | return switch (self) { |
| 1266 | const path = switch (self) { |
| 1325 | 1267 | .path => |p| builder.pathFromRoot(p), |
| 1326 | | .write_file => |wf| wf.step.getOutputPath(wf.basename), |
| 1327 | 1268 | .generated => |gen| gen.getPath(), |
| 1328 | 1269 | }; |
| 1270 | std.debug.assert(std.fs.path.isAbsolute(path)); |
| 1271 | return path; |
| 1329 | 1272 | } |
| 1330 | 1273 | |
| 1331 | 1274 | pub fn dupe(self: FileSource, b: *Builder) FileSource { |
| 1332 | 1275 | return switch (self) { |
| 1333 | 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 | 1277 | .generated => |gen| .{ .generated = gen }, |
| 1341 | 1278 | }; |
| 1342 | 1279 | } |
| ... | ... | @@ -1967,15 +1904,6 @@ pub const LibExeObjStep = struct { |
| 1967 | 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 | 1907 | pub fn addAssemblyFileSource(self: *LibExeObjStep, source: FileSource) void { |
| 1980 | 1908 | const source_duped = source.dupe(self.builder); |
| 1981 | 1909 | self.link_objects.append(LinkObject{ .AssemblyFile = source_duped }) catch unreachable; |
| ... | ... | @@ -2834,21 +2762,21 @@ pub const InstallArtifactStep = struct { |
| 2834 | 2762 | pub const InstallFileStep = struct { |
| 2835 | 2763 | step: Step, |
| 2836 | 2764 | builder: *Builder, |
| 2837 | | src_path: []const u8, |
| 2765 | source: FileSource, |
| 2838 | 2766 | dir: InstallDir, |
| 2839 | 2767 | dest_rel_path: []const u8, |
| 2840 | 2768 | |
| 2841 | 2769 | pub fn init( |
| 2842 | 2770 | builder: *Builder, |
| 2843 | | src_path: []const u8, |
| 2771 | source: FileSource, |
| 2844 | 2772 | dir: InstallDir, |
| 2845 | 2773 | dest_rel_path: []const u8, |
| 2846 | 2774 | ) InstallFileStep { |
| 2847 | 2775 | builder.pushInstalledFile(dir, dest_rel_path); |
| 2848 | 2776 | return InstallFileStep{ |
| 2849 | 2777 | .builder = builder, |
| 2850 | | .step = Step.init(.InstallFile, builder.fmt("install {s}", .{src_path}), builder.allocator, make), |
| 2851 | | .src_path = builder.dupePath(src_path), |
| 2778 | .step = Step.init(.InstallFile, builder.fmt("install {s} to {s}", .{ source.getDisplayName(), dest_rel_path }), builder.allocator, make), |
| 2779 | .source = source.dupe(builder), |
| 2852 | 2780 | .dir = dir.dupe(builder), |
| 2853 | 2781 | .dest_rel_path = builder.dupePath(dest_rel_path), |
| 2854 | 2782 | }; |
| ... | ... | @@ -2857,7 +2785,7 @@ pub const InstallFileStep = struct { |
| 2857 | 2785 | fn make(step: *Step) !void { |
| 2858 | 2786 | const self = @fieldParentPtr(InstallFileStep, "step", step); |
| 2859 | 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 | 2789 | try self.builder.updateFile(full_src_path, full_dest_path); |
| 2862 | 2790 | } |
| 2863 | 2791 | }; |