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