]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - configure
Improve support for NetBSD
[user/henk/code/inspircd.git] / configure
index c3ce62e3c3c866251de8bd91172df69f341025d9..3f684df8ab2f09ffcc400aa99cedc620b385ec9b 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,9 +1,9 @@
-#!/usr/bin/perl
+#!/usr/bin/env perl
 ###################################################
 # InspIRCd Configuration Script
 #
-# Copyright 2002-2009 The InspIRCd Development Team
-#  http://www.inspircd.org/wiki/index.php/Credits
+# Copyright 2002-2010 The InspIRCd Development Team
+#  http://wiki.inspircd.org/Credits
 #
 # Licensed under GPL, please see the COPYING file
 # for more information
@@ -36,73 +36,18 @@ use make::configure;
 use make::gnutlscert;
 use make::opensslcert;
 
-###############################################################################################
-#
-#                                   EDITABLE VARIABLES
-#
-###############################################################################################
-
-# If you wish to ignore a dependency throughout the entire core, add it here.
-
-our @ignoredeps = (
-       "inspircd_win32wrapper.h",      # windows has its own configure program
-);
-
-# If you wish for all files in the entire core to have a given dependency, insert it here.
-# You should keep this to an absolute minimum to avoid rebuilds that are not neccessary.
-
-our @immutabledeps = (
-       "inspircd_config.h",            # auto re-generated by configure
-       "inspircd.h",
-);
-
 ###############################################################################################
 #
 #                                 NON-EDITABLE VARIABLES
 #
 ###############################################################################################
 
-# List of commands that make up 'make install' and 'make deinstall'
-
-our $install_list = "";
-our $uninstall_list = "";
-
-# This is a list of all files in the core. Each cpp file is mapped to a shared object file,
-# whos file extension is omitted (these can vary from system to system). Auto detected by
-# scanning the src/*.cpp files for files containing /* $Core */ identifiers.
-
-our %filelist = ();
-
-# If you wish for a file to have special dependencies in the makefile, add an entry here.
-# Auto populated by /* $ExtraDeps: */ instruction
-
-our %specialdeps = ();
-
-# If you wish for a file to have extra make lines (in between the compile and link steps)
-# then insert them here.
-# Auto populated by /* $ExtraBuild: */ instruction
-
-our %extrabuildlines = ();
-
-# If you wish for a file to be linked against extra objects or arctives, insert them here.
-# Auto populated by /* $ExtraObjects: */ instruction
-
-our %extraobjects = ();
-
-# If you wish to compile extra cpp sources into an object, define them here.
-# NOTE: Certain cpp files such as the socket engines have a value auto calculated
-# for this table so that their derived class is built.
-# Auto populated by /* $ExtraSources: */ instruction
-
-our %extrasources = ();
-
 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);
+    $opt_noipv6, $opt_maxbuf, $opt_disable_debug, $opt_freebsd_port,
+       $opt_system, $opt_uid);
 
-our ($opt_cc, $opt_base_dir, $opt_config_dir, $opt_module_dir, $opt_binary_dir,
-    $opt_library_dir);
+our ($opt_cc, $opt_base_dir, $opt_config_dir, $opt_module_dir, $opt_binary_dir);
 
 sub list_extras ();
 
