forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			160 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			160 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | import sys.FileSystem; | ||
|  | using StringTools; | ||
|  | 
 | ||
|  | #if haxe4 | ||
|  | import sys.thread.Mutex; | ||
|  | #elseif cpp | ||
|  | import cpp.vm.Mutex; | ||
|  | #else | ||
|  | import neko.vm.Mutex; | ||
|  | #end | ||
|  | 
 | ||
|  | class File | ||
|  | { | ||
|  |    static var mFileHashes = new Map<String,String>(); | ||
|  |    public var mName:String; | ||
|  |    public var mDir:String; | ||
|  |    public var mDependHash:String; | ||
|  |    public var mDepends:Array<String>; | ||
|  |    public var mCompilerFlags:Array<String>; | ||
|  |    public var mGroup:FileGroup; | ||
|  |    public var mTags:String; | ||
|  |    public var mFilterOut:String; | ||
|  |    public var mEmbedName:String; | ||
|  |    public var mScramble:String; | ||
|  |    static public var mDependMutex = new Mutex(); | ||
|  | 
 | ||
|  |    public function new(inName:String, inGroup:FileGroup) | ||
|  |    { | ||
|  |       mName = inName; | ||
|  |       mDir = ""; | ||
|  |       if (inGroup.mDir != "" && !PathManager.isAbsolute(mName)) | ||
|  |          mDir = inGroup.mDir; | ||
|  |       if (mDir!="") mDir += "/"; | ||
|  |       // Do not take copy - use reference so it can be updated | ||
|  |       mGroup = inGroup; | ||
|  |       mDepends = []; | ||
|  |       mCompilerFlags = []; | ||
|  |       mEmbedName = null; | ||
|  |       mScramble = null; | ||
|  |       mTags = null; | ||
|  |    } | ||
|  |     | ||
|  |    inline public function getCacheProject() return mGroup.getCacheProject(); | ||
|  | 
 | ||
|  |    public function isNvcc() return mGroup.mNvcc; | ||
|  | 
 | ||
|  |    public function isResource() return mName.endsWith(".rc"); | ||
|  | 
 | ||
|  |    public function keep(inDefines:Map<String,String>) | ||
|  |    { | ||
|  |       return mFilterOut==null || !inDefines.exists(mFilterOut); | ||
|  |    } | ||
|  | 
 | ||
|  |    public function getTags() | ||
|  |    { | ||
|  |       return mTags==null ? mGroup.mTags : mTags; | ||
|  |    } | ||
|  | 
 | ||
|  |    public function setTags(inTags:String) | ||
|  |    { | ||
|  |       return mTags=inTags; | ||
|  |    } | ||
|  | 
 | ||
|  |    public function computeDependHash(localCache:Map<String,String>) | ||
|  |    { | ||
|  |       mDependHash = ""; | ||
|  |       for(depend in mDepends) | ||
|  |          mDependHash += getFileHash(depend,localCache); | ||
|  |       mDependHash = haxe.crypto.Md5.encode(mDependHash); | ||
|  |    } | ||
|  | 
 | ||
|  |    public function getDependString() | ||
|  |    { | ||
|  |       return "FILES(" + mDepends.join(",") + ")"; | ||
|  |    } | ||
|  | 
 | ||
|  |    public static function getFileHash(inName:String,localCache:Map<String,String>) | ||
|  |    { | ||
|  |       if (localCache==null) | ||
|  |       { | ||
|  |          var result = mFileHashes.get(inName); | ||
|  |          if (result==null) | ||
|  |          { | ||
|  |             var content = sys.io.File.getContent(inName); | ||
|  |             result = haxe.crypto.Md5.encode(content); | ||
|  |             mFileHashes.set(inName,result); | ||
|  |          } | ||
|  |          return result; | ||
|  |       } | ||
|  |       else | ||
|  |       { | ||
|  |          var result = localCache.get(inName); | ||
|  |          if (result!=null) | ||
|  |             return result; | ||
|  | 
 | ||
|  |          mDependMutex.acquire(); | ||
|  |          result = mFileHashes.get(inName); | ||
|  |          mDependMutex.release(); | ||
|  | 
 | ||
|  |          if (result==null) | ||
|  |          { | ||
|  |             var content = sys.io.File.getContent(inName); | ||
|  |             result = haxe.crypto.Md5.encode(content); | ||
|  |             mDependMutex.acquire(); | ||
|  |             mFileHashes.set(inName,result); | ||
|  |             mDependMutex.release(); | ||
|  |          } | ||
|  | 
 | ||
|  |          localCache.set(inName,result); | ||
|  |          return result; | ||
|  |      } | ||
|  |    } | ||
|  | 
 | ||
|  |    public function isOutOfDate(inObj:String, ?dependDebug:String->Void) | ||
|  |    { | ||
|  |       if (!FileSystem.exists(inObj)) | ||
|  |       { | ||
|  |          return true; | ||
|  |       } | ||
|  | 
 | ||
|  |       var obj_stamp = FileSystem.stat(inObj).mtime.getTime(); | ||
|  |       if (mGroup.isOutOfDate(obj_stamp)) | ||
|  |       { | ||
|  |          if (dependDebug!=null) | ||
|  |             dependDebug(mName + "  - whole group is out of date " + mGroup.getNewestFile() + " " + obj_stamp + " < " + mGroup.mNewest); | ||
|  |          return true; | ||
|  |       } | ||
|  | 
 | ||
|  |       var source_name = mDir+mName; | ||
|  |       if (!FileSystem.exists(source_name)) | ||
|  |       { | ||
|  |          Log.error("Could not find source file \"" + source_name + "\""); | ||
|  |          //throw "Could not find source '" + source_name + "'"; | ||
|  |       } | ||
|  |       var source_stamp = FileSystem.stat(source_name).mtime.getTime(); | ||
|  |       if (obj_stamp < source_stamp) | ||
|  |       { | ||
|  |          if (dependDebug!=null) | ||
|  |             dependDebug(mName + ' - stamped $obj_stamp < $source_stamp'); | ||
|  |          return true; | ||
|  |       } | ||
|  |       for(depend in mDepends) | ||
|  |       { | ||
|  |          if (!FileSystem.exists(depend)) | ||
|  |          { | ||
|  |             Log.error("Could not find dependency \"" + depend + "\" for \"" + mName + "\""); | ||
|  |             //throw "Could not find dependency '" + depend + "' for '" + mName + "'"; | ||
|  |          } | ||
|  |          var dependTime =  FileSystem.stat(depend).mtime.getTime(); | ||
|  |          if (dependTime > obj_stamp ) | ||
|  |          { | ||
|  |             if (dependDebug!=null) | ||
|  |                dependDebug(mName + ' - depend $obj_stamp < $dependTime'); | ||
|  |             return true; | ||
|  |          } | ||
|  |       } | ||
|  |       return false; | ||
|  |    } | ||
|  | } |