@@ -3,12 +3,28 @@ const Build = std.Build;
33const ResolvedTarget = Build .ResolvedTarget ;
44const OptimizeMode = std .builtin .OptimizeMode ;
55
6- pub fn build (b : * Build ) void {
6+ const Options = struct {
7+ enable_snappy : bool ,
8+
9+ fn init (b : * Build ) Options {
10+ return .{
11+ .enable_snappy = b .option (
12+ bool ,
13+ "enable_snappy" ,
14+ "Enables and builds with the Snappy compressor" ,
15+ ) orelse false ,
16+ };
17+ }
18+ };
19+
20+ pub fn build (b : * Build ) ! void {
721 const target = b .standardTargetOptions (.{});
822 const optimize = b .standardOptimizeOption (.{});
923
24+ const options : Options = .init (b );
25+
1026 // RocksDB's translate-c module
11- const rocksdb_mod = addRocksDB (b , target , optimize );
27+ const rocksdb_mod = try addRocksDB (b , target , optimize , options );
1228 const bindings_mod = b .addModule ("bindings" , .{
1329 .target = target ,
1430 .optimize = optimize ,
@@ -32,7 +48,8 @@ fn addRocksDB(
3248 b : * Build ,
3349 target : ResolvedTarget ,
3450 optimize : OptimizeMode ,
35- ) * Build.Module {
51+ options : Options ,
52+ ) ! * Build.Module {
3653 const rocks_dep = b .dependency ("rocksdb" , .{});
3754
3855 const translate_c = b .addTranslateC (.{
@@ -68,18 +85,18 @@ fn addRocksDB(
6885 }),
6986 });
7087
71- const snappy = b .addLibrary (.{
88+ const maybe_libsnappy = if ( options . enable_snappy ) b .addLibrary (.{
7289 .name = "snappy" ,
7390 .linkage = .static ,
7491 .root_module = b .createModule (.{
7592 .target = target ,
7693 .optimize = optimize ,
7794 .pic = if (force_pic == true ) true else null ,
7895 }),
79- });
96+ }) else null ;
8097
81- try buildRocksDB (b , static_rocksdb , snappy , target );
82- try buildRocksDB (b , dynamic_rocksdb , snappy , target );
98+ try buildRocksDB (b , static_rocksdb , maybe_libsnappy , target );
99+ try buildRocksDB (b , dynamic_rocksdb , maybe_libsnappy , target );
83100
84101 mod .addIncludePath (rocks_dep .path ("include" ));
85102 mod .linkLibrary (static_rocksdb );
@@ -91,20 +108,25 @@ fn addRocksDB(
91108fn buildRocksDB (
92109 b : * Build ,
93110 librocksdb : * std.Build.Step.Compile ,
94- libsnappy : * std.Build.Step.Compile ,
111+ maybe_libsnappy : ? * std.Build.Step.Compile ,
95112 target : std.Build.ResolvedTarget ,
96113) ! void {
97- // Ideally snappy could be an optional dependency, but Zig doesn't support them yet.
98- // Luckily building this is cheap.
99- const enable_snappy : bool = true ;
100-
101114 const t = target .result ;
102115 const rocks_dep = b .dependency ("rocksdb" , .{});
103- const snappy_dep = b .dependency ("snappy" , .{});
104116
105117 librocksdb .linkLibC ();
106118 librocksdb .linkLibCpp ();
107119
120+ var rocksdb_flags : std .ArrayListUnmanaged ([]const u8 ) = .empty ;
121+ defer rocksdb_flags .deinit (b .allocator );
122+ try rocksdb_flags .appendSlice (b .allocator , &.{
123+ "-std=c++17" ,
124+ "-faligned-new" ,
125+ "-DHAVE_ALIGNED_NEW" ,
126+ "-DROCKSDB_UBSAN_RUN" ,
127+ });
128+ if (maybe_libsnappy != null ) try rocksdb_flags .append (b .allocator , "-DSNAPPY=1" );
129+
108130 librocksdb .addIncludePath (rocks_dep .path ("include" ));
109131 librocksdb .addIncludePath (rocks_dep .path ("." ));
110132 librocksdb .addCSourceFiles (.{
@@ -447,18 +469,13 @@ fn buildRocksDB(
447469 "utilities/transactions/lock/range/range_tree/lib/util/dbt.cc" ,
448470 "utilities/transactions/lock/range/range_tree/lib/util/memarena.cc" ,
449471 },
450- .flags = @as ([]const []const u8 , &.{
451- "-std=c++17" ,
452- "-faligned-new" ,
453- "-DHAVE_ALIGNED_NEW" ,
454- "-DROCKSDB_UBSAN_RUN" ,
455- }) ++ @as ([]const []const u8 , if (enable_snappy )
456- &.{"-DSNAPPY=1" }
457- else
458- &.{}),
472+ .flags = rocksdb_flags .items ,
459473 });
460474
461- if (enable_snappy ) {
475+ if (maybe_libsnappy ) | libsnappy | not_yet_fetched : {
476+ const snappy_dep = b .lazyDependency ("snappy" , .{}) orelse
477+ break :not_yet_fetched ;
478+
462479 librocksdb .linkLibrary (libsnappy );
463480 librocksdb .addIncludePath (snappy_dep .path ("." ));
464481
@@ -500,12 +517,7 @@ fn buildRocksDB(
500517 if (t .cpu .arch == .aarch64 ) {
501518 librocksdb .addCSourceFile (.{
502519 .file = rocks_dep .path ("util/crc32c_arm64.cc" ),
503- .flags = &.{
504- "-std=c++17" ,
505- "-faligned-new" ,
506- "-DHAVE_ALIGNED_NEW" ,
507- "-DROCKSDB_UBSAN_RUN" ,
508- },
520+ .flags = rocksdb_flags .items ,
509521 });
510522 }
511523
@@ -520,11 +532,7 @@ fn buildRocksDB(
520532 "env/fs_posix.cc" ,
521533 "env/io_posix.cc" ,
522534 },
523- .flags = &.{
524- "-std=c++17" ,
525- "-faligned-new" ,
526- "-DHAVE_ALIGNED_NEW" ,
527- },
535+ .flags = rocksdb_flags .items ,
528536 });
529537 } else {
530538 @panic ("TODO: support windows!" );
0 commit comments