apkbuild-cpan: fix warnings, improve recreate, add check support

This commit is contained in:
Timo Teräs 2017-01-31 10:20:14 +02:00
parent 7c1609b1bb
commit 14f8fcfb37
1 changed files with 47 additions and 15 deletions

View File

@ -3,7 +3,10 @@
use strict; use strict;
use warnings; use warnings;
use feature qw(:5.10); use 5.016;
use feature "switch";
no if $] >= 5.018, warnings => "experimental::smartmatch";
use LWP::UserAgent; use LWP::UserAgent;
use LWP::ConnCache; use LWP::ConnCache;
use CPAN::Meta; use CPAN::Meta;
@ -21,9 +24,8 @@ my $package_mappings = {
}; };
our $packager = ""; our $packager = "";
my $template = <<'EOF'; my $template = <<'EOF';
# Automatically generated by apkbuild-cpan, template 1 # Automatically generated by apkbuild-cpan, template 2
# Contributor: [% packager %] [% authors %]
# Maintainer: [% packager %]
pkgname=[% pkgname %] pkgname=[% pkgname %]
_pkgreal=[% pkgreal %] _pkgreal=[% pkgreal %]
pkgver=[% pkgver %] pkgver=[% pkgver %]
@ -34,8 +36,10 @@ arch="noarch"
license="GPL PerlArtistic" license="GPL PerlArtistic"
cpandepends="" cpandepends=""
cpanmakedepends="" cpanmakedepends=""
cpancheckdepends=""
depends="$cpandepends" depends="$cpandepends"
makedepends="perl-dev $cpanmakedepends" makedepends="perl-dev $cpanmakedepends"
checkdepends="$cpancheckdepends"
subpackages="$pkgname-doc" subpackages="$pkgname-doc"
source="[% source %]" source="[% source %]"
builddir="$srcdir/$_pkgreal-$pkgver" builddir="$srcdir/$_pkgreal-$pkgver"
@ -59,6 +63,10 @@ package() {
: :
} }
check() {
:
}
EOF EOF
our $ua = LWP::UserAgent->new(); our $ua = LWP::UserAgent->new();
@ -66,8 +74,7 @@ our $json = JSON->new;
$ua->env_proxy; $ua->env_proxy;
$ua->conn_cache(LWP::ConnCache->new()); $ua->conn_cache(LWP::ConnCache->new());
sub read_file sub read_file {
{
my ($filename) = @_; my ($filename) = @_;
local $/; local $/;
open my $fh, "<", $filename or die "could not open $filename: $!"; open my $fh, "<", $filename or die "could not open $filename: $!";
@ -76,10 +83,15 @@ sub read_file
sub read_assignments_from_file { sub read_assignments_from_file {
my ($filename) = @_; my ($filename) = @_;
return () if ( ! -e $filename );
my $text = read_file($filename); my $text = read_file($filename);
my %sline = $text =~ /^(\w+)\s*=\s*([^\"\n]*)$/mg; my %sline = $text =~ /^(\w+)\s*=\s*([^\"\n]*)$/mg;
my %mline = $text =~ /^(\w+)\s*=\s*\"([^\"]*)\"$/mg; my %mline = $text =~ /^(\w+)\s*=\s*\"([^\"]*)\"$/mg;
my %hash = ( %sline, %mline ); my %hash = ( %sline, %mline );
my $authors = join("\n", $text =~ /^# Contributor: .*$/mg, $text =~ /^# Maintainer: .*$/mg);
$hash{'authors'} = $authors if length($authors) > 1;
return \%hash; return \%hash;
} }
@ -96,12 +108,13 @@ sub read_apkbuild {
} }
sub write_apkbuild { sub write_apkbuild {
my ($distdata) = @_; my ($distdata, $authors) = @_;
my $cpanid = $distdata->{releases}[0]->{cpanid}; my $cpanid = $distdata->{releases}[0]->{cpanid};
$cpanid = substr($cpanid, 0, 1) . "/" . substr($cpanid, 0, 2) . "/$cpanid"; $cpanid = substr($cpanid, 0, 1) . "/" . substr($cpanid, 0, 2) . "/$cpanid";
my %repl = ( my %repl = (
packager => $packager, authors => ($authors or "# Contributor: $packager\n# Maintainer: $packager"),
pkgname => map_cpan_to_apk($distdata->{name}), pkgname => map_cpan_to_apk($distdata->{name}),
pkgreal => $distdata->{name}, pkgreal => $distdata->{name},
pkgver => $distdata->{releases}[0]->{version}, pkgver => $distdata->{releases}[0]->{version},
@ -147,7 +160,8 @@ sub parse_deps {
my $pkgname = map_cpan_to_apk($distdata->{name}); my $pkgname = map_cpan_to_apk($distdata->{name});
$deps .= "$pkgname "; $deps .= "$pkgname ";
} }
$deps =~ s/\s+$//; $deps =~ s/\h+/ /g;
$deps =~ s/ $//;
return $deps; return $deps;
} }
@ -162,6 +176,7 @@ sub update_functions {
my $metaprefix = "src/" . $apkbuild->{'_pkgreal'} . "-" . $apkbuild->{'pkgver'} . "/"; my $metaprefix = "src/" . $apkbuild->{'_pkgreal'} . "-" . $apkbuild->{'pkgver'} . "/";
my $prepare_func; my $prepare_func;
my $build_func; my $build_func;
my $check_func;
my $package_func; my $package_func;
my $text = read_file "APKBUILD"; my $text = read_file "APKBUILD";
@ -203,7 +218,7 @@ EOF
build() { build() {
cd "$builddir" cd "$builddir"
export CFLAGS=$(perl -MConfig -E 'say $Config{ccflags}') export CFLAGS=$(perl -MConfig -E 'say $Config{ccflags}')
make && make test make
} }
EOF EOF
$package_func = <<'EOF'; $package_func = <<'EOF';
@ -212,6 +227,13 @@ package() {
make DESTDIR="$pkgdir" install || return 1 make DESTDIR="$pkgdir" install || return 1
find "$pkgdir" \( -name perllocal.pod -o -name .packlist \) -delete find "$pkgdir" \( -name perllocal.pod -o -name .packlist \) -delete
} }
EOF
$check_func = <<'EOF';
check() {
cd "$builddir"
export CFLAGS=$(perl -MConfig -E 'say $Config{ccflags}')
make test
}
EOF EOF
} }
@ -221,6 +243,8 @@ EOF
die "Can't replace build function APKBUILD"; die "Can't replace build function APKBUILD";
$text =~ s/^package\(\) \{.*?^\}\n/$package_func/smg or $text =~ s/^package\(\) \{.*?^\}\n/$package_func/smg or
die "Can't replace package function APKBUILD"; die "Can't replace package function APKBUILD";
$text =~ s/^check\(\) \{.*?^\}\n/$check_func/smg or
die "Can't replace check function APKBUILD";
open my $fh, '>', "APKBUILD" or die; open my $fh, '>', "APKBUILD" or die;
print $fh $text; print $fh $text;
@ -251,11 +275,13 @@ sub do_depends {
say "CPAN deps: $deps"; say "CPAN deps: $deps";
say "Recommend: " . parse_deps $meta->effective_prereqs->requirements_for('runtime', 'recommends'); say "Recommend: " . parse_deps $meta->effective_prereqs->requirements_for('runtime', 'recommends');
my $makedeps = parse_deps $meta->effective_prereqs->requirements_for('build', 'requires'); my $makedeps = parse_deps($meta->effective_prereqs->requirements_for('build', 'requires'), $meta->effective_prereqs->requirements_for('build', 'recommends'));
$makedeps .= ' ' . parse_deps $meta->effective_prereqs->requirements_for('build', 'recommends');
$makedeps .= ' ' . parse_deps $meta->effective_prereqs->requirements_for('test', 'requires');
$makedeps .= ' ' . parse_deps $meta->effective_prereqs->requirements_for('test', 'recommends');
say "CPAN build deps: $makedeps"; say "CPAN build deps: $makedeps";
say "CPAN requires: " . parse_deps($meta->effective_prereqs->requirements_for('build', 'requires'));
say "CPAN recommds: " . parse_deps($meta->effective_prereqs->requirements_for('build', 'recommends'));
my $checkdeps = parse_deps($meta->effective_prereqs->requirements_for('test', 'requires'), $meta->effective_prereqs->requirements_for('test', 'recommends'));
say "CPAN check deps: $makedeps";
my $text = read_file "APKBUILD"; my $text = read_file "APKBUILD";
if ($abstract) { if ($abstract) {
@ -274,6 +300,8 @@ sub do_depends {
die "Can't find cpandepends line in APKBUILD"; die "Can't find cpandepends line in APKBUILD";
$text =~ s/^cpanmakedepends=\"([^\"]*)\"$/cpanmakedepends=\"$makedeps\"/mg or $text =~ s/^cpanmakedepends=\"([^\"]*)\"$/cpanmakedepends=\"$makedeps\"/mg or
die "Can't find cpanmakedepends line in APKBUILD"; die "Can't find cpanmakedepends line in APKBUILD";
$text =~ s/^cpancheckdepends=\"([^\"]*)\"$/cpancheckdepends=\"$checkdeps\"/mg or
die "Can't find cpancheckdepends line in APKBUILD";
open my $fh, '>', "APKBUILD" or die; open my $fh, '>', "APKBUILD" or die;
print $fh $text; print $fh $text;
@ -282,6 +310,7 @@ sub do_depends {
sub get_data { sub get_data {
my $apkbuild = read_apkbuild; my $apkbuild = read_apkbuild;
$apkbuild->{_pkgreal} or die "Not apkbuild-cpan generated APKBUILD";
my $response = $ua->get("http://search.cpan.org/api/dist/$apkbuild->{_pkgreal}"); my $response = $ua->get("http://search.cpan.org/api/dist/$apkbuild->{_pkgreal}");
$response->is_success or die $response->status_line; $response->is_success or die $response->status_line;
my $distdata = $json->decode($response->decoded_content); my $distdata = $json->decode($response->decoded_content);
@ -293,6 +322,9 @@ sub get_data {
my $abuild_conf = read_assignments_from_file("/etc/abuild.conf"); my $abuild_conf = read_assignments_from_file("/etc/abuild.conf");
$packager = $abuild_conf->{PACKAGER} if $abuild_conf->{PACKAGER}; $packager = $abuild_conf->{PACKAGER} if $abuild_conf->{PACKAGER};
my $user_abuild_conf = read_assignments_from_file($ENV{"HOME"} . "/.abuild/abuild.conf");
$packager = $user_abuild_conf->{PACKAGER} if $user_abuild_conf->{PACKAGER};
given ( $ARGV[0] ) { given ( $ARGV[0] ) {
when ("create") { when ("create") {
my $module = $ARGV[1]; my $module = $ARGV[1];
@ -319,7 +351,7 @@ given ( $ARGV[0] ) {
} }
when ("recreate") { when ("recreate") {
my ($apkbuild, $distdata) = get_data; my ($apkbuild, $distdata) = get_data;
write_apkbuild($distdata); write_apkbuild($distdata, $apkbuild->{authors});
prepare_tree; prepare_tree;
update_functions; update_functions;
do_depends; do_depends;