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