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