]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - configure
Fixed SOME of craigs horrendous lack of any indenting whatsoever
[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 "") { $var = $config{$hash_key}; }
728     if ($var =~ /^\~\/(.+)$/) {
729         # Convert it to a full path..
730         $var = resolve_directory($ENV{HOME} . "/" . $1);
731     }
732     if (substr($var,0,1) ne "/")
733     {
734         # Assume relative Path was given.. fill in the rest.
735         $var = $this . "/$var";
736     }
737     $var = resolve_directory($var); 
738     if (! -e $var) {
739       print "$var does not exist. Create it?\n[\033[1;32my\033[0m] ";
740       chomp($tmp = <STDIN>);
741       if (($tmp eq "") || ($tmp =~ /^y/i)) {
742         # Attempt to Create the Dir..
743         $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256;
744         if ($chk != 0) {
745           print "Unable to create directory. ($var)\n\n";
746           # Restart Loop..
747           next;
748         }
749       } else {
750         # They said they don't want to create, and we can't install there.
751         print "\n\n";
752         next;
753       }
754     } else {
755       if (!is_dir($var)) {
756         # Target exists, but is not a directory.
757         print "File $var exists, but is not a directory.\n\n";
758         next;
759       }
760     }
761     # Either Dir Exists, or was created fine.
762     $config{$hash_key} = $var;
763     $complete = 1;
764     print "\n";
765   }
766 }
767
768 sub getosflags {
769   if ($config{OSNAME} =~ /BSD$/) {
770     $config{LDLIBS} = "-Ldl -lstdc++";
771     $config{FLAGS}  = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
772     $config{MAKEPROG} = "gmake";
773     if ($config{OSNAME} eq "OpenBSD") {
774         chomp($foo = `eg++ -dumpversion | cut -c 1`);
775         # theyre running the package version of gcc (eg++)... detect it and set up its version numbers.
776         # if theyre not running this, configure lets the build continue but they probably wont manage to
777         # compile as this standard version is 2.95.3!
778         if ($foo ne "") {
779                 $config{CC} = "eg++";
780                 chomp($config{GCCVER}       = `eg++ -dumpversion | cut -c 1`); # we must redo these if we change
781                 chomp($config{GCC34}        = `eg++ -dumpversion | cut -c 3`); # the compiler path
782         }
783     }
784   } else {
785     $config{LDLIBS} = "-ldl -lstdc++";
786     $config{FLAGS}  = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
787     $config{MAKEPROG} = "make";
788     if ($config{OSNAME} =~ /CYGWIN/) {
789        $config{FLAGS}  = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
790        $config{LDLIBS} = "";
791        $config{MAKEPROG} = "/usr/bin/make";
792        $config{MAKEORDER} = "ircd mods config bininst";
793     } elsif ($config{OSNAME} eq "CYG-STATIC") {
794        $config{FLAGS} = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
795        $config{LDLIBS} = "";
796        $config{MAKEPROG} = "/usr/bin/make";
797        $config{MAKEORDER} = "mods ircd config bininst";
798        $config{STATICLIBS} = "modules/mods.a";
799        $config{STATIC_LINK} = "yes";
800     }
801   }
802   if ($config{OSNAME} =~ /SunOS/) {
803     # solaris/sunos needs these
804     # socket = bsd sockets api
805     # nsl = dns stuff
806     # rt = POSIX realtime extensions
807     # resolv = inet_aton only (why isnt this in nsl?!)
808     $config{LDLIBS} = $config{LDLIBS} . " -lsocket -lnsl -lrt -lresolv";
809   }
810 }
811
812 sub is_dir {
813   my ($path) = @_;
814   if (chdir($path)) {
815     chdir($this);
816     return 1;
817   } else {
818     # Just in case..
819     chdir($this);
820     return 0;
821   }
822 }
823
824 sub getmodules {
825   my $i = 0;
826   opendir(DIRHANDLE, "src/modules");
827   foreach $name (sort readdir(DIRHANDLE)) {
828     if ($name =~ /^m_(.+)\.cpp$/)
829     {
830       $mod = $1;
831       if ($mod !~ /_static$/) {
832               $modlist[$i++] = $mod;
833       }
834     }
835   }
836   closedir(DIRHANDLE);
837 }
838
839 sub writefiles {
840
841   print "Writing \033[1;32minspircd_config.h\033[0m\n";
842   # First File.. inspircd_config.h
843   chomp(my $incos = `uname -n -s -r`);
844   chomp(my $version = `sh ./src/version.sh`);
845   open(FILEHANDLE, ">include/inspircd_config.h");
846   my $NL = $config{NICK_LENGT}+1;
847   my $CL = $config{CHAN_LENGT}+1;
848   print FILEHANDLE <<EOF;
849 /* Auto generated by configure, do not modify! */
850 #ifndef __CONFIGURATION_AUTO__
851 #define __CONFIGURATION_AUTO__
852
853 #define CONFIG_FILE "$config{CONFIG_DIR}/inspircd.conf"
854 #define MOD_PATH "$config{MODULE_DIR}"
855 #define VERSION "$version"
856 #define MAXCLIENTS $config{MAX_CLIENT}
857 #define MAX_DESCRIPTORS $config{MAX_DESCRIPTORS}
858 #define NICKMAX $NL
859 #define CHANMAX $CL
860 #define MAXCHANS $config{MAX_CHANNE}
861 #define OPERMAXCHANS $config{MAX_OPERCH}
862 #define MAXMODES $config{MAXI_MODES}
863 #define IDENTMAX $config{MAX_IDENT}
864 #define MAXQUIT $config{MAX_QUIT}
865 #define MAXTOPIC $config{MAX_TOPIC}
866 #define MAXKICK $config{MAX_KICK}
867 #define MAXGECOS $config{MAX_GECOS}
868 #define MAXAWAY $config{MAX_AWAY}
869 #define OPTIMISATION $config{OPTIMITEMP}
870 #define SYSTEM "$incos"
871 #define MAXBUF 514
872 EOF
873
874   if ($config{OSNAME} =~ /SunOS/) {
875     print FILEHANDLE "#define IS_SOLARIS\n";
876   }
877   if ($config{OSNAME} =~ /CYGWIN/) {
878     print FILEHANDLE "#define IS_CYGWIN\n";
879     print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE    1024\n#endif\n";
880   }
881   if ($config{OSNAME} eq "CYG-STATIC") {
882     print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE    1024\n#endif\n";
883   }
884
885   if ($config{STATIC_LINK} eq "yes") {
886     print FILEHANDLE "#define STATIC_LINK\n";
887   }
888   if ($config{GCCVER} > 3) {
889     print FILEHANDLE "#define GCC3\n";
890     print FILEHANDLE "#define GCC34\n";
891   }
892   else
893   {
894     if ($config{GCCVER} == 3) {
895       print FILEHANDLE "#define GCC3\n";
896       if ($config{GCC34} > 3) {
897         print FILEHANDLE "#define GCC34\n";
898       }
899     }
900   }
901   if ($config{HAS_STRLCPY} eq "true") {
902     print FILEHANDLE "#define HAS_STRLCPY\n";
903   }
904   if ($config{THREADED_DNS} =~ /y/i) {
905     print FILEHANDLE "#define THREADED_DNS\n";
906   }
907   my $use_hiperf = 0;
908   if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
909     print FILEHANDLE "#define USE_KQUEUE\n";
910     $use_hiperf = 1;
911   }
912   if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
913     print FILEHANDLE "#define USE_EPOLL\n";
914     $use_hiperf = 1;
915   }
916   # user didn't choose either epoll or select for their OS.
917   # default them to USE_SELECT (ewwy puke puke)
918   if (!$use_hiperf) {
919     print FILEHANDLE "#define USE_SELECT\n";
920   }
921   print FILEHANDLE "\n#endif\n";
922   close(FILEHANDLE);
923
924   # Create a Modules List..
925   my $modules = "";
926   foreach $i (@modlist)
927   {
928     if ($config{STATIC_LINK} eq "yes") {
929         $modules .= "m_".$i.".o ";
930     }
931     else {
932         $modules .= "m_".$i.".so ";
933     }
934   }
935   chomp($modules);   # Remove Redundant whitespace..
936
937
938   # Write all .in files.
939   my $tmp = "";
940   my $file = "";
941   my $exe = "inspircd";
942
943   if ($config{OSNAME} =~ /CYGWIN/) {
944     $exe = "inspircd.exe";
945   }
946
947   opendir(DIRHANDLE, $this);
948   if ($config{THREADED_DNS} =~ /y/i) {
949     $config{LDLIBS} = $config{LDLIBS} . " -pthread";
950   }
951   foreach $name (sort readdir(DIRHANDLE)) {
952     if ($name =~ /^\.(.+)\.inc$/)
953     {
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 }