Показаны сообщения с ярлыком Solaris. Показать все сообщения
Показаны сообщения с ярлыком Solaris. Показать все сообщения

среда, 28 марта 2012 г.

Установка Encode::Locale в perl 5.12 на Solaris 10

Устанавливал тут модули через CPAN, gcc и make в perl, скачанный с ресурса sunfreeware.com. Когда компилировал Encode::Locale, вылезло:
PERL_DL_NONLAZY=1 /usr/local/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t t/arg.t .. The locale codeset (ansi-1251) isn't one that perl can decode, stopped at /root/.cpan/build/Encode-Locale-1.03-n6CW0f/blib/lib/Encode/Locale.pm line 94.
Я не сильно прошарен по кодировкам и прочей ерунде по этой теме, но кажется в Solaris то, что во всех цивилизованных странах называется cp1251, именуется ansi-1251.

Моё решение — перекомпилировать модуль Encode, исправив файл lib/Encode/Alias.pm. Я внёс исправление в строку, добавляющую алиасы для кодировок cp1251 и других

define_alias(
qr/\b(?:cp|ibm|ms|windows|ansi)[-_ ]?(\d{2,4})$/i => '"cp$1"' );
Скомпилировалось, ядрён батон.

С любовью к продуктам корпорации Oracle,
Руслан

Исправление ошибки unrecognized option для линковщика solaris ld

/usr/local/bin/perl -MCPAN -e "install('Term::ReadKey')"

gcc -B/usr/ccs/bin/ -Wl,-E -G -L/usr/local/lib ReadKey.o -o blib/arch/auto/Term/ReadKey/ReadKey.so \
\

ld: fatal: unrecognized option '-E'

Установил /usr/local/bin/perl -MCPAN -e "install('ExtUtils::MakeMaker')"
В файле /usr/local/lib/perl5/5.12.3/sun4-solaris/Config_heavy.pl убрал -E (не поддерживается линковщиком Solaris) (опция включает то, что и так всегда работает для этого линковщика)

lddlflags=' -Wl,-E -G -L/usr/local/lib'
lddlflags=' -Wl,-G -L/usr/local/lib'

Использование GNU ld линковщика на Solaris

GCC в Solaris по умолчанию компилируется с опцией --with-ld=/usr/css/bin/ld, а значение этого параметра - адрес линковщика Solaris. К сожалению, GCC использует эту опцию поверх всех остальных, что означает он станет игнорировать переменную окружения LD, для указания альтернативного линковщика, такого как например /usr/sfw/bin/gld

К тому же, такие утилиты, как например libtool/autoconf будут поднимать вашу LD переменную с тем чтобы выяснить какие опции поддерживает линковщик, libtool, к сожалению, всё ещё вызывает GCC для стадии связывания, который будет игнорировать LD. Это делает проблематичным использование GNU ld без всяких грязных хаков типа:
mv /usr/ccs/bin/ld /usr/ccs/bin/ld.off
ln -s /usr/sfw/bin/ld /usr/ccs/bin/ld

Однако solaris ld принимает одну очень полезную переменную окружения. Эта переменная LD_ALTEXEC.

Solaris ld вызывает LD_ALTEXEC. Если вы устновите LD_ALTEXEC в '/usr/sfw/bin/gld', когда будет запущен /usr/ccs/bin/ld, он сразу выполнит /usr/sfw/bin/gld вместо себя с переданными ему параметрами. Итак, можно таки использовать любой линковщик! Ура!

[1] blogs.everycity.co.uk/alasdair/2011/03/using-the-gnu-ld-linker-on-solaris