File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / win32 / build / phpize.js.in
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:48:06 2012 UTC (13 years, 1 month ago) by misho
Branches: php, MAIN
CVS tags: v5_4_3elwix, v5_4_29p0, v5_4_29, v5_4_20p0, v5_4_20, v5_4_17p0, v5_4_17, v5_3_10, HEAD
php

    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: phpize.js.in,v 1.1.1.1 2012/02/21 23:48:06 misho Exp $ */
   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>