]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - configure
Remove support for the Solaris IOCP socket engine.
[user/henk/code/inspircd.git] / configure
index d7cf0d732917a1e02e0b6c6053933ca2d24039be..04981f6fdcc186f3fef0397fd36526da3d0d252d 100755 (executable)
--- a/configure
+++ b/configure
@@ -3,6 +3,7 @@
 #
 # InspIRCd -- Internet Relay Chat Daemon
 #
+#   Copyright (C) 2012-2017 Peter Powell <petpow@saberuk.com>
 #   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
 #   Copyright (C) 2007, 2009 Dennis Friis <peavey@inspircd.org>
 #   Copyright (C) 2003, 2006-2008 Craig Edwards <craigedwards@brainbox.cc>
 
 
 BEGIN {
-       require 5.8.0;
+       require 5.10.0;
 }
 
+use feature ':5.10';
 use strict;
 use warnings FATAL => qw(all);
 
 use File::Basename        qw(basename);
 use File::Copy            ();
 use File::Spec::Functions qw(rel2abs);
+use FindBin               qw($RealDir);
 use Getopt::Long          qw(GetOptions);
 use POSIX                 qw(getgid getuid);
 
+use lib $RealDir;
 use make::common;
 use make::configure;
 use make::console;
+use make::directive;
 
 my ($opt_binary_dir,
     $opt_config_dir,
     $opt_data_dir,
+    $opt_development,
     $opt_disable_interactive,
     $opt_distribution_label,
     $opt_gid,
@@ -53,6 +59,7 @@ my ($opt_binary_dir,
     $opt_manual_dir,
     $opt_module_dir,
     $opt_prefix,
+    $opt_script_dir,
     $opt_socketengine,
     $opt_system,
     $opt_uid);
@@ -71,6 +78,7 @@ GetOptions(
        'help'   => \&cmd_help,
        'update' => \&cmd_update,
 
+       'development'          => \$opt_development,
        'disable-interactive'  => \$opt_disable_interactive,
        'distribution-label=s' => \$opt_distribution_label,
        'binary-dir=s'         => \$opt_binary_dir,
@@ -81,6 +89,7 @@ GetOptions(
        'manual-dir=s'         => \$opt_manual_dir,
        'module-dir=s'         => \$opt_module_dir,
        'prefix=s'             => \$opt_prefix,
+       'script-dir=s'         => \$opt_script_dir,
        'socketengine=s'       => \$opt_socketengine,
        'system'               => \$opt_system,
        'uid=s'                => \$opt_uid,
@@ -107,6 +116,7 @@ our $interactive = !(
        defined $opt_binary_dir ||
        defined $opt_config_dir ||
        defined $opt_data_dir ||
+       defined $opt_development ||
        defined $opt_disable_interactive ||
        defined $opt_distribution_label ||
        defined $opt_gid ||
@@ -114,17 +124,18 @@ our $interactive = !(
        defined $opt_manual_dir ||
        defined $opt_module_dir ||
        defined $opt_prefix ||
+       defined $opt_script_dir ||
        defined $opt_socketengine ||
        defined $opt_system ||
        defined $opt_uid
 );
 
-my %version = get_version();
-print_format "<|BOLD Configuring InspIRCd $version{MAJOR}.$version{MINOR}.$version{PATCH}+$version{LABEL} on $^O.|>\n";
+my %version = get_version $opt_distribution_label;
+print_format "<|BOLD Configuring InspIRCd $version{FULL} on $^O.|>\n";
 
-our %config;
+my %config;
 if ($interactive) {
-       %config = read_configure_cache();
+       %config = read_config_file(CONFIGURE_CACHE_FILE);
        run_test CONFIGURE_CACHE_FILE, %config;
        if (!defined $config{VERSION}) {
                $config{VERSION} = CONFIGURE_CACHE_VERSION;
@@ -134,75 +145,57 @@ if ($interactive) {
        }
 }
 
-$config{CXX} = find_compiler($config{CXX} || $ENV{CXX});
+$config{CXX} = find_compiler($config{CXX} // $ENV{CXX});
 unless ($config{CXX}) {
-       print "A suitable C++ compiler could not be detected on your system!\n";
-       print "Set the CXX environment variable to the compiler binary path if this is incorrect.\n";
-       exit 1; 
+       say 'A suitable C++ compiler could not be detected on your system!';
+       unless ($interactive) {
+               say 'Set the CXX environment variable to the path to a C++ compiler binary if this is incorrect.';
+               exit 1;
+       }
+       until ($config{CXX}) {
+               my $compiler_path = prompt_string 1, 'Please enter the path to a C++ compiler binary:', 'c++';
+               $config{CXX} = find_compiler $compiler_path;
+       }
 }
 my %compiler = get_compiler_info($config{CXX});
 
-$config{HAS_CLOCK_GETTIME} = run_test 'clock_gettime()', test_file($config{CXX}, 'clock_gettime.cpp', '-lrt');
+$config{HAS_CLOCK_GETTIME} = run_test 'clock_gettime()', test_file($config{CXX}, 'clock_gettime.cpp', $^O eq 'darwin' ? undef : '-lrt');
 $config{HAS_EVENTFD} = run_test 'eventfd()', test_file($config{CXX}, 'eventfd.cpp');
 
-if ($config{HAS_EPOLL} = run_test 'epoll', test_header($config{CXX}, 'sys/epoll.h')) {
-       $config{SOCKETENGINE} ||= 'epoll';
-}
-
-if ($config{HAS_KQUEUE} = run_test 'kqueue', test_file($config{CXX}, 'kqueue.cpp')) {
-       $config{SOCKETENGINE} ||= 'kqueue';
-}
-
-if ($config{HAS_PORTS} = run_test 'Solaris IOCP', test_header($config{CXX}, 'port.h')) {
-       $config{SOCKETENGINE} ||= 'ports';
-}
-
-if ($config{HAS_POLL} = run_test 'poll', test_header($config{CXX}, 'poll.h')) {
-       $config{SOCKETENGINE} ||= 'poll';
-}
-
-# Select is available on all platforms
-$config{HAS_SELECT} = 1;
-$config{SOCKETENGINE} ||= 'select';
+my @socketengines;
+push @socketengines, 'epoll'  if run_test 'epoll', test_header $config{CXX}, 'sys/epoll.h';
+push @socketengines, 'kqueue' if run_test 'kqueue', test_file $config{CXX}, 'kqueue.cpp';
+push @socketengines, 'poll'   if run_test 'poll', test_header $config{CXX}, 'poll.h';
+push @socketengines, 'select';
 
 if (defined $opt_socketengine) {
-       my $cfgkey = 'HAS_' . uc $opt_socketengine;
-       if ($config{$cfgkey} && -f "src/socketengines/socketengine_$opt_socketengine.cpp") {
-               $config{SOCKETENGINE} = $opt_socketengine;
-       } else {
-               print "Unable to use a socket engine which is not supported on this platform ($opt_socketengine)!\n";
-               print "Available socket engines are:";
-               foreach (<src/socketengines/socketengine_*.cpp>) {
-                       s/src\/socketengines\/socketengine_(\w+)\.cpp/$1/;
-                       print " $1" if $config{'HAS_' . uc $1};
-               }
-               print "\n";     
-               exit 1;
+       unless (grep { $_ eq $opt_socketengine } @socketengines) {
+               my $reason = -f "src/socketengines/socketengine_$opt_socketengine.cpp" ? 'is not available on this platform' : 'does not exist';
+               print_error "The socket engine you requested ($opt_socketengine) $reason!",
+                       'Available socket engines are:',
+                       map { "  * $_" } @socketengines;
        }
 }
-
-# If the user has specified a distribution label then we use it in
-# place of the label from src/version.sh or Git.
-if (defined $opt_distribution_label) {
-       $version{LABEL} = $opt_distribution_label;
-}
+$config{SOCKETENGINE} = $opt_socketengine // $socketengines[0];
 
 if (defined $opt_system) {
-       $config{BASE_DIR}   = $opt_prefix     || '/var/lib/inspircd';
-       $config{BINARY_DIR} = $opt_binary_dir || '/usr/sbin';
-       $config{CONFIG_DIR} = $opt_config_dir || '/etc/inspircd';
-       $config{DATA_DIR}   = $opt_data_dir   || '/var/inspircd';
-       $config{LOG_DIR}    = $opt_module_dir || '/var/log/inspircd';
-       $config{MANUAL_DIR} = $opt_manual_dir || '/usr/share/man/man1';
-       $config{MODULE_DIR} = $opt_module_dir || '/usr/lib/inspircd';
+       $config{BASE_DIR}   = $opt_prefix     // '/var/lib/inspircd';
+       $config{BINARY_DIR} = $opt_binary_dir // '/usr/sbin';
+       $config{CONFIG_DIR} = $opt_config_dir // '/etc/inspircd';
+       $config{DATA_DIR}   = $opt_data_dir   // '/var/inspircd';
+       $config{LOG_DIR}    = $opt_module_dir // '/var/log/inspircd';
+       $config{MANUAL_DIR} = $opt_manual_dir // '/usr/share/man/man1';
+       $config{MODULE_DIR} = $opt_module_dir // '/usr/lib/inspircd';
+       $config{SCRIPT_DIR} = $opt_script_dir // '/usr/share/inspircd'
 } else {
-       $config{BASE_DIR}   = $opt_prefix     || $config{BASE_DIR}   || rel2abs 'run';
-       $config{BINARY_DIR} = $opt_binary_dir || $config{BINARY_DIR} || rel2abs $config{BASE_DIR} . '/bin';
-       $config{CONFIG_DIR} = $opt_config_dir || $config{CONFIG_DIR} || rel2abs $config{BASE_DIR} . '/conf';
-       $config{DATA_DIR}   = $opt_data_dir   || $config{DATA_DIR}   || rel2abs $config{BASE_DIR} . '/data';
-       $config{LOG_DIR}    = $opt_log_dir    || $config{LOG_DIR}    || rel2abs $config{BASE_DIR} . '/logs';
-       $config{MANUAL_DIR} = $opt_manual_dir || $config{MANUAL_DIR} || rel2abs $config{BASE_DIR} . '/manuals';
-       $config{MODULE_DIR} = $opt_module_dir || $config{MODULE_DIR} || rel2abs $config{BASE_DIR} . '/modules';
+       $config{BASE_DIR}   = $opt_prefix     // $config{BASE_DIR}   // rel2abs 'run';
+       $config{BINARY_DIR} = $opt_binary_dir // $config{BINARY_DIR} // rel2abs $config{BASE_DIR} . '/bin';
+       $config{CONFIG_DIR} = $opt_config_dir // $config{CONFIG_DIR} // rel2abs $config{BASE_DIR} . '/conf';
+       $config{DATA_DIR}   = $opt_data_dir   // $config{DATA_DIR}   // rel2abs $config{BASE_DIR} . '/data';
+       $config{LOG_DIR}    = $opt_log_dir    // $config{LOG_DIR}    // rel2abs $config{BASE_DIR} . '/logs';
+       $config{MANUAL_DIR} = $opt_manual_dir // $config{MANUAL_DIR} // rel2abs $config{BASE_DIR} . '/manuals';
+       $config{MODULE_DIR} = $opt_module_dir // $config{MODULE_DIR} // rel2abs $config{BASE_DIR} . '/modules';
+       $config{SCRIPT_DIR} = $opt_script_dir // $config{SCRIPT_DIR} // $config{BASE_DIR};
 }
 
 # Parse --gid=123 or --gid=foo and extract the group id.
@@ -211,7 +204,7 @@ if (defined $opt_gid) {
        @group = $opt_gid =~ /^\d+$/ ? getgrgid($opt_gid) : getgrnam($opt_gid);
        print_error "there is no '$opt_gid' group on this system!" unless @group;
 } else {
-       @group = $opt_system ? getgrnam('irc') : getgrgid($config{GID} || getgid());
+       @group = $opt_system ? getgrnam('irc') : getgrgid($config{GID} // getgid());
        print_error "you need to specify a group to run as using '--gid [id|name]'!" unless @group;
 }
 $config{GROUP} = $group[0];
@@ -223,7 +216,7 @@ if (defined $opt_uid) {
        @user = $opt_uid =~ /^\d+$/ ? getpwuid($opt_uid) : getpwnam($opt_uid);
        print_error "there is no '$opt_uid' user on this system!" unless @user;
 } else {
-       @user = $opt_system ? getpwnam('irc') : getpwuid($config{UID} || getuid());
+       @user = $opt_system ? getpwnam('irc') : getpwuid($config{UID} // getuid());
        print_error "you need to specify a user to run as using '--uid [id|name]'!" unless @user;
 }
 $config{USER} = $user[0];
@@ -232,8 +225,17 @@ $config{UID}  = $user[2];
 # Clear the screen.
 system 'tput', 'clear' if $interactive;
 
+# Warn the user about clock drifting when running on OpenVZ.
+if (-e '/proc/user_beancounters' || -e '/proc/vz/vzaquota') {
+       print_warning <<'EOW';
+You are building InspIRCd inside of an an OpenVZ container. If you
+plan to use InspIRCd in this container then you should make sure that NTP is
+configured on the Hardware Node. Failure to do so may result in clock drifting!
+EOW
+}
+
 # Check that the user actually wants this version.
-if ($version{LABEL} ne 'release' && $interactive) {
+if ($version{LABEL} ne 'release') {
        print_warning <<'EOW';
 You are building a development version. This contains code which has
 not been tested as heavily and may contain various faults which could seriously
@@ -242,9 +244,11 @@ version instead.
 
 You can obtain the latest stable version from http://www.inspircd.org/ or by
 running `git checkout insp20` if you are installing from Git.
-
 EOW
-exit 1 unless prompt_bool $interactive, 'I understand this warning and want to continue anyway.', !$interactive;
+       if (!prompt_bool $interactive, 'I understand this warning and want to continue anyway.', $opt_development // 0) {
+               say STDERR 'If you understand this warning and still want to continue pass the --development flag.' unless $interactive;
+               exit 1;
+       }
 }
 
 # Configure directory settings.
@@ -258,21 +262,23 @@ Currently, InspIRCd is configured with the following paths:
 <|BOLD Log:|>    $config{LOG_DIR}
 <|BOLD Manual:|> $config{MANUAL_DIR}
 <|BOLD Module:|> $config{MODULE_DIR}
+<|BOLD Script:|> $config{SCRIPT_DIR}
 
 Do you want to change these settings?
 EOQ
 if (prompt_bool $interactive, $question, 0) {
        my $original_base_dir = $config{BASE_DIR};
        $config{BASE_DIR} = prompt_dir $interactive, 'In what directory do you wish to install the InspIRCd base?', $config{BASE_DIR};
-       foreach my $key (qw(BINARY_DIR CONFIG_DIR DATA_DIR LOG_DIR MANUAL_DIR MODULE_DIR)) {
+       foreach my $key (qw(BINARY_DIR CONFIG_DIR DATA_DIR LOG_DIR MANUAL_DIR MODULE_DIR SCRIPT_DIR)) {
                $config{$key} =~ s/^\Q$original_base_dir\E/$config{BASE_DIR}/;
        }
-       $config{BINARY_DIR} = prompt_dir $interactive, 'In what directory should the InspIRCd binary be placed?',     $config{BINARY_DIR};
+       $config{BINARY_DIR} = prompt_dir $interactive, 'In what directory should the InspIRCd binary be placed?', $config{BINARY_DIR};
        $config{CONFIG_DIR} = prompt_dir $interactive, 'In what directory are configuration files to be stored?', $config{CONFIG_DIR};
-       $config{DATA_DIR}   = prompt_dir $interactive, 'In what directory are variable data files to be stored?',     $config{DATA_DIR};
-       $config{LOG_DIR}    = prompt_dir $interactive, 'In what directory are log files to be stored?',               $config{LOG_DIR};
+       $config{DATA_DIR}   = prompt_dir $interactive, 'In what directory are variable data files to be stored?', $config{DATA_DIR};
+       $config{LOG_DIR}    = prompt_dir $interactive, 'In what directory are log files to be stored?',           $config{LOG_DIR};
        $config{MANUAL_DIR} = prompt_dir $interactive, 'In what directory are manual pages to be placed?',        $config{MANUAL_DIR};
        $config{MODULE_DIR} = prompt_dir $interactive, 'In what directory are modules to be placed?',             $config{MODULE_DIR};
+       $config{SCRIPT_DIR} = prompt_dir $interactive, 'In what directory are scripts to be placed?',             $config{SCRIPT_DIR};
 }
 
 # Configure module settings.
@@ -291,8 +297,9 @@ if (prompt_bool $interactive, $question, 0) {
 } else {
        # TODO: finish modulemanager rewrite and replace this code with:
        # system './modulemanager', 'enable', '--auto';
-       enable_extras 'm_ssl_gnutls.cpp' unless system 'gnutls-cli --version >/dev/null 2>&1';
-       enable_extras 'm_ssl_openssl.cpp' unless system 'openssl --version >/dev/null 2>&1';
+       enable_extras 'm_ssl_gnutls.cpp' unless system 'pkg-config --exists gnutls >/dev/null 2>&1';
+       enable_extras 'm_ssl_mbedtls.cpp' if -e '/usr/include/mbedtls/ssl.h';
+       enable_extras 'm_ssl_openssl.cpp' unless system 'pkg-config --exists openssl >/dev/null 2>&1';
 }
 
 # Generate SSL certificates.
@@ -300,6 +307,9 @@ if (<src/modules/m_ssl_*.cpp> && prompt_bool $interactive, 'Would you like to ge
        system './tools/genssl', 'auto';
 }
 
+# Cache the distribution label so that its not lost when --update is run.
+$config{DISTRIBUTION} = $opt_distribution_label if $opt_distribution_label;
+
 write_configure_cache %config;
 parse_templates \%config, \%compiler, \%version;
 
@@ -317,7 +327,7 @@ EOM
 
 for my $file (<src/modules/m_*>) {
        my $module = basename $file, '.cpp';
-       print "  * $module\n" if -l $file;
+       say "  * $module" if -l $file;
 }
 
 print_format <<"EOM";
@@ -330,6 +340,7 @@ print_format <<"EOM";
   <|GREEN Log:|>    $config{LOG_DIR}
   <|GREEN Manual:|> $config{MANUAL_DIR}
   <|GREEN Module:|> $config{MODULE_DIR}
+  <|GREEN Script:|> $config{SCRIPT_DIR}
 
 <|GREEN Execution Group:|> $config{GROUP} ($config{GID})
 <|GREEN Execution User:|>  $config{USER} ($config{UID})
@@ -402,7 +413,7 @@ EXTRA:      for my $extra (@extras) {
        for my $extra (keys(%extras)) {
                next unless $extras{$extra} =~ m/enabled/; # only process enabled extras.
                my $abs_extra = File::Spec->catfile($abs_srcdir, "extra", $extra);
-               my @deps = split /\s+/, get_property($abs_extra, 'ModDep');
+               my @deps = split /\s+/, get_directive($abs_extra, 'ModDep', '');
                for my $dep (@deps) {
                        if (exists($extras{$dep})) {
                                my $ref = \$extras{$dep}; # Take reference.
@@ -449,7 +460,7 @@ sub enable_extras (@) {
                        next;
                }
                # Get dependencies, and add them to be processed.
-               my @deps = split /\s+/, get_property($extrapath, 'ModDep');
+               my @deps = split /\s+/, get_directive($extrapath, 'ModDep', '');
                for my $dep (@deps) {
                        next if scalar(grep { $_ eq $dep } (@extras)) > 0; # Skip if we're going to be enabling it anyway.
                        if (!-e "src/modules/$dep" && !-e "include/$dep") {
@@ -485,7 +496,7 @@ EXTRA:      for my $extra (@extras) {
                }
                # Check if anything needs this.
                for my $file (@files) {
-                       my @deps = split /\s+/, get_property("src/modules/extra/$file", 'ModDep');
+                       my @deps = split /\s+/, get_directive("src/modules/extra/$file", 'ModDep', '');
                        # File depends on this extra...
                        if (scalar(grep { $_ eq $extra } @deps) > 0) {
                                # And is both enabled and not about to be disabled.