]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - configure
Changed to fix minor typo in dynamic-build makefile
[user/henk/code/inspircd.git] / configure
index 393943ef61b876e6c2fd468952a187191f8026b7..30cf348cfd3835cdd0b6bc046bd74124e05c4219 100755 (executable)
--- a/configure
+++ b/configure
-#!/bin/sh
+#!/usr/bin/perl
 # InspIRCd Configuration Script
 #
 # Copyright 2003 The ChatSpike Development Team
 # <brain@chatspike.net>
 # <Craig@chatspike.net>
 #
-# $Id$
+# [14:21] Brain: <matrix impression> i know perl-fu!
 #
+# $Id$
 #
 ########################################
 
-echo "Configuring default values..."
-
-ME=`pwd`
-GCCVER=`gcc -dumpversion | cut -c 1`
-GCC34=`gcc -dumpversion | cut -c 3`
-CONFIG_DIR=$ME/conf
-MODULE_DIR=$ME/modules
-BINARY_DIR=$ME/bin
-INSTALL=`which install`
-OPTIMITEMP=0
-OPTIMISATI="-g"
-MAX_CLIENT_T=`ulimit -n`
-NICK_LENGT=32
-CHAN_LENGT=64
-MAX_CHANNE=20
-MAXI_MODES=20
-OSNAME=`(uname -s) 2>/dev/null` || OSNAME="unknown"
-
-if [ -z $MAX_CLIENT_T ] ; then
-        MAX_CLIENT_T=1024
-        SCAN_FAILED=1
-fi
-
-
-if [ "$1" = "-clean" -o "$2" = "-clean" ] ; then
-  `rm -rf .config.cache`
-fi
-
-if [ -e ".config.cache" -a -z "$CLEAN" ] ; then
-    . .config.cache 
-fi
-
-if [ "$1" = "-update" -o "$2" = "-update" ] ; then
-   # They wanna update their Makefile.. good for 'em
-   # Make sure .config.cache exists
-   if [ ! -e ".config.cache" ] ; then
-     echo "You have not run ./configure before. Please do this before trying to run the update script."
-     exit 0
-   fi
-   # Right, load the cache values
-   . .config.cache
-   # Check for modules
-
-   case "$OSNAME" in
-           (FreeBSD)
-                   LDLIBS="-Ldl"
-                   FLAGS="-fPIC -frtti $OPTIMISATI"
-                   MAKEPROG="gmake"
-                   ;;
-           (*)
-                   LDLIBS="-ldl"
-                   FLAGS="-fPIC -frtti $OPTIMISATI"
-                   MAKEPROG="make"
-                   ;;
-   esac
-
-   MODULES=""
-   for module in src/modules/*.cpp ; do
-           mod=`echo $module | sed 's/.cpp/.so/' | sed 's/src\/modules\///'`
-           MODULES="$MODULES $mod"
-   done
-
-   # Write the new makefile.
-   . .Makefile.inc
-   echo "Complete."
-   exit 1; 
-fi
-
-
-if [ -z $MAX_CLIENT ] ; then
-        MAX_CLIENT=$MAX_CLIENT_T
-fi
-
-
-c=""
-n=""
-if [ "`eval echo -e -n 'a'`" = "-n a" ] ; then
-        c="\c"
-else
-        n="-n"
-fi
-
-exists () { # because some shells don't have test -e
-    if [ -f $1 -o -d $1 -o -p $1 -o -c $1 -o -b $1 ] ; then
-       return 0
-    else
-       return 1
-    fi
+chomp($topdir = `pwd`);
+$this = resolve_directory($topdir);                                            # PWD, Regardless.
+@modlist = ();                                                                 # Declare for Module List..
+%config = ();                                                                  # Initiate Configuration Hash..
+$config{ME}                 = resolve_directory($topdir);                      # Present Working 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{OPTIMITEMP}         = "0";                                             # Default Optimisation Value
+$config{OPTIMISATI}         = "-g";                                            # Optimisation Flag
+$config{NICK_LENGT}         = "32";                                            # Default Nick Length
+$config{CHAN_LENGT}         = "64";                                            # Default Channel Name Length
+$config{MAX_CHANNE}         = "20";                                            # Default Max. Channels per user..
+$config{MAXI_MODES}         = "20";                                            # Default Max. Number of Modes set at once.
+$config{HAS_STRLCPY}        = "false";                                         # strlcpy Check.
+$config{USE_KQUEUE}         = "y";                                             # kqueue enabled
+$config{USE_EPOLL}          = "y";                                             # epoll enabled
+chomp($config{MAX_CLIENT_T} = `sh -c \"ulimit -n\"`);                          # FD Limit
+chomp($config{GCCVER}       = `gcc -dumpversion | cut -c 1`);                  # Major GCC Version
+chomp($config{GCC34}        = `gcc -dumpversion | cut -c 3`);                  # Minor GCC Version
+chomp($config{OSNAME}       = `/bin/uname`);                                   # Operating System Name
+$config{CC}                = "g++";                                            # C++ compiler
+
+if ((!$config{OSNAME}) || ($config{OSNAME} eq "")) {
+  chomp($config{OSNAME} = `/usr/bin/uname`);
+  if ((!$config{OSNAME}) || ($config{OSNAME} eq "")){
+       $config{OSNAME} = "Unknown";
+  }
+}
+
+if (!$config{MAX_CLIENT_T}) { 
+  $config{MAX_CLIENT_T} = 1024;                                 # Set a reasonable 'Default'
+  $fd_scan_fail = "true";                                       # Used Later
+}
+
+# Get and Set some important vars..
+getmodules();
+
+my $arg = $ARGV[0];                                            # Do Some Argument Checks..
+if ($arg eq "-clean") { `rm -rf .config.cache`; }               # Remove the config.cache file.
+
+if ($arg eq "-update") {
+  # 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();
+    writefiles();
+    print "Complete.\n";
+    exit;
+  }
+}
+
+print "Checking for cache from previous configure...\n";
+getcache();
+print "Checking operating system version...\n";
+getosflags();
+
+if (!$config{MAX_CLIENT}) { 
+  # If the cache hasn't set the max clients, copy the variable of MAX_CLIENT_T, this
+  # allows us to keep _T for testing purposes. (ie. "Are you sure you want to go
+  # higher than the found value" :))
+  $config{MAX_CLIENT} = $config{MAX_CLIENT_T};
+}
+
+printf "Checking if strlcpy exists... ";
+# Perform the strlcpy() test..
+$config{HAS_STRLCPY} = "false";
+my $fail = 0;
+open(STRLCPY, "</usr/include/string.h") or $fail = 1;
+if (!$fail)
+{
+       while (chomp($line = <STRLCPY>))
+       {
+               # try and find the delcaration of:
+               # size_t strlcpy(...)
+               if ($line =~ /size_t(\0x9|\s)+strlcpy/)
+               {
+                       $config{HAS_STRLCPY} = "true";
+               }
+       }
+       close(STRLCPY);
+}
+print "yes\n" if $config{HAS_STRLCPY} eq "true";
+print "no\n" if $config{HAS_STRLCPY} eq "false";
+
+printf "Checking if kqueue exists... ";
+$has_kqueue = 0;
+$fail = 0;
+open(KQUEUE, "</usr/include/sys/event.h") or $fail = 1;
+if (!$fail)
+{
+        while (chomp($line = <KQUEUE>))
+        {
+                # try and find the delcaration of:
+               # int kqueue(void);
+               if ($line =~ /int(\0x9|\s)+kqueue/)
+               {
+                       $has_kqueue = 1;
+               }
+       }
+       close(KQUEUE);
+}
+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)
+{
+       while (chomp($line = <EPOLL>))
+       {
+               # try and find the declaration of:
+               # extern int epoll_create (int __size) __THROW;
+               if (($line =~ /int(\0x9|\s)+epoll_create(\0x9|\s)+\(/) || ($line =~ /int(\0x9|\s)+epoll_create\(/))
+               {
+                       $has_epoll = 1;
+               }
+       }
+       close(EPOLL);
+}
+print "yes\n" if $has_epoll == 1;
+print "no\n" if $has_epoll == 0;
+
+if ($config{OSNAME} =~ /CYGWIN/) {
+       $config{HAS_STRLCPY} = "true";
+}
+
+################################################################################
+#                          BEGIN INTERACTIVE PART                              #
+################################################################################
+
+# Clear the Screen..
+system("clear");
+# Display Splash Logo..
+show_splash();
+chomp($wholeos = `uname -mnr`);
+
+# Display Introduction Message..
+print "
+Welcome to the InspIRCd Configuration program!
+
+*** 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! ***
+
+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}\n\n";
+
+# Directory Settings..
+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");
+
+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?");
+}
+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?");
+}
+$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";
+}
+
+# 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;
+      }
+    }
+  } 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;
+    $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 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";
+  }
+}
+
+# Code Optimisation
+print "Enter the Level Of Binary optimisation. This is a number between 0 and 3 (inclusive)
+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.
+
+The Higher the number, the more optimised your binary will be. This value will default to 0
+If you either a) Dont enter a number, or b) Enter a value outside the range.\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 "\n\033[1;32mPre-build configuration is complete!\033[0m\n\n";
+print "\033[0mConfig path:\033[1;32m\t\t\t$config{CONFIG_DIR}\n";
+print "\033[0mModule path:\033[1;32m\t\t\t$config{MODULE_DIR}\n";
+print "\033[0mMax connections:\033[1;32m\t\t$config{MAX_CLIENT}\n";
+print "\033[0mMax User Channels\033[1;32m\t\t$config{MAX_CHANNE}\n";
+print "\033[0mMax nickname length:\033[1;32m\t\t$config{NICK_LENGT}\n";
+print "\033[0mMax channel length:\033[1;32m\t\t$config{CHAN_LENGT}\n";
+print "\033[0mMax mode length:\033[1;32m\t\t$config{MAXI_MODES}\n";
+print "\033[0mGCC Version Found:\033[1;32m\t\t$config{GCCVER}.$config{GCC34}\n";
+print "\033[0mOptimatizaton 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\n";
+
+makecache();
+writefiles();
+
+print "\n\n";
+print "To build your server with these settings, please type '\033[1;32m$config{MAKEPROG}\033[0m' now.\n";
+print "*** \033[1;32mRemember to edit your configuration files!!!\033[0m ***\n\n\n";
+if (($config{OSNAME} eq "OpenBSD") && ($config{CC} ne "eg++")) {
+       print "\033[1;32mWARNING!\033[0m You are running OpenBSD but you are using the base gcc package\nrather than eg++. This compile will most likely fail, but i'm letting you\ngo ahead with it anyway, just in case i'm wrong :-)\n";
+}
+if ($config{OSNAME} =~ /CYGWIN/) {
+       print "\033[1;32mWARNING!\033[0m CYGWIN does not properly support shared modules,\nso modules are unavailable on this platform.\nThe modules will build as .o files but will not be available for use.\nYou will be able to run the core ircd file (inspircd.exe) as normal.\n";
+}
+
+################################################################################
+#                              HELPER FUNCTIONS                                #
+################################################################################
+sub getcache {
+  # Retrieves the .config.cache file, and loads values into the main config hash.
+  open(CACHE, ".config.cache") or return undef;
+  while (<CACHE>) {
+    chomp;
+
+    # Ignore Blank lines, and comments..
+    next if /^\s*$/;
+    next if /^\s*#/;
+
+    my ($key, $value) = split("=", $_);
+    $value =~ /^\"(.*)\"$/;
+    # Do something with data here!
+    $config{$key} = $1;
+  }
+  close(CONFIG);
+  return "true";
+}
+
+sub makecache {
+  # Dump the contents of %config
+  print "Writing \033[1;32mcache file\033[0m for future ./configures ...\n";
+  open(FILEHANDLE, ">.config.cache");
+  foreach $key (keys %config)
+  {
+    print FILEHANDLE "$key=\"$config{$key}\"\n";
+  }
+  close(FILEHANDLE);
+}
+
+sub dir_check {
+  my ($desc, $hash_key) = @_;
+  my $complete = 0;
+  while (!$complete) {
+    print "In what directory $desc?\n";
+    print "[\033[1;32m$config{$hash_key}\033[0m] -> ";
+    chomp($var = <STDIN>);
+    if ($var eq "") { $var = $config{$hash_key}; }
+    if ($var =~ /^\~\/(.+)$/) {
+       # Convert it to a full path..
+       $var = resolve_directory($ENV{HOME} . "/" . $1);
+    }
+    if (substr($var,0,1) ne "/")
+    {
+        # Assume relative Path was given.. fill in the rest.
+        $var = $this . "/$var";
+    }
+    $var = resolve_directory($var); 
+    if (! -e $var) {
+      print "$var does not exist. Create it?\n[\033[1;32my\033[0m] ";
+      chomp($tmp = <STDIN>);
+      if (($tmp eq "") || ($tmp =~ /^y/i)) {
+        # Attempt to Create the Dir..
+        $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256;
+        if ($chk != 0) {
+          print "Unable to create directory. ($var)\n\n";
+          # Restart Loop..
+          next;
+        }
+      } else {
+        # They said they don't want to create, and we can't install there.
+        print "\n\n";
+        next;
+      }
+    } else {
+      if (!is_dir($var)) {
+        # Target exists, but is not a directory.
+        print "File $var exists, but is not a directory.\n\n";
+        next;
+      }
+    }
+    # Either Dir Exists, or was created fine.
+    $config{$hash_key} = $var;
+    $complete = 1;
+    print "\n";
+  }
+}
+
+sub getosflags {
+  if ($config{OSNAME} =~ /BSD$/) {
+    $config{LDLIBS} = "-Ldl";
+    $config{FLAGS}  = "-fPIC -frtti $OPTIMISATI -Woverloaded-virtual $config{OPTIMISATI}";
+    $config{MAKEPROG} = "gmake";
+    if ($config{OSNAME} eq "OpenBSD") {
+       chomp($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
+               chomp($config{GCC34}        = `eg++ -dumpversion | cut -c 3`); # the compiler path
+       }
+    }
+  } else {
+    $config{LDLIBS} = "-ldl";
+    $config{FLAGS}  = "-fPIC -frtti $OPTIMISATI -Woverloaded-virtual $config{OPTIMISATI}";
+    $config{MAKEPROG} = "make";
+    if ($config{OSNAME} =~ /CYGWIN/) {
+       $config{FLAGS}  = "-frtti $OPTIMISATI -Woverloaded-virtual $config{OPTIMISATI}";
+       $config{LDLIBS} = "";
+       $config{MAKEPROG} = "/usr/bin/make";
+    }
+  }
+  if ($config{OSNAME} =~ /SunOS/) {
+    # 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{LDLIBS} = $config{LDLIBS} . " -lsocket -lnsl -lrt -lresolv";
+  }
+}
+
+sub is_dir {
+  my ($path) = @_;
+  if (chdir($path)) {
+    chdir($this);
+    return 1;
+  } else {
+    # Just in case..
+    chdir($this);
+    return 0;
+  }
+}
+
+sub getmodules {
+  my $i = 0;
+  opendir(DIRHANDLE, "src/modules");
+  foreach $name (sort readdir(DIRHANDLE)) {
+    if ($name =~ /^m_(.+)\.cpp$/)
+    {
+      $modlist[$i++] = $1;
+    }
+  }
+  closedir(DIRHANDLE);
+}
+
+sub writefiles {
+
+  print "Writing \033[1;32minspircd_config.h\033[0m\n";
+  # First File.. inspircd_config.h
+  chomp(my $incos = `uname -n -s -r`);
+  chomp(my $version = `sh ./src/version.sh`);
+  open(FILEHANDLE, ">include/inspircd_config.h");
+  print FILEHANDLE <<EOF;
+/* Auto generated by configure, do not modify! */
+#define SYSLOG_FACILITY LOG_DAEMON
+#define SYSLOG_LEVEL LOG_NOTICE
+#define CONFIG_FILE "$config{CONFIG_DIR}/inspircd.conf"
+#define MOD_PATH "$config{MODULE_DIR}"
+#define VERSION "$version"
+#define MAXCLIENTS $config{MAX_CLIENT}
+#define NICKMAX $config{NICK_LENGT}
+#define CHANMAX $config{CHAN_LENGT}
+#define MAXCHANS $config{MAX_CHANNE}
+#define MAXMODES $config{MAXI_MODES}
+#define OPTIMISATION $config{OPTIMITEMP}
+#define SYSTEM "$incos"
+#define MAXBUF 514
+EOF
+
+  if ($config{OSNAME} =~ /SunOS/) {
+    print FILEHANDLE "#define IS_SOLARIS\n";
+  }
+  if ($config{GCCVER} > 3) {
+    print FILEHANDLE "#define GCC3\n";
+    print FILEHANDLE "#define GCC34\n";
+  }
+  else
+  {
+    if ($config{GCCVER} == 3) {
+      print FILEHANDLE "#define GCC3\n";
+      if ($config{GCC34} > 3) {
+        print FILEHANDLE "#define GCC34\n";
+      }
+    }
+  }
+  if ($config{HAS_STRLCPY} eq "true") {
+    print FILEHANDLE "#define HAS_STRLCPY\n";
+  }
+  my $use_hiperf = 0;
+  if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
+    print FILEHANDLE "#define USE_KQUEUE\n";
+    $use_hiperf = 1;
+  }
+  if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
+    print FILEHANDLE "#define USE_EPOLL\n";
+    $use_hiperf = 1;
+  }
+  # user didn't choose either epoll or select for their OS.
+  # default them to USE_SELECT (ewwy puke puke)
+  if (!$use_hiperf) {
+    print FILEHANDLE "#define USE_SELECT\n";
+  }
+  close(FILEHANDLE);
+
+  # Create a Modules List..
+  my $modules = "";
+  foreach $i (@modlist)
+  {
+    if ($config{OSNAME} =~ /CYGWIN/) {
+        $modules .= "m_".$i.".o ";
+    }
+    else {
+        $modules .= "m_".$i.".so ";
+    }
+  }
+  chomp($modules);   # Remove Redundant whitespace..
+
+
+  # Write all .in files.
+  my $tmp = "";
+  my $file = "";
+  my $exe = "inspircd";
+
+  if ($config{OSNAME} =~ /CYGWIN/) {
+    $exe = "inspircd.exe";
+  }
+
+  opendir(DIRHANDLE, $this);
+  foreach $name (sort readdir(DIRHANDLE)) {
+    if ($name =~ /^\.(.+)\.inc$/)
+    {
+      $file = $1;
+      # All .name.inc files need parsing!
+      $tmp = "";
+      open(FILEHANDLE, ".$file.inc");
+      while (<FILEHANDLE>) {
+        $tmp .= $_;
+      }
+      close(FILEHANDLE);
+
+      $tmp =~ s/\@CC\@/$config{CC}/;
+      $tmp =~ s/\@MAKEPROG\@/$config{MAKEPROG}/;
+      $tmp =~ s/\@FLAGS\@/$config{FLAGS}/;
+      $tmp =~ s/\@LDLIBS\@/$config{LDLIBS}/;
+      $tmp =~ s/\@CONFIG_DIR\@/$config{CONFIG_DIR}/;
+      $tmp =~ s/\@MODULE_DIR\@/$config{MODULE_DIR}/;
+      $tmp =~ s/\@BINARY_DIR\@/$config{BINARY_DIR}/;
+      $tmp =~ s/\@LIBRARY_DIR\@/$config{LIBRARY_DIR}/;
+      $tmp =~ s/\@MODULES\@/$modules/;
+      $tmp =~ s/\@EXECUTABLE\@/$exe/;
+
+      print "Writing \033[1;32m$file\033[0m\n";
+      open(FILEHANDLE, ">$file");
+      print FILEHANDLE $tmp;
+    }
+  }
+  closedir(DIRHANDLE);
+
+  # Make inspircd executable!
+  chmod 0744, 'inspircd';
+
+  if ($config{OSNAME} =~ /CYGWIN/) {
+       print "Writing static-build \033[1;32msrc/Makefile\033[0m\n";
+       write_static_makefile();
+  }
+  else {
+       print "Writing dynamic-build \033[1;32msrc/Makefile\033[0m\n";
+       write_dynamic_makefile();
+  }
+
+  # Modules Makefile..
+  print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
+  open(FILEHANDLE, ">src/modules/Makefile");
+  print FILEHANDLE <<EOF;
+# (C) ChatSpike development team
+# Makefile by <Craig\@ChatSpike.net>
+# Many 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 --update
+
+all: \$(MODULES)
+
+EOF
+
+  # Create a Modules List..
+  my $modules = "";
+  my $flags = "";
+  foreach $i (@modlist)
+  {
+    $flags = getcompilerflags("src/modules/m_".$i.".cpp");
+    if ($config{OSNAME} =~ /CYGWIN/) {
+       print FILEHANDLE <<EOCHEESE;
+m_$i.o: m_$i.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/servers.h ../../include/base.h
+       \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c m_$i.cpp
+
+EOCHEESE
+    }
+    else {
+        print FILEHANDLE <<EOCHEESE;
+m_$i.so: m_$i.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/servers.h ../../include/base.h
+       \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c m_$i.cpp
+       \$(CC) \$(FLAGS) -shared $flags -o m_$i.so m_$i.o
+       cp m_$i.so \$(MODPATH)/
+       chmod 0700 \$(MODPATH)/m_$i.so
+
+EOCHEESE
+     }
+  }
+}
+
+sub getcompilerflags {
+  my ($file) = @_;
+  open(FLAGS, $file);
+  while (<FLAGS>) {
+    if ($_ =~ /^\/\* \$CompileFlags: (.+) \*\/$/) {
+      close(FLAGS);
+      return $1;
+    }
+  }
+  close(FLAGS);
+  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 resolve_directory {
+       use File::Spec;
+       return File::Spec->rel2abs($_[0]);
 }
 
-echo "#include <string.h>">.test.cpp
-echo "#include <stdio.h>">>.test.cpp
-echo "int main() { char a[10]; char b[10]; strlcpy(a,b,10); printf(\"%d\\n\",999); }" >>.test.cpp
-g++ -o .test .test.cpp
-HAS_STRLCPY=`./.test`
-rm -f .test.cpp .test
-
-clear
-echo -e "'\033[1;33m####\033[0;37m:'\033[1;33m##\033[0;37m::: \033[1;33m##\033[0;37m::'\033[1;33m######\033[0;37m::'\033[1;33m########\033[0;37m::'\033[1;33m####\033[0;37m:'\033[1;33m########\033[0;37m:::'\033[1;33m######\033[0;37m::'\033[1;33m########\033[0;37m::"
-echo -e ". \033[1;33m##\033[0;37m:: \033[1;33m###\033[0;37m:: \033[1;33m##\033[0;37m:'\033[1;33m##\033[0;37m... \033[1;33m##\033[0;37m: \033[1;33m##\033[0;37m.... \033[1;33m##\033[0;37m:. \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m.... \033[1;33m##\033[0;37m:'\033[1;33m##\033[0;37m... \033[1;33m##\033[0;37m: \033[1;33m##\033[0;37m.... \033[1;33m##\033[0;37m:"
-echo -e ": \033[1;33m##\033[0;37m:: \033[1;33m####\033[0;37m: \033[1;33m##\033[0;37m: \033[1;33m##\033[0;37m:::..:: \033[1;33m##\033[0;37m:::: \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m:::: \033[1;33m##\033[0;37m: \033[1;33m##\033[0;37m:::..:: \033[1;33m##\033[0;37m:::: \033[1;33m##\033[0;37m:"
-echo -e ": \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m \033[1;33m##\033[0;37m \033[1;33m##\033[0;37m:. \033[1;33m######\033[0;37m:: \033[1;33m########\033[0;37m::: \033[1;33m##\033[0;37m:: \033[1;33m########\033[0;37m:: \033[1;33m##\033[0;37m::::::: \033[1;33m##\033[0;37m:::: \033[1;33m##\033[0;37m:"
-echo -e ": \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m. \033[1;33m####\033[0;37m::..... \033[1;33m##\033[0;37m: \033[1;33m##\033[0;37m.....:::: \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m.. \033[1;33m##\033[0;37m::: \033[1;33m##\033[0;37m::::::: \033[1;33m##\033[0;37m:::: \033[1;33m##\033[0;37m:"
-echo -e ": \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m:. \033[1;33m###\033[0;37m:'\033[1;33m##\033[0;37m::: \033[1;33m##\033[0;37m: \033[1;33m##\033[0;37m::::::::: \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m::. \033[1;33m##\033[0;37m:: \033[1;33m##\033[0;37m::: \033[1;33m##\033[0;37m: \033[1;33m##\033[0;37m:::: \033[1;33m##\033[0;37m:"
-echo -e "'\033[1;33m####\033[0;37m: \033[1;33m##\033[0;37m::. \033[1;33m##\033[0;37m:. \033[1;33m######\033[0;37m:: \033[1;33m##\033[0;37m::::::::'\033[1;33m####\033[0;37m: \033[1;33m##\033[0;37m:::. \033[1;33m##\033[0;37m:. \033[1;33m######\033[0;37m:: \033[1;33m########\033[0;37m::"
-echo -e "\033[0;37m\033[0;37m....::..::::..:::......:::..:::::::::....::..:::::..:::......:::........:::"
-echo ""
-echo -e "\033[1;37mWelcome to the InspIRCd Configuration program!"
-echo ""
-echo "*** If you are unsure of any of these values, leave it blank for    ***"
-echo "*** standard settings that will work, and your server will run      ***"
-echo "*** using them. If you are running this server as part of a         ***"
-echo "*** larger network, you must consult with your network admins       ***"
-echo "*** for the proper values to use, or server links will be unstable! ***"
-echo -e "\033[0;37m"
-echo -e "Press \033[1;37m<RETURN>\033[0;37m to accept the default for any option, or enter"
-echo -e "a new value. Please note: You will \033[1;37mHAVE\033[0;37m to read the docs"
-echo -e "dir, otherwise you won't have a config file!"
-echo ""
-echo -e "Your operating system is: \033[1;37m$OSNAME\033[0;37m (`uname -mnr`), fdmax: $MAX_CLIENT_T"
-echo ""
-
-#############################################################################
-
-    ok=0
-    asked=1
-    echo "In what directory are the configuration files?"
-    while [ $ok -eq 0 ] ; do
-       echo -e $n "[\033[1;32m$CONFIG_DIR\033[0;37m] -> $c"
-       if read INPUT ; then : ; else echo "" ; exit 1 ; fi
-       if [ ! "$INPUT" ] ; then
-           INPUT=$CONFIG_DIR
-           default=1
-       fi
-       if echo "$INPUT" | grep -q \[\'\"\\\] ; then
-           echo 'Please use a pathname without the characters: '\'' " \'
-       elif [ ! "$NO_DIR_CHECK" -a ! -d "$INPUT" ] ; then
-           if exists "$INPUT" ; then
-               echo "$INPUT exists, but is not a directory!"
-           else
-               echo "$INPUT does not exist.  Create it?"
-               echo -e $n "[\033[1;32my\033[0;37m] $c"
-               read YN
-               if [ "$YN" != "n" ] ; then
-                   if mkdir -p "$INPUT" ; then
-                       ok=1
-                   fi
-               fi
-           fi
-           else
-            ok=1
-       fi
-    done
-    CONFIG_DIR=$INPUT
-    echo ""
-
-
-##############################################################################
-
-    ok=0
-    asked=1
-    echo "In What directory are the modules to be compiled to?"
-    while [ $ok -eq 0 ] ; do
-        echo -e $n "[\033[1;32m$MODULE_DIR\033[0;37m] -> $c"
-        if read INPUT ; then : ; else echo "" ; exit 1 ; fi
-        if [ ! "$INPUT" ] ; then
-            INPUT=$MODULE_DIR
-            default=1
-        fi
-        if echo "$INPUT" | grep -q \[\'\"\\\] ; then
-            echo 'Please use a pathname without the characters: '\'' " \'
-        elif [ ! "$NO_DIR_CHECK" -a ! -d "$INPUT" ] ; then
-            if exists "$INPUT" ; then
-                echo "$INPUT exists, but is not a directory!"
-            else
-                echo "$INPUT does not exist.  Create it?"
-                echo -e $n "[\033[1;32my\033[0;37m] $c"
-                read YN
-                if [ "$YN" != "n" ] ; then
-                    if mkdir -p "$INPUT" ; then
-                        ok=1
-                    fi
-                fi
-            fi
-            else
-            ok=1
-        fi
-    done
-    MODULE_DIR=$INPUT
-    echo ""
-
-
-##############################################################################
-
-    ok=0
-    asked=1
-    echo "In what directory is the IRCd binary to be placed?"
-    while [ $ok -eq 0 ] ; do
-        echo -e $n "[\033[1;32m$BINARY_DIR\033[0;37m] -> $c"
-        if read INPUT ; then : ; else echo "" ; exit 1 ; fi
-        if [ ! "$INPUT" ] ; then
-            INPUT=$BINARY_DIR
-            default=1
-        fi
-        if echo "$INPUT" | grep -q \[\'\"\\\] ; then
-            echo 'Please use a pathname without the characters: '\'' " \'
-        elif [ ! "$NO_DIR_CHECK" -a ! -d "$INPUT" ] ; then
-            if exists "$INPUT" ; then
-                echo "$INPUT exists, but is not a directory!"
-            else
-                echo "$INPUT does not exist.  Create it?"
-                echo -e $n "[\033[1;32my\033[0;37m] $c"
-                read YN
-                if [ "$YN" != "n" ] ; then
-                    if mkdir -p "$INPUT" ; then
-                        ok=1
-                    fi
-                fi
-            fi
-            else
-            ok=1
-        fi
-    done
-    BINARY_DIR=$INPUT
-    echo ""
-
-###############################################################################
-# Craigs Version 3 With slightly less Cheeze :p
-
-cheeze=0
-echo -e "Maximum number of clients at any one time (\033[1;32m1-$MAX_CLIENT_T\033[0;37m)?"
-while [ "$cheeze" -eq "0" ] ; do
-       echo -e $n "[\033[1;32m$MAX_CLIENT\033[0;37m] -> $c"
-        read cc
-
-        if [ -z "$cc" ] ; then
-               cc=$MAX_CLIENT
-       fi
-
-       case "$cc" in 
-               [0-9]*)
-                       if [ "$cc" -gt "$MAX_CLIENT_T" -a -z "$SCAN_FAILED" ] ; then
-                               echo -e "WARNING: Our scans have indicated that you are attempting"
-                               echo -e "to use more sockets than there are avaliable. Are you sure"
-                               echo -e "you wish to do this? It may cause the IRCd to malfunction [y/n]"
-                               echo -e $n "[\033[1;32mn\033[0;37m] -> $c"
-                               read YN
-                               if [ "$YN" = "y" ] ; then
-                                       MAX_CLIENT=$cc
-                                       cheeze=1
-                               else
-                                       echo ""
-                                       echo -e "Please enter the correct value (\033[1;32m1-$MAX_CLIENT_T\033[0;37m)"
-                               fi
-                       else
-                               echo $SCAN_FAILED
-                               cheeze=1
-                               MAX_CLIENT=$cc
-                       fi
-                       ;;
-               *)
-                       echo ""
-                       echo "You must enter a number in this field. Please try again."
-                       ;;
-       esac
-done
-echo ""
-
-
-###############################################################################
-
-  cheeze=0
-  echo -e "What is the Maximum length of nicknames?"
-  while [ "$cheeze" -eq "0" ] ; do
-        echo -e $n "[\033[1;32m$NICK_LENGT\033[0;37m] -> $c"
-        read cc
-        if [ "$cc" ] ; then
-                case "$cc" in
-                        [0-9]*)
-                        NICK_LENGT=$cc
-                        cheeze=1
-                        ;;
-                        *)
-                        echo ""
-                        echo "You Must Enter a Number in this field. Please Try Again."
-                        cheeze=0
-                        ;;
-                esac
-        else
-                cheeze=1
-        fi
-  done
-  echo ""
-
-###############################################################################
-
-  cheeze=0
-  echo -e "What is the Maximum length of channel names?"
-  while [ "$cheeze" -eq "0" ] ; do
-        echo -e $n "[\033[1;32m$MAX_CHANNE\033[0;37m] -> $c"
-        read cc
-        if [ "$cc" ] ; then
-                case "$cc" in
-                        [0-9]*)
-                        MAX_CHANNE=$cc
-                        cheeze=1
-                        ;;
-                        *)
-                        echo ""
-                        echo "You Must Enter a Number in this field. Please Try Again."
-                        cheeze=0
-                        ;;
-                esac
-        else
-                cheeze=1
-        fi
-  done
-  echo ""
-
-###############################################################################
-
-  cheeze=0
-  echo -e "What is the Maximum number of mode changes in one line?"
-  while [ "$cheeze" -eq "0" ] ; do
-        echo -e $n "[\033[1;32m$MAXI_MODES\033[0;37m] -> $c"
-        read cc
-        if [ "$cc" ] ; then
-                case "$cc" in
-                        [0-9]*)
-                        MAXI_MODES=$cc
-                        cheeze=1
-                        ;;
-                        *)
-                        echo ""
-                        echo "You Must Enter a Number in this field. Please Try Again."
-                        cheeze=0
-                        ;;
-                esac
-        else
-                cheeze=1
-        fi
-  done
-  echo ""
-
-###############################################################################
-# Code Optimisation?
-
-  cheeze=0
-  echo -e "Enter the Level Of Binary optimisation. This is a number between 0 and 3 (inclusive)"
-  echo -e "The InspIRCd Team will _NOT_ support any bug reports above 0."
-  echo -e "Also note, the IRCd behaviour will be different depending on this value."
-  echo -e "Please read the documentation for more information."
-  echo -e ""
-  echo -e "The Higher the number, the more optimised your binary will be. This value will default to 0"
-  echo -e "If you either a) Dont enter a number, or b) Enter a value outside the range."
-  echo -e $n "[\033[1;32m$OPTIMITEMP\033[0;37m] -> $c"
-  read cc
-  if [ -z "$cc" ] ; then
-       cc=$OPTIMITEMP
-  fi
-  case "$cc" in
-        (1)
-                OPTIMITEMP=1
-               OPTIMISATI="-O"
-                ;;
-       (2)
-               OPTIMITEMP=2
-               OPTIMISATI="-O2"
-               ;;
-       (3)
-               OPTIMITEMP=3
-               OPTIMISATI="-O3"
-               ;;
-       (*)
-                OPTIMITEMP=0
-                OPTIMISATI="-g"
-                ;;
-  esac
-  echo ""
-
-###############################################################################
-
-
-echo -e "\033[1;32mPre-build configuration is complete!\033[0;37m"
-echo ""
-echo -e "\033[0;37mConfig path:\033[1;32m\t\t\t$CONFIG_DIR"
-echo -e "\033[0;37mModule path:\033[1;32m\t\t\t$MODULE_DIR"
-echo -e "\033[0;37mMax connections:\033[1;32m\t\t$MAX_CLIENT"
-echo -e "\033[0;37mMax User Channels\033[1;32m\t\t$MAX_CHANNE"
-echo -e "\033[0;37mMax nickname length:\033[1;32m\t\t$NICK_LENGT"
-echo -e "\033[0;37mMax channel length:\033[1;32m\t\t$CHAN_LENGT"
-echo -e "\033[0;37mMax mode length:\033[1;32m\t\t$MAXI_MODES"
-echo -e "\033[0;37mGCC Version Found:\033[1;32m\t\t$GCCVER.$GCC34"
-echo -e "\033[0;37mOptimatizaton Flag:\033[1;32m\t\t$OPTIMISATI"
-echo -e "\033[0;37m"
-
-echo "Writing cache file for future ./configures ..."
-
-if [ "$CONFIG_DIR" != "$ME/conf" ] ; then
-    COPY_CONF=1
-fi
-
-
-if [ -e ".config.cache" ] ; then
-       rm .config.cache
-fi
-echo "CONFIG_DIR=\"$CONFIG_DIR\"" >> .config.cache
-echo "MODULE_DIR=\"$MODULE_DIR\"" >> .config.cache
-echo "BINARY_DIR=\"$BINARY_DIR\"" >> .config.cache
-echo "MAX_CLIENT=\"$MAX_CLIENT\"" >> .config.cache
-echo "MAX_CHANNE=\"$MAX_CHANNE\"" >> .config.cache
-echo "NICK_LENGT=\"$NICK_LENGT\"" >> .config.cache
-echo "MAXI_MODES=\"$MAXI_MODES\"" >> .config.cache 
-echo "OPTIMITEMP=\"$OPTIMITEMP\"" >> .config.cache
-echo "OPTIMISATI=\"$OPTIMISATI\"" >> .config.cache
-echo "GCC34=\"$GCC34\"" >> .config.cache
-echo "HAS_STRLCPY=\"$HAS_STRLCPY\"" >> .config.cache
-echo "COPY_CONF=\"$COPY_CONF\"" >> .config.cache
-
-echo "Writing include/inspircd_config.h ..."
-
-echo "/* Auto generated by configure, do not modify! */" >include/inspircd_config.h
-echo "" >>include/inspircd_config.h
-if [ "$GCCVER" -eq "3" ] ; then
-echo "#define GCC3" >>include/inspircd_config.h
-       if [ "$GCC34" -gt "3" ] ; then
-               echo "#define GCC34" >>include/inspircd_config.h
-       fi
-fi
-if [ "$HAS_STRLCPY" -eq "999" ] ; then
-       echo "#define HAS_STRLCPY" >>include/inspircd_config.h
-fi
-echo "#define SYSLOG_FACILITY LOG_DAEMON" >>include/inspircd_config.h
-echo "#define SYSLOG_LEVEL LOG_NOTICE" >>include/inspircd_config.h
-echo "#define CONFIG_FILE \"$CONFIG_DIR/inspircd.conf\"" >>include/inspircd_config.h
-echo "#define MOD_PATH \"$MODULE_DIR\"" >>include/inspircd_config.h
-echo "#define VERSION \"`sh ./src/version.sh`\"" >>include/inspircd_config.h
-echo "#define MAXCLIENTS $MAX_CLIENT" >>include/inspircd_config.h
-echo "#define NICKMAX $NICK_LENGT" >>include/inspircd_config.h
-echo "#define CHANMAX $CHAN_LENGT" >>include/inspircd_config.h
-echo "#define MAXCHANS $MAX_CHANNE" >>include/inspircd_config.h
-echo "#define MAXMODES $MAXI_MODES" >>include/inspircd_config.h
-echo "#define OPTIMISATION $OPTIMITEMP" >>include/inspircd_config.h
-echo "#define SYSTEM \"`uname -n -s -r`\"" >>include/inspircd_config.h
-echo "#define MAXBUF 514">>include/inspircd_config.h
-touch include/inspircd_config.h
-
-echo "Preparing Variables for the Makefile"
-
-case "$OSNAME" in
-       (FreeBSD)
-               LDLIBS="-Ldl"
-               FLAGS="-fPIC -frtti $OPTIMISATI"
-               MAKEPROG="gmake"
-               ;;
-       (*)
-               LDLIBS="-ldl"
-               FLAGS="-fPIC -frtti $OPTIMISATI"
-               MAKEPROG="make"
-               ;;
-esac
-
-MODULES=""
-for module in src/modules/*.cpp ; do
-        mod=`echo $module | sed 's/.cpp/.so/' | sed 's/src\/modules\///'`
-       MODULES="$MODULES $mod" 
-done
-
-echo -e "Writing \033[1;37m$OSNAME\033[0;37m makefile"
-echo ""
-
-. .Makefile.inc
-
-echo ""
-
-echo ""
-echo "Do you want to compile the IRCd binaries?"
-echo -e $n "[\033[1;32my\033[0;37m] $c"
-read YN
-if [ "$YN" != "n" ] ; then
-       echo ""
-       echo -e "\033[1;32mCompiling...\033[0;37m"
-       echo ""
-       cd $ME
-       $MAKEPROG
-       echo ""
-        echo "Done!"
-        echo ""
-else
-       echo ""
-       echo "Done!"
-       echo ""
-       echo -e "To build your server with these settings, please type '\033[1;32mmake\033[0;37m' now."
-       echo ""
-       echo -e "*** \033[1;32mRemember to edit your configuration files!!!\033[0;37m ***"
-       echo ""
-fi
-
-
-echo ""
-echo "Do you want to run the config file maker?"
-echo -e $n "[\033[1;32my\033[0;37m] $c"
-read YN
-if [ "$YN" != "n" ] ; then
-       sh makeconf
-fi
-
-echo -e "*** \033[1;32mRemember to edit your configuration files!!!\033[0;37m ***"
-echo ""
+sub yesno {
+       my ($flag,$prompt) = @_;
+       print "$prompt [\033[1;32m$config{$flag}\033[0m] -> ";
+       chomp($tmp = <STDIN>);
+       if ($tmp eq "") { $tmp = $config{$flag} }
+
+       if (($tmp eq "") || ($tmp =~ /^y/i)) {
+               $config{$flag} = "y";
+       } else {
+               $config{$flag} = "n";
+        }
+       return;
+}
+
+
+sub write_static_makefile {
+       open(FH,">src/Makefile") or die("Could not write src/Makefile!");
+       print FH <<EOM;
+# Insp Makefile :p
+#
+# (C) ChatSpike development team
+# Makefile by <Craig\@ChatSpike.net>
+# Makefile version 2 (dynamically linked core) by <brain\@inspircd.org>
+#
+
+CC = im a cheezeball
+
+CXXFLAGS = -I../include \${FLAGS}
+
+all: hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_util.o inspircd_io.o connection.o message.o commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o servers.o helperfuncs.o 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
+       \$(CC) -I../include \$(FLAGS) inspircd.cpp -o inspircd.exe \$(LDLIBS) channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_util.o inspircd_io.o connection.o message.o commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o servers.o helperfuncs.o hashcomp.o
+
+hashcomp.o: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
+
+helperfuncs.o: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
+
+channels.o: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
+
+mode.o: mode.cpp ../include/base.h ../include/mode.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 mode.cpp
+
+xline.o: xline.cpp ../include/base.h ../include/xline.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 xline.cpp
+
+inspstring.o: inspstring.cpp ../include/base.h ../include/inspstring.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 inspstring.cpp
+
+dns.o: dns.cpp ../include/base.h ../include/dns.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 dns.cpp
+
+base.o: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
+
+inspircd_util.o: inspircd_util.cpp ../include/base.h ../include/inspircd_util.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 inspircd_util.cpp
+
+inspircd_io.o: inspircd_io.cpp ../include/base.h ../include/inspircd_io.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 inspircd_io.cpp
+
+connection.o: connection.cpp ../include/base.h ../include/connection.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 connection.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
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
+
+dnsqueue.o: dnsqueue.cpp ../include/base.h ../include/dnsqueue.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 dnsqueue.cpp
+
+dynamic.o: 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
+
+users.o: users.cpp ../include/base.h ../include/users.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/connection.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
+
+modules.o: modules.cpp ../include/base.h ../include/modules.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 modules.cpp
+
+wildcard.o: wildcard.cpp ../include/base.h ../include/wildcard.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 wildcard.cpp
+
+servers.o: servers.cpp ../include/base.h ../include/servers.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/connection.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c servers.cpp
+
+
+EOM
+close(FH);
+}
+
+sub write_dynamic_makefile {
+       open(FH,">src/Makefile") or die("Could not write src/Makefile");
+       print FH <<EOM;
+# Insp Makefile :p
+#
+# (C) ChatSpike development team
+# Makefile by <Craig\@ChatSpike.net>
+# Makefile version 2 (dynamically linked core) by <brain\@inspircd.org>
+#
+
+CC = im a cheezeball
+
+CXXFLAGS = -I../include \${FLAGS}
+
+all: libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDutil.so libIRCDio.so libIRCDconnection.so libIRCDmessage.so libIRCDcommands.so libIRCDdnsqueue.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDservers.so libIRCDhelper.so inspircd
+
+inspircd: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h
+       \$(CC) -I../include \$(FLAGS) -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDutil.so libIRCDio.so libIRCDconnection.so libIRCDmessage.so libIRCDcommands.so libIRCDdnsqueue.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDservers.so libIRCDhelper.so libIRCDhash.so
+
+libIRCDhash.so: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
+       \$(CC) -shared -o libIRCDhash.so hashcomp.o
+
+libIRCDhelper.so: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
+       \$(CC) -shared -o libIRCDhelper.so helperfuncs.o
+
+libIRCDchannels.so: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
+       \$(CC) -shared -o libIRCDchannels.so channels.o
+
+libIRCDmode.so: mode.cpp ../include/base.h ../include/mode.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 mode.cpp
+       \$(CC) -shared -o libIRCDmode.so mode.o
+
+libIRCDxline.so: xline.cpp ../include/base.h ../include/xline.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 xline.cpp
+       \$(CC) -shared -o libIRCDxline.so xline.o
+
+libIRCDstring.so: inspstring.cpp ../include/base.h ../include/inspstring.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 inspstring.cpp
+       \$(CC) -shared -o libIRCDstring.so inspstring.o
+
+libIRCDasyncdns.so: dns.cpp ../include/base.h ../include/dns.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 dns.cpp
+       \$(CC) -shared -o libIRCDasyncdns.so dns.o
+
+libIRCDbase.so: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
+       \$(CC) -shared -o libIRCDbase.so base.o
+
+libIRCDutil.so: inspircd_util.cpp ../include/base.h ../include/inspircd_util.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 inspircd_util.cpp
+       \$(CC) -shared -o libIRCDutil.so inspircd_util.o
+
+libIRCDio.so: inspircd_io.cpp ../include/base.h ../include/inspircd_io.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 inspircd_io.cpp
+       \$(CC) -shared -o libIRCDio.so inspircd_io.o
+
+libIRCDconnection.so: connection.cpp ../include/base.h ../include/connection.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 connection.cpp
+       \$(CC) -shared -o libIRCDconnection.so connection.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) -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
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
+       \$(CC) -shared -o libIRCDcommands.so commands.o
+
+libIRCDdnsqueue.so: dnsqueue.cpp ../include/base.h ../include/dnsqueue.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 dnsqueue.cpp
+       \$(CC) -shared -o libIRCDdnsqueue.so dnsqueue.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
+       \$(CC) -shared -o libIRCDdynamic.so dynamic.o
+
+libIRCDusers.so: users.cpp ../include/base.h ../include/users.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/connection.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
+       \$(CC) -shared -o libIRCDusers.so users.o
+
+libIRCDmodules.so: modules.cpp ../include/base.h ../include/modules.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 modules.cpp
+       \$(CC) -shared -o libIRCDmodules.so modules.o
+
+libIRCDwildcard.so: wildcard.cpp ../include/base.h ../include/wildcard.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 wildcard.cpp
+       \$(CC) -shared -o libIRCDwildcard.so wildcard.o
+
+libIRCDservers.so: servers.cpp ../include/base.h ../include/servers.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/connection.h
+       \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c servers.cpp
+       \$(CC) -shared -o libIRCDservers.so servers.o
+
+EOM
+close(FH);
+}