]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - configure
Convert the build system to Perl 5.10.
[user/henk/code/inspircd.git] / configure
index 55880fab68d8b884dc847ec2b135623f1d4d50d4..ab2d50a8676820f316e4f499c6beb8c3fa852147 100755 (executable)
--- a/configure
+++ b/configure
 
 
 BEGIN {
-       require 5.8.0;
+       require 5.10.0;
 }
 
+use feature ':5.10';
 use strict;
 use warnings FATAL => qw(all);
 
@@ -39,14 +40,16 @@ use File::Spec::Functions qw(rel2abs);
 use Getopt::Long          qw(GetOptions);
 use POSIX                 qw(getgid getuid);
 
+use make::common;
 use make::configure;
 use make::console;
-use make::utilities;
 
 my ($opt_binary_dir,
     $opt_config_dir,
     $opt_data_dir,
+    $opt_development,
     $opt_disable_interactive,
+    $opt_distribution_label,
     $opt_gid,
     $opt_log_dir,
     $opt_manual_dir,
@@ -70,18 +73,20 @@ GetOptions(
        'help'   => \&cmd_help,
        'update' => \&cmd_update,
 
-       'disable-interactive' => \$opt_disable_interactive,
-       'binary-dir=s'        => \$opt_binary_dir,
-       'config-dir=s'        => \$opt_config_dir,
-       'data-dir=s'          => \$opt_data_dir,
-       'gid=s'               => \$opt_gid,
-       'log-dir=s'           => \$opt_log_dir,
-       'manual-dir=s'        => \$opt_manual_dir,
-       'module-dir=s'        => \$opt_module_dir,
-       'prefix=s'            => \$opt_prefix,
-       'socketengine=s'      => \$opt_socketengine,
-       'system'              => \$opt_system,
-       'uid=s'               => \$opt_uid,
+       'development'          => \$opt_development,
+       'disable-interactive'  => \$opt_disable_interactive,
+       'distribution-label=s' => \$opt_distribution_label,
+       'binary-dir=s'         => \$opt_binary_dir,
+       'config-dir=s'         => \$opt_config_dir,
+       'data-dir=s'           => \$opt_data_dir,
+       'gid=s'                => \$opt_gid,
+       'log-dir=s'            => \$opt_log_dir,
+       'manual-dir=s'         => \$opt_manual_dir,
+       'module-dir=s'         => \$opt_module_dir,
+       'prefix=s'             => \$opt_prefix,
+       'socketengine=s'       => \$opt_socketengine,
+       'system'               => \$opt_system,
+       'uid=s'                => \$opt_uid,
 
        # TODO: when the modulemanager rewrite is done these should be removed.
        'disable-extras=s@' => \@opt_disableextras,
@@ -105,7 +110,9 @@ 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 ||
        defined $opt_log_dir ||
        defined $opt_manual_dir ||
@@ -119,47 +126,48 @@ our $interactive = !(
 my %version = get_version();
 print_format "<|BOLD Configuring InspIRCd $version{MAJOR}.$version{MINOR}.$version{PATCH}+$version{LABEL} on $^O.|>\n";
 
-our %config = read_configure_cache();
-
-print "Checking for cache from previous configure... ";
-print %config ? "found\n" : "not found\n";
+our %config;
+if ($interactive) {
+       %config = read_configure_cache();
+       run_test CONFIGURE_CACHE_FILE, %config;
+       if (!defined $config{VERSION}) {
+               $config{VERSION} = CONFIGURE_CACHE_VERSION;
+       } elsif ($config{VERSION} != CONFIGURE_CACHE_VERSION) {
+               print_warning "ignoring contents of ${\CONFIGURE_CACHE_FILE} as it was generated by an incompatible version of $0!";
+               %config = ('VERSION', CONFIGURE_CACHE_VERSION);
+       }
+}
 
-$config{CXX} = defined $ENV{CXX} && !system("$ENV{CXX} -v > /dev/null 2>&1") ? $ENV{CXX} : find_compiler();
-if ($config{CXX} eq "") {
-       print "A C++ compiler could not be detected on your system!\n";
-       print "Set the CXX environment variable to the full path if this is incorrect.\n";
+$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; 
 }
-
 my %compiler = get_compiler_info($config{CXX});
-if ($compiler{UNSUPPORTED}) {
-       print "Your C++ compiler is too old to build InspIRCd!\n";
-       print "Reason: $compiler{REASON}\n";
-       exit 1;
-}
 
 $config{HAS_CLOCK_GETTIME} = run_test 'clock_gettime()', test_file($config{CXX}, 'clock_gettime.cpp', '-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';
+       $config{SOCKETENGINE} //= 'epoll';
 }
 
 if ($config{HAS_KQUEUE} = run_test 'kqueue', test_file($config{CXX}, 'kqueue.cpp')) {
-       $config{SOCKETENGINE} ||= 'kqueue';
+       $config{SOCKETENGINE} //= 'kqueue';
 }
 
 if ($config{HAS_PORTS} = run_test 'Solaris IOCP', test_header($config{CXX}, 'port.h')) {
-       $config{SOCKETENGINE} ||= 'ports';
+       $config{SOCKETENGINE} //= 'ports';
 }
 
 if ($config{HAS_POLL} = run_test 'poll', test_header($config{CXX}, 'poll.h')) {
-       $config{SOCKETENGINE} ||= 'poll';
+       $config{SOCKETENGINE} //= 'poll';
 }
 
 # Select is available on all platforms
 $config{HAS_SELECT} = 1;
-$config{SOCKETENGINE} ||= 'select';
+$config{SOCKETENGINE} //= 'select';
 
 if (defined $opt_socketengine) {
        my $cfgkey = 'HAS_' . uc $opt_socketengine;
@@ -177,22 +185,28 @@ if (defined $opt_socketengine) {
        }
 }
 
+# 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;
+}
+
 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';
 } 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';
 }
 
 # Parse --gid=123 or --gid=foo and extract the group id.
@@ -201,7 +215,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];
@@ -213,7 +227,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];
@@ -223,7 +237,7 @@ $config{UID}  = $user[2];
 system 'tput', 'clear' if $interactive;
 
 # 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
@@ -232,9 +246,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.
@@ -257,10 +273,10 @@ if (prompt_bool $interactive, $question, 0) {
        foreach my $key (qw(BINARY_DIR CONFIG_DIR DATA_DIR LOG_DIR MANUAL_DIR MODULE_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};
 }
@@ -291,7 +307,7 @@ if (<src/modules/m_ssl_*.cpp> && prompt_bool $interactive, 'Would you like to ge
 }
 
 write_configure_cache %config;
-parse_templates \%config, \%compiler;
+parse_templates \%config, \%compiler, \%version;
 
 print_format <<"EOM";
 
@@ -302,10 +318,15 @@ Configuration is complete! You have chosen to build with the following settings:
   <|GREEN Name:|>    $compiler{NAME}
   <|GREEN Version:|> $compiler{VERSION}
 
-<|GREEN Extra Modules:|> <<TODO>>
-  * m_foo
-  * m_bar
-  * m_baz
+<|GREEN Extra Modules:|>
+EOM
+
+for my $file (<src/modules/m_*>) {
+       my $module = basename $file, '.cpp';
+       say "  * $module" if -l $file;
+}
+
+print_format <<"EOM";
 
 <|GREEN Paths:|>
   <|GREEN Base:|>   $config{BASE_DIR}