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