From 80ab0233688c9df9fd48265b6f9e7ab7cd589dbc Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 19 Aug 2023 23:50:04 +0200 Subject: Initial commit --- build.zig | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 build.zig (limited to 'build.zig') diff --git a/build.zig b/build.zig new file mode 100644 index 0000000..0eaabc7 --- /dev/null +++ b/build.zig @@ -0,0 +1,184 @@ +const std = @import("std"); + +pub fn build(b: *std.Build) void { + const target = b.standardTargetOptions(.{}); + const optimize = b.standardOptimizeOption(.{}); + + const lib = b.addStaticLibrary(.{ + .name = "zig-xcb", + .target = target, + .optimize = optimize, + }); + + const single_threaded = true; + const libXcb = buildXcb(b, &target, optimize, single_threaded); + + lib.linkLibrary(libXcb); + lib.addIncludePath(.{ .path = "depends/libxcb/include" }); + lib.addIncludePath(.{ .path = "depends/libxcb-keysyms" }); + lib.addIncludePath(.{ .path = "depends/libxcb/depends/xorgproto/include" }); + lib.addIncludePath(.{ .path = "depends/libxcb-render-util" }); + lib.linkLibC(); + lib.strip = optimize != std.builtin.OptimizeMode.Debug; + lib.want_lto = optimize != std.builtin.OptimizeMode.Debug; + lib.single_threaded = single_threaded; + + lib.installHeadersDirectory("depends/libxcb/include", "."); + lib.installHeadersDirectoryOptions(.{ + .source_dir = .{ .path = "depends/libxcb-keysyms" }, + .install_dir = .header, + .install_subdir = ".", + .exclude_extensions = &.{ ".c" }, + }); + lib.installHeadersDirectoryOptions(.{ + .source_dir = .{ .path = "depends/libxcb-render-util" }, + .install_dir = .header, + .install_subdir = ".", + .exclude_extensions = &.{ ".c" }, + }); + lib.installHeadersDirectory("depends/libxcb/depends/xorgproto/include", "."); + b.installArtifact(lib); +} + +fn buildXau(b: *std.Build, target: *const std.zig.CrossTarget, optimize: std.builtin.OptimizeMode, single_threaded: bool) *std.Build.Step.Compile { + const lib = b.addStaticLibrary(.{ + .name = "libxau", + .target = target.*, + .optimize = optimize, + }); + + lib.addCSourceFiles(&[_][]const u8{ + "depends/libxcb/depends/libxau/AuDispose.c", + "depends/libxcb/depends/libxau/AuFileName.c", + "depends/libxcb/depends/libxau/AuGetAddr.c", + "depends/libxcb/depends/libxau/AuGetBest.c", + "depends/libxcb/depends/libxau/AuLock.c", + "depends/libxcb/depends/libxau/AuRead.c", + "depends/libxcb/depends/libxau/AuUnlock.c", + "depends/libxcb/depends/libxau/AuWrite.c", + }, &[_][]const u8{ + "-DHAVE_CONFIG_H", + }); + + lib.addIncludePath(.{ .path = "depends/libxcb/depends/libxau" }); + lib.addIncludePath(.{ .path = "depends/libxcb/depends/libxau/include" }); + lib.addIncludePath(.{ .path = "depends/libxcb/depends/libxdmcp/include" }); + lib.addIncludePath(.{ .path = "depends/libxcb/depends/xorgproto/include" }); + lib.linkLibC(); + lib.strip = optimize != std.builtin.OptimizeMode.Debug; + lib.want_lto = optimize != std.builtin.OptimizeMode.Debug; + lib.single_threaded = single_threaded; + + return lib; +} + +fn buildXdmcp(b: *std.Build, target: *const std.zig.CrossTarget, optimize: std.builtin.OptimizeMode, single_threaded: bool) *std.Build.Step.Compile { + const lib = b.addStaticLibrary(.{ + .name = "libxdmcp", + .target = target.*, + .optimize = optimize, + }); + + var flags = std.ArrayList([]const u8).init(b.allocator); + flags.append("-DHAVE_CONFIG_H") catch @panic("OOM"); + if (target.abi) |abi| { + if (abi.isMusl()) { + flags.append("-D__MUSL__") catch @panic("OOM"); + } + } + + lib.addCSourceFiles(&[_][]const u8{ + "depends/libxcb/depends/libxdmcp/Array.c", + "depends/libxcb/depends/libxdmcp/Fill.c", + "depends/libxcb/depends/libxdmcp/Flush.c", + "depends/libxcb/depends/libxdmcp/Key.c", + "depends/libxcb/depends/libxdmcp/Read.c", + "depends/libxcb/depends/libxdmcp/Unwrap.c", + "depends/libxcb/depends/libxdmcp/Wrap.c", + "depends/libxcb/depends/libxdmcp/Wraphelp.c", + "depends/libxcb/depends/libxdmcp/Write.c", + }, flags.items); + + lib.addIncludePath(.{ .path = "depends/libxcb/depends/libxdmcp" }); + lib.addIncludePath(.{ .path = "depends/libxcb/depends/libxdmcp/include" }); + lib.addIncludePath(.{ .path = "depends/libxcb/depends/xorgproto/include" }); + lib.linkLibC(); + lib.strip = optimize != std.builtin.OptimizeMode.Debug; + lib.want_lto = optimize != std.builtin.OptimizeMode.Debug; + lib.single_threaded = single_threaded; + + return lib; +} + +fn buildXcb(b: *std.Build, target: *const std.zig.CrossTarget, optimize: std.builtin.OptimizeMode, single_threaded: bool) *std.Build.Step.Compile { + const libXau = buildXau(b, target, optimize, single_threaded); + const libXdmcp = buildXdmcp(b, target, optimize, single_threaded); + + const libXcb = b.addStaticLibrary(.{ + .name = "libxcb", + .target = target.*, + .optimize = optimize, + }); + + libXcb.linkLibrary(libXau); + libXcb.linkLibrary(libXdmcp); + + libXcb.addCSourceFiles(&[_][]const u8{ + "depends/libxcb/src/bigreq.c", + "depends/libxcb/src/composite.c", + "depends/libxcb/src/damage.c", + "depends/libxcb/src/dpms.c", + "depends/libxcb/src/dri2.c", + "depends/libxcb/src/dri3.c", + "depends/libxcb/src/ge.c", + "depends/libxcb/src/glx.c", + "depends/libxcb/src/present.c", + "depends/libxcb/src/randr.c", + "depends/libxcb/src/record.c", + "depends/libxcb/src/render.c", + "depends/libxcb/src/res.c", + "depends/libxcb/src/screensaver.c", + "depends/libxcb/src/shape.c", + "depends/libxcb/src/shm.c", + "depends/libxcb/src/sync.c", + "depends/libxcb/src/xcb_auth.c", + "depends/libxcb/src/xcb_conn.c", + "depends/libxcb/src/xcb_ext.c", + "depends/libxcb/src/xcb_in.c", + "depends/libxcb/src/xcb_list.c", + "depends/libxcb/src/xcb_out.c", + "depends/libxcb/src/xcb_util.c", + "depends/libxcb/src/xcb_xid.c", + "depends/libxcb/src/xc_misc.c", + "depends/libxcb/src/xevie.c", + "depends/libxcb/src/xf86dri.c", + "depends/libxcb/src/xfixes.c", + "depends/libxcb/src/xinerama.c", + "depends/libxcb/src/xinput.c", + "depends/libxcb/src/xkb.c", + "depends/libxcb/src/xprint.c", + "depends/libxcb/src/xproto.c", + "depends/libxcb/src/xselinux.c", + "depends/libxcb/src/xtest.c", + "depends/libxcb/src/xv.c", + "depends/libxcb/src/xvmc.c", + + // libxcb-keysyms + "depends/libxcb-keysyms/xcb/keysyms.c", + }, &[_][]const u8{ + "-DHAVE_CONFIG_H", + }); + + libXcb.addIncludePath(.{ .path = "depends/libxcb/src" }); + libXcb.addIncludePath(.{ .path = "depends/libxcb/depends/libxau/include" }); + libXcb.addIncludePath(.{ .path = "depends/libxcb/depends/libxdmcp/include" }); + libXcb.addIncludePath(.{ .path = "depends/libxcb/depends/xorgproto/include" }); + libXcb.addIncludePath(.{ .path = "depends/libxcb/include/xcb" }); + libXcb.addIncludePath(.{ .path = "depends/libxcb/include" }); + libXcb.linkLibC(); + libXcb.strip = optimize != std.builtin.OptimizeMode.Debug; + libXcb.want_lto = optimize != std.builtin.OptimizeMode.Debug; + libXcb.single_threaded = single_threaded; + + return libXcb; +} -- cgit v1.2.3