nixpkgs/pkgs/tools/package-management/nix/default.nix
Dan Peebles d990aa7163 Refactor nixos-install to separate out filesystem build logic
The key distinction I'm drawing is that there's a component that deals
with the store of the machine being built, and another component for
the store building it. The inner part of it assumes nothing from the
builder (doesn't need chroot or root powers) so it can run comfortably
inside a Nix build, as well as nixos-rebuild. I have some upcoming work
that will use that to significantly speed up and streamline image builds
for NixOS, especially on virtualized hosts like EC2, but it's also a
reasonable speedup on native hosts.
2017-04-16 16:09:41 +00:00

157 lines
5.3 KiB
Nix

{ lib, stdenv, fetchurl, fetchFromGitHub, perl, curl, bzip2, sqlite, openssl ? null, xz
, pkgconfig, boehmgc, perlPackages, libsodium, aws-sdk-cpp, brotli
, autoreconfHook, autoconf-archive, bison, flex, libxml2, libxslt, docbook5, docbook5_xsl
, storeDir ? "/nix/store"
, stateDir ? "/nix/var"
}:
let
common = { name, suffix ? "", src, patchPhase ? "", fromGit ? false }: stdenv.mkDerivation rec {
inherit name src patchPhase;
version = lib.getVersion name;
VERSION_SUFFIX = lib.optionalString fromGit suffix;
outputs = [ "out" "dev" "man" "doc" ];
nativeBuildInputs =
[ pkgconfig ]
++ lib.optionals (!lib.versionAtLeast version "1.12pre") [ perl ]
++ lib.optionals fromGit [ autoreconfHook autoconf-archive bison flex libxml2 libxslt docbook5 docbook5_xsl ];
buildInputs = [ curl openssl sqlite xz ]
++ lib.optional (stdenv.isLinux || stdenv.isDarwin) libsodium
++ lib.optional fromGit brotli # Since 1.12
++ lib.optional ((stdenv.isLinux || stdenv.isDarwin) && lib.versionAtLeast version "1.12pre")
(aws-sdk-cpp.override {
apis = ["s3"];
customMemoryManagement = false;
});
propagatedBuildInputs = [ boehmgc ];
# Note: bzip2 is not passed as a build input, because the unpack phase
# would end up using the wrong bzip2 when cross-compiling.
# XXX: The right thing would be to reinstate `--with-bzip2' in Nix.
postUnpack =
'' export CPATH="${bzip2.dev}/include"
export LIBRARY_PATH="${bzip2.out}/lib"
export CXXFLAGS="-Wno-error=reserved-user-defined-literal"
'';
configureFlags =
[ "--with-store-dir=${storeDir}"
"--localstatedir=${stateDir}"
"--sysconfdir=/etc"
"--disable-init-state"
"--enable-gc"
]
++ lib.optionals (!lib.versionAtLeast version "1.12pre") [
"--with-dbi=${perlPackages.DBI}/${perl.libPrefix}"
"--with-dbd-sqlite=${perlPackages.DBDSQLite}/${perl.libPrefix}"
"--with-www-curl=${perlPackages.WWWCurl}/${perl.libPrefix}"
];
makeFlags = "profiledir=$(out)/etc/profile.d";
installFlags = "sysconfdir=$(out)/etc";
doInstallCheck = true;
separateDebugInfo = stdenv.isLinux;
crossAttrs = {
postUnpack =
'' export CPATH="${bzip2.crossDrv}/include"
export NIX_CROSS_LDFLAGS="-L${bzip2.crossDrv}/lib -rpath-link ${bzip2.crossDrv}/lib $NIX_CROSS_LDFLAGS"
'';
configureFlags =
''
--with-store-dir=${storeDir} --localstatedir=${stateDir}
--with-dbi=${perlPackages.DBI}/${perl.libPrefix}
--with-dbd-sqlite=${perlPackages.DBDSQLite}/${perl.libPrefix}
--with-www-curl=${perlPackages.WWWCurl}/${perl.libPrefix}
--disable-init-state
--enable-gc
'' + stdenv.lib.optionalString (
stdenv.cross ? nix && stdenv.cross.nix ? system
) ''--with-system=${stdenv.cross.nix.system}'';
doInstallCheck = false;
};
enableParallelBuilding = true;
meta = {
description = "Powerful package manager that makes package management reliable and reproducible";
longDescription = ''
Nix is a powerful package manager for Linux and other Unix systems that
makes package management reliable and reproducible. It provides atomic
upgrades and rollbacks, side-by-side installation of multiple versions of
a package, multi-user package management and easy setup of build
environments.
'';
homepage = http://nixos.org/;
license = stdenv.lib.licenses.lgpl2Plus;
maintainers = [ stdenv.lib.maintainers.eelco ];
platforms = stdenv.lib.platforms.all;
};
passthru = { inherit fromGit; };
};
perl-bindings = { nix }: stdenv.mkDerivation {
name = "nix-perl-" + nix.version;
inherit (nix) src;
postUnpack = "sourceRoot=$sourceRoot/perl";
nativeBuildInputs =
[ perl pkgconfig curl nix libsodium ]
++ lib.optionals nix.fromGit [ autoreconfHook autoconf-archive ];
configureFlags =
[ "--with-dbi=${perlPackages.DBI}/${perl.libPrefix}"
"--with-dbd-sqlite=${perlPackages.DBDSQLite}/${perl.libPrefix}"
"--with-www-curl=${perlPackages.WWWCurl}/${perl.libPrefix}"
];
};
in rec {
nix = nixStable;
nixStable = (common rec {
name = "nix-1.11.8";
src = fetchurl {
url = "http://nixos.org/releases/nix/${name}/${name}.tar.xz";
sha256 = "69e0f398affec2a14c47b46fec712906429c85312d5483be43e4c34da4f63f67";
};
# Until 1.11.9 is released, we do this :)
patchPhase = ''
substituteInPlace src/libexpr/json-to-value.cc \
--replace 'std::less<Symbol>, gc_allocator<Value *>' \
'std::less<Symbol>, gc_allocator<std::pair<const Symbol, Value *> >'
sed -i '/if (settings.readOnlyMode) {/a curSchema = getSchema();' src/libstore/local-store.cc
'';
}) // { perl-bindings = nixStable; };
nixUnstable = (lib.lowPrio (common rec {
name = "nix-1.12${suffix}";
suffix = "pre5152_915f62fa";
src = fetchFromGitHub {
owner = "NixOS";
repo = "nix";
rev = "915f62fa19790d8f826aeb4dd3d2bb5bde2f67e9";
sha256 = "0mf7y7hvzw2x5dp482qy8774djr3vzcjaqq58cp82zdil8l7kwjd";
};
fromGit = true;
})) // { perl-bindings = perl-bindings { nix = nixUnstable; }; };
}