123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 |
- 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
|