Generate binary tarballs for installing Nix

For several platforms we don't currently have "native" Nix packages
(e.g. Mac OS X and FreeBSD).  This provides the next best thing: a
tarball containing the closure of Nix, plus a simple script
"nix-finish-install" that initialises the Nix database, registers the
paths in the closure as valid, and runs "nix-env -i /path/to/nix" to
initialise the user profile.

The tarball must be unpacked in the root directory.  It creates
/nix/store/... and /usr/bin/nix-finish-install.  Typical installation
is as follows:

  $ cd /
  $ tar xvf /path/to/nix-1.1pre1234_abcdef-x86_64-linux.tar.bz2
  $ nix-finish-install
  (if necessary add ~/.nix-profile/etc/profile.d/nix.sh to the shell
  login scripts)

After this, /usr/bin/nix-finish-install can be deleted, if desired.

The downside to the binary tarball is that it's pretty big (~55 MiB
for x86_64-linux).
This commit is contained in:
Eelco Dolstra 2012-05-22 18:36:54 -04:00
parent 591aab7e21
commit 6814b1dfa1
2 changed files with 68 additions and 1 deletions

View file

@ -63,7 +63,7 @@ let
build = build =
{ system ? "i686-linux" }: { system ? "x86_64-linux" }:
with import nixpkgs { inherit system; }; with import nixpkgs { inherit system; };
@ -80,9 +80,42 @@ let
--enable-gc --enable-gc
''; '';
enableParallelBuilding = true;
doInstallCheck = true; doInstallCheck = true;
}; };
binaryTarball =
{ system ? "x86_64-linux" }:
with import nixpkgs { inherit system; };
let
toplevel = build { inherit system; };
version = toplevel.src.version;
in
runCommand "nix-binary-tarball-${version}"
{ exportReferencesGraph = [ "closure" toplevel ];
buildInputs = [ perl ];
meta.description = "Distribution-independent Nix bootstrap binaries for ${system}";
}
''
storePaths=$(perl ${pathsFromGraph} ./closure)
printRegistration=1 perl ${pathsFromGraph} ./closure > $TMPDIR/reginfo
substitute ${./scripts/install-nix-from-closure.sh} $TMPDIR/install \
--subst-var-by nix ${toplevel} --subst-var-by regInfo /nix/store/reginfo
chmod +x $TMPDIR/install
fn=$out/nix-${version}-${system}.tar.bz2
mkdir -p $out/nix-support
echo "file binary-dist $fn" >> $out/nix-support/hydra-build-products
tar cvfj $fn \
--owner=root --group=root --absolute-names \
--transform "s,$TMPDIR/install,/usr/bin/nix-finish-install," \
--transform "s,$TMPDIR/reginfo,/nix/store/reginfo," \
$TMPDIR/install $TMPDIR/reginfo $storePaths
'';
coverage = coverage =
with import nixpkgs { system = "x86_64-linux"; }; with import nixpkgs { system = "x86_64-linux"; };

View file

@ -0,0 +1,34 @@
#! /bin/sh -e
nix=@nix@
regInfo=@regInfo@
if ! $nix/bin/nix-store --load-db < $regInfo; then
echo "$0: unable to register valid paths"
exit 1
fi
. @nix@/etc/profile.d/nix.sh
if ! $nix/bin/nix-env -i @nix@; then
echo "$0: unable to install Nix into your default profile"
exit 1
fi
# Add nix.sh to the shell's profile.d directory.
p=$NIX_LINK/etc/profile.d/nix.sh
if [ -w /etc/profile.d ]; then
ln -s $p /etc/profile.d/
elif [ -w /usr/local/etc/profile.d ]; then
ln -s $p /usr/local/etc/profile.d/
else
cat <<EOF
Installation finished. To ensure that the necessary environment
variables are set, please add the line
source $p
to your shell profile (e.g. ~/.profile).
EOF
fi