#!/usr/bin/perl

# Copyright © 2022 Felix Lechner <felix.lechner@lease-up.com>
#
# based on a shell script by the same name
#     by Marco Túlio Gontijo e Silva <marcot@debian.org>
#     and Joachim Breitner <nomeata@debian.org>
# which in turn was based on
#     mk-haskell-depends by Martin Sjögren <sjogren@debian.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

use v5.20;
use warnings;
use utf8;

use Const::Fast;
use Path::Tiny;
use Unicode::UTF8 qw(encode_utf8 decode_utf8);

use Debian::Debhelper::Buildsystem::Haskell::Recipes qw(
  run
  installable_hc
  hc_pkgdir
  ghc_pkg_command
  load_ghc_database
  config_to_package_id
);
use Debian::Debhelper::Dh_Lib;

const my $SPACE => q{ };
const my $NEWLINE => qq{\n};

init();

my $ghc_pkg = ghc_pkg_command();

for my $installable (@{ $dh{DOPACKAGES} }) {

    my $compiler = installable_hc($installable) || $ENV{DEB_DEFAULT_COMPILER};
    my $pkgdir = hc_pkgdir($compiler);

    my $confdir = "debian/$installable/$pkgdir";

    my @configs;
    @configs = grep { $_->is_file } path($confdir)->children(qr{ [.]conf $}x)
      if -e $confdir;

    load_ghc_database($ghc_pkg, $ENV{DEB_GHC_DATABASE}, @configs);

    my @gcc_args;

    my @package_ids;
    for my $config (@configs) {
        my $package_id = config_to_package_id($config, $ghc_pkg, $ENV{DEB_GHC_DATABASE});
        push(@package_ids, $package_id);
    }
    for my $package_id (@package_ids) {

        my $libdir_string = decode_utf8(
            run(
                $ghc_pkg, '--package-db', $ENV{DEB_GHC_DATABASE},
                qw{--simple-output field},
                '--unit-id', $package_id, 'library-dirs'
            ));
        my @lib_dirs = split($SPACE, $libdir_string);
        push(@gcc_args, (map { "-L$_" } @lib_dirs));

        my $library_string = decode_utf8(
            run(
                $ghc_pkg, '--package-db', $ENV{DEB_GHC_DATABASE},
                qw{--simple-output field},
                '--unit-id', $package_id, 'extra-libraries'
            ));
        my @libraries = split($SPACE, $library_string);
        push(@gcc_args, (map { "-l$_" } @libraries));
    }

    my $T_DIR = 'debian/dh_haskell_shlibdeps';
    path($T_DIR)->mkpath;

    my $source_path = "$T_DIR/probe.c";
    my $probe_path = "$T_DIR/probe";

    path($source_path)->spew_utf8('int main (void) {}');

    my @gcc_args_bytes = map { encode_utf8($_) } @gcc_args;
    run('gcc', @gcc_args_bytes, $source_path, '-o', $probe_path);

    my $substvars_path = "debian/$installable.substvars";

    run(qw{dpkg-shlibdeps --warnings=1}, "-T$substvars_path", $probe_path);

    path($T_DIR)->remove_tree;
}

exit;

=head1 NAME

dh_haskell_shlibdeps - calculates external dependencies for Haskell libraries

=encoding utf8
=head1 SYNOPSIS

B<dh_haskell_depends> [S<I<debhelper options>>]

=head1 DESCRIPTION

dh_haskell_shlibdeps is a debhelper program that helps with calculating
external dependencies for building Haskell libraries.

It automates building libraries for the different supported Haskell systems in
Debian.

This script writes the debian/$package.substvars file, including in it the
shlibs:Depends variable.  So, to use this package, include in the Depends:
field in debian/control ${shlibs:Depends}.

=head1 BUGS

hugs and ghc are the only supported targets at the moment.  Cabal does
not yet support nhc98.

=head1 SEE ALSO

L<debhelper(7)>

=head1 AUTHOR

Marco Túlio Gontijo e Silva <marcot@debian.org>

Based on ideas in mk-haskell-depends by Martin Sjögren <sjogren@debian.org>

=cut

# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et
