From: Martin Mares Date: Mon, 3 Nov 2008 22:48:04 +0000 (+0100) Subject: Configure: Moved interaction with pkg-config to a separate module. X-Git-Tag: holmes-import~204 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=0cbcac4fb273d306a50f6fee5456a43a51c257c0;p=libucw.git Configure: Moved interaction with pkg-config to a separate module. --- diff --git a/ucw/perl/UCW/Configure/Pkg.pm b/ucw/perl/UCW/Configure/Pkg.pm new file mode 100644 index 00000000..a78499c0 --- /dev/null +++ b/ucw/perl/UCW/Configure/Pkg.pm @@ -0,0 +1,99 @@ +# UCW Library configuration system: pkg-config and friends +# (c) 2008 Martin Mares + +package UCW::Configure::Pkg; +use UCW::Configure; + +use strict; +use warnings; + +require Exporter; +our @ISA = qw(Exporter); +our @EXPORT = qw(&TryCmd &PkgConfig &TrivConfig); + +sub TryCmd($) { + my ($cmd) = @_; + my $res = `$cmd`; + defined $res or return; + chomp $res; + return $res unless $?; + return; +} + +sub maybe_manually($) { + my ($n) = @_; + if (IsGiven($n)) { + if (Get("$n")) { Log "YES (set manually)\n"; } + else { Log "NO (set manually)\n"; } + return 1; + } + return 0; +} + +sub PkgConfig($@) { + my $pkg = shift @_; + my %opts = @_; + my $upper = $pkg; $upper =~ tr/a-z/A-Z/; $upper =~ s/[^0-9A-Z]+/_/g; + Log "Checking for package $pkg ... "; + maybe_manually("CONFIG_HAVE_$upper") and return Get("CONFIG_HAVE_$upper"); + my $ver = TryCmd("pkg-config --modversion $pkg 2>/dev/null"); + if (!defined $ver) { + Log("NONE\n"); + return 0; + } + if (defined($opts{minversion})) { + my $min = $opts{minversion}; + if (!defined TryCmd("pkg-config --atleast-version=$min $pkg")) { + Log("NO: version $ver is too old (need >= $min)\n"); + return 0; + } + } + Log("YES: version $ver\n"); + Set("CONFIG_HAVE_$upper" => 1); + Set("CONFIG_VER_$upper" => $ver); + my $cf = TryCmd("pkg-config --cflags $pkg"); + Set("${upper}_CFLAGS" => $cf) if defined $cf; + my $lf = TryCmd("pkg-config --libs $pkg"); + Set("${upper}_LIBS" => $lf) if defined $lf; + return 1; +} + +sub ver_norm($) { + my ($v) = @_; + return join(".", map { sprintf("%05s", $_) } split(/\./, $v)); +} + +sub TrivConfig($@) { + my $pkg = shift @_; + my %opts = @_; + my $upper = $pkg; $upper =~ tr/a-z/A-Z/; $upper =~ s/[^0-9A-Z]+/_/g; + Log "Checking for package $pkg ... "; + maybe_manually("CONFIG_HAVE_$upper") and return Get("CONFIG_HAVE_$upper"); + my $pc = $opts{script}; + my $ver = TryCmd("$pc --version 2>/dev/null"); + if (!defined $ver) { + Log("NONE\n"); + return 0; + } + if (defined($opts{minversion})) { + my $min = $opts{minversion}; + if (ver_norm($ver) lt ver_norm($min)) { + Log("NO: version $ver is too old (need >= $min)\n"); + return 0; + } + } + Log("YES: version $ver\n"); + Set("CONFIG_HAVE_$upper" => 1); + Set("CONFIG_VER_$upper" => $ver); + + my $want = $opts{want}; + defined $want or $want = ["cflags", "libs"]; + for my $w (@$want) { + my $uw = $w; $uw =~ tr/a-z-/A-Z_/; + my $cf = TryCmd("$pc --$w"); + Set("${upper}_${uw}" => $cf) if defined $cf; + } + return 1; +} +# We succeeded +1;