… | |
… | |
967 | path => $path, |
967 | path => $path, |
968 | base => $base, |
968 | base => $base, |
969 | pkg => $pkg, |
969 | pkg => $pkg, |
970 | ); |
970 | ); |
971 | |
971 | |
972 | $ext{meta} = { map { split /=/, $_, 2 } split /\s+/, $1 } |
972 | $ext{meta} = { map { (split /=/, $_, 2)[0, 1] } split /\s+/, $1 } |
973 | if $source =~ /^#!.*?perl.*?#\s*(.*)$/; |
973 | if $source =~ /\A#!.*?perl.*?#\s*(.*)$/m; |
974 | |
974 | |
975 | $ext{source} = |
975 | $ext{source} = |
976 | "package $pkg; use strict; use utf8;\n" |
976 | "package $pkg; use strict; use utf8;\n" |
977 | . "#line 1 \"$path\"\n{\n" |
977 | . "#line 1 \"$path\"\n{\n" |
978 | . $source |
978 | . $source |
… | |
… | |
984 | my %done; |
984 | my %done; |
985 | while (%todo) { |
985 | while (%todo) { |
986 | my $progress; |
986 | my $progress; |
987 | |
987 | |
988 | while (my ($k, $v) = each %todo) { |
988 | while (my ($k, $v) = each %todo) { |
989 | for (split /,\s*/, $ext{meta}{depends}) { |
989 | for (split /,\s*/, $v->{meta}{depends}) { |
990 | goto skip |
990 | goto skip |
991 | unless exists $done{$_}; |
991 | unless exists $done{$_}; |
992 | } |
992 | } |
993 | |
993 | |
994 | warn "... loading '$k' into '$v->{pkg}'\n"; |
994 | warn "... loading '$k' into '$v->{pkg}'\n"; |
995 | |
995 | |
996 | unless (eval $v->{source}) { |
996 | unless (eval $v->{source}) { |
997 | my $msg = $@ ? "$v->{path}: $@\n" |
997 | my $msg = $@ ? "$v->{path}: $@\n" |
998 | : "extension disabled.\n"; |
998 | : "$v->{base}: extension inactive.\n"; |
999 | |
999 | |
1000 | if (exists $v->{meta}{mandatory}) { |
1000 | if (exists $v->{meta}{mandatory}) { |
1001 | warn $msg; |
1001 | warn $msg; |
1002 | warn "mandatory extension failed to load, exiting.\n"; |
1002 | warn "mandatory extension failed to load, exiting.\n"; |
1003 | exit 1; |
1003 | exit 1; |
1004 | } |
1004 | } |
1005 | |
1005 | |
1006 | die $msg; |
1006 | warn $msg; |
1007 | } |
1007 | } |
1008 | |
1008 | |
1009 | $done{$k} = delete $todo{$k}; |
1009 | $done{$k} = delete $todo{$k}; |
1010 | push @EXTS, $v->{pkg}; |
1010 | push @EXTS, $v->{pkg}; |
|
|
1011 | $progress = 1; |
1011 | } |
1012 | } |
1012 | |
1013 | |
1013 | skip: |
1014 | skip: |
1014 | die "cannot load " . (join ", ", keys %todo) . ": unable to resolve dependencies\n" |
1015 | die "cannot load " . (join ", ", keys %todo) . ": unable to resolve dependencies\n" |
1015 | unless $progress; |
1016 | unless $progress; |