You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							183 lines
						
					
					
						
							6.1 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							183 lines
						
					
					
						
							6.1 KiB
						
					
					
				| // Copyright 2005-2013 Intel Corporation.  All Rights Reserved. | |
| // | |
| // This file is part of Threading Building Blocks. | |
| // | |
| // Threading Building Blocks is free software; you can redistribute it | |
| // and/or modify it under the terms of the GNU General Public License | |
| // version 2 as published by the Free Software Foundation. | |
| // | |
| // Threading Building Blocks is distributed in the hope that it will be | |
| // useful, but WITHOUT ANY WARRANTY; without even the implied warranty | |
| // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | |
| // GNU General Public License for more details. | |
| // | |
| // You should have received a copy of the GNU General Public License | |
| // along with Threading Building Blocks; if not, write to the Free Software | |
| // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA | |
| // | |
| // As a special exception, you may use this file as part of a free software | |
| // library without restriction.  Specifically, if other files instantiate | |
| // templates or use macros or inline functions from this file, or you compile | |
| // this file and link it with other files to produce an executable, this | |
| // file does not by itself cause the resulting executable to be covered by | |
| // the GNU General Public License.  This exception does not however | |
| // invalidate any other reasons why the executable file might be covered by | |
| // the GNU General Public License. | |
|  | |
| function doWork() { | |
| 		var WshShell = WScript.CreateObject("WScript.Shell"); | |
| 
 | |
| 		var fso = new ActiveXObject("Scripting.FileSystemObject"); | |
| 
 | |
| 		var tmpExec; | |
| 		tmpExec = WshShell.Run("cmd /c echo int main(){return 0;} >detect.c", 0, true); | |
| 
 | |
| 		// The next block deals with GCC (MinGW) | |
| 		if ( WScript.Arguments.Count() > 1 && WScript.Arguments(1) == "gcc" ) { | |
| 			if ( WScript.Arguments(0) == "/arch" ) { | |
| 				// Get predefined macros | |
| 				tmpExec = WshShell.Run("cmd /C gcc -dM -E detect.c > detect.map", 0, true); | |
| 				var file = fso.OpenTextFile("detect.map", 1, 0); | |
| 				var defs = file.readAll(); | |
| 				file.Close(); | |
| 
 | |
| 				//detect target architecture | |
| 				var intel64=/x86_64|amd64/mgi; | |
| 				var ia32=/i386/mgi; | |
| 				if ( defs.match(intel64) ) { | |
| 					WScript.Echo( "intel64" ); | |
| 				} else if ( defs.match(ia32) ) { | |
| 					WScript.Echo( "ia32" ); | |
| 				} else { | |
| 					WScript.Echo( "unknown" ); | |
| 				} | |
| 			} else { | |
| 				tmpExec = WshShell.Exec("gcc -dumpversion"); | |
| 				var gcc_version = tmpExec.StdOut.ReadLine(); | |
| 				if ( WScript.Arguments(0) == "/runtime" ) { | |
| 					WScript.Echo( "mingw"+gcc_version ); | |
| 				} | |
| 				else if ( WScript.Arguments(0) == "/minversion" ) { | |
| 					// Comparing strings, not numbers; will not work for two-digit versions | |
| 					if ( gcc_version >= WScript.Arguments(2) ) { | |
| 						WScript.Echo( "ok" ); | |
| 					} else { | |
| 						WScript.Echo( "fail" ); | |
| 					} | |
| 				} | |
| 			} | |
| 			return; | |
| 		} | |
| 
 | |
| 		//Compile binary | |
| 		tmpExec = WshShell.Exec("cl /MD detect.c /link /MAP"); | |
| 		while ( tmpExec.Status == 0 ) { | |
| 			WScript.Sleep(100); | |
| 		} | |
| 		//compiler banner that includes version and target arch was printed to stderr | |
| 		var clVersion = tmpExec.StdErr.ReadAll(); | |
| 
 | |
| 		if ( WScript.Arguments(0) == "/arch" ) { | |
| 			//detect target architecture | |
| 			var intel64=/AMD64|EM64T|x64/mgi; | |
| 			var ia64=/IA-64|Itanium/mgi; | |
| 			var ia32=/[80|\s]x86/mgi; | |
| 			if ( clVersion.match(intel64) ) { | |
| 				WScript.Echo( "intel64" ); | |
| 			} else if ( clVersion.match(ia64) ) { | |
| 				WScript.Echo( "ia64" ); | |
| 			} else if ( clVersion.match(ia32) ) { | |
| 				WScript.Echo( "ia32" ); | |
| 			} else { | |
| 				WScript.Echo( "unknown" ); | |
| 			} | |
| 			return; | |
| 		} | |
| 
 | |
| 		if ( WScript.Arguments(0) == "/runtime" ) { | |
| 			//read map-file | |
| 			var map = fso.OpenTextFile("detect.map", 1, 0); | |
| 			var mapContext = map.readAll(); | |
| 			map.Close(); | |
| 
 | |
| 			//detect runtime | |
| 			var vc71=/MSVCR71\.DLL/mgi; | |
| 			var vc80=/MSVCR80\.DLL/mgi; | |
| 			var vc90=/MSVCR90\.DLL/mgi; | |
| 			var vc100=/MSVCR100\.DLL/mgi; | |
| 			var vc110=/MSVCR110\.DLL/mgi; | |
| 			var psdk=/MSVCRT\.DLL/mgi; | |
| 			if ( mapContext.match(vc71) ) { | |
| 				WScript.Echo( "vc7.1" ); | |
| 			} else if ( mapContext.match(vc80) ) { | |
| 				WScript.Echo( "vc8" ); | |
| 			} else if ( mapContext.match(vc90) ) { | |
| 				WScript.Echo( "vc9" ); | |
| 			} else if ( mapContext.match(vc100) ) { | |
| 				WScript.Echo( "vc10" ); | |
| 			} else if ( mapContext.match(vc110) ) { | |
| 				WScript.Echo( "vc11" ); | |
| 			} else { | |
| 				WScript.Echo( "unknown" ); | |
| 			} | |
| 			return; | |
| 		} | |
| 
 | |
| 		if ( WScript.Arguments(0) == "/minversion" ) { | |
| 			var compiler_version; | |
| 			if ( WScript.Arguments(1) == "cl" ) { | |
| 				compiler_version = clVersion.match(/Compiler Version ([0-9.]+)\s/mi)[1]; | |
| 				// compiler_version is in xx.xx.xxxxx.xx format, i.e. a string. | |
| 				// It will compare well with major.minor versions where major has two digits, | |
| 				// which is sufficient as the versions of interest start from 13 (for VC7). | |
| 			} else if ( WScript.Arguments(1) == "icl" ) { | |
| 				// Get predefined ICL macros | |
| 				tmpExec = WshShell.Run("cmd /C icl /QdM /E detect.c > detect.map", 0, true); | |
| 				var file = fso.OpenTextFile("detect.map", 1, 0); | |
| 				var defs = file.readAll(); | |
| 				file.Close(); | |
| 				// In #define __INTEL_COMPILER XXYY, XX is the major ICL version, YY is minor | |
| 				compiler_version = defs.match(/__INTEL_COMPILER[ \t]*([0-9]+).*$/mi)[1]/100; | |
| 				// compiler version is a number; it compares well with another major.minor | |
| 				// version number, where major has one, two, and perhaps more digits (9.1, 11, etc). | |
| 			} | |
| 			if ( compiler_version >= WScript.Arguments(2) ) { | |
| 				WScript.Echo( "ok" ); | |
| 			} else { | |
| 				WScript.Echo( "fail" ); | |
| 			} | |
| 			return; | |
| 		} | |
| } | |
| 
 | |
