293 lines
7.2 KiB
Haxe
293 lines
7.2 KiB
Haxe
import haxe.io.Path;
|
|
import sys.FileSystem;
|
|
|
|
class FileGroup
|
|
{
|
|
public var mNewest:Float;
|
|
public var mNewestFile:String;
|
|
public var mCompilerFlags:Array<String>;
|
|
public var mMissingDepends:Array<String>;
|
|
public var mOptions:Array<String>;
|
|
public var mPrecompiledHeader:String;
|
|
public var mPrecompiledHeaderDir:String;
|
|
public var mFiles:Map<String, File>;
|
|
public var mHLSLs:Array<HLSL>;
|
|
public var mDir:String;
|
|
public var mId:String;
|
|
public var mConfig:String;
|
|
public var mCacheDepends:Array<String>;
|
|
public var mDependHash:String;
|
|
public var mAsLibrary:Bool;
|
|
public var mAddTwice:Bool;
|
|
public var mSetImportDir:Bool;
|
|
public var mUseCache:Bool;
|
|
public var mRespectTimestamp:Bool;
|
|
public var mCacheProject:String;
|
|
public var mTags:String;
|
|
public var mNvcc:Bool;
|
|
public var mObjPrefix:String;
|
|
|
|
public function new(inDir:String,inId:String,inSetImportDir = false)
|
|
{
|
|
mId = inId;
|
|
replace(inDir, inSetImportDir);
|
|
}
|
|
|
|
public function toString() return 'FileGroup($mId)';
|
|
|
|
public function replace(inDir:String,inSetImportDir)
|
|
{
|
|
mNewest = 0;
|
|
mFiles = new Map<String, File>();
|
|
mCompilerFlags = [];
|
|
mPrecompiledHeader = "";
|
|
mCacheDepends = [];
|
|
mMissingDepends = [];
|
|
mOptions = [];
|
|
mHLSLs = [];
|
|
mDir = inDir;
|
|
mConfig = "";
|
|
mAsLibrary = false;
|
|
mAddTwice = false;
|
|
mSetImportDir = inSetImportDir;
|
|
mUseCache = false;
|
|
mRespectTimestamp = false;
|
|
mCacheProject = "";
|
|
mNvcc = false;
|
|
mTags = "haxe,static";
|
|
mObjPrefix = "";
|
|
return this;
|
|
}
|
|
|
|
public function find(name:String)
|
|
{
|
|
return mFiles.get(name);
|
|
}
|
|
|
|
public function addFile(file:File)
|
|
{
|
|
mFiles.set(file.mName, file);
|
|
}
|
|
|
|
public function hasFiles():Bool {
|
|
return Lambda.exists(mFiles, function(file:File) { return true; } );
|
|
}
|
|
|
|
public function filter(defines:Map<String,String>)
|
|
{
|
|
var newFiles = new Map<String, File>();
|
|
for(file in mFiles)
|
|
if (file.keep(defines))
|
|
newFiles.set(file.mName, file);
|
|
mFiles = newFiles;
|
|
}
|
|
|
|
public function getTags()
|
|
{
|
|
return mTags;
|
|
}
|
|
|
|
public function addTag(inTag:String)
|
|
{
|
|
if (inTag!=null && inTag!="")
|
|
{
|
|
var have = mTags.split(",");
|
|
if (have.indexOf(inTag)<0)
|
|
{
|
|
have.push(inTag);
|
|
mTags = have.join(",");
|
|
}
|
|
}
|
|
}
|
|
|
|
public function isPrecompiled() return mPrecompiledHeader!="";
|
|
|
|
public function dontPrecompile()
|
|
{
|
|
mPrecompiledHeader = "";
|
|
}
|
|
|
|
public function addCompilerFlag(inFlag:String)
|
|
{
|
|
mCompilerFlags.push(inFlag);
|
|
}
|
|
|
|
public function getCacheProject()
|
|
{
|
|
if (mCacheProject=="")
|
|
mCacheProject = mId;
|
|
return mCacheProject;
|
|
}
|
|
|
|
|
|
public function addDepend(inFile:String, inDateOnly:Bool)
|
|
{
|
|
if (mSetImportDir && !Path.isAbsolute(inFile) )
|
|
inFile = PathManager.combine(mDir, inFile);
|
|
if (!FileSystem.exists(inFile))
|
|
{
|
|
mMissingDepends.push(inFile);
|
|
return;
|
|
}
|
|
var stamp = FileSystem.stat(inFile).mtime.getTime();
|
|
if (stamp>mNewest)
|
|
{
|
|
mNewest = stamp;
|
|
mNewestFile = inFile;
|
|
}
|
|
|
|
if (!inDateOnly)
|
|
mCacheDepends.push(inFile);
|
|
}
|
|
|
|
public function getNewestFile()
|
|
{
|
|
return '$mId($mNewestFile)';
|
|
}
|
|
|
|
public function addDependFiles(inGroup:FileGroup)
|
|
{
|
|
if (inGroup.mNewest>mNewest)
|
|
{
|
|
mNewestFile = inGroup.getNewestFile();
|
|
mNewest = inGroup.mNewest;
|
|
}
|
|
|
|
for(depend in inGroup.mCacheDepends)
|
|
mCacheDepends.push(depend);
|
|
|
|
for(missing in inGroup.mMissingDepends)
|
|
mMissingDepends.push(missing);
|
|
}
|
|
|
|
|
|
public function addHLSL(inFile:String,inProfile:String,inVariable:String,inTarget:String)
|
|
{
|
|
addDepend(inFile, true );
|
|
|
|
mHLSLs.push( new HLSL(inFile,inProfile,inVariable,inTarget) );
|
|
}
|
|
|
|
public function addOptions(inFile:String)
|
|
{
|
|
mOptions.push(inFile);
|
|
}
|
|
|
|
public function checkDependsExist()
|
|
{
|
|
if (mMissingDepends.length>0)
|
|
{
|
|
Log.error("Could not find dependencies for " + mId + " : [ " + mMissingDepends.join (", ") + " ]");
|
|
//throw "Could not find dependencies: " + mMissingDepends.join(",");
|
|
}
|
|
}
|
|
|
|
public function filterOptions(contents:String)
|
|
{
|
|
// Old-style
|
|
if (contents.substr(0,1)==" ")
|
|
return contents;
|
|
|
|
var result = new Array<String>();
|
|
for(def in contents.split("\n"))
|
|
{
|
|
var name = def.split("=")[0];//.toLowerCase();
|
|
if (name.indexOf("hxcpp_link")>=0)
|
|
{
|
|
// Only effects linking, not compiling
|
|
}
|
|
else if (name=="hxcpp_verbose" || name=="hxcpp_silent" || name=="hxcpp_quiet" || name=="hxcpp_times" || name=="hxcpp_neko_buildtool" || name=="hxcpp_link_no_tool_depends" )
|
|
{
|
|
// Does not affect build
|
|
}
|
|
else if (name.indexOf("hxcpp")>=0 || name=="scriptable" || name.indexOf("dll")>=0 || name=="no_console" ||
|
|
name.substr(0,8)=="android-" || name.substr(0,4)=="ndkv" || name=="toolchain" || name=="platform" ||
|
|
name=="toolchain_version" || name=="android_ndk_root" )
|
|
result.push(def);
|
|
}
|
|
|
|
return result.join("\n");
|
|
}
|
|
|
|
public function checkOptions(inObjDir:String)
|
|
{
|
|
var changed = false;
|
|
for(option in mOptions)
|
|
{
|
|
if (!FileSystem.exists(option))
|
|
{
|
|
mMissingDepends.push(option);
|
|
}
|
|
else
|
|
{
|
|
var contents = filterOptions(sys.io.File.getContent(option));
|
|
|
|
var dest = inObjDir + "/" + Path.withoutDirectory(option);
|
|
var skip = false;
|
|
|
|
if (FileSystem.exists(dest))
|
|
{
|
|
var dest_content = filterOptions(sys.io.File.getContent(dest));
|
|
if (dest_content==contents)
|
|
skip = true;
|
|
}
|
|
|
|
if (!skip)
|
|
{
|
|
PathManager.mkdir(inObjDir);
|
|
var stream = sys.io.File.write(dest,true);
|
|
stream.writeString(contents);
|
|
stream.close();
|
|
changed = true;
|
|
}
|
|
addDepend(dest,true);
|
|
}
|
|
}
|
|
return changed;
|
|
}
|
|
|
|
public function getPchDir(inObjDir:String)
|
|
{
|
|
var result = inObjDir + "/__pch/" + mId ;
|
|
PathManager.mkdir(result);
|
|
return result;
|
|
}
|
|
|
|
public function getPchName()
|
|
{
|
|
return Path.withoutDirectory(mPrecompiledHeader);
|
|
}
|
|
|
|
public function isOutOfDate(inStamp:Float)
|
|
{
|
|
return inStamp<mNewest;
|
|
}
|
|
|
|
public function isCached() return CompileCache.hasCache && mUseCache;
|
|
|
|
public function preBuild()
|
|
{
|
|
for(hlsl in mHLSLs)
|
|
hlsl.build();
|
|
|
|
if (CompileCache.hasCache && mUseCache)
|
|
{
|
|
mDependHash = "";
|
|
for(depend in mCacheDepends)
|
|
mDependHash += File.getFileHash(depend,null);
|
|
mDependHash = haxe.crypto.Md5.encode(mDependHash);
|
|
}
|
|
}
|
|
|
|
public function getDependString()
|
|
{
|
|
return "Group(" + mCacheDepends.join(",") + ")";
|
|
}
|
|
|
|
public function setPrecompiled(inFile:String, inDir:String)
|
|
{
|
|
mPrecompiledHeader = inFile;
|
|
mPrecompiledHeaderDir = inDir;
|
|
}
|
|
}
|