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>