mirror of
https://github.com/ilyakooo0/nixpkgs.git
synced 2024-09-22 13:08:39 +03:00
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
|
# TODO(Profpatsch): automatically infer most of these
|
||||||
# : list string
|
# : list string
|
||||||
, configureFlags
|
, configureFlags
|
||||||
|
# : string
|
||||||
|
, postConfigure ? null
|
||||||
# mostly for moving and deleting files from the build directory
|
# mostly for moving and deleting files from the build directory
|
||||||
# : lines
|
# : lines
|
||||||
, postInstall
|
, postInstall
|
||||||
@ -79,6 +81,8 @@ in stdenv.mkDerivation {
|
|||||||
++ (lib.optional stdenv.isDarwin
|
++ (lib.optional stdenv.isDarwin
|
||||||
"--build=${stdenv.hostPlatform.system}");
|
"--build=${stdenv.hostPlatform.system}");
|
||||||
|
|
||||||
|
inherit postConfigure;
|
||||||
|
|
||||||
# TODO(Profpatsch): ensure that there is always a $doc output!
|
# TODO(Profpatsch): ensure that there is always a $doc output!
|
||||||
postInstall = ''
|
postInstall = ''
|
||||||
echo "Cleaning & moving common files"
|
echo "Cleaning & moving common files"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{ lib, skawarePackages }:
|
{ lib, stdenv, skawarePackages, targetPackages }:
|
||||||
|
|
||||||
with skawarePackages;
|
with skawarePackages;
|
||||||
|
|
||||||
@ -30,6 +30,25 @@ buildPackage {
|
|||||||
"--with-dynlib=${s6.out}/lib"
|
"--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 = ''
|
postInstall = ''
|
||||||
# remove all s6 executables from build directory
|
# remove all s6 executables from build directory
|
||||||
rm $(find -name "s6-rc-*" -type f -mindepth 1 -maxdepth 1 -executable)
|
rm $(find -name "s6-rc-*" -type f -mindepth 1 -maxdepth 1 -executable)
|
||||||
|
Loading…
Reference in New Issue
Block a user