344 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			344 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| package hxcpp;
 | |
| 
 | |
| import haxe.io.Path;
 | |
| import sys.FileSystem;
 | |
| 
 | |
| class Builder
 | |
| {
 | |
|    public var debug:Bool;
 | |
|    public var verbose:Bool;
 | |
| 
 | |
|    public function new(inArgs:Array<String>)
 | |
|    {
 | |
|       debug = false;
 | |
|       verbose = false;
 | |
|       var targets = new Map<String, Array<String>>();
 | |
|       var buildArgs = new Array<String>();
 | |
| 
 | |
|       try
 | |
|       {
 | |
|          var clean = false;
 | |
|          var defaultTarget = true;
 | |
|          for(arg in inArgs)
 | |
|          {
 | |
|             if (arg=="-debug")
 | |
|             {
 | |
|                debug = true;
 | |
|                continue;
 | |
|             }
 | |
|             else if (arg=="-v" || arg=="-verbose")
 | |
|             {
 | |
|                verbose = true;
 | |
|                Sys.putEnv("HXCPP_VERBOSE", "1");
 | |
|                continue;
 | |
|             }
 | |
|             if (arg=="clean")
 | |
|             {
 | |
|                clean = true;
 | |
|                continue;
 | |
|             }
 | |
| 
 | |
| 
 | |
|             var parts = arg.split("-");
 | |
|             var linkStatic = allowStatic();
 | |
|             var linkNdll = allowNdll();
 | |
|             var explicitNdll = false;
 | |
|             if (parts[0]=="static")
 | |
|             {
 | |
|                linkNdll = false;
 | |
|                parts.shift();
 | |
|             }
 | |
|             else if (parts[0]=="ndll")
 | |
|             {
 | |
|                linkStatic = false;
 | |
|                explicitNdll = true;
 | |
|                parts.shift();
 | |
|             }
 | |
| 
 | |
|             var target = parts.shift();
 | |
|             if (target=="default")
 | |
|                target = getDefault();
 | |
| 
 | |
|             switch(target)
 | |
|             {
 | |
|                case "ios", "android", "blackberry", "tizen", "emscripten", "webos", "windows", "msvc", "linux", "mac", "mingw", "tvos":
 | |
|                   defaultTarget = false;
 | |
|                   if (linkStatic)
 | |
|                   {
 | |
|                      var stat = "static-" + target;
 | |
|                      targets.set(stat, parts);
 | |
| 
 | |
|                      if (target=="ios" && wantLegacyIosBuild())
 | |
|                      {
 | |
|                         var stat = "static-" + "ioslegacy";
 | |
|                         targets.set(stat, parts);
 | |
|                      }
 | |
|                   }
 | |
|                   if (linkNdll && target!="ios" && target!="emscripten" && target!="tvos" /*&& (target!="mingw" || explicitNdll)*/ )
 | |
|                      targets.set(target, parts);
 | |
| 
 | |
|                default:
 | |
|                   if (arg.substr(0,2)=="-D")
 | |
|                      buildArgs.push(arg);
 | |
|                   else
 | |
|                      throw "Unknown arg '" + arg + "'";
 | |
|             }
 | |
|          }
 | |
| 
 | |
|          if (clean)
 | |
|          {
 | |
|             if (!cleanAll(buildArgs))
 | |
|                return;
 | |
| 
 | |
|             if (defaultTarget) // Just clean
 | |
|                return;
 | |
|          }
 | |
| 
 | |
|          if (defaultTarget)
 | |
|          {
 | |
|             var target = getDefault();
 | |
|             if (target!="mingw")
 | |
|                targets.set(target,[]);
 | |
|             targets.set("static-" +target,[]);
 | |
|             onEmptyTarget();
 | |
|             Sys.println("\nUsing default = " + target);
 | |
|          }
 | |
| 
 | |
|          for(target in targets.keys())
 | |
|          {
 | |
|             var archs = targets.get(target);
 | |
|             var validArchs = new Map<String, Array<String>>();
 | |
|             var isStatic = false;
 | |
|             if (target.substr(0,7)=="static-")
 | |
|             {
 | |
|                isStatic = true;
 | |
|                target = target.substr(7);
 | |
|             }
 | |
|             var staticFlags = isStatic ? ["-Dstatic_link"] : [];
 | |
|             if (target=="ios" || target=="tvos")
 | |
|                staticFlags = ["-DHXCPP_CPP11"];
 | |
| 
 | |
|             switch(target)
 | |
|             {
 | |
|                case "linux":
 | |
|                   if (wantLinux32())
 | |
|                      validArchs.set("m32", ["-D"+target, "-DHXCPP_M32"].concat(staticFlags) );
 | |
|                   validArchs.set("m64", ["-D"+target, "-DHXCPP_M64"].concat(staticFlags) );
 | |
| 
 | |
|                case "mac":
 | |
|                   if (wantMac32())
 | |
|                      validArchs.set("m32", ["-D"+target, "-DHXCPP_M32"].concat(staticFlags) );
 | |
|                   validArchs.set("m64", ["-D"+target, "-DHXCPP_M64"].concat(staticFlags) );
 | |
| 
 | |
|                case "windows":
 | |
|                   validArchs.set("m32", ["-D"+target, "-DHXCPP_M32"].concat(staticFlags) );
 | |
|                   if (wantWindows64())
 | |
|                      validArchs.set("m64", ["-D"+target, "-DHXCPP_M64"].concat(staticFlags) );
 | |
|                   if (wantWindowsArm64())
 | |
|                      validArchs.set("arm64", ["-D"+target, "-DHXCPP_ARM64"].concat(staticFlags) );
 | |
| 
 | |
|                case "msvc":
 | |
|                   if (isStatic)
 | |
|                   {
 | |
|                      validArchs.set("2013m32", ["-D"+target, "-DHXCPP_M32", "HXCPP_MSVC_VER=120"].concat(staticFlags) );
 | |
|                      validArchs.set("2015m32", ["-D"+target, "-DHXCPP_M32", "HXCPP_MSVC_VER=140"].concat(staticFlags) );
 | |
|                      if (wantWindows64())
 | |
|                      {
 | |
|                         validArchs.set("2013m64", ["-D"+target, "-DHXCPP_M64", "HXCPP_MSVC_VER=120"].concat(staticFlags) );
 | |
|                         validArchs.set("2015m64", ["-D"+target, "-DHXCPP_M64", "HXCPP_MSVC_VER=140"].concat(staticFlags) );
 | |
|                      }
 | |
|                   }
 | |
|                   else
 | |
|                   {
 | |
|                      validArchs.set("m32", ["-D"+target, "-DHXCPP_M32"] );
 | |
|                      if (wantWindows64())
 | |
|                         validArchs.set("m64", ["-D"+target, "-DHXCPP_M64"] );
 | |
|                   }
 | |
| 
 | |
|                case "mingw":
 | |
|                   validArchs.set("m32", ["-Dwindows", "-DHXCPP_MINGW", "-DHXCPP_M32"].concat(staticFlags) );
 | |
| 
 | |
|                case "ios", "ioslegacy":
 | |
|                   validArchs.set("armv6", ["-Diphoneos"].concat(staticFlags) );
 | |
|                   validArchs.set("armv7", ["-Diphoneos", "-DHXCPP_ARMV7"].concat(staticFlags) );
 | |
|                   validArchs.set("armv7s", ["-Diphoneos", "-DHXCPP_ARMV7S"].concat(staticFlags) );
 | |
|                   validArchs.set("arm64", ["-Diphoneos", "-DHXCPP_ARM64", "-DHXCPP_M64"].concat(staticFlags) );
 | |
|                   //validArchs.push("armv64");
 | |
|                   validArchs.set("x86", ["-Diphonesim"].concat(staticFlags) );
 | |
|                   validArchs.set("x86_64", ["-Diphonesim", "-DHXCPP_M64"].concat(staticFlags) );
 | |
| 
 | |
|                case "android":
 | |
| 
 | |
|                   if( archs.length == 0 )
 | |
|                      throw("You must specify the archs you want for android");
 | |
|                
 | |
|                   validArchs.set("armv5", ["-Dandroid"].concat(staticFlags) );
 | |
|                   validArchs.set("armv7", ["-Dandroid", "-DHXCPP_ARMV7"].concat(staticFlags) );
 | |
|                   validArchs.set("arm64", ["-Dandroid", "-DHXCPP_ARM64"].concat(staticFlags) );
 | |
|                   validArchs.set("x86", ["-Dandroid", "-DHXCPP_X86"].concat(staticFlags) );
 | |
|                   validArchs.set("x86_64", ["-Dandroid", "-DHXCPP_X86_64"].concat(staticFlags) );
 | |
|                
 | |
|                case "blackberry":
 | |
|                   validArchs.set("armv7", ["-Dblackberry"].concat(staticFlags) );
 | |
|                   validArchs.set("x86", ["-Dblackberry", "-Dsimulator"].concat(staticFlags) );
 | |
|                
 | |
|                case "tizen":
 | |
|                   validArchs.set("armv7", ["-Dtizen"].concat(staticFlags) );
 | |
|                   validArchs.set("x86", ["-Dtizen", "-Dsimulator"].concat(staticFlags) );
 | |
|                
 | |
|                case "emscripten":
 | |
|                   validArchs.set("x86", ["-Demscripten"].concat(staticFlags) );
 | |
|                
 | |
|                case "webos":
 | |
|                   validArchs.set("armv7", ["-Dwebos"].concat(staticFlags) );
 | |
|                
 | |
|                case "tvos":
 | |
|                   validArchs.set("arm64", ["-Dappletvos", "-DHXCPP_ARM64", "-DHXCPP_M64", "-DENABLE_BITCODE"].concat(staticFlags) );
 | |
|                   // NOTE: removed as there's no 32bit support for the AppleTV simulator
 | |
|                   //validArchs.set("x86", ["-Dappletvsim", "-DENABLE_BITCODE"].concat(staticFlags) );
 | |
|                   validArchs.set("x86_64", ["-Dappletvsim", "-DHXCPP_M64", "-DENABLE_BITCODE"].concat(staticFlags) );
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
|             var valid = new Array<String>();
 | |
|             for(key in validArchs.keys())
 | |
|                valid.push(key);
 | |
|             var buildArchs = archs.length==0 ? valid : archs;
 | |
|             for(arch in buildArchs)
 | |
|             {
 | |
|                if (validArchs.exists(arch))
 | |
|                {
 | |
|                   var flags = validArchs.get(arch);
 | |
|                   if (debug)
 | |
|                      flags.push("-Ddebug");
 | |
| 
 | |
|                   flags = flags.concat(buildArgs);
 | |
| 
 | |
|                   runBuild(target, isStatic, arch, flags);
 | |
|                }
 | |
|             }
 | |
|          }
 | |
|       }
 | |
|       catch( e:Dynamic )
 | |
|       {
 | |
|          if (e!="")
 | |
|             Sys.println(e);
 | |
|          showUsage(false);
 | |
|       }
 | |
|    }
 | |
| 
 | |
|    public function allowNdll() { return true; }
 | |
|    public function allowStatic() { return true; }
 | |
|    public function wantLegacyIosBuild() { return false; }
 | |
|    public function wantWindows64() { return false; }
 | |
|    public function wantMac32() { return false; }
 | |
|    public function wantLinux32() { return false; }
 | |
|    public function wantWindowsArm64() { return false; }
 | |
| 
 | |
|    public function runBuild(target:String, isStatic:Bool, arch:String, buildFlags:Array<String>)
 | |
|    {
 | |
|       var args = ["run", "hxcpp", getBuildFile() ].concat(buildFlags);
 | |
| 
 | |
|       Sys.println('\nBuild $target, link=' + (isStatic?"lib":"ndll")+' arch=$arch');
 | |
|       Sys.println("haxelib " + args.join(" ")); 
 | |
|       if (Sys.command("haxelib",args)!=0)
 | |
|       {
 | |
|          Sys.println("#### Error building " + arch);
 | |
|          Sys.exit(-1);
 | |
|       }
 | |
|    }
 | |
| 
 | |
|    public function getBuildFile()
 | |
|    {
 | |
|       return "Build.xml";
 | |
|    }
 | |
| 
 | |
|    public function getCleanDir()
 | |
|    {
 | |
|       return "obj";
 | |
|    }
 | |
| 
 | |
|    public function cleanAll(inBuildFlags:Array<String>) : Bool
 | |
|    {
 | |
|       var args = ["run", "hxcpp", getBuildFile(), "clean", "-DHXCPP_CLEAN_ONLY"].concat(inBuildFlags);
 | |
| 
 | |
|       Sys.println("haxelib " + args.join(" ")); 
 | |
|       if (Sys.command("haxelib",args)!=0)
 | |
|       {
 | |
|          Sys.println("#### Error cleaning");
 | |
|          Sys.exit(-1);
 | |
|       }
 | |
|       return true;
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    public function onEmptyTarget() : Void
 | |
|    {
 | |
|       showUsage(true);
 | |
|    }
 | |
| 
 | |
|    static public function deleteRecurse(inDir:String) : Void
 | |
|    {
 | |
|       if (FileSystem.exists(inDir))
 | |
|       {
 | |
|          var contents = FileSystem.readDirectory(inDir);
 | |
|          for(item in contents)
 | |
|          {
 | |
|             if (item!="." && item!="..")
 | |
|             {
 | |
|                var name = inDir + "/" + item;
 | |
|                if (FileSystem.isDirectory(name))
 | |
|                   deleteRecurse(name);
 | |
|                else
 | |
|                   FileSystem.deleteFile(name);
 | |
|             }
 | |
|          }
 | |
|          FileSystem.deleteDirectory(inDir);
 | |
|       }
 | |
|    }
 | |
| 
 | |
| 
 | |
|    public function showUsage(inShowSpecifyMessage:Bool) : Void
 | |
|    {
 | |
|       var link = allowStatic() && allowNdll() ? "[link-]" : "";
 | |
|       Sys.println("Usage : neko build.n [clean] " + link +
 | |
|                   "target[-arch][-arch] ...] [-debug] [-verbose] [-D...]");
 | |
|       Sys.println("  target  : ios, android, windows, linux, mac, mingw, tvos");
 | |
|       Sys.println("            default (=current system)");
 | |
|       if (link!="")
 | |
|       {
 | |
|          Sys.println("  link    : ndll- or static-");
 | |
|          Sys.println("            (none specified = both link types, mingw static only");
 | |
|       }
 | |
|       Sys.println("  arch    : -armv5 -armv6 -armv7 -arm64 -x86 -x86_64 -m32 -m64");
 | |
|       Sys.println("            (none specified = all valid architectures");
 | |
|       Sys.println("  -D...   : defines passed to hxcpp build system");
 | |
|       if (link!="")
 | |
|          Sys.println(" eg: neko build.n clean ndll-mac-m32-m64 = rebuild both mac ndlls");
 | |
|       if (inShowSpecifyMessage)
 | |
|          Sys.println(" Specify target or 'default' to remove this message");
 | |
|    }
 | |
| 
 | |
|    public function getDefault() : String
 | |
|    {
 | |
|       var sys = Sys.systemName();
 | |
|       if (new EReg("window", "i").match(sys))
 | |
|          return "windows";
 | |
|       else if (new EReg("linux", "i").match(sys))
 | |
|          return "linux";
 | |
|       else if (new EReg("mac", "i").match(sys))
 | |
|          return "mac";
 | |
|       else
 | |
|          throw "Unknown host system: " + sys;
 | |
|       return "";
 | |
|    }
 | |
| 
 | |
|    public static function main()
 | |
|    {
 | |
|       new Builder( Sys.args() );
 | |
|    }
 | |
| }
 | |
| 
 |