s6-rc: fix cross builds that run s6-rc-compile
The reason for this change is explained in the long comment I added. Here's a simple example of the problem: let pkgs = import <nixpkgs> { crossSystem.system = "aarch64-linux"; }; in pkgs.callPackage ({ stdenv, s6-rc }: stdenv.mkDerivation { name = "s6-rc-compiled"; nativeBuildInputs = [ s6-rc ]; buildCommand = '' mkdir in s6-rc-compile $out in ''; }) {} We're cross compiling for aarch64 here, so we'd expect the scripts generated by this derivation to be things we could run on aarch64. But when I build this on my x86_64 machine, without this change applied, $out/servicedirs/s6rc-oneshot-runner/run gets generated full of references to x86_64 non-cross store paths for execline, s6, and s6-rc. With this change applied, the scripts generated by the above expression now refer to the cross-compiled aarch64 store paths for execline, s6, and s6-rc.
This commit is contained in:
parent
158d92cbb2
commit
6e6c8b7338
@ -15,6 +15,8 @@
|
||||
# TODO(Profpatsch): automatically infer most of these
|
||||
# : list string
|
||||
, configureFlags
|
||||
# : string
|
||||
, postConfigure ? null
|
||||
# mostly for moving and deleting files from the build directory
|
||||
# : lines
|
||||
, postInstall
|
||||
@ -79,6 +81,8 @@ in stdenv.mkDerivation {
|
||||
++ (lib.optional stdenv.isDarwin
|
||||
"--build=${stdenv.hostPlatform.system}");
|
||||
|
||||
inherit postConfigure;
|
||||
|
||||
# TODO(Profpatsch): ensure that there is always a $doc output!
|
||||
postInstall = ''
|
||||
echo "Cleaning & moving common files"
|
||||
|
@ -1,4 +1,4 @@
|
||||
{ lib, skawarePackages }:
|
||||
{ lib, stdenv, skawarePackages, targetPackages }:
|
||||
|
||||
with skawarePackages;
|
||||
|
||||
@ -30,6 +30,25 @@ buildPackage {
|
||||
"--with-dynlib=${s6.out}/lib"
|
||||
];
|
||||
|
||||
# s6-rc-compile generates built-in service definitions containing
|
||||
# absolute paths to execline, s6, and s6-rc programs. If we're
|
||||
# running s6-rc-compile as part of a Nix derivation, and we want to
|
||||
# cross-compile that derivation, those paths will be wrong --
|
||||
# they'll be for execline, s6, and s6-rc on the platform we're
|
||||
# running s6-rc-compile on, not the platform we're targeting.
|
||||
#
|
||||
# We can detect this special case of s6-rc being used at build time
|
||||
# in a derivation that's being cross-compiled, because that's the
|
||||
# only time hostPlatform != targetPlatform. When that happens we
|
||||
# modify s6-rc-compile to use the configuration headers for the
|
||||
# system we're cross-compiling for.
|
||||
postConfigure = lib.optionalString (stdenv.hostPlatform != stdenv.targetPlatform) ''
|
||||
substituteInPlace src/s6-rc/s6-rc-compile.c \
|
||||
--replace '<execline/config.h>' '"${targetPackages.execline.dev}/include/execline/config.h"' \
|
||||
--replace '<s6/config.h>' '"${targetPackages.s6.dev}/include/s6/config.h"' \
|
||||
--replace '<s6-rc/config.h>' '"${targetPackages.s6-rc.dev}/include/s6-rc/config.h"'
|
||||
'';
|
||||
|
||||
postInstall = ''
|
||||
# remove all s6 executables from build directory
|
||||
rm $(find -name "s6-rc-*" -type f -mindepth 1 -maxdepth 1 -executable)
|
||||
|
Loading…
Reference in New Issue
Block a user