643 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			643 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| import haxe.crypto.Md5;
 | |
| import haxe.io.Path;
 | |
| import sys.FileSystem;
 | |
| 
 | |
| private class FlagInfo
 | |
| {
 | |
|    var flag:String;
 | |
|    var tag:String;
 | |
|    public function new(inFlag:String, inTag:String)
 | |
|    {
 | |
|       flag = inFlag;
 | |
|       tag = inTag;
 | |
|    }
 | |
|    public function add(args:Array<String>, inFilter:Array<String>)
 | |
|    {
 | |
|       var allowSpace = inFilter.indexOf("nvcc")<0;
 | |
|       if ((tag==""&&allowSpace) || inFilter.indexOf(tag)>=0)
 | |
|          args.push(flag);
 | |
|    }
 | |
|    public function toString():String
 | |
|    {
 | |
|       if (tag=="")
 | |
|          return flag;
 | |
|       else
 | |
|          return '$flag($tag)';
 | |
|    }
 | |
| }
 | |
| 
 | |
| class Compiler
 | |
| {
 | |
|    private var mFlags:Array<FlagInfo>;
 | |
|    public var mCFlags:Array<String>;
 | |
|    public var mNvccFlags:Array<String>;
 | |
|    public var mMMFlags:Array<String>;
 | |
|    public var mCPPFlags:Array<String>;
 | |
|    public var mOBJCFlags:Array<String>;
 | |
|    public var mPCHFlags:Array<String>;
 | |
|    public var mAddGCCIdentity:Bool;
 | |
|    public var mExe:String;
 | |
|    public var mOutFlag:String;
 | |
|    public var mObjDir:String;
 | |
|    public var mRelObjDir:String;
 | |
|    public var mExt:String;
 | |
| 
 | |
|    public var mPCHExt:String;
 | |
|    public var mPCHCreate:String;
 | |
|    public var mPCHUse:String;
 | |
|    public var mPCHFilename:String;
 | |
|    public var mPCH:String;
 | |
| 
 | |
|    public var mRcExe:String;
 | |
|    public var mRcExt:String;
 | |
|    public var mRcFlags:Array<String>;
 | |
| 
 | |
|    public var mGetCompilerVersion:String;
 | |
|    public var mCompilerVersion:String;
 | |
|    public var mCompilerVersionString:String;
 | |
|    public var mCached:Bool;
 | |
| 
 | |
|    public var mID:String;
 | |
| 
 | |
|    //testing...
 | |
|    public var useCacheInPlace = true;
 | |
|    //public var useCacheInPlace = false;
 | |
| 
 | |
|    public function new(inID,inExe:String)
 | |
|    {
 | |
|       mFlags = [];
 | |
|       mCFlags = [];
 | |
|       mNvccFlags = [];
 | |
|       mCPPFlags = [];
 | |
|       mOBJCFlags = [];
 | |
|       mMMFlags = [];
 | |
|       mPCHFlags = [];
 | |
|       mAddGCCIdentity = false;
 | |
|       mCompilerVersion = null;
 | |
|       mRcExt = ".res";
 | |
|       mObjDir = "obj";
 | |
|       mOutFlag = "-o";
 | |
|       mExe = inExe;
 | |
|       mID = inID;
 | |
|       mExt = ".o";
 | |
|       mPCHExt = ".pch";
 | |
|       mPCHCreate = "-Yc";
 | |
|       mPCHUse = "-Yu";
 | |
|       mPCHFilename = "/Fp";
 | |
|       mCached = false;
 | |
|       mRcFlags = [];
 | |
|    }
 | |
| 
 | |
|    public function getFlagStrings()
 | |
|    {
 | |
|       var result = new Array<String>();
 | |
|       for(f in mFlags)
 | |
|          result.push( f.toString() );
 | |
|       return result;
 | |
|    }
 | |
| 
 | |
|    public function addFlag(inFlag:String, inTag:String)
 | |
|    {
 | |
|       mFlags.push( new FlagInfo(inFlag, inTag) );
 | |
|    }
 | |
| 
 | |
| 
 | |
|    public function objToAbsolute()
 | |
|    {
 | |
|       if (mRelObjDir==null)
 | |
|          mRelObjDir = mObjDir;
 | |
|       mObjDir = Path.normalize( PathManager.combine( Sys.getCwd(), mRelObjDir ) );
 | |
|    }
 | |
| 
 | |
|    public function getTargetPrefix()
 | |
|    {
 | |
|       var dir = mRelObjDir!=null ? mRelObjDir : mObjDir;
 | |
|       dir = dir.split("\\").join("/");
 | |
|       var parts = dir.split("/");
 | |
|       // Trailing slash?
 | |
|       var prefix = parts.pop();
 | |
|       if (prefix=="")
 | |
|          prefix = parts.pop();
 | |
|       if (prefix==null)
 | |
|          prefix = "";
 | |
|       prefix = prefix.split("-").join("_");
 | |
|       return prefix;
 | |
|    }
 | |
| 
 | |
|    function addIdentity(ext:String,ioArgs:Array<String>)
 | |
|    {
 | |
|       if (mAddGCCIdentity)
 | |
|       {
 | |
|          var identity = switch(ext)
 | |
|            {
 | |
|               case "c" : "c";
 | |
|               case "m" : "objective-c";
 | |
|               case "mm" : "objective-c++";
 | |
|               case "cpp" : "c++";
 | |
|               case "c++" : "c++";
 | |
|               default:"";
 | |
|          }
 | |
|          if (identity!="")
 | |
|          {
 | |
|             ioArgs.push("-x");
 | |
|             ioArgs.push(identity);
 | |
|          }
 | |
|       }
 | |
|    }
 | |
| 
 | |
|    function addOptimTags(tagFilter:Array<String>)
 | |
|    {
 | |
|       var optimFlags = (tagFilter.indexOf("debug") >= 0 ? 1 : 0) +
 | |
|                        (tagFilter.indexOf("release") >= 0 ? 1 : 0) +
 | |
|                        (tagFilter.indexOf("optim-std") >= 0 ? 1 : 0) +
 | |
|                        (tagFilter.indexOf("optim-none") >= 0 ? 1 : 0) +
 | |
|                        (tagFilter.indexOf("optim-size") >= 0 ? 1 : 0);
 | |
|       if (optimFlags==0)
 | |
|          tagFilter.push("optim-std");
 | |
|       else if (optimFlags>1)
 | |
|          Log.error("More than one optimization tag has been set:" + tagFilter);
 | |
|    }
 | |
| 
 | |
| 
 | |
|    public function getCompilerDefines(inTags:String)
 | |
|    {
 | |
|       var args = new Array<String>();
 | |
|       var tagFilter = inTags.split(",");
 | |
|       addOptimTags(tagFilter);
 | |
|       for(flag in mFlags)
 | |
|          flag.add(args,tagFilter);
 | |
|       return args;
 | |
|    }
 | |
| 
 | |
|    function getArgs(inFile:File)
 | |
|    {
 | |
|       var nvcc = inFile.isNvcc();
 | |
|       var isRc = mRcExe!=null && inFile.isResource();
 | |
|       var args = nvcc ? inFile.mGroup.mCompilerFlags.concat( BuildTool.getNvccFlags() ) :
 | |
|                        inFile.mCompilerFlags.concat(inFile.mGroup.mCompilerFlags);
 | |
|       var tagFilter = inFile.getTags().split(",");
 | |
|       addOptimTags(tagFilter);
 | |
|       if (!isRc)
 | |
|          for(flag in mFlags)
 | |
|             flag.add(args,tagFilter);
 | |
|       var ext = mExt.toLowerCase();
 | |
|       var ext = new Path(inFile.mName).ext;
 | |
|       if (ext!=null)
 | |
|          ext = ext.toLowerCase();
 | |
|       else
 | |
|          Log.error("Unkown extension for " + inFile.mName);
 | |
| 
 | |
| 
 | |
|       addIdentity(ext,args);
 | |
| 
 | |
|       var allowPch = false;
 | |
|       if (nvcc)
 | |
|          args = args.concat(mNvccFlags);
 | |
|       else if (isRc)
 | |
|          args = args.concat(mRcFlags);
 | |
|       else if (ext=="c")
 | |
|          args = args.concat(mCFlags);
 | |
|       else if (ext=="m")
 | |
|          args = args.concat(mOBJCFlags);
 | |
|       else if (ext=="mm")
 | |
|          args = args.concat(mMMFlags);
 | |
|       else if (ext=="cpp" || ext=="c++" || ext=="cc")
 | |
|       {
 | |
|          allowPch = true;
 | |
|          args = args.concat(mCPPFlags);
 | |
|       }
 | |
| 
 | |
|       if (isRc || inFile.getTags()!=inFile.mGroup.getTags())
 | |
|          allowPch = false;
 | |
| 
 | |
|       if (inFile.mGroup.isPrecompiled() && allowPch)
 | |
|       {
 | |
|          var pchDir = getPchDir(inFile.mGroup);
 | |
|          if (mPCHUse!="")
 | |
|          {
 | |
|             args.push(mPCHUse + inFile.mGroup.mPrecompiledHeader + ".h");
 | |
|             args.push(mPCHFilename + pchDir + "/" + inFile.mGroup.getPchName() + mPCHExt);
 | |
|          }
 | |
|          else
 | |
|             args.unshift("-I"+pchDir);
 | |
|       }
 | |
| 
 | |
|       return args;
 | |
|    }
 | |
| 
 | |
|    public function createEmbedFile(srcName:String, destName:String, embedName:String, scramble:String)
 | |
|    {
 | |
|       try
 | |
|       {
 | |
|           var content = sys.io.File.getContent(srcName);
 | |
|           var output = new Array<String>();
 | |
| 
 | |
|           if (scramble==null)
 | |
|           {
 | |
|              output.push( 'const char *$embedName = ' );
 | |
|              content = content.split("\r").join("");
 | |
|              content = content.split("\\").join( String.fromCharCode(1) );
 | |
|              content = content.split('"').join('\\"');
 | |
|              content = content.split(String.fromCharCode(1)).join("\\\\" );
 | |
|              var lines = content.split("\n");
 | |
|              for(line in lines)
 | |
|                  output.push( '"$line\\n"' );
 | |
|              output.push(";\n");
 | |
|           }
 | |
|           else
 | |
|           {
 | |
|              var bytes = haxe.io.Bytes.ofString(content);
 | |
|              var byteLen = bytes.length;
 | |
|              var key = haxe.io.Bytes.ofString(scramble);
 | |
|              var keyLen = key.length;
 | |
|              var state = 0;
 | |
|              var line = "";
 | |
| 
 | |
|              output.push( 'int ${embedName}_len = $byteLen;' );
 | |
|              output.push( 'static const unsigned char data[] = {' );
 | |
|              for(i in 0...byteLen)
 | |
|              {
 | |
|                 var ch = bytes.get(i);
 | |
|                 state = (((state + key.get(i%keyLen)) ^ ch) & 0xff);
 | |
|                 line += state + ",";
 | |
|                 if ( (i%10)==9 )
 | |
|                 {
 | |
|                    output.push(line);
 | |
|                    line = "";
 | |
|                 }
 | |
|              }
 | |
|              if (line!="")
 | |
|                 output.push(line);
 | |
|              output.push( '};' );
 | |
|              output.push( 'const unsigned char * $embedName = data;' );
 | |
|           }
 | |
|           sys.io.File.saveContent(destName, output.join("\n") );
 | |
|       }
 | |
|       catch(e:Dynamic)
 | |
|       {
 | |
|          Log.warn('Error creating $destName from $srcName: $e');
 | |
|       }
 | |
|    }
 | |
| 
 | |
|    public function cleanTmp(file:String)
 | |
|    {
 | |
|       if (BuildTool.keepTemp())
 | |
|          return;
 | |
| 
 | |
|       try
 | |
|       {
 | |
|          if (file!=null && FileSystem.exists(file))
 | |
|             FileSystem.deleteFile(file);
 | |
|       }
 | |
|       catch(e:Dynamic) { }
 | |
|    }
 | |
| 
 | |
|    public function compile(inFile:File,inTid:Int,headerFunc:Void->Void,pchTimeStamp:Null<Float>)
 | |
|    {
 | |
|       var obj_name = getObjName(inFile);
 | |
|       var args = getArgs(inFile);
 | |
|       var nvcc = inFile.isNvcc();
 | |
|       var exe = nvcc ? BuildTool.getNvcc() : mExe;
 | |
|       var isRc =  mRcExe!=null && inFile.isResource();
 | |
|       if (isRc)
 | |
|          exe = mRcExe;
 | |
| 
 | |
|       var found = false;
 | |
|       var cacheName:String = null;
 | |
|       if (mCompilerVersion!=null && inFile.mGroup.isCached())
 | |
|       {
 | |
|          cacheName = getHashedName(inFile, args);
 | |
|          if (useCacheInPlace)
 | |
|          {
 | |
|             //Log.info(""," link cache for " + obj_name );
 | |
|             obj_name = cacheName;
 | |
|          }
 | |
| 
 | |
|          if (FileSystem.exists(cacheName))
 | |
|          {
 | |
|             var newer = true;
 | |
|             if (pchTimeStamp!=null || inFile.mGroup.mRespectTimestamp)
 | |
|             {
 | |
|                var time = FileSystem.stat(cacheName).mtime.getTime();
 | |
| 
 | |
|                if (pchTimeStamp!=null)
 | |
|                   newer = time>=pchTimeStamp;
 | |
|                if (inFile.mGroup.mRespectTimestamp)
 | |
|                   newer = newer && time>= FileSystem.stat(inFile.mDir + "/" + inFile.mName).mtime.getTime();
 | |
|             }
 | |
|             if (newer)
 | |
|             {
 | |
|                //Log.info(""," copy cache for " + obj_name );
 | |
|                if (!useCacheInPlace)
 | |
|                   sys.io.File.copy(cacheName, obj_name);
 | |
|                found = true;
 | |
|             }
 | |
|          }
 | |
|       }
 | |
| 
 | |
|       if (!found)
 | |
|       {
 | |
|          if (headerFunc!=null)
 | |
|             headerFunc();
 | |
| 
 | |
|          var tmpFile:String = null;
 | |
|          var delayedFilename:String = null;
 | |
| 
 | |
|          if (inFile.mEmbedName!=null)
 | |
|          {
 | |
|             var srcDir =  Path.directory( inFile.mDir + "/" + inFile.mName);
 | |
|             tmpFile = new Path( srcDir + "/" + inFile.mEmbedName + ".cpp").toString();
 | |
|             Log.v("Creating temp file " + tmpFile);
 | |
|             createEmbedFile( inFile.mDir + "/" + inFile.mName, tmpFile, inFile.mEmbedName, inFile.mScramble );
 | |
|             args.push( tmpFile );
 | |
|          }
 | |
|          else
 | |
|          {
 | |
|             if (isRc)
 | |
|                delayedFilename = (new Path( inFile.mDir + inFile.mName)).toString();
 | |
|             else
 | |
|                args.push( (new Path( inFile.mDir + inFile.mName)).toString() );
 | |
|          }
 | |
| 
 | |
|          var out = nvcc ? "-o " : mOutFlag;
 | |
|          if (out.substr(-1)==" ")
 | |
|          {
 | |
|             args.push(out.substr(0,out.length-1));
 | |
|             out = "";
 | |
|          }
 | |
| 
 | |
|          args.push(out + obj_name);
 | |
| 
 | |
|          if (delayedFilename!=null)
 | |
|            args.push(delayedFilename);
 | |
| 
 | |
|          var tagInfo = inFile.mTags==null ? "" : " " + inFile.mTags.split(",");
 | |
| 
 | |
|          var fileName = inFile.mName;
 | |
|          var split = fileName.split ("/");
 | |
|          if (split.length > 1)
 | |
|          {
 | |
|             fileName = " \x1b[2m-\x1b[0m \x1b[33m" + split.slice(0, split.length - 1).join("/") + "/\x1b[33;1m" + split[split.length - 1] + "\x1b[0m";
 | |
|          }
 | |
|          else
 | |
|          {
 | |
|             fileName = " \x1b[2m-\x1b[0m \x1b[33;1m" + fileName + "\x1b[0m";
 | |
|          }
 | |
|          fileName += " \x1b[3m" + tagInfo + "\x1b[0m";
 | |
| 
 | |
| 
 | |
|          if (inTid >= 0)
 | |
|          {
 | |
|             if (BuildTool.threadExitCode == 0)
 | |
|             {
 | |
|                if (!Log.verbose)
 | |
|                {
 | |
|                   Log.info(fileName);
 | |
|                }
 | |
|                var err = ProcessManager.runProcessThreaded(exe, args, null);
 | |
|                cleanTmp(tmpFile);
 | |
|                if (err!=0)
 | |
|                {
 | |
|                   if (FileSystem.exists(obj_name))
 | |
|                      FileSystem.deleteFile(obj_name);
 | |
|                   BuildTool.setThreadError(err);
 | |
|                }
 | |
|             }
 | |
|          }
 | |
|          else
 | |
|          {
 | |
|             if (!Log.verbose)
 | |
|             {
 | |
|                Log.info(fileName);
 | |
|             }
 | |
|             var result = ProcessManager.runProcessThreaded(exe, args, null);
 | |
|             cleanTmp(tmpFile);
 | |
|             if (result!=0)
 | |
|             {
 | |
|                if (FileSystem.exists(obj_name))
 | |
|                   FileSystem.deleteFile(obj_name);
 | |
|                Tools.exit (result);
 | |
|                //throw "Error : " + result + " - build cancelled";
 | |
|             }
 | |
|          }
 | |
| 
 | |
|          if (cacheName!=null && !useCacheInPlace)
 | |
|          {
 | |
|             Log.info("", " caching " + cacheName);
 | |
|             sys.io.File.copy(obj_name, cacheName);
 | |
|          }
 | |
|       }
 | |
| 
 | |
|       return obj_name;
 | |
|    }
 | |
| 
 | |
|    public function createCompilerVersion(inGroup:FileGroup)
 | |
|    {
 | |
|       if ( mCompilerVersion==null)
 | |
|       {
 | |
|          var versionString = "";
 | |
|          var command = "";
 | |
| 
 | |
|          if (mGetCompilerVersion==null)
 | |
|          {
 | |
|             command = mExe + " --version";
 | |
|             versionString = ProcessManager.readStdout(mExe,["--version"]).join(" ");
 | |
|          }
 | |
|          else
 | |
|          {
 | |
|             command = mGetCompilerVersion;
 | |
|             versionString = ProcessManager.readStderr(mGetCompilerVersion,[]).join(" ");
 | |
|          }
 | |
| 
 | |
|          if (versionString=="" || versionString==null)
 | |
|             Log.error("Could not deduce compiler version with " + command);
 | |
| 
 | |
|          Log.info("", "Compiler version: " +  versionString);
 | |
| 
 | |
|          mCompilerVersionString = versionString;
 | |
|          mCompilerVersion = Md5.encode(versionString);
 | |
|          mCached = true;
 | |
|       }
 | |
| 
 | |
|       return mCached;
 | |
|    }
 | |
| 
 | |
|    function getObjName(inFile:File)
 | |
|    {
 | |
|       var isRc = mRcExe!=null && inFile.isResource();
 | |
| 
 | |
|       var path = new Path(inFile.mName);
 | |
|       var dirId = Md5.encode(BuildTool.targetKey + path.dir + inFile.mGroup.mId).substr(0,8) + "_";
 | |
| 
 | |
|       return PathManager.combine(mObjDir, inFile.mGroup.mObjPrefix + dirId + path.file + (isRc ? mRcExt : mExt) );
 | |
|    }
 | |
| 
 | |
|    function getHashedName(inFile:File, args:Array<String>)
 | |
|    {
 | |
|       var sourceName = inFile.mDir + inFile.mName;
 | |
|       var contents = sys.io.File.getContent(sourceName);
 | |
|       if (contents!="")
 | |
|       {
 | |
|          var md5 = Md5.encode(contents + args.join(" ") +
 | |
|              inFile.mGroup.mDependHash + mCompilerVersion + inFile.mDependHash );
 | |
|          return CompileCache.getCacheName(inFile.getCacheProject(),md5,mExt);
 | |
|       }
 | |
|       else
 | |
|          throw "Unkown source contents " + sourceName;
 | |
|       return "";
 | |
|    }
 | |
| 
 | |
|    public function getCacheString(inFile:File)
 | |
|    {
 | |
|       var args = getArgs(inFile);
 | |
|       return ("<contents>" + args.join(" ") + " " + inFile.mGroup.getDependString() +  " " + mCompilerVersionString + " " + inFile.getDependString() );
 | |
|    }
 | |
| 
 | |
|    public function getCachedObjName(inFile:File)
 | |
|    {
 | |
|       if (mCompilerVersion!=null && useCacheInPlace && inFile.mGroup.isCached())
 | |
|       {
 | |
|          //trace(inFile.mName + " " + inFile.getTags().split(",") + " " + getFlagStrings() + " " + getArgs(inFile));
 | |
|          return getHashedName(inFile, getArgs(inFile));
 | |
|       }
 | |
|       else
 | |
|          return getObjName(inFile);
 | |
|    }
 | |
| 
 | |
|    public function needsPchObj()
 | |
|    {
 | |
|       return mPCH!="gcc";
 | |
|    }
 | |
| 
 | |
| /*
 | |
|    public function getPchObjName(group:FileGroup)
 | |
|    {
 | |
|       var pchDir = getPchDir(group);
 | |
|       if (pchDir != "")
 | |
|          return pchDir + "/" + group.getPchName() + mExt;
 | |
|       throw "Missing precompiled directory name";
 | |
|    }
 | |
| */
 | |
|    public function getPchCompileFlags(inGroup:FileGroup)
 | |
|    {
 | |
|       var args = inGroup.mCompilerFlags.copy();
 | |
|       var tags = inGroup.mTags.split(",");
 | |
|       addOptimTags(tags);
 | |
|       for(flag in mFlags)
 | |
|          flag.add(args,tags);
 | |
| 
 | |
|       return  args.concat( mCPPFlags );
 | |
|    }
 | |
| 
 | |
|    public function getPchDir(inGroup:FileGroup)
 | |
|    {
 | |
|       if (!inGroup.isCached())
 | |
|          return inGroup.getPchDir(mObjDir);
 | |
| 
 | |
|       var args = getPchCompileFlags(inGroup);
 | |
|       var md5 = Md5.encode(args.join(" ") + inGroup.mPrecompiledHeader +
 | |
|                     inGroup.mDependHash + mCompilerVersion );
 | |
|       return CompileCache.getPchDir(inGroup.getCacheProject(),md5);
 | |
|    }
 | |
| 
 | |
|    public function precompile(inGroup:FileGroup, inReuseIfPossible:Bool)
 | |
|    {
 | |
|       // header will be like "hxcpp" or "wx/wx"
 | |
|       var header = inGroup.mPrecompiledHeader;
 | |
|       // file will be like "hxcpp" or "wx"
 | |
|       var file = inGroup.getPchName();
 | |
| 
 | |
|       var args = getPchCompileFlags(inGroup);
 | |
| 
 | |
|       // Local output dir
 | |
|       var dir = getPchDir(inGroup);
 | |
| 
 | |
|       // Like objs/hxcpp.pch or objs/wx.gch
 | |
|       var pch_name = dir + "/" + file + mPCHExt;
 | |
|       if (inGroup.isCached() || inReuseIfPossible)
 | |
|       {
 | |
|           // No obj needed for gcc
 | |
|           var obj = mPCH=="gcc" ? null : PathManager.combine(dir, file + mExt);
 | |
|           if (FileSystem.exists(pch_name) && (obj==null || FileSystem.exists(obj)) )
 | |
|              return obj;
 | |
|       }
 | |
| 
 | |
|       args = args.concat( mPCHFlags );
 | |
| 
 | |
| 
 | |
|       //Log.info("", "Make pch dir " + dir );
 | |
|       PathManager.mkdir(dir);
 | |
| 
 | |
|       if (mPCH!="gcc")
 | |
|       {
 | |
|          args.push( mPCHCreate + header + ".h" );
 | |
|          var symbol = "link" + Md5.encode( PathManager.combine(dir, file + mExt) );
 | |
|          args.push( "-Yl" + symbol  );
 | |
| 
 | |
|          // Create a temp file for including ...
 | |
|          var tmp_cpp = dir + "/" + file + ".cpp";
 | |
|          var outFile = sys.io.File.write(tmp_cpp,false);
 | |
|          outFile.writeString("#include <" + header + ".h>\n");
 | |
|          outFile.close();
 | |
| 
 | |
|          args.push( tmp_cpp );
 | |
|          args.push(mPCHFilename + pch_name);
 | |
|          args.push(mOutFlag + PathManager.combine(dir, file + mExt));
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|          Log.info("", 'Creating PCH directory "$dir"');
 | |
|          PathManager.mkdir(dir);
 | |
|          args.push( "-o" );
 | |
|          args.push(pch_name);
 | |
|          args.push( inGroup.mPrecompiledHeaderDir + "/" + inGroup.mPrecompiledHeader + ".h" );
 | |
|       }
 | |
| 
 | |
|       Log.info("Creating " + pch_name + "...", " - Precompile " + pch_name );
 | |
|       var result = ProcessManager.runCommand("", mExe, args);
 | |
|       if (result!=0)
 | |
|       {
 | |
|          var goes = 10;
 | |
|          for(attempt in 0...goes)
 | |
|          {
 | |
|             try {
 | |
|                if (FileSystem.exists(pch_name))
 | |
|                   FileSystem.deleteFile(pch_name);
 | |
|                break;
 | |
|             }
 | |
|             catch(error:Dynamic)
 | |
|             {
 | |
|                Log.warn('Error cleaning PCH file $pch_name: $error');
 | |
|                if (attempt<goes-1)
 | |
|                   Sys.sleep(0.25);
 | |
|             }
 | |
|          }
 | |
|          Log.error("Could not create PCH");
 | |
|          //throw "Error creating pch: " + result + " - build cancelled";
 | |
|       }
 | |
| 
 | |
|       if (mPCH!="gcc")
 | |
|          return  PathManager.combine(dir, file + mExt);
 | |
|       return null;
 | |
|    }
 | |
| 
 | |
|    public function setPCH(inPCH:String)
 | |
|    {
 | |
|       mPCH = inPCH;
 | |
|       if (mPCH=="gcc")
 | |
|       {
 | |
|          mPCHExt = ".h.gch";
 | |
|          mPCHUse = "";
 | |
|          mPCHFilename = "";
 | |
|       }
 | |
|    }
 | |
| 
 | |
|    public function initPrecompile(inDefault:String)
 | |
|    {
 | |
|       if (mPCH==null)
 | |
|          setPCH(inDefault);
 | |
|       return mPCH!=null;
 | |
|    }
 | |
| 
 | |
| }
 |