#! /bin/sh
set -xe

PKG=perl
VERSION=5.26.1
BUILD=3

PREFIX=/pkg/$PKG-$VERSION-$BUILD
#PREFIX=/dev/shm/$PKG-$VERSION-$BUILD

if false; then
	# force complete rebuild, but keep downloads
	cd $PREFIX
	# sanity check before we go berserk
	test -e build/perl-$VERSION.tar.gz || exit 1
	find .     -maxdepth 1 -not -name .     -not -name build    -exec rm -rf {} \;
	find build -maxdepth 1 -not -name build -not -name "*.tar*" -exec rm -rf {} \;
fi

mkdir -p $PREFIX
cat >$PREFIX/profile <<-EOF
	PATH=$PREFIX/bin:\$PATH
EOF
. $PREFIX/profile

# Some cpan mopdule tests fail when build directory is on
# nfs, because they try to remove directories with unlinked
# but opened files in it.
# Additionally we want a clean envirnoment and a local cpan scratch
#
HOME=/dev/shm/$PKG-$VERSION-$BUILD.build.home.tmp
mkdir -p $HOME

exec </dev/null		# to many cpan modules might ask something

# If you hit errors and want to rerun from where you failed,
# use "if false","fi" to avoid rebuilding everything before
# the error.
#
# A good point to place the "if false" is here.
#
#
#DEBUG#if false; then ####################################################
#DEBUG#fi ################################################################

mkdir -p $PREFIX/build
cd $PREFIX/build

# The problem with a git checkout is, that the perl build system does many things
# differentily when is sees .git - e.g. run additional developer checks.
#test -d perl || git clone https://perl5.git.perl.org/perl.git
#cd perl
#git checkout "v$VERSION" ; git reset --hard

test -e perl-$VERSION.tar.gz || wget http://www.cpan.org/src/5.0/perl-$VERSION.tar.gz
test -d perl-$VERSION || tar xf perl-$VERSION.tar.gz
cd perl-$VERSION

# -d : use defaults for all answers.
# -e : go on without questioning past the production of config.sh.
# -s : silent mode, only echoes questions and essential information.
# -Dusedevel : allow devel (uneven minor) versions. Prevents bin/perl->bin/perlVERSION symlink
# -Duseshrplib : build shared perl library (required when perl is to be included in a shared library)
# -DEBUGGING : add debugging code (perl -D)
#
./Configure -des -Duseshrplib -Dprefix=$PREFIX

make -j$(nproc)

# Note: If you get a failure in porting/utils test here, it might be, that we are
# running cpan somewhere else which leads to an extra and unexpected "\n" being
# emitted by CPAN.pm BEGIN and a failure of the test (which does "perl -c CPAN.pm")
#
make test
make install

cd $PREFIX;

test -e $HOME/.cpan/CPAN/MyConfig.pm && rm $HOME/.cpan/CPAN/MyConfig.pm
cpan</dev/null

# Too many modules "recommend" stupid things like mod_perl
# do not auto install recommended modules
perl -MCPAN <<'_EOF_'
  CPAN::HandleConfig->load();
  CPAN::Shell->o('conf','recommends_policy',0);
  CPAN::Shell->o('conf','commit');
_EOF_

cpan -u			# update everything we already have

# After the update we have a new ExtUtils::MakeMaker.
# Patch this version to avoid stomping on a perl bug
# We've got this when building net-snmp (down below).
# Errors:
#    "panic: attempt to copy freed scalar"
#    "Bizarre copy of HASH in list assignment#
# this is from perl bug:
#    https://rt.perl.org/Public/Bug/Display.html?id=77706
# triggered by ExtUtils::MakeMaker.
# This patch prevents this
#

(cd lib/site_perl/$VERSION/ExtUtils; patch -N -p1 < /src/mariux/patches/MakeMaker-0001-MakeMaker.pm-Avoid-triggering-perl-bug.patch) || true

