perlsolaris
СОДЕРЖАНИЕ
- НАЗВАНИЕ
- ОПИСАНИЕ
- РЕСУРСЫ
- НАСТРОЙКА
- ВЫПОЛНЕНИЕ CONFIGURE.
- ПРОБЛЕМЫ С MAKE.
- ТЕСТИРОВАНИЕ MAKE
- КРОСС-КОМПИЛЯЦИЯ
- ПРЕКОМПИЛИРОВАННЫЕ БИНАРИИ PERL ДЛЯ SOLARIS.
- ПРОБЛЕМЫ С РАБОТОЙ PERL НА SOLARIS.
- МОДУЛИ, СПЕЦИФИЧНЫЕ ДЛЯ SOLARIS.
- ПРОБЛЕМЫ С МОДУЛЯМИ, СПЕЦИФИЧНЫМИ ДЛЯ SOLARIS.
- SunOS 4.x
- АВТОР
НАЗВАНИЕ
perlsolaris - Perl версия 5 на системах Solaris
ОПИСАНИЕ
Этот документ описывает различные особенности операционной системы Solaris от Sun, которые повлияют на то, как будет компилироваться и/или выполняться Perl версии 5 (далее просто perl). Некоторые проблемы, связанные со старой SunOS 4.x, также обсуждаются, хотя они могут быть устаревшими.
По большей части, всё должно работать.
Начиная с Solaris 8, perl5.00503 (или выше) поставляется с операционной системой, поэтому вам, возможно, даже не придётся создавать новую версию perl. Версия, поставляемая Sun, установлена в /usr/perl5 с /usr/bin/perl, указывающим на /usr/perl5/bin/perl. Не трогайте эту установку, если вы не знаете, что делаете. Если вы удалите perl, поставляемый с ОС, некоторые части вашей системы перестанут работать. Если вы хотите установить более новую версию perl, установите её с другим префиксом, отличным от /usr/perl5. Общие префиксы — /usr/local и /opt/perl.
Вы можете поместить вашу версию perl в переменную PATH всех пользователей, изменив ссылку /usr/bin/perl. Скорее всего, это безопасно, так как большинство скриптов perl, поставляемых с Solaris, используют явный путь. (Есть несколько исключений, таких как /usr/bin/rpm2cpio и /etc/rcm/scripts/README, но они достаточно универсальны, чтобы фактическая версия perl, вероятно, не имела особого значения.)
Solaris поставляется с набором модулей, специфичных для Solaris. Если вы решите установить свою собственную версию perl, вы найдёте исходный код многих из этих модулей в CPAN под пространством имён Sun::Solaris::.
Solaris может включать две версии perl, например, Solaris 9 включает как 5.005_03, так и 5.6.1. Это сделано для обеспечения стабильности между версиями Solaris, в случаях, когда более поздняя версия perl несовместима с версией, включённой в предыдущую версию Solaris. Версия perl по умолчанию всегда будет самой последней, и, как правило, старая версия будет храниться только для одного выпуска Solaris. Также обратите внимание, что версия perl по умолчанию НЕ будет настроена на поиск модулей в старой версии, опять же из-за проблем совместимости/стабильности. Вследствие этого, если вы обновите Solaris, вам придётся перестроить/переустановить любые дополнительные модули CPAN, которые вы установили для предыдущей версии Solaris. Обратитесь к странице справки CPAN по «autobundle» для быстрого способа сделать это.
В качестве временной меры вы можете либо изменить строку #! в ваших скриптах, чтобы явно указать старую версию perl, например, в Solaris 9 используйте #!/usr/perl5/5.00503/bin/perl для использования версии perl, которая была по умолчанию для Solaris 8, или, если у вас много скриптов, удобнее сделать старую версию perl по умолчанию в вашей системе. Вы можете сделать это, изменив соответствующие символические ссылки в /usr/perl5 (пример для Solaris 9):
# cd /usr/perl5
# rm bin man pod
# ln -s ./5.00503/bin
# ln -s ./5.00503/man
# ln -s ./5.00503/lib/pod
# rm /usr/bin/perl
# ln -s ../perl5/5.00503/bin/perl /usr/bin/perl В обоих случаях это следует рассматривать только как временную меру — вам следует обновить до более поздней версии perl как можно скорее.
Обратите также внимание, что утилиты perl (например, perldoc) и любые, добавленные модулями, которые вы устанавливаете, будут находиться в /usr/perl5/bin, поэтому этот каталог следует добавить в ваш PATH.
Номера версий Solaris.
Для согласованности с распространённой практикой, скрипт Configure perl выполняет некоторые незначительные изменения в имени операционной системы и номере версии, как сообщается командой uname. Вот частичная таблица преобразования:
Sun: perl's Configure:
uname uname -r Name osname osvers
SunOS 4.1.3 Solaris 1.1 sunos 4.1.3
SunOS 5.6 Solaris 2.6 solaris 2.6
SunOS 5.8 Solaris 8 solaris 2.8
SunOS 5.9 Solaris 9 solaris 2.9
SunOS 5.10 Solaris 10 solaris 2.10 Полную таблицу можно найти в FAQ Sun Managers по ftp://ftp.cs.toronto.edu/pub/jdd/sunmanagers/faq в разделе "9.1) Какие модели Sun работают с какими версиями SunOS?".
РЕСУРСЫ
Существует множество источников информации о Solaris. Вот несколько важных для perl:
- FAQ Solaris
-
FAQ Solaris доступен по адресу http://www.science.uva.nl/pub/solaris/solaris2.html.
FAQ Sun Managers доступен по адресу ftp://ftp.cs.toronto.edu/pub/jdd/sunmanagers/faq
- Предкомпилированные бинарники
-
Предкомпилированные бинарники, ссылки на множество сайтов и многое другое доступны по адресу http://www.sunfreeware.com/ и http://www.blastwave.org/.
- Документация Solaris
-
Вся документация Solaris доступна онлайн по адресу http://docs.sun.com/.
НАСТРОЙКА
Проблемы с извлечением файлов на Solaris.
Убедитесь, что для извлечения файла perl-5.x.x.tar.gz используется программа tar, скомпилированная под Solaris (а не SunOS 4.x). Не используйте GNU tar, скомпилированный для SunOS4 на Solaris. (GNU tar, скомпилированный для Solaris, должен работать.) Когда вы запускаете бинарники SunOS4 на Solaris, система исполнения магическим образом изменяет имена путей, соответствующие m#lib/locale#, так что когда tar пытается создать lib/locale.pm, вместо этого создаётся файл с именем lib/oldlocale.pm. Если вы обнаружили это слишком поздно и все-таки использовали скомпилированный под SunOS4 tar, вам нужно найти неправильно переименованный файл и переместить его обратно в lib/locale.pm.
Компилятор и связанные инструменты на Solaris.
Для компиляции perl необходимо использовать компилятор ANSI C. Perl можно скомпилировать, используя либо встроенный компилятор C от Sun, либо gcc. Компилятор C, поставлявшийся с SunOS4, не подойдёт.
Включите /usr/ccs/bin/ в ваш PATH.
Некоторые инструменты, необходимые для компиляции perl, находятся в /usr/ccs/bin/: ar, as, ld и make. Убедитесь, что /usr/ccs/bin/ указан в вашем PATH.
Во всех выпусках Solaris (8, 9 и 10) необходимо убедиться, что установлены следующие пакеты (эта информация взята из FAQ Solaris):
для инструментов (sccs, lex, yacc, make, nm, truss, ld, as): SUNWbtool, SUNWsprot, SUNWtoo
для библиотек и заголовков: SUNWhea, SUNWarc, SUNWlibm, SUNWlibms, SUNWdfbh, SUNWcg6h, SUNWxwinc
Кроме того, в Solaris 8 и 9 вам также нужны:
для 64-битной разработки: SUNWarcx, SUNWbtoox, SUNWdplx, SUNWscpux, SUNWsprox, SUNWtoox, SUNWlmsx, SUNWlmx, SUNWlibCx
И только в Solaris 8 вам также нужны:
для библиотек и заголовков: SUNWolinc
Если вы не уверены, какой пакет содержит нужный файл, попробуйте найти установку, в которой этот файл есть. Затем выполните
$ grep /my/missing/file /var/sadm/install/contents Это выведет строку примерно такого вида:
/usr/include/sys/errno.h f none 0644 root bin 7471 37605 956241356 SUNWhea
Последний элемент (SUNWhea в данном примере) — это нужный вам пакет.
Избегайте использования /usr/ucb/cc.
Вам не нужно включать /usr/ucb/ в ваш PATH для компиляции perl. Если вы хотите все-таки включить /usr/ucb/ в PATH, убедитесь, что /usr/ucb/ находится НЕ в PATH перед каталогом с нужным компилятором C.
Компилятор C от Sun
Если вы используете компилятор C от Sun, убедитесь, что соответствующий каталог (обычно /opt/SUNWspro/bin/) находится в вашем PATH (перед /usr/ucb/).
GCC
Если вы используете gcc, убедитесь, что ваша установка является последней и полной. Версии perl начиная с 5.6.0 успешно компилируются с gcc > 2.8.1 на Solaris >= 2.6.
Вы должны настроить perl с помощью
$ sh Configure -Dcc=gcc В противном случае могут возникнуть странные ошибки при компиляции.
Если вы обновили свою версию Solaris, вам также может потребоваться обновить gcc. Например, если вы используете Solaris 2.6, а ваш gcc установлен в /usr/local, проверьте /usr/local/lib/gcc-lib и убедитесь, что у вас есть соответствующий каталог, sparc-sun-solaris2.6/ или i386-pc-solaris2.6/. Если каталог gcc предназначен для другой версии Solaris, чем та, которую вы используете, вам потребуется перестроить gcc для вашей новой версии Solaris.
Вы можете получить предварительно скомпилированную версию gcc с http://www.sunfreeware.com/ или http://www.blastwave.org/. Убедитесь, что вы выбрали пакет для вашей версии Solaris.
Если вы хотите использовать gcc для построения дополнительных модулей для использования с perl, поставляемым с Solaris, вы должны использовать модуль Solaris::PerlGcc, который доступен из CPAN. Perl, поставляемый с Solaris, настроен и собран с помощью компиляторов Sun, и информация о конфигурации компилятора, хранящаяся в Config.pm, поэтому относится только к компиляторам Sun. Модуль Solaris:PerlGcc содержит замену Config.pm, которая корректна для gcc - см. модуль для получения подробностей.
GNU as и GNU ld
Следующая информация относится к версии gcc 2. Добровольцы по обновлению ее для версии gcc 3 приветствуются.
Версии as и ld, поставляемые с Solaris, работают отлично для сборки perl. Обычно нет необходимости устанавливать версии GNU для компиляции perl.
Если вы решите проигнорировать это предупреждение и использовать версии GNU все равно, то убедитесь, что они относительно новые. Версии, более новые чем 2.7, по-видимому, достаточно новые. Более старые версии могут испытывать проблемы с динамической загрузкой.
Если вы хотите использовать GNU ld, вам нужно передать ему флаг -Wl,-E. Файл hints/solaris_2.sh пытается сделать это автоматически, установив следующие переменные Configure:
ccdlflags="$ccdlflags -Wl,-E"
lddlflags="$lddlflags -Wl,-E -G" Однако, с течением времени, изменения в gcc, GNU ld и Solaris ld затруднили автоматическое определение того, какой ld в конечном итоге вызывается. Вам может потребоваться вручную отредактировать config.sh и добавить флаги -Wl,-E самостоятельно, или же запустить Configure в интерактивном режиме и добавить флаги в соответствующих подсказках.
Если ваш gcc настроен на использование GNU as и ld, но вы хотите использовать вместо этого Solaris as и ld для сборки perl, вам нужно добавить -B/usr/ccs/bin/ в командную строку gcc. Один удобный способ сделать это —
$ sh Configure -Dcc='gcc -B/usr/ccs/bin/' Обратите внимание, что конечный слэш обязателен. Это приведет к некоторым безобидным предупреждениям при запуске Configure:
gcc: file path prefix `/usr/ccs/bin/' never used Эти сообщения можно безопасно игнорировать. (Обратите внимание, что для системы SunOS4 вы должны использовать -B/bin/.)
В качестве альтернативы, вы можете использовать переменную среды GCC_EXEC_PREFIX для обеспечения использования as и ld Sun. Обратитесь к документации gcc для получения дополнительной информации об опции -B и переменной GCC_EXEC_PREFIX.
Sun и GNU make
Make в /usr/ccs/bin работает отлично для сборки perl. Если у вас есть компиляторы Sun C, у вас также будет параллельная версия make (dmake). Она работает отлично для сборки perl, но иногда может вызывать проблемы при выполнении 'make test' из-за неточно определенных зависимостей между различными файлами набора для тестирования. Та же проблема может также повлиять на сборку некоторых дополнительных модулей, поэтому в таких случаях либо укажите '-m serial' в командной строке dmake, либо используйте /usr/ccs/bin/make вместо этого. Если вы хотите использовать GNU make, убедитесь, что бит set-group-id не установлен. Если он установлен, настройте переменную PATH так, чтобы /usr/ccs/bin/make находился перед GNU make, или попросите системного администратора отключить бит set-group-id для GNU make.
Избегайте libucb.
Solaris предоставляет некоторые функции совместимости с BSD в /usr/ucblib/libucb.a. Perl не будет правильно собираться и работать, если связан с -lucb, так как он содержит процедуры, несовместимые со стандартной Solaris libc. Обычно это не проблема, так как файл советов solaris предотвращает Configure от поиска библиотек в /usr/ucblib и также явно пропускает -lucb.
Среда для компиляции perl на Solaris
PATH
Убедитесь, что ваш PATH включает компилятор (/opt/SUNWspro/bin/, если вы используете компилятор Sun), а также /usr/ccs/bin/ для выбора других инструментов разработки (таких как make, ar, as и ld). Убедитесь, что ваш путь не включает /usr/ucb или что он включает его после компилятора, инструментов компилятора и других стандартных каталогов Solaris. Вам определенно не нужен /usr/ucb/cc.
LD_LIBRARY_PATH
Если у вас установлена переменная среды LD_LIBRARY_PATH, убедитесь, что она НЕ включает /lib или /usr/lib. Если вы будете собирать расширения, которые вызывают сторонние динамические библиотеки (например, Berkeley DB), убедитесь, что ваша переменная среды LD_LIBRARY_PATH включает каталог с этой библиотекой (например, /usr/local/lib).
Если вы получите сообщение об ошибке
dlopen: stub interception failed вероятно, это связано с тем, что ваша переменная среды LD_LIBRARY_PATH включает каталог, который является символьной ссылкой на /usr/lib (например, /lib). Причина, по которой это вызывает проблему, довольно тонкая. Файл libdl.so.1.0 на самом деле *только* содержит функции, которые генерируют ошибки «неудачная интерцепция подстановки». Загрузчик времени выполняет интерцепцию ссылок на "/usr/lib/libdl.so.1.0" и подключает внутренние реализации этих функций вместо них. [Спасибо Тиму Бэнсу за это объяснение.]
ЗАПУСК CONFIGURE.
См. файл INSTALL для общей информации о Configure. Здесь обсуждаются только проблемы, специфичные для Solaris. Обычно значения по умолчанию должны подойти.
64-битный perl на Solaris.
См. файл INSTALL для общей информации о 64-битных компиляциях. В общем, значения по умолчанию должны подойти большинству людей.
По умолчанию perl-5.6.0 (или более поздняя версия) компилируется как 32-битное приложение с поддержкой largefile и long-long.
Общие проблемы 32-битной и 64-битной архитектуры.
Solaris 7 и выше будут работать в 32-битном или 64-битном режиме на процессорах SPARC с помощью перезагрузки. Вы можете собрать 64-битные приложения при работе в 32-битном режиме и наоборот. 32-битные приложения будут работать под Solaris, работающем в 32- или 64-битном режиме. 64-битные приложения требуют, чтобы Solaris работал в 64-битном режиме.
Существующие 32-битные приложения корректно известны как LP32, т.е. длинные целые числа и указатели имеют 32 бита. 64-битные приложения более точно известны как LP64. Отличительной чертой приложения LP64 является его способность использовать 64-битное адресное пространство. Совершенно возможно иметь приложение LP32, которое поддерживает как 64-битные целые числа (long long), так и largefiles (> 2 ГБ), и это значение по умолчанию для perl-5.6.0.
Для более подробного объяснения проблем с 64-битными приложениями см. «Руководство разработчика Solaris 64-bit» по адресу http://docs.sun.com/
Вы можете определить режим ОС, используя «isainfo -v», например:
$ isainfo -v # Ultra 30 in 64 bit mode
64-bit sparcv9 applications
32-bit sparc applications По умолчанию perl будет скомпилирован как 32-битное приложение. Если вы не хотите выделять более ~4 ГБ памяти внутри perl или если вам не нужны более 255 открытых файлов, вам, вероятно, не нужно, чтобы perl был 64-битным приложением.
Поддержка больших файлов
Для Solaris 2.6 и более поздних версий существует два разных способа для 32-битных приложений для работы с большими файлами (файлами, размер которых превышает 2 ГБ). (64-битное приложение автоматически имеет встроенную поддержку largefile по умолчанию.)
Первый — «переходная среда компиляции», описанная в lfcompile64(5). Согласно справке,
The transitional compilation environment exports all the
explicit 64-bit functions (xxx64()) and types in addition to
all the regular functions (xxx()) and types. Both xxx() and
xxx64() functions are available to the program source. A
32-bit application must use the xxx64() functions in order
to access large files. See the lf64(5) manual page for a
complete listing of the 64-bit transitional interfaces. Переходная среда компиляции получается с помощью следующих флагов компилятора и компоновщика:
getconf LFS64_CFLAGS -D_LARGEFILE64_SOURCE
getconf LFS64_LDFLAG # nothing special needed
getconf LFS64_LIBS # nothing special needed Второй — «среда компиляции больших файлов», описанная в lfcompile(5). Согласно справке,
Each interface named xxx() that needs to access 64-bit entities
to access large files maps to a xxx64() call in the
resulting binary. All relevant data types are defined to be
of correct size (for example, off_t has a typedef definition
for a 64-bit entity).
An application compiled in this environment is able to use
the xxx() source interfaces to access both large and small
files, rather than having to explicitly utilize the transitional
xxx64() interface calls to access large files. Два исключения — fseek() и ftell(). 32-битные приложения должны использовать fseeko(3C) и ftello(3C). Они будут автоматически сопоставлены с fseeko64() и ftello64().
Среда компиляции больших файлов достигается с помощью
getconf LFS_CFLAGS -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
getconf LFS_LDFLAGS # nothing special needed
getconf LFS_LIBS # nothing special needed По умолчанию perl использует среду компиляции больших файлов и полагается на Solaris для выполнения базового сопоставления интерфейсов.
Сборка LP64 perl
Для компиляции 64-битного приложения на UltraSparc с помощью недавнего компилятора Sun требуется использование флага «-xarch=v9». getconf(1) сообщит вам об этом, например:
$ getconf -a | grep v9
XBS5_LP64_OFF64_CFLAGS: -xarch=v9
XBS5_LP64_OFF64_LDFLAGS: -xarch=v9
XBS5_LP64_OFF64_LINTFLAGS: -xarch=v9
XBS5_LPBIG_OFFBIG_CFLAGS: -xarch=v9
XBS5_LPBIG_OFFBIG_LDFLAGS: -xarch=v9
XBS5_LPBIG_OFFBIG_LINTFLAGS: -xarch=v9
_XBS5_LP64_OFF64_CFLAGS: -xarch=v9
_XBS5_LP64_OFF64_LDFLAGS: -xarch=v9
_XBS5_LP64_OFF64_LINTFLAGS: -xarch=v9
_XBS5_LPBIG_OFFBIG_CFLAGS: -xarch=v9
_XBS5_LPBIG_OFFBIG_LDFLAGS: -xarch=v9
_XBS5_LPBIG_OFFBIG_LINTFLAGS: -xarch=v9 Этот флаг поддерживается компиляторами Sun WorkShop 5.0 и более поздними версиями (сейчас продаётся под названием Forte) при использовании на Solaris 7 или более поздних версиях на системах UltraSparc.
Если вы используете gcc, вам потребуется использовать -mcpu=v9 -m64 вместо этого. Эта опция ещё не поддерживается по состоянию на gcc 2.95.2; из install/SPECIFIC в этом выпуске:
GCC version 2.95 is not able to compile code correctly for sparc64
targets. Users of the Linux kernel, at least, can use the sparc32
program to start up a new shell invocation with an environment that
causes configure to recognize (via uname -a) the system as sparc-*-*
instead. Всё это должно обрабатываться автоматически файлом советов, если это запрошено.
Длинные числа с плавающей точкой.
Начиная с версии 5.8.1, длинные числа с плавающей точкой работают, если вы используете компиляторы Sun (необходимы для дополнительных математических процедур, не включённых в libm).
Потоки в perl на Solaris.
Возможна сборка потоковой версии perl на Solaris. Однако вся реализация потоков perl всё ещё находится в экспериментальной стадии, поэтому будьте осторожны.
Проблемы с malloc в perl на Solaris.
Начиная с perl 5.7.1, perl использует Solaris malloc, так как perl malloc ломается при работе с более чем 2 ГБ памяти, а Solaris malloc также, похоже, быстрее.
Если по какой-то причине (например, для обратной совместимости двоичных файлов) вам действительно нужно использовать perl malloc, вы можете перекомпилировать perl из исходных кодов и настроить сборку с помощью
$ sh Configure -Dusemymalloc Не следует использовать perl malloc, если вы собираете с помощью gcc. Есть сообщения о сбоях ядра, особенно в модуле PDL. Проблема, похоже, исчезает при -DDEBUGGING, поэтому отследить её было сложно. Компилятор Sun, похоже, нормально работает как с perl malloc, так и без него. [XXX здесь требуется дополнительное исследование.]
ПРОБЛЕМЫ С MAKE.
- Проблемы с динамической загрузкой с GNU as и GNU ld
-
Если у вас возникли проблемы с динамической загрузкой, используя gcc на SunOS или Solaris, и вы используете GNU as и GNU ld, см. раздел "GNU as и GNU ld" выше.
- ld.so.1: ./perl: fatal: ошибка перемещения:
-
Если вы получаете это сообщение на SunOS или Solaris, и используете gcc, скорее всего, это проблема с GNU as или GNU ld, как указано в предыдущем пункте "GNU as и GNU ld".
- dlopen: неудалось перехватить заглушку
-
Основной причиной сообщения 'dlopen: stub interception failed' является то, что переменная окружения LD_LIBRARY_PATH включает каталог, который является символической ссылкой на /usr/lib (например, /lib). См. "LD_LIBRARY_PATH" выше.
- #error "Не указан DATAMODEL_NATIVE"
-
Это распространённая ошибка при попытке сборки perl на Solaris 2.6 с установкой gcc из Solaris 2.5 или 2.5.1. Заголовки Solaris изменились, поэтому необходимо обновить вашу установку gcc. Вы можете либо повторно запустить скрипт fixincludes из gcc, либо воспользоваться возможностью обновить установку gcc.
- sh: ar: не найдено
-
Это сообщение от вашей оболочки, указывающее на то, что команда 'ar' не найдена. Вам необходимо проверить переменную окружения PATH, чтобы убедиться, что она включает каталог с командой 'ar'. Эта проблема часто возникает на Solaris, где 'ar' находится в каталоге /usr/ccs/bin/.
ТЕСТ MAKE
Тест 4 op/stat.t в Solaris
Тест 4 op/stat.t может завершиться неудачей, если вы используете tmpfs. Сборка в /tmp иногда демонстрирует такое поведение. Тестовый набор определяет, собираете ли вы в /tmp, но может не обнаружить все ситуации с tmpfs.
nss_delete дамп ядра из op/pwent или op/grent
См. "nss_delete дамп ядра из op/pwent или op/grent" в perlhpux.
КРОСС-КОМПИЛЯЦИЯ
Здесь ничего необычного. Вы можете легко сделать это, если у вас доступен кросс-компилятор; обычный вызов Configure при нацеливании на Solaris x86 выглядит примерно так:
sh ./Configure -des -Dusecrosscompile \
-Dcc=i386-pc-solaris2.11-gcc \
-Dsysroot=$SYSROOT \
-Alddlflags=" -Wl,-z,notext" \
-Dtargethost=... # The usual cross-compilation options Добавление lddlflags — единственная необычная деталь.
ПРЕДОБРАБОТАННЫЕ БИНАРИ ДЛЯ PERL ДЛЯ SOLARIS.
Вы можете скачать предобработанные бинарные файлы для Solaris с http://www.sunfreeware.com/, http://www.blastwave.org, ActiveState http://www.activestate.com/ и http://www.perl.com/ в списке «Бинарники» в верхней части страницы. Вероятно, есть и другие источники. Обратите внимание, что эти сайты находятся под контролем их соответствующих владельцев, а не разработчиков perl.
ПРОБЛЕМЫ ВО ВРЕМЯ РАБОТЫ PERL НА SOLARIS.
Ограничения на количество открытых файлов в Solaris.
В справочнике stdio(3C) отмечается, что для приложений LP32 можно открыть только 255 файлов с помощью fopen(), и можно использовать только дескрипторы файлов с 0 по 255 в потоке. Поскольку perl вызывает open() и затем fdopen(3C) с полученным дескриптором файла, perl ограничен 255 одновременными открытыми файлами, даже если используется sysopen(). Если эта проблема оказывается непреодолимой, вы можете скомпилировать perl как приложение LP64, см. "Сборка LP64 perl" для получения подробностей. Обратите также внимание, что стандартное ограничение ресурсов для открытых дескрипторов файлов в Solaris составляет 255, поэтому вам необходимо соответствующим образом изменить ulimit или rctl (Solaris 9 и выше).
МОДУЛИ, СПЕЦИФИЧНЫЕ ДЛЯ SOLARIS.
См. модули в пространствах имён Solaris:: и Sun::Solaris в CPAN, см. http://www.cpan.org/modules/by-module/Solaris/ и http://www.cpan.org/modules/by-module/Sun/.
ПРОБЛЕМЫ С МОДУЛЯМИ, СПЕЦИФИЧНЫЕ ДЛЯ SOLARIS.
Proc::ProcessTable в Solaris
Proc::ProcessTable не компилируется в Solaris с perl5.6.0 и выше, если определено LARGEFILES. Поскольку поддержка largefile включена по умолчанию в 5.6.0 и более поздних версиях, вам необходимо выполнить особые действия для использования этого модуля.
Проблема в том, что различные структуры, отображаемые через procfs, используют off_t, и если вы компилируете с поддержкой largefile, они изменяются с 32 бит на 64 бита. Таким образом, возвращаемые данные из procfs не соответствуют структурам в perl, что приводит к мусору. См. proc(4) для получения дополнительной информации.
Исправление для Proc::ProcessTable заключается в редактировании Makefile для явного удаления флагов largefile из тех, которые MakeMaker выбирает из Config.pm. Это приведет к сборке Proc::ProcessTable в правильной среде. Всё должно быть в порядке, пока Proc::ProcessTable не попытается использовать off_t совместно с остальной частью perl или, если это необходимо, они должны быть явно указаны как off64_t.
BSD::Resource в Solaris
Версии BSD::Resource, предшествующие 1.09, не компилируются в Solaris с perl 5.6.0 и выше по тем же причинам, что и Proc::ProcessTable. Версии BSD::Resource, начиная с 1.09, имеют обходной путь для решения проблемы.
Net::SSLeay в Solaris
Net::SSLeay требует наличия /dev/urandom. Этот девайс доступен начиная с Solaris 9. Для более ранних версий Solaris вы можете либо получить пакет SUNWski (включаемый в состав нескольких продуктов Sun, например, Sun WebServer, являющегося частью расширения Solaris Server Intranet, или Sun Directory Services, являющегося частью Solaris for ISPs), либо загрузить пакет ANDIrand с http://www.cosy.sbg.ac.at/~andi/. Если вы используете SUNWski, создайте символическую ссылку /dev/urandom, указывающую на /dev/random. Для получения более подробной информации см. документ ID27606 с названием «Различающиеся требования к поддержке /dev/random в средах Solaris[TM] Operating Environments», доступный по адресу http://sunsolve.sun.com .
Возможно использование демона сбора энтропии (написанного на Perl!), доступного по адресу http://www.lothar.com/tech/crypto/.
SunOS 4.x
В SunOS 4.x вы, скорее всего, захотите использовать SunOS ld, /usr/bin/ld, так как более поздние версии GNU ld (например, 2.13) больше не работают для сборки Perl. При линковке расширений GNU ld сильно расстраивается и выводит множество ошибок, таких как:
... relocation truncated to fit: BASE13 ... и прекращает работу. Поэтому файл подсказок SunOS 4.1 явно устанавливает ld в /usr/bin/ld.
Начиная с Perl 5.8.1, динамическая загрузка библиотек (DynaLoader, XSLoader) также, похоже, сломалась в SunOS 4.x. Поэтому по умолчанию Perl собирается статически.
Запуск набора тестов в SunOS 4.1 немного сложен, так как тест dist/Tie-File/t/09_gen_rs.t зависает (подтест #51, для сведения) по неизвестной причине. Просто остановите тест и завершите процесс этого конкретного Perl.
Существует ряд других сбоев, которые, начиная с SunOS 4.1.4 и gcc 3.2.2, выглядят как ошибки gcc. Многие сбои происходят в тестах Encode, где, например, вместо «0» ожидается «0», что должно выглядеть немного странно после пристального взгляда. Другой пример — ранее в t/run/fresh_perl, где ожидается chr(0xff), но тест завершается неудачей, потому что результат — chr(0xff). Именно так.
Вот результат «make test» для указанной комбинации:
Failed 27 test scripts out of 745, 96.38% okay. Запуск harness болезнен из-за большого количества неисправленных тестов, связанных с Unicode, которые будут выдавать мегабайты сообщений об ошибках, но если терпеливо подождать, будут получены такие результаты:
Failed Test Stat Wstat Total Fail Failed List of Failed
-----------------------------------------------------------------------------
...
../ext/Encode/t/at-cn.t 4 1024 29 4 13.79% 14-17
../ext/Encode/t/at-tw.t 10 2560 17 10 58.82% 2 4 6 8 10 12
14-17
../ext/Encode/t/enc_data.t 29 7424 ?? ?? % ??
../ext/Encode/t/enc_eucjp.t 29 7424 ?? ?? % ??
../ext/Encode/t/enc_module.t 29 7424 ?? ?? % ??
../ext/Encode/t/encoding.t 29 7424 ?? ?? % ??
../ext/Encode/t/grow.t 12 3072 24 12 50.00% 2 4 6 8 10 12 14
16 18 20 22 24
Failed Test Stat Wstat Total Fail Failed List of Failed
------------------------------------------------------------------------------
../ext/Encode/t/guess.t 255 65280 29 40 137.93% 10-29
../ext/Encode/t/jperl.t 29 7424 15 30 200.00% 1-15
../ext/Encode/t/mime-header.t 2 512 10 2 20.00% 2-3
../ext/Encode/t/perlio.t 22 5632 38 22 57.89% 1-4 9-16 19-20
23-24 27-32
../ext/List/Util/t/shuffle.t 0 139 ?? ?? % ??
../ext/PerlIO/t/encoding.t 14 1 7.14% 11
../ext/PerlIO/t/fallback.t 9 2 22.22% 3 5
../ext/Socket/t/socketpair.t 0 2 45 70 155.56% 11-45
../lib/CPAN/t/vcmp.t 30 1 3.33% 25
../lib/Tie/File/t/09_gen_rs.t 0 15 ?? ?? % ??
../lib/Unicode/Collate/t/test.t 199 30 15.08% 7 26-27 71-75
81-88 95 101
103-104 106 108-
109 122 124 161
169-172
../lib/sort.t 0 139 119 26 21.85% 107-119
op/alarm.t 4 1 25.00% 4
op/utfhash.t 97 1 1.03% 31
run/fresh_perl.t 91 1 1.10% 32
uni/tr_7jis.t ?? ?? % ??
uni/tr_eucjp.t 29 7424 6 12 200.00% 1-6
uni/tr_sjis.t 29 7424 6 12 200.00% 1-6
56 tests and 467 subtests skipped.
Failed 27/811 test scripts, 96.67% okay. 1383/75399 subtests failed,
98.17% okay. Ошибка в тесте alarm() вызвана тем, что system() явно блокирует alarm(). Это, вероятно, ошибка libc, и, учитывая, что SunOS 4.x вышел из поддержки много лет назад, не стоит ждать исправления. Кроме того, не пытайтесь делать ничего слишком сложного, связанного с Unicode, особенно с Encode, и вы должны нормально работать в SunOS 4.x.
АВТОР
Оригинальный текст написан Энди Даггерти doughera@lafayette.edu, основываясь на советах Алана Берлисона, Ника Ин-Симмонса, Тима Бэнса и многих других пользователей Solaris на протяжении многих лет.
Пожалуйста, сообщайте о любых ошибках, обновлениях или предложениях по адресу https://github.com/Perl/perl5/issues.
© 1993–2020 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.32.0/perlsolaris