From 307cc143c29c512644c4b0ef1c7b0dd8154448e6 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sat, 7 Jun 2008 23:08:39 +0200 Subject: [PATCH] The Configure mechanism is now able to find packages via pkg-config and similar scripts. --- lib/perl/Configure.pm | 87 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/lib/perl/Configure.pm b/lib/perl/Configure.pm index 56a85e2f..4ab9e727 100644 --- a/lib/perl/Configure.pm +++ b/lib/perl/Configure.pm @@ -16,7 +16,7 @@ BEGIN { our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); $VERSION = 1.0; @ISA = qw(Exporter); - @EXPORT = qw(&Init &Log &Notice &Warn &Fail &IsSet &Set &UnSet &Append &Override &Get &Test &Include &Finish &FindFile &TryFindFile); + @EXPORT = qw(&Init &Log &Notice &Warn &Fail &IsSet &IsGiven &Set &UnSet &Append &Override &Get &Test &Include &Finish &FindFile &TryFindFile &TryCmd &PkgConfig &TrivConfig); @EXPORT_OK = qw(); %EXPORT_TAGS = (); } @@ -46,6 +46,11 @@ sub IsSet($) { return exists $vars{$x}; } +sub IsGiven($) { + my ($x) = @_; + return exists $overriden{$x}; +} + sub Get($) { my ($x) = @_; return $vars{$x}; @@ -192,4 +197,84 @@ sub Finish() { Log "done\n"; } +sub TryCmd($) { + my ($cmd) = @_; + my $res = `$cmd`; + 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("CFLAGS_$upper" => $cf) if defined $cf; + my $lf = TryCmd("pkg-config --libs $pkg"); + Set("LIBS_$upper" => $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 $cf = TryCmd("$pc --cflags"); + Set("CFLAGS_$upper" => $cf) if defined $cf; + my $lf = TryCmd("$pc --libs"); + Set("LIBS_$upper" => $lf) if defined $lf; + return 1; +} + 1; # OK -- 2.39.2