mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-12-29 12:52:24 +02:00
5b6977f54e
allows selection between multiple packages providing the same feature, which affects dependencies of other packages. will be used e.g. for choosing between DirectFB and X.org for libraries like GTK2 git-svn-id: svn://svn.openwrt.org/openwrt/trunk@18056 3c298f89-4303-0410-b956-a3cf2f4a3e73
156 lines
4.2 KiB
Perl
156 lines
4.2 KiB
Perl
package metadata;
|
|
use base 'Exporter';
|
|
use strict;
|
|
use warnings;
|
|
our @EXPORT = qw(%package %srcpackage %category %subdir %preconfig %features clear_packages parse_package_metadata get_multiline);
|
|
|
|
our %package;
|
|
our %preconfig;
|
|
our %srcpackage;
|
|
our %category;
|
|
our %subdir;
|
|
our %features;
|
|
|
|
sub get_multiline {
|
|
my $fh = shift;
|
|
my $prefix = shift;
|
|
my $str;
|
|
while (<$fh>) {
|
|
last if /^@@/;
|
|
$str .= (($_ and $prefix) ? $prefix . $_ : $_);
|
|
}
|
|
|
|
return $str ? $str : "";
|
|
}
|
|
|
|
sub clear_packages() {
|
|
%subdir = ();
|
|
%preconfig = ();
|
|
%package = ();
|
|
%srcpackage = ();
|
|
%category = ();
|
|
%features = ();
|
|
}
|
|
|
|
sub parse_package_metadata($) {
|
|
my $file = shift;
|
|
my $pkg;
|
|
my $feature;
|
|
my $makefile;
|
|
my $preconfig;
|
|
my $subdir;
|
|
my $src;
|
|
|
|
open FILE, "<$file" or do {
|
|
warn "Cannot open '$file': $!\n";
|
|
return undef;
|
|
};
|
|
while (<FILE>) {
|
|
chomp;
|
|
/^Source-Makefile: \s*((.+\/)([^\/]+)\/Makefile)\s*$/ and do {
|
|
$makefile = $1;
|
|
$subdir = $2;
|
|
$src = $3;
|
|
$subdir =~ s/^package\///;
|
|
$subdir{$src} = $subdir;
|
|
$srcpackage{$src} = [];
|
|
undef $pkg;
|
|
};
|
|
next unless $src;
|
|
/^Package:\s*(.+?)\s*$/ and do {
|
|
undef $feature;
|
|
$pkg = {};
|
|
$pkg->{src} = $src;
|
|
$pkg->{makefile} = $makefile;
|
|
$pkg->{name} = $1;
|
|
$pkg->{title} = "";
|
|
$pkg->{default} = "m if ALL";
|
|
$pkg->{depends} = [];
|
|
$pkg->{builddepends} = [];
|
|
$pkg->{buildtypes} = [];
|
|
$pkg->{subdir} = $subdir;
|
|
$pkg->{tristate} = 1;
|
|
$package{$1} = $pkg;
|
|
push @{$srcpackage{$src}}, $pkg;
|
|
};
|
|
/^Feature:\s*(.+?)\s*$/ and do {
|
|
undef $pkg;
|
|
$feature = {};
|
|
$feature->{name} = $1;
|
|
$feature->{priority} = 0;
|
|
};
|
|
$feature and do {
|
|
/^Target-Name:\s*(.+?)\s*$/ and do {
|
|
$features{$1} or $features{$1} = [];
|
|
push @{$features{$1}}, $feature;
|
|
};
|
|
/^Target-Title:\s*(.+?)\s*$/ and $feature->{target_title} = $1;
|
|
/^Feature-Priority:\s*(\d+)\s*$/ and $feature->{priority} = $1;
|
|
/^Feature-Name:\s*(.+?)\s*$/ and $feature->{title} = $1;
|
|
/^Feature-Description:/ and $feature->{description} = get_multiline(\*FILE, "\t\t\t");
|
|
next;
|
|
};
|
|
next unless $pkg;
|
|
/^Version: \s*(.+)\s*$/ and $pkg->{version} = $1;
|
|
/^Title: \s*(.+)\s*$/ and $pkg->{title} = $1;
|
|
/^Menu: \s*(.+)\s*$/ and $pkg->{menu} = $1;
|
|
/^Submenu: \s*(.+)\s*$/ and $pkg->{submenu} = $1;
|
|
/^Submenu-Depends: \s*(.+)\s*$/ and $pkg->{submenudep} = $1;
|
|
/^Source: \s*(.+)\s*$/ and $pkg->{source} = $1;
|
|
/^Default: \s*(.+)\s*$/ and $pkg->{default} = $1;
|
|
/^Provides: \s*(.+)\s*$/ and do {
|
|
my @vpkg = split /\s+/, $1;
|
|
foreach my $vpkg (@vpkg) {
|
|
$package{$vpkg} or $package{$vpkg} = {
|
|
name => $vpkg,
|
|
vdepends => [],
|
|
src => $src,
|
|
subdir => $subdir,
|
|
makefile => $makefile
|
|
};
|
|
push @{$package{$vpkg}->{vdepends}}, $pkg->{name};
|
|
}
|
|
};
|
|
/^Depends: \s*(.+)\s*$/ and $pkg->{depends} = [ split /\s+/, $1 ];
|
|
/^Build-Only: \s*(.+)\s*$/ and $pkg->{buildonly} = 1;
|
|
/^Build-Depends: \s*(.+)\s*$/ and $pkg->{builddepends} = [ split /\s+/, $1 ];
|
|
/^Build-Depends\/(\w+): \s*(.+)\s*$/ and $pkg->{"builddepends/$1"} = [ split /\s+/, $2 ];
|
|
/^Build-Types:\s*(.+)\s*$/ and $pkg->{buildtypes} = [ split /\s+/, $1 ];
|
|
/^Category: \s*(.+)\s*$/ and do {
|
|
$pkg->{category} = $1;
|
|
defined $category{$1} or $category{$1} = {};
|
|
defined $category{$1}->{$src} or $category{$1}->{$src} = [];
|
|
push @{$category{$1}->{$src}}, $pkg;
|
|
};
|
|
/^Description: \s*(.*)\s*$/ and $pkg->{description} = "\t\t $1\n". get_multiline(*FILE, "\t\t ");
|
|
/^Type: \s*(.+)\s*$/ and do {
|
|
$pkg->{type} = [ split /\s+/, $1 ];
|
|
undef $pkg->{tristate};
|
|
foreach my $type (@{$pkg->{type}}) {
|
|
$type =~ /ipkg/ and $pkg->{tristate} = 1;
|
|
}
|
|
};
|
|
/^Config:\s*(.*)\s*$/ and $pkg->{config} = "$1\n".get_multiline(*FILE, "\t");
|
|
/^Prereq-Check:/ and $pkg->{prereq} = 1;
|
|
/^Preconfig:\s*(.+)\s*$/ and do {
|
|
my $pkgname = $pkg->{name};
|
|
$preconfig{$pkgname} or $preconfig{$pkgname} = {};
|
|
if (exists $preconfig{$pkgname}->{$1}) {
|
|
$preconfig = $preconfig{$pkgname}->{$1};
|
|
} else {
|
|
$preconfig = {
|
|
id => $1
|
|
};
|
|
$preconfig{$pkgname}->{$1} = $preconfig;
|
|
}
|
|
};
|
|
/^Preconfig-Type:\s*(.*?)\s*$/ and $preconfig->{type} = $1;
|
|
/^Preconfig-Label:\s*(.*?)\s*$/ and $preconfig->{label} = $1;
|
|
/^Preconfig-Default:\s*(.*?)\s*$/ and $preconfig->{default} = $1;
|
|
}
|
|
close FILE;
|
|
return 1;
|
|
}
|
|
|
|
1;
|