2 # InspIRCd Configuration Script
4 # Copyright 2003 The ChatSpike Development Team
5 # <brain@chatspike.net>
6 # <Craig@chatspike.net>
8 # [14:21] Brain: <matrix impression> i know perl-fu!
12 ########################################
14 chomp($topdir = `pwd`);
15 $this = resolve_directory($topdir); # PWD, Regardless.
16 @modlist = (); # Declare for Module List..
17 %config = (); # Initiate Configuration Hash..
18 $config{ME} = resolve_directory($topdir); # Present Working Directory
19 $config{BASE_DIR} = $config{ME}; # Use CWD as 'Base' Directory.
20 $config{CONFIG_DIR} = resolve_directory($config{ME}."/conf"); # Configuration Directory
21 $config{MODULE_DIR} = resolve_directory($config{ME}."/modules"); # Modules Directory
22 $config{BINARY_DIR} = resolve_directory($config{ME}."/bin"); # Binary Directory
23 $config{LIBRARY_DIR} = resolve_directory($config{ME}."/lib"); # Library Directory
24 chomp($config{HAS_GNUTLS} = `libgnutls-config --version 2>/dev/null | cut -c 1,2,3`); # GNUTLS Version.
25 chomp($config{HAS_OPENSSL} = `openssl version 2>/dev/null`); # Openssl version
26 $config{USE_GNUTLS} = "n"; # Use gnutls.
27 $config{USE_OPENSSL} = "n"; # Use openssl.
28 $config{OPTIMITEMP} = "0"; # Default Optimisation Value
29 $config{OPTIMISATI} = "-g"; # Optimisation Flag
30 $config{NICK_LENGT} = "31"; # Default Nick Length
31 $config{CHAN_LENGT} = "64"; # Default Channel Name Length
32 $config{MAX_CHANNE} = "20"; # Default Max. Channels per user
33 $config{MAX_OPERCH} = "60"; # Default Max. Channels per oper
34 $config{MAXI_MODES} = "20"; # Default Max. Number of Modes set at once.
35 $config{HAS_STRLCPY} = "false"; # strlcpy Check.
36 $config{USE_KQUEUE} = "y"; # kqueue enabled
37 $config{USE_EPOLL} = "y"; # epoll enabled
38 $config{THREADED_DNS} = "n"; # threaded dns (experimental)
39 $config{STATIC_LINK} = "no"; # are doing static modules?
40 chomp($config{MAX_CLIENT_T} = `sh -c \"ulimit -n\"`); # FD Limit
41 chomp($config{MAX_DESCRIPTORS} = `sh -c \"ulimit -n\"`); # Hard FD Limit
42 chomp($config{GCCVER} = `gcc -dumpversion | cut -c 1`); # Major GCC Version
43 chomp($config{GCC34} = `gcc -dumpversion | cut -c 3`); # Minor GCC Version
44 chomp($config{OSNAME} = `/bin/uname`); # Operating System Name
45 $config{CC} = "g++"; # C++ compiler
46 $config{MAKEORDER} = "ircd mods"; # build order
47 $config{STATICLIBS} = ""; # library archive path
48 $config{MAX_IDENT} = "12"; # max ident size
49 $config{MAX_QUIT} = "255"; # max quit message size
50 $config{MAX_TOPIC} = "307"; # max topic size
51 $config{MAX_KICK} = "255"; # max kick message size
52 $config{MAX_GECOS} = "128"; # max GECOS size
53 $config{MAX_AWAY} = "200"; # max AWAY size
55 $config{HAS_OPENSSL} =~ /OpenSSL (\S+) \d+ \S+ \d{4}/;
56 $config{HAS_OPENSSL} = $1;
58 # Minihack! Convert Cygwin to 'Cyg-Static' so i can
59 # Keep my dynamic module experiments here for later
62 if ($config{OSNAME} =~ /CYGWIN/) {
63 $config{OSNAME} = "CYG-STATIC";
66 if ((!$config{OSNAME}) || ($config{OSNAME} eq "")) {
67 chomp($config{OSNAME} = `/usr/bin/uname`);
68 if ((!$config{OSNAME}) || ($config{OSNAME} eq "")){
69 $config{OSNAME} = "Unknown";
73 if (!$config{MAX_CLIENT_T}) {
74 $config{MAX_CLIENT_T} = 1024; # Set a reasonable 'Default'
75 $fd_scan_fail = "true"; # Used Later
78 # Get and Set some important vars..
81 my $arg = $ARGV[0]; # Do Some Argument Checks..
82 if ($arg eq "-clean") {
83 system("rm -rf .config.cache");
84 } # Remove the config.cache file.
86 if ($arg eq "-update") {
87 # Does the cache file exist?
89 # No, No it doesn't.. *BASH*
90 print "You have not run ./configure before. Please do this before trying to run the update script.\n";
93 # We've Loaded the cache file and all our variables..
94 print "Updating Files..\n";
96 $has_epoll = $config{HAS_EPOLL};
97 $has_kqueue = $config{HAS_KQUEUE};
104 if ($arg eq "-svnupdate") {
106 open(FH,"<.svn/entries") or $fail = 1;
108 print "This is not an SVN copy of InspIRCd.\n";
111 system("svn update");
112 system("perl configure -update");
113 if ($ARGV[1] eq "rebuild") {
114 system("make install");
119 if ($arg eq "-modupdate") {
120 # Does the cache file exist?
122 # No, No it doesn't.. *BASH*
123 print "You have not run ./configure before. Please do this before trying to run the update script.\n";
126 # We've Loaded the cache file and all our variables..
127 print "Updating Files..\n";
129 $has_epoll = $config{HAS_EPOLL};
130 $has_kqueue = $config{HAS_KQUEUE};
131 if ($config{STATIC_LINK} eq "yes") {
132 write_static_modules_makefile();
134 write_dynamic_modules_makefile();
141 print "Checking for cache from previous configure...\n";
143 print "Checking operating system version...\n";
146 if (!$config{MAX_CLIENT}) {
147 # If the cache hasn't set the max clients, copy the variable of MAX_CLIENT_T, this
148 # allows us to keep _T for testing purposes. (ie. "Are you sure you want to go
149 # higher than the found value" :))
150 $config{MAX_CLIENT} = $config{MAX_CLIENT_T};
153 printf "Checking if strlcpy exists... ";
154 # Perform the strlcpy() test..
155 $config{HAS_STRLCPY} = "false";
157 open(STRLCPY, "</usr/include/string.h") or $fail = 1;
159 while (chomp($line = <STRLCPY>)) {
160 # try and find the delcaration of:
161 # size_t strlcpy(...)
162 if ($line =~ /size_t(\0x9|\s)+strlcpy/) {
163 $config{HAS_STRLCPY} = "true";
168 print "yes\n" if $config{HAS_STRLCPY} eq "true";
169 print "no\n" if $config{HAS_STRLCPY} eq "false";
171 printf "Checking if kqueue exists... ";
174 open(KQUEUE, "</usr/include/sys/event.h") or $fail = 1;
176 while (chomp($line = <KQUEUE>)) {
177 # try and find the delcaration of:
179 if ($line =~ /int(\0x9|\s)+kqueue/) {
185 print "yes\n" if $has_kqueue == 1;
186 print "no\n" if $has_kqueue == 0;
188 printf "Checking if epoll exists... ";
191 open(EPOLL, "</usr/include/sys/epoll.h") or $fail = 1;
197 my $kernel = `uname -r`;
199 if (($kernel =~ /2\.0/) || ($kernel =~ /2\.2/) || ($kernel =~ /2\.4/)) {
203 print "yes\n" if $has_epoll == 1;
204 print "no\n" if $has_epoll == 0;
206 if (($config{OSNAME} =~ /CYGWIN/) || ($config{OSNAME} eq "CYG-STATIC")) {
207 $config{HAS_STRLCPY} = "true";
210 $config{HAS_EPOLL} = $has_epoll;
211 $config{HAS_KQUEUE} = $has_kqueue;
213 printf "Checking for libgnutls... ";
214 if (($config{HAS_GNUTLS}) && (($config{HAS_GNUTLS} >= 1.2) || ($config{HAS_GNUTLS} eq "y"))) {
216 $config{HAS_GNUTLS} = "y";
219 $config{HAS_GNUTLS} = "n";
222 printf "Checking for openssl... ";
223 if (($config{HAS_OPENSSL}) && (($config{HAS_OPENSSL} >= 0.8) || ($config{HAS_OPENSSL} eq "y"))) {
225 $config{HAS_OPENSSL} = "y";
228 $config{HAS_OPENSSL} = "n";
231 ################################################################################
232 # BEGIN INTERACTIVE PART #
233 ################################################################################
237 # Display Splash Logo..
239 chomp($wholeos = `uname -mnr`);
241 my $rev = getrevision();
242 # Display Introduction Message..
244 Welcome to the InspIRCd Configuration program!
246 *** If you are unsure of any of these values, leave it blank for ***
247 *** standard settings that will work, and your server will run ***
248 *** using them. If you are running this server as part of a ***
249 *** larger network, you must consult with your network admins ***
250 *** for the proper values to use, or server links will be unstable! ***
252 Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter
253 a new value. Please note: You will \033[1mHAVE\033[0m to read the docs
254 dir, otherwise you won't have a config file!
256 Your operating system is: \033[1;32m$config{OSNAME}\033[0m ($wholeos), fdmax: $config{MAX_CLIENT_T}
257 Your InspIRCd revision ID is \033[1;32mr$rev\033[0m";
259 print " (Non-SVN build)";
263 $config{CHANGE_COMPILER} = "n";
264 print "I have detected the following compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.$config{GCC34}\033[0m)\n";
266 while (($config{GCCVER} < 3) || ($config{GCCVER} eq "")) {
267 print "\033[1;32mIMPORTANT!\033[0m A GCC 2.x compiler has been detected, and
268 should NOT be used. You should probably specify a newer compiler.\n\n";
269 yesno(CHANGE_COMPILER,"Do you want to change the compiler?");
270 if ($config{CHANGE_COMPILER} =~ /y/i) {
271 print "What command do you want to use to invoke your compiler?\n";
272 print "[\033[1;32m$config{CC}\033[0m] -> ";
273 chomp($config{CC} = <STDIN>);
274 if ($config{CC} eq "") {
277 chomp($foo = `$config{CC} -dumpversion | cut -c 1`);
279 chomp($config{GCCVER} = `$config{CC} -dumpversion | cut -c 1`); # we must redo these if we change
280 chomp($config{GCC34} = `$config{CC} -dumpversion | cut -c 3`); # the compiler path
281 print "Queried compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.$config{GCC34}\033[0m)\n";
282 if ($config{GCCVER} < 3) {
283 print "\033[1;32mGCC 2.x WILL NOT WORK!\033[0m. Let's try that again, shall we?\n";
287 print "\033[1;32mWARNING!\033[0m Could not execute the compiler you specified. You may want to try again.\n";
294 # Directory Settings..
295 my $tmpbase = $config{BASE_DIR};
296 dir_check("do you wish to install the InspIRCd base", "BASE_DIR");
297 if ($tmpbase ne $config{BASE_DIR}) {
298 $config{CONFIG_DIR} = resolve_directory($config{BASE_DIR}."/conf"); # Configuration Directory
299 $config{MODULE_DIR} = resolve_directory($config{BASE_DIR}."/modules"); # Modules Directory
300 $config{BINARY_DIR} = resolve_directory($config{BASE_DIR}."/bin"); # Binary Directory
301 $config{LIBRARY_DIR} = resolve_directory($config{BASE_DIR}."/lib"); # Library Directory
304 dir_check("are the configuration files", "CONFIG_DIR");
305 dir_check("are the modules to be compiled to", "MODULE_DIR");
306 dir_check("is the IRCd binary to be placed", "BINARY_DIR");
307 dir_check("are the IRCd libraries to be placed", "LIBRARY_DIR");
310 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?");
314 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?");
317 $chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y"));
318 if (!$chose_hiperf) {
319 print "No high-performance socket engines are available, or you chose\n";
320 print "not to enable one. Defaulting to select() engine.\n\n";
323 yesno(THREADED_DNS,"Would you like to enable the experimental multi-threaded DNS lookup?");
326 if (($config{HAS_GNUTLS} eq "y") && ($config{HAS_OPENSSL} eq "y")) {
327 print "I have detected both GnuTLS and OpenSSL on your system.\n";
328 print "I will default to GnuTLS. If you wish to use OpenSSL\n";
329 print "instead, you should enable the OpenSSL module yourself\n";
330 print "by copying it from src/modules/extra to src/modules.\n\n";
333 if ($config{HAS_GNUTLS} eq "y") {
334 yesno(USE_GNUTLS, "Would you like to enable SSL Support?");
335 if ($config{USE_GNUTLS} eq "y") {
336 print "\nUsing GnuTLS SSL module.\n";
338 } elsif ($config{HAS_OPENSSL} eq "y") {
339 yesno(USE_OPENSSL, "Would you like to enable SSL Support?");
340 if ($config{USE_OPENSSL} eq "y") {
341 print "\nUsing OpenSSL SSL module.\nYou will get better performance if you move to GnuTLS in the future.\n";
345 print "\nThe following questions will ask you for various figures relating\n";
346 print "To your IRCd install. Please note that these should usually be left\n";
347 print "as defaults unless you have a real reason to change them. If they\n";
348 print "changed, then the values must be identical on all servers on your\n";
349 print "network, or malfunctions and/or crashes may occur, with the exception\n";
350 print "of the 'maximum number of clients' setting which may be different on\n";
351 print "different servers on the network.\n\n";
353 # File Descriptor Settings..
356 print "Maximum number of clients at any one time ($config{MAX_CLIENT_T})\n";
357 print "[\033[1;32m$config{MAX_CLIENT}\033[0m] -> ";
358 chomp($var = <STDIN>);
360 $var = $config{MAX_CLIENT};
362 if ($var =~ /^\d+$/) {
363 if (($var > $config{MAX_CLIENT_T}) && ($fd_scan_failed ne true)) {
364 # Client has entered a larger number than the 'discovered' value
366 print "WARNING: Our scans have indicated that you are attempting
367 to use more sockets than there are avaliable. Are you sure
368 you wish to do this? It may cause the IRCd to malfunction [y/n]
369 [\033[1;32mn\033[0m] -> $c";
370 chomp($tmp = <STDIN>);
372 print "Please enter the correct value.\n\n";
377 print "You must enter a number in this field. Please try again.\n\n";
380 # If we get here, we should be good to go.
381 $config{MAX_CLIENT} = $var;
388 print "What is the maximum length of nicknames?\n";
389 print "[\033[1;32m$config{NICK_LENGT}\033[0m] -> ";
390 chomp($var = <STDIN>);
392 $var = $config{NICK_LENGT};
394 if ($var =~ /^\d+$/) {
395 # We don't care what the number is, set it and be on our way.
396 $config{NICK_LENGT} = $var;
400 print "You must enter a number in this field. Please try again.\n\n";
406 print "What is the maximum length of channel names?\n";
407 print "[\033[1;32m$config{CHAN_LENGT}\033[0m] -> ";
408 chomp($var = <STDIN>);
410 $var = $config{CHAN_LENGT};
412 if ($var =~ /^\d+$/) {
413 # We don't care what the number is, set it and be on our way.
414 $config{CHAN_LENGT} = $var;
418 print "You must enter a number in this field. Please try again.\n\n";
424 print "What is the maximum number of channels a normal user may join at any one time?\n";
425 print "[\033[1;32m$config{MAX_CHANNE}\033[0m] -> ";
426 chomp($var = <STDIN>);
428 $var = $config{MAX_CHANNE};
430 if ($var =~ /^\d+$/) {
431 # We don't care what the number is, set it and be on our way.
432 $config{MAX_CHANNE} = $var;
436 print "You must enter a number in this field. Please try again.\n\n";
442 print "What is the maximum number of channels an oper may join at any one time?\n";
443 print "[\033[1;32m$config{MAX_OPERCH}\033[0m] -> ";
444 chomp($var = <STDIN>);
446 $var = $config{MAX_OPERCH};
448 if ($var =~ /^\d+$/) {
449 # We don't care what the number is, set it and be on our way.
450 $config{MAX_OPERCH} = $var;
458 print "What is the maximum number of mode changes in one line?\n";
459 print "[\033[1;32m$config{MAXI_MODES}\033[0m] -> ";
460 chomp($var = <STDIN>);
462 $var = $config{MAXI_MODES};
464 if ($var =~ /^\d+$/) {
465 # We don't care what the number is, set it and be on our way.
466 $config{MAXI_MODES} = $var;
470 print "You must enter a number in this field. Please try again.\n\n";
476 print "What is the maximum length of an ident (username)?\n";
477 print "[\033[1;32m$config{MAX_IDENT}\033[0m] -> ";
478 chomp($var = <STDIN>);
480 $var = $config{MAX_IDENT};
482 if ($var =~ /^\d+$/) {
483 # We don't care what the number is, set it and be on our way.
484 $config{MAX_IDENT} = $var;
488 print "You must enter a number in this field. Please try again.\n\n";
494 print "What is the maximum length of a quit message?\n";
495 print "[\033[1;32m$config{MAX_QUIT}\033[0m] -> ";
496 chomp($var = <STDIN>);
498 $var = $config{MAX_QUIT};
500 if ($var =~ /^\d+$/) {
501 # We don't care what the number is, set it and be on our way.
502 $config{MAX_QUIT} = $var;
506 print "You must enter a number in this field. Please try again.\n\n";
512 print "What is the maximum length of a channel topic?\n";
513 print "[\033[1;32m$config{MAX_TOPIC}\033[0m] -> ";
514 chomp($var = <STDIN>);
516 $var = $config{MAX_TOPIC};
518 if ($var =~ /^\d+$/) {
519 # We don't care what the number is, set it and be on our way.
520 $config{MAX_TOPIC} = $var;
524 print "You must enter a number in this field. Please try again.\n\n";
530 print "What is the maximum length of a kick message?\n";
531 print "[\033[1;32m$config{MAX_KICK}\033[0m] -> ";
532 chomp($var = <STDIN>);
534 $var = $config{MAX_KICK};
536 if ($var =~ /^\d+$/) {
537 # We don't care what the number is, set it and be on our way.
538 $config{MAX_KICK} = $var;
542 print "You must enter a number in this field. Please try again.\n\n";
548 print "What is the maximum length of a GECOS (real name) field?\n";
549 print "[\033[1;32m$config{MAX_GECOS}\033[0m] -> ";
550 chomp($var = <STDIN>);
552 $var = $config{MAX_GECOS};
554 if ($var =~ /^\d+$/) {
555 # We don't care what the number is, set it and be on our way.
556 $config{MAX_GECOS} = $var;
560 print "You must enter a number in this field. Please try again.\n\n";
566 print "What is the maximum length of an away message?\n";
567 print "[\033[1;32m$config{MAX_AWAY}\033[0m] -> ";
568 chomp($var = <STDIN>);
570 $var = $config{MAX_AWAY};
572 if ($var =~ /^\d+$/) {
573 # We don't care what the number is, set it and be on our way.
574 $config{MAX_AWAY} = $var;
578 print "You must enter a number in this field. Please try again.\n\n";
583 print "Enter the Level Of Binary optimisation. This is a number between 0 and 3.
584 The InspIRCd Team will NOT support any bug reports above 0. Also note,
585 the IRCd behaviour will be different depending on this value. Please
586 read the documentation for more information.
588 The higher the number, the more optimised your binary will be. This
589 value will default to 0 if you either don't enter a number, or enter
590 a value outside the range.
592 As always, if you are unsure, just press enter and accept the default.\n\n";
593 print "[\033[1;32m$config{OPTIMITEMP}\033[0m] -> ";
594 chomp($var = <STDIN>);
596 $var = $config{OPTIMITEMP};
600 $config{OPTIMITEMP} = 1;
601 $config{OPTIMISATI} = "-O";
602 } elsif ($var eq "2") {
603 $config{OPTIMITEMP} = 2;
604 $config{OPTIMISATI} = "-O2";
605 } elsif ($var eq "3") {
606 $config{OPTIMITEMP} = 3;
607 $config{OPTIMISATI} = "-O3";
609 $config{OPTIMITEMP} = 0;
610 $config{OPTIMISATI} = "-g";
613 print "\n\033[1;32mPre-build configuration is complete!\033[0m\n\n";
614 print "\033[0mBase install path:\033[1;32m\t\t$config{BASE_DIR}\n";
615 print "\033[0mConfig path:\033[1;32m\t\t\t$config{CONFIG_DIR}\n";
616 print "\033[0mModule path:\033[1;32m\t\t\t$config{MODULE_DIR}\n";
617 print "\033[0mLibrary path:\033[1;32m\t\t\t$config{LIBRARY_DIR}\n";
618 print "\033[0mMax connections:\033[1;32m\t\t$config{MAX_CLIENT}\n";
619 print "\033[0mMax User Channels:\033[1;32m\t\t$config{MAX_CHANNE}\n";
620 print "\033[0mMax Oper Channels:\033[1;32m\t\t$config{MAX_OPERCH}\n";
621 print "\033[0mMax nickname length:\033[1;32m\t\t$config{NICK_LENGT}\n";
622 print "\033[0mMax channel length:\033[1;32m\t\t$config{CHAN_LENGT}\n";
623 print "\033[0mMax mode length:\033[1;32m\t\t$config{MAXI_MODES}\n";
624 print "\033[0mMax ident length:\033[1;32m\t\t$config{MAX_IDENT}\n";
625 print "\033[0mMax quit length:\033[1;32m\t\t$config{MAX_QUIT}\n";
626 print "\033[0mMax topic length:\033[1;32m\t\t$config{MAX_TOPIC}\n";
627 print "\033[0mMax kick length:\033[1;32m\t\t$config{MAX_KICK}\n";
628 print "\033[0mMax name length:\033[1;32m\t\t$config{MAX_GECOS}\n";
629 print "\033[0mMax away length:\033[1;32m\t\t$config{MAX_AWAY}\n";
630 print "\033[0mGCC Version Found:\033[1;32m\t\t$config{GCCVER}.$config{GCC34}\n";
631 print "\033[0mOptimization Flag:\033[1;32m\t\t$config{OPTIMISATI}\033[0m\n";
632 print "\033[0mCompiler program:\033[1;32m\t\t$config{CC}\033[0m\n";
633 print "\033[0mStatic modules:\033[1;32m\t\t\t$config{STATIC_LINK}\033[0m\n";
634 print "\033[0mMultithread DNS:\033[1;32m\t\t$config{THREADED_DNS}\033[0m\n";
635 print "\033[0mGnuTLS Support:\033[1;32m\t\t\t$config{USE_GNUTLS}\033[0m\n";
636 print "\033[0mOpenSSL Support:\033[1;32m\t\t$config{USE_OPENSSL}\033[0m\n\n";
638 if ($config{USE_GNUTLS} eq "y") {
640 open(TMP, "<src/modules/m_ssl_gnutls.cpp") or $failed = 1;
643 print "Symlinking src/modules/m_ssl_gnutls.cpp from extra/\n";
644 chdir("src/modules");
645 system("ln -s extra/m_ssl_gnutls.cpp");
650 open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
652 open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
655 print "SSL Certificates Not found, Generating.. \n\n
656 *************************************************************
657 * Generating the Private Key may take some time, go grab a *
658 * Coffee. Even better, to generate some more entropy if it *
659 * is taking a while, open another console and type du / a *
660 * few times and get that HD going :) Then answer the *
661 * Questions which follow. If you are unsure, just hit enter *
662 *************************************************************\n\n";
663 system("certtool --generate-privkey --outfile key.pem");
664 system("certtool --generate-self-signed --load-privkey key.pem --outfile cert.pem");
665 print "\nCertificate generation complete, copying to config directory... ";
666 system("mv key.pem $config{CONFIG_DIR}/key.pem");
667 system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
670 print "SSL Certificates found, skipping.\n\n"
672 } elsif ($config{USE_OPENSSL} eq "y") {
674 open(TMP, "<src/modules/m_ssl_openssl.cpp") or $failed = 1;
677 print "Symlinking src/modules/m_ssl_openssl.cpp from extra/\n";
678 chdir("src/modules");
679 system("ln -s extra/m_ssl_openssl.cpp");
684 open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
686 open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
689 print "SSL Certificates Not found, Generating.. \n\n
690 *************************************************************
691 * Generating the certificates may take some time, go grab a *
692 * coffee, or something. *
693 *************************************************************\n\n";
694 system("openssl req -x509 -nodes -newkey rsa:1024 -keyout key.pem -out cert.pem");
695 system("openssl dhparam -out dhparams.pem 1024");
696 print "\nCertificate generation complete, copying to config directory... ";
697 system("mv key.pem $config{CONFIG_DIR}/key.pem");
698 system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
699 system("mv dhparams.pem $config{CONFIG_DIR}/dhparams.pem");
702 print "SSL Certificates found, skipping.\n\n"
705 if (($config{USE_GNUTLS} eq "n") && ($config{USE_OPENSSL} eq "n")) {
706 print "Skipping SSL Certificate generation, SSL support is not available.\n\n";
714 print "To build your server with these settings, please type '\033[1;32m$config{MAKEPROG}\033[0m' now.\n";
715 if (($config{USE_GNUTLS} eq "y") || ($config{USE_OPENSSL} eq "y")) {
716 print "Please remember that to enable \033[1;32mSSL support\033[0m you must\n";
717 print "load the required modules in your config. This configure process\n";
718 print "has just prepared these modules to be compiled for you, and has not\n";
719 print "configured them to be compiled into the core of the ircd.\n";
721 print "*** \033[1;32mRemember to edit your configuration files!!!\033[0m ***\n\n\n";
722 if (($config{OSNAME} eq "OpenBSD") && ($config{CC} ne "eg++")) {
723 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";
726 if ($config{GCCVER} < "3") {
728 \033[1;32mWARNING!\033[0m You are attempting to compile InspIRCd on GCC 2.x!
729 GCC 2.x series compilers only had partial (read as broken) C++ support, and
730 your compile will most likely fail horribly! If you have any problems, do NOT
731 report them to the bugtracker or forums without first upgrading your compiler
732 to a newer 3.x or 4.x (or whatever is available currently) version.
736 ################################################################################
738 ################################################################################
740 # Retrieves the .config.cache file, and loads values into the main config hash.
741 open(CACHE, ".config.cache") or return undef;
744 # Ignore Blank lines, and comments..
747 my ($key, $value) = split("=", $_);
748 $value =~ /^\"(.*)\"$/;
749 # Do something with data here!
757 # Dump the contents of %config
758 print "Writing \033[1;32mcache file\033[0m for future ./configures ...\n";
759 open(FILEHANDLE, ">.config.cache");
760 foreach $key (keys %config) {
761 print FILEHANDLE "$key=\"$config{$key}\"\n";
767 my ($desc, $hash_key) = @_;
770 print "In what directory $desc?\n";
771 print "[\033[1;32m$config{$hash_key}\033[0m] -> ";
772 chomp($var = <STDIN>);
774 $var = $config{$hash_key};
776 if ($var =~ /^\~\/(.+)$/) {
777 # Convert it to a full path..
778 $var = resolve_directory($ENV{HOME} . "/" . $1);
780 if (substr($var,0,1) ne "/")
782 # Assume relative Path was given.. fill in the rest.
783 $var = $this . "/$var";
785 $var = resolve_directory($var);
787 print "$var does not exist. Create it?\n[\033[1;32my\033[0m] ";
788 chomp($tmp = <STDIN>);
789 if (($tmp eq "") || ($tmp =~ /^y/i)) {
790 # Attempt to Create the Dir..
791 $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256;
793 print "Unable to create directory. ($var)\n\n";
798 # They said they don't want to create, and we can't install there.
804 # Target exists, but is not a directory.
805 print "File $var exists, but is not a directory.\n\n";
809 # Either Dir Exists, or was created fine.
810 $config{$hash_key} = $var;
817 if ($config{OSNAME} =~ /BSD$/) {
818 $config{LDLIBS} = "-Ldl -lstdc++";
819 $config{FLAGS} = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
820 $config{MAKEPROG} = "gmake";
821 if ($config{OSNAME} eq "OpenBSD") {
822 chomp($foo = `eg++ -dumpversion | cut -c 1`);
823 # theyre running the package version of gcc (eg++)... detect it and set up its version numbers.
824 # if theyre not running this, configure lets the build continue but they probably wont manage to
825 # compile as this standard version is 2.95.3!
827 $config{CC} = "eg++";
828 chomp($config{GCCVER} = `eg++ -dumpversion | cut -c 1`); # we must redo these if we change
829 chomp($config{GCC34} = `eg++ -dumpversion | cut -c 3`); # the compiler path
833 $config{LDLIBS} = "-ldl -lstdc++";
834 $config{FLAGS} = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
835 $config{MAKEPROG} = "make";
836 if ($config{OSNAME} =~ /CYGWIN/) {
837 $config{FLAGS} = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
838 $config{LDLIBS} = "";
839 $config{MAKEPROG} = "/usr/bin/make";
840 $config{MAKEORDER} = "ircd mods";
841 } elsif ($config{OSNAME} eq "CYG-STATIC") {
842 $config{FLAGS} = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
843 $config{LDLIBS} = "";
844 $config{MAKEPROG} = "/usr/bin/make";
845 $config{MAKEORDER} = "mods ircd";
846 $config{STATICLIBS} = "modules/mods.a";
847 $config{STATIC_LINK} = "yes";
850 if ($config{OSNAME} =~ /SunOS/) {
851 # solaris/sunos needs these
852 # socket = bsd sockets api
854 # rt = POSIX realtime extensions
855 # resolv = inet_aton only (why isnt this in nsl?!)
856 $config{LDLIBS} = $config{LDLIBS} . " -lsocket -lnsl -lrt -lresolv";
874 opendir(DIRHANDLE, "src/modules");
875 foreach $name (sort readdir(DIRHANDLE)) {
876 if ($name =~ /^m_(.+)\.cpp$/)
879 if ($mod !~ /_static$/) {
880 $modlist[$i++] = $mod;
888 my $data = `svn info`;
893 $data =~ /Revision: (\d+)/;
895 if (!defined($rev)) {
902 print "Writing \033[1;32minspircd_config.h\033[0m\n";
903 # First File.. inspircd_config.h
904 chomp(my $incos = `uname -n -s -r`);
905 chomp(my $version = `sh ./src/version.sh`);
906 chomp(my $revision = getrevision());
907 $version = "$version(r$revision)";
908 chomp(my $revision2 = getrevision());
909 open(FILEHANDLE, ">include/inspircd_config.h");
910 my $NL = $config{NICK_LENGT}+1;
911 my $CL = $config{CHAN_LENGT}+1;
912 print FILEHANDLE <<EOF;
913 /* Auto generated by configure, do not modify! */
914 #ifndef __CONFIGURATION_AUTO__
915 #define __CONFIGURATION_AUTO__
917 #define CONFIG_FILE "$config{CONFIG_DIR}/inspircd.conf"
918 #define MOD_PATH "$config{MODULE_DIR}"
919 #define VERSION "$version"
920 #define REVISION "$revision2"
921 #define MAXCLIENTS $config{MAX_CLIENT}
922 #define MAX_DESCRIPTORS $config{MAX_DESCRIPTORS}
925 #define MAXCHANS $config{MAX_CHANNE}
926 #define OPERMAXCHANS $config{MAX_OPERCH}
927 #define MAXMODES $config{MAXI_MODES}
928 #define IDENTMAX $config{MAX_IDENT}
929 #define MAXQUIT $config{MAX_QUIT}
930 #define MAXTOPIC $config{MAX_TOPIC}
931 #define MAXKICK $config{MAX_KICK}
932 #define MAXGECOS $config{MAX_GECOS}
933 #define MAXAWAY $config{MAX_AWAY}
934 #define OPTIMISATION $config{OPTIMITEMP}
935 #define SYSTEM "$incos"
938 if ($config{OSNAME} =~ /SunOS/) {
939 print FILEHANDLE "#define IS_SOLARIS\n";
941 if ($config{OSNAME} =~ /CYGWIN/) {
942 print FILEHANDLE "#define IS_CYGWIN\n";
943 print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE 1024\n#endif\n";
945 if ($config{OSNAME} eq "CYG-STATIC") {
946 print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE 1024\n#endif\n";
949 if ($config{STATIC_LINK} eq "yes") {
950 print FILEHANDLE "#define STATIC_LINK\n";
952 if ($config{GCCVER} > 3) {
953 print FILEHANDLE "#define GCC3\n";
954 print FILEHANDLE "#define GCC34\n";
958 if ($config{GCCVER} == 3) {
959 print FILEHANDLE "#define GCC3\n";
960 if ($config{GCC34} > 3) {
961 print FILEHANDLE "#define GCC34\n";
965 if ($config{HAS_STRLCPY} eq "true") {
966 print FILEHANDLE "#define HAS_STRLCPY\n";
968 if ($config{THREADED_DNS} =~ /y/i) {
969 print FILEHANDLE "#define THREADED_DNS\n";
972 if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
973 print FILEHANDLE "#define USE_KQUEUE\n";
976 if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
977 print FILEHANDLE "#define USE_EPOLL\n";
980 # user didn't choose either epoll or select for their OS.
981 # default them to USE_SELECT (ewwy puke puke)
983 print FILEHANDLE "#define USE_SELECT\n";
985 print FILEHANDLE "\n#endif\n";
988 # Create a Modules List..
990 foreach $i (@modlist)
992 if ($config{STATIC_LINK} eq "yes") {
993 $modules .= "m_".$i.".o ";
996 $modules .= "m_".$i.".so ";
999 chomp($modules); # Remove Redundant whitespace..
1002 # Write all .in files.
1005 my $exe = "inspircd";
1007 if ($config{OSNAME} =~ /CYGWIN/) {
1008 $exe = "inspircd.exe";
1011 opendir(DIRHANDLE, $this);
1012 if ($config{THREADED_DNS} =~ /y/i) {
1013 $config{LDLIBS} = $config{LDLIBS} . " -pthread";
1015 foreach $name (sort readdir(DIRHANDLE)) {
1016 if ($name =~ /^\.(.+)\.inc$/) {
1018 # All .name.inc files need parsing!
1020 open(FILEHANDLE, ".$file.inc");
1021 while (<FILEHANDLE>) {
1026 $tmp =~ s/\@CC\@/$config{CC}/;
1027 $tmp =~ s/\@MAKEPROG\@/$config{MAKEPROG}/;
1028 $tmp =~ s/\@FLAGS\@/$config{FLAGS}/;
1029 $tmp =~ s/\@LDLIBS\@/$config{LDLIBS}/;
1030 $tmp =~ s/\@BASE_DIR\@/$config{BASE_DIR}/;
1031 $tmp =~ s/\@CONFIG_DIR\@/$config{CONFIG_DIR}/;
1032 $tmp =~ s/\@MODULE_DIR\@/$config{MODULE_DIR}/;
1033 $tmp =~ s/\@BINARY_DIR\@/$config{BINARY_DIR}/;
1034 $tmp =~ s/\@LIBRARY_DIR\@/$config{LIBRARY_DIR}/;
1035 $tmp =~ s/\@MODULES\@/$modules/;
1036 $tmp =~ s/\@EXECUTABLE\@/$exe/;
1037 $tmp =~ s/\@MAKEORDER\@/$config{MAKEORDER}/;
1038 $tmp =~ s/\@STATICLIBS\@/$config{STATICLIBS}/;
1040 print "Writing \033[1;32m$file\033[0m\n";
1041 open(FILEHANDLE, ">$file");
1042 print FILEHANDLE $tmp;
1045 closedir(DIRHANDLE);
1047 # Make inspircd executable!
1048 chmod 0744, 'inspircd';
1050 if ($config{STATIC_LINK} eq "yes") {
1051 print "Writing static-build \033[1;32msrc/Makefile\033[0m\n";
1052 write_static_makefile();
1053 write_static_modules_makefile();
1054 } elsif ($config{OSNAME} =~ /CYGWIN/) {
1055 print "Writing cygwin-build \033[1;32msrc/Makefile\033[0m\n";
1056 write_static_makefile();
1057 write_dynamic_modules_makefile();
1059 print "Writing dynamic-build \033[1;32msrc/Makefile\033[0m\n";
1060 write_dynamic_makefile();
1061 write_dynamic_modules_makefile();
1065 sub getcompilerflags {
1069 if ($_ =~ /^\/\* \$CompileFlags: (.+) \*\/$/) {
1078 sub getlinkerflags {
1082 if ($_ =~ /^\/\* \$LinkerFlags: (.+) \*\/$/) {
1092 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";
1093 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";
1094 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";
1095 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";
1096 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";
1097 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";
1098 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";
1099 print "\033[0m\033[0m....::..::::..:::......:::..:::::::::....::..:::::..:::......:::........:::\n\n";
1102 sub resolve_directory {
1104 return File::Spec->rel2abs($_[0]);
1108 my ($flag,$prompt) = @_;
1109 print "$prompt [\033[1;32m$config{$flag}\033[0m] -> ";
1110 chomp($tmp = <STDIN>);
1111 if ($tmp eq "") { $tmp = $config{$flag} }
1113 if (($tmp eq "") || ($tmp =~ /^y/i)) {
1114 $config{$flag} = "y";
1116 $config{$flag} = "n";
1121 sub write_static_modules_makefile {
1122 # Modules Makefile..
1123 print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
1124 open(FILEHANDLE, ">src/modules/Makefile");
1127 # Module Makefile Header
1129 print FILEHANDLE <<EOF;
1130 # (C) ChatSpike development team
1131 # Makefile by <Craig\@ChatSpike.net>
1132 # Many Thanks to Andrew Church <achurch\@achurch.org>
1133 # for assisting with making this work right.
1135 # Automatically Generated by ./configure to add a modules
1136 # please run ./configure --update
1142 # End Module Makefile Header
1145 # Create a Modules List..
1150 open(MODLIST,">include/modlist.h");
1153 # Include File Header
1155 print MODLIST <<HEADER;
1156 // Generated automatically by configure. DO NOT EDIT!
1158 #ifndef __SYMBOLS__H_CONFIGURED__
1159 #define __SYMBOLS__H_CONFIGURED__
1163 # End Include File Header
1166 # Place Module List into Include
1167 foreach $i (@modlist) {
1168 if ($i !~ /_static$/) {
1169 print MODLIST "extern \"C\" void * $i\_init (void);\n";
1172 print MODLIST "\nstruct {const char *name; initfunc *value; } modsyms[] = {\n";
1177 foreach $i (@modlist)
1179 if ($i !~ /_static$/) {
1180 $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
1181 $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
1184 # Write Entry to the Makefile
1186 print FILEHANDLE <<EOCHEESE;
1187 m_$i.o: m_$i\_static.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h
1188 \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c m_$i\_static.cpp
1189 mv m_$i\_static.o ../m_$i.o
1193 # End Write Entry to the MakeFile
1195 print "Configuring module [\033[1;32mm_$i.so\033[0m] for static linking... ";
1196 open(MODULE,"<src/modules/m_".$i.".cpp") or die("Could not open m_".$i.".cpp");
1197 open(MUNGED,">src/modules/m_".$i."_static.cpp") or die("Could not create m_".$i."_static.cpp");
1198 while (chomp($a = <MODULE>)) {
1199 $a =~ s/init_module/$i\_init/g;
1200 print MUNGED "$a\n";
1204 print MODLIST <<EOENT;
1205 {"m_$i.so",\&$i\_init},
1210 print MODLIST "{0}};\n\n#endif\n";
1214 sub write_dynamic_modules_makefile {
1215 # Modules Makefile..
1216 print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
1217 open(FILEHANDLE, ">src/modules/Makefile");
1220 if ($config{OSNAME} =~ /CYGWIN/) {
1221 $extra = "../inspircd.dll.a";
1225 # Module Makefile Header
1227 print FILEHANDLE <<EOF;
1228 # (C) ChatSpike development team
1229 # Makefile by <Craig\@ChatSpike.net>
1230 # Many Thanks to Andrew Church <achurch\@achurch.org>
1231 # for assisting with making this work right.
1233 # Automatically Generated by ./configure to add a modules
1234 # please run ./configure -update or ./configure -modupdate
1240 # End Module Makefile Header
1243 # Create a Modules List..
1249 foreach $i (@modlist) {
1251 # Write Entry to the MakeFile
1253 $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
1254 $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
1255 print FILEHANDLE <<EOCHEESE;
1256 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
1257 \$(CC) -pipe -I../../include \$(FLAGS) $cmflags -export-dynamic -c m_$i.cpp
1258 \$(CC) \$(FLAGS) -shared $liflags -o m_$i.so m_$i.o $extra
1261 $crud = $crud . " install -v -m 0700 m_$i.so \$(MODPATH)\n";
1263 # End Write Entry to the MakeFile
1266 print FILEHANDLE "modinst:\n \@echo \"Installing modules...\"\n" . $crud;
1270 sub write_static_makefile {
1271 open(FH,">src/Makefile") or die("Could not write src/Makefile!");
1274 opendir(DIRHANDLE, "src");
1275 foreach $name (sort readdir(DIRHANDLE)) {
1276 if ($name =~ /^cmd_(.+)\.cpp$/) {
1277 $cmdlist[$i++] = $1;
1280 closedir(DIRHANDLE);
1283 foreach my $cmd (@cmdlist) {
1284 $cmdobjs = $cmdobjs . "cmd_$cmd.o ";
1285 $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
1290 # (C) ChatSpike development team
1291 # Makefile by <Craig\@ChatSpike.net>
1292 # Makefile version 2 (statically linked core) by <brain\@inspircd.org>
1295 CC = im a cheezeball
1297 CXXFLAGS = -I../include \${FLAGS}
1301 # This next section is for cygwin dynamic module builds.
1302 # Basically, what we do, is build the inspircd core as a library
1303 # then the main executable uses that. the library is capable of
1304 # loading / unloading the modules dynamically :)
1305 # Massive thanks to the guys on #cygwin @ irc.freenode.net for helping
1309 if ($config{OSNAME} =~ /CYGWIN/) {
1311 all: timer.o 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
1313 inspircd.exe: inspircd.dll.a
1316 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 timer.o
1317 \$(CC) -shared -Wl,--out-implib=inspircd.dll.a -o inspircd.dll \$^
1321 all: timer.o 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
1323 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
1324 \$(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 timer.o \$(MODULES)
1330 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
1331 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1333 command_parse.o: command_parse.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1334 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1336 userprocess.o: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1337 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1339 socketengine.o: socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1340 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
1342 hashcomp.o: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1343 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1345 helperfuncs.o: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1346 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1348 channels.o: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1349 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1351 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
1352 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1354 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
1355 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1357 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
1358 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1360 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
1361 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1363 base.o: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1364 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1366 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
1367 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_io.cpp
1369 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
1370 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
1372 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 $srcobjs
1373 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp $cmdobjs
1375 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
1376 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
1378 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
1379 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1381 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
1382 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1384 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
1385 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1387 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
1388 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1390 socket.o: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1391 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1393 aes.o: aes.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1394 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c aes.cpp
1396 timer.o: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1397 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp
1400 foreach my $cmd (@cmdlist) {
1402 cmd_$cmd.o: 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/cmd_$cmd.h
1403 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
1409 sub write_dynamic_makefile {
1413 opendir(DIRHANDLE, "src");
1414 foreach $name (sort readdir(DIRHANDLE)) {
1415 if ($name =~ /^cmd_(.+)\.cpp$/) {
1416 $cmdlist[$i++] = $1;
1419 closedir(DIRHANDLE);
1423 foreach my $cmd (@cmdlist) {
1424 $cmdobjs = $cmdobjs . "cmd_$cmd.o ";
1425 $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
1428 open(FH,">src/Makefile") or die("Could not write src/Makefile");
1432 # (C) ChatSpike development team
1433 # Makefile by <Craig\@ChatSpike.net>
1434 # Makefile version 2 (dynamically linked core) by <brain\@inspircd.org>
1437 CC = im a cheezeball
1439 CXXFLAGS = -I../include \${FLAGS}
1441 all: libIRCDtimer.so libIRCDaes.so libIRCDcull_list.so libIRCDuserprocess.so libIRCDsocketengine.so libIRCDsocket.so libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDio.so libIRCDmessage.so $cmdobjs libIRCDcommands.so libIRCDdnsqueue.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so inspircd
1443 inspircd: inspircd.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/channels.h ../include/globals.h ../include/inspircd_config.h ../include/socket.h
1444 \$(CC) -I../include -Wl,--rpath -Wl,$config{LIBRARY_DIR} \$(FLAGS) -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDio.so libIRCDmessage.so libIRCDcommands.so libIRCDdnsqueue.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDhash.so libIRCDsocket.so libIRCDsocketengine.so libIRCDuserprocess.so libIRCDcull_list.so libIRCDcommand_parse.so libIRCDaes.so libIRCDtimer.so
1446 libIRCDsocketengine.so: socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1447 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
1448 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocketengine.so socketengine.o
1450 libIRCDcommand_parse.so: command_parse.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1451 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1452 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommand_parse.so command_parse.o
1454 libIRCDcull_list.so: cull_list.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/users.h ../include/channels.h
1455 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1456 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcull_list.so cull_list.o
1458 libIRCDuserprocess.so: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1459 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1460 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDuserprocess.so userprocess.o
1462 libIRCDhash.so: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1463 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1464 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhash.so hashcomp.o
1466 libIRCDhelper.so: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1467 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1468 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhelper.so helperfuncs.o
1470 libIRCDchannels.so: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1471 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1472 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDchannels.so channels.o
1474 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
1475 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1476 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmode.so mode.o
1478 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
1479 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1480 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDxline.so xline.o
1482 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
1483 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1484 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDstring.so inspstring.o
1486 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
1487 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1488 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDasyncdns.so dns.o
1490 libIRCDbase.so: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1491 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1492 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDbase.so base.o
1494 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
1495 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_io.cpp
1496 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDio.so inspircd_io.o
1498 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
1499 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
1500 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmessage.so message.o
1502 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 $srcobjs
1503 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
1504 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommands.so commands.o $cmdobjs
1506 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
1507 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
1508 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdnsqueue.so dnsqueue.o
1510 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
1511 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1512 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdynamic.so dynamic.o
1514 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
1515 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1516 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDusers.so users.o
1518 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
1519 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1520 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmodules.so modules.o
1522 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
1523 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1524 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDwildcard.so wildcard.o
1526 libIRCDsocket.so: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1527 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1528 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocket.so socket.o
1530 libIRCDaes.so: aes.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1531 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c aes.cpp
1532 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDaes.so aes.o
1534 libIRCDtimer.so: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1535 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp
1536 \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDtimer.so timer.o
1539 foreach my $cmd (@cmdlist) {
1541 cmd_$cmd.o: 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/cmd_$cmd.h
1542 \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp