| ... | ... | @@ -258,9 +258,14 @@ pub const Builder = struct { |
| 258 | 258 | })); |
| 259 | 259 | } |
| 260 | 260 | |
| 261 | | pub fn addSharedLibrary(self: *Builder, name: []const u8, root_src: ?[]const u8, ver: Version) *LibExeObjStep { |
| 261 | pub fn addSharedLibrary( |
| 262 | self: *Builder, |
| 263 | name: []const u8, |
| 264 | root_src: ?[]const u8, |
| 265 | kind: LibExeObjStep.SharedLibKind, |
| 266 | ) *LibExeObjStep { |
| 262 | 267 | const root_src_param = if (root_src) |p| @as(FileSource, .{ .path = p }) else null; |
| 263 | | return LibExeObjStep.createSharedLibrary(self, name, root_src_param, ver); |
| 268 | return LibExeObjStep.createSharedLibrary(self, name, root_src_param, kind); |
| 264 | 269 | } |
| 265 | 270 | |
| 266 | 271 | pub fn addStaticLibrary(self: *Builder, name: []const u8, root_src: ?[]const u8) *LibExeObjStep { |
| ... | ... | @@ -338,11 +343,13 @@ pub const Builder = struct { |
| 338 | 343 | return TranslateCStep.create(self, source); |
| 339 | 344 | } |
| 340 | 345 | |
| 341 | | pub fn version(self: *const Builder, major: u32, minor: u32, patch: u32) Version { |
| 342 | | return Version{ |
| 343 | | .major = major, |
| 344 | | .minor = minor, |
| 345 | | .patch = patch, |
| 346 | pub fn version(self: *const Builder, major: u32, minor: u32, patch: u32) LibExeObjStep.SharedLibKind { |
| 347 | return .{ |
| 348 | .versioned = .{ |
| 349 | .major = major, |
| 350 | .minor = minor, |
| 351 | .patch = patch, |
| 352 | }, |
| 346 | 353 | }; |
| 347 | 354 | } |
| 348 | 355 | |
| ... | ... | @@ -1166,7 +1173,7 @@ pub const LibExeObjStep = struct { |
| 1166 | 1173 | version_script: ?[]const u8 = null, |
| 1167 | 1174 | out_filename: []const u8, |
| 1168 | 1175 | is_dynamic: bool, |
| 1169 | | version: Version, |
| 1176 | version: ?Version, |
| 1170 | 1177 | build_mode: builtin.Mode, |
| 1171 | 1178 | kind: Kind, |
| 1172 | 1179 | major_only_filename: []const u8, |
| ... | ... | @@ -1268,33 +1275,41 @@ pub const LibExeObjStep = struct { |
| 1268 | 1275 | Test, |
| 1269 | 1276 | }; |
| 1270 | 1277 | |
| 1271 | | pub fn createSharedLibrary(builder: *Builder, name: []const u8, root_src: ?FileSource, ver: Version) *LibExeObjStep { |
| 1278 | const SharedLibKind = union(enum) { |
| 1279 | versioned: Version, |
| 1280 | unversioned: void, |
| 1281 | }; |
| 1282 | |
| 1283 | pub fn createSharedLibrary(builder: *Builder, name: []const u8, root_src: ?FileSource, kind: SharedLibKind) *LibExeObjStep { |
| 1272 | 1284 | const self = builder.allocator.create(LibExeObjStep) catch unreachable; |
| 1273 | | self.* = initExtraArgs(builder, name, root_src, Kind.Lib, true, ver); |
| 1285 | self.* = initExtraArgs(builder, name, root_src, Kind.Lib, true, switch (kind) { |
| 1286 | .versioned => |ver| ver, |
| 1287 | .unversioned => null, |
| 1288 | }); |
| 1274 | 1289 | return self; |
| 1275 | 1290 | } |
| 1276 | 1291 | |
| 1277 | 1292 | pub fn createStaticLibrary(builder: *Builder, name: []const u8, root_src: ?FileSource) *LibExeObjStep { |
| 1278 | 1293 | const self = builder.allocator.create(LibExeObjStep) catch unreachable; |
| 1279 | | self.* = initExtraArgs(builder, name, root_src, Kind.Lib, false, builder.version(0, 0, 0)); |
| 1294 | self.* = initExtraArgs(builder, name, root_src, Kind.Lib, false, null); |
| 1280 | 1295 | return self; |
| 1281 | 1296 | } |
| 1282 | 1297 | |
| 1283 | 1298 | pub fn createObject(builder: *Builder, name: []const u8, root_src: ?FileSource) *LibExeObjStep { |
| 1284 | 1299 | const self = builder.allocator.create(LibExeObjStep) catch unreachable; |
| 1285 | | self.* = initExtraArgs(builder, name, root_src, Kind.Obj, false, builder.version(0, 0, 0)); |
| 1300 | self.* = initExtraArgs(builder, name, root_src, Kind.Obj, false, null); |
| 1286 | 1301 | return self; |
| 1287 | 1302 | } |
| 1288 | 1303 | |
| 1289 | 1304 | pub fn createExecutable(builder: *Builder, name: []const u8, root_src: ?FileSource, is_dynamic: bool) *LibExeObjStep { |
| 1290 | 1305 | const self = builder.allocator.create(LibExeObjStep) catch unreachable; |
| 1291 | | self.* = initExtraArgs(builder, name, root_src, Kind.Exe, is_dynamic, builder.version(0, 0, 0)); |
| 1306 | self.* = initExtraArgs(builder, name, root_src, Kind.Exe, is_dynamic, null); |
| 1292 | 1307 | return self; |
| 1293 | 1308 | } |
| 1294 | 1309 | |
| 1295 | 1310 | pub fn createTest(builder: *Builder, name: []const u8, root_src: FileSource) *LibExeObjStep { |
| 1296 | 1311 | const self = builder.allocator.create(LibExeObjStep) catch unreachable; |
| 1297 | | self.* = initExtraArgs(builder, name, root_src, Kind.Test, false, builder.version(0, 0, 0)); |
| 1312 | self.* = initExtraArgs(builder, name, root_src, Kind.Test, false, null); |
| 1298 | 1313 | return self; |
| 1299 | 1314 | } |
| 1300 | 1315 | |
| ... | ... | @@ -1304,7 +1319,7 @@ pub const LibExeObjStep = struct { |
| 1304 | 1319 | root_src: ?FileSource, |
| 1305 | 1320 | kind: Kind, |
| 1306 | 1321 | is_dynamic: bool, |
| 1307 | | ver: Version, |
| 1322 | ver: ?Version, |
| 1308 | 1323 | ) LibExeObjStep { |
| 1309 | 1324 | if (mem.indexOf(u8, name, "/") != null or mem.indexOf(u8, name, "\\") != null) { |
| 1310 | 1325 | panic("invalid name: '{}'. It looks like a file path, but it is supposed to be the library or application name.", .{name}); |
| ... | ... | @@ -1375,17 +1390,17 @@ pub const LibExeObjStep = struct { |
| 1375 | 1390 | self.target.staticLibSuffix(), |
| 1376 | 1391 | }); |
| 1377 | 1392 | self.out_lib_filename = self.out_filename; |
| 1378 | | } else { |
| 1393 | } else if (self.version) |version| { |
| 1379 | 1394 | if (self.target.isDarwin()) { |
| 1380 | 1395 | self.out_filename = self.builder.fmt("lib{}.{d}.{d}.{d}.dylib", .{ |
| 1381 | 1396 | self.name, |
| 1382 | | self.version.major, |
| 1383 | | self.version.minor, |
| 1384 | | self.version.patch, |
| 1397 | version.major, |
| 1398 | version.minor, |
| 1399 | version.patch, |
| 1385 | 1400 | }); |
| 1386 | 1401 | self.major_only_filename = self.builder.fmt("lib{}.{d}.dylib", .{ |
| 1387 | 1402 | self.name, |
| 1388 | | self.version.major, |
| 1403 | version.major, |
| 1389 | 1404 | }); |
| 1390 | 1405 | self.name_only_filename = self.builder.fmt("lib{}.dylib", .{self.name}); |
| 1391 | 1406 | self.out_lib_filename = self.out_filename; |
| ... | ... | @@ -1395,14 +1410,25 @@ pub const LibExeObjStep = struct { |
| 1395 | 1410 | } else { |
| 1396 | 1411 | self.out_filename = self.builder.fmt("lib{}.so.{d}.{d}.{d}", .{ |
| 1397 | 1412 | self.name, |
| 1398 | | self.version.major, |
| 1399 | | self.version.minor, |
| 1400 | | self.version.patch, |
| 1413 | version.major, |
| 1414 | version.minor, |
| 1415 | version.patch, |
| 1401 | 1416 | }); |
| 1402 | | self.major_only_filename = self.builder.fmt("lib{}.so.{d}", .{ self.name, self.version.major }); |
| 1417 | self.major_only_filename = self.builder.fmt("lib{}.so.{d}", .{ self.name, version.major }); |
| 1403 | 1418 | self.name_only_filename = self.builder.fmt("lib{}.so", .{self.name}); |
| 1404 | 1419 | self.out_lib_filename = self.out_filename; |
| 1405 | 1420 | } |
| 1421 | } else { |
| 1422 | if (self.target.isDarwin()) { |
| 1423 | self.out_filename = self.builder.fmt("lib{}.dylib", .{self.name}); |
| 1424 | self.out_lib_filename = self.out_filename; |
| 1425 | } else if (self.target.isWindows()) { |
| 1426 | self.out_filename = self.builder.fmt("{}.dll", .{self.name}); |
| 1427 | self.out_lib_filename = self.builder.fmt("{}.lib", .{self.name}); |
| 1428 | } else { |
| 1429 | self.out_filename = self.builder.fmt("lib{}.so", .{self.name}); |
| 1430 | self.out_lib_filename = self.out_filename; |
| 1431 | } |
| 1406 | 1432 | } |
| 1407 | 1433 | }, |
| 1408 | 1434 | } |
| ... | ... | @@ -2037,14 +2063,16 @@ pub const LibExeObjStep = struct { |
| 2037 | 2063 | zig_args.append(self.name) catch unreachable; |
| 2038 | 2064 | |
| 2039 | 2065 | if (self.kind == Kind.Lib and self.is_dynamic) { |
| 2040 | | zig_args.append("--ver-major") catch unreachable; |
| 2041 | | zig_args.append(builder.fmt("{}", .{self.version.major})) catch unreachable; |
| 2066 | if (self.version) |version| { |
| 2067 | zig_args.append("--ver-major") catch unreachable; |
| 2068 | zig_args.append(builder.fmt("{}", .{version.major})) catch unreachable; |
| 2042 | 2069 | |
| 2043 | | zig_args.append("--ver-minor") catch unreachable; |
| 2044 | | zig_args.append(builder.fmt("{}", .{self.version.minor})) catch unreachable; |
| 2070 | zig_args.append("--ver-minor") catch unreachable; |
| 2071 | zig_args.append(builder.fmt("{}", .{version.minor})) catch unreachable; |
| 2045 | 2072 | |
| 2046 | | zig_args.append("--ver-patch") catch unreachable; |
| 2047 | | zig_args.append(builder.fmt("{}", .{self.version.patch})) catch unreachable; |
| 2073 | zig_args.append("--ver-patch") catch unreachable; |
| 2074 | zig_args.append(builder.fmt("{}", .{version.patch})) catch unreachable; |
| 2075 | } |
| 2048 | 2076 | } |
| 2049 | 2077 | if (self.is_dynamic) { |
| 2050 | 2078 | try zig_args.append("-dynamic"); |
| ... | ... | @@ -2285,7 +2313,7 @@ pub const LibExeObjStep = struct { |
| 2285 | 2313 | } |
| 2286 | 2314 | } |
| 2287 | 2315 | |
| 2288 | | if (self.kind == Kind.Lib and self.is_dynamic and self.target.wantSharedLibSymLinks()) { |
| 2316 | if (self.kind == Kind.Lib and self.is_dynamic and self.version != null and self.target.wantSharedLibSymLinks()) { |
| 2289 | 2317 | try doAtomicSymLinks(builder.allocator, self.getOutputPath(), self.major_only_filename, self.name_only_filename); |
| 2290 | 2318 | } |
| 2291 | 2319 | } |
| ... | ... | @@ -2329,8 +2357,10 @@ pub const InstallArtifactStep = struct { |
| 2329 | 2357 | |
| 2330 | 2358 | builder.pushInstalledFile(self.dest_dir, artifact.out_filename); |
| 2331 | 2359 | if (self.artifact.isDynamicLibrary()) { |
| 2332 | | builder.pushInstalledFile(.Lib, artifact.major_only_filename); |
| 2333 | | builder.pushInstalledFile(.Lib, artifact.name_only_filename); |
| 2360 | if (self.artifact.version != null) { |
| 2361 | builder.pushInstalledFile(.Lib, artifact.major_only_filename); |
| 2362 | builder.pushInstalledFile(.Lib, artifact.name_only_filename); |
| 2363 | } |
| 2334 | 2364 | if (self.artifact.target.isWindows()) { |
| 2335 | 2365 | builder.pushInstalledFile(.Lib, artifact.out_lib_filename); |
| 2336 | 2366 | } |
| ... | ... | @@ -2350,7 +2380,7 @@ pub const InstallArtifactStep = struct { |
| 2350 | 2380 | |
| 2351 | 2381 | const full_dest_path = builder.getInstallPath(self.dest_dir, self.artifact.out_filename); |
| 2352 | 2382 | try builder.updateFile(self.artifact.getOutputPath(), full_dest_path); |
| 2353 | | if (self.artifact.isDynamicLibrary() and self.artifact.target.wantSharedLibSymLinks()) { |
| 2383 | if (self.artifact.isDynamicLibrary() and self.artifact.version != null and self.artifact.target.wantSharedLibSymLinks()) { |
| 2354 | 2384 | try doAtomicSymLinks(builder.allocator, full_dest_path, self.artifact.major_only_filename, self.artifact.name_only_filename); |
| 2355 | 2385 | } |
| 2356 | 2386 | if (self.pdb_dir) |pdb_dir| { |