]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - win/configure.cpp
Show opers the raw VERSION string, not the custom one
[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         if (ipv6)
357                 fprintf(f, "#define IPV6 1\n\n");
358
359         fprintf(f, "#define CONFIG_FILE \"%s/inspircd.conf\"\n", config_file);
360         fprintf(f, "#define MOD_PATH \"%s\"\n", mod_path);
361         fprintf(f, "#define SOMAXCONN_S \"128\"\n");
362         fprintf(f, "#define LIBRARYDIR \"%s\"\n", library_dir);
363         fprintf(f, "#define MAXBUF 514\n");
364
365         fprintf(f, "\n#include \"inspircd_win32wrapper.h\"");
366         fprintf(f, "\n#include \"inspircd_namedpipe.h\"");
367         fprintf(f, "\n#include \"threadengines/threadengine_win32.h\"\n\n");
368         fprintf(f, "#endif\n\n");
369         fclose(f);
370
371         sc(TGREEN); printf(" done\n"); sc(TNORMAL);
372         printf("Writing inspircd_se_config.h...");
373
374         f = fopen("inspircd_se_config.h", "w");
375         fprintf(f, "/* Auto generated by configure, do not modify or commit to svn! */\n");
376         fprintf(f, "#ifndef __CONFIGURATION_SOCKETENGINE__\n");
377         fprintf(f, "#define __CONFIGURATION_SOCKETENGINE__\n\n");
378         fprintf(f, "#include \"socketengines/socketengine_%s.h\"\n\n", "select");
379         fprintf(f, "#endif\n\n");
380         fclose(f);
381
382         sc(TGREEN); printf(" done\n"); sc(TNORMAL);
383         printf("Writing inspircd_version.h...");
384         f = fopen("inspircd_version.h", "w");
385         fprintf(f, "#define VERSION \"%s\"\n", version);
386         fprintf(f, "#define REVISION \"%d\"\n", revision);
387         fprintf(f, "#define SYSTEM \"%s\"\n", machine_text);
388         fclose(f);
389
390         sc(TGREEN); printf(" done\n"); sc(TNORMAL);
391         printf("Writing command and module compilation scripts...");
392         WriteCompileCommands();
393         WriteCompileModules();
394         sc(TGREEN); printf(" done\n"); sc(TNORMAL);
395
396         printf("\nconfigure is done.. exiting!\n");
397 }
398
399 /* Keeps files from modules/extra up to date if theyre copied into modules/ */
400 void CopyExtras()
401 {
402         char dest[65535];
403         char src[65535];
404
405         printf("\nUpdating extra modules in src/modules...\n");
406
407         WIN32_FIND_DATA fd;
408         HANDLE fh = FindFirstFile("..\\src\\modules\\extra\\*.*", &fd);
409
410         if(fh == INVALID_HANDLE_VALUE)
411                 return;
412
413         do
414         {
415                 strcpy(dest, "..\\src\\modules\\");
416                 strcat(dest, fd.cFileName);
417                 strcpy(src, "..\\src\\modules\\extra\\");
418                 strcat(src, fd.cFileName);
419                 FILE* x = fopen(dest, "r");
420                 if (x)
421                 {
422                         fclose(x);
423                         CopyFile(src, dest, false);
424                         sc(TGREEN); printf("    %s", fd.cFileName); sc(TNORMAL);
425                         printf("...\n");
426                 }
427         }
428         while (FindNextFile(fh, &fd));
429
430         FindClose(fh);
431
432         printf("\n\n");
433 }
434
435
436 void Rebase()
437 {
438         char dest[65535];
439         char command[65535];
440
441         *dest = 0;
442
443         WIN32_FIND_DATA fd;
444 #ifdef _DEBUG
445         HANDLE fh = FindFirstFile("..\\bin\\debug\\lib\\*.so", &fd);
446 #else
447         HANDLE fh = FindFirstFile("..\\bin\\release\\lib\\*.so", &fd);
448 #endif
449         if(fh == INVALID_HANDLE_VALUE)
450                 return;
451
452         do
453         {
454 #ifdef _DEBUG
455                 strcat(dest, " ..\\bin\\debug\\lib\\");
456 #else
457                 strcat(dest, " ..\\bin\\release\\lib\\");
458 #endif
459                 strcat(dest, fd.cFileName);
460         }
461         while (FindNextFile(fh, &fd));
462
463         FindClose(fh);
464
465         sprintf(command, "rebase.exe -v -b 10000000 -c baseaddr_commands.txt %s", dest);
466         printf("%s\n", command);
467         system(command);
468
469 #ifdef _DEBUG
470         fh = FindFirstFile("..\\bin\\debug\\modules\\*.so", &fd);
471 #else
472         fh = FindFirstFile("..\\bin\\release\\modules\\*.so", &fd);
473 #endif
474         if(fh == INVALID_HANDLE_VALUE)
475                 return;
476
477         *dest = 0;
478
479         do
480         {
481 #ifdef _DEBUG
482                 strcat(dest, " ..\\bin\\debug\\modules\\");
483 #else
484                 strcat(dest, " ..\\bin\\release\\modules\\");
485 #endif
486                 strcat(dest, fd.cFileName);
487         }
488         while (FindNextFile(fh, &fd));
489
490         sprintf(command, "rebase.exe -v -b 11000000 -c baseaddr_modules.txt %s", dest);
491         printf("%s\n", command);
492         system(command);
493
494         FindClose(fh);
495
496 }
497
498 void WriteCompileCommands()
499 {
500         char commands[300][100];
501         int command_count = 0;
502         printf("\n  Finding Command Sources...\n");
503         WIN32_FIND_DATA fd;
504         HANDLE fh = FindFirstFile("..\\src\\commands\\cmd_*.cpp", &fd);
505         if(fh == INVALID_HANDLE_VALUE)
506                 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");
507         else
508         {
509                 sc(TGREEN);
510                 do 
511                 {
512                         strcpy(commands[command_count], fd.cFileName);
513                         commands[command_count][strlen(fd.cFileName) - 4] = 0;
514                         printf("        %s\n", commands[command_count]);
515                         ++command_count;
516                 } while(FindNextFile(fh, &fd));
517                 sc(TNORMAL);
518         }
519         
520         // Write our spiffy new makefile :D
521         // I am such a lazy fucker :P
522         FILE * f = fopen("..\\src\\commands\\commands.mak", "w");
523
524         time_t t = time(NULL);
525         fprintf(f, "# Generated at %s\n", ctime(&t));
526         fprintf(f, "all: makedir ");
527
528         // dump modules.. first time :)
529         for(int i = 0; i < command_count; ++i)
530                 fprintf(f, "%s.so ", commands[i]);
531
532         fprintf(f, "\n.cpp.obj:\n");
533 #ifdef WIN64
534         // /MACHINE:X64
535         #ifdef _DEBUG
536                 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");
537                 CreateDirectory("..\\src\\debug", NULL);
538                 CreateDirectory("..\\bin\\debug\\bin", NULL);
539                 CreateDirectory("..\\bin\\debug\\lib", NULL);
540                 CreateDirectory("..\\bin\\debug\\modules", NULL);
541         #else
542                 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");
543                 CreateDirectory("..\\src\\release", NULL);
544                 CreateDirectory("..\\bin\\release\\bin", NULL);
545                 CreateDirectory("..\\bin\\release\\lib", NULL);
546                 CreateDirectory("..\\bin\\release\\modules", NULL);
547         #endif
548 #else
549         #ifdef _DEBUG
550                 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");
551                 CreateDirectory("..\\src\\debug", NULL);
552                 CreateDirectory("..\\bin\\debug\\bin", NULL);
553                 CreateDirectory("..\\bin\\debug\\lib", NULL);
554                 CreateDirectory("..\\bin\\debug\\modules", NULL);
555         #else
556                 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");
557                 CreateDirectory("..\\src\\release", NULL);
558                 CreateDirectory("..\\bin\\release\\bin", NULL);
559                 CreateDirectory("..\\bin\\release\\lib", NULL);
560                 CreateDirectory("..\\bin\\release\\modules", NULL);
561         #endif
562 #endif
563
564 #ifdef _DEBUG
565         fprintf(f, "makedir:\n  if not exist debug mkdir debug\n  if not exist ..\\..\\bin\\debug\\lib mkdir ..\\..\\bin\\debug\\lib\n\n");
566 #else
567         fprintf(f, "makedir:\n  if not exist release mkdir release\n  if not exist ..\\..\\bin\\release\\lib mkdir ..\\..\\bin\\release\\lib\n\n");
568 #endif
569         
570         // dump modules.. again the second and last time :)
571         for(int i = 0; i < command_count; ++i)
572                 fprintf(f, "%s.so : %s.obj\n", commands[i], commands[i]);
573
574         fprintf(f, "\n");
575         fclose(f);
576 }
577
578 void WriteCompileModules()
579 {
580         char modules[300][100];
581         int module_count = 0;
582
583         printf("Finding Modules...\n");
584         WIN32_FIND_DATA fd;
585         HANDLE fh = FindFirstFile("..\\src\\modules\\m_*.cpp", &fd);
586         if(fh == INVALID_HANDLE_VALUE)
587                 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");
588         else
589         {
590                 sc(TGREEN);
591                 do 
592                 {
593                         strcpy(modules[module_count], fd.cFileName);
594                         modules[module_count][strlen(fd.cFileName) - 4] = 0;
595                         printf("  %s\n", modules[module_count]);
596                         ++module_count;
597                 } while(FindNextFile(fh, &fd));
598                 sc(TNORMAL);
599         }
600
601         // Write our spiffy new makefile :D
602         // I am such a lazy fucker :P
603         FILE * f = fopen("..\\src\\modules\\modules.mak", "w");
604
605         time_t t = time(NULL);
606         fprintf(f, "# Generated at %s\n", ctime(&t));
607         fprintf(f, "all: makedir ");
608
609         // dump modules.. first time :)
610         for(int i = 0; i < module_count; ++i)
611                 fprintf(f, "%s.so ", modules[i]);
612
613         fprintf(f, "\n.cpp.obj:\n");
614 #ifdef WIN64
615         // /MACHINE:X64
616         #ifdef _DEBUG
617                 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");
618                 CreateDirectory("..\\src\\modules\\debug_x64", NULL);
619         #else
620                 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");
621                 CreateDirectory("..\\src\\modules\\release_x64", NULL);
622         #endif
623 #else
624         #ifdef _DEBUG
625                 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");
626                 CreateDirectory("..\\src\\modules\\debug", NULL);
627                 CreateDirectory("..\\src\\modules\\debug\\lib", NULL);
628                 CreateDirectory("..\\src\\modules\\debug\\modules", NULL);
629                 CreateDirectory("..\\src\\modules\\debug\\bin", NULL);
630         #else
631                 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");
632                 CreateDirectory("..\\src\\modules\\release", NULL);
633                 CreateDirectory("..\\src\\modules\\release\\lib", NULL);
634                 CreateDirectory("..\\src\\modules\\release\\modules", NULL);
635                 CreateDirectory("..\\src\\modules\\release\\bin", NULL);
636         #endif
637 #endif
638         
639 #ifdef _DEBUG
640         fprintf(f, "makedir:\n  if not exist debug mkdir debug\n  if not exist ..\\..\\bin\\debug\\modules mkdir ..\\..\\bin\\debug\\modules\n\n");
641 #else
642         fprintf(f, "makedir:\n  if not exist release mkdir release\n  if not exist ..\\..\\bin\\release\\modules mkdir ..\\..\\bin\\release\\modules\n\n");
643 #endif
644
645         // dump modules.. again the second and last time :)
646         for(int i = 0; i < module_count; ++i)
647                 fprintf(f, "%s.so : %s.obj\n", modules[i], modules[i]);
648
649         fprintf(f, "\n");
650         fclose(f);
651 }