1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00
samba-mirror/source4/script/pkg-config
Jelmer Vernooij f98b34d0f2 r19880: Eliminate duplicates in the output.
(This used to be commit 2a8c8e1f2d)
2007-10-10 14:28:30 -05:00

146 lines
2.6 KiB
Perl
Executable File

#!/usr/bin/perl
# Simple pkg-config implementation in perl
# jelmer@samba.org, November 2006
use strict;
use Getopt::Long;
my @dirs = split(/:/, $ENV{PKG_CONFIG_PATH});
my $opt_help = 0;
my $opt_libs = 0;
my $opt_cflags = 0;
my $opt_static = 0;
my $result = GetOptions (
'help|h|?' => \$opt_help,
'static' => \$opt_static,
'libs' => \$opt_libs,
'cflags' => \$opt_cflags
);
if (not $result) {
exit(1);
}
if ($opt_help) {
print "pkg-config replacement in perl\n";
print "Copyright (C) 2006 Jelmer Vernooij <jelmer\@samba.org>\n";
print "\n";
print "Usage: pkg-config [OPTIONS] PACKAGE...\n";
print " --help Print this help message\n";
print " --static Print flags for static libraries\n";
print " --libs Print linker flags\n";
print " --cflags Print C compiler flags\n";
print "\n";
exit(0);
}
sub find_path($)
{
my $name = shift;
foreach my $dir (@dirs) {
if (-f "$dir/$name-uninstalled.pc") {
return "$dir/$name-uninstalled.pc";
}
}
foreach my $dir (@dirs) {
if (-f "$dir/$name.pc" ) {
return "$dir/$name.pc";
}
}
die("No such package `$name'");
}
sub ReplaceVars($$)
{
my ($expr, $vars) = @_;
$_ = $expr;
while (/(.*)\${([^}]+)}(.*)/) {
$_ = "$1$vars->{$2}$3";
}
return $_;
}
sub Parse($)
{
my $name = shift;
my $path = find_path($name);
my %variables = ();
my %fields = ();
my $lineno = 0;
open(IN, "<$path") or die("Unable to open $path: $!");
foreach (<IN>) {
$lineno+=1;
next if (/^#.*/);
if (/^([A-Za-z.]+): (.*)$/) {
$fields{$1} = ReplaceVars($2, \%variables);
} elsif (/^([A-Za-z_]+)=(.*)$/) {
$variables{$1} = ReplaceVars($2, \%variables);
} elsif (/^[ \t]*$/) {
} else {
warn("$path:$lineno: parse error");
}
}
close(IN);
return \%fields;
}
sub Cflags($)
{
my $name = shift;
my $fields = Parse($name);
my @cflags = split(/ /, $fields->{Cflags});
foreach (split(/[, ]/, $fields->{Requires})) {
push (@cflags, Cflags($_));
}
return @cflags;
}
sub Libs($)
{
my $name = shift;
my $fields = Parse($name);
my @libs = split(/ /, $fields->{Libs});
foreach (split(/[, ]/, $fields->{Requires})) {
push (@libs, Libs($_));
}
if ($opt_static) {
foreach (split(/[ ,]/, $fields->{"Requires.private"})) {
push (@libs, Libs($_));
}
}
return @libs;
}
my @out = ();
foreach my $pkg (@ARGV)
{
push (@out, Libs($pkg)) if ($opt_libs);
push (@out, Cflags($pkg)) if ($opt_cflags);
}
sub nub
{
my @list = @_;
my @ret = ();
my %seen = ();
foreach (@list) {
next if (defined($seen{$_}));
push (@ret, $_);
$seen{$_} = 1;
}
return @ret;
}
if ($#out >= 0) {
@out = nub(@out);
print join(' ', @out) . "\n";
}
exit 0;