]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - configure
bd5b3abd225c2d7866545e8f702e472adbf9e34b
[user/henk/code/inspircd.git] / configure
1 #!/usr/bin/perl
2 # InspIRCd Configuration Script
3 #
4 # Copyright 2003 The ChatSpike Development Team
5 # <brain@chatspike.net>
6 # <Craig@chatspike.net>
7 #
8 # [14:21] Brain: <matrix impression> i know perl-fu!
9 #
10 # $Id$
11 #
12 ########################################
13
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 config bininst";                       # 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
54
55 $config{HAS_OPENSSL} =~ /OpenSSL (\S+) \d+ \S+ \d{4}/;
56 $config{HAS_OPENSSL} = $1;
57
58 # Minihack! Convert Cygwin to 'Cyg-Static' so i can
59 # Keep my dynamic module experiments here for later
60 # concideration!
61
62 if ($config{OSNAME} =~ /CYGWIN/) {
63   $config{OSNAME} = "CYG-STATIC";
64 }
65
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";
70   }
71 }
72
73 if (!$config{MAX_CLIENT_T}) { 
74   $config{MAX_CLIENT_T} = 1024;                                 # Set a reasonable 'Default'
75   $fd_scan_fail = "true";                                       # Used Later
76 }
77
78 # Get and Set some important vars..
79 getmodules();
80
81 my $arg = $ARGV[0];                                             # Do Some Argument Checks..
82 if ($arg eq "-clean") { `rm -rf .config.cache`; }               # Remove the config.cache file.
83
84 if ($arg eq "-update") {
85   # Does the cache file exist?
86   if (!getcache()) {
87     # No, No it doesn't.. *BASH*
88     print "You have not run ./configure before. Please do this before trying to run the update script.\n";
89     exit 0;
90   } else {
91     # We've Loaded the cache file and all our variables..
92     print "Updating Files..\n";
93     getosflags();
94     $has_epoll = $config{HAS_EPOLL};
95     $has_kqueue = $config{HAS_KQUEUE};
96     writefiles();
97     print "Complete.\n";
98     exit;
99   }
100 }
101
102 if ($arg eq "-modupdate") {
103   # Does the cache file exist?
104   if (!getcache()) {
105     # No, No it doesn't.. *BASH*
106     print "You have not run ./configure before. Please do this before trying to run the update script.\n";
107     exit 0;
108   } else {
109     # We've Loaded the cache file and all our variables..
110     print "Updating Files..\n";
111     getosflags();
112     $has_epoll = $config{HAS_EPOLL};
113     $has_kqueue = $config{HAS_KQUEUE};
114     if ($config{STATIC_LINK} eq "yes") {
115       write_static_modules_makefile();
116     } else {
117       write_dynamic_modules_makefile();
118     }
119     print "Complete.\n";
120     exit;
121   }
122 }
123
124 print "Checking for cache from previous configure...\n";
125 getcache();
126 print "Checking operating system version...\n";
127 getosflags();
128
129 if (!$config{MAX_CLIENT}) { 
130   # If the cache hasn't set the max clients, copy the variable of MAX_CLIENT_T, this
131   # allows us to keep _T for testing purposes. (ie. "Are you sure you want to go
132   # higher than the found value" :))
133   $config{MAX_CLIENT} = $config{MAX_CLIENT_T};
134 }
135
136 printf "Checking if strlcpy exists... ";
137 # Perform the strlcpy() test..
138 $config{HAS_STRLCPY} = "false";
139 my $fail = 0;
140 open(STRLCPY, "</usr/include/string.h") or $fail = 1;
141 if (!$fail)
142 {
143         while (chomp($line = <STRLCPY>))
144         {
145                 # try and find the delcaration of:
146                 # size_t strlcpy(...)
147                 if ($line =~ /size_t(\0x9|\s)+strlcpy/)
148                 {
149                         $config{HAS_STRLCPY} = "true";
150                 }
151         }
152         close(STRLCPY);
153 }
154 print "yes\n" if $config{HAS_STRLCPY} eq "true";
155 print "no\n" if $config{HAS_STRLCPY} eq "false";
156
157 printf "Checking if kqueue exists... ";
158 $has_kqueue = 0;
159 $fail = 0;
160 open(KQUEUE, "</usr/include/sys/event.h") or $fail = 1;
161 if (!$fail)
162 {
163         while (chomp($line = <KQUEUE>))
164         {
165                 # try and find the delcaration of:
166                 # int kqueue(void);
167                 if ($line =~ /int(\0x9|\s)+kqueue/)
168                 {
169                         $has_kqueue = 1;
170                 }
171         }
172         close(KQUEUE);
173 }
174 print "yes\n" if $has_kqueue == 1;
175 print "no\n" if $has_kqueue == 0;
176
177 printf "Checking if epoll exists... ";
178 $has_epoll = 0;
179 $fail = 0;
180 open(EPOLL, "</usr/include/sys/epoll.h") or $fail = 1;
181 if (!$fail)
182 {
183         while (chomp($line = <EPOLL>))
184         {
185                 # try and find the declaration of:
186                 # extern int epoll_create (int __size) __THROW;
187                 if (($line =~ /int(\0x9|\s)+epoll_create(\0x9|\s)+\(/) || ($line =~ /int(\0x9|\s)+epoll_create\(/))
188                 {
189                         $has_epoll = 1;
190                 }
191         }
192         close(EPOLL);
193 }
194 if ($has_epoll) {
195         my $kernel = `uname -r`;
196         chomp($kernel);
197         if (($kernel =~ /2\.0/) || ($kernel =~ /2\.2/) || ($kernel =~ /2\.4/)) {
198                 $has_epoll = 0;
199         }
200 }
201 print "yes\n" if $has_epoll == 1;
202 print "no\n" if $has_epoll == 0;
203
204 if (($config{OSNAME} =~ /CYGWIN/) || ($config{OSNAME} eq "CYG-STATIC")) {
205         $config{HAS_STRLCPY} = "true";
206 }
207
208 $config{HAS_EPOLL} = $has_epoll;
209 $config{HAS_KQUEUE} = $has_kqueue; 
210
211 printf "Checking for libgnutls... ";
212 if (($config{HAS_GNUTLS}) && (($config{HAS_GNUTLS} >= 1.2) || ($config{HAS_GNUTLS} eq "y"))) {
213         print "yes\n";
214         $config{HAS_GNUTLS} = "y";
215 } else {
216         print "no\n";
217         $config{HAS_GNUTLS} = "n";
218 }
219
220 printf "Checking for openssl... ";
221 if (($config{HAS_OPENSSL}) && (($config{HAS_OPENSSL} >= 0.8) || ($config{HAS_OPENSSL} eq "y"))) {
222         print "yes\n";
223         $config{HAS_OPENSSL} = "y";
224 } else {
225         print "no\n";
226         $config{HAS_OPENSSL} = "n";
227 }
228
229 ################################################################################
230 #                          BEGIN INTERACTIVE PART                              #
231 ################################################################################
232
233 # Clear the Screen..
234 system("clear");
235 # Display Splash Logo..
236 show_splash();
237 chomp($wholeos = `uname -mnr`);
238
239 # Display Introduction Message..
240 print "
241 Welcome to the InspIRCd Configuration program!
242
243 *** If you are unsure of any of these values, leave it blank for    ***
244 *** standard settings that will work, and your server will run      ***
245 *** using them. If you are running this server as part of a         ***
246 *** larger network, you must consult with your network admins       ***
247 *** for the proper values to use, or server links will be unstable! ***
248
249 Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter
250 a new value. Please note: You will \033[1mHAVE\033[0m to read the docs
251 dir, otherwise you won't have a config file!
252
253 Your operating system is: \033[1;32m$config{OSNAME}\033[0m ($wholeos), fdmax: $config{MAX_CLIENT_T}\n\n";
254
255 $config{CHANGE_COMPILER} = "n";
256 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";
257
258 if ($config{GCCVER} < 3)
259 {
260         print "\033[1;32mIMPORTANT!\033[0m A GCC 2.x compiler has been detected, and
261 should NOT be used. You should probably specify a newer compiler.\n";
262 }
263 yesno(CHANGE_COMPILER,"Do you want to change the compiler?");
264 if ($config{CHANGE_COMPILER} =~ /y/i)
265 {
266     print "What command do you want to use to invoke your compiler?\n";
267     print "[\033[1;32m$config{CC}\033[0m] -> ";
268     chomp($config{CC} = <STDIN>);
269     if ($config{CC} eq "") { $config{CC} = "g++"; }
270     chomp($foo = `$config{CC} -dumpversion | cut -c 1`);
271     if ($foo ne "") {
272             chomp($config{GCCVER}       = `$config{CC} -dumpversion | cut -c 1`); # we must redo these if we change
273             chomp($config{GCC34}        = `$config{CC} -dumpversion | cut -c 3`); # the compiler path
274             print "Queried compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.$config{GCC34}\033[0m)\n";
275     }
276     else
277     {
278             print "\033[1;32mWARNING!\033[0m Could not execute the compiler you specified. You may want to try again.\n";
279     }
280 }
281
282 print "\n";
283
284 # Directory Settings..
285 my $tmpbase = $config{BASE_DIR};
286 dir_check("do you wish to install the InspIRCd base", "BASE_DIR");
287 if ($tmpbase ne $config{BASE_DIR}) {
288         $config{CONFIG_DIR}         = resolve_directory($config{BASE_DIR}."/conf");           # Configuration Directory
289         $config{MODULE_DIR}         = resolve_directory($config{BASE_DIR}."/modules");        # Modules Directory
290         $config{BINARY_DIR}         = resolve_directory($config{BASE_DIR}."/bin");            # Binary Directory
291         $config{LIBRARY_DIR}        = resolve_directory($config{BASE_DIR}."/lib");            # Library Directory
292 }
293
294 dir_check("are the configuration files", "CONFIG_DIR");
295 dir_check("are the modules to be compiled to", "MODULE_DIR");
296 dir_check("is the IRCd binary to be placed", "BINARY_DIR");
297 dir_check("are the IRCd libraries to be placed", "LIBRARY_DIR");
298
299 if ($has_kqueue) {
300         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?");
301         print "\n";
302 }
303 if ($has_epoll) {
304         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?");
305         print "\n";
306 }
307 $chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y"));
308 if (!$chose_hiperf)
309 {
310         print "No high-performance socket engines are available, or you chose\n";
311         print "not to enable one. Defaulting to select() engine.\n\n";
312 }
313
314 yesno(THREADED_DNS,"Would you like to enable the experimental multi-threaded DNS lookup?");
315 print "\n";
316
317 if (($config{HAS_GNUTLS} eq "y") && ($config{HAS_OPENSSL} eq "y")) {
318         print "I have detected both GnuTLS and OpenSSL on your system.\n";
319         print "I will default to GnuTLS. If you wish to use OpenSSL\n";
320         print "instead, you should enable the OpenSSL module yourself\n";
321         print "by copying it from src/modules/extra to src/modules.\n\n";
322 }
323
324 if ($config{HAS_GNUTLS} eq "y") {
325         yesno(USE_GNUTLS, "Would you like to enable SSL Support?");
326         if ($config{USE_GNUTLS} eq "y") {
327                 print "\nUsing GnuTLS SSL module.\n";
328         }
329 } elsif ($config{HAS_OPENSSL} eq "y") {
330         yesno(USE_OPENSSL, "Would you like to enable SSL Support?");
331         if ($config{USE_OPENSSL} eq "y") {
332                 print "\nUsing OpenSSL SSL module.\nYou will get better performance if you move to GnuTLS in the future.\n";
333         }
334 }
335
336 print "\nThe following questions will ask you for various figures relating\n";
337 print "To your IRCd install. Please note that these should usually be left\n";
338 print "as defaults unless you have a real reason to change them. If they\n";
339 print "changed, then the values must be identical on all servers on your\n";
340 print "network, or malfunctions and/or crashes may occur, with the exception\n";
341 print "of the 'maximum number of clients' setting which may be different on\n";
342 print "different servers on the network.\n\n";
343
344 # File Descriptor Settings..
345 my $continue = 0;
346 while (!$continue) {
347   print "Maximum number of clients at any one time ($config{MAX_CLIENT_T})\n";
348   print "[\033[1;32m$config{MAX_CLIENT}\033[0m] -> ";
349   chomp($var = <STDIN>);
350   if ($var eq "") { $var = $config{MAX_CLIENT}; }
351   if ($var =~ /^\d+$/) {
352     if (($var > $config{MAX_CLIENT_T}) && ($fd_scan_failed ne true)) {
353       # Client has entered a larger number than the 'discovered' value
354       # Confirm.
355       print "WARNING: Our scans have indicated that you are attempting
356 to use more sockets than there are avaliable. Are you sure
357 you wish to do this? It may cause the IRCd to malfunction [y/n]
358 [\033[1;32mn\033[0m] -> $c";
359       chomp($tmp = <STDIN>);
360       if ($tmp ne "y") {
361         print "Please enter the correct value.\n\n";
362         next;
363       }
364     }
365   } else {
366     print "You must enter a number in this field. Please try again.\n\n";
367     next;
368   }
369   # If we get here, we should be good to go.
370   $config{MAX_CLIENT} = $var;
371   $continue = 1;
372   print "\n";
373 }
374
375 my $continue = 0;
376 while (!$continue) {
377   print "What is the maximum length of nicknames?\n";
378   print "[\033[1;32m$config{NICK_LENGT}\033[0m] -> ";
379   chomp($var = <STDIN>);
380   if ($var eq "") { $var = $config{NICK_LENGT}; }
381   if ($var =~ /^\d+$/) {
382     # We don't care what the number is, set it and be on our way.
383     $config{NICK_LENGT} = $var;
384     $continue = 1;
385     print "\n";
386   } else {
387     print "You must enter a number in this field. Please try again.\n\n";
388   }
389 }
390
391 $continue = 0;
392 while (!$continue) {
393   print "What is the maximum length of channel names?\n";
394   print "[\033[1;32m$config{CHAN_LENGT}\033[0m] -> ";
395   chomp($var = <STDIN>);
396   if ($var eq "") { $var = $config{CHAN_LENGT}; }
397   if ($var =~ /^\d+$/) {
398     # We don't care what the number is, set it and be on our way.
399     $config{CHAN_LENGT} = $var;
400     $continue = 1;
401     print "\n";
402   } else {
403     print "You must enter a number in this field. Please try again.\n\n";
404   }
405 }
406
407 $continue = 0;
408 while (!$continue) {
409   print "What is the maximum number of channels a normal user may join at any one time?\n";
410   print "[\033[1;32m$config{MAX_CHANNE}\033[0m] -> ";
411   chomp($var = <STDIN>);
412   if ($var eq "") { $var = $config{MAX_CHANNE}; }
413   if ($var =~ /^\d+$/) {
414     # We don't care what the number is, set it and be on our way.
415     $config{MAX_CHANNE} = $var;
416     $continue = 1;
417     print "\n";
418   } else {
419     print "You must enter a number in this field. Please try again.\n\n";
420   }
421 }
422
423 $continue = 0;
424 while (!$continue) {
425   print "What is the maximum number of channels an oper may join at any one time?\n";
426   print "[\033[1;32m$config{MAX_OPERCH}\033[0m] -> ";
427   chomp($var = <STDIN>);
428   if ($var eq "") { $var = $config{MAX_OPERCH}; }
429   if ($var =~ /^\d+$/) {
430     # We don't care what the number is, set it and be on our way.
431     $config{MAX_OPERCH} = $var;
432     $continue = 1;
433     print "\n";
434  }
435 }
436
437 $continue = 0;
438 while (!$continue) {
439   print "What is the maximum number of mode changes in one line?\n";
440   print "[\033[1;32m$config{MAXI_MODES}\033[0m] -> ";
441   chomp($var = <STDIN>);
442   if ($var eq "") { $var = $config{MAXI_MODES}; }
443   if ($var =~ /^\d+$/) {
444     # We don't care what the number is, set it and be on our way.
445     $config{MAXI_MODES} = $var;
446     $continue = 1;
447     print "\n";
448   } else {
449     print "You must enter a number in this field. Please try again.\n\n";
450   }
451 }
452
453 $continue = 0;
454 while (!$continue) {
455   print "What is the maximum length of an ident (username)?\n";
456   print "[\033[1;32m$config{MAX_IDENT}\033[0m] -> ";
457   chomp($var = <STDIN>);
458   if ($var eq "") { $var = $config{MAX_IDENT}; }
459   if ($var =~ /^\d+$/) {
460     # We don't care what the number is, set it and be on our way.
461     $config{MAX_IDENT} = $var;
462     $continue = 1;
463     print "\n";
464   } else {
465     print "You must enter a number in this field. Please try again.\n\n";
466   }
467 }
468
469 $continue = 0;
470 while (!$continue) {
471   print "What is the maximum length of a quit message?\n";
472   print "[\033[1;32m$config{MAX_QUIT}\033[0m] -> ";
473   chomp($var = <STDIN>);
474   if ($var eq "") { $var = $config{MAX_QUIT}; }
475   if ($var =~ /^\d+$/) {
476     # We don't care what the number is, set it and be on our way.
477     $config{MAX_QUIT} = $var;
478     $continue = 1;
479     print "\n";
480   } else {
481     print "You must enter a number in this field. Please try again.\n\n";
482   }
483 }
484
485 $continue = 0;
486 while (!$continue) {
487   print "What is the maximum length of a channel topic?\n";
488   print "[\033[1;32m$config{MAX_TOPIC}\033[0m] -> ";
489   chomp($var = <STDIN>);
490   if ($var eq "") { $var = $config{MAX_TOPIC}; }
491   if ($var =~ /^\d+$/) {
492     # We don't care what the number is, set it and be on our way.
493     $config{MAX_TOPIC} = $var;
494     $continue = 1;
495     print "\n";
496   } else {
497     print "You must enter a number in this field. Please try again.\n\n";
498   }
499 }
500
501 $continue = 0;
502 while (!$continue) {
503   print "What is the maximum length of a kick message?\n";
504   print "[\033[1;32m$config{MAX_KICK}\033[0m] -> ";
505   chomp($var = <STDIN>);
506   if ($var eq "") { $var = $config{MAX_KICK}; }
507   if ($var =~ /^\d+$/) {
508     # We don't care what the number is, set it and be on our way.
509     $config{MAX_KICK} = $var;
510     $continue = 1;
511     print "\n";
512   } else {
513     print "You must enter a number in this field. Please try again.\n\n";
514   }
515 }
516
517 $continue = 0;
518 while (!$continue) {
519   print "What is the maximum length of a GECOS (real name) field?\n";
520   print "[\033[1;32m$config{MAX_GECOS}\033[0m] -> ";
521   chomp($var = <STDIN>);
522   if ($var eq "") { $var = $config{MAX_GECOS}; }
523   if ($var =~ /^\d+$/) {
524     # We don't care what the number is, set it and be on our way.
525     $config{MAX_GECOS} = $var;
526     $continue = 1;
527     print "\n";
528   } else {
529     print "You must enter a number in this field. Please try again.\n\n";
530   }
531 }
532
533 $continue = 0;
534 while (!$continue) {
535   print "What is the maximum length of an away message?\n";
536   print "[\033[1;32m$config{MAX_AWAY}\033[0m] -> ";
537   chomp($var = <STDIN>);
538   if ($var eq "") { $var = $config{MAX_AWAY}; }
539   if ($var =~ /^\d+$/) {
540     # We don't care what the number is, set it and be on our way.
541     $config{MAX_AWAY} = $var;
542     $continue = 1;
543     print "\n";
544   } else {
545     print "You must enter a number in this field. Please try again.\n\n";
546   }
547 }
548
549 # Code Optimisation
550 print "Enter the Level Of Binary optimisation. This is a number between 0 and 3.
551 The InspIRCd Team will NOT support any bug reports above 0. Also note,
552 the IRCd behaviour will be different depending on this value. Please
553 read the documentation for more information.
554
555 The higher the number, the more optimised your binary will be. This
556 value will default to 0 if you either don't enter a number, or enter
557 a value outside the range.
558
559 As always, if you are unsure, just press enter and accept the default.\n\n";
560 print "[\033[1;32m$config{OPTIMITEMP}\033[0m] -> ";
561 chomp($var = <STDIN>);
562 if ($var eq "") {
563   $var = $config{OPTIMITEMP};
564 }
565
566 if ($var eq "1") {
567   $config{OPTIMITEMP} = 1;
568   $config{OPTIMISATI} = "-O";
569 } elsif ($var eq "2") {
570   $config{OPTIMITEMP} = 2;
571   $config{OPTIMISATI} = "-O2";
572 } elsif ($var eq "3") {
573   $config{OPTIMITEMP} = 3;
574   $config{OPTIMISATI} = "-O3";
575 } else {
576   $config{OPTIMITEMP} = 0;
577   $config{OPTIMISATI} = "-g";
578 }
579
580 print "\n\033[1;32mPre-build configuration is complete!\033[0m\n\n";
581 print "\033[0mBase install path:\033[1;32m\t\t$config{BASE_DIR}\n";
582 print "\033[0mConfig path:\033[1;32m\t\t\t$config{CONFIG_DIR}\n";
583 print "\033[0mModule path:\033[1;32m\t\t\t$config{MODULE_DIR}\n";
584 print "\033[0mLibrary path:\033[1;32m\t\t\t$config{LIBRARY_DIR}\n";
585 print "\033[0mMax connections:\033[1;32m\t\t$config{MAX_CLIENT}\n";
586 print "\033[0mMax User Channels:\033[1;32m\t\t$config{MAX_CHANNE}\n";
587 print "\033[0mMax Oper Channels:\033[1;32m\t\t$config{MAX_OPERCH}\n";
588 print "\033[0mMax nickname length:\033[1;32m\t\t$config{NICK_LENGT}\n";
589 print "\033[0mMax channel length:\033[1;32m\t\t$config{CHAN_LENGT}\n";
590 print "\033[0mMax mode length:\033[1;32m\t\t$config{MAXI_MODES}\n";
591 print "\033[0mMax ident length:\033[1;32m\t\t$config{MAX_IDENT}\n";
592 print "\033[0mMax quit length:\033[1;32m\t\t$config{MAX_QUIT}\n";
593 print "\033[0mMax topic length:\033[1;32m\t\t$config{MAX_TOPIC}\n";
594 print "\033[0mMax kick length:\033[1;32m\t\t$config{MAX_KICK}\n";
595 print "\033[0mMax name length:\033[1;32m\t\t$config{MAX_GECOS}\n";
596 print "\033[0mMax away length:\033[1;32m\t\t$config{MAX_AWAY}\n";
597 print "\033[0mGCC Version Found:\033[1;32m\t\t$config{GCCVER}.$config{GCC34}\n";
598 print "\033[0mOptimization Flag:\033[1;32m\t\t$config{OPTIMISATI}\033[0m\n";
599 print "\033[0mCompiler program:\033[1;32m\t\t$config{CC}\033[0m\n";
600 print "\033[0mStatic modules:\033[1;32m\t\t\t$config{STATIC_LINK}\033[0m\n";
601 print "\033[0mMultithread DNS:\033[1;32m\t\t$config{THREADED_DNS}\033[0m\n";
602 print "\033[0mGnuTLS Support:\033[1;32m\t\t\t$config{USE_GNUTLS}\033[0m\n";
603 print "\033[0mOpenSSL Support:\033[1;32m\t\t$config{USE_OPENSSL}\033[0m\n\n";
604
605 if ($config{USE_GNUTLS} eq "y") {
606         system("ln -s src/modules/extra/m_ssl_gnutls.cpp src/modules/m_ssl_gnutls.cpp");
607         getmodules();
608         $failed = 0;
609         open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
610         close(TMP);
611         open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
612         close(TMP);
613         if ($failed) {
614                 print "SSL Certificates Not found, Generating.. \n\n
615 *************************************************************
616 * Generating the Private Key may take some time, go grab a  *
617 * Coffee. Even better, to generate some more entropy if it  *
618 * is taking a while, open another console and type du / a   *
619 * few times and get that HD going :) Then answer the        *
620 * Questions which follow. If you are unsure, just hit enter *
621 *************************************************************\n\n";
622                 system("certtool --generate-privkey --outfile key.pem");
623                 system("certtool --generate-self-signed --load-privkey key.pem --outfile cert.pem");
624                 print "\nCertificate generation complete, copying to config directory... ";
625                 system("mv key.pem $config{CONFIG_DIR}/key.pem");
626                 system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
627                 print "Done.\n\n";
628         } else {
629                 print "SSL Certificates found, skipping.\n\n"
630         }       
631 } elsif ($config{USE_OPENSSL} eq "y") {
632         system("ln -s src/modules/extra/m_ssl_openssl.cpp src/modules/m_ssl_openssl.cpp");
633         getmodules();
634         $failed = 0;
635         open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
636         close(TMP);
637         open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
638         close(TMP);
639         if ($failed) {
640                 print "SSL Certificates Not found, Generating.. \n\n
641 *************************************************************
642 * Generating the certificates may take some time, go grab a *
643 * coffee, or something.                                     *
644 *************************************************************\n\n";
645                 system("openssl req -x509 -nodes -newkey rsa:1024 -keyout key.pem -out cert.pem");
646                 system("openssl dhparam -out dhparams.pem 1024");
647                 print "\nCertificate generation complete, copying to config directory... ";
648                 system("mv key.pem $config{CONFIG_DIR}/key.pem");
649                 system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
650                 system("mv dhparams.pem $config{CONFIG_DIR}/dhparams.pem");
651                 print "Done.\n\n";
652         } else {
653                 print "SSL Certificates found, skipping.\n\n"
654         }
655 }
656 if (($config{USE_GNUTLS} eq "n") && ($config{USE_OPENSSL} eq "n")) {
657         print "Skipping SSL Certificate generation, SSL support is not available.\n\n";
658 }
659
660 getosflags();
661 makecache();
662 writefiles();
663
664 print "\n\n";
665 print "To build your server with these settings, please type '\033[1;32m$config{MAKEPROG}\033[0m' now.\n";
666 if (($config{USE_GNUTLS} eq "y") || ($config{USE_OPENSSL} eq "y")) {
667         print "Please remember that to enable \033[1;32mSSL support\033[0m you must\n";
668         print "load the required modules in your config. This configure process\n";
669         print "has just prepared these modules to be compiled for you, and has not\n";
670         print "configured them to be compiled into the core of the ircd.\n";
671 }
672 print "*** \033[1;32mRemember to edit your configuration files!!!\033[0m ***\n\n\n";
673 if (($config{OSNAME} eq "OpenBSD") && ($config{CC} ne "eg++")) {
674         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";
675 }
676
677 if ($config{GCCVER} < "3") {
678         print <<FOO2;
679 \033[1;32mWARNING!\033[0m You are attempting to compile InspIRCd on GCC 2.x!
680 GCC 2.x series compilers only had partial (read as broken) C++ support, and
681 your compile will most likely fail horribly! If you have any problems, do NOT
682 report them to the bugtracker or forums without first upgrading your compiler
683 to a newer 3.x or 4.x (or whatever is available currently) version.
684 FOO2
685 }
686
687 ################################################################################
688 #                              HELPER FUNCTIONS                                #
689 ################################################################################
690 sub getcache {
691   # Retrieves the .config.cache file, and loads values into the main config hash.
692   open(CACHE, ".config.cache") or return undef;
693   while (<CACHE>) {
694     chomp;
695
696     # Ignore Blank lines, and comments..
697     next if /^\s*$/;
698     next if /^\s*#/;
699
700     my ($key, $value) = split("=", $_);
701     $value =~ /^\"(.*)\"$/;
702     # Do something with data here!
703     $config{$key} = $1;
704   }
705   close(CONFIG);
706   return "true";
707 }
708
709 sub makecache {
710   # Dump the contents of %config
711   print "Writing \033[1;32mcache file\033[0m for future ./configures ...\n";
712   open(FILEHANDLE, ">.config.cache");
713   foreach $key (keys %config)
714   {
715     print FILEHANDLE "$key=\"$config{$key}\"\n";
716   }
717   close(FILEHANDLE);
718 }
719
720 sub dir_check {
721         my ($desc, $hash_key) = @_;
722         my $complete = 0;
723         while (!$complete) {
724                 print "In what directory $desc?\n";
725                 print "[\033[1;32m$config{$hash_key}\033[0m] -> ";
726                 chomp($var = <STDIN>);
727                 if ($var eq "") {
728                         $var = $config{$hash_key};
729                 }
730                 if ($var =~ /^\~\/(.+)$/) {
731                         # Convert it to a full path..
732                         $var = resolve_directory($ENV{HOME} . "/" . $1);
733                 }
734                 if (substr($var,0,1) ne "/")
735                 {
736                         # Assume relative Path was given.. fill in the rest.
737                         $var = $this . "/$var";
738                 }
739                 $var = resolve_directory($var); 
740                 if (! -e $var) {
741                         print "$var does not exist. Create it?\n[\033[1;32my\033[0m] ";
742                         chomp($tmp = <STDIN>);
743                         if (($tmp eq "") || ($tmp =~ /^y/i)) {
744                                 # Attempt to Create the Dir..
745                                 $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256;
746                                 if ($chk != 0) {
747                                         print "Unable to create directory. ($var)\n\n";
748                                         # Restart Loop..
749                                         next;
750                                 }
751                         } else {
752                                 # They said they don't want to create, and we can't install there.
753                                 print "\n\n";
754                                 next;
755                         }
756                 } else {
757                         if (!is_dir($var)) {
758                                 # Target exists, but is not a directory.
759                                 print "File $var exists, but is not a directory.\n\n";
760                                 next;
761                         }
762                 }
763                 # Either Dir Exists, or was created fine.
764                 $config{$hash_key} = $var;
765                 $complete = 1;
766                 print "\n";
767         }
768 }
769
770 sub getosflags {
771   if ($config{OSNAME} =~ /BSD$/) {
772     $config{LDLIBS} = "-Ldl -lstdc++";
773     $config{FLAGS}  = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
774     $config{MAKEPROG} = "gmake";
775     if ($config{OSNAME} eq "OpenBSD") {
776         chomp($foo = `eg++ -dumpversion | cut -c 1`);
777         # theyre running the package version of gcc (eg++)... detect it and set up its version numbers.
778         # if theyre not running this, configure lets the build continue but they probably wont manage to
779         # compile as this standard version is 2.95.3!
780         if ($foo ne "") {
781                 $config{CC} = "eg++";
782                 chomp($config{GCCVER}       = `eg++ -dumpversion | cut -c 1`); # we must redo these if we change
783                 chomp($config{GCC34}        = `eg++ -dumpversion | cut -c 3`); # the compiler path
784         }
785     }
786   } else {
787     $config{LDLIBS} = "-ldl -lstdc++";
788     $config{FLAGS}  = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
789     $config{MAKEPROG} = "make";
790     if ($config{OSNAME} =~ /CYGWIN/) {
791        $config{FLAGS}  = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
792        $config{LDLIBS} = "";
793        $config{MAKEPROG} = "/usr/bin/make";
794        $config{MAKEORDER} = "ircd mods config bininst";
795     } elsif ($config{OSNAME} eq "CYG-STATIC") {
796        $config{FLAGS} = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
797        $config{LDLIBS} = "";
798        $config{MAKEPROG} = "/usr/bin/make";
799        $config{MAKEORDER} = "mods ircd config bininst";
800        $config{STATICLIBS} = "modules/mods.a";
801        $config{STATIC_LINK} = "yes";
802     }
803   }
804   if ($config{OSNAME} =~ /SunOS/) {
805     # solaris/sunos needs these
806     # socket = bsd sockets api
807     # nsl = dns stuff
808     # rt = POSIX realtime extensions
809     # resolv = inet_aton only (why isnt this in nsl?!)
810     $config{LDLIBS} = $config{LDLIBS} . " -lsocket -lnsl -lrt -lresolv";
811   }
812 }
813
814 sub is_dir {
815         my ($path) = @_;
816         if (chdir($path)) {
817                 chdir($this);
818                 return 1;
819         } else {
820                 # Just in case..
821                 chdir($this);
822                 return 0;
823         }
824 }
825
826 sub getmodules {
827         my $i = 0;
828         opendir(DIRHANDLE, "src/modules");
829         foreach $name (sort readdir(DIRHANDLE)) {
830                 if ($name =~ /^m_(.+)\.cpp$/)
831                 {
832                         $mod = $1;
833                         if ($mod !~ /_static$/) {
834                                 $modlist[$i++] = $mod;
835                         }
836                 }
837         }
838         closedir(DIRHANDLE);
839 }
840
841 sub writefiles {
842
843         print "Writing \033[1;32minspircd_config.h\033[0m\n";
844         # First File.. inspircd_config.h
845         chomp(my $incos = `uname -n -s -r`);
846         chomp(my $version = `sh ./src/version.sh`);
847         open(FILEHANDLE, ">include/inspircd_config.h");
848         my $NL = $config{NICK_LENGT}+1;
849         my $CL = $config{CHAN_LENGT}+1;
850         print FILEHANDLE <<EOF;
851 /* Auto generated by configure, do not modify! */
852 #ifndef __CONFIGURATION_AUTO__
853 #define __CONFIGURATION_AUTO__
854
855 #define CONFIG_FILE "$config{CONFIG_DIR}/inspircd.conf"
856 #define MOD_PATH "$config{MODULE_DIR}"
857 #define VERSION "$version"
858 #define MAXCLIENTS $config{MAX_CLIENT}
859 #define MAX_DESCRIPTORS $config{MAX_DESCRIPTORS}
860 #define NICKMAX $NL
861 #define CHANMAX $CL
862 #define MAXCHANS $config{MAX_CHANNE}
863 #define OPERMAXCHANS $config{MAX_OPERCH}
864 #define MAXMODES $config{MAXI_MODES}
865 #define IDENTMAX $config{MAX_IDENT}
866 #define MAXQUIT $config{MAX_QUIT}
867 #define MAXTOPIC $config{MAX_TOPIC}
868 #define MAXKICK $config{MAX_KICK}
869 #define MAXGECOS $config{MAX_GECOS}
870 #define MAXAWAY $config{MAX_AWAY}
871 #define OPTIMISATION $config{OPTIMITEMP}
872 #define SYSTEM "$incos"
873 #define MAXBUF 514
874 EOF
875         if ($config{OSNAME} =~ /SunOS/) {
876                 print FILEHANDLE "#define IS_SOLARIS\n";
877         }
878         if ($config{OSNAME} =~ /CYGWIN/) {
879                 print FILEHANDLE "#define IS_CYGWIN\n";
880                 print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE        1024\n#endif\n";
881         }
882         if ($config{OSNAME} eq "CYG-STATIC") {
883                 print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE    1024\n#endif\n";
884         }
885
886         if ($config{STATIC_LINK} eq "yes") {
887                 print FILEHANDLE "#define STATIC_LINK\n";
888         }
889         if ($config{GCCVER} > 3) {
890                 print FILEHANDLE "#define GCC3\n";
891                 print FILEHANDLE "#define GCC34\n";
892         }
893         else
894         {
895                 if ($config{GCCVER} == 3) {
896                         print FILEHANDLE "#define GCC3\n";
897                         if ($config{GCC34} > 3) {
898                                 print FILEHANDLE "#define GCC34\n";
899                         }
900                 }
901         }
902         if ($config{HAS_STRLCPY} eq "true") {
903                 print FILEHANDLE "#define HAS_STRLCPY\n";
904         }
905         if ($config{THREADED_DNS} =~ /y/i) {
906                 print FILEHANDLE "#define THREADED_DNS\n";
907         }
908         my $use_hiperf = 0;
909         if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
910                 print FILEHANDLE "#define USE_KQUEUE\n";
911                 $use_hiperf = 1;
912         }
913         if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
914                 print FILEHANDLE "#define USE_EPOLL\n";
915                 $use_hiperf = 1;
916         }
917         # user didn't choose either epoll or select for their OS.
918         # default them to USE_SELECT (ewwy puke puke)
919         if (!$use_hiperf) {
920                 print FILEHANDLE "#define USE_SELECT\n";
921         }
922         print FILEHANDLE "\n#endif\n";
923         close(FILEHANDLE);
924
925         # Create a Modules List..
926         my $modules = "";
927         foreach $i (@modlist)
928         {
929                 if ($config{STATIC_LINK} eq "yes") {
930                         $modules .= "m_".$i.".o ";
931                 }
932                 else {
933                         $modules .= "m_".$i.".so ";
934                 }
935         }
936         chomp($modules);   # Remove Redundant whitespace..
937
938
939         # Write all .in files.
940         my $tmp = "";
941         my $file = "";
942         my $exe = "inspircd";
943
944         if ($config{OSNAME} =~ /CYGWIN/) {
945                 $exe = "inspircd.exe";
946         }
947
948         opendir(DIRHANDLE, $this);
949         if ($config{THREADED_DNS} =~ /y/i) {
950                 $config{LDLIBS} = $config{LDLIBS} . " -pthread";
951         }
952         foreach $name (sort readdir(DIRHANDLE)) {
953                 if ($name =~ /^\.(.+)\.inc$/) {
954                         $file = $1;
955                         # All .name.inc files need parsing!
956                         $tmp = "";
957                         open(FILEHANDLE, ".$file.inc");
958                         while (<FILEHANDLE>) {
959                                 $tmp .= $_;
960                         }
961                         close(FILEHANDLE);
962
963                         $tmp =~ s/\@CC\@/$config{CC}/;
964                         $tmp =~ s/\@MAKEPROG\@/$config{MAKEPROG}/;
965                         $tmp =~ s/\@FLAGS\@/$config{FLAGS}/;
966                         $tmp =~ s/\@LDLIBS\@/$config{LDLIBS}/;
967                         $tmp =~ s/\@BASE_DIR\@/$config{BASE_DIR}/;
968                         $tmp =~ s/\@CONFIG_DIR\@/$config{CONFIG_DIR}/;
969                         $tmp =~ s/\@MODULE_DIR\@/$config{MODULE_DIR}/;
970                         $tmp =~ s/\@BINARY_DIR\@/$config{BINARY_DIR}/;
971                         $tmp =~ s/\@LIBRARY_DIR\@/$config{LIBRARY_DIR}/;
972                         $tmp =~ s/\@MODULES\@/$modules/;
973                         $tmp =~ s/\@EXECUTABLE\@/$exe/;
974                         $tmp =~ s/\@MAKEORDER\@/$config{MAKEORDER}/;
975                         $tmp =~ s/\@STATICLIBS\@/$config{STATICLIBS}/;
976
977                         print "Writing \033[1;32m$file\033[0m\n";
978                         open(FILEHANDLE, ">$file");
979                         print FILEHANDLE $tmp;
980                 }
981         }
982         closedir(DIRHANDLE);
983
984         # Make inspircd executable!
985         chmod 0744, 'inspircd';
986
987         if ($config{STATIC_LINK} eq "yes") {
988                 print "Writing static-build \033[1;32msrc/Makefile\033[0m\n";
989                 write_static_makefile();
990                 write_static_modules_makefile();
991         } elsif ($config{OSNAME} =~ /CYGWIN/) {
992                 print "Writing cygwin-build \033[1;32msrc/Makefile\033[0m\n";
993                 write_static_makefile();
994                 write_dynamic_modules_makefile();
995         } else {
996                 print "Writing dynamic-build \033[1;32msrc/Makefile\033[0m\n";
997                 write_dynamic_makefile();
998                 write_dynamic_modules_makefile();
999         }
1000 }
1001
1002 sub getcompilerflags {
1003         my ($file) = @_;
1004         open(FLAGS, $file);
1005         while (<FLAGS>) {
1006         if ($_ =~ /^\/\* \$CompileFlags: (.+) \*\/$/) {
1007                 close(FLAGS);
1008                         return $1;
1009                 }
1010         }
1011         close(FLAGS);
1012         return undef;
1013 }
1014
1015 sub getlinkerflags {
1016         my ($file) = @_;
1017         open(FLAGS, $file);
1018         while (<FLAGS>) {
1019                 if ($_ =~ /^\/\* \$LinkerFlags: (.+) \*\/$/) {
1020                         close(FLAGS);
1021                         return $1;
1022                 }
1023         }
1024         close(FLAGS);
1025         return undef;
1026 }
1027
1028 sub show_splash {
1029   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";
1030   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";
1031   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";
1032   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";
1033   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";
1034   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";
1035   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";
1036   print "\033[0m\033[0m....::..::::..:::......:::..:::::::::....::..:::::..:::......:::........:::\n\n";
1037 }
1038
1039 sub resolve_directory {
1040         use File::Spec;
1041         return File::Spec->rel2abs($_[0]);
1042 }
1043
1044 sub yesno {
1045         my ($flag,$prompt) = @_;
1046         print "$prompt [\033[1;32m$config{$flag}\033[0m] -> ";
1047         chomp($tmp = <STDIN>);
1048         if ($tmp eq "") { $tmp = $config{$flag} }
1049
1050         if (($tmp eq "") || ($tmp =~ /^y/i)) {
1051                 $config{$flag} = "y";
1052         } else {
1053                 $config{$flag} = "n";
1054         }
1055         return;
1056 }
1057
1058 sub write_static_modules_makefile {
1059         # Modules Makefile..
1060         print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
1061         open(FILEHANDLE, ">src/modules/Makefile");
1062
1063         ###
1064         # Module Makefile Header
1065         ###
1066         print FILEHANDLE <<EOF;
1067 # (C) ChatSpike development team
1068 # Makefile by <Craig\@ChatSpike.net>
1069 # Many Thanks to Andrew Church <achurch\@achurch.org>
1070 #    for assisting with making this work right.
1071 #
1072 # Automatically Generated by ./configure to add a modules
1073 # please run ./configure --update
1074
1075 all: \$(MODULES)
1076
1077 EOF
1078         ###
1079         # End Module Makefile Header
1080         ###
1081
1082         # Create a Modules List..
1083         my $modules = "";
1084         my $cmflags = "";
1085         my $liflags = "";
1086
1087         open(MODLIST,">include/modlist.h");
1088
1089         ###
1090         # Include File Header
1091         ###
1092         print MODLIST <<HEADER;
1093 // Generated automatically by configure. DO NOT EDIT!
1094
1095 #ifndef __SYMBOLS__H_CONFIGURED__
1096 #define __SYMBOLS__H_CONFIGURED__
1097
1098 HEADER
1099         ###
1100         # End Include File Header
1101         ###
1102
1103         # Place Module List into Include
1104         foreach $i (@modlist) {
1105                 if ($i !~ /_static$/) {
1106                         print MODLIST "extern \"C\" void * $i\_init (void);\n";
1107                 }
1108         }
1109         print MODLIST "\nstruct {const char *name; initfunc *value; } modsyms[] = {\n";
1110
1111         ###
1112         # Build Module Crap
1113         ###
1114         foreach $i (@modlist)
1115         {
1116                 if ($i !~ /_static$/) {
1117                         $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
1118                         $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
1119
1120                         ###
1121                         # Write Entry to the Makefile
1122                         ###
1123                         print FILEHANDLE <<EOCHEESE;
1124 m_$i.o: m_$i\_static.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h
1125         \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c m_$i\_static.cpp
1126         mv m_$i\_static.o ../m_$i.o
1127
1128 EOCHEESE
1129                         ###
1130                         # End Write Entry to the MakeFile
1131                         ###
1132                         print "Configuring module [\033[1;32mm_$i.so\033[0m] for static linking... ";
1133                         open(MODULE,"<src/modules/m_".$i.".cpp") or die("Could not open m_".$i.".cpp");
1134                         open(MUNGED,">src/modules/m_".$i."_static.cpp") or die("Could not create m_".$i."_static.cpp");
1135                         while (chomp($a = <MODULE>)) { 
1136                                 $a =~ s/init_module/$i\_init/g;
1137                                 $a =~ s/Srv/$i\Srv/g;
1138                                 print MUNGED "$a\n";
1139                         }
1140                         close(MODULE);
1141                         close(MUNGED);
1142                         print MODLIST <<EOENT;
1143 {"m_$i.so",\&$i\_init},
1144 EOENT
1145                         print "done\n";
1146                 }
1147         }
1148         print MODLIST "{0}};\n\n#endif\n";
1149         close(MODLIST);
1150 }
1151
1152 sub write_dynamic_modules_makefile {
1153         # Modules Makefile..
1154         print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
1155         open(FILEHANDLE, ">src/modules/Makefile");
1156         my $extra = "";
1157
1158         if ($config{OSNAME} =~ /CYGWIN/) {
1159                 $extra = "../inspircd.dll.a";
1160         }
1161
1162 ###
1163 # Module Makefile Header
1164 ###
1165         print FILEHANDLE <<EOF;
1166 # (C) ChatSpike development team
1167 # Makefile by <Craig\@ChatSpike.net>
1168 # Many Thanks to Andrew Church <achurch\@achurch.org>
1169 #    for assisting with making this work right.
1170 #
1171 # Automatically Generated by ./configure to add a modules
1172 # please run ./configure -update or ./configure -modupdate
1173
1174 all: \$(MODULES)
1175
1176 EOF
1177         ###
1178         # End Module Makefile Header
1179         ###
1180
1181         # Create a Modules List..
1182         my $modules = "";
1183         my $cmflags = "";
1184         my $liflags = "";
1185
1186         foreach $i (@modlist) {
1187         ###
1188         # Write Entry to the MakeFile
1189         ###
1190         $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
1191         $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
1192         print FILEHANDLE <<EOCHEESE;
1193 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
1194         \$(CC) -pipe -I../../include \$(FLAGS) $cmflags -export-dynamic -c m_$i.cpp
1195         \$(CC) \$(FLAGS) -shared $liflags -o m_$i.so m_$i.o $extra
1196         \@-rm -f \$(MODPATH)/m_$i.so
1197         install -v -m 0700 m_$i.so \$(MODPATH)
1198
1199 EOCHEESE
1200         ###
1201         # End Write Entry to the MakeFile
1202         ###
1203         }
1204 }
1205
1206
1207 sub write_static_makefile {
1208         open(FH,">src/Makefile") or die("Could not write src/Makefile!");
1209         my $i = 0;
1210         my @cmdlist = ();
1211         opendir(DIRHANDLE, "src");
1212         foreach $name (sort readdir(DIRHANDLE)) {
1213                 if ($name =~ /^cmd_(.+)\.cpp$/) {
1214                         $cmdlist[$i++] = $1;
1215                 }
1216         }
1217         closedir(DIRHANDLE);
1218         my $cmdobjs = "";
1219         my $srcobjs = "";
1220         foreach my $cmd (@cmdlist) {
1221                 $cmdobjs = $cmdobjs . "cmd_$cmd.o ";
1222                 $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
1223         }
1224         print FH <<EOM;
1225 # Insp Makefile :p
1226 #
1227 # (C) ChatSpike development team
1228 # Makefile by <Craig\@ChatSpike.net>
1229 # Makefile version 2 (statically linked core) by <brain\@inspircd.org>
1230 #
1231
1232 CC = im a cheezeball
1233
1234 CXXFLAGS = -I../include \${FLAGS}
1235
1236 EOM
1237         ###
1238         # This next section is for cygwin dynamic module builds.
1239         # Basically, what we do, is build the inspircd core as a library
1240         # then the main executable uses that. the library is capable of
1241         # loading / unloading the modules dynamically :)
1242         # Massive thanks to the guys on #cygwin @ irc.freenode.net for helping
1243         # make this work :)
1244         ###
1245
1246         if ($config{OSNAME} =~ /CYGWIN/) {
1247                 print FH <<EOM;
1248 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
1249
1250 inspircd.exe: inspircd.dll.a
1251         \$(CC) -o \$@ \$^
1252
1253 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
1254         \$(CC) -shared -Wl,--out-implib=inspircd.dll.a -o inspircd.dll \$^
1255 EOM
1256         } else {
1257                 print FH <<EOM;
1258 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
1259
1260 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
1261         \$(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)
1262 EOM
1263         }
1264
1265         print FH <<EOM;
1266
1267 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
1268         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1269
1270 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
1271         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1272
1273 userprocess.o: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1274         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1275
1276 socketengine.o: socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1277         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
1278
1279 hashcomp.o: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1280         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1281
1282 helperfuncs.o: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1283         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1284
1285 channels.o: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1286         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1287
1288 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
1289         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1290
1291 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
1292         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1293
1294 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
1295         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1296
1297 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
1298         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1299
1300 base.o: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1301         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1302
1303 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
1304         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_io.cpp
1305
1306 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
1307         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
1308
1309 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
1310         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp $cmdobjs
1311
1312 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
1313         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
1314
1315 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
1316         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1317
1318 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
1319         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1320
1321 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
1322         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1323
1324 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
1325         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1326
1327 socket.o: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1328         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1329
1330 aes.o: aes.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1331         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c aes.cpp
1332
1333 EOM
1334         foreach my $cmd (@cmdlist) {
1335                 print FH <<ITEM;
1336 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
1337         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
1338 ITEM
1339         }
1340         close(FH);
1341 }
1342
1343 sub write_dynamic_makefile {
1344
1345         my $i = 0;
1346         my @cmdlist = ();
1347         opendir(DIRHANDLE, "src");
1348         foreach $name (sort readdir(DIRHANDLE)) {
1349                 if ($name =~ /^cmd_(.+)\.cpp$/) {
1350                         $cmdlist[$i++] = $1;
1351                 }
1352         }
1353         closedir(DIRHANDLE);
1354
1355         my $cmdobjs = "";
1356         my $srcobjs = "";
1357         foreach my $cmd (@cmdlist) {
1358                 $cmdobjs = $cmdobjs . "cmd_$cmd.o ";
1359                 $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
1360         }
1361
1362         open(FH,">src/Makefile") or die("Could not write src/Makefile");
1363         print FH <<EOM;
1364 # Insp Makefile :p
1365 #
1366 # (C) ChatSpike development team
1367 # Makefile by <Craig\@ChatSpike.net>
1368 # Makefile version 2 (dynamically linked core) by <brain\@inspircd.org>
1369 #
1370
1371 CC = im a cheezeball
1372
1373 CXXFLAGS = -I../include \${FLAGS}
1374
1375 all: 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
1376
1377 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
1378         \$(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
1379
1380 libIRCDsocketengine.so: socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1381         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
1382         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocketengine.so socketengine.o
1383
1384 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
1385         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1386         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommand_parse.so command_parse.o
1387
1388 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
1389         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1390         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcull_list.so cull_list.o
1391
1392 libIRCDuserprocess.so: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1393         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1394         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDuserprocess.so userprocess.o
1395
1396 libIRCDhash.so: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1397         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1398         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhash.so hashcomp.o
1399
1400 libIRCDhelper.so: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1401         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1402         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhelper.so helperfuncs.o
1403
1404 libIRCDchannels.so: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1405         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1406         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDchannels.so channels.o
1407
1408 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
1409         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1410         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmode.so mode.o
1411
1412 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
1413         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1414         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDxline.so xline.o
1415
1416 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
1417         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1418         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDstring.so inspstring.o
1419
1420 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
1421         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1422         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDasyncdns.so dns.o
1423
1424 libIRCDbase.so: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1425         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1426         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDbase.so base.o
1427
1428 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
1429         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_io.cpp
1430         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDio.so inspircd_io.o
1431
1432 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
1433         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
1434         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmessage.so message.o
1435
1436 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
1437         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
1438         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommands.so commands.o $cmdobjs
1439
1440 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
1441         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
1442         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdnsqueue.so dnsqueue.o
1443
1444 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
1445         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1446         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdynamic.so dynamic.o
1447
1448 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
1449         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1450         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDusers.so users.o
1451
1452 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
1453         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1454         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmodules.so modules.o
1455
1456 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
1457         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1458         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDwildcard.so wildcard.o
1459
1460 libIRCDsocket.so: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1461         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1462         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocket.so socket.o
1463
1464 libIRCDaes.so: aes.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1465         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c aes.cpp
1466         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDaes.so aes.o
1467
1468 EOM
1469         foreach my $cmd (@cmdlist) {
1470                 print FH <<ITEM;
1471 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
1472         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
1473
1474 ITEM
1475         }
1476         close(FH);
1477 }