Add standalone test for interdep C archives

Tests a scenario where the linker line has the following:

```
main.o libA.a libB.a
```

where `main.o` pulls a symbol from `libB.a`, which in turn is
dependent on a symbol from `libA.a`.
This commit is contained in:
Jakub Konka 2021-04-13 13:32:59 +02:00
parent a5bbc66f10
commit 65e4725aba
7 changed files with 47 additions and 0 deletions

View file

@ -16,6 +16,7 @@ pub fn addCases(cases: *tests.StandaloneContext) void {
cases.addBuildFile("test/standalone/mix_o_files/build.zig");
cases.addBuildFile("test/standalone/global_linkage/build.zig");
cases.addBuildFile("test/standalone/static_c_lib/build.zig");
cases.addBuildFile("test/standalone/link_interdependent_static_c_libs/build.zig");
cases.addBuildFile("test/standalone/issue_339/build.zig");
cases.addBuildFile("test/standalone/issue_794/build.zig");
cases.addBuildFile("test/standalone/issue_5825/build.zig");

View file

@ -0,0 +1,4 @@
#include "a.h"
int32_t add(int32_t a, int32_t b) {
return a + b;
}

View file

@ -0,0 +1,2 @@
#include <stdint.h>
int32_t add(int32_t a, int32_t b);

View file

@ -0,0 +1,6 @@
#include "a.h"
#include "b.h"
int32_t sub(int32_t a, int32_t b) {
return add(a, -1 * b);
}

View file

@ -0,0 +1,2 @@
#include <stdint.h>
int32_t sub(int32_t a, int32_t b);

View file

@ -0,0 +1,24 @@
const Builder = @import("std").build.Builder;
pub fn build(b: *Builder) void {
const mode = b.standardReleaseOptions();
const lib_a = b.addStaticLibrary("a", null);
lib_a.addCSourceFile("a.c", &[_][]const u8{});
lib_a.setBuildMode(mode);
lib_a.addIncludeDir(".");
const lib_b = b.addStaticLibrary("b", null);
lib_b.addCSourceFile("b.c", &[_][]const u8{});
lib_b.setBuildMode(mode);
lib_b.addIncludeDir(".");
const test_exe = b.addTest("main.zig");
test_exe.setBuildMode(mode);
test_exe.linkLibrary(lib_a);
test_exe.linkLibrary(lib_b);
test_exe.addIncludeDir(".");
const test_step = b.step("test", "Test it");
test_step.dependOn(&test_exe.step);
}

View file

@ -0,0 +1,8 @@
const std = @import("std");
const expect = std.testing.expect;
const c = @cImport(@cInclude("b.h"));
test "import C sub" {
const result = c.sub(2, 1);
expect(result == 1);
}