Annotation of embedaddon/php/win32/build/phpize.js.in, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | PHP Version 5 |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1997-2008 The PHP Group |
! 6: +----------------------------------------------------------------------+
! 7: | This source file is subject to version 3.01 of the PHP license, |
! 8: | that is bundled with this package in the file LICENSE, and is |
! 9: | available through the world-wide-web at the following url: |
! 10: | http://www.php.net/license/3_01.txt |
! 11: | If you did not receive a copy of the PHP license and are unable to |
! 12: | obtain it through the world-wide-web, please send a note to |
! 13: | license@php.net so we can mail you a copy immediately. |
! 14: +----------------------------------------------------------------------+
! 15: | Author: Pierre Joye <pierre1@php.net> |
! 16: +----------------------------------------------------------------------+
! 17: */
! 18:
! 19: /* $Id$ */
! 20: // This generates a configure script for win32 build
! 21:
! 22: var STDOUT = WScript.StdOut;
! 23:
! 24: var FSO = WScript.CreateObject("Scripting.FileSystemObject");
! 25: var C = FSO.CreateTextFile("configure.js", true);
! 26: var B = FSO.CreateTextFile("configure.bat", true);
! 27: var DSP = false;
! 28: re = /\\script/i;
! 29: var PHP_DIR=FSO.GetParentFolderName(WScript.ScriptFullName).replace(re,"");
! 30:
! 31: var modules = "";
! 32: var MODULES = WScript.CreateObject("Scripting.Dictionary");
! 33: var module_dirs = new Array();
! 34:
! 35: function ERROR(msg)
! 36: {
! 37: STDERR.WriteLine("ERROR: " + msg);
! 38: WScript.Quit(3);
! 39: }
! 40:
! 41: function file_get_contents(filename)
! 42: {
! 43: var F = FSO.OpenTextFile(filename, 1);
! 44: var t = F.ReadAll();
! 45: F.Close();
! 46: return t;
! 47: }
! 48:
! 49: function Module_Item(module_name, config_path, dir_line, deps, content)
! 50: {
! 51: this.module_name = module_name;
! 52: this.config_path = config_path;
! 53: this.dir_line = dir_line;
! 54: this.deps = deps;
! 55: this.content = content;
! 56: }
! 57:
! 58: function get_module_dep(contents)
! 59: {
! 60: var re_dep_line = new RegExp("ADD_EXTENSION_DEP\\([^,]*\\s*,\\s*['\"]([^'\"]+)['\"].*\\)", "gm");
! 61: var calls = contents.match(re_dep_line);
! 62: var deps = new Array();
! 63: if (calls != null) {
! 64: for (i = 0; i < calls.length; i++) {
! 65: // now we need the extension name out of this thing
! 66: if (calls[i].match(re_dep_line)) {
! 67: deps[deps.length] = RegExp.$1;
! 68:
! 69: }
! 70: }
! 71: }
! 72: return deps;
! 73: }
! 74:
! 75: function find_config_w32(dirname)
! 76: {
! 77: if (!FSO.FolderExists(dirname)) {
! 78: return;
! 79: }
! 80:
! 81: var f = FSO.GetFolder(dirname);
! 82: var fc = new Enumerator(f.SubFolders);
! 83: var c, i, ok, n;
! 84: var item = null;
! 85:
! 86: c = dirname + "\\config.w32";
! 87: if (FSO.FileExists(c)) {
! 88: var dir_line = "configure_module_dirname = condense_path(FSO.GetParentFolderName('"
! 89: + c.replace(new RegExp('(["\\\\])', "g"), '\\$1') + "'));\r\n";
! 90: var contents = file_get_contents(c);
! 91:
! 92: deps = get_module_dep(contents);
! 93:
! 94: item = new Module_Item(n, c, dir_line, deps, contents);
! 95: MODULES.Add(n, item);
! 96: }
! 97:
! 98: for (; !fc.atEnd(); fc.moveNext()) {
! 99: /* check if we already picked up a module with the same dirname;
! 100: * if we have, don't include it here */
! 101: n = FSO.GetFileName(fc.item());
! 102: if (n == '.svn' || n == 'tests' || n == '.git') {
! 103: continue;
! 104: }
! 105:
! 106: c = FSO.BuildPath(fc.item(), "config.w32");
! 107: if (FSO.FileExists(c)) {
! 108: var dir_line = "configure_module_dirname = condense_path(FSO.GetParentFolderName('"
! 109: + c.replace(new RegExp('(["\\\\])', "g"), '\\$1') + "'));\r\n";
! 110: var contents = file_get_contents(c);
! 111:
! 112: deps = get_module_dep(contents);
! 113:
! 114: item = new Module_Item(n, c, dir_line, deps, contents);
! 115: MODULES.Add(n, item);
! 116: }
! 117: }
! 118: }
! 119:
! 120: function emit_module(item)
! 121: {
! 122: return item.dir_line + item.content;
! 123: }
! 124:
! 125: function emit_dep_modules(module_names)
! 126: {
! 127: var i, mod_name, j;
! 128: var output = "";
! 129: var item = null;
! 130:
! 131: for (i in module_names) {
! 132: mod_name = module_names[i];
! 133:
! 134: if (MODULES.Exists(mod_name)) {
! 135: item = MODULES.Item(mod_name);
! 136: MODULES.Remove(mod_name);
! 137: if (item.deps.length) {
! 138: output += emit_dep_modules(item.deps);
! 139: }
! 140: output += emit_module(item);
! 141: }
! 142: }
! 143:
! 144: return output;
! 145: }
! 146:
! 147: function gen_modules()
! 148: {
! 149: var module_names = (new VBArray(MODULES.Keys())).toArray();
! 150: var i, mod_name, j;
! 151: var item;
! 152: var output = "";
! 153:
! 154: // first, look for modules with empty deps; emit those first
! 155: for (i in module_names) {
! 156: STDOUT.WriteLine("module ... " + module_names);
! 157: mod_name = module_names[i];
! 158: item = MODULES.Item(mod_name);
! 159: if (item.deps.length == 0) {
! 160: MODULES.Remove(mod_name);
! 161: output += emit_module(item);
! 162: }
! 163: }
! 164:
! 165: // now we are left with modules that have dependencies on other modules
! 166: module_names = (new VBArray(MODULES.Keys())).toArray();
! 167: output += emit_dep_modules(module_names);
! 168:
! 169: return output;
! 170: }
! 171:
! 172: // Process buildconf arguments
! 173: function buildconf_process_args()
! 174: {
! 175: args = WScript.Arguments;
! 176:
! 177: for (i = 0; i < args.length; i++) {
! 178: arg = args(i);
! 179: // If it is --foo=bar, split on the equals sign
! 180: arg = arg.split("=", 2);
! 181: argname = arg[0];
! 182: if (arg.length > 1) {
! 183: argval = arg[1];
! 184: } else {
! 185: argval = null;
! 186: }
! 187:
! 188: if (argname == '--clean' && argval != null) {
! 189: STDOUT.WriteLine("Cleaning...");
! 190: return 0;
! 191: }
! 192:
! 193: if (argname == '--help') {
! 194: STDOUT.WriteLine("Usage: phpize [--clean|--help|--version|-v]");
! 195: return 0;
! 196: }
! 197: return 1;
! 198: }
! 199: }
! 200:
! 201: if (buildconf_process_args() == 0) {
! 202: WScript.Quit(3);
! 203: }
! 204: STDOUT.WriteLine("Rebuilding configure.js");
! 205: STDOUT.WriteLine(PHP_DIR);
! 206:
! 207: // Write the head of the configure script
! 208: C.WriteLine("/* This file automatically generated from script/confutils.js */");
! 209: C.WriteLine("var MODE_PHPIZE = true;");
! 210: C.WriteLine("var PHP_DIR = " + '"' + PHP_DIR.replace(new RegExp('(["\\\\])', "g"), '\\$1') + '"');
! 211:
! 212: C.Write(file_get_contents(PHP_DIR + "/script/confutils.js"));
! 213: C.Write(file_get_contents(PHP_DIR + "/script/config.phpize.js"));
! 214:
! 215: // If project files were requested, pull in the code to generate them
! 216: if (DSP == true) {
! 217: C.WriteLine('PHP_DSP="yes"');
! 218: C.WriteBlankLines(1);
! 219: C.Write(file_get_contents(PHP_DIR + "win32/build/projectgen.js"));
! 220: } else {
! 221: C.WriteLine('PHP_DSP="no"');
! 222: C.WriteBlankLines(1);
! 223: }
! 224:
! 225: // Pull in code for the base detection
! 226: modules = file_get_contents(PHP_DIR + "/script/config.w32.phpize.in");
! 227:
! 228: C.WriteLine("ARG_ENABLE('debug', 'Compile with debugging symbols', \"no\");");
! 229: find_config_w32(".");
! 230:
! 231: // Now generate contents of module based on MODULES, chasing dependencies
! 232: // to ensure that dependent modules are emitted first
! 233: modules += gen_modules();
! 234:
! 235: // Look for ARG_ENABLE or ARG_WITH calls
! 236: re = new RegExp("(ARG_(ENABLE|WITH)\([^;]+\);)", "gm");
! 237: calls = modules.match(re);
! 238: for (i = 0; i < calls.length; i++) {
! 239: item = calls[i];
! 240: C.WriteLine("try {");
! 241: C.WriteLine(item);
! 242: C.WriteLine("} catch (e) {");
! 243: C.WriteLine('\tSTDOUT.WriteLine("problem: " + e);');
! 244: C.WriteLine("}");
! 245: }
! 246:
! 247: C.WriteBlankLines(1);
! 248: C.WriteLine("conf_process_args();");
! 249: C.WriteBlankLines(1);
! 250:
! 251: // Comment out the calls from their original positions
! 252: modules = modules.replace(re, "/* $1 */");
! 253: C.Write(modules);
! 254:
! 255:
! 256: C.WriteBlankLines(1);
! 257: C.Write(file_get_contents(PHP_DIR + "\\script\\configure.tail"));
! 258:
! 259: B.WriteLine("@echo off");
! 260: B.WriteLine("cscript /nologo configure.js %*");
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>