nixpkgs/pkgs/build-support/build-fhs-chrootenv/default.nix

84 lines
3.2 KiB
Nix

{stdenv, glibc, glibcLocales, gcc, coreutils, diffutils, findutils, gnused, gnugrep, gnutar, gzip, bzip2,
bashInteractive, xz, shadow, gawk, less, buildEnv}:
{name, pkgs ? [], profile ? ""}:
let
basePkgs = [ glibc glibcLocales gcc coreutils diffutils findutils gnused gnugrep gnutar gzip bzip2
bashInteractive xz shadow gawk less ];
# Compose a global profile for the chroot environment
profilePkg = stdenv.mkDerivation {
name = "${name}-chrootenv-profile";
buildCommand = ''
mkdir -p $out/etc
cat >> $out/etc/profile << "EOF"
export PS1='${name}-chrootenv:\u@\h:\w\$ '
${profile}
EOF
'';
};
paths = basePkgs ++ [ profilePkg ] ++ pkgs;
# Composes a /usr like directory structure
staticUsrProfile = buildEnv {
name = "system-profile";
inherit paths;
};
# References to shell scripts that set up or tear down the environment
initSh = ./init.sh.in;
mountSh = ./mount.sh.in;
loadSh = ./load.sh.in;
umountSh = ./umount.sh.in;
destroySh = ./destroy.sh.in;
in
stdenv.mkDerivation {
name = "${name}-chrootenv";
buildCommand = ''
mkdir -p $out/sw
cd $out/sw
for i in ${staticUsrProfile}/{etc,bin,lib{,32,64},sbin,var}
do
if [ -x "$i" ]
then
ln -s "$i"
fi
done
ln -s ${staticUsrProfile} usr
cd ..
mkdir -p bin
cd bin
sed -e "s|@chrootEnv@|$out|g" \
-e "s|@name@|${name}|g" \
-e "s|@shell@|${stdenv.shell}|g" \
${initSh} > init-${name}-chrootenv
chmod +x init-${name}-chrootenv
sed -e "s|@shell@|${stdenv.shell}|g" \
-e "s|@name@|${name}|g" \
${mountSh} > mount-${name}-chrootenv
chmod +x mount-${name}-chrootenv
sed -e "s|@shell@|${stdenv.shell}|g" \
-e "s|@name@|${name}|g" \
${loadSh} > load-${name}-chrootenv
chmod +x load-${name}-chrootenv
sed -e "s|@shell@|${stdenv.shell}|g" \
-e "s|@name@|${name}|g" \
${umountSh} > umount-${name}-chrootenv
chmod +x umount-${name}-chrootenv
sed -e "s|@chrootEnv@|$out|g" \
-e "s|@shell@|${stdenv.shell}|g" \
-e "s|@name@|${name}|g" \
${destroySh} > destroy-${name}-chrootenv
chmod +x destroy-${name}-chrootenv
'';
}