#!/usr/bin/perl
#
# dpkg-buildflags
#
# Copyright © 2010-2011 Raphaël Hertzog <hertzog@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 2 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 strict;
use warnings;

use Dpkg;
use Dpkg::Gettext;
use Dpkg::ErrorHandling;
use Dpkg::BuildFlags;

textdomain("dpkg-dev");

sub version {
    printf _g("Debian %s version %s.\n"), $progname, $version;

    printf _g("
Copyright (C) 2010-2011 Raphael Hertzog <hertzog\@debian.org>.");

    printf _g("
This is free software; see the GNU General Public License version 2 or
later for copying conditions. There is NO warranty.
");
}

sub usage {
    printf _g(
"Usage: %s [<action>]

Actions:
  --get <flag>       output the requested flag to stdout.
  --origin <flag>    output the origin of the flag to stdout:
                     value is one of vendor, system, user, env.
  --list             output a list of the flags supported by the current vendor.
  --export=(sh|make|configure)
                     output something convenient to import the
                     compilation flags in a shell script, in make,
                     or on a ./configure command line.
  --dump             output all compilation flags with their values
  --help             show this help message.
  --version          show the version.
"), $progname;
}

my ($param, $action);

while (@ARGV) {
    $_ = shift(@ARGV);
    if (m/^--(get|origin)$/) {
        usageerr(_g("two commands specified: --%s and --%s"), $1, $action)
            if defined($action);
        $action = $1;
        $param = shift(@ARGV);
	usageerr(_g("%s needs a parameter"), $_) unless defined $param;
    } elsif (m/^--export(?:=(sh|make|configure))?$/) {
        usageerr(_g("two commands specified: --%s and --%s"), "export", $action)
            if defined($action);
        my $type = $1 || "sh";
        $action = "export-$type";
    } elsif (m/^--dump$/) {
        usageerr(_g("two commands specified: --%s and --%s"), "dump", $action)
            if defined($action);
        $action = "dump";
    } elsif (m/^--list$/) {
        usageerr(_g("two commands specified: --%s and --%s"), "list", $action)
            if defined($action);
        $action = "list";
    } elsif (m/^-(h|-help)$/) {
        usage();
        exit 0;
    } elsif (m/^--version$/) {
        version();
        exit 0;
    } else {
	usageerr(_g("unknown option \`%s'"), $_);
    }
}

$action = "dump" unless defined($action);

my $build_flags = Dpkg::BuildFlags->new();

if ($action eq "list") {
    foreach my $flag ($build_flags->list()) {
	print "$flag\n";
    }
    exit(0);
}

$build_flags->load_config();

if ($action eq "get") {
    if ($build_flags->has($param)) {
	print $build_flags->get($param) . "\n";
	exit(0);
    }
} elsif ($action eq "origin") {
    if ($build_flags->has($param)) {
	print $build_flags->get_origin($param) . "\n";
	exit(0);
    }
} elsif ($action =~ m/^export-(.*)$/) {
    my $export_type = $1;
    foreach my $flag ($build_flags->list()) {
	next unless $flag =~ /^[A-Z]/; # Skip flags starting with lowercase
	my $value = $build_flags->get($flag);
	if ($export_type eq "sh") {
	    $value =~ s/"/\"/g;
	    print "export $flag=\"$value\"\n";
	} elsif ($export_type eq "make") {
	    $value =~ s/\$/\$\$/g;
	    print "export $flag := $value\n";
	} elsif ($export_type eq "configure") {
	    print "$flag=\"$value\" ";
	}
    }
    exit(0);
} elsif ($action eq "dump") {
    foreach my $flag ($build_flags->list()) {
	my $value = $build_flags->get($flag);
	print "$flag=$value\n";
    }
    exit(0);
}

exit(1);
