top-level/stage.nix: add static overlay
Adds the static overlay that can be used to build Nixpkgs statically. Can be used like: nix build pkgsStatic.hello Not all packages build, as some rely on dynamic linking. (cherry picked from commit 6d90a8b8948185a3118faf183f29f4b8de294675)
This commit is contained in:
parent
3170d617ef
commit
3c36dccd7c
10
pkgs/stdenv/darwin/portable-libsystem.sh
Normal file
10
pkgs/stdenv/darwin/portable-libsystem.sh
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# Make /nix/store/...-libSystem “portable” for static built binaries.
|
||||||
|
# This just rewrites everything in $1/bin to use the
|
||||||
|
# /usr/lib/libSystem.B.dylib that is provided on every macOS system.
|
||||||
|
|
||||||
|
fixupOutputHooks+=('fixLibsystemRefs $prefix')
|
||||||
|
|
||||||
|
fixLibsystemRefs() {
|
||||||
|
find "$1/bin" \
|
||||||
|
-exec install_name_tool -change @libsystem@ /usr/lib/libSystem.B.dylib {} \;
|
||||||
|
}
|
@ -160,6 +160,23 @@ let
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Fully static packages.
|
||||||
|
# Currently uses Musl on Linux (couldn’t get static glibc to work).
|
||||||
|
pkgsStatic = nixpkgsFun ({
|
||||||
|
crossOverlays = [ (import ./static.nix) ];
|
||||||
|
} // lib.optionalAttrs stdenv.hostPlatform.isLinux {
|
||||||
|
crossSystem = {
|
||||||
|
parsed = stdenv.hostPlatform.parsed // {
|
||||||
|
abi = {
|
||||||
|
"gnu" = lib.systems.parse.abis.musl;
|
||||||
|
"gnueabi" = lib.systems.parse.abis.musleabi;
|
||||||
|
"gnueabihf" = lib.systems.parse.abis.musleabihf;
|
||||||
|
}.${stdenv.hostPlatform.parsed.abi.name}
|
||||||
|
or lib.systems.parse.abis.musl;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
# The complete chain of package set builders, applied from top to bottom.
|
# The complete chain of package set builders, applied from top to bottom.
|
||||||
|
150
pkgs/top-level/static.nix
Normal file
150
pkgs/top-level/static.nix
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
# Overlay that builds static packages.
|
||||||
|
|
||||||
|
# Not all packages will build but support is done on a
|
||||||
|
# best effort basic.
|
||||||
|
#
|
||||||
|
# Note on Darwin/macOS: Apple does not provide a static libc
|
||||||
|
# so any attempts at static binaries are going to be very
|
||||||
|
# unsupported.
|
||||||
|
#
|
||||||
|
# Basic things like pkgsStatic.hello should work out of the box. More
|
||||||
|
# complicated things will need to be fixed with overrides.
|
||||||
|
|
||||||
|
self: super: let
|
||||||
|
inherit (super.stdenvAdapters) makeStaticBinaries
|
||||||
|
overrideInStdenv
|
||||||
|
makeStaticLibraries;
|
||||||
|
inherit (super.lib) foldl optional flip id optionalAttrs composeExtensions;
|
||||||
|
inherit (super) makeSetupHook;
|
||||||
|
|
||||||
|
# Best effort static binaries. Will still be linked to libSystem,
|
||||||
|
# but more portable than Nix store binaries.
|
||||||
|
makeStaticDarwin = stdenv: stdenv // {
|
||||||
|
mkDerivation = args: stdenv.mkDerivation (args // {
|
||||||
|
NIX_CFLAGS_LINK = toString (args.NIX_CFLAGS_LINK or "")
|
||||||
|
+ " -static-libgcc";
|
||||||
|
nativeBuildInputs = (args.nativeBuildInputs or []) ++ [ (makeSetupHook {
|
||||||
|
substitutions = {
|
||||||
|
libsystem = "${stdenv.cc.libc}/lib/libSystem.B.dylib";
|
||||||
|
};
|
||||||
|
} ../stdenv/darwin/portable-libsystem.sh) ];
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
staticAdapters = [ makeStaticLibraries ]
|
||||||
|
|
||||||
|
# Apple does not provide a static version of libSystem or crt0.o
|
||||||
|
# So we can’t build static binaries without extensive hacks.
|
||||||
|
++ optional (!super.stdenv.hostPlatform.isDarwin) makeStaticBinaries
|
||||||
|
|
||||||
|
++ optional super.stdenv.hostPlatform.isDarwin makeStaticDarwin
|
||||||
|
|
||||||
|
# Glibc doesn’t come with static runtimes by default.
|
||||||
|
# ++ optional (super.stdenv.hostPlatform.libc == "glibc") ((flip overrideInStdenv) [ self.stdenv.glibc.static ])
|
||||||
|
;
|
||||||
|
|
||||||
|
# Force everything to link statically.
|
||||||
|
haskellStaticAdapter = self: super: {
|
||||||
|
mkDerivation = attrs: super.mkDerivation (attrs // {
|
||||||
|
enableSharedLibraries = false;
|
||||||
|
enableSharedExecutables = false;
|
||||||
|
enableStaticLibraries = true;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
in {
|
||||||
|
stdenv = foldl (flip id) super.stdenv staticAdapters;
|
||||||
|
|
||||||
|
haskell = super.haskell // {
|
||||||
|
packageOverrides = composeExtensions
|
||||||
|
(super.haskell.packageOverrides or (_: _: {}))
|
||||||
|
haskellStaticAdapter;
|
||||||
|
};
|
||||||
|
|
||||||
|
ncurses = super.ncurses.override {
|
||||||
|
enableStatic = true;
|
||||||
|
};
|
||||||
|
libxml2 = super.libxml2.override {
|
||||||
|
enableShared = false;
|
||||||
|
enableStatic = true;
|
||||||
|
};
|
||||||
|
zlib = super.zlib.override {
|
||||||
|
static = true;
|
||||||
|
shared = false;
|
||||||
|
|
||||||
|
# Don’t use new stdenv zlib because
|
||||||
|
# it doesn’t like the --disable-shared flag
|
||||||
|
stdenv = super.stdenv;
|
||||||
|
};
|
||||||
|
xz = super.xz.override {
|
||||||
|
enableStatic = true;
|
||||||
|
};
|
||||||
|
busybox = super.busybox.override {
|
||||||
|
enableStatic = true;
|
||||||
|
};
|
||||||
|
v8 = super.v8.override {
|
||||||
|
static = true;
|
||||||
|
};
|
||||||
|
libiberty = super.libiberty.override {
|
||||||
|
staticBuild = true;
|
||||||
|
};
|
||||||
|
ipmitool = super.ipmitool.override {
|
||||||
|
static = true;
|
||||||
|
};
|
||||||
|
neon = super.neon.override {
|
||||||
|
static = true;
|
||||||
|
shared = false;
|
||||||
|
};
|
||||||
|
libjpeg = super.libjpeg.override {
|
||||||
|
static = true;
|
||||||
|
};
|
||||||
|
gifsicle = super.gifsicle.override {
|
||||||
|
static = true;
|
||||||
|
};
|
||||||
|
bzip2 = super.bzip2.override {
|
||||||
|
linkStatic = true;
|
||||||
|
};
|
||||||
|
optipng = super.optipng.override {
|
||||||
|
static = true;
|
||||||
|
};
|
||||||
|
openssl = super.openssl.override {
|
||||||
|
static = true;
|
||||||
|
|
||||||
|
# Don’t use new stdenv for openssl because it doesn’t like the
|
||||||
|
# --disable-shared flag
|
||||||
|
stdenv = super.stdenv;
|
||||||
|
};
|
||||||
|
boost = super.boost.override {
|
||||||
|
enableStatic = true;
|
||||||
|
enableShared = false;
|
||||||
|
};
|
||||||
|
gmp = super.gmp.override {
|
||||||
|
withStatic = true;
|
||||||
|
};
|
||||||
|
cdo = super.cdo.override {
|
||||||
|
enable_all_static = true;
|
||||||
|
};
|
||||||
|
gsm = super.gsm.override {
|
||||||
|
staticSupport = true;
|
||||||
|
};
|
||||||
|
parted = super.parted.override {
|
||||||
|
enableStatic = true;
|
||||||
|
};
|
||||||
|
libiconvReal = super.libiconvReal.override {
|
||||||
|
enableShared = false;
|
||||||
|
enableStatic = true;
|
||||||
|
};
|
||||||
|
perl = super.perl.override {
|
||||||
|
# Don’t use new stdenv zlib because
|
||||||
|
# it doesn’t like the --disable-shared flag
|
||||||
|
stdenv = super.stdenv;
|
||||||
|
};
|
||||||
|
|
||||||
|
darwin = super.darwin // {
|
||||||
|
libiconv = super.darwin.libiconv.override {
|
||||||
|
enableShared = false;
|
||||||
|
enableStatic = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user