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:
Alyssa Ross 2021-08-18 17:15:47 +00:00
parent 158d92cbb2
commit 6e6c8b7338
2 changed files with 24 additions and 1 deletions

View File

@ -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"

View File

@ -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)