# These two with -T (without test), because the tests are interactive and access /dev/tty
# Do these first, because they are required by Bundle::CPAN
#
cpan -T Term::ReadLine::Perl
cpan -T Term::ReadLine::Gnu

# Now the rest of Bundle::CPAN first, so that we use latest code for the following
# installations
#
cpan Bundle::CPAN

# mod_perl (Apache::*, Bundle::Apache, mod_perl, modPerl_hooks) is broken.
# Usually it wants Apache httpd source to compile and keeps asking for it forever if it
# doesn't find it.
# we could install it without Access to sources
#     perl -MCPAN <<'_EOF_'
#       CPAN::HandleConfig->load;
#       $CPAN::Config->{'makepl_arg'}='NO_HTTPD=1';
#       CPAN::Shell->install('Apache');
#     _EOF_
# but its broken anyway (needs a patch to compile against
# current perl) and the version 1.* branch has not been updated
# for a long time. leave it out and everything which depends on it
#cpan Bundle::Apache

# Tests for GD fail
# The seventh image in den GD.t test looks slightly
# different. Maybe small difference in TrueType font.
#
# Do it first, otherwise we are pulled by Chart::Base
#
cpan -T GD

# Now  modules (from autobundle of /usr/local/ installation and manual cleanup and some deduplication)
#
cpan AE
cpan Algorithm::Diff
cpan Algorithm::DiffOld
cpan AnyEvent
cpan AppConfig
cpan Archive::Extract
cpan Archive::Zip
cpan Attribute::Params::Validate
cpan Authen::SASL
cpan B::Keywords
cpan BerkeleyDB
cpan Bit::Vector
cpan CGI
cpan CGI::Fast
cpan CPAN::Admin
cpan CPANPLUS
cpan Cache::Memcached
cpan Capture::Tiny
cpan Carp::Clan
cpan Chart::Base
cpan Class::Accessor
cpan Class::Data::Inheritable
cpan Class::ISA
cpan Class::Inspector
cpan Class::Load
cpan Class::Singleton
cpan Class::Tiny
PERL5LIB=".${PERL5LIB:+:$PERL5LIB}" cpan Class::Trigger
cpan Clone
cpan Config::General
cpan Config::Tiny
cpan Crypt::OpenSSL::RSA
cpan Crypt::OpenSSL::Random
cpan Crypt::RC4
PERL5LIB=".${PERL5LIB:+:$PERL5LIB}" cpan Crypt::SSLeay
cpan DBD::SQLite
cpan DBD::mysql
cpan DBI
cpan File::Flock          # required by Daemon::Generic
cpan Daemon::Generic
cpan Data::Grove
cpan Data::ObjectDriver
cpan Data::OptList
cpan Data::Stag
cpan Date::Calendar
cpan Date::Parse

cpan Test::File::ShareDir::Dist # required by DateTime::Locale
cpan DateTime::Locale           # required by DateTime

