]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - configure
Poach feature request: If a server does not respond after x seconds to a PING, send...
[user/henk/code/inspircd.git] / configure
1 #!/usr/bin/perl
2
3 # InspIRCd Configuration Script
4 #
5 # Copyright 2002-2007 The ChatSpike Development Team
6 # <brain@chatspike.net>
7 # <Craig@chatspike.net>
8 #
9 # Licensed under GPL, please see the COPYING file
10 # for more information
11 #
12 # [14:21] Brain: <matrix impression> i know perl-fu!
13 #
14 # $Id$
15 #
16 ########################################
17
18 require 5.6.0;
19 use Socket;
20 use Cwd;
21 use Getopt::Long;
22
23 # Utility functions for our buildsystem
24 use make::utilities;
25 use make::configure;
26 use make::gnutlscert;
27 use make::opensslcert;
28
29 GetOptions (
30         'enable-gnutls' => \$opt_use_gnutls,
31         'rebuild' => \$opt_rebuild,
32         'enable-openssl' => \$opt_use_openssl,
33         'disable-interactive' => \$opt_nointeractive,
34         'with-nick-length=i' => \$opt_nick_length,
35         'with-channel-length=i' => \$opt_chan_length,
36         'with-max-clients=i' => \$opt_maxclients,
37         'enable-ports' => \$opt_ports,
38         'enable-epoll' => \$opt_epoll,
39         'enable-kqueue' => \$opt_kqueue,
40         'disable-ports' => \$opt_noports,
41         'disable-epoll' => \$opt_noepoll,
42         'disable-kqueue' => \$opt_nokqueue,
43         'enable-ipv6' => \$opt_ipv6,
44         'enable-remote-ipv6' => \$opt_ipv6links,
45         'disable-remote-ipv6' => \$opt_noipv6links,
46         'with-cc=s' => \$opt_cc,
47         'with-ident-length=i' => \$opt_ident,
48         'with-quit-length=i' => \$opt_quit,
49         'with-topic-length=i' => \$opt_topic,
50         'with-kick-length=i' => \$opt_kick,
51         'with-gecos-length=i' => \$opt_gecos,
52         'with-away-length=i' => \$opt_away,
53         'with-max-modes=i' => \$opt_modes,
54         'prefix=s' => \$opt_base_dir,
55         'config-dir=s' => \$opt_config_dir,
56         'module-dir=s' => \$opt_module_dir,
57         'binary-dir=s' => \$opt_binary_dir,
58         'library-dir=s' => \$opt_library_dir,
59         'disable-debuginfo' => sub { $opt_disable_debug = 1 },
60         'help'  => sub { showhelp(); },
61         'modupdate' => sub { modupdate(); },
62         'update' => sub { update(); },
63         'svnupdate' => sub { svnupdate(); },
64         'clean' => sub { clean(); },
65 );
66
67 my $non_interactive = (
68         (defined $opt_library_dir) ||
69         (defined $opt_base_dir) ||
70         (defined $opt_config_dir) ||
71         (defined $opt_module_dir) ||
72         (defined $opt_base_dir) ||
73         (defined $opt_binary_dir) ||
74         (defined $opt_nointeractive) ||
75         (defined $opt_away) ||
76         (defined $opt_gecos) ||
77         (defined $opt_kick) ||
78         (defined $opt_maxclients) ||
79         (defined $opt_modes) ||
80         (defined $opt_topic) ||
81         (defined $opt_quit) ||
82         (defined $opt_ident) ||
83         (defined $opt_cc) ||
84         (defined $opt_ipv6) ||
85         (defined $opt_ipv6links) ||
86         (defined $opt_noipv6links) ||
87         (defined $opt_kqueue) ||
88         (defined $opt_epoll) ||
89         (defined $opt_ports) ||
90         (defined $opt_maxchans) ||
91         (defined $opt_opermaxchans) ||
92         (defined $opt_chan_length) ||
93         (defined $opt_nick_length) ||
94         (defined $opt_use_openssl) ||
95         (defined $opt_nokqueue) ||
96         (defined $opt_noepoll) ||
97         (defined $opt_noports) ||
98         (defined $opt_use_gnutls)
99 );
100 my $interactive = !$non_interactive;
101
102
103 chomp($topdir = getcwd());
104 $this = resolve_directory($topdir);                                             # PWD, Regardless.
105 @modlist = ();                                                          # Declare for Module List..
106 %config = ();                                                           # Initiate Configuration Hash..
107 $config{ME}              = resolve_directory($topdir);                  # Present Working Directory
108
109 $config{BASE_DIR}          = $config{ME};
110
111 if (defined $opt_base_dir)
112 {
113         $config{BASE_DIR} = $opt_base_dir;
114 }
115
116 $config{CONFIG_DIR}      = resolve_directory($config{BASE_DIR}."/conf");                # Configuration Directory
117 $config{MODULE_DIR}      = resolve_directory($config{BASE_DIR}."/modules");             # Modules Directory
118 $config{BINARY_DIR}      = resolve_directory($config{BASE_DIR}."/bin");         # Binary Directory
119 $config{LIBRARY_DIR}    = resolve_directory($config{BASE_DIR}."/lib");          # Library Directory
120
121 if (defined $opt_config_dir)
122 {
123         $config{CONFIG_DIR} = $opt_config_dir;
124 }
125 if (defined $opt_module_dir)
126 {
127         $config{MODULE_DIR} = $opt_module_dir;
128 }
129 if (defined $opt_binary_dir)
130 {
131         $config{BINARY_DIR} = $opt_binary_dir;
132 }
133 if (defined $opt_library_dir)
134 {
135         $config{LIBRARY_DIR} = $opt_library_dir;
136 }
137 chomp($config{HAS_GNUTLS}   = `libgnutls-config --version 2>/dev/null | cut -c 1,2,3`); # GNUTLS Version.
138 chomp($config{HAS_OPENSSL}  = `pkg-config --modversion openssl 2>/dev/null`);                   # Openssl version
139 chomp($gnutls_ver = $config{HAS_GNUTLS});
140 chomp($openssl_ver = $config{HAS_OPENSSL});
141 $config{USE_GNUTLS}         = "n";
142 if (defined $opt_use_gnutls)
143 {
144         $config{USE_GNUTLS} = "y";                                              # Use gnutls.
145 }
146 $config{USE_OPENSSL}    = "n";                                          # Use openssl.
147 if (defined $opt_use_openssl)
148 {
149         $config{USE_OPENSSL} = "y";
150 }
151
152 # no, let's not change these.
153 $config{OPTIMITEMP}      = "0";                                 # Default Optimisation Value
154 if (!defined $opt_disable_debug)
155 {
156         $config{OPTIMISATI}      = "-g1";                               # Optimisation Flag
157 }
158 else
159 {
160         $config{OPTIMISATI}      = "-O2";                                       # DEBUGGING OFF!
161 }
162
163 $config{NICK_LENGT}      = "31";                                        # Default Nick Length
164 if (defined $opt_nick_length)
165 {
166         $config{NICK_LENGT} = $opt_nick_length;
167 }
168 $config{CHAN_LENGT}      = "64";                                        # Default Channel Name Length
169 if (defined $opt_chan_length)
170 {
171         $config{CHAN_LENGT} = $opt_chan_length;
172 }
173 $config{MAXI_MODES}      = "20";                                        # Default Max. Number of Modes set at once.
174 if (defined $opt_modes)
175 {
176         $config{MAXI_MODES} = $opt_modes;
177 }
178 $config{HAS_STRLCPY}    = "false";                                      # strlcpy Check.
179 $config{HAS_STDINT}      = "false";                                             # stdint.h check
180 $config{USE_KQUEUE}      = "y";                                         # kqueue enabled
181 if (defined $opt_kqueue)
182 {
183         $config{USE_KQUEUE} = "y";
184 }
185 if (defined $opt_nokqueue)
186 {
187         $config{USE_KQUEUE} = "n";
188 }
189 $config{USE_EPOLL}        = "y";                                                # epoll enabled
190 if (defined $opt_epoll)
191 {
192         $config{USE_EPOLL} = "y";
193 }
194 if (defined $opt_noepoll)
195 {
196         $config{USE_EPOLL} = "n";
197 }
198 $config{USE_PORTS}        = "y";                                                # epoll enabled
199 if (defined $opt_ports)
200 {
201         $config{USE_PORTS} = "y";
202 }
203 if (defined $opt_noports)
204 {
205         $config{USE_PORTS} = "n";
206 }
207 $config{IPV6}          = "n";                                           # IPv6 support (experimental)
208 if (defined $opt_ipv6)
209 {
210         $config{IPV6} = "y";
211 }
212 $config{SUPPORT_IP6LINKS}   = "y";                                              # IPv4 supporting IPv6 links (experimental)
213 if (defined $opt_ipv6links)
214 {
215         $config{SUPPORT_IP6LINKS} = "y";
216 }
217 if (defined $opt_noipv6links)
218 {
219         $config{SUPPORT_IP6LINKS} = "n";
220 }
221 $config{STATIC_LINK}        = "no";                                             # are doing static modules?
222 chomp($config{MAX_CLIENT_T} = `sh -c \"ulimit -n\"`);                   # FD Limit
223 chomp($config{MAX_DESCRIPTORS} = `sh -c \"ulimit -n\"`);                        # Hard FD Limit
224 chomp($config{GCCVER}       = `g++ -dumpversion | cut -c 1`);                   # Major GCC Version
225 $config{_SOMAXCONN} = SOMAXCONN;                                                # Max connections in accept queue
226 $config{OSNAME}             = $^O;                                      # Operating System Name
227 $config{IS_DARWIN}          = "NO";                                             # Is OSX?
228 if ($config{OSNAME} =~ /darwin/i)
229 {
230         $config{IS_DARWIN} = "YES";
231 }
232 $config{CC}                 = "g++";                                            # C++ compiler
233 if (defined $opt_cc)
234 {
235         $config{CC} = $opt_cc;
236 }
237 $exec = $config{CC} . " -dumpversion | cut -c 1";
238 chomp($config{GCCVER}       = `$exec`);                                         # Major GCC Version
239 $config{MAKEORDER}          = "ircd mods";                                      # build order
240 $config{STATICLIBS}      = "";                                          # library archive path
241 $config{MAX_IDENT}        = "12";                                               # max ident size
242 $config{MAX_QUIT}          = "255";                                             # max quit message size
243 $config{MAX_TOPIC}        = "307";                                              # max topic size
244 $config{MAX_KICK}          = "255";                                             # max kick message size
245 $config{MAX_GECOS}        = "128";                                              # max GECOS size
246 $config{MAX_AWAY}          = "200";                                             # max AWAY size
247 if (defined $opt_ident)
248 {
249         $config{MAX_IDENT} = $opt_ident;
250 }
251 if (defined $opt_quit)
252 {
253         $config{MAX_QUIT} = $opt_quit;
254 }
255 if (defined $opt_topic)
256 {
257         $config{MAX_TOPIC} = $opt_topic;
258 }
259 if (defined $opt_kick)
260 {
261         $config{MAX_KICK} = $opt_kick;
262 }
263 if (defined $opt_gecos)
264 {
265         $config{MAX_GECOS} = $opt_gecos;
266 }
267 if (defined $opt_away)
268 {
269         $config{MAX_AWAY} = $opt_away;
270 }
271
272 $config{HAS_OPENSSL} =~ /^([-[:digit:].]+)([a-z])?(\-[a-z][0-9])?$/;
273 $config{HAS_OPENSSL} = $1;
274
275 if ($config{GCCVER} eq "") {
276         print $config{CC} . " was not found! You require g++ (the GNU C++ compiler, part of GCC) to build InspIRCd!\n";
277         exit;
278 }
279
280 # Minihack! Convert Cygwin to 'Cyg-Static' so i can
281 # Keep my dynamic module experiments here for later
282 # consideration!
283
284 if ($config{OSNAME} =~ /CYGWIN/i)
285 {
286         $config{OSNAME} = "CYG-STATIC";
287 }
288
289 if (!$config{MAX_CLIENT_T}) { 
290         $config{MAX_CLIENT_T} = 1024;                            # Set a reasonable 'Default'
291         $fd_scan_fail = "true";                                # Used Later
292 }
293
294 # Get and Set some important vars..
295 getmodules();
296
297 sub clean
298 {
299         system("rm -rf .config.cache");
300 }
301
302 sub update
303 {
304         eval {
305                 chomp($topdir = getcwd());
306                 $this = resolve_directory($topdir);                                          # PWD, Regardless.
307                 getmodules();
308                 # Does the cache file exist?
309                 if (!getcache()) {
310                         # No, No it doesn't.. *BASH*
311                         print "You have not run ./configure before. Please do this before trying to run the update script.\n";
312                         exit 0;
313                 } else {
314                         # We've Loaded the cache file and all our variables..
315                         print "Updating Files..\n";
316                         getosflags();
317                         if ($opt_disable_debug == 1)
318                         {
319                                 print "Disabling debug information (-g).\n";
320                                 $config{OPTIMISATI} = "";
321                                 getosflags();
322                         }
323                         $has_epoll = $config{HAS_EPOLL};
324                         $has_ports = $config{HAS_PORTS};
325                         $has_kqueue = $config{HAS_KQUEUE};
326                         writefiles(1);
327                         makecache();
328                         print "Complete.\n";
329                         exit;
330                 }
331         };
332         if ($@)
333         {
334                 print "Configure update failed: $@\n";
335         }
336         exit;
337 }
338
339 sub modupdate
340 {
341         eval {
342                 chomp($topdir = getcwd());
343                 $this = resolve_directory($topdir);                                          # PWD, Regardless.
344                 getmodules();
345                 # Does the cache file exist?
346                 if (!getcache()) {
347                         # No, No it doesn't.. *BASH*
348                         print "You have not run ./configure before. Please do this before trying to run the update script.\n";
349                         exit 0;
350                 } else {
351                         # We've Loaded the cache file and all our variables..
352                         print "Updating Files..\n";
353                         getosflags();
354                         $has_epoll = $config{HAS_EPOLL};
355                         $has_ports = $config{HAS_PORTS};
356                         $has_kqueue = $config{HAS_KQUEUE};
357                         writefiles(0);
358                         makecache();
359                         print "Complete.\n";
360                         exit;
361                 }
362         };
363         if ($@)
364         {
365                 print "Module update failed: $@\n";
366         }
367         exit;
368 }
369
370
371
372 sub svnupdate
373 {
374         my $fail = 0;
375         open(FH,"<.svn/entries") or $fail = 1;
376         if ($fail) {
377                 print "This is not an SVN copy of InspIRCd.\n";
378                 exit;
379         }
380         else
381         {
382                 close(FH);
383         }
384         system("svn update");
385         system("perl configure -update");
386         if (defined $opt_rebuild) {
387                 system("make install");
388         }
389         exit;
390 }
391
392 print "Running non-interactive configure...\n" unless $interactive;
393 print "Checking for cache from previous configure... ";
394 print ((getcache() eq "true") ? "found\n" : "not found\n");
395 print "Checking operating system version... ";
396 print getosflags() . "\n";
397
398 if (defined $opt_maxclients)
399 {
400         $config{MAX_CLIENT} = $opt_maxclients;
401 }
402
403 if (!$config{MAX_CLIENT}) { 
404         # If the cache hasn't set the max clients, copy the variable of MAX_CLIENT_T, this
405         # allows us to keep _T for testing purposes. (ie. "Are you sure you want to go
406         # higher than the found value" :))
407         $config{MAX_CLIENT} = $config{MAX_CLIENT_T};
408 }
409
410 printf "Checking if stdint.h exists... ";
411 $config{HAS_STDINT} = "true";
412 my $fail = 0;
413 open(STDINT, "</usr/include/stdint.h") or $config{HAS_STDINT} = "false";
414 if ($config{HAS_STDINT} eq "true") {
415         close(STDINT);
416 }
417 print "yes\n" if $config{HAS_STDINT} eq "true";
418 print "no\n" if $config{HAS_STDINT} eq "false";
419
420
421 printf "Checking if strlcpy exists... ";
422 # Perform the strlcpy() test..
423 $config{HAS_STRLCPY} = "false";
424 my $fail = 0;
425 open(STRLCPY, "</usr/include/string.h") or $fail = 1;
426 if (!$fail) {
427         while (chomp($line = <STRLCPY>)) {
428                 # try and find the delcaration of:
429                 # size_t strlcpy(...)
430                 if ($line =~ /size_t(\0x9|\s)+strlcpy/) {
431                         $config{HAS_STRLCPY} = "true";
432                 }
433         }
434         close(STRLCPY);
435 }
436 print "yes\n" if $config{HAS_STRLCPY} eq "true";
437 print "no\n" if $config{HAS_STRLCPY} eq "false";
438
439
440 printf "Checking if kqueue exists... ";
441 $has_kqueue = 0;
442 $fail = 0;
443 open(KQUEUE, "</usr/include/sys/event.h") or $fail = 1;
444 if (!$fail) {
445         while (chomp($line = <KQUEUE>)) {
446                 # try and find the delcaration of:
447                 # int kqueue(void);
448                 if ($line =~ /int(\0x9|\s)+kqueue/) {
449                         $has_kqueue = 1;
450                 }
451         }
452         close(KQUEUE);
453 }
454 print "yes\n" if $has_kqueue == 1;
455 print "no\n" if $has_kqueue == 0;
456
457 printf "Checking if epoll exists... ";
458 $has_epoll = 0;
459 $fail = 0;
460 open(EPOLL, "</usr/include/sys/epoll.h") or $fail = 1;
461 if (!$fail) {
462         $has_epoll = 1;
463         close(EPOLL);
464 }
465 if ($has_epoll) {
466         my $kernel = `uname -r`;
467         chomp($kernel);
468         if (($kernel =~ /^2\.0\./) || ($kernel =~ /^2\.2\./) || ($kernel =~ /^2\.4\./)) {
469                 $has_epoll = 0;
470         }
471 }
472 print "yes\n" if $has_epoll == 1;
473 print "no\n" if $has_epoll == 0;
474
475 printf "Checking if Solaris I/O completion ports are available... ";
476 $has_ports = 0;
477 my $system = `uname -s`;
478 chomp ($system);
479 $has_ports = 1 if ($system eq "SunOS");
480
481 if ($has_ports) {
482         my $kernel = `uname -r`;
483         chomp($kernel);
484         if (($kernel !~ /^5\.10/)) {
485                 $has_ports = 0;
486         }
487 }
488 print "yes\n" if $has_ports == 1;
489 print "no\n" if $has_ports == 0;
490
491 if (($config{OSNAME} =~ /CYGWIN/) || ($config{OSNAME} eq "CYG-STATIC")) {
492         $config{HAS_STRLCPY} = "true";
493 }
494
495 $config{HAS_EPOLL} = $has_epoll;
496 $config{HAS_KQUEUE} = $has_kqueue; 
497
498 printf "Checking for libgnutls... ";
499 if (($config{HAS_GNUTLS}) && (($config{HAS_GNUTLS} >= 1.2) || ($config{HAS_GNUTLS} eq "y"))) {
500         print "yes\n";
501         $config{HAS_GNUTLS} = "y";
502 } else {
503         print "no\n";
504         $config{HAS_GNUTLS} = "n";
505 }
506
507 printf "Checking for openssl... ";
508 if (($config{HAS_OPENSSL}) && (($config{HAS_OPENSSL} >= 0.8) || ($config{HAS_OPENSSL} eq "y"))) {
509         print "yes\n";
510         $config{HAS_OPENSSL} = "y";
511 } else {
512         print "no\n";
513         $config{HAS_OPENSSL} = "n";
514 }
515
516 ################################################################################
517 #                         BEGIN INTERACTIVE PART                              #
518 ################################################################################
519
520 # Clear the Screen..
521 if ($interactive)
522 {
523         system("clear");
524         $wholeos = $^O;
525
526         my $rev = getrevision();
527         # Display Introduction Message..
528         print "
529 Welcome to the \033[1mInspIRCd\033[0m Configuration program! (\033[1minteractive mode\033[0m)
530 \033[1mPackage maintainers: Type ./configure --help for non-interactive help\033[0m
531
532 *** If you are unsure of any of these values, leave it blank for    ***
533 *** standard settings that will work, and your server will run      ***
534 *** using them. Please consult your IRC network admin if in doubt.  ***
535
536 Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter
537 a new value. Please note: You will \033[1mHAVE\033[0m to read the docs
538 dir, otherwise you won't have a config file!
539
540 Your operating system is: \033[1;32m$config{OSNAME}\033[0m ($wholeos)
541 Maximum file descriptors: \033[1;32m$config{MAX_CLIENT_T}\033[0m
542 Your InspIRCd revision ID is \033[1;32mr$rev\033[0m";
543         if ($rev eq "r0") {
544                 print " (Non-SVN build)";
545         }
546         print ".\n\n";
547
548         $config{CHANGE_COMPILER} = "n";
549         print "I have detected the following compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.x\033[0m)\n";
550
551         while (($config{GCCVER} < 3) || ($config{GCCVER} eq "")) {
552                 print "\033[1;32mIMPORTANT!\033[0m A GCC 2.x compiler has been detected, and
553 should NOT be used. You should probably specify a newer compiler.\n\n";
554                 yesno(CHANGE_COMPILER,"Do you want to change the compiler?");
555                 if ($config{CHANGE_COMPILER} =~ /y/i) {
556                         print "What command do you want to use to invoke your compiler?\n";
557                         print "[\033[1;32m$config{CC}\033[0m] -> ";
558                         chomp($config{CC} = <STDIN>);
559                         if ($config{CC} eq "") {
560                                 $config{CC} = "g++";
561                         }
562                         chomp($foo = `$config{CC} -dumpversion | cut -c 1`);
563                         if ($foo ne "") {
564                                 chomp($config{GCCVER}       = `$config{CC} -dumpversion | cut -c 1`); # we must redo these if we change compilers
565                                 print "Queried compiler: \033[1;32m$config{CC}\033[0m (version \033[1;32m$config{GCCVER}.x\033[0m)\n";
566                                 if ($config{GCCVER} < 3) {
567                                         print "\033[1;32mGCC 2.x WILL NOT WORK!\033[0m. Let's try that again, shall we?\n";
568                                 }
569                         }
570                         else {
571                                 print "\033[1;32mWARNING!\033[0m Could not execute the compiler you specified. You may want to try again.\n";
572                         }
573                 }
574         }
575
576         print "\n";
577
578         # Directory Settings..
579         my $tmpbase = $config{BASE_DIR};
580         dir_check("do you wish to install the InspIRCd base", "BASE_DIR");
581         if ($tmpbase ne $config{BASE_DIR}) {
582                 $config{CONFIG_DIR}      = resolve_directory($config{BASE_DIR}."/conf");           # Configuration Dir
583                 $config{MODULE_DIR}      = resolve_directory($config{BASE_DIR}."/modules");     # Modules Directory
584                 $config{BINARY_DIR}      = resolve_directory($config{BASE_DIR}."/bin");     # Binary Directory
585                 $config{LIBRARY_DIR}    = resolve_directory($config{BASE_DIR}."/lib");      # Library Directory
586         }
587
588         dir_check("are the configuration files", "CONFIG_DIR");
589         dir_check("are the modules to be compiled to", "MODULE_DIR");
590         dir_check("is the IRCd binary to be placed", "BINARY_DIR");
591         dir_check("are the IRCd libraries to be placed", "LIBRARY_DIR");
592
593         if ($has_kqueue) {
594                 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?");
595                 print "\n";
596         }
597         if ($has_epoll) {
598                 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?");
599                 print "\n";
600         }
601         if ($has_ports) {
602                 yesno(USE_PORTS,"You are running Solaris 10.\nWould you like to enable I/O completion ports support?\nThis is likely to increase performance.\nIf you are unsure, answer yes.\n\nEnable support for I/O completion ports?");
603                 print "\n";
604         }
605         $chose_hiperf = (($config{USE_EPOLL} eq "y") || ($config{USE_KQUEUE} eq "y") || ($config{USE_PORTS} eq "y"));
606         if (!$chose_hiperf) {
607                 print "No high-performance socket engines are available, or you chose\n";
608                 print "not to enable one. Defaulting to select() engine.\n\n";
609         }
610
611         yesno(IPV6,"Would you like to build InspIRCd with IPv6 support?");
612         print "\n";
613
614         if ($config{IPV6} eq "y") {
615                 print "You have chosen to build an \033[1;32mIPV6-enabled\033[0m server.\nTo accept IPV4 users, you can still use IPV4 addresses\nin your port bindings..\n\n";
616                 $config{SUPPORT_IP6LINKS} = "y";
617         } else {
618                 yesno(SUPPORT_IP6LINKS,"You have chosen to build an \033[1;32mIPV4-only\033[0m server.\nWould you like to enable support for linking to IPV6-enabled\nInspIRCd servers?\nIf you are using a recent operating\nsystem and are unsure, answer yes.\nIf you answer 'no' here, your InspIRCd server will be unable\nto parse IPV6 addresses (e.g. for CIDR bans)");
619                 print "\n";
620         }
621
622         if (($config{HAS_GNUTLS} eq "y") && ($config{HAS_OPENSSL} eq "y")) {
623                 print "I have detected both \033[1;32mGnuTLS\033[0m and \033[1;32mOpenSSL\033[0m on your system.\n";
624                 print "I will default to GnuTLS. If you wish to use OpenSSL\n";
625                 print "instead, you should enable the OpenSSL module yourself\n";
626                 print "by copying it from src/modules/extra to src/modules.\n\n";
627                 print "Detected GnuTLS version: \033[1;32m" . $gnutls_ver . "\033[0m\n";
628                 print "Detected OpenSSL version: \033[1;32m" . $openssl_ver . "\033[0m\n\n";
629         }
630
631         if ($config{HAS_GNUTLS} eq "y") {
632                 yesno(USE_GNUTLS, "Would you like to enable SSL Support?");
633                 if ($config{USE_GNUTLS} eq "y") {
634                         print "\nUsing GnuTLS SSL module.\n";
635                 }
636         } elsif ($config{HAS_OPENSSL} eq "y") {
637                         yesno(USE_OPENSSL, "Would you like to enable SSL Support?");
638         if ($config{USE_OPENSSL} eq "y") {
639                         print "\nUsing OpenSSL SSL module.\nYou will get better performance if you move to GnuTLS in the future.\n";
640                 }
641         }
642         else {
643                 print "\nCould not detect OpenSSL or GnuTLS. Make sure pkg-config is installed if\nyou intend to use OpenSSL, or that GnuTLS is in your path if you intend\nto use GnuTLS.\n\n";
644         }
645
646         print "\nThe following questions will ask you for various figures relating\n";
647         print "To your IRCd install. Please note that these should usually be left\n";
648         print "as defaults unless you have a real reason to change them. If they\n";
649         print "changed, then the values must be identical on all servers on your\n";
650         print "network, or malfunctions and/or crashes may occur, with the exception\n";
651         print "of the 'maximum number of clients' setting which may be different on\n";
652         print "different servers on the network.\n\n";
653
654         # File Descriptor Settings..
655         promptnumeric("number of clients at any one time", "MAX_CLIENT_T");
656         $config{MAX_CLIENT} = $config{MAX_CLIENT_T};
657         $config{MAX_DESCRIPTORS} = $config{MAX_CLIENT_T};
658
659         promptnumeric("length of nicknames", "NICK_LENGT");
660         promptnumeric("length of channel names", "CHAN_LENGT");
661         promptnumeric("number of mode changes in one line", "MAXI_MODES");
662         promptnumeric("length of an ident (username)", "MAX_IDENT");
663         promptnumeric("length of a quit message", "MAX_QUIT");
664         promptnumeric("length of a channel topic", "MAX_TOPIC");
665         promptnumeric("length of a kick message", "MAX_KICK");
666         promptnumeric("length of a GECOS (real name)", "MAX_GECOS");
667         promptnumeric("length of an away message", "MAX_AWAY");
668 }
669
670 dumphash();
671
672 if (($config{USE_GNUTLS} eq "y") && ($config{HAS_GNUTLS} ne "y"))
673 {
674         print "Sorry, but i couldn't detect gnutls. Make sure gnutls-config is in your path.\n";
675         exit(0);
676 }
677 if (($config{USE_OPENSSL} eq "y") && ($config{HAS_OPENSSL} ne "y"))
678 {
679         print "Sorry, but i couldn't detect openssl. Make sure openssl is in your path.\n";
680         exit(0);
681 }
682
683 if ($config{USE_GNUTLS} eq "y") {
684         $failed = 0;
685         open(TMP, "<src/modules/m_ssl_gnutls.cpp") or $failed = 1;
686         close(TMP);
687         if ($failed) {
688                 print "Symlinking src/modules/m_ssl_gnutls.cpp from extra/\n";
689                 chdir("src/modules");
690                 system("ln -s extra/m_ssl_gnutls.cpp");
691                 chdir("../..");
692         }
693         getmodules();
694         if ($interactive)
695         {
696                 $failed = 0;
697                 open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
698                 close(TMP);
699                 open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
700                 close(TMP);
701                 if ($failed) {
702                         print "SSL Certificates Not found, Generating.. \n\n
703 *************************************************************
704 * Generating the Private Key may take some time, go grab a  *
705 * Coffee. Even better, to generate some more entropy if it  *
706 * is taking a while, open another console and type du / a   *
707 * few times and get that HD going :) Then answer the        *
708 * Questions which follow. If you are unsure, just hit enter *
709 *************************************************************\n\n";
710                         make_gnutls_cert();
711                         print "\nCertificate generation complete, copying to config directory... ";
712                         system("mv key.pem $config{CONFIG_DIR}/key.pem");
713                         system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
714                         print "Done.\n\n";
715                 } else {
716                         print "SSL Certificates found, skipping.\n\n"
717                 }
718         }
719         else
720         {
721                 print "Skipping SSL certificate generation\nin non-interactive mode.\n\n";
722         }
723 } elsif ($config{USE_OPENSSL} eq "y") {
724         $failed = 0;
725         open(TMP, "<src/modules/m_ssl_openssl.cpp") or $failed = 1;
726         close(TMP);
727         if ($failed) {
728                 print "Symlinking src/modules/m_ssl_openssl.cpp from extra/\n";
729                 chdir("src/modules");
730                 system("ln -s extra/m_ssl_openssl.cpp");
731                 chdir("../..");
732         }
733         getmodules();
734         $failed = 0;
735         if ($interactive)
736         {
737                 open(TMP, "<$config{CONFIG_DIR}/key.pem") or $failed = 1;
738                 close(TMP);
739                 open(TMP, "<$config{CONFIG_DIR}/cert.pem") or $failed = 1;
740                 close(TMP);
741                 if ($failed) {
742                         print "SSL Certificates Not found, Generating.. \n\n
743 *************************************************************
744 * Generating the certificates may take some time, go grab a *
745 * coffee, or something.                                     *
746 *************************************************************\n\n";
747                         make_openssl_cert();
748                         print "\nCertificate generation complete, copying to config directory... ";
749                         system("mv key.pem $config{CONFIG_DIR}/key.pem");
750                         system("mv cert.pem $config{CONFIG_DIR}/cert.pem");
751                         system("mv dhparams.pem $config{CONFIG_DIR}/dhparams.pem");
752                         print "Done.\n\n";
753                 } else {
754                         print "SSL Certificates found, skipping.\n\n"
755                 }
756         }
757         else
758         {
759                 print "Skipping SSL certificate generation\nin non-interactive mode.\n\n";
760         }
761 }
762 if (($config{USE_GNUTLS} eq "n") && ($config{USE_OPENSSL} eq "n")) {
763         print "Skipping SSL Certificate generation, SSL support is not available.\n\n";
764 }
765
766 getosflags();
767 writefiles(1);
768 makecache();
769
770 print "\n\n";
771 print "To build your server with these settings, please type '\033[1;32m$config{MAKEPROG}\033[0m' now.\n";
772 if (($config{USE_GNUTLS} eq "y") || ($config{USE_OPENSSL} eq "y")) {
773         print "Please remember that to enable \033[1;32mSSL support\033[0m you must\n";
774         print "load the required modules in your config. This configure process\n";
775         print "has just prepared these modules to be compiled for you, and has not\n";
776         print "configured them to be compiled into the core of the ircd.\n";
777 }
778 print "*** \033[1;32mRemember to edit your configuration files!!!\033[0m ***\n\n\n";
779 if (($config{OSNAME} eq "OpenBSD") && ($config{CC} ne "eg++")) {
780         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";
781 }
782
783 if ($config{GCCVER} < "3") {
784         print <<FOO2;
785 \033[1;32mWARNING!\033[0m You are attempting to compile InspIRCd on GCC 2.x!
786 GCC 2.x series compilers only had partial (read as broken) C++ support, and
787 your compile will most likely fail horribly! If you have any problems, do NOT
788 report them to the bugtracker or forums without first upgrading your compiler
789 to a newer 3.x or 4.x (or whatever is available currently) version.
790 FOO2
791 }
792
793 ################################################################################
794 #                             HELPER FUNCTIONS                          #
795 ################################################################################
796 sub getcache {
797         # Retrieves the .config.cache file, and loads values into the main config hash.
798         open(CACHE, ".config.cache") or return undef;
799         while (<CACHE>) {
800                 chomp;
801                 # Ignore Blank lines, and comments..
802                 next if /^\s*$/;
803                 next if /^\s*#/;
804                 my ($key, $value) = split("=", $_, 2);
805                 $value =~ /^\"(.*)\"$/;
806                 # Do something with data here!
807                 $config{$key} = $1;
808         }
809         close(CONFIG);
810         return "true";
811 }
812
813 sub makecache {
814         # Dump the contents of %config
815         print "Writing \033[1;32mcache file\033[0m for future ./configures ...\n";
816         open(FILEHANDLE, ">.config.cache");
817         foreach $key (keys %config) {
818                 print FILEHANDLE "$key=\"$config{$key}\"\n";
819         }
820         close(FILEHANDLE);
821 }
822
823 sub dir_check {
824         my ($desc, $hash_key) = @_;
825         my $complete = 0;
826         while (!$complete) {
827                 print "In what directory $desc?\n";
828                 print "[\033[1;32m$config{$hash_key}\033[0m] -> ";
829                 chomp($var = <STDIN>);
830                 if ($var eq "") {
831                         $var = $config{$hash_key};
832                 }
833                 if ($var =~ /^\~\/(.+)$/) {
834                         # Convert it to a full path..
835                         $var = resolve_directory($ENV{HOME} . "/" . $1);
836                 }
837                 elsif ((($config{OSNAME} =~ /MINGW32/i) and ($var !~ /^[A-Z]{1}:\\.*/)) and (substr($var,0,1) ne "/"))
838                 {
839                         # Assume relative Path was given.. fill in the rest.
840                         $var = $this . "/$var";
841                 }
842                 
843                 $var = resolve_directory($var); 
844                 if (! -e $var) {
845                         print "$var does not exist. Create it?\n[\033[1;32my\033[0m] ";
846                         chomp($tmp = <STDIN>);
847                         if (($tmp eq "") || ($tmp =~ /^y/i)) {
848                                 # Attempt to Create the Dir..
849                                 
850                                 system("mkdir -p \"$var\" >> /dev/null 2>&1");
851                                 $chk = system("mkdir -p \"$var\" >> /dev/null 2>&1") / 256;
852                                 if ($chk != 0) {
853                                         print "Unable to create directory. ($var)\n\n";
854                                         # Restart Loop..
855                                         next;
856                                 }
857                         } else {
858                                 # They said they don't want to create, and we can't install there.
859                                 print "\n\n";
860                                 next;
861                         }
862                 } else {
863                         if (!is_dir($var)) {
864                                 # Target exists, but is not a directory.
865                                 print "File $var exists, but is not a directory.\n\n";
866                                 next;
867                         }
868                 }
869                 # Either Dir Exists, or was created fine.
870                 $config{$hash_key} = $var;
871                 $complete = 1;
872                 print "\n";
873         }
874 }
875
876 sub getosflags {
877
878         $config{LDLIBS} = "-lstdc++";
879         $config{FLAGS}  = "-fno-strict-aliasing -fPIC -Wall -Woverloaded-virtual $config{OPTIMISATI}";
880         $config{DEVELOPER} = "-fno-strict-aliasing -fPIC -Wall -Woverloaded-virtual -g";
881         $SHARED = "-Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared";
882         $config{MAKEPROG} = "make";
883
884         if ($config{OSNAME} =~ /darwin/i) {
885                 $config{FLAGS}  = "-DDARWIN -frtti -fPIC -Wall -Woverloaded-virtual $config{OPTIMISATI}";
886                 $SHARED = "-bundle -twolevel_namespace -undefined dynamic_lookup";
887                 $config{LDLIBS} = "-ldl -lstdc++";
888         }
889
890         if ($config{OSNAME} =~ /OpenBSD/i) {
891                 $config{MAKEPROG} = "gmake";
892                 chomp($foo = `eg++ -dumpversion | cut -c 1`);
893                 # theyre running the package version of gcc (eg++)... detect it and set up its version numbers.
894                 # if theyre not running this, configure lets the build continue but they probably wont manage to
895                 # compile as this standard version is 2.95.3!
896                 if ($foo ne "") {
897                         $config{CC} = "eg++";
898                         chomp($config{GCCVER}       = `eg++ -dumpversion | cut -c 1`); # we must redo these if we change the compiler path
899                 }
900                 return "OpenBSD";
901         }
902
903         if ($config{OSNAME} =~ /Linux/i) {
904                 $config{LDLIBS} = "-ldl -lstdc++";
905                 $config{FLAGS}  = "-fno-strict-aliasing -fPIC -Wall -Woverloaded-virtual $config{OPTIMISATI}";
906                 $config{FLAGS}  .= " " . $ENV{CXXFLAGS} if exists($ENV{CXXFLAGS});
907                 $config{MAKEPROG} = "make";
908                 if ($config{OSNAME} =~ /CYGWIN/) {
909                         $config{FLAGS}  = "-fno-strict-aliasing -Wall -Woverloaded-virtual $config{OPTIMISATI}";
910                         $config{LDLIBS} = "";
911                         $config{MAKEPROG} = "/usr/bin/make";
912                         $config{MAKEORDER} = "ircd mods";
913                         return "Cygwin";
914                 } elsif ($config{OSNAME} eq "CYG-STATIC") {
915                         $config{FLAGS} = "-fno-strict-aliasing -Wall -Woverloaded-virtual $config{OPTIMISATI}";
916                         $config{LDLIBS} = "";
917                         $config{MAKEPROG} = "/usr/bin/make";
918                         $config{MAKEORDER} = "mods ircd";
919                         $config{STATICLIBS} = "modules/mods.a";
920                         $config{STATIC_LINK} = "yes";
921                         return "Cygwin-Static";
922                 }
923                 $config{FLAGS}  .= " " . $ENV{CXXFLAGS} if exists($ENV{CXXFLAGS});
924         }
925         
926         if ($config{OSNAME} =~ /SunOS/i)
927         {
928                 # solaris/sunos needs these
929                 # socket = bsd sockets api
930                 # nsl = dns stuff
931                 # rt = POSIX realtime extensions
932                 # resolv = inet_aton only (why isnt this in nsl?!)
933                 $config{MAKEPROG} = "gmake";
934                 $config{LDLIBS} = $config{LDLIBS} . " -lsocket -lnsl -lrt -lresolv";
935                 return "Solaris";
936         }
937         
938         if($config{OSNAME} =~ /MINGW32/i)
939         {
940                 # All code is position-independent on windows
941                 $config{FLAGS} =~ s/-fPIC //;
942                 return "MinGW";
943         }
944
945         return $config{OSNAME};
946 }
947
948 sub writefiles {
949         my($writeheader) = @_;
950         # First File.. inspircd_config.h
951         chomp(my $incos = `uname -n -s -r`);
952         chomp($version = `sh src/version.sh`);
953         chomp(my $revision2 = getrevision());
954         if ($writeheader == 1)
955         {
956                 print "Writing \033[1;32minspircd_config.h\033[0m\n";
957                 open(FILEHANDLE, ">include/inspircd_config.h");
958                 my $NL = $config{NICK_LENGT}+1;
959                 my $CL = $config{CHAN_LENGT}+1;
960                 print FILEHANDLE <<EOF;
961 /* Auto generated by configure, do not modify! */
962 #ifndef __CONFIGURATION_AUTO__
963 #define __CONFIGURATION_AUTO__
964
965 #define CONFIG_FILE "$config{CONFIG_DIR}/inspircd.conf"
966 #define MOD_PATH "$config{MODULE_DIR}"
967 #define VERSION "$version"
968 #define REVISION "$revision2"
969 #define MAXCLIENTS $config{MAX_CLIENT}
970 #define MAXCLIENTS_S "$config{MAX_CLIENT}"
971 #define SOMAXCONN_S "$config{_SOMAXCONN}"
972 #define MAX_DESCRIPTORS $config{MAX_DESCRIPTORS}
973 #define NICKMAX $NL
974 #define CHANMAX $CL
975 #define MAXMODES $config{MAXI_MODES}
976 #define IDENTMAX $config{MAX_IDENT}
977 #define MAXQUIT $config{MAX_QUIT}
978 #define MAXTOPIC $config{MAX_TOPIC}
979 #define MAXKICK $config{MAX_KICK}
980 #define MAXGECOS $config{MAX_GECOS}
981 #define MAXAWAY $config{MAX_AWAY}
982 #define OPTIMISATION $config{OPTIMITEMP}
983 #define LIBRARYDIR "$config{LIBRARY_DIR}"
984 #define SYSTEM "$incos"
985 #define MAXBUF 514
986 EOF
987                 if ($config{OSNAME} =~ /SunOS/i) {
988                         print FILEHANDLE "#define IS_SOLARIS\n";
989                 }
990                 if ($config{OSNAME} =~ /CYGWIN/i) {
991                         print FILEHANDLE "#define IS_CYGWIN\n";
992                         print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE        1024\n#endif\n";
993                 }
994                 if ($config{OSNAME} =~ /MINGW32/i) {
995                         print FILEHANDLE "#define IS_MINGW\n";
996                 }
997                 if ($config{OSNAME} =~ /CYG-STATIC/i) {
998                         print FILEHANDLE "#ifndef FD_SETSIZE\n#define FD_SETSIZE    1024\n#endif\n";
999                 }
1000                 if ($config{STATIC_LINK} eq "yes") {
1001                         print FILEHANDLE "#define STATIC_LINK\n";
1002                 }
1003                 if ($config{GCCVER} >= 3) {
1004                         print FILEHANDLE "#define GCC3\n";
1005                 }
1006                 if ($config{HAS_STRLCPY} eq "true") {
1007                         print FILEHANDLE "#define HAS_STRLCPY\n";
1008                 }
1009                 if ($config{HAS_STDINT} eq "true") {
1010                         print FILEHANDLE "#define HAS_STDINT\n";
1011                 }
1012                 if ($config{IPV6} =~ /y/i) {
1013                         print FILEHANDLE "#define IPV6\n";
1014                 }
1015                 if ($config{SUPPORT_IP6LINKS} =~ /y/i) {
1016                         print FILEHANDLE "#define SUPPORT_IP6LINKS\n";
1017                 }
1018                 my $use_hiperf = 0;
1019                 if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
1020                         print FILEHANDLE "#define USE_KQUEUE\n";
1021                         $se = "socketengine_kqueue";
1022                         $use_hiperf = 1;
1023                 }
1024                 if (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
1025                         print FILEHANDLE "#define USE_EPOLL\n";
1026                         $se = "socketengine_epoll";
1027                         $use_hiperf = 1;
1028                 }
1029                 if (($has_ports) && ($config{USE_PORTS} eq "y")) {
1030                         print FILEHANDLE "#define USE_PORTS\n";
1031                         $se = "socketengine_ports";
1032                         $use_hiperf = 1;
1033                 }
1034                 # user didn't choose either epoll or select for their OS.
1035                 # default them to USE_SELECT (ewwy puke puke)
1036                 if (!$use_hiperf) {
1037                         print FILEHANDLE "#define USE_SELECT\n";
1038                         $se = "socketengine_select";
1039                 }
1040                 print FILEHANDLE "\n#endif\n";
1041                 close(FILEHANDLE);
1042         }
1043
1044         if ($writeheader)
1045         {
1046                 open(FILEHANDLE, ">include/inspircd_se_config.h");
1047                 print FILEHANDLE <<EOF;
1048 /* Auto generated by configure, do not modify or commit to svn! */
1049 #ifndef __CONFIGURATION_SOCKETENGINE__
1050 #define __CONFIGURATION_SOCKETENGINE__
1051
1052 #include "$se.h"
1053
1054 #endif
1055 EOF
1056                 close(FILEHANDLE);
1057         }
1058
1059
1060         # Create a Modules List..
1061         my $modules = "";
1062         foreach $i (@modlist)
1063         {
1064                 if ($config{STATIC_LINK} eq "yes") {
1065                         $modules .= "m_".$i.".o ";
1066                 }
1067                 else {
1068                         $modules .= "m_".$i.".so ";
1069                 }
1070         }
1071         chomp($modules);   # Remove Redundant whitespace..
1072
1073         opendir(DIRHANDLE, "src/modules");
1074         foreach $name (sort readdir(DIRHANDLE)) {
1075                 if ($name =~ /^m_(.+?)$/) {
1076                         if (opendir(MDIRHANDLE, "src/modules/$name") != 0) {
1077                                 closedir(MDIRHANDLE);
1078                                 $modules .= "$name.so ";
1079                         }
1080                 }
1081         }
1082         closedir(DIRHANDLE);
1083
1084
1085         # Write all .in files.
1086         my $tmp = "";
1087         my $file = "";
1088         my $exe = "inspircd";
1089
1090         if ($config{OSNAME} =~ /CYGWIN/i) {
1091                 $exe = "inspircd.exe";
1092         }
1093
1094         opendir(DIRHANDLE, $this);
1095
1096         # Do this once here, and cache it in the .*.inc files,
1097         # rather than attempting to read src/version.sh from
1098         # compiled code -- we might not have the source to hand.
1099         # Fix for bug#177 by Brain.
1100
1101         chomp(my $version = `sh ./src/version.sh`);
1102         chomp(my $revision = getrevision());
1103         $version = "$version(r$revision)";
1104
1105         my $LIBEXT = "so";
1106         if ($config{IS_DARWIN} eq "YES")
1107         {
1108                 $LIBEXT = "dylib";
1109         }
1110         # We can actually parse any file starting with . and ending with .inc,
1111         # but right now we only parse .inspircd.inc to form './inspircd'
1112
1113         foreach $name (sort readdir(DIRHANDLE)) {
1114                 if ($name =~ /^\.(.+)\.inc$/) {
1115                         $file = $1;
1116                         # All .name.inc files need parsing!
1117                         $tmp = "";
1118                         open(FILEHANDLE, ".$file.inc");
1119                         while (<FILEHANDLE>) {
1120                                 $tmp .= $_;
1121                         }
1122                         close(FILEHANDLE);
1123
1124                         $tmp =~ s/\@CC\@/$config{CC}/;
1125                         $tmp =~ s/\@MAKEPROG\@/$config{MAKEPROG}/;
1126                         $tmp =~ s/\@FLAGS\@/$config{FLAGS}/;
1127                         $tmp =~ s/\@DEVELOPER\@/$config{DEVELOPER}/;
1128                         $tmp =~ s/\@LDLIBS\@/$config{LDLIBS}/;
1129                         $tmp =~ s/\@BASE_DIR\@/$config{BASE_DIR}/;
1130                         $tmp =~ s/\@CONFIG_DIR\@/$config{CONFIG_DIR}/;
1131                         $tmp =~ s/\@MODULE_DIR\@/$config{MODULE_DIR}/;
1132                         $tmp =~ s/\@BINARY_DIR\@/$config{BINARY_DIR}/;
1133                         $tmp =~ s/\@LIBRARY_DIR\@/$config{LIBRARY_DIR}/;
1134                         $tmp =~ s/\@LIBRARY_EXT\@/$LIBEXT/;
1135                         $tmp =~ s/\@MODULES\@/$modules/;
1136                         $tmp =~ s/\@EXECUTABLE\@/$exe/;
1137                         $tmp =~ s/\@MAKEORDER\@/$config{MAKEORDER}/;
1138                         $tmp =~ s/\@STATICLIBS\@/$config{STATICLIBS}/;
1139                         $tmp =~ s/\@VERSION\@/$version/;
1140
1141                         print "Writing \033[1;32m$file\033[0m\n";
1142                         open(FILEHANDLE, ">$file");
1143                         print FILEHANDLE $tmp;
1144                 }
1145         }
1146         closedir(DIRHANDLE);
1147
1148         # Make inspircd executable!
1149         chmod 0744, 'inspircd';
1150
1151         if ($config{STATIC_LINK} eq "yes") {
1152                 print "Writing static-build \033[1;32msrc/Makefile\033[0m\n";
1153                 write_static_makefile();
1154                 write_static_modules_makefile();
1155         } elsif ($config{OSNAME} =~ /CYGWIN/i) {
1156                 print "Writing cygwin-build \033[1;32msrc/Makefile\033[0m\n";
1157                 write_static_makefile();
1158                 write_dynamic_modules_makefile();
1159         } else {
1160                 print "Writing dynamic-build \033[1;32msrc/Makefile\033[0m\n";
1161                 write_dynamic_makefile();
1162                 write_dynamic_modules_makefile();
1163         }
1164 }
1165
1166 sub write_static_modules_makefile {
1167         # Modules Makefile..
1168         print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
1169         open(FILEHANDLE, ">src/modules/Makefile");
1170
1171         ###
1172         # Module Makefile Header
1173         ###
1174         print FILEHANDLE <<EOF;
1175 # (C) ChatSpike development team
1176 # Makefile by <Craig\@ChatSpike.net>
1177 # Many Thanks to Andrew Church <achurch\@achurch.org>
1178 #    for assisting with making this work right.
1179 #
1180 # Automatically Generated by ./configure to add a modules
1181 # please run ./configure --update
1182
1183 all: \$(MODULES)
1184
1185 EOF
1186         ###
1187         # End Module Makefile Header
1188         ###
1189
1190         # Create a Modules List..
1191         my $modules = "";
1192         my $cmflags = "";
1193         my $liflags = "";
1194
1195         open(MODLIST,">include/modlist.h");
1196
1197         ###
1198         # Include File Header
1199         ###
1200         print MODLIST <<HEADER;
1201 // Generated automatically by configure. DO NOT EDIT!
1202
1203 #ifndef __SYMBOLS__H_CONFIGURED__
1204 #define __SYMBOLS__H_CONFIGURED__
1205
1206 HEADER
1207         ###
1208         # End Include File Header
1209         ###
1210
1211         # Place Module List into Include
1212         foreach $i (@modlist) {
1213                 if ($i !~ /_static$/) {
1214                         print MODLIST "extern \"C\" void * $i\_init (void);\n";
1215                 }
1216         }
1217         print MODLIST "\nstruct {const char *name; initfunc *value; } modsyms[] = {\n";
1218
1219         ###
1220         # Build Module Crap
1221         ###
1222         foreach $i (@modlist)
1223         {
1224                 if ($i !~ /_static$/) {
1225                         $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
1226                         $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
1227                         $deps = getdependencies("src/modules/m_".$i.".cpp");
1228
1229                         #print "file: $i: cmflags=$cmflags; liflags=$liflags; deps=$deps\n";
1230
1231                         ###
1232                         # Write Entry to the Makefile
1233                         ###
1234                         print FILEHANDLE <<EOCHEESE;
1235 m_$i.o: .m_$i\_static.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h $deps
1236         \$(CC) -pipe -I../../include \$(FLAGS) $flags -export-dynamic -c .m_$i\_static.cpp
1237         mv .m_$i\_static.o ../m_$i.o
1238
1239 EOCHEESE
1240                         ###
1241                         # End Write Entry to the MakeFile
1242                         ###
1243                         print "Configuring module [\033[1;32mm_$i.so\033[0m] for static linking... ";
1244                         open(MODULE,"<src/modules/m_".$i.".cpp") or die("Could not open m_".$i.".cpp");
1245                         open(MUNGED,">src/modules/.m_".$i."_static.cpp") or die("Could not create .m_".$i."_static.cpp");
1246                         while (chomp($a = <MODULE>)) { 
1247                                 $a =~ s/init_module/$i\_init/g;
1248                                 print MUNGED "$a\n";
1249                         }
1250                         close(MODULE);
1251                         close(MUNGED);
1252                         print MODLIST <<EOENT;
1253 {"m_$i.so",\&$i\_init},
1254 EOENT
1255                         print "done\n";
1256                 }
1257         }
1258
1259         print MODLIST "{0}};\n\n#endif\n";
1260         close(MODLIST);
1261 }
1262
1263 sub write_dynamic_modules_makefile {
1264         # Modules Makefile..
1265         print "Writing \033[1;32msrc/modules/Makefile\033[0m\n";
1266         open(FILEHANDLE, ">src/modules/Makefile");
1267         my $extra = "";
1268
1269         if ($config{OSNAME} =~ /CYGWIN/i) {
1270                 $extra = "../inspircd.dll.a";
1271         }
1272
1273 ###
1274 # Module Makefile Header
1275 ###
1276         print FILEHANDLE <<EOF;
1277 # (C) ChatSpike development team
1278 # Makefile by <Craig\@ChatSpike.net>
1279 # Many Thanks to Andrew Church <achurch\@achurch.org>
1280 #    for assisting with making this work right.
1281 #
1282 # Automatically Generated by ./configure to add a modules
1283 # please run ./configure -update or ./configure -modupdate
1284
1285 all: \$(MODULES)
1286
1287 EOF
1288         ###
1289         # End Module Makefile Header
1290         ###
1291
1292         # Create a Modules List..
1293         my $modules = "";
1294         my $cmflags = "";
1295         my $liflags = "";
1296         my $crud = "";
1297
1298         foreach $i (@modlist) {
1299                 ###
1300                 # Write Entry to the MakeFile
1301                 ###
1302                 $cmflags = getcompilerflags("src/modules/m_".$i.".cpp");
1303                 $liflags = getlinkerflags("src/modules/m_".$i.".cpp");
1304                 $deps = getdependencies("src/modules/m_".$i.".cpp");
1305         
1306                 #print "file: $i: cmflags=$cmflags; liflags=$liflags; deps=$deps\n";
1307         
1308                 print FILEHANDLE <<EOCHEESE;
1309 m_$i.so: m_$i.cpp ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h ../../include/inspircd_config.h ../../include/inspircd.h ../../include/configreader.h $deps
1310         \$(CC) -pipe -I../../include \$(FLAGS) $cmflags -export-dynamic -c m_$i.cpp
1311 EOCHEESE
1312
1313 if ($config{OSNAME} =~ /darwin/) {
1314                 print FILEHANDLE <<EOCHEESE;
1315         \$(CC) -pipe -twolevel_namespace -undefined dynamic_lookup \$(FLAGS) -bundle $liflags -o m_$i.so m_$i.o $extra
1316
1317 EOCHEESE
1318 } else {
1319                 print FILEHANDLE <<EOCHEESE;
1320         \$(CC) -pipe \$(FLAGS) -shared $liflags -o m_$i.so m_$i.o $extra
1321
1322 EOCHEESE
1323 }
1324                 $crud = $crud . "       install -m \$(INSTMODE) m_$i.so \$(MODPATH)\n";
1325 ###
1326                 # End Write Entry to the MakeFile
1327                 ###
1328         }
1329
1330         opendir(DIRHANDLE, "src/modules");
1331         foreach $name (sort readdir(DIRHANDLE)) {
1332                 if ($name =~ /^m_(.+?)$/) {
1333                         $crapola = "";
1334                         $crap3 = "";
1335                         # A module made of multiple files, in a dir, e.g. src/modules/m_spanningtree/
1336                         if (opendir(MDIRHANDLE, "src/modules/$name") != 0) {
1337                                 print "Composing Makefile rules for directory \033[1;32m$name\033[0m... ";
1338                                 my $i = 0;
1339                                 print FILEHANDLE "$name.so: ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h ../../include/inspircd_config.h ../../include/inspircd.h ../../include/configreader.h"; 
1340                                 foreach $fname (sort readdir(MDIRHANDLE)) {
1341                                         if ($fname =~ /\.cpp$/) {
1342                                                 $cmflags = getcompilerflags("src/modules/$name/$fname");
1343                                                 $liflags = getlinkerflags("src/modules/$name/$fname");
1344                                                 $deps = getdependencies("src/modules/$name/$fname");
1345                                                 $oname = $fname;
1346                                                 $oname =~ s/\.cpp$/.o/g;
1347                                                 print FILEHANDLE " $name/$oname";
1348                                                 $crapola = $crapola .  "$name/$oname: $name/$fname ../../include/modules.h ../../include/users.h ../../include/channels.h ../../include/base.h ../../include/inspircd_config.h ../../include/inspircd.h ../../include/configreader.h $deps\n";
1349                                                 $crapola = $crapola .  "        \$(CC) -pipe -I../../include -I. \$(FLAGS) $cmflags -export-dynamic -o $name/$oname -c $name/$fname\n\n";
1350                                                 $crap3 = $crap3 . " $name/$oname";
1351                                                 $i++;
1352                                         }
1353                                 }
1354                                 print "(\033[1;32m$i files found\033[0m)\n";
1355                                 if ($config{IS_DARWIN} eq "YES") {
1356                                         print FILEHANDLE "\n    \$(CC) -pipe -twolevel_namespace -undefined dynamic_lookup \$(FLAGS) -bundle -o $name.so $crap3\n"; 
1357                                 } else {
1358                                         print FILEHANDLE "\n    \$(CC) -pipe \$(FLAGS) -shared $liflags -o $name.so $crap3\n";
1359                                 }
1360                                 print FILEHANDLE "\n$crapola\n";
1361                                 closedir(MDIRHANDLE);
1362                                 $crud = $crud . "       install -m \$(INSTMODE) $name.so \$(MODPATH)\n";
1363                         }
1364                 }
1365         }
1366         closedir(DIRHANDLE);
1367
1368         print FILEHANDLE "modinst:\n    \@echo \"Installing modules...\"\n" . $crud;
1369 }
1370
1371
1372 sub write_static_makefile {
1373         open(FH,">src/Makefile") or die("Could not write src/Makefile!");
1374         my $i = 0;
1375         my @cmdlist = ();
1376         opendir(DIRHANDLE, "src");
1377         foreach $name (sort readdir(DIRHANDLE)) {
1378                 if ($name =~ /^cmd_(.+)\.cpp$/) {
1379                         $cmdlist[$i++] = $1;
1380                 }
1381         }
1382         closedir(DIRHANDLE);
1383         my $cmdobjs = "";
1384         my $srcobjs = "";
1385         foreach my $cmd (@cmdlist) {
1386                 $cmdobjs = $cmdobjs . "cmd_$cmd.o ";
1387                 $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
1388         }
1389         print FH <<EOM;
1390 # Insp Makefile :p
1391 #
1392 # (C) ChatSpike development team
1393 # Makefile by <Craig\@ChatSpike.net>
1394 # Makefile version 2 (statically linked core) by <brain\@inspircd.org>
1395 #
1396
1397 CC = im a cheezeball
1398
1399 CXXFLAGS = -I../include \${FLAGS}
1400 CPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* //' | grep -v svn)
1401 RELCPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* /modes\\//' | grep -v svn)
1402
1403 EOM
1404
1405 $se = "socketengine_select";
1406 if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
1407         $se = "socketengine_kqueue";
1408 }       
1409 elsif (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
1410         $se = "socketengine_epoll";
1411 }
1412 elsif (($has_ports) && ($config{USE_PORTS} eq "y")) {
1413         $se = "socketengine_ports";
1414 }
1415
1416         ###
1417         # This next section is for cygwin dynamic module builds.
1418         # Basically, what we do, is build the inspircd core as a library
1419         # then the main executable uses that. the library is capable of
1420         # loading / unloading the modules dynamically :)
1421         # Massive thanks to the guys on #cygwin @ irc.freenode.net for helping
1422         # make this work :)
1423         ###
1424
1425         if ($config{OSNAME} =~ /CYGWIN/i) {
1426                 print FH <<EOM;
1427 all: timer.o command_parse.o cull_list.o userprocess.o socketengine.o socket.o hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o configreader.o inspsocket.o $cmdobjs commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o snomasks.o inspircd.exe
1428
1429 inspircd.exe: inspircd.dll.a
1430         \$(CC) -o \$@ \$^
1431
1432 inspircd.dll inspircd.dll.a: inspircd.o channels.o mode.o xline.o inspstring.o dns.o base.o configreader.o inspsocket.o $cmdobjs  commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o timer.o snomasks.o
1433         \$(CC) -shared -Wl,--out-implib=inspircd.dll.a -o inspircd.dll \$^
1434 EOM
1435         } else {
1436                 print FH <<EOM;
1437 all: timer.o command_parse.o cull_list.o userprocess.o socketengine.o socket.o hashcomp.o channels.o mode.o xline.o inspstring.o dns.o base.o configreader.o inspsocket.o $cmdobjs commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o snomasks.o \$(MODULES) inspircd.exe
1438
1439 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
1440         \$(CC) -I../include \$(FLAGS) inspircd.cpp -o inspircd.exe \$(LDLIBS) channels.o mode.o xline.o inspstring.o dns.o base.o inspsocket.o configreader.o $cmdobjs commands.o dynamic.o users.o modules.o wildcard.o helperfuncs.o hashcomp.o socket.o socketengine.o userprocess.o cull_list.o command_parse.o timer.o snomasks.o modes/modeclasses.a \$(MODULES)
1441 EOM
1442         }
1443
1444         print FH <<EOM;
1445
1446 cull_list.o: cull_list.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/users.h ../include/channels.h
1447         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1448
1449 snomasks.o: snomasks.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/channels.h
1450         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c snomasks.cpp
1451
1452 command_parse.o: command_parse.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1453         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1454
1455 userprocess.o: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1456         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1457
1458 socketengine.o: $se.cpp socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/$se.h
1459         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp $se.cpp
1460
1461 hashcomp.o: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1462         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1463
1464 helperfuncs.o: helperfuncs.cpp ../include/base.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1465         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1466
1467 channels.o: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1468         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1469
1470 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 \$(RELCPPFILES) modes/modeclasses.a
1471         \${MAKE} -C "modes" DIRNAME="src/modes" CC="\$(CC)" \$(MAKEARGS)
1472         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1473
1474 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
1475         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1476
1477 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
1478         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1479
1480 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 ../include/timer.h
1481         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1482
1483 base.o: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1484         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1485
1486 configreader.o: configreader.cpp ../include/base.h ../include/configreader.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1487         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c configreader.cpp
1488
1489 commands.o: commands.cpp ../include/base.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h $srcobjs
1490         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp $cmdobjs
1491
1492 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
1493         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1494
1495 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/timer.h
1496         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1497
1498 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 ../include/timer.h
1499         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1500
1501 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
1502         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1503
1504 socket.o: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1505         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1506         
1507 inspsocket.o: inspsocket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1508         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspsocket.cpp
1509
1510 timer.o: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1511         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp
1512
1513 EOM
1514         foreach my $cmd (@cmdlist) {
1515                 print FH <<ITEM;
1516 cmd_$cmd.o: cmd_$cmd.cpp ../include/base.h ../include/modules.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/commands/cmd_$cmd.h
1517         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
1518 ITEM
1519         }
1520         close(FH);
1521 }
1522
1523 sub write_dynamic_makefile {
1524
1525         my $i = 0;
1526         my @cmdlist = ();
1527         opendir(DIRHANDLE, "src");
1528         foreach $name (sort readdir(DIRHANDLE)) {
1529                 if ($name =~ /^cmd_(.+)\.cpp$/) {
1530                         $cmdlist[$i++] = $1;
1531                 }
1532         }
1533         closedir(DIRHANDLE);
1534
1535         my $cmdobjs = "";
1536         my $srcobjs = "";
1537         foreach my $cmd (@cmdlist) {
1538                 $cmdobjs = $cmdobjs . "cmd_$cmd.so ";
1539                 $srcobjs = $srcobjs . "cmd_$cmd.cpp ";
1540         }
1541
1542         $se = "socketengine_select";
1543         if (($has_kqueue) && ($config{USE_KQUEUE} eq "y")) {
1544                 $se = "socketengine_kqueue";
1545         }
1546         elsif (($has_epoll) && ($config{USE_EPOLL} eq "y")) {
1547                 $se = "socketengine_epoll";
1548         }
1549         elsif (($has_ports) && ($config{USE_PORTS} eq "y")) {
1550                 $se = "socketengine_ports";
1551         }
1552
1553         open(FH,">src/Makefile") or die("Could not write src/Makefile");
1554         print FH <<EOM;
1555 # Insp Makefile :p
1556 #
1557 # (C) ChatSpike development team
1558 # Makefile by <Craig\@ChatSpike.net>
1559 # Makefile version 2 (dynamically linked core) by <brain\@inspircd.org>
1560 #
1561
1562 CC = im a cheezeball
1563
1564 CXXFLAGS = -I../include \${FLAGS}
1565 CPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* //' | grep -v svn)
1566 RELCPPFILES = \$(shell /bin/ls -l modes/ | grep '\\.cpp' | sed 's/^.* /modes\\//' | grep -v svn)
1567
1568 EOM
1569
1570 if ($config{IS_DARWIN} eq "YES") {
1571         print FH <<EOM;
1572 all: libIRCDtimer.dylib libIRCDcull_list.dylib libIRCDuserprocess.dylib libIRCDsocketengine.dylib libIRCDsocket.dylib libIRCDhash.dylib libIRCDchannels.dylib libIRCDmode.dylib libIRCDxline.dylib libIRCDstring.dylib libIRCDasyncdns.dylib libIRCDbase.dylib libIRCDconfigreader.dylib libIRCDinspsocket.dylib libIRCDcommands.dylib libIRCDdynamic.dylib libIRCDusers.dylib libIRCDmodules.dylib libIRCDwildcard.dylib libIRCDhelper.dylib libIRCDcommand_parse.dylib libIRCDsnomasks.dylib inspircd
1573
1574 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 $cmdobjs libIRCDtimer.dylib libIRCDcull_list.dylib libIRCDuserprocess.dylib libIRCDsocketengine.dylib libIRCDsocket.dylib libIRCDhash.dylib libIRCDchannels.dylib libIRCDmode.dylib libIRCDxline.dylib libIRCDstring.dylib libIRCDasyncdns.dylib libIRCDbase.dylib libIRCDconfigreader.dylib libIRCDinspsocket.dylib libIRCDsnomasks.dylib libIRCDcommands.dylib libIRCDdynamic.dylib libIRCDusers.dylib libIRCDmodules.dylib libIRCDwildcard.dylib libIRCDhelper.dylib libIRCDcommand_parse.dylib
1575         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspircd.cpp
1576         \$(CC) -pipe -dynamic -bind_at_load -L. -o inspircd \$(LDLIBS) inspircd.o libIRCDchannels.dylib libIRCDmode.dylib libIRCDxline.dylib libIRCDstring.dylib libIRCDasyncdns.dylib libIRCDbase.dylib libIRCDconfigreader.dylib libIRCDinspsocket.dylib libIRCDcommands.dylib libIRCDdynamic.dylib libIRCDusers.dylib libIRCDmodules.dylib libIRCDwildcard.dylib libIRCDhelper.dylib libIRCDhash.dylib libIRCDsocket.dylib libIRCDsocketengine.dylib libIRCDuserprocess.dylib libIRCDcull_list.dylib libIRCDcommand_parse.dylib libIRCDtimer.dylib libIRCDsnomasks.dylib
1577
1578 libIRCDsocketengine.dylib: $se.cpp socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/$se.h
1579         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp
1580         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c $se.cpp
1581         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDsocketengine.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDsocketengine.dylib socketengine.o $se.o
1582
1583 libIRCDsnomasks.dylib: snomasks.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/channels.h
1584         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c snomasks.cpp
1585         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDsnomasks.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDsnomasks.dylib snomasks.o
1586
1587 libIRCDcommand_parse.dylib: command_parse.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1588         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1589         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDcommand_parse.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDcommand_parse.dylib command_parse.o
1590
1591 libIRCDcull_list.dylib: cull_list.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/users.h ../include/channels.h
1592         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1593         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDcull_list.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDcull_list.dylib cull_list.o
1594
1595 libIRCDuserprocess.dylib: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1596         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1597         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDuserprocess.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDuserprocess.dylib userprocess.o
1598
1599 libIRCDhash.dylib: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1600         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1601         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDhash.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDhash.dylib hashcomp.o
1602
1603 libIRCDhelper.dylib: helperfuncs.cpp ../include/base.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1604         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1605         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDhelper.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDhelper.dylib helperfuncs.o
1606
1607 libIRCDchannels.dylib: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1608         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1609         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDchannels.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDchannels.dylib channels.o
1610
1611 libIRCDmode.dylib: mode.cpp ../include/base.h ../include/mode.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h \$(RELCPPFILES)
1612         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1613         \${MAKE} -C "modes" DIRNAME="src/modes" CC="\$(CC)" \$(MAKEARGS) CPPFILES="\$(CPPFILES)"
1614         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDmode.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDmode.dylib mode.o modes/modeclasses.a
1615
1616 libIRCDxline.dylib: xline.cpp ../include/base.h ../include/xline.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1617         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1618         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDxline.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDxline.dylib xline.o
1619
1620 libIRCDstring.dylib: inspstring.cpp ../include/base.h ../include/inspstring.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1621         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1622         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDstring.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDstring.dylib inspstring.o
1623
1624 libIRCDasyncdns.dylib: dns.cpp ../include/base.h ../include/dns.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1625         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1626         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDasyncdns.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDasyncdns.dylib dns.o
1627
1628 libIRCDbase.dylib: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1629         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1630         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDbase.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDbase.dylib base.o
1631
1632 libIRCDconfigreader.dylib: configreader.cpp ../include/base.h ../include/configreader.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1633         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c configreader.cpp
1634         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDconfigreader.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDconfigreader.dylib configreader.o
1635
1636 libIRCDcommands.dylib: commands.cpp ../include/base.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1637         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
1638         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDcommands.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDcommands.dylib commands.o
1639
1640 libIRCDdynamic.dylib: dynamic.cpp ../include/base.h ../include/dynamic.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1641         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1642         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDdynamic.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDdynamic.dylib dynamic.o
1643
1644 libIRCDusers.dylib: 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/timer.h
1645         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1646         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDusers.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDusers.dylib users.o
1647
1648 libIRCDmodules.dylib: modules.cpp ../include/base.h ../include/modules.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1649         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1650         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDmodules.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDmodules.dylib modules.o
1651
1652 libIRCDwildcard.dylib: wildcard.cpp ../include/base.h ../include/wildcard.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1653         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1654         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDwildcard.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDwildcard.dylib wildcard.o
1655
1656 libIRCDsocket.dylib: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1657         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1658         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDsocket.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDsocket.dylib socket.o
1659
1660 libIRCDinspsocket.dylib: inspsocket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1661         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspsocket.cpp
1662         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDinspsocket.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDinspsocket.dylib inspsocket.o
1663
1664 libIRCDtimer.dylib: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1665         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp
1666         \$(CC) -pipe -install_name $config{LIBRARY_DIR}/libIRCDtimer.dylib -dynamiclib -twolevel_namespace -undefined dynamic_lookup -o libIRCDtimer.dylib timer.o
1667
1668 EOM
1669
1670 } else {
1671
1672         print FH <<EOM;
1673 all: libIRCDtimer.so libIRCDcull_list.so libIRCDuserprocess.so libIRCDsocketengine.so libIRCDsocket.so libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so $cmdobjs libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so libIRCDsnomasks.so inspircd
1674
1675 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 libIRCDtimer.so libIRCDcull_list.so libIRCDuserprocess.so libIRCDsocketengine.so libIRCDsocket.so libIRCDhash.so libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so $cmdobjs libIRCDsnomasks.so libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDcommand_parse.so
1676         \$(CC) -pipe -I../include $extra -Wl,--rpath -Wl,$config{LIBRARY_DIR} \$(FLAGS) -rdynamic -L. inspircd.cpp -o inspircd \$(LDLIBS) libIRCDchannels.so libIRCDmode.so libIRCDxline.so libIRCDstring.so libIRCDasyncdns.so libIRCDbase.so libIRCDconfigreader.so libIRCDinspsocket.so libIRCDcommands.so libIRCDdynamic.so libIRCDusers.so libIRCDmodules.so libIRCDwildcard.so libIRCDhelper.so libIRCDhash.so libIRCDsocket.so libIRCDsocketengine.so libIRCDuserprocess.so libIRCDcull_list.so libIRCDcommand_parse.so libIRCDtimer.so libIRCDsnomasks.so
1677
1678 libIRCDsocketengine.so: $se.cpp socketengine.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/$se.h
1679         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socketengine.cpp $se.cpp
1680         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocketengine.so socketengine.o $se.o
1681
1682 libIRCDsnomasks.so: snomasks.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/channels.h
1683         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c snomasks.cpp
1684         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsnomasks.so snomasks.o
1685
1686 libIRCDcommand_parse.so: command_parse.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1687         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c command_parse.cpp
1688         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommand_parse.so command_parse.o
1689
1690 libIRCDcull_list.so: cull_list.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h ../include/users.h ../include/channels.h
1691         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cull_list.cpp
1692         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcull_list.so cull_list.o
1693
1694 libIRCDuserprocess.so: userprocess.cpp ../include/base.h ../include/hashcomp.h ../include/globals.h ../include/inspircd_config.h
1695         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c userprocess.cpp
1696         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDuserprocess.so userprocess.o
1697
1698 libIRCDhash.so: hashcomp.cpp ../include/base.h ../include/hashcomp.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1699         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c hashcomp.cpp
1700         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhash.so hashcomp.o
1701
1702 libIRCDhelper.so: helperfuncs.cpp ../include/base.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1703         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c helperfuncs.cpp
1704         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDhelper.so helperfuncs.o
1705
1706 libIRCDchannels.so: channels.cpp ../include/base.h ../include/channels.h ../include/inspircd.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1707         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c channels.cpp
1708         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDchannels.so channels.o
1709
1710 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 \$(RELCPPFILES)
1711         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c mode.cpp
1712         \${MAKE} -C "modes" DIRNAME="src/modes" CC="\$(CC)" \$(MAKEARGS) CPPFILES="\$(CPPFILES)"
1713         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmode.so mode.o modes/modeclasses.a
1714
1715 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 ../include/timer.h
1716         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c xline.cpp
1717         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDxline.so xline.o
1718
1719 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
1720         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspstring.cpp
1721         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDstring.so inspstring.o
1722
1723 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 ../include/timer.h
1724         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dns.cpp
1725         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDasyncdns.so dns.o
1726
1727 libIRCDbase.so: base.cpp ../include/base.h ../include/globals.h ../include/inspircd_config.h
1728         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c base.cpp
1729         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDbase.so base.o
1730
1731 libIRCDconfigreader.so: configreader.cpp ../include/base.h ../include/configreader.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h
1732         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c configreader.cpp
1733         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDconfigreader.so configreader.o
1734
1735 libIRCDcommands.so: commands.cpp ../include/base.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1736         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c commands.cpp
1737         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDcommands.so commands.o
1738
1739 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
1740         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c dynamic.cpp
1741         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDdynamic.so dynamic.o
1742
1743 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/timer.h
1744         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c users.cpp
1745         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDusers.so users.o
1746
1747 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 ../include/timer.h
1748         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c modules.cpp
1749         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDmodules.so modules.o
1750
1751 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
1752         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c wildcard.cpp
1753         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDwildcard.so wildcard.o
1754
1755 libIRCDsocket.so: socket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h
1756         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c socket.cpp
1757         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDsocket.so socket.o
1758
1759 libIRCDinspsocket.so: inspsocket.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1760         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c inspsocket.cpp
1761         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDinspsocket.so inspsocket.o
1762
1763 libIRCDtimer.so: timer.cpp ../include/base.h ../include/inspircd.h ../include/globals.h ../include/inspircd_config.h ../include/timer.h
1764         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c timer.cpp
1765         \$(CC) -pipe -Wl,--rpath -Wl,$config{LIBRARY_DIR} -shared -o libIRCDtimer.so timer.o
1766
1767 EOM
1768 }
1769         foreach my $cmd (@cmdlist) {
1770                 print FH <<ITEM;
1771 cmd_$cmd.so: cmd_$cmd.cpp ../include/base.h ../include/modules.h ../include/inspircd.h ../include/channels.h ../include/users.h ../include/globals.h ../include/inspircd_config.h ../include/commands/cmd_$cmd.h
1772         \$(CC) -pipe -I../include \$(FLAGS) -export-dynamic -c cmd_$cmd.cpp
1773         \$(CC) -pipe $SHARED -o cmd_$cmd.so cmd_$cmd.o
1774
1775 ITEM
1776         }
1777         close(FH);
1778 }
1779