]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - configure
Fix bug experienced by satmd, remove space indents + tidy a little
[user/henk/code/inspircd.git] / configure
index 5d47bdc7e00f0d1993f76c7d6e3e97beafc0c5c6..8af40ef104704863db4e33310c68cd194811761b 100755 (executable)
--- a/configure
+++ b/configure
@@ -2,7 +2,7 @@
 
 # InspIRCd Configuration Script
 #
-# Copyright 2003 The ChatSpike Development Team
+# Copyright 2002-2006 The ChatSpike Development Team
 # <brain@chatspike.net>
 # <Craig@chatspike.net>
 #
 #
 ########################################
 
+require 5.6.0;
 use Cwd;
+use Getopt::Long;
+
+GetOptions (
+       'enable-gnutls' => \$opt_use_gnutls,
+       'enable-openssl' => \$opt_use_openssl,
+       'disable-interactive' => \$opt_nointeractive,
+       'with-nick-length=i' => \$opt_nick_length,
+       'with-channel-length=i' => \$opt_chan_length,
+       'with-max-channels=i' => \$opt_maxchans,
+       'with-max-oper-channels=i' => \$opt_opermaxchans,
+       'with-max-clients' => \$opt_maxclients,
+       'enable-optimization' => \$opt_optimise,
+       'enable-epoll' => \$opt_epoll,
+       'enable-kqueue' => \$opt_kqueue,
+       '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-ident-length=i' => \$opt_ident,
+       'with-quit-length=i' => \$opt_quit,
+       'with-topic-length=i' => \$opt_topic,
+       'with-kick-length=i' => \$opt_kick,
+       'with-gecos-length=i' => \$opt_gecos,
+       'with-away-length=i' => \$opt_away,
+       'with-max-modes=i' => \$opt_modes,
+       '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,
+       'help'  => sub { showhelp(); },
+       'modupdate' => sub { modupdate(); },
+       'update' => sub { update(); },
+       'svnupdate' => sub { svnupdate(); },
+       'clean' => sub { clean(); },
+);
+
+my $non_interactive = (
+       (defined $opt_library_dir) ||
+       (defined $opt_base_dir) ||
+       (defined $opt_config_dir) ||
+       (defined $opt_module_dir) ||
+       (defined $opt_base_dir) ||
+       (defined $opt_binary_dir) ||
+       (defined $opt_nointeractive) ||
+       (defined $opt_away) ||
+       (defined $opt_gecos) ||
+       (defined $opt_kick) ||
+       (defined $opt_maxclients) ||
+       (defined $opt_modes) ||
+       (defined $opt_topic) ||
+       (defined $opt_quit) ||
+       (defined $opt_ident) ||
+       (defined $opt_cc) ||
+       (defined $opt_ipv6) ||
+       (defined $opt_ipv6links) ||
+       (defined $opt_noipv6links) ||
+       (defined $opt_kqueue) ||
+       (defined $opt_epoll) ||
+       (defined $opt_maxchans) ||
+       (defined $opt_opermaxchans) ||
+       (defined $opt_chan_length) ||
+       (defined $opt_nick_length) ||
+       (defined $opt_optimise) ||
+       (defined $opt_use_openssl) ||
+       (defined $opt_nokqueue) ||
+       (defined $opt_noepoll) ||
+       (defined $opt_use_gnutls)
+);
+my $interactive = !$non_interactive;
+
 
 chomp($topdir = getcwd());
 $this = resolve_directory($topdir);                                            # PWD, Regardless.
 @modlist = ();                                                                 # Declare for Module List..
 %config = ();                                                                  # Initiate Configuration Hash..
 $config{ME}                 = resolve_directory($topdir);                      # Present Working Directory
-$config{BASE_DIR}           = $config{ME};                                      # Use CWD as 'Base' Directory.
-$config{CONFIG_DIR}         = resolve_directory($config{ME}."/conf");          # Configuration Directory
-$config{MODULE_DIR}         = resolve_directory($config{ME}."/modules");       # Modules Directory
-$config{BINARY_DIR}         = resolve_directory($config{ME}."/bin");           # Binary Directory
-$config{LIBRARY_DIR}        = resolve_directory($config{ME}."/lib");           # Library Directory
+
+$config{BASE_DIR}           = $config{ME};
+
+if (defined $opt_base_dir)
+{
+       $config{BASE_DIR} = $opt_base_dir;
+}
+
+$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)
+{
+       $config{CONFIG_DIR} = $opt_config_dir;
+}
+if (defined $opt_module_dir)
+{
+       $config{MODULE_DIR} = $opt_module_dir;
+}
+if (defined $opt_binary_dir)
+{
+       $config{BINARY_DIR} = $opt_binary_dir;
+}
+if (defined $opt_library_dir)
+{
+       $config{LIBRARY_DIR} = $opt_library_dir;
+}
 chomp($config{HAS_GNUTLS}   = `libgnutls-config --version 2>/dev/null | cut -c 1,2,3`); # GNUTLS Version.
 chomp($config{HAS_OPENSSL}  = `openssl version 2>/dev/null`);                  # Openssl version
-$config{USE_GNUTLS}         = "n";                                             # Use gnutls.
+$config{USE_GNUTLS}        = "n";
+if (defined $opt_use_gnutls)
+{
+       $config{USE_GNUTLS} = "y";                                              # Use gnutls.
+}
 $config{USE_OPENSSL}        = "n";                                             # Use openssl.
+if (defined $opt_use_openssl)
+{
+       $config{USE_OPENSSL} = "y";
+}
 $config{OPTIMITEMP}         = "0";                                             # Default Optimisation Value
 $config{OPTIMISATI}         = "-g";                                            # Optimisation Flag
+if (defined $opt_optimise)
+{
+       $config{OPTIMISATI} = "-O" . $opt_optimise;
+       $config{OPTIMITEMP} = $opt_optimise;
+}
 $config{NICK_LENGT}         = "31";                                            # Default Nick Length
+if (defined $opt_nick_length)
+{
+       $config{NICK_LENGT} = $opt_nick_length;
+}
 $config{CHAN_LENGT}         = "64";                                            # Default Channel Name Length
+if (defined $opt_chan_length)
+{
+       $config{CHAN_LENGT} = $opt_chan_length;
+}
 $config{MAX_CHANNE}         = "20";                                            # Default Max. Channels per user
+if (defined $opt_maxchans)
+{
+       $config{MAX_CHANNE} = $opt_maxchans;
+}
 $config{MAX_OPERCH}         = "60";                                            # Default Max. Channels per oper
+if (defined $opt_opermaxchans)
+{
+       $config{MAX_OPERCH} = $opt_opermaxchans;
+}
 $config{MAXI_MODES}         = "20";                                            # Default Max. Number of Modes set at once.
+if (defined $opt_modes)
+{
+       $config{MAXI_MODES} = $opt_modes;
+}
 $config{HAS_STRLCPY}        = "false";                                         # strlcpy Check.
 $config{HAS_STDINT}         = "false";                                         # stdint.h check
