aboutsummaryrefslogtreecommitdiff
path: root/build.zig
blob: ba6f638b0912a0d72adf416763f0164219a89487 (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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
const std = @import("std");

pub fn build(b: *std.Build) !void {
    const target = b.standardTargetOptions(.{});
    const optimize = b.standardOptimizeOption(.{});
    const single_threaded = true; // TODO: remove, inherit from parent

    var libxcb = try buildXcb(b, &target, optimize, single_threaded);

    libxcb.addIncludePath(.{ .path = "depends/libxcb/include" });
    libxcb.installHeadersDirectory("depends/libxcb/include", ".");

    libxcb.addIncludePath(.{ .path = "depends/libxcb/depends/xorgproto/include" });
    libxcb.installHeadersDirectory("depends/libxcb/depends/xorgproto/include", ".");

    const util_deps = [_][]const u8 {
        "depends/libxcb-keysyms",
        "depends/libxcb-render-util",
        "depends/libxcb-wm",
        "depends/libxcb-util",
        "depends/libxcb-image",
        "depends/libxcb-errors",
        "depends/libxcb-cursor",
    };

    for(&util_deps) |dep| {
        libxcb.addIncludePath(.{ .path = dep });
        libxcb.installHeadersDirectoryOptions(.{
            .source_dir = .{ .path = dep },
            .install_dir = .header,
            .install_subdir = ".",
            .exclude_extensions = &.{ ".c" },
        });
    }

    b.installArtifact(libxcb);
}

fn buildXau(b: *std.Build, target: *const std.Build.ResolvedTarget, optimize: std.builtin.OptimizeMode, single_threaded: bool) *std.Build.Step.Compile {
    const lib = b.addStaticLibrary(.{
        .name = "libxau",
        .target = target.*,
        .optimize = optimize,
        .strip = optimize != std.builtin.OptimizeMode.Debug,
        .single_threaded = single_threaded,
        .link_libc = true,
    });

    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.want_lto = optimize != std.builtin.OptimizeMode.Debug;

    return lib;
}

fn buildXdmcp(b: *std.Build, target: *const std.Build.ResolvedTarget, optimize: std.builtin.OptimizeMode, single_threaded: bool) !*std.Build.Step.Compile {
    const lib = b.addStaticLibrary(.{
        .name = "libxdmcp",
        .target = target.*,
        .optimize = optimize,
        .strip = optimize != std.builtin.OptimizeMode.Debug,
        .single_threaded = single_threaded,
        .link_libc = true,
    });

    var flags = std.ArrayList([]const u8).init(b.allocator);
    try flags.append("-DHAVE_CONFIG_H");
    if (target.query.abi) |abi| {
        if (abi.isMusl()) {
            try flags.append("-D__MUSL__");
        }
    }

    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.want_lto = optimize != std.builtin.OptimizeMode.Debug;

    return lib;
}

fn buildXcb(b: *std.Build, target: *const std.Build.ResolvedTarget, optimize: std.builtin.OptimizeMode, single_threaded: bool) !*std.Build.Step.Compile {
    const libXau = buildXau(b, target, optimize, single_threaded);
    const libXdmcp = try buildXdmcp(b, target, optimize, single_threaded);

    const libXcb = b.addStaticLibrary(.{
        .name = "xcb-zig",
        .target = target.*,
        .optimize = optimize,
        .strip = optimize != std.builtin.OptimizeMode.Debug,
        .single_threaded = single_threaded,
        .link_libc = true,
    });

    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",

            // libxcb-wm
            "depends/libxcb-wm/xcb/icccm.c",

            // libxcb-util
            "depends/libxcb-util/xcb/event.c",
            "depends/libxcb-util/xcb/xcb_aux.c",
            "depends/libxcb-util/xcb/atoms.c",

            // libxcb-image
            "depends/libxcb-image/xcb/xcb_image.c",

            // libxcb-errors
            "depends/libxcb-errors/xcb/xcb_errors.c",

            // libxcb-cursor
            "depends/libxcb-cursor/xcb/parse_cursor_file.c",
            "depends/libxcb-cursor/xcb/load_cursor.c",
            "depends/libxcb-cursor/xcb/cursor.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.want_lto = optimize != std.builtin.OptimizeMode.Debug;

    return libXcb;
}