diff --git a/build.zig b/build.zig index f42f9306..197c2b0c 100644 --- a/build.zig +++ b/build.zig @@ -4,71 +4,85 @@ const fmt = std.fmt; const fs = std.fs; const heap = std.heap; const mem = std.mem; +const LibExeObjStep = std.build.LibExeObjStep; pub fn build(b: *std.build.Builder) !void { + const src_path = "src/libsodium"; + const src_dir = try fs.Dir.openDir(fs.cwd(), src_path, .{ .iterate = true, .no_follow = true }); + var target = b.standardTargetOptions(.{}); var mode = b.standardReleaseOptions(); - const libsodium = b.addStaticLibrary("sodium", null); - libsodium.setTarget(target); - libsodium.setBuildMode(mode); - libsodium.install(); - if (mode != .Debug) { - libsodium.strip = true; - } - libsodium.linkLibC(); + const static = b.addStaticLibrary("sodium", null); + const shared = b.addSharedLibrary("sodium", null, .unversioned); + const libs = [_]*LibExeObjStep{ static, shared }; - libsodium.addIncludeDir("src/libsodium/include/sodium"); - libsodium.defineCMacro("CONFIGURED", "1"); - libsodium.defineCMacro("DEV_MODE", "1"); - libsodium.defineCMacro("_GNU_SOURCE", "1"); - libsodium.defineCMacro("HAVE_INLINE_ASM", "1"); - libsodium.defineCMacro("HAVE_TI_MODE", "1"); - libsodium.defineCMacro("HAVE_ATOMIC_OPS", "1"); + const prebuilt_version_file_path = "builds/msvc/version.h"; + const version_file_path = "include/sodium/version.h"; - switch (target.getCpuArch()) { - .x86_64 => { - libsodium.defineCMacro("HAVE_AMD64_ASM", "1"); - libsodium.defineCMacro("HAVE_AVX_ASM", "1"); - libsodium.defineCMacro("HAVE_CPUID", "1"); - libsodium.defineCMacro("HAVE_MMINTRIN_H", "1"); - libsodium.defineCMacro("HAVE_EMMINTRIN_H", "1"); - libsodium.defineCMacro("HAVE_PMMINTRIN_H", "1"); - }, - .aarch64, .aarch64_be => { - libsodium.defineCMacro("HAVE_ARMCRYTO", "1"); - }, - .wasm32, .wasm64 => { - libsodium.defineCMacro("__wasm__", "1"); - }, - else => {}, + if (src_dir.access(version_file_path, .{ .mode = .read_only })) {} else |_| { + try fs.cwd().copyFile(prebuilt_version_file_path, src_dir, version_file_path, .{}); } - switch (target.getOsTag()) { - .wasi => { - libsodium.defineCMacro("__wasi__", "1"); - }, - else => {}, - } + for (libs) |lib| { + lib.setTarget(target); + lib.setBuildMode(mode); + lib.install(); + if (mode != .Debug) { + lib.strip = true; + } + lib.linkLibC(); - const base = "src/libsodium"; - const dir = try fs.Dir.openDir(fs.cwd(), base, .{ .iterate = true, .no_follow = true }); - var allocator = heap.page_allocator; - var walker = try dir.walk(allocator); - while (try walker.next()) |entry| { - const name = entry.basename; - if (mem.endsWith(u8, name, ".c")) { - const full_path = try fmt.allocPrint(allocator, "{s}/{s}", .{ base, entry.path }); - libsodium.addCSourceFiles(&.{full_path}, &.{ - "-fvisibility=hidden", - "-fno-strict-aliasing", - "-fno-strict-overflow", - "-fwrapv", - "-flax-vector-conversions", - }); - } else if (mem.endsWith(u8, name, ".S")) { - const full_path = try fmt.allocPrint(allocator, "{s}/{s}", .{ base, entry.path }); - libsodium.addAssemblyFile(full_path); + lib.addIncludeDir("src/libsodium/include/sodium"); + lib.defineCMacro("CONFIGURED", "1"); + lib.defineCMacro("DEV_MODE", "1"); + lib.defineCMacro("_GNU_SOURCE", "1"); + lib.defineCMacro("HAVE_INLINE_ASM", "1"); + lib.defineCMacro("HAVE_TI_MODE", "1"); + lib.defineCMacro("HAVE_ATOMIC_OPS", "1"); + + switch (target.getCpuArch()) { + .x86_64 => { + lib.defineCMacro("HAVE_AMD64_ASM", "1"); + lib.defineCMacro("HAVE_AVX_ASM", "1"); + lib.defineCMacro("HAVE_CPUID", "1"); + lib.defineCMacro("HAVE_MMINTRIN_H", "1"); + lib.defineCMacro("HAVE_EMMINTRIN_H", "1"); + lib.defineCMacro("HAVE_PMMINTRIN_H", "1"); + }, + .aarch64, .aarch64_be => { + lib.defineCMacro("HAVE_ARMCRYTO", "1"); + }, + .wasm32, .wasm64 => { + lib.defineCMacro("__wasm__", "1"); + }, + else => {}, + } + + switch (target.getOsTag()) { + .wasi => { + lib.defineCMacro("__wasi__", "1"); + }, + else => {}, + } + + var allocator = heap.page_allocator; + var walker = try src_dir.walk(allocator); + while (try walker.next()) |entry| { + const name = entry.basename; + if (mem.endsWith(u8, name, ".c")) { + const full_path = try fmt.allocPrint(allocator, "{s}/{s}", .{ src_path, entry.path }); + lib.addCSourceFiles(&.{full_path}, &.{ + "-fvisibility=hidden", + "-fno-strict-aliasing", + "-fno-strict-overflow", + "-fwrapv", + "-flax-vector-conversions", + }); + } else if (mem.endsWith(u8, name, ".S")) { + const full_path = try fmt.allocPrint(allocator, "{s}/{s}", .{ src_path, entry.path }); + lib.addAssemblyFile(full_path); + } } } }