Return to projectgen.js CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / win32 / build |
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: }