xref: /PHP-5.3/win32/build/phpize.js.in (revision b4ae112d)
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
22var STDOUT = WScript.StdOut;
23
24var FSO = WScript.CreateObject("Scripting.FileSystemObject");
25var C = FSO.CreateTextFile("configure.js", true);
26var B = FSO.CreateTextFile("configure.bat", true);
27var DSP = false;
28re = /\\script/i;
29var PHP_DIR=FSO.GetParentFolderName(WScript.ScriptFullName).replace(re,"");
30
31var modules = "";
32var MODULES = WScript.CreateObject("Scripting.Dictionary");
33var module_dirs = new Array();
34
35function ERROR(msg)
36{
37	STDERR.WriteLine("ERROR: " + msg);
38	WScript.Quit(3);
39}
40
41function 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
49function 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
58function 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
75function 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
120function emit_module(item)
121{
122	return item.dir_line + item.content;
123}
124
125function 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
147function 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
173function 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
201if (buildconf_process_args() == 0) {
202	WScript.Quit(3);
203}
204STDOUT.WriteLine("Rebuilding configure.js");
205STDOUT.WriteLine(PHP_DIR);
206
207// Write the head of the configure script
208C.WriteLine("/* This file automatically generated from script/confutils.js */");
209C.WriteLine("var MODE_PHPIZE = true;");
210C.WriteLine("var PHP_DIR = " + '"' + PHP_DIR.replace(new RegExp('(["\\\\])', "g"), '\\$1') + '"');
211
212C.Write(file_get_contents(PHP_DIR + "/script/confutils.js"));
213C.Write(file_get_contents(PHP_DIR + "/script/config.phpize.js"));
214
215// If project files were requested, pull in the code to generate them
216if (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
226modules = file_get_contents(PHP_DIR + "/script/config.w32.phpize.in");
227
228C.WriteLine("ARG_ENABLE('debug', 'Compile with debugging symbols', \"no\");");
229find_config_w32(".");
230
231// Now generate contents of module based on MODULES, chasing dependencies
232// to ensure that dependent modules are emitted first
233modules += gen_modules();
234
235// Look for ARG_ENABLE or ARG_WITH calls
236re = new RegExp("(ARG_(ENABLE|WITH)\([^;]+\);)", "gm");
237calls = modules.match(re);
238for (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
247C.WriteBlankLines(1);
248C.WriteLine("conf_process_args();");
249C.WriteBlankLines(1);
250
251// Comment out the calls from their original positions
252modules = modules.replace(re, "/* $1 */");
253C.Write(modules);
254
255
256C.WriteBlankLines(1);
257C.Write(file_get_contents(PHP_DIR + "\\script\\configure.tail"));
258
259B.WriteLine("@echo off");
260B.WriteLine("cscript /nologo configure.js %*");
261