source: branches/samba-3.5.x/source4/script/pkg-config@ 737

Last change on this file since 737 was 414, checked in by Herwig Bauernfeind, 15 years ago

Samba 3.5.0: Initial import

File size: 2.6 KB
Line 
1#!/usr/bin/perl
2# Simple pkg-config implementation in perl
3# jelmer@samba.org, November 2006
4
5use strict;
6use Getopt::Long;
7
8my @dirs = split(/:/, $ENV{PKG_CONFIG_PATH});
9
10my $opt_help = 0;
11my $opt_libs = 0;
12my $opt_cflags = 0;
13my $opt_static = 0;
14
15my $result = GetOptions (
16 'help|h|?' => \$opt_help,
17 'static' => \$opt_static,
18 'libs' => \$opt_libs,
19 'cflags' => \$opt_cflags
20 );
21
22if (not $result) {
23 exit(1);
24}
25
26if ($opt_help) {
27 print "pkg-config replacement in perl\n";
28 print "Copyright (C) 2006 Jelmer Vernooij <jelmer\@samba.org>\n";
29 print "\n";
30 print "Usage: pkg-config [OPTIONS] PACKAGE...\n";
31 print " --help Print this help message\n";
32 print " --static Print flags for static libraries\n";
33 print " --libs Print linker flags\n";
34 print " --cflags Print C compiler flags\n";
35 print "\n";
36 exit(0);
37}
38
39sub find_path($)
40{
41 my $name = shift;
42 foreach my $dir (@dirs) {
43 if (-f "$dir/$name-uninstalled.pc") {
44 return "$dir/$name-uninstalled.pc";
45 }
46 }
47 foreach my $dir (@dirs) {
48 if (-f "$dir/$name.pc" ) {
49 return "$dir/$name.pc";
50 }
51 }
52 die("No such package `$name'");
53}
54
55sub ReplaceVars($$)
56{
57 my ($expr, $vars) = @_;
58
59 $_ = $expr;
60
61 while (/(.*)\${([^}]+)}(.*)/) {
62 $_ = "$1$vars->{$2}$3";
63 }
64
65 return $_;
66}
67
68sub Parse($)
69{
70 my $name = shift;
71 my $path = find_path($name);
72 my %variables = ();
73 my %fields = ();
74 my $lineno = 0;
75 open(IN, "<$path") or die("Unable to open $path: $!");
76 foreach (<IN>) {
77 $lineno+=1;
78 next if (/^#.*/);
79 if (/^([A-Za-z.]+): (.*)$/) {
80 $fields{$1} = ReplaceVars($2, \%variables);
81 } elsif (/^([A-Za-z_]+)=(.*)$/) {
82 $variables{$1} = ReplaceVars($2, \%variables);
83 } elsif (/^[ \t]*$/) {
84 } else {
85 warn("$path:$lineno: parse error");
86 }
87 }
88 close(IN);
89 return \%fields;
90}
91
92sub Cflags($)
93{
94 my $name = shift;
95 my $fields = Parse($name);
96 my @cflags = split(/ /, $fields->{Cflags});
97 foreach (split(/[, ]/, $fields->{Requires})) {
98 push (@cflags, Cflags($_));
99 }
100 return @cflags;
101}
102
103sub Libs($)
104{
105 my $name = shift;
106 my $fields = Parse($name);
107 my @libs = split(/ /, $fields->{Libs});
108 foreach (split(/[, ]/, $fields->{Requires})) {
109 push (@libs, Libs($_));
110 }
111 if ($opt_static) {
112 foreach (split(/[ ,]/, $fields->{"Requires.private"})) {
113 push (@libs, Libs($_));
114 }
115 }
116 return @libs;
117}
118
119my @out = ();
120
121foreach my $pkg (@ARGV)
122{
123 push (@out, Libs($pkg)) if ($opt_libs);
124 push (@out, Cflags($pkg)) if ($opt_cflags);
125}
126
127sub nub
128{
129 my @list = @_;
130 my @ret = ();
131 my %seen = ();
132 foreach (@list) {
133 next if (defined($seen{$_}));
134 push (@ret, $_);
135 $seen{$_} = 1;
136 }
137 return @ret;
138}
139
140if ($#out >= 0) {
141 @out = nub(@out);
142 print join(' ', @out) . "\n";
143}
144
145exit 0;
Note: See TracBrowser for help on using the repository browser.