cpan DateTime
cpan DateTime::Locale
cpan DateTime::TimeZone
cpan Devel::CheckLib
cpan Devel::GlobalDestruction
cpan Devel::InnerPackage
cpan Devel::SelfStubber
cpan Devel::StackTrace
cpan Devel::StackTrace::AsHTML
cpan Devel::Symdump
cpan Device::SerialPort
cpan Digest::HMAC
cpan Digest::Perl::MD5
cpan Digest::SHA1
cpan Dist::CheckConflicts
cpan Email::Abstract
cpan Email::Address
cpan Email::Date::Format
cpan Email::FolderType
cpan Email::LocalDelivery
cpan Email::MIME
cpan Email::MIME::Attachment::Stripper
cpan Email::MIME::ContentType
cpan Email::MIME::Encodings
cpan Email::MessageID
cpan Email::Outlook::Message
cpan Email::Reply
cpan Email::Send
cpan Email::Simple
cpan Encode::Detect
cpan Encode::Locale
cpan Eval::LineNumbers
cpan Event
cpan Exception::Class
cpan ExtUtils::PkgConfig
cpan FCGI
cpan File::CheckTree
cpan File::Copy::Recursive
cpan -f IO::Event   # for File::Flock
cpan File::Flock
cpan File::FnMatch
cpan File::HomeDir
cpan File::Listing
cpan File::Path::Expand
cpan File::Remove
cpan File::ShareDir
cpan File::Slurp
cpan File::Which
cpan Filesys::Notify::Simple
cpan Filter::Util::Exec
cpan Font::AFM
cpan Font::TTF
cpan GD::Graph
cpan GD::Graph::histogram
cpan GD::SVG
cpan GD::Text
cpan Glib
cpan Graph
cpan Graphics::ColorNames
cpan Graphics::ColorObject
cpan HTML::Tree
cpan HTML::Parser
cpan HTML::Form
cpan HTML::Formatter
cpan HTML::Scrubber
cpan HTML::TableParser
cpan HTML::Tagset
cpan HTML::TreeBuilder
cpan HTTP::Body
cpan HTTP::Cookies
cpan HTTP::DAV           # note: tests fail if cpan build dir is on nfs
cpan HTTP::Daemon
cpan HTTP::Date
cpan HTTP::Message
cpan HTTP::Negotiate
cpan HTTP::Server::Simple
cpan Hash::MultiValue
cpan Hook::LexWrap
cpan IO::All
cpan IO::CaptureOutput
cpan IO::Multiplex
cpan IO::Pty
cpan IO::Socket::SSL
cpan IO::String
cpan IO::Stringy
cpan IPC::Run
cpan IPC::Run3
cpan Inline
cpan Inline::C
cpan JSON
cpan JSON::PP::Compat5006
PERL5LIB=".${PERL5LIB:+:$PERL5LIB}" cpan Class::Accessor::Lite   # required by JSON::RPC
cpan JSON::RPC
cpan JSON::XS
cpan LWP
cpan Lingua::EN::Inflect
cpan Linux::Inotify2
PERL5LIB=".${PERL5LIB:+:$PERL5LIB}" cpan Linux::USBKeyboard
cpan List::MoreUtils
cpan Log::Message
cpan Log::Log4perl
cpan MIME::Tools
cpan MRO::Compat
cpan Mail::Box
cpan Mail::Box::IMAP4
cpan Mail::Box::POP3
cpan Mail::DKIM
cpan Mail::Util
cpan Mail::IMAPClient
cpan Mail::Identity
cpan Mail::Message
cpan Mail::Transport
cpan Math::Bezier
cpan Math::Calc::Units
cpan Math::Interpolate
cpan Math::IntervalSearch
cpan Math::Random::ISAAC
cpan Math::Random::ISAAC::PP
cpan Math::Round
cpan Math::VecStat
cpan Module::Build
cpan Module::Implementation
cpan Module::Pluggable
cpan Module::Runtime
cpan Mojo
cpan Mozilla::CA
cpan Net::DNS
cpan Net::HTTP
cpan Net::IMAP::Client
cpan Net::IMAP::Simple
cpan Net::SNMP
cpan Net::SSL
cpan Net::SSLeay
cpan Net::Server
cpan NetAddr::IP
cpan OLE::Storage_Lite
cpan Object::Accessor
cpan Object::Realize::Later
cpan PDF::API2
cpan PDL
cpan PPITerm::UI
PERL5LIB=".${PERL5LIB:+:$PERL5LIB}" cpan PPI::Document   # required by PPIx::Regexp
PERL5LIB=".${PERL5LIB:+:$PERL5LIB}" cpan Task::Weaken    # required by PPIx::Regexp
cpan PPIx::Regexp
cpan Package::Constants
cpan Package::DeprecationManager
cpan Package::Stash
cpan Package::Stash::XS
cpan Params::Util
cpan Params::Validate
cpan Parse::RecDescent
cpan PatchReader
cpan Path::FindDev
cpan Path::FindDev::Object
cpan Path::IsDev
cpan Path::Tiny
cpan Pegex
cpan Perl::Critic
cpan Perl::Tidy
cpan Plack
cpan Pod::Coverage
cpan Pod::LaTeX
cpan Pod::Plainer
cpan Pod::Spell
cpan Probe::Perl
cpan Readonly
cpan Regexp::Common
cpan Return::Value
cpan Role::Tiny
cpan Router::Simple
cpan SVG
cpan Set::IntSpan
cpan Shell
cpan Spreadsheet::ParseExcel
cpan Starlink::AST
cpan Statistics::Descriptive
cpan Statistics::Distributions
cpan Stream::Buffered
cpan String::CRC32
cpan String::Format
cpan Sub::Exporter
cpan Sub::Exporter::Progressive
cpan Sub::Install
cpan Sub::Uplevel
cpan Switch
cpan Task::Weaken
cpan Template
cpan Template::Plugin::GD
cpan Term::UI
cpan Test::Deep
cpan Test::Differences
cpan Test::Exception
cpan Test::Fatal
cpan Test::Inter
cpan Test::Most
cpan Test::NoWarnings
cpan Test::Number::Delta
cpan Test::Object
cpan Test::Output
cpan Test::Pod
cpan Test::Pod::Coverage
cpan Test::Requires
cpan Test::Script
cpan Test::SharedFork
cpan Test::SubCalls
cpan Test::TCP
cpan -f Test::Taint   # test sometimes fail, because Test::More sets untainted environment variable TEST_ACTIVE
cpan Test::Warn
cpan Test::YAML
cpan Text::CSV
cpan Text::Diff
cpan Text::Format
cpan Text::Soundex
cpan TheSchwartz
cpan Tie::DBI
cpan Tie::RDBM
cpan Tie::Watch
cpan Time::Date
cpan Time::Period
cpan Tk
cpan Tree::DAG_Node
cpan Try::Tiny
cpan URI
cpan Unix::Syslog
cpan User::Identity
cpan Version::Requirements
cpan WWW::Dict::Leo::Org
cpan WWW::Mechanize
cpan WWW::RobotRules
cpan XML::DOM
cpan XML::LibXML
cpan XML::LibXSLT
cpan XML::NamespaceSupport
cpan XML::Parser
cpan XML::Parser::Lite
cpan XML::Quote
cpan XML::RegExp
cpan XML::SAX
cpan XML::SAX::Base
cpan XML::SAX::Expat
cpan XML::Simple
cpan XML::Twig
cpan XML::XPath
cpan YAML
cpan YAML::LibYAML

