perl-5.30.3 on CentOS 5.8
1. 준비작업
1.1. 다운로드
https://www.cpan.org/src/README.html 에서 다운로드 한다.
CentOS 5.8 에서 직접 다운로드 할 수 없고, 다른 장비에서 다운로드 한 파일을 sftp 따위로 올려야 한다.
curl 이든 wget 이든 안되고, wget 에 "--no-check-certificate" 을 추가해도 안된다.
curl -O https://www.cpan.org/src/5.0/perl-5.30.3.tar.gz
1.2. gcc 및 make 설치
yum install gcc make -y
2. 컴파일 및 설치
설치 디렉토리(-Dprefix=
) 는 알아서 변경한다.
대부분의 Linux 배포판들은 /usr 이 설치 디렉토리(
--prefix
)이지만, 컴파일해서 설치하는 것들은 /usr/local 이나 /opt 아래에 두는 경우가 많다.
Configure 에서 "-de" 옵션을 생략하면 물어보는 것에 답을 해야 하고, Configure 명령어에서 "> ../logs/" 이하를 생략하고 실행해야 한다.
mkdir -p logs/perl-5.30.3 tar xvfz perl-5.30.3.tar.gz > logs/perl-5.30.3/tar.`date +%Y%m%d.%H%M%S`.log 2>&1 cd perl-5.30.3 sh Configure -de -Dcc=gcc -Dprefix=/opt/perl-5.30.3 > ../logs/perl-5.30.3/config.`date +%Y%m%d.%H%M%S`.log 2>&1 make > ../logs/perl-5.30.3/make.`date +%Y%m%d.%H%M%S`.log 2>&1 make test > ../logs/perl-5.30.3/test.`date +%Y%m%d.%H%M%S`.log 2>&1 make install > ../logs/perl-5.30.3/install.`date +%Y%m%d.%H%M%S`.log 2>&1
thread 지원을 위해 다음과 같이 -Dusethreads
를 추가할 수도 있다.
sh Configure -de -Dcc=gcc -Dprefix=/opt/perl-5.30.3 -Dusethreads > ../logs/perl-5.30.3/config.`date +%Y%m%d.%H%M%S`.log 2>&1
3. 다른 버전에서 발생하는 에러에 대해서
CentOS 5.8 에서는 perl-5.30.3 을
제외한 나머지 버전은
make test
에서 에러가 발생한다.
3.1. 5.32 ~ 5.38 에서 발생하는 에러
3.1.1. 에러 메시지
make test
의 말미에 다음과 같은 메시지가 출력된다.
Failed 1 test out of 2516, 99.96% okay. ../dist/IO/t/cachepropagate-unix.t
실패한 부분을 따라서 올라가면 다음과 같다.
dist/IO/t/cachepropagate-unix .................................... # Failed test 'protocol defined' # at t/cachepropagate-unix.t line 54. # Failed test 'protocol defined' # at t/cachepropagate-unix.t line 109. # Looks like you failed 2 tests of 15.
3.1.2. 원인
CentOS 5.8 커널(2.6.18)이 SO_PROTOCOL 을 지원하지 않는 버전이다.
SO_PROTOCOL 은 2.6.32 이상에서 지원한다.
IO::Socket::UNIX->new()->protocol()
함수가 undef 를 반환하기 때문이다.
언젠가는 (TODO) SO_PROTOCOL 을 지원하지 않는 경우 테스트를 생략하도록 변경할 예정이라고 한다(cachepropagate-unix.t 참조).
(저 함수가 지원되지 않는다는 전제하에) 에러를 무시하고 설치해도 된다는 취지라고 생각된다.
3.2. 5.28 이하 에서 발생하는 에러
3.2.1. 에러 메시지
make test
의 말미에 다음과 같은 메시지가 출력된다.
Failed 1 test out of 1609, 99.94% okay. ../lib/Time/Local.t
실패한 부분을 따라서 올라가면 다음과 같다.
lib/Time/Local................................................ # Failed test 'timelocal year for 1970 1 2 0 0 0' # at ../lib/Time/Local.t line 109. # got: '170' # expected: '70' FAILED at test 6
3.2.2. 원인
perl 5.28 이전에는 (y2k 버그가 있는) Time::Local 1.25 이전 버전이 번들되었기 때문이다.
Time::Local 1.28 미만, 2020년 이후에 발생한다.
Time::Local 의 y2k 버그는 1.28 버전에서 수정되었다.
설치한 이후에 cpan 에서 Time::Local 을 업데이트 하는 방법으로 해결해도 된다.