Reputation: 791
I have a 64-bit CentOS 6 system running a custom-built version of Perl 5.12.5, that is build for 32-bits. (Alas, this is because we are using the same RPMs for 32-bit and 64-bit systems.)
When I build XS modules (e.g. JSON::XS) on the server, it fails because it's building 64-bit libraries. I get an error like
Can't load '.cpanm/work/1370279501.28897/JSON-XS-2.33/blib/arch
/auto/JSON/XS/XS.so' for module JSON::XS: .cpanm/work/137027950
1.28897/JSON-XS-2.33/blib/arch/auto/JSON/XS/XS.so: wrong ELF class: ELFCLASS64
at /opt/perl/lib/5.12.5/i686-linux/DynaLoader.pm line 200.
I've tried setting the CFLAGS variable to "-m32-bit" but it does not work.
What do I need to do to compile XS modules properly? Ideally, I'd like something that works with cpanminus but can use cpan or cpanplus if need be.
Upvotes: 6
Views: 1184
Reputation: 2466
Turns out this answer works for me:
wwalker $ PERL_MM_OPT='CCFLAGS="-m32 -march=i686" LDDLFLAGS="-m32 -march=i686"' /opt/depot/perl-5.8.5/bin/perl -MCPAN -e shell
cpan shell -- CPAN exploration and modules installation (v1.7601)
ReadLine support enabled
cpan> install DBIx::Class
Upvotes: 1
Reputation: 30225
Perl's build system (in particular, ExtUtils::MakeMaker and ExtUtils::CBuilder) assumes the compilation platform that was used to build that perl is also usable runtime platform. Evidently that's not the case here.
The obvious solution is to compile perl with options that would result in the same executables on both toolchains. This is rather tricky.
Upvotes: 2