]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - configure
Issue #604, fix m_dnsbl, broken in accccc212cd4f08a3c5532b1ae7a17e76bac8718
[user/henk/code/inspircd.git] / configure
index 09dbafd2d074a593f502cf4957c0ee64e4e8bc64..e5935c2022bf1aca3e8dc09eff139e80f49eaeb6 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,16 +1,30 @@
-#!/usr/bin/perl
-###################################################
-# InspIRCd Configuration Script
+#!/usr/bin/env perl
+
+#
+# InspIRCd -- Internet Relay Chat Daemon
 #
-# Copyright 2002-2009 The InspIRCd Development Team
-#  http://wiki.inspircd.org/Credits
+#   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>
+#   Copyright (C) 2006-2008 Robin Burchell <robin+git@viroteck.net>
+#   Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
+#   Copyright (C) 2007 John Brooks <john.brooks@dereferenced.net>
+#   Copyright (C) 2006 Oliver Lupton <oliverlupton@gmail.com>
+#   Copyright (C) 2003-2006 Craig McLure <craig@chatspike.net>
 #
-# Licensed under GPL, please see the COPYING file
-# for more information
+# 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.
 #
-# $Id$
+# 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/>.
+#
+
 
 BEGIN {
        require 5.8.0;
@@ -19,35 +33,17 @@ BEGIN {
 use strict;
 use warnings FATAL => qw(all);
 
-use Data::Dumper;
-BEGIN {
-       $Data::Dumper::Sortkeys = 1;
-       $Data::Dumper::Useqq = 1;
-};
-
 use File::Copy ();
-use Socket;
+use File::Spec::Functions qw(rel2abs);
 use Cwd;
 use Getopt::Long;
 
-# Utility functions for our buildsystem
-use make::utilities;
 use make::configure;
-use make::gnutlscert;
-use make::opensslcert;
-
-###############################################################################################
-#
-#                                 NON-EDITABLE VARIABLES
-#
-###############################################################################################
-
-our ($opt_use_gnutls, $opt_rebuild, $opt_use_openssl, $opt_nointeractive, $opt_ports,
-    $opt_epoll, $opt_kqueue, $opt_noports, $opt_noepoll, $opt_nokqueue,
-    $opt_ipv6, $opt_ipv6links, $opt_noipv6links, $opt_maxbuf, $opt_disable_debug, $opt_freebsd_port);
+use make::utilities;
 
-our ($opt_cc, $opt_base_dir, $opt_config_dir, $opt_module_dir, $opt_binary_dir,
-    $opt_library_dir);
+our ($opt_use_gnutls, $opt_use_openssl, $opt_nointeractive, $opt_socketengine, $opt_freebsd_port,
+     $opt_system, $opt_uid, $opt_base_dir, $opt_config_dir, $opt_module_dir, $opt_binary_dir,
+     $opt_data_dir, $opt_log_dir);
 
 sub list_extras ();
 
@@ -60,36 +56,24 @@ my @opt_disableextras;
 
 GetOptions (
        'enable-gnutls' => \$opt_use_gnutls,
-       'rebuild' => \$opt_rebuild,
+       'system' => \$opt_system,
+       'uid=s' => \$opt_uid,
        'enable-openssl' => \$opt_use_openssl,
        'disable-interactive' => \$opt_nointeractive,
-       'enable-ports' => \$opt_ports,
-       'enable-epoll' => \$opt_epoll,
-       'enable-kqueue' => \$opt_kqueue,
-       'disable-ports' => \$opt_noports,
-       'disable-epoll' => \$opt_noepoll,
-       'disable-kqueue' => \$opt_nokqueue,
-       'enable-ipv6' => \$opt_ipv6,
-       'enable-remote-ipv6' => \$opt_ipv6links,
-       'disable-remote-ipv6' => \$opt_noipv6links,
-       'with-cc=s' => \$opt_cc,
-       'with-maxbuf=i' => \$opt_maxbuf,
+       'socketengine=s' => \$opt_socketengine,
        'enable-freebsd-ports-openssl' => \$opt_freebsd_port,
        'prefix=s' => \$opt_base_dir,
        'config-dir=s' => \$opt_config_dir,
        'module-dir=s' => \$opt_module_dir,
        'binary-dir=s' => \$opt_binary_dir,
-       'library-dir=s' => \$opt_library_dir,
-       'disable-debuginfo' => sub { $opt_disable_debug = 1 },
+       'data-dir=s' => \$opt_data_dir,
+       'log-dir=s' => \$opt_log_dir,
        'help'  => sub { showhelp(); },
        'update' => sub { update(); },
-       'svnupdate' => sub { svnupdate(); },
        'clean' => sub { clean(); },
        'list-extras' => sub { list_extras; exit 0; }, # This, --enable-extras, and --disable-extras are for non-interactive managing.
        'enable-extras=s@' => \@opt_enableextras, # ^
        'disable-extras=s@' => \@opt_disableextras, # ^
-       'generate-openssl-cert' => sub { make_openssl_cert(); exit(0); },
-       'generate-gnutls-cert' => sub { make_gnutls_cert(); exit(0); }
 );
 
 if (scalar(@opt_enableextras) + scalar(@opt_disableextras) > 0) {
@@ -102,66 +86,70 @@ if (scalar(@opt_enableextras) + scalar(@opt_disableextras) > 0) {
        exit 0;
 }
 
-our $non_interactive = (
-       (defined $opt_library_dir) ||
+our $interactive = !(
        (defined $opt_base_dir) ||
        (defined $opt_config_dir) ||
        (defined $opt_module_dir) ||
        (defined $opt_base_dir) ||
        (defined $opt_binary_dir) ||
+       (defined $opt_data_dir) ||
+       (defined $opt_log_dir) ||
        (defined $opt_nointeractive) ||
-       (defined $opt_cc) ||
-       (defined $opt_ipv6) ||
-       (defined $opt_ipv6links) ||
-       (defined $opt_noipv6links) ||
-       (defined $opt_kqueue) ||
-       (defined $opt_epoll) ||
-       (defined $opt_ports) ||
+       (defined $opt_socketengine) ||
        (defined $opt_use_openssl) ||
-       (defined $opt_nokqueue) ||
-       (defined $opt_noepoll) ||
-       (defined $opt_noports) ||
-       (defined $opt_maxbuf) ||
+       (defined $opt_system) ||
+       (defined $opt_uid) ||
        (defined $opt_use_gnutls) ||
        (defined $opt_freebsd_port)
 );
-our $interactive = !$non_interactive;
 
-chomp(our $topdir = getcwd());
-our $this = resolve_directory($topdir);                                                # PWD, Regardless.
-our @modlist = ();                                                                     # Declare for Module List..
-our %config = ();                                                                      # Initiate Configuration Hash..
-$config{ME}             = resolve_directory($topdir);                          # Present Working Directory
+our $topdir = getcwd();
+our @modlist = ();
+our %config = ();
+our $cache_loaded = getcache();
 
-$config{BASE_DIR}         = $config{ME};
+$config{BASE_DIR} = $topdir."/run";
 
-if (defined $opt_base_dir)
-{
+if (defined $opt_base_dir) {
        $config{BASE_DIR} = $opt_base_dir;
+} elsif (defined $opt_system) {
+       $config{BASE_DIR} = '/var/lib/inspircd';
+}
+
+if (defined $opt_system) {
+       $config{UID} = $opt_uid || 'ircd';
+       $config{CONFIG_DIR} = '/etc/inspircd';
+       $config{MODULE_DIR} = '/usr/lib/inspircd';
+       $config{BINARY_DIR} = '/usr/sbin/';
+       $config{BUILD_DIR} = $topdir."/build";
+       $config{DATA_DIR} = '/var/inspircd';
+       $config{LOG_DIR} = '/var/log/inspircd';
+} else {
+       $config{UID} = $opt_uid || $<;
+       $config{CONFIG_DIR} = rel2abs($config{BASE_DIR}."/conf");
+       $config{MODULE_DIR} = rel2abs($config{BASE_DIR}."/modules");
+       $config{BINARY_DIR} = rel2abs($config{BASE_DIR}."/bin");
+       $config{BUILD_DIR} = rel2abs($topdir."/build");
+       $config{DATA_DIR} = rel2abs($config{BASE_DIR}."/data");
+       $config{LOG_DIR} = rel2abs($config{BASE_DIR}."/logs");  
 }
 
-$config{CONFIG_DIR}     = resolve_directory($config{BASE_DIR}."/conf");        # Configuration Directory
-$config{MODULE_DIR}     = resolve_directory($config{BASE_DIR}."/modules");     # Modules Directory
-$config{BINARY_DIR}     = resolve_directory($config{BASE_DIR}."/bin");         # Binary Directory
-$config{LIBRARY_DIR}   = resolve_directory($config{BASE_DIR}."/lib");          # Library Directory
-
-if (defined $opt_config_dir)
-{
+if (defined $opt_config_dir) {
        $config{CONFIG_DIR} = $opt_config_dir;
 }
-if (defined $opt_module_dir)
-{
+if (defined $opt_module_dir) {
        $config{MODULE_DIR} = $opt_module_dir;
 }
-if (defined $opt_binary_dir)
-{
+if (defined $opt_binary_dir) {
        $config{BINARY_DIR} = $opt_binary_dir;
 }
-if (defined $opt_library_dir)
-{
-       $config{LIBRARY_DIR} = $opt_library_dir;
+if (defined $opt_data_dir) {
+       $config{DATA_DIR} = $opt_data_dir;
 }
-chomp($config{HAS_GNUTLS}   = `pkg-config --modversion gnutls 2>/dev/null | cut -c 1,2,3`); # GNUTLS Version.
+if (defined $opt_log_dir) {
+       $config{LOG_DIR} = $opt_log_dir;
+}
+chomp($config{HAS_GNUTLS}   = `pkg-config --modversion gnutls 2>/dev/null`); # GNUTLS Version.
 
 if (defined $opt_freebsd_port)
 {
@@ -197,98 +185,28 @@ if (defined $opt_use_openssl)
        $config{USE_OPENSSL} = "y";
 }
 
-# no, let's not change these.
-$config{OPTIMITEMP}     = "0";                                         # Default Optimisation Value
-if (!defined $opt_disable_debug)
-{
-       $config{OPTIMISATI}      = "-g1";                               # Optimisation Flag
-}
-else
-{
-       $config{OPTIMISATI}      = "-O2";                               # DEBUGGING OFF!
-}
+$config{STARTSCRIPT} = $^O eq 'darwin' ? 'org.inspircd.plist' : 'inspircd';
 
-$config{HAS_STRLCPY}   = "false";                                      # strlcpy Check.
-$config{HAS_STDINT}     = "false";                                     # stdint.h check
-$config{USE_KQUEUE}     = "y";                                         # kqueue enabled
-if (defined $opt_kqueue)
-{
-       $config{USE_KQUEUE} = "y";
-}
-if (defined $opt_nokqueue)
-{
-       $config{USE_KQUEUE} = "n";
-}
-$config{USE_POLL}     = "y";                                   # poll enabled
-$config{USE_EPOLL}       = "y";                                        # epoll enabled
-if (defined $opt_epoll)
-{
-       $config{USE_EPOLL} = "y";
+$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";
+       exit 1; 
 }
-if (defined $opt_noepoll)
-{
-       $config{USE_EPOLL} = "n";
-}
-$config{USE_PORTS}       = "y";                                        # epoll enabled
-if (defined $opt_ports)
-{
-       $config{USE_PORTS} = "y";
-}
-if (defined $opt_noports)
-{
-       $config{USE_PORTS} = "n";
-}
-$config{IPV6}         = "n";                                           # IPv6 support (experimental)
-if (defined $opt_ipv6)
-{
-       $config{IPV6} = "y";
-}
-$config{SUPPORT_IP6LINKS}   = "y";                                     # IPv4 supporting IPv6 links (experimental)
-if (defined $opt_ipv6links)
-{
-       $config{SUPPORT_IP6LINKS} = "y";
-}
-if (defined $opt_noipv6links)
-{
-       $config{SUPPORT_IP6LINKS} = "n";
-}
-chomp($config{GCCVER}       = `g++ -dumpversion | cut -c 1`);          # Major GCC Version
-chomp($config{GCCMINOR}     = `g++ -dumpversion | cut -c 3`);
-$config{_SOMAXCONN} = SOMAXCONN;                                       # Max connections in accept queue
-$config{OSNAME}            = $^O;                                      # Operating System Name
-$config{IS_DARWIN}       = "NO";                                       # Is OSX?
-$config{STARTSCRIPT}     = "inspircd";                 # start script?
-$config{DESTINATION}     = "BASE";                             # Is target path.
-$config{EXTRA_DIR}       = "";                                         # Is empty.
-if ($config{OSNAME} =~ /darwin/i)
-{
-       $config{IS_DARWIN} = "YES";
-       $config{STARTSCRIPT}      = "org.inspircd.plist";               # start script for OSX.
-       $config{DESTINATION}      = "LAUNCHDPATH";                              # Is OSX target.
-       $config{EXTRA_DIR}          = " launchd_dir";                           # Is OSX specific path.
-}
-$config{CC}                = "g++";                                            # C++ compiler
-if (defined $opt_cc)
-{
-       $config{CC} = $opt_cc;
+
+our %cxx = get_compiler_info($config{CXX});
+if ($cxx{UNSUPPORTED}) {
+       print "Your C++ compiler is too old to build InspIRCd!\n";
+       print "Reason: $cxx{REASON}\n";
+       exit 1;
 }
-our $exec = $config{CC} . " -dumpversion | cut -c 1";
-chomp($config{GCCVER}          = `$exec`);                             # Major GCC Version
-$exec = $config{CC} . " -dumpversion | cut -c 3";
-chomp($config{GCCMINOR}                = `$exec`);
-$config{MAXBUF}                        = "512";                                # Max buffer size
 
-if ($config{HAS_OPENSSL} =~ /^([-[:digit:].]+)([a-z])?(\-[a-z][0-9])?$/) {
+if ($config{HAS_OPENSSL} =~ /^([-[:digit:].]+)(?:[a-z])?(?:\-[a-z][0-9])?/) {
        $config{HAS_OPENSSL} = $1;
 } else {
        $config{HAS_OPENSSL} = "";
 }
 
-if (($config{GCCVER} eq "") || ($config{GCCMINOR} eq "")) {
-       print $config{CC} . " was not found! You require g++ (the GNU C++ compiler, part of GCC) to build InspIRCd!\n";
-       exit;
-}
-
 # Get and Set some important vars..
 getmodules();
 
@@ -297,33 +215,21 @@ sub clean
        unlink(".config.cache");
 }
 
-our ($has_epoll, $has_ports, $has_kqueue) = (0, 0, 0);
-
 sub update
 {
        eval {
-               chomp($topdir = getcwd());
-               $this = resolve_directory($topdir);                                          # PWD, Regardless.
-               getmodules();
                # Does the cache file exist?
                if (!getcache()) {
                        # No, No it doesn't.. *BASH*
                        print "You have not run ./configure before. Please do this before trying to run the update script.\n";
-                       exit 0;
+                       exit 1;
                } else {
                        # We've Loaded the cache file and all our variables..
+                       $topdir = getcwd();
+                       getmodules();
                        print "Updating files...\n";
-                       getosflags();
-                       if (defined($opt_disable_debug) && $opt_disable_debug == 1)
-                       {
-                               print "Disabling debug information (-g).\n";
-                               $config{OPTIMISATI} = "";
-                               getosflags();
-                       }
-                       $has_epoll = $config{HAS_EPOLL};
-                       $has_ports = $config{HAS_PORTS};
-                       $has_kqueue = $config{HAS_KQUEUE};
-                       writefiles(1);
+                       %cxx = get_compiler_info($config{CXX});
+                       writefiles();
                        makecache();
                        print "Complete.\n";
                        exit;
@@ -336,175 +242,50 @@ sub update
        exit;
 }
 
-sub svnupdate
-{
-       my $fail = 0;
-       open(FH,"<.svn/entries") or $fail = 1;
-       if ($fail) {
-               print "This is not an SVN copy of InspIRCd.\n";
-               exit 1;
-       }
-       else
-       {
-               close(FH);
-       }
-       open my $fd, "-|", "svn update";
-       my $configurechanged = 0; # Needs ./configure -update
-       my $rootincchanged = 0;
-       my @conflicted = ();
-       while (defined(my $line = <$fd>))
-       {
-               my ($action, $file);
-               print $line;
-               $line =~ m/^([ADUCG])\s+(.*)$/ or next;
-               ($action, $file) = ($1, $2);
-               if ($action eq "C")
-               {
-                       push @conflicted, $file;
-                       if ($file eq "configure")
-                       {
-                               $configurechanged = 1;
-                       }
-                       elsif ($file =~ m/^\..*\.inc$/)
-                       {
-                               $rootincchanged = 1;
-                       }
-               }
-               elsif ($action eq "U" || $action eq "G")
-               {
-                       if ($file eq "configure")
-                       {
-                               $configurechanged = 1;
-                       }
-                       elsif ($file =~ m/^\..*\.inc$/)
-                       {
-                               $rootincchanged = 1;
-                       }
-               }
-       }
-       unless (close $fd) # close() waits for exit and returns false if the command failed
-       {
-               if ($! == 0)
-               {
-                       print STDERR "Problem updating from SVN, please check above for errors\n";
-               }
-               else
-               {
-                       print STDERR "Failed to run SVN: $!\n";
-               }
-               exit 1;
-       }
-       if (scalar(@conflicted) > 0)
-       {
-               print STDERR "\e[0;33;1mERROR:\e[0m You have local modifications which conflicted with the updates from SVN\n";
-               print STDERR "Configure is not able to complete the update. Please resolve these conflicts, then run ./configure -update\n";
-               print "Conflicted files: " . join ", ", @conflicted . "\n";
-               exit 1;
-       }
-       if ($configurechanged)
-       {
-               system("perl configure -update");
-       }
-       else
-       {
-               print "No need to update Makefiles.\n";
-       }
-       if (defined $opt_rebuild) {
-               system("make install");
-       }
-       exit;
+print "Running non-interactive configure...\n" unless $interactive;
+print "Checking for cache from previous configure... ";
+print ($cache_loaded ? "found\n" : "not found\n");
+
+$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';
 }
 
-sub test_compile {
-       my $feature = shift;
-       my $fail = 0;
-       $fail ||= system "$config{CC} -o test_$feature make/check_$feature.cpp >/dev/null 2>&1";
-       $fail ||= system "./test_$feature";
-       unlink "test_$feature";
-       return !$fail;
+if ($config{HAS_KQUEUE} = run_test 'kqueue', test_file($config{CXX}, 'kqueue.cpp')) {
+       $config{SOCKETENGINE} ||= 'kqueue';
 }
 
-print "Running non-interactive configure...\n" unless $interactive;
-print "Checking for cache from previous configure... ";
-print ((!getcache()) ? "not found\n" : "found\n");
-print "Checking operating system version... ";
-print getosflags() . "\n";
-
-printf "Checking if stdint.h exists... ";
-$config{HAS_STDINT} = "true";
-our $fail = 0;
-open(STDINT, "</usr/include/stdint.h") or $config{HAS_STDINT} = "false";
-if ($config{HAS_STDINT} eq "true") {
-       close(STDINT);
+if ($config{HAS_PORTS} = run_test 'Solaris IOCP', test_header($config{CXX}, 'port.h')) {
+       $config{SOCKETENGINE} ||= 'ports';
 }
-print "yes\n" if $config{HAS_STDINT} eq "true";
-print "no\n" if $config{HAS_STDINT} eq "false";
-
-printf "Checking if strlcpy exists... ";
-# Perform the strlcpy() test..
-$config{HAS_STRLCPY} = "false";
-$fail = 0;
-open(STRLCPY, "</usr/include/string.h") or $fail = 1;
-if (!$fail) {
-       while (defined(my $line = <STRLCPY>)) {
-               chomp($line);
-               # try and find the delcaration of:
-               # size_t strlcpy(...)
-               if ($line =~ /size_t(\0x9|\s)+strlcpy/) {
-                       $config{HAS_STRLCPY} = "true";
-               }
-       }
-       close(STRLCPY);
+
+if ($config{HAS_POLL} = run_test 'poll', test_header($config{CXX}, 'poll.h')) {
+       $config{SOCKETENGINE} ||= 'poll';
 }
-print "yes\n" if $config{HAS_STRLCPY} eq "true";
-print "no\n" if $config{HAS_STRLCPY} eq "false";
-
-printf "Checking if kqueue exists... ";
-$has_kqueue = 0;
-$fail = 0;
-open(KQUEUE, "</usr/include/sys/event.h") or $fail = 1;
-if (!$fail) {
-       while (defined(my $line = <KQUEUE>)) {
-               chomp($line);
-               # try and find the delcaration of:
-               # int kqueue(void);
-               if ($line =~ /int(\0x9|\s)+kqueue/) {
-                       $has_kqueue = 1;
+
+# Select is available on all platforms
+$config{HAS_SELECT} = 1;
+$config{SOCKETENGINE} ||= "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};
                }
-       }
-       close(KQUEUE);
-}
-print "yes\n" if $has_kqueue == 1;
-print "no\n" if $has_kqueue == 0;
-
-printf "Checking for epoll support... ";
-$has_epoll = test_compile('epoll');
-print $has_epoll ? "yes\n" : "no\n";
-
-printf "Checking for eventfd support... ";
-$config{HAS_EVENTFD} = test_compile('eventfd') ? 'true' : 'false';
-print $config{HAS_EVENTFD} eq 'true' ? "yes\n" : "no\n";
-
-printf "Checking if Solaris I/O completion ports are available... ";
-$has_ports = 0;
-our $system = `uname -s`;
-chomp ($system);
-$has_ports = 1 if ($system eq "SunOS");
-
-if ($has_ports) {
-       my $kernel = `uname -r`;
-       chomp($kernel);
-       if (($kernel !~ /^5\.1./)) {
-               $has_ports = 0;
+               print "\n";     
+               exit 1;
        }
 }
-print "yes\n" if $has_ports == 1;
-print "no\n" if $has_ports == 0;
-
-$config{HAS_EPOLL} = $has_epoll;
-$config{HAS_KQUEUE} = $has_kqueue;
 
-printf "Checking for libgnutls... ";
+print "Checking for libgnutls... ";
 if (defined($config{HAS_GNUTLS}) && (($config{HAS_GNUTLS}) || ($config{HAS_GNUTLS} eq "y"))) {
        if (defined($gnutls_ver) && ($gnutls_ver ne "")) {
                print "yes\n";
@@ -518,7 +299,7 @@ if (defined($config{HAS_GNUTLS}) && (($config{HAS_GNUTLS}) || ($config{HAS_GNUTL
        $config{HAS_GNUTLS} = "n";
 }
 
-printf "Checking for openssl... ";
+print "Checking for openssl... ";
 if (defined($config{HAS_OPENSSL}) && (($config{HAS_OPENSSL}) || ($config{HAS_OPENSSL} eq "y"))) {
        if (defined($openssl_ver) && ($openssl_ver ne "")) {
                print "yes\n";
@@ -532,50 +313,14 @@ if (defined($config{HAS_OPENSSL}) && (($config{HAS_OPENSSL}) || ($config{HAS_OPE
        $config{HAS_OPENSSL} = "n";
 }
 
-printf "Checking if you are running an ancient, unsupported OS... ";
-if ($config{OSNAME} =~ /FreeBSD/i)
-{
-       my $version = `uname -r`;
-       if ($version =~ /^4\./)
-       {
-               my $foundit = `ls -l /usr/local/lib/libgnugetopt* | wc -l`;
-               if ($foundit > 0)
-               {
-                       # ICKY ICKY ICK, FREEBSD 4.x! GET AN UPGRADE!
-                       $config{CRAQ} = "-L/usr/local/lib -lgnugetopt -DHAVE_DECL_GETOPT=1";
-                       print "yes (upgrade ffs, freebsd 4 is *way* out of date)\n";
-               }
-               else
-               {
-                       print "\n\nERROR: You require libgnugetopt (from ports or packages) to build InspIRCd on FreeBSD 4.11.\n";
-               }
-       }
-       else
-       {
-               $config{CRAQ} = " ";
-               print "no ($version)\n";
-       }
-}
-else
-{
-       $config{CRAQ} = " ";
-       print "no ($config{OSNAME})\n";
-}
-
-print "Checking for upgrades to extra and third party modules... ";
-system "./modulemanager upgrade";
-
-################################################################################
-#                        BEGIN INTERACTIVE PART                              #
-################################################################################
-
-# Clear the Screen..
 if ($interactive)
 {
-       print "\e[2J\e[0G\e[0d"; # J = Erase in Display, 2 = Entire Screen, (G, d) = Move cursor to (..,..)
-       my $wholeos = $^O;
+       # Clear the screen.
+       system 'tput', 'clear';
+
+       my $revision = getrevision();
+       chomp(my $version = `sh src/version.sh`);
 
-       my $rev = getrevision();
        # Display Introduction Message..
        print <<"STOP" ;
 Welcome to the \e[1mInspIRCd\e[0m Configuration program! (\e[1minteractive mode\e[0m)
@@ -589,101 +334,72 @@ Press \e[1m<RETURN>\e[0m to accept the default for any option, or enter
 a new value. Please note: You will \e[1mHAVE\e[0m to read the docs
 dir, otherwise you won't have a config file!
 
-Your operating system is: \e[1;32m$config{OSNAME}\e[0m ($wholeos)
-Your InspIRCd revision ID is \e[1;32mr$rev\e[0m
+Your operating system is: \e[1;32m$^O\e[0m 
 STOP
-       if ($rev eq "r0") {
-               print " (Non-SVN build)";
-       }
-       print ".\n\n";
-
-       $config{CHANGE_COMPILER} = "n";
-       print "I have detected the following compiler: \e[1;32m$config{CC}\e[0m (version \e[1;32m$config{GCCVER}.$config{GCCMINOR}\e[0m)\n";
-
-       while (($config{GCCVER} < 3) || ($config{GCCVER} eq "")) {
-               print "\e[1;32mIMPORTANT!\e[0m A GCC 2.x compiler has been detected, and
-should NOT be used. You should probably specify a newer compiler.\n\n";
-               yesno('CHANGE_COMPILER',"Do you want to change the compiler?");
-               if ($config{CHANGE_COMPILER} =~ /y/i) {
-                       print "What command do you want to use to invoke your compiler?\n";
-                       print "[\e[1;32m$config{CC}\e[0m] -> ";
-                       chomp($config{CC} = <STDIN>);
-                       if ($config{CC} eq "") {
-                               $config{CC} = "g++";
-                       }
-                       chomp(my $foo = `$config{CC} -dumpversion | cut -c 1`);
-                       if ($foo ne "") {
-                               chomp($config{GCCVER}       = `$config{CC} -dumpversion | cut -c 1`); # we must redo these if we change compilers
-                               chomp($config{GCCMINOR}     = `$config{CC} -dumpversion | cut -c 3`);
-                               print "Queried compiler: \e[1;32m$config{CC}\e[0m (version \e[1;32m$config{GCCVER}.$config{GCCMINOR}\e[0m)\n";
-                               if ($config{GCCVER} < 3) {
-                                       print "\e[1;32mGCC 2.x WILL NOT WORK!\e[0m. Let's try that again, shall we?\n";
-                               }
-                       }
-                       else {
-                               print "\e[1;32mWARNING!\e[0m Could not execute the compiler you specified. You may want to try again.\n";
-                       }
-               }
-       }
-
-       print "\n";
+       print "Your InspIRCd version is: \e[1;32m";
+       print $revision eq 'release' ? substr($version, 9) : substr($revision, 1);
+       print "\e[0m\n\n";
+       print "The following compiler has been detected: \e[1;32m$cxx{NAME} $cxx{VERSION}\e[0m ($config{CXX})\n\n";
 
        # Directory Settings..
        my $tmpbase = $config{BASE_DIR};
        dir_check("do you wish to install the InspIRCd base", "BASE_DIR");
        if ($tmpbase ne $config{BASE_DIR}) {
-               $config{CONFIG_DIR}      = resolve_directory($config{BASE_DIR}."/conf");           # Configuration Dir
-               $config{MODULE_DIR}      = resolve_directory($config{BASE_DIR}."/modules");     # Modules Directory
-               $config{BINARY_DIR}      = resolve_directory($config{BASE_DIR}."/bin");     # Binary Directory
-               $config{LIBRARY_DIR}    = resolve_directory($config{BASE_DIR}."/lib");      # Library Directory
+               $config{CONFIG_DIR} = rel2abs($config{BASE_DIR}."/conf");
+               $config{MODULE_DIR} = rel2abs($config{BASE_DIR}."/modules");
+               $config{DATA_DIR} = rel2abs($config{BASE_DIR}."/data");
+               $config{LOG_DIR} = rel2abs($config{BASE_DIR}."/logs");
+               $config{BINARY_DIR} = rel2abs($config{BASE_DIR}."/bin");
        }
 
        dir_check("are the configuration files", "CONFIG_DIR");
        dir_check("are the modules to be compiled to", "MODULE_DIR");
        dir_check("is the IRCd binary to be placed", "BINARY_DIR");
-       dir_check("are the IRCd libraries to be placed", "LIBRARY_DIR");
-
+       dir_check("are variable data files to be located in", "DATA_DIR");
+       dir_check("are the logs to be stored in", "LOG_DIR");
+       dir_check("do you want the build to take place", "BUILD_DIR");
+               
        my $chose_hiperf = 0;
-       if ($has_kqueue) {
+       if ($config{HAS_KQUEUE}) {
+               $config{USE_KQUEUE} = "y";
                yesno('USE_KQUEUE',"You are running a BSD operating system, and kqueue\nwas detected. Would you like to enable kqueue support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable kqueue?");
                print "\n";
                if ($config{USE_KQUEUE} eq "y") {
+                       $config{SOCKETENGINE} = "kqueue";
                        $chose_hiperf = 1;
                }
        }
-       if ($has_epoll) {
+       if ($config{HAS_EPOLL}) {
+               $config{USE_EPOLL} = "y";
                yesno('USE_EPOLL',"You are running a Linux 2.6+ operating system, and epoll\nwas detected. Would you like to enable epoll support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable epoll?");
                print "\n";
                if ($config{USE_EPOLL} eq "y") {
+                       $config{SOCKETENGINE} = "epoll";
                        $chose_hiperf = 1;
                }
        }
-       if ($has_ports) {
+       if ($config{HAS_PORTS}) {
+               $config{USE_PORTS} = "y";
                yesno('USE_PORTS',"You are running Solaris 10.\nWould you like to enable I/O completion ports support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable support for I/O completion ports?");
                print "\n";
                if ($config{USE_PORTS} eq "y") {
+                       $config{SOCKETENGINE} = "ports";
                        $chose_hiperf = 1;
                }
        }
 
-       if (!$chose_hiperf) {
-               yesno('USE_POLL', "Would you like to use poll?\n This is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable poll?\n");
-               if ($config{USE_POLL} ne "y")
-               {
-                       print "No high-performance socket engines are available, or you chose\n";
-                       print "not to enable one. Defaulting to select() engine.\n\n";
+       if (!$chose_hiperf && $config{HAS_POLL}) {
+               $config{USE_POLL} = "y";
+               yesno('USE_POLL', "Would you like to use poll?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable poll?");
+               if ($config{USE_POLL} eq "y") {
+                       $config{SOCKETENGINE} = "poll";
                }
        }
-
-       yesno('IPV6',"Would you like to build InspIRCd with IPv6 support?");
-       print "\n";
-
-       if ($config{IPV6} eq "y") {
-               print "You have chosen to build an \e[1;32mIPV6-enabled\e[0m server.\nTo accept IPV4 users, you can still use IPV4 addresses\nin your port bindings..\n\n";
-               $config{SUPPORT_IP6LINKS} = "y";
-       } else {
-               yesno('SUPPORT_IP6LINKS',"You have chosen to build an \e[1;32mIPV4-only\e[0m server.\nWould you like to enable support for linking to IPV6-enabled\nInspIRCd servers? If you are using a recent operating system and are\nunsure, answer yes. If you answer 'no' here, your InspIRCd server will\nbe unable to parse IPV6 addresses (e.g. for CIDR bans)\n\nEnable linking to servers which have IPV6 enabled?");
-               print "\n";
+       if (!$chose_hiperf && $config{USE_POLL} ne "y")
+       {
+               print "No high-performance socket engines are available, or you chose\n";
+               print "not to enable one. Defaulting to select() engine.\n\n";
+               $config{SOCKETENGINE} = "select";
        }
 
        $config{USE_FREEBSD_BASE_SSL} = "n";
@@ -732,31 +448,31 @@ should NOT be used. You should probably specify a newer compiler.\n\n";
                                yesno('USE_OPENSSL', "Would you like to enable SSL with m_ssl_openssl?");
                                if ($config{USE_OPENSSL} eq "y")
                                {
-                                       print "\nUsing OpenSSL SSL module.\nYou will get better performance if you move to GnuTLS in the future.\n";
+                                       print "\nUsing OpenSSL SSL module.\n";
                                }
                        }
                }
        }
        else
        {
-               print "\nCould not detect OpenSSL or GnuTLS. Make sure pkg-config is installed if\n";
-               print "you intend to use OpenSSL, or that GnuTLS is in your path if you intend\nto use GnuTLS.\n\n";
+               print "\nCould not detect OpenSSL or GnuTLS. Make sure pkg-config is installed and\n";
+               print "is in your path.\n\n";
        }
 }
 
-dumphash();
+# We are on a POSIX system, we can enable POSIX extras without asking
+symlink "extra/m_regex_posix.cpp", "src/modules/m_regex_posix.cpp";
 
 if (($config{USE_GNUTLS} eq "y") && ($config{HAS_GNUTLS} ne "y"))
 {
        print "Sorry, but i couldn't detect gnutls. Make sure gnutls-config is in your path.\n";
-       exit(0);
+       exit 1;
 }
 if (($config{USE_OPENSSL} eq "y") && ($config{HAS_OPENSSL} ne "y"))
 {
        print "Sorry, but i couldn't detect openssl. Make sure openssl is in your path.\n";
-       exit(0);
+       exit 1;
 }
-our $failed = 0;
 
 $config{CERTGEN} ||= 'y';
 yesno('CERTGEN',"Would you like generate SSL certificates now?") if ($interactive && ($config{USE_GNUTLS} eq "y" || $config{USE_OPENSSL} eq "y"));
@@ -768,22 +484,12 @@ if ($config{USE_GNUTLS} eq "y") {
        }
        if ($interactive && $config{CERTGEN} eq 'y')
        {
-               unless (-r "$config{CONFIG_DIR}/key.pem" && -r "$config{CONFIG_DIR}/cert.pem") {
-                       print "SSL Certificates Not found, Generating.. \n\n
-*************************************************************
-* Generating the Private Key may take some time, go grab a  *
-* Coffee. Even better, to generate some more entropy if it  *
-* is taking a while, open another console and type du / a   *
-* few times and get that HD going :) Then answer the        *
-* Questions which follow. If you are unsure, just hit enter *
-*************************************************************\n\n";
-                       $failed = make_gnutls_cert();
-                       if ($failed) {
-                               print "\n\e[1;32mCertificate generation failed!\e[0m\n\n";
-                       } else {
+               unless (-r "$config{CONFIG_DIR}/key.pem" && -r "$config{CONFIG_DIR}/cert.pem" && -r "$config{CONFIG_DIR}/dhparams.pem") {
+                       unless (system './tools/genssl gnutls') {
                                print "\nCertificate generation complete, copying to config directory... ";
                                File::Copy::move("key.pem", "$config{CONFIG_DIR}/key.pem") or print STDERR "Could not copy key.pem!\n";
                                File::Copy::move("cert.pem", "$config{CONFIG_DIR}/cert.pem") or print STDERR "Could not copy cert.pem!\n";
+                               File::Copy::move("dhparams.pem", "$config{CONFIG_DIR}/dhparams.pem") or print STDERR "Could not copy dhparams.pem!\n";
                                print "Done.\n\n";
                        }
                }
@@ -802,21 +508,16 @@ if ($config{USE_OPENSSL} eq "y") {
                print "Symlinking src/modules/m_ssl_openssl.cpp from extra/\n";
                symlink "extra/m_ssl_openssl.cpp", "src/modules/m_ssl_openssl.cpp" or print STDERR "Symlink failed: $!";
        }
-       $failed = 0;
        if ($interactive && $config{CERTGEN} eq 'y')
        {
-               unless (-r "$config{CONFIG_DIR}/key.pem" && -r "$config{CONFIG_DIR}/cert.pem") {
-                       print "SSL Certificates Not found, Generating.. \n\n
-*************************************************************
-* Generating the certificates may take some time, go grab a *
-* coffee, or something.                                            *
-*************************************************************\n\n";
-                       make_openssl_cert();
-                       print "\nCertificate generation complete, copying to config directory... ";
-                       File::Copy::move("key.pem", "$config{CONFIG_DIR}/key.pem") or print STDERR "Could not copy key.pem!\n";
-                       File::Copy::move("cert.pem", "$config{CONFIG_DIR}/cert.pem") or print STDERR "Could not copy cert.pem!\n";
-                       File::Copy::move("dhparams.pem", "$config{CONFIG_DIR}/dhparams.pem") or print STDERR "Could not copy dhparams.pem!\n";
-                       print "Done.\n\n";
+               unless (-r "$config{CONFIG_DIR}/key.pem" && -r "$config{CONFIG_DIR}/cert.pem" && -r "$config{CONFIG_DIR}/dhparams.pem") {
+                       unless (system './tools/genssl openssl') {
+                               print "\nCertificate generation complete, copying to config directory... ";
+                               File::Copy::move("key.pem", "$config{CONFIG_DIR}/key.pem") or print STDERR "Could not copy key.pem!\n";
+                               File::Copy::move("cert.pem", "$config{CONFIG_DIR}/cert.pem") or print STDERR "Could not copy cert.pem!\n";
+                               File::Copy::move("dhparams.pem", "$config{CONFIG_DIR}/dhparams.pem") or print STDERR "Could not copy dhparams.pem!\n";
+                               print "Done.\n\n";
+                       }
                } else {
                        print "SSL Certificates found, skipping.\n\n"
                }
@@ -830,36 +531,21 @@ if (($config{USE_GNUTLS} eq "n") && ($config{USE_OPENSSL} eq "n")) {
        print "Skipping SSL Certificate generation, SSL support is not available.\n\n";
 }
 
-getosflags();
-writefiles(1);
+depcheck();
+writefiles();
 makecache();
+dumphash();
 
-print "\n\n";
-print "To build your server with these settings, please type '\e[1;32m$config{MAKEPROG}\e[0m' now.\n";
+print "\n";
+print "To build your server with these settings, please run '\e[1;32mmake\e[0m' now.\n";
 if (($config{USE_GNUTLS} eq "y") || ($config{USE_OPENSSL} eq "y")) {
        print "Please note: for \e[1;32mSSL support\e[0m you will need to load required\n";
        print "modules in your config. This configure script has added those modules to the\n";
        print "build process. For more info please refer to:\n";
        print "\e[1;32mhttp://wiki.inspircd.org/Installation_From_Tarball\e[0m\n";
 }
-print "*** \e[1;32mRemember to edit your configuration files!!!\e[0m ***\n\n\n";
-if (($config{OSNAME} eq "OpenBSD") && ($config{CC} ne "eg++")) {
-       print "\e[1;32mWARNING!\e[0m You are running OpenBSD but you are using the base gcc package\nrather than eg++. This compile will most likely fail, but i'm letting you\ngo ahead with it anyway, just in case i'm wrong :-)\n";
-}
-
-if ($config{GCCVER} < "3") {
-       print <<FOO2;
-\e[1;32mWARNING!\e[0m You are attempting to compile InspIRCd on GCC 2.x!
-GCC 2.x series compilers only had partial (read as broken) C++ support, and
-your compile will most likely fail horribly! If you have any problems, do NOT
-report them to the bugtracker or forums without first upgrading your compiler
-to a newer 3.x or 4.x (or whatever is available currently) version.
-FOO2
-}
+print "*** \e[1;32mRemember to edit your configuration files!!!\e[0m ***\n\n";
 
-################################################################################
-#                            HELPER FUNCTIONS                          #
-################################################################################
 sub getcache {
        # Retrieves the .config.cache file, and loads values into the main config hash.
        open(CACHE, ".config.cache") or return 0;
@@ -899,15 +585,9 @@ sub dir_check {
                }
                if ($var =~ /^\~\/(.+)$/) {
                        # Convert it to a full path..
-                       $var = resolve_directory($ENV{HOME} . "/" . $1);
-               }
-               elsif ((($config{OSNAME} =~ /MINGW32/i) and ($var !~ /^[A-Z]{1}:\\.*/)) and (substr($var,0,1) ne "/"))
-               {
-                       # Assume relative Path was given.. fill in the rest.
-                       $var = $this . "/$var";
+                       $var = rel2abs($ENV{HOME} . "/" . $1);
                }
-
-               $var = resolve_directory($var);
+               $var = rel2abs($var);
                if (! -e $var) {
                        print "$var does not exist. Create it?\n[\e[1;32my\e[0m] ";
                        chomp(my $tmp = <STDIN>);
@@ -929,7 +609,7 @@ sub dir_check {
                                next;
                        }
                } else {
-                       if (!is_dir($var)) {
+                       if (! -d $var) {
                                # Target exists, but is not a directory.
                                print "File $var exists, but is not a directory.\n\n";
                                next;
@@ -942,316 +622,122 @@ sub dir_check {
        }
 }
 
-our $SHARED = "";
-
-sub getosflags {
-
-       # Beware: Linux sets it's own cflags below for some retarded reason
-       $config{LDLIBS} = "-pthread -lstdc++";
-       $config{FLAGS}  = "-pipe -fPIC -Woverloaded-virtual -Wshadow -Wformat=2 -Wmissing-format-attribute -Wall $config{OPTIMISATI}";
-       $config{DEVELOPER} = "-pipe -fPIC -Woverloaded-virtual -Wshadow -Wall -Wformat=2 -Wmissing-format-attribute -g";
-       $SHARED = "-shared -export-dynamic";
-       $config{MAKEPROG} = "make";
-
-       if ($config{OSNAME} =~ /darwin/i) {
-               $config{FLAGS}  = "-pipe -DDARWIN -frtti -fPIC -Wall $config{OPTIMISATI}";
-               $SHARED = "-bundle -twolevel_namespace -undefined dynamic_lookup";
-               $config{LDLIBS} = "-ldl -pthread -lstdc++";
-       }
-
-       if ($config{OSNAME} =~ /OpenBSD/i) {
-               $config{MAKEPROG} = "gmake";
-# apparantly (Dagonet says) that this causes problems, so let's try without it.
-#              $config{LDLIBS} = $config{LDLIBS} . " -lunwind";
-               chomp(my $foo = `eg++ -dumpversion | cut -c 1`);
-               # theyre running the package version of gcc (eg++)... detect it and set up its version numbers.
-               # if theyre not running this, configure lets the build continue but they probably wont manage to
-               # compile as this standard version is 2.95.3!
-               if ($foo ne "") {
-                       $config{CC} = "eg++";
-                       chomp($config{GCCVER}       = `eg++ -dumpversion | cut -c 1`); # we must redo these if we change the compiler path
-                       chomp($config{GCCMINOR}     = `eg++ -dumpversion | cut -c 3`);
-               }
-               return "OpenBSD";
-       }
-
-       if ($config{OSNAME} =~ /Linux/i) {
-               $config{LDLIBS} = "-ldl -lstdc++ -pthread";
-#              $config{FLAGS}  = "-fPIC -Woverloaded-virtual -Wshadow -Wall $config{OPTIMISATI}";
-               $config{FLAGS}  .= " " . $ENV{CXXFLAGS} if exists($ENV{CXXFLAGS});
-               $config{LDLIBS} .= " " . $ENV{LDLIBS} if exists($ENV{LDLIBS});
-               $config{LDLIBS} .= " " . $ENV{LDFLAGS} if exists($ENV{LDFLAGS});
-               $config{MAKEPROG} = "make";
-       }
-
-       if ($config{OSNAME} =~ /FreeBSD/i) {
-               $config{FLAGS}  .= " " . $ENV{CXXFLAGS} if exists($ENV{CXXFLAGS});
-               $config{LDLIBS} .= " " . $ENV{LDLIBS} if exists($ENV{LDLIBS});
-               $config{LDLIBS} .= " " . $ENV{LDFLAGS} if exists($ENV{LDFLAGS});
-       }
-
-       if ($config{OSNAME} =~ /SunOS/i or $config{OSNAME} =~ /solaris/i)
-       {
-               # solaris/sunos needs these
-               # socket = bsd sockets api
-               # nsl = dns stuff
-               # rt = POSIX realtime extensions
-               # resolv = inet_aton only (why isnt this in nsl?!)
-               $config{MAKEPROG} = "gmake";
-               $config{LDLIBS} .= " -lsocket -lnsl -lrt -lresolv -pthread";
-               return "Solaris";
-       }
-
-       if($config{OSNAME} =~ /MINGW32/i)
-       {
-               # All code is position-independent on windows
-               $config{FLAGS} =~ s/-fPIC //;
-               return "MinGW";
-       }
-
-       return $config{OSNAME};
-}
-
-my ($mliflags, $mfrules, $mobjs, $mfcount) = ("", "", "", 0);
-
 sub writefiles {
-       my($writeheader) = @_;
-       # First File.. inspircd_config.h
        chomp(my $incos = `uname -n -s -r`);
        chomp(my $version = `sh src/version.sh`);
-       chomp(my $revision2 = getrevision());
-       if ($writeheader == 1)
+       my $revision = getrevision();
+       my $branch = "InspIRCd-0.0";
+       if ($version =~ /^(InspIRCd-[0-9]+\.[0-9]+)\.[0-9]+/)
        {
-               print "Writing \e[1;32minspircd_config.h\e[0m\n";
-               open(FILEHANDLE, ">include/inspircd_config.h.tmp");
-               print FILEHANDLE <<EOF;
+               $branch = $1;
+       }
+       print "Writing \e[1;32mconfig.h\e[0m\n";
+       open(FILEHANDLE, ">include/config.h.tmp");
+       print FILEHANDLE <<EOF;
 /* Auto generated by configure, do not modify! */
-#ifndef __CONFIGURATION_AUTO__
-#define __CONFIGURATION_AUTO__
-
-/* this is for windows support. */
-#define CoreExport /**/
-#define DllExport /**/
+#pragma once
 
-#define CONFIG_FILE "$config{CONFIG_DIR}/inspircd.conf"
-#define MOD_PATH "$config{MODULE_DIR}"
+#define BRANCH "$branch"
 #define VERSION "$version"
-#define REVISION "$revision2"
-#define SOMAXCONN_S "$config{_SOMAXCONN}"
-#define OPTIMISATION $config{OPTIMITEMP}
-#define LIBRARYDIR "$config{LIBRARY_DIR}"
+#define REVISION "$revision"
 #define SYSTEM "$incos"
-#define ENTRYPOINT int main(int argc, char** argv)
-
-EOF
-print FILEHANDLE "#define MAXBUF " . ($config{MAXBUF}+2) . "\n";
 
-               if ($config{OSNAME} =~ /SunOS/i) {
-                       print FILEHANDLE "#define IS_SOLARIS\n";
-               }
-               if ($config{OSNAME} =~ /MINGW32/i) {
-                       print FILEHANDLE "#define IS_MINGW\n";
-               }
-               if ($config{GCCVER} >= 3) {
-                       print FILEHANDLE "#define GCC3\n";
-               }
-               if (
-                       (($config{GCCVER} == 4) && ($config{GCCMINOR} >= 3))
-                               ||
-                       ($config{GCCVER} > 4)
-               ) {
-                       print FILEHANDLE "#define HASHMAP_DEPRECATED\n";
-               }
-               if ($config{HAS_STRLCPY} eq "true") {
-                       print FILEHANDLE "#define HAS_STRLCPY\n";
-               }
-               if ($config{HAS_STDINT} eq "true") {
-                       print FILEHANDLE "#define HAS_STDINT\n";
-               }
-               if ($config{IPV6} =~ /y/i) {
-                       print FILEHANDLE "#define IPV6\n";
-               }
-               if ($config{SUPPORT_IP6LINKS} =~ /y/i) {
-                       print FILEHANDLE "#define SUPPORT_IP6LINKS\n";
-               }
-               if ($config{HAS_EVENTFD} eq 'true') {
-                       print FILEHANDLE "#define HAS_EVENTFD\n";
-               }
-               my $use_hiperf = 0;
-               if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
-                       print FILEHANDLE "#define USE_KQUEUE\n";
-                       $config{SOCKETENGINE} = "socketengine_kqueue";
-                       $use_hiperf = 1;
-               }
-               if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
-                       print FILEHANDLE "#define USE_EPOLL\n";
-                       $config{SOCKETENGINE} = "socketengine_epoll";
-                       $use_hiperf = 1;
-               }
-               if (($has_ports) && ($config{USE_PORTS} eq "y")) {
-                       print FILEHANDLE "#define USE_PORTS\n";
-                       $config{SOCKETENGINE} = "socketengine_ports";
-                       $use_hiperf = 1;
-               }
-               # user didn't choose either epoll or select for their OS.
-               # default them to USE_SELECT (ewwy puke puke)
-               if (!$use_hiperf) {
-                       print "no hi-perf, " . $config{USE_POLL};
-                       if ($config{USE_POLL} eq "y")
-                       {
-                               print FILEHANDLE "#define USE_POLL\n";
-                               $config{SOCKETENGINE} = "socketengine_poll";
-                       }
-                       else
-                       {
-                               print FILEHANDLE "#define USE_SELECT\n";
-                               $config{SOCKETENGINE} = "socketengine_select";
-                       }
-               }
-               print FILEHANDLE "\n#include \"threadengines/threadengine_pthread.h\"\n\n#endif\n";
-               close(FILEHANDLE);
-
-               open(FILEHANDLE, ">include/inspircd_se_config.h.tmp");
-               print FILEHANDLE <<EOF;
-/* Auto generated by configure, do not modify or commit to svn! */
-#ifndef __CONFIGURATION_SOCKETENGINE__
-#define __CONFIGURATION_SOCKETENGINE__
-
-#include "socketengines/$config{SOCKETENGINE}.h"
+#define CONFIG_PATH "$config{CONFIG_DIR}"
+#define DATA_PATH "$config{DATA_DIR}"
+#define LOG_PATH "$config{LOG_DIR}"
+#define MOD_PATH "$config{MODULE_DIR}"
 
-#endif
 EOF
-               close(FILEHANDLE);
 
-               for my $file (qw(include/inspircd_config.h include/inspircd_se_config.h)) {
-                       my $diff = 0;
-                       open my $fh1, $file or $diff = 1;
-                       open my $fh2, $file.'.tmp' or die "Can't read $file.tmp that we just wrote: $!";
-                       while (!$diff) {
-                               my $line1 = <$fh1>;
-                               my $line2 = <$fh2>;
-                               if (defined($line1) != defined($line2)) {
-                                       $diff = 1;
-                               } elsif (!defined $line1) {
-                                       last;
-                               } else {
-                                       $diff = ($line1 ne $line2);
-                               }
-                       }
-                       if ($diff) {
-                               unlink $file;
-                               rename "$file.tmp", $file;
-                       } else {
-                               unlink "$file.tmp";
-                       }
-               }
+       if ($config{HAS_EVENTFD}) {
+               print FILEHANDLE "#define HAS_EVENTFD\n";
        }
+       if ($config{HAS_CLOCK_GETTIME}) {
+               print FILEHANDLE "#define HAS_CLOCK_GETTIME\n";
+       }
+
+       print FILEHANDLE "\n#include \"threadengines/threadengine_pthread.h\"\n";
+       close(FILEHANDLE);
 
-       # Write all .in files.
-       my $tmp = "";
-       my $file = "";
-       my $exe = "inspircd";
+       unlink 'include/config.h';
+       rename 'include/config.h.tmp', 'include/config.h';
 
        # Do this once here, and cache it in the .*.inc files,
        # rather than attempting to read src/version.sh from
        # compiled code -- we might not have the source to hand.
-       # Fix for bug#177 by Brain.
-
-       chomp($version = `sh ./src/version.sh`);
-       chomp(my $revision = getrevision());
-       $version = "$version(r$revision)";
-
-       # We can actually parse any file starting with . and ending with .inc,
-       # but right now we only parse .inspircd.inc to form './inspircd'
-       prepare_dynamic_makefile();
-
-    print "Writing \e[1;32mMakefiles\e[0m\n";
 
-       opendir(DIRHANDLE, $this);
+       my @dotfiles = qw(main.mk inspircd);
+       push @dotfiles, 'org.inspircd.plist' if $^O eq 'darwin';
 
-       foreach my $name (sort readdir(DIRHANDLE)) {
-               if ($name =~ /^\.(.+)\.inc$/) {
-                       $file = $1;
-
-                       # Bug #353, omit this on non-darwin
-                       next if (($config{OSNAME} !~ /darwin/) && ($file eq "org.inspircd.plist"));
-
-                       # All .name.inc files need parsing!
-                       open(FILEHANDLE, ".$file.inc") or die ("Can't open .$file.inc");
-                       $_ = join '', <FILEHANDLE>;
-                       close(FILEHANDLE);
+       foreach my $file (@dotfiles) {
+               open(FILEHANDLE, "make/template/$file") or die "Can't open make/template/$file: $!";
+               $_ = join '', <FILEHANDLE>;
+               close(FILEHANDLE);
 
+               $config{BUILD_DIR} ||= rel2abs($topdir."/build");
+               $config{COMPILER} = lc $cxx{NAME};
+               $config{SYSTEM} = lc $^O;
+
+               for my $var (qw(
+                       CXX COMPILER SYSTEM BASE_DIR CONFIG_DIR MODULE_DIR BINARY_DIR BUILD_DIR DATA_DIR UID
+                       STARTSCRIPT SOCKETENGINE
+               )) {
+                       s/\@$var\@/$config{$var}/g;
+               }
+
+               s/\@VERSION\@/$version/ if defined $version;
+
+               if ($file eq 'main.mk') {
+                       print "Writing \e[1;32mGNUmakefile\e[0m ...\n";
+
+                       my $mk_tmp = $_;
+                       s/\@IFDEF (\S+)/ifdef $1/g;
+                       s/\@IFNDEF (\S+)/ifndef $1/g;
+                       s/\@IFEQ (\S+) (\S+)/ifeq ($1,$2)/g;
+                       s/\@IFNEQ (\S+) (\S+)/ifneq ($1,$2)/g;
+                       s/\@ELSIFEQ (\S+) (\S+)/else ifeq ($1,$2)/g;
+                       s/\@ELSE/else/g;
+                       s/\@ENDIF/endif/g;
+                       s/ *\@BSD_ONLY .*\n//g;
+                       s/\@GNU_ONLY //g;
+                       s/\@DO_EXPORT (.*)/export $1/g;
+                       open MKF, '>GNUmakefile' or die "Can't write to GNUmakefile: $!";
+                       print MKF $_;
+                       close MKF;
+
+                       print "Writing \e[1;32mBSDmakefile\e[0m ...\n";
+                       $_ = $mk_tmp;
+                       s/\@IFDEF (\S+)/.if defined($1)/g;
+                       s/\@IFNDEF (\S+)/.if !defined($1)/g;
+                       s/\@IFEQ (\S+) (\S+)/.if $1 == $2/g;
+                       s/\@IFNEQ (\S+) (\S+)/.if $1 != $2/g;
+                       s/\@ELSIFEQ (\S+) (\S+)/.elif $1 == $2/g;
+                       s/\@ELSE/.else/g;
+                       s/\@ENDIF/.endif/g;
+                       s/\@BSD_ONLY //g;
+                       s/ *\@GNU_ONLY .*\n//g;
+                       $mk_tmp = $_;
+                       $mk_tmp =~ s#\@DO_EXPORT (.*)#"MAKEENV += ".join ' ', map "$_='\${$_}'", split /\s/, $1#eg;
+                       open MKF, '>BSDmakefile' or die "Can't write to BSDmakefile: $!";
+                       print MKF $mk_tmp;
+                       close MKF;
+               } else {
                        print "Writing \e[1;32m$file\e[0m ...\n";
-                       for my $var (qw(
-                               CC FLAGS DEVELOPER LDLIBS BASE_DIR CONFIG_DIR MODULE_DIR BINARY_DIR LIBRARY_DIR
-                               STARTSCRIPT DESTINATION EXTRA_DIR SOCKETENGINE CORE_FLAGS
-                       )) {
-                               s/\@$var\@/$config{$var}/g;
-                       }
-                       s/\@EXECUTABLE\@/$exe/ if defined $exe;
-                       s/\@VERSION\@/$version/ if defined $version;
-
-                       if ($file eq 'Makefile') {
-                               my $mk_tmp = $_;
-                               s/\@IFDEF (\S+)/ifdef $1/g;
-                               s/\@IFNDEF (\S+)/ifndef $1/g;
-                               s/\@ELSE/else/g;
-                               s/\@ENDIF/endif/g;
-                               s/ *\@BSD_ONLY .*\n//g;
-                               s/\@GNU_ONLY //g;
-                               s/\@DO_EXPORT (.*)/export $1/g;
-                               open MKF, '>GNUmakefile' or die "Can't write to GNUmakefile: $!";
-                               print MKF $_;
-                               close MKF;
-                               $_ = $mk_tmp;
-                               s/\@IFDEF (\S+)/.if defined($1)/g;
-                               s/\@IFNDEF (\S+)/.if !defined($1)/g;
-                               s/\@ELSE/.else/g;
-                               s/\@ENDIF/.endif/g;
-                               s/\@BSD_ONLY //g;
-                               s/ *\@GNU_ONLY .*\n//g;
-                               $mk_tmp = $_;
-                               $mk_tmp =~ s#\@DO_EXPORT (.*)#"MAKEENV += ".join ' ', map "$_='\${$_}'", split /\s/, $1#eg;
-                               open MKF, '>BSDmakefile' or die "Can't write to BSDmakefile: $!";
-                               print MKF $mk_tmp;
-                               close MKF;
-                       } else {
-                               open(FILEHANDLE, ">$file") or die("Can't write to $file: $!\n");
-                               print FILEHANDLE $_;
-                               close(FILEHANDLE);
-                       }
+                       open(FILEHANDLE, ">$file") or die("Can't write to $file: $!\n");
+                       print FILEHANDLE $_;
+                       close(FILEHANDLE);
                }
        }
-       closedir(DIRHANDLE);
 
-       # Make inspircd executable!
-       chmod 0744, 'inspircd';
+       chmod 0755, 'inspircd';
 }
 
-sub prepare_dynamic_makefile
+sub depcheck
 {
-       my $i = 0;
-
-       if (!$has_epoll)
-       {
-               $config{USE_EPOLL} = 0;
-       }
-       if (!$has_kqueue)
-       {
-               $config{USE_KQUEUE} = 0;
-       }
-       if (!$has_ports)
-       {
-               $config{USE_PORTS} = 0;
-       }
-
-       if ($config{IS_DARWIN} eq "YES")
-       {
-               $config{CORE_FLAGS} = '-dynamic -bind_at_load -L.';
-       }
-       else
-       {
-               $config{CORE_FLAGS} = (defined $config{CRAQ} ? $config{CRAQ}. ' ' : "").'-rdynamic -L.'
+       getmodules();
+       for my $mod (@modlist) {
+               getcompilerflags("src/modules/m_$mod.cpp");
+               getlinkerflags("src/modules/m_$mod.cpp");
        }
 }
 
@@ -1279,7 +765,6 @@ sub list_extras () {
        my %extras = ();
 EXTRA: for my $extra (@extras) {
                next if (File::Spec->curdir() eq $extra || File::Spec->updir() eq $extra);
-               next if ($extra eq '.svn');
                my $abs_extra = File::Spec->catfile($abs_srcdir, "extra", $extra);
                my $abs_source = File::Spec->catfile($abs_srcdir, $extra);
                next unless ($extra =~ m/\.(cpp|h)$/ || (-d $abs_extra)); # C++ Source/Header, or directory
@@ -1369,7 +854,7 @@ sub enable_extras (@) {
                my @deps = split / +/, getdependencies($extrapath);
                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") {
+                       if (!-e "src/modules/$dep" && !-e "include/$dep") {
                                if (-e "src/modules/extra/$dep") {
                                        print STDERR "Will also enable extra \e[32;1m$dep\e[0m (needed by \e[32;1m$extra\e[0m)\n";
                                        push @extras, $dep;