Annotation of embedaddon/php/win32/build/projectgen.js, revision 1.1
1.1 ! misho 1: /* check for duplicate entries */
! 2: function check_duplicates(local, core)
! 3: {
! 4: if (!local) {
! 5: return core;
! 6: }
! 7:
! 8: arr = local.split(" ");
! 9:
! 10: for(i = 0; i < arr.length; i++) {
! 11: if (core.match(arr[i])) {
! 12: continue;
! 13: }
! 14: core += " " + arr[i];
! 15: }
! 16:
! 17: return core;
! 18: }
! 19:
! 20: /* read .dsp source blocks */
! 21: function read_src_files(ext, tmpl, path)
! 22: {
! 23: sources = file_get_contents("tmp\\src\\" + ext + ".sources.tmp");
! 24: sources = (path ? sources.replace(/\.\//g, path) : sources);
! 25: tmpl = tmpl.replace("SOURCEFILES", sources);
! 26: FSO.DeleteFile("tmp\\src\\" + ext + ".sources.tmp");
! 27:
! 28: headers = file_get_contents("tmp\\src\\" + ext + ".headers.tmp");
! 29: headers = (path ? headers.replace(/\.\//g, path) : headers);
! 30: tmpl = tmpl.replace("HEADERFILES", headers);
! 31: FSO.DeleteFile("tmp\\src\\" + ext + ".headers.tmp");
! 32:
! 33: return tmpl;
! 34: }
! 35:
! 36: /* write a .dsp source block */
! 37: function write_src_file(fname, path, intpath, arr)
! 38: {
! 39: FSO.FolderExists("tmp\\src") ? "" : FSO.CreateFolder("tmp\\src");
! 40: var src = FSO.CreateTextFile("tmp\\src\\" + fname, true);
! 41: var out = get_define("BUILD_DIR");
! 42: var libpath = "";
! 43:
! 44: for (i = 0; i < arr.length; i++) {
! 45: if (arr[i].length > 1) {
! 46: if (arr[i].match('alloca.c') ||
! 47: arr[i].match(/internal_functions_(nw|win32)\.c/) ||
! 48: arr[i].match(/flock\.(c|h)/) ||
! 49: arr[i].match(/zend_static_allocator\.(c|h)/) ||
! 50: arr[i].match(/zend_(ini|language)_scanner_defs\.h/)) {
! 51: continue;
! 52: }
! 53:
! 54: libpath = arr[i].substr(2, arr[i].lastIndexOf("\\") - 2);
! 55: if (libpath) {
! 56: libpath = "\\" + libpath;
! 57: }
! 58:
! 59: src.WriteLine("# Begin Source File");
! 60: src.WriteLine("SOURCE=" + arr[i]);
! 61: src.WriteLine('# PROP Intermediate_Dir "' + intpath + out + '\\' + path + libpath + '"');
! 62: src.WriteLine("# End Source File");
! 63: src.WriteBlankLines(1);
! 64: }
! 65: }
! 66:
! 67: src.Close();
! 68: return;
! 69: }
! 70:
! 71: /* generate list of text files */
! 72: function generate_text_filelist(ext, ext_dir)
! 73: {
! 74: var txtdir = FSO.GetFolder(ext_dir);
! 75:
! 76: block = '# Begin Group "Text Files"\r\n\# PROP Default_Filter ""\r\n\r\n';
! 77: txt = new Enumerator(txtdir.Files);
! 78:
! 79: for (; !txt.atEnd(); txt.moveNext()) {
! 80: fname = FSO.GetFileName(txt.item());
! 81: munged = fname.replace(ext, ""); /* TSRM...! */
! 82:
! 83: if (munged.match(/[A-Z]{4}/)){
! 84: block += "# Begin Source File\r\n";
! 85: block += "SOURCE=./" + fname + "\r\n";
! 86: block += "# End Source File\r\n\r\n";
! 87: }
! 88: }
! 89:
! 90: block += "# End Group\r\n";
! 91: return block;
! 92: }
! 93:
! 94: /* generate list of resource files */
! 95: function generate_resource_filelist(ext, ext_dir)
! 96: {
! 97: var resdir = FSO.GetFolder(ext_dir);
! 98: res = new Enumerator(resdir.Files);
! 99: block = "";
! 100:
! 101: for (; !res.atEnd(); res.moveNext()) {
! 102: fname = FSO.GetFileName(res.item());
! 103:
! 104: if (fname.match(/\.(ico|rc)/)) {
! 105: block += "# Begin Source File\r\n";
! 106: block += "SOURCE=./" + fname + "\r\n";
! 107: block += "# End Source File\r\n\r\n";
! 108: }
! 109: }
! 110:
! 111: return block;
! 112: }
! 113:
! 114: /* generate parser and scanner files for Zend */
! 115: function generate_parsers_or_scanners(arr, type)
! 116: {
! 117: var filter = (type.match("Parsers") ? "y" : "l");
! 118:
! 119: ret = '# Begin Group "' + type + '"\r\n# PROP Default_Filter "' + filter + '"\r\n\r\n';
! 120:
! 121: for (i = 0; i < arr.length; i++) {
! 122:
! 123: fl = "zend_" + arr[i] + "_" + type.toLowerCase().substr(0, type.length - 1);
! 124: ret += "# Begin Source File\r\n";
! 125: ret += "SOURCE=.\\" + fl + "." + filter + "\r\n\r\n";
! 126: ret += '# Begin Custom Build\r\n\r\n';
! 127:
! 128: if (type.match("Parsers")) {
! 129: pre = (arr[i].match(/ini/) ? "ini_ " : "zend ");
! 130: ret += fl + ".c " + fl + ".h: " + fl + ".y\r\n";
! 131: ret += "\tbison --output=" + fl + ".c -v -d -p " + pre + fl + ".y\r\n\r\n";
! 132: } else {
! 133: ret += fl + ".c: " + fl + ".l\r\n";
! 134: ret += "\tre2c --case-inverted -cbdFt " + fl + "_defs.h -o" + fl + ".c " + fl + ".l\r\n\r\n";
! 135: }
! 136:
! 137: ret += "# End Custom Build\r\n";
! 138: ret += "# End Source File\r\n";
! 139: }
! 140:
! 141: ret += "# End Group\r\n\r\n";
! 142: return ret;
! 143: }
! 144:
! 145: /* generate .defs file for php5[ts].dll */
! 146: function generate_php_defs()
! 147: {
! 148: var defs = get_define("PHP_DLL_DEF_SOURCES").split(" ");
! 149: var bdir = get_define("BUILD_DIR") + "\\";
! 150: var file = get_define("PHPLIB").replace("lib", "def");
! 151: var path = "..\\" + bdir + file;
! 152: var deps = "USERDEP__PHP5TS=";
! 153: var cmds = "BuildCmds= \\\r\n";
! 154: var cmd = '$(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r\n\t$(BuildCmds)\r\n';
! 155:
! 156: for (i = 0; i < defs.length; i++) {
! 157: deps += '"..\\' + defs[i] + '" ';
! 158: cmds += "\ttype ..\\" + defs[i] + (i == 0 ? " > " : " >> ") + path + " \\\r\n";
! 159: }
! 160:
! 161: ret = '# Begin Group "Defs Files"\r\n\r\n';
! 162: ret += "# Begin Source File\r\nSOURCE=" + path + "\r\n\r\n";
! 163: ret += deps.substr(0, deps.length-1) + "\r\n# Begin Custom Build - ";
! 164: ret += "Generating $(InputPath)\r\nInputPath=" + path + "\r\n\r\n";
! 165: ret += cmds + '\r\n\"' + path + '" : ' + cmd + "\r\n";
! 166: ret += "# End Custom Build\r\n# End Source File\r\n\r\n";
! 167: ret += "# End Group\r\n";
! 168: return ret;
! 169: }
! 170:
! 171: /* generate win32\wsyslog.h for php5[ts].dll */
! 172: function generate_wsyslog()
! 173: {
! 174: var path = ".\\build\\wsyslog.mc\r\n\r\n";
! 175: var intdir = "..\\" + get_define("BUILD_DIR");
! 176:
! 177: ret = "# Begin Source File\r\nSOURCE=" + path;
! 178: ret += "# Begin Custom Build\r\nInputDir=.\\build\r\n";
! 179: ret += "IntDir=" + intdir + "\r\nInputPath=" + path;
! 180: ret += '"wsyslog.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r\n';
! 181: ret += "\tmc -h $(InputDir)/.. -r $(InputDir) -x $(IntDir) $(InputPath)\r\n\r\n";
! 182: ret += "# End Custom Build\r\n# End Source File\r\n";
! 183: return ret;
! 184: }
! 185:
! 186: /* generate ext\date\lib\timelib_config.h for php5[ts].dll */
! 187: function generate_timelib_conf(headers)
! 188: {
! 189: var file = "timelib_config.h";
! 190: var path = "..\\ext\\date\\lib\\timelib_config.h";
! 191: var pos = headers.search(file);
! 192: var entry = headers.slice(pos, pos + 64);
! 193:
! 194: replace = entry.replace(file, file + ".win32");
! 195: replace += "\r\n\r\n# Begin Custom Build\r\nInputDir=..\\ext\\date\\lib\r\n";
! 196: replace += "InputPath=" + path + ".win32\r\n\r\n";
! 197: replace += '"' + path + '" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r\n';
! 198: replace += "\tcopy $(InputPath) $(InputDir)\\" + file + "\r\n\r\n";
! 199: replace += "# End Custom Build";
! 200:
! 201: headers = headers.replace(entry, replace);
! 202: return headers;
! 203: }
! 204:
! 205: /* generate php5[ts].dsp */
! 206: function generate_core_dsp(core_headers, core_sources, headers, sources, cflags, ldflags, libs)
! 207: {
! 208: var ts = (PHP_ZTS != "no" ? "ts" : "");
! 209: var extname = "php5" + ts;
! 210: var tmpl = generate_dsp_file(extname, ".", false, false);
! 211:
! 212: cflags += get_define("CFLAGS_PHP").replace("/D _USRDLL", "");
! 213: cflags = cflags.replace(/\/(I|D)(\S)/g, "/$1 $2");
! 214: ldflags += get_define("LDFLAGS_PHP");
! 215: libs += get_define("LIBS_PHP");
! 216:
! 217: tmpl = tmpl.replace(/LOCALCPP/, cflags.replace(/\"ext/g, '"../ext') + " /c");
! 218: tmpl = tmpl.replace(/LOCALLIBS/, libs);
! 219: tmpl = tmpl.replace(/LOCALLDFLAGS/, ldflags);
! 220: tmpl = tmpl.replace(extname + ".dll", get_define("PHPDLL"));
! 221:
! 222: wsyslog = (core_headers.match("wsyslog.h") ? "" : generate_wsyslog(core_headers));
! 223: core_sources = '# Begin Group "CORE"\r\n' + core_sources + "# End Group\r\n";
! 224: tmpl = tmpl.replace(/CORESOURCES/, core_sources);
! 225: core_headers = '# Begin Group "CORE "\r\n' + core_headers + "# End Group\r\n";
! 226: tmpl = tmpl.replace(/COREHEADERS/, core_headers + wsyslog);
! 227:
! 228: headers = generate_timelib_conf(headers);
! 229: tmpl = tmpl.replace(/SOURCEFILES/, sources);
! 230: tmpl = tmpl.replace(/HEADERFILES/, headers);
! 231:
! 232: defs = generate_php_defs();
! 233: tmpl = tmpl.replace(/DEFS/, defs);
! 234:
! 235: dsp = FSO.CreateTextFile("win32\\php5" + ts + ".dsp", true);
! 236: STDOUT.WriteLine("\tGenerating win32\\php5" + ts + ".dsp");
! 237: dsp.Write(tmpl);
! 238: dsp.Close();
! 239:
! 240: return;
! 241: }
! 242:
! 243: /* generate .dsw files */
! 244: function generate_dsw_files(sblocks, mblocks)
! 245: {
! 246: var stmpl = file_get_contents("win32\\build\\template.dsw");
! 247: var mtmpl = file_get_contents("win32\\build\\template.dsw");
! 248: var ts = (PHP_ZTS != "no" ? "ts" : "");
! 249:
! 250: /* push all the sapi blocks to the same tag */
! 251: stmpl = stmpl.replace("INSERT", sblocks);
! 252: stmpl = (PHP_ZTS != "no" ? stmpl : stmpl.replace(/dllts/g, "dll"));
! 253: sdsw = FSO.CreateTextFile("win32\\php5" + ts + ".dsw", true);
! 254: STDOUT.WriteLine("\tGenerating win32\\php5" + ts + ".dsw");
! 255: sdsw.Write(stmpl);
! 256: sdsw.Close();
! 257:
! 258: /* same for shared modules - except that nothing else goes in here */
! 259: garbage = mtmpl.slice(200, mtmpl.search("INSERT"));
! 260: mtmpl = mtmpl.replace(garbage, "\r\n");
! 261: mtmpl = mtmpl.replace("INSERT", mblocks);
! 262: mtmpl = (PHP_ZTS != "no" ? mtmpl : mtmpl.replace(/dllts/g, "dll"));
! 263: mdsw = FSO.CreateTextFile("win32\\php_modules.dsw", true);
! 264: STDOUT.WriteLine("\tGenerating win32\\php_modules.dsw");
! 265: mdsw.Write(mtmpl);
! 266: mdsw.Close();
! 267:
! 268: return;
! 269: }
! 270:
! 271: /* finalize .dsp files and copy to final destination */
! 272: function copy_dsp_files()
! 273: {
! 274: var tmp = FSO.GetFolder("tmp");
! 275: var CORE_HEADERS = "";
! 276: var CORE_SOURCES = "";
! 277: var EXT_HEADERS = "";
! 278: var EXT_SOURCES = "";
! 279: var EXT_CFLAGS = "";
! 280: var EXT_LDFLAGS = "";
! 281: var EXT_LIBS = "";
! 282: var sblocks = ""; /* for sapis */
! 283: var mblocks = ""; /* for modules */
! 284:
! 285: f = new Enumerator(tmp.Files);
! 286:
! 287: for (; !f.atEnd(); f.moveNext()) {
! 288: /* retrieve the path */
! 289: contents = file_get_contents(f.item());
! 290: address = contents.slice(0, contents.indexOf("#"));
! 291: contents = contents.slice(contents.indexOf("#")+1);
! 292: shared = contents.slice(0, contents.indexOf("#"));
! 293: contents = contents.slice(contents.indexOf("#"));
! 294:
! 295: /* pick up module name and path */
! 296: path = address.slice(0, address.lastIndexOf("\\")+1);
! 297: ext = address.slice(address.lastIndexOf("\\")+1, address.length-4);
! 298: EXT = ext.toUpperCase();
! 299:
! 300: if (path.match(/(sapi|ext)/)) {
! 301: rel = "..\\..\\";
! 302: } else {
! 303: rel = "..\\";
! 304: }
! 305:
! 306: /* pick up local flags and libs */
! 307: cflags = get_define("CFLAGS_" + EXT);
! 308: cflags += (ext.match(/(TSRM|Zend)/) ? "/D TSRM_EXPORTS " : "");
! 309: cflags += (ext.match(/Zend/) ? "/D LIBZEND_EXPORTS " : "");
! 310: libs = get_define("LIBS_" + EXT);
! 311: ldflags = get_define("LDFLAGS_" + EXT);
! 312: ldflags = ldflags.replace(/(\.\.\\)/g, rel + "$1");
! 313: contents = contents.replace(/LOCALCPP/, cflags + " /c");
! 314: contents = contents.replace(/LOCALLIBS/, libs);
! 315: contents = contents.replace(/LOCALLDFLAGS/, ldflags);
! 316:
! 317: if (ext.match("Zend")) {
! 318: arr = new Array("ini", "language");
! 319: parsers = generate_parsers_or_scanners(arr, "Parsers");
! 320: scanners = generate_parsers_or_scanners(arr, "Scanners");
! 321: contents = contents.replace(/DEFS/, parsers + scanners);
! 322: }
! 323:
! 324: /* none of these are core... */
! 325: contents = contents.replace(/\r\n(CORESOURCES|COREHEADERS|EXTSOURCES|EXTHEADERS|DEFS)\r\n/g, "");
! 326:
! 327: if (address.match("sapi")) {
! 328: /* most sapis are .dlls, just not cgi, cli, embed */
! 329:
! 330: if (ext == "cli") {
! 331:
! 332: /* change of address: php.dsp */
! 333: newext = "cli";
! 334: address = "win32\\php.dsp";
! 335: srcpath = "..\\" + path;
! 336: contents = contents.replace(/cli\.exe/g, "php.exe");
! 337:
! 338: } else if (ext == "cgi") {
! 339:
! 340: /* change of address: php-cgi.dsp */
! 341: newext = "cgi";
! 342: address = "win32\\php-cgi.dsp";
! 343: srcpath = "..\\" + path;
! 344: contents = contents.replace(/cgi\.exe/g, "php-cgi.exe");
! 345:
! 346: } else {
! 347:
! 348: /* there's always one... most sapis just get a 'php5' prefix */
! 349: newext = (ext.match(/apache2handler/) ? "php5apache2" : "php5" + ext);
! 350: address = address.replace(ext + ".dsp", newext + ".dsp");
! 351: srcpath = ".\\";
! 352: oldext = new RegExp(('[^=\\\\]'+ext), "g");
! 353: contents = contents.replace(oldext, newext);
! 354: contents = contents.replace(ext + ".dll", newext + ".dll");
! 355: contents = contents.replace("CFG=" + ext, "CFG=" + newext);
! 356: }
! 357:
! 358: contents = read_src_files(ext, contents, (srcpath ? srcpath : false));
! 359: dsp = FSO.CreateTextFile(address, true);
! 360: STDOUT.WriteLine("\tGenerating " + address);
! 361: dsp.Write(contents);
! 362: dsp.Close();
! 363:
! 364: /* add all configured sapis to the list in php5ts.dsw */
! 365: sblocks += file_get_contents("win32\\build\\block.template.dsw");
! 366: sblocks = sblocks.replace("ADDRESS", address);
! 367: sblocks = sblocks.replace("EXTNAME", newext);
! 368:
! 369: } else if (address.match("ext") && shared == "true") {
! 370:
! 371: /* independent modules with their own .dsp */
! 372: contents = read_src_files(ext, contents, false);
! 373: dsp = FSO.CreateTextFile(address, true);
! 374: STDOUT.WriteLine("\tGenerating " + address);
! 375: dsp.Write(contents);
! 376: dsp.Close();
! 377:
! 378: mblocks += file_get_contents("win32\\build\\block.template.dsw");
! 379: mblocks = mblocks.replace("ADDRESS", address);
! 380: mblocks = mblocks.replace("EXTNAME", ext);
! 381:
! 382: } else if (ext.match(/(TSRM|Zend)/)) {
! 383:
! 384: contents = read_src_files(ext, contents, false);
! 385: dsp = FSO.CreateTextFile(address, true);
! 386: STDOUT.WriteLine("\tGenerating " + address);
! 387: dsp.Write(contents);
! 388: dsp.Close();
! 389:
! 390: } else {
! 391:
! 392: /* bound for php5[ts].dsp */
! 393: cflags = get_define("CFLAGS_" + EXT);
! 394: cflags = cflags ? cflags.replace(/-(I|D)/g, " /$1") : "";
! 395: cflags = cflags? cflags.replace(/\/(I|D)\s+/g, "/$1") : "";
! 396: cflags = cflags ? cflags.replace(/\/I(?!\")(\S+)/g, '/I"$1"') : "";
! 397:
! 398: EXT_CFLAGS = check_duplicates(cflags, EXT_CFLAGS);
! 399: EXT_LDFLAGS = check_duplicates(ldflags, EXT_LDFLAGS);
! 400: EXT_LIBS = check_duplicates(libs, EXT_LIBS);
! 401:
! 402: beginh = '# Begin Group "' + ext + ' "\r\n';
! 403: begins = '# Begin Group "' + ext + '"\r\n';
! 404:
! 405: hdr = file_get_contents("tmp\\src\\" + ext + ".headers.tmp");
! 406: hdr = hdr.replace(/\.\//g, "..\\" + path);
! 407: hdr = hdr.replace(/\.\.\\\.\.\\/g, "..\\");
! 408:
! 409: src = file_get_contents("tmp\\src\\" + ext + ".sources.tmp");
! 410: src = src.replace(/\.\//g, "..\\" + path);
! 411: src = src.replace(/\.\.\\\.\.\\/g, "..\\");
! 412:
! 413: if (ext.match(/(main|standard|streams|win32)/)) {
! 414: CORE_HEADERS += beginh + hdr + "# End Group\r\n";
! 415: CORE_SOURCES += begins + src + "# End Group\r\n";
! 416: } else {
! 417: EXT_HEADERS += beginh + hdr + "# End Group\r\n";
! 418: EXT_SOURCES += begins + src + "# End Group\r\n";
! 419: }
! 420:
! 421: FSO.DeleteFile("tmp\\src\\" + ext + ".headers.tmp");
! 422: FSO.DeleteFile("tmp\\src\\" + ext + ".sources.tmp");
! 423: }
! 424:
! 425: FSO.DeleteFile(f.item());
! 426: }
! 427:
! 428: generate_core_dsp(CORE_HEADERS, CORE_SOURCES, EXT_HEADERS, EXT_SOURCES, EXT_CFLAGS, EXT_LDFLAGS, EXT_LIBS);
! 429: generate_dsw_files(sblocks, mblocks);
! 430:
! 431: /* goodnight vienna */
! 432: FSO.DeleteFolder("tmp\\src");
! 433: FSO.DeleteFolder("tmp");
! 434: }
! 435:
! 436: /* generate source and header entries for .dsp files */
! 437: function generate_dsp_filelist(ext, ext_dir, files, intpath)
! 438: {
! 439: var EXT = ext.toUpperCase();
! 440: var tabs = new RegExp("[\t\r\n\'\"]", "gm");
! 441: var ws = new RegExp("\\s+", "g");
! 442: var dir = FSO.GetFolder(ext_dir);
! 443: var configfile = FSO.BuildPath(ext_dir, "config.w32");
! 444: var headers = "";
! 445: var path = "";
! 446:
! 447: if (!files) {
! 448: /* module either lacks a config.w32 or is core
! 449: * either way, we know nothing about its sources
! 450: */
! 451: files = "";
! 452: f = new Enumerator(dir.Files);
! 453:
! 454: for (; !f.atEnd(); f.moveNext()) {
! 455: name = FSO.GetFileName(f.item());
! 456:
! 457: if (name.substr(name.length-2) == ".c") {
! 458: files += " ./" + name;
! 459: }
! 460: }
! 461: } else {
! 462: files = files.replace(tabs, "");
! 463: files = "./" + files.replace(/ /g, " ./");
! 464: }
! 465:
! 466: DSP_SOURCES = files.split(" ");
! 467:
! 468: /* pick up headers (all modules) */
! 469: f = new Enumerator(dir.Files);
! 470:
! 471: for (; !f.atEnd(); f.moveNext()) {
! 472: name = FSO.GetFileName(f.item());
! 473:
! 474: if (name.substr(name.length-2) == ".h") {
! 475: headers += " ./" + name;
! 476: }
! 477: }
! 478:
! 479: DSP_HEADERS = headers.split(" ");
! 480:
! 481: /* check for bundled library paths and sourcefiles */
! 482: if (FSO.FileExists(configfile)) {
! 483: config = file_get_contents(configfile);
! 484:
! 485: if (config.match("ADD_SOURCES")) {
! 486: sources = new RegExp("ADD_SOURCES\\([^,]*\\s*,\\s*['\"]([^'\"]+)['\"].*\\)", "gm");
! 487: arr = config.match(sources);
! 488: line = arr[0].replace(tabs, "");
! 489: line = line.replace(/ADD_SOURCES\((.+)\)/, "$1");
! 490: newarr = line.split(',');
! 491: orig_path = newarr[0].replace(/\//g, "\\");
! 492: orig_path = orig_path.replace(/configure_module_dirname(\s?\+\s?)?/, ext_dir);
! 493: path = orig_path.replace(ext_dir + '\\', "");
! 494:
! 495: if (path.length > 0 && path != ext_dir) {
! 496: subdir = FSO.GetFolder(orig_path);
! 497: lib = new Enumerator(subdir.Files);
! 498: libheaders = "";
! 499:
! 500: for (; !lib.atEnd(); lib.moveNext()) {
! 501: name = FSO.GetFileName(lib.item());
! 502:
! 503: if (name.substr(name.length-2) == ".h") {
! 504: libheaders += " ./" + path + "\\" + name;
! 505: }
! 506: }
! 507:
! 508: DSP_HEADERS = DSP_HEADERS.concat(libheaders.split(" "));
! 509:
! 510: } else {
! 511: path = "";
! 512: }
! 513:
! 514: sources = newarr[1].replace(/\\/g, ""); /* continuation lines */
! 515: sources = sources.replace(ws, " ");
! 516: sources = sources.replace(/\s/g, (path ? " ./" + path + "\\" : " ./"));
! 517: sources = check_duplicates(DSP_SOURCES.join(" "), sources);
! 518: DSP_SOURCES = sources.split(" ");
! 519: }
! 520: }
! 521:
! 522: /* store the array contents in temp files for now */
! 523: write_src_file(ext + ".headers.tmp", ext_dir, intpath, DSP_HEADERS);
! 524: write_src_file(ext + ".sources.tmp", ext_dir, intpath, DSP_SOURCES);
! 525:
! 526: return;
! 527: }
! 528:
! 529: /* entry point. Called from EXTENSION(), SAPI() and generate_files() (confutils.js) */
! 530: function generate_dsp_file(ext, ext_dir, files, shared)
! 531: {
! 532: var dsp = FSO.CreateTextFile("tmp\\" + ext + ".dsp", true);
! 533: var tmpl = file_get_contents("win32\\build\\template.dsp");
! 534: var ts = (PHP_ZTS != "no" ? "ts" : "");
! 535: var debug = (PHP_DEBUG != "no" ? " /debug" : "");
! 536: var ld = (debug ? "/LDd" : "/LD");
! 537: var status = (PHP_DEBUG == "no" ? 'Release' : 'Debug');
! 538: var statusts = status + (ts ? "_" + ts.toUpperCase() : "");
! 539: var baseflags = "";
! 540:
! 541: /* store the final path and value of shared in the tmp file */
! 542: if (!ext.match("php5")) {
! 543: tmpl = ext_dir + "\\" + ext + ".dsp#" + shared + tmpl;
! 544: }
! 545:
! 546: tmpl = tmpl.replace(/extname/g, ext);
! 547: tmpl = tmpl.replace(/Status_TS/g, statusts);
! 548:
! 549: if (debug) {
! 550: tmpl = tmpl.replace(/Use_Debug_Libraries 0/g, "Use_Debug_Libraries 1");
! 551: tmpl = tmpl.replace(/NDEBUG/g, "_DEBUG");
! 552: }
! 553:
! 554: if (ext == "cli" || ext == "cgi") {
! 555: tmpl = tmpl.replace(/Dynamic-Link Library/g, "Console Application");
! 556: tmpl = tmpl.replace(/0x0102/, "0x0103");
! 557: path = "..\\";
! 558: type = ".exe";
! 559: } else if (ext == "embed" || ext == "TSRM" || ext == "Zend") {
! 560: tmpl = tmpl.replace(/Dynamic-Link/g, "Static");
! 561: tmpl = tmpl.replace(/0x0102/, "0x0104");
! 562: tmpl = tmpl.replace(/LINK32/g, "LIB32");
! 563: tmpl = tmpl.replace("link.exe", "link.exe -lib");
! 564: tmpl = tmpl.replace(/BASELIBS/g, "/nologo");
! 565: tmpl = tmpl.replace(/\s(LOCALLIBS|BASELDFLAGS|LOCALLDFLAGS|OUTPATH)/g, "");
! 566: path = "..\\";
! 567: if (ext == "embed") {
! 568: path += "..\\";
! 569: }
! 570: type = ".lib";
! 571: } else if (ext.match("php5")) {
! 572: path = "..\\";
! 573: type = ".dll";
! 574: } else {
! 575: path = "..\\..\\";
! 576: type = ".dll";
! 577: }
! 578:
! 579: outpath = path + get_define("BUILD_DIR");
! 580: tmpl = tmpl.replace(/OUTPUTDIR/g, outpath);
! 581:
! 582: /* populate the baseline CFLAGS and libs */
! 583: cflags = get_define("CFLAGS").replace(/\s+/g, " ");
! 584: cflags = cflags.replace('/I "..\\bindlib_w32" ', "");
! 585: bcflags = (cflags.replace(/\/([A-Z])\s/g, "/$1")).split(" ");
! 586:
! 587: for (i= 0; i < bcflags.length; i++) {
! 588: baseflags += (bcflags[i].match(/(PHP|ZEND|ZTS|BASE|FD|WINDOWS)/) ? "" : bcflags[i]);
! 589: }
! 590:
! 591: baseflags = baseflags.replace(/\//g, " /");
! 592: baseflags = baseflags.substr(1).replace(/(\/D)/g, "$1 ") + " /c";
! 593: tmpl = tmpl.replace(/BASECPP/, (type == ".dll" ? baseflags : baseflags.replace(ld + " ", "")));
! 594:
! 595: tmpl = tmpl.replace(/BASELIBS/, "/nologo " + get_define("LIBS").replace(/\sresolv.lib/, ""));
! 596:
! 597: /* now populate the bases in the 'local' lines */
! 598: incs = get_define("BASE_INCLUDES").replace(/\/I (\S+)/g, '/I "' + path + '$1"');
! 599: incs = incs.replace('"' + path + '."', '".."');
! 600: lcflags = cflags.replace(/\$\(BASE_INCLUDES\)/, incs + (type == ".exe" ? '/I "..\\sapi" ' : "") + '/I "' + path + '..\\bindlib_w32"');
! 601: tmpl = tmpl.replace(/BASECPP/, (type == ".dll" ? lcflags : lcflags.replace(ld + " ", "")));
! 602: tmpl = tmpl.replace(/BASELIBS/, "/nologo " + get_define("LIBS") + " " + (ext.match("php5") ? "" : get_define("PHPLIB")));
! 603: ldflags = get_define("LDFLAGS").replace(/\s?(\/nologo|\/libpath:\S+)\s?/g, "");
! 604: tmpl = tmpl.replace(/BASELDFLAGS/, ldflags + (type == ".dll" ? " " + get_define("DLL_LDFLAGS") : "") + (debug ? ' /nodefaultlib:"msvcrt"' : ""));
! 605: out = '/out:"' + outpath + "\\" + ext + type + '"' + ' /libpath:"' + outpath + '"' + ' /libpath:"..\\' + path + 'bindlib_w32\\' + status + '"';
! 606: tmpl = tmpl.replace(/OUTPATH/, out);
! 607:
! 608: txt = generate_text_filelist(ext, ext_dir);
! 609: res = generate_resource_filelist(ext, ext_dir);
! 610:
! 611: tmpl = tmpl.replace(/TEXTFILES/, txt);
! 612: tmpl = tmpl.replace(/RESOURCEFILES/, res);
! 613:
! 614: if (ext.match("php5")) {
! 615: return tmpl;
! 616: }
! 617:
! 618: /* generate source and header blocks for .dsp */
! 619: generate_dsp_filelist(ext, ext_dir, files, path);
! 620:
! 621: dsp.Write(tmpl);
! 622: dsp.Close();
! 623:
! 624: return;
! 625: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>