749 lines
24 KiB
Haxe
749 lines
24 KiB
Haxe
import haxe.io.Eof;
|
|
import sys.io.Process;
|
|
import sys.FileSystem;
|
|
import BuildTool;
|
|
|
|
class Setup
|
|
{
|
|
static function findAndroidNdkRoot(defines: Map<String,String>, inBaseVersion:Int):String
|
|
{
|
|
var bestVersion = 0.0;
|
|
var result:String = null;
|
|
|
|
var ndkDir = defines.get("ANDROID_NDK_DIR");
|
|
if (ndkDir!=null)
|
|
{
|
|
Log.v("Looking in ANDROID_NDK_DIR " + ndkDir);
|
|
}
|
|
else
|
|
{
|
|
Log.v("ANDROID_NDK_DIR not set");
|
|
if (BuildTool.isMac)
|
|
{
|
|
var lib = defines.get("HOME") + "/Library/Android/sdk/ndk";
|
|
if (FileSystem.exists(lib))
|
|
{
|
|
Log.v("trying default " + lib);
|
|
ndkDir = lib;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (ndkDir!=null)
|
|
{
|
|
ndkDir = ndkDir.split("\\").join("/");
|
|
var files:Array<String> = null;
|
|
var checkFiles:Bool = true;
|
|
try
|
|
{
|
|
files = FileSystem.readDirectory(ndkDir);
|
|
}
|
|
catch (e:Dynamic)
|
|
{
|
|
Log.warn('ANDROID_NDK_DIR "$ndkDir" does not point to a valid directory');
|
|
checkFiles=false;
|
|
}
|
|
if (checkFiles)
|
|
for (file in files)
|
|
{
|
|
file = file.split("\\").join("/");
|
|
var version = getNdkVersion(ndkDir + "/" + file);
|
|
if (inBaseVersion==0 || Std.int(version)==inBaseVersion)
|
|
{
|
|
if (version>bestVersion)
|
|
{
|
|
bestVersion = version;
|
|
result = ndkDir + "/" + file;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Log.v("Looking in ANDROID_SDK/ndk-bundle");
|
|
if (defines.exists("ANDROID_SDK"))
|
|
{
|
|
Log.v("checks default ndk-bundle in android sdk");
|
|
var ndkBundle = defines.get("ANDROID_SDK")+"/ndk-bundle";
|
|
ndkBundle = ndkBundle.split("\\").join("/");
|
|
var version = getNdkVersion(ndkBundle);
|
|
if (version>bestVersion && (inBaseVersion==0 || inBaseVersion==Std.int(version)) )
|
|
{
|
|
Log.v("Using default ndk-bundle in android sdk");
|
|
result = ndkBundle;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
static public function getNdkVersion(inDirName:String):Float
|
|
{
|
|
Log.v("Try to get version from source.properties");
|
|
var src = toPath(inDirName+"/source.properties");
|
|
if (sys.FileSystem.exists(src))
|
|
{
|
|
var fin = sys.io.File.read(src, false);
|
|
try
|
|
{
|
|
while (true)
|
|
{
|
|
var str = fin.readLine();
|
|
var split = str.split ("=");
|
|
var name = StringTools.trim(split[0]);
|
|
if (name == "Pkg.Revision")
|
|
{
|
|
var revision = StringTools.trim(split[1]);
|
|
var split2 = revision.split( "." );
|
|
var result:Float = 1.0 * Std.parseInt(split2[0]) + 0.001 * Std.parseInt(split2[1]);
|
|
if (result>=8)
|
|
{
|
|
Log.v('Deduced NDK version '+result+' from "$inDirName"/source.properties');
|
|
fin.close();
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (e:haxe.io.Eof)
|
|
{
|
|
Log.v('Could not deduce NDK version from "$inDirName"/source.properties');
|
|
}
|
|
fin.close();
|
|
}
|
|
|
|
var dir = inDirName.split("\\").join("/");
|
|
Log.v('Try to get version from directory name "$dir"');
|
|
var extract_version = ~/\/?(android-ndk-)?r(\d+)([a-z]?)$/;
|
|
if (extract_version.match(dir))
|
|
{
|
|
var major:Int = Std.parseInt( extract_version.matched(2) );
|
|
var result:Float = 1.0 * major;
|
|
var minor = extract_version.matched(3);
|
|
if (minor!=null && minor.length>0)
|
|
result += 0.001 * (minor.toLowerCase().charCodeAt(0)-'a'.code);
|
|
return result;
|
|
}
|
|
|
|
Log.v('Could not deduce NDK version from "$inDirName" - assuming 8');
|
|
return 8;
|
|
}
|
|
|
|
public static function initHXCPPConfig(ioDefines:Hash<String>)
|
|
{
|
|
var env = Sys.environment();
|
|
// If the user has set it themselves, they mush know what they are doing...
|
|
if (env.exists("HXCPP_CONFIG"))
|
|
return;
|
|
|
|
var home = "";
|
|
if (env.exists("HOME"))
|
|
home = env.get("HOME");
|
|
else if (env.exists("USERPROFILE"))
|
|
home = env.get("USERPROFILE");
|
|
else
|
|
{
|
|
Log.warn("No $HOME variable set, \".hxcpp_config.xml\" might be missing");
|
|
//Sys.println("Warning: No 'HOME' variable set - .hxcpp_config.xml might be missing.");
|
|
return;
|
|
}
|
|
|
|
ioDefines.set("HXCPP_HOME", home);
|
|
|
|
var config = toPath(home+"/.hxcpp_config.xml");
|
|
ioDefines.set("HXCPP_CONFIG",config);
|
|
|
|
if (BuildTool.HXCPP!="")
|
|
{
|
|
var src = toPath(BuildTool.HXCPP + "/toolchain/example.hxcpp_config.xml");
|
|
if (!sys.FileSystem.exists(config))
|
|
{
|
|
try
|
|
{
|
|
Log.info("", "Copying HXCPP config \"" + src + "\" to \"" + config + "\"");
|
|
sys.io.File.copy(src,config);
|
|
}
|
|
catch(e:Dynamic)
|
|
{
|
|
Log.warn("Could not create HXCPP config \"" + config + "\"");
|
|
//Sys.println("Warning : could not create config: " + config );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function setupMingw(ioDefines:Hash<String>)
|
|
{
|
|
// Setup MINGW_ROOT or fail
|
|
if (!ioDefines.exists("MINGW_ROOT"))
|
|
{
|
|
|
|
var haxelib = PathManager.getHaxelib("minimingw","",false);
|
|
if (haxelib!=null && haxelib!="")
|
|
{
|
|
ioDefines.set("MINGW_ROOT", haxelib);
|
|
Log.v('Using haxelib version of MinGW, $haxelib');
|
|
return;
|
|
}
|
|
|
|
var guesses = ["c:/MinGW"];
|
|
for (guess in guesses)
|
|
{
|
|
if (FileSystem.exists(guess))
|
|
{
|
|
ioDefines.set("MINGW_ROOT", guess);
|
|
Log.v('Using default version of MinGW, $guess');
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (ioDefines.exists("mingw"))
|
|
{
|
|
//when mingw is explicitly indicated but not properly configured, this log will be shown
|
|
Log.error('Could not guess MINGW_ROOT (tried $guesses) - please set explicitly');
|
|
}
|
|
else
|
|
{
|
|
//when both mingw and MSVC is not properly configured, this log will be shown
|
|
Log.error('Could not setup any C++ compiler, please install or reinstall a valid C++ compiler');
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public static function setupEmscripten(ioDefines:Hash<String>)
|
|
{
|
|
// Setup EMSCRIPTEN_SDK if possible - else assume developer has it in path
|
|
if (!ioDefines.exists("EMSCRIPTEN_SDK"))
|
|
{
|
|
var home = ioDefines.get("HXCPP_HOME");
|
|
var file = home + "/.emscripten";
|
|
if (FileSystem.exists(file))
|
|
{
|
|
var content = sys.io.File.getContent(file);
|
|
content = content.split("\r").join("");
|
|
var value = ~/^(\w*)\s*=\s*'(.*)'/;
|
|
for (line in content.split("\n"))
|
|
{
|
|
if (value.match(line))
|
|
{
|
|
var name = value.matched(1);
|
|
var val= value.matched(2);
|
|
if (name=="EMSCRIPTEN_ROOT")
|
|
{
|
|
ioDefines.set("EMSCRIPTEN_SDK", val);
|
|
}
|
|
if (name=="PYTHON")
|
|
ioDefines.set("EMSCRIPTEN_PYTHON", val);
|
|
if (name=="NODE_JS")
|
|
ioDefines.set("EMSCRIPTEN_NODE_JS", val);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public static function isRaspberryPi()
|
|
{
|
|
var modelFile = '/sys/firmware/devicetree/base/model';
|
|
if( !FileSystem.exists( modelFile ) )
|
|
return false;
|
|
try {
|
|
var model = sys.io.File.getContent( modelFile );
|
|
return ~/Raspberry/.match( model );
|
|
} catch(e:Dynamic) {
|
|
trace( e );
|
|
}
|
|
return false;
|
|
}
|
|
|
|
static public function startPdbServer()
|
|
{
|
|
var oldPath = Sys.getCwd();
|
|
try
|
|
{
|
|
// Run it in hxcpp directory so it does not lock the build directory after build finishes
|
|
Sys.setCwd(BuildTool.HXCPP);
|
|
var proc = new Process("mspdbsrv.exe",["-start"]);
|
|
Tools.addOnExitHook(function(_) {
|
|
proc.kill();
|
|
});
|
|
}
|
|
catch(e:Dynamic)
|
|
{
|
|
Log.v("Could not start mspdbsrv:" + e);
|
|
}
|
|
Sys.setCwd(oldPath);
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function setup(inWhat:String,ioDefines:Map<String,String>)
|
|
{
|
|
if (ioDefines.exists("HXCPP_CLEAN_ONLY"))
|
|
return;
|
|
|
|
Profile.push("setup " + inWhat);
|
|
if (inWhat=="androidNdk")
|
|
{
|
|
setupAndroidNdk(ioDefines);
|
|
}
|
|
else if (inWhat=="blackberry")
|
|
{
|
|
setupBlackBerryNativeSDK(ioDefines);
|
|
}
|
|
else if (inWhat=="msvc")
|
|
{
|
|
setupMSVC(ioDefines, ioDefines.exists("HXCPP_M64"), ioDefines.exists("HXCPP_ARM64"), ioDefines.exists("winrt"));
|
|
}
|
|
else if (inWhat=="pdbserver")
|
|
{
|
|
startPdbServer();
|
|
}
|
|
else if (inWhat=="mingw")
|
|
{
|
|
setupMingw(ioDefines);
|
|
}
|
|
else if (inWhat=="emscripten")
|
|
{
|
|
setupEmscripten(ioDefines);
|
|
}
|
|
else if (inWhat=="nvcc")
|
|
{
|
|
BuildTool.setupNvcc();
|
|
}
|
|
else
|
|
{
|
|
Log.error('Unknown setup feature "$inWhat"');
|
|
//throw 'Unknown setup feature $inWhat';
|
|
}
|
|
Profile.pop();
|
|
}
|
|
|
|
static public function setupAndroidNdk(defines:Map<String,String>)
|
|
{
|
|
var root:String = null;
|
|
|
|
if (Log.verbose) Log.println("");
|
|
|
|
var ndkVersion = 0;
|
|
for (i in 6...20)
|
|
{
|
|
if (defines.exists("NDKV" + i))
|
|
{
|
|
ndkVersion = i;
|
|
Log.info("", "\x1b[33;1mRequested Android NDK r" + i + "\x1b[0m");
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!defines.exists("ANDROID_NDK_ROOT") || ndkVersion!=0)
|
|
{
|
|
root = Setup.findAndroidNdkRoot( defines, ndkVersion );
|
|
if (root==null)
|
|
{
|
|
var ndkDir = defines.exists("ANDROID_NDK_DIR") ? defines.get("ANDROID_NDK_DIR") : "not set";
|
|
if (ndkVersion!=0)
|
|
Log.error('ANDROID_NDK_DIR ["$ndkDir"] or ndk-bundle does not contain requested NDK $ndkVersion');
|
|
else
|
|
Log.error('ANDROID_NDK_DIR ["$ndkDir"] or ndk-bundle does not contain a matching NDK');
|
|
}
|
|
else
|
|
{
|
|
Sys.putEnv("ANDROID_NDK_ROOT", root);
|
|
defines.set("ANDROID_NDK_ROOT", root);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
root = defines.get("ANDROID_NDK_ROOT");
|
|
Log.info("", "\x1b[33;1mUsing Android NDK root: " + root + "\x1b[0m");
|
|
}
|
|
|
|
if (ndkVersion==0)
|
|
{
|
|
var version = Setup.getNdkVersion( root );
|
|
if (version > 0)
|
|
{
|
|
Log.info("", "\x1b[33;1mDetected Android NDK " + version + "\x1b[0m");
|
|
defines.set("NDKV" + Std.int(version), "1" );
|
|
ndkVersion = Std.int(version);
|
|
}
|
|
else
|
|
Log.error("Invalid ndk version");
|
|
}
|
|
for (i in 5...ndkVersion+1)
|
|
defines.set("NDKV" + i + "+", "1");
|
|
|
|
var arm_type = 'arm-linux-androideabi';
|
|
var arm_64 = defines.exists('HXCPP_ARM64');
|
|
if(arm_64) arm_type = 'aarch64-linux-android';
|
|
|
|
// Find toolchain
|
|
if (!defines.exists("TOOLCHAIN_VERSION"))
|
|
{
|
|
try
|
|
{
|
|
var files = FileSystem.readDirectory(root+"/toolchains");
|
|
|
|
// Prefer clang?
|
|
var extract_version = ~/^arm-linux-androideabi-(\d.*)/;
|
|
if(arm_64) extract_version = ~/^aarch64-linux-android-(\d.*)/;
|
|
|
|
var bestVer="";
|
|
for (file in files)
|
|
{
|
|
if (extract_version.match(file))
|
|
{
|
|
var ver = extract_version.matched(1);
|
|
if (ver<bestVer || bestVer=="")
|
|
{
|
|
bestVer = ver;
|
|
}
|
|
}
|
|
}
|
|
if (bestVer!="")
|
|
{
|
|
defines.set("TOOLCHAIN_VERSION",bestVer);
|
|
Log.info("", "\x1b[33;1mDetected Android toolchain: "+arm_type+"-" + bestVer + "\x1b[0m");
|
|
}
|
|
}
|
|
catch(e:Dynamic) { }
|
|
}
|
|
|
|
// See what ANDROID_HOST to use ...
|
|
try
|
|
{
|
|
var prebuilt = root+"/toolchains/";
|
|
if (defines.exists("TOOLCHAIN_VERSION"))
|
|
prebuilt += arm_type + "-" + defines.get("TOOLCHAIN_VERSION") + "/prebuilt";
|
|
else
|
|
prebuilt += "llvm/prebuilt";
|
|
var files = FileSystem.readDirectory(prebuilt);
|
|
for (file in files)
|
|
{
|
|
if (!FileSystem.isDirectory (prebuilt + "/" + file))
|
|
{
|
|
files.remove (file);
|
|
}
|
|
}
|
|
if (files.length==1)
|
|
{
|
|
defines.set("ANDROID_HOST", files[0]);
|
|
Log.info("", "\x1b[33;1mDetected Android host: " + files[0] + "\x1b[0m");
|
|
}
|
|
else
|
|
{
|
|
Log.info("", "\x1b[33;1mCould not detect ANDROID_HOST (" + files + ") - using default\x1b[0m");
|
|
}
|
|
}
|
|
catch(e:Dynamic) { }
|
|
|
|
if(defines.exists('NDKV20+')) {
|
|
Log.v([
|
|
"x86 Platform: 16",
|
|
"arm Platform: 16",
|
|
"x86_64 Platform: 21",
|
|
"arm_64 Platform: 21",
|
|
"Frameworks should set the minSdkVersion for each APK to these values."
|
|
].join('\n'));
|
|
}
|
|
else {
|
|
globallySetThePlatform(root, defines);
|
|
}
|
|
}
|
|
|
|
private static function globallySetThePlatform(root:String, defines:Map<String,String>) {
|
|
var androidPlatform = 5;
|
|
if (!defines.exists("PLATFORM"))
|
|
{
|
|
for (i in 5...100)
|
|
{
|
|
var test = "android-" + i;
|
|
if (defines.exists(test))
|
|
{
|
|
defines.set("PLATFORM",test);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (defines.exists("PLATFORM"))
|
|
{
|
|
var platform = defines.get("PLATFORM");
|
|
var id = Std.parseInt( platform.substr("android-".length) );
|
|
if (id==0 || id==null)
|
|
Log.error('Badly formed android PLATFORM "$platform" - should be like android-123');
|
|
androidPlatform = id;
|
|
Log.info("", "\x1b[33;1mUsing Android NDK platform: " + defines.get("PLATFORM") + "\x1b[0m");
|
|
}
|
|
else
|
|
{
|
|
var base = root + "/platforms";
|
|
var best = 0;
|
|
try
|
|
{
|
|
for (file in FileSystem.readDirectory(base))
|
|
{
|
|
if (file.substr(0,8)=="android-")
|
|
{
|
|
var platform = Std.parseInt(file.substr(8));
|
|
if (platform>best)
|
|
best = platform;
|
|
}
|
|
}
|
|
} catch(e:Dynamic) {}
|
|
|
|
if (best==0)
|
|
{
|
|
Log.error("Could not detect Android API platforms in \"" + base + "\"");
|
|
//throw "Could not find platform in " + base;
|
|
}
|
|
|
|
Log.info("", "\x1b[33;1mUsing newest Android NDK platform: " + best + "\x1b[0m");
|
|
defines.set("PLATFORM", "android-" + best);
|
|
androidPlatform = best;
|
|
}
|
|
defines.set("ANDROID_PLATFORM_DEFINE", "HXCPP_ANDROID_PLATFORM=" + androidPlatform);
|
|
if (Log.verbose) Log.println("");
|
|
}
|
|
|
|
public static function setupBlackBerryNativeSDK(ioDefines:Hash<String>)
|
|
{
|
|
if (!ioDefines.exists ("BLACKBERRY_NDK_ROOT"))
|
|
{
|
|
Log.error("Could not find BLACKBERRY_NDK_ROOT variable");
|
|
}
|
|
|
|
var fileName = ioDefines.get ("BLACKBERRY_NDK_ROOT");
|
|
if (BuildTool.isWindows)
|
|
{
|
|
fileName += "\\bbndk-env.bat";
|
|
}
|
|
else
|
|
{
|
|
fileName += "/bbndk-env.sh";
|
|
}
|
|
|
|
if (FileSystem.exists (fileName))
|
|
{
|
|
var fin = sys.io.File.read(fileName, false);
|
|
try
|
|
{
|
|
while(true)
|
|
{
|
|
var str = fin.readLine();
|
|
var split = str.split ("=");
|
|
var name = StringTools.trim (split[0].substr (split[0].lastIndexOf (" ") + 1));
|
|
switch (name)
|
|
{
|
|
case "QNX_HOST", "QNX_TARGET", "QNX_HOST_VERSION", "QNX_TARGET_VERSION":
|
|
var value = split[1];
|
|
if (StringTools.startsWith (value, "${") && split.length > 2)
|
|
{
|
|
value = split[2].substr (0, split[2].length - 1);
|
|
}
|
|
if (StringTools.startsWith(value, "\""))
|
|
{
|
|
value = value.substr (1);
|
|
}
|
|
if (StringTools.endsWith(value, "\""))
|
|
{
|
|
value = value.substr (0, value.length - 1);
|
|
}
|
|
if (name == "QNX_HOST_VERSION" || name == "QNX_TARGET_VERSION")
|
|
{
|
|
if (Sys.getEnv (name) != null)
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
value = StringTools.replace (value, "$BASE_DIR", ioDefines.get ("BLACKBERRY_NDK_ROOT"));
|
|
value = StringTools.replace (value, "%BASE_DIR%", ioDefines.get ("BLACKBERRY_NDK_ROOT"));
|
|
value = StringTools.replace (value, "$TARGET", "qnx6");
|
|
value = StringTools.replace (value, "%TARGET%", "qnx6");
|
|
value = StringTools.replace (value, "$QNX_HOST_VERSION", Sys.getEnv("QNX_HOST_VERSION"));
|
|
value = StringTools.replace (value, "$QNX_TARGET_VERSION", Sys.getEnv("QNX_TARGET_VERSION"));
|
|
value = StringTools.replace (value, "%QNX_HOST_VERSION%", Sys.getEnv("QNX_HOST_VERSION"));
|
|
value = StringTools.replace (value, "%QNX_TARGET_VERSION%", Sys.getEnv("QNX_TARGET_VERSION"));
|
|
}
|
|
ioDefines.set(name,value);
|
|
Sys.putEnv(name,value);
|
|
}
|
|
}
|
|
}
|
|
catch( ex:Eof )
|
|
{}
|
|
fin.close();
|
|
}
|
|
else
|
|
{
|
|
Log.error("Could not find \"" + fileName + "\"");
|
|
}
|
|
}
|
|
|
|
public static function setupMSVC(ioDefines:Hash<String>, in64:Bool, inArm64, isWinRT:Bool)
|
|
{
|
|
var detectMsvc = !ioDefines.exists("NO_AUTO_MSVC") &&
|
|
!ioDefines.exists("HXCPP_MSVC_CUSTOM");
|
|
|
|
if (ioDefines.exists("HXCPP_MSVC_VER"))
|
|
{
|
|
var val = ioDefines.get("HXCPP_MSVC_VER");
|
|
if (val=="")
|
|
detectMsvc = false;
|
|
else
|
|
{
|
|
var ival = Std.parseInt(ioDefines.get("HXCPP_MSVC_VER"));
|
|
if (ival>0)
|
|
{
|
|
var varName = "VS" + ival+ "COMNTOOLS";
|
|
var where = Sys.getEnv(varName);
|
|
if (where==null)
|
|
{
|
|
for (env in Sys.environment().keys())
|
|
{
|
|
if (env.substr(0,2)=="VS")
|
|
{
|
|
Log.info("Found VS variable: " + env);
|
|
//Sys.println("Found VS variable " + env);
|
|
}
|
|
}
|
|
Log.error("Could not find specified MSVC version: " + ival);
|
|
//throw "Could not find specified MSVC version " + ival;
|
|
}
|
|
ioDefines.set("HXCPP_MSVC", where );
|
|
Sys.putEnv("HXCPP_MSVC", where);
|
|
Log.info("", 'Using MSVC Ver $ival in $where ($varName)');
|
|
}
|
|
else
|
|
{
|
|
Log.info("", 'Using specified MSVC Ver $val');
|
|
ioDefines.set("HXCPP_MSVC", val );
|
|
Sys.putEnv("HXCPP_MSVC", val);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (detectMsvc)
|
|
{
|
|
var extra:String = "";
|
|
if (isWinRT)
|
|
extra += "-winrt";
|
|
if (inArm64)
|
|
extra += "-arm64";
|
|
else if (in64)
|
|
extra += "64";
|
|
var xpCompat = false;
|
|
if (ioDefines.exists("HXCPP_WINXP_COMPAT"))
|
|
{
|
|
Sys.putEnv("HXCPP_WINXP_COMPAT","1");
|
|
xpCompat = true;
|
|
}
|
|
Sys.putEnv("msvc_host_arch", ioDefines.exists("windows_arm_host") ? "x86" : "x64" );
|
|
|
|
var vc_setup_proc = new Process("cmd.exe", ["/C", BuildTool.HXCPP + "\\toolchain\\msvc" + extra + "-setup.bat" ]);
|
|
var vars_found = false;
|
|
var error_string = "";
|
|
var output = new Array<String>();
|
|
try{
|
|
while(true)
|
|
{
|
|
var str = vc_setup_proc.stdout.readLine();
|
|
if (str=="HXCPP_VARS")
|
|
vars_found = true;
|
|
else if (!vars_found)
|
|
{
|
|
if (str.substr(0,5)=="Error" || ~/missing/.match(str) )
|
|
error_string = str;
|
|
|
|
output.push(str);
|
|
}
|
|
else
|
|
{
|
|
var pos = str.indexOf("=");
|
|
var name = str.substr(0,pos);
|
|
switch(name.toLowerCase())
|
|
{
|
|
case "path", "vcinstalldir", "windowssdkdir","framework35version",
|
|
"frameworkdir", "frameworkdir32", "frameworkversion",
|
|
"frameworkversion32", "devenvdir", "include", "lib", "libpath", "hxcpp_xp_define",
|
|
"hxcpp_hack_pdbsrv"
|
|
:
|
|
var value = str.substr(pos+1);
|
|
ioDefines.set(name,value);
|
|
Log.v(' msvs $name=$value');
|
|
Sys.putEnv(name,value);
|
|
}
|
|
}
|
|
}
|
|
} catch (e:Dynamic) {
|
|
};
|
|
|
|
vc_setup_proc.exitCode();
|
|
vc_setup_proc.close();
|
|
if (!vars_found || error_string!="")
|
|
{
|
|
for (o in output)
|
|
{
|
|
Log.info(o);
|
|
//BuildTool.println(o);
|
|
}
|
|
if (error_string!="")
|
|
{
|
|
Log.error (error_string);
|
|
//throw(error_string);
|
|
}
|
|
else
|
|
{
|
|
Log.info("Missing HXCPP_VARS");
|
|
//BuildTool.println("Missing HXCPP_VARS");
|
|
}
|
|
|
|
Log.error("Could not automatically setup MSVC");
|
|
//throw("Could not automatically setup MSVC");
|
|
}
|
|
}
|
|
|
|
try
|
|
{
|
|
var proc = new Process("cl.exe",[]);
|
|
var str = proc.stderr.readLine();
|
|
proc.close();
|
|
if (str>"")
|
|
{
|
|
Log.v("MSVC output:" + str);
|
|
var reg = ~/(\d{2})\.\d+/i;
|
|
if (reg.match(str))
|
|
{
|
|
var cl_version = Std.parseInt(reg.matched(1));
|
|
Log.info("", "Using MSVC version: " + cl_version);
|
|
ioDefines.set("MSVC_VER", cl_version+"");
|
|
if (cl_version>=17)
|
|
ioDefines.set("MSVC17+","1");
|
|
if (cl_version>=18)
|
|
ioDefines.set("MSVC18+","1");
|
|
if (cl_version==19)
|
|
ioDefines.set("MSVC19","1");
|
|
BuildTool.sAllowNumProcs = cl_version >= 14;
|
|
var threads = BuildTool.getThreadCount();
|
|
if (threads>1 && cl_version>=18)
|
|
ioDefines.set("HXCPP_FORCE_PDB_SERVER","1");
|
|
}
|
|
}
|
|
} catch(e:Dynamic){}
|
|
//if (cl_version!="") BuildTool.println("Using cl version: " + cl_version);
|
|
}
|
|
|
|
static function toPath(inPath:String)
|
|
{
|
|
if (!BuildTool.isWindows)
|
|
return inPath;
|
|
var bits = inPath.split("/");
|
|
return bits.join("\\");
|
|
}
|
|
}
|