-$config{HAS_EXECINFO}       = "0";                                             # execinfo.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_EPOLL}          = "y";                                             # epoll enabled
-$config{THREADED_DNS}       = "n";                                             # threaded dns
+if (defined $opt_epoll)
+{
+       $config{USE_EPOLL} = "y";
+}
+if (defined $opt_noepoll)
+{
+       $config{USE_EPOLL} = "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";
+}
 $config{STATIC_LINK}       = "no";                                             # are doing static modules?
 chomp($config{MAX_CLIENT_T} = `sh -c \"ulimit -n\"`);                          # FD Limit
 chomp($config{MAX_DESCRIPTORS} = `sh -c \"ulimit -n\"`);                       # Hard FD Limit
 chomp($config{GCCVER}       = `g++ -dumpversion | cut -c 1`);                  # Major GCC Version
-chomp($config{OSNAME}       = `/bin/uname`);                                   # Operating System Name
+chomp($config{OSNAME}       = `uname`);                                        # Operating System Name
 $config{CC}                = "g++";                                            # C++ compiler
+if (defined $opt_cc)
+{
+       $config{CC} = $opt_cc;
+}
+$exec = $config{CC} . " -dumpversion | cut -c 1";
+chomp($config{GCCVER}       = `$exec`);                                                # Major GCC Version
 $config{MAKEORDER}         = "ircd mods";                                      # build order
 $config{STATICLIBS}         = "";                                              # library archive path
 $config{MAX_IDENT}          = "12";                                            # max ident size
@@ -57,14 +220,38 @@ $config{MAX_TOPIC}          = "307";                                               # max topic size
 $config{MAX_KICK}           = "255";                                           # max kick message size
 $config{MAX_GECOS}          = "128";                                           # max GECOS size
 $config{MAX_AWAY}           = "200";                                           # max AWAY size
+if (defined $opt_ident)
+{
+       $config{MAX_IDENT} = $opt_ident;
+}
+if (defined $opt_quit)
+{
+       $config{MAX_QUIT} = $opt_quit;
+}
+if (defined $opt_topic)
+{
+       $config{MAX_TOPIC} = $opt_topic;
+}
+if (defined $opt_kick)
+{
+       $config{MAX_KICK} = $opt_kick;
+}
+if (defined $opt_gecos)
+{
+       $config{MAX_GECOS} = $opt_gecos;
+}
+if (defined $opt_away)
+{
+       $config{MAX_AWAY} = $opt_away;
+}
 
 $no_svn = 0;
 
-$config{HAS_OPENSSL} =~ /OpenSSL (\S+) \d+ \S+ \d{4}/;
+$config{HAS_OPENSSL} =~ /OpenSSL ([-[:digit:].]+)([a-z])?(\-[a-z][0-9])? (\w{3}|[0-9]+) (\w{3}|[0-9]+) [0-9]{4}/;
 $config{HAS_OPENSSL} = $1;
 
 if ($config{GCCVER} eq "") {
-       print "g++ was not found! You require g++ (the GNU C++ compiler, part of GCC) to build InspIRCd!\n";
+       print $config{CC} . " was not found! You require g++ (the GNU C++ compiler, part of GCC) to build InspIRCd!\n";
        exit;
 }
 
