X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=make%2Futilities.pm;h=4042439661da40df767b42339b388b83eb8ab7a7;hb=caa0c27a5a485151a0de21e700680c1e46ab85b4;hp=4452acc419523669bf0eda1a7e8e6547fb23f941;hpb=0a3b54f599e20fcccaacc655535c0682803fe348;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/make/utilities.pm b/make/utilities.pm index 4452acc41..404243966 100644 --- a/make/utilities.pm +++ b/make/utilities.pm @@ -20,27 +20,113 @@ # -package make::utilities; +BEGIN { + require 5.8.0; +} -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); - -# 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 = ); + 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($$$$$) { @@ -108,15 +194,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... "; @@ -127,7 +204,8 @@ sub pkgconfig_get_include_dirs($$$;$) 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)) @@ -223,15 +301,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... "; @@ -242,7 +311,8 @@ sub pkgconfig_get_lib_dirs($$$;$) 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); @@ -305,16 +375,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;