summaryrefslogtreecommitdiff
path: root/source4/script/pkg-config
diff options
context:
space:
mode:
Diffstat (limited to 'source4/script/pkg-config')
-rwxr-xr-xsource4/script/pkg-config145
1 files changed, 145 insertions, 0 deletions
diff --git a/source4/script/pkg-config b/source4/script/pkg-config
new file mode 100755
index 0000000000..458cac6be2
--- /dev/null
+++ b/source4/script/pkg-config
@@ -0,0 +1,145 @@
+#!/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;