perlsolaris
СОДЕРЖАНИЕ
- ИМЯ
- ОПИСАНИЕ
- РЕСУРСЫ
- НАСТРОЙКА
- ВЫПОЛНЕНИЕ CONFIGURE.
- ПРОБЛЕМЫ С MAKE.
- ТЕСТЫ MAKE
- КРОСС-КОМПИЛЯЦИЯ
- ПРЕКОМПИЛИРОВАННЫЕ БИНАРИИ PERL ДЛЯ SOLARIS.
- ПРОБЛЕМЫ С РАБОТОЙ PERL В SOLARIS.
- МОДУЛИ, СПЕЦИФИЧНЫЕ ДЛЯ SOLARIS.
- ПРОБЛЕМЫ С МОДУЛЯМИ, СПЕЦИФИЧНЫМИ ДЛЯ SOLARIS.
- SunOS 4.x
- АВТОР
ИМЯ
perlsolaris - Perl версия 5 в системах Solaris
ОПИСАНИЕ
Этот документ описывает различные особенности операционной системы Sun Solaris, которые повлияют на компиляцию и/или работу 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. По умолчанию всегда будет использоваться наиболее новая версия, а старая версия, как правило, сохраняется только на один релиз 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.
Убедитесь, что вы используете программу tar, скомпилированную под Solaris (а не SunOS 4.x), для извлечения файла perl-5.x.x.tar.gz. Не используйте GNU tar, скомпилированный для SunOS4 в Solaris. (GNU tar, скомпилированный для Solaris, должен быть подходящим.) При запуске бинарников SunOS4 в Solaris, система выполнения магическим образом изменяет имена файлов, соответствующие шаблону m#lib/locale#, так что когда tar пытается создать lib/locale.pm, вместо этого создаётся файл lib/oldlocale.pm. Если вы нашли это сообщение слишком поздно и использовали tar, скомпилированный под SunOS4, вам необходимо найти неправильно переименованный файл и переместить его обратно в 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 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 hints предотвращает 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" и подставляет вместо них внутренние реализации этих функций. [Спасибо Тиму Бэнсу за это объяснение.]
RUN 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, то есть Longs и Pointers — 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-битного приложения автоматически включена поддержка больших файлов по умолчанию.)
Во-первых, это «переходная среда компиляции», описанная в 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. Всё это должно обрабатываться автоматически файлом hints, если это запрошено.
Long Doubles.
Начиная с версии 5.8.1, long doubles работают, если вы используете компиляторы 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. Есть сообщения о core dumps, особенно в модуле 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: неудалось перехватить заглушку' является то, что переменная окружения LD_LIBRARY_PATH содержит директорию, которая является символической ссылкой на /usr/lib (например, /lib). См. "LD_LIBRARY_PATH" выше.
- #ошибка "Не указан 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 Extension или Sun Directory Services, которые входят в Solaris for ISPs), либо загрузить пакет ANDIrand с http://www.cosy.sbg.ac.at/~andi/. Если вы используете SUNWski, создайте символическую ссылку /dev/urandom, указывающую на /dev/random. Более подробную информацию см. в документе с ID 27606 под названием «Различные требования к поддержке /dev/random в операционных средах Solaris[TM]», доступном по адресу 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 из-за множества сбоев тестов, связанных с Юникодом, выведет мегабайты сообщений об ошибках, но если терпеливо подождать, то можно получить такие результаты:
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 был выведен из эксплуатации несколько лет назад, не ждите исправления. Кроме того, не пытайтесь делать ничего слишком связанного с Юникодом, особенно с Encode, и всё должно быть в порядке в SunOS 4.x.
АВТОР
Оригинальная статья была написана Энди Дауэрти doughera@lafayette.edu, опираясь на советы Алана Берлисона, Ника Инга-Симмонса, Тима Бэнса и многих других пользователей Solaris на протяжении многих лет.
Пожалуйста, сообщайте об ошибках, обновлениях или предложениях по адресу https://github.com/Perl/perl5/issues.
© 1993–2021 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.36.0/perlsolaris