#!/usr/pkg/bin/perl
use File::Find;
use Getopt::Std;
use strict;
our(%opts);

getopts('p:hw', \%opts);

# --------------------------------------------
sub usage(){
    print STDERR <<USAGE;
$0
  Synopsis:
    -p pkgsrc path  (default /usr/pkgsrc)
    -w              includes wip directory
USAGE
}
# --------------------------------------------
my ($pkgsrc) = '/usr/pkgsrc';
my ($count) = 0;
my ($wip) = 0;
my $Makefile = 'doxygen-depend/Makefile';
my (@lines);
my (@prologue);
my (@epilogue);

my %COMMENT;
my %DISABLE;
my @POINTER;
my %RENAME = qw(kdelibdocs3 kdelibdocs);

if ($opts{'h'} ) { usage(); exit}
if ($opts{'p'} ) { $pkgsrc = $opts{'p'}}
if ($opts{'w'} ) { $wip++;}

if (! -d $pkgsrc ){
    print STDERR $pkgsrc .' is not a directory'."\n";
}
# --------------------------------------------
# sub prologue(){
#     print <<PROLOGUE;
# \# \$NetBSD\$
# \# \$Id\$
# 
# DISTNAME=	doxygen-dependent-1.01
# CATEGORIES=	meta-pkgs
# LICENSE=	generic-nonlicense
# 
# MAINTAINER=	pkgsrc-users\@NetBSD.org
# COMMENT=	Collection of dependent pkgs to check doxygen update
# 
# META_PACKAGE=	YES
# 
# .include "../../mk/bsd.pkg.mk"
# PROLOGUE
# }
#sub epilogue(){
#
#}
my $START = '# --- generated start --- See files/generate';
my $END	  = '# --- generated end';

sub readMakefile($$$$){
    my ($Makefile)  = shift;
    my ($prologue ) = shift;
    my ($lines    ) = shift;
    my ($epilogue ) = shift;    


    my ($prologue_chunk) = 1;
    my ($epilogue_chunk) = 0;
    open(Makefile, $Makefile) || die "Unable to open file $Makefile" . $!. "\n";
    while (<Makefile>) {
	if ( /^# --- generated start/ ) {
	    $prologue_chunk = 0; }
	if ( /^# --- generated end/ ) {
	    $epilogue_chunk = 1; }

	if    ( $prologue_chunk ) { push(@{$prologue}, $_);}
	elsif ( $epilogue_chunk ) { push(@{$epilogue}, $_);}
	else                      { 
	    chomp;
	    if (/(.)UILD_DEPENDS\+=\s+(\S+)-\[0-9\]\*:\S+\s*(.*)/) {
#		print $1,' - ',$2, ' - ', $3,"\n";
		my ($comment) = $3;
		$comment =~ s|^\s+||;
		$comment =~ s|\s+$||;
		$COMMENT{$2} = $comment;
		$DISABLE{$2} = $1;
	    }
	}
    }
}
# --------------------------------------------
sub wanted(){
    my $dir   = $File::Find::dir ;
    my $path = "$File::Find::dir/$_" ;
    my $fname = "$_";
    my $yes = 0;

    my $directory = $dir;
    $directory =~ s|$pkgsrc/||;

    if (  $directory =~ m|^wip/| && $wip == 0 ) { next; }
    if (  $directory =~ m|^devel/doxygen|     ) { next; }
    if (  $directory =~ m|^meta-pkgs|         ) { next; }
    
    if ($fname =~ /^Makefile/ || $fname eq 'options.mk' ) {
	open(FILE, $path) || print STDERR "failed to open $path\n";
	while(<FILE>){
	    if (/^#/ ) { next;}
	    if (/without-doxygen/) { next;}
	    if (/doxygen/) {
		$yes++;
	    }
	}
	close(FILE);
	if ($yes &&  $directory =~ m|/| ) { # avoid category/Makefile
	    $count++;
	    my ($leaf) = $directory;
	    $leaf =~ s|.*/||;
	    my ($B) =  $DISABLE{$leaf};
	    if ($DISABLE{$leaf} eq '') { $B = 'B';}
	    if ($RENAME{$leaf}) {
		$leaf = $RENAME{$leaf};}
	    my ($comment) = $COMMENT{$leaf};
	    $directory =~ s/[\t ]*$//;
	    my ($string) =
		sprintf "%s-[0-9]*:../../%s", $leaf, $directory;
	    if ( $comment =~ m|[\t ]*\#|) {
		printf "%sUILD_DEPENDS+=\t%-35s\t%s\n", $B, $string, $comment;

	    } else {
		printf "%sUILD_DEPENDS+=\t%s%s\n", $B, $string;

	    }
	}
    }
}
# --------------------------------------------
readMakefile($pkgsrc.'/wip/'.$Makefile, 
	     \@prologue, \@lines, \@epilogue);
print @prologue;
print $START,"\n";
find (\&wanted, $pkgsrc);
#print $END,"\n";
print @epilogue;
print "\n";

print "# $count entries generated.\n";
__END__

cd wip/doxygen-depend
perl files/generate > Makefile.new
diff -u Makefile Makefile.new
