Annotation of embedaddon/php/win32/build/confutils.js, revision 1.1.1.4

1.1       misho       1: // Utils for configure script
                      2: /*
                      3:   +----------------------------------------------------------------------+
                      4:   | PHP Version 5                                                        |
                      5:   +----------------------------------------------------------------------+
                      6:   | Copyright (c) 1997-2008 The PHP Group                                |
                      7:   +----------------------------------------------------------------------+
                      8:   | This source file is subject to version 3.01 of the PHP license,      |
                      9:   | that is bundled with this package in the file LICENSE, and is        |
                     10:   | available through the world-wide-web at the following url:           |
                     11:   | http://www.php.net/license/3_01.txt                                  |
                     12:   | If you did not receive a copy of the PHP license and are unable to   |
                     13:   | obtain it through the world-wide-web, please send a note to          |
                     14:   | license@php.net so we can mail you a copy immediately.               |
                     15:   +----------------------------------------------------------------------+
                     16:   | Author: Wez Furlong <wez@thebrainroom.com>                           |
                     17:   +----------------------------------------------------------------------+
                     18: */
                     19: 
                     20: // $Id: confutils.js,v 1.60.2.1.2.8.2.33 2009-05-29 07:43:07 kalle Exp $
                     21: 
                     22: var STDOUT = WScript.StdOut;
                     23: var STDERR = WScript.StdErr;
                     24: var WshShell = WScript.CreateObject("WScript.Shell");
                     25: var FSO = WScript.CreateObject("Scripting.FileSystemObject");
                     26: var MFO = null;
                     27: var SYSTEM_DRIVE = WshShell.Environment("Process").Item("SystemDrive");
                     28: var PROGRAM_FILES = WshShell.Environment("Process").Item("ProgramFiles");
                     29: var DSP_FLAGS = new Array();
                     30: var PHP_SRC_DIR=FSO.GetParentFolderName(WScript.ScriptFullName);
                     31: 
                     32: /* Store the enabled extensions (summary + QA check) */
                     33: var extensions_enabled = new Array();
                     34: 
                     35: /* Store the SAPI enabled (summary + QA check) */
                     36: var sapi_enabled = new Array();
                     37: 
                     38: /* Store the headers to install */
                     39: var headers_install = new Array();
                     40: 
                     41: /* Mapping CL version > human readable name */
                     42: var VC_VERSIONS = new Array();
                     43: VC_VERSIONS[1200] = 'MSVC6 (Visual C++ 6.0)';
                     44: VC_VERSIONS[1300] = 'MSVC7 (Visual C++ 2002)';
                     45: VC_VERSIONS[1310] = 'MSVC7.1 (Visual C++ 2003)';
                     46: VC_VERSIONS[1400] = 'MSVC8 (Visual C++ 2005)';
                     47: VC_VERSIONS[1500] = 'MSVC9 (Visual C++ 2008)';
                     48: VC_VERSIONS[1600] = 'MSVC10 (Visual C++ 2010)';
1.1.1.4 ! misho      49: VC_VERSIONS[1700] = 'MSVC11 (Visual C++ 2012)';
        !            50: VC_VERSIONS[1800] = 'MSVC12 (Visual C++ 2013)';
1.1       misho      51: 
                     52: var VC_VERSIONS_SHORT = new Array();
                     53: VC_VERSIONS_SHORT[1200] = 'VC6';
                     54: VC_VERSIONS_SHORT[1300] = 'VC7';
                     55: VC_VERSIONS_SHORT[1310] = 'VC7.1';
                     56: VC_VERSIONS_SHORT[1400] = 'VC8';
                     57: VC_VERSIONS_SHORT[1500] = 'VC9';
                     58: VC_VERSIONS_SHORT[1600] = 'VC10';
1.1.1.4 ! misho      59: VC_VERSIONS_SHORT[1700] = 'VC11';
        !            60: VC_VERSIONS_SHORT[1800] = 'VC12';
