From 821e4bbe8b62d0149a4f764112797059cb57ad82 Mon Sep 17 00:00:00 2001 From: "J. Hinchliffe" Date: Sat, 7 Mar 2026 04:01:51 +0000 Subject: [PATCH 1/2] Update build script to work for 0.15.2/0.16.x master --- .gitignore | 1 + build.zig | 478 ++++++++++++++++++++++++++------------------------ build.zig.zon | 15 ++ 3 files changed, 263 insertions(+), 231 deletions(-) create mode 100644 build.zig.zon diff --git a/.gitignore b/.gitignore index 5da6064..0d86765 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ zig-cache +.zig-cache zig-out .vs .vscode \ No newline at end of file diff --git a/build.zig b/build.zig index 1094d60..414675f 100644 --- a/build.zig +++ b/build.zig @@ -1,231 +1,247 @@ -const std = @import("std"); - -pub fn build(b: *std.build.Builder) void { - const target = b.standardTargetOptions(.{}); - const optimize = b.standardOptimizeOption(.{}); - - const lib = b.addStaticLibrary(.{ - .name = "cryptopp", - .target = target, - .optimize = optimize, - }); - - lib.linkLibCpp(); - - lib.addIncludePath("include"); - - const cryptopp_Sources = &[_][]const u8 { - "src/3way.cpp", - "src/adler32.cpp", - "src/algebra.cpp", - "src/algparam.cpp", - "src/allocate.cpp", - "src/arc4.cpp", - "src/aria.cpp", - "src/ariatab.cpp", - "src/aria_simd.cpp", - "src/asn.cpp", - "src/authenc.cpp", - "src/base32.cpp", - "src/base64.cpp", - "src/basecode.cpp", - "src/bench1.cpp", - "src/bench2.cpp", - "src/bench3.cpp", - "src/bfinit.cpp", - "src/blake2.cpp", - "src/blake2b_simd.cpp", - "src/blake2s_simd.cpp", - "src/blowfish.cpp", - "src/blumshub.cpp", - "src/camellia.cpp", - "src/cast.cpp", - "src/casts.cpp", - "src/cbcmac.cpp", - "src/ccm.cpp", - "src/chacha.cpp", - "src/chachapoly.cpp", - "src/chacha_avx.cpp", - "src/chacha_simd.cpp", - "src/cham.cpp", - "src/cham_simd.cpp", - "src/channels.cpp", - "src/cmac.cpp", - "src/cpu.cpp", - "src/crc.cpp", - "src/crc_simd.cpp", - "src/cryptlib.cpp", - "src/darn.cpp", - "src/datatest.cpp", - "src/default.cpp", - "src/des.cpp", - "src/dessp.cpp", - "src/dh.cpp", - "src/dh2.cpp", - "src/dll.cpp", - "src/dlltest.cpp", - "src/donna_32.cpp", - "src/donna_64.cpp", - "src/donna_sse.cpp", - "src/dsa.cpp", - "src/eax.cpp", - "src/ec2n.cpp", - "src/eccrypto.cpp", - "src/ecp.cpp", - "src/elgamal.cpp", - "src/emsa2.cpp", - "src/eprecomp.cpp", - "src/esign.cpp", - "src/files.cpp", - "src/filters.cpp", - "src/fips140.cpp", - "src/fipsalgt.cpp", - "src/fipstest.cpp", - "src/gcm.cpp", - "src/gcm_simd.cpp", - "src/gf256.cpp", - "src/gf2n.cpp", - "src/gf2n_simd.cpp", - "src/gf2_32.cpp", - "src/gfpcrypt.cpp", - "src/gost.cpp", - "src/gzip.cpp", - "src/hc128.cpp", - "src/hc256.cpp", - "src/hex.cpp", - "src/hight.cpp", - "src/hmac.cpp", - "src/hrtimer.cpp", - "src/ida.cpp", - "src/idea.cpp", - "src/integer.cpp", - "src/iterhash.cpp", - "src/kalyna.cpp", - "src/kalynatab.cpp", - "src/keccak.cpp", - "src/keccak_core.cpp", - "src/keccak_simd.cpp", - "src/lea.cpp", - "src/lea_simd.cpp", - "src/lsh256.cpp", - "src/lsh256_avx.cpp", - "src/lsh256_sse.cpp", - "src/lsh512.cpp", - "src/lsh512_avx.cpp", - "src/lsh512_sse.cpp", - "src/luc.cpp", - "src/mars.cpp", - "src/marss.cpp", - "src/md2.cpp", - "src/md4.cpp", - "src/md5.cpp", - "src/misc.cpp", - "src/modes.cpp", - "src/mqueue.cpp", - "src/mqv.cpp", - "src/nbtheory.cpp", - "src/neon_simd.cpp", - "src/oaep.cpp", - "src/osrng.cpp", - "src/padlkrng.cpp", - "src/panama.cpp", - "src/pch.cpp", - "src/pkcspad.cpp", - "src/poly1305.cpp", - "src/polynomi.cpp", - "src/power7_ppc.cpp", - "src/power8_ppc.cpp", - "src/power9_ppc.cpp", - "src/ppc_simd.cpp", - "src/primetab.cpp", - "src/pssr.cpp", - "src/pubkey.cpp", - "src/queue.cpp", - "src/rabbit.cpp", - "src/rabin.cpp", - "src/randpool.cpp", - "src/rc2.cpp", - "src/rc5.cpp", - "src/rc6.cpp", - "src/rdrand.cpp", - "src/rdtables.cpp", - "src/regtest1.cpp", - "src/regtest2.cpp", - "src/regtest3.cpp", - "src/regtest4.cpp", - "src/rijndael.cpp", - "src/rijndael_simd.cpp", - "src/ripemd.cpp", - "src/rng.cpp", - "src/rsa.cpp", - "src/rw.cpp", - "src/safer.cpp", - "src/salsa.cpp", - "src/scrypt.cpp", - "src/seal.cpp", - "src/seed.cpp", - "src/serpent.cpp", - "src/sha.cpp", - "src/sha3.cpp", - "src/shacal2.cpp", - "src/shacal2_simd.cpp", - "src/shake.cpp", - "src/shark.cpp", - "src/sharkbox.cpp", - "src/sha_simd.cpp", - "src/simeck.cpp", - "src/simon.cpp", - "src/simon128_simd.cpp", - "src/simple.cpp", - "src/skipjack.cpp", - "src/sm3.cpp", - "src/sm4.cpp", - "src/sm4_simd.cpp", - "src/sosemanuk.cpp", - "src/speck.cpp", - "src/speck128_simd.cpp", - "src/square.cpp", - "src/squaretb.cpp", - "src/sse_simd.cpp", - "src/strciphr.cpp", - "src/tea.cpp", - "src/test.cpp", - "src/tftables.cpp", - "src/threefish.cpp", - "src/tiger.cpp", - "src/tigertab.cpp", - "src/ttmac.cpp", - "src/tweetnacl.cpp", - "src/twofish.cpp", - "src/validat0.cpp", - "src/validat1.cpp", - "src/validat10.cpp", - "src/validat2.cpp", - "src/validat3.cpp", - "src/validat4.cpp", - "src/validat5.cpp", - "src/validat6.cpp", - "src/validat7.cpp", - "src/validat8.cpp", - "src/validat9.cpp", - "src/vmac.cpp", - "src/wake.cpp", - "src/whrlpool.cpp", - "src/xed25519.cpp", - "src/xtr.cpp", - "src/xtrcrypt.cpp", - "src/xts.cpp", - "src/zdeflate.cpp", - "src/zinflate.cpp", - "src/zlib.cpp", - }; - - const cryptopp_Flags = &[_][]const u8 { - "-std=c++11", - }; - - lib.addCSourceFiles(cryptopp_Sources, cryptopp_Flags); - - lib.installHeadersDirectory("include", "cryptopp"); - b.installArtifact(lib); -} \ No newline at end of file +const std = @import("std"); + +pub fn build(b: *std.Build) void { + const target = b.standardTargetOptions(.{}); + const optimize = b.standardOptimizeOption(.{}); + + const lib_mod = b.addModule("cryptopp", .{ + .optimize = optimize, + .target = target, + .link_libcpp = true, + .strip = true, + }); + + const lib = b.addLibrary(.{ + .linkage = .static, + .name = "cryptopp", + .use_llvm = false, + .root_module = lib_mod, + }); + + lib.root_module.addIncludePath(b.path("include")); + + const cryptopp_sources = &[_][]const u8{ + "src/3way.cpp", + "src/adler32.cpp", + "src/algebra.cpp", + "src/algparam.cpp", + "src/allocate.cpp", + "src/arc4.cpp", + "src/aria.cpp", + "src/ariatab.cpp", + "src/aria_simd.cpp", + "src/asn.cpp", + "src/authenc.cpp", + "src/base32.cpp", + "src/base64.cpp", + "src/basecode.cpp", + "src/bench1.cpp", + "src/bench2.cpp", + "src/bench3.cpp", + "src/bfinit.cpp", + "src/blake2.cpp", + "src/blake2b_simd.cpp", + "src/blake2s_simd.cpp", + "src/blowfish.cpp", + "src/blumshub.cpp", + "src/camellia.cpp", + "src/cast.cpp", + "src/casts.cpp", + "src/cbcmac.cpp", + "src/ccm.cpp", + "src/chacha.cpp", + "src/chachapoly.cpp", + "src/chacha_avx.cpp", + "src/chacha_simd.cpp", + "src/cham.cpp", + "src/cham_simd.cpp", + "src/channels.cpp", + "src/cmac.cpp", + "src/cpu.cpp", + "src/crc.cpp", + "src/crc_simd.cpp", + "src/cryptlib.cpp", + "src/darn.cpp", + "src/datatest.cpp", + "src/default.cpp", + "src/des.cpp", + "src/dessp.cpp", + "src/dh.cpp", + "src/dh2.cpp", + "src/dll.cpp", + "src/dlltest.cpp", + "src/donna_32.cpp", + "src/donna_64.cpp", + "src/donna_sse.cpp", + "src/dsa.cpp", + "src/eax.cpp", + "src/ec2n.cpp", + "src/eccrypto.cpp", + "src/ecp.cpp", + "src/elgamal.cpp", + "src/emsa2.cpp", + "src/eprecomp.cpp", + "src/esign.cpp", + "src/files.cpp", + "src/filters.cpp", + "src/fips140.cpp", + "src/fipsalgt.cpp", + "src/fipstest.cpp", + "src/gcm.cpp", + "src/gcm_simd.cpp", + "src/gf256.cpp", + "src/gf2n.cpp", + "src/gf2n_simd.cpp", + "src/gf2_32.cpp", + "src/gfpcrypt.cpp", + "src/gost.cpp", + "src/gzip.cpp", + "src/hc128.cpp", + "src/hc256.cpp", + "src/hex.cpp", + "src/hight.cpp", + "src/hmac.cpp", + "src/hrtimer.cpp", + "src/ida.cpp", + "src/idea.cpp", + "src/integer.cpp", + "src/iterhash.cpp", + "src/kalyna.cpp", + "src/kalynatab.cpp", + "src/keccak.cpp", + "src/keccak_core.cpp", + "src/keccak_simd.cpp", + "src/lea.cpp", + "src/lea_simd.cpp", + "src/lsh256.cpp", + "src/lsh256_avx.cpp", + "src/lsh256_sse.cpp", + "src/lsh512.cpp", + "src/lsh512_avx.cpp", + "src/lsh512_sse.cpp", + "src/luc.cpp", + "src/mars.cpp", + "src/marss.cpp", + "src/md2.cpp", + "src/md4.cpp", + "src/md5.cpp", + "src/misc.cpp", + "src/modes.cpp", + "src/mqueue.cpp", + "src/mqv.cpp", + "src/nbtheory.cpp", + "src/neon_simd.cpp", + "src/oaep.cpp", + "src/osrng.cpp", + "src/padlkrng.cpp", + "src/panama.cpp", + "src/pch.cpp", + "src/pkcspad.cpp", + "src/poly1305.cpp", + "src/polynomi.cpp", + "src/power7_ppc.cpp", + "src/power8_ppc.cpp", + "src/power9_ppc.cpp", + "src/ppc_simd.cpp", + "src/primetab.cpp", + "src/pssr.cpp", + "src/pubkey.cpp", + "src/queue.cpp", + "src/rabbit.cpp", + "src/rabin.cpp", + "src/randpool.cpp", + "src/rc2.cpp", + "src/rc5.cpp", + "src/rc6.cpp", + "src/rdrand.cpp", + "src/rdtables.cpp", + "src/regtest1.cpp", + "src/regtest2.cpp", + "src/regtest3.cpp", + "src/regtest4.cpp", + "src/rijndael.cpp", + "src/rijndael_simd.cpp", + "src/ripemd.cpp", + "src/rng.cpp", + "src/rsa.cpp", + "src/rw.cpp", + "src/safer.cpp", + "src/salsa.cpp", + "src/scrypt.cpp", + "src/seal.cpp", + "src/seed.cpp", + "src/serpent.cpp", + "src/sha.cpp", + "src/sha3.cpp", + "src/shacal2.cpp", + "src/shacal2_simd.cpp", + "src/shake.cpp", + "src/shark.cpp", + "src/sharkbox.cpp", + "src/sha_simd.cpp", + "src/simeck.cpp", + "src/simon.cpp", + "src/simon128_simd.cpp", + "src/simple.cpp", + "src/skipjack.cpp", + "src/sm3.cpp", + "src/sm4.cpp", + "src/sm4_simd.cpp", + "src/sosemanuk.cpp", + "src/speck.cpp", + "src/speck128_simd.cpp", + "src/square.cpp", + "src/squaretb.cpp", + "src/sse_simd.cpp", + "src/strciphr.cpp", + "src/tea.cpp", + "src/test.cpp", + "src/tftables.cpp", + "src/threefish.cpp", + "src/tiger.cpp", + "src/tigertab.cpp", + "src/ttmac.cpp", + "src/tweetnacl.cpp", + "src/twofish.cpp", + "src/validat0.cpp", + "src/validat1.cpp", + "src/validat10.cpp", + "src/validat2.cpp", + "src/validat3.cpp", + "src/validat4.cpp", + "src/validat5.cpp", + "src/validat6.cpp", + "src/validat7.cpp", + "src/validat8.cpp", + "src/validat9.cpp", + "src/vmac.cpp", + "src/wake.cpp", + "src/whrlpool.cpp", + "src/xed25519.cpp", + "src/xtr.cpp", + "src/xtrcrypt.cpp", + "src/xts.cpp", + "src/zdeflate.cpp", + "src/zinflate.cpp", + "src/zlib.cpp", + }; + + const cryptopp_flags = &[_][]const u8{ + "-std=c++17", + "-fPIC", + "-fno-devirtualize", + "-pthread", + "-pipe", + if (optimize != .Debug) "-DNDEBUG" else "", + }; + + lib.root_module.addCSourceFiles(.{ + .files = cryptopp_sources, + .flags = cryptopp_flags, + .language = .cpp, + }); + + lib.installHeadersDirectory(b.path("include"), "cryptopp", .{}); + + b.installArtifact(lib); +} diff --git a/build.zig.zon b/build.zig.zon new file mode 100644 index 0000000..86bf915 --- /dev/null +++ b/build.zig.zon @@ -0,0 +1,15 @@ +.{ + .name = .cryptopp, + // This is a guess, since I am just updating build script from zigbuild/cryptopp. + .version = "8.8.0", + .fingerprint = 0x4da2b6e96c3901b2, + .minimum_zig_version = "0.15.2", // As checked by myself. + .dependencies = .{}, + .paths = .{ + "build.zig", + "build.zig.zon", + "src", + "License.txt", + "include", + }, +} From 18e3fc6f6f26aa34dbbc8a2c8e979f5a82bb7d3c Mon Sep 17 00:00:00 2001 From: "J. Hinchliffe" Date: Sat, 7 Mar 2026 05:16:53 +0000 Subject: [PATCH 2/2] Handle arch CPU extensions, script improvements Will test build on my desktop. --- build.zig | 206 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 142 insertions(+), 64 deletions(-) diff --git a/build.zig b/build.zig index 414675f..08fdd29 100644 --- a/build.zig +++ b/build.zig @@ -1,6 +1,6 @@ const std = @import("std"); -pub fn build(b: *std.Build) void { +pub fn build(b: *std.Build) !void { const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); @@ -14,13 +14,100 @@ pub fn build(b: *std.Build) void { const lib = b.addLibrary(.{ .linkage = .static, .name = "cryptopp", - .use_llvm = false, .root_module = lib_mod, }); lib.root_module.addIncludePath(b.path("include")); + lib.root_module.addIncludePath(b.path("src")); - const cryptopp_sources = &[_][]const u8{ + const is_x86 = target.result.cpu.arch == .x86_64 or target.result.cpu.arch == .x86; + + const common_flags = &[_][]const u8{ + "-std=c++17", + "-fPIC", + "-pipe", + if (optimize != .Debug) "-DNDEBUG" else "", + }; + + const sha_simd_files = &[_][]const u8{ + "src/sha_simd.cpp", + "src/shacal2_simd.cpp", + }; + const aes_simd_files = &[_][]const u8{ + "src/rijndael_simd.cpp", + "src/sm4_simd.cpp", + }; + const gcm_clmul_files = &[_][]const u8{ + "src/gcm_simd.cpp", + "src/gf2n_simd.cpp", + }; + const sse2_files = &[_][]const u8{ + "src/sse_simd.cpp", + "src/chacha_simd.cpp", + "src/donna_sse.cpp", + }; + const sse41_files = &[_][]const u8{ + "src/blake2b_simd.cpp", + "src/blake2s_simd.cpp", + "src/crc_simd.cpp", + "src/simon128_simd.cpp", + "src/speck128_simd.cpp", + "src/cham_simd.cpp", + "src/lea_simd.cpp", + "src/simeck.cpp", + "src/keccak_simd.cpp", + "src/aria_simd.cpp", + "src/lsh256_sse.cpp", + "src/lsh512_sse.cpp", + }; + const avx2_files = &[_][]const u8{ + "src/chacha_avx.cpp", + "src/lsh256_avx.cpp", + "src/lsh512_avx.cpp", + }; + + // Collect all SIMD filenames so we can exclude them from the main list + const all_simd_files = sha_simd_files ++ + aes_simd_files ++ + gcm_clmul_files ++ + sse2_files ++ + sse41_files ++ + avx2_files; + + if (is_x86) { + lib.root_module.addCSourceFiles(.{ + .files = sha_simd_files, + .flags = common_flags ++ &[_][]const u8{ "-msha", "-msse4.2" }, + .language = .cpp, + }); + lib.root_module.addCSourceFiles(.{ + .files = aes_simd_files, + .flags = common_flags ++ &[_][]const u8{ "-maes", "-msse4.1" }, + .language = .cpp, + }); + lib.root_module.addCSourceFiles(.{ + .files = gcm_clmul_files, + .flags = common_flags ++ &[_][]const u8{ "-mpclmul", "-msse4.1" }, + .language = .cpp, + }); + lib.root_module.addCSourceFiles(.{ + .files = sse2_files, + .flags = common_flags ++ &[_][]const u8{"-msse2"}, + .language = .cpp, + }); + lib.root_module.addCSourceFiles(.{ + .files = sse41_files, + .flags = common_flags ++ &[_][]const u8{"-msse4.1"}, + .language = .cpp, + }); + lib.root_module.addCSourceFiles(.{ + .files = avx2_files, + .flags = common_flags ++ &[_][]const u8{"-mavx2"}, + .language = .cpp, + }); + } + + const all_sources = &[_][]const u8{ "src/3way.cpp", "src/adler32.cpp", "src/algebra.cpp", @@ -29,19 +116,13 @@ pub fn build(b: *std.Build) void { "src/arc4.cpp", "src/aria.cpp", "src/ariatab.cpp", - "src/aria_simd.cpp", "src/asn.cpp", "src/authenc.cpp", "src/base32.cpp", "src/base64.cpp", "src/basecode.cpp", - "src/bench1.cpp", - "src/bench2.cpp", - "src/bench3.cpp", "src/bfinit.cpp", "src/blake2.cpp", - "src/blake2b_simd.cpp", - "src/blake2s_simd.cpp", "src/blowfish.cpp", "src/blumshub.cpp", "src/camellia.cpp", @@ -51,28 +132,21 @@ pub fn build(b: *std.Build) void { "src/ccm.cpp", "src/chacha.cpp", "src/chachapoly.cpp", - "src/chacha_avx.cpp", - "src/chacha_simd.cpp", "src/cham.cpp", - "src/cham_simd.cpp", "src/channels.cpp", "src/cmac.cpp", "src/cpu.cpp", "src/crc.cpp", - "src/crc_simd.cpp", "src/cryptlib.cpp", "src/darn.cpp", - "src/datatest.cpp", "src/default.cpp", "src/des.cpp", "src/dessp.cpp", "src/dh.cpp", "src/dh2.cpp", "src/dll.cpp", - "src/dlltest.cpp", "src/donna_32.cpp", "src/donna_64.cpp", - "src/donna_sse.cpp", "src/dsa.cpp", "src/eax.cpp", "src/ec2n.cpp", @@ -88,10 +162,8 @@ pub fn build(b: *std.Build) void { "src/fipsalgt.cpp", "src/fipstest.cpp", "src/gcm.cpp", - "src/gcm_simd.cpp", "src/gf256.cpp", "src/gf2n.cpp", - "src/gf2n_simd.cpp", "src/gf2_32.cpp", "src/gfpcrypt.cpp", "src/gost.cpp", @@ -110,15 +182,9 @@ pub fn build(b: *std.Build) void { "src/kalynatab.cpp", "src/keccak.cpp", "src/keccak_core.cpp", - "src/keccak_simd.cpp", "src/lea.cpp", - "src/lea_simd.cpp", "src/lsh256.cpp", - "src/lsh256_avx.cpp", - "src/lsh256_sse.cpp", "src/lsh512.cpp", - "src/lsh512_avx.cpp", - "src/lsh512_sse.cpp", "src/luc.cpp", "src/mars.cpp", "src/marss.cpp", @@ -130,7 +196,6 @@ pub fn build(b: *std.Build) void { "src/mqueue.cpp", "src/mqv.cpp", "src/nbtheory.cpp", - "src/neon_simd.cpp", "src/oaep.cpp", "src/osrng.cpp", "src/padlkrng.cpp", @@ -139,10 +204,6 @@ pub fn build(b: *std.Build) void { "src/pkcspad.cpp", "src/poly1305.cpp", "src/polynomi.cpp", - "src/power7_ppc.cpp", - "src/power8_ppc.cpp", - "src/power9_ppc.cpp", - "src/ppc_simd.cpp", "src/primetab.cpp", "src/pssr.cpp", "src/pubkey.cpp", @@ -155,12 +216,7 @@ pub fn build(b: *std.Build) void { "src/rc6.cpp", "src/rdrand.cpp", "src/rdtables.cpp", - "src/regtest1.cpp", - "src/regtest2.cpp", - "src/regtest3.cpp", - "src/regtest4.cpp", "src/rijndael.cpp", - "src/rijndael_simd.cpp", "src/ripemd.cpp", "src/rng.cpp", "src/rsa.cpp", @@ -174,28 +230,20 @@ pub fn build(b: *std.Build) void { "src/sha.cpp", "src/sha3.cpp", "src/shacal2.cpp", - "src/shacal2_simd.cpp", "src/shake.cpp", "src/shark.cpp", "src/sharkbox.cpp", - "src/sha_simd.cpp", - "src/simeck.cpp", "src/simon.cpp", - "src/simon128_simd.cpp", "src/simple.cpp", "src/skipjack.cpp", "src/sm3.cpp", "src/sm4.cpp", - "src/sm4_simd.cpp", "src/sosemanuk.cpp", "src/speck.cpp", - "src/speck128_simd.cpp", "src/square.cpp", "src/squaretb.cpp", - "src/sse_simd.cpp", "src/strciphr.cpp", "src/tea.cpp", - "src/test.cpp", "src/tftables.cpp", "src/threefish.cpp", "src/tiger.cpp", @@ -203,17 +251,6 @@ pub fn build(b: *std.Build) void { "src/ttmac.cpp", "src/tweetnacl.cpp", "src/twofish.cpp", - "src/validat0.cpp", - "src/validat1.cpp", - "src/validat10.cpp", - "src/validat2.cpp", - "src/validat3.cpp", - "src/validat4.cpp", - "src/validat5.cpp", - "src/validat6.cpp", - "src/validat7.cpp", - "src/validat8.cpp", - "src/validat9.cpp", "src/vmac.cpp", "src/wake.cpp", "src/whrlpool.cpp", @@ -226,22 +263,63 @@ pub fn build(b: *std.Build) void { "src/zlib.cpp", }; - const cryptopp_flags = &[_][]const u8{ - "-std=c++17", - "-fPIC", - "-fno-devirtualize", - "-pthread", - "-pipe", - if (optimize != .Debug) "-DNDEBUG" else "", - }; + // Filter out SIMD files from the main list (they're compiled above with special flags) + var main_sources = std.ArrayList([]const u8).empty; + defer main_sources.deinit(b.allocator); + + for (all_sources) |src| { + var is_simd = false; + for (all_simd_files) |simd| { + if (std.mem.eql(u8, src, simd)) { + is_simd = true; + break; + } + } + // On non-x86, SIMD files without arch guards should still compile + // with base flags (they have runtime guards). But the SHA/AES ones + // will fail, so skip them on non-x86. + if (!is_simd) { + try main_sources.append(b.allocator, src); + } else if (!is_x86) { + // On non-x86, skip x86 SIMD files entirely. + } + } lib.root_module.addCSourceFiles(.{ - .files = cryptopp_sources, - .flags = cryptopp_flags, + .files = main_sources.items, + .flags = common_flags, .language = .cpp, }); - lib.installHeadersDirectory(b.path("include"), "cryptopp", .{}); + const is_arm = target.result.cpu.arch == .aarch64 or target.result.cpu.arch == .arm; + const is_ppc = target.result.cpu.arch == .powerpc64 or target.result.cpu.arch == .powerpc64le or target.result.cpu.arch == .powerpc; + + if (is_arm) { + lib.root_module.addCSourceFiles(.{ + .files = &.{"src/neon_simd.cpp"}, + .flags = common_flags, + .language = .cpp, + }); + } + + if (is_ppc) { + lib.root_module.addCSourceFiles(.{ + .files = &.{ + "src/ppc_simd.cpp", + "src/power7_ppc.cpp", + "src/power8_ppc.cpp", + "src/power9_ppc.cpp", + }, + .flags = common_flags, + .language = .cpp, + }); + } + + lib.installHeadersDirectory( + b.path("include"), + "cryptopp", + .{}, + ); b.installArtifact(lib); }