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