1.1       misho      61: 
                     62: if (PROGRAM_FILES == null) {
                     63:        PROGRAM_FILES = "C:\\Program Files";
                     64: }
                     65: 
                     66: if (MODE_PHPIZE) {
                     67:        if (!FSO.FileExists("config.w32")) {
                     68:                STDERR.WriteLine("Must be run from the root of the extension source");
                     69:                WScript.Quit(10);
                     70:        }
                     71: } else {
1.1.1.3   misho      72:        if (!FSO.FileExists("README.GIT-RULES")) {
1.1       misho      73:                STDERR.WriteLine("Must be run from the root of the php source");
                     74:                WScript.Quit(10);
                     75:        }
                     76: }
                     77: 
                     78: var CWD = WshShell.CurrentDirectory;
                     79: 
                     80: if (typeof(CWD) == "undefined") {
1.1.1.3   misho      81:        CWD = FSO.GetParentFolderName(FSO.GetAbsolutePathName("README.GIT-RULES"));
1.1       misho      82: }
                     83: 
                     84: /* defaults; we pick up the precise versions from configure.in */
                     85: var PHP_VERSION = 5;
                     86: var PHP_MINOR_VERSION = 0;
                     87: var PHP_RELEASE_VERSION = 0;
                     88: var PHP_EXTRA_VERSION = "";
                     89: var PHP_VERSION_STRING = "5.0.0";
                     90: 
                     91: function get_version_numbers()
                     92: {
                     93:        var cin = file_get_contents("configure.in");
                     94:        
                     95:        if (cin.match(new RegExp("PHP_MAJOR_VERSION=(\\d+)"))) {
                     96:                PHP_VERSION = RegExp.$1;
                     97:        }
                     98:        if (cin.match(new RegExp("PHP_MINOR_VERSION=(\\d+)"))) {
                     99:                PHP_MINOR_VERSION = RegExp.$1;
                    100:        }
                    101:        if (cin.match(new RegExp("PHP_RELEASE_VERSION=(\\d+)"))) {
                    102:                PHP_RELEASE_VERSION = RegExp.$1;
                    103:        }
                    104:        PHP_VERSION_STRING = PHP_VERSION + "." + PHP_MINOR_VERSION + "." + PHP_RELEASE_VERSION;
                    105: 
                    106:        if (cin.match(new RegExp("PHP_EXTRA_VERSION=\"([^\"]+)\""))) {
                    107:                PHP_EXTRA_VERSION = RegExp.$1;
                    108:                if (PHP_EXTRA_VERSION.length) {
                    109:                        PHP_VERSION_STRING += PHP_EXTRA_VERSION;
                    110:                }
                    111:        }
                    112:        DEFINE('PHP_VERSION_STRING', PHP_VERSION_STRING);
                    113: }
                    114: 
                    115: configure_args = new Array();
                    116: configure_subst = WScript.CreateObject("Scripting.Dictionary");
                    117: 
                    118: configure_hdr = WScript.CreateObject("Scripting.Dictionary");
                    119: build_dirs = new Array();
                    120: 
                    121: extension_include_code = "";
                    122: extension_module_ptrs = "";
                    123: 
                    124: if (!MODE_PHPIZE) {
                    125:        get_version_numbers();
                    126: }
                    127: 
                    128: /* execute a command and return the output as a string */
                    129: function execute(command_line)
                    130: {
                    131:        var e = WshShell.Exec(command_line);
                    132:        var ret = "";
                    133: 
                    134:        ret = e.StdOut.ReadAll();
                    135: 
                    136: //STDOUT.WriteLine("command " + command_line);
                    137: //STDOUT.WriteLine(ret);
                    138: 
                    139:        return ret;
                    140: }
                    141: 
                    142: function probe_binary(EXE, what)
                    143: {
                    144:        // tricky escapes to get stderr redirection to work
                    145:        var command = 'cmd /c ""' + EXE;
                    146:        if (what == "version") {
                    147:                command = command + '" -v"';
                    148:        }
                    149:        var version = execute(command + '" 2>&1"');
                    150: 
                    151:        if (what == "64") {
                    152:                if (version.match(/x64/)) {
                    153:                        return 1;
                    154:                }
                    155:        } else {
                    156:                if (version.match(/(\d+\.\d+(\.\d+)?(\.\d+)?)/)) {
                    157:                        return RegExp.$1;
                    158:                }
                    159:        }
                    160:        return 0;
                    161: }
                    162: 
                    163: function condense_path(path)
                    164: {
                    165:        path = FSO.GetAbsolutePathName(path);
                    166: 
                    167:        if (path.substr(0, CWD.length).toLowerCase()
                    168:                        == CWD.toLowerCase() &&
                    169:                        (path.charCodeAt(CWD.length) == 92 || path.charCodeAt(CWD.length) == 47)) {
                    170:                return path.substr(CWD.length + 1);
                    171:        }
                    172: 
                    173:        var a = CWD.split("\\");
                    174:        var b = path.split("\\");
                    175:        var i, j;
                    176: 
                    177:        for (i = 0; i < b.length; i++) {
                    178:                if (a[i].toLowerCase() == b[i].toLowerCase())
                    179:                        continue;
                    180:                if (i > 0) {
                    181:                        /* first difference found */
                    182:                        path = "";
                    183:                        for (j = 0; j < a.length - i; j++) {
                    184:                                path += "..\\";
                    185:                        }
                    186:                        for (j = i; j < b.length; j++) {
                    187:                                path += b[j];
                    188:                                if (j < b.length - 1)
                    189:                                        path += "\\";
                    190:                        }
                    191:                        return path;
                    192:                }
                    193:                /* on a different drive */
                    194:                break;
                    195:        }
                    196:        
                    197:        return path;
                    198: }
                    199: 
                    200: function ConfigureArg(type, optname, helptext, defval)
                    201: {
                    202:        var opptype = type == "enable" ? "disable" : "without";
                    203: 
                    204:        if (defval == "yes" || defval == "yes,shared") {
                    205:                this.arg = "--" + opptype + "-" + optname;
                    206:                this.imparg = "--" + type + "-" + optname;
                    207:        } else {
                    208:                this.arg = "--" + type + "-" + optname;
                    209:                this.imparg = "--" + opptype + "-" + optname;
                    210:        }
                    211:        
                    212:        this.optname = optname;
                    213:        this.helptext = helptext;
                    214:        this.defval = defval;
                    215:        this.symval = optname.toUpperCase().replace(new RegExp("-", "g"), "_");
                    216:        this.seen = false;
                    217:        this.argval = defval;
                    218: }
                    219: 
                    220: function ARG_WITH(optname, helptext, defval)
                    221: {
                    222:        configure_args[configure_args.length] = new ConfigureArg("with", optname, helptext, defval);
                    223: }
                    224: 
                    225: function ARG_ENABLE(optname, helptext, defval)
                    226: {
                    227:        configure_args[configure_args.length] = new ConfigureArg("enable", optname, helptext, defval);
                    228: }
                    229: 
                    230: function analyze_arg(argval)
                    231: {
                    232:        var ret = new Array();
                    233:        var shared = false;
                    234: 
                    235:        if (argval == "shared") {
                    236:                shared = true;
                    237:                argval = "yes";
                    238:        } else if (argval == null) {
                    239:                /* nothing */
                    240:        } else if (arg_match = argval.match(new RegExp("^shared,(.*)"))) {
                    241:                shared = true;
                    242:                argval = arg_match[1];
                    243:        } else if (arg_match = argval.match(new RegExp("^(.*),shared$"))) {
                    244:                shared = true;
                    245:                argval = arg_match[1];
                    246:        }
                    247: 
                    248:        ret[0] = shared;
                    249:        ret[1] = argval;
                    250:        return ret;
                    251: }
                    252: 
                    253: function word_wrap_and_indent(indent, text, line_suffix, indent_char)
                    254: {
                    255:        if (text == null) {
                    256:                return "";
                    257:        }
                    258:        
                    259:        var words = text.split(new RegExp("\\s+", "g"));
                    260:        var i = 0;
                    261:        var ret_text = "";
                    262:        var this_line = "";
                    263:        var t;
                    264:        var space = "";
                    265:        var lines = 0;
                    266: 
                    267:        if (line_suffix == null) {
                    268:                line_suffix = "";
                    269:        }
                    270: 
                    271:        if (indent_char == null) {
                    272:                indent_char = " ";
                    273:        }
                    274: 
                    275:        for (i = 0; i < indent; i++) {
                    276:                space += indent_char;
                    277:        }
                    278:        
                    279:        for (i = 0; i < words.length; i++) {
                    280:                if (this_line.length) {
                    281:                        t = this_line + " " + words[i];
                    282:                } else {
                    283:                        t = words[i];
                    284:                }
                    285: 
                    286:                if (t.length + indent > 78) {
                    287:                        if (lines++) {
                    288:                                ret_text += space;
                    289:                        }
                    290:                        ret_text += this_line + line_suffix + "\r\n";
                    291:                        this_line = "";
                    292:                }
                    293: 
                    294:                if (this_line.length) {
                    295:                        this_line += " " + words[i];
                    296:                } else {
                    297:                        this_line = words[i];
                    298:                }
                    299:        }
                    300: 
                    301:        if (this_line.length) {
                    302:                if (lines)
                    303:                        ret_text += space;
                    304:                ret_text += this_line;
                    305:        }
                    306: 
                    307:        return ret_text;
                    308: }
                    309: 
                    310: function conf_process_args()
                    311: {
                    312:        var i, j;
                    313:        var configure_help_mode = false;
                    314:        var analyzed = false;
                    315:        var nice = "cscript /nologo configure.js ";
                    316:        var disable_all = false;
                    317:        
                    318:        args = WScript.Arguments;
                    319:        for (i = 0; i < args.length; i++) {
                    320:                arg = args(i);
                    321:                nice += ' "' + arg + '"';
                    322:                if (arg == "--help") {
                    323:                        configure_help_mode = true;
                    324:                        break;
                    325:                }
                    326:                if (arg == "--disable-all") {
                    327:                        disable_all = true;
                    328:                        continue;
                    329:                }
                    330: 
                    331:                // If it is --foo=bar, split on the equals sign
                    332:                arg = arg.split("=", 2);
                    333:                argname = arg[0];
                    334:                if (arg.length > 1) {
                    335:                        argval = arg[1];
                    336:                } else {
                    337:                        argval = null;
                    338:                }
                    339: 
                    340:                // Find the arg
                    341:                found = false;
                    342:                for (j = 0; j < configure_args.length; j++) {
                    343:                        if (argname == configure_args[j].imparg || argname == configure_args[j].arg) {
                    344:                                found = true;
                    345: 
                    346:                                arg = configure_args[j];
                    347:                                arg.seen = true;
                    348: 
                    349:                                analyzed = analyze_arg(argval);
                    350: 
                    351:                                /* Force shared when called after phpize */
                    352:                                if (MODE_PHPIZE) {
                    353:                                        shared = "shared";
                    354:                                } else {
                    355:                                        shared = analyzed[0];
                    356:                                }
                    357:                                argval = analyzed[1];
                    358: 
                    359:                                if (argname == arg.imparg) {
                    360:                                        /* we matched the implicit, or default arg */
                    361:                                        if (argval == null) {
                    362:                                                argval = arg.defval;
                    363:                                        }
                    364:                                } else {
                    365:                                        /* we matched the non-default arg */
                    366:                                        if (argval == null) {
                    367:                                                argval = arg.defval == "no" ? "yes" : "no";
                    368:                                        }
                    369:                                }
                    370:                                
                    371:                                arg.argval = argval;
                    372:                                eval("PHP_" + arg.symval + " = argval;");
                    373:                                eval("PHP_" + arg.symval + "_SHARED = shared;");
                    374:                                break;
                    375:                        }
                    376:                }
                    377:                if (!found) {
                    378:                        STDERR.WriteLine("Unknown option " + argname + "; please try configure.js --help for a list of valid options");
                    379:                        WScript.Quit(2);
                    380:                }
                    381:        }
                    382: 
                    383:        if (configure_help_mode) {
                    384:                STDOUT.WriteLine(word_wrap_and_indent(0,
                    385: "Options that enable extensions and SAPI will accept \
                    386: 'yes' or 'no' as a parameter.  They also accept 'shared' \
                    387: as a synonym for 'yes' and request a shared build of that \
                    388: module.  Not all modules can be built as shared modules; \
                    389: configure will display [shared] after the module name if \
                    390: can be built that way. \
                    391: "
                    392:                        ));
                    393:                STDOUT.WriteBlankLines(1);
                    394: 
                    395:                // Measure width to pretty-print the output
                    396:                max_width = 0;
                    397:                for (i = 0; i < configure_args.length; i++) {
                    398:                        arg = configure_args[i];
                    399:                        if (arg.arg.length > max_width)
                    400:                                max_width = arg.arg.length;
                    401:                }
                    402: 
                    403:                for (i = 0; i < configure_args.length; i++) {
                    404:                        arg = configure_args[i];
                    405: 
                    406:                        n = max_width - arg.arg.length;
                    407:                        pad = "   ";
                    408:                        for (j = 0; j < n; j++) {
                    409:                                pad += " ";
                    410:                        }
                    411:                        STDOUT.WriteLine("  " + arg.arg + pad + word_wrap_and_indent(max_width + 5, arg.helptext));
                    412:                }
                    413:                WScript.Quit(1);
                    414:        }
                    415: 
                    416:        var snapshot_build_exclusions = new Array(
                    417:                'debug', 'crt-debug', 'lzf-better-compression',
                    418:                 'php-build', 'snapshot-template', 'ereg',
                    419:                 'pcre-regex', 'fastcgi', 'force-cgi-redirect',
                    420:                 'path-info-check', 'zts', 'ipv6', 'memory-limit',
1.1.1.2   misho     421:                 'zend-multibyte', 'fd-setsize', 'memory-manager',
                    422:                 't1lib', 'pgi', 'pgo'
1.1       misho     423:                );
                    424:        var force;
                    425: 
                    426:        // Now set any defaults we might have missed out earlier
                    427:        for (i = 0; i < configure_args.length; i++) {
                    428:                arg = configure_args[i];
                    429:                if (arg.seen)
                    430:                        continue;
                    431:                analyzed = analyze_arg(arg.defval);
                    432:                shared = analyzed[0];
                    433:                argval = analyzed[1];
                    434:                
                    435:                // Don't trust a default "yes" answer for a non-core module
                    436:                // in a snapshot build
                    437:                if (PHP_SNAPSHOT_BUILD != "no" && argval == "yes" && !shared) {
                    438: 
                    439:                        force = true;
                    440:                        for (j = 0; j < snapshot_build_exclusions.length; j++) {
                    441:                                if (snapshot_build_exclusions[j] == arg.optname) {
                    442:                                        force = false;
                    443:                                        break;
                    444:                                }
                    445:                        }
                    446: 
                    447:                        if (force) {
                    448:                                /* now check if it is a core module */
                    449:                                force = false;
                    450:                                for (j = 0; j < core_module_list.length; j++) {
                    451:                                        if (core_module_list[j] == arg.optname) {
                    452:                                                force = true;
                    453:                                                break;
                    454:                                        }
                    455:                                }
                    456: 
                    457:                                if (!force) {
                    458:                                        STDOUT.WriteLine("snapshot: forcing " + arg.arg + " shared");
                    459:                                        shared = true;
                    460:                                }
                    461:                        }
                    462:                }
                    463:                
                    464:                if (PHP_SNAPSHOT_BUILD != "no" && argval == "no") {
                    465:                        force = true;
                    466:                        for (j = 0; j < snapshot_build_exclusions.length; j++) {
                    467:                                if (snapshot_build_exclusions[j] == arg.optname) {
                    468:                                        force = false;
                    469:                                        break;
                    470:                                }
                    471:                        }
                    472:                        if (force) {
                    473:                                STDOUT.WriteLine("snapshot: forcing " + arg.optname + " on");
                    474:                                argval = "yes";
                    475:                                shared = true;
                    476:                        }
                    477:                }
                    478: 
                    479:                if (disable_all) {
                    480:                        force = true;
                    481:                        for (j = 0; j < snapshot_build_exclusions.length; j++) {
                    482:                                if (snapshot_build_exclusions[j] == arg.optname) {
                    483:                                        force = false;
                    484:                                        break;
                    485:                                }
                    486:                        }
                    487:                        if (force) {
                    488:                                if (arg.defval == '') {
                    489:                                        argval = '';
                    490:                                } else {
                    491:                                        argval = "no";
                    492:                                }
                    493:                                shared = false;
                    494:                        }
                    495:                }
                    496: 
                    497:                eval("PHP_" + arg.symval + " = argval;");
                    498:                eval("PHP_" + arg.symval + "_SHARED = shared;");
                    499:        }
                    500: 
                    501:        MFO = FSO.CreateTextFile("Makefile.objects", true);
                    502: 
                    503:        STDOUT.WriteLine("Saving configure options to config.nice.bat");
                    504:        var nicefile = FSO.CreateTextFile("config.nice.bat", true);
                    505:        nicefile.WriteLine(nice +  " %*");
                    506:        nicefile.Close();
                    507: 
                    508:        AC_DEFINE('CONFIGURE_COMMAND', nice, "Configure line");
                    509: }
                    510: 
                    511: function DEFINE(name, value)
                    512: {
                    513:        if (configure_subst.Exists(name)) {
                    514:                configure_subst.Remove(name);
                    515:        }
                    516:        configure_subst.Add(name, value);
                    517: }
                    518: 
                    519: // Searches a set of paths for a file;
                    520: // returns the dir in which the file was found,
                    521: // true if it was found in the default env path,
                    522: // or false if it was not found at all.
                    523: // env_name is the optional name of an env var
                    524: // specifying the default path to search
                    525: function search_paths(thing_to_find, explicit_path, env_name)
                    526: {
                    527:        var i, found = false, place = false, file, env;
                    528: 
                    529:        STDOUT.Write("Checking for " + thing_to_find + " ... ");
                    530: 
                    531:        thing_to_find = thing_to_find.replace(new RegExp("/", "g"), "\\");
                    532: 
                    533:        if (explicit_path != null) {
                    534:                if (typeof(explicit_path) == "string") {
                    535:                        explicit_path = explicit_path.split(";");
                    536:                }
                    537: 
                    538:                for (i = 0; i < explicit_path.length; i++) {
                    539:                        file = glob(explicit_path[i] + "\\" + thing_to_find);
                    540:                        if (file) {
                    541:                                found = true;
                    542:                                place = file[0];
                    543:                                place = place.substr(0, place.length - thing_to_find.length - 1);
                    544:                                break;
                    545:                        }
                    546:                }
                    547:        }
                    548: 
                    549:        if (!found && env_name != null) {
                    550:                env = WshShell.Environment("Process").Item(env_name);
                    551:                env = env.split(";");
                    552:                for (i = 0; i < env.length; i++) {
                    553:                        file = glob(env[i] + "\\" + thing_to_find);
                    554:                        if (file) {
                    555:                                found = true;
                    556:                                place = true;
                    557:                                break;
                    558:                        }
                    559:                }
                    560:        }
                    561: 
                    562:        if (found && place == true) {
                    563:                STDOUT.WriteLine(" <in default path>");
                    564:        } else if (found) {
                    565:                STDOUT.WriteLine(" " + place);
                    566:        } else {
                    567:                STDOUT.WriteLine(" <not found>");
                    568:        }
                    569:        return place;
                    570: }
                    571: 
                    572: function PATH_PROG(progname, additional_paths, symbol)
                    573: {
                    574:        var exe;
                    575:        var place;
                    576:        var cyg_path = PHP_CYGWIN + "\\bin;" + PHP_CYGWIN + "\\usr\\local\\bin";
                    577:        var php_build_bin_path = PHP_PHP_BUILD + "\\bin"
                    578: 
                    579:        exe = progname + ".exe";
                    580: 
                    581:        if (additional_paths == null) {
                    582:                additional_paths = cyg_path;
                    583:        } else {
                    584:                additional_paths += ";" + cyg_path;
                    585:        }
                    586: 
                    587:        additional_paths = additional_paths + ";" + php_build_bin_path;
                    588: 
                    589:        place = search_paths(exe, additional_paths, "PATH");
                    590: 
                    591:        if (place == true) {
                    592:                place = exe;
                    593:        } else if (place != false) {
                    594:                place = place + "\\" + exe;
                    595:        }
                    596: 
                    597:        if (place) {
                    598:                if (symbol == null) {
                    599:                        symbol = progname.toUpperCase();
                    600:                }
                    601:                DEFINE(symbol, place);
                    602:        }
                    603:        return place;
                    604: }
                    605: 
                    606: function find_pattern_in_path(pattern, path)
                    607: {
                    608:        if (path == null) {
                    609:                return false;
                    610:        }
                    611: 
                    612:        var dirs = path.split(';');
                    613:        var i;
                    614:        var items;
                    615: 
                    616:        for (i = 0; i < dirs.length; i++) {
                    617:                items = glob(dirs[i] + "\\" + pattern);
                    618:                if (items) {
                    619:                        return condense_path(items[0]);
                    620:                }
                    621:        }
                    622:        return false;
                    623: }
                    624: 
                    625: function CHECK_LIB(libnames, target, path_to_check, common_name)
                    626: {
                    627:        STDOUT.Write("Checking for library " + libnames + " ... ");
                    628: 
                    629:        if (common_name == null && target != null) {
                    630:                common_name = target;
                    631:        }
                    632: 
                    633:        if (path_to_check == null) {
                    634:                path_to_check = "";
                    635:        }
                    636: 
                    637:        // if they specified a common name for the package that contains
                    638:        // the library, tag some useful defaults on to the end of the
                    639:        // path to be searched
                    640:        if (common_name != null) {
                    641:                path_to_check += ";" + PHP_PHP_BUILD + "\\" + common_name + "*";
                    642:                path_to_check += ";" + PHP_PHP_BUILD + "\\lib\\" + common_name + "*";
                    643:                path_to_check += ";..\\" + common_name + "*";
                    644:        }
                    645: 
                    646:        // Determine target for build flags
                    647:        if (target == null) {
                    648:                target = "";
                    649:        } else {
                    650:                target = "_" + target.toUpperCase();
                    651:        }
                    652: 
                    653:        // Expand path to include general dirs
                    654:        path_to_check += ";" + php_usual_lib_suspects;
                    655: 
                    656:        // It is common practice to put libs under one of these dir names
                    657:        var subdirs = new Array(PHP_DEBUG == "yes" ? "Debug" : (PHP_DEBUG_PACK == "yes"?"Release_Dbg":"Release"), "lib", "libs", "libexec");
                    658: 
                    659:        // libnames can be ; separated list of accepted library names
                    660:        libnames = libnames.split(';');
                    661: 
                    662:        // for debug builds, lib may have _debug appended, we want that first
                    663:        if (PHP_DEBUG == "yes") {
                    664:                var length = libnames.length;
                    665:                for (var i = 0; i < length; i++) {
                    666:                        var name = new String(libnames[i]);
                    667:                        rExp = /.lib$/i;
                    668:                        name = name.replace(rExp,"_debug.lib");
                    669:                        libnames.unshift(name);
                    670:                }
                    671:        }
                    672: 
                    673:        var i, j, k, libname;
                    674:        var location = false;
                    675:        var path = path_to_check.split(';');
                    676:        
                    677:        for (i = 0; i < libnames.length; i++) {
                    678:                libname = libnames[i];
                    679: 
                    680:                for (k = 0; k < path.length; k++) {
                    681:                        location = glob(path[k] + "\\" + libname);
                    682:                        if (location) {
                    683:                                location = location[0];
                    684:                                break;
                    685:                        }
                    686:                        for (j = 0; j < subdirs.length; j++) {
                    687:                                location = glob(path[k] + "\\" + subdirs[j] + "\\" + libname);
                    688:                                if (location) {
                    689:                                        location = location[0];
                    690:                                        break;
                    691:                                }
                    692:                        }
                    693:                        if (location)
                    694:                                break;
                    695:                }
                    696: 
                    697:                if (location) {
                    698:                        location = condense_path(location);
                    699:                        var libdir = FSO.GetParentFolderName(location);
                    700:                        libname = FSO.GetFileName(location);
                    701:                        ADD_FLAG("LDFLAGS" + target, '/libpath:"' + libdir + '" ');
                    702:                        ADD_FLAG("LIBS" + target, libname);
                    703: 
                    704:                        STDOUT.WriteLine(location);
                    705: 
                    706:                        return location;
                    707:                }
                    708: 
                    709:                // Check in their standard lib path
                    710:                location = find_pattern_in_path(libname, WshShell.Environment("Process").Item("LIB"));
                    711: 
                    712:                if (location) {
                    713:                        location = condense_path(location);
                    714:                        libname = FSO.GetFileName(location);
                    715:                        ADD_FLAG("LIBS" + target, libname);
                    716: 
                    717:                        STDOUT.WriteLine("<in LIB path> " + libname);
                    718:                        return location;
                    719:                }
                    720: 
                    721:                // Check in their general extra libs path
                    722:                location = find_pattern_in_path(libname, PHP_EXTRA_LIBS);
                    723:                if (location) {
                    724:                        location = condense_path(location);
                    725:                        libname = FSO.GetFileName(location);
                    726:                        ADD_FLAG("LIBS" + target, libname);
                    727:                        STDOUT.WriteLine("<in extra libs path>");
                    728:                        return location;
                    729:                }
                    730:        }
                    731: 
                    732:        STDOUT.WriteLine("<not found>");
                    733: 
                    734:        return false;
                    735: }
                    736: 
                    737: function OLD_CHECK_LIB(libnames, target, path_to_check)
                    738: {
                    739:        if (target == null) {
                    740:                target = "";
                    741:        } else {
                    742:                target = "_" + target.toUpperCase();
                    743:        }
                    744:        
                    745:        if (path_to_check == null) {
                    746:                path_to_check = php_usual_lib_suspects;
                    747:        } else {
                    748:                path_to_check += ";" + php_usual_lib_suspects;
                    749:        }
                    750:        var have = 0;
                    751:        var p;
                    752:        var i;
                    753:        var libname;
                    754: 
                    755:        var subdir = PHP_DEBUG == "yes" ? "Debug" : (PHP_DEBUG_PACK == "yes"?"Release_Dbg":"Release");
                    756: 
                    757:        libnames = libnames.split(';');
                    758:        for (i = 0; i < libnames.length; i++) {
                    759:                libname = libnames[i];
                    760:                p = search_paths(libname, path_to_check, "LIB");
                    761: 
                    762:                if (!p) {
                    763:                        p = search_paths(subdir + "\\" + libname, path_to_check, "LIB");
                    764:                        if (p) {
                    765:                                p += "\\" + subdir;
                    766:                        }
                    767:                }
                    768: 
                    769:                if (typeof(p) == "string") {
                    770:                        ADD_FLAG("LDFLAGS" + target, '/libpath:"' + p + '" ');
                    771:                        ADD_FLAG("LIBS" + target, libname);
                    772:                        have = 1;
                    773:                } else if (p == true) {
                    774:                        ADD_FLAG("LIBS" + target, libname);
                    775:                        have = 1;
                    776:                } else {
                    777:                        /* not found in the defaults or the explicit paths,
                    778:                         * so check the general extra libs; if we find
                    779:                         * it here, no need to add another /libpath: for it as we
                    780:                         * already have it covered, but we need to add the lib
                    781:                         * to LIBS_XXX */
                    782:                        if (false != search_paths(libname, PHP_EXTRA_LIBS, null)) {
                    783:                                ADD_FLAG("LIBS" + target, libname);
                    784:                                have = 1;
                    785:                        }
                    786:                }
                    787: 
                    788:                if (have) {
                    789:                        break;
                    790:                }
                    791:        }
                    792: 
                    793: //     AC_DEFINE("HAVE_" + header_name.toUpperCase().replace(new RegExp("/\\\\-\.", "g"), "_"), have);
                    794: 
                    795:        return have;
                    796: 
                    797: }
                    798: 
                    799: function CHECK_FUNC_IN_HEADER(header_name, func_name, path_to_check, add_to_flag)
                    800: {
                    801:        var c = false;
                    802:        var sym;
                    803: 
                    804:        STDOUT.Write("Checking for " + func_name + " in " + header_name + " ... ");
                    805: 
                    806:        c = GREP_HEADER(header_name, func_name, path_to_check);
                    807: 
                    808:        sym = func_name.toUpperCase();
                    809:        sym = sym.replace(new RegExp("[\\\\/\.-]", "g"), "_");
                    810: 
                    811:        if (typeof(add_to_flag) == "undefined") {
                    812:                AC_DEFINE("HAVE_" + sym, c ? 1 : 0);
                    813:        } else {
                    814:                ADD_FLAG(add_to_flag, "/DHAVE_" + sym + "=" + (c ? "1" : "0"));
                    815:        }
                    816: 
                    817:        if (c) {
                    818:                STDOUT.WriteLine("OK");
                    819:                return c;
                    820:        }
                    821:        STDOUT.WriteLine("No");
                    822:        return false;   
                    823: }
                    824: 
                    825: function GREP_HEADER(header_name, regex, path_to_check)
                    826: {
                    827:        var c = false;
                    828: 
                    829:        if (FSO.FileExists(path_to_check + "\\" + header_name)) {
                    830:                c = file_get_contents(path_to_check + "\\" + header_name);
                    831:        }
                    832: 
                    833:        if (!c) {
                    834:                /* look in the include path */
                    835: 
                    836:                var p = search_paths(header_name, path_to_check, "INCLUDE");
                    837:                if (typeof(p) == "string") {
                    838:                        c = file_get_contents(p);
                    839:                } else if (p == false) {
                    840:                        p = search_paths(header_name, PHP_EXTRA_INCLUDES, null);
                    841:                        if (typeof(p) == "string") {
                    842:                                c = file_get_contents(p);
                    843:                        }
                    844:                } 
                    845:                if (!c) {
                    846:                        return false;
                    847:                }
                    848:        }
                    849: 
                    850:        if (typeof(regex) == "string") {
                    851:                regex = new RegExp(regex);
                    852:        }
                    853: 
                    854:        if (c.match(regex)) {
                    855:                /* caller can now use RegExp.$1 etc. to get at patterns */
                    856:                return true;
                    857:        }
                    858:        return false;
                    859: }
                    860: 
                    861: function CHECK_HEADER_ADD_INCLUDE(header_name, flag_name, path_to_check, use_env, add_dir_part, add_to_flag_only)
                    862: {
                    863:        var dir_part_to_add = "";
                    864:        
                    865:        if (use_env == null) {
                    866:                use_env = true;
                    867:        }
                    868: 
                    869:        // if true, add the dir part of the header_name to the include path
                    870:        if (add_dir_part == null) {
                    871:                add_dir_part = false;
                    872:        } else if (add_dir_part) {
                    873:                var basename = FSO.GetFileName(header_name);
                    874:                dir_part_to_add = "\\" + header_name.substr(0, header_name.length - basename.length - 1);
                    875:        }
                    876: 
                    877:        if (path_to_check == null) {
                    878:                path_to_check = php_usual_include_suspects;
                    879:        } else {
                    880:                path_to_check += ";" + php_usual_include_suspects;
                    881:        }
                    882:        
                    883:        var p = search_paths(header_name, path_to_check, use_env ? "INCLUDE" : null);
                    884:        var have = 0;
                    885:        var sym;
                    886: 
                    887:        if (typeof(p) == "string") {
                    888:                ADD_FLAG(flag_name, '/I "' + p + dir_part_to_add + '" ');
                    889:        } else if (p == false) {
                    890:                /* not found in the defaults or the explicit paths,
                    891:                 * so check the general extra includes; if we find
                    892:                 * it here, no need to add another /I for it as we
                    893:                 * already have it covered, unless we are adding
                    894:                 * the dir part.... */
                    895:                p = search_paths(header_name, PHP_EXTRA_INCLUDES, null);
                    896:                if (typeof(p) == "string" && add_dir_part) {
                    897:                        ADD_FLAG(flag_name, '/I "' + p + dir_part_to_add + '" ');
                    898:                }
                    899:        } 
                    900:        have = p ? 1 : 0
                    901: 
                    902:        sym = header_name.toUpperCase();
                    903:        sym = sym.replace(new RegExp("[\\\\/\.-]", "g"), "_");
                    904: 
                    905:        if (typeof(add_to_flag_only) == "undefined" &&
                    906:                        flag_name.match(new RegExp("^CFLAGS_(.*)$"))) {
                    907:                add_to_flag_only = true;
                    908:        }
                    909: 
                    910:        if (typeof(add_to_flag_only) != "undefined") {
                    911:                ADD_FLAG(flag_name, "/DHAVE_" + sym + "=" + have);
                    912:        } else {
                    913:                AC_DEFINE("HAVE_" + sym, have, "have the " + header_name + " header file");
                    914:        }
                    915: 
                    916:        return p;
                    917: }
                    918: 
                    919: /* emits rule to generate version info for a SAPI
                    920:  * or extension.  Returns the name of the .res file
                    921:  * that will be generated */
                    922: function generate_version_info_resource(makefiletarget, basename, creditspath, sapi)
                    923: {
                    924:        var resname = makefiletarget + ".res";
                    925:        var res_desc = makefiletarget;
                    926:        var res_prod_name = "PHP " + makefiletarget;
                    927:        var credits;
                    928:        var thanks = "";
                    929:        var logo = "";
                    930:        var debug = "";
                    931:        var project_url = "http://www.php.net";
                    932:        var project_header = creditspath + "/php_" + basename + ".h";
                    933:        var versioning = "";
                    934: 
                    935:        if (sapi) {
                    936:                var internal_name = basename.toUpperCase() + " SAPI";
                    937:        } else {
                    938:                var internal_name = basename.toUpperCase() + " extension";
                    939:        }
                    940: 
                    941:        if (FSO.FileExists(creditspath + '/CREDITS')) {
                    942:                credits = FSO.OpenTextFile(creditspath + '/CREDITS', 1);
                    943:                res_desc = credits.ReadLine();
                    944:                try {
                    945:                        thanks = credits.ReadLine();
                    946:                } catch (e) {
                    947:                        thanks = null;
                    948:                }
                    949:                if (thanks == null) {
                    950:                        thanks = "";
                    951:                } else {
                    952:                        thanks = "Thanks to " + thanks;
                    953:                }
                    954:                credits.Close();
                    955:        }
                    956: 
                    957:        if (creditspath.match(new RegExp("pecl"))) {
                    958:                /* PECL project url - this will eventually work correctly for all */
                    959:                project_url = "http://pecl.php.net/" + basename;
                    960: 
                    961:                /* keep independent versioning PECL-specific for now */
                    962:                if (FSO.FileExists(project_header)) {
                    963:                        if (header = FSO.OpenTextFile(project_header, 1)) {
                    964:                                contents = header.ReadAll();
                    965:                                /* allowed: x.x.x[a|b|-alpha|-beta][RCx][-dev] */
                    966:                                if (contents.match(new RegExp('PHP_' + basename.toUpperCase() + '_VERSION(\\s+)"((\\d+\.\\d+(\.\\d+)?)((a|b)(\\d)?|\-[a-z]{3,5})?(RC\\d+)?(\-dev)?)'))) {
                    967:                                        project_version = RegExp.$2;
                    968:                                        file_version = RegExp.$3.split('.');
                    969:                                        if (!file_version[2]) {
                    970:                                                file_version[2] = 0;
                    971:                                        }
                    972:                                        versioning = '\\"" /d EXT_FILE_VERSION=' + file_version[0] + ',' + file_version[1] + ',' + file_version[2] + ' /d EXT_VERSION="\\"' + project_version;
                    973:                                }
                    974:                                header.Close();
                    975:                        }
                    976:                }
                    977:        }
                    978: 
                    979:        if (makefiletarget.match(new RegExp("\\.exe$"))) {
                    980:                logo = " /d WANT_LOGO ";
                    981:        }
                    982: 
                    983:        if (PHP_DEBUG != "no") {
                    984:                debug = " /d _DEBUG";
                    985:        }
                    986: 
                    987:        /**
                    988:         * Use user supplied template.rc if it exists
                    989:         */
                    990:        if (FSO.FileExists(creditspath + '\\template.rc')) {
                    991:                MFO.WriteLine("$(BUILD_DIR)\\" + resname + ": " + creditspath + "\\template.rc");
                    992:                MFO.WriteLine("\t$(RC) /fo $(BUILD_DIR)\\" + resname + logo + debug +
                    993:                        ' /d FILE_DESCRIPTION="\\"' + res_desc + '\\"" /d FILE_NAME="\\"' +
                    994:                        makefiletarget + '\\"" /d PRODUCT_NAME="\\"' + res_prod_name +
                    995:                        versioning + '\\"" /d THANKS_GUYS="\\"' + thanks + '\\"" ' +
                    996:                        creditspath + '\\template.rc');
                    997:                return resname;
                    998:        }
                    999:        if (MODE_PHPIZE) {
                   1000:                MFO.WriteLine("$(BUILD_DIR)\\" + resname + ": $(PHP_DIR)\\build\\template.rc");
                   1001:                MFO.WriteLine("\t$(RC)  /I $(PHP_DIR)/include /n /fo $(BUILD_DIR)\\" + resname + logo + debug +
                   1002:                        ' /d FILE_DESCRIPTION="\\"' + res_desc + '\\"" /d FILE_NAME="\\"'
                   1003:                        + makefiletarget + '\\"" /d URL="\\"' + project_url + 
                   1004:                        '\\"" /d INTERNAL_NAME="\\"' + internal_name + versioning + 
                   1005:                        '\\"" /d THANKS_GUYS="\\"' + thanks + '\\"" $(PHP_DIR)\\build\\template.rc');
                   1006:        } else {
                   1007:                MFO.WriteLine("$(BUILD_DIR)\\" + resname + ": win32\\build\\template.rc");
                   1008:                MFO.WriteLine("\t$(RC) /n /fo $(BUILD_DIR)\\" + resname + logo + debug +
                   1009:                        ' /d FILE_DESCRIPTION="\\"' + res_desc + '\\"" /d FILE_NAME="\\"'
                   1010:                        + makefiletarget + '\\"" /d URL="\\"' + project_url + 
                   1011:                        '\\"" /d INTERNAL_NAME="\\"' + internal_name + versioning + 
                   1012:                        '\\"" /d THANKS_GUYS="\\"' + thanks + '\\"" win32\\build\\template.rc');
                   1013:        }
                   1014:        MFO.WriteBlankLines(1);
                   1015:        return resname;
                   1016: }
                   1017: 
