diff --git a/unity.inc.php b/unity.inc.php index 241519b..cd3133c 100644 --- a/unity.inc.php +++ b/unity.inc.php @@ -32,7 +32,6 @@ task('unity_kill', function() } }); - function unity_exec($func, $build_target = "", $quit = true, $batchmode = true) { global $GAME_ROOT; @@ -159,3 +158,170 @@ function get_unity_dir() return "$app_dir/Unity.app/Contents/"; } +function mono_mcs_bin() +{ + if(!get("USE_UNITY_MONO")) + return 'mcs'; + + $unity_dir = get_unity_dir(); + + if(!is_dir($unity_dir)) + throw new Exception("Unity directory doesn't exist: $unity_dir"); + + $canidates = array( + "$unity_dir/Mono/bin/gmcs", + "$unity_dir/MonoBleedingEdge/bin/mcs", + "$unity_dir/Frameworks/Mono/bin/gmcs", + "$unity_dir/Mono/bin/gmcs", + ); + + foreach($canidates as $mcs_bin) + { + if(is_file($mcs_bin)) + { + if(is_win()) + return '"' . normalize_path($mcs_bin, false) . '"'; + else + return $mcs_bin; + } + } + + throw new Exception("Mono compiler binary not found"); +} + +function mono_try_override_path() +{ + if(!get("USE_UNITY_MONO")) + return ''; + + $mono_dir = dirname(trim(mono_mcs_bin(), '"')); + $prev_path = getenv('PATH'); + echo "UNITY MONO PATH=$mono_dir\n"; + putenv("PATH=$mono_dir".(is_win() ? ";" : ":")."$prev_path"); + return $prev_path; +} + +function mono_try_restore_path($prev_path) +{ + if(!get("USE_UNITY_MONO")) + return; + + putenv("PATH=$prev_path"); +} + +function build_mono_dll($src_spec, $out_file, $ref_dlls = array(), $mcs_opts = "") +{ + build_mono($src_spec, $out_file, $ref_dlls, "$mcs_opts -target:library"); +} + +function build_mono($src_spec, $out_file, $ref_dlls = array(), $mcs_opts = "") +{ + global $GAME_ROOT; + + $unity_dir = get_unity_dir(); + $mcs_bin = mono_mcs_bin(); + + if(is_array($src_spec)) + $sources = $src_spec; + else if(is_dir($src_spec)) + $sources = scan_files_rec(array($src_spec), array('.cs')); + else + $sources = glob($src_spec); + + $sources_str = ''; + foreach($sources as $src) + { + if(is_win()) + $sources_str .= '"'.normalize_path($src, !is_win()).'" '; + else + $sources_str .= '\''.normalize_path($src, !is_win()).'\' '; + } + + $deps = $sources; + + $refs_str = ""; + foreach($ref_dlls as $ref_dll) + { + if($ref_dll === "UnityEngine.dll") + { + $ref_dll = "$unity_dir/Managed/UnityEngine.dll"; + if(!is_file($ref_dll)) + $ref_dll = "$unity_dir/Frameworks/Managed/UnityEngine.dll"; + } + + $ref_dll = normalize_path($ref_dll, !is_win()); + $refs_str .= "-r:\"$ref_dll\" "; + $deps[] = $ref_dll; + } + + $out_file = normalize_path($out_file, !is_win()); + $cmd = "$mcs_bin $mcs_opts $refs_str -out:$out_file $sources_str"; + if(is_string($src_spec) && is_dir($src_spec)) + $cmd = "cd $src_spec && $cmd"; + + $cmd_hash = crc32($cmd); + $cmd_hash_file = "$GAME_ROOT/build/" . crc32($out_file) . ".mhash"; + if(!is_file($cmd_hash_file) || file_get_contents($cmd_hash_file) != "$cmd_hash") + file_put_contents($cmd_hash_file, "$cmd_hash"); + $deps[] = $cmd_hash_file; + + if(need_to_regen($out_file, $deps)) + { + ensure_mkdir(dirname($out_file)); + shell($cmd); + echo "> $out_file " . round(filesize($out_file)/1024, 2) . "kb\n"; + } +} + +function run_mono($exe_file) +{ + $app_dir = get('UNITY_APP_DIR'); + + if(is_win()) + { + $unity_dir = "$app_dir/Editor/Data"; + $mono_bin = '"' . normalize_path("$unity_dir/Mono/bin/mono", !is_win()) . '"'; + } + else + { + $unity_dir = "$app_dir/Unity.app/Contents/"; + + if(is_dir("$unity_dir/Frameworks/Mono")) + $mono_bin = "$unity_dir/Frameworks/Mono/bin/mono"; + else + $mono_bin = "$unity_dir/Mono/bin/mono"; + } + + $exe_file = normalize_path($exe_file, !is_win()); + $mono_path = realpath(dirname($mono_bin) . '/../lib/mono/unity'); + putenv("MONO_PATH=$mono_path"); //To LOCATION_PATH? + $cmd = "$mono_bin $exe_file"; + shell($cmd); +} + +function build_option_exists($option) +{ + return strpos(getor("BUILD_CLIENT_OPTS", ""), $option) !== FALSE; +} + +function build_option_add($option) +{ + if(build_option_exists($option)) + return; + + $propname = "BUILD_CLIENT_OPTS"; + + $opts = getor($propname, ""); + if(strlen($opts) > 0) + $opts .= ",$option"; + else + $opts = $option; + + set($propname, $opts); +} + +function is_gradle_project_export() +{ + return build_option_exists("AcceptExternalModificationsToPlayer"); +} +