Главная > Solaris > Solaris и perl. Казалось бы, но не все так просто…

Solaris и perl. Казалось бы, но не все так просто…

Столкнулся с Solaris, а именно с тем, что мне необходимо было перенести на солярку некоторые перловые скрипты и удивился, от очень занятных вещей. Я даже и подумать не могу, что такое возможно, ведь perl и его модули вещь тривиальная и их установка не вызывает каких-либо проблем на FreeBSD или Linux, там это делается быстро и с закрытыми глазами. Но не тут-то было.

По-умолчанию стоит perl собранный при помощи cc, но cc при этом в системе нет и постовляется он только в пакете Oracle Solaris Studio Compilers. Пакет этот можно скачать с официального сайта, если там есть учетка. Можно выполнить квест по получения оного пакета, но это же не наш метод…

Проблемы которые возникают из-за того, что perl собран с cc можно, конечно, вылечить на лету. Например у меня не собирался Term::Size:

root@server:~/123/Term-Size-0.207: perl Makefile.PL
Checking if your kit is complete...
Looks good
Writing Makefile for Term::Size
root@server:~/123/Term-Size-0.207: make
cp Size.pm blib/lib/Term/Size.pm
AutoSplitting blib/lib/Term/Size.pm (blib/lib/auto/Term/Size)
/usr/perl5/bin/perl /usr/perl5/5.12/lib/ExtUtils/xsubpp -typemap /usr/perl5/5.12/lib/ExtUtils/typemap Size.xs > Size.xsc && mv Size.xsc Size.c
cc -c -DPTR_IS_LONG -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DPERL_USE_SAFE_PUTENV -xO4 -DVERSION=\"0.207\" -DXS_VERSION=\"0.207\" -KPIC "-I/usr/perl5/5.12/lib/i86pc-solaris-64int/CORE" Size.c
sh: line 1: cc: not found
*** Error code 127
make: Fatal error: Command failed for target `Size.o'

Лечится очень просто, информация об этом даже есть в манах cpan. И это не использование perlgcc — он не помогает, достаточно собрать Makefile указав необходимую информацию, в частности о компиляторе, напрямую:

root@server:~/123/Term-Size-0.207: perl Makefile.PL CC=gcc CCCDLFLAGS=-fPIC OPTIMIZE=" " LD=gcc
Writing Makefile for Term::Size

После этого можно смело делать make test и т.п.

А можно исправить эту «проблему» на корню, мне это надо было бы сделать так и так, т.к. мне нужна была поддержка тредов, а по-умолчанию её, внезапно, нету. Достаточно скачать perl и поставить его использовов правильный компилятор:

wget http://search.cpan.org/CPAN/authors/id/R/RJ/RJBS/perl-5.12.3.tar.gz && tar zxf perl-5.12.3.tar.gz && cd perl-5.12.3

sh Configure -Dcc=gcc -Dusethreads -Dprefix=/usr/perl5 -d && make && make install

Собственно profit:

root@server:~: perl -v
This is perl 5, version 12, subversion 3 (v5.12.3) built for i86pc-Solaris-thread-multi

Copyright 1987-2010, Larry WallPerl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found onthis system using "man perl" or "perldoc perl". If you have access to theInternet, point your browser at http://www.perl.org/, the Perl Home Page.

root@server:~: perl -V:cc
cc='gcc';

Теперь у нас все модули, в том числе через cpan, будут собираться правильно и с правильным компилятором изначально.

Так же встретил трудность с установкой тривиального модуля DBD::mysql:

root@server:~: /usr/perl5/bin/cpan -i DBD:mysql
Going to read '/root/.cpan/Metadata'
Database was generated on Thu, 02 Aug 2012 00:19:03 GMT
Fetching with LWP:
ftp://ftp.spbu.ru/CPAN/authors/01mailrc.txt.gz
Going to read '/root/.cpan/sources/authors/01mailrc.txt.gz'
............................................................................DONE
Fetching with LWP:
ftp://ftp.spbu.ru/CPAN/modules/02packages.details.txt.gz
Going to read '/root/.cpan/sources/modules/02packages.details.txt.gz'
Database was generated on Wed, 19 Sep 2012 23:43:03 GMT
..............
New CPAN.pm version (v1.9800) available.
[Currently running version is v1.9456]
You might want to try
install CPAN
reload cpan
to both upgrade CPAN.pm and run the new version without leaving
the current session.
..............................................................DONE
Fetching with LWP:
ftp://ftp.spbu.ru/CPAN/modules/03modlist.data.gz
Going to read '/root/.cpan/sources/modules/03modlist.data.gz'
............................................................................DONE
Going to write /root/.cpan/Metadata
Running install for module 'DBD::mysql'
Running make for C/CA/CAPTTOFU/DBD-mysql-4.022.tar.gz
Fetching with LWP:
ftp://ftp.spbu.ru/CPAN/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.022.tar.gz
Fetching with LWP:
ftp://ftp.spbu.ru/CPAN/authors/id/C/CA/CAPTTOFU/CHECKSUMS
Checksum for /root/.cpan/sources/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.022.tar.gz ok

CPAN.pm: Going to build C/CA/CAPTTOFU/DBD-mysql-4.022.tar.gz

Can't exec "mysql_config": No such file or directory at Makefile.PL line 83.

Cannot find the file 'mysql_config'! Your execution PATH doesn't seem
not contain the path to mysql_config. Resorting to guessed values!
Can't exec "mysql_config": No such file or directory at Makefile.PL line 479.
Can't find mysql_config. Use --mysql_config option to specify where mysql_config is located
Can't exec "mysql_config": No such file or directory at Makefile.PL line 479.
Can't find mysql_config. Use --mysql_config option to specify where mysql_config is located
Can't exec "mysql_config": No such file or directory at Makefile.PL line 479.
Can't find mysql_config. Use --mysql_config option to specify where mysql_config is located
PLEASE NOTE:

For 'make test' to run properly, you must ensure that the
database user '' can connect to your MySQL server
and has the proper privileges that these tests require such
as 'drop table', 'create table', 'drop procedure', 'create procedure'
as well as others.

mysql> grant all privileges on test.* to ''@'localhost' identified by 's3kr1t';

You can also optionally set the user to run 'make test' with:

perl Makefile.PL --testuser=username

Can't exec "mysql_config": No such file or directory at Makefile.PL line 479.
Can't find mysql_config. Use --mysql_config option to specify where mysql_config is located
Can't exec "mysql_config": No such file or directory at Makefile.PL line 479.
Can't find mysql_config. Use --mysql_config option to specify where mysql_config is located
Can't exec "mysql_config": No such file or directory at Makefile.PL line 479.
Can't find mysql_config. Use --mysql_config option to specify where mysql_config is located
Failed to determine directory of mysql.h. Use

perl Makefile.PL --cflags=-I<dir>

to set this directory. For details see the INSTALL.html file,
section "C Compiler flags" or type

perl Makefile.PL --help
Warning: No success on command[/usr/perl5/5.12/bin/perl Makefile.PL]
'YAML' not installed, will not store persistent state
CAPTTOFU/DBD-mysql-4.022.tar.gz
/usr/perl5/5.12/bin/perl Makefile.PL -- NOT OK
Running make test
Make had some problems, won't test
Running make install
Make had some problems, won't install

Казалось бы все просто, правда? Поставь mysql-client и собирай модуль, но не все так просто. Собирать из исходников mysql-client не захотелось, поэтому был скачан libmysql из официального репозитория

pkg install pkg:/database/mysql-51/library

Но как оказалось пресловутый mysql_config не идет в этом пакете, а идет только в самом mysql, поэтому пришлось ставить и его:

pkg install pkg:/database/mysql-51@5.1.37-0.175.0.0.0.2.537

Но и после этого у вас ничего не заработает, т.к. cflags для сборки модуля будет браться от mysql:

root@server:/home/admin/src/DBD-mysql-4.022: perl Makefile.PL --mysql_config=/usr/mysql/5.1/bin/mysql_config
PLEASE NOTE:

For 'make test' to run properly, you must ensure that the
database user '' can connect to your MySQL server
and has the proper privileges that these tests require such
as 'drop table', 'create table', 'drop procedure', 'create procedure'
as well as others.

mysql> grant all privileges on test.* to ''@'localhost' identified by 's3kr1t';

You can also optionally set the user to run 'make test' with:

perl Makefile.PL --testuser=username

I will use the following settings for compiling and testing:

cflags (mysql_config) = -I/usr/mysql/5.1/include/mysql -m32 -xchip=pentium -xregs=no%frameptr -mt -xprefetch=auto -xprefetch_level=3 -fns=no -fsimple=1 -xbuiltin=%none -xlibmil -xlibmopt -xnorunpath -DHAVE_RWLOCK_T -DUNIV_SOLARIS
embedded (mysql_config) =
ldflags (mysql_config) = -R/usr/mysql/5.1/lib/mysql
libs (mysql_config) = -L/usr/mysql/5.1/lib/mysql -lmysqlclient -lz -lsocket -lnsl -lm
mysql_config (Users choice) = /usr/mysql/5.1/bin/mysql_config
nocatchstderr (default ) = 0
nofoundrows (default ) = 0
ssl (guessed ) = 0
testdb (default ) = test
testhost (default ) =
testpassword (default ) =
testsocket (default ) =
testuser (guessed ) =

To change these settings, see 'perl Makefile.PL --help' and
'perldoc INSTALL'.

Checking if your kit is complete...
Looks good
Using DBI 1.622 (for perl 5.012003 on i86pc-solaris-thread-multi) installed in /usr/perl5/lib/site_perl/5.12.3/i86pc-solaris-thread-multi/auto/DBI/
Writing Makefile for DBD::mysql
Writing MYMETA.yml and MYMETA.json
root@server:/home/admin/src/DBD-mysql-4.022# make
cp lib/DBD/mysql.pm blib/lib/DBD/mysql.pm
cp lib/DBD/mysql/GetInfo.pm blib/lib/DBD/mysql/GetInfo.pm
cp lib/DBD/mysql/INSTALL.pod blib/lib/DBD/mysql/INSTALL.pod
cp lib/Bundle/DBD/mysql.pm blib/lib/Bundle/DBD/mysql.pm
gcc -c -I/usr/perl5/lib/site_perl/5.12.3/i86pc-solaris-thread-multi/auto/DBI -I/usr/mysql/5.1/include/mysql -m32 -xchip=pentium -xregs=no%frameptr -mt -xprefetch=auto -xprefetch_level=3 -fns=no -fsimple=1 -xbuiltin=%none -xlibmil -xlibmopt -xnorunpath -DHAVE_RWLOCK_T -DUNIV_SOLARIS -DDBD_MYSQL_INSERT_ID_IS_GOOD -g -D_REENTRANT -fno-strict-aliasing -pipe -fstack-protector -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DPERL_USE_SAFE_PUTENV -DPERL_USE_SAFE_PUTENV -DPERL_USE_SAFE_PUTENV -DPERL_USE_SAFE_PUTENV -O -DVERSION=\"4.022\" -DXS_VERSION=\"4.022\" -fPIC "-I/usr/perl5/lib/5.12.3/i86pc-solaris-thread-multi/CORE" dbdimp.c
gcc: language norunpath not recognized
gcc: language norunpath not recognized
gcc: dbdimp.c: linker input file unused because linking not done
/usr/perl5/bin/perl -p -e "s/~DRIVER~/mysql/g" /usr/perl5/lib/site_perl/5.12.3/i86pc-solaris-thread-multi/auto/DBI/Driver.xst > mysql.xsi
/usr/perl5/bin/perl /usr/perl5/lib/5.12.3/ExtUtils/xsubpp -typemap /usr/perl5/lib/5.12.3/ExtUtils/typemap mysql.xs > mysql.xsc && mv mysql.xsc mysql.c
Warning: duplicate function definition 'do' detected in mysql.xs, line 242
Warning: duplicate function definition 'rows' detected in mysql.xs, line 752
gcc -c -I/usr/perl5/lib/site_perl/5.12.3/i86pc-solaris-thread-multi/auto/DBI -I/usr/mysql/5.1/include/mysql -m32 -xchip=pentium -xregs=no%frameptr -mt -xprefetch=auto -xprefetch_level=3 -fns=no -fsimple=1 -xbuiltin=%none -xlibmil -xlibmopt -xnorunpath -DHAVE_RWLOCK_T -DUNIV_SOLARIS -DDBD_MYSQL_INSERT_ID_IS_GOOD -g -D_REENTRANT -fno-strict-aliasing -pipe -fstack-protector -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DPERL_USE_SAFE_PUTENV -DPERL_USE_SAFE_PUTENV -DPERL_USE_SAFE_PUTENV -DPERL_USE_SAFE_PUTENV -O -DVERSION=\"4.022\" -DXS_VERSION=\"4.022\" -fPIC "-I/usr/perl5/lib/5.12.3/i86pc-solaris-thread-multi/CORE" mysql.c
gcc: language norunpath not recognized
gcc: language norunpath not recognized
gcc: mysql.c: linker input file unused because linking not done
Running Mkbootstrap for DBD::mysql ()
chmod 644 mysql.bs
rm -f blib/arch/auto/DBD/mysql/mysql.so
LD_RUN_PATH="/usr/mysql/5.1/lib/mysql:/usr/lib" /usr/perl5/bin/perl myld gcc -G -L/usr/gnu/lib -fstack-protector dbdimp.o mysql.o -o blib/arch/auto/DBD/mysql/mysql.so \
-L/usr/mysql/5.1/lib/mysql -lmysqlclient -lz -lsocket -lnsl -lm \

gcc: dbdimp.o: No such file or directory
gcc: mysql.o: No such file or directory
*** Error code 1
make: Fatal error: Command failed for target `blib/arch/auto/DBD/mysql/mysql.so'

А все из-за чего? Правильно, mysql собран при помощи Sun cc, если бы собирали из исходников — проблем бы не было 🙂 Но можно задать параметры вручную:

perl Makefile.PL --mysql_config=/usr/mysql/5.1/bin/mysql_config --cflags="-I/usr/mysql/5.1/include/mysql -m32 -DHAVE_RWLOCK_T -DUNIV_SOLARIS"

И вот вам щщщастье.

Categories: Solaris Tags: , , , ,
  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.

QR Code Business Card