cpan common::sense
cpan inc::latest
cpan install
cpan local::lib

cpan Apache::SOAP
cpan Date::Manip
(
	cd $PREFIX/build
	test -e Donald-1.05.tar.gz || wget https://github.molgen.mpg.de/donald/Donald/archive/1.05.tar.gz -O Donald-1.05.tar.gz
	test -d Donald-1.05 || tar xf Donald-1.05.tar.gz
	cd Donald-1.05
	cpan .
)
cpan PDL::Stats
(
	cd $PREFIX/build
	test -e Pcap-0.02.tar.gz || cp /home/buczek/build/Pcap/Pcap-0.02.tar.gz .
	test -d Pcap-0.02 || tar xf Pcap-0.02.tar.gz
	cd Pcap-0.02
	cpan .
)

(
	cd $PREFIX/build
	test -e rrdtool-1.6.0.tar.gz || wget https://oss.oetiker.ch/rrdtool/pub/rrdtool-1.6.0.tar.gz
	test -d rrdtool-1.6.0 || tar xf rrdtool-1.6.0.tar.gz
	cd rrdtool-1.6.0
	./configure --prefix $PREFIX
	make -j $(nproc)
	cd bindings/perl-shared/
	cpan .
	cd ../perl-piped
	cpan .
)

# http://net-snmp.sourceforge.net/ (Net-SNMP : SNMP.pm, NetSNMP::*)
# should match exact version of net-snmp packages
# install everything here to avoid dependency.
#
# cpan has 5.0404 of Net-SNMP so use latest version from its home.
#
# If you get errors
#    "panic: attempt to copy freed scalar"
#    "Bizarre copy of HASH in list assignment#
# this is from perl bug:
#    https://rt.perl.org/Public/Bug/Display.html?id=77706
# triggered by ExtUtils::MakeMaker. The patch
#    /src/mariux/patches/0001-Carp.pm-continue-with-screwed-up-perl-stack.patch
# at the top of this file is there to prevent this.
#
(
	cd $PREFIX/build
	test -e net-snmp-5.7.3.tar.gz || wget https://downloads.sourceforge.net/project/net-snmp/net-snmp/5.7.3/net-snmp-5.7.3.tar.gz
	test -d net-snmp-5.7.3 || tar xvf net-snmp-5.7.3.tar.gz
	cd net-snmp-5.7.3
	patch -N -p1 < /src/mariux/patches/net-snmp-0001-Fix-incompatible-definitions-of-U64-type.patch || true
	./configure --prefix $PREFIX
	# make -j sometimes fails "ranlib: .libs/libnetsnmpmibs.a: Malformed archive"
	make
	make install
)

