summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.Makefile.inc1
-rwxr-xr-xconfigure59
-rw-r--r--src/dynamic.cpp12
3 files changed, 54 insertions, 18 deletions
diff --git a/.Makefile.inc b/.Makefile.inc
index 6783a9bb6..84774284c 100644
--- a/.Makefile.inc
+++ b/.Makefile.inc
@@ -53,6 +53,7 @@ bininst:
-install -v -m 0700 src/libIRCDwildcard.so $(LIBPATH)
-install -v -m 0700 src/libIRCDxline.so $(LIBPATH)
-install -v -m 0700 src/inspircd $(BINPATH)
+ -install -v -m 0700 src/inspircd.dll $(BINPATH)
-install -v -m 0700 inspircd $(BASE)
@echo "*************************************"
@echo "* BUILD COMPLETE! *"
diff --git a/configure b/configure
index a63f031ed..cf5c0fb19 100755
--- a/configure
+++ b/configure
@@ -661,15 +661,6 @@ print "*** \033[1;32mRemember to edit your configuration files!!!\033[0m ***\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 <<FOO;
-\033[1;32mWARNING!\033[0m CYGWIN does not properly support shared modules,
-so modules will be compiled statically into the core of the ircd. The modules
-will act like they are being loaded from disk and being unloaded from RAM,
-however they are in fact being enabled and disabled similar to features in
-other ircds.
-FOO
-}
if ($config{GCCVER} < "3") {
print <<FOO2;
@@ -786,9 +777,7 @@ sub getosflags {
$config{FLAGS} = "-frtti $OPTIMISATI -Wall -Woverloaded-virtual $config{OPTIMISATI}";
$config{LDLIBS} = "";
$config{MAKEPROG} = "/usr/bin/make";
- $config{MAKEORDER} = "mods ircd config bininst";
- $config{STATICLIBS} = "modules/mods.a";
- $config{STATIC_LINK} = "yes";
+ $config{MAKEORDER} = "ircd mods config bininst";
}
}
if ($config{OSNAME} =~ /SunOS/) {
@@ -913,7 +902,7 @@ EOF
my $modules = "";
foreach $i (@modlist)
{
- if ($config{OSNAME} =~ /CYGWIN/) {
+ if ($config{STATIC_LINK} eq "yes") {
$modules .= "m_".$i.".o ";
}
else {
@@ -972,12 +961,15 @@ EOF
# Make inspircd executable!
chmod 0744, 'inspircd';
- if ($config{OSNAME} =~ /CYGWIN/) {
+ if ($config{STATIC_LINK} eq "yes") {
print "Writing static-build \033[1;32msrc/Makefile\033[0m\n";
write_static_makefile();
write_static_modules_makefile();
- }
- else {
+ } elsif ($config{OSNAME} =~ /CYGWIN/) {
+ print "Writing cygwin-build \033[1;32msrc/Makefile\033[0m\n";
+ write_static_makefile();
+ write_dynamic_modules_makefile();
+ } else {
print "Writing dynamic-build \033[1;32msrc/Makefile\033[0m\n";
write_dynamic_makefile();
write_dynamic_modules_makefile();
@@ -1138,6 +1130,11 @@ sub write_dynamic_modules_makefile {
# Modules Makefile..
print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
open(FILEHANDLE, ">src/modules/Makefile");
+ my $extra = "";
+
+ if ($config{OSNAME} =~ /CYGWIN/) {
+ $extra = "../inspircd.dll.a";
+ }
###
# Module Makefile Header
@@ -1172,7 +1169,7 @@ foreach $i (@modlist) {
print FILEHANDLE <<EOCHEESE;
m_$i.so: m_$i.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h ../../include/inspircd_config.h ../../include/inspircd.h ../../include/inspircd_io.h
\$(CC) -pipe -I../../include \$(FLAGS) $cmflags -export-dynamic -c m_$i.cpp
- \$(CC) \$(FLAGS) -shared $liflags -o m_$i.so m_$i.o
+ \$(CC) \$(FLAGS) -shared $liflags -o m_$i.so m_$i.o $extra
\@-rm -f \$(MODPATH)/m_$i.so
install -v -m 0700 m_$i.so \$(MODPATH)
@@ -1206,17 +1203,43 @@ sub write_static_makefile {
#
# (C) ChatSpike development team
# Makefile by <Craig\@ChatSpike.net>
-# Makefile version 2 (dynamically linked core) by <brain\@inspircd.org>
+# Makefile version 2 (statically linked core) by <brain\@inspircd.org>
#
CC = im a cheezeball
CXXFLAGS = -I../include \${FLAGS}
+EOM
+###
+# This next section is for cygwin dynamic module builds.
+# Basically, what we do, is build the inspircd core as a library
+# then the main executable uses that. the library is capable of
+# loading / unloading the modules dynamically :)
+# Massive thanks to the guys on #cygwin @ irc.freenode.net for helping
+# make this work :)
+###
+
+if ($config{OSNAME} =~ /CYGWIN/) {
+ print FH <<EOM;
+all: aes.o command_parse.o cull_list.o userprocess.o socketengine.o socket.o hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_io.o message.o $cmdobjs commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o helperfuncs.o inspircd.exe
+
+inspircd.exe: inspircd.dll.a
+ \$(CC) -o \$@ \$^
+
+inspircd.dll inspircd.dll.a: inspircd.o channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_io.o message.o $cmdobjs commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o aes.o
+ \$(CC) -shared -Wl,--out-implib=inspircd.dll.a -o inspircd.dll \$^
+EOM
+} else {
+ print FH <<EOM;
all: aes.o command_parse.o cull_list.o userprocess.o socketengine.o socket.o hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_io.o message.o $cmdobjs commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o helperfuncs.o \$(MODULES) inspircd.exe
inspircd.exe: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h ../include/base.h
\$(CC) -I../include \$(FLAGS) inspircd.cpp -o inspircd.exe \$(LDLIBS) channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_io.o message.o $cmdobjs commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o aes.o \$(MODULES)
+EOM
+}
+
+print FH <<EOM;
cull_list.o: cull_list.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/users.h ../include/channels.h
\$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
diff --git a/src/dynamic.cpp b/src/dynamic.cpp
index 06aaf3ccd..1dfb823c6 100644
--- a/src/dynamic.cpp
+++ b/src/dynamic.cpp
@@ -53,6 +53,17 @@ DLLManager::DLLManager(char *fname)
}
err = "Module is not statically compiled into the ircd";
#else
+#ifdef IS_CYGWIN
+ // Cygwin behaviour is handled slightly differently
+ // With the advent of dynamic modules. Because Windows
+ // wont let you overwrite a file which is currently in
+ // Use, we can safely attempt to load the module from its
+ // Current location :)
+
+ h = dlopen(fname, RTLD_NOW );
+ err = (char*)dlerror();
+
+#else
// Copy the library to a temp location, this makes recompiles
// a little safer if the ircd is running at the time as the
// shared libraries are mmap()ed and not doing this causes
@@ -78,6 +89,7 @@ DLLManager::DLLManager(char *fname)
if (!Config->debugging)
unlink(tmpfile_template);
#endif
+#endif
}
DLLManager::~DLLManager()