authorgravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2020-09-11 01:22:18+02:00
committergravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2020-09-11 10:46:37+02:00
log0a76a9bd738471e2edddf71a822ff76c47bfd094
tree42ae5920d24aadd42f0dcfad1b902465f09b3b9f
parent800c5de2ae527cdefaa5567720dab2f899244897
signature Commit is signed but in an unrecognized format.

std, stage1: make shared library versioning optional

This commit changes the behavior of stage1 to emit libfoo.so instead of libfoo.so.0.0.0 when none of the --ver-major, --ver-minor, or --ver-patch flags are set. It also makes it possible to create unversioned shared libraries using the zig build system, changing the version parameter of addSharedLibrary() to a tagged union.

8 files changed, 92 insertions(+), 45 deletions(-)

lib/std/build.zig+64-34
...@@ -258,9 +258,14 @@ pub const Builder = struct {...@@ -258,9 +258,14 @@ pub const Builder = struct {
258 }));258 }));
259 }259 }
260260
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 const root_src_param = if (root_src) |p| @as(FileSource, .{ .path = p }) else null;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 }
265270
266 pub fn addStaticLibrary(self: *Builder, name: []const u8, root_src: ?[]const u8) *LibExeObjStep {271 pub fn addStaticLibrary(self: *Builder, name: []const u8, root_src: ?[]const u8) *LibExeObjStep {
...@@ -338,11 +343,13 @@ pub const Builder = struct {...@@ -338,11 +343,13 @@ pub const Builder = struct {
338 return TranslateCStep.create(self, source);343 return TranslateCStep.create(self, source);
339 }344 }
340345
341 pub fn version(self: *const Builder, major: u32, minor: u32, patch: u32) Version {346 pub fn version(self: *const Builder, major: u32, minor: u32, patch: u32) LibExeObjStep.SharedLibKind {
342 return Version{347 return .{
343 .major = major,348 .versioned = .{
344 .minor = minor,349 .major = major,
345 .patch = patch,350 .minor = minor,
351 .patch = patch,
352 },
346 };353 };
347 }354 }
348355
...@@ -1166,7 +1173,7 @@ pub const LibExeObjStep = struct {...@@ -1166,7 +1173,7 @@ pub const LibExeObjStep = struct {
1166 version_script: ?[]const u8 = null,1173 version_script: ?[]const u8 = null,
1167 out_filename: []const u8,1174 out_filename: []const u8,
1168 is_dynamic: bool,1175 is_dynamic: bool,
1169 version: Version,1176 version: ?Version,
1170 build_mode: builtin.Mode,1177 build_mode: builtin.Mode,
1171 kind: Kind,1178 kind: Kind,
1172 major_only_filename: []const u8,1179 major_only_filename: []const u8,
...@@ -1268,33 +1275,41 @@ pub const LibExeObjStep = struct {...@@ -1268,33 +1275,41 @@ pub const LibExeObjStep = struct {
1268 Test,1275 Test,
1269 };1276 };
12701277
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 const self = builder.allocator.create(LibExeObjStep) catch unreachable;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 return self;1289 return self;
1275 }1290 }
12761291
1277 pub fn createStaticLibrary(builder: *Builder, name: []const u8, root_src: ?FileSource) *LibExeObjStep {1292 pub fn createStaticLibrary(builder: *Builder, name: []const u8, root_src: ?FileSource) *LibExeObjStep {
1278 const self = builder.allocator.create(LibExeObjStep) catch unreachable;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 return self;1295 return self;
1281 }1296 }
12821297
1283 pub fn createObject(builder: *Builder, name: []const u8, root_src: ?FileSource) *LibExeObjStep {1298 pub fn createObject(builder: *Builder, name: []const u8, root_src: ?FileSource) *LibExeObjStep {
1284 const self = builder.allocator.create(LibExeObjStep) catch unreachable;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 return self;1301 return self;
1287 }1302 }
12881303
1289 pub fn createExecutable(builder: *Builder, name: []const u8, root_src: ?FileSource, is_dynamic: bool) *LibExeObjStep {1304 pub fn createExecutable(builder: *Builder, name: []const u8, root_src: ?FileSource, is_dynamic: bool) *LibExeObjStep {
1290 const self = builder.allocator.create(LibExeObjStep) catch unreachable;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 return self;1307 return self;
1293 }1308 }
12941309
1295 pub fn createTest(builder: *Builder, name: []const u8, root_src: FileSource) *LibExeObjStep {1310 pub fn createTest(builder: *Builder, name: []const u8, root_src: FileSource) *LibExeObjStep {
1296 const self = builder.allocator.create(LibExeObjStep) catch unreachable;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 return self;1313 return self;
1299 }1314 }
13001315
...@@ -1304,7 +1319,7 @@ pub const LibExeObjStep = struct {...@@ -1304,7 +1319,7 @@ pub const LibExeObjStep = struct {
1304 root_src: ?FileSource,1319 root_src: ?FileSource,
1305 kind: Kind,1320 kind: Kind,
1306 is_dynamic: bool,1321 is_dynamic: bool,
1307 ver: Version,1322 ver: ?Version,
1308 ) LibExeObjStep {1323 ) LibExeObjStep {
1309 if (mem.indexOf(u8, name, "/") != null or mem.indexOf(u8, name, "\\") != null) {1324 if (mem.indexOf(u8, name, "/") != null or mem.indexOf(u8, name, "\\") != null) {
1310 panic("invalid name: '{}'. It looks like a file path, but it is supposed to be the library or application name.", .{name});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,17 +1390,17 @@ pub const LibExeObjStep = struct {
1375 self.target.staticLibSuffix(),1390 self.target.staticLibSuffix(),
1376 });1391 });
1377 self.out_lib_filename = self.out_filename;1392 self.out_lib_filename = self.out_filename;
1378 } else {1393 } else if (self.version) |version| {
1379 if (self.target.isDarwin()) {1394 if (self.target.isDarwin()) {
1380 self.out_filename = self.builder.fmt("lib{}.{d}.{d}.{d}.dylib", .{1395 self.out_filename = self.builder.fmt("lib{}.{d}.{d}.{d}.dylib", .{
1381 self.name,1396 self.name,
1382 self.version.major,1397 version.major,
1383 self.version.minor,1398 version.minor,
1384 self.version.patch,1399 version.patch,
1385 });1400 });
1386 self.major_only_filename = self.builder.fmt("lib{}.{d}.dylib", .{1401 self.major_only_filename = self.builder.fmt("lib{}.{d}.dylib", .{
1387 self.name,1402 self.name,
1388 self.version.major,1403 version.major,
1389 });1404 });
1390 self.name_only_filename = self.builder.fmt("lib{}.dylib", .{self.name});1405 self.name_only_filename = self.builder.fmt("lib{}.dylib", .{self.name});
1391 self.out_lib_filename = self.out_filename;1406 self.out_lib_filename = self.out_filename;
...@@ -1395,14 +1410,25 @@ pub const LibExeObjStep = struct {...@@ -1395,14 +1410,25 @@ pub const LibExeObjStep = struct {
1395 } else {1410 } else {
1396 self.out_filename = self.builder.fmt("lib{}.so.{d}.{d}.{d}", .{1411 self.out_filename = self.builder.fmt("lib{}.so.{d}.{d}.{d}", .{
1397 self.name,1412 self.name,
1398 self.version.major,1413 version.major,
1399 self.version.minor,1414 version.minor,
1400 self.version.patch,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 self.name_only_filename = self.builder.fmt("lib{}.so", .{self.name});1418 self.name_only_filename = self.builder.fmt("lib{}.so", .{self.name});
1404 self.out_lib_filename = self.out_filename;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,14 +2063,16 @@ pub const LibExeObjStep = struct {
2037 zig_args.append(self.name) catch unreachable;2063 zig_args.append(self.name) catch unreachable;
20382064
2039 if (self.kind == Kind.Lib and self.is_dynamic) {2065 if (self.kind == Kind.Lib and self.is_dynamic) {
2040 zig_args.append("--ver-major") catch unreachable;2066 if (self.version) |version| {
2041 zig_args.append(builder.fmt("{}", .{self.version.major})) catch unreachable;2067 zig_args.append("--ver-major") catch unreachable;
2068 zig_args.append(builder.fmt("{}", .{version.major})) catch unreachable;
20422069
2043 zig_args.append("--ver-minor") catch unreachable;2070 zig_args.append("--ver-minor") catch unreachable;
2044 zig_args.append(builder.fmt("{}", .{self.version.minor})) catch unreachable;2071 zig_args.append(builder.fmt("{}", .{version.minor})) catch unreachable;
20452072
2046 zig_args.append("--ver-patch") catch unreachable;2073 zig_args.append("--ver-patch") catch unreachable;
2047 zig_args.append(builder.fmt("{}", .{self.version.patch})) catch unreachable;2074 zig_args.append(builder.fmt("{}", .{version.patch})) catch unreachable;
2075 }
2048 }2076 }
2049 if (self.is_dynamic) {2077 if (self.is_dynamic) {
2050 try zig_args.append("-dynamic");2078 try zig_args.append("-dynamic");
...@@ -2285,7 +2313,7 @@ pub const LibExeObjStep = struct {...@@ -2285,7 +2313,7 @@ pub const LibExeObjStep = struct {
2285 }2313 }
2286 }2314 }
22872315
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 try doAtomicSymLinks(builder.allocator, self.getOutputPath(), self.major_only_filename, self.name_only_filename);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,8 +2357,10 @@ pub const InstallArtifactStep = struct {
23292357
2330 builder.pushInstalledFile(self.dest_dir, artifact.out_filename);2358 builder.pushInstalledFile(self.dest_dir, artifact.out_filename);
2331 if (self.artifact.isDynamicLibrary()) {2359 if (self.artifact.isDynamicLibrary()) {
2332 builder.pushInstalledFile(.Lib, artifact.major_only_filename);2360 if (self.artifact.version != null) {
2333 builder.pushInstalledFile(.Lib, artifact.name_only_filename);2361 builder.pushInstalledFile(.Lib, artifact.major_only_filename);
2362 builder.pushInstalledFile(.Lib, artifact.name_only_filename);
2363 }
2334 if (self.artifact.target.isWindows()) {2364 if (self.artifact.target.isWindows()) {
2335 builder.pushInstalledFile(.Lib, artifact.out_lib_filename);2365 builder.pushInstalledFile(.Lib, artifact.out_lib_filename);
2336 }2366 }
...@@ -2350,7 +2380,7 @@ pub const InstallArtifactStep = struct {...@@ -2350,7 +2380,7 @@ pub const InstallArtifactStep = struct {
23502380
2351 const full_dest_path = builder.getInstallPath(self.dest_dir, self.artifact.out_filename);2381 const full_dest_path = builder.getInstallPath(self.dest_dir, self.artifact.out_filename);
2352 try builder.updateFile(self.artifact.getOutputPath(), full_dest_path);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 try doAtomicSymLinks(builder.allocator, full_dest_path, self.artifact.major_only_filename, self.artifact.name_only_filename);2384 try doAtomicSymLinks(builder.allocator, full_dest_path, self.artifact.major_only_filename, self.artifact.name_only_filename);
2355 }2385 }
2356 if (self.pdb_dir) |pdb_dir| {2386 if (self.pdb_dir) |pdb_dir| {
src/all_types.hpp+1
...@@ -2265,6 +2265,7 @@ struct CodeGen {...@@ -2265,6 +2265,7 @@ struct CodeGen {
22652265
2266 Stage2LibCInstallation *libc;2266 Stage2LibCInstallation *libc;
22672267
2268 bool is_versioned;
2268 size_t version_major;2269 size_t version_major;
2269 size_t version_minor;2270 size_t version_minor;
2270 size_t version_patch;2271 size_t version_patch;
src/codegen.cpp+4-2
...@@ -90,7 +90,8 @@ void codegen_set_test_name_prefix(CodeGen *g, Buf *prefix) {...@@ -90,7 +90,8 @@ void codegen_set_test_name_prefix(CodeGen *g, Buf *prefix) {
90 g->test_name_prefix = prefix;90 g->test_name_prefix = prefix;
91}91}
9292
93void codegen_set_lib_version(CodeGen *g, size_t major, size_t minor, size_t patch) {93void codegen_set_lib_version(CodeGen *g, bool is_versioned, size_t major, size_t minor, size_t patch) {
94 g->is_versioned = is_versioned;
94 g->version_major = major;95 g->version_major = major;
95 g->version_minor = minor;96 g->version_minor = minor;
96 g->version_patch = patch;97 g->version_patch = patch;
...@@ -10823,6 +10824,7 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) {...@@ -10823,6 +10824,7 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) {
10823 cache_bool(ch, g->emit_bin);10824 cache_bool(ch, g->emit_bin);
10824 cache_bool(ch, g->emit_llvm_ir);10825 cache_bool(ch, g->emit_llvm_ir);
10825 cache_bool(ch, g->emit_asm);10826 cache_bool(ch, g->emit_asm);
10827 cache_bool(ch, g->is_versioned);
10826 cache_usize(ch, g->version_major);10828 cache_usize(ch, g->version_major);
10827 cache_usize(ch, g->version_minor);10829 cache_usize(ch, g->version_minor);
10828 cache_usize(ch, g->version_patch);10830 cache_usize(ch, g->version_patch);
...@@ -10893,7 +10895,7 @@ static void resolve_out_paths(CodeGen *g) {...@@ -10893,7 +10895,7 @@ static void resolve_out_paths(CodeGen *g) {
10893 buf_resize(out_basename, 0);10895 buf_resize(out_basename, 0);
10894 buf_append_str(out_basename, target_lib_file_prefix(g->zig_target));10896 buf_append_str(out_basename, target_lib_file_prefix(g->zig_target));
10895 buf_append_buf(out_basename, g->root_out_name);10897 buf_append_buf(out_basename, g->root_out_name);
10896 buf_append_str(out_basename, target_lib_file_ext(g->zig_target, !g->is_dynamic,10898 buf_append_str(out_basename, target_lib_file_ext(g->zig_target, !g->is_dynamic, g->is_versioned,
10897 g->version_major, g->version_minor, g->version_patch));10899 g->version_major, g->version_minor, g->version_patch));
10898 break;10900 break;
10899 }10901 }
src/codegen.hpp+1-1
...@@ -38,7 +38,7 @@ void codegen_set_rdynamic(CodeGen *g, bool rdynamic);...@@ -38,7 +38,7 @@ void codegen_set_rdynamic(CodeGen *g, bool rdynamic);
38void codegen_set_linker_script(CodeGen *g, const char *linker_script);38void codegen_set_linker_script(CodeGen *g, const char *linker_script);
39void codegen_set_test_filter(CodeGen *g, Buf *filter);39void codegen_set_test_filter(CodeGen *g, Buf *filter);
40void codegen_set_test_name_prefix(CodeGen *g, Buf *prefix);40void codegen_set_test_name_prefix(CodeGen *g, Buf *prefix);
41void codegen_set_lib_version(CodeGen *g, size_t major, size_t minor, size_t patch);41void codegen_set_lib_version(CodeGen *g, bool is_versioned, size_t major, size_t minor, size_t patch);
42void codegen_add_time_event(CodeGen *g, const char *name);42void codegen_add_time_event(CodeGen *g, const char *name);
43void codegen_print_timing_report(CodeGen *g, FILE *f);43void codegen_print_timing_report(CodeGen *g, FILE *f);
44void codegen_link(CodeGen *g);44void codegen_link(CodeGen *g);
src/glibc.cpp+1-1
...@@ -335,7 +335,7 @@ Error glibc_build_dummies_and_maps(CodeGen *g, const ZigGLibCAbi *glibc_abi, con...@@ -335,7 +335,7 @@ Error glibc_build_dummies_and_maps(CodeGen *g, const ZigGLibCAbi *glibc_abi, con
335 bool is_ld = (strcmp(lib->name, "ld") == 0);335 bool is_ld = (strcmp(lib->name, "ld") == 0);
336336
337 CodeGen *child_gen = create_child_codegen(g, zig_file_path, OutTypeLib, nullptr, lib->name, progress_node);337 CodeGen *child_gen = create_child_codegen(g, zig_file_path, OutTypeLib, nullptr, lib->name, progress_node);
338 codegen_set_lib_version(child_gen, lib->sover, 0, 0);338 codegen_set_lib_version(child_gen, true, lib->sover, 0, 0);
339 child_gen->is_dynamic = true;339 child_gen->is_dynamic = true;
340 child_gen->is_dummy_so = true;340 child_gen->is_dummy_so = true;
341 child_gen->version_script_path = map_file_path;341 child_gen->version_script_path = map_file_path;
src/main.cpp+7-1
...@@ -416,6 +416,7 @@ static int main0(int argc, char **argv) {...@@ -416,6 +416,7 @@ static int main0(int argc, char **argv) {
416 const char *test_filter = nullptr;416 const char *test_filter = nullptr;
417 const char *test_name_prefix = nullptr;417 const char *test_name_prefix = nullptr;
418 bool test_evented_io = false;418 bool test_evented_io = false;
419 bool is_versioned = false;
419 size_t ver_major = 0;420 size_t ver_major = 0;
420 size_t ver_minor = 0;421 size_t ver_minor = 0;
421 size_t ver_patch = 0;422 size_t ver_patch = 0;
...@@ -870,6 +871,7 @@ static int main0(int argc, char **argv) {...@@ -870,6 +871,7 @@ static int main0(int argc, char **argv) {
870 fprintf(stderr, "expected linker arg after '%s'\n", buf_ptr(arg));871 fprintf(stderr, "expected linker arg after '%s'\n", buf_ptr(arg));
871 return EXIT_FAILURE;872 return EXIT_FAILURE;
872 }873 }
874 is_versioned = true;
873 ver_major = atoi(buf_ptr(linker_args.at(i)));875 ver_major = atoi(buf_ptr(linker_args.at(i)));
874 } else if (buf_eql_str(arg, "--minor-image-version")) {876 } else if (buf_eql_str(arg, "--minor-image-version")) {
875 i += 1;877 i += 1;
...@@ -877,6 +879,7 @@ static int main0(int argc, char **argv) {...@@ -877,6 +879,7 @@ static int main0(int argc, char **argv) {
877 fprintf(stderr, "expected linker arg after '%s'\n", buf_ptr(arg));879 fprintf(stderr, "expected linker arg after '%s'\n", buf_ptr(arg));
878 return EXIT_FAILURE;880 return EXIT_FAILURE;
879 }881 }
882 is_versioned = true;
880 ver_minor = atoi(buf_ptr(linker_args.at(i)));883 ver_minor = atoi(buf_ptr(linker_args.at(i)));
881 } else if (buf_eql_str(arg, "--stack")) {884 } else if (buf_eql_str(arg, "--stack")) {
882 i += 1;885 i += 1;
...@@ -1228,10 +1231,13 @@ static int main0(int argc, char **argv) {...@@ -1228,10 +1231,13 @@ static int main0(int argc, char **argv) {
1228 } else if (strcmp(arg, "--test-name-prefix") == 0) {1231 } else if (strcmp(arg, "--test-name-prefix") == 0) {
1229 test_name_prefix = argv[i];1232 test_name_prefix = argv[i];
1230 } else if (strcmp(arg, "--ver-major") == 0) {1233 } else if (strcmp(arg, "--ver-major") == 0) {
1234 is_versioned = true;
1231 ver_major = atoi(argv[i]);1235 ver_major = atoi(argv[i]);
1232 } else if (strcmp(arg, "--ver-minor") == 0) {1236 } else if (strcmp(arg, "--ver-minor") == 0) {
1237 is_versioned = true;
1233 ver_minor = atoi(argv[i]);1238 ver_minor = atoi(argv[i]);
1234 } else if (strcmp(arg, "--ver-patch") == 0) {1239 } else if (strcmp(arg, "--ver-patch") == 0) {
1240 is_versioned = true;
1235 ver_patch = atoi(argv[i]);1241 ver_patch = atoi(argv[i]);
1236 } else if (strcmp(arg, "--test-cmd") == 0) {1242 } else if (strcmp(arg, "--test-cmd") == 0) {
1237 test_exec_args.append(argv[i]);1243 test_exec_args.append(argv[i]);
...@@ -1590,7 +1596,7 @@ static int main0(int argc, char **argv) {...@@ -1590,7 +1596,7 @@ static int main0(int argc, char **argv) {
1590 g->emit_llvm_ir = emit_llvm_ir;1596 g->emit_llvm_ir = emit_llvm_ir;
15911597
1592 codegen_set_out_name(g, buf_out_name);1598 codegen_set_out_name(g, buf_out_name);
1593 codegen_set_lib_version(g, ver_major, ver_minor, ver_patch);1599 codegen_set_lib_version(g, is_versioned, ver_major, ver_minor, ver_patch);
1594 g->want_single_threaded = want_single_threaded;1600 g->want_single_threaded = want_single_threaded;
1595 codegen_set_linker_script(g, linker_script);1601 codegen_set_linker_script(g, linker_script);
1596 g->version_script_path = version_script; 1602 g->version_script_path = version_script;
src/target.cpp+13-5
...@@ -779,7 +779,7 @@ const char *target_lib_file_prefix(const ZigTarget *target) {...@@ -779,7 +779,7 @@ const char *target_lib_file_prefix(const ZigTarget *target) {
779 }779 }
780}780}
781781
782const char *target_lib_file_ext(const ZigTarget *target, bool is_static,782const char *target_lib_file_ext(const ZigTarget *target, bool is_static, bool is_versioned,
783 size_t version_major, size_t version_minor, size_t version_patch)783 size_t version_major, size_t version_minor, size_t version_patch)
784{784{
785 if (target_is_wasm(target)) {785 if (target_is_wasm(target)) {
...@@ -799,11 +799,19 @@ const char *target_lib_file_ext(const ZigTarget *target, bool is_static,...@@ -799,11 +799,19 @@ const char *target_lib_file_ext(const ZigTarget *target, bool is_static,
799 if (is_static) {799 if (is_static) {
800 return ".a";800 return ".a";
801 } else if (target_os_is_darwin(target->os)) {801 } else if (target_os_is_darwin(target->os)) {
802 return buf_ptr(buf_sprintf(".%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".dylib",802 if (is_versioned) {
803 version_major, version_minor, version_patch));803 return buf_ptr(buf_sprintf(".%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".dylib",
804 version_major, version_minor, version_patch));
805 } else {
806 return ".dylib";
807 }
804 } else {808 } else {
805 return buf_ptr(buf_sprintf(".so.%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".%" ZIG_PRI_usize,809 if (is_versioned) {
806 version_major, version_minor, version_patch));810 return buf_ptr(buf_sprintf(".so.%" ZIG_PRI_usize ".%" ZIG_PRI_usize ".%" ZIG_PRI_usize,
811 version_major, version_minor, version_patch));
812 } else {
813 return ".so";
814 }
807 }815 }
808 }816 }
809}817}
src/target.hpp+1-1
...@@ -87,7 +87,7 @@ const char *target_asm_file_ext(const ZigTarget *target);...@@ -87,7 +87,7 @@ const char *target_asm_file_ext(const ZigTarget *target);
87const char *target_llvm_ir_file_ext(const ZigTarget *target);87const char *target_llvm_ir_file_ext(const ZigTarget *target);
88const char *target_exe_file_ext(const ZigTarget *target);88const char *target_exe_file_ext(const ZigTarget *target);
89const char *target_lib_file_prefix(const ZigTarget *target);89const char *target_lib_file_prefix(const ZigTarget *target);
90const char *target_lib_file_ext(const ZigTarget *target, bool is_static,90const char *target_lib_file_ext(const ZigTarget *target, bool is_static, bool is_versioned,
91 size_t version_major, size_t version_minor, size_t version_patch);91 size_t version_major, size_t version_minor, size_t version_patch);
9292
93bool target_can_exec(const ZigTarget *host_target, const ZigTarget *guest_target);93bool target_can_exec(const ZigTarget *host_target, const ZigTarget *guest_target);