forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			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;
 | |
|    }
 | |
| }
 |