-# +------------------------------------+
-# | Inspire Internet Relay Chat Daemon |
-# +------------------------------------+
#
-# InspIRCd: (C) 2002-2009 InspIRCd Development Team
-# See: http://wiki.inspircd.org/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 <danieldg@inspircd.org>
+# Copyright (C) 2007-2008 Craig Edwards <craigedwards@brainbox.cc>
+# Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
+# Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+#
+# 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 <http://www.gnu.org/licenses/>.
#
-# ---------------------------------------------------
-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);
-
-# Parse the output of a *_config program,
-# such as pcre_config, take out the -L
-# directive and return an rpath for it.
+use File::Path;
+use File::Spec::Functions qw(rel2abs);
+use Getopt::Long;
+use POSIX;
-# \e[1;32msrc/Makefile\e[0m
+our @EXPORT = qw(get_version 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);
my %already_added = ();
-my $if_skip_lines = 0;
+my %version = ();
+
+sub get_version {
+ return %version if %version;
+
+ # Attempt to retrieve version information from src/version.sh
+ chomp(my $vf = `sh src/version.sh 2>/dev/null`);
+ if ($vf =~ /^InspIRCd-([0-9]+)\.([0-9]+)\.([0-9]+)(?:\+(\w+))?$/) {
+ %version = ( MAJOR => $1, MINOR => $2, PATCH => $3, LABEL => $4 );
+ }
+
+ # Attempt to retrieve missing version information from Git
+ chomp(my $gr = `git describe --tags 2>/dev/null`);
+ if ($gr =~ /^v([0-9]+)\.([0-9]+)\.([0-9]+)(?:-\d+-(\w+))?$/) {
+ $version{MAJOR} = $1 unless defined $version{MAJOR};
+ $version{MINOR} = $2 unless defined $version{MINOR};
+ $version{PATCH} = $3 unless defined $version{PATCH};
+ $version{LABEL} = $4 if defined $4;
+ }
+
+ # The user is using a stable release which does not have
+ # a label attached.
+ $version{LABEL} = 'release' unless defined $version{LABEL};
+
+ # If any of these fields are missing then the user has deleted the
+ # version file and is not running from Git. Fill in the fields with
+ # dummy data so we don't get into trouble with undef values later.
+ $version{MAJOR} = '0' unless defined $version{MAJOR};
+ $version{MINOR} = '0' unless defined $version{MINOR};
+ $version{PATCH} = '0' unless defined $version{PATCH};
+
+ return %version;
+}
+
+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 = <STDIN>);
+ 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($$$$$)
{
print "Adding extra library path to \e[1;32m$module\e[0m ... \e[1;32m$libpath\e[0m\n";
$already_added{$libpath} = 1;
}
- $output .= "-Wl,--rpath -Wl,$libpath -L$libpath " unless defined $main::opt_disablerpath;
+ $output .= "-Wl,-rpath -Wl,$libpath -L$libpath " unless defined $main::opt_disablerpath;
$data =~ s/-L(\S+)//;
}
return $output;
{
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... ";
if ((!defined $v) || ($v eq ""))
{
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 $locbin = $^O eq 'solaris' ? 'slocate' : 'locate';
+ $foo = `$locbin "$headername" 2>/dev/null | head -n 1`;
my $find = $foo =~ /(.+)\Q$headername\E/ ? $1 : '';
chomp($find);
if ((defined $find) && ($find ne "") && ($find ne $packagename))
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) = @_;
}
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;
{
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... ";
my $foo = "";
if ((!defined $v) || ($v eq ""))
{
- $foo = `locate "$libname" | head -n 1`;
+ my $locbin = $^O eq 'solaris' ? 'slocate' : 'locate';
+ $foo = `$locbin "$libname" | head -n 1`;
$foo =~ /(.+)\Q$libname\E/;
my $find = $1;
chomp($find);
$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;
while ($line =~ /rpath\("(.+?)"\)/)
{
my $replace = make_rpath($1,$module);
- $replace = "" if ($^O =~ /darwin/i);
$line =~ s/rpath\("(.+?)"\)/$replace/;
}
};
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";