@@ -98,12 +285,18 @@ if (!$config{MAX_CLIENT_T}) {
 # Get and Set some important vars..
 getmodules();
 
-my $arg = $ARGV[0];                                            # Do Some Argument Checks..
-if ($arg eq "-clean") {
-       system("rm -rf .config.cache");
-}               # Remove the config.cache file.
+sub clean
+{
+       if ($arg eq "-clean") {
+               system("rm -rf .config.cache");
+       }
+}
 
-if ($arg eq "-update") {
+sub update
+{
+       chomp($topdir = getcwd());
+       $this = resolve_directory($topdir);                                             # PWD, Regardless.
+       getmodules();
        # Does the cache file exist?
        if (!getcache()) {
                # No, No it doesn't.. *BASH*
@@ -121,7 +314,11 @@ if ($arg eq "-update") {
        }
 }
 
-if ($arg eq "-modupdate") {
+sub modupdate
+{
+       chomp($topdir = getcwd());
+       $this = resolve_directory($topdir);                                             # PWD, Regardless.
+       getmodules();
         # Does the cache file exist?
         if (!getcache()) {
                 # No, No it doesn't.. *BASH*
@@ -141,7 +338,8 @@ if ($arg eq "-modupdate") {
 
 
 
-if ($arg eq "-svnupdate") {
+sub svnupdate
+{
        my $fail = 0;
        open(FH,"<.svn/entries") or $fail = 1;
        if ($fail) {
@@ -156,10 +354,16 @@ if ($arg eq "-svnupdate") {
        exit;
 }
 
-print "Checking for cache from previous configure...\n";
-getcache();
-print "Checking operating system version...\n";
-getosflags();
+print "Running non-interactive configure...\n" unless $interactive;
+print "Checking for cache from previous configure... ";
+print ((getcache() eq "true") ? "found\n" : "not found\n");
+print "Checking operating system version... ";
+print getosflags() . "\n";
+
+if (defined $opt_maxclients)
+{
+       $config{MAX_CLIENT} = $opt_maxclients;
+}
 
 if (!$config{MAX_CLIENT}) { 
        # If the cache hasn't set the max clients, copy the variable of MAX_CLIENT_T, this
@@ -197,27 +401,6 @@ if (!$fail) {
 print "yes\n" if $config{HAS_STRLCPY} eq "true";
 print "no\n" if $config{HAS_STRLCPY} eq "false";
 
-printf "Checking if execinfo.h exists... ";
-$config{HAS_EXECINFO} = "0";
-my $fail = 0;
-open(EXECINFO, "</usr/include/execinfo.h") or $fail = 1;
-if ($fail) {
-       $fail = 0;
-       open(EXECINFO, "</usr/local/include/execinfo.h") or $fail = 1;
-       if (!$fail) {
-               printf "/usr/local/include/execinfo.h\n";
-               $config{HAS_EXECINFO} = "1";
-               close(EXECINFO);
-       }
-       else {
-               printf "Not found!\n";
-       }
-}
-else {
-       printf "/usr/include/execinfo.h\n";
-       $config{HAS_EXECINFO} = "1";
-       close(EXECINFO);
-}
 
 printf "Checking if kqueue exists... ";
 $has_kqueue = 0;
@@ -284,361 +467,361 @@ if (($config{HAS_OPENSSL}) && (($config{HAS_OPENSSL} >= 0.8) || ($config{HAS_OPE
 ################################################################################
 
 # Clear the Screen..
-system("clear");
-# Display Splash Logo..
-show_splash();
-chomp($wholeos = `uname -mnr`);
+if ($interactive)
+{
+       system("clear");
+       chomp($wholeos = `uname -sr`);
 
-my $rev = getrevision();
-# Display Introduction Message..
-print "
-Welcome to the InspIRCd Configuration program!
+       my $rev = getrevision();
+       # Display Introduction Message..
+       print "
+Welcome to the \033[1mInspIRCd\033[0m Configuration program! (\033[1minteractive mode\033[0m)
+\033[1mPackage maintainers: Type ./configure --help for non-interactive help\033[0m
 
 *** If you are unsure of any of these values, leave it blank for    ***
 *** standard settings that will work, and your server will run      ***
-*** using them. If you are running this server as part of a         ***
-*** larger network, you must consult with your network admins       ***
-*** for the proper values to use, or server links will be unstable! ***
+*** using them. Please consult your IRC network admin if in doubt.  ***
 
 Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter
 a new value. Please note: You will \033[1mHAVE\033[0m to read the docs
 dir, otherwise you won't have a config file!
 
-Your operating system is: \033[1;32m$config{OSNAME}\033[0m ($wholeos), fdmax: $config{MAX_CLIENT_T}
+Your operating system is: \033[1;32m$config{OSNAME}\033[0m ($wholeos)
+Maximum file descriptors: \033[1;32m$config{MAX_CLIENT_T}\033[0m
 Your InspIRCd revision ID is \033[1;32mr$rev\033[0m";
-if ($rev eq "r0") {
-       print " (Non-SVN build)";
-}
-print ".\n\n";
+       if ($rev eq "r0") {
+               print " (Non-SVN build)";
+       }
+       print ".\n\n";
 
-$config{CHANGE_COMPILER} = "n";
-print "I have detected the following compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.x\033[0m)\n";
+       $config{CHANGE_COMPILER} = "n";
+       print "I have detected the following compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.x\033[0m)\n";
 
-while (($config{GCCVER} < 3) || ($config{GCCVER} eq "")) {
-       print "\033[1;32mIMPORTANT!\033[0m A GCC 2.x compiler has been detected, and
+       while (($config{GCCVER} < 3) || ($config{GCCVER} eq "")) {
+               print "\033[1;32mIMPORTANT!\033[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 "[\033[1;32m$config{CC}\033[0m] -> ";
-               chomp($config{CC} = <STDIN>);
-               if ($config{CC} eq "") {
-                       $config{CC} = "g++";
-               }
-               chomp($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
-                       print "Queried compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.x\033[0m)\n";
-                       if ($config{GCCVER} < 3) {
-                               print "\033[1;32mGCC 2.x WILL NOT WORK!\033[0m. Let's try that again, shall we?\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 "[\033[1;32m$config{CC}\033[0m] -> ";
+                       chomp($config{CC} = <STDIN>);
+                       if ($config{CC} eq "") {
+                               $config{CC} = "g++";
+                       }
+                       chomp($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
+                               print "Queried compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.x\033[0m)\n";
+                               if ($config{GCCVER} < 3) {
+                                       print "\033[1;32mGCC 2.x WILL NOT WORK!\033[0m. Let's try that again, shall we?\n";
+                               }
+                       }
+                       else {
+                               print "\033[1;32mWARNING!\033[0m Could not execute the compiler you specified. You may want to try again.\n";
                        }
-               }
-               else {
-                       print "\033[1;32mWARNING!\033[0m Could not execute the compiler you specified. You may want to try again.\n";
                }
        }
-}
-
-print "\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 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
-}
+       print "\n";
 
-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");
+       # 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
+       }
 
-if ($has_kqueue) {
-       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 ($has_epoll) {
-       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";
-}
-$chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y"));
-if (!$chose_hiperf) {
-       print "No high-performance socket engines are available, or you chose\n";
-       print "not to enable one. Defaulting to select() engine.\n\n";
-}
+       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");
 
-yesno(IPV6,"Would you like to build InspIRCd with IPv6 support?");
-print "\n";
+       if ($has_kqueue) {
+               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 ($has_epoll) {
+               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";
+       }
+       $chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y"));
+       if (!$chose_hiperf) {
+               print "No high-performance socket engines are available, or you chose\n";
+               print "not to enable one. Defaulting to select() engine.\n\n";
+       }
 
-if ($config{IPV6} eq "y") {
-       print "You have chosen to build an \033[1;32mIPV6-only\033[0m server.\nTo accept IPV4 users, you must use the '::ffff:' notation of addresses.\n\n";
-       $config{SUPPORT_IP6LINKS} = "y";
-} else {
-       yesno(SUPPORT_IP6LINKS,"You have chosen to build an \033[1;32mIPV4-only\033[0m server.\nWould you like to enable support for linking to IPV6-enabled\nInspIRCd servers which are using '::ffff:' notation?\nIf you are using a recent operating\nsystem and are unsure, answer yes.");
+       yesno(IPV6,"Would you like to build InspIRCd with IPv6 support?");
        print "\n";
-}
 
-if (($config{HAS_GNUTLS} eq "y") && ($config{HAS_OPENSSL} eq "y")) {
-       print "I have detected both GnuTLS and OpenSSL on your system.\n";
-       print "I will default to GnuTLS. If you wish to use OpenSSL\n";
-       print "instead, you should enable the OpenSSL module yourself\n";
-       print "by copying it from src/modules/extra to src/modules.\n\n";
-}
+       if ($config{IPV6} eq "y") {
+               print "You have chosen to build an \033[1;32mIPV6-only\033[0m server.\nTo accept IPV4 users, you must use the '::ffff:' notation of addresses.\n\n";
+               $config{SUPPORT_IP6LINKS} = "y";
+       } else {
+               yesno(SUPPORT_IP6LINKS,"You have chosen to build an \033[1;32mIPV4-only\033[0m server.\nWould you like to enable support for linking to IPV6-enabled\nInspIRCd servers which are using '::ffff:' notation?\nIf you are using a recent operating\nsystem and are unsure, answer yes.");
+               print "\n";
+       }
 
-if ($config{HAS_GNUTLS} eq "y") {
-       yesno(USE_GNUTLS, "Would you like to enable SSL Support?");
-       if ($config{USE_GNUTLS} eq "y") {
-               print "\nUsing GnuTLS SSL module.\n";
+       if (($config{HAS_GNUTLS} eq "y") && ($config{HAS_OPENSSL} eq "y")) {
+               print "I have detected both GnuTLS and OpenSSL on your system.\n";
+               print "I will default to GnuTLS. If you wish to use OpenSSL\n";
+               print "instead, you should enable the OpenSSL module yourself\n";
+               print "by copying it from src/modules/extra to src/modules.\n\n";
        }
-} elsif ($config{HAS_OPENSSL} eq "y") {
-       yesno(USE_OPENSSL, "Would you like to enable SSL Support?");
+
+       if ($config{HAS_GNUTLS} eq "y") {
+               yesno(USE_GNUTLS, "Would you like to enable SSL Support?");
+               if ($config{USE_GNUTLS} eq "y") {
+                       print "\nUsing GnuTLS SSL module.\n";
+               }
+       } elsif ($config{HAS_OPENSSL} eq "y") {
+                       yesno(USE_OPENSSL, "Would you like to enable SSL Support?");
        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.\nYou will get better performance if you move to GnuTLS in the future.\n";
+               }
        }
-}
 
-print "\nThe following questions will ask you for various figures relating\n";
-print "To your IRCd install. Please note that these should usually be left\n";
-print "as defaults unless you have a real reason to change them. If they\n";
-print "changed, then the values must be identical on all servers on your\n";
-print "network, or malfunctions and/or crashes may occur, with the exception\n";
-print "of the 'maximum number of clients' setting which may be different on\n";
-print "different servers on the network.\n\n";
+       print "\nThe following questions will ask you for various figures relating\n";
+       print "To your IRCd install. Please note that these should usually be left\n";
+       print "as defaults unless you have a real reason to change them. If they\n";
+       print "changed, then the values must be identical on all servers on your\n";
+       print "network, or malfunctions and/or crashes may occur, with the exception\n";
+       print "of the 'maximum number of clients' setting which may be different on\n";
+       print "different servers on the network.\n\n";
 
-# File Descriptor Settings..
-my $continue = 0;
-while (!$continue) {
-       print "Maximum number of clients at any one time ($config{MAX_CLIENT_T})\n";
-       print "[\033[1;32m$config{MAX_CLIENT}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_CLIENT};
-       }
-       if ($var =~ /^\d+$/) {
-               if (($var > $config{MAX_CLIENT_T}) && ($fd_scan_failed ne true)) {
-                       # Client has entered a larger number than the 'discovered' value
-                       # Confirm.
-                       print "WARNING: Our scans have indicated that you are attempting
+       # File Descriptor Settings..
+       my $continue = 0;
+       while (!$continue) {
+               print "Maximum number of clients at any one time ($config{MAX_CLIENT_T})\n";
+               print "[\033[1;32m$config{MAX_CLIENT}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_CLIENT};
+               }
+               if ($var =~ /^\d+$/) {
+                       if (($var > $config{MAX_CLIENT_T}) && ($fd_scan_failed ne true)) {
+                               # Client has entered a larger number than the 'discovered' value
+                               # Confirm.
+                               print "WARNING: Our scans have indicated that you are attempting
 to use more sockets than there are avaliable. Are you sure
 you wish to do this? It may cause the IRCd to malfunction [y/n]
 [\033[1;32mn\033[0m] -> $c";
-                       chomp($tmp = <STDIN>);
-                       if ($tmp ne "y") {
-                               print "Please enter the correct value.\n\n";
-                               next;
+                               chomp($tmp = <STDIN>);
+                               if ($tmp ne "y") {
+                                       print "Please enter the correct value.\n\n";
+                                       next;
+                               }
                        }
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+                       next;
                }
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
-               next;
-       }
-       # If we get here, we should be good to go.
-       $config{MAX_CLIENT} = $var;
-       $continue = 1;
-       print "\n";
-}
-
-my $continue = 0;
-while (!$continue) {
-       print "What is the maximum length of nicknames?\n";
-       print "[\033[1;32m$config{NICK_LENGT}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{NICK_LENGT};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{NICK_LENGT} = $var;
+               # If we get here, we should be good to go.
+               $config{MAX_CLIENT} = $var;
                $continue = 1;
                print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum length of channel names?\n";
-       print "[\033[1;32m$config{CHAN_LENGT}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{CHAN_LENGT};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{CHAN_LENGT} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+       my $continue = 0;
+       while (!$continue) {
+               print "What is the maximum length of nicknames?\n";
+               print "[\033[1;32m$config{NICK_LENGT}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{NICK_LENGT};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{NICK_LENGT} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum number of channels a normal user may join at any one time?\n";
-       print "[\033[1;32m$config{MAX_CHANNE}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_CHANNE};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAX_CHANNE} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum length of channel names?\n";
+               print "[\033[1;32m$config{CHAN_LENGT}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{CHAN_LENGT};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{CHAN_LENGT} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum number of channels an oper may join at any one time?\n";
-       print "[\033[1;32m$config{MAX_OPERCH}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_OPERCH};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAX_OPERCH} = $var;
-               $continue = 1;
-               print "\n";
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum number of channels a normal user may join at any one time?\n";
+               print "[\033[1;32m$config{MAX_CHANNE}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_CHANNE};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAX_CHANNE} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum number of mode changes in one line?\n";
-       print "[\033[1;32m$config{MAXI_MODES}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAXI_MODES};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAXI_MODES} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum number of channels an oper may join at any one time?\n";
+               print "[\033[1;32m$config{MAX_OPERCH}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_OPERCH};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAX_OPERCH} = $var;
+                       $continue = 1;
+                       print "\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum length of an ident (username)?\n";
-       print "[\033[1;32m$config{MAX_IDENT}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_IDENT};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAX_IDENT} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum number of mode changes in one line?\n";
+               print "[\033[1;32m$config{MAXI_MODES}\033[0m] -> ";
+                       chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAXI_MODES};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAXI_MODES} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum length of a quit message?\n";
-       print "[\033[1;32m$config{MAX_QUIT}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_QUIT};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAX_QUIT} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum length of an ident (username)?\n";
+               print "[\033[1;32m$config{MAX_IDENT}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_IDENT};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAX_IDENT} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum length of a channel topic?\n";
-       print "[\033[1;32m$config{MAX_TOPIC}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_TOPIC};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAX_TOPIC} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum length of a quit message?\n";
+               print "[\033[1;32m$config{MAX_QUIT}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_QUIT};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAX_QUIT} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum length of a kick message?\n";
-       print "[\033[1;32m$config{MAX_KICK}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_KICK};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAX_KICK} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum length of a channel topic?\n";
+               print "[\033[1;32m$config{MAX_TOPIC}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_TOPIC};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAX_TOPIC} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum length of a GECOS (real name) field?\n";
-       print "[\033[1;32m$config{MAX_GECOS}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_GECOS};
-       }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAX_GECOS} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum length of a kick message?\n";
+               print "[\033[1;32m$config{MAX_KICK}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_KICK};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAX_KICK} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-$continue = 0;
-while (!$continue) {
-       print "What is the maximum length of an away message?\n";
-       print "[\033[1;32m$config{MAX_AWAY}\033[0m] -> ";
-       chomp($var = <STDIN>);
-       if ($var eq "") {
-               $var = $config{MAX_AWAY};
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum length of a GECOS (real name) field?\n";
+               print "[\033[1;32m$config{MAX_GECOS}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_GECOS};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAX_GECOS} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-       if ($var =~ /^\d+$/) {
-               # We don't care what the number is, set it and be on our way.
-               $config{MAX_AWAY} = $var;
-               $continue = 1;
-               print "\n";
-       } else {
-               print "You must enter a number in this field. Please try again.\n\n";
+
+       $continue = 0;
+       while (!$continue) {
+               print "What is the maximum length of an away message?\n";
+               print "[\033[1;32m$config{MAX_AWAY}\033[0m] -> ";
+               chomp($var = <STDIN>);
+               if ($var eq "") {
+                       $var = $config{MAX_AWAY};
+               }
+               if ($var =~ /^\d+$/) {
+                       # We don't care what the number is, set it and be on our way.
+                       $config{MAX_AWAY} = $var;
+                       $continue = 1;
+                       print "\n";
+               } else {
+                       print "You must enter a number in this field. Please try again.\n\n";
+               }
        }
-}
 
-# Code Optimisation
-print "Enter the Level Of Binary optimisation. This is a number between 0 and 3.
+       # Code Optimisation
+       print "Enter the Level Of Binary optimisation. This is a number between 0 and 3.
 The InspIRCd Team will NOT support any bug reports above 0. Also note,
 the IRCd behaviour will be different depending on this value. Please
 read the documentation for more information.
@@ -648,24 +831,25 @@ value will default to 0 if you either don't enter a number, or enter
 a value outside the range.
 
 As always, if you are unsure, just press enter and accept the default.\n\n";
-print "[\033[1;32m$config{OPTIMITEMP}\033[0m] -> ";
-chomp($var = <STDIN>);
-if ($var eq "") {
-       $var = $config{OPTIMITEMP};
-}
-
-if ($var eq "1") {
-       $config{OPTIMITEMP} = 1;
-       $config{OPTIMISATI} = "-O";
-} elsif ($var eq "2") {
-       $config{OPTIMITEMP} = 2;
-       $config{OPTIMISATI} = "-O2";
-} elsif ($var eq "3") {
-       $config{OPTIMITEMP} = 3;
-       $config{OPTIMISATI} = "-O3";
-} else {
-       $config{OPTIMITEMP} = 0;
-       $config{OPTIMISATI} = "-g";
+       print "[\033[1;32m$config{OPTIMITEMP}\033[0m] -> ";
+       chomp($var = <STDIN>);
+       if ($var eq "") {
+               $var = $config{OPTIMITEMP};
+       }
+
+       if ($var eq "1") {
+               $config{OPTIMITEMP} = 1;
+               $config{OPTIMISATI} = "-O";
+       } elsif ($var eq "2") {
+               $config{OPTIMITEMP} = 2;
+               $config{OPTIMISATI} = "-O2";
+       } elsif ($var eq "3") {
+               $config{OPTIMITEMP} = 3;
+               $config{OPTIMISATI} = "-O3";
+       } else {
+               $config{OPTIMITEMP} = 0;
+               $config{OPTIMISATI} = "-g";
+       }
 }
 
 print "\n\033[1;32mPre-build configuration is complete!\033[0m\n\n";
@@ -689,12 +873,22 @@ print "\033[0mGCC Version Found:\033[1;32m\t\t$config{GCCVER}.x\033[0m\n";
 print "\033[0mOptimization Flag:\033[1;32m\t\t$config{OPTIMISATI}\033[0m\n";
 print "\033[0mCompiler program:\033[1;32m\t\t$config{CC}\033[0m\n";
 print "\033[0mStatic modules:\033[1;32m\t\t\t$config{STATIC_LINK}\033[0m\n";
-print "\033[0mMultithread DNS:\033[1;32m\t\t$config{THREADED_DNS}\033[0m\n";
 print "\033[0mIPv6 Support:\033[1;32m\t\t\t$config{IPV6}\033[0m\n";
 print "\033[0mIPv6 to IPv4 Links:\033[1;32m\t\t$config{SUPPORT_IP6LINKS}\033[0m\n";
 print "\033[0mGnuTLS Support:\033[1;32m\t\t\t$config{USE_GNUTLS}\033[0m\n";
 print "\033[0mOpenSSL Support:\033[1;32m\t\t$config{USE_OPENSSL}\033[0m\n\n";
 
+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);
+}
+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);
+}
+
 if ($config{USE_GNUTLS} eq "y") {
        $failed = 0;
        open(TMP, "<src/modules/m_ssl_gnutls.cpp") or $failed = 1;
@@ -703,16 +897,19 @@ if ($config{USE_GNUTLS} eq "y") {
                print "Symlinking src/modules/m_ssl_gnutls.cpp from extra/\n";
                chdir("src/modules");
                system("ln -s extra/m_ssl_gnutls.cpp");
+               system("ln -s extra/ssl_cert.h");
                chdir("../..");
        }
        getmodules();
-       $failed = 0;
-       open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
-       close(TMP);
-       open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
-       close(TMP);
-       if ($failed) {
-               print "SSL Certificates Not found, Generating.. \n\n
+       if ($interactive)
+       {
+               $failed = 0;
+               open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
+               close(TMP);
+               open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
+               close(TMP);
+               if ($failed) {
+                       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  *
@@ -720,15 +917,20 @@ if ($config{USE_GNUTLS} eq "y") {
 * few times and get that HD going :) Then answer the        *
 * Questions which follow. If you are unsure, just hit enter *
 *************************************************************\n\n";
-               system("certtool --generate-privkey --outfile key.pem");
-               system("certtool --generate-self-signed --load-privkey key.pem --outfile cert.pem");
-               print "\nCertificate generation complete, copying to config directory... ";
-               system("mv key.pem $config{CONFIG_DIR}/key.pem");
-               system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
-               print "Done.\n\n";
-       } else {
-               print "SSL Certificates found, skipping.\n\n"
-       }       
+                       system("certtool --generate-privkey --outfile key.pem");
+                       system("certtool --generate-self-signed --load-privkey key.pem --outfile cert.pem");
+                       print "\nCertificate generation complete, copying to config directory... ";
+                       system("mv key.pem $config{CONFIG_DIR}/key.pem");
+                       system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
+                       print "Done.\n\n";
+               } else {
+                       print "SSL Certificates found, skipping.\n\n"
+               }
+       }
+       else
+       {
+               print "Skipping SSL certificate generation\nin non-interactive mode.\n\n";
+       }
 } elsif ($config{USE_OPENSSL} eq "y") {
        $failed = 0;
        open(TMP, "<src/modules/m_ssl_openssl.cpp") or $failed = 1;
@@ -737,29 +939,37 @@ if ($config{USE_GNUTLS} eq "y") {
                print "Symlinking src/modules/m_ssl_openssl.cpp from extra/\n";
                chdir("src/modules");
                system("ln -s extra/m_ssl_openssl.cpp");
+               system("ln -s extra/ssl_cert.h");
                chdir("../..");
        }
        getmodules();
        $failed = 0;
-       open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
-       close(TMP);
-       open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
-       close(TMP);
-       if ($failed) {
-               print "SSL Certificates Not found, Generating.. \n\n
+       if ($interactive)
+       {
+               open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
+               close(TMP);
+               open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
+               close(TMP);
+               if ($failed) {
+                       print "SSL Certificates Not found, Generating.. \n\n
 *************************************************************
 * Generating the certificates may take some time, go grab a *
 * coffee, or something.                                     *
 *************************************************************\n\n";
-               system("openssl req -x509 -nodes -newkey rsa:1024 -keyout key.pem -out cert.pem");
-               system("openssl dhparam -out dhparams.pem 1024");
-               print "\nCertificate generation complete, copying to config directory... ";
-               system("mv key.pem $config{CONFIG_DIR}/key.pem");
-               system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
-               system("mv dhparams.pem $config{CONFIG_DIR}/dhparams.pem");
-               print "Done.\n\n";
-       } else {
-               print "SSL Certificates found, skipping.\n\n"
+                       system("openssl req -x509 -nodes -newkey rsa:1024 -keyout key.pem -out cert.pem");
+                       system("openssl dhparam -out dhparams.pem 1024");
+                       print "\nCertificate generation complete, copying to config directory... ";
+                       system("mv key.pem $config{CONFIG_DIR}/key.pem");
+                       system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
+                       system("mv dhparams.pem $config{CONFIG_DIR}/dhparams.pem");
+                       print "Done.\n\n";
+               } else {
+                       print "SSL Certificates found, skipping.\n\n"
+               }
+       }
+       else
+       {
+               print "Skipping SSL certificate generation\nin non-interactive mode.\n\n";
        }
 }
 if (($config{USE_GNUTLS} eq "n") && ($config{USE_OPENSSL} eq "n")) {
@@ -850,7 +1060,7 @@ sub dir_check {
                        if (($tmp eq "") || ($tmp =~ /^y/i)) {
                                # Attempt to Create the Dir..
                                
-                               print("mkdir -p \"$var\" >> /dev/null 2>&1");
+                               system("mkdir -p \"$var\" >> /dev/null 2>&1");
                                $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256;
                                if ($chk != 0) {
                                        print "Unable to create directory. ($var)\n\n";
@@ -878,8 +1088,8 @@ sub dir_check {
 
 sub getosflags {
        if ($config{OSNAME} =~ /BSD$/) {
-               $config{LDLIBS} = "-Ldl -lstdc++";
-               $config{FLAGS}  = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
+               $config{LDLIBS} = "-lstdc++";
+               $config{FLAGS}  = "-fPIC -Wall -Woverloaded-virtual $config{OPTIMISATI}";
                $config{MAKEPROG} = "gmake";
                if ($config{OSNAME} eq "OpenBSD") {
                        chomp($foo = `eg++ -dumpversion | cut -c 1`);
@@ -890,24 +1100,29 @@ sub getosflags {
                                $config{CC} = "eg++";
                                chomp($config{GCCVER}       = `eg++ -dumpversion | cut -c 1`); # we must redo these if we change the compiler path
                        }
+                       return "OpenBSD";
                }
+               return $config{OSNAME};
        } else {
                $config{LDLIBS} = "-ldl -lstdc++";
-               $config{FLAGS}  = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
+               $config{FLAGS}  = "-fPIC -Wall -Woverloaded-virtual $config{OPTIMISATI}";
                $config{MAKEPROG} = "make";
                if ($config{OSNAME} =~ /CYGWIN/) {
-                       $config{FLAGS}  = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
+                       $config{FLAGS}  = "-Wall -Woverloaded-virtual $config{OPTIMISATI}";
                        $config{LDLIBS} = "";
                        $config{MAKEPROG} = "/usr/bin/make";
                        $config{MAKEORDER} = "ircd mods";
+                       return "Cygwin";
                } elsif ($config{OSNAME} eq "CYG-STATIC") {
-                       $config{FLAGS} = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
+                       $config{FLAGS} = "-Wall -Woverloaded-virtual $config{OPTIMISATI}";
                        $config{LDLIBS} = "";
                        $config{MAKEPROG} = "/usr/bin/make";
                        $config{MAKEORDER} = "mods ircd";
                        $config{STATICLIBS} = "modules/mods.a";
                        $config{STATIC_LINK} = "yes";
+                       return "Cygwin-Static";
                }
+               return "Linux";
        }
        
        if ($config{OSNAME} =~ /SunOS/)
@@ -918,12 +1133,14 @@ sub getosflags {
                # rt = POSIX realtime extensions
                # resolv = inet_aton only (why isnt this in nsl?!)
                $config{LDLIBS} = $config{LDLIBS} . " -lsocket -lnsl -lrt -lresolv";
+               return "Solaris";
        }
        
        if($config{OSNAME} eq "MINGW32")
        {
                # All code is position-independent on windows
                $config{FLAGS} =~ s/-fPIC //;
+               return "MinGW";
        }
 }
 
@@ -1013,6 +1230,7 @@ sub writefiles {
 #define MAXGECOS $config{MAX_GECOS}
 #define MAXAWAY $config{MAX_AWAY}
 #define OPTIMISATION $config{OPTIMITEMP}
+#define LIBRARYDIR "$config{LIBRARY_DIR}"
 #define SYSTEM "$incos"
 #define MAXBUF 514
 EOF
@@ -1029,9 +1247,6 @@ EOF
                if ($config{OSNAME} eq "CYG-STATIC") {
                        print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE    1024\n#endif\n";
                }
-               if ($config{HAS_EXECINFO} eq "1") {
-                       print FILEHANDLE "#define HAS_EXECINFO\n";
-               }
                if ($config{STATIC_LINK} eq "yes") {
                        print FILEHANDLE "#define STATIC_LINK\n";
                }
@@ -1044,9 +1259,6 @@ EOF
                if ($config{HAS_STDINT} eq "true") {
                        print FILEHANDLE "#define HAS_STDINT\n";
                }
-               if ($config{THREADED_DNS} =~ /y/i) {
-                       print FILEHANDLE "#define THREADED_DNS\n";
-               }
                if ($config{IPV6} =~ /y/i) {
                        print FILEHANDLE "#define IPV6\n";
                }
@@ -1114,9 +1326,7 @@ EOF
        }
 
        opendir(DIRHANDLE, $this);
-       if ($config{THREADED_DNS} =~ /y/i) {
-               $config{LDLIBS} = $config{LDLIBS} . " -pthread";
-       }
+
        foreach $name (sort readdir(DIRHANDLE)) {
                if ($name =~ /^\.(.+)\.inc$/) {
                        $file = $1;
@@ -1193,15 +1403,17 @@ sub getlinkerflags {
        return undef;
 }
 
-sub show_splash {
-  print "'\033[1;33m####\033[0m:'\033[1;33m##\033[0m::: \033[1;33m##\033[0m::'\033[1;33m######\033[0m::'\033[1;33m########\033[0m::'\033[1;33m####\033[0m:'\033[1;33m########\033[0m:::'\033[1;33m######\033[0m::'\033[1;33m########\033[0m::\n";
-  print ". \033[1;33m##\033[0m:: \033[1;33m###\033[0m:: \033[1;33m##\033[0m:'\033[1;33m##\033[0m... \033[1;33m##\033[0m: \033[1;33m##\033[0m.... \033[1;33m##\033[0m:. \033[1;33m##\033[0m:: \033[1;33m##\033[0m.... \033[1;33m##\033[0m:'\033[1;33m##\033[0m... \033[1;33m##\033[0m: \033[1;33m##\033[0m.... \033[1;33m##\033[0m:\n";
-  print ": \033[1;33m##\033[0m:: \033[1;33m####\033[0m: \033[1;33m##\033[0m: \033[1;33m##\033[0m:::..:: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:: \033[1;33m##\033[0m:: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m: \033[1;33m##\033[0m:::..:: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:\n";
-  print ": \033[1;33m##\033[0m:: \033[1;33m##\033[0m \033[1;33m##\033[0m \033[1;33m##\033[0m:. \033[1;33m######\033[0m:: \033[1;33m########\033[0m::: \033[1;33m##\033[0m:: \033[1;33m########\033[0m:: \033[1;33m##\033[0m::::::: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:\n";
-  print ": \033[1;33m##\033[0m:: \033[1;33m##\033[0m. \033[1;33m####\033[0m::..... \033[1;33m##\033[0m: \033[1;33m##\033[0m.....:::: \033[1;33m##\033[0m:: \033[1;33m##\033[0m.. \033[1;33m##\033[0m::: \033[1;33m##\033[0m::::::: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:\n";
-  print ": \033[1;33m##\033[0m:: \033[1;33m##\033[0m:. \033[1;33m###\033[0m:'\033[1;33m##\033[0m::: \033[1;33m##\033[0m: \033[1;33m##\033[0m::::::::: \033[1;33m##\033[0m:: \033[1;33m##\033[0m::. \033[1;33m##\033[0m:: \033[1;33m##\033[0m::: \033[1;33m##\033[0m: \033[1;33m##\033[0m:::: \033[1;33m##\033[0m:\n";
-  print "'\033[1;33m####\033[0m: \033[1;33m##\033[0m::. \033[1;33m##\033[0m:. \033[1;33m######\033[0m:: \033[1;33m##\033[0m::::::::'\033[1;33m####\033[0m: \033[1;33m##\033[0m:::. \033[1;33m##\033[0m:. \033[1;33m######\033[0m:: \033[1;33m########\033[0m::\n";
-  print "\033[0m\033[0m....::..::::..:::......:::..:::::::::....::..:::::..:::......:::........:::\n\n";
+sub getdependencies {
+       my ($file) = @_;
+       open(FLAGS, $file);
+       while (<FLAGS>) {
+               if ($_ =~ /^\/\* \$ModDep: (.+) \*\/$/) {
+                       close(FLAGS);
+                       return $1;
+               }
+       }
+       close(FLAGS);
+       return undef;
 }
 
 sub resolve_directory {
@@ -1284,12 +1496,13 @@ HEADER
                if ($i !~ /_static$/) {
                        $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
                        $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
+                       $deps = getdependencies("src/modules/m_".$i.".cpp");
 
                        ###
                        # Write Entry to the Makefile
                        ###
                        print FILEHANDLE <<EOCHEESE;
-m_$i.o: .m_$i\_static.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h
+m_$i.o: .m_$i\_static.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h $deps
        \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c .m_$i\_static.cpp
        mv .m_$i\_static.o ../m_$i.o
 
@@ -1357,14 +1570,15 @@ EOF
        ###
        $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
        $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
+       $deps = getdependencies("src/modules/m_".$i.".cpp");
        print FILEHANDLE <<EOCHEESE;
-m_$i.so: m_$i.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h ../../include/inspircd_config.h ../../include/inspircd.h ../../include/configreader.h
+m_$i.so: m_$i.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h ../../include/inspircd_config.h ../../include/inspircd.h ../../include/configreader.h $deps
        \$(CC) -pipe -I../../include \$(FLAGS) $cmflags -export-dynamic -c m_$i.cpp
        \$(CC) \$(FLAGS) -shared $liflags -o m_$i.so m_$i.o $extra
 
 EOCHEESE
-       $crud = $crud . "       \@install -v -m 0700 m_$i.so \$(MODPATH)\n";
-       ###
+       $crud = $crud . "       install -m 0700 m_$i.so \$(MODPATH)\n";
+###
        # End Write Entry to the MakeFile
        ###
        }
@@ -1424,20 +1638,20 @@ elsif (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
 
        if ($config{OSNAME} =~ /CYGWIN/) {
                print FH <<EOM;
-all: timer.o aes.o command_parse.o cull_list.o userprocess.o socketengine.o socket.o hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o configreader.o inspsocket.o message.o $cmdobjs commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o snomasks.o inspircd.exe
+all: timer.o aes.o command_parse.o cull_list.o userprocess.o socketengine.o socket.o hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o configreader.o inspsocket.o $cmdobjs commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o snomasks.o inspircd.exe
 
 inspircd.exe: inspircd.dll.a
        \$(CC) -o \$@ \$^
 
-inspircd.dll inspircd.dll.a: inspircd.o channels.o mode.o xline.o inspstring.o dns.o base.o configreader.o inspsocket.o message.o $cmdobjs  commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o aes.o timer.o snomasks.o
+inspircd.dll inspircd.dll.a: inspircd.o channels.o mode.o xline.o inspstring.o dns.o base.o configreader.o inspsocket.o $cmdobjs  commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o aes.o timer.o snomasks.o
        \$(CC) -shared -Wl,--out-implib=inspircd.dll.a -o inspircd.dll \$^
 EOM
        } else {
                print FH <<EOM;
-all: timer.o aes.o command_parse.o cull_list.o userprocess.o socketengine.o socket.o hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o configreader.o inspsocket.o message.o $cmdobjs commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o snomasks.o \$(MODULES) inspircd.exe
+all: timer.o aes.o command_parse.o cull_list.o userprocess.o socketengine.o socket.o hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o configreader.o inspsocket.o $cmdobjs commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o snomasks.o \$(MODULES) inspircd.exe
 
 inspircd.exe: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h ../include/base.h
-       \$(CC) -I../include \$(FLAGS) inspircd.cpp -o inspircd.exe \$(LDLIBS) channels.o mode.o xline.o inspstring.o dns.o base.o inspsocket.o configreader.o message.o $cmdobjs commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o aes.o timer.o snomasks.o modes/modeclasses.a \$(MODULES)
+       \$(CC) -I../include \$(FLAGS) inspircd.cpp -o inspircd.exe \$(LDLIBS) channels.o mode.o xline.o inspstring.o dns.o base.o inspsocket.o configreader.o $cmdobjs commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o aes.o timer.o snomasks.o modes/modeclasses.a \$(MODULES)
 EOM
        }
 
@@ -1486,9 +1700,6 @@ base.o: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_conf
 configreader.o: configreader.cpp ../include/base.h ../include/configreader.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c configreader.cpp
 
-message.o: message.cpp ../include/base.h ../include/message.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
-       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
-
 commands.o: commands.cpp ../include/base.h ../include/commands.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h $srcobjs
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp $cmdobjs
 
@@ -1541,23 +1752,17 @@ sub write_dynamic_makefile {
        my $cmdobjs = "";
        my $srcobjs = "";
        foreach my $cmd (@cmdlist) {
-               $cmdobjs = $cmdobjs . "cmd_$cmd.o ";
+               $cmdobjs = $cmdobjs . "cmd_$cmd.so ";
                $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
        }
 
-if (($config{OSNAME} !~ /Linux/i) && ($config{HAS_EXECINFO} eq "1")) {
-       $extra = "-L/usr/local/lib -lexecinfo";
-} else {
-       $extra = "";
-}
-
-$se = "socketengine_select";
-if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
-       $se = "socketengine_kqueue";
-}
-elsif (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
-       $se = "socketengine_epoll";
-}
+       $se = "socketengine_select";
+       if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
+               $se = "socketengine_kqueue";
+       }
+       elsif (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
+               $se = "socketengine_epoll";
+       }
 
        open(FH,">src/Makefile") or die("Could not write src/Makefile");
        print FH <<EOM;
@@ -1574,10 +1779,10 @@ CXXFLAGS = -I../include \${FLAGS}
 CPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* //' | grep -v svn)
 RELCPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* /modes\\//' | grep -v svn)
 
-all: libIRCDtimer.so libIRCDaes.so libIRCDcull_list.so libIRCDuserprocess.so libIRCDsocketengine.so libIRCDsocket.so libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so libIRCDmessage.so $cmdobjs libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so libIRCDsnomasks.so inspircd
+all: libIRCDtimer.so libIRCDaes.so libIRCDcull_list.so libIRCDuserprocess.so libIRCDsocketengine.so libIRCDsocket.so libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so $cmdobjs libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so libIRCDsnomasks.so inspircd
 
-inspircd: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h ../include/socket.h libIRCDtimer.so libIRCDaes.so libIRCDcull_list.so libIRCDuserprocess.so libIRCDsocketengine.so libIRCDsocket.so libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so libIRCDmessage.so $cmdobjs libIRCDsnomasks.so libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so
-       \$(CC) -I../include $extra -Wl,--rpath -Wl,/usr/local/lib -Wl,--rpath -Wl,$config{LIBRARY_DIR} \$(FLAGS) -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so libIRCDmessage.so libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDhash.so libIRCDsocket.so libIRCDsocketengine.so libIRCDuserprocess.so libIRCDcull_list.so libIRCDcommand_parse.so libIRCDaes.so libIRCDtimer.so libIRCDsnomasks.so
+inspircd: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h ../include/socket.h libIRCDtimer.so libIRCDaes.so libIRCDcull_list.so libIRCDuserprocess.so libIRCDsocketengine.so libIRCDsocket.so libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so $cmdobjs libIRCDsnomasks.so libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so
+       \$(CC) -I../include $extra -Wl,--rpath -Wl,/usr/local/lib -Wl,--rpath -Wl,$config{LIBRARY_DIR} \$(FLAGS) -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDhash.so libIRCDsocket.so libIRCDsocketengine.so libIRCDuserprocess.so libIRCDcull_list.so libIRCDcommand_parse.so libIRCDaes.so libIRCDtimer.so libIRCDsnomasks.so
 
 libIRCDsocketengine.so: $se.cpp socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/$se.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp $se.cpp
@@ -1636,13 +1841,9 @@ libIRCDconfigreader.so: configreader.cpp ../include/base.h ../include/configread
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c configreader.cpp
        \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDconfigreader.so configreader.o
 
-libIRCDmessage.so: message.cpp ../include/base.h ../include/message.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
-       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
-       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmessage.so message.o
-
-libIRCDcommands.so: commands.cpp ../include/base.h ../include/commands.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h $srcobjs
+libIRCDcommands.so: commands.cpp ../include/base.h ../include/commands.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
-       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommands.so commands.o $cmdobjs
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommands.so commands.o
 
 libIRCDdynamic.so: dynamic.cpp ../include/base.h ../include/dynamic.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
@@ -1679,10 +1880,82 @@ libIRCDtimer.so: timer.cpp ../include/base.h ../include/inspircd.h ../include/gl
 EOM
        foreach my $cmd (@cmdlist) {
                print FH <<ITEM;
-cmd_$cmd.o: cmd_$cmd.cpp ../include/base.h ../include/modules.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/commands/cmd_$cmd.h
+cmd_$cmd.so: cmd_$cmd.cpp ../include/base.h ../include/modules.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/commands/cmd_$cmd.h
        \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
+       \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o cmd_$cmd.so cmd_$cmd.o
 
 ITEM
        }
        close(FH);
 }
+
+sub showhelp
+{
+       chomp($PWD = `pwd`);
+       print "Usage: configure [options]
+Options: [defaults in brackets after descriptions]
+
+When no options are specified, interactive
+configuration is started and you must specify
+any required values manually. If one or more
+options are specified, non-interactive configuration
+is started, and any omitted values are defaulted.
+
+Arguments with a single \"-\" symbol, as in
+InspIRCd 1.0.x, are also allowed.
+
+  --disable-interactive        Sets no options intself, but
+                               will disable any interactive prompting.
+  --update                     Update makefiles and dependencies
+  --modupdate                  Detect new modules and write makefiles
+  --svnupdate {rebuild}        Update working copy via subversion
+                               {and optionally rebuild it}
+  --clean                      Remove .config.cache file and go interactive
+  --enable-gnutls              Enable GnuTLS module [no]
+  --enable-openssl             Enable OpenSSL module [no]
+  --with-nick-length=[n]       Specify max. nick length [32]
+  --with-channel-length=[n]    Specify max. channel length [64]
+  --with-max-channels=[n]      Specify max. number of channels
+                               a normal user may join [20]
+  --with-max-oper-channels=[n] Specify max. number of channels
+                               an irc operator may join [60]
+  --with-max-clients=[n]       Specify maximum number of users
+                               which may connect locally
+  --enable-optimization=[n]    Optimize using -O[n] gcc flag
+  --enable-epoll               Enable epoll() where supported [set]
+  --enable-kqueue              Enable kqueue() where supported [set]
+  --disable-epoll              Do not enable epoll(), fall back
+                               to select() [not set]
+  --disable-kqueue             Do not enable kqueue(), fall back
+                               to select() [not set]
+  --enable-ipv6                Build ipv6 native InspIRCd [no]
+  --enable-remote-ipv6         Build with ipv6 support for remote
+                               servers on the network [yes]
+  --disable-remote-ipv6        Do not allow remote ipv6 servers [not set]
+  --with-cc=[filename]         Use an alternative g++ binary to
+                               build InspIRCd [g++]
+  --with-ident-length=[n]      Specify max length of ident [12]
+  --with-quit-length=[n]       Specify max length of quit [200]
+  --with-topic-length=[n]      Specify max length of topic [350]
+  --with-kick-length=[n]       Specify max length of kick [200]
+  --with-gecos-length=[n]      Specify max length of gecos [150]
+  --with-away-length=[n]       Specify max length of away [150]
+  --with-max-modes=[n]         Specify max modes per line which
+                               have parameters [20]
+  --prefix=[directory]         Base directory to install into (if defined,
+                               can automatically define config, module, bin
+                              and library dirs as subdirectories of prefix)
+                               [$PWD]
+  --config-dir=[directory]     Config file directory for config and SSL certs
+                               [$PWD/conf]
+  --module-dir=[directory]     Modules directory for loadable modules
+                               [$PWD/modules]
+  --binary-dir=[directory]     Binaries directory for core binary
+                               [$PWD/bin]
+  --library-dir=[directory]    Library directory for core libraries
+                               [$PWD/lib]
+  --help                       Show this help text and exit
+
+";
+       exit(0);
+}