perlos390
СОДЕРЖАНИЕ
- НАЗВАНИЕ
- СИНОПСИС
- ОПИСАНИЕ
- Инструменты
- Распаковка дистрибутива Perl на OS/390
- Настройка и утилиты для Perl на OS/390
- Настройка Perl на OS/390
- Компиляция, тестирование и установка Perl на OS/390
- Проблемы при компиляции Perl на OS/390
- Проблемы при тестировании Perl на OS/390
- Проблемы при установке Perl на OS/390
- Рекомендации по использованию Perl на OS/390
- Проблемы с плавающей точкой в Perl на OS/390
- Модули и расширения для Perl на OS/390
- АВТОРЫ
- СМОТРИТЕ ТАКЖЕ
- ИСТОРИЯ
НАЗВАНИЕ
perlos390 - компиляция и установка Perl для OS/390 и z/OS
СИНОПСИС
Этот документ поможет вам настроить, скомпилировать, протестировать и установить Perl на OS/390 (также известной как z/OS) Unix System Services.
Этот документ необходимо обновить, но мы не знаем, что в нём должно быть. Пожалуйста, отправляйте свои комментарии на https://github.com/Perl/perl5/issues.
ОПИСАНИЕ
Это полностью портированная версия Perl для OS/390 версии 2, релизы 3, 5, 6, 7, 8 и 9. Она может работать и на других версиях или релизах, но мы тестировали её именно на этих.
Возможно, вам нужно выполнить некоторые задачи по настройке системы перед запуском скрипта настройки для Perl.
Инструменты
Список инструментов и утилит z/OS Unix может оказаться полезным и содержит ссылки на порты большей части программного обеспечения, полезного для сборки Perl. http://www.ibm.com/servers/eserver/zseries/zos/unix/bpxa1toy.html
Распаковка дистрибутива Perl на OS/390
При использовании ftp помните, что нужно передавать дистрибутив в двоичном формате.
Gunzip/gzip для OS/390 обсуждаются здесь:
http://www.ibm.com/servers/eserver/zseries/zos/unix/bpxa1ty1.html чтобы извлечь архив tar в формате ASCII на OS/390, попробуйте это:
pax -o to=IBM-1047,from=ISO8859-1 -r < latest.tar или
zcat latest.tar.Z | pax -o to=IBM-1047,from=ISO8859-1 -r Если вы получаете много ошибок вида
tar: FSUM7171 ...: cannot set uid/gid: EDC5139I Operation not permitted вы не прочитали вышесказанное и попытались использовать tar вместо pax, вам сначала нужно удалить (теперь поврежденную) директорию perl
rm -rf perl-... и затем использовать pax.
Настройка и утилиты для Perl на OS/390
Убедитесь, что ваша установка yacc установлена, включая все необходимые шаблоны парсера. Если вы ещё этого не сделали, то обязательно:
cp /samples/yyparse.c /etc Это также может быть подходящим моментом, чтобы убедиться, что ваши файлы /etc/protocol и /etc/resolv.conf или /etc/hosts находятся на месте. Документ IBM, описывающий проблемы с настройкой системы USS, был SC28-1890-07 "OS/390 UNIX System Services Planning", в частности, глава 6 по настройке оболочки OE.
GNU make для OS/390, рекомендуемый для сборки perl (а также для сборки модулей и расширений CPAN), доступен из раздела "Инструменты".
Некоторые пользователи сообщают об ошибках "Не хватает памяти!" при попытке собрать Perl с помощью GNU make. Если у вас возникла такая проблема, попробуйте загрузить исходный код и собрать GNU make из исходного кода, чтобы устранить эту проблему. Возможно, вы также найдете GNU make (а также Perl и Apache) в красной книге "Программное обеспечение с открытым исходным кодом для OS/390 UNIX", SG24-5944-00 от IBM.
Если вместо рекомендуемого GNU make вы хотите использовать системную утилиту make, убедитесь, что правильно установили файл правил по умолчанию, выполнив команду:
cp /samples/startup.mk /etc и убедитесь, что также установили переменную среды _C89_CCMODE=1 (также хорошо экспортировать _C89_CCMODE=1 для пользователей GNU make).
Возможно, вам также понадобится GNU groff для OS/390, прежде чем выполнять шаг "make install" для Perl.
В файле заголовков /usr/include/sys/socket.h, предоставляемом IBM с USS V2R7, V2R8 и, возможно, V2R9, есть синтаксическая ошибка. Проблема в том, что рядом с определением константы SO_REUSEPORT есть лишний символ '/' вне комментария, как показано ниже:
#define SO_REUSEPORT 0x0200 /* allow local address & port
reuse */ / Вы можете отредактировать этот заголовок самостоятельно, чтобы удалить последний '/', или вы можете заметить, что APAR PQ39997 Language Environment (LE) описывает проблему, а PTF UQ46272 и UQ46271 являются (по крайней мере для R8) исправлениями и применить их. Если эту синтаксическую ошибку не исправить, Perl не сможет собрать расширение "Socket".
Для успешного тестирования, возможно, вам потребуется установить битовую метку "sticky" для каталога /tmp, который доступен для всех пользователей, если вы этого ещё не сделали (см. man chmod).
Настройка Perl на OS/390
После распаковки дистрибутива выполните "sh Configure" (см. INSTALL для полного обсуждения опций Configure). Есть файл "подсказок" для os390, который определяет правильные значения для большинства параметров. Некоторые моменты, на которые стоит обратить внимание:
-
Сообщение вида:
(I see you are using the Korn shell. Some ksh's blow up on Configure, mainly on older exotic systems. If yours does, try the Bourne shell instead.)не должно вызывать беспокойства.
-
Некоторые шаблоны файлов парсера в /samples необходимы в /etc. В частности, убедитесь, что вы скопировали /samples/yyparse.c в /etc перед запуском Configure Perl. Этот шаг гарантирует успешное извлечение кодировок EBCDIC файлов парсеров, таких как perly.c и perly.h. Это нужно сделать перед первым запуском Configure. Если вы этого не сделали, самый простой способ переконфигурировать Perl - удалить неправильно сконфигурированный корень сборки и повторно извлечь исходный код из tar-архива. Затем вы должны убедиться, что /etc/yyparse.c правильно установлен перед повторной попыткой запустить Configure.
-
Этот порт поддерживает динамическую загрузку, но она не включена по умолчанию. Если вы хотите поэкспериментировать с динамической загрузкой, укажите -Dusedl в аргументах скрипта Configure. Подробнее о динамической загрузке см. комментарии в hints/os390.sh. Если вы собираете с динамической загрузкой, вам нужно добавить директорию $archlibexp/CORE в переменную среды LIBPATH, чтобы perl работал. Значение $archlibexp см. в файле config.sh. Если при использовании Perl вы видите сообщение об ошибке, похожее на:
CEE3501S The module libperl.dll was not found. From entry point __dllstaticinit at compile unit offset +00000194 atто в вашей переменной LIBPATH отсутствует местоположение libperl.x и libperl.dll или libperl.so. Добавьте эту директорию в LIBPATH и продолжите.
-
Не включайте флаг оптимизации компилятора "-O". Существует ошибка либо в оптимизаторе, либо в Perl, из-за которой Perl не работает должным образом при включенном оптимизаторе.
-
Некоторые файлы конфигурации в /etc, используемые сетевыми API, отсутствуют или имеют неправильные имена. В частности, убедитесь, что существует /etc/resolv.conf или /etc/hosts, чтобы gethostbyname() работало, и убедитесь, что файл /etc/proto переименован в /etc/protocol (НЕ /etc/protocols, как используется в других Unix-системах). Возможно, вам придется искать такие вещи, как HOSTNAME и DOMAINORIGIN в члене PDS "//'SYS1.TCPPARMS(TCPDATA)", чтобы правильно настроить ваши сетевые файлы /etc.
Компиляция, тестирование и установка Perl на OS/390
Проще говоря:
sh Configure
make
make test если всё выглядит нормально (см. следующий раздел для диагностики тестов/IVP), то:
make install последний шаг может потребовать привилегий UID=0, в зависимости от того, как вы ответили на вопросы, заданные Configure, и от того, имеете ли вы права записи в указанные директории.
Проблемы при компиляции Perl на OS/390
Сообщения "Не хватает памяти!" во время сборки Perl чаще всего исправляются путем пересборки утилиты GNU make для OS/390 из исходного кода.
Ещё одним фактором, ограничивающим память, является параметр MAXASSIZE в вашем наборе данных 'SYS1.PARMLIB(BPXPRMxx)' (обратите также внимание, что с V2R8 лимиты адресного пространства могут быть установлены на основе идентификатора пользователя в сегменте USS профиля RACF). Пользователи сообщали об успешной сборке Perl с параметрами MAXASSIZE до 503316480 (и, возможно, Perl можно собрать с MAXASSIZE меньше).
В USS ваши файлы /etc/profile или $HOME/.profile могут ограничивать параметры ulimit. Проверьте, что следующая команда возвращает разумные значения:
ulimit -a Для экономии памяти вы должны загрузить модули компилятора в область Link Pack Area (LPA/ELPA), а не в список связей или step lib.
Если компилятор c89 жалуется на синтаксические ошибки при сборке расширения Socket, убедитесь, что синтаксическая ошибка исправлена в системном заголовке /usr/include/sys/socket.h.
Проблемы при тестировании Perl на OS/390
Шаг "make test" выполняет процедуру проверки Perl, обычно перед установкой. Вы можете столкнуться с сообщениями STDERR даже при успешном выполнении "make test". Вот руководство по некоторым из наиболее часто встречающихся проблем:
-
Сообщение следующего формата:
io/openpid...........CEE5210S The signal SIGHUP was received. CEE5210S The signal SIGHUP was received. CEE5210S The signal SIGHUP was received. okуказывает, что тест t/io/openpid.t Perl прошёл, но с лишними сообщениями в stderr от CEE.
-
Сообщение следующего формата:
lib/ftmp-security....File::Temp::_gettemp: Parent directory (/tmp/) is not safe (sticky bit not set when world writable?) at lib/ftmp-security.t line 100 File::Temp::_gettemp: Parent directory (/tmp/) is not safe (sticky bit not set when world writable?) at lib/ftmp-security.t line 100 okуказывает на проблему с разрешениями в каталоге /tmp в системе HFS. Для исправления выполните команду:
chmod a+t /tmpот имени пользователя с правами записи в каталоге /tmp.
-
Ошибка памяти!
Недавний набор тестов perl очень требователен к памяти. В дополнение к комментариям выше о ограничениях памяти, также стоит проверить переменную среды _CEE_RUNOPTS. В Perl (в файле miniperlmain.c) теперь есть директива C #pragma для установки параметров выполнения CEE, но переменная среды имеет приоритет.
Код C запрашивает:
#pragma runopts(HEAP(2M,500K,ANYWHERE,KEEP,8K,4K) STACK(,,ANY,) ALL31(ON))Важные части – это второй аргумент (приращение) для HEAP и разрешение стеку находиться «выше линии (16 МБ)». Если приращение стека слишком мало, то когда perl (например, при загрузке unicode/Name.pl) пытается создать «большой» (400КБ+) строку, она не помещается в один сегмент, и вы получаете ошибку «Ошибка памяти!», даже если доступно ещё достаточно памяти.
Связанная проблема – использование malloc Perl. Perl's malloc использует
sbrk()для получения памяти, аsbrk()ограничена первой операцией выделения, поэтому в этом случае требуется что-то вроде:HEAP(8M,500K,ANYWHERE,KEEP,8K,4K)для прохождения набора тестов.
Проблемы с установкой Perl на OS/390
Скрипт installman попытается запуститься на OS/390. Будет меньше ошибок, если у вас установлен инструмент roff. Вы можете получить GNU groff с ftp-сайта Redbook SG24-5944-00.
Рекомендации по использованию Perl на OS/390
При использовании Perl на OS/390 имейте в виду, что кодировки EBCDIC и ASCII отличаются. Подробнее о таких проблемах с кодировками см. perlebcdic.pod. В документе perlport.pod также упоминаются встроенные функции Perl, которые могут вести себя по-разному в EBCDIC.
Open Edition (UNIX System Services) с версии V2R8 поддерживает вызов скриптов #!/путь/к/perl. Доступен PTF от IBM для V2R7, который позволит shell/ядру поддерживать #!. Релизы USS до V2R7 не поддерживали вызов скриптов с #!. Если вы работаете на V2R6 или более ранней версии, см.:
head `whence perldoc` для примера использования трюка "eval exec" для запроса к shell запускать ваши скрипты на Perl на более ранних версиях Unix System Services.
Если у вас возникают проблемы с квадратными скобками, попробуйте поменять ваш клиент rlogin или telnet. Старайтесь избегать устаревших 3270 эмуляторов и ISHELL при работе с Perl в USS.
Проблемы с плавающей точкой в Perl на OS/390
Похоже, есть ошибка в реализации плавающей точки на системах S/390, из-за которой вызов int() от произведения числа и числа малой величины отличается от вызова int() от частного того же числа и числа большой величины. Например, в следующем коде Perl:
my $x = 100000.0;
my $y = int($x * 1e-5) * 1e5; # '0'
my $z = int($x / 1e+5) * 1e5; # '100000'
print "\$y is $y and \$z is $z\n"; # $y is 0 and $z is 100000 Хотя можно ожидать, что значения $y и $z будут одинаковыми и равными 100000, они будут отличаться, а вместо этого будут 0 и 100000 соответственно.
Проблему можно дополнительно изучить в примерно эквивалентной программе на C:
#include <stdio.h>
#include <math.h>
main()
{
double r1,r2;
double x = 100000.0;
double y = 0.0;
double z = 0.0;
x = 100000.0 * 1e-5;
r1 = modf (x,&y);
x = 100000.0 / 1e+5;
r2 = modf (x,&z);
printf("y is %e and z is %e\n",y*1e5,z*1e5);
/* y is 0.000000e+00 and z is 1.000000e+05 (with c89) */
} Модули и расширения для Perl на OS/390
Чистые (не xs) модули могут быть установлены обычным способом:
perl Makefile.PL
make
make test
make install Если вы скомпилировали Perl с возможностью динамической загрузки, то так же можно скомпилировать расширения на основе xs. Однако, если вы скомпилировали Perl со стандартной статической линковкой, вы всё ещё можете скомпилировать расширения на основе xs для OS/390, но вам нужно будет следовать инструкциям в ExtUtils::MakeMaker для компиляции статически скомпилированных библиотек Perl. В самых простых конфигурациях компиляция статического perl + xs расширения сводится к:
perl Makefile.PL
make
make perl
make test
make install
make -f Makefile.aperl inst_perl MAP_TARGET=perl В большинстве случаев пользователи сообщали о лучших результатах при использовании GNU make вместо системной программы /bin/make, как для обычных модулей, так и для расширений на основе xs.
Если процесс make сталкивается с проблемами во время компиляции или линковки, попробуйте установить _C89_CCMODE в 1. Предполагая, что sh – ваш логин-shell, запустите:
export _C89_CCMODE=1 Если tcsh – ваш логин-shell, используйте команду setenv.
АВТОРЫ
David Fiander и Peter Prymmer, с благодарностью к Dennis Longnecker и William Raffloer за ценные сообщения, обратную связь по LPAR и PTF. Благодарим Mike MacIsaac и Egon Terwedow за SG24-5944-00. Благодарим Ignasi Roca за указание на проблемы с плавающей точкой. Благодарим John Goodyear за помощь с динамической загрузкой.
См. также
УСТАНОВКА, perlport, perlebcdic, ExtUtils::MakeMaker.
http://www.ibm.com/servers/eserver/zseries/zos/unix/bpxa1toy.html
http://www.redbooks.ibm.com/redbooks/SG245944.html
http://www.ibm.com/servers/eserver/zseries/zos/unix/bpxa1ty1.html#opensrc
http://www.xray.mpe.mpg.de/mailing-lists/perl-mvs/
http://publibz.boulder.ibm.com:80/cgi-bin/bookmgr_OS390/BOOKS/ceea3030/
http://publibz.boulder.ibm.com:80/cgi-bin/bookmgr_OS390/BOOKS/CBCUG030/ Список рассылки по Perl на OS/390
Если вас интересуют порты Perl для z/OS (ранее известный как OS/390) и POSIX-BC (BS2000), обратитесь к списку рассылки perl-mvs. Для подписки отправьте пустое сообщение на perl-mvs-subscribe@perl.org.
См. также:
http://lists.perl.org/list/perl-mvs.html Архивы списка рассылки доступны по следующим адресам:
http://www.xray.mpe.mpg.de/mailing-lists/perl-mvs/
http://archive.develooper.com/perl-mvs@perl.org/ История
Этот документ первоначально был написан David Fiander для релиза Perl 5.005.
Этот документ был изменён для релиза Perl 5.005_03 11 марта 1999 года.
Обновлено 28 ноября 2001 года для исправления нерабочих ссылок.
Обновлено 12 ноября 2000 года для релиза Perl 5.7.1.
Обновлено 15 января 2001 года для релиза Perl 5.7.1.
Обновлено 24 января 2001 года для упоминания динамической загрузки.
Обновлено 12 марта 2001 года для упоминания //'SYS1.TCPPARMS(TCPDATA)'.
© 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.30.3/perlos390