From 3d61f26303bdeed149bd968396c769d2c4dc3334 Mon Sep 17 00:00:00 2001 From: Tristan Ross Date: Mon, 10 Feb 2025 21:35:37 -0800 Subject: [PATCH] feat(libstore): add page size system feature --- src/libstore/globals.cc | 10 ++++++++++ src/libstore/globals.zig | 23 +++++++++++++++++++++++ src/libstore/libstore.zig | 5 +++++ src/libstore/meson.build | 16 +++++++++++++++- src/libstore/package.nix | 1 + 5 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 src/libstore/globals.zig create mode 100644 src/libstore/libstore.zig diff --git a/src/libstore/globals.cc b/src/libstore/globals.cc index 0ad2ffc14..68ec29b25 100644 --- a/src/libstore/globals.cc +++ b/src/libstore/globals.cc @@ -175,6 +175,8 @@ static bool hasVirt() { } #endif +extern "C" const char** nix_libstore_get_default_system_features(); + StringSet Settings::getDefaultSystemFeatures() { /* For backwards compatibility, accept some "features" that are @@ -196,6 +198,14 @@ StringSet Settings::getDefaultSystemFeatures() features.insert("apple-virt"); #endif + const char** value = nix_libstore_get_default_system_features(); + if (value != nullptr) { + for (size_t i = 0; value[i] != nullptr; i++) { + features.insert(value[i]); + } + } + free(value); + return features; } diff --git a/src/libstore/globals.zig b/src/libstore/globals.zig new file mode 100644 index 000000000..3e587b9d1 --- /dev/null +++ b/src/libstore/globals.zig @@ -0,0 +1,23 @@ +const std = @import("std"); + +pub fn getDefaultSystemFeatures() callconv(.C) ?[*:null]const ?[*:0]const u8 { + var list = std.ArrayList(?[*:0]const u8).init(std.heap.c_allocator); + defer list.deinit(); + + const pgsize = std.heap.pageSize(); + + if (pgsize == std.heap.page_size_max) { + list.append(std.fmt.allocPrintZ(std.heap.c_allocator, "pages-{d}k", .{pgsize / 1024}) catch return null) catch return null; + } else { + var i = pgsize; + while (i < std.heap.page_size_max) : (i *= 2) { + list.append(std.fmt.allocPrintZ(std.heap.c_allocator, "pages-{d}k", .{i / 1024}) catch return null) catch return null; + } + } + + return list.toOwnedSliceSentinel(null) catch return null; +} + +comptime { + @export(&getDefaultSystemFeatures, .{ .name = "nix_libstore_get_default_system_features" }); +} diff --git a/src/libstore/libstore.zig b/src/libstore/libstore.zig new file mode 100644 index 000000000..099b1db12 --- /dev/null +++ b/src/libstore/libstore.zig @@ -0,0 +1,5 @@ +pub const globals = @import("globals.zig"); + +comptime { + _ = globals; +} diff --git a/src/libstore/meson.build b/src/libstore/meson.build index bff1cdfb8..8bc86a794 100644 --- a/src/libstore/meson.build +++ b/src/libstore/meson.build @@ -1,4 +1,4 @@ -project('nix-store', 'cpp', +project('nix-store', 'cpp', 'c', version : files('.zix-version'), default_options : [ 'cpp_std=c++2a', @@ -132,6 +132,8 @@ if aws_s3.found() endif deps_other += aws_s3 +subdir('nix-meson-build-support/zig') + subdir('nix-meson-build-support/generate-header') generated_headers = [] @@ -420,6 +422,18 @@ endforeach subdir('nix-meson-build-support/export-all-symbols') subdir('nix-meson-build-support/windows-version') +sources += custom_target( + 'zig build-lib', + command: [zig, 'build-lib', '-femit-h=@OUTDIR@/libstore-zig.h', '-femit-bin=@OUTPUT@', '-ofmt=c', '-lc', zig_args, '@INPUT@'], + output: 'libstore-zig.c', + input: 'libstore.zig', + depend_files: [ + 'globals.zig', + ], +) + +include_dirs += fs.parent(fs.parent(zig.full_path())) / 'lib' / 'zig' + this_library = library( 'nixstore', generated_headers, diff --git a/src/libstore/package.nix b/src/libstore/package.nix index d8492b7bd..bd281ced3 100644 --- a/src/libstore/package.nix +++ b/src/libstore/package.nix @@ -50,6 +50,7 @@ mkMesonLibrary (finalAttrs: { (fileset.fileFilter (file: file.hasExt "sb") ./.) (fileset.fileFilter (file: file.hasExt "md") ./.) (fileset.fileFilter (file: file.hasExt "sql") ./.) + (fileset.fileFilter (file: file.hasExt "zig") ./.) ]; nativeBuildInputs = lib.optional embeddedSandboxShell unixtools.hexdump;