diff --git a/pkgs/build-support/build-fhs-chrootenv/default.nix b/pkgs/build-support/build-fhs-chrootenv/default.nix index 41c60ea5fe8d..38bd3623d29e 100644 --- a/pkgs/build-support/build-fhs-chrootenv/default.nix +++ b/pkgs/build-support/build-fhs-chrootenv/default.nix @@ -14,11 +14,36 @@ assert targetPkgs != null -> multiPkgs != null; assert multiPkgs != null -> targetPkgs != null; assert targetPkgs != null -> pkgs == []; + +# HOWTO: +# If pkgs is defined buildFHSChrootEnv will run in legacy mode. This means +# it will build all pkgs contained in pkgs and basePkgs and then just merge +# all of their contents together via buildEnv. +# +# The new way is to define both targetPkgs and multiPkgs. These two are +# functions which get a pkgs environment supplied and should then return a list +# of packages based this environment. +# For example: targetPkgs = pkgs: [ pkgs.nmap ]; +# +# All packages (most likeley programs) placed in targetPkgs will only be +# installed once--matching the hosts architecture (64bit on x86_64 and 32bit on +# x86). These packages will populate the chroot directory tree. +# +# Packages (most likeley libraries) defined in multiPkgs will be installed once +# on x86 systems and twice on x86_64 systems. +# On x86 they will just be merge with the packages defined in targetPkgs. +# On x86_64 they will be added to targetPkgs and in addition their 32bit +# versions will also be installed. The final directory should look as follows: +# /lib will include 32bit libraries from multiPkgs +# /lib32 will link to /lib +# /lib64 will include 64bit libraries from multiPkgs and targetPkgs +# /x86 will contain a complete 32bit environment composed by multiPkgs + let is64Bit = system == "x86_64-linux"; # enable multi builds on x86_64 hosts if pakgs_target/multi are defined isMultiBuild = is64Bit && targetPkgs != null; - isNormalBuild = !isMultiBuild; + isTargetBuild = !isMultiBuild; # list of packages (usually programs) which will only be installed for the # hosts architecture @@ -75,7 +100,7 @@ let destroySh = ./destroy.sh.in; linkProfile = profile: '' - for i in ${profile}/{etc,bin,lib{,32,64},sbin,share,var}; do + for i in ${profile}/{etc,bin,sbin,share,var}; do if [ -x "$i" ] then ln -s "$i" @@ -86,9 +111,12 @@ let # the target profile is the actual profile that will be used for the chroot setupTargetProfile = '' ${linkProfile staticUsrProfileTarget} + ${setupLibDirs} + mkdir -m0755 usr cd usr ${linkProfile staticUsrProfileTarget} + ${setupLibDirs} cd .. ''; @@ -97,21 +125,30 @@ let # /lib, /lib32 -> links to 32bit binaries # /lib64 -> links to 64bit binaries # /usr/lib* -> same as above - setupMultiProfile = if isNormalBuild then "" else '' + setupMultiProfile = if isTargetBuild then "" else '' mkdir -m0755 x86 cd x86 ${linkProfile staticUsrProfileMulti} cd .. - - ${setupMultiLibDirs} - - cd usr - ${setupMultiLibDirs} - cd .. ''; - setupMultiLibDirs = '' - rm -f lib lib32 lib64 + setupLibDirs = if isTargetBuild then setupLibDirs_target + else setupLibDirs_multi; + + # setup library paths only for the targeted architecture + setupLibDirs_target = '' + mkdir -m0755 lib + + # copy content of targetPaths + cp -rsf ${staticUsrProfileTarget}/lib/* lib/ + + # copy gcc libs + cp -rsf ${choosenGcc.gcc}/lib/* lib/ + + ''; + + # setup /lib, /lib32 and /lib64 + setupLibDirs_multi = '' mkdir -m0755 lib mkdir -m0755 lib64 ln -s lib lib32 @@ -120,12 +157,13 @@ let cp -rsf ${staticUsrProfileTarget}/lib/32/* lib/ # copy content of multiPaths (32bit libs) - cp -rsf ${staticUsrProfileMulti}/lib/* lib/ + cp -rsf ${staticUsrProfileMulti}/lib/* lib/ # copy content of targetPaths (64bit libs) - cp -rsf ${staticUsrProfileTarget}/lib/* lib64/ + cp -rsf ${staticUsrProfileTarget}/lib/* lib64/ + # most 64bit only libs put their stuff into /lib - # some pkgs (like gcc_multi) put 32bit libs into /lib 64bit libs into /lib64 + # some pkgs (like gcc_multi) put 32bit libs into and /lib 64bit libs into /lib64 # by overwriting these we will hopefully catch all these cases # in the end /lib should only contain 32bit and /lib64 only 64bit libs cp -rsf ${staticUsrProfileTarget}/lib64/* lib64/