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