#!/usr/bin/perl

use Getopt::Long;
use Pod::Usage;
use warnings;
use strict;

# Executable called
my $ocamlobjinfo = $ENV{OCAMLOBJINFO};
$ocamlobjinfo = "ocamlobjinfo" unless defined($ocamlobjinfo);

my $man  = 0;
my $help = 0;
my @objects;
my $package_dev;
my $package_runtime;
my $package_version;
my $checksum;
my $md5sums_dir;

sub process_not_option {
    push @objects, @_;
}

sub get_objects {
    return <STDIN> unless @objects > 0;
    return @objects;
}

GetOptions(
    "package=s"     => \$package_dev,
    "runtime=s"     => \$package_runtime,
    "version=s"     => \$package_version,
    "checksum=s"    => \$checksum,
    "md5sums-dir=s" => \$md5sums_dir,
    "<>"            => \&process_not_option,
    "help|?"        => \$help,
    "man"           => \$man
) or pod2usage(2);
pod2usage(1)                                 if $help;
pod2usage( -exitstatus => 0, -verbose => 2 ) if $man;

@objects = get_objects();

print "Package: $package_dev\n"     if $package_dev;
print "Runtime: $package_runtime\n" if $package_runtime;
print "Version: $package_version\n" if $package_version;
print "ForcedChecksum: $checksum\n" if $checksum;

foreach my $obj_file ( get_objects() ) {
    chomp $obj_file;
    if ( $obj_file =~ /.*\.cma$/ ) {
        print "\nFile: $obj_file\n";
        foreach (`$ocamlobjinfo $obj_file`) {
            chomp $_;
            if (/.*(Force custom|Extra C object files|Extra C options):(.*)/) {
                print "$1:$2\n";
            }
        }
        die "E: Error running $ocamlobjinfo" if $?;
    }
}

__END__

=head1 NAME

ocaml-lintian - Dump OCaml object information for lintian test

=head1 SYNOPSIS

ocaml-lintian [option ...] file ...

Extract information from various OCaml object and dump them. This information
should be reused by lintian OCaml test, without dependency to ocaml tools to
extract information.

=head1 OPTIONS

=over 8

=item B<--package> pkg

Set package name for development dependency.

=item B<--runtime> pkg

Set package name for runtime dependency.

=item B<--version> ver

Set package version for dependencies.

=item B<--checksum> str

Checksum to use.

=item B<-help>

Print a brief help message and exits.

=item B<-man>

Prints the manual page and exits.

=back

=cut
