]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - configure
Fix crashbug, copying MAXLEN into a MAXGECOS+1 field != cunning
[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         system("ln -s src/modules/extra/m_ssl_gnutls.cpp src/modules/m_ssl_gnutls.cpp");
622         getmodules();
623         $failed = 0;
624         open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
625         close(TMP);
626         open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
627         close(TMP);
628         if ($failed) {
629                 print "SSL Certificates Not found, Generating.. \n\n
630 *************************************************************
631 * Generating the Private Key may take some time, go grab a  *
632 * Coffee. Even better, to generate some more entropy if it  *
633 * is taking a while, open another console and type du / a   *
634 * few times and get that HD going :) Then answer the        *
635 * Questions which follow. If you are unsure, just hit enter *
636 *************************************************************\n\n";
637                 system("certtool --generate-privkey --outfile key.pem");
638                 system("certtool --generate-self-signed --load-privkey key.pem --outfile cert.pem");
639                 print "\nCertificate generation complete, copying to config directory... ";
640                 system("mv key.pem $config{CONFIG_DIR}/key.pem");
641                 system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
642                 print "Done.\n\n";
643         } else {
644                 print "SSL Certificates found, skipping.\n\n"
645         }       
646 } elsif ($config{USE_OPENSSL} eq "y") {
647         system("ln -s src/modules/extra/m_ssl_openssl.cpp src/modules/m_ssl_openssl.cpp");
648         getmodules();
649         $failed = 0;
650         open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
651         close(TMP);
652         open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
653         close(TMP);
654         if ($failed) {
655                 print "SSL Certificates Not found, Generating.. \n\n
656 *************************************************************
657 * Generating the certificates may take some time, go grab a *
658 * coffee, or something.                                     *
659 *************************************************************\n\n";
660                 system("openssl req -x509 -nodes -newkey rsa:1024 -keyout key.pem -out cert.pem");
661                 system("openssl dhparam -out dhparams.pem 1024");
662                 print "\nCertificate generation complete, copying to config directory... ";
663                 system("mv key.pem $config{CONFIG_DIR}/key.pem");
664                 system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
665                 system("mv dhparams.pem $config{CONFIG_DIR}/dhparams.pem");
666                 print "Done.\n\n";
667         } else {
668                 print "SSL Certificates found, skipping.\n\n"
669         }
670 }
671 if (($config{USE_GNUTLS} eq "n") && ($config{USE_OPENSSL} eq "n")) {
672         print "Skipping SSL Certificate generation, SSL support is not available.\n\n";
673 }
674
675 getosflags();
676 makecache();
677 writefiles();
678
679 print "\n\n";
680 print "To build your server with these settings, please type '\033[1;32m$config{MAKEPROG}\033[0m' now.\n";
681 if (($config{USE_GNUTLS} eq "y") || ($config{USE_OPENSSL} eq "y")) {
682         print "Please remember that to enable \033[1;32mSSL support\033[0m you must\n";
683         print "load the required modules in your config. This configure process\n";
684         print "has just prepared these modules to be compiled for you, and has not\n";
685         print "configured them to be compiled into the core of the ircd.\n";
686 }
687 print "*** \033[1;32mRemember to edit your configuration files!!!\033[0m ***\n\n\n";
688 if (($config{OSNAME} eq "OpenBSD") && ($config{CC} ne "eg++")) {
689         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";
690 }
691
692 if ($config{GCCVER} < "3") {
693         print <<FOO2;
694 \033[1;32mWARNING!\033[0m You are attempting to compile InspIRCd on GCC 2.x!
695 GCC 2.x series compilers only had partial (read as broken) C++ support, and
696 your compile will most likely fail horribly! If you have any problems, do NOT
697 report them to the bugtracker or forums without first upgrading your compiler
698 to a newer 3.x or 4.x (or whatever is available currently) version.
699 FOO2
700 }
701
702 ################################################################################
703 #                              HELPER FUNCTIONS                                #
704 ################################################################################
705 sub getcache {
706         # Retrieves the .config.cache file, and loads values into the main config hash.
707         open(CACHE, ".config.cache") or return undef;
708         while (<CACHE>) {
709                 chomp;
710                 # Ignore Blank lines, and comments..
711                 next if /^\s*$/;
712                 next if /^\s*#/;
713                 my ($key, $value) = split("=", $_);
714                 $value =~ /^\"(.*)\"$/;
715                 # Do something with data here!
716                 $config{$key} = $1;
717         }
718         close(CONFIG);
719         return "true";
720 }
721
722 sub makecache {
723         # Dump the contents of %config
724         print "Writing \033[1;32mcache file\033[0m for future ./configures ...\n";
725         open(FILEHANDLE, ">.config.cache");
726         foreach $key (keys %config) {
727                 print FILEHANDLE "$key=\"$config{$key}\"\n";
728         }
729         close(FILEHANDLE);
730 }
731
732 sub dir_check {
733         my ($desc, $hash_key) = @_;
734         my $complete = 0;
735         while (!$complete) {
736                 print "In what directory $desc?\n";
737                 print "[\033[1;32m$config{$hash_key}\033[0m] -> ";
738                 chomp($var = <STDIN>);
739                 if ($var eq "") {
740                         $var = $config{$hash_key};
741                 }
742                 if ($var =~ /^\~\/(.+)$/) {
743                         # Convert it to a full path..
744                         $var = resolve_directory($ENV{HOME} . "/" . $1);
745                 }
746                 if (substr($var,0,1) ne "/")
747                 {
748                         # Assume relative Path was given.. fill in the rest.
749                         $var = $this . "/$var";
750                 }
751                 $var = resolve_directory($var); 
752                 if (! -e $var) {
753                         print "$var does not exist. Create it?\n[\033[1;32my\033[0m] ";
754                         chomp($tmp = <STDIN>);
755                         if (($tmp eq "") || ($tmp =~ /^y/i)) {
756                                 # Attempt to Create the Dir..
757                                 $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256;
758                                 if ($chk != 0) {
759                                         print "Unable to create directory. ($var)\n\n";
760                                         # Restart Loop..
761                                         next;
762                                 }
763                         } else {
764                                 # They said they don't want to create, and we can't install there.
765                                 print "\n\n";
766                                 next;
767                         }
768                 } else {
769                         if (!is_dir($var)) {
770                                 # Target exists, but is not a directory.
771                                 print "File $var exists, but is not a directory.\n\n";
772                                 next;
773                         }
774                 }
775                 # Either Dir Exists, or was created fine.
776                 $config{$hash_key} = $var;
777                 $complete = 1;
778                 print "\n";
779         }
780 }
781
782 sub getosflags {
783         if ($config{OSNAME} =~ /BSD$/) {
784                 $config{LDLIBS} = "-Ldl -lstdc++";
785                 $config{FLAGS}  = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
786                 $config{MAKEPROG} = "gmake";
787                 if ($config{OSNAME} eq "OpenBSD") {
788                         chomp($foo = `eg++ -dumpversion | cut -c 1`);
789                         # theyre running the package version of gcc (eg++)... detect it and set up its version numbers.
790                         # if theyre not running this, configure lets the build continue but they probably wont manage to
791                         # compile as this standard version is 2.95.3!
792                         if ($foo ne "") {
793                                 $config{CC} = "eg++";
794                                 chomp($config{GCCVER}       = `eg++ -dumpversion | cut -c 1`); # we must redo these if we change
795                                 chomp($config{GCC34}        = `eg++ -dumpversion | cut -c 3`); # the compiler path
796                         }
797                 }
798         } else {
799                 $config{LDLIBS} = "-ldl -lstdc++";
800                 $config{FLAGS}  = "-fPIC -frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
801                 $config{MAKEPROG} = "make";
802                 if ($config{OSNAME} =~ /CYGWIN/) {
803                         $config{FLAGS}  = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
804                         $config{LDLIBS} = "";
805                         $config{MAKEPROG} = "/usr/bin/make";
806                         $config{MAKEORDER} = "ircd mods config bininst";
807                 } elsif ($config{OSNAME} eq "CYG-STATIC") {
808                         $config{FLAGS} = "-frtti -Wall -Woverloaded-virtual $config{OPTIMISATI}";
809                         $config{LDLIBS} = "";
810                         $config{MAKEPROG} = "/usr/bin/make";
811                         $config{MAKEORDER} = "mods ircd config bininst";
812                         $config{STATICLIBS} = "modules/mods.a";
813                         $config{STATIC_LINK} = "yes";
814                 }
815         }
816         if ($config{OSNAME} =~ /SunOS/) {
817                 # solaris/sunos needs these
818                 # socket = bsd sockets api
819                 # nsl = dns stuff
820                 # rt = POSIX realtime extensions
821                 # resolv = inet_aton only (why isnt this in nsl?!)
822                 $config{LDLIBS} = $config{LDLIBS} . " -lsocket -lnsl -lrt -lresolv";
823         }
824 }
825
826 sub is_dir {
827         my ($path) = @_;
828         if (chdir($path)) {
829                 chdir($this);
830                 return 1;
831         } else {
832                 # Just in case..
833                 chdir($this);
834                 return 0;
835         }
836 }
837
838 sub getmodules {
839         my $i = 0;
840         opendir(DIRHANDLE, "src/modules");
841         foreach $name (sort readdir(DIRHANDLE)) {
842                 if ($name =~ /^m_(.+)\.cpp$/)
843                 {
844                         $mod = $1;
845                         if ($mod !~ /_static$/) {
846                                 $modlist[$i++] = $mod;
847                         }
848                 }
849         }
850         closedir(DIRHANDLE);
851 }
852
853 sub writefiles {
854
855         print "Writing \033[1;32minspircd_config.h\033[0m\n";
856         # First File.. inspircd_config.h
857         chomp(my $incos = `uname -n -s -r`);
858         chomp(my $version = `sh ./src/version.sh`);
859         open(FILEHANDLE, ">include/inspircd_config.h");
860         my $NL = $config{NICK_LENGT}+1;
861         my $CL = $config{CHAN_LENGT}+1;
862         print FILEHANDLE <<EOF;
863 /* Auto generated by configure, do not modify! */
864 #ifndef __CONFIGURATION_AUTO__
865 #define __CONFIGURATION_AUTO__
866
867 #define CONFIG_FILE "$config{CONFIG_DIR}/inspircd.conf"
868 #define MOD_PATH "$config{MODULE_DIR}"
869 #define VERSION "$version"
870 #define MAXCLIENTS $config{MAX_CLIENT}
871 #define MAX_DESCRIPTORS $config{MAX_DESCRIPTORS}
872 #define NICKMAX $NL
873 #define CHANMAX $CL
874 #define MAXCHANS $config{MAX_CHANNE}
875 #define OPERMAXCHANS $config{MAX_OPERCH}
876 #define MAXMODES $config{MAXI_MODES}
877 #define IDENTMAX $config{MAX_IDENT}
878 #define MAXQUIT $config{MAX_QUIT}
879 #define MAXTOPIC $config{MAX_TOPIC}
880 #define MAXKICK $config{MAX_KICK}
881 #define MAXGECOS $config{MAX_GECOS}
882 #define MAXAWAY $config{MAX_AWAY}
883 #define OPTIMISATION $config{OPTIMITEMP}
884 #define SYSTEM "$incos"
885 #define MAXBUF 514
886 EOF
887         if ($config{OSNAME} =~ /SunOS/) {
888                 print FILEHANDLE "#define IS_SOLARIS\n";
889         }
890         if ($config{OSNAME} =~ /CYGWIN/) {
891                 print FILEHANDLE "#define IS_CYGWIN\n";
892                 print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE        1024\n#endif\n";
893         }
894         if ($config{OSNAME} eq "CYG-STATIC") {
895                 print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE    1024\n#endif\n";
896         }
897
898         if ($config{STATIC_LINK} eq "yes") {
899                 print FILEHANDLE "#define STATIC_LINK\n";
900         }
901         if ($config{GCCVER} > 3) {
902                 print FILEHANDLE "#define GCC3\n";
903                 print FILEHANDLE "#define GCC34\n";
904         }
905         else
906         {
907                 if ($config{GCCVER} == 3) {
908                         print FILEHANDLE "#define GCC3\n";
909                         if ($config{GCC34} > 3) {
910                                 print FILEHANDLE "#define GCC34\n";
911                         }
912                 }
913         }
914         if ($config{HAS_STRLCPY} eq "true") {
915                 print FILEHANDLE "#define HAS_STRLCPY\n";
916         }
917         if ($config{THREADED_DNS} =~ /y/i) {
918                 print FILEHANDLE "#define THREADED_DNS\n";
919         }
920         my $use_hiperf = 0;
921         if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
922                 print FILEHANDLE "#define USE_KQUEUE\n";
923                 $use_hiperf = 1;
924         }
925         if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
926                 print FILEHANDLE "#define USE_EPOLL\n";
927                 $use_hiperf = 1;
928         }
929         # user didn't choose either epoll or select for their OS.
930         # default them to USE_SELECT (ewwy puke puke)
931         if (!$use_hiperf) {
932                 print FILEHANDLE "#define USE_SELECT\n";
933         }
934         print FILEHANDLE "\n#endif\n";
935         close(FILEHANDLE);
936
937         # Create a Modules List..
938         my $modules = "";
939         foreach $i (@modlist)
940         {
941                 if ($config{STATIC_LINK} eq "yes") {
942                         $modules .= "m_".$i.".o ";
943                 }
944                 else {
945                         $modules .= "m_".$i.".so ";
946                 }
947         }
948         chomp($modules);   # Remove Redundant whitespace..
949
950
951         # Write all .in files.
952         my $tmp = "";
953         my $file = "";
954         my $exe = "inspircd";
955
956         if ($config{OSNAME} =~ /CYGWIN/) {
957                 $exe = "inspircd.exe";
958         }
959
960         opendir(DIRHANDLE, $this);
961         if ($config{THREADED_DNS} =~ /y/i) {
962                 $config{LDLIBS} = $config{LDLIBS} . " -pthread";
963         }
964         foreach $name (sort readdir(DIRHANDLE)) {
965                 if ($name =~ /^\.(.+)\.inc$/) {
966                         $file = $1;
967                         # All .name.inc files need parsing!
968                         $tmp = "";
969                         open(FILEHANDLE, ".$file.inc");
970                         while (<FILEHANDLE>) {
971                                 $tmp .= $_;
972                         }
973                         close(FILEHANDLE);
974
975                         $tmp =~ s/\@CC\@/$config{CC}/;
976                         $tmp =~ s/\@MAKEPROG\@/$config{MAKEPROG}/;
977                         $tmp =~ s/\@FLAGS\@/$config{FLAGS}/;
978                         $tmp =~ s/\@LDLIBS\@/$config{LDLIBS}/;
979                         $tmp =~ s/\@BASE_DIR\@/$config{BASE_DIR}/;
980                         $tmp =~ s/\@CONFIG_DIR\@/$config{CONFIG_DIR}/;
981                         $tmp =~ s/\@MODULE_DIR\@/$config{MODULE_DIR}/;
982                         $tmp =~ s/\@BINARY_DIR\@/$config{BINARY_DIR}/;
983                         $tmp =~ s/\@LIBRARY_DIR\@/$config{LIBRARY_DIR}/;
984                         $tmp =~ s/\@MODULES\@/$modules/;
985                         $tmp =~ s/\@EXECUTABLE\@/$exe/;
986                         $tmp =~ s/\@MAKEORDER\@/$config{MAKEORDER}/;
987                         $tmp =~ s/\@STATICLIBS\@/$config{STATICLIBS}/;
988
989                         print "Writing \033[1;32m$file\033[0m\n";
990                         open(FILEHANDLE, ">$file");
991                         print FILEHANDLE $tmp;
992                 }
993         }
994         closedir(DIRHANDLE);
995
996         # Make inspircd executable!
997         chmod 0744, 'inspircd';
998
999         if ($config{STATIC_LINK} eq "yes") {
1000                 print "Writing static-build \033[1;32msrc/Makefile\033[0m\n";
1001                 write_static_makefile();
1002                 write_static_modules_makefile();
1003         } elsif ($config{OSNAME} =~ /CYGWIN/) {
1004                 print "Writing cygwin-build \033[1;32msrc/Makefile\033[0m\n";
1005                 write_static_makefile();
1006                 write_dynamic_modules_makefile();
1007         } else {
1008                 print "Writing dynamic-build \033[1;32msrc/Makefile\033[0m\n";
1009                 write_dynamic_makefile();
1010                 write_dynamic_modules_makefile();
1011         }
1012 }
1013
1014 sub getcompilerflags {
1015         my ($file) = @_;
1016         open(FLAGS, $file);
1017         while (<FLAGS>) {
1018         if ($_ =~ /^\/\* \$CompileFlags: (.+) \*\/$/) {
1019                 close(FLAGS);
1020                         return $1;
1021                 }
1022         }
1023         close(FLAGS);
1024         return undef;
1025 }
1026
1027 sub getlinkerflags {
1028         my ($file) = @_;
1029         open(FLAGS, $file);
1030         while (<FLAGS>) {
1031                 if ($_ =~ /^\/\* \$LinkerFlags: (.+) \*\/$/) {
1032                         close(FLAGS);
1033                         return $1;
1034                 }
1035         }
1036         close(FLAGS);
1037         return undef;
1038 }
1039
1040 sub show_splash {
1041   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";
1042   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";
1043   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";
1044   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";
1045   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";
1046   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";
1047   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";
1048   print "\033[0m\033[0m....::..::::..:::......:::..:::::::::....::..:::::..:::......:::........:::\n\n";
1049 }
1050
1051 sub resolve_directory {
1052         use File::Spec;
1053         return File::Spec->rel2abs($_[0]);
1054 }
1055
1056 sub yesno {
1057         my ($flag,$prompt) = @_;
1058         print "$prompt [\033[1;32m$config{$flag}\033[0m] -> ";
1059         chomp($tmp = <STDIN>);
1060         if ($tmp eq "") { $tmp = $config{$flag} }
1061
1062         if (($tmp eq "") || ($tmp =~ /^y/i)) {
1063                 $config{$flag} = "y";
1064         } else {
1065                 $config{$flag} = "n";
1066         }
1067         return;
1068 }
1069
1070 sub write_static_modules_makefile {
1071         # Modules Makefile..
1072         print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
1073         open(FILEHANDLE, ">src/modules/Makefile");
1074
1075         ###
1076         # Module Makefile Header
1077         ###
1078         print FILEHANDLE <<EOF;
1079 # (C) ChatSpike development team
1080 # Makefile by <Craig\@ChatSpike.net>
1081 # Many Thanks to Andrew Church <achurch\@achurch.org>
1082 #    for assisting with making this work right.
1083 #
1084 # Automatically Generated by ./configure to add a modules
1085 # please run ./configure --update
1086
1087 all: \$(MODULES)
1088
1089 EOF
1090         ###
1091         # End Module Makefile Header
1092         ###
1093
1094         # Create a Modules List..
1095         my $modules = "";
1096         my $cmflags = "";
1097         my $liflags = "";
1098
1099         open(MODLIST,">include/modlist.h");
1100
1101         ###
1102         # Include File Header
1103         ###
1104         print MODLIST <<HEADER;
1105 // Generated automatically by configure. DO NOT EDIT!
1106
1107 #ifndef __SYMBOLS__H_CONFIGURED__
1108 #define __SYMBOLS__H_CONFIGURED__
1109
1110 HEADER
1111         ###
1112         # End Include File Header
1113         ###
1114
1115         # Place Module List into Include
1116         foreach $i (@modlist) {
1117                 if ($i !~ /_static$/) {
1118                         print MODLIST "extern \"C\" void * $i\_init (void);\n";
1119                 }
1120         }
1121         print MODLIST "\nstruct {const char *name; initfunc *value; } modsyms[] = {\n";
1122
1123         ###
1124         # Build Module Crap
1125         ###
1126         foreach $i (@modlist)
1127         {
1128                 if ($i !~ /_static$/) {
1129                         $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
1130                         $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
1131
1132                         ###
1133                         # Write Entry to the Makefile
1134                         ###
1135                         print FILEHANDLE <<EOCHEESE;
1136 m_$i.o: m_$i\_static.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h
1137         \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c m_$i\_static.cpp
1138         mv m_$i\_static.o ../m_$i.o
1139
1140 EOCHEESE
1141                         ###
1142                         # End Write Entry to the MakeFile
1143                         ###
1144                         print "Configuring module [\033[1;32mm_$i.so\033[0m] for static linking... ";
1145                         open(MODULE,"<src/modules/m_".$i.".cpp") or die("Could not open m_".$i.".cpp");
1146                         open(MUNGED,">src/modules/m_".$i."_static.cpp") or die("Could not create m_".$i."_static.cpp");
1147                         while (chomp($a = <MODULE>)) { 
1148                                 $a =~ s/init_module/$i\_init/g;
1149                                 $a =~ s/Srv/$i\Srv/g;
1150                                 print MUNGED "$a\n";
1151                         }
1152                         close(MODULE);
1153                         close(MUNGED);
1154                         print MODLIST <<EOENT;
1155 {"m_$i.so",\&$i\_init},
1156 EOENT
1157                         print "done\n";
1158                 }
1159         }
1160         print MODLIST "{0}};\n\n#endif\n";
1161         close(MODLIST);
1162 }
1163
1164 sub write_dynamic_modules_makefile {
1165         # Modules Makefile..
1166         print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
1167         open(FILEHANDLE, ">src/modules/Makefile");
1168         my $extra = "";
1169
1170         if ($config{OSNAME} =~ /CYGWIN/) {
1171                 $extra = "../inspircd.dll.a";
1172         }
1173
1174 ###
1175 # Module Makefile Header
1176 ###
1177         print FILEHANDLE <<EOF;
1178 # (C) ChatSpike development team
1179 # Makefile by <Craig\@ChatSpike.net>
1180 # Many Thanks to Andrew Church <achurch\@achurch.org>
1181 #    for assisting with making this work right.
1182 #
1183 # Automatically Generated by ./configure to add a modules
1184 # please run ./configure -update or ./configure -modupdate
1185
1186 all: \$(MODULES)
1187
1188 EOF
1189         ###
1190         # End Module Makefile Header
1191         ###
1192
1193         # Create a Modules List..
1194         my $modules = "";
1195         my $cmflags = "";
1196         my $liflags = "";
1197
1198         foreach $i (@modlist) {
1199         ###
1200         # Write Entry to the MakeFile
1201         ###
1202         $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
1203         $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
1204         print FILEHANDLE <<EOCHEESE;
1205 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
1206         \$(CC) -pipe -I../../include \$(FLAGS) $cmflags -export-dynamic -c m_$i.cpp
1207         \$(CC) \$(FLAGS) -shared $liflags -o m_$i.so m_$i.o $extra
1208         \@-rm -f \$(MODPATH)/m_$i.so
1209         install -v -m 0700 m_$i.so \$(MODPATH)
1210
1211 EOCHEESE
1212         ###
1213         # End Write Entry to the MakeFile
1214         ###
1215         }
1216 }
1217
1218
1219 sub write_static_makefile {
1220         open(FH,">src/Makefile") or die("Could not write src/Makefile!");
1221         my $i = 0;
1222         my @cmdlist = ();
1223         opendir(DIRHANDLE, "src");
1224         foreach $name (sort readdir(DIRHANDLE)) {
1225                 if ($name =~ /^cmd_(.+)\.cpp$/) {
1226                         $cmdlist[$i++] = $1;
1227                 }
1228         }
1229         closedir(DIRHANDLE);
1230         my $cmdobjs = "";
1231         my $srcobjs = "";
1232         foreach my $cmd (@cmdlist) {
1233                 $cmdobjs = $cmdobjs . "cmd_$cmd.o ";
1234                 $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
1235         }
1236         print FH <<EOM;
1237 # Insp Makefile :p
1238 #
1239 # (C) ChatSpike development team
1240 # Makefile by <Craig\@ChatSpike.net>
1241 # Makefile version 2 (statically linked core) by <brain\@inspircd.org>
1242 #
1243
1244 CC = im a cheezeball
1245
1246 CXXFLAGS = -I../include \${FLAGS}
1247
1248 EOM
1249         ###
1250         # This next section is for cygwin dynamic module builds.
1251         # Basically, what we do, is build the inspircd core as a library
1252         # then the main executable uses that. the library is capable of
1253         # loading / unloading the modules dynamically :)
1254         # Massive thanks to the guys on #cygwin @ irc.freenode.net for helping
1255         # make this work :)
1256         ###
1257
1258         if ($config{OSNAME} =~ /CYGWIN/) {
1259                 print FH <<EOM;
1260 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
1261
1262 inspircd.exe: inspircd.dll.a
1263         \$(CC) -o \$@ \$^
1264
1265 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
1266         \$(CC) -shared -Wl,--out-implib=inspircd.dll.a -o inspircd.dll \$^
1267 EOM
1268         } else {
1269                 print FH <<EOM;
1270 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
1271
1272 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
1273         \$(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)
1274 EOM
1275         }
1276
1277         print FH <<EOM;
1278
1279 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
1280         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1281
1282 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
1283         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1284
1285 userprocess.o: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1286         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1287
1288 socketengine.o: socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1289         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
1290
1291 hashcomp.o: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1292         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1293
1294 helperfuncs.o: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1295         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1296
1297 channels.o: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1298         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1299
1300 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
1301         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1302
1303 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
1304         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1305
1306 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
1307         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1308
1309 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
1310         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1311
1312 base.o: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1313         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1314
1315 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
1316         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_io.cpp
1317
1318 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
1319         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
1320
1321 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
1322         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp $cmdobjs
1323
1324 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
1325         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
1326
1327 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
1328         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1329
1330 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
1331         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1332
1333 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
1334         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1335
1336 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
1337         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1338
1339 socket.o: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1340         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1341
1342 aes.o: aes.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1343         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c aes.cpp
1344
1345 EOM
1346         foreach my $cmd (@cmdlist) {
1347                 print FH <<ITEM;
1348 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
1349         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
1350 ITEM
1351         }
1352         close(FH);
1353 }
1354
1355 sub write_dynamic_makefile {
1356
1357         my $i = 0;
1358         my @cmdlist = ();
1359         opendir(DIRHANDLE, "src");
1360         foreach $name (sort readdir(DIRHANDLE)) {
1361                 if ($name =~ /^cmd_(.+)\.cpp$/) {
1362                         $cmdlist[$i++] = $1;
1363                 }
1364         }
1365         closedir(DIRHANDLE);
1366
1367         my $cmdobjs = "";
1368         my $srcobjs = "";
1369         foreach my $cmd (@cmdlist) {
1370                 $cmdobjs = $cmdobjs . "cmd_$cmd.o ";
1371                 $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
1372         }
1373
1374         open(FH,">src/Makefile") or die("Could not write src/Makefile");
1375         print FH <<EOM;
1376 # Insp Makefile :p
1377 #
1378 # (C) ChatSpike development team
1379 # Makefile by <Craig\@ChatSpike.net>
1380 # Makefile version 2 (dynamically linked core) by <brain\@inspircd.org>
1381 #
1382
1383 CC = im a cheezeball
1384
1385 CXXFLAGS = -I../include \${FLAGS}
1386
1387 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
1388
1389 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
1390         \$(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
1391
1392 libIRCDsocketengine.so: socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1393         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
1394         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocketengine.so socketengine.o
1395
1396 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
1397         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1398         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommand_parse.so command_parse.o
1399
1400 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
1401         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1402         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcull_list.so cull_list.o
1403
1404 libIRCDuserprocess.so: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1405         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1406         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDuserprocess.so userprocess.o
1407
1408 libIRCDhash.so: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1409         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1410         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhash.so hashcomp.o
1411
1412 libIRCDhelper.so: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1413         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1414         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhelper.so helperfuncs.o
1415
1416 libIRCDchannels.so: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1417         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1418         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDchannels.so channels.o
1419
1420 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
1421         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1422         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmode.so mode.o
1423
1424 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
1425         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1426         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDxline.so xline.o
1427
1428 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
1429         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1430         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDstring.so inspstring.o
1431
1432 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
1433         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1434         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDasyncdns.so dns.o
1435
1436 libIRCDbase.so: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1437         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1438         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDbase.so base.o
1439
1440 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
1441         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_io.cpp
1442         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDio.so inspircd_io.o
1443
1444 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
1445         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
1446         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmessage.so message.o
1447
1448 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
1449         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
1450         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommands.so commands.o $cmdobjs
1451
1452 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
1453         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
1454         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdnsqueue.so dnsqueue.o
1455
1456 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
1457         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1458         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdynamic.so dynamic.o
1459
1460 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
1461         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1462         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDusers.so users.o
1463
1464 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
1465         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1466         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmodules.so modules.o
1467
1468 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
1469         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1470         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDwildcard.so wildcard.o
1471
1472 libIRCDsocket.so: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1473         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1474         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocket.so socket.o
1475
1476 libIRCDaes.so: aes.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1477         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c aes.cpp
1478         \$(CC) -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDaes.so aes.o
1479
1480 EOM
1481         foreach my $cmd (@cmdlist) {
1482                 print FH <<ITEM;
1483 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
1484         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
1485
1486 ITEM
1487         }
1488         close(FH);
1489 }