# Do bioperl last, because it doesn't declare all dependencies correctly
#
cpan Bio::Perl
# cpan -T Bio::Biblio    # "ERROR 11 Unable to connect to database [medline" instead of xml file from net
cpan Bio::Coordinate
#cpan Bio::Graphics::Browser2	# GBrowse - requires Bio::DB::Sam
#cpan Bio::DB::Sam		# Bio-SamTools   'Please enter the location of the bam.h and compiled libbam.a files'

cpan -f XML::DOM::XPath   # test fails , install anyway for Bio::FeatureIO

cpan Bio::FeatureIO
cpan Bio::Tools::EUtilities
#cpan Bio::Tools::Run::StandAloneBlast	# several tests fail - tools not available in required version
#cpan Bio::Network::IO			# tests fail (whatever)

#still missing (found by: /home/buczek/libcheck/perlcompare.pl)
#
#Alien::SVN		# Alien-SVN: wants SVN install, assumed obsolete
#Apache::XMLRPC::Lite	# SOAP-Lite-1.01 : obsolete
#B::Lint*		# B-Lint-1.20-0 : I dont think we need this
#CGI::Apache		# mod_perl - requires Apache source and asks for it endlessly
#UDDI::Lite		# 17 years old junk
#XMLRPC*		# XMLRPC-Lite: dont think we still need that


# Devel::IPerl -> Markdown::Pod -> Markdent
# Markdown::Pod (0.006) does not work with Markdent 0.27 or 0.28 because of  this change:
# https://github.com/houseabsolute/Markdent/commit/b570af7820aa2358263b5eaf403ec96674edfe58
#
PERL5LIB=".${PERL5LIB:+:$PERL5LIB}" cpan ZMQ::Constants   # for Devel::IPerl
PERL5LIB=".${PERL5LIB:+:$PERL5LIB}" cpan ZMQ::LibZMQ3     # for Devel::IPerl
cpan DROLSKY/Markdent-0.26.tar.gz   # required by Devel::IPerl - Markdown::Pod -> Markdent. 

cpan ZMUGHAL/Devel-IPerl-0.008.tar.gz   # Devel::IPerl 0.009 requires ZMUGHAL/Net-Async-ZMQ which blocks during test
#cpan Devel::IPerl

cpan Text::NSP  # galonska 29.01.2018 -> helpdesk

exit