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