X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=make%2Futilities.pm;h=48713fe9e9936bc7035ca718047c28296ebbe577;hb=1f6327977737a7989e47116e86e9e3ff8dd67656;hp=8b74b7e84d97bf4d1417a8f28cd0d24669f45aae;hpb=6a64a69fbc56b97f6285fbaad9f30fe58f211a88;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/make/utilities.pm b/make/utilities.pm index 8b74b7e84..48713fe9e 100644 --- a/make/utilities.pm +++ b/make/utilities.pm @@ -1,27 +1,42 @@ -# +------------------------------------+ -# | Inspire Internet Relay Chat Daemon | -# +------------------------------------+ # -# InspIRCd: (C) 2002-2007 InspIRCd Development Team -# See: http://www.inspircd.org/wiki/index.php/Credits +# InspIRCd -- Internet Relay Chat Daemon # -# This program is free but copyrighted software; see -# the file COPYING for details. +# Copyright (C) 2010 Daniel De Graaf +# Copyright (C) 2007-2008 Craig Edwards +# Copyright (C) 2008 Thomas Stagner +# Copyright (C) 2007 Dennis Friis +# +# This file is part of InspIRCd. InspIRCd is free software: you can +# redistribute it and/or modify it under the terms of the GNU General Public +# License as published by the Free Software Foundation, version 2. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # -# --------------------------------------------------- -package make::utilities; -require 5.8.0; +BEGIN { + require 5.8.0; +} + +package make::utilities; use strict; use warnings FATAL => qw(all); use Exporter 'import'; -use POSIX; -use Getopt::Long; use Fcntl; -our @EXPORT = qw(make_rpath pkgconfig_get_include_dirs pkgconfig_get_lib_dirs pkgconfig_check_version translate_functions promptstring vcheck); +use File::Path; +use File::Spec::Functions qw(rel2abs); +use Getopt::Long; +use POSIX; + +our @EXPORT = qw(module_installed prompt_bool prompt_dir prompt_string get_cpu_count make_rpath pkgconfig_get_include_dirs pkgconfig_get_lib_dirs pkgconfig_check_version translate_functions promptstring); # Parse the output of a *_config program, # such as pcre_config, take out the -L @@ -32,6 +47,62 @@ our @EXPORT = qw(make_rpath pkgconfig_get_include_dirs pkgconfig_get_lib_dirs pk my %already_added = (); my $if_skip_lines = 0; +sub module_installed($) +{ + my $module = shift; + eval("use $module;"); + return !$@; +} + +sub prompt_bool($$$) { + my ($interactive, $question, $default) = @_; + my $answer = prompt_string($interactive, $question, $default ? 'y' : 'n'); + return $answer =~ /y/i; +} + +sub prompt_dir($$$) { + my ($interactive, $question, $default) = @_; + my ($answer, $create) = (undef, 'y'); + do { + $answer = rel2abs(prompt_string($interactive, $question, $default)); + $create = prompt_bool($interactive && !-d $answer, "$answer does not exist. Create it?", 'y'); + my $mkpath = eval { + mkpath($answer, 0, 0750); + return 1; + }; + unless (defined $mkpath) { + print "Error: unable to create $answer!\n\n"; + $create = 0; + } + } while (!$create); + return $answer; +} + +sub prompt_string($$$) { + my ($interactive, $question, $default) = @_; + return $default unless $interactive; + print $question, "\n"; + print "[\e[1;32m$default\e[0m] => "; + chomp(my $answer = ); + print "\n"; + return $answer ? $answer : $default; +} + +sub get_cpu_count { + my $count = 1; + if ($^O =~ /bsd/) { + $count = `sysctl -n hw.ncpu`; + } elsif ($^O eq 'darwin') { + $count = `sysctl -n hw.activecpu`; + } elsif ($^O eq 'linux') { + $count = `getconf _NPROCESSORS_ONLN`; + } elsif ($^O eq 'solaris') { + $count = `psrinfo -p`; + } + chomp($count); + return $count; +} + sub promptstring($$$$$) { my ($prompt, $configitem, $default, $package, $commandlineswitch) = @_; @@ -98,15 +169,6 @@ sub pkgconfig_get_include_dirs($$$;$) { my ($packagename, $headername, $defaults, $module) = @_; - my $key = "default_includedir_$packagename"; - if (exists $main::config{$key}) - { - print "Locating include directory for package \e[1;32m$packagename\e[0m for module \e[1;32m$module\e[0m... "; - my $ret = $main::config{$key}; - print "\e[1;32m$ret\e[0m (cached)\n"; - return $ret; - } - extend_pkg_path(); print "Locating include directory for package \e[1;32m$packagename\e[0m for module \e[1;32m$module\e[0m... "; @@ -116,9 +178,9 @@ sub pkgconfig_get_include_dirs($$$;$) my $foo = ""; if ((!defined $v) || ($v eq "")) { - $foo = `locate "$headername" | head -n 1`; - $foo =~ /(.+)\Q$headername\E/; - my $find = $1; + print "\e[31mCould not find $packagename via pkg-config\e[m (\e[1;32mplease install pkg-config\e[m)\n"; + $foo = `locate "$headername" 2>/dev/null | head -n 1`; + my $find = $foo =~ /(.+)\Q$headername\E/ ? $1 : ''; chomp($find); if ((defined $find) && ($find ne "") && ($find ne $packagename)) { @@ -149,7 +211,14 @@ sub pkgconfig_get_include_dirs($$$;$) $headername =~ s/^\///; promptstring("path to the directory containing $headername", $key, "/usr/include",$packagename,"$packagename-includes"); $packagename =~ tr/a-z/A-Z/; - $main::config{$key} = "-I$main::config{$key}" . " $defaults -DVERSION_$packagename=\"$v\""; + if (defined $v) + { + $main::config{$key} = "-I$main::config{$key}" . " $defaults -DVERSION_$packagename=\"$v\""; + } + else + { + $main::config{$key} = "-I$main::config{$key}" . " $defaults -DVERSION_$packagename=\"0.0\""; + } $main::config{$key} =~ s/^\s+//g; $ret = $main::config{$key}; return $ret; @@ -169,29 +238,6 @@ sub pkgconfig_get_include_dirs($$$;$) return $ret; } -sub vcheck($$) -{ - my ($version1, $version2) = @_; - $version1 =~ s/\-r(\d+)/\.$1/g; # minor revs/patchlevels - $version2 =~ s/\-r(\d+)/\.$1/g; - $version1 =~ s/p(\d+)/\.$1/g; - $version2 =~ s/p(\d+)/\.$1/g; - $version1 =~ s/\-//g; - $version2 =~ s/\-//g; - $version1 =~ s/[a-z]//g; - $version2 =~ s/[a-z]//g; - my @v1 = split('\.', $version1); - my @v2 = split('\.', $version2); - for (my $curr = 0; $curr < scalar(@v2); $curr++) - { - if ($v1[$curr] < $v2[$curr]) - { - return 0; - } - } - return 1; -} - sub pkgconfig_check_version($$;$) { my ($packagename, $version, $module) = @_; @@ -207,7 +253,7 @@ sub pkgconfig_check_version($$;$) } if ((defined $v) && ($v ne "")) { - if (vcheck($v,$version) == 1) + if (!system "pkg-config --atleast-version $version $packagename") { print "\e[1;32mYes (version $v)\e[0m\n"; return 1; @@ -229,15 +275,6 @@ sub pkgconfig_get_lib_dirs($$$;$) { my ($packagename, $libname, $defaults, $module) = @_; - my $key = "default_libdir_$packagename"; - if (exists $main::config{$key}) - { - print "Locating library directory for package \e[1;32m$packagename\e[0m for module \e[1;32m$module\e[0m... "; - my $ret = $main::config{$key}; - print "\e[1;32m$ret\e[0m (cached)\n"; - return $ret; - } - extend_pkg_path(); print "Locating library directory for package \e[1;32m$packagename\e[0m for module \e[1;32m$module\e[0m... "; @@ -311,16 +348,6 @@ sub translate_functions($$) $module =~ /modules*\/(.+?)$/; $module = $1; - # This is only a cursory check, just designed to catch casual accidental use of backticks. - # There are pleanty of ways around it, but its not supposed to be for security, just checking - # that people are using the new configuration api as theyre supposed to and not just using - # backticks instead of eval(), being as eval has accountability. People wanting to get around - # the accountability will do so anyway. - if (($line =~ /`/) && ($line !~ /eval\(.+?`.+?\)/)) - { - die "Developers should no longer use backticks in configuration macros. Please use exec() and eval() macros instead. Offending line: $line (In module: $module)"; - } - if ($line =~ /ifuname\(\!"(\w+)"\)/) { my $uname = $1; @@ -358,6 +385,27 @@ sub translate_functions($$) $line =~ s/if\("(.+?)"\)//; } + if ($line =~ /if\(\!"(\w+)"\)/) + { + if (!exists $main::config{$1}) + { + $line = ""; + return ""; + } + else + { + if (defined $1) + { + if (exists ($main::config{$1}) and (($main::config{$1} =~ /y/i) or ($main::config{$1} eq "1"))) + { + $line = ""; + return ""; + } + } + } + + $line =~ s/if\(\!"(.+?)"\)//; + } while ($line =~ /exec\("(.+?)"\)/) { print "Executing program for module \e[1;32m$module\e[0m ... \e[1;32m$1\e[0m\n"; @@ -426,6 +474,10 @@ sub translate_functions($$) my $err = $@; #$err =~ s/at .+? line \d+.*//g; print "\n\nConfiguration failed. The following error occured:\n\n$err\n"; + print "\nMake sure you have pkg-config installed\n"; + print "\nIn the case of gnutls configuration errors on debian,\n"; + print "Ubuntu, etc, you should ensure that you have installed\n"; + print "gnutls-bin as well as gnutls-dev and gnutls.\n"; exit; } else