]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - configure
Implement /who 1d t (search for who matches for users connected for a given time)
[user/henk/code/inspircd.git] / configure
index ecc8b1640ed997ff800f6a2e35c4c2b919037caa..964a4f19d5c57d243cde98f965f8837805f8d162 100755 (executable)
--- a/configure
+++ b/configure
@@ -70,7 +70,7 @@ 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.
+# scanning the src/*.cpp files for files containing /* $Core */ identifiers.
 
 our %filelist = ();
 
@@ -97,12 +97,10 @@ our %extraobjects = ();
 
 our %extrasources = ();
 
-our ($opt_use_gnutls, $opt_rebuild, $opt_use_openssl, $opt_nointeractive, $opt_nick_length,
-    $opt_chan_length, $opt_ports, $opt_epoll, $opt_kqueue, $opt_noports,
-    $opt_noepoll, $opt_nokqueue, $opt_disablerpath, $opt_ipv6, $opt_ipv6links,
-    $opt_noipv6links, $opt_ident, $opt_quit, $opt_topic, $opt_maxbuf, $opt_kick,
-    $opt_gecos, $opt_away, $opt_modes, $opt_disable_debug, $opt_maxchans,
-    $opt_opermaxchans);
+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);
 
 our ($opt_cc, $opt_base_dir, $opt_config_dir, $opt_module_dir, $opt_binary_dir,
     $opt_library_dir);
@@ -121,27 +119,18 @@ GetOptions (
        'rebuild' => \$opt_rebuild,
        'enable-openssl' => \$opt_use_openssl,
        'disable-interactive' => \$opt_nointeractive,
-       'with-nick-length=i' => \$opt_nick_length,
-       'with-channel-length=i' => \$opt_chan_length,
        'enable-ports' => \$opt_ports,
        'enable-epoll' => \$opt_epoll,
        'enable-kqueue' => \$opt_kqueue,
        'disable-ports' => \$opt_noports,
        'disable-epoll' => \$opt_noepoll,
        'disable-kqueue' => \$opt_nokqueue,
-       'disable-rpath' => \$opt_disablerpath,
        'enable-ipv6' => \$opt_ipv6,
        'enable-remote-ipv6' => \$opt_ipv6links,
        'disable-remote-ipv6' => \$opt_noipv6links,
        'with-cc=s' => \$opt_cc,
-       'with-ident-length=i' => \$opt_ident,
-       'with-quit-length=i' => \$opt_quit,
-       'with-topic-length=i' => \$opt_topic,
        'with-maxbuf=i' => \$opt_maxbuf,
-       'with-kick-length=i' => \$opt_kick,
-       'with-gecos-length=i' => \$opt_gecos,
-       'with-away-length=i' => \$opt_away,
-       'with-max-modes=i' => \$opt_modes,
+       'enable-freebsd-ports-openssl' => \$opt_freebsd_port,
        'prefix=s' => \$opt_base_dir,
        'config-dir=s' => \$opt_config_dir,
        'module-dir=s' => \$opt_module_dir,
@@ -177,13 +166,6 @@ our $non_interactive = (
        (defined $opt_base_dir) ||
        (defined $opt_binary_dir) ||
        (defined $opt_nointeractive) ||
-       (defined $opt_away) ||
-       (defined $opt_gecos) ||
-       (defined $opt_kick) ||
-       (defined $opt_modes) ||
-       (defined $opt_topic) ||
-       (defined $opt_quit) ||
-       (defined $opt_ident) ||
        (defined $opt_cc) ||
        (defined $opt_ipv6) ||
        (defined $opt_ipv6links) ||
@@ -191,16 +173,13 @@ our $non_interactive = (
        (defined $opt_kqueue) ||
        (defined $opt_epoll) ||
        (defined $opt_ports) ||
-       (defined $opt_maxchans) ||
-       (defined $opt_opermaxchans) ||
-       (defined $opt_chan_length) ||
-       (defined $opt_nick_length) ||
        (defined $opt_use_openssl) ||
        (defined $opt_nokqueue) ||
        (defined $opt_noepoll) ||
        (defined $opt_noports) ||
        (defined $opt_maxbuf) ||
-       (defined $opt_use_gnutls)
+       (defined $opt_use_gnutls) ||
+       (defined $opt_freebsd_port)
 );
 our $interactive = !$non_interactive;
 
@@ -240,13 +219,25 @@ if (defined $opt_library_dir)
 }
 chomp($config{HAS_GNUTLS}   = `libgnutls-config --version 2>/dev/null | cut -c 1,2,3`); # GNUTLS Version.
 
-if ($^O eq "freebsd")
+if (defined $opt_freebsd_port)
 {
-       chomp($config{HAS_OPENSSL} = `openssl version | cut -d ' ' -f 2`);                      # OpenSSL version, freebsd specific
+       chomp($config{HAS_OPENSSL} = `pkg-config --modversion openssl 2>/dev/null`);
+       chomp($config{HAS_OPENSSL_PORT}  = `pkg-config --modversion openssl 2>/dev/null`);
+       $config{USE_FREEBSD_BASE_SSL} = "n";
 }
 else
 {
-       chomp($config{HAS_OPENSSL}  = `pkg-config --modversion openssl 2>/dev/null`);           # Openssl version, others
+       if ($^O eq "freebsd")
+       {
+               # default: use base ssl
+               chomp($config{HAS_OPENSSL} = `openssl version | cut -d ' ' -f 2`);                      # OpenSSL version, freebsd specific
+               chomp($config{HAS_OPENSSL_PORT}  = `pkg-config --modversion openssl 2>/dev/null`);      # Port version, may be different
+       }
+       else
+       {
+               chomp($config{HAS_OPENSSL}  = `pkg-config --modversion openssl 2>/dev/null`);           # Openssl version, others
+               $config{HAS_OPENSSL_PORT} = "";
+       }
 }
 
 chomp(our $gnutls_ver = $config{HAS_GNUTLS});
@@ -273,21 +264,6 @@ else
        $config{OPTIMISATI}      = "-O2";                               # DEBUGGING OFF!
 }
 
