$config{BINARY_DIR} = resolve_directory($config{ME}."/bin"); # Binary Directory
$config{LIBRARY_DIR} = resolve_directory($config{ME}."/lib"); # Library Directory
chomp($config{HAS_GNUTLS} = `libgnutls-config --version 2>/dev/null | cut -c 1,2,3`); # GNUTLS Version.
-$config{USE_GNUTLS} = "n"; # Use.
+chomp($config{HAS_OPENSSL} = `openssl version 2>/dev/null`); # Openssl version
+$config{USE_GNUTLS} = "n"; # Use gnutls.
+$config{USE_OPENSSL} = "n"; # Use openssl.
$config{OPTIMITEMP} = "0"; # Default Optimisation Value
$config{OPTIMISATI} = "-g"; # Optimisation Flag
$config{NICK_LENGT} = "31"; # Default Nick Length
$config{MAX_GECOS} = "128"; # max GECOS size
$config{MAX_AWAY} = "200"; # max AWAY size
+$config{HAS_OPENSSL} =~ /OpenSSL (\S+) \d+ \S+ \d{4}/;
+$config{HAS_OPENSSL} = $1;
+
+# Minihack! Convert Cygwin to 'Cyg-Static' so i can
+# Keep my dynamic module experiments here for later
+# concideration!
+
+if ($config{OSNAME} =~ /CYGWIN/) {
+ $config{OSNAME} = "CYG-STATIC";
+}
+
if ((!$config{OSNAME}) || ($config{OSNAME} eq "")) {
chomp($config{OSNAME} = `/usr/bin/uname`);
if ((!$config{OSNAME}) || ($config{OSNAME} eq "")){
getosflags();
$has_epoll = $config{HAS_EPOLL};
$has_kqueue = $config{HAS_KQUEUE};
- if ($config{OSNAME} =~ /CYGWIN/) {
+ if ($config{STATIC_LINK} eq "yes") {
write_static_modules_makefile();
} else {
write_dynamic_modules_makefile();
print "yes\n" if $has_epoll == 1;
print "no\n" if $has_epoll == 0;
-if ($config{OSNAME} =~ /CYGWIN/) {
+if (($config{OSNAME} =~ /CYGWIN/) || ($config{OSNAME} eq "CYG-STATIC")) {
$config{HAS_STRLCPY} = "true";
}
$config{HAS_GNUTLS} = "n";
}
+printf "Checking for openssl... ";
+if (($config{HAS_OPENSSL}) && (($config{HAS_OPENSSL} >= 0.8) || ($config{HAS_OPENSSL} eq "y"))) {
+ print "yes\n";
+ $config{HAS_OPENSSL} = "y";
+} else {
+ print "no\n";
+ $config{HAS_OPENSSL} = "n";
+}
+
################################################################################
# BEGIN INTERACTIVE PART #
################################################################################
yesno(THREADED_DNS,"Would you like to enable the experimental multi-threaded DNS lookup?");
print "\n";
+if (($config{HAS_GNUTLS} eq "y") && ($config{HAS_OPENSSL} eq "y")) {
+ print "I have detected both GnuTLS and OpenSSL on your system.\n";
+ print "I will default to GnuTLS. If you wish to use OpenSSL\n";
+ print "instead, you should enable the OpenSSL module yourself\n";
+ print "by copying it from src/modules/extra to src/modules.\n\n";
+}
+
if ($config{HAS_GNUTLS} eq "y") {
yesno(USE_GNUTLS, "Would you like to enable SSL Support?");
+ if ($config{USE_GNUTLS} eq "y") {
+ print "\nUsing GnuTLS SSL module.\n";
+ }
+} elsif ($config{HAS_OPENSSL} eq "y") {
+ yesno(USE_OPENSSL, "Would you like to enable SSL Support?");
+ if ($config{USE_OPENSSL} eq "y") {
+ print "\nUsing OpenSSL SSL module.\nYou will get better performance if you move to GnuTLS in the future.\n";
+ }
}
print "\nThe following questions will ask you for various figures relating\n";
print "\033[0mMax name length:\033[1;32m\t\t$config{MAX_GECOS}\n";
print "\033[0mMax away length:\033[1;32m\t\t$config{MAX_AWAY}\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[0mOptimization Flag:\033[1;32m\t\t$config{OPTIMISATI}\033[0m\n";
print "\033[0mCompiler program:\033[1;32m\t\t$config{CC}\033[0m\n";
print "\033[0mStatic modules:\033[1;32m\t\t\t$config{STATIC_LINK}\033[0m\n";
-print "\033[0mMultithread DNS:\033[1;32m\t\t$config{THREADED_DNS}\033[0m\n\n";
+print "\033[0mMultithread DNS:\033[1;32m\t\t$config{THREADED_DNS}\033[0m\n";
+print "\033[0mGnuTLS Support:\033[1;32m\t\t\t$config{USE_GNUTLS}\033[0m\n";
+print "\033[0mOpenSSL Support:\033[1;32m\t\t$config{USE_OPENSSL}\033[0m\n\n";
if ($config{USE_GNUTLS} eq "y") {
- `cp src/modules/extra/m_ssl_gnutls.cpp src/modules/m_ssl_gnutls.cpp`;
+ system("cp src/modules/extra/m_ssl_gnutls.cpp src/modules/m_ssl_gnutls.cpp");
+ getmodules();
$failed = 0;
- open(TMP, "key.pem") or $failed = 1;
+ open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
close(TMP);
- open(TMP, "cert.pem") or $failed = 1;
+ open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
close(TMP);
if ($failed) {
print "SSL Certificates Not found, Generating.. \n\n
system("certtool --generate-privkey --outfile key.pem");
system("certtool --generate-self-signed --load-privkey key.pem --outfile cert.pem");
print "\nCertificate generation complete, copying to config directory... ";
- `cp key.pem $config{CONFIG_DIR}/key.pem`;
- `cp cert.pem $config{CONFIG_DIR}/cert.pem`;
+ system("mv key.pem $config{CONFIG_DIR}/key.pem");
+ system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
print "Done.\n\n";
} else {
- print "SSL Certificates found, skipping."
+ print "SSL Certificates found, skipping.\n\n"
}
+} elsif ($config{USE_OPENSSL} eq "y") {
+ system("cp src/modules/extra/m_ssl_openssl.cpp src/modules/m_ssl_openssl.cpp");
+ getmodules();
+ $failed = 0;
+ open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
+ close(TMP);
+ open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
+ close(TMP);
+ if ($failed) {
+ print "SSL Certificates Not found, Generating.. \n\n
+*************************************************************
+* Generating the certificates may take some time, go grab a *
+* coffee, or something. *
+*************************************************************\n\n";
+ system("openssl req -x509 -nodes -newkey rsa:1024 -keyout key.pem -out cert.pem");
+ system("openssl dhparam -out dhparams.pem 1024");
+ print "\nCertificate generation complete, copying to config directory... ";
+ system("mv key.pem $config{CONFIG_DIR}/key.pem");
+ system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
+ system("mv dhparams.pem $config{CONFIG_DIR}/dhparams.pem");
+ print "Done.\n\n";
+ } else {
+ print "SSL Certificates found, skipping.\n\n"
+ }
+}
+if (($config{USE_GNUTLS} eq "n") && ($config{USE_OPENSSL} eq "n")) {
+ print "Skipping SSL Certificate generation, SSL support is not available.\n\n";
}
+getosflags();
makecache();
writefiles();
print "\n\n";
print "To build your server with these settings, please type '\033[1;32m$config{MAKEPROG}\033[0m' now.\n";
+if (($config{USE_GNUTLS} eq "y") || ($config{USE_OPENSSL} eq "y")) {
+ print "Please remember that to enable \033[1;32mSSL support\033[0m you must\n";
+ print "load the required modules in your config. This configure process\n";
+ print "has just prepared these modules to be compiled for you, and has not\n";
+ print "configured them to be compiled into the core of the ircd.\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 <<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;
sub getosflags {
if ($config{OSNAME} =~ /BSD$/) {
$config{LDLIBS} = "-Ldl -lstdc++";
- $config{FLAGS} = "-fPIC -frtti $OPTIMISATI -Wall -Woverloaded-virtual $config{OPTIMISATI}";
+ $config{FLAGS} = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
$config{MAKEPROG} = "gmake";
if ($config{OSNAME} eq "OpenBSD") {
chomp($foo = `eg++ -dumpversion | cut -c 1`);
}
} else {
$config{LDLIBS} = "-ldl -lstdc++";
- $config{FLAGS} = "-fPIC -frtti $OPTIMISATI -Wall -Woverloaded-virtual $config{OPTIMISATI}";
+ $config{FLAGS} = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
$config{MAKEPROG} = "make";
if ($config{OSNAME} =~ /CYGWIN/) {
- $config{FLAGS} = "-frtti $OPTIMISATI -Wall -Woverloaded-virtual $config{OPTIMISATI}";
+ $config{FLAGS} = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
+ $config{LDLIBS} = "";
+ $config{MAKEPROG} = "/usr/bin/make";
+ $config{MAKEORDER} = "ircd mods config bininst";
+ } elsif ($config{OSNAME} eq "CYG-STATIC") {
+ $config{FLAGS} = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
$config{LDLIBS} = "";
$config{MAKEPROG} = "/usr/bin/make";
$config{MAKEORDER} = "mods ircd config bininst";
print FILEHANDLE "#define IS_CYGWIN\n";
print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE 1024\n#endif\n";
}
+ if ($config{OSNAME} eq "CYG-STATIC") {
+ print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE 1024\n#endif\n";
+ }
+
if ($config{STATIC_LINK} eq "yes") {
print FILEHANDLE "#define STATIC_LINK\n";
}
my $modules = "";
foreach $i (@modlist)
{
- if ($config{OSNAME} =~ /CYGWIN/) {
+ if ($config{STATIC_LINK} eq "yes") {
$modules .= "m_".$i.".o ";
}
else {
# 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();
$cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
$liflags = getlinkerflags("src/modules/m_".$i.".cpp");
- print FILEHANDLE <<EOCHEESE;
###
- # Write Entry to the MakeFile
+ # Write Entry to the Makefile
###
+ print FILEHANDLE <<EOCHEESE;
m_$i.o: m_$i\_static.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h
\$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c m_$i\_static.cpp
mv m_$i\_static.o ../m_$i.o
# 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
# for assisting with making this work right.
#
# Automatically Generated by ./configure to add a modules
-# please run ./configure --update
+# please run ./configure -update or ./configure -modupdate
all: \$(MODULES)
###
# Write Entry to the MakeFile
###
+ $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
+ $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
print FILEHANDLE <<EOCHEESE;
m_$i.so: m_$i.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h ../../include/inspircd_config.h ../../include/inspircd.h ../../include/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)
#
# (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