]> mj.ucw.cz Git - leo.git/blob - perl/UCW/Configure/Pkg.pm
5f3dc337604299d08ca345e1f2041908d59c77f9
[leo.git] / 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 PkgConfigTool() {
34         Log "Checking for pkg-config ... ";
35         if (!maybe_manually("CONFIG_HAVE_PKGCONFIG")) {
36                 my $ver = TryCmd("pkg-config --version 2>/dev/null");
37                 if (!defined $ver) {
38                         Log("NONE\n");
39                         Set("CONFIG_HAVE_PKGCONFIG", 0);
40                 } else {
41                         Log("YES: version $ver\n");
42                         Set("CONFIG_HAVE_PKGCONFIG", 1);
43                         Set("CONFIG_VER_PKGCONFIG", $ver);
44                 }
45         }
46         return Get("CONFIG_HAVE_PKGCONFIG");
47 }
48
49 sub PkgConfig($@) {
50         my $pkg = shift @_;
51         my %opts = @_;
52         my $upper = $pkg; $upper =~ tr/a-z/A-Z/; $upper =~ s/[^0-9A-Z]+/_/g;
53         PkgConfigTool() unless IsSet("CONFIG_HAVE_PKGCONFIG");
54         Log "Checking for package $pkg ... ";
55         maybe_manually("CONFIG_HAVE_$upper") and return Get("CONFIG_HAVE_$upper");
56         if (!Get("CONFIG_HAVE_PKGCONFIG")) {
57                 Log("NONE: pkg-config missing\n");
58                 return 0;
59         }
60         my $ver = TryCmd("pkg-config --modversion $pkg 2>/dev/null");
61         if (!defined $ver) {
62                 Log("NONE\n");
63                 return 0;
64         }
65         if (defined($opts{minversion})) {
66                 my $min = $opts{minversion};
67                 if (!defined TryCmd("pkg-config --atleast-version=$min $pkg")) {
68                         Log("NO: version $ver is too old (need >= $min)\n");
69                         return 0;
70                 }
71         }
72         Log("YES: version $ver\n");
73         Set("CONFIG_HAVE_$upper" => 1);
74         Set("CONFIG_VER_$upper" => $ver);
75         my $cf = TryCmd("pkg-config --cflags $pkg");
76         Set("${upper}_CFLAGS" => $cf) if defined $cf;
77         my $lf = TryCmd("pkg-config --libs $pkg");
78         Set("${upper}_LIBS" => $lf) if defined $lf;
79         return 1;
80 }
81
82 sub ver_norm($) {
83         my ($v) = @_;
84         return join(".", map { sprintf("%05s", $_) } split(/\./, $v));
85 }
86
87 sub TrivConfig($@) {
88         my $pkg = shift @_;
89         my %opts = @_;
90         my $upper = $pkg; $upper =~ tr/a-z/A-Z/; $upper =~ s/[^0-9A-Z]+/_/g;
91         Log "Checking for package $pkg ... ";
92         maybe_manually("CONFIG_HAVE_$upper") and return Get("CONFIG_HAVE_$upper");
93         my $pc = $opts{script};
94         my $ver = TryCmd("$pc --version 2>/dev/null");
95         if (!defined $ver) {
96                 Log("NONE\n");
97                 return 0;
98         }
99         if (defined($opts{minversion})) {
100                 my $min = $opts{minversion};
101                 if (ver_norm($ver) lt ver_norm($min)) {
102                         Log("NO: version $ver is too old (need >= $min)\n");
103                         return 0;
104                 }
105         }
106         Log("YES: version $ver\n");
107         Set("CONFIG_HAVE_$upper" => 1);
108         Set("CONFIG_VER_$upper" => $ver);
109
110         my $want = $opts{want};
111         defined $want or $want = ["cflags", "libs"];
112         for my $w (@$want) {
113                 my $uw = $w; $uw =~ tr/a-z-/A-Z_/;
114                 my $cf = TryCmd("$pc --$w");
115                 Set("${upper}_${uw}" => $cf) if defined $cf;
116         }
117         return 1;
118 }
119 # We succeeded
120 1;