From b590735a227facbdc61cf8925ca61798366fe48f Mon Sep 17 00:00:00 2001 From: Sergei Zimmerman Date: Sat, 12 Sep 2026 21:47:55 +0300 Subject: [PATCH 1/2] nix: remove propagated-build-inputs when static Ports d07852b5f33b4ef2bd19d7f542575502898f9f97 from the nix tree. This reduces the closure of pkgsStatic.nix down to several packages. The closure size drops down from 430.7 MiB -> 39.4 Mib. Ideally of course we would have the nix-cli component not be allowed to reference any store paths at all, since that's the whole point of static builds (i.e to be self-contained). Co-authored-by: Tristan Ross --- .../nix/modular/packaging/components.nix | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pkgs/tools/package-management/nix/modular/packaging/components.nix b/pkgs/tools/package-management/nix/modular/packaging/components.nix index fb6970ce68c0..8e2b749cbb9c 100644 --- a/pkgs/tools/package-management/nix/modular/packaging/components.nix +++ b/pkgs/tools/package-management/nix/modular/packaging/components.nix @@ -174,6 +174,17 @@ let outputs = prevAttrs.outputs or [ "out" ] ++ [ "dev" ]; }; + fixupStaticLayer = finalAttrs: prevAttrs: { + postFixup = + prevAttrs.postFixup or "" + + lib.optionalString (stdenv.hostPlatform.isStatic) '' + # HACK: Otherwise the result will have the entire buildInputs closure + # injected by the pkgsStatic stdenv + # + rm -f $out/nix-support/propagated-build-inputs + ''; + }; + # Work around weird `--as-needed` linker behavior with BSD, see # https://github.com/mesonbuild/meson/issues/3593 bsdNoLinkAsNeeded = @@ -323,6 +334,7 @@ in scope.sourceLayer setVersionLayer mesonLayer + fixupStaticLayer scope.mesonComponentOverrides ]; mkMesonExecutable = mkPackageBuilder [ @@ -332,6 +344,7 @@ in setVersionLayer mesonLayer mesonBuildLayer + fixupStaticLayer scope.mesonComponentOverrides ]; mkMesonLibrary = mkPackageBuilder [ @@ -342,6 +355,7 @@ in setVersionLayer mesonBuildLayer mesonLibraryLayer + fixupStaticLayer scope.mesonComponentOverrides ]; From 4456784224b31b2ff2274a818e5d2b2e4973c696 Mon Sep 17 00:00:00 2001 From: Sergei Zimmerman Date: Sun, 13 Sep 2026 00:26:32 +0300 Subject: [PATCH 2/2] nix: build with plugin-c-api to export -c library api symbols in the executable Ports over 828ffb210af7a8d82081217d41b06cbf151a6ed9 and 774a7e1e78e4911ad5d2c9917b568e172d43a6f6 from the nix tree. It's a bit verbose, but no way around that with modular packaging. This does mean that -c libraries now get both libraries - static archives and shared libraries, but -c bindings are pretty small (~100KiB) each so this is not expected to be an issue. Co-authored-by: Riccardo Mazzarini --- .../nix/modular/packaging/components.nix | 7 ++++ .../nix/modular/src/libexpr-c/package.nix | 6 ++-- .../nix/modular/src/libfetchers-c/package.nix | 5 ++- .../nix/modular/src/libflake-c/package.nix | 6 ++-- .../nix/modular/src/libmain-c/package.nix | 6 ++-- .../nix/modular/src/libstore-c/package.nix | 6 ++-- .../nix/modular/src/libutil-c/package.nix | 6 ++-- .../nix/modular/src/nix/package.nix | 33 +++++++++++++++++-- .../nix/modular/tests/functional/package.nix | 4 +++ 9 files changed, 65 insertions(+), 14 deletions(-) diff --git a/pkgs/tools/package-management/nix/modular/packaging/components.nix b/pkgs/tools/package-management/nix/modular/packaging/components.nix index 8e2b749cbb9c..bb49ce97dd57 100644 --- a/pkgs/tools/package-management/nix/modular/packaging/components.nix +++ b/pkgs/tools/package-management/nix/modular/packaging/components.nix @@ -359,6 +359,13 @@ in scope.mesonComponentOverrides ]; + /** + Whether to embed the public C API into nix-cli so plugins can resolve those symbols from the executable. + */ + withPluginCAPI = + (lib.versionAtLeast (lib.versions.majorMinor version) "2.35") + && !(stdenv.hostPlatform.isWindows || stdenv.hostPlatform.isStatic); + nix-util = callPackage ../src/libutil/package.nix { }; nix-util-c = callPackage ../src/libutil-c/package.nix { }; nix-util-test-support = callPackage ../src/libutil-test-support/package.nix { }; diff --git a/pkgs/tools/package-management/nix/modular/src/libexpr-c/package.nix b/pkgs/tools/package-management/nix/modular/src/libexpr-c/package.nix index 6c01d359e203..ee5e0de62af3 100644 --- a/pkgs/tools/package-management/nix/modular/src/libexpr-c/package.nix +++ b/pkgs/tools/package-management/nix/modular/src/libexpr-c/package.nix @@ -8,6 +8,7 @@ # Configuration Options version, + withPluginCAPI, }: mkMesonLibrary (finalAttrs: { @@ -21,8 +22,9 @@ mkMesonLibrary (finalAttrs: { nix-expr ]; - mesonFlags = [ - ]; + mesonFlags = lib.optional (lib.versionAtLeast (lib.versions.majorMinor version) "2.35") ( + lib.mesonBool "plugin-c-api" withPluginCAPI + ); meta = { platforms = lib.platforms.unix ++ lib.platforms.windows; diff --git a/pkgs/tools/package-management/nix/modular/src/libfetchers-c/package.nix b/pkgs/tools/package-management/nix/modular/src/libfetchers-c/package.nix index 9da68f9e4814..1d6d850ee71b 100644 --- a/pkgs/tools/package-management/nix/modular/src/libfetchers-c/package.nix +++ b/pkgs/tools/package-management/nix/modular/src/libfetchers-c/package.nix @@ -10,6 +10,7 @@ # Configuration Options version, + withPluginCAPI, }: mkMesonLibrary (finalAttrs: { @@ -25,7 +26,9 @@ mkMesonLibrary (finalAttrs: { nix-fetchers ]; - mesonFlags = [ ]; + mesonFlags = lib.optional (lib.versionAtLeast (lib.versions.majorMinor version) "2.35") ( + lib.mesonBool "plugin-c-api" withPluginCAPI + ); meta = { platforms = lib.platforms.unix ++ lib.platforms.windows; diff --git a/pkgs/tools/package-management/nix/modular/src/libflake-c/package.nix b/pkgs/tools/package-management/nix/modular/src/libflake-c/package.nix index bbea479049c0..b2249d30b4b1 100644 --- a/pkgs/tools/package-management/nix/modular/src/libflake-c/package.nix +++ b/pkgs/tools/package-management/nix/modular/src/libflake-c/package.nix @@ -10,6 +10,7 @@ # Configuration Options version, + withPluginCAPI, }: mkMesonLibrary (finalAttrs: { @@ -29,8 +30,9 @@ mkMesonLibrary (finalAttrs: { nix-flake ]; - mesonFlags = [ - ]; + mesonFlags = lib.optional (lib.versionAtLeast (lib.versions.majorMinor version) "2.35") ( + lib.mesonBool "plugin-c-api" withPluginCAPI + ); meta = { platforms = lib.platforms.unix ++ lib.platforms.windows; diff --git a/pkgs/tools/package-management/nix/modular/src/libmain-c/package.nix b/pkgs/tools/package-management/nix/modular/src/libmain-c/package.nix index ec1d3ba3eb05..0c1357832254 100644 --- a/pkgs/tools/package-management/nix/modular/src/libmain-c/package.nix +++ b/pkgs/tools/package-management/nix/modular/src/libmain-c/package.nix @@ -10,6 +10,7 @@ # Configuration Options version, + withPluginCAPI, }: mkMesonLibrary (finalAttrs: { @@ -25,8 +26,9 @@ mkMesonLibrary (finalAttrs: { nix-main ]; - mesonFlags = [ - ]; + mesonFlags = lib.optional (lib.versionAtLeast (lib.versions.majorMinor version) "2.35") ( + lib.mesonBool "plugin-c-api" withPluginCAPI + ); meta = { platforms = lib.platforms.unix ++ lib.platforms.windows; diff --git a/pkgs/tools/package-management/nix/modular/src/libstore-c/package.nix b/pkgs/tools/package-management/nix/modular/src/libstore-c/package.nix index 2672cfd1a415..288d9fc64550 100644 --- a/pkgs/tools/package-management/nix/modular/src/libstore-c/package.nix +++ b/pkgs/tools/package-management/nix/modular/src/libstore-c/package.nix @@ -8,6 +8,7 @@ # Configuration Options version, + withPluginCAPI, }: mkMesonLibrary (finalAttrs: { @@ -21,8 +22,9 @@ mkMesonLibrary (finalAttrs: { nix-store ]; - mesonFlags = [ - ]; + mesonFlags = lib.optional (lib.versionAtLeast (lib.versions.majorMinor version) "2.35") ( + lib.mesonBool "plugin-c-api" withPluginCAPI + ); meta = { platforms = lib.platforms.unix ++ lib.platforms.windows; diff --git a/pkgs/tools/package-management/nix/modular/src/libutil-c/package.nix b/pkgs/tools/package-management/nix/modular/src/libutil-c/package.nix index 70a678d82302..4542287d037b 100644 --- a/pkgs/tools/package-management/nix/modular/src/libutil-c/package.nix +++ b/pkgs/tools/package-management/nix/modular/src/libutil-c/package.nix @@ -7,6 +7,7 @@ # Configuration Options version, + withPluginCAPI, }: mkMesonLibrary (finalAttrs: { @@ -19,8 +20,9 @@ mkMesonLibrary (finalAttrs: { nix-util ]; - mesonFlags = [ - ]; + mesonFlags = lib.optional (lib.versionAtLeast (lib.versions.majorMinor version) "2.35") ( + lib.mesonBool "plugin-c-api" withPluginCAPI + ); meta = { platforms = lib.platforms.unix ++ lib.platforms.windows; diff --git a/pkgs/tools/package-management/nix/modular/src/nix/package.nix b/pkgs/tools/package-management/nix/modular/src/nix/package.nix index 737b57f9433e..10ba8d434cb9 100644 --- a/pkgs/tools/package-management/nix/modular/src/nix/package.nix +++ b/pkgs/tools/package-management/nix/modular/src/nix/package.nix @@ -8,6 +8,13 @@ nix-main, nix-cmd, + nix-expr-c, + nix-fetchers-c, + nix-flake-c, + nix-main-c, + nix-store-c, + nix-util-c, + mimalloc, # Configuration Options @@ -18,6 +25,10 @@ # Significantly improves evaluation performance on allocation-heavy # workloads (~10-15% on large evaluations). withMimalloc ? !stdenv.hostPlatform.isWindows, + + # Whether to embed the public C API into the `nix` executable so plugins can + # resolve those symbols without linking Nix libraries directly. + withPluginCApi ? !stdenv.hostPlatform.isWindows && !stdenv.hostPlatform.isStatic, }: mkMesonExecutable (finalAttrs: { @@ -32,11 +43,27 @@ mkMesonExecutable (finalAttrs: { nix-main nix-cmd ] + ++ lib.optionals ((lib.versionAtLeast (lib.versions.majorMinor version) "2.35") && withPluginCApi) [ + nix-expr-c + nix-fetchers-c + nix-flake-c + nix-main-c + nix-store-c + nix-util-c + ] ++ lib.optional ((lib.versionAtLeast version "2.35pre") && withMimalloc) mimalloc; - mesonFlags = lib.optionals (lib.versionAtLeast version "2.35pre") [ - (lib.mesonEnable "mimalloc" withMimalloc) - ]; + mesonFlags = + lib.optionals (lib.versionAtLeast version "2.35pre") [ + (lib.mesonEnable "mimalloc" withMimalloc) + ] + ++ lib.optional (lib.versionAtLeast (lib.versions.majorMinor version) "2.35") ( + lib.mesonBool "plugin-c-api" withPluginCApi + ); + + passthru = { + exportsPluginCApi = withPluginCApi; + }; meta = { mainProgram = "nix"; diff --git a/pkgs/tools/package-management/nix/modular/tests/functional/package.nix b/pkgs/tools/package-management/nix/modular/tests/functional/package.nix index 597c89f08c4d..a4a148ed7f5e 100644 --- a/pkgs/tools/package-management/nix/modular/tests/functional/package.nix +++ b/pkgs/tools/package-management/nix/modular/tests/functional/package.nix @@ -77,6 +77,10 @@ mkMesonDerivation (finalAttrs: { "--print-errorlogs" ]; + mesonFlags = lib.optional (lib.versionAtLeast (lib.versions.majorMinor version) "2.35") ( + lib.mesonBool "plugin-c-api" nix-cli.exportsPluginCApi + ); + doCheck = true; installPhase = ''