const std = @import("std"); pub fn build(b: *std.Build) void { const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); const lib = b.addStaticLibrary(.{ .name = "xcb-zig", .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(.{ .files = &.{ "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", }, .flags = &.{ "-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(.{ .files = &.{ "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 = 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(.{ .files = &.{ "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", // libxcb-render-util "depends/libxcb-render-util/xcb/cache.c", "depends/libxcb-render-util/xcb/glyph.c", "depends/libxcb-render-util/xcb/util.c", }, .flags = &.{ "-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; }