]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - win/configure.cpp
Fix crash on matching j:@#chan ban when the user is not in the channel
[user/henk/code/inspircd.git] / win / configure.cpp
1 /*         +------------------------------------+
2  *         | Inspire Internet Relay Chat Daemon |
3  *         +------------------------------------+
4  *
5  *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
6  * See: http://wiki.inspircd.org/Credits
7  *
8  * This program is free but copyrighted software; see
9  *                      the file COPYING for details.
10  *
11  * ---------------------------------------------------
12  */
13
14 #define _CRT_SECURE_NO_DEPRECATE
15
16 #define CONFIGURE_BUILD
17 #define WIN32_LEAN_AND_MEAN
18 #include <windows.h>
19 #include <stdio.h>
20 #include <process.h>
21 #include <string>
22 #include <time.h>
23 #include "inspircd_win32wrapper.h"
24 #include "colours.h"
25
26 using namespace std;
27 void Run();
28 void Banner();
29 void WriteCompileModules();
30 void WriteCompileCommands();
31 void Rebase();
32 void CopyExtras();
33
34 /* detects if we are running windows xp or higher (5.1) */
35 bool iswinxp()
36 {
37         OSVERSIONINFO vi;
38         vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
39         GetVersionEx(&vi);
40         if(vi.dwMajorVersion >= 5)
41                 return true;
42         
43         return false;
44 }
45
46 int get_int_option(const char * text, int def)
47 {
48         static char buffer[500];
49         int ret;
50         printf_c("%s\n[\033[1;32m%u\033[0m] -> ", text, def);
51         fgets(buffer, 500, stdin);
52         if(sscanf(buffer, "%u", &ret) != 1)
53                 ret = def;
54
55         printf("\n");
56         return ret;
57 }
58
59 bool get_bool_option(const char * text, bool def)
60 {
61         static char buffer[500];
62         char ret[100];
63         printf_c("%s [\033[1;32m%c\033[0m] -> ", text, def ? 'y' : 'n');
64         fgets(buffer, 500, stdin);
65         if(sscanf(buffer, "%s", ret) != 1)
66                 strcpy(ret, def ? "y" : "n");
67
68         printf("\n");
69         return !strncmp(ret, "y", 1);
70 }
71
72 void get_string_option(const char * text, char * def, char * buf)
73 {
74         static char buffer[500];
75         if (*def)
76                 printf_c("%s\n[\033[1;32m%s\033[0m] -> ", text, def);
77         else
78                 printf_c("%s\n[] -> ", text);
79         fgets(buffer, 500, stdin);
80         if(sscanf(buffer, "%s", buf) != 1)
81                 strcpy(buf, def);
82
83         printf("\n");
84 }
85
86 // escapes a string for use in a c++ file
87 bool escape_string(char * str, size_t size)
88 {
89         size_t len = strlen(str);
90         char * d_str = (char*)malloc(len * 2);
91         
92         size_t i = 0;
93         size_t j = 0;
94
95         for(; i < len; ++i)
96         {
97                 if(str[i] == '\\')
98                 {
99                         d_str[j++] = '\\';
100                         d_str[j++] = '\\';
101                 }
102                 else
103                 {
104                         d_str[j++] = str[i];
105                 }
106         }
107
108         d_str[j++] = 0;
109
110         if(j > size)
111         {
112                 free(d_str);
113                 return false;
114         }
115
116         strcpy(str, d_str);
117         free(d_str);
118         return true;
119 }
120
121 /* gets the svn revision */
122 int get_svn_revision(char * buffer, size_t len)
123 {
124         /* again.. I am lazy :p cbf to pipe output of svn info to us, so i'll just read the file */
125         /*
126         8
127
128         dir
129         7033
130         */
131         char buf[1000];
132         int rev = 0;
133         
134         FILE * f = fopen("..\\.svn\\entries", "r");
135         if (f)
136         {
137                 for (int q = 0; q < 4; ++q)
138                         fgets(buf, 1000, f);
139
140                 rev = atoi(buf);
141                 sprintf(buffer, "%u", rev);
142                 fclose(f);
143         }
144         
145         return rev;
146 }
147
148 void get_machine_info(char * buffer, size_t len)
149 {
150         char buf[500];
151         char buf2[500];
152
153         DWORD dwSize = sizeof(buf);
154         if (!GetComputerNameEx((COMPUTER_NAME_FORMAT)ComputerNameDnsFullyQualified, buf, &dwSize))
155                 sprintf(buf, "%s", "unknown");
156
157         FILE * f = fopen("ver.txt.tmp", "r");
158         if (f)
159         {
160                 while (fgets(buf2, 500, f)) { }
161                 fclose(f);
162                 unlink("ver.txt.tmp");
163         }
164         else
165                 sprintf(buf2, "%s", "unknown");
166
167         sprintf(buffer, "%s ", buf);
168         //strip newlines
169         char* b = buffer + strlen(buf)+1;
170         char *b2 = buf2;
171         while (*b2)
172         {
173                 if (*b2 != 10 && *b2 != 13)
174                 {
175                         *b = *b2;
176                         b++;
177                 }
178                 *b2++;
179         }
180         *b = 0;
181 }
182
183 int __stdcall WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd )
184 {
185         if (!strcmp(lpCmdLine, "/rebase"))
186         {
187                 Rebase();
188                 return 0;
189         }
190
191         FILE * j = fopen("inspircd_config.h", "r");
192         if (j)
193         {
194                 if (MessageBox(0, "inspircd_config.h already exists. Remove it and build from clean?", "Configure program", MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2) != IDYES)
195                 {
196                         fclose(j);
197                         exit(0);
198                 }
199         }
200
201         // call before we hook console handles
202         system("ver > ver.txt.tmp");
203
204         AllocConsole();
205
206         // pipe standard handles to this console
207         freopen("CONIN$", "r", stdin);
208         freopen("CONOUT$", "w", stdout);
209         freopen("CONOUT$", "w", stderr);
210
211         Banner();
212         Run();
213         FreeConsole();
214         return 0;
215 }
216
217 void Banner()
218 {
219         printf_c("\nWelcome to the \033[1mInspIRCd\033[0m Configuration program! (\033[1minteractive mode\033[0m)\n"
220                          "\033[1mPackage maintainers: Type ./configure --help for non-interactive help\033[0m\n\n");
221         printf_c("*** If you are unsure of any of these values, leave it blank for      ***\n"
222                          "*** standard settings that will work, and your server will run          ***\n"
223                          "*** using them. Please consult your IRC network admin if in doubt.  ***\n\n"
224                          "Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter\n"
225                          "a new value. Please note: You will \033[1mHAVE\033[0m to read the docs\n"
226                          "dir, otherwise you won't have a config file!\n\n");
227
228 }
229
230 void Run()
231 {
232         bool use_openssl = false;
233         bool ipv6 = true;
234         char mod_path[MAX_PATH];
235         char config_file[MAX_PATH];
236         char library_dir[MAX_PATH];
237         char base_path[MAX_PATH];
238         char bin_dir[MAX_PATH];
239         char revision_text[MAX_PATH];
240         char openssl_inc_path[MAX_PATH];
241         char openssl_lib_path[MAX_PATH];
242         int revision = get_svn_revision(revision_text, MAX_PATH);
243         char version[514];
244         char machine_text[MAX_PATH];
245         get_machine_info(machine_text, MAX_PATH);
246
247         // grab version
248         FILE * fI = fopen("..\\src\\version.sh", "r");
249         if(fI)
250         {
251                 fgets(version, 514, fI);
252                 fgets(version, 514, fI);
253                 char * p2 = version;
254                 while(*p2 != '\"')
255                         ++p2;
256                 ++p2;
257                 strcpy(version, p2);
258                 p2 = version;
259                 while(*p2 != '\"')
260                         ++p2;
261                 *p2 = 0;
262                 fclose(fI);
263         }
264         else
265                 strcpy(version, "InspIRCD-Unknown");
266 #ifdef WIN64
267         printf_c("Your operating system is: \033[1;32mwindows_x64 \033[0m\n");
268 #else
269         printf_c("Your operating system is: \033[1;32mwindows_x32 \033[0m\n");
270 #endif
271         printf_c("InspIRCd revision ID: \033[1;32m%s \033[0m\n\n", revision ? revision_text : "(Non-SVN build)");
272
273         ipv6 = get_bool_option("Do you want to enable IPv6?", false);
274
275         printf_c("\033[1mAll paths are relative to the binary directory.\033[0m\n");
276         get_string_option("In what directory do you wish to install the InspIRCd base?", "..", base_path);
277         get_string_option("In what directory are the configuration files?", "../conf", config_file);
278         get_string_option("In what directory are the modules to be compiled to?", "../modules", mod_path);
279         get_string_option("In what directory is the IRCd binary to be placed?", ".", bin_dir);
280         get_string_option("In what directory are the IRCd libraries to be placed?", "../lib", library_dir);
281
282         // NOTE: this may seem hackish (generating a batch build script), but it assures the user knows
283         // what they're doing, and we don't have to mess with copying files and changing around modules.mak
284         // for the extra libraries. --fez
285         // in case it exists, remove old m_ssl_openssl.cpp
286         remove("..\\src\\modules\\m_ssl_openssl.cpp");
287         printf_c("You can compile InspIRCd modules that add OpenSSL or GnuTLS support for SSL functionality.\n"
288                 "To do so you will need the appropriate link libraries and header files on your system.\n");
289         use_openssl = get_bool_option("Would you like to compile the IRCd with OpenSSL support?", false);
290         if (use_openssl)
291         {
292                 get_string_option("Please enter the full path to your OpenSSL include directory\n"
293                         "(e.g., C:\\openssl\\include, but NOT the openssl subdirectory under include\\)\n"
294                         "(also, path should not end in '\\')",
295                         "C:\\openssl\\include", openssl_inc_path);
296
297                 // NOTE: if inspircd ever changes so that it compiles with /MT instead of the /MTd switch, then
298                 // the dependency on libeay32mtd.lib and ssleay32mtd.lib will change to just libeay32.lib and
299                 // ssleay32.lib. --fez
300
301                 get_string_option("Please enter the full path to your OpenSSL library directory\n"
302                         "(e.g., C:\\openssl\\lib, which should contain libeay32mtd.lib and ssleay32mtd.lib)",
303                         "C:\\openssl\\lib", openssl_lib_path);
304
305                 // write batch file
306                 FILE *fp = fopen("compile_openssl.bat", "w");
307                 fprintf(fp, "@echo off\n");
308                 fprintf(fp, "echo This batch script compiles m_ssl_openssl for InspIRCd.\n");
309                 fprintf(fp, "echo NOTE: this batch file should be invoked from the Visual Studio Command Prompt (vsvars32.bat)\n");
310                 fprintf(fp, "set OPENSSL_INC_PATH=\"%s\"\n", openssl_inc_path);
311                 fprintf(fp, "set OPENSSL_LIB_PATH=\"%s\"\n", openssl_lib_path);
312                 fprintf(fp, "set COMPILE=cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /MD /Fo\"Release/\" /Fd\"Release/vc90.pdb\" /W2 /Wp64 /Zi /TP /I %%OPENSSL_INC_PATH%% m_ssl_openssl.cpp ..\\..\\win\\inspircd_memory_functions.cpp %%OPENSSL_INC_PATH%%\\openssl\\applink.c /link /LIBPATH:%%OPENSSL_LIB_PATH%% ..\\..\\bin\\release\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\release\\modules\\m_ssl_openssl.so\" /PDB:\"..\\..\\bin\\release\\modules\\m_ssl_openssl.pdb\" /IMPLIB:\"..\\..\\bin\\release\\modules\\m_ssl_openssl.lib\"\n");
313                 fprintf(fp, "cd ..\\src\\modules\n");
314                 fprintf(fp, "copy extra\\m_ssl_openssl.cpp .\n");
315                 fprintf(fp, "echo \t%%COMPILE%%\n");
316                 fprintf(fp, "%%COMPILE%%\n");
317                 fprintf(fp, "cd ..\\..\\win\n");
318                 fprintf(fp, "echo done... now check for errors.\n");
319                 fclose(fp);
320
321                 printf_c("\033[1;32m!!!NOTICE!!! The file 'compile_openssl.bat' has been written to your 'win' directory.  Launch it\n"
322                         "!!! from the Visual Studio Command Prompt !!! to compile the m_ssl_openssl module.\n"
323                         "Wait until after compiling inspircd to run it.\n"
324                         "Also, ssleay32.dll and libeay32.dll will be required for the IRCd to run.\033[0m\n");
325         }
326
327         printf_c("\n\033[1;32mPre-build configuration is complete!\n\n");       sc(TNORMAL);
328
329         CopyExtras();
330
331         // dump all the options back out
332         printf_c("\033[0mBase install path:\033[1;32m        %s\n", base_path);
333         printf_c("\033[0mConfig path:\033[1;32m              %s\n", config_file);
334         printf_c("\033[0mModule path:\033[1;32m              %s\n", mod_path);
335         printf_c("\033[0mLibrary path:\033[1;32m             %s\n", library_dir);
336         printf_c("\033[0mSocket Engine:\033[1;32m            %s\n", "select");
337
338         printf("\n"); sc(TNORMAL);
339         if(get_bool_option("Are these settings correct?", true) == false)
340         {
341                 Run();
342                 return;
343         }
344         printf("\n");
345
346         // escape the pathes
347         escape_string(config_file, MAX_PATH);
348         escape_string(mod_path, MAX_PATH);
349         escape_string(library_dir, MAX_PATH);
350
351         printf("\nWriting inspircd_config.h...");
352         FILE * f = fopen("inspircd_config.h", "w");
353         fprintf(f, "/* Auto generated by configure, do not modify! */\n");
354         fprintf(f, "#ifndef __CONFIGURATION_AUTO__\n");
355         fprintf(f, "#define __CONFIGURATION_AUTO__\n\n");
356
357         fprintf(f, "#define CONFIG_FILE \"%s/inspircd.conf\"\n", config_file);
358         fprintf(f, "#define MOD_PATH \"%s\"\n", mod_path);
359         fprintf(f, "#define SOMAXCONN_S \"128\"\n");
360         fprintf(f, "#define LIBRARYDIR \"%s\"\n", library_dir);
361         fprintf(f, "#define MAXBUF 514\n");
362
363         fprintf(f, "\n#include \"inspircd_win32wrapper.h\"");
364         fprintf(f, "\n#include \"inspircd_namedpipe.h\"");
365         fprintf(f, "\n#include \"threadengines/threadengine_win32.h\"\n\n");
366         fprintf(f, "#endif\n\n");
367         fclose(f);
368
369         sc(TGREEN); printf(" done\n"); sc(TNORMAL);
370         printf("Writing inspircd_se_config.h...");
371
372         f = fopen("inspircd_se_config.h", "w");
373         fprintf(f, "/* Auto generated by configure, do not modify or commit to svn! */\n");
374         fprintf(f, "#ifndef __CONFIGURATION_SOCKETENGINE__\n");
375         fprintf(f, "#define __CONFIGURATION_SOCKETENGINE__\n\n");
376         fprintf(f, "#include \"socketengines/socketengine_%s.h\"\n\n", "select");
377         fprintf(f, "#endif\n\n");
378         fclose(f);
379
380         sc(TGREEN); printf(" done\n"); sc(TNORMAL);
381         printf("Writing inspircd_version.h...");
382         f = fopen("inspircd_version.h", "w");
383         fprintf(f, "#define VERSION \"%s\"\n", version);
384         fprintf(f, "#define REVISION \"%d\"\n", revision);
385         fprintf(f, "#define SYSTEM \"%s\"\n", machine_text);
386         fclose(f);
387
388         sc(TGREEN); printf(" done\n"); sc(TNORMAL);
389         printf("Writing command and module compilation scripts...");
390         WriteCompileCommands();
391         WriteCompileModules();
392         sc(TGREEN); printf(" done\n"); sc(TNORMAL);
393
394         printf("\nconfigure is done.. exiting!\n");
395 }
396
397 /* Keeps files from modules/extra up to date if theyre copied into modules/ */
398 void CopyExtras()
399 {
400         char dest[65535];
401         char src[65535];
402
403         printf("\nUpdating extra modules in src/modules...\n");
404
405         WIN32_FIND_DATA fd;
406         HANDLE fh = FindFirstFile("..\\src\\modules\\extra\\*.*", &fd);
407
408         if(fh == INVALID_HANDLE_VALUE)
409                 return;
410
411         do
412         {
413                 strcpy(dest, "..\\src\\modules\\");
414                 strcat(dest, fd.cFileName);
415                 strcpy(src, "..\\src\\modules\\extra\\");
416                 strcat(src, fd.cFileName);
417                 FILE* x = fopen(dest, "r");
418                 if (x)
419                 {
420                         fclose(x);
421                         CopyFile(src, dest, false);
422                         sc(TGREEN); printf("    %s", fd.cFileName); sc(TNORMAL);
423                         printf("...\n");
424                 }
425         }
426         while (FindNextFile(fh, &fd));
427
428         FindClose(fh);
429
430         printf("\n\n");
431 }
432
433
434 void Rebase()
435 {
436         char dest[65535];
437         char command[65535];
438
439         *dest = 0;
440
441         WIN32_FIND_DATA fd;
442 #ifdef _DEBUG
443         HANDLE fh = FindFirstFile("..\\bin\\debug\\lib\\*.so", &fd);
444 #else
445         HANDLE fh = FindFirstFile("..\\bin\\release\\lib\\*.so", &fd);
446 #endif
447         if(fh == INVALID_HANDLE_VALUE)
448                 return;
449
450         do
451         {
452 #ifdef _DEBUG
453                 strcat(dest, " ..\\bin\\debug\\lib\\");
454 #else
455                 strcat(dest, " ..\\bin\\release\\lib\\");
456 #endif
457                 strcat(dest, fd.cFileName);
458         }
459         while (FindNextFile(fh, &fd));
460
461         FindClose(fh);
462
463         sprintf(command, "rebase.exe -v -b 10000000 -c baseaddr_commands.txt %s", dest);
464         printf("%s\n", command);
465         system(command);
466
467 #ifdef _DEBUG
468         fh = FindFirstFile("..\\bin\\debug\\modules\\*.so", &fd);
469 #else
470         fh = FindFirstFile("..\\bin\\release\\modules\\*.so", &fd);
471 #endif
472         if(fh == INVALID_HANDLE_VALUE)
473                 return;
474
475         *dest = 0;
476
477         do
478         {
479 #ifdef _DEBUG
480                 strcat(dest, " ..\\bin\\debug\\modules\\");
481 #else
482                 strcat(dest, " ..\\bin\\release\\modules\\");
483 #endif
484                 strcat(dest, fd.cFileName);
485         }
486         while (FindNextFile(fh, &fd));
487
488         sprintf(command, "rebase.exe -v -b 11000000 -c baseaddr_modules.txt %s", dest);
489         printf("%s\n", command);
490         system(command);
491
492         FindClose(fh);
493
494 }
495
496 void WriteCompileCommands()
497 {
498         char commands[300][100];
499         int command_count = 0;
500         printf("\n  Finding Command Sources...\n");
501         WIN32_FIND_DATA fd;
502         HANDLE fh = FindFirstFile("..\\src\\commands\\cmd_*.cpp", &fd);
503         if(fh == INVALID_HANDLE_VALUE)
504                 printf_c("\033[1;32m  No command sources could be found! This \033[1m*could*\033[1;32m be a bad thing.. :P\033[0m");
505         else
506         {
507                 sc(TGREEN);
508                 do 
509                 {
510                         strcpy(commands[command_count], fd.cFileName);
511                         commands[command_count][strlen(fd.cFileName) - 4] = 0;
512                         printf("        %s\n", commands[command_count]);
513                         ++command_count;
514                 } while(FindNextFile(fh, &fd));
515                 sc(TNORMAL);
516         }
517         
518         // Write our spiffy new makefile :D
519         // I am such a lazy fucker :P
520         FILE * f = fopen("..\\src\\commands\\commands.mak", "w");
521
522         time_t t = time(NULL);
523         fprintf(f, "# Generated at %s\n", ctime(&t));
524         fprintf(f, "all: makedir ");
525
526         // dump modules.. first time :)
527         for(int i = 0; i < command_count; ++i)
528                 fprintf(f, "%s.so ", commands[i]);
529
530         fprintf(f, "\n.cpp.obj:\n");
531 #ifdef WIN64
532         // /MACHINE:X64
533         #ifdef _DEBUG
534                 fprintf(f, "  cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/commands\" /I \"../../win\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /RTC1 /MDd /Fo\"Debug/\" /Fd\"Debug/vc90.pdb\" /W2 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\debug_x64\\bin\\inspircd.lib /OUT:\"..\\..\\bin\\debug_x64\\lib\\$*.so\" /PDB:\"..\\..\\bin\\debug_x64\\lib\\$*.pdb\" /MACHINE:X64 /IMPLIB:\"..\\..\\bin\\debug_x64\\lib\\$*.lib\"\n\n");
535                 CreateDirectory("..\\src\\debug", NULL);
536                 CreateDirectory("..\\bin\\debug\\bin", NULL);
537                 CreateDirectory("..\\bin\\debug\\lib", NULL);
538                 CreateDirectory("..\\bin\\debug\\modules", NULL);
539         #else
540                 fprintf(f, "  cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/commands\" /I \"../../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /GL /MD /Fo\"Release/\" /Fd\"Release/vc90.pdb\" /W2 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\release_x64\\bin\\inspircd.lib /OUT:\"..\\..\\bin\\release_x64\\lib\\$*.so\" /PDB:\"..\\..\\bin\\release_x64\\lib\\$*.pdb\" /MACHINE:X64 /IMPLIB:\"..\\..\\bin\\release_x64\\lib\\$*.lib\"\n\n");
541                 CreateDirectory("..\\src\\release", NULL);
542                 CreateDirectory("..\\bin\\release\\bin", NULL);
543                 CreateDirectory("..\\bin\\release\\lib", NULL);
544                 CreateDirectory("..\\bin\\release\\modules", NULL);
545         #endif
546 #else
547         #ifdef _DEBUG
548                 fprintf(f, "  cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/commands\" /I \"../../win\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /RTC1 /MDd /Fo\"Debug/\" /Fd\"Debug/vc90.pdb\" /W2 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\debug\\bin\\inspircd.lib /OUT:\"..\\..\\bin\\debug\\lib\\$*.so\" /PDB:\"..\\..\\bin\\debug\\lib\\$*.pdb\" /IMPLIB:\"..\\..\\bin\\debug\\lib\\$*.lib\"\n\n");
549                 CreateDirectory("..\\src\\debug", NULL);
550                 CreateDirectory("..\\bin\\debug\\bin", NULL);
551                 CreateDirectory("..\\bin\\debug\\lib", NULL);
552                 CreateDirectory("..\\bin\\debug\\modules", NULL);
553         #else
554                 fprintf(f, "  cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/commands\" /I \"../../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /GL /MD /Fo\"Release/\" /Fd\"Release/vc90.pdb\" /W2 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\release\\bin\\inspircd.lib /OUT:\"..\\..\\bin\\release\\lib\\$*.so\" /PDB:\"..\\..\\bin\\release\\lib\\$*.pdb\" /IMPLIB:\"..\\..\\bin\\release\\lib\\$*.lib\"\n\n");
555                 CreateDirectory("..\\src\\release", NULL);
556                 CreateDirectory("..\\bin\\release\\bin", NULL);
557                 CreateDirectory("..\\bin\\release\\lib", NULL);
558                 CreateDirectory("..\\bin\\release\\modules", NULL);
559         #endif
560 #endif
561
562 #ifdef _DEBUG
563         fprintf(f, "makedir:\n  if not exist debug mkdir debug\n  if not exist ..\\..\\bin\\debug\\lib mkdir ..\\..\\bin\\debug\\lib\n\n");
564 #else
565         fprintf(f, "makedir:\n  if not exist release mkdir release\n  if not exist ..\\..\\bin\\release\\lib mkdir ..\\..\\bin\\release\\lib\n\n");
566 #endif
567         
568         // dump modules.. again the second and last time :)
569         for(int i = 0; i < command_count; ++i)
570                 fprintf(f, "%s.so : %s.obj\n", commands[i], commands[i]);
571
572         fprintf(f, "\n");
573         fclose(f);
574 }
575
576 void WriteCompileModules()
577 {
578         char modules[300][100];
579         int module_count = 0;
580
581         printf("Finding Modules...\n");
582         WIN32_FIND_DATA fd;
583         HANDLE fh = FindFirstFile("..\\src\\modules\\m_*.cpp", &fd);
584         if(fh == INVALID_HANDLE_VALUE)
585                 printf_c("\033[1;32m  No module sources could be found! This \033[1m*could*\033[1;32m be a bad thing.. :P\033[0m");
586         else
587         {
588                 sc(TGREEN);
589                 do 
590                 {
591                         strcpy(modules[module_count], fd.cFileName);
592                         modules[module_count][strlen(fd.cFileName) - 4] = 0;
593                         printf("  %s\n", modules[module_count]);
594                         ++module_count;
595                 } while(FindNextFile(fh, &fd));
596                 sc(TNORMAL);
597         }
598
599         // Write our spiffy new makefile :D
600         // I am such a lazy fucker :P
601         FILE * f = fopen("..\\src\\modules\\modules.mak", "w");
602
603         time_t t = time(NULL);
604         fprintf(f, "# Generated at %s\n", ctime(&t));
605         fprintf(f, "all: makedir ");
606
607         // dump modules.. first time :)
608         for(int i = 0; i < module_count; ++i)
609                 fprintf(f, "%s.so ", modules[i]);
610
611         fprintf(f, "\n.cpp.obj:\n");
612 #ifdef WIN64
613         // /MACHINE:X64
614         #ifdef _DEBUG
615                 fprintf(f, "  cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /RTC1 /MDd /Fo\"Debug/\" /Fd\"Debug/vc90.pdb\" /W2 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\debug_x64\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\debug_x64\\modules\\$*.so\" /PDB:\"..\\..\\bin\\debug_x64\\modules\\$*.pdb\" /MACHINE:X64 /IMPLIB:\"..\\..\\bin\\debug_x64\\modules\\$*.lib\"\n\n");
616                 CreateDirectory("..\\src\\modules\\debug_x64", NULL);
617         #else
618                 fprintf(f, "  cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /GL /MD /Fo\"Release/\" /Fd\"Release/vc90.pdb\" /W2 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\release_x64\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\release_x64\\modules\\$*.so\" /PDB:\"..\\..\\bin\\release_x64\\modules\\$*.pdb\" /MACHINE:X64 /IMPLIB:\"..\\..\\bin\\release_x64\\modules\\$*.lib\"\n\n");
619                 CreateDirectory("..\\src\\modules\\release_x64", NULL);
620         #endif
621 #else
622         #ifdef _DEBUG
623                 fprintf(f, "  cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /RTC1 /MDd /Fo\"Debug/\" /Fd\"Debug/vc90.pdb\" /W2 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\debug\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\debug\\modules\\$*.so\" /PDB:\"..\\..\\bin\\debug\\modules\\$*.pdb\" /IMPLIB:\"..\\..\\bin\\debug\\modules\\$*.lib\"\n\n");
624                 CreateDirectory("..\\src\\modules\\debug", NULL);
625                 CreateDirectory("..\\src\\modules\\debug\\lib", NULL);
626                 CreateDirectory("..\\src\\modules\\debug\\modules", NULL);
627                 CreateDirectory("..\\src\\modules\\debug\\bin", NULL);
628         #else
629                 fprintf(f, "  cl /nologo /LD /Od /I \".\" /I \"../../include\" /I \"../../include/modes\" /I \"../../include/modules\" /I \"../../win\" /D \"WIN32\" /D \"_CONSOLE\" /D \"_MBCS\" /D \"DLL_BUILD\" /Gm /EHsc /GL /MD /Fo\"Release/\" /Fd\"Release/vc90.pdb\" /W2 /Zi /TP $*.cpp ..\\..\\win\\inspircd_memory_functions.cpp /link ..\\..\\bin\\release\\bin\\inspircd.lib ws2_32.lib /OUT:\"..\\..\\bin\\release\\modules\\$*.so\" /PDB:\"..\\..\\bin\\release\\modules\\$*.pdb\" /IMPLIB:\"..\\..\\bin\\release\\modules\\$*.lib\"\n\n");
630                 CreateDirectory("..\\src\\modules\\release", NULL);
631                 CreateDirectory("..\\src\\modules\\release\\lib", NULL);
632                 CreateDirectory("..\\src\\modules\\release\\modules", NULL);
633                 CreateDirectory("..\\src\\modules\\release\\bin", NULL);
634         #endif
635 #endif
636         
637 #ifdef _DEBUG
638         fprintf(f, "makedir:\n  if not exist debug mkdir debug\n  if not exist ..\\..\\bin\\debug\\modules mkdir ..\\..\\bin\\debug\\modules\n\n");
639 #else
640         fprintf(f, "makedir:\n  if not exist release mkdir release\n  if not exist ..\\..\\bin\\release\\modules mkdir ..\\..\\bin\\release\\modules\n\n");
641 #endif
642
643         // dump modules.. again the second and last time :)
644         for(int i = 0; i < module_count; ++i)
645                 fprintf(f, "%s.so : %s.obj\n", modules[i], modules[i]);
646
647         fprintf(f, "\n");
648         fclose(f);
649 }