123 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			123 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | import haxe.io.Path; | ||
|  | import sys.FileSystem; | ||
|  | 
 | ||
|  | class Prelinker | ||
|  | { | ||
|  |    public var mExe:String; | ||
|  |    public var mFlags:Array<String>; | ||
|  |    public var mOutFlag:String; | ||
|  |    public var mFromFile:String; | ||
|  |    public var mExpandArchives:Bool; | ||
|  | 
 | ||
|  |    public function new(inExe:String) | ||
|  |    { | ||
|  |       mFlags = []; | ||
|  |       mOutFlag = "-o"; | ||
|  |       mExe = inExe; | ||
|  |       mExpandArchives = false; | ||
|  |       // Default to on... | ||
|  |       mFromFile = "@"; | ||
|  |    } | ||
|  | 
 | ||
|  |    function isOutOfDate(inName:String, inObjs:Array<String>) | ||
|  |    { | ||
|  |       if (!FileSystem.exists(inName)) | ||
|  |          return true; | ||
|  |       var stamp = FileSystem.stat(inName).mtime.getTime(); | ||
|  |       for(obj in inObjs) | ||
|  |       { | ||
|  |          if (!FileSystem.exists(obj)) | ||
|  |          { | ||
|  |             Log.error("Could not find \"" + obj + "\" required by \"" + inName + "\""); | ||
|  |             //throw "Could not find " + obj + " required by " + inName; | ||
|  |          } | ||
|  |          var obj_stamp = FileSystem.stat(obj).mtime.getTime(); | ||
|  |          if (obj_stamp > stamp) | ||
|  |             return true; | ||
|  |       } | ||
|  |       return false; | ||
|  |    } | ||
|  | 
 | ||
|  |    public function prelink(inTarget:Target,inObjs:Array<String>,inCompiler:Compiler) | ||
|  |    { | ||
|  |       var file_name = "prelink.o"; | ||
|  | 
 | ||
|  |       try | ||
|  |       { | ||
|  |          PathManager.mkdir(inTarget.mOutputDir); | ||
|  |       } | ||
|  |       catch (e:Dynamic) | ||
|  |       { | ||
|  |          Log.error("Unable to create output directory \"" + inTarget.mOutputDir + "\""); | ||
|  |          //throw "Unable to create output directory " + inTarget.mOutputDir; | ||
|  |       } | ||
|  | 
 | ||
|  |       var out_name = inCompiler.mObjDir + "/" + file_name; | ||
|  | 
 | ||
|  |       if (isOutOfDate(out_name,inObjs) || isOutOfDate(out_name,inTarget.mDepends)) | ||
|  |       { | ||
|  |          var args = new Array<String>(); | ||
|  |          var out = mOutFlag; | ||
|  |          if (out.substr(-1)==" ") | ||
|  |          { | ||
|  |             args.push(out.substr(0,out.length-1)); | ||
|  |             out = ""; | ||
|  |          } | ||
|  | 
 | ||
|  |          args.push(out + out_name); | ||
|  |          //args = args.concat(mFlags).concat(inTarget.mFlags); | ||
|  |          args = args.concat(mFlags); | ||
|  | 
 | ||
|  |          var objs = inObjs.copy(); | ||
|  | 
 | ||
|  |          /*if (mExpandArchives) | ||
|  |          { | ||
|  |             var isArchive = ~/\.a$/; | ||
|  |             var libArgs = new Array<String>(); | ||
|  |             for(lib in libs) | ||
|  |             { | ||
|  |                if (isArchive.match(lib)) | ||
|  |                { | ||
|  |                   var libName = Path.withoutDirectory(lib); | ||
|  |                   var libObjs = Setup.readStdout(mExe, ["t", lib ]); | ||
|  |                   var objDir = inCompiler.mObjDir + "/" + libName; | ||
|  |                   PathManager.mkdir(objDir); | ||
|  |                   ProcessManager.runCommand (objDir, mExe, ["x", lib]); | ||
|  |                   for(obj in libObjs) | ||
|  |                      objs.push( objDir+"/"+obj ); | ||
|  |                } | ||
|  |                else | ||
|  |                   libArgs.push(lib); | ||
|  |             } | ||
|  |             libs = libArgs; | ||
|  |          }*/ | ||
|  | 
 | ||
|  |          // Place list of obj files in a file called "all_objs" | ||
|  |          if (mFromFile=="@") | ||
|  |          { | ||
|  |             var fname = inCompiler.mObjDir + "/all_objs"; | ||
|  |             var fout = sys.io.File.write(fname,false); | ||
|  |             for(obj in objs) | ||
|  |                fout.writeString(obj + "\n"); | ||
|  |             fout.close(); | ||
|  |             args.push("@" + fname ); | ||
|  |          } | ||
|  |          else | ||
|  |             args = args.concat(objs); | ||
|  | 
 | ||
|  |          //args = args.concat(libs); | ||
|  | 
 | ||
|  |          var result = ProcessManager.runCommand("", mExe, args); | ||
|  |          if (result!=0) | ||
|  |          { | ||
|  |             Tools.exit(result); | ||
|  |             //throw "Error : " + result + " - build cancelled"; | ||
|  |          } | ||
|  | 
 | ||
|  |          return out_name; | ||
|  |       } | ||
|  | 
 | ||
|  |       return ""; | ||
|  |    } | ||
|  | } |