1// vim:ft=javascript 2// $Id: config.w32 305923 2010-12-02 23:23:14Z pajoye $ 3// "Master" config file; think of it as a configure.in 4// equivalent. 5 6var PHP_CYGWIN="notset"; 7PHP_CL = PATH_PROG('cl', null, 'PHP_CL'); 8if (!PHP_CL) { 9 ERROR("MS C++ compiler is required"); 10} 11/* For the record here: */ 12// 1200 is VC6 13// 1300 is vs.net 2002 14// 1310 is vs.net 2003 15// 1400 is vs.net 2005 16// 1500 is vs.net 2008 17// 1600 is vs.net 2010 18// Which version of the compiler do we have? 19VCVERS = probe_binary(PHP_CL).substr(0, 5).replace('.', ''); 20STDOUT.WriteLine(" Detected compiler " + VC_VERSIONS[VCVERS]); 21AC_DEFINE('COMPILER', VC_VERSIONS[VCVERS], "Detected compiler version"); 22DEFINE("PHP_COMPILER_SHORT", VC_VERSIONS_SHORT[VCVERS]); 23AC_DEFINE('PHP_COMPILER_ID', VC_VERSIONS_SHORT[VCVERS], "Compiler compatibility ID"); 24 25// do we use x64 or 80x86 version of compiler? 26X64 = probe_binary(PHP_CL, 64, null, 'PHP_CL'); 27if (X64) { 28 STDOUT.WriteLine(" Detected 64-bit compiler"); 29} else { 30 STDOUT.WriteLine(" Detected 32-bit compiler"); 31} 32AC_DEFINE('ARCHITECTURE', X64 ? 'x64' : 'x86', "Detected compiler architecture"); 33DEFINE("PHP_ARCHITECTURE", X64 ? 'x64' : 'x86'); 34 35// cygwin now ships with link.exe. Avoid searching the cygwin path 36// for this, as we want the MS linker, not the fileutil 37PATH_PROG('link', WshShell.Environment("Process").Item("PATH")); 38PATH_PROG('nmake'); 39 40// we don't want to define LIB, as that will override the default library path 41// that is set in that env var 42PATH_PROG('lib', null, 'MAKE_LIB'); 43if (!PATH_PROG('bison')) { 44 ERROR('bison is required') 45} 46 47// There's a minimum requirement for re2c.. 48MINRE2C = "0.13.4"; 49 50RE2C = PATH_PROG('re2c'); 51if (RE2C) { 52 var intvers, intmin; 53 var pattern = /\./g; 54 55 RE2CVERS = probe_binary(RE2C, "version"); 56 STDOUT.WriteLine(' Detected re2c version ' + RE2CVERS); 57 58 intvers = RE2CVERS.replace(pattern, '') - 0; 59 intmin = MINRE2C.replace(pattern, '') - 0; 60 61 if (intvers < intmin) { 62 STDOUT.WriteLine('WARNING: The minimum RE2C version requirement is ' + MINRE2C); 63 STDOUT.WriteLine('Parsers will not be generated. Upgrade your copy at http://sf.net/projects/re2c'); 64 DEFINE('RE2C', ''); 65 } else { 66 DEFINE('RE2C_FLAGS', ''); 67 } 68} else { 69 STDOUT.WriteLine('Parsers will not be regenerated'); 70} 71PATH_PROG('zip'); 72PATH_PROG('lemon'); 73 74// avoid picking up midnight commander from cygwin 75PATH_PROG('mc', WshShell.Environment("Process").Item("PATH")); 76 77// Try locating manifest tool 78if (VCVERS > 1200) { 79 PATH_PROG('mt', WshShell.Environment("Process").Item("PATH")); 80} 81 82// stick objects somewhere outside of the source tree 83ARG_ENABLE('object-out-dir', 'Alternate location for binary objects during build', ''); 84if (PHP_OBJECT_OUT_DIR.length) { 85 PHP_OBJECT_OUT_DIR = FSO.GetAbsolutePathName(PHP_OBJECT_OUT_DIR); 86 if (!FSO.FolderExists(PHP_OBJECT_OUT_DIR)) { 87 ERROR('you chosen output directory ' + PHP_OBJECT_OUT_DIR + ' does not exist'); 88 } 89 PHP_OBJECT_OUT_DIR += '\\'; 90} else if (X64) { 91 if (!FSO.FolderExists("x64")) { 92 FSO.CreateFolder("x64"); 93 } 94 PHP_OBJECT_OUT_DIR = 'x64\\'; 95} 96 97ARG_ENABLE('debug', 'Compile with debugging symbols', "no"); 98ARG_ENABLE('debug-pack', 'Release binaries with external debug symbols (--enable-debug must not be specified)', 'no'); 99if (PHP_DEBUG == "yes" && PHP_DEBUG_PACK == "yes") { 100 ERROR("Use of both --enable-debug and --enable-debug-pack not allowed."); 101} 102 103DEFINE('PHP_PREFIX', PHP_PREFIX); 104 105DEFINE("BASE_INCLUDES", "/I " + PHP_DIR + "/include /I " + PHP_DIR + "/include/main /I " + PHP_DIR + "/include/Zend /I " + PHP_DIR + "/include/TSRM /I " + PHP_DIR + "/include/ext "); 106 107// CFLAGS for building the PHP dll 108DEFINE("CFLAGS_PHP", "/D _USRDLL /D PHP5DLLTS_EXPORTS /D PHP_EXPORTS \ 109/D LIBZEND_EXPORTS /D TSRM_EXPORTS /D SAPI_EXPORTS /D WINVER=0x500"); 110 111DEFINE('CFLAGS_PHP_OBJ', '$(CFLAGS_PHP) $(STATIC_EXT_CFLAGS)'); 112 113// General CFLAGS for building objects 114DEFINE("CFLAGS", "/nologo /FD $(BASE_INCLUDES) /D _WINDOWS \ 115/D ZEND_WIN32=1 /D PHP_WIN32=1 /D WIN32 /D _MBCS /W3 "); 116 117if (VCVERS < 1400) { 118 // Enable automatic precompiled headers 119 ADD_FLAG('CFLAGS', ' /YX '); 120 121 if (PHP_DEBUG == "yes") { 122 // Set some debug/release specific options 123 ADD_FLAG('CFLAGS', ' /GZ '); 124 } 125} 126 127if (VCVERS >= 1400) { 128 // fun stuff: MS deprecated ANSI stdio and similar functions 129 // disable annoying warnings. In addition, time_t defaults 130 // to 64-bit. Ask for 32-bit. 131 if (X64) { 132 ADD_FLAG('CFLAGS', ' /wd4996 /Wp64 '); 133 } else { 134 ADD_FLAG('CFLAGS', ' /wd4996 /D_USE_32BIT_TIME_T=1 '); 135 } 136 137 if (PHP_DEBUG == "yes") { 138 // Set some debug/release specific options 139 ADD_FLAG('CFLAGS', ' /RTC1 '); 140 } 141} 142 143ARG_WITH('prefix', 'PHP installation prefix', ''); 144ARG_WITH('mp', 'Tell VC9+ use up to [n,auto,disable] processes for compilation', 'auto'); 145if (VCVERS >= 1500 && PHP_MP != 'disable') { 146 // no from disable-all 147 if(PHP_MP == 'auto' || PHP_MP == 'no') { 148 ADD_FLAG('CFLAGS', ' /MP '); 149 } else { 150 if(parseInt(PHP_MP) != 0) { 151 ADD_FLAG('CFLAGS', ' /MP'+ PHP_MP +' '); 152 } else { 153 STDOUT.WriteLine('WARNING: Invalid argument for MP: ' + PHP_MP); 154 } 155 } 156} 157 158/* For snapshot builders, where can we find the additional 159 * files that make up the snapshot template? */ 160ARG_WITH("snapshot-template", "Path to snapshot builder template dir", "no"); 161 162// General DLL link flags 163DEFINE("DLL_LDFLAGS", "/dll "); 164 165// PHP DLL link flags 166DEFINE("PHP_LDFLAGS", "$(DLL_LDFLAGS)"); 167 168// General libs 169// urlmon.lib ole32.lib oleaut32.lib uuid.lib gdi32.lib winspool.lib comdlg32.lib 170DEFINE("LIBS", "kernel32.lib ole32.lib user32.lib advapi32.lib shell32.lib ws2_32.lib Dnsapi.lib"); 171 172// Set some debug/release specific options 173if (PHP_DEBUG == "yes") { 174 ADD_FLAG("CFLAGS", "/LDd /MDd /W3 /Gm /Od /D _DEBUG /D ZEND_DEBUG=1 " + 175 (X64?"/Zi":"/ZI")); 176 ADD_FLAG("LDFLAGS", "/debug"); 177 // Avoid problems when linking to release libraries that use the release 178 // version of the libc 179 ADD_FLAG("PHP_LDFLAGS", "/nodefaultlib:msvcrt"); 180} else { 181 // Generate external debug files when --enable-debug-pack is specified 182 if (PHP_DEBUG_PACK == "yes") { 183 ADD_FLAG("CFLAGS", "/Zi"); 184 ADD_FLAG("LDFLAGS", "/incremental:no /debug /opt:ref,icf"); 185 } 186 // Equivalent to Release_TSInline build -> best optimization 187 ADD_FLAG("CFLAGS", "/LD /MD /W3 /Ox /D NDebug /D NDEBUG /D ZEND_WIN32_FORCE_INLINE /GF /D ZEND_DEBUG=0"); 188 189 // if you have VS.Net /GS hardens the binary against buffer overruns 190 // ADD_FLAG("CFLAGS", "/GS"); 191} 192 193if (PHP_ZTS == "yes") { 194 ADD_FLAG("CFLAGS", "/D ZTS=1"); 195} 196 197DEFINE("PHP_ZTS_ARCHIVE_POSTFIX", PHP_ZTS == "yes" ? '' : "-nts"); 198 199 200// we want msvcrt in the PHP DLL 201ADD_FLAG("PHP_LDFLAGS", "/nodefaultlib:libcmt"); 202 203// set up the build dir and DLL name 204if (PHP_DEBUG == "yes" && PHP_ZTS == "yes") { 205 DEFINE("BUILD_DIR", PHP_OBJECT_OUT_DIR + "Debug_TS"); 206 if (!MODE_PHPIZE) { 207 DEFINE("PHPDLL", "php" + PHP_VERSION + "ts_debug.dll"); 208 DEFINE("PHPLIB", "php" + PHP_VERSION + "ts_debug.lib"); 209 } 210} else if (PHP_DEBUG == "yes" && PHP_ZTS == "no") { 211 DEFINE("BUILD_DIR", PHP_OBJECT_OUT_DIR + "Debug"); 212 if (!MODE_PHPIZE) { 213 DEFINE("PHPDLL", "php" + PHP_VERSION + "_debug.dll"); 214 DEFINE("PHPLIB", "php" + PHP_VERSION + "_debug.lib"); 215 } 216} else if (PHP_DEBUG == "no" && PHP_ZTS == "yes") { 217 DEFINE("BUILD_DIR", PHP_OBJECT_OUT_DIR + "Release_TS"); 218 if (!MODE_PHPIZE) { 219 DEFINE("PHPDLL", "php" + PHP_VERSION + "ts.dll"); 220 DEFINE("PHPLIB", "php" + PHP_VERSION + "ts.lib"); 221 } 222} else if (PHP_DEBUG == "no" && PHP_ZTS == "no") { 223 DEFINE("BUILD_DIR", PHP_OBJECT_OUT_DIR + "Release"); 224 if (!MODE_PHPIZE) { 225 DEFINE("PHPDLL", "php" + PHP_VERSION + ".dll"); 226 DEFINE("PHPLIB", "php" + PHP_VERSION + ".lib"); 227 } 228} 229 230if (MODE_PHPIZE) { 231 DEFINE("PHPDLL", PHP_DLL); 232 DEFINE("PHPLIB", PHP_DLL_LIB); 233} 234 235// Find the php_build dir - it contains headers and libraries 236// that we need 237ARG_WITH('php-build', 'Path to where you extracted the development libraries (http://wiki.php.net/internals/windows/libs). Assumes that it is a sibling of this source dir (..\\deps) if not specified', 'no'); 238 239if (PHP_PHP_BUILD == 'no') { 240 if (FSO.FolderExists("..\\deps")) { 241 PHP_PHP_BUILD = "..\\deps"; 242 } else { 243 if (FSO.FolderExists("..\\php_build")) { 244 PHP_PHP_BUILD = "..\\php_build"; 245 } else { 246 if (X64) { 247 if (FSO.FolderExists("..\\win64build")) { 248 PHP_PHP_BUILD = "..\\win64build"; 249 } else if (FSO.FolderExists("..\\php-win64-dev\\php_build")) { 250 PHP_PHP_BUILD = "..\\php-win64-dev\\php_build"; 251 } 252 } else { 253 if (FSO.FolderExists("..\\win32build")) { 254 PHP_PHP_BUILD = "..\\win32build"; 255 } else if (FSO.FolderExists("..\\php-win32-dev\\php_build")) { 256 PHP_PHP_BUILD = "..\\php-win32-dev\\php_build"; 257 } 258 } 259 } 260 } 261 PHP_PHP_BUILD = FSO.GetAbsolutePathName(PHP_PHP_BUILD); 262} 263DEFINE("PHP_BUILD", PHP_PHP_BUILD); 264 265ARG_WITH('extra-includes', 'Extra include path to use when building everything', ''); 266ARG_WITH('extra-libs', 'Extra library path to use when linking everything', ''); 267 268var php_usual_include_suspects = PHP_PHP_BUILD+"\\include"; 269var php_usual_lib_suspects = PHP_PHP_BUILD+"\\lib"; 270 271ADD_FLAG("CFLAGS", '/I "' + php_usual_include_suspects + '" '); 272ADD_FLAG("LDFLAGS", '/libpath:"\\"' + php_usual_lib_suspects + '\\"" '); 273 274// Poke around for some headers 275function probe_basic_headers() 276{ 277 var p; 278 279 if (PHP_PHP_BUILD != "no") { 280 php_usual_include_suspects += ";" + PHP_PHP_BUILD + "\\include"; 281 php_usual_lib_suspects += ";" + PHP_PHP_BUILD + "\\lib"; 282 } 283} 284 285function add_extra_dirs() 286{ 287 var path, i, f; 288 289 if (PHP_EXTRA_INCLUDES.length) { 290 path = PHP_EXTRA_INCLUDES.split(';'); 291 for (i = 0; i < path.length; i++) { 292 f = FSO.GetAbsolutePathName(path[i]); 293 if (FSO.FolderExists(f)) { 294 ADD_FLAG("CFLAGS", '/I "' + f + '" '); 295 } 296 } 297 } 298 if (PHP_EXTRA_LIBS.length) { 299 path = PHP_EXTRA_LIBS.split(';'); 300 for (i = 0; i < path.length; i++) { 301 f = FSO.GetAbsolutePathName(path[i]); 302 if (FSO.FolderExists(f)) { 303 if (VCVERS <= 1200 && f.indexOf(" ") >= 0) { 304 ADD_FLAG("LDFLAGS", '/libpath:"\\"' + f + '\\"" '); 305 } else { 306 ADD_FLAG("LDFLAGS", '/libpath:"' + f + '" '); 307 } 308 } 309 } 310 } 311 312} 313 314probe_basic_headers(); 315add_extra_dirs(); 316 317//DEFINE("PHP_BUILD", PHP_PHP_BUILD); 318 319STDOUT.WriteBlankLines(1); 320STDOUT.WriteLine("Build dir: " + get_define('BUILD_DIR')); 321STDOUT.WriteLine("PHP Core: " + get_define('PHPDLL') + " and " + get_define('PHPLIB')); 322 323 324if (VCVERS == 1200) { 325 AC_DEFINE('ZEND_DVAL_TO_LVAL_CAST_OK', 1); 326} 327 328if (VCVERS >= 1400) { 329 AC_DEFINE('HAVE_STRNLEN', 1); 330} 331 332STDOUT.WriteBlankLines(1); 333 334if (PHP_SNAPSHOT_TEMPLATE == "no") { 335 /* default is as a sibling of the php_build dir */ 336 if (FSO.FolderExists(PHP_PHP_BUILD + "\\template")) { 337 PHP_SNAPSHOT_TEMPLATE = FSO.GetAbsolutePathName(PHP_PHP_BUILD + "\\template"); 338 } else if (FSO.FolderExists(PHP_PHP_BUILD + "\\..\\template")) { 339 PHP_SNAPSHOT_TEMPLATE = FSO.GetAbsolutePathName(PHP_PHP_BUILD + "\\..\\template"); 340 } 341} 342 343DEFINE('SNAPSHOT_TEMPLATE', PHP_SNAPSHOT_TEMPLATE); 344 345if (PHP_DSP != "no") { 346 if (FSO.FolderExists("tmp")) { 347 FSO.DeleteFolder("tmp"); 348 } 349 FSO.CreateFolder("tmp"); 350} 351 352AC_DEFINE("PHP_DIR", PHP_DIR); 353DEFINE("PHP_DIR", PHP_DIR); 354