| function doClean() { | |
| 		var fso = new ActiveXObject("Scripting.FileSystemObject"); | |
| 		// delete intermediate files | |
| 		if ( fso.FileExists("detect.c") ) | |
| 			fso.DeleteFile ("detect.c", false); | |
| 		if ( fso.FileExists("detect.obj") ) | |
| 			fso.DeleteFile ("detect.obj", false); | |
| 		if ( fso.FileExists("detect.map") ) | |
| 			fso.DeleteFile ("detect.map", false); | |
| 		if ( fso.FileExists("detect.exe") ) | |
| 			fso.DeleteFile ("detect.exe", false); | |
| 		if ( fso.FileExists("detect.exe.manifest") ) | |
| 			fso.DeleteFile ("detect.exe.manifest", false); | |
| } | |
| 
 | |
| if ( WScript.Arguments.Count() > 0 ) { | |
| 	 | |
| 	try { | |
| 		doWork(); | |
| 	} catch( error ) { | |
| 		WScript.Echo( "unknown" ); | |
| 	} | |
| 	doClean(); | |
| 
 | |
| } else { | |
| 	WScript.Echo( "Supported options:\n" | |
| 	              + "\t/arch [compiler]\n" | |
| 	              + "\t/runtime [compiler]\n" | |
| 	              + "\t/minversion compiler version" ); | |
| } | |
| 
 |