]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - configure
added question about oper channel max
[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 $config{OPTIMITEMP}         = "0";                                              # Default Optimisation Value
25 $config{OPTIMISATI}         = "-g";                                             # Optimisation Flag
26 $config{NICK_LENGT}         = "31";                                             # Default Nick Length
27 $config{CHAN_LENGT}         = "64";                                             # Default Channel Name Length
28 $config{MAX_CHANNE}         = "20";                                             # Default Max. Channels per user
29 $config{MAX_OPERCH}         = "60";                                             # Default Max. Channels per oper
30 $config{MAXI_MODES}         = "20";                                             # Default Max. Number of Modes set at once.
31 $config{HAS_STRLCPY}        = "false";                                          # strlcpy Check.
32 $config{USE_KQUEUE}         = "y";                                              # kqueue enabled
33 $config{USE_EPOLL}          = "y";                                              # epoll enabled
34 $config{THREADED_DNS}       = "n";                                              # threaded dns (experimental)
35 $config{STATIC_LINK}        = "no";                                             # are doing static modules?
36 chomp($config{MAX_CLIENT_T} = `sh -c \"ulimit -n\"`);                           # FD Limit
37 chomp($config{GCCVER}       = `gcc -dumpversion | cut -c 1`);                   # Major GCC Version
38 chomp($config{GCC34}        = `gcc -dumpversion | cut -c 3`);                   # Minor GCC Version
39 chomp($config{OSNAME}       = `/bin/uname`);                                    # Operating System Name
40 $config{CC}                 = "g++";                                            # C++ compiler
41 $config{MAKEORDER}          = "ircd mods config bininst";                       # build order
42 $config{STATICLIBS}         = "";                                               # library archive path
43 $config{MAX_IDENT}          = "12";                                             # max ident size
44 $config{MAX_QUIT}           = "255";                                            # max quit message size
45 $config{MAX_TOPIC}          = "307";                                            # max topic size
46 $config{MAX_KICK}           = "255";                                            # max kick message size
47 $config{MAX_GECOS}          = "128";                                            # max GECOS size
48 $config{MAX_AWAY}           = "200";                                            # max AWAY size
49
50 if ((!$config{OSNAME}) || ($config{OSNAME} eq "")) {
51   chomp($config{OSNAME} = `/usr/bin/uname`);
52   if ((!$config{OSNAME}) || ($config{OSNAME} eq "")){
53         $config{OSNAME} = "Unknown";
54   }
55 }
56
57 if (!$config{MAX_CLIENT_T}) { 
58   $config{MAX_CLIENT_T} = 1024;                                 # Set a reasonable 'Default'
59   $fd_scan_fail = "true";                                       # Used Later
60 }
61
62 # Get and Set some important vars..
63 getmodules();
64
65 my $arg = $ARGV[0];                                             # Do Some Argument Checks..
66 if ($arg eq "-clean") { `rm -rf .config.cache`; }               # Remove the config.cache file.
67
68 if ($arg eq "-update") {
69   # Does the cache file exist?
70   if (!getcache()) {
71     # No, No it doesn't.. *BASH*
72     print "You have not run ./configure before. Please do this before trying to run the update script.\n";
73     exit 0;
74   } else {
75     # We've Loaded the cache file and all our variables..
76     print "Updating Files..\n";
77     getosflags();
78     $has_epoll = $config{HAS_EPOLL};
79     $has_kqueue = $config{HAS_KQUEUE};
80     writefiles();
81     print "Complete.\n";
82     exit;
83   }
84 }
85
86 print "Checking for cache from previous configure...\n";
87 getcache();
88 print "Checking operating system version...\n";
89 getosflags();
90
91 if (!$config{MAX_CLIENT}) { 
92   # If the cache hasn't set the max clients, copy the variable of MAX_CLIENT_T, this
93   # allows us to keep _T for testing purposes. (ie. "Are you sure you want to go
94   # higher than the found value" :))
95   $config{MAX_CLIENT} = $config{MAX_CLIENT_T};
96 }
97
98 printf "Checking if strlcpy exists... ";
99 # Perform the strlcpy() test..
100 $config{HAS_STRLCPY} = "false";
101 my $fail = 0;
102 open(STRLCPY, "</usr/include/string.h") or $fail = 1;
103 if (!$fail)
104 {
105         while (chomp($line = <STRLCPY>))
106         {
107                 # try and find the delcaration of:
108                 # size_t strlcpy(...)
109                 if ($line =~ /size_t(\0x9|\s)+strlcpy/)
110                 {
111                         $config{HAS_STRLCPY} = "true";
112                 }
113         }
114         close(STRLCPY);
115 }
116 print "yes\n" if $config{HAS_STRLCPY} eq "true";
117 print "no\n" if $config{HAS_STRLCPY} eq "false";
118
119 printf "Checking if kqueue exists... ";
120 $has_kqueue = 0;
121 $fail = 0;
122 open(KQUEUE, "</usr/include/sys/event.h") or $fail = 1;
123 if (!$fail)
124 {
125         while (chomp($line = <KQUEUE>))
126         {
127                 # try and find the delcaration of:
128                 # int kqueue(void);
129                 if ($line =~ /int(\0x9|\s)+kqueue/)
130                 {
131                         $has_kqueue = 1;
132                 }
133         }
134         close(KQUEUE);
135 }
136 print "yes\n" if $has_kqueue == 1;
137 print "no\n" if $has_kqueue == 0;
138
139 printf "Checking if epoll exists... ";
140 $has_epoll = 0;
141 $fail = 0;
142 open(EPOLL, "</usr/include/sys/epoll.h") or $fail = 1;
143 if (!$fail)
144 {
145         while (chomp($line = <EPOLL>))
146         {
147                 # try and find the declaration of:
148                 # extern int epoll_create (int __size) __THROW;
149                 if (($line =~ /int(\0x9|\s)+epoll_create(\0x9|\s)+\(/) || ($line =~ /int(\0x9|\s)+epoll_create\(/))
150                 {
151                         $has_epoll = 1;
152                 }
153         }
154         close(EPOLL);
155 }
156 if ($has_epoll) {
157         my $kernel = `uname -r`;
158         chomp($kernel);
159         if (($kernel =~ /2\.0/) || ($kernel =~ /2\.2/) || ($kernel =~ /2\.4/)) {
160                 $has_epoll = 0;
161         }
162 }
163 print "yes\n" if $has_epoll == 1;
164 print "no\n" if $has_epoll == 0;
165
166 if ($config{OSNAME} =~ /CYGWIN/) {
167         $config{HAS_STRLCPY} = "true";
168 }
169
170 $config{HAS_EPOLL} = $has_epoll;
171 $config{HAS_KQUEUE} = $has_kqueue; 
172
173 ################################################################################
174 #                          BEGIN INTERACTIVE PART                              #
175 ################################################################################
176
177 # Clear the Screen..
178 system("clear");
179 # Display Splash Logo..
180 show_splash();
181 chomp($wholeos = `uname -mnr`);
182
183 # Display Introduction Message..
184 print "
185 Welcome to the InspIRCd Configuration program!
186
187 *** If you are unsure of any of these values, leave it blank for    ***
188 *** standard settings that will work, and your server will run      ***
189 *** using them. If you are running this server as part of a         ***
190 *** larger network, you must consult with your network admins       ***
191 *** for the proper values to use, or server links will be unstable! ***
192
193 Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter
194 a new value. Please note: You will \033[1mHAVE\033[0m to read the docs
195 dir, otherwise you won't have a config file!
196
197 Your operating system is: \033[1;32m$config{OSNAME}\033[0m ($wholeos), fdmax: $config{MAX_CLIENT_T}\n\n";
198
199 $config{CHANGE_COMPILER} = "n";
200 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";
201
202 if ($config{GCCVER} < 3)
203 {
204         print "\033[1;32mIMPORTANT!\033[0m A GCC 2.x compiler has been detected, and
205 should NOT be used. You should probably specify a newer compiler.\n";
206 }
207 yesno(CHANGE_COMPILER,"Do you want to change the compiler?");
208 if ($config{CHANGE_COMPILER} =~ /y/i)
209 {
210     print "What command do you want to use to invoke your compiler?\n";
211     print "[\033[1;32m$config{CC}\033[0m] -> ";
212     chomp($config{CC} = <STDIN>);
213     if ($config{CC} eq "") { $config{CC} = "g++"; }
214     chomp($foo = `$config{CC} -dumpversion | cut -c 1`);
215     if ($foo ne "") {
216             chomp($config{GCCVER}       = `$config{CC} -dumpversion | cut -c 1`); # we must redo these if we change
217             chomp($config{GCC34}        = `$config{CC} -dumpversion | cut -c 3`); # the compiler path
218             print "Queried compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.$config{GCC34}\033[0m)\n";
219     }
220     else
221     {
222             print "\033[1;32mWARNING!\033[0m Could not execute the compiler you specified. You may want to try again.\n";
223     }
224 }
225
226 print "\n";
227
228 # Directory Settings..
229 my $tmpbase = $config{BASE_DIR};
230 dir_check("do you wish to install the InspIRCd base", "BASE_DIR");
231 if ($tmpbase ne $config{BASE_DIR}) {
232         $config{CONFIG_DIR}         = resolve_directory($config{BASE_DIR}."/conf");           # Configuration Directory
233         $config{MODULE_DIR}         = resolve_directory($config{BASE_DIR}."/modules");        # Modules Directory
234         $config{BINARY_DIR}         = resolve_directory($config{BASE_DIR}."/bin");            # Binary Directory
235         $config{LIBRARY_DIR}        = resolve_directory($config{BASE_DIR}."/lib");            # Library Directory
236 }
237
238 dir_check("are the configuration files", "CONFIG_DIR");
239 dir_check("are the modules to be compiled to", "MODULE_DIR");
240 dir_check("is the IRCd binary to be placed", "BINARY_DIR");
241 dir_check("are the IRCd libraries to be placed", "LIBRARY_DIR");
242
243 if ($has_kqueue) {
244         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?");
245         print "\n";
246 }
247 if ($has_epoll) {
248         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?");
249         print "\n";
250 }
251 $chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y"));
252 if (!$chose_hiperf)
253 {
254         print "No high-performance socket engines are available, or you chose\n";
255         print "not to enable one. Defaulting to select() engine.\n\n";
256 }
257
258 yesno(THREADED_DNS,"Would you like to enable the experimental multi-threaded DNS lookup?");
259 print "\n";
260
261 print "\nThe following questions will ask you for various figures relating\n";
262 print "To your IRCd install. Please note that these should usually be left\n";
263 print "as defaults unless you have a real reason to change them. If they\n";
264 print "changed, then the values must be identical on all servers on your\n";
265 print "network, or malfunctions and/or crashes may occur, with the exception\n";
266 print "of the 'maximum number of clients' setting which may be different on\n";
267 print "different servers on the network.\n\n";
268
269 # File Descriptor Settings..
270 my $continue = 0;
271 while (!$continue) {
272   print "Maximum number of clients at any one time ($config{MAX_CLIENT_T})\n";
273   print "[\033[1;32m$config{MAX_CLIENT}\033[0m] -> ";
274   chomp($var = <STDIN>);
275   if ($var eq "") { $var = $config{MAX_CLIENT}; }
276   if ($var =~ /^\d+$/) {
277     if (($var > $config{MAX_CLIENT_T}) && ($fd_scan_failed ne true)) {
278       # Client has entered a larger number than the 'discovered' value
279       # Confirm.
280       print "WARNING: Our scans have indicated that you are attempting
281 to use more sockets than there are avaliable. Are you sure
282 you wish to do this? It may cause the IRCd to malfunction [y/n]
283 [\033[1;32mn\033[0m] -> $c";
284       chomp($tmp = <STDIN>);
285       if ($tmp ne "y") {
286         print "Please enter the correct value.\n\n";
287         next;
288       }
289     }
290   } else {
291     print "You must enter a number in this field. Please try again.\n\n";
292     next;
293   }
294   # If we get here, we should be good to go.
295   $config{MAX_CLIENT} = $var;
296   $continue = 1;
297   print "\n";
298 }
299
300 my $continue = 0;
301 while (!$continue) {
302   print "What is the maximum length of nicknames?\n";
303   print "[\033[1;32m$config{NICK_LENGT}\033[0m] -> ";
304   chomp($var = <STDIN>);
305   if ($var eq "") { $var = $config{NICK_LENGT}; }
306   if ($var =~ /^\d+$/) {
307     # We don't care what the number is, set it and be on our way.
308     $config{NICK_LENGT} = $var;
309     $continue = 1;
310     print "\n";
311   } else {
312     print "You must enter a number in this field. Please try again.\n\n";
313   }
314 }
315
316 $continue = 0;
317 while (!$continue) {
318   print "What is the maximum length of channel names?\n";
319   print "[\033[1;32m$config{CHAN_LENGT}\033[0m] -> ";
320   chomp($var = <STDIN>);
321   if ($var eq "") { $var = $config{CHAN_LENGT}; }
322   if ($var =~ /^\d+$/) {
323     # We don't care what the number is, set it and be on our way.
324     $config{CHAN_LENGT} = $var;
325     $continue = 1;
326     print "\n";
327   } else {
328     print "You must enter a number in this field. Please try again.\n\n";
329   }
330 }
331
332 $continue = 0;
333 while (!$continue) {
334   print "What is the maximum number of channels a normal user may join at any one time?\n";
335   print "[\033[1;32m$config{MAX_CHANNE}\033[0m] -> ";
336   chomp($var = <STDIN>);
337   if ($var eq "") { $var = $config{MAX_CHANNE}; }
338   if ($var =~ /^\d+$/) {
339     # We don't care what the number is, set it and be on our way.
340     $config{MAX_CHANNE} = $var;
341     $continue = 1;
342     print "\n";
343   } else {
344     print "You must enter a number in this field. Please try again.\n\n";
345   }
346 }
347
348 $continue = 0;
349 while (!$continue) {
350   print "What is the maximum number of channels an oper may join at any one time?\n";
351   print "[\033[1;32m$config{MAX_OPERCH}\033[0m] -> ";
352   chomp($var = <STDIN>);
353   if ($var eq "") { $var = $config{MAX_OPERCH}; }
354   if ($var =~ /^\d+$/) {
355     # We don't care what the number is, set it and be on our way.
356     $config{MAX_OPERCH} = $var;
357     $continue = 1;
358     print "\n";
359  }
360 }
361
362 $continue = 0;
363 while (!$continue) {
364   print "What is the maximum number of mode changes in one line?\n";
365   print "[\033[1;32m$config{MAXI_MODES}\033[0m] -> ";
366   chomp($var = <STDIN>);
367   if ($var eq "") { $var = $config{MAXI_MODES}; }
368   if ($var =~ /^\d+$/) {
369     # We don't care what the number is, set it and be on our way.
370     $config{MAXI_MODES} = $var;
371     $continue = 1;
372     print "\n";
373   } else {
374     print "You must enter a number in this field. Please try again.\n\n";
375   }
376 }
377
378 $continue = 0;
379 while (!$continue) {
380   print "What is the maximum length of an ident (username)?\n";
381   print "[\033[1;32m$config{MAX_IDENT}\033[0m] -> ";
382   chomp($var = <STDIN>);
383   if ($var eq "") { $var = $config{MAX_IDENT}; }
384   if ($var =~ /^\d+$/) {
385     # We don't care what the number is, set it and be on our way.
386     $config{MAX_IDENT} = $var;
387     $continue = 1;
388     print "\n";
389   } else {
390     print "You must enter a number in this field. Please try again.\n\n";
391   }
392 }
393
394 $continue = 0;
395 while (!$continue) {
396   print "What is the maximum length of a quit message?\n";
397   print "[\033[1;32m$config{MAX_QUIT}\033[0m] -> ";
398   chomp($var = <STDIN>);
399   if ($var eq "") { $var = $config{MAX_QUIT}; }
400   if ($var =~ /^\d+$/) {
401     # We don't care what the number is, set it and be on our way.
402     $config{MAX_QUIT} = $var;
403     $continue = 1;
404     print "\n";
405   } else {
406     print "You must enter a number in this field. Please try again.\n\n";
407   }
408 }
409
410 $continue = 0;
411 while (!$continue) {
412   print "What is the maximum length of a channel topic?\n";
413   print "[\033[1;32m$config{MAX_TOPIC}\033[0m] -> ";
414   chomp($var = <STDIN>);
415   if ($var eq "") { $var = $config{MAX_TOPIC}; }
416   if ($var =~ /^\d+$/) {
417     # We don't care what the number is, set it and be on our way.
418     $config{MAX_TOPIC} = $var;
419     $continue = 1;
420     print "\n";
421   } else {
422     print "You must enter a number in this field. Please try again.\n\n";
423   }
424 }
425
426 $continue = 0;
427 while (!$continue) {
428   print "What is the maximum length of a kick message?\n";
429   print "[\033[1;32m$config{MAX_KICK}\033[0m] -> ";
430   chomp($var = <STDIN>);
431   if ($var eq "") { $var = $config{MAX_KICK}; }
432   if ($var =~ /^\d+$/) {
433     # We don't care what the number is, set it and be on our way.
434     $config{MAX_KICK} = $var;
435     $continue = 1;
436     print "\n";
437   } else {
438     print "You must enter a number in this field. Please try again.\n\n";
439   }
440 }
441
442 $continue = 0;
443 while (!$continue) {
444   print "What is the maximum length of a GECOS (real name) field?\n";
445   print "[\033[1;32m$config{MAX_GECOS}\033[0m] -> ";
446   chomp($var = <STDIN>);
447   if ($var eq "") { $var = $config{MAX_GECOS}; }
448   if ($var =~ /^\d+$/) {
449     # We don't care what the number is, set it and be on our way.
450     $config{MAX_GECOS} = $var;
451     $continue = 1;
452     print "\n";
453   } else {
454     print "You must enter a number in this field. Please try again.\n\n";
455   }
456 }
457
458 $continue = 0;
459 while (!$continue) {
460   print "What is the maximum length of an away message?\n";
461   print "[\033[1;32m$config{MAX_AWAY}\033[0m] -> ";
462   chomp($var = <STDIN>);
463   if ($var eq "") { $var = $config{MAX_AWAY}; }
464   if ($var =~ /^\d+$/) {
465     # We don't care what the number is, set it and be on our way.
466     $config{MAX_AWAY} = $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 # Code Optimisation
475 print "Enter the Level Of Binary optimisation. This is a number between 0 and 3.
476 The InspIRCd Team will NOT support any bug reports above 0. Also note,
477 the IRCd behaviour will be different depending on this value. Please
478 read the documentation for more information.
479
480 The higher the number, the more optimised your binary will be. This
481 value will default to 0 if you either don't enter a number, or enter
482 a value outside the range.
483
484 As always, if you are unsure, just press enter and accept the default.\n\n";
485 print "[\033[1;32m$config{OPTIMITEMP}\033[0m] -> ";
486 chomp($var = <STDIN>);
487 if ($var eq "") {
488   $var = $config{OPTIMITEMP};
489 }
490
491 if ($var eq "1") {
492   $config{OPTIMITEMP} = 1;
493   $config{OPTIMISATI} = "-O";
494 } elsif ($var eq "2") {
495   $config{OPTIMITEMP} = 2;
496   $config{OPTIMISATI} = "-O2";
497 } elsif ($var eq "3") {
498   $config{OPTIMITEMP} = 3;
499   $config{OPTIMISATI} = "-O3";
500 } else {
501   $config{OPTIMITEMP} = 0;
502   $config{OPTIMISATI} = "-g";
503 }
504
505 print "\n\033[1;32mPre-build configuration is complete!\033[0m\n\n";
506 print "\033[0mBase install path:\033[1;32m\t\t$config{BASE_DIR}\n";
507 print "\033[0mConfig path:\033[1;32m\t\t\t$config{CONFIG_DIR}\n";
508 print "\033[0mModule path:\033[1;32m\t\t\t$config{MODULE_DIR}\n";
509 print "\033[0mLibrary path:\033[1;32m\t\t\t$config{LIBRARY_DIR}\n";
510 print "\033[0mMax connections:\033[1;32m\t\t$config{MAX_CLIENT}\n";
511 print "\033[0mMax User Channels:\033[1;32m\t\t$config{MAX_CHANNE}\n";
512 print "\033[0mMax nickname length:\033[1;32m\t\t$config{NICK_LENGT}\n";
513 print "\033[0mMax channel length:\033[1;32m\t\t$config{CHAN_LENGT}\n";
514 print "\033[0mMax mode length:\033[1;32m\t\t$config{MAXI_MODES}\n";
515 print "\033[0mMax ident length:\033[1;32m\t\t$config{MAX_IDENT}\n";
516 print "\033[0mMax quit length:\033[1;32m\t\t$config{MAX_QUIT}\n";
517 print "\033[0mMax topic length:\033[1;32m\t\t$config{MAX_TOPIC}\n";
518 print "\033[0mMax kick length:\033[1;32m\t\t$config{MAX_KICK}\n";
519 print "\033[0mMax name length:\033[1;32m\t\t$config{MAX_GECOS}\n";
520 print "\033[0mMax away length:\033[1;32m\t\t$config{MAX_AWAY}\n";
521 print "\033[0mGCC Version Found:\033[1;32m\t\t$config{GCCVER}.$config{GCC34}\n";
522 print "\033[0mOptimatizaton Flag:\033[1;32m\t\t$config{OPTIMISATI}\033[0m\n";
523 print "\033[0mCompiler program:\033[1;32m\t\t$config{CC}\033[0m\n";
524 print "\033[0mStatic modules:\033[1;32m\t\t\t$config{STATIC_LINK}\033[0m\n";
525 print "\033[0mMultithread DNS:\033[1;32m\t\t$config{THREADED_DNS}\033[0m\n\n";
526
527 makecache();
528 writefiles();
529
530 print "\n\n";
531 print "To build your server with these settings, please type '\033[1;32m$config{MAKEPROG}\033[0m' now.\n";
532 print "*** \033[1;32mRemember to edit your configuration files!!!\033[0m ***\n\n\n";
533 if (($config{OSNAME} eq "OpenBSD") && ($config{CC} ne "eg++")) {
534         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";
535 }
536 if ($config{OSNAME} =~ /CYGWIN/) {
537         print <<FOO;
538 \033[1;32mWARNING!\033[0m CYGWIN does not properly support shared modules,
539 so modules will be compiled statically into the core of the ircd. The modules
540 will act like they are being loaded from disk and being unloaded from RAM,
541 however they are in fact being enabled and disabled similar to features in
542 other ircds.
543 FOO
544 }
545
546 if ($config{GCCVER} < "3") {
547         print <<FOO2;
548 \033[1;32mWARNING!\033[0m You are attempting to compile InspIRCd on GCC 2.x!
549 GCC 2.x series compilers only had partial (read as broken) C++ support, and
550 your compile will most likely fail horribly! If you have any problems, do NOT
551 report them to the bugtracker or forums without first upgrading your compiler
552 to a newer 3.x or 4.x (or whatever is available currently) version.
553 FOO2
554 }
555
556 ################################################################################
557 #                              HELPER FUNCTIONS                                #
558 ################################################################################
559 sub getcache {
560   # Retrieves the .config.cache file, and loads values into the main config hash.
561   open(CACHE, ".config.cache") or return undef;
562   while (<CACHE>) {
563     chomp;
564
565     # Ignore Blank lines, and comments..
566     next if /^\s*$/;
567     next if /^\s*#/;
568
569     my ($key, $value) = split("=", $_);
570     $value =~ /^\"(.*)\"$/;
571     # Do something with data here!
572     $config{$key} = $1;
573   }
574   close(CONFIG);
575   return "true";
576 }
577
578 sub makecache {
579   # Dump the contents of %config
580   print "Writing \033[1;32mcache file\033[0m for future ./configures ...\n";
581   open(FILEHANDLE, ">.config.cache");
582   foreach $key (keys %config)
583   {
584     print FILEHANDLE "$key=\"$config{$key}\"\n";
585   }
586   close(FILEHANDLE);
587 }
588
589 sub dir_check {
590   my ($desc, $hash_key) = @_;
591   my $complete = 0;
592   while (!$complete) {
593     print "In what directory $desc?\n";
594     print "[\033[1;32m$config{$hash_key}\033[0m] -> ";
595     chomp($var = <STDIN>);
596     if ($var eq "") { $var = $config{$hash_key}; }
597     if ($var =~ /^\~\/(.+)$/) {
598         # Convert it to a full path..
599         $var = resolve_directory($ENV{HOME} . "/" . $1);
600     }
601     if (substr($var,0,1) ne "/")
602     {
603         # Assume relative Path was given.. fill in the rest.
604         $var = $this . "/$var";
605     }
606     $var = resolve_directory($var); 
607     if (! -e $var) {
608       print "$var does not exist. Create it?\n[\033[1;32my\033[0m] ";
609       chomp($tmp = <STDIN>);
610       if (($tmp eq "") || ($tmp =~ /^y/i)) {
611         # Attempt to Create the Dir..
612         $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256;
613         if ($chk != 0) {
614           print "Unable to create directory. ($var)\n\n";
615           # Restart Loop..
616           next;
617         }
618       } else {
619         # They said they don't want to create, and we can't install there.
620         print "\n\n";
621         next;
622       }
623     } else {
624       if (!is_dir($var)) {
625         # Target exists, but is not a directory.
626         print "File $var exists, but is not a directory.\n\n";
627         next;
628       }
629     }
630     # Either Dir Exists, or was created fine.
631     $config{$hash_key} = $var;
632     $complete = 1;
633     print "\n";
634   }
635 }
636
637 sub getosflags {
638   if ($config{OSNAME} =~ /BSD$/) {
639     $config{LDLIBS} = "-Ldl -lstdc++";
640     $config{FLAGS}  = "-fPIC -frtti $OPTIMISATI -Wall -Woverloaded-virtual $config{OPTIMISATI}";
641     $config{MAKEPROG} = "gmake";
642     if ($config{OSNAME} eq "OpenBSD") {
643         chomp($foo = `eg++ -dumpversion | cut -c 1`);
644         # theyre running the package version of gcc (eg++)... detect it and set up its version numbers.
645         # if theyre not running this, configure lets the build continue but they probably wont manage to
646         # compile as this standard version is 2.95.3!
647         if ($foo ne "") {
648                 $config{CC} = "eg++";
649                 chomp($config{GCCVER}       = `eg++ -dumpversion | cut -c 1`); # we must redo these if we change
650                 chomp($config{GCC34}        = `eg++ -dumpversion | cut -c 3`); # the compiler path
651         }
652     }
653   } else {
654     $config{LDLIBS} = "-ldl -lstdc++";
655     $config{FLAGS}  = "-fPIC -frtti $OPTIMISATI -Wall -Woverloaded-virtual $config{OPTIMISATI}";
656     $config{MAKEPROG} = "make";
657     if ($config{OSNAME} =~ /CYGWIN/) {
658        $config{FLAGS}  = "-frtti $OPTIMISATI -Wall -Woverloaded-virtual $config{OPTIMISATI}";
659        $config{LDLIBS} = "";
660        $config{MAKEPROG} = "/usr/bin/make";
661        $config{MAKEORDER} = "mods ircd config bininst";
662        $config{STATICLIBS} = "modules/mods.a";
663        $config{STATIC_LINK} = "yes";
664     }
665   }
666   if ($config{OSNAME} =~ /SunOS/) {
667     # solaris/sunos needs these
668     # socket = bsd sockets api
669     # nsl = dns stuff
670     # rt = POSIX realtime extensions
671     # resolv = inet_aton only (why isnt this in nsl?!)
672     $config{LDLIBS} = $config{LDLIBS} . " -lsocket -lnsl -lrt -lresolv";
673   }
674 }
675
676 sub is_dir {
677   my ($path) = @_;
678   if (chdir($path)) {
679     chdir($this);
680     return 1;
681   } else {
682     # Just in case..
683     chdir($this);
684     return 0;
685   }
686 }
687
688 sub getmodules {
689   my $i = 0;
690   opendir(DIRHANDLE, "src/modules");
691   foreach $name (sort readdir(DIRHANDLE)) {
692     if ($name =~ /^m_(.+)\.cpp$/)
693     {
694       $mod = $1;
695       if ($mod !~ /_static$/) {
696               $modlist[$i++] = $mod;
697       }
698     }
699   }
700   closedir(DIRHANDLE);
701 }
702
703 sub writefiles {
704
705   print "Writing \033[1;32minspircd_config.h\033[0m\n";
706   # First File.. inspircd_config.h
707   chomp(my $incos = `uname -n -s -r`);
708   chomp(my $version = `sh ./src/version.sh`);
709   open(FILEHANDLE, ">include/inspircd_config.h");
710   my $NL = $config{NICK_LENGT}+1;
711   my $CL = $config{CHAN_LENGT}+1;
712   print FILEHANDLE <<EOF;
713 /* Auto generated by configure, do not modify! */
714 #ifndef __CONFIGURATION_AUTO__
715 #define __CONFIGURATION_AUTO__
716
717 #define CONFIG_FILE "$config{CONFIG_DIR}/inspircd.conf"
718 #define MOD_PATH "$config{MODULE_DIR}"
719 #define VERSION "$version"
720 #define MAXCLIENTS $config{MAX_CLIENT}
721 #define NICKMAX $NL
722 #define CHANMAX $CL
723 #define MAXCHANS $config{MAX_CHANNE}
724 #define OPERMAXCHANS $config{MAX_OPERCH}
725 #define MAXMODES $config{MAXI_MODES}
726 #define IDENTMAX $config{MAX_IDENT}
727 #define MAXQUIT $config{MAX_QUIT}
728 #define MAXTOPIC $config{MAX_TOPIC}
729 #define MAXKICK $config{MAX_KICK}
730 #define MAXGECOS $config{MAX_GECOS}
731 #define MAXAWAY $config{MAX_AWAY}
732 #define OPTIMISATION $config{OPTIMITEMP}
733 #define SYSTEM "$incos"
734 #define MAXBUF 514
735 EOF
736
737   if ($config{OSNAME} =~ /SunOS/) {
738     print FILEHANDLE "#define IS_SOLARIS\n";
739   }
740   if ($config{OSNAME} =~ /CYGWIN/) {
741     print FILEHANDLE "#define IS_CYGWIN\n";
742     print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE    1024\n#endif\n";
743   }
744   if ($config{STATIC_LINK} eq "yes") {
745     print FILEHANDLE "#define STATIC_LINK\n";
746   }
747   if ($config{GCCVER} > 3) {
748     print FILEHANDLE "#define GCC3\n";
749     print FILEHANDLE "#define GCC34\n";
750   }
751   else
752   {
753     if ($config{GCCVER} == 3) {
754       print FILEHANDLE "#define GCC3\n";
755       if ($config{GCC34} > 3) {
756         print FILEHANDLE "#define GCC34\n";
757       }
758     }
759   }
760   if ($config{HAS_STRLCPY} eq "true") {
761     print FILEHANDLE "#define HAS_STRLCPY\n";
762   }
763   if ($config{THREADED_DNS} =~ /y/i) {
764     print FILEHANDLE "#define THREADED_DNS\n";
765   }
766   my $use_hiperf = 0;
767   if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
768     print FILEHANDLE "#define USE_KQUEUE\n";
769     $use_hiperf = 1;
770   }
771   if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
772     print FILEHANDLE "#define USE_EPOLL\n";
773     $use_hiperf = 1;
774   }
775   # user didn't choose either epoll or select for their OS.
776   # default them to USE_SELECT (ewwy puke puke)
777   if (!$use_hiperf) {
778     print FILEHANDLE "#define USE_SELECT\n";
779   }
780   print FILEHANDLE "\n#endif\n";
781   close(FILEHANDLE);
782
783   # Create a Modules List..
784   my $modules = "";
785   foreach $i (@modlist)
786   {
787     if ($config{OSNAME} =~ /CYGWIN/) {
788         $modules .= "m_".$i.".o ";
789     }
790     else {
791         $modules .= "m_".$i.".so ";
792     }
793   }
794   chomp($modules);   # Remove Redundant whitespace..
795
796
797   # Write all .in files.
798   my $tmp = "";
799   my $file = "";
800   my $exe = "inspircd";
801
802   if ($config{OSNAME} =~ /CYGWIN/) {
803     $exe = "inspircd.exe";
804   }
805
806   opendir(DIRHANDLE, $this);
807   if ($config{THREADED_DNS} =~ /y/i) {
808     $config{LDLIBS} = $config{LDLIBS} . " -pthread";
809   }
810   foreach $name (sort readdir(DIRHANDLE)) {
811     if ($name =~ /^\.(.+)\.inc$/)
812     {
813       $file = $1;
814       # All .name.inc files need parsing!
815       $tmp = "";
816       open(FILEHANDLE, ".$file.inc");
817       while (<FILEHANDLE>) {
818         $tmp .= $_;
819       }
820       close(FILEHANDLE);
821
822       $tmp =~ s/\@CC\@/$config{CC}/;
823       $tmp =~ s/\@MAKEPROG\@/$config{MAKEPROG}/;
824       $tmp =~ s/\@FLAGS\@/$config{FLAGS}/;
825       $tmp =~ s/\@LDLIBS\@/$config{LDLIBS}/;
826       $tmp =~ s/\@BASE_DIR\@/$config{BASE_DIR}/;
827       $tmp =~ s/\@CONFIG_DIR\@/$config{CONFIG_DIR}/;
828       $tmp =~ s/\@MODULE_DIR\@/$config{MODULE_DIR}/;
829       $tmp =~ s/\@BINARY_DIR\@/$config{BINARY_DIR}/;
830       $tmp =~ s/\@LIBRARY_DIR\@/$config{LIBRARY_DIR}/;
831       $tmp =~ s/\@MODULES\@/$modules/;
832       $tmp =~ s/\@EXECUTABLE\@/$exe/;
833       $tmp =~ s/\@MAKEORDER\@/$config{MAKEORDER}/;
834       $tmp =~ s/\@STATICLIBS\@/$config{STATICLIBS}/;
835
836       print "Writing \033[1;32m$file\033[0m\n";
837       open(FILEHANDLE, ">$file");
838       print FILEHANDLE $tmp;
839     }
840   }
841   closedir(DIRHANDLE);
842
843   # Make inspircd executable!
844   chmod 0744, 'inspircd';
845
846   if ($config{OSNAME} =~ /CYGWIN/) {
847         print "Writing static-build \033[1;32msrc/Makefile\033[0m\n";
848         write_static_makefile();
849   }
850   else {
851         print "Writing dynamic-build \033[1;32msrc/Makefile\033[0m\n";
852         write_dynamic_makefile();
853   }
854
855
856   # Modules Makefile..
857   print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
858   open(FILEHANDLE, ">src/modules/Makefile");
859   print FILEHANDLE <<EOF;
860 # (C) ChatSpike development team
861 # Makefile by <Craig\@ChatSpike.net>
862 # Many Thanks to Andrew Church <achurch\@achurch.org>
863 #    for assisting with making this work right.
864 #
865 # Automatically Generated by ./configure to add a modules
866 # please run ./configure --update
867
868 all: \$(MODULES)
869
870 EOF
871
872   # Create a Modules List..
873   my $modules = "";
874   my $flags = "";
875   if ($config{OSNAME} =~ /CYGWIN/) {
876      open(MODLIST,">include/modlist.h");
877      print MODLIST <<HEADER;
878 // Generated automatically by configure. DO NOT EDIT!
879
880 #ifndef __SYMBOLS__H_CONFIGURED__
881 #define __SYMBOLS__H_CONFIGURED__
882
883 HEADER
884      foreach $i (@modlist) {
885         if ($i !~ /_static$/) {
886                 print MODLIST "extern \"C\" void * $i\_init (void);\n";
887         }
888      }
889      print MODLIST "\nstruct {const char *name; initfunc *value; } modsyms[] = {\n";
890   }
891   foreach $i (@modlist)
892   {
893     if ($i !~ /_static$/) {
894      $flags = getcompilerflags("src/modules/m_".$i.".cpp");
895      if ($config{OSNAME} =~ /CYGWIN/) {
896         print FILEHANDLE <<EOCHEESE;
897 m_$i.o: m_$i\_static.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h
898         \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c m_$i\_static.cpp
899         mv m_$i\_static.o ../m_$i.o
900
901 EOCHEESE
902         print "Configuring module [\033[1;32mm_$i.so\033[0m] for static linking... ";
903         open(MODULE,"<src/modules/m_".$i.".cpp") or die("Could not open m_".$i.".cpp");
904         open(MUNGED,">src/modules/m_".$i."_static.cpp") or die("Could not create m_".$i."_static.cpp");
905         while (chomp($a = <MODULE>)) { 
906                 $a =~ s/init_module/$i\_init/g;
907                 $a =~ s/Srv/$i\Srv/g;
908                 print MUNGED "$a\n";
909         }
910         close(MODULE);
911         close(MUNGED);
912         print MODLIST <<EOENT;
913 {"m_$i.so",\&$i\_init},
914 EOENT
915         print "done\n";
916      }
917      else {
918          print FILEHANDLE <<EOCHEESE;
919 m_$i.so: m_$i.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h
920         \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c m_$i.cpp
921         \$(CC) \$(FLAGS) -shared $flags -o m_$i.so m_$i.o
922         \@-rm -f \$(MODPATH)/m_$i.so
923         cp m_$i.so \$(MODPATH)/
924         chmod 0700 \$(MODPATH)/m_$i.so
925
926 EOCHEESE
927       }
928    }
929   }
930   if ($config{OSNAME} =~ /CYGWIN/) {
931      print MODLIST "{0}};\n\n#endif\n";
932      close(MODLIST);
933   }
934 }
935
936 sub getcompilerflags {
937   my ($file) = @_;
938   open(FLAGS, $file);
939   while (<FLAGS>) {
940     if ($_ =~ /^\/\* \$CompileFlags: (.+) \*\/$/) {
941       close(FLAGS);
942       return $1;
943     }
944   }
945   close(FLAGS);
946   return undef;
947 }
948
949 sub show_splash {
950   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";
951   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";
952   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";
953   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";
954   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";
955   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";
956   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";
957   print "\033[0m\033[0m....::..::::..:::......:::..:::::::::....::..:::::..:::......:::........:::\n\n";
958 }
959
960 sub resolve_directory {
961         use File::Spec;
962         return File::Spec->rel2abs($_[0]);
963 }
964
965 sub yesno {
966         my ($flag,$prompt) = @_;
967         print "$prompt [\033[1;32m$config{$flag}\033[0m] -> ";
968         chomp($tmp = <STDIN>);
969         if ($tmp eq "") { $tmp = $config{$flag} }
970
971         if (($tmp eq "") || ($tmp =~ /^y/i)) {
972                 $config{$flag} = "y";
973         } else {
974                 $config{$flag} = "n";
975         }
976         return;
977 }
978
979
980 sub write_static_makefile {
981         open(FH,">src/Makefile") or die("Could not write src/Makefile!");
982         print FH <<EOM;
983 # Insp Makefile :p
984 #
985 # (C) ChatSpike development team
986 # Makefile by <Craig\@ChatSpike.net>
987 # Makefile version 2 (dynamically linked core) by <brain\@inspircd.org>
988 #
989
990 CC = im a cheezeball
991
992 CXXFLAGS = -I../include \${FLAGS}
993
994 all: userprocess.o socketengine.o socket.o hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_util.o inspircd_io.o message.o commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o helperfuncs.o \$(MODULES) inspircd.exe
995
996 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
997         \$(CC) -I../include \$(FLAGS) inspircd.cpp -o inspircd.exe \$(LDLIBS) channels.o mode.o xline.o inspstring.o dns.o base.o inspircd_util.o inspircd_io.o message.o commands.o dnsqueue.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o \$(MODULES)
998
999 userprocess.o: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1000         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1001
1002 socketengine.o: socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1003         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
1004
1005 hashcomp.o: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1006         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1007
1008 helperfuncs.o: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1009         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1010
1011 channels.o: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1012         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1013
1014 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
1015         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1016
1017 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
1018         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1019
1020 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
1021         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1022
1023 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
1024         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1025
1026 base.o: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1027         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1028
1029 inspircd_util.o: inspircd_util.cpp ../include/base.h ../include/inspircd_util.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1030         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_util.cpp
1031
1032 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
1033         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_io.cpp
1034
1035 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
1036         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
1037
1038 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
1039         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
1040
1041 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
1042         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
1043
1044 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
1045         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1046
1047 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
1048         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1049
1050 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
1051         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1052
1053 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
1054         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1055
1056 socket.o: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1057         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1058
1059
1060 EOM
1061 close(FH);
1062 }
1063
1064 sub write_dynamic_makefile {
1065         open(FH,">src/Makefile") or die("Could not write src/Makefile");
1066         print FH <<EOM;
1067 # Insp Makefile :p
1068 #
1069 # (C) ChatSpike development team
1070 # Makefile by <Craig\@ChatSpike.net>
1071 # Makefile version 2 (dynamically linked core) by <brain\@inspircd.org>
1072 #
1073
1074 CC = im a cheezeball
1075
1076 CXXFLAGS = -I../include \${FLAGS}
1077
1078 all: libIRCDuserprocess.so libIRCDsocketengine.so libIRCDsocket.so libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDutil.so libIRCDio.so libIRCDmessage.so libIRCDcommands.so libIRCDdnsqueue.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so inspircd
1079
1080 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
1081         \$(CC) -I../include \$(FLAGS) -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDutil.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
1082
1083 libIRCDsocketengine.so: socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1084         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
1085         \$(CC) -shared -o libIRCDsocketengine.so socketengine.o
1086
1087 libIRCDuserprocess.so: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1088         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1089         \$(CC) -shared -o libIRCDuserprocess.so userprocess.o
1090
1091 libIRCDhash.so: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1092         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1093         \$(CC) -shared -o libIRCDhash.so hashcomp.o
1094
1095 libIRCDhelper.so: helperfuncs.cpp ../include/base.h ../include/helperfuncs.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1096         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1097         \$(CC) -shared -o libIRCDhelper.so helperfuncs.o
1098
1099 libIRCDchannels.so: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1100         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1101         \$(CC) -shared -o libIRCDchannels.so channels.o
1102
1103 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
1104         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1105         \$(CC) -shared -o libIRCDmode.so mode.o
1106
1107 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
1108         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1109         \$(CC) -shared -o libIRCDxline.so xline.o
1110
1111 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
1112         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1113         \$(CC) -shared -o libIRCDstring.so inspstring.o
1114
1115 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
1116         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1117         \$(CC) -shared -o libIRCDasyncdns.so dns.o
1118
1119 libIRCDbase.so: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1120         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1121         \$(CC) -shared -o libIRCDbase.so base.o
1122
1123 libIRCDutil.so: inspircd_util.cpp ../include/base.h ../include/inspircd_util.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1124         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_util.cpp
1125         \$(CC) -shared -o libIRCDutil.so inspircd_util.o
1126
1127 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
1128         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd_io.cpp
1129         \$(CC) -shared -o libIRCDio.so inspircd_io.o
1130
1131 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
1132         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c message.cpp
1133         \$(CC) -shared -o libIRCDmessage.so message.o
1134
1135 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
1136         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
1137         \$(CC) -shared -o libIRCDcommands.so commands.o
1138
1139 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
1140         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dnsqueue.cpp
1141         \$(CC) -shared -o libIRCDdnsqueue.so dnsqueue.o
1142
1143 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
1144         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1145         \$(CC) -shared -o libIRCDdynamic.so dynamic.o
1146
1147 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
1148         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1149         \$(CC) -shared -o libIRCDusers.so users.o
1150
1151 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
1152         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1153         \$(CC) -shared -o libIRCDmodules.so modules.o
1154
1155 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
1156         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1157         \$(CC) -shared -o libIRCDwildcard.so wildcard.o
1158
1159 libIRCDsocket.so: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1160         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1161         \$(CC) -shared -o libIRCDsocket.so socket.o
1162
1163 EOM
1164 close(FH);
1165 }