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