toplevel: define a "static-x86_64" and "static-aarch64" host, to experiment with static linking
progress is early, and it's unclear if the work the make gtk, opengl, etc compatible with such a system will ever be feasible
This commit is contained in:
46
impure.nix
46
impure.nix
@@ -57,11 +57,27 @@ let
|
|||||||
# but i want these a little more normalized, which is possible either here, or
|
# but i want these a little more normalized, which is possible either here, or
|
||||||
# by assigning `boot.kernelPackages`.
|
# by assigning `boot.kernelPackages`.
|
||||||
# elaborate = system: system;
|
# elaborate = system: system;
|
||||||
elaborate = system: let
|
elaborate = system: { static ? false }: let
|
||||||
e = lib.systems.elaborate system;
|
abi = if static then "musl" else "gnu";
|
||||||
|
e = lib.systems.elaborate {
|
||||||
|
# N.B.: "static" can mean a few things:
|
||||||
|
# 1. binaries should be linked statically (stdenv.hostPlatform.isStatic == true).
|
||||||
|
# 2. host libc doesn't support dlopen (stdenv.hostPlatform.hasSharedLibraries == false).
|
||||||
|
#
|
||||||
|
# nixpkgs' `pkgsStatic` is the stricter meaning of "static": no `.so` files, period.
|
||||||
|
# this means plugin-heavy frameworks like `gobject-introspection` probably just cannot ever work (?).
|
||||||
|
# TODO: i'd _prefer_ to use the weaker kind of "static", and support all the traditional packages,
|
||||||
|
# but for now that actually results in fewer working packages (e.g. `xdg-dbus-proxy`).
|
||||||
|
system = "${system}-${abi}";
|
||||||
|
isStatic = static;
|
||||||
|
# hasSharedLibraries = true;
|
||||||
|
};
|
||||||
in
|
in
|
||||||
{
|
e // {
|
||||||
inherit system;
|
extensions = e.extensions // {
|
||||||
|
# when `hasSharedLibraries` == false, need to explicitly set this here to fix eval of many packages. this is not a long-term fix.
|
||||||
|
sharedLibrary = ".so";
|
||||||
|
};
|
||||||
linux-kernel = {
|
linux-kernel = {
|
||||||
inherit (e.linux-kernel) name baseConfig target;
|
inherit (e.linux-kernel) name baseConfig target;
|
||||||
} // (lib.optionalAttrs (e.linux-kernel ? DTB) { inherit (e.linux-kernel) DTB; }) // {
|
} // (lib.optionalAttrs (e.linux-kernel ? DTB) { inherit (e.linux-kernel) DTB; }) // {
|
||||||
@@ -86,22 +102,24 @@ let
|
|||||||
hosts = builtins.foldl'
|
hosts = builtins.foldl'
|
||||||
# XXX: i `elaborate` localSystem the same as i do `system` because otherwise nixpkgs
|
# XXX: i `elaborate` localSystem the same as i do `system` because otherwise nixpkgs
|
||||||
# sees they're (slightly) different and forces everything down the (expensive) cross-compilation path.
|
# sees they're (slightly) different and forces everything down the (expensive) cross-compilation path.
|
||||||
(acc: host: acc // mkHost ({ localSystem = elaborate localSystem; } // host))
|
(acc: host: acc // mkHost ({ localSystem = elaborate localSystem {}; } // host))
|
||||||
{}
|
{}
|
||||||
[
|
[
|
||||||
# real hosts:
|
# real hosts:
|
||||||
# { name = "crappy"; system = "armv7l-linux"; }
|
# { name = "crappy"; system = "armv7l-linux"; }
|
||||||
{ name = "cadey"; system = elaborate "aarch64-linux"; }
|
{ name = "cadey"; system = elaborate "aarch64-linux" {}; }
|
||||||
{ name = "desko"; system = elaborate "x86_64-linux"; }
|
{ name = "desko"; system = elaborate "x86_64-linux" {}; }
|
||||||
{ name = "flowy"; system = elaborate "x86_64-linux"; }
|
{ name = "flowy"; system = elaborate "x86_64-linux" {}; }
|
||||||
{ name = "lappy"; system = elaborate "x86_64-linux"; }
|
{ name = "lappy"; system = elaborate "x86_64-linux" {}; }
|
||||||
{ name = "moby"; system = elaborate "aarch64-linux"; }
|
{ name = "moby"; system = elaborate "aarch64-linux" {}; }
|
||||||
{ name = "servo"; system = elaborate "x86_64-linux"; }
|
{ name = "servo"; system = elaborate "x86_64-linux" {}; }
|
||||||
|
|
||||||
{ name = "rescue"; system = elaborate "x86_64-linux"; }
|
{ name = "rescue"; system = elaborate "x86_64-linux" {}; }
|
||||||
# pseudo hosts used for debugging
|
# pseudo hosts used for debugging
|
||||||
{ name = "baseline-x86_64"; system = elaborate "x86_64-linux"; }
|
{ name = "baseline-x86_64"; system = elaborate "x86_64-linux" {}; }
|
||||||
{ name = "baseline-aarch64"; system = elaborate "aarch64-linux"; }
|
{ name = "baseline-aarch64"; system = elaborate "aarch64-linux" {}; }
|
||||||
|
{ name = "static-x86_64"; system = elaborate "x86_64-linux" { static = true; }; }
|
||||||
|
{ name = "static-aarch64"; system = elaborate "aarch64-linux" { static = true; }; }
|
||||||
];
|
];
|
||||||
|
|
||||||
# subAttrNames :: AttrSet -> [ String ]
|
# subAttrNames :: AttrSet -> [ String ]
|
||||||
|
@@ -5,14 +5,16 @@ let
|
|||||||
pkgs = import ./pkgs.nix;
|
pkgs = import ./pkgs.nix;
|
||||||
preferences = import ./preferences.nix;
|
preferences = import ./preferences.nix;
|
||||||
cross = import ./cross.nix;
|
cross = import ./cross.nix;
|
||||||
|
static = import ./static.nix;
|
||||||
pkgs-ccache = import ./pkgs-ccache.nix;
|
pkgs-ccache = import ./pkgs-ccache.nix;
|
||||||
pkgs-debug = import ./pkgs-debug.nix;
|
pkgs-debug = import ./pkgs-debug.nix;
|
||||||
in
|
in
|
||||||
final: prev:
|
final: prev:
|
||||||
let
|
let
|
||||||
|
optional = cond: overlay: if cond then overlay else (_: _: {});
|
||||||
isCross = prev.stdenv.hostPlatform != prev.stdenv.buildPlatform;
|
isCross = prev.stdenv.hostPlatform != prev.stdenv.buildPlatform;
|
||||||
ifCross = overlay: if isCross then overlay else (_: _: {});
|
# isCross = !(prev.stdenv.buildPlatform.canExecute prev.stdenv.hostPlatform);
|
||||||
|
isStatic = prev.stdenv.hostPlatform.isStatic;
|
||||||
renderOverlays = overlays: builtins.foldl'
|
renderOverlays = overlays: builtins.foldl'
|
||||||
(acc: thisOverlay: acc // (thisOverlay final acc))
|
(acc: thisOverlay: acc // (thisOverlay final acc))
|
||||||
prev
|
prev
|
||||||
@@ -21,7 +23,8 @@ in
|
|||||||
renderOverlays [
|
renderOverlays [
|
||||||
pkgs
|
pkgs
|
||||||
preferences
|
preferences
|
||||||
(ifCross cross)
|
(optional isCross cross)
|
||||||
|
(optional isStatic static)
|
||||||
pkgs-ccache
|
pkgs-ccache
|
||||||
pkgs-debug
|
pkgs-debug
|
||||||
]
|
]
|
||||||
|
41
overlays/static.nix
Normal file
41
overlays/static.nix
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
final: prev:
|
||||||
|
with final;
|
||||||
|
let
|
||||||
|
inherit (stdenv.hostPlatform) hasSharedLibraries;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
# glibcLocales is null on musl, but some packages still refer to it.
|
||||||
|
# is this sensible? idk.
|
||||||
|
glibcLocales = final.pkgsCross.gnu64.glibcLocales;
|
||||||
|
|
||||||
|
# nixpkgs' gobject-introspection has all `isStatic` platforms as badPlatforms,
|
||||||
|
# but hopefully it's just `hasSharedLibraries == false` that's broken (untested)
|
||||||
|
# gobject-introspection = prev.gobject-introspection.overrideAttrs (upstream: {
|
||||||
|
# meta = upstream.meta // {
|
||||||
|
# badPlatforms = [];
|
||||||
|
# };
|
||||||
|
# });
|
||||||
|
|
||||||
|
# gobject-introspection = if hasSharedLibraries then prev.gobject-introspection else null;
|
||||||
|
|
||||||
|
libglvnd = prev.libglvnd.overrideAttrs (upstream: {
|
||||||
|
meta = upstream.meta // {
|
||||||
|
# mark as not bad, to unblock an assertion in SDL3.
|
||||||
|
#
|
||||||
|
# glvnd claims static linking isn't supported, but i think they're actually
|
||||||
|
# talking about the case of `dlopen` not being available. there's a different stdenv attr to check for that.
|
||||||
|
# <https://gitlab.freedesktop.org/glvnd/libglvnd/-/issues/212>
|
||||||
|
badPlatforms = [];
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
# networkmanager = prev.networkmanager.override {
|
||||||
|
# gobject-introspection = if hasSharedLibraries then gobject-introspection else null;
|
||||||
|
# };
|
||||||
|
|
||||||
|
# sdl3 = prev.sdl3.override {
|
||||||
|
# # ibusMinimal -> gobject-introspection -> doesn't eval.
|
||||||
|
# # TODO: upstream this fix, or a patch that build ibus w/o introspection.
|
||||||
|
# ibusSupport = !hasSharedLibraries;
|
||||||
|
# };
|
||||||
|
}
|
@@ -142,15 +142,37 @@ let
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
nixpkgsArgs = commonNixpkgsArgs // {
|
nativeNixpkgsArgs = commonNixpkgsArgs // {
|
||||||
config = {
|
config = {
|
||||||
allowUnfree = true; # NIXPKGS_ALLOW_UNFREE=1
|
allowUnfree = true; # NIXPKGS_ALLOW_UNFREE=1
|
||||||
allowBroken = true; # NIXPKGS_ALLOW_BROKEN=1
|
allowBroken = true; # NIXPKGS_ALLOW_BROKEN=1
|
||||||
|
allowUnsupportedSystem = true; # NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM=1
|
||||||
};
|
};
|
||||||
} // optionalAttrs (system != localSystem) {
|
};
|
||||||
|
nixpkgsArgs = nativeNixpkgsArgs // optionalAttrs (system != localSystem) {
|
||||||
# XXX(2023/12/11): cache.nixos.org uses `system = ...` instead of `hostPlatform.system`, and that choice impacts the closure of every package.
|
# XXX(2023/12/11): cache.nixos.org uses `system = ...` instead of `hostPlatform.system`, and that choice impacts the closure of every package.
|
||||||
# so avoid specifying hostPlatform.system on non-cross builds, so i can use upstream caches.
|
# so avoid specifying hostPlatform.system on non-cross builds, so i can use upstream caches.
|
||||||
crossSystem = system;
|
crossSystem = system;
|
||||||
|
# config = nativeNixpkgsArgs.config // optionalAttrs (system.isStatic && system.hasSharedLibraries) {
|
||||||
|
# # default nixpkgs' behavior when `isStatic` is to _never_ build shared objects.
|
||||||
|
# replaceCrossStdenv = { buildPackages, baseStdenv }: baseStdenv.override (old: {
|
||||||
|
# # mkDerivationFromStdenv = _stdenv: args: baseStdenv.mkDerivation (args // {
|
||||||
|
# # dontAddStaticConfigureFlags = args.dontAddStaticConfigureFlags or true;
|
||||||
|
# # });
|
||||||
|
# # mkDerivationFromStdenv = _stdenv: args: (baseStdenv.mkDerivation args).overrideAttrs (prev: {
|
||||||
|
# # dontAddStaticConfigureFlags = prev.dontAddStaticConfigureFlags or true;
|
||||||
|
# # # dontAddStaticConfigureFlags = args.dontAddStaticConfigureFlags or true;
|
||||||
|
# # });
|
||||||
|
# mkDerivationFromStdenv = _stdenv: args: (baseStdenv.mkDerivation args).overrideAttrs (prev: {
|
||||||
|
# # this is not wholly correct; goal is to undo some effects of pkgs/stdenv/adapters.nix' makeStatic
|
||||||
|
# # to build BOTH .a and .so files (but default to static)
|
||||||
|
# configureFlags = buildPackages.lib.remove "--disable-shared" (prev.configureFlags or args.configureFlags or []);
|
||||||
|
# # cmakeFlags = buildPackages.lib.remove "-DBUILD_SHARED_LIBS:BOOL=OFF" (
|
||||||
|
# # buildPackages.lib.remove "-DCMAKE_SKIP_INSTALL_RPATH=On" (prev.cmakeFlags or args.cmakeFlags or [])
|
||||||
|
# # );
|
||||||
|
# });
|
||||||
|
# });
|
||||||
|
# };
|
||||||
};
|
};
|
||||||
nixpkgs = import patchedSrc nixpkgsArgs;
|
nixpkgs = import patchedSrc nixpkgsArgs;
|
||||||
in
|
in
|
||||||
|
@@ -66,6 +66,12 @@ in
|
|||||||
hash = "sha256-zfGymC2uUpq10tr4LHLv3vQUmDe8zbL3Qm7sV/AzsQY=";
|
hash = "sha256-zfGymC2uUpq10tr4LHLv3vQUmDe8zbL3Qm7sV/AzsQY=";
|
||||||
})
|
})
|
||||||
|
|
||||||
|
(fetchpatch' {
|
||||||
|
name = "openssh: fix compilation to static hosts";
|
||||||
|
prUrl = "https://github.com/NixOS/nixpkgs/pull/420469";
|
||||||
|
hash = "sha256-mMJSb7Q+zFuTlCzwfGGaix17nitAK9Q9Syxxc2jqUy8=";
|
||||||
|
})
|
||||||
|
|
||||||
# (fetchpatch' {
|
# (fetchpatch' {
|
||||||
# # XXX(2025-01-06): patch does not produce valid binaries for cross
|
# # XXX(2025-01-06): patch does not produce valid binaries for cross
|
||||||
# name = "lua-language-server: fix cross compiling";
|
# name = "lua-language-server: fix cross compiling";
|
||||||
|
Reference in New Issue
Block a user