]> mj.ucw.cz Git - libucw.git/blob - ucw/perl/UCW/Configure/Pkg.pm
Build: Renamed BUILDSYS_PATH to BUILDSYS to make it consistent with the rest.
[libucw.git] / ucw / perl / UCW / Configure / Pkg.pm
1 # UCW Library configuration system: pkg-config and friends
2 # (c) 2008 Martin Mares <mj@ucw.cz>
3
4 package UCW::Configure::Pkg;
5 use UCW::Configure;
6
7 use strict;
8 use warnings;
9
10 require Exporter;
11 our @ISA = qw(Exporter);
12 our @EXPORT = qw(&TryCmd &PkgConfig &TrivConfig);
13
14 sub TryCmd($) {
15         my ($cmd) = @_;
16         my $res = `$cmd`;
17         defined $res or return;
18         chomp $res;
19         return $res unless $?;
20         return;
21 }
22
23 sub maybe_manually($) {
24         my ($n) = @_;
25         if (IsGiven($n)) {
26                 if (Get("$n")) { Log "YES (set manually)\n"; }
27                 else { Log "NO (set manually)\n"; }
28                 return 1;
29         }
30         return 0;
31 }
32
33 sub PkgConfig($@) {
34         my $pkg = shift @_;
35         my %opts = @_;
36         my $upper = $pkg; $upper =~ tr/a-z/A-Z/; $upper =~ s/[^0-9A-Z]+/_/g;
37         Log "Checking for package $pkg ... ";
38         maybe_manually("CONFIG_HAVE_$upper") and return Get("CONFIG_HAVE_$upper");
39         my $ver = TryCmd("pkg-config --modversion $pkg 2>/dev/null");
40         if (!defined $ver) {
41                 Log("NONE\n");
42                 return 0;
43         }
44         if (defined($opts{minversion})) {
45                 my $min = $opts{minversion};
46                 if (!defined TryCmd("pkg-config --atleast-version=$min $pkg")) {
47                         Log("NO: version $ver is too old (need >= $min)\n");
48                         return 0;
49                 }
50         }
51         Log("YES: version $ver\n");
52         Set("CONFIG_HAVE_$upper" => 1);
53         Set("CONFIG_VER_$upper" => $ver);
54         my $cf = TryCmd("pkg-config --cflags $pkg");
55         Set("${upper}_CFLAGS" => $cf) if defined $cf;
56         my $lf = TryCmd("pkg-config --libs $pkg");
57         Set("${upper}_LIBS" => $lf) if defined $lf;
58         return 1;
59 }
60
61 sub ver_norm($) {
62         my ($v) = @_;
63         return join(".", map { sprintf("%05s", $_) } split(/\./, $v));
64 }
65
66 sub TrivConfig($@) {
67         my $pkg = shift @_;
68         my %opts = @_;
69         my $upper = $pkg; $upper =~ tr/a-z/A-Z/; $upper =~ s/[^0-9A-Z]+/_/g;
70         Log "Checking for package $pkg ... ";
71         maybe_manually("CONFIG_HAVE_$upper") and return Get("CONFIG_HAVE_$upper");
72         my $pc = $opts{script};
73         my $ver = TryCmd("$pc --version 2>/dev/null");
74         if (!defined $ver) {
75                 Log("NONE\n");
76                 return 0;
77         }
78         if (defined($opts{minversion})) {
79                 my $min = $opts{minversion};
80                 if (ver_norm($ver) lt ver_norm($min)) {
81                         Log("NO: version $ver is too old (need >= $min)\n");
82                         return 0;
83                 }
84         }
85         Log("YES: version $ver\n");
86         Set("CONFIG_HAVE_$upper" => 1);
87         Set("CONFIG_VER_$upper" => $ver);
88
89         my $want = $opts{want};
90         defined $want or $want = ["cflags", "libs"];
91         for my $w (@$want) {
92                 my $uw = $w; $uw =~ tr/a-z-/A-Z_/;
93                 my $cf = TryCmd("$pc --$w");
94                 Set("${upper}_${uw}" => $cf) if defined $cf;
95         }
96         return 1;
97 }
98 # We succeeded
99 1;