perlPackages: Add cross-compilation support.
This involved: * Installing miniperl as $dev/bin/perl * Setting miniperl to take INC from lib/perl5/{site_perl/,}cross_perl/${version} as well as lib/perl5/{site_perl/,}/${version}/${runtimeArch}, in that order. miniperl taking from runtimeArch is not really correct, but it works in some pure-perl cases (e.g. Config.pm) and can be overridden with the cross_perl variant. * Installing perl-cross's stubs into $dev/lib/perl5/cross_perl/${version} * Patching MakeMaker.pm to gracefully degrade (very slightly) if B.pm can't be loaded, which it can't in cross-compilation. * Passing the right build-time and runtime perls to Makefile.PL
This commit is contained in:
parent
8e6520540e
commit
306d5cdf03
|
@ -177,5 +177,18 @@ you need it.</para>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section xml:id="ssec-perl-cross-compilation"><title>Cross-compiling modules</title>
|
||||||
|
|
||||||
|
<para>Nixpkgs has experimental support for cross-compiling Perl
|
||||||
|
modules. In many cases, it will just work out of the box, even for
|
||||||
|
modules with native extensions. Sometimes, however, the Makefile.PL
|
||||||
|
for a module may (indirectly) import a native module. In that case,
|
||||||
|
you will need to make a stub for that module that will satisfy the
|
||||||
|
Makefile.PL and install it into
|
||||||
|
<filename>lib/perl5/site_perl/cross_perl/${perl.version}</filename>.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
diff -Naur a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm
|
||||||
|
--- a/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm 2017-06-30 17:03:20.000000000 -0400
|
||||||
|
+++ b/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm 2018-02-28 10:06:37.031237946 -0500
|
||||||
|
@@ -1267,7 +1267,12 @@
|
||||||
|
my $value = shift;
|
||||||
|
return $value if $UNDER_CORE;
|
||||||
|
my $tvalue = '';
|
||||||
|
- require B;
|
||||||
|
+ eval {
|
||||||
|
+ require B;
|
||||||
|
+ };
|
||||||
|
+ if ($@) {
|
||||||
|
+ return $tvalue;
|
||||||
|
+ }
|
||||||
|
my $sv = B::svref_2object(\$value);
|
||||||
|
my $magic = ref($sv) eq 'B::PVMG' ? $sv->MAGIC : undef;
|
||||||
|
while ( $magic ) {
|
|
@ -1,4 +1,6 @@
|
||||||
{ lib, stdenv, fetchurlBoot, buildPackages, enableThreading ? stdenv ? glibc, fetchpatch }:
|
{ lib, stdenv, fetchurlBoot, buildPackages
|
||||||
|
, enableThreading ? stdenv ? glibc, fetchpatch, makeWrapper
|
||||||
|
}:
|
||||||
|
|
||||||
with lib;
|
with lib;
|
||||||
|
|
||||||
|
@ -29,7 +31,8 @@ let
|
||||||
};
|
};
|
||||||
|
|
||||||
# TODO: Add a "dev" output containing the header files.
|
# TODO: Add a "dev" output containing the header files.
|
||||||
outputs = [ "out" "man" "devdoc" ];
|
outputs = [ "out" "man" "devdoc" ] ++
|
||||||
|
stdenv.lib.optional crossCompiling "dev";
|
||||||
setOutputFlags = false;
|
setOutputFlags = false;
|
||||||
|
|
||||||
patches =
|
patches =
|
||||||
|
@ -45,7 +48,8 @@ let
|
||||||
})
|
})
|
||||||
++ optional stdenv.isSunOS ./ld-shared.patch
|
++ optional stdenv.isSunOS ./ld-shared.patch
|
||||||
++ optional stdenv.isDarwin ./cpp-precomp.patch
|
++ optional stdenv.isDarwin ./cpp-precomp.patch
|
||||||
++ optional (stdenv.isDarwin && versionAtLeast version "5.24") ./sw_vers.patch;
|
++ optional (stdenv.isDarwin && versionAtLeast version "5.24") ./sw_vers.patch
|
||||||
|
++ optional crossCompiling ./MakeMaker-cross.patch;
|
||||||
|
|
||||||
postPatch = ''
|
postPatch = ''
|
||||||
pwd="$(type -P pwd)"
|
pwd="$(type -P pwd)"
|
||||||
|
@ -117,6 +121,28 @@ let
|
||||||
if stdenv.cc.cc or null != null then stdenv.cc.cc else "/no-such-path"
|
if stdenv.cc.cc or null != null then stdenv.cc.cc else "/no-such-path"
|
||||||
}" /no-such-path \
|
}" /no-such-path \
|
||||||
--replace "$man" /no-such-path
|
--replace "$man" /no-such-path
|
||||||
|
'' + stdenv.lib.optionalString crossCompiling
|
||||||
|
''
|
||||||
|
mkdir -p $dev/lib/perl5/cross_perl/${version}
|
||||||
|
for dir in cnf/{stub,cpan}; do
|
||||||
|
cp -r $dir/* $dev/lib/perl5/cross_perl/${version}
|
||||||
|
done
|
||||||
|
|
||||||
|
mkdir -p $dev/bin
|
||||||
|
install -m755 miniperl $dev/bin/perl
|
||||||
|
|
||||||
|
export runtimeArch="$(ls $out/lib/perl5/site_perl/${version})"
|
||||||
|
# wrapProgram should use a runtime-native SHELL by default, but
|
||||||
|
# it actually uses a buildtime-native one. If we ever fix that,
|
||||||
|
# we'll need to fix this to use a buildtime-native one.
|
||||||
|
#
|
||||||
|
# Adding the arch-specific directory is morally incorrect, as
|
||||||
|
# miniperl can't load the native modules there. However, it can
|
||||||
|
# (and sometimes needs to) load and run some of the pure perl
|
||||||
|
# code there, so we add it anyway. When needed, stubs can be put
|
||||||
|
# into $dev/lib/perl5/cross_perl/${version}.
|
||||||
|
wrapProgram $dev/bin/perl --prefix PERL5LIB : \
|
||||||
|
"$dev/lib/perl5/cross_perl/${version}:$out/lib/perl5/${version}:$out/lib/perl5/${version}/$runtimeArch"
|
||||||
''; # */
|
''; # */
|
||||||
|
|
||||||
meta = {
|
meta = {
|
||||||
|
@ -139,7 +165,7 @@ let
|
||||||
sha256 = "1gh8w9m5if2s0lrx2x8f8grp74d1l6d46m8jglpjm5a1kf55j810";
|
sha256 = "1gh8w9m5if2s0lrx2x8f8grp74d1l6d46m8jglpjm5a1kf55j810";
|
||||||
};
|
};
|
||||||
|
|
||||||
depsBuildBuild = [ buildPackages.stdenv.cc ];
|
depsBuildBuild = [ buildPackages.stdenv.cc makeWrapper ];
|
||||||
|
|
||||||
postUnpack = ''
|
postUnpack = ''
|
||||||
unpackFile ${perl-cross-src}
|
unpackFile ${perl-cross-src}
|
||||||
|
@ -150,6 +176,11 @@ let
|
||||||
'';
|
'';
|
||||||
|
|
||||||
configurePlatforms = [ "build" "host" "target" ];
|
configurePlatforms = [ "build" "host" "target" ];
|
||||||
|
|
||||||
|
inherit version;
|
||||||
|
|
||||||
|
# TODO merge setup hooks
|
||||||
|
setupHook = ./setup-hook-cross.sh;
|
||||||
});
|
});
|
||||||
in rec {
|
in rec {
|
||||||
perl = perl524;
|
perl = perl524;
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
addPerlLibPath () {
|
||||||
|
addToSearchPath PERL5LIB $1/lib/perl5/site_perl/@version@
|
||||||
|
addToSearchPath PERL5LIB $1/lib/perl5/site_perl/cross_perl/@version@
|
||||||
|
# Adding the arch-specific directory is morally incorrect, as
|
||||||
|
# miniperl can't load the native modules there. However, it can
|
||||||
|
# (and sometimes needs to) load and run some of the pure perl
|
||||||
|
# code there, so we add it anyway. When needed, stubs can be put
|
||||||
|
# into $1/lib/perl5/site_perl/cross_perl/@version@
|
||||||
|
addToSearchPath PERL5LIB $1/lib/perl5/site_perl/@version@/@runtimeArch@
|
||||||
|
}
|
||||||
|
|
||||||
|
addEnvHooks "$targetOffset" addPerlLibPath
|
|
@ -22,7 +22,7 @@ preConfigure() {
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
perl Makefile.PL PREFIX=$out INSTALLDIRS=site $makeMakerFlags
|
perl Makefile.PL PREFIX=$out INSTALLDIRS=site $makeMakerFlags PERL=$(type -P perl) FULLPERL=$perl/bin/perl
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
perl:
|
perl:
|
||||||
|
|
||||||
{ buildInputs ? [], name, ... } @ attrs:
|
{ nativeBuildInputs ? [], name, ... } @ attrs:
|
||||||
|
|
||||||
perl.stdenv.mkDerivation (
|
perl.stdenv.mkDerivation (
|
||||||
{
|
{
|
||||||
|
@ -27,6 +27,7 @@ perl.stdenv.mkDerivation (
|
||||||
{
|
{
|
||||||
name = "perl-" + name;
|
name = "perl-" + name;
|
||||||
builder = ./builder.sh;
|
builder = ./builder.sh;
|
||||||
buildInputs = buildInputs ++ [ perl ];
|
nativeBuildInputs = nativeBuildInputs ++ [ (perl.dev or perl) ];
|
||||||
|
inherit perl;
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue