From 5dba10af21ce44ed84866acf7139c68e9673d039 Mon Sep 17 00:00:00 2001 From: Shuroii Date: Tue, 1 Jul 2025 21:38:48 +0200 Subject: [PATCH] fix: musl builds --- flake.nix | 14 +-- nix/pkgs/main/default.nix | 221 ++++++++++++++++---------------------- 2 files changed, 100 insertions(+), 135 deletions(-) diff --git a/flake.nix b/flake.nix index 20684914..bc46f953 100644 --- a/flake.nix +++ b/flake.nix @@ -40,9 +40,8 @@ mkScope = pkgs: pkgs.lib.makeScope pkgs.newScope (self: { - inherit pkgs; - craneLib = ((inputs.crane.mkLib pkgs).overrideToolchain (_: toolchain)); - inherit inputs; + inherit pkgs inputs; + craneLib = (inputs.crane.mkLib pkgs).overrideToolchain (_: toolchain); main = self.callPackage ./nix/pkgs/main { }; liburing = pkgs.liburing.overrideAttrs { # Tests weren't building @@ -53,14 +52,10 @@ ]; buildFlags = [ "library" ]; }; - rocksdb = pkgs.rocksdb_9_10.overrideAttrs (oldAttrs: { + rocksdb-custom = pkgs.rocksdb_9_10.overrideAttrs (oldAttrs: { version = "v9.11.1"; src = inputs.rocksdb; - # We have this already at https://forgejo.ellis.link/continuwuation/rocksdb/commit/a935c0273e1ba44eacf88ce3685a9b9831486155 - # Unsetting this so we don't have to revert it and make this nix exclusive - patches = [ ]; - cmakeFlags = pkgs.lib.subtractLists [ # No real reason to have snappy or zlib, no one uses this @@ -106,7 +101,8 @@ # preInstall hooks has stuff for messing with ldb/sst_dump which we don't need or use preInstall = ""; - # + # We have this already at https://forgejo.ellis.link/continuwuation/rocksdb/commit/a935c0273e1ba44eacf88ce3685a9b9831486155 + patches = [ ]; postPatch = '' # Fix gcc-13 build failures due to missing and # includes, fixed upstream since 8.x diff --git a/nix/pkgs/main/default.nix b/nix/pkgs/main/default.nix index 0fd06c20..59a2e574 100644 --- a/nix/pkgs/main/default.nix +++ b/nix/pkgs/main/default.nix @@ -10,11 +10,12 @@ , rust , rust-jemalloc-sys , stdenv -, # Options (keep sorted) - all_features ? false + + # Options (keep sorted) +, all_features ? false , default_features ? true -, # default list of disabled features - disable_features ? [ + # default list of disabled features +, disable_features ? [ # dont include experimental features "experimental" # jemalloc profiling/stats features are expensive and shouldn't @@ -29,34 +30,28 @@ , disable_release_max_log_level ? false , features ? [ ] , profile ? "release" -, # rocksdb compiled with -march=haswell and target-cpu=haswell rustflag + # rocksdb compiled with -march=haswell and target-cpu=haswell rustflag # haswell is pretty much any x86 cpu made in the last 12 years, and # supports modern CPU extensions that rocksdb can make use of. # disable if trying to make a portable x86_64 build for very old hardware - x86_64_haswell_target_optimised ? false -, +, x86_64_haswell_target_optimised ? false }: let # We perform default-feature unification in nix, because some of the dependencies # on the nix side depend on feature values. - crateFeatures = - path: - let - manifest = lib.importTOML "${path}/Cargo.toml"; - in + crateFeatures = path: + let manifest = lib.importTOML "${path}/Cargo.toml"; in lib.remove "default" (lib.attrNames manifest.features); - crateDefaultFeatures = path: (lib.importTOML "${path}/Cargo.toml").features.default; + crateDefaultFeatures = path: + (lib.importTOML "${path}/Cargo.toml").features.default; allDefaultFeatures = crateDefaultFeatures "${inputs.self}/src/main"; allFeatures = crateFeatures "${inputs.self}/src/main"; - features' = lib.unique ( - features - ++ lib.optionals default_features allDefaultFeatures - ++ lib.optionals all_features allFeatures - ); - disable_features' = - disable_features - ++ lib.optionals disable_release_max_log_level [ "release_max_log_level" ]; + features' = lib.unique + (features ++ + lib.optionals default_features allDefaultFeatures ++ + lib.optionals all_features allFeatures); + disable_features' = disable_features ++ lib.optionals disable_release_max_log_level [ "release_max_log_level" ]; features'' = lib.subtractLists disable_features' features'; featureEnabled = feature: builtins.elem feature features''; @@ -68,69 +63,54 @@ let # own. In order for this to work, we need to set flags on the build that match # whatever flags tikv-jemalloc-sys was going to use. These are dependent on # which features we enable in tikv-jemalloc-sys. - rust-jemalloc-sys' = - (rust-jemalloc-sys.override { - # tikv-jemalloc-sys/unprefixed_malloc_on_supported_platforms feature - unprefixed = true; - }).overrideAttrs - (old: { - configureFlags = - old.configureFlags - ++ - # we dont need docs - [ "--disable-doc" ] - ++ - # we dont need cxx/C++ integration - [ "--disable-cxx" ] - ++ - # tikv-jemalloc-sys/profiling feature - lib.optional (featureEnabled "jemalloc_prof") "--enable-prof" - ++ - # tikv-jemalloc-sys/stats feature - (if (featureEnabled "jemalloc_stats") then [ "--enable-stats" ] else [ "--disable-stats" ]); - }); + rust-jemalloc-sys' = (rust-jemalloc-sys.override { + # tikv-jemalloc-sys/unprefixed_malloc_on_supported_platforms feature + unprefixed = true; + }).overrideAttrs (old: { + configureFlags = old.configureFlags ++ + # we dont need docs + [ "--disable-doc" ] ++ + # we dont need cxx/C++ integration + [ "--disable-cxx" ] ++ + # tikv-jemalloc-sys/profiling feature + lib.optional (featureEnabled "jemalloc_prof") "--enable-prof" ++ + # tikv-jemalloc-sys/stats feature + (if (featureEnabled "jemalloc_stats") then [ "--enable-stats" ] else [ "--disable-stats" ]); + }); buildDepsOnlyEnv = let - rocksdb' = - (rocksdb.override { - jemalloc = lib.optional (featureEnabled "jemalloc") rust-jemalloc-sys'; - # rocksdb fails to build with prefixed jemalloc, which is required on - # darwin due to [1]. In this case, fall back to building rocksdb with - # libc malloc. This should not cause conflicts, because all of the - # jemalloc symbols are prefixed. - # - # [1]: https://github.com/tikv/jemallocator/blob/ab0676d77e81268cd09b059260c75b38dbef2d51/jemalloc-sys/src/env.rs#L17 - enableJemalloc = featureEnabled "jemalloc" && !stdenv.hostPlatform.isDarwin; + rocksdb' = (rocksdb.override { + jemalloc = lib.optional (featureEnabled "jemalloc") rust-jemalloc-sys'; + # rocksdb fails to build with prefixed jemalloc, which is required on + # darwin due to [1]. In this case, fall back to building rocksdb with + # libc malloc. This should not cause conflicts, because all of the + # jemalloc symbols are prefixed. + # + # [1]: https://github.com/tikv/jemallocator/blob/ab0676d77e81268cd09b059260c75b38dbef2d51/jemalloc-sys/src/env.rs#L17 + enableJemalloc = featureEnabled "jemalloc" && !stdenv.hostPlatform.isDarwin; - # for some reason enableLiburing in nixpkgs rocksdb is default true - # which breaks Darwin entirely - inherit enableLiburing; - }).overrideAttrs - (old: { - inherit enableLiburing; - cmakeFlags = - ( - if x86_64_haswell_target_optimised then - ( - lib.subtractLists [ - # dont make a portable build if x86_64_haswell_target_optimised is enabled - "-DPORTABLE=1" - ] - old.cmakeFlags - ++ [ "-DPORTABLE=haswell" ] - ) - else - [ "-DPORTABLE=1" ] - ) - ++ old.cmakeFlags; + # for some reason enableLiburing in nixpkgs rocksdb is default true + # which breaks Darwin entirely + inherit enableLiburing; + }).overrideAttrs (old: { + inherit enableLiburing; + cmakeFlags = (if x86_64_haswell_target_optimised then + (lib.subtractLists [ + # dont make a portable build if x86_64_haswell_target_optimised is enabled + "-DPORTABLE=1" + ] + old.cmakeFlags + ++ [ "-DPORTABLE=haswell" ]) else [ "-DPORTABLE=1" ] + ) + ++ old.cmakeFlags; - # outputs has "tools" which we dont need or use - outputs = [ "out" ]; + # outputs has "tools" which we dont need or use + outputs = [ "out" ]; - # preInstall hooks has stuff for messing with ldb/sst_dump which we dont need or use - preInstall = ""; - }); + # preInstall hooks has stuff for messing with ldb/sst_dump which we dont need or use + preInstall = ""; + }); in { # https://crane.dev/faq/rebuilds-bindgen.html @@ -140,32 +120,27 @@ let ROCKSDB_INCLUDE_DIR = "${rocksdb'}/include"; ROCKSDB_LIB_DIR = "${rocksdb'}/lib"; } - // (import ./cross-compilation-env.nix { + // + (import ./cross-compilation-env.nix { # Keep sorted inherit lib pkgsBuildHost rust - stdenv - ; + stdenv; }); - buildPackageEnv = - { - GIT_COMMIT_HASH = inputs.self.rev or inputs.self.dirtyRev or ""; - GIT_COMMIT_HASH_SHORT = inputs.self.shortRev or inputs.self.dirtyShortRev or ""; - } - // buildDepsOnlyEnv - // { - # Only needed in static stdenv because these are transitive dependencies of rocksdb - CARGO_BUILD_RUSTFLAGS = - buildDepsOnlyEnv.CARGO_BUILD_RUSTFLAGS - + lib.optionalString - ( - enableLiburing && stdenv.hostPlatform.isStatic - ) " -L${lib.getLib liburing}/lib -luring" - + lib.optionalString x86_64_haswell_target_optimised " -Ctarget-cpu=haswell"; - }; + buildPackageEnv = { + GIT_COMMIT_HASH = inputs.self.rev or inputs.self.dirtyRev or ""; + GIT_COMMIT_HASH_SHORT = inputs.self.shortRev or inputs.self.dirtyShortRev or ""; + } // buildDepsOnlyEnv // { + # Only needed in static stdenv because these are transitive dependencies of rocksdb + CARGO_BUILD_RUSTFLAGS = buildDepsOnlyEnv.CARGO_BUILD_RUSTFLAGS + + lib.optionalString (enableLiburing && stdenv.hostPlatform.isStatic) + " -L${lib.getLib liburing}/lib -luring" + + lib.optionalString x86_64_haswell_target_optimised + " -Ctarget-cpu=haswell"; + }; commonAttrs = { inherit @@ -173,46 +148,40 @@ let cargoToml = "${inputs.self}/Cargo.toml"; }) pname - version - ; + version; - src = - let - filter = inputs.nix-filter.lib; - in - filter { - root = inputs.self; + src = let filter = inputs.nix-filter.lib; in filter { + root = inputs.self; - # Keep sorted - include = [ - ".cargo" - "Cargo.lock" - "Cargo.toml" - "src" - ]; - }; + # Keep sorted + include = [ + ".cargo" + "Cargo.lock" + "Cargo.toml" + "src" + ]; + }; doCheck = true; - cargoExtraArgs = - "--no-default-features --locked " - + lib.optionalString (features'' != [ ]) "--features " - + (builtins.concatStringsSep "," features''); + cargoExtraArgs = "--no-default-features --locked " + + lib.optionalString + (features'' != [ ]) + "--features " + (builtins.concatStringsSep "," features''); dontStrip = profile == "dev" || profile == "test"; dontPatchELF = profile == "dev" || profile == "test"; - buildInputs = - lib.optional (featureEnabled "jemalloc") rust-jemalloc-sys' + buildInputs = lib.optional (featureEnabled "jemalloc") rust-jemalloc-sys' # needed to build Rust applications on macOS ++ lib.optionals stdenv.hostPlatform.isDarwin [ - # https://github.com/NixOS/nixpkgs/issues/206242 - # ld: library not found for -liconv - libiconv - # https://stackoverflow.com/questions/69869574/properly-adding-darwin-apple-sdk-to-a-nix-shell - # https://discourse.nixos.org/t/compile-a-rust-binary-on-macos-dbcrossbar/8612 - pkgsBuildHost.darwin.apple_sdk.frameworks.Security - ]; + # https://github.com/NixOS/nixpkgs/issues/206242 + # ld: library not found for -liconv + libiconv + # https://stackoverflow.com/questions/69869574/properly-adding-darwin-apple-sdk-to-a-nix-shell + # https://discourse.nixos.org/t/compile-a-rust-binary-on-macos-dbcrossbar/8612 + pkgsBuildHost.darwin.apple_sdk.frameworks.Security + ]; nativeBuildInputs = [ # bindgen needs the build platform's libclang. Apparently due to "splicing