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;
 | |
|    }
 | |
| }
 |