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