Hey everyone.
I’m using cmake to build binaryen and create a a
file. And I want to link it with Zig library to build a nicer interface.
I successfully linked binaryen to an exe (see the repo).
I’m unable to understand how to create a static library with binaryen in it.
Are there any guides I can read about Zig build system?
Disclaimer
I’m very new to zig and c.
Repo: GitHub - Tzelon/binaryenzig
Thank you.
Hello @Tzelon Welcome to ziggit
There is the official: Zig Build System
and the ziggit documentation page: Build system tricks
see:
1 Like
Hey @dimdin , thank you for the links.
I found out what was the problem. it was an issue in v0.12.0
opened 01:08AM - 21 Apr 24 UTC
closed 04:27PM - 25 Apr 24 UTC
bug
os-macos
linking
### Zig Version
0.13.0-dev.7+40118c769
### Steps to Reproduce and Observed Beh… avior
I am using a fork of zig-bootstrap and when I try to link LLVM in debug mode I get the following error:
The fork used: https://github.com/birth-software/zig-bootstrap/tree/make-script-more-configurable
```zig
/Users/david/dev/zig/build-debug/stage3/bin/zig c++ -fno-sanitize=all -s -target aarch64-macos-none -mcpu=apple_m1 -fPIC -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.4.sdk -Wl,-headerpad_max_install_names -static -Wl,--color-diagnostics utils/TableGen/CMakeFiles/obj.LLVMTableGenCommon.dir/Attributes.cpp.o utils/TableGen/CMakeFiles/obj.LLVMTableGenCommon.dir/CodeGenIntrinsics.cpp.o utils/TableGen/CMakeFiles/obj.LLVMTableGenCommon.dir/DirectiveEmitter.cpp.o utils/TableGen/CMakeFiles/obj.LLVMTableGenCommon.dir/IntrinsicEmitter.cpp.o utils/TableGen/CMakeFiles/obj.LLVMTableGenCommon.dir/RISCVTargetDefEmitter.cpp.o utils/TableGen/CMakeFiles/obj.LLVMTableGenCommon.dir/SDNodeProperties.cpp.o utils/TableGen/CMakeFiles/obj.LLVMTableGenCommon.dir/VTEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/AsmMatcherEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/AsmWriterEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/AsmWriterInst.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/CTagsEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/CallingConvEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/CodeEmitterGen.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/CodeGenDAGPatterns.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/CodeGenHwModes.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/CodeGenInstAlias.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/CodeGenInstruction.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/CodeGenMapTable.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/CodeGenRegisters.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/CodeGenSchedule.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/CodeGenTarget.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/DAGISelEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/DAGISelMatcherEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/DAGISelMatcherGen.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/DAGISelMatcherOpt.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/DAGISelMatcher.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/DecoderEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/DFAEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/DFAPacketizerEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/DisassemblerEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/DXILEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/ExegesisEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/FastISelEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/GICombinerEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/GlobalISelCombinerMatchTableEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/GlobalISelEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/GlobalISelMatchTable.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/GlobalISelMatchTableExecutorEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/InfoByHwMode.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/InstrInfoEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/InstrDocsEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/OptEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/OptParserEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/OptRSTEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/PredicateExpander.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/PseudoLoweringEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/CompressInstEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/RegisterBankEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/RegisterInfoEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/SearchableTableEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/SubtargetEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/SubtargetFeatureInfo.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/TableGen.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/Types.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/VarLenCodeEmitterGen.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/X86DisassemblerTables.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/X86EVEX2VEXTablesEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/X86FoldTablesEmitter.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/X86MnemonicTables.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/X86ModRMFilters.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/X86RecognizableInstr.cpp.o utils/TableGen/CMakeFiles/llvm-tblgen.dir/WebAssemblyDisassemblerEmitter.cpp.o -o bin/llvm-tblgen -Wl,-rpath,@loader_path/../lib lib/libLLVMCodeGenTypes.a lib/libLLVMSupport.a lib/libLLVMTableGen.a lib/libLLVMTableGenGlobalISel.a lib/libLLVMCodeGenTypes.a lib/libLLVMTableGen.a lib/libLLVMSupport.a -lm /Users/david/dev/zig-bootstrap/out/aarch64-macos-none-apple_m1-debug-static/lib/libz.a /Users/david/dev/zig-bootstrap/out/aarch64-macos-none-apple_m1-debug-static/lib/libzstd.a lib/libLLVMDemangle.a
error: Overflow
/Users/david/dev/zig/src/link/aarch64.zig:31:56: 0x10d7aee5f in calcNumberOfPages (zig)
const pages = math.cast(i21, tpage - spage) orelse return error.Overflow;
^
/Users/david/dev/zig/src/link/MachO/Atom.zig:773:45: 0x10d82a667 in resolveRelocInner__anon_84207 (zig)
const pages = @as(u21, @bitCast(try aarch64.calcNumberOfPages(source, target)));
^
/Users/david/dev/zig/src/link/MachO/Atom.zig:584:29: 0x10d8262d3 in resolveRelocs (zig)
else => |e| return e,
^
/Users/david/dev/zig/src/link/MachO.zig:2563:29: 0x10d82bd77 in writeAtoms (zig)
else => |e| return e,
^
/Users/david/dev/zig/src/link/MachO.zig:638:13: 0x10d432a4f in flushModule (zig)
return e;
^
/Users/david/dev/zig/src/link/MachO.zig:361:5: 0x10d109e4b in flush (zig)
try self.flushModule(arena, prog_node);
^
/Users/david/dev/zig/src/link.zig:566:17: 0x10ce97c3b in flush (zig)
return @as(*tag.Type(), @fieldParentPtr("base", base)).flush(arena, prog_node);
^
/Users/david/dev/zig/src/Compilation.zig:2265:25: 0x10ce97253 in flush (zig)
else => |e| return e,
^
/Users/david/dev/zig/src/Compilation.zig:2253:13: 0x10ce9a54f in update (zig)
try flush(comp, arena, main_progress_node);
^
/Users/david/dev/zig/src/main.zig:4483:9: 0x10cec6dbb in updateModule (zig)
try comp.update(main_progress_node);
^
/Users/david/dev/zig/src/main.zig:3411:21: 0x10cf2aa87 in buildOutputType (zig)
else => |e| return e,
^
/Users/david/dev/zig/src/main.zig:291:9: 0x10cd95ba7 in mainArgs (zig)
return buildOutputType(gpa, arena, args, .cpp);
^
/Users/david/dev/zig/src/main.zig:206:5: 0x10cd926eb in main (zig)
return mainArgs(gpa, arena, args);
^
```
### Expected Behavior
To link successfully.
Upgrading to v0.13.0-* fixed it.
I’m able to build the lib, but I have a few questions
** I took inspiration from zig-cli/build.zig at main · sam701/zig-cli · GitHub
my understanding of modules is that they are zig “packages” I want to import into my project.
using addModule
will add a named module to be used in @import
.
what is the root_module
I use in simple.root_module.addImport
?
what is the use of staticLibrary in this case?
why do I need to use linkSystemLibrary
? Is it not enough to give the include path and library path?
Here is the new build file
const std = @import("std");
pub fn build(b: *std.Build) !void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const module = b.addModule("binaryenzig", .{ .root_source_file = b.path("src/main.zig"), .target = target, .optimize = optimize, .link_libcpp = true });
module.addIncludePath(b.path("binaryen/src/"));
module.addLibraryPath(b.path("binaryen/lib/"));
// lib.addObjectFile(b.path("binaryen/lib/libbinaryen.a"));
module.linkSystemLibrary("binaryen", .{});
// module.linkLibCpp();
const lib = b.addStaticLibrary(.{
.name = "binaryenzig",
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
});
// lib.installHeadersDirectory(b.path("binaryen/src/"), "binaryen", .{});
lib.addIncludePath(b.path("binaryen/src/"));
lib.addLibraryPath(b.path("binaryen/lib/"));
// lib.addObjectFile(b.path("binaryen/lib/libbinaryen.a"));
lib.linkSystemLibrary("binaryen");
lib.linkLibCpp();
b.installArtifact(lib);
const simple = b.addExecutable(.{
.target = target,
.name = "simple",
.root_source_file = b.path("examples/simple.zig"),
.optimize = optimize,
});
simple.root_module.addImport("binaryenzig", module);
b.installArtifact(simple);
b.default_step.dependOn(&simple.step);
}
1 Like