@@ -116,6 +61,8 @@ 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,
@@ -124,9 +71,7 @@ GetOptions (
        '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,
+       'disable-ipv6' => \$opt_noipv6,
        'with-cc=s' => \$opt_cc,
        'with-maxbuf=i' => \$opt_maxbuf,
        'enable-freebsd-ports-openssl' => \$opt_freebsd_port,
@@ -134,16 +79,16 @@ GetOptions (
        '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 },
        'help'  => sub { showhelp(); },
-       'modupdate' => sub { modupdate(); },
        '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) {
@@ -153,12 +98,10 @@ if (scalar(@opt_enableextras) + scalar(@opt_disableextras) > 0) {
        disable_extras(@opt_disableextras);
        list_extras;
        print "Remember: YOU are responsible for making sure any libraries needed have been installed!\n";
-       print "Run $0 -modupdate after you've done this to update the makefiles.\n";
        exit 0;
 }
 
-our $non_interactive = (
-       (defined $opt_library_dir) ||
+our $interactive = !(
        (defined $opt_base_dir) ||
        (defined $opt_config_dir) ||
        (defined $opt_module_dir) ||
@@ -166,9 +109,7 @@ our $non_interactive = (
        (defined $opt_binary_dir) ||
        (defined $opt_nointeractive) ||
        (defined $opt_cc) ||
-       (defined $opt_ipv6) ||
-       (defined $opt_ipv6links) ||
-       (defined $opt_noipv6links) ||
+       (defined $opt_noipv6) ||
        (defined $opt_kqueue) ||
        (defined $opt_epoll) ||
        (defined $opt_ports) ||
@@ -177,46 +118,50 @@ our $non_interactive = (
        (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
+$config{ME} = resolve_directory($topdir);                              # Present Working Directory
 
-$config{BASE_DIR}         = $config{ME};
+$config{BASE_DIR} = $config{ME}."/run";
 
-if (defined $opt_base_dir)
-{
+if (defined $opt_base_dir) {
        $config{BASE_DIR} = $opt_base_dir;
+} elsif (defined $opt_system || defined $opt_uid) {
+       $config{BASE_DIR} = '/var/lib/inspircd';
 }
 
-$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_system || defined $opt_uid) {
+       $config{UID} = $opt_uid || 'ircd';
+       $config{CONFIG_DIR}      = '/etc/inspircd';
+       $config{MODULE_DIR}      = '/usr/lib/inspircd';
+       $config{BINARY_DIR}      = '/usr/sbin/';
+       $config{BUILD_DIR}       = resolve_directory($config{ME}."/build");         # Build Directory
+} else {
+       $config{UID} = $<;
+       $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{BUILD_DIR}       = resolve_directory($config{ME}."/build");         # Build 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;
-}
-chomp($config{HAS_GNUTLS}   = `libgnutls-config --version 2>/dev/null | cut -c 1,2,3`); # GNUTLS Version.
+chomp($config{HAS_GNUTLS}   = `pkg-config --modversion gnutls 2>/dev/null | cut -c 1,2,3`); # GNUTLS Version.
 
 if (defined $opt_freebsd_port)
 {
@@ -252,63 +197,34 @@ 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)
-{
+if (!defined $opt_disable_debug) {
        $config{OPTIMISATI}      = "-g1";                               # Optimisation Flag
-}
-else
-{
-       $config{OPTIMISATI}      = "-O2";                               # DEBUGGING OFF!
+} else {
+       $config{OPTIMISATI}      = "-O2";
 }
 
 $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)
-{
+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";
-}
 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{IPV6}         = "y";                                   # IPv6 support
+if (defined $opt_noipv6)
 {
-       $config{SUPPORT_IP6LINKS} = "y";
+       $config{IPV6} = "n";
 }
-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?
@@ -319,8 +235,6 @@ 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)
@@ -331,7 +245,6 @@ 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{MAKEORDER}             = "ircd mods";                          # build order
 $config{MAXBUF}                        = "512";                                # Max buffer size
 
 if ($config{HAS_OPENSSL} =~ /^([-[:digit:].]+)([a-z])?(\-[a-z][0-9])?$/) {
@@ -369,12 +282,10 @@ sub update
                } else {
                        # We've Loaded the cache file and all our variables..
                        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};
@@ -392,39 +303,6 @@ sub update
        exit;
 }
 
-sub modupdate
-{
-       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;
-               } else {
-                       # We've Loaded the cache file and all our variables..
-                       print "Updating files...\n";
-                       getosflags();
-                       $has_epoll = $config{HAS_EPOLL};
-                       $has_ports = $config{HAS_PORTS};
-                       $has_kqueue = $config{HAS_KQUEUE};
-                       writefiles(0);
-                       makecache();
-                       print "Complete.\n";
-                       exit;
-               }
-       };
-       if ($@)
-       {
-               print "Module update failed: $@\n";
-       }
-       exit;
-}
-
-
-
 sub svnupdate
 {
        my $fail = 0;
@@ -439,8 +317,6 @@ sub svnupdate
        }
        open my $fd, "-|", "svn update";
        my $configurechanged = 0; # Needs ./configure -update
-       my $coredirchanged = 0; # Needs ./configure -update
-       my $moduledirchanged = 0; # Needs ./configure -modupdate
        my $rootincchanged = 0;
        my @conflicted = ();
        while (defined(my $line = <$fd>))
@@ -456,14 +332,6 @@ sub svnupdate
                        {
                                $configurechanged = 1;
                        }
-                       elsif ($file =~ m#^src/modules#)
-                       {
-                               $moduledirchanged = 1;
-                       }
-                       elsif ($file =~ m#^src/#)
-                       {
-                               $coredirchanged = 1;
-                       }
                        elsif ($file =~ m/^\..*\.inc$/)
                        {
                                $rootincchanged = 1;
@@ -480,17 +348,6 @@ sub svnupdate
                                $rootincchanged = 1;
                        }
                }
-               elsif ($action eq "A" || $action eq "D")
-               {
-                       if ($file =~ m#^src/modules#)
-                       {
-                               $moduledirchanged = 1;
-                       }
-                       elsif ($file =~ m#^src/#)
-                       {
-                               $coredirchanged = 1;
-                       }
-               }
        }
        unless (close $fd) # close() waits for exit and returns false if the command failed
        {
@@ -507,18 +364,14 @@ sub svnupdate
        if (scalar(@conflicted) > 0)
        {
                print STDERR "\e[0;33;1mERROR:\e[0m You have local modifications which conflicted with the updates from SVN\n";
-               printf STDERR "Configure is not able to complete the update. Please resolve these conflicts, then run ./configure -%supdate\n", (($coredirchanged || $configurechanged) ? "" : "mod");
+               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 || $coredirchanged)
+       if ($configurechanged)
        {
                system("perl configure -update");
        }
-       elsif ($moduledirchanged || $rootincchanged)
-       {
-               system("perl configure -modupdate");
-       }
        else
        {
                print "No need to update Makefiles.\n";
@@ -529,11 +382,25 @@ sub svnupdate
        exit;
 }
 
+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;
+}
+
 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";
+$config{SYSTEM} = lc $^O;
+print "Checking operating system version... $config{SYSTEM}\n";
+
+$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`);
 
 printf "Checking if stdint.h exists... ";
 $config{HAS_STDINT} = "true";
@@ -582,69 +449,13 @@ if (!$fail) {
 print "yes\n" if $has_kqueue == 1;
 print "no\n" if $has_kqueue == 0;
 
-printf "Checking if epoll exists... ";
-$has_epoll = 0;
-$fail = 0;
-open(EPOLL, "</usr/include/sys/epoll.h") or $fail = 1;
-if (!$fail) {
-       $has_epoll = 1;
-       close(EPOLL);
-}
-if ($has_epoll) {
-       my $kernel = `uname -r`;
-       chomp($kernel);
-       if (($kernel =~ /^2\.0\./) || ($kernel =~ /^2\.2\./) || ($kernel =~ /^2\.4\./)) {
-               $has_epoll = 0;
-       }
-       else
-       {
-               # Suggestion from nenolod, weed out odd systems which have glibc built
-               # against 2.4 kernels (ick)
-               my $kernel_arch = `uname -p`;
-               chomp($kernel_arch);
-               my $libcv = 0.0;
-               my $kernelv = 0.0;
-               if ($kernel_arch =~ /x86_64/) {
-                       open (FH,"/lib64/libc.so.6|") or $has_epoll = 0;
-               }
-               else {
-                       open (FH,"/lib/libc.so.6|") or $has_epoll = 0;
-               }
-               if ($has_epoll)
-               {
-                       while (defined(my $line = <FH>))
-                       {
-                               chomp($line);
-                               if ($line =~ /GNU C Library .* version (.*?) /)
-                               {
-                                       $libcv = $1;
-                                       $libcv =~  /(\d+\.\d+)/;
-                                       $libcv = $1;
-                               }
-                               elsif ($line =~ /Compiled on a Linux (.*?\..*?)\.* system/)
-                               {
-                                       $kernelv = $1;
-                                       # Fix for some retarded libc builds, strip off >> and << etc.
-                                       $kernelv =~ /(\d+\.\d+)/;
-                                       $kernelv = $1;
-                               }
-                       }
-                       close FH;
-                       if ($libcv < 2.3)
-                       {
-                               $has_epoll = 0;
-                               printf "libc too old: $libcv... ";
-                       }
-                       if ($kernelv < 2.6)
-                       {
-                               $has_epoll = 0;
-                               printf "libc built against older kernel $kernelv... ";
-                       }
-               }
-       }
-}
-print "yes\n" if $has_epoll == 1;
-print "no\n" if $has_epoll == 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;
@@ -699,27 +510,18 @@ 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";
-               }
+               print "yes.\n";
+               print "FreeBSD 4.x is no longer supported. By ANYONE.\n";
+               print "To build, you will need to add the following to CXXFLAGS:\n";
+               print "\t-L/usr/local/lib -lgnugetopt -DHAVE_DECL_GETOPT=1\n";
        }
        else
        {
-               $config{CRAQ} = " ";
                print "no ($version)\n";
        }
 }
 else
 {
-       $config{CRAQ} = " ";
        print "no ($config{OSNAME})\n";
 }
 
@@ -793,13 +595,12 @@ should NOT be used. You should probably specify a newer compiler.\n\n";
                $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
        }
 
        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("do you want the build to take place", "BUILD_DIR");
 
        my $chose_hiperf = 0;
        if ($has_kqueue) {
@@ -825,7 +626,7 @@ should NOT be used. You should probably specify a newer compiler.\n\n";
        }
 
        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");
+               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?");
                if ($config{USE_POLL} ne "y")
                {
                        print "No high-performance socket engines are available, or you chose\n";
@@ -833,17 +634,9 @@ should NOT be used. You should probably specify a newer compiler.\n\n";
                }
        }
 
-       yesno('IPV6',"Would you like to build InspIRCd with IPv6 support?");
+       yesno('IPV6',"Would you like to build InspIRCd with IPv6 support?\nYou can still use IPv4 addresses in your port bindings.\n\nEnable IPv6?");
        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";
-       }
-
        $config{USE_FREEBSD_BASE_SSL} = "n";
        $config{USE_FREEBSD_PORTS_SSL} = "n";
        if ($config{HAS_OPENSSL_PORT} ne "")
@@ -867,6 +660,7 @@ should NOT be used. You should probably specify a newer compiler.\n\n";
        }
 
        $config{USE_SSL} = "n";
+       $config{MODUPDATE} = 'n';
 
        if ($config{HAS_GNUTLS} eq "y" || $config{HAS_OPENSSL} eq "y")
        {
@@ -900,6 +694,13 @@ should NOT be used. You should probably specify a newer compiler.\n\n";
                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";
        }
+
+       yesno('MODUPDATE',"Would you like to check for updates to third-party modules?");
+       print "\n";
+       if ($config{MODUPDATE} eq "y") {
+               print "Checking for upgrades to extra and third party modules... ";
+               system "./modulemanager upgrade";
+       }
 }
 
 dumphash();
@@ -916,13 +717,15 @@ if (($config{USE_OPENSSL} eq "y") && ($config{HAS_OPENSSL} ne "y"))
 }
 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"));
+
 if ($config{USE_GNUTLS} eq "y") {
        unless (-r "src/modules/m_ssl_gnutls.cpp") {
                print "Symlinking src/modules/m_ssl_gnutls.cpp from extra/\n";
                symlink "extra/m_ssl_gnutls.cpp", "src/modules/m_ssl_gnutls.cpp" or print STDERR "Symlink failed: $!";
        }
-       getmodules();
-       if ($interactive)
+       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
@@ -951,14 +754,15 @@ if ($config{USE_GNUTLS} eq "y") {
        {
                print "Skipping SSL certificate generation\nin non-interactive mode.\n\n";
        }
-} elsif ($config{USE_OPENSSL} eq "y") {
+}
+
+if ($config{USE_OPENSSL} eq "y") {
        unless (-r "src/modules/m_ssl_openssl.cpp") {
                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: $!";
        }
-       getmodules();
        $failed = 0;
-       if ($interactive)
+       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
@@ -985,17 +789,17 @@ if (($config{USE_GNUTLS} eq "n") && ($config{USE_OPENSSL} eq "n")) {
        print "Skipping SSL Certificate generation, SSL support is not available.\n\n";
 }
 
-getosflags();
+depcheck();
 writefiles(1);
 makecache();
 
 print "\n\n";
-print "To build your server with these settings, please type '\e[1;32m$config{MAKEPROG}\e[0m' now.\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://www.inspircd.org/wiki/Installation_From_Tarball\e[0m\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++")) {
@@ -1099,77 +903,10 @@ 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}  = "-fPIC -Woverloaded-virtual -Wshadow -Wformat=2 -Wmissing-format-attribute -Wall $config{OPTIMISATI}";
-       $config{DEVELOPER} = "-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}  = "-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{MAKEPROG} = "make";
-       }
-
-       if ($config{OSNAME} =~ /FreeBSD/i) {
-               $config{FLAGS}  .= " " . $ENV{CXXFLAGS} if exists($ENV{CXXFLAGS});
-               $config{LDLIBS} .= " " . $ENV{LDLIBS} if exists($ENV{LDLIBS});
-       }
-
-       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) = @_;
-       my $se = "";
        # First File.. inspircd_config.h
        chomp(my $incos = `uname -n -s -r`);
        chomp(my $version = `sh src/version.sh`);
@@ -1177,7 +914,7 @@ sub writefiles {
        if ($writeheader == 1)
        {
                print "Writing \e[1;32minspircd_config.h\e[0m\n";
-               open(FILEHANDLE, ">include/inspircd_config.h");
+               open(FILEHANDLE, ">include/inspircd_config.h.tmp");
                print FILEHANDLE <<EOF;
 /* Auto generated by configure, do not modify! */
 #ifndef __CONFIGURATION_AUTO__
@@ -1187,14 +924,8 @@ sub writefiles {
 #define CoreExport /**/
 #define DllExport /**/
 
-#define CONFIG_FILE "$config{CONFIG_DIR}/inspircd.conf"
 #define MOD_PATH "$config{MODULE_DIR}"
-#define VERSION "$version"
-#define REVISION "$revision2"
 #define SOMAXCONN_S "$config{_SOMAXCONN}"
-#define OPTIMISATION $config{OPTIMITEMP}
-#define LIBRARYDIR "$config{LIBRARY_DIR}"
-#define SYSTEM "$incos"
 #define ENTRYPOINT int main(int argc, char** argv)
 
 EOF
@@ -1225,23 +956,23 @@ print FILEHANDLE "#define MAXBUF " . ($config{MAXBUF}+2) . "\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";
-                       $se = "socketengine_kqueue";
+                       $config{SOCKETENGINE} = "socketengine_kqueue";
                        $use_hiperf = 1;
                }
                if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
                        print FILEHANDLE "#define USE_EPOLL\n";
-                       $se = "socketengine_epoll";
+                       $config{SOCKETENGINE} = "socketengine_epoll";
                        $use_hiperf = 1;
                }
                if (($has_ports) && ($config{USE_PORTS} eq "y")) {
                        print FILEHANDLE "#define USE_PORTS\n";
-                       $se = "socketengine_ports";
+                       $config{SOCKETENGINE} = "socketengine_ports";
                        $use_hiperf = 1;
                }
                # user didn't choose either epoll or select for their OS.
@@ -1251,54 +982,48 @@ print FILEHANDLE "#define MAXBUF " . ($config{MAXBUF}+2) . "\n";
                        if ($config{USE_POLL} eq "y")
                        {
                                print FILEHANDLE "#define USE_POLL\n";
-                               $se = "socketengine_poll";
+                               $config{SOCKETENGINE} = "socketengine_poll";
                        }
                        else
                        {
                                print FILEHANDLE "#define USE_SELECT\n";
-                               $se = "socketengine_select";
+                               $config{SOCKETENGINE} = "socketengine_select";
                        }
                }
                print FILEHANDLE "\n#include \"threadengines/threadengine_pthread.h\"\n\n#endif\n";
                close(FILEHANDLE);
-       }
 
-       if ($writeheader)
-       {
-               open(FILEHANDLE, ">include/inspircd_se_config.h");
+               open(FILEHANDLE, ">include/inspircd_version.h.tmp");
                print FILEHANDLE <<EOF;
-/* Auto generated by configure, do not modify or commit to svn! */
-#ifndef __CONFIGURATION_SOCKETENGINE__
-#define __CONFIGURATION_SOCKETENGINE__
-
-#include "socketengines/$se.h"
-
-#endif
+#define VERSION "$version"
+#define REVISION "$revision2"
+#define SYSTEM "$incos"
 EOF
-               close(FILEHANDLE);
-       }
-
-
-       # Create a Modules List..
-       my $modules = "";
-       foreach my $i (@modlist)
-       {
-               $modules .= "m_".$i.".so ";
-       }
-       chomp($modules);   # Remove Redundant whitespace..
-
-       opendir(DIRHANDLE, "src/modules");
-       foreach my $name2 (sort readdir(DIRHANDLE)) {
-               if ($name2 =~ /^m_(.+?)$/) {
-                       if (defined(opendir(MDIRHANDLE, "src/modules/$name2"))) {
-                               closedir(MDIRHANDLE);
-                               $modules .= "$name2.so ";
-                               $uninstall_list = $uninstall_list . "   -rm \$(MODULES)/$name2.so\n";
+               close FILEHANDLE;
+
+               for my $file (qw(include/inspircd_config.h include/inspircd_version.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";
                        }
                }
        }
-       closedir(DIRHANDLE);
-
 
        # Write all .in files.
        my $tmp = "";
@@ -1316,242 +1041,82 @@ EOF
 
        # 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";
-       write_dynamic_modules_makefile();
-       write_dynamic_makefile();
-
-       opendir(DIRHANDLE, $this);
-
-       foreach my $name (sort readdir(DIRHANDLE)) {
-               if ($name =~ /^\.(.+)\.inc$/) {
-                       $file = $1;
+       my @dotfiles = qw(main.mk inspircd);
+       push @dotfiles, 'org.inspircd.plist' if $config{OSNAME} eq 'darwin';
 
-                       # Bug #353, omit this on non-darwin
-                       next if (($config{OSNAME} !~ /darwin/) && ($file eq "org.inspircd.plist"));
-
-                       # All .name.inc files need parsing!
-                       $tmp = "";
-                       open(FILEHANDLE, ".$file.inc") or die ("Can't open .$file.inc");
-                       while (<FILEHANDLE>) {
-                               $tmp .= $_;
-                       }
-                       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} ||= resolve_directory($config{ME}."/build");
+
+               for my $var (qw(
+                       CC SYSTEM BASE_DIR CONFIG_DIR MODULE_DIR BINARY_DIR BUILD_DIR UID
+                       STARTSCRIPT DESTINATION EXTRA_DIR SOCKETENGINE
+               )) {
+                       s/\@$var\@/$config{$var}/g;
+               }
+               s/\@EXECUTABLE\@/$exe/ if defined $exe;
+               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/\@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/\@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";
-                       $tmp =~ s/\@CC\@/$config{CC}/ if defined $config{CC};
-                       $tmp =~ s/\@MAKEPROG\@/$config{MAKEPROG}/ if defined $config{MAKEPROG};
-                       $tmp =~ s/\@FLAGS\@/$config{FLAGS}/ if defined $config{FLAGS};
-                       $tmp =~ s/\@DEVELOPER\@/$config{DEVELOPER}/ if defined $config{DEVELOPER};
-                       $tmp =~ s/\@LDLIBS\@/$config{LDLIBS}/ if defined $config{LDLIBS};
-                       $tmp =~ s/\@BASE_DIR\@/$config{BASE_DIR}/ if defined $config{BASE_DIR};
-                       $tmp =~ s/\@CONFIG_DIR\@/$config{CONFIG_DIR}/ if defined $config{CONFIG_DIR};
-                       $tmp =~ s/\@MODULE_DIR\@/$config{MODULE_DIR}/ if defined $config{MODULE_DIR};
-                       $tmp =~ s/\@BINARY_DIR\@/$config{BINARY_DIR}/ if defined $config{BINARY_DIR};
-                       $tmp =~ s/\@LIBRARY_DIR\@/$config{LIBRARY_DIR}/ if defined $config{LIBRARY_DIR};
-                       $tmp =~ s/\@MODULES\@/$modules/ if defined $modules;
-                       $tmp =~ s/\@STARTSCRIPT\@/$config{STARTSCRIPT}/ if defined $config{STARTSCRIPT};
-                       $tmp =~ s/\@DESTINATION\@/$config{DESTINATION}/ if defined $config{DESTINATION};
-                       $tmp =~ s/\@EXTRA_DIR\@/$config{EXTRA_DIR}/ if defined $config{EXTRA_DIR};
-                       $tmp =~ s/\@EXECUTABLE\@/$exe/ if defined $exe;
-                       $tmp =~ s/\@MAKEORDER\@/$config{MAKEORDER}/ if defined $config{MAKEORDER};
-                       $tmp =~ s/\@VERSION\@/$version/ if defined $version;
-                       $tmp =~ s/\@INSTALL_LIST\@/$install_list/ if defined $install_list;
-                       $tmp =~ s/\@UNINSTALL_LIST\@/$uninstall_list/ if defined $uninstall_list;
-
                        open(FILEHANDLE, ">$file") or die("Can't write to $file: $!\n");
-                       print FILEHANDLE $tmp;
-               }
-       }
-       closedir(DIRHANDLE);
-
-       # Make inspircd executable!
-       chmod 0744, 'inspircd';
-}
-
-sub write_dynamic_modules_makefile {
-       # Modules Makefile..
-       print "Writing \e[1;32msrc/modules/Makefile\e[0m\n";
-       open(FILEHANDLE, ">src/modules/Makefile");
-
-###
-# Module Makefile Header
-###
-       print FILEHANDLE <<EOF;
-###################################################
-# Copyright 2002-2009 The InspIRCd Development Team
-#  http://www.inspircd.org/wiki/index.php/Credits
-#
-# Thanks to Andrew Church <achurch\@achurch.org>
-#   for assisting with making this work right.
-#
-# Automatically Generated by ./configure to add a
-#  modules please run ./configure -modupdate
-###################################################
-
-all: \$(MODULES)
-
-EOF
-
-if ($config{OSNAME} =~ /darwin/) {
-               print FILEHANDLE <<EOCHEESE;
-
-PICLDFLAGS = -twolevel_namespace -undefined dynamic_lookup -bundle
-
-EOCHEESE
-} else {
-               print FILEHANDLE <<EOCHEESE;
-
-PICLDFLAGS = -fPIC -DPIC -shared
-
-EOCHEESE
-}
-
-       ###
-       # End Module Makefile Header
-       ###
-
-       # Create a Modules List..
-       my $modules = "";
-       my $cmflags = "";
-       my $liflags = "";
-       foreach my $i (@modlist) {
-               ###
-               # Write Entry to the MakeFile
-               ###
-               $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
-               $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
-               my $deps = getdependencies("src/modules/m_".$i.".cpp");
-
-               #print "file: $i: cmflags=$cmflags; liflags=$liflags; deps=$deps\n";
-
-
-               if (nopedantic("src/modules/m_".$i.".cpp"))
-               {
-                       print FILEHANDLE "
-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
-       \@../../make/run-cc.pl \$(CC) -pipe -I../../include \$(NICEFLAGS) $cmflags \$(PICLDFLAGS) $liflags $SHARED -o m_$i.so m_$i.cpp
-";
-               }
-               else
-               {
-                       print FILEHANDLE "
-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
-       \@../../make/run-cc.pl \$(CC) -pipe -I../../include \$(FLAGS) $cmflags \$(PICLDFLAGS) $liflags $SHARED -o m_$i.so m_$i.cpp
-";
-               }
-               $install_list = $install_list . "       install -m \$(INSTMODE) src/modules/m_$i.so \$(MODPATH)\n";
-               $uninstall_list = $uninstall_list . "   -rm \$(MODULES)/m_$i.so\n";
-               ###
-               # End Write Entry to the MakeFile
-               ###
-       }
-
-       opendir(DIRHANDLE, "src/modules");
-       foreach my $name (sort readdir(DIRHANDLE)) {
-               if ($name =~ /^m_(.+?)$/) {
-                       $mfrules = "";
-                       $mobjs = "";
-                       $mliflags = "";
-                       $mfcount = 0;
-                       # A module made of multiple files, in a dir, e.g. src/modules/m_spanningtree/
-                       if (defined(opendir(MDIRHANDLE, "src/modules/$name"))) {
-                               read_module_directory("src/modules/$name", $name);
-                               print "Composing Makefile rules for directory \e[1;32m$name\e[0m... (\e[1;32m$mfcount files found\e[0m)\n";
-                               print FILEHANDLE "$name.so: ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h ../../include/inspircd_config.h ../../include/inspircd.h ../../include/configreader.h $mobjs\n";
-                               print FILEHANDLE "      \@../../make/run-cc.pl \$(CC) -pipe \$(FLAGS) $SHARED $mliflags -o $name.so $mobjs\n";
-                               print FILEHANDLE "\n$mfrules\n";
-                               closedir(MDIRHANDLE);
-                               $install_list = $install_list . "       install -m \$(INSTMODE) src/modules/$name.so \$(MODPATH)\n";
-                       }
+                       print FILEHANDLE $_;
+                       close(FILEHANDLE);
                }
        }
-       closedir(DIRHANDLE);
-}
-
-sub read_module_directory {
-       my ($dpath, $reldpath) = @_;
-
-       if (opendir(MDIRHANDLE, $dpath) == 0) {
-               return;
-       }
 
-       foreach my $fname (sort readdir(MDIRHANDLE)) {
-               if ($fname =~ /\.cpp$/) {
-                       my $cmflags = getcompilerflags("$dpath/$fname");
-                       $mliflags = $mliflags . " " . getlinkerflags("$dpath/$fname");
-                       my $deps = getdependencies("$dpath/$fname");
-                       my $oname = $fname;
-                       $oname =~ s/\.cpp$/.o/g;
-                       $mfrules = $mfrules .  "$reldpath/$oname: $reldpath/$fname ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h ../../include/inspircd_config.h ../../include/inspircd.h ../../include/configreader.h $deps\n";
-                       $mfrules = $mfrules .  "        \@../../make/run-cc.pl \$(CC) -pipe -I../../include -I. \$(FLAGS) $cmflags $SHARED -o $reldpath/$oname -c $reldpath/$fname\n\n";
-                       $mobjs = $mobjs . " $reldpath/$oname";
-                       $mfcount++;
-               }
-               elsif ((-d "$dpath/$fname") && !($fname eq ".") && !($fname eq "..")) {
-                       read_module_directory($dpath."/".$fname, $reldpath."/".$fname);
-               }
-       }
+       chmod 0755, 'inspircd';
 }
 
-sub calcdeps($)
+sub depcheck
 {
-       # Yes i know we could use gcc -M but it seems to ideneify a lot of 'deep'
-       # dependencies which are not relevent in C++.
-
-       my $file = $_[0];
-
-       open (CPP, "<$file") or die("Can't open $file for reading!");
-
-       my %dupe = ();
-       my $retlist = "";
-
-       foreach my $d (@ignoredeps)
-       {
-               $dupe{$d} = 1;
-       }
-
-       my $immutable = "";
-       foreach my $dep (@immutabledeps)
-       {
-               $immutable = $immutable . "../include/$dep ";
-       }
-       $immutable =~ s/ $//g;
-
-       while (defined(my $line = <CPP>))
-       {
-               chomp($line);
-               if ($line =~ /#include "(.+\.h)"/)
-               {
-                       if (!exists($dupe{$1}))
-                       {
-                               $retlist = $retlist . "../include/$1 ";
-                               $dupe{$1} = 1;
-                       }
-               }
+       getmodules();
+       for my $mod (@modlist) {
+               getcompilerflags("src/modules/m_$mod.cpp");
+               getlinkerflags("src/modules/m_$mod.cpp");
        }
-       close CPP;
-       return length($immutable) ? $immutable . " " . $retlist : $retlist;
 }
 
-sub write_dynamic_makefile
+sub prepare_dynamic_makefile
 {
        my $i = 0;
-       my @cmdlist = ();
-       my %existing_install_list = ();
-       my %core_files_list = ();
-
-       opendir(DIRHANDLE, "src/commands");
-       foreach my $name (sort readdir(DIRHANDLE))
-       {
-               if ($name =~ /^cmd_(.+)\.cpp$/)
-               {
-                       $cmdlist[$i++] = $1;
-                       $install_list = $install_list . "       -install -m \$(INSTMODE) src/commands/cmd_" . $1 . ".so \$(LIBPATH)\n";
-                       $uninstall_list = $uninstall_list . "   -rm \$(LIBPATH)/cmd_$1.so\n";
-               }
-       }
-       closedir(DIRHANDLE);
 
        if (!$has_epoll)
        {
@@ -1565,216 +1130,6 @@ sub write_dynamic_makefile
        {
                $config{USE_PORTS} = 0;
        }
-
-       # formerly generated below this foreach, now it's not! magic.
-       my $all_core = "";
-
-       foreach my $dir (("src","src/commands","src/modes","src/socketengines","src/modules"))
-       {
-               print "Scanning \e[1;32m$dir\e[0m for core files ";
-               opendir(DIRHANDLE, $dir);
-               foreach my $name (sort readdir(DIRHANDLE))
-               {
-                       if ($name =~ /\.cpp$/)
-                       {
-                               open (CPP, "<$dir/$name") or die("Can't open $dir/$name to scan it! oh bugger");
-                               print ".";
-                               while (defined(my $line = <CPP>))
-                               {
-                                       chomp($line);
-                                       if ($line =~ /\/\* \$Core \*\//i)
-                                       {
-                                               my $sname = $name;
-                                               $sname =~ s/\.cpp$/.o/;
-
-                                               # append it to list to be built
-                                               $all_core = $all_core . $sname . " ";
-                                               $filelist{$name} = $sname;
-
-                                               # mark it as a core file, so it won't get shared object cflags
-                                               if (!exists($core_files_list{$name}))
-                                               {
-                                                       $core_files_list{$name} = 1;
-                                               }
-                                       }
-                                       elsif ($line =~ /\/\* \$ExtraDeps: (.*?) \*\//i)
-                                       {
-                                               $specialdeps{$name} = $1;
-                                       }
-                                       elsif ($line =~ /\/\* \$ExtraObjects: (.*?) \*\//i)
-                                       {
-                                               $extraobjects{$name} = $1;
-                                       }
-                                       elsif ($line =~ /\/\* \$ExtraBuild: (.*?) \*\//i)
-                                       {
-                                               $extrabuildlines{$name} = $1;
-                                       }
-                                       elsif ($line =~ /\/\* \$ExtraSources: (.*?) \*\//i)
-                                       {
-                                               $extrasources{$name} = $1;
-                                               }
-                                       elsif ($line =~ /\/\* \$If: (\w+) \*\//i)
-                                       {
-                                               if (defined $config{$1})
-                                               {
-                                                       if (($config{$1} !~ /y/i) and ($config{$1} ne "1"))
-                                                       {
-                                                               # Skip to 'endif'
-                                                               while (defined($line = <CPP>))
-                                                               {
-                                                                       chomp($line);
-                                                                       die ("\$If buildsystem instruction within another \$If in file $dir/$name") if ($line =~ /\/\* \$If: (\w+) \*\//i);
-                                                                       last if ($line =~ /\/\* \$EndIf \*\//i);
-                                                               }
-                                                       }
-                                               }
-                                       }
-                                       elsif ($line =~ /\/\* \$Install: (.*?) \*\//i)
-                                       {
-                                               if (!exists($existing_install_list{$1}))
-                                               {
-                                                       $existing_install_list{$1} = 1;
-                                                       my $idir = (split(' ',$1))[1];
-                                                       my $ifile = (split(' ',$1))[0];
-                                                       $install_list = $install_list . "       -install -m \$(INSTMODE) $1\n";
-                                                       $ifile =~ s/.*\///g;
-                                                       $uninstall_list = $uninstall_list . "   -rm $idir/$ifile\n";
-                                               }
-                                       }
-                                       elsif ($line =~ /\/\* \$CopyInstall: (.*?) \*\//i)
-                                       {
-                                               if (!exists($existing_install_list{$1}))
-                                               {
-                                                       $existing_install_list{$1} = 1;
-                                                       my $idir = (split(' ',$1))[1];
-                                                       my $ifile = (split(' ',$1))[0];
-                                                       $install_list = $install_list . "       -cp $1\n";
-                                                       $ifile =~ s/.*\///g;
-                                                       $uninstall_list = $uninstall_list . "   -rm $idir/$ifile\n";
-                                               }
-                                       }
-                               }
-                               close CPP;
-                       }
-               }
-               closedir(DIRHANDLE);
-               print " done!\n";
-       }
-
-       # modes need to be compiled in too
-       $all_core = $all_core . "modes/modeclasses.a";
-
-       my $freebsd4libs = (defined $config{CRAQ} ? $config{CRAQ} : "");
-
-       my $libraryext = "";
-       my $binary_rule = "";
-
-       if ($config{IS_DARWIN} eq "YES")
-       {
-               $libraryext = "dylib";
-               $binary_rule = "        \@../make/run-cc.pl \$(CC) -pipe -I../include \$(FLAGS) -c inspircd.cpp\n       \@../make/run-cc.pl \$(CC) -pipe -dynamic -bind_at_load -L. -o inspircd \$(LDLIBS) inspircd.o "
-       }
-       else
-       {
-               $libraryext = "so";
-               $binary_rule = "        \@../make/run-cc.pl \$(CC) -pipe -I../include \$(FLAGS) $freebsd4libs -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) ";
-       }
-
-       open(FH,">src/Makefile") or die("Could not write src/Makefile");
-       print FH <<EOM;
-
-CC = im a cheezeball
-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)
-
-EOM
-
-       my $buildstring = "";
-       my $deps = "";
-
-       foreach my $cpp (sort keys %filelist)
-       {
-               my $objs = $cpp;
-               my $rawcpp = $cpp;
-               $objs =~ s/\.cpp$/.o/;
-               if (exists($extraobjects{$cpp}))
-               {
-                       $objs = $objs . " " . $extraobjects{$cpp};
-                       $all_core = $all_core . " " . $extraobjects{$cpp};
-               }
-               if (exists($extrasources{$cpp}))
-               {
-                       $rawcpp = $rawcpp . " " . $extrasources{$cpp};
-               }
-
-               $deps = calcdeps("src/$cpp");
-               if (exists($extrasources{$cpp}))
-               {
-                       foreach my $seperate (sort split(' ',$extrasources{$cpp}))
-                       {
-                               my $d = calcdeps("src/$extrasources{$cpp}") . " ";
-                               if ($d ne "")
-                               {
-                                       $deps = $deps . $d . " ";
-                               }
-                       }
-               }
-               $buildstring = $buildstring . $objs . ": $cpp $deps ". (defined($specialdeps{$cpp}) ? $specialdeps{$cpp} : "") . "\n";
-
-               if (exists($core_files_list{$cpp}))
-               {
-                       # core files are statically linked into the binary and do not require $SHARED shared libs switches
-                       $buildstring = $buildstring . " \@../make/run-cc.pl \$(CC) -pipe -I../include \$(FLAGS) -c $rawcpp\n";
-               }
-               else
-               {
-                       $buildstring = $buildstring . " \@../make/run-cc.pl \$(CC) -pipe -I../include \$(FLAGS) $SHARED -c $rawcpp\n";
-               }
-
-               if (exists($extrabuildlines{$cpp}))
-               {
-                       $buildstring = $buildstring . " " . $extrabuildlines{$cpp} . "\n";
-               }
-       }
-
-       print FH "all: inspircd moo\n\n\n";
-
-       $deps = calcdeps("src/inspircd.cpp");
-       print FH "inspircd: inspircd.cpp $deps $all_core\n";
-       print FH "$binary_rule $all_core\n\n";
-
-       print FH $buildstring;
-       print FH "moo:\n        \@\${MAKE} -C \"commands\" DIRNAME=\"src/commands\" CC=\"\$(CC)\" \$(MAKEARGS)\n\n";
-
-       # close main makefile
-       close(FH);
-
-       my $cmdobjs = "";
-       # generate a list of .so
-       foreach my $cmd (@cmdlist) {
-               $cmdobjs = $cmdobjs . "cmd_$cmd.so ";
-       }
-
-       # and now reopen the commands makefile
-       open(FH,">src/commands/Makefile") or die("Could not write src/commands/Makefile");
-       print FH <<ITEM;
-CC = i am cornholio
-CXXFLAGS = -I../../include \${FLAGS}
-
-all: $cmdobjs
-
-
-ITEM
-
-       # now print the command file detail
-       foreach my $cmd (@cmdlist) {
-               print FH <<ITEM;
-cmd_$cmd.so: cmd_$cmd.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/commands/cmd_$cmd.h
-       \@../../make/run-cc.pl \$(CC) -pipe -I../../include \$(FLAGS) $SHARED -o cmd_$cmd.so cmd_$cmd.cpp
-
-ITEM
-       }
 }
 
 # Routine to list out the extra/ modules that have been enabled.