1.1.1.4 ! misho    1018: /* Check if PGO is enabled for given module. To disable PGO for a particular module,
        !          1019: define a global variable by the following name scheme before SAPI() or EXTENSION() call
        !          1020:        var PHP_MYMODULE_PGO = false; */
        !          1021: function is_pgo_desired(mod)
        !          1022: {
        !          1023:        var varname = "PHP_" + mod.toUpperCase() + "_PGO";
        !          1024: 
        !          1025:        /* don't disable if there's no mention of the varname */
        !          1026:        if (eval("typeof " + varname + " == 'undefined'")) {
        !          1027:                return true;
        !          1028:        }
        !          1029: 
        !          1030:        return eval("!!" + varname);
        !          1031: }
        !          1032: 
1.1       misho    1033: function SAPI(sapiname, file_list, makefiletarget, cflags, obj_dir)
                   1034: {
                   1035:        var SAPI = sapiname.toUpperCase();
                   1036:        var ldflags;
                   1037:        var resname;
                   1038:        var ld;
                   1039:        var manifest;
                   1040: 
                   1041:        if (typeof(obj_dir) == "undefined") {
                   1042:                sapiname_for_printing = configure_module_dirname;
                   1043:        } else {
                   1044:                sapiname_for_printing = configure_module_dirname + " (via " + obj_dir + ")";
                   1045:        }
                   1046: 
                   1047:        STDOUT.WriteLine("Enabling SAPI " + sapiname_for_printing);
                   1048: 
                   1049:        MFO.WriteBlankLines(1);
                   1050:        MFO.WriteLine("# objects for SAPI " + sapiname);
                   1051:        MFO.WriteBlankLines(1);
                   1052: 
                   1053:        if (cflags) {
                   1054:                ADD_FLAG('CFLAGS_' + SAPI, cflags);
                   1055:        }
                   1056: 
                   1057:        ADD_SOURCES(configure_module_dirname, file_list, sapiname, obj_dir);
                   1058:        MFO.WriteBlankLines(1);
                   1059:        MFO.WriteLine("# SAPI " + sapiname);
                   1060:        MFO.WriteBlankLines(1);
                   1061: 
                   1062:        /* generate a .res file containing version information */
                   1063:        resname = generate_version_info_resource(makefiletarget, sapiname, configure_module_dirname, true);
                   1064:        
                   1065:        MFO.WriteLine(makefiletarget + ": $(BUILD_DIR)\\" + makefiletarget);
                   1066:        MFO.WriteLine("\t@echo SAPI " + sapiname_for_printing + " build complete");
                   1067:        if (MODE_PHPIZE) {
                   1068:                MFO.WriteLine("$(BUILD_DIR)\\" + makefiletarget + ": $(DEPS_" + SAPI + ") $(" + SAPI + "_GLOBAL_OBJS) $(PHPLIB) $(BUILD_DIR)\\" + resname);
                   1069:        } else {
                   1070:                MFO.WriteLine("$(BUILD_DIR)\\" + makefiletarget + ": $(DEPS_" + SAPI + ") $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(BUILD_DIR)\\" + resname);
                   1071:        }
                   1072: 
                   1073:        if (makefiletarget.match(new RegExp("\\.dll$"))) {
                   1074:                ldflags = "/dll $(LDFLAGS)";
                   1075:                manifest = "-@$(_VC_MANIFEST_EMBED_DLL)";
                   1076:        } else if (makefiletarget.match(new RegExp("\\.lib$"))) {
                   1077:                ldflags = "$(LDFLAGS)";
                   1078:                ld = "$(MAKE_LIB)";
                   1079:        } else {
                   1080:                ldflags = "$(LDFLAGS)";
                   1081:                manifest = "-@$(_VC_MANIFEST_EMBED_EXE)";
                   1082:        }
1.1.1.2   misho    1083:        
1.1.1.4 ! misho    1084:        if(is_pgo_desired(sapiname) && (PHP_PGI == "yes" || PHP_PGO != "no")) {
        !          1085:                // Add compiler and link flags if PGO options are selected
        !          1086:                if (PHP_DEBUG != "yes" && PHP_PGI == "yes") {
        !          1087:                        ADD_FLAG('CFLAGS_' + SAPI, "/GL /O2");
        !          1088:                        ADD_FLAG('LDFLAGS_' + SAPI, "/LTCG:PGINSTRUMENT");
        !          1089:                }
        !          1090:                else if (PHP_DEBUG != "yes" && PHP_PGO != "no") {
        !          1091:                        ADD_FLAG('CFLAGS_' + SAPI, "/GL /O2");
        !          1092:                        ADD_FLAG('LDFLAGS_' + SAPI, "/LTCG:PGUPDATE");
        !          1093:                }
        !          1094: 
1.1.1.2   misho    1095:                ldflags += " /PGD:$(PGOPGD_DIR)\\" + makefiletarget.substring(0, makefiletarget.indexOf(".")) + ".pgd";
                   1096:        }
1.1       misho    1097: 
                   1098:        if (MODE_PHPIZE) {
                   1099:                if (ld) {
                   1100:                        MFO.WriteLine("\t" + ld + " /nologo /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(" + SAPI + "_GLOBAL_OBJS) $(PHPLIB) $(LDFLAGS_" + SAPI + ") $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname);
                   1101:                } else {
                   1102:                        ld = "@$(CC)";
                   1103:                        MFO.WriteLine("\t" + ld + " /nologo " + " $(" + SAPI + "_GLOBAL_OBJS) $(PHPLIB) $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(LDFLAGS_" + SAPI + ")");
                   1104:                }
                   1105:        } else {
                   1106:                if (ld) {
                   1107:                        MFO.WriteLine("\t" + ld + " /nologo /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LDFLAGS_" + SAPI + ") $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname);
                   1108:                } else {
                   1109:                        ld = "@$(CC)";
                   1110:                        MFO.WriteLine("\t" + ld + " /nologo " + " $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(LDFLAGS_" + SAPI + ")");
                   1111:                }
                   1112:        }
                   1113: 
                   1114:        if (manifest) {
                   1115:                MFO.WriteLine("\t" + manifest);
                   1116:        }
                   1117:                
                   1118:        DEFINE('CFLAGS_' + SAPI + '_OBJ', '$(CFLAGS_' + SAPI + ')');
                   1119: 
                   1120:        if (configure_module_dirname.match("pecl")) {
                   1121:                ADD_FLAG("PECL_TARGETS", makefiletarget);
                   1122:        } else {
                   1123:                ADD_FLAG("SAPI_TARGETS", makefiletarget);
                   1124:        }
                   1125: 
                   1126:        if (PHP_DSP != "no") {
                   1127:                generate_dsp_file(sapiname, configure_module_dirname, file_list, false);
                   1128:        }
                   1129: 
                   1130:        MFO.WriteBlankLines(1);
                   1131:        sapi_enabled[sapi_enabled.length] = [sapiname];
                   1132: }
                   1133: 
                   1134: function ADD_DIST_FILE(filename)
                   1135: {
                   1136:        if (configure_module_dirname.match("pecl")) {
                   1137:                ADD_FLAG("PECL_EXTRA_DIST_FILES", filename);
                   1138:        } else {
                   1139:                ADD_FLAG("PHP_EXTRA_DIST_FILES", filename);
                   1140:        }
                   1141: }      
                   1142: 
                   1143: function file_get_contents(filename)
                   1144: {
                   1145:        var f, c;
                   1146:        try {
                   1147:                f = FSO.OpenTextFile(filename, 1);
                   1148:                c = f.ReadAll();
                   1149:                f.Close();
                   1150:                return c;
                   1151:        } catch (e) {
                   1152:                STDOUT.WriteLine("Problem reading " + filename);
                   1153:                return false;
                   1154:        }
                   1155: }
                   1156: 
                   1157: // Add a dependency on another extension, so that
                   1158: // the dependencies are built before extname
                   1159: function ADD_EXTENSION_DEP(extname, dependson, optional)
                   1160: {
                   1161:        var EXT = extname.toUpperCase();
                   1162:        var DEP = dependson.toUpperCase();
                   1163:        var dep_present = false;
                   1164:        var dep_shared = false;
                   1165: 
                   1166:        if (MODE_PHPIZE) {
                   1167:                ext_deps_js = file_get_contents(PHP_DIR + "\\script\\ext_deps.js");
                   1168:                eval(ext_deps_js);
                   1169:        }
                   1170: 
                   1171:        try {
                   1172:                dep_present = eval("PHP_" + DEP);
                   1173: 
                   1174:                if (dep_present != "no") {
                   1175:                        try {
                   1176:                                dep_shared = eval("PHP_" + DEP + "_SHARED");
                   1177:                        } catch (e) {
                   1178:                                dep_shared = false;
                   1179:                        }
                   1180:                }
                   1181: 
                   1182:        } catch (e) {
                   1183:                dep_present = "no";
                   1184:        }
                   1185: 
                   1186:        if (optional) {
                   1187:                if (dep_present == "no") {
                   1188:                        MESSAGE("\t" + dependson + " not found: " + dependson + " support in " + extname + " disabled");
                   1189:                        return false;
                   1190:                }
                   1191:        }
                   1192: 
                   1193:        var ext_shared = eval("PHP_" + EXT + "_SHARED");
                   1194: 
                   1195:        if (dep_shared) {
                   1196:                if (!ext_shared) {
                   1197:                        if (optional) {
                   1198:                                MESSAGE("\tstatic " + extname + " cannot depend on shared " + dependson + ": " + dependson + "support disabled");
                   1199:                                return false;
                   1200:                        }
                   1201:                        ERROR("static " + extname + " cannot depend on shared " + dependson);
                   1202:                }
                   1203: 
                   1204:                ADD_FLAG("LDFLAGS_" + EXT, "/libpath:$(BUILD_DIR)");
                   1205:                ADD_FLAG("LIBS_" + EXT, "php_" + dependson + ".lib");
                   1206:                ADD_FLAG("DEPS_" + EXT, "$(BUILD_DIR)\\php_" + dependson + ".lib");
                   1207: 
                   1208:        } else {
                   1209: 
                   1210:                if (dep_present == "no") {
                   1211:                        if (ext_shared) {
                   1212:                                WARNING(extname + " cannot be built: missing dependency, " + dependson + " not found");
                   1213: 
                   1214:                                var dllname = ' php_' + extname + '.dll';
                   1215: 
                   1216:                                if (!REMOVE_TARGET(dllname, 'EXT_TARGETS')) {
                   1217:                                        REMOVE_TARGET(dllname, 'PECL_TARGETS');
                   1218:                                }
                   1219: 
                   1220:                                return false;
                   1221: 
                   1222:                        }
                   1223: 
                   1224:                        ERROR("Cannot build " + extname + "; " + dependson + " not enabled");
                   1225:                        return false;
                   1226:                }
                   1227:        } // dependency is statically built-in to PHP
                   1228:        return true;
                   1229: }
                   1230: 
                   1231: function EXTENSION(extname, file_list, shared, cflags, dllname, obj_dir)
                   1232: {
                   1233:        var objs = null;
                   1234:        var EXT = extname.toUpperCase();
                   1235:        var extname_for_printing;
1.1.1.2   misho    1236:        var ldflags;
1.1       misho    1237: 
                   1238:        if (shared == null) {
                   1239:                eval("shared = PHP_" + EXT + "_SHARED;");
                   1240:        } else {
                   1241:                eval("PHP_" + EXT + "_SHARED = shared;");
                   1242:        }
                   1243: 
                   1244:        if (cflags == null) {
                   1245:                cflags = "";
                   1246:        }
                   1247: 
                   1248:        if (typeof(obj_dir) == "undefined") {
                   1249:                extname_for_printing = configure_module_dirname;
                   1250:        } else {
                   1251:                extname_for_printing = configure_module_dirname + " (via " + obj_dir + ")";
                   1252:        }
                   1253: 
                   1254:        if (shared) {
                   1255:                STDOUT.WriteLine("Enabling extension " + extname_for_printing + " [shared]");
                   1256:                cflags = "/D COMPILE_DL_" + EXT + " /D " + EXT + "_EXPORTS=1 " + cflags;
                   1257:                ADD_FLAG("CFLAGS_PHP", "/D COMPILE_DL_" + EXT);
                   1258:        } else {
                   1259:                STDOUT.WriteLine("Enabling extension " + extname_for_printing);
                   1260:        }
                   1261: 
                   1262:        MFO.WriteBlankLines(1);
                   1263:        MFO.WriteLine("# objects for EXT " + extname);
                   1264:        MFO.WriteBlankLines(1);
                   1265: 
                   1266:        ADD_SOURCES(configure_module_dirname, file_list, extname, obj_dir);
                   1267:        
                   1268:        MFO.WriteBlankLines(1);
                   1269: 
                   1270:        if (shared) {
                   1271:                if (dllname == null) {
                   1272:                        dllname = "php_" + extname + ".dll";
                   1273:                }
                   1274:                var libname = dllname.substring(0, dllname.length-4) + ".lib";
                   1275: 
                   1276:                var resname = generate_version_info_resource(dllname, extname, configure_module_dirname, false);
                   1277:                var ld = "@$(CC)";
                   1278: 
1.1.1.2   misho    1279:                ldflags = "";
1.1.1.4 ! misho    1280:                if (is_pgo_desired(extname) && (PHP_PGI == "yes" || PHP_PGO != "no")) {
        !          1281:                        // Add compiler and link flags if PGO options are selected
        !          1282:                        if (PHP_DEBUG != "yes" && PHP_PGI == "yes") {
        !          1283:                                ADD_FLAG('LDFLAGS_' + EXT, "/LTCG:PGINSTRUMENT");
        !          1284:                        }
        !          1285:                        else if (PHP_DEBUG != "yes" && PHP_PGO != "no") {
        !          1286:                                ADD_FLAG('LDFLAGS_' + EXT, "/LTCG:PGUPDATE");
        !          1287:                        }
        !          1288: 
        !          1289:                        ADD_FLAG('CFLAGS_' + EXT, "/GL /O2");
        !          1290: 
1.1.1.2   misho    1291:                        ldflags = " /PGD:$(PGOPGD_DIR)\\" + dllname.substring(0, dllname.indexOf(".")) + ".pgd";
                   1292:                }
                   1293: 
1.1       misho    1294:                MFO.WriteLine("$(BUILD_DIR)\\" + libname + ": $(BUILD_DIR)\\" + dllname);
                   1295:                MFO.WriteBlankLines(1);
                   1296:                if (MODE_PHPIZE) {
                   1297:                        MFO.WriteLine("$(BUILD_DIR)\\" + dllname + ": $(DEPS_" + EXT + ") $(" + EXT + "_GLOBAL_OBJS) $(PHPLIB) $(BUILD_DIR)\\" + resname);
                   1298:                        MFO.WriteLine("\t" + ld + " $(" + EXT + "_GLOBAL_OBJS) $(PHPLIB) $(LIBS_" + EXT + ") $(LIBS) $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + dllname + " $(DLL_LDFLAGS) $(LDFLAGS) $(LDFLAGS_" + EXT + ")");
                   1299:                } else {
                   1300:                        MFO.WriteLine("$(BUILD_DIR)\\" + dllname + ": $(DEPS_" + EXT + ") $(" + EXT + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(BUILD_DIR)\\" + resname);
1.1.1.2   misho    1301:                        MFO.WriteLine("\t" + ld + " $(" + EXT + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LIBS_" + EXT + ") $(LIBS) $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + dllname + ldflags + " $(DLL_LDFLAGS) $(LDFLAGS) $(LDFLAGS_" + EXT + ")");
1.1       misho    1302:                }
                   1303:                MFO.WriteLine("\t-@$(_VC_MANIFEST_EMBED_DLL)");
                   1304:                MFO.WriteBlankLines(1);
                   1305: 
                   1306:                if (configure_module_dirname.match("pecl")) {
                   1307:                        ADD_FLAG("PECL_TARGETS", dllname);
                   1308:                } else {
                   1309:                        ADD_FLAG("EXT_TARGETS", dllname);
                   1310:                }
                   1311:                MFO.WriteLine(dllname + ": $(BUILD_DIR)\\" + dllname);
                   1312:                MFO.WriteLine("\t@echo EXT " + extname + " build complete");
                   1313:                MFO.WriteBlankLines(1);
                   1314:                
                   1315:                DEFINE('CFLAGS_' + EXT + '_OBJ', '$(CFLAGS_' + EXT + ')');
                   1316:        } else {
                   1317:                ADD_FLAG("STATIC_EXT_OBJS", "$(" + EXT + "_GLOBAL_OBJS)");
                   1318:                ADD_FLAG("STATIC_EXT_LIBS", "$(LIBS_" + EXT + ")");
                   1319:                ADD_FLAG("STATIC_EXT_LDFLAGS", "$(LDFLAGS_" + EXT + ")");
                   1320:                ADD_FLAG("STATIC_EXT_CFLAGS", "$(CFLAGS_" + EXT + ")");
                   1321: 
                   1322:                /* find the header that declares the module pointer,
                   1323:                 * so we can include it in internal_functions.c */
                   1324:                var ext_dir = FSO.GetFolder(configure_module_dirname);
                   1325:                var fc = new Enumerator(ext_dir.Files);
                   1326:                var re = /\.h$/;
                   1327:                var s, c;
                   1328:                for (; !fc.atEnd(); fc.moveNext()) {
                   1329:                        s = fc.item() + "";
                   1330:                        if (s.match(re)) {
                   1331:                                c = file_get_contents(s);
                   1332:                                if (c.match("phpext_")) {
                   1333:                                        extension_include_code += '#include "' + configure_module_dirname + '/' + FSO.GetFileName(s) + '"\r\n';
                   1334:                                }
                   1335:                        }
                   1336:                }
                   1337:        
                   1338:                extension_module_ptrs += '\tphpext_' + extname + '_ptr,\r\n';
                   1339:        
                   1340:                DEFINE('CFLAGS_' + EXT + '_OBJ', '$(CFLAGS_PHP) $(CFLAGS_' + EXT + ')');
                   1341:        }
                   1342:        ADD_FLAG("CFLAGS_" + EXT, cflags);
                   1343: 
                   1344:        if (PHP_DSP != "no") {
                   1345:                generate_dsp_file(extname, configure_module_dirname, file_list, shared);
                   1346:        }
                   1347: 
                   1348:        extensions_enabled[extensions_enabled.length] = [extname, shared ? 'shared' : 'static'];
                   1349: }
                   1350: 
                   1351: function ADD_SOURCES(dir, file_list, target, obj_dir)
                   1352: {
                   1353:        var i;
                   1354:        var tv;
                   1355:        var src, obj, sym, flags;
                   1356: 
                   1357:        if (target == null) {
                   1358:                target = "php";
                   1359:        }
                   1360: 
                   1361:        sym = target.toUpperCase() + "_GLOBAL_OBJS";
                   1362:        flags = "CFLAGS_" + target.toUpperCase() + '_OBJ';
                   1363: 
                   1364:        if (configure_subst.Exists(sym)) {
                   1365:                tv = configure_subst.Item(sym);
                   1366:        } else {
                   1367:                tv = "";
                   1368:        }
                   1369: 
                   1370:        file_list = file_list.split(new RegExp("\\s+"));
                   1371:        file_list.sort();
                   1372: 
                   1373:        var re = new RegExp("\.[a-z0-9A-Z]+$");
                   1374: 
                   1375:        dir = dir.replace(new RegExp("/", "g"), "\\");
                   1376:        var objs_line = "";
                   1377:        var srcs_line = "";
                   1378: 
                   1379:        var sub_build = "$(BUILD_DIR)\\";
                   1380: 
                   1381:        /* if module dir is not a child of the main source dir,
                   1382:         * we need to tweak it; we should have detected such a
                   1383:         * case in condense_path and rewritten the path to
                   1384:         * be relative.
                   1385:         * This probably breaks for non-sibling dirs, but that
                   1386:         * is not a problem as buildconf only checks for pecl
                   1387:         * as either a child or a sibling */
                   1388:        if (obj_dir == null) {
                   1389:                var build_dir = dir.replace(new RegExp("^..\\\\"), "");
                   1390:                var mangle_dir = build_dir.replace(new RegExp("[\\\\/.-]", "g"), "_");
                   1391:                var bd_flags_name = "CFLAGS_BD_" + mangle_dir.toUpperCase();
                   1392:        }
                   1393:        else {
                   1394:                var build_dir = obj_dir.replace(new RegExp("^..\\\\"), "");
                   1395:                var mangle_dir = build_dir.replace(new RegExp("[\\\\/.-]", "g"), "_");
                   1396:                var bd_flags_name = "CFLAGS_BD_" + mangle_dir.toUpperCase();
                   1397:        }
                   1398:        
                   1399:        var dirs = build_dir.split("\\");
                   1400:        var i, d = "";
                   1401:        for (i = 0; i < dirs.length; i++) {
                   1402:                d += dirs[i];
                   1403:                build_dirs[build_dirs.length] = d;
                   1404:                d += "\\";
                   1405:        }
                   1406:        sub_build += d;
                   1407: 
                   1408: 
                   1409:        DEFINE(bd_flags_name, " /Fd" + sub_build + " /Fp" + sub_build + " /FR" + sub_build + " ");
                   1410: 
                   1411:        for (i in file_list) {
                   1412:                src = file_list[i];
                   1413:                obj = src.replace(re, ".obj");
                   1414:                tv += " " + sub_build + obj;
                   1415: 
                   1416:                if (!MODE_PHPIZE && PHP_ONE_SHOT == "yes") {
                   1417:                        if (i > 0) {
                   1418:                                objs_line += " " + sub_build + obj;     
                   1419:                                srcs_line += " " + dir + "\\" + src;
                   1420:                        } else {
                   1421:                                objs_line = sub_build + obj;    
                   1422:                                srcs_line = dir + "\\" + src;
                   1423:                        }
                   1424:                } else {
                   1425:                        MFO.WriteLine(sub_build + obj + ": " + dir + "\\" + src);
                   1426:                        MFO.WriteLine("\t@$(CC) $(" + flags + ") $(CFLAGS) $(" + bd_flags_name + ") /c " + dir + "\\" + src + " /Fo" + sub_build + obj);
                   1427:                }
                   1428:        }
                   1429: 
                   1430:        if (!MODE_PHPIZE && PHP_ONE_SHOT == "yes") {
                   1431:                MFO.WriteLine(objs_line + ": " + srcs_line);
                   1432:                MFO.WriteLine("\t$(CC) $(" + flags + ") $(CFLAGS) /Fo" + sub_build + " $(" + bd_flags_name + ") /c " + srcs_line);
                   1433:        }
                   1434: 
                   1435:        DEFINE(sym, tv);
                   1436: }
                   1437: 
                   1438: function REMOVE_TARGET(dllname, flag)
                   1439: {
                   1440:        var dllname = dllname.replace(/\s/g, "");
                   1441:        var EXT = dllname.replace(/php_(\S+)\.dll/, "$1").toUpperCase();
                   1442:        var php_flags = configure_subst.Item("CFLAGS_PHP");
                   1443: 
                   1444:        if (configure_subst.Exists(flag)) {
                   1445:                var targets = configure_subst.Item(flag);
                   1446: 
                   1447:                if (targets.match(dllname)) {
                   1448:                        configure_subst.Remove(flag);
                   1449:                        targets = targets.replace(dllname, "");
                   1450:                        targets = targets.replace(/\s+/, " ");
                   1451:                        targets = targets.replace(/\s$/, "");
                   1452:                        configure_subst.Add(flag, targets);
                   1453:                        configure_hdr.Add("HAVE_" + EXT, new Array(0, ""));
                   1454:                        configure_subst.Item("CFLAGS_PHP") = php_flags.replace(" /D COMPILE_DL_" + EXT, "");
                   1455:                        extensions_enabled.pop();
                   1456:                        return true;
                   1457:                }
                   1458:        }
                   1459:        return false;
                   1460: }
                   1461: 
                   1462: function generate_internal_functions()
                   1463: {
                   1464:        var infile, outfile;
                   1465:        var indata;
                   1466: 
                   1467:        STDOUT.WriteLine("Generating main/internal_functions.c");
                   1468:        
                   1469:        infile = FSO.OpenTextFile("main/internal_functions.c.in", 1);
                   1470:        indata = infile.ReadAll();
                   1471:        infile.Close();
                   1472:        
                   1473:        indata = indata.replace("@EXT_INCLUDE_CODE@", extension_include_code);
                   1474:        indata = indata.replace("@EXT_MODULE_PTRS@", extension_module_ptrs);
                   1475: 
                   1476:        if (FSO.FileExists("main/internal_functions.c")) {
                   1477:                var origdata = file_get_contents("main/internal_functions.c");
                   1478: 
                   1479:                if (origdata == indata) {
                   1480:                        STDOUT.WriteLine("\t[content unchanged; skipping]");
                   1481:                        return;
                   1482:                }
                   1483:        }
                   1484: 
                   1485:        outfile = FSO.CreateTextFile("main/internal_functions.c", true);
                   1486:        outfile.Write(indata);
                   1487:        outfile.Close();
                   1488: }
                   1489: 
                   1490: function output_as_table(header, ar_out)
                   1491: {
                   1492:        var l = header.length;
                   1493:        var cols = 80;
                   1494:        var fixedlenght = "";
                   1495:        var t = 0;
                   1496:        var i,j,k,m;
                   1497:        var out = "| ";
                   1498:        var min = new Array(l);
                   1499:        var max = new Array(l);
                   1500: 
                   1501:        if (l != ar_out[0].length) {
                   1502:                STDOUT.WriteLine("Invalid header argument, can't output the table " + l + " " + ar_out[0].length  );
                   1503:                return;
                   1504:        }
                   1505: 
                   1506:        for (j=0; j < l; j++) {
                   1507:                var tmax, tmin;
                   1508: 
                   1509:                /*Figure out the max length per column */
                   1510:                tmin = 0;
                   1511:                tmax = 0;
                   1512:                for (k = 0; k < ar_out.length; k++) {
                   1513:                        var t = ar_out[k][j].length;
                   1514:                        if (t > tmax) tmax = t;
                   1515:                        else if (t < tmin) tmin = t;
                   1516:                }
                   1517:                if (tmax > header[j].length) {
                   1518:                        max[j] = tmax;
                   1519:                } else {
                   1520:                        max[j] = header[j].length;
                   1521:                }
                   1522:                if (tmin < header[j].length) {
                   1523:                        min[j] = header[j].length;
                   1524:                }
                   1525:        }
                   1526: 
                   1527:        sep = "";
                   1528:        k = 0;
                   1529:        for (i = 0; i < l; i++) {
                   1530:                k += max[i] + 3;
                   1531:        }
                   1532:        k++;
                   1533: 
                   1534:        for (j=0; j < k; j++) {
                   1535:                sep += "-";
                   1536:        }
                   1537: 
                   1538:        STDOUT.WriteLine(sep);
                   1539:        out = "|";
                   1540:        for (j=0; j < l; j++) {
                   1541:                out += " " + header[j];
                   1542:                for (var i = 0; i < (max[j] - header[j].length); i++){
                   1543:                        out += " ";
                   1544:                }
                   1545:                out += " |";
                   1546:        }
                   1547:        STDOUT.WriteLine(out);
                   1548: 
                   1549:        STDOUT.WriteLine(sep);
                   1550: 
                   1551:        out = "|";
                   1552:        for (i=0; i < ar_out.length; i++) {
                   1553:                line = ar_out[i];
                   1554:                for (j=0; j < l; j++) {
                   1555:                        out += " " + line[j];
                   1556:                        for (var k = 0; k < (max[j] - line[j].length); k++){
                   1557:                                out += " ";
                   1558:                        }
                   1559:                        out += " |";
                   1560:                }
                   1561:                STDOUT.WriteLine(out);
                   1562:                out = "|";
                   1563:        }
                   1564: 
                   1565:        STDOUT.WriteLine(sep);
                   1566: }
                   1567: 
                   1568: function write_summary()
                   1569: {
                   1570:        var ar = new Array();
                   1571: 
                   1572:        STDOUT.WriteBlankLines(2);
                   1573: 
                   1574:        STDOUT.WriteLine("Enabled extensions:");
                   1575:        output_as_table(["Extension", "Mode"], extensions_enabled.sort());
                   1576:        STDOUT.WriteBlankLines(2);
                   1577:        if (!MODE_PHPIZE) {
                   1578:                STDOUT.WriteLine("Enabled SAPI:");
                   1579:                output_as_table(["Sapi Name"], sapi_enabled);
                   1580:                STDOUT.WriteBlankLines(2);
                   1581:        }
                   1582:        ar[0] = ['Build type', PHP_DEBUG == "yes" ? "Debug" : "Release"];
                   1583:        ar[1] = ['Thread Safety', PHP_ZTS == "yes" ? "Yes" : "No"];
                   1584:        ar[2] = ['Compiler', VC_VERSIONS[VCVERS]];
                   1585:        ar[3] = ['Architecture', X64 ? 'x64' : 'x86'];
                   1586: 
                   1587:        output_as_table(["",""], ar);
                   1588:        STDOUT.WriteBlankLines(2);
                   1589: }
                   1590: 
                   1591: function generate_files()
                   1592: {
                   1593:        var i, dir, bd, last;
                   1594: 
                   1595:        STDOUT.WriteBlankLines(1);
                   1596:        STDOUT.WriteLine("Creating build dirs...");
                   1597:        dir = get_define("BUILD_DIR");
                   1598:        build_dirs.sort();
                   1599:        last = null;
                   1600: 
                   1601:        if (!FSO.FolderExists(dir)) {
                   1602:                FSO.CreateFolder(dir);
                   1603:        }
                   1604: 
                   1605:        for (i = 0; i < build_dirs.length; i++) {
                   1606:                bd = FSO.BuildPath(dir, build_dirs[i]);
                   1607:                if (bd == last) {
                   1608:                        continue;
                   1609:                }
                   1610:                last = bd;
                   1611: 
                   1612:                build_dir = get_define('BUILD_DIR');
                   1613:                build_dir = build_dir.replace(new RegExp("\\\\", "g"), "\\\\");
                   1614:                if (build_dir.substr(build_dir.Length - 2, 2) != '\\\\') {
                   1615:                        build_dir += '\\\\';
                   1616:                }
                   1617:                ADD_FLAG("BUILD_DIRS_SUB", bd.replace(new RegExp(build_dir), ''));
                   1618: 
                   1619:                if (!FSO.FolderExists(bd)) {
                   1620:                        FSO.CreateFolder(bd);
                   1621:                }
                   1622:        }
                   1623: 
                   1624:        if (PHP_DSP != "no") {
                   1625:                generate_dsp_file("TSRM", "TSRM", null, false);
                   1626:                generate_dsp_file("Zend", "Zend", null, false);
                   1627:                generate_dsp_file("win32", "win32", null, false);
                   1628:                generate_dsp_file("main", "main", null, false);
                   1629:                generate_dsp_file("streams", "main\\streams", null, false);
                   1630:                copy_dsp_files();
                   1631:        }
                   1632: 
                   1633:        STDOUT.WriteLine("Generating files...");
                   1634:        generate_makefile();
                   1635:        if (!MODE_PHPIZE) {
                   1636:                generate_internal_functions();
                   1637:                generate_config_h();
                   1638:                generate_phpize();
                   1639:        }
                   1640:        STDOUT.WriteLine("Done.");
                   1641:        STDOUT.WriteBlankLines(1);
                   1642:        write_summary();
                   1643: 
                   1644:        if (PHP_SNAPSHOT_BUILD != "no") {
                   1645:                STDOUT.WriteLine("Type 'nmake snap' to build a PHP snapshot");
                   1646:        } else {
                   1647:                STDOUT.WriteLine("Type 'nmake' to build PHP");
                   1648:        }
                   1649: }
                   1650: 
                   1651: function generate_config_h()
                   1652: {
                   1653:        var infile, outfile;
                   1654:        var indata;
                   1655:        var prefix;
                   1656: 
                   1657:        prefix = PHP_PREFIX.replace(new RegExp("\\\\", "g"), "\\\\");
                   1658: 
                   1659:        STDOUT.WriteLine("Generating main/config.w32.h");
                   1660:        
                   1661:        infile = FSO.OpenTextFile("win32/build/config.w32.h.in", 1);
                   1662:        indata = infile.ReadAll();
                   1663:        infile.Close();
                   1664:        
                   1665:        outfile = FSO.CreateTextFile("main/config.w32.h", true);
                   1666: 
                   1667:        indata = indata.replace(new RegExp("@PREFIX@", "g"), prefix);
                   1668:        outfile.Write(indata);
                   1669: 
                   1670:        var keys = (new VBArray(configure_hdr.Keys())).toArray();
                   1671:        var i, j;
                   1672:        var item;
                   1673:        var pieces, stuff_to_crack, chunk;
                   1674: 
                   1675:        outfile.WriteBlankLines(1);
                   1676:        outfile.WriteLine("/* values determined by configure.js */");
                   1677: 
                   1678:        for (i in keys) {
                   1679:                item = configure_hdr.Item(keys[i]);
                   1680:                outfile.WriteBlankLines(1);
                   1681:                pieces = item[0];
                   1682: 
                   1683:                if (item[1] != undefined) {
                   1684:                        outfile.WriteLine("/* " + item[1] + " */");
                   1685:                }
                   1686: 
                   1687:                if (typeof(pieces) == "string" && pieces.charCodeAt(0) == 34) {
                   1688:                        /* quoted string have a maximal length of 2k under vc.
                   1689:                         * solution is to crack them and let the compiler concat
                   1690:                         * them implicitly */
                   1691:                        stuff_to_crack = pieces;
                   1692:                        pieces = "";
                   1693: 
                   1694:                        while (stuff_to_crack.length) {
                   1695:                                j = 65;
                   1696:                                while (stuff_to_crack.charCodeAt(j) != 32 && j < stuff_to_crack.length)
                   1697:                                        j++;
                   1698: 
                   1699:                                chunk = stuff_to_crack.substr(0, j);
                   1700:                                pieces += chunk;
                   1701:                                stuff_to_crack = stuff_to_crack.substr(chunk.length);
                   1702:                                if (stuff_to_crack.length)
                   1703:                                        pieces += '" "';
                   1704:                        }
                   1705:                }
                   1706:                
                   1707:                outfile.WriteLine("#define " + keys[i] + " " + pieces);
                   1708:        }
                   1709:        
                   1710:        outfile.Close();
                   1711: }
                   1712: 
                   1713: function generate_phpize()
                   1714: {
                   1715:        STDOUT.WriteLine("Generating phpize");
                   1716:        dest = get_define("BUILD_DIR") + '/devel';
                   1717: 
                   1718:        if (!FSO.FolderExists(dest)) {
                   1719:                FSO.CreateFolder(dest);
                   1720:        }
                   1721: 
                   1722:        var MF = FSO.CreateTextFile(dest + "/phpize.js", true);
                   1723:        var DEPS = FSO.CreateTextFile(dest + "/ext_deps.js", true);
                   1724:        prefix = get_define("PHP_PREFIX");
                   1725:        prefix = prefix.replace(new RegExp("/", "g"), "\\");
                   1726:        prefix = prefix.replace(new RegExp("\\\\", "g"), "\\\\");
                   1727:        MF.WriteLine("var PHP_PREFIX=" + '"' + prefix + '"');
                   1728:        MF.WriteLine("var PHP_ZTS=" + '"' + (PHP_ZTS.toLowerCase() == "yes" ? "Yes" : "No") + '"');
                   1729:        MF.WriteLine("var VC_VERSION=" + VCVERS);
                   1730:        MF.WriteLine("var PHP_VERSION=" + PHP_VERSION);
                   1731:        MF.WriteLine("var PHP_MINOR_VERSION=" + PHP_MINOR_VERSION);
                   1732:        MF.WriteLine("var PHP_RELEASE_VERSION=" + PHP_RELEASE_VERSION);
                   1733:        MF.WriteBlankLines(1);
                   1734:        MF.WriteLine("/* Genereted extensions list with mode (static/shared) */");
                   1735: 
                   1736:        var count = extensions_enabled.length;
                   1737:        for (i in extensions_enabled) {
                   1738:                out = "PHP_" + extensions_enabled[i][0].toUpperCase() + "_SHARED=" + (extensions_enabled[i][1] == 'shared' ? 'true' : 'false') + ";";
                   1739:                DEPS.WriteLine("PHP_" + extensions_enabled[i][0].toUpperCase() + "=true;");
                   1740:                DEPS.WriteLine(out);
                   1741:                MF.WriteLine(out);
                   1742:        }
                   1743: 
                   1744:        MF.WriteBlankLines(2);
                   1745:        MF.WriteLine("/* Genereted win32/build/phpize.js.in */");
                   1746:        MF.WriteBlankLines(1);
                   1747:        MF.Write(file_get_contents("win32/build/phpize.js.in"));
                   1748:        MF.Close();
                   1749:        DEPS.Close();
                   1750: 
                   1751:        /* Generate flags file */
                   1752:        /* spit out variable definitions */
                   1753:        CJ = FSO.CreateTextFile(dest + "/config.phpize.js");
                   1754: 
                   1755:        CJ.WriteLine("var PHP_ZTS =" + '"' + PHP_ZTS + '"');
                   1756:        CJ.WriteLine("var PHP_DLL_LIB =" + '"' + get_define('PHPLIB') + '"');
                   1757:        CJ.WriteLine("var PHP_DLL =" + '"' + get_define('PHPDLL') + '"');
                   1758:        CJ.WriteBlankLines(1);
                   1759:        CJ.Close();
                   1760: }
                   1761: 
                   1762: function generate_makefile()
                   1763: {
                   1764:        STDOUT.WriteLine("Generating Makefile");
                   1765:        var MF = FSO.CreateTextFile("Makefile", true);
                   1766: 
                   1767:        MF.WriteLine("# Generated by configure.js");
                   1768:        /* spit out variable definitions */
                   1769:        var keys = (new VBArray(configure_subst.Keys())).toArray();
                   1770:        var i;
                   1771:        MF.WriteLine("PHP_SRC_DIR =" + PHP_SRC_DIR);
                   1772:        for (i in keys) {
                   1773:                // The trailing space is needed to prevent the trailing backslash
                   1774:                // that is part of the build dir flags (CFLAGS_BD_XXX) from being
                   1775:                // seen as a line continuation character
                   1776:                MF.WriteLine(keys[i] + "=" + 
                   1777:                        //word_wrap_and_indent(1, configure_subst.Item(keys[i]), ' \\', '\t') + " "
                   1778:                        configure_subst.Item(keys[i]) + " "
                   1779:                        );
                   1780:                MF.WriteBlankLines(1);
                   1781:        }
                   1782: 
                   1783:        MF.WriteBlankLines(1);
                   1784:        if (MODE_PHPIZE) {
                   1785:                var TF = FSO.OpenTextFile(PHP_DIR + "/script/Makefile.phpize", 1);
                   1786:        } else {
                   1787:                var TF = FSO.OpenTextFile("win32/build/Makefile", 1);
                   1788:        }
                   1789: 
                   1790:        MF.Write(TF.ReadAll());
                   1791: 
                   1792:        MF.WriteLine("build-headers:");
                   1793:        MF.WriteLine("  @if not exist $(BUILD_DIR_DEV)\\include mkdir $(BUILD_DIR_DEV)\\include >nul");
                   1794:        MF.WriteLine("  @for %D in ($(INSTALL_HEADERS_DIR)) do @if not exist $(BUILD_DIR_DEV)\\include\\%D mkdir $(BUILD_DIR_DEV)\\include\\%D >nul");
                   1795:        for (i in headers_install) {
                   1796:                if (headers_install[i][2] != "") {
                   1797:                                MF.WriteLine("  @if not exist $(BUILD_DIR_DEV)\\include\\" + headers_install[i][2] + " mkdir $(BUILD_DIR_DEV)\\include\\" + 
                   1798:                                                                                                headers_install[i][2] + ">nul");
                   1799:                                MF.WriteLine("  @copy " + headers_install[i][0] + " " + "$(BUILD_DIR_DEV)\\include\\" + headers_install[i][2] + " /y >nul");
                   1800:                }
                   1801:        }
                   1802:        MF.WriteLine("  @for %D in ($(INSTALL_HEADERS_DIR)) do @copy %D*.h $(BUILD_DIR_DEV)\\include\\%D /y >nul");
                   1803:        TF.Close();
                   1804: 
                   1805:        MF.WriteBlankLines(2);
                   1806: 
                   1807:        MFO.Close();
                   1808:        TF = FSO.OpenTextFile("Makefile.objects", 1);
                   1809:        MF.Write(TF.ReadAll());
                   1810:        TF.Close();
                   1811: 
                   1812:        MF.Close();     
                   1813: }
                   1814: 
                   1815: function ADD_FLAG(name, flags, target)
                   1816: {
                   1817:        if (target != null) {
                   1818:                name = target.toUpperCase() + "_" + name;
                   1819:        }
                   1820:        if (configure_subst.Exists(name)) {
                   1821:                var curr_flags = configure_subst.Item(name);
                   1822: 
                   1823:                if (curr_flags.indexOf(flags) >= 0) {
                   1824:                        return;
                   1825:                }
                   1826:                
                   1827:                flags = curr_flags + " " + flags;
                   1828:                configure_subst.Remove(name);
                   1829:        }
                   1830:        configure_subst.Add(name, flags);
                   1831: 
                   1832:        if (PHP_DSP != "no") {
                   1833:                if (flags && (name.substr(name.length-3) != "PHP") && (name.substr(0, 7) == "CFLAGS_")) {
                   1834:                        DSP_FLAGS[DSP_FLAGS.length] = new Array(name, flags);
                   1835:                }
                   1836:        }
                   1837: }
                   1838: 
                   1839: function get_define(name)
                   1840: {
                   1841:        if (configure_subst.Exists(name)) {
                   1842:                return configure_subst.Item(name);
                   1843:        }
                   1844:        return "";
                   1845: }
                   1846: 
                   1847: // Add a .def to the core to export symbols
                   1848: function ADD_DEF_FILE(name)
                   1849: {
                   1850:        if (!configure_subst.Exists("PHPDEF")) {
                   1851:                DEFINE("PHPDEF", "$(BUILD_DIR)\\$(PHPDLL).def");
                   1852:                ADD_FLAG("PHP_LDFLAGS", "/def:$(PHPDEF)");
                   1853:        }
                   1854:        ADD_FLAG("PHP_DLL_DEF_SOURCES", name);
                   1855: }
                   1856: 
                   1857: function AC_DEFINE(name, value, comment, quote)
                   1858: {
                   1859:        if (quote == null) {
                   1860:                quote = true;
                   1861:        }
                   1862:        if (quote && typeof(value) == "string") {
                   1863:                value = '"' + value.replace(new RegExp('(["\\\\])', "g"), '\\$1') + '"';
                   1864:        } else if (value.length == 0) {
                   1865:                value = '""';
                   1866:        }
                   1867:        var item = new Array(value, comment);
                   1868:        if (configure_hdr.Exists(name)) {
                   1869:                var orig_item = configure_hdr.Item(name);
                   1870:                STDOUT.WriteLine("AC_DEFINE[" + name + "]=" + value + ": is already defined to " + orig_item[0]);
                   1871:        } else {
                   1872:                configure_hdr.Add(name, item);
                   1873:        }
                   1874: }
                   1875: 
                   1876: function MESSAGE(msg)
                   1877: {
                   1878:        STDOUT.WriteLine("" + msg);
                   1879: }
                   1880: 
                   1881: function ERROR(msg)
                   1882: {
                   1883:        STDERR.WriteLine("ERROR: " + msg);
                   1884:        WScript.Quit(3);
                   1885: }
                   1886: 
                   1887: function WARNING(msg)
                   1888: {
                   1889:        STDERR.WriteLine("WARNING: " + msg);
                   1890:        STDERR.WriteBlankLines(1);
                   1891: }
                   1892: 
                   1893: function copy_and_subst(srcname, destname, subst_array)
                   1894: {
                   1895:        if (!FSO.FileExists(srcname)) {
                   1896:                srcname = configure_module_dirname + "\\" + srcname;
                   1897:                destname = configure_module_dirname + "\\" + destname;
                   1898:        }
                   1899: 
                   1900:        var content = file_get_contents(srcname);
                   1901:        var i;
                   1902: 
                   1903:        for (i = 0; i < subst_array.length; i+=2) {
                   1904:                var re = subst_array[i];
                   1905:                var rep = subst_array[i+1];
                   1906: 
                   1907:                content = content.replace(re, rep);
                   1908:        }
                   1909:        
                   1910:        var f = FSO.CreateTextFile(destname, true);
                   1911:        f.Write(content);
                   1912:        f.Close();
                   1913: }
                   1914: 
                   1915: // glob using simple filename wildcards
                   1916: // returns an array of matches that are found
                   1917: // in the filesystem
                   1918: function glob(path_pattern)
                   1919: {
                   1920:        var path_parts = path_pattern.replace(new RegExp("/", "g"), "\\").split("\\");
                   1921:        var p;
                   1922:        var base = "";
                   1923:        var is_pat_re = /\*/;
                   1924: 
                   1925: //STDOUT.WriteLine("glob: " + path_pattern);
                   1926: 
                   1927:        if (FSO.FileExists(path_pattern)) {
                   1928:                return new Array(path_pattern);
                   1929:        }
                   1930:        
                   1931:        // first, build as much as possible that doesn't have a pattern
                   1932:        for (p = 0; p < path_parts.length; p++) {
                   1933:                if (path_parts[p].match(is_pat_re))
                   1934:                        break;
                   1935:                if (p)
                   1936:                        base += "\\";
                   1937:                base += path_parts[p];  
                   1938:        }
                   1939: 
                   1940:        return _inner_glob(base, p, path_parts);
                   1941: }
                   1942: 
                   1943: function _inner_glob(base, p, parts)
                   1944: {
                   1945:        var pat = parts[p];
                   1946:        var full_name = base + "\\" + pat;
                   1947:        var re = null;
                   1948:        var items = null;
                   1949: 
                   1950:        if (p == parts.length) {
                   1951:                return false;
                   1952:        }
                   1953: 
                   1954: //STDOUT.WriteLine("inner: base=" + base + " p=" + p + " pat=" + pat);
                   1955: 
                   1956:        if (FSO.FileExists(full_name)) {
                   1957:                if (p < parts.length - 1) {
                   1958:                        // we didn't reach the full extent of the pattern
                   1959:                        return false;
                   1960:                }
                   1961:                return new Array(full_name);
                   1962:        }
                   1963: 
                   1964:        if (FSO.FolderExists(full_name) && p == parts.length - 1) {
                   1965:                // we have reached the end of the pattern; no need to recurse
                   1966:                return new Array(full_name);
                   1967:        }
                   1968: 
                   1969:        // Convert the pattern into a regexp
                   1970:        re = new RegExp("^" + pat.replace(/\./g, '\\.').replace(/\*/g, '.*').replace(/\?/g, '.') + "$", "i");
                   1971: 
                   1972:        items = new Array();
                   1973: 
                   1974:        if (!FSO.FolderExists(base)) {
                   1975:                return false;
                   1976:        }
                   1977: 
                   1978:        var folder = FSO.GetFolder(base);
                   1979:        var fc = null;
                   1980:        var subitems = null;
                   1981:        var item_name = null;
                   1982:        var j;
                   1983: 
                   1984:        fc = new Enumerator(folder.SubFolders);
                   1985:        for (; !fc.atEnd(); fc.moveNext()) {
                   1986:                item_name = FSO.GetFileName(fc.item());
                   1987: 
                   1988:                if (item_name.match(re)) {
                   1989:                        // got a match; if we are at the end of the pattern, just add these
                   1990:                        // things to the items array
                   1991:                        if (p == parts.length - 1) {
                   1992:                                items[items.length] = fc.item();
                   1993:                        } else {
                   1994:                                // we should recurse and do more matches
                   1995:                                subitems = _inner_glob(base + "\\" + item_name, p + 1, parts);
                   1996:                                if (subitems) {
                   1997:                                        for (j = 0; j < subitems.length; j++) {
                   1998:                                                items[items.length] = subitems[j];
                   1999:                                        }
                   2000:                                }
                   2001:                        }
                   2002:                }
                   2003:        }
                   2004: 
                   2005:        // if we are at the end of the pattern, we should match
                   2006:        // files too
                   2007:        if (p == parts.length - 1) {
                   2008:                fc = new Enumerator(folder.Files);
                   2009:                for (; !fc.atEnd(); fc.moveNext()) {
                   2010:                        item_name = FSO.GetFileName(fc.item());
                   2011:                        if (item_name.match(re)) {
                   2012:                                items[items.length] = fc.item();
                   2013:                        }
                   2014:                }
                   2015:        }
                   2016: 
                   2017:        if (items.length == 0)
                   2018:                return false;
                   2019: 
                   2020:        return items;
                   2021: }
                   2022: 
                   2023: function PHP_INSTALL_HEADERS(dir, headers_list)
                   2024: {
                   2025:        headers_list = headers_list.split(new RegExp("\\s+"));
                   2026:        headers_list.sort();
                   2027:        if (dir.length > 0 && dir.substr(dir.length - 1) != '/' && dir.substr(dir.length - 1) != '\\') {
                   2028:                dir += '/';
                   2029:        }
                   2030:        dir = dir.replace(new RegExp("/", "g"), "\\");
                   2031: 
                   2032:        for (i in headers_list) {
                   2033:                found = false;
                   2034:                src = headers_list[i];
                   2035:                src = src.replace(new RegExp("/", "g"), "\\");
                   2036:                isdir = FSO.FolderExists(dir + src);
                   2037:                isfile = FSO.FileExists(dir + src);
                   2038:                if (isdir) {
                   2039:                        if (src.length > 0 && src.substr(src.length - 1) != '/' && src.substr(src.length - 1) != '\\') {
                   2040:                                src += '\\';
                   2041:                        }
                   2042:                        headers_install[headers_install.length] = [dir + src, 'dir',''];
                   2043:                        ADD_FLAG("INSTALL_HEADERS_DIR", dir + src);
                   2044:                        found = true;
                   2045:                } else if (isfile) {
                   2046:                        dirname = FSO.GetParentFolderName(dir + src);
                   2047:                        headers_install[headers_install.length] = [dir + src, 'file', dirname];
                   2048:                        ADD_FLAG("INSTALL_HEADERS", dir + src);
                   2049:                        found = true;
                   2050:                } else {
                   2051:                        path =  configure_module_dirname + "\\"+ src;
                   2052:                        isdir = FSO.FolderExists(path);
                   2053:                        isfile = FSO.FileExists(path);
                   2054:                        if (isdir) {
                   2055:                                if (src.length > 0 && src.substr(src.length - 1) != '/' && src.substr(src.length - 1) != '\\') {
                   2056:                                        src += '\\';
                   2057:                                }
                   2058:                                headers_install[headers_install.length] = [path, 'dir',''];
                   2059:                                ADD_FLAG("INSTALL_HEADERS_DIR", path);
                   2060:                        } else if (isfile) {
                   2061:                                dirname = FSO.GetParentFolderName(path);
                   2062:                                headers_install[headers_install.length] = [path, 'file', dir];
                   2063:                                ADD_FLAG("INSTALL_HEADERS", dir + src);
                   2064:                                found = true;
                   2065:                        }
                   2066:                }
                   2067: 
                   2068:                if (found == false) {
                   2069:                        STDOUT.WriteLine(headers_list);
                   2070:                        ERROR("Cannot find header " + dir + src);
                   2071:                }
                   2072:        }
                   2073: }
                   2074: 
                   2075: // for snapshot builders, this option will attempt to enable everything
                   2076: // and you can then build everything, ignoring fatal errors within a module
                   2077: // by running "nmake snap"
                   2078: PHP_SNAPSHOT_BUILD = "no";
                   2079: if (!MODE_PHPIZE) {
                   2080:        ARG_ENABLE('snapshot-build', 'Build a snapshot; turns on everything it can and ignores build errors', 'no');
                   2081: 
                   2082:        // one-shot build optimizes build by asking compiler to build
                   2083:        // several objects at once, reducing overhead of starting new
                   2084:        // compiler processes.
                   2085:        ARG_ENABLE('one-shot', 'Optimize for fast build - best for release and snapshot builders, not so hot for edit-and-rebuild hacking', 'no');
                   2086: }
                   2087: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>