scripts: metadata: always resolve dependencies through provides list
Allow to use PROVIDES to replace existing packages.
This commit is contained in:
parent
90c5bd3796
commit
9b7ef2c65e
@ -0,0 +1,296 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Sat, 8 Jul 2017 01:35:35 +0200
|
||||||
|
Subject: scripts: metadata: always resolve dependencies through provides list
|
||||||
|
|
||||||
|
Instead of adding virtual packages to the normal package list, keep a
|
||||||
|
separate list for provides, make each package provide itself, and resolve
|
||||||
|
all dependencies through this list. This allows to use PROVIDES to replace
|
||||||
|
existing packages.
|
||||||
|
|
||||||
|
A side effect of the changes in the makefile dependency logic is that
|
||||||
|
build dependencies are now always interpreted as source package names,
|
||||||
|
instead of putting build and runtime dependencies into the same list.
|
||||||
|
|
||||||
|
Fixes FS#837.
|
||||||
|
|
||||||
|
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
|
||||||
|
diff --git a/scripts/feeds b/scripts/feeds
|
||||||
|
index 55c294ad0a4ec2f0419d12deddeda7324c349e04..a38eb454585f5dd27b707db23184b7df07ab2658 100755
|
||||||
|
--- a/scripts/feeds
|
||||||
|
+++ b/scripts/feeds
|
||||||
|
@@ -252,7 +252,6 @@ sub search_feed {
|
||||||
|
my $substr;
|
||||||
|
my $pkgmatch = 1;
|
||||||
|
|
||||||
|
- next if $pkg->{vdepends};
|
||||||
|
foreach my $substr (@substr) {
|
||||||
|
my $match;
|
||||||
|
foreach my $key (qw(name title description src)) {
|
||||||
|
@@ -306,7 +305,6 @@ sub list_feed {
|
||||||
|
get_feed($feed);
|
||||||
|
foreach my $name (sort { lc($a) cmp lc($b) } keys %$feed_package) {
|
||||||
|
my $pkg = $feed_package->{$name};
|
||||||
|
- next if $pkg->{vdepends};
|
||||||
|
if($pkg->{name}) {
|
||||||
|
printf "\%-32s\t\%s\n", $pkg->{name}, $pkg->{title};
|
||||||
|
}
|
||||||
|
@@ -588,7 +586,6 @@ sub install {
|
||||||
|
get_feed($f->[1]);
|
||||||
|
foreach my $name (sort { lc($a) cmp lc($b) } keys %$feed_package) {
|
||||||
|
my $p = $feed_package->{$name};
|
||||||
|
- next if $p->{vdepends};
|
||||||
|
if( $p->{name} ) {
|
||||||
|
install_package($feed, $p->{name}, exists($opts{f})) == 0 or $ret = 1;
|
||||||
|
get_feed($f->[1]);
|
||||||
|
diff --git a/scripts/metadata.pm b/scripts/metadata.pm
|
||||||
|
index 8334f26d3179a0eb83aa1aa976778ff5828faf45..e7bdbab4568ddd7e10c10b2ca6a718380c7d6308 100644
|
||||||
|
--- a/scripts/metadata.pm
|
||||||
|
+++ b/scripts/metadata.pm
|
||||||
|
@@ -2,9 +2,10 @@ package metadata;
|
||||||
|
use base 'Exporter';
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
-our @EXPORT = qw(%package %srcpackage %category %subdir %preconfig %features %overrides clear_packages parse_package_metadata parse_target_metadata get_multiline @ignore);
|
||||||
|
+our @EXPORT = qw(%package %vpackage %srcpackage %category %subdir %preconfig %features %overrides clear_packages parse_package_metadata parse_target_metadata get_multiline @ignore);
|
||||||
|
|
||||||
|
our %package;
|
||||||
|
+our %vpackage;
|
||||||
|
our %preconfig;
|
||||||
|
our %srcpackage;
|
||||||
|
our %category;
|
||||||
|
@@ -124,6 +125,7 @@ sub clear_packages() {
|
||||||
|
%subdir = ();
|
||||||
|
%preconfig = ();
|
||||||
|
%package = ();
|
||||||
|
+ %vpackage = ();
|
||||||
|
%srcpackage = ();
|
||||||
|
%category = ();
|
||||||
|
%features = ();
|
||||||
|
@@ -179,6 +181,9 @@ sub parse_package_metadata($) {
|
||||||
|
$pkg->{override} = $override;
|
||||||
|
$package{$1} = $pkg;
|
||||||
|
push @{$srcpackage{$src}}, $pkg;
|
||||||
|
+
|
||||||
|
+ $vpackage{$1} or $vpackage{$1} = [];
|
||||||
|
+ unshift @{$vpackage{$1}}, $1;
|
||||||
|
};
|
||||||
|
/^Feature:\s*(.+?)\s*$/ and do {
|
||||||
|
undef $pkg;
|
||||||
|
@@ -210,14 +215,8 @@ sub parse_package_metadata($) {
|
||||||
|
/^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};
|
||||||
|
+ $vpackage{$vpkg} or $vpackage{$vpkg} = [];
|
||||||
|
+ push @{$vpackage{$vpkg}}, $pkg->{name};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
/^Menu-Depends: \s*(.+)\s*$/ and $pkg->{mdepends} = [ split /\s+/, $1 ];
|
||||||
|
diff --git a/scripts/package-metadata.pl b/scripts/package-metadata.pl
|
||||||
|
index 2da32c770ef3333bfcc18922ede556f9734510c7..bd795bfe58d86c0e48205042192751fadf8a209b 100755
|
||||||
|
--- a/scripts/package-metadata.pl
|
||||||
|
+++ b/scripts/package-metadata.pl
|
||||||
|
@@ -101,14 +101,16 @@ my %dep_check;
|
||||||
|
sub __find_package_dep($$) {
|
||||||
|
my $pkg = shift;
|
||||||
|
my $name = shift;
|
||||||
|
- my $deps = ($pkg->{vdepends} or $pkg->{depends});
|
||||||
|
+ my $deps = $pkg->{depends};
|
||||||
|
|
||||||
|
return 0 unless defined $deps;
|
||||||
|
- foreach my $dep (@{$deps}) {
|
||||||
|
- next if $dep_check{$dep};
|
||||||
|
- $dep_check{$dep} = 1;
|
||||||
|
- return 1 if $dep eq $name;
|
||||||
|
- return 1 if ($package{$dep} and (__find_package_dep($package{$dep},$name) == 1));
|
||||||
|
+ foreach my $vpkg (@{$deps}) {
|
||||||
|
+ foreach my $dep (@{$vpackage{$vpkg}}) {
|
||||||
|
+ next if $dep_check{$dep};
|
||||||
|
+ $dep_check{$dep} = 1;
|
||||||
|
+ return 1 if $dep eq $name;
|
||||||
|
+ return 1 if ($package{$dep} and (__find_package_dep($package{$dep},$name) == 1));
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -173,9 +175,8 @@ sub mconf_depends {
|
||||||
|
}
|
||||||
|
$depend = $2;
|
||||||
|
}
|
||||||
|
- next if $package{$depend} and $package{$depend}->{buildonly};
|
||||||
|
if ($flags =~ /\+/) {
|
||||||
|
- if ($vdep = $package{$depend}->{vdepends}) {
|
||||||
|
+ if ($vdep = $vpackage{$depend}) {
|
||||||
|
my @vdeps;
|
||||||
|
$depend = undef;
|
||||||
|
|
||||||
|
@@ -209,7 +210,7 @@ sub mconf_depends {
|
||||||
|
|
||||||
|
$flags =~ /@/ or $depend = "PACKAGE_$depend";
|
||||||
|
} else {
|
||||||
|
- if ($vdep = $package{$depend}->{vdepends}) {
|
||||||
|
+ if ($vdep = $vpackage{$depend}) {
|
||||||
|
$depend = join("||", map { "PACKAGE_".$_ } @$vdep);
|
||||||
|
} else {
|
||||||
|
$flags =~ /@/ or $depend = "PACKAGE_$depend";
|
||||||
|
@@ -413,7 +414,6 @@ sub get_conditional_dep($$) {
|
||||||
|
|
||||||
|
sub gen_package_mk() {
|
||||||
|
my %conf;
|
||||||
|
- my %dep;
|
||||||
|
my %done;
|
||||||
|
my $line;
|
||||||
|
|
||||||
|
@@ -423,8 +423,6 @@ sub gen_package_mk() {
|
||||||
|
my $pkg = $package{$name};
|
||||||
|
my @srcdeps;
|
||||||
|
|
||||||
|
- next if defined $pkg->{vdepends};
|
||||||
|
-
|
||||||
|
$config = "\$(CONFIG_PACKAGE_$name)";
|
||||||
|
if ($config) {
|
||||||
|
$pkg->{buildonly} and $config = "";
|
||||||
|
@@ -445,16 +443,7 @@ sub gen_package_mk() {
|
||||||
|
print "buildtypes-$pkg->{subdir}$pkg->{src} = ".join(' ', @{$pkg->{buildtypes}})."\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
- foreach my $spkg (@{$srcpackage{$pkg->{src}}}) {
|
||||||
|
- foreach my $dep (@{$spkg->{depends}}, @{$spkg->{builddepends}}) {
|
||||||
|
- $dep =~ /@/ or do {
|
||||||
|
- $dep =~ s/\+//g;
|
||||||
|
- push @srcdeps, $dep;
|
||||||
|
- };
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
foreach my $type (@{$pkg->{buildtypes}}) {
|
||||||
|
- my @extra_deps;
|
||||||
|
my %deplines;
|
||||||
|
|
||||||
|
next unless $pkg->{"builddepends/$type"};
|
||||||
|
@@ -492,63 +481,70 @@ sub gen_package_mk() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- my $hasdeps = 0;
|
||||||
|
my %deplines;
|
||||||
|
- foreach my $deps (@srcdeps) {
|
||||||
|
- my $idx;
|
||||||
|
- my $condition;
|
||||||
|
- my $prefix = "";
|
||||||
|
- my $suffix = "";
|
||||||
|
-
|
||||||
|
- if ($deps =~ /^(.+):(.+)/) {
|
||||||
|
- $condition = $1;
|
||||||
|
- $deps = $2;
|
||||||
|
- }
|
||||||
|
- if ($deps =~ /^(.+)(\/.+)/) {
|
||||||
|
- $deps = $1;
|
||||||
|
- $suffix = $2;
|
||||||
|
- }
|
||||||
|
+ foreach my $spkg (@{$srcpackage{$pkg->{src}}}) {
|
||||||
|
+ foreach my $bdep (@{$spkg->{builddepends}}) {
|
||||||
|
+ my $condition;
|
||||||
|
+ my $suffix = "";
|
||||||
|
|
||||||
|
- my $pkg_dep = $package{$deps};
|
||||||
|
- my @deps;
|
||||||
|
+ if ($bdep =~ /^(.+):(.+)/) {
|
||||||
|
+ $condition = $1;
|
||||||
|
+ $bdep = $2;
|
||||||
|
+ }
|
||||||
|
+ if ($bdep =~ /^(.+)(\/.+)/) {
|
||||||
|
+ $bdep = $1;
|
||||||
|
+ $suffix = $2;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if ($pkg_dep->{vdepends}) {
|
||||||
|
- @deps = @{$pkg_dep->{vdepends}};
|
||||||
|
- } else {
|
||||||
|
- @deps = ($deps);
|
||||||
|
+ next unless $subdir{$bdep};
|
||||||
|
+ my $idx = $subdir{$bdep}.$bdep.$suffix;
|
||||||
|
+
|
||||||
|
+ my $depline = get_conditional_dep($condition, "\$(curdir)/$idx/compile");
|
||||||
|
+ if ($depline) {
|
||||||
|
+ $deplines{$depline}++;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
- foreach my $dep (@deps) {
|
||||||
|
- $pkg_dep = $package{$deps};
|
||||||
|
- if (defined $pkg_dep->{src}) {
|
||||||
|
- ($pkg->{src} ne $pkg_dep->{src}.$suffix) and $idx = $pkg_dep->{subdir}.$pkg_dep->{src};
|
||||||
|
- } elsif (defined($srcpackage{$dep})) {
|
||||||
|
- $idx = $subdir{$dep}.$dep;
|
||||||
|
+ foreach my $dep (@{$spkg->{depends}}) {
|
||||||
|
+ my $condition;
|
||||||
|
+ my $suffix = "";
|
||||||
|
+
|
||||||
|
+ next if $dep =~ /@/;
|
||||||
|
+ $dep =~ s/\+//g;
|
||||||
|
+
|
||||||
|
+ if ($dep =~ /^(.+):(.+)/) {
|
||||||
|
+ $condition = $1;
|
||||||
|
+ $dep = $2;
|
||||||
|
}
|
||||||
|
- undef $idx if $idx eq 'base-files';
|
||||||
|
- if ($idx) {
|
||||||
|
- $idx .= $suffix;
|
||||||
|
+ if ($dep =~ /^(.+)(\/.+)/) {
|
||||||
|
+ $dep = $1;
|
||||||
|
+ $suffix = $2;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ next unless $vpackage{$dep};
|
||||||
|
+
|
||||||
|
+ my @vdeps = @{$vpackage{$dep}};
|
||||||
|
+ foreach my $vdep (@vdeps) {
|
||||||
|
+ my $pkg_dep = $package{$vdep};
|
||||||
|
|
||||||
|
- my $depline;
|
||||||
|
+ next unless $pkg_dep;
|
||||||
|
next if $pkg->{src} eq $pkg_dep->{src}.$suffix;
|
||||||
|
- next if $dep{$condition.":".$pkg->{src}."->".$idx};
|
||||||
|
- next if $dep{$pkg->{src}."->($dep)".$idx} and $pkg_dep->{vdepends};
|
||||||
|
- my $depstr;
|
||||||
|
|
||||||
|
- if ($pkg_dep->{vdepends}) {
|
||||||
|
- $depstr = "\$(if \$(CONFIG_PACKAGE_$dep),\$(curdir)/$idx/compile)";
|
||||||
|
- $dep{$pkg->{src}."->($dep)".$idx} = 1;
|
||||||
|
+ my $idx = $pkg_dep->{subdir}.$pkg_dep->{src}.$suffix;
|
||||||
|
+ my $depstr;
|
||||||
|
+ if (@vdeps > 1) {
|
||||||
|
+ $depstr = "\$(if \$(CONFIG_PACKAGE_$vdep),\$(curdir)/$idx/compile)";
|
||||||
|
} else {
|
||||||
|
$depstr = "\$(curdir)/$idx/compile";
|
||||||
|
- $dep{$pkg->{src}."->".$idx} = 1;
|
||||||
|
}
|
||||||
|
- $depline = get_conditional_dep($condition, $depstr);
|
||||||
|
+ my $depline = get_conditional_dep($condition, $depstr);
|
||||||
|
if ($depline) {
|
||||||
|
$deplines{$depline}++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
my $depline = join(" ", sort keys %deplines);
|
||||||
|
if ($depline) {
|
||||||
|
$line .= "\$(curdir)/".$pkg->{subdir}."$pkg->{src}/compile += $depline\n";
|
||||||
|
@@ -573,7 +569,7 @@ ifndef DUMP_TARGET_DB
|
||||||
|
( \\
|
||||||
|
$cmds \\
|
||||||
|
) > \$@
|
||||||
|
-
|
||||||
|
+
|
||||||
|
ifneq (\$(IMAGEOPT)\$(CONFIG_IMAGEOPT),)
|
||||||
|
package/preconfig: \$(TARGET_DIR)/etc/uci-defaults/$preconfig
|
||||||
|
endif
|
Loading…
Reference in New Issue
Block a user