diff options
Diffstat (limited to 'source4/script')
-rwxr-xr-x | source4/script/pkg-config | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/source4/script/pkg-config b/source4/script/pkg-config new file mode 100755 index 0000000000..bb94e1514a --- /dev/null +++ b/source4/script/pkg-config @@ -0,0 +1,130 @@ +#!/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 " --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 = $fields->{Cflags}; + foreach (split(/[, ]/, $fields->{Requires})) { + $cflags .= " ".Cflags($_); + } + return split(/ /, $cflags); +} + +sub Libs($) +{ + my $name = shift; + my $fields = Parse($name); + my $libs = $fields->{Libs}; + foreach (split(/[, ]/, $fields->{Requires})) { + $libs .= " ".Libs($_); + } + if ($opt_static) { + foreach (split(/[ ,]/, $fields->{"Requires.private"})) { + $libs .= " ".Libs($_); + } + } + return split(/ /, $libs); +} + +my @out = (); + +foreach my $pkg (@ARGV) +{ + push (@out, Libs($pkg)) if ($opt_libs); + push (@out, Cflags($pkg)) if ($opt_cflags); +} + +if ($#out >= 0) { + print join(' ', @out) . "\n"; +} + +exit 0; |