mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-08 22:45:43 +00:00
added core/perl
This commit is contained in:
parent
cd81666d23
commit
6f1cf58a4e
10 changed files with 709 additions and 0 deletions
104
core/perl/CVE-2016-2381_duplicate_env.diff
Normal file
104
core/perl/CVE-2016-2381_duplicate_env.diff
Normal file
|
@ -0,0 +1,104 @@
|
|||
From 83e7ebed7afa79a2f50eca6b6330eae7c3a02d36 Mon Sep 17 00:00:00 2001
|
||||
From: Tony Cook <tony@develop-help.com>
|
||||
Date: Wed, 27 Jan 2016 11:52:15 +1100
|
||||
Subject: remove duplicate environment variables from environ
|
||||
|
||||
If we see duplicate environment variables while iterating over
|
||||
environ[]:
|
||||
|
||||
a) make sure we use the same value in %ENV that getenv() returns.
|
||||
|
||||
Previously on a duplicate, %ENV would have the last entry for the name
|
||||
from environ[], but a typical getenv() would return the first entry.
|
||||
|
||||
Rather than assuming all getenv() implementations return the first entry
|
||||
explicitly call getenv() to ensure they agree.
|
||||
|
||||
b) remove duplicate entries from environ
|
||||
|
||||
Previously if there was a duplicate definition for a name in environ[]
|
||||
setting that name in %ENV could result in an unsafe value being passed
|
||||
to a child process, so ensure environ[] has no duplicates.
|
||||
|
||||
Patch-Name: fixes/CVE-2016-2381_duplicate_env.diff
|
||||
---
|
||||
perl.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
|
||||
1 file changed, 49 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/perl.c b/perl.c
|
||||
index 80a76c2..ed25429 100644
|
||||
--- a/perl.c
|
||||
+++ b/perl.c
|
||||
@@ -4303,23 +4303,70 @@ S_init_postdump_symbols(pTHX_ int argc, char **argv, char **env)
|
||||
}
|
||||
if (env) {
|
||||
char *s, *old_var;
|
||||
+ STRLEN nlen;
|
||||
SV *sv;
|
||||
+ HV *dups = newHV();
|
||||
+
|
||||
for (; *env; env++) {
|
||||
old_var = *env;
|
||||
|
||||
if (!(s = strchr(old_var,'=')) || s == old_var)
|
||||
continue;
|
||||
+ nlen = s - old_var;
|
||||
|
||||
#if defined(MSDOS) && !defined(DJGPP)
|
||||
*s = '\0';
|
||||
(void)strupr(old_var);
|
||||
*s = '=';
|
||||
#endif
|
||||
- sv = newSVpv(s+1, 0);
|
||||
- (void)hv_store(hv, old_var, s - old_var, sv, 0);
|
||||
+ if (hv_exists(hv, old_var, nlen)) {
|
||||
+ const char *name = savepvn(old_var, nlen);
|
||||
+
|
||||
+ /* make sure we use the same value as getenv(), otherwise code that
|
||||
+ uses getenv() (like setlocale()) might see a different value to %ENV
|
||||
+ */
|
||||
+ sv = newSVpv(PerlEnv_getenv(name), 0);
|
||||
+
|
||||
+ /* keep a count of the dups of this name so we can de-dup environ later */
|
||||
+ if (hv_exists(dups, name, nlen))
|
||||
+ ++SvIVX(*hv_fetch(dups, name, nlen, 0));
|
||||
+ else
|
||||
+ (void)hv_store(dups, name, nlen, newSViv(1), 0);
|
||||
+
|
||||
+ Safefree(name);
|
||||
+ }
|
||||
+ else {
|
||||
+ sv = newSVpv(s+1, 0);
|
||||
+ }
|
||||
+ (void)hv_store(hv, old_var, nlen, sv, 0);
|
||||
if (env_is_not_environ)
|
||||
mg_set(sv);
|
||||
}
|
||||
+ if (HvKEYS(dups)) {
|
||||
+ /* environ has some duplicate definitions, remove them */
|
||||
+ HE *entry;
|
||||
+ hv_iterinit(dups);
|
||||
+ while ((entry = hv_iternext_flags(dups, 0))) {
|
||||
+ STRLEN nlen;
|
||||
+ const char *name = HePV(entry, nlen);
|
||||
+ IV count = SvIV(HeVAL(entry));
|
||||
+ IV i;
|
||||
+ SV **valp = hv_fetch(hv, name, nlen, 0);
|
||||
+
|
||||
+ assert(valp);
|
||||
+
|
||||
+ /* try to remove any duplicate names, depending on the
|
||||
+ * implementation used in my_setenv() the iteration might
|
||||
+ * not be necessary, but let's be safe.
|
||||
+ */
|
||||
+ for (i = 0; i < count; ++i)
|
||||
+ my_setenv(name, 0);
|
||||
+
|
||||
+ /* and set it back to the value we set $ENV{name} to */
|
||||
+ my_setenv(name, SvPV_nolen(*valp));
|
||||
+ }
|
||||
+ }
|
||||
+ SvREFCNT_dec_NN(dups);
|
||||
}
|
||||
#endif /* USE_ENVIRON_ARRAY */
|
||||
#endif /* !PERL_MICRO */
|
237
core/perl/PKGBUILD
Normal file
237
core/perl/PKGBUILD
Normal file
|
@ -0,0 +1,237 @@
|
|||
# Maintainer: Florian Pritz <bluewind@xinu.at>
|
||||
# Contributor: Angel Velasquez <angvp@archlinux.org>
|
||||
# Contributor: kevin <kevin.archlinux.org>
|
||||
# Contributor: judd <jvinet.zeroflux.org>
|
||||
# Contributor: francois <francois.archlinux.org>
|
||||
|
||||
# ALARM: Kevin Mihelich <kevin@archlinuxarm.org>
|
||||
# - configure ARMv5 with -Dd_u32align
|
||||
# https://rt.perl.org/Public/Bug/Display.html?id=133803
|
||||
|
||||
pkgname=perl
|
||||
pkgver=5.30.0
|
||||
_baseversion="${pkgver%.*}"
|
||||
pkgrel=3.1
|
||||
pkgdesc="A highly capable, feature-rich programming language"
|
||||
arch=(x86_64)
|
||||
license=('GPL' 'PerlArtistic')
|
||||
url="https://www.perl.org"
|
||||
groups=('base')
|
||||
depends=('gdbm>=1.17' 'db' 'glibc')
|
||||
# NOTE: This array is automatically generated by `./patchprov`.
|
||||
# If you want to add entries, do so in the next array.
|
||||
provides=('perl-archive-tar=2.32'
|
||||
'perl-attribute-handlers=1.01'
|
||||
'perl-autodie=2.29'
|
||||
'perl-autoloader=5.74'
|
||||
'perl-autouse=1.11'
|
||||
'perl-base=2.27'
|
||||
'perl-bignum=0.51'
|
||||
'perl-carp=1.50'
|
||||
'perl-compress-raw-bzip2=2.084'
|
||||
'perl-compress-raw-zlib=2.084'
|
||||
'perl-config-perl-v=0.32'
|
||||
'perl-constant=1.33'
|
||||
'perl-cpan-meta-requirements=2.140'
|
||||
'perl-cpan-meta-yaml=0.018'
|
||||
'perl-cpan-meta=2.150010'
|
||||
'perl-cpan=2.22'
|
||||
'perl-data-dumper=2.174'
|
||||
'perl-db_file=1.843'
|
||||
'perl-devel-ppport=3.52'
|
||||
'perl-devel-selfstubber=1.06'
|
||||
'perl-digest-md5=2.55'
|
||||
'perl-digest-sha=6.02'
|
||||
'perl-digest=1.17_01'
|
||||
'perl-dumpvalue=1.18'
|
||||
'perl-encode=3.01'
|
||||
'perl-encoding-warnings=0.13'
|
||||
'perl-env=1.04'
|
||||
'perl-experimental=0.020'
|
||||
'perl-exporter=5.73'
|
||||
'perl-extutils-cbuilder=0.280231'
|
||||
'perl-extutils-constant=0.25'
|
||||
'perl-extutils-install=2.14'
|
||||
'perl-extutils-makemaker=7.34'
|
||||
'perl-extutils-manifest=1.72'
|
||||
'perl-extutils-parsexs=3.40'
|
||||
'perl-file-fetch=0.56'
|
||||
'perl-file-path=2.16'
|
||||
'perl-file-temp=0.2309'
|
||||
'perl-filter-simple=0.95'
|
||||
'perl-filter-util-call=1.59'
|
||||
'perl-getopt-long=2.5'
|
||||
'perl-http-tiny=0.076'
|
||||
'perl-i18n-collate=1.02'
|
||||
'perl-i18n-langtags=0.43'
|
||||
'perl-if=0.0608'
|
||||
'perl-io-compress=2.084'
|
||||
'perl-io-socket-ip=0.39'
|
||||
'perl-io-zlib=1.10'
|
||||
'perl-io=1.40'
|
||||
'perl-ipc-cmd=1.02'
|
||||
'perl-ipc-sysv=2.07'
|
||||
'perl-json-pp=4.02'
|
||||
'perl-lib=0.65'
|
||||
'perl-libnet=3.11'
|
||||
'perl-locale-maketext-simple=0.21_01'
|
||||
'perl-locale-maketext=1.29'
|
||||
'perl-math-bigint-fastcalc=0.5008'
|
||||
'perl-math-bigint=1.999816'
|
||||
'perl-math-bigrat=0.2614'
|
||||
'perl-math-complex=1.5901'
|
||||
'perl-memoize=1.03_01'
|
||||
'perl-mime-base64=3.15'
|
||||
'perl-module-corelist=5.20190522'
|
||||
'perl-module-load-conditional=0.68'
|
||||
'perl-module-load=0.34'
|
||||
'perl-module-loaded=0.08'
|
||||
'perl-module-metadata=1.000036'
|
||||
'perl-net-ping=2.71'
|
||||
'perl-params-check=0.38'
|
||||
'perl-parent=0.237'
|
||||
'perl-pathtools=3.78'
|
||||
'perl-perl-ostype=1.010'
|
||||
'perl-perlfaq=5.20190126'
|
||||
'perl-perlio-via-quotedprint=0.08'
|
||||
'perl-pod-checker=1.73'
|
||||
'perl-pod-escapes=1.07'
|
||||
'perl-pod-parser=1.63'
|
||||
'perl-pod-perldoc=3.2801'
|
||||
'perl-pod-simple=3.35'
|
||||
'perl-pod-usage=1.69'
|
||||
'perl-podlators=5.006'
|
||||
'perl-safe=2.40'
|
||||
'perl-scalar-list-utils=1.50'
|
||||
'perl-search-dict=1.07'
|
||||
'perl-selfloader=1.25'
|
||||
'perl-socket=2.027'
|
||||
'perl-storable=3.15'
|
||||
'perl-sys-syslog=0.35'
|
||||
'perl-term-ansicolor=4.06'
|
||||
'perl-term-cap=1.17'
|
||||
'perl-term-complete=1.403'
|
||||
'perl-term-readline=1.17'
|
||||
'perl-test-harness=3.42'
|
||||
'perl-test-simple=1.302162'
|
||||
'perl-test=1.31'
|
||||
'perl-text-abbrev=1.02'
|
||||
'perl-text-balanced=2.03'
|
||||
'perl-text-parsewords=3.30'
|
||||
'perl-text-tabs=2013.0523'
|
||||
'perl-thread-queue=3.13'
|
||||
'perl-thread-semaphore=2.13'
|
||||
'perl-threads-shared=1.60'
|
||||
'perl-threads=2.22'
|
||||
'perl-tie-file=1.02'
|
||||
'perl-tie-refhash=1.39'
|
||||
'perl-time-hires=1.9760'
|
||||
'perl-time-local=1.28'
|
||||
'perl-time-piece=1.33'
|
||||
'perl-unicode-collate=1.27'
|
||||
'perl-unicode-normalize=1.26'
|
||||
'perl-version=0.9924'
|
||||
'perl-xsloader=0.30')
|
||||
# Add your own provides here
|
||||
provides=(${provides[@]})
|
||||
source=(https://www.cpan.org/src/5.0/perl-${pkgver}.tar.xz
|
||||
https://rt.perl.org/Public/Ticket/Attachment/1640272/838796/0001-perl-134194-fix-parsing-supplemental-groups-from.patch
|
||||
perlbin.sh
|
||||
perlbin.csh
|
||||
perlbin.fish
|
||||
detect-old-perl-modules.sh
|
||||
detect-old-perl-modules.hook)
|
||||
options=('makeflags' '!purge' 'emptydirs')
|
||||
sha512sums=('68a295eccd64debd9d6a10f0d5577f872a19ad8c2d702798f6b0f45b8c3af6ab3230768056e2131e9e2e2506d1035b27cfd627c845e32263fe448649c4b98ae9'
|
||||
'0737f8c40fb5efc024861de52a6a76f537f7d862575e980b2f9c68ebf9a4b5186fba92efb5244ea95f212bcf0ade915ce14c44a33cd7d04d79a08f7bc9dd37b7'
|
||||
'46724344828e7f86e016f9c8d588bf52b2e764e65e0acc1a38899a530c99bc6e4fd8b46fa0d4bbd685aa2074dd5bcbf9029ac3bb3f2d0ee9adfc4f6c0745f373'
|
||||
'fc1344a02c741d61af6f6b5967f29cc6f43c2059761522b150261924dd7e1989da5254c03ffa0627accd9af01bc152edd24e84a6b59579acb9ee1900b6ce9383'
|
||||
'881e2efe05ba818cd7300f126800b56bb0685cb5c9c5fb7e67ef6aaf5abd17d2391a979d5d16d109c5111f4b35504ba83d19b0e6eda4431e8421fcbea19d2f1a'
|
||||
'bd48af7a6209f2ad51aa1747a7238ecb11607a53f61460d873202bf14b55c3b7dd6f66f4a9f2cac8a24240313789a9a44dbc81b73587de46a6b1866bdfca5e26'
|
||||
'6b5b2ba606d443da22c6c1a754829abd36f3fdfef1089bcf06c8f9db0217f2c2f02ebc14958ffa7afe618c9a80bd1025e76704f67466c0c3db7d40ef2c0e56b3')
|
||||
# https://www.cpan.org/src/5.0/perl-$pkgver.tar.xz.sha256.txt
|
||||
|
||||
prepare() {
|
||||
cd ${srcdir}/${pkgname}-${pkgver}
|
||||
|
||||
patch -p1 -i "$srcdir/0001-perl-134194-fix-parsing-supplemental-groups-from.patch"
|
||||
}
|
||||
|
||||
build() {
|
||||
cd ${srcdir}/${pkgname}-${pkgver}
|
||||
|
||||
if [ "${CARCH}" = "x86_64" ]; then
|
||||
# for x86_64
|
||||
arch_opts="-Dcccdlflags='-fPIC'"
|
||||
else
|
||||
# for i686
|
||||
arch_opts=""
|
||||
fi
|
||||
|
||||
[[ $CARCH == "arm" ]] && CONFIG="-Dd_u32align"
|
||||
./Configure -des -Dusethreads -Duseshrplib -Doptimize="${CFLAGS}" \
|
||||
-Dprefix=/usr -Dvendorprefix=/usr \
|
||||
-Dprivlib=/usr/share/perl5/core_perl \
|
||||
-Darchlib=/usr/lib/perl5/$_baseversion/core_perl \
|
||||
-Dsitelib=/usr/share/perl5/site_perl \
|
||||
-Dsitearch=/usr/lib/perl5/$_baseversion/site_perl \
|
||||
-Dvendorlib=/usr/share/perl5/vendor_perl \
|
||||
-Dvendorarch=/usr/lib/perl5/$_baseversion/vendor_perl \
|
||||
-Dscriptdir=/usr/bin/core_perl \
|
||||
-Dsitescript=/usr/bin/site_perl \
|
||||
-Dvendorscript=/usr/bin/vendor_perl \
|
||||
-Dinc_version_list=none \
|
||||
-Dman1ext=1perl -Dman3ext=3perl ${arch_opts} \
|
||||
-Dlddlflags="-shared ${LDFLAGS}" -Dldflags="${LDFLAGS}" $CONFIG
|
||||
make
|
||||
}
|
||||
|
||||
check() {
|
||||
cd ${srcdir}/${pkgname}-${pkgver}
|
||||
TEST_JOBS=$(echo $MAKEFLAGS | sed 's/.*-j\([0-9][0-9]*\).*/\1/') make test_harness
|
||||
# make test
|
||||
}
|
||||
|
||||
package() {
|
||||
cd ${srcdir}/${pkgname}-${pkgver}
|
||||
make DESTDIR="$pkgdir" install
|
||||
|
||||
### Perl Settings ###
|
||||
# Change man page extensions for site and vendor module builds.
|
||||
# Set no mail address since bug reports should go to the bug tracker
|
||||
# and not someone's email.
|
||||
sed -e '/^man1ext=/ s/1perl/1p/' -e '/^man3ext=/ s/3perl/3pm/' \
|
||||
-e "/^cf_email=/ s/'.*'/''/" \
|
||||
-e "/^perladmin=/ s/'.*'/''/" \
|
||||
-i ${pkgdir}/usr/lib/perl5/$_baseversion/core_perl/Config_heavy.pl
|
||||
|
||||
### CPAN Settings ###
|
||||
# Set CPAN default config to use the site directories.
|
||||
sed -e '/(makepl_arg =>/ s/""/"INSTALLDIRS=site"/' \
|
||||
-e '/(mbuildpl_arg =>/ s/""/"installdirs=site"/' \
|
||||
-i ${pkgdir}/usr/share/perl5/core_perl/CPAN/FirstTime.pm
|
||||
|
||||
# Profile script to set paths to perl scripts.
|
||||
install -D -m644 ${srcdir}/perlbin.sh \
|
||||
${pkgdir}/etc/profile.d/perlbin.sh
|
||||
# Profile script to set paths to perl scripts on csh. (FS#22441)
|
||||
install -D -m644 ${srcdir}/perlbin.csh \
|
||||
${pkgdir}/etc/profile.d/perlbin.csh
|
||||
# Profile script to set paths to perl scripts on fish. (FS#51191)
|
||||
install -D -m 755 "$srcdir/perlbin.fish" \
|
||||
"$pkgdir/usr/share/fish/vendor_conf.d/perlbin.fish"
|
||||
|
||||
# Add the dirs so new installs will already have them in PATH once they
|
||||
# install their first perl programm
|
||||
install -d -m755 "$pkgdir/usr/bin/vendor_perl"
|
||||
install -d -m755 "$pkgdir/usr/bin/site_perl"
|
||||
|
||||
#(cd ${pkgdir}/usr/bin; mv perl${pkgver} perl)
|
||||
rm "$pkgdir/usr/bin/perl$pkgver"
|
||||
|
||||
install -D -m755 -t "$pkgdir/usr/share/libalpm/scripts" "$srcdir/detect-old-perl-modules.sh"
|
||||
install -D -m644 -t "$pkgdir/usr/share/libalpm/hooks" "$srcdir/detect-old-perl-modules.hook"
|
||||
|
||||
find $pkgdir -name perllocal.pod -delete
|
||||
find $pkgdir -name .packlist -delete
|
||||
}
|
10
core/perl/detect-old-perl-modules.hook
Normal file
10
core/perl/detect-old-perl-modules.hook
Normal file
|
@ -0,0 +1,10 @@
|
|||
[Trigger]
|
||||
Operation = Install
|
||||
Operation = Upgrade
|
||||
Type = File
|
||||
Target = usr/lib/perl5/*/
|
||||
|
||||
[Action]
|
||||
Description = Warn about old perl modules
|
||||
When = PostTransaction
|
||||
Exec = /usr/share/libalpm/scripts/detect-old-perl-modules.sh
|
36
core/perl/detect-old-perl-modules.sh
Normal file
36
core/perl/detect-old-perl-modules.sh
Normal file
|
@ -0,0 +1,36 @@
|
|||
#!/bin/bash
|
||||
|
||||
basedir=/usr/lib/perl5
|
||||
perlver=$(perl -e '$v = $^V->{version}; print $v->[0].".".($v->[1]);')
|
||||
|
||||
dir_empty() {
|
||||
local dir=$1
|
||||
[[ $(find $dir -maxdepth 0 -empty -exec echo empty \;) = "empty" ]] && return 0 || return 1
|
||||
}
|
||||
|
||||
print_unowned_files() {
|
||||
local dir=$1
|
||||
LC_ALL=C find "$dir" -type f -exec pacman -Qqo {} + |& sed -n 's/^error: No package owns \(.*\)$/\1/p'
|
||||
}
|
||||
|
||||
for dir in "$basedir/"*; do
|
||||
if [[ "${dir##*/}" != "$perlver" ]]; then
|
||||
if [[ -d "$dir" ]] && ! dir_empty "$dir"; then
|
||||
pkgcount=$(pacman -Qqo "$dir" | wc -l)
|
||||
if ((pkgcount > 0)); then
|
||||
printf "WARNING: '%s' contains data from at least %d packages which will NOT be used by the installed perl interpreter.\n" "$dir" "$pkgcount"
|
||||
printf " -> Run the following command to get a list of affected packages: pacman -Qqo '%s'\n" "$dir"
|
||||
fi
|
||||
|
||||
unowned_count=$(print_unowned_files "$dir" | wc -l)
|
||||
if ((unowned_count > 0)); then
|
||||
printf "WARNING: %d file(s) in %s are not tracked by pacman and need to be rebuilt.\n" "$unowned_count" "$dir"
|
||||
printf " -> These were most likely installed directly by cpan or a similar tool.\n"
|
||||
printf " Run the following command to get a list of these files:\n"
|
||||
printf " LC_ALL=C find \"%s\" -type f -exec pacman -Qqo {} + |& sed -n 's/^error: No package owns \(.*\)$/\\\1/p'\n" "$dir"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
|
15
core/perl/generate-rebuild-list.sh
Executable file
15
core/perl/generate-rebuild-list.sh
Executable file
|
@ -0,0 +1,15 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
echo "vim"
|
||||
|
||||
pkgfile -rd "^/usr/lib/perl5/" | sed 's#^.*/##' | sort -u
|
||||
|
||||
for repo in core extra community multilib; do
|
||||
ssh dragon.archlinux.org sogrep "$repo" libperl.so
|
||||
done
|
||||
|
||||
# this one is optional
|
||||
#pkgfile -r '^/usr/share/perl5/' | sed 's#^.*/##' | sort -u
|
||||
|
260
core/perl/patchprov
Executable file
260
core/perl/patchprov
Executable file
|
@ -0,0 +1,260 @@
|
|||
#!/usr/bin/perl
|
||||
##
|
||||
## Name:
|
||||
## patchprov
|
||||
##
|
||||
## Description:
|
||||
## Patch the provides list in the perl package PKGBUILD. Scan the appropriate
|
||||
## directories under the perl source tree for directories containing dists
|
||||
## similar to CPAN dists. Search the files in the distributions for VERSION
|
||||
## strings, which are perl expressions. Filters these version strings through
|
||||
## the perl interpreter, then transform the dist. names and versions into
|
||||
## package names and versions. Finally, we cut out the "provides" array from the
|
||||
## PKGBUILD and replace it with the newer version.
|
||||
##
|
||||
## Usage:
|
||||
## patchprov [path to perl source tree] [path to PKGBUILD]
|
||||
##
|
||||
## Caveats:
|
||||
## The path code is not platform independent and will only work in POSIX.
|
||||
##
|
||||
## Changelog:
|
||||
## 06/10/14 JD Rewrite from scratch for perl 5.20.0 and ArchLinux.
|
||||
##
|
||||
## Authors:
|
||||
## Justin "juster" Davis <jrcd83@gmail.com>
|
||||
##
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
sub err
|
||||
{
|
||||
print STDERR "patchprov: error: @_\n";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
## Extract the dist. name from its containing directory.
|
||||
sub path_dist
|
||||
{
|
||||
my($path) = @_;
|
||||
$path =~ s{^.*/}{};
|
||||
return $path;
|
||||
}
|
||||
|
||||
## Create a path like $path/lib/Foo/Bar.pm for Foo::Bar.
|
||||
sub lib_modpath
|
||||
{
|
||||
my($path, $modname) = @_;
|
||||
$modname =~ s{::}{/}g;
|
||||
return "$path/lib/$modname.pm";
|
||||
}
|
||||
|
||||
## Create a path to a file in the containing directory, named after
|
||||
## the last segment of the module name, with suffix attached.
|
||||
sub dumb_modpath
|
||||
{
|
||||
my($path, $modname, $suffix) = @_;
|
||||
$modname =~ s{^.*::}{};
|
||||
return "$path/$modname$suffix";
|
||||
}
|
||||
|
||||
## Find a source file contained in the directory that we can scrape the
|
||||
## perl versions string from.
|
||||
my %distmods = (
|
||||
'PathTools' => 'Cwd',
|
||||
'Scalar-List-Utils' => 'List::Util',
|
||||
'IO-Compress' => 'IO::Compress::Gzip',
|
||||
);
|
||||
sub dist_srcpath
|
||||
{
|
||||
my($path) = @_;
|
||||
my $distname = path_dist($path);
|
||||
my $modname;
|
||||
if(exists $distmods{$distname}){
|
||||
$modname = $distmods{$distname};
|
||||
}else{
|
||||
$modname = $distname;
|
||||
$modname =~ s/-/::/g;
|
||||
}
|
||||
my @srcpaths = (
|
||||
lib_modpath($path, $modname),
|
||||
dumb_modpath($path, $modname, '.pm'),
|
||||
dumb_modpath($path, $modname, '_pm.PL'),
|
||||
dumb_modpath($path, '__'.$modname.'__', '.pm'),
|
||||
"$path/VERSION", # for podlators
|
||||
);
|
||||
for my $src (@srcpaths){
|
||||
return $src if(-f $src);
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
## Scrape the version string for the module file or Makefile.PL.
|
||||
sub scrape_verln
|
||||
{
|
||||
my($srcpath) = @_;
|
||||
open my $fh, '<', $srcpath or die "open: $!";
|
||||
while(my $ln = <$fh>){
|
||||
if($ln =~ s/^.*VERSION *=>? *//){
|
||||
close $fh;
|
||||
return $ln;
|
||||
}
|
||||
}
|
||||
close $fh;
|
||||
err("failed to find VERSION in $srcpath");
|
||||
}
|
||||
|
||||
## Scrape the version string from the module source file.
|
||||
sub scrape_modver
|
||||
{
|
||||
my($srcpath) = @_;
|
||||
return scrape_verln($srcpath);
|
||||
}
|
||||
|
||||
## Scrape the version string from the Makefile.PL. (for libnet)
|
||||
sub scrape_mkplver
|
||||
{
|
||||
my($srcpath) = @_;
|
||||
my $verln = scrape_verln($srcpath);
|
||||
$verln =~ s/,/;/;
|
||||
return $verln;
|
||||
}
|
||||
|
||||
## Scrape the version string from a file inside the dist dir.
|
||||
sub distpath_ver
|
||||
{
|
||||
my($distpath) = @_;
|
||||
my $srcpath = dist_srcpath($distpath);
|
||||
my $mkplpath = "$distpath/Makefile.PL";
|
||||
if(defined $srcpath){
|
||||
return scrape_modver($srcpath);
|
||||
}elsif(-f $mkplpath){
|
||||
return scrape_mkplver($mkplpath);
|
||||
}else{
|
||||
err("failed to scrape version from $distpath");
|
||||
}
|
||||
}
|
||||
|
||||
## Search the base path for the dist dirs and extract their respective
|
||||
## version strings.
|
||||
sub find_distvers
|
||||
{
|
||||
my($basepath) = @_;
|
||||
opendir my $dh, $basepath or die "opendir: $!";
|
||||
my @dirs = grep { -d $_ } map { "$basepath/$_" } grep { !/^[.]/ } readdir $dh;
|
||||
closedir $dh;
|
||||
|
||||
my @distvers;
|
||||
for my $dpath (@dirs){
|
||||
push @distvers, [ path_dist($dpath), distpath_ver($dpath) ];
|
||||
}
|
||||
return @distvers;
|
||||
}
|
||||
|
||||
## Maps an aref of dist name/perl version strings (perl expressions) to
|
||||
## a package name and version string suitable for a PKGBUILD.
|
||||
sub pkgspec
|
||||
{
|
||||
my($dist, $ver) = @$_;
|
||||
$dist =~ tr/A-Z/a-z/;
|
||||
$ver = eval $ver;
|
||||
return "perl-$dist=$ver";
|
||||
}
|
||||
|
||||
## Searches the perl source dir provided for a list of packages which
|
||||
## correspond to the core distributions bundled within in.
|
||||
sub perlcorepkgs
|
||||
{
|
||||
my($perlpath) = @_;
|
||||
my @dirs = ("$perlpath/cpan", "$perlpath/dist");
|
||||
my @provs;
|
||||
for my $d (@dirs){
|
||||
if(!-d $d){
|
||||
err("$d is not a valid directory");
|
||||
}
|
||||
push @provs, map pkgspec, find_distvers($d);
|
||||
}
|
||||
return @provs;
|
||||
}
|
||||
|
||||
## Formats the provided lines into a neatly formatted bash array. The first arg
|
||||
## is the name of the bash variable to assign it to.
|
||||
sub basharray
|
||||
{
|
||||
my $vname = shift;
|
||||
|
||||
## Sort entries and surround with quotes.
|
||||
my @lns = sort map { qq{'$_'} } @_;
|
||||
$lns[0] = "$vname=($lns[0]";
|
||||
|
||||
## Indent lines for OCD geeks.
|
||||
if(@lns > 1){
|
||||
my $ind = length($vname) + 2;
|
||||
splice @lns, 1, @lns-1,
|
||||
map { (' ' x $ind) . $_ } @lns[1 .. $#lns];
|
||||
}
|
||||
|
||||
$lns[$#lns] .= ')';
|
||||
return map { "$_\n" } @lns;
|
||||
}
|
||||
|
||||
## Patch the PKGBUILD at the given path with a new provides array, overwriting
|
||||
## the old one.
|
||||
sub patchpb
|
||||
{
|
||||
my $pbpath = shift;
|
||||
open my $fh, '<', $pbpath or die "open: $!";
|
||||
my @lines = <$fh>;
|
||||
close $fh;
|
||||
|
||||
my($i, $j);
|
||||
for($i = 0; $i < @lines; $i++){
|
||||
last if($lines[$i] =~ /^provides=/);
|
||||
}
|
||||
if($i == @lines){
|
||||
err("failed to find provides array in PKGBUILD");
|
||||
}
|
||||
for($j = $i; $j < @lines; $j++){
|
||||
last if($lines[$j] =~ /[)]/);
|
||||
}
|
||||
if($j == @lines){
|
||||
err("failed to find end of provides array");
|
||||
}
|
||||
|
||||
splice @lines, $i, $j-$i+1,
|
||||
basharray('provides', grep { !/win32|next/ } @_);
|
||||
|
||||
## Avoid corrupting the existing PKGBUILD in case of a crash, etc.
|
||||
if(-f "$pbpath.$$"){
|
||||
err("pbpath.$$ temporary file already exists, please remove it.");
|
||||
}
|
||||
open $fh, '>', "$pbpath.$$" or die "open: $!";
|
||||
print $fh @lines;
|
||||
close $fh or die "close: $!";
|
||||
rename "$pbpath.$$", "$pbpath" or die "rename: $!";
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
## Program entrypoint.
|
||||
sub main
|
||||
{
|
||||
if(@_ < 2){
|
||||
print STDERR "usage: $0 [perl source path] [PKGBUILD path]\n";
|
||||
exit 2;
|
||||
}
|
||||
my($perlpath, $pbpath) = @_;
|
||||
if(!-f $pbpath){
|
||||
err("$pbpath is not a valid file.");
|
||||
}elsif(!-d $perlpath){
|
||||
err("$perlpath is not a valid directory.");
|
||||
}else{
|
||||
patchpb($pbpath, perlcorepkgs($perlpath));
|
||||
}
|
||||
exit 0;
|
||||
}
|
||||
|
||||
main(@ARGV);
|
||||
|
||||
# EOF
|
15
core/perl/perlbin.csh
Normal file
15
core/perl/perlbin.csh
Normal file
|
@ -0,0 +1,15 @@
|
|||
# Set path to perl scriptdirs if they exist
|
||||
# https://wiki.archlinux.org/index.php/Perl_Policy#Binaries_and_scripts
|
||||
# Added /usr/bin/*_perl dirs for scripts
|
||||
# Remove /usr/lib/perl5/*_perl/bin in next release
|
||||
|
||||
[ -d /usr/bin/site_perl ] && setenv PATH ${PATH}:/usr/bin/site_perl
|
||||
[ -d /usr/lib/perl5/site_perl/bin ] && setenv PATH ${PATH}:/usr/lib/perl5/site_perl/bin
|
||||
|
||||
[ -d /usr/bin/vendor_perl ] && setenv PATH ${PATH}:/usr/bin/vendor_perl
|
||||
[ -d /usr/lib/perl5/vendor_perl/bin ] && setenv PATH ${PATH}:/usr/lib/perl5/vendor_perl/bin
|
||||
|
||||
[ -d /usr/bin/core_perl ] && setenv PATH ${PATH}:/usr/bin/core_perl
|
||||
|
||||
# If you have modules in non-standard directories you can add them here.
|
||||
#export PERLLIB=dir1:dir2
|
10
core/perl/perlbin.fish
Normal file
10
core/perl/perlbin.fish
Normal file
|
@ -0,0 +1,10 @@
|
|||
# Set path to perl scriptdirs if they exist
|
||||
# https://wiki.archlinux.org/index.php/Perl_Policy#Binaries_and_scripts
|
||||
|
||||
if status --is-login
|
||||
for perldir in /usr/bin/site_perl /usr/bin/vendor_perl /usr/bin/core_perl
|
||||
if test -d $perldir; and not contains $perldir $PATH
|
||||
set PATH $PATH $perldir
|
||||
end
|
||||
end
|
||||
end
|
18
core/perl/perlbin.sh
Executable file
18
core/perl/perlbin.sh
Executable file
|
@ -0,0 +1,18 @@
|
|||
# Set path to perl scriptdirs if they exist
|
||||
# https://wiki.archlinux.org/index.php/Perl_Policy#Binaries_and_scripts
|
||||
# Added /usr/bin/*_perl dirs for scripts
|
||||
# Remove /usr/lib/perl5/*_perl/bin in next release
|
||||
|
||||
[ -d /usr/bin/site_perl ] && PATH=$PATH:/usr/bin/site_perl
|
||||
[ -d /usr/lib/perl5/site_perl/bin ] && PATH=$PATH:/usr/lib/perl5/site_perl/bin
|
||||
|
||||
[ -d /usr/bin/vendor_perl ] && PATH=$PATH:/usr/bin/vendor_perl
|
||||
[ -d /usr/lib/perl5/vendor_perl/bin ] && PATH=$PATH:/usr/lib/perl5/vendor_perl/bin
|
||||
|
||||
[ -d /usr/bin/core_perl ] && PATH=$PATH:/usr/bin/core_perl
|
||||
|
||||
export PATH
|
||||
|
||||
# If you have modules in non-standard directories you can add them here.
|
||||
#export PERLLIB=dir1:dir2
|
||||
|
4
core/perl/upgpkg
Normal file
4
core/perl/upgpkg
Normal file
|
@ -0,0 +1,4 @@
|
|||
upgpkg_build() {
|
||||
makepkg -o
|
||||
./patchprov src/perl-$pkgver PKGBUILD
|
||||
}
|
Loading…
Reference in a new issue