aboutsummaryrefslogtreecommitdiff
path: root/build.zig
blob: 647a4048b2a1039e4106840417a4236fc957658b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
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(&[_][]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",

        // libxcb-render-util
        "depends/libxcb-render-util/xcb/cache.c",
        "depends/libxcb-render-util/xcb/glyph.c",
        "depends/libxcb-render-util/xcb/util.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;
}