yaes/deps/libusb/build.zig

156 lines
5.3 KiB
Zig
Raw Normal View History

const std = @import("std");
pub fn build(b: *std.Build) !void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const use_udev = b.option(
bool,
"use_udev",
"link and use udev (Linux only. Default: false)",
) orelse false;
const libusb = b.addStaticLibrary(.{
.name = "usb",
.target = target,
.optimize = optimize,
.link_libc = true,
});
b.installArtifact(libusb);
libusb.addCSourceFiles(.{ .files = main_sources });
libusb.addIncludePath(b.path("libusb"));
libusb.installHeader(b.path("libusb/libusb.h"), "libusb-1.0/libusb.h");
switch (target.result.os.tag) {
.linux => {
libusb.addCSourceFiles(.{ .files = posix_sources });
libusb.addCSourceFiles(.{ .files = linux_sources });
if (use_udev) {
libusb.addCSourceFiles(.{ .files = linux_udev });
libusb.linkSystemLibrary("libudev");
} else {
libusb.addCSourceFiles(.{ .files = linux_netlink });
}
},
.windows => {
libusb.addCSourceFiles(.{ .files = windows_sources });
},
else => {
if (target.result.isDarwin()) {
libusb.addCSourceFiles(.{ .files = posix_sources });
libusb.addCSourceFiles(.{ .files = macos_sources });
libusb.linkFramework("CoreFoundation");
libusb.linkFramework("IOKit");
libusb.linkFramework("Security");
} else {
std.debug.print("Unsupported target OS {s}\n", .{@tagName(target.result.os.tag)});
return error.Unsupported;
}
},
}
const linux_target = target.result.os.tag == .linux;
const win_target = target.result.os.tag == .windows;
const mac_target = target.result.isDarwin();
const config_h = b.addConfigHeader(
.{ .style = .{ .autoconf = b.path("config.h.in") } },
.{
.DEFAULT_VISIBILITY = .@"__attribute__ ((visibility (\"default\")))",
.ENABLE_DEBUG_LOGGING = oneOrNull(optimize == .Debug),
.ENABLE_LOGGING = oneOrNull(optimize == .Debug),
.HAVE_ASM_TYPES_H = null,
.HAVE_CLOCK_GETTIME = oneOrNull(linux_target),
.HAVE_DECL_EFD_CLOEXEC = oneOrNull(linux_target),
.HAVE_DECL_EFD_NONBLOCK = oneOrNull(linux_target),
.HAVE_DECL_TFD_CLOEXEC = oneOrNull(linux_target),
.HAVE_DECL_TFD_NONBLOCK = oneOrNull(linux_target),
.HAVE_DLFCN_H = oneOrNull(linux_target or mac_target),
.HAVE_EVENTFD = oneOrNull(linux_target),
.HAVE_INTTYPES_H = oneOrNull(linux_target or mac_target),
.HAVE_IOKIT_USB_IOUSBHOSTFAMILYDEFINITIONS_H = oneOrNull(mac_target),
.HAVE_LIBUDEV = oneOrNull(linux_target and use_udev),
.HAVE_NFDS_T = oneOrNull(linux_target or mac_target),
.HAVE_PIPE2 = oneOrNull(linux_target),
.HAVE_PTHREAD_CONDATTR_SETCLOCK = oneOrNull(linux_target),
.HAVE_PTHREAD_SETNAME_NP = oneOrNull(linux_target),
.HAVE_PTHREAD_THREADID_NP = oneOrNull(mac_target),
.HAVE_STDINT_H = 1,
.HAVE_STDIO_H = 1,
.HAVE_STDLIB_H = 1,
.HAVE_STRINGS_H = 1,
.HAVE_STRING_H = 1,
.HAVE_STRUCT_TIMESPEC = null,
.HAVE_SYSLOG = null,
.HAVE_SYS_STAT_H = 1,
.HAVE_SYS_TIME_H = 1,
.HAVE_SYS_TYPES_H = 1,
.HAVE_TIMERFD = oneOrNull(linux_target),
.HAVE_UNISTD_H = 1,
.LT_OBJDIR = null,
.PACKAGE = "libusb-1.0",
.PACKAGE_BUGREPORT = "libusb-devel@lists.sourceforge.net",
.PACKAGE_NAME = "libusb-1.0",
.PACKAGE_STRING = "libusb-1.0 1.0.27",
.PACKAGE_TARNAME = "libusb-1.0",
.PACKAGE_URL = "https://libusb.info",
.PACKAGE_VERSION = "1.0.27",
.PLATFORM_POSIX = oneOrNull(linux_target or mac_target),
.PLATFORM_WINDOWS = oneOrNull(win_target),
.STDC_HEADERS = 1,
.UMOCKDEV_HOTPLUG = null,
.USE_SYSTEM_LOGGING_FACILITY = null,
.VERSION = "1.0.27",
._GNU_SOURCE = 1,
._WIN32_WINNT = null,
.@"inline" = null, // or __attribute__((always_inline))
},
);
libusb.addConfigHeader(config_h);
}
fn oneOrNull(exp: bool) ?u1 {
return if (exp) 1 else null;
}
const main_sources: []const []const u8 = &.{
"libusb/core.c",
"libusb/descriptor.c",
"libusb/hotplug.c",
"libusb/io.c",
"libusb/strerror.c",
"libusb/sync.c",
};
const posix_sources: []const []const u8 = &.{
"libusb/os/events_posix.c",
"libusb/os/threads_posix.c",
};
const linux_sources: []const []const u8 = &.{
"libusb/os/linux_usbfs.c",
};
const linux_netlink: []const []const u8 = &.{
"libusb/os/linux_netlink.c",
};
const linux_udev: []const []const u8 = &.{
"libusb/os/linux_udev.c",
};
const macos_sources: []const []const u8 = &.{
"libusb/os/darwin_usb.c",
};
const windows_sources: []const []const u8 = &.{
"libusb/os/windows_common.c",
"libusb/os/windows_usbdk.c",
"libusb/os/windows_winusb.c",
"libusb/os/threads_windows.c",
"libusb/os/events_windows.c",
};