+my $makevar_hash = {};
+
+sub makevar_define {
+ my ($varname) = @_;
+
+ die "makefile variable '$varname' already defined\n"
+ if exists($makevar_hash->{$varname});
+
+ $makevar_hash->{$varname} = {};
+}
+
+sub makevar_list_add {
+ my ($varname, $value) = @_;
+
+ die "makefile variable '$varname' not defined\n"
+ if !exists($makevar_hash->{$varname});
+
+ $makevar_hash->{$varname}->{$value} = 1;
+}
+
+sub makevar_dump {
+ my $txt = '';
+
+ foreach my $varname (sort keys %$makevar_hash) {
+ $txt .= "$varname =";
+ foreach my $value (sort keys %{$makevar_hash->{$varname}}) {
+ $txt .= " \\\n\t$value";
+ }
+ $txt .= "\n\n";
+ }
+
+ return $txt;
+}
+
+if ($generate_depends) {
+
+ my $tmpfilename = "${generate_depends}.tmp";
+ my $outfh = IO::File->new($tmpfilename, "w") ||
+ die "unable to open temporary file '$tmpfilename'\n";
+
+ my $depends = {};
+ foreach my $e (@$start_env) {
+ my $env_data = $fileinfo->{include}->{$e};
+
+ my $add_depends;
+
+ $add_depends = sub {
+ my ($fn, $dep) = @_;
+
+ $depends->{$fn}->{$dep} = 1;
+ foreach my $nd (keys %{$env_data->{$dep}}) {
+ &$add_depends($fn, $nd);
+ }
+ };
+
+ foreach my $fn (keys %$env_data) {
+ foreach my $dep (keys %{$env_data->{$fn}}) {
+ &$add_depends($fn, $dep);
+ }
+ }
+ }
+
+ my $depend_varname_hash = {};
+
+ foreach my $fn (sort keys %$depends) {
+ my $basename = uc($fn);
+ $basename =~s/\.adoc$//i;
+ $basename =~s/[^A-Za-z0-9]/_/g;
+
+ my $varname1 = "${basename}_ADOCSOURCES";
+ my $varname2 = "${basename}_ADOCDEPENDS";
+
+ makevar_define($varname1);
+ makevar_define($varname2);
+
+ $depend_varname_hash->{$fn} = $varname2;
+
+ makevar_list_add($varname1, $fn);
+ makevar_list_add($varname2, "\$\{$varname1\}");
+
+ foreach my $dep (sort keys %{$depends->{$fn}}) {
+ if ($dep =~ m/-(opts|synopsis).adoc$/) {
+ makevar_list_add($varname2, $dep);
+ } else {
+ makevar_list_add($varname1, $dep);
+ }
+ }
+ }
+
+ my $man_sources_hash = {};
+ foreach my $sourcefile (keys %{$fileinfo->{outfile}->{manvolnum}}) {
+ $man_sources_hash->{$sourcefile} = 1;
+ my $ihash = $fileinfo->{include}->{manvolnum}->{$sourcefile};
+ foreach my $include (keys %$ihash) {
+ if ($include !~ m/-(opts|synopsis).adoc$/) {
+ $man_sources_hash->{$include} = 1;
+ }
+ }
+ }
+
+ my $varname = "MANUAL_SOURCES";
+ makevar_define($varname);
+ foreach my $sourcefile (sort keys %$man_sources_hash) {
+ makevar_list_add($varname, $sourcefile);
+ }
+
+ $varname = "CHAPTER_LIST";
+ makevar_define($varname);
+ my $filelist = $fileinfo->{outfile}->{default};
+ foreach my $sourcefile (sort keys %$filelist) {
+ my $target = $filelist->{$sourcefile};
+ makevar_list_add($varname, $target);
+ }
+
+ $varname = "MANUAL_PAGES";
+ makevar_define($varname);
+ $filelist = $fileinfo->{outfile}->{manvolnum};
+ foreach my $manpage (sort keys %$filelist) {
+ my $target = $filelist->{$manpage};
+ makevar_list_add($varname, $target);
+ }
+
+ $varname = "WIKI_IMPORTS";
+ makevar_define($varname);
+ $filelist = $fileinfo->{outfile}->{wiki};
+ foreach my $sourcefile (sort keys %$filelist) {
+ my $target = $filelist->{$sourcefile};
+ makevar_list_add($varname, $target);
+ }
+
+ my $res = makevar_dump();
+
+ my $make_targets = {};
+ foreach my $e (@$start_env) {
+ my $filelist = $fileinfo->{outfile}->{$e};
+ foreach my $sourcefile (sort keys %$filelist) {
+ my $varname = $depend_varname_hash->{$sourcefile};
+ next if !defined($varname);
+ my $target = $filelist->{$sourcefile};
+ my $dep = "\$\{$varname\}";
+ $make_targets->{$target} = $dep;
+ if ($e eq 'manvolnum') {
+ $make_targets->{"$target.html"} = $dep;
+ $make_targets->{"$target-plain.html"} = $dep;
+ }
+ }
+ }
+ foreach my $target (sort keys%$make_targets) {
+ my $dep = $make_targets->{$target};
+ $res .= "$target: $dep\n\n";
+ }
+
+ print $outfh $res;
+ close($outfh);
+
+ rename($tmpfilename, $generate_depends) ||
+ die "rename failed - $!";
+}