-$config{NICK_LENGT}     = "31";                                        # Default Nick Length
-if (defined $opt_nick_length)
-{
-       $config{NICK_LENGT} = $opt_nick_length;
-}
-$config{CHAN_LENGT}     = "64";                                        # Default Channel Name Length
-if (defined $opt_chan_length)
-{
-       $config{CHAN_LENGT} = $opt_chan_length;
-}
-$config{MAXI_MODES}     = "20";                                        # Default Max. Number of Modes set at once.
-if (defined $opt_modes)
-{
-       $config{MAXI_MODES} = $opt_modes;
-}
 $config{HAS_STRLCPY}   = "false";                                      # strlcpy Check.
 $config{HAS_STDINT}     = "false";                                     # stdint.h check
 $config{USE_KQUEUE}     = "y";                                         # kqueue enabled
@@ -299,6 +275,7 @@ if (defined $opt_nokqueue)
 {
        $config{USE_KQUEUE} = "n";
 }
+$config{USE_POLL}     = "y";                                   # poll enabled
 $config{USE_EPOLL}       = "y";                                        # epoll enabled
 if (defined $opt_epoll)
 {
@@ -332,6 +309,7 @@ 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?
@@ -352,38 +330,10 @@ if (defined $opt_cc)
 }
 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{MAX_IDENT}             = "12";                                 # max ident size
-$config{MAX_QUIT}              = "255";                                # max quit message size
-$config{MAX_TOPIC}             = "307";                                # max topic size
-$config{MAX_KICK}              = "255";                                # max kick message size
-$config{MAX_GECOS}             = "128";                                # max GECOS size
-$config{MAX_AWAY}              = "200";                                # max AWAY size
 $config{MAXBUF}                        = "512";                                # Max buffer size
-if (defined $opt_ident)
-{
-       $config{MAX_IDENT} = $opt_ident;
-}
-if (defined $opt_quit)
-{
-       $config{MAX_QUIT} = $opt_quit;
-}
-if (defined $opt_topic)
-{
-       $config{MAX_TOPIC} = $opt_topic;
-}
-if (defined $opt_kick)
-{
-       $config{MAX_KICK} = $opt_kick;
-}
-if (defined $opt_gecos)
-{
-       $config{MAX_GECOS} = $opt_gecos;
-}
-if (defined $opt_away)
-{
-       $config{MAX_AWAY} = $opt_away;
-}
 
 if ($config{HAS_OPENSSL} =~ /^([-[:digit:].]+)([a-z])?(\-[a-z][0-9])?$/) {
        $config{HAS_OPENSSL} = $1;
@@ -391,7 +341,7 @@ if ($config{HAS_OPENSSL} =~ /^([-[:digit:].]+)([a-z])?(\-[a-z][0-9])?$/) {
        $config{HAS_OPENSSL} = "";
 }
 
-if ($config{GCCVER} eq "") {
+if (($config{GCCVER} eq "") || ($config{GCCMINOR} eq "")) {
        print $config{CC} . " was not found! You require g++ (the GNU C++ compiler, part of GCC) to build InspIRCd!\n";
        exit;
 }
@@ -718,8 +668,13 @@ $config{HAS_KQUEUE} = $has_kqueue;
 
 printf "Checking for libgnutls... ";
 if (defined($config{HAS_GNUTLS}) && (($config{HAS_GNUTLS}) || ($config{HAS_GNUTLS} eq "y"))) {
-       print "yes\n";
-       $config{HAS_GNUTLS} = "y";
+       if (defined($gnutls_ver) && ($gnutls_ver ne "")) {
+               print "yes\n";
+               $config{HAS_GNUTLS} = "y";
+       } else {
+               print "no\n";
+               $config{HAS_GNUTLS} = "n";
+       }
 } else {
        print "no\n";
        $config{HAS_GNUTLS} = "n";
@@ -727,8 +682,13 @@ if (defined($config{HAS_GNUTLS}) && (($config{HAS_GNUTLS}) || ($config{HAS_GNUTL
 
 printf "Checking for openssl... ";
 if (defined($config{HAS_OPENSSL}) && (($config{HAS_OPENSSL}) || ($config{HAS_OPENSSL} eq "y"))) {
-       print "yes\n";
-       $config{HAS_OPENSSL} = "y";
+       if (defined($openssl_ver) && ($openssl_ver ne "")) {
+               print "yes\n";
+               $config{HAS_OPENSSL} = "y";
+       } else {
+               print "no\n";
+               $config{HAS_OPENSSL} = "n";
+       }
 } else {
        print "no\n";
        $config{HAS_OPENSSL} = "n";
@@ -797,7 +757,7 @@ STOP
        print ".\n\n";
 
        $config{CHANGE_COMPILER} = "n";
-       print "I have detected the following compiler: \e[1;32m$config{CC}\e[0m (version \e[1;32m$config{GCCVER}.x\e[0m)\n";
+       print "I have detected the following compiler: \e[1;32m$config{CC}\e[0m (version \e[1;32m$config{GCCVER}.$config{GCCMINOR}\e[0m)\n";
 
        while (($config{GCCVER} < 3) || ($config{GCCVER} eq "")) {
                print "\e[1;32mIMPORTANT!\e[0m A GCC 2.x compiler has been detected, and
@@ -813,7 +773,8 @@ should NOT be used. You should probably specify a newer compiler.\n\n";
                        chomp(my $foo = `$config{CC} -dumpversion | cut -c 1`);
                        if ($foo ne "") {
                                chomp($config{GCCVER}       = `$config{CC} -dumpversion | cut -c 1`); # we must redo these if we change compilers
-                               print "Queried compiler: \e[1;32m$config{CC}\e[0m (version \e[1;32m$config{GCCVER}.x\e[0m)\n";
+                               chomp($config{GCCMINOR}     = `$config{CC} -dumpversion | cut -c 3`);
+                               print "Queried compiler: \e[1;32m$config{CC}\e[0m (version \e[1;32m$config{GCCVER}.$config{GCCMINOR}\e[0m)\n";
                                if ($config{GCCVER} < 3) {
                                        print "\e[1;32mGCC 2.x WILL NOT WORK!\e[0m. Let's try that again, shall we?\n";
                                }
@@ -841,22 +802,36 @@ should NOT be used. You should probably specify a newer compiler.\n\n";
        dir_check("is the IRCd binary to be placed", "BINARY_DIR");
        dir_check("are the IRCd libraries to be placed", "LIBRARY_DIR");
 
+       my $chose_hiperf = 0;
        if ($has_kqueue) {
                yesno('USE_KQUEUE',"You are running a BSD operating system, and kqueue\nwas detected. Would you like to enable kqueue support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable kqueue?");
                print "\n";
+               if ($config{USE_KQUEUE} eq "y") {
+                       $chose_hiperf = 1;
+               }
        }
        if ($has_epoll) {
                yesno('USE_EPOLL',"You are running a Linux 2.6+ operating system, and epoll\nwas detected. Would you like to enable epoll support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable epoll?");
                print "\n";
+               if ($config{USE_EPOLL} eq "y") {
+                       $chose_hiperf = 1;
+               }
        }
        if ($has_ports) {
                yesno('USE_PORTS',"You are running Solaris 10.\nWould you like to enable I/O completion ports support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable support for I/O completion ports?");
                print "\n";
+               if ($config{USE_PORTS} eq "y") {
+                       $chose_hiperf = 1;
+               }
        }
-       my $chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y") || ($config{USE_PORTS} 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";
+               yesno('USE_POLL', "Would you like to use poll?\n This is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable poll?\n");
+               if ($config{USE_POLL} ne "y")
+               {
+                       print "No high-performance socket engines are available, or you chose\n";
+                       print "not to enable one. Defaulting to select() engine.\n\n";
+               }
        }
 
        yesno('IPV6',"Would you like to build InspIRCd with IPv6 support?");
@@ -866,10 +841,32 @@ should NOT be used. You should probably specify a newer compiler.\n\n";
                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?\nIf you are using a recent operating\nsystem and are unsure, answer yes.\nIf you answer 'no' here, your InspIRCd server will be unable\nto parse IPV6 addresses (e.g. for CIDR bans)");
+               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 "")
+       {
+               $config{USE_FREEBSD_PORTS_SSL} = "y";
+               print "I have detected the OpenSSL FreeBSD port installed on your system,\n";
+               print "version \e[1;32m".$config{HAS_OPENSSL_PORT}."\e[0m. Your base system OpenSSL is version \e[1;32m".$openssl_ver."\e[0m.\n\n";
+               yesno('USE_FREEBSD_PORTS_SSL', "Do you want to use the FreeBSD ports version?");
+               print "\n";
+               $config{USE_FREEBSD_BASE_SSL} = "y" if ($config{USE_FREEBSD_PORTS_SSL} eq "n");
+
+               if ($config{USE_FREEBSD_BASE_SSL} eq "n")
+               {
+                       # update to port version
+                       $openssl_ver = $config{HAS_OPENSSL_PORT};
+               }
+       }
+       else
+       {
+               $config{USE_FREEBSD_BASE_SSL} = "y" if ($^O eq "freebsd");
+       }
+
        if (($config{HAS_GNUTLS} eq "y") && ($config{HAS_OPENSSL} eq "y")) {
                print "I have detected both \e[1;32mGnuTLS\e[0m and \e[1;32mOpenSSL\e[0m on your system.\n";
                print "I will default to GnuTLS. If you wish to use OpenSSL\n";
@@ -893,24 +890,6 @@ should NOT be used. You should probably specify a newer compiler.\n\n";
        else {
                print "\nCould not detect OpenSSL or GnuTLS. Make sure pkg-config is installed if\nyou intend to use OpenSSL, or that GnuTLS is in your path if you intend\nto use GnuTLS.\n\n";
        }
-
-       print "\nThe following questions will ask you for various figures relating\n";
-       print "To your IRCd install. Please note that these should usually be left\n";
-       print "as defaults unless you have a real reason to change them. If they\n";
-       print "changed, then the values must be identical on all servers on your\n";
-       print "network, or malfunctions and/or crashes may occur, with the exception\n";
-       print "of the 'maximum number of clients' setting which may be different on\n";
-       print "different servers on the network.\n\n";
-
-       promptnumeric("length of nicknames", "NICK_LENGT");
-       promptnumeric("length of channel names", "CHAN_LENGT");
-       promptnumeric("number of mode changes in one line", "MAXI_MODES");
-       promptnumeric("length of an ident (username)", "MAX_IDENT");
-       promptnumeric("length of a quit message", "MAX_QUIT");
-       promptnumeric("length of a channel topic", "MAX_TOPIC");
-       promptnumeric("length of a kick message", "MAX_KICK");
-       promptnumeric("length of a GECOS (real name)", "MAX_GECOS");
-       promptnumeric("length of an away message", "MAX_AWAY");
 }
 
 dumphash();
@@ -1116,7 +1095,7 @@ sub getosflags {
        $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 = "-Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared" unless defined $opt_disablerpath;
+       $SHARED = "-shared";
        $config{MAKEPROG} = "make";
 
        if ($config{OSNAME} =~ /darwin/i) {
@@ -1135,6 +1114,7 @@ sub getosflags {
                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";
        }
@@ -1187,8 +1167,6 @@ sub writefiles {
        {
                print "Writing \e[1;32minspircd_config.h\e[0m\n";
                open(FILEHANDLE, ">include/inspircd_config.h");
-               my $NL = $config{NICK_LENGT}+1;
-               my $CL = $config{CHAN_LENGT}+1;
                print FILEHANDLE <<EOF;
 /* Auto generated by configure, do not modify! */
 #ifndef __CONFIGURATION_AUTO__
@@ -1203,18 +1181,10 @@ sub writefiles {
 #define VERSION "$version"
 #define REVISION "$revision2"
 #define SOMAXCONN_S "$config{_SOMAXCONN}"
-#define NICKMAX $NL
-#define CHANMAX $CL
-#define MAXMODES $config{MAXI_MODES}
-#define IDENTMAX $config{MAX_IDENT}
-#define MAXQUIT $config{MAX_QUIT}
-#define MAXTOPIC $config{MAX_TOPIC}
-#define MAXKICK $config{MAX_KICK}
-#define MAXGECOS $config{MAX_GECOS}
-#define MAXAWAY $config{MAX_AWAY}
 #define OPTIMISATION $config{OPTIMITEMP}
 #define LIBRARYDIR "$config{LIBRARY_DIR}"
 #define SYSTEM "$incos"
+#define ENTRYPOINT int main(int argc, char** argv)
 
 EOF
 print FILEHANDLE "#define MAXBUF " . ($config{MAXBUF}+2) . "\n";
@@ -1228,6 +1198,13 @@ print FILEHANDLE "#define MAXBUF " . ($config{MAXBUF}+2) . "\n";
                if ($config{GCCVER} >= 3) {
                        print FILEHANDLE "#define GCC3\n";
                }
+               if (
+                       (($config{GCCVER} == 4) && ($config{GCCMINOR} >= 3))
+                               ||
+                       ($config{GCCVER} > 4)
+               ) {
+                       print FILEHANDLE "#define HASHMAP_DEPRECATED\n";
+               }
                if ($config{HAS_STRLCPY} eq "true") {
                        print FILEHANDLE "#define HAS_STRLCPY\n";
                }
@@ -1259,8 +1236,17 @@ print FILEHANDLE "#define MAXBUF " . ($config{MAXBUF}+2) . "\n";
                # 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";
-                       $se = "socketengine_select";
+                       print "no hi-perf, " . $config{USE_POLL};
+                       if ($config{USE_POLL} eq "y")
+                       {
+                               print FILEHANDLE "#define USE_POLL\n";
+                               $se = "socketengine_poll";
+                       }
+                       else
+                       {
+                               print FILEHANDLE "#define USE_SELECT\n";
+                               $se = "socketengine_select";
+                       }
                }
                print FILEHANDLE "\n#include \"threadengines/threadengine_pthread.h\"\n\n#endif\n";
                close(FILEHANDLE);
@@ -1291,12 +1277,12 @@ EOF
        chomp($modules);   # Remove Redundant whitespace..
 
        opendir(DIRHANDLE, "src/modules");
-       foreach my $name (sort readdir(DIRHANDLE)) {
-               if ($name =~ /^m_(.+?)$/) {
-                       if (defined(opendir(MDIRHANDLE, "src/modules/$name"))) {
+       foreach my $name2 (sort readdir(DIRHANDLE)) {
+               if ($name2 =~ /^m_(.+?)$/) {
+                       if (defined(opendir(MDIRHANDLE, "src/modules/$name2"))) {
                                closedir(MDIRHANDLE);
-                               $modules .= "$name.so ";
-                               $uninstall_list = $uninstall_list . "   -rm \$(MODULES)/$name.so\n";
+                               $modules .= "$name2.so ";
+                               $uninstall_list = $uninstall_list . "   -rm \$(MODULES)/$name2.so\n";
                        }
                }
        }
@@ -1546,6 +1532,8 @@ sub write_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))
        {
@@ -1571,6 +1559,9 @@ 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 ";
@@ -1584,9 +1575,20 @@ sub write_dynamic_makefile
                                while (defined(my $line = <CPP>))
                                {
                                        chomp($line);
-                                       if ($line =~ /\/\* \$Core: (\w+) \*\//i)
+                                       if ($line =~ /\/\* \$Core \*\//i)
                                        {
-                                               $filelist{$name} = $1;
+                                               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)
                                        {
@@ -1652,37 +1654,25 @@ sub write_dynamic_makefile
                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 $all = "all: ";
-       my $all_libsonly = "";
        my $libraryext = "";
-       my $othercrap = "";
-       my $RPATH = "";
+       my $binary_rule = "";
 
        if ($config{IS_DARWIN} eq "YES")
        {
                $libraryext = "dylib";
-               $othercrap = "  \@../make/run-cc.pl \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd.cpp\n       \@../make/run-cc.pl \$(CC) -pipe -dynamic -bind_at_load -L. -o inspircd \$(LDLIBS) inspircd.o "
+               $binary_rule = "        \@../make/run-cc.pl \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd.cpp\n       \@../make/run-cc.pl \$(CC) -pipe -dynamic -bind_at_load -L. -o inspircd \$(LDLIBS) inspircd.o "
        }
        else
        {
                $libraryext = "so";
-               $RPATH = "-Wl,--rpath -Wl,$config{LIBRARY_DIR}" unless defined $opt_disablerpath;
-               $othercrap = "  \@../make/run-cc.pl \$(CC) -pipe -I../include $RPATH \$(FLAGS) $freebsd4libs -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) ";
+               $binary_rule = "        \@../make/run-cc.pl \$(CC) -pipe -I../include \$(FLAGS) $freebsd4libs -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) ";
        }
 
-       foreach my $cpp (sort keys %filelist)
-       {
-               $all = $all . $filelist{$cpp} . "." . $libraryext . " ";
-               $all_libsonly = $all_libsonly . $filelist{$cpp} . "." . $libraryext . " ";
-               $install_list = $install_list . "       -install -m \$(INSTMODE) src/" . $filelist{$cpp} . "." . $libraryext . " \$(LIBPATH)\n";
-               $uninstall_list = $uninstall_list . "   -rm \$(LIBPATH)/" . $filelist{$cpp} . "." . $libraryext . "\n";
-       }
-       $all = $all . "moo inspircd\n";
-
-       $othercrap = $othercrap . " $all_libsonly\n\n";
-
        open(FH,">src/Makefile") or die("Could not write src/Makefile");
        print FH <<EOM;
 
@@ -1693,42 +1683,24 @@ RELCPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* /modes\\//
 
 EOM
 
-       print FH "$all\n\n";
-
-       my $deps = calcdeps("src/inspircd.cpp");
-       print FH "inspircd: inspircd.cpp $deps $all_libsonly\n";
-       print FH "$othercrap\n";
+       my $buildstring = "";
+       my $deps = "";
 
        foreach my $cpp (sort keys %filelist)
        {
-               my $thislib = $filelist{$cpp} . "." . $libraryext; 
                my $objs = $cpp;
                my $rawcpp = $cpp;
-               my $libcrap = "";
                $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};
                }
-               if ($config{IS_DARWIN} eq "YES")
-               {
-                       $libcrap = "-install_name " . $config{LIBRARY_DIR} . "/" . $thislib . " -dynamiclib -twolevel_namespace -undefined dynamic_lookup";
-               }
-               else
-               {
-                       if (defined $opt_disablerpath)
-                       {
-                               $libcrap = " -shared";
-                       }
-                       else
-                       {
-                               $libcrap = "-Wl,--rpath -Wl," . $config{LIBRARY_DIR} . " -shared";
-                       }
-               }
+
                $deps = calcdeps("src/$cpp");
                if (exists($extrasources{$cpp}))
                {
@@ -1741,15 +1713,31 @@ EOM
                                }
                        }
                }
-               print FH $thislib . ": $cpp $deps ". (defined($specialdeps{$cpp}) ? $specialdeps{$cpp} : "") . "\n";
-               print FH "      \@../make/run-cc.pl \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c $rawcpp\n";
+               $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 -export-dynamic
+                       $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) -export-dynamic -c $rawcpp\n";
+               }
+
                if (exists($extrabuildlines{$cpp}))
                {
-                       print FH "      " . $extrabuildlines{$cpp} . "\n";
+                       $buildstring = $buildstring . " " . $extrabuildlines{$cpp} . "\n";
                }
-               print FH "      \@../make/run-cc.pl \$(CC) -pipe $libcrap -o " . $thislib . " " . $objs . "\n\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
@@ -1775,7 +1763,7 @@ ITEM
        # now print the command file details.
        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/globals.h ../../include/inspircd_config.h ../../include/commands/cmd_$cmd.h
+cmd_$cmd.so: cmd_$cmd.cpp ../../include/base.h ../../include/modules.h ../../include/inspircd.h ../../include/channels.h ../../include/users.h ../../include/inspircd_config.h ../../include/commands/cmd_$cmd.h
        \@../../make/run-cc.pl \$(CC) -pipe -I../../include \$(FLAGS) -export-dynamic $SHARED -o cmd_$cmd.so cmd_$cmd.cpp
 
 ITEM