Example #1
0
        private static BuildOptions ConfigurePlatform(BuildTarget target, BuildOptions options)
        {
            var headlessSupported = BuildSupportChecker.CanBuildHeadless(target);

            if (EditorGUILayout.Toggle("Development", options.HasFlag(BuildOptions.Development)))
            {
                options |= BuildOptions.Development;
            }
            else
            {
                // When the `Development flag` is disabled, we also disable the 'Allow Debug' flag to
                // ensure consistency between UI and BuildOptions flags
                options &= ~(BuildOptions.Development | BuildOptions.AllowDebugging);
            }

            options = ConfigureDebug(options);


            if (headlessSupported &&
                EditorGUILayout.Toggle("Server build", options.HasFlag(BuildOptions.EnableHeadlessMode)))
            {
                options |= BuildOptions.EnableHeadlessMode;
            }
            else
            {
                options &= ~BuildOptions.EnableHeadlessMode;
            }

            return(options);
        }
Example #2
0
        public static List <BuildContext> GetBuildContexts(IEnumerable <string> wantedWorkerTypes,
                                                           BuildEnvironment buildEnvironment, ScriptingImplementation?scriptImplementation = null,
                                                           ICollection <BuildTarget> buildTargetFilter = null, iOSSdkVersion?iosSdkVersion = null)
        {
            var spatialOsBuildConfiguration = BuildConfig.GetInstance();
            var result = new List <BuildContext>();

            foreach (var workerType in wantedWorkerTypes)
            {
                var environmentConfig =
                    spatialOsBuildConfiguration.GetEnvironmentConfigForWorker(workerType, buildEnvironment);

                // Filter targets for CI
                var targetConfigs = environmentConfig.BuildTargets
                                    .Where(t => t.Enabled && (buildTargetFilter?.Contains(t.Target) ?? true))
                                    .ToList();

                // Filter out any deprecated targets
                var supportedTargets = targetConfigs
                                       .Where(c => !c.Deprecated)
                                       .ToList();

                // Which build targets are not supported by current install?
                var missingTargets = supportedTargets
                                     .Where(c => !BuildSupportChecker.CanBuildTarget(c.Target))
                                     .ToList();

                // Error on missing required build support
                if (missingTargets.Any(c => c.Required))
                {
                    var targetNames = string.Join(", ", missingTargets
                                                  .Where(c => c.Required)
                                                  .Select(c => c.Target.ToString()));
                    throw new BuildFailedException(
                              $"Build failed for {workerType}. Cannot build for required ({targetNames}) because build support is not installed in the Unity Editor.");
                }

                // Log builds we're skipping
                if (missingTargets.Count > 0)
                {
                    var targetNames = string.Join(", ", missingTargets.Select(c => c.Target.ToString()));
                    Debug.LogWarning(
                        $"Skipping ({targetNames}) because build support is not installed in the Unity Editor and the build target is not marked as 'Required'.");

                    supportedTargets.RemoveAll(t => missingTargets.Contains(t));
                }

                result.AddRange(supportedTargets.Select(targetConfig => new BuildContext
                {
                    WorkerType              = workerType,
                    BuildEnvironment        = buildEnvironment,
                    ScriptingImplementation = scriptImplementation ?? targetConfig.ScriptingImplementation,
                    BuildTargetConfig       = targetConfig,
                    IOSSdkVersion           = (targetConfig.Target == BuildTarget.iOS) ? iosSdkVersion : null
                }));
            }

            return(result);
        }
Example #3
0
        /// <summary>
        ///     Build method that is invoked by commandline
        /// </summary>
        // ReSharper disable once UnusedMember.Global
        public static void Build()
        {
            try
            {
                var commandLine    = Environment.GetCommandLineArgs();
                var buildTargetArg = CommandLineUtility.GetCommandLineValue(commandLine, "buildTarget", "local");

                BuildEnvironment buildEnvironment;
                switch (buildTargetArg.ToLower())
                {
                case "cloud":
                    buildEnvironment = BuildEnvironment.Cloud;
                    break;

                case "local":
                    buildEnvironment = BuildEnvironment.Local;
                    break;

                default:
                    throw new BuildFailedException("Unknown build target value: " + buildTargetArg);
                }

                var workerTypesArg =
                    CommandLineUtility.GetCommandLineValue(commandLine, BuildWorkerTypes,
                                                           "UnityClient,UnityGameLogic");

                var wantedWorkerTypes = workerTypesArg.Split(',');
                foreach (var wantedWorkerType in wantedWorkerTypes)
                {
                    var buildTargetsForWorker           = GetBuildTargetsForWorkerForEnvironment(wantedWorkerType, buildEnvironment);
                    var buildTargetsMissingBuildSupport = BuildSupportChecker.GetBuildTargetsMissingBuildSupport(buildTargetsForWorker);

                    if (buildTargetsMissingBuildSupport.Length > 0)
                    {
                        throw new BuildFailedException(BuildSupportChecker.ConstructMissingSupportMessage(wantedWorkerType, buildEnvironment, buildTargetsMissingBuildSupport));
                    }
                }

                LocalLaunch.BuildConfig();

                foreach (var wantedWorkerType in wantedWorkerTypes)
                {
                    BuildWorkerForEnvironment(wantedWorkerType, buildEnvironment);
                }
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                if (e is BuildFailedException)
                {
                    throw;
                }

                throw new BuildFailedException(e);
            }
        }
Example #4
0
        private void ConfigureBuildPlatforms(BuildEnvironmentConfig environmentConfiguration)
        {
            using (IndentLevelScope(1))
            {
                EditorGUI.BeginChangeCheck();

                var buildPlatformsString = SelectedPlatformsToString(environmentConfiguration.BuildPlatforms);
                var newBuildPlatforms    = environmentConfiguration.BuildPlatforms;
                var showBuildPlatforms   = EditorGUILayout.Foldout(environmentConfiguration.ShowBuildPlatforms,
                                                                   "Build Platforms: " + buildPlatformsString);
                if (showBuildPlatforms)
                {
                    newBuildPlatforms = EnumFlagsToggleField(environmentConfiguration.BuildPlatforms);
                }

                var currentAdjustedPlatforms = newBuildPlatforms;

                if ((currentAdjustedPlatforms & SpatialBuildPlatforms.Current) != 0)
                {
                    currentAdjustedPlatforms |= WorkerBuilder.GetCurrentBuildPlatform();
                }

                if ((currentAdjustedPlatforms & SpatialBuildPlatforms.Windows32) != 0 &&
                    (currentAdjustedPlatforms & SpatialBuildPlatforms.Windows64) != 0)
                {
                    EditorGUILayout.HelpBox(WorkerBuilder.IncompatibleWindowsPlatformsErrorMessage,
                                            MessageType.Error);
                }

                var buildTargetsMissingBuildSupport = BuildSupportChecker.GetBuildTargetsMissingBuildSupport(WorkerBuilder.GetUnityBuildTargets(newBuildPlatforms));
                if (buildTargetsMissingBuildSupport.Length > 0)
                {
                    EditorGUILayout.HelpBox($"Missing build support for {string.Join(", ", buildTargetsMissingBuildSupport)}", MessageType.Error);
                }

                if (EditorGUI.EndChangeCheck())
                {
                    EditorUtility.SetDirty(target);
                    Undo.RecordObject(target, "Configure build platforms for worker");

                    environmentConfiguration.ShowBuildPlatforms = showBuildPlatforms;
                    environmentConfiguration.BuildPlatforms     = newBuildPlatforms;
                }
            }
        }
        public IEnumerable <BuildTargetConfig> GetSupportedTargets(BuildContextSettings contextSettings)
        {
            // Filter targets for CI
            var targetConfigs = BuildTargets
                                .Where(t => t.Enabled && contextSettings.Matches(t.Target))
                                .ToList();

            // Filter out any deprecated targets
            var supportedTargets = targetConfigs
                                   .Where(c => !c.Deprecated)
                                   .ToList();

            // Which build targets are not supported by current install?
            var missingTargets = supportedTargets
                                 .Where(c => !BuildSupportChecker.CanBuildTarget(c.Target))
                                 .ToList();

            // Error on missing required build support
            if (missingTargets.Any(c => c.Required))
            {
                var targetNames = string.Join(", ", missingTargets
                                              .Where(c => c.Required)
                                              .Select(c => c.Target.ToString()));
                throw new BuildFailedException($"Cannot build for required ({targetNames}) because build support is not installed in the Unity Editor.");
            }

            // Log builds we're skipping
            if (missingTargets.Count > 0)
            {
                var targetNames = string.Join(", ", missingTargets.Select(c => c.Target.ToString()));
                Debug.LogWarning(
                    $"Skipping ({targetNames}) because build support is not installed in the Unity Editor and the build target is not marked as 'Required'.");

                supportedTargets.RemoveAll(t => missingTargets.Contains(t));
            }

            return(supportedTargets);
        }
        /// <summary>
        ///     Create a new instance of BuildEnvironmentConfig.
        /// </summary>
        /// <param name="availableTargets">All of the targets that can be built in this environment.</param>
        /// <param name="targets">
        ///     A list of configured targets. If a target is present in <paramref name="availableTargets" /> but
        ///     is not in <paramref name="targets" />, then it will have the default settings the final list of build targets.
        /// </param>
        public BuildEnvironmentConfig(IEnumerable <BuildTarget> availableTargets, params BuildTargetConfig[] targets)
        {
            BuildTargets = new List <BuildTargetConfig>();

            foreach (var available in availableTargets)
            {
                var overridden = targets.FirstOrDefault(t => t.Target == available);
                if (overridden.Target == available)
                {
                    BuildTargets.Add(overridden);
                }
                else
                {
                    BuildTargets.Add(new BuildTargetConfig(available)
                    {
                        Options    = WorkerBuildData.BuildTargetDefaultOptions[available],
                        Enabled    = false,
                        Required   = false,
                        Deprecated = BuildSupportChecker.IsDeprecatedTarget(available)
                    });
                }
            }
        }
Example #7
0
 private static bool IsBuildTargetError(BuildTargetConfig t)
 {
     return(!BuildSupportChecker.CanBuildTarget(t.Target) && t.Required);
 }
Example #8
0
 private static bool IsBuildTargetWarning(BuildTargetConfig t)
 {
     return(!BuildSupportChecker.CanBuildTarget(t.Target) && t.Enabled);
 }
Example #9
0
        private void DrawBuildTargets(BuildEnvironmentConfig env, int hash)
        {
            // Init cached UI state.
            var selectedBuildTarget = stateManager.GetStateObjectOrDefault <BuildTargetState>(hash ^ typeof(BuildTargetState).GetHashCode());

            if (selectedBuildTarget.Choices == null || invalidateCachedContent > 0)
            {
                selectedBuildTarget.Choices = env.BuildTargets.Select(GetBuildTargetGuiContents).ToArray();
            }

            // Draw available build targets.
            using (new EditorGUIUtility.IconSizeScope(SmallIconSize))
            {
                selectedBuildTarget.Index =
                    GUILayout.Toolbar(selectedBuildTarget.Index, selectedBuildTarget.Choices);
            }

            // Draw selected build target.
            var buildTarget    = env.BuildTargets[selectedBuildTarget.Index];
            var canBuildTarget = BuildSupportChecker.CanBuildTarget(buildTarget.Target);

            var options  = buildTarget.Options;
            var enabled  = buildTarget.Enabled;
            var required = buildTarget.Required;

            using (var check = new EditorGUI.ChangeCheckScope())
                using (new EditorGUILayout.VerticalScope(GUILayout.ExpandWidth(true)))
                {
                    BuildConfigEditorStyle.DrawHorizontalLine();
                    EditorGUILayout.Space();

                    enabled = EditorGUILayout.Toggle("Build", enabled);

                    if (!enabled)
                    {
                        required = false;
                    }

                    using (new EditorGUI.DisabledScope(!buildTarget.Enabled))
                    {
                        required = EditorGUILayout.Toggle("Required", required);

                        switch (buildTarget.Target)
                        {
                        case BuildTarget.StandaloneOSX:
                            options = ConfigureOSX(buildTarget);
                            break;

                        case BuildTarget.StandaloneWindows:
                            options = ConfigureWindows(buildTarget);
                            break;

                        case BuildTarget.iOS:
                            options = ConfigureIOS(buildTarget);
                            break;

                        case BuildTarget.Android:
                            options = ConfigureAndroid(buildTarget);
                            break;

                        case BuildTarget.StandaloneWindows64:
                            options = ConfigureWindows(buildTarget);
                            break;

                        case BuildTarget.StandaloneLinux64:
                            options = ConfigureLinux(buildTarget);
                            break;
                        }

                        options = ConfigureCompression(options);
                    }

                    if (!canBuildTarget)
                    {
                        EditorGUILayout.HelpBox(
                            $"Your Unity Editor is missing build support for {buildTarget.Target.ToString()}.\n" +
                            "Please add the missing build support options to your Unity Editor",
                            buildTarget.Required ? MessageType.Error : MessageType.Warning);
                    }

                    if (check.changed)
                    {
                        RecordUndo("Worker build options");

                        env.BuildTargets[selectedBuildTarget.Index] =
                            new BuildTargetConfig(buildTarget.Target, options, enabled, required);

                        selectedBuildTarget.Choices = null;
                    }
                }
        }
Example #10
0
        /// <summary>
        ///     Build method that is invoked by commandline
        /// </summary>
        // ReSharper disable once UnusedMember.Global
        public static void Build()
        {
            try
            {
                var commandLine    = Environment.GetCommandLineArgs();
                var buildTargetArg = CommandLineUtility.GetCommandLineValue(commandLine, "buildTarget", "local");

                BuildEnvironment buildEnvironment;
                switch (buildTargetArg.ToLower())
                {
                case "cloud":
                    buildEnvironment = BuildEnvironment.Cloud;
                    break;

                case "local":
                    buildEnvironment = BuildEnvironment.Local;
                    break;

                default:
                    throw new BuildFailedException("Unknown build target value: " + buildTargetArg);
                }

                var workerTypesArg =
                    CommandLineUtility.GetCommandLineValue(commandLine, BuildWorkerTypes,
                                                           "UnityClient,UnityGameLogic");

                var desiredWorkerTypes  = workerTypesArg.Split(',');
                var filteredWorkerTypes = BuildSupportChecker.FilterWorkerTypes(buildEnvironment, desiredWorkerTypes);

                if (desiredWorkerTypes.Length != filteredWorkerTypes.Length)
                {
                    throw new BuildFailedException(
                              "Unable to complete build. Missing build support. Check logs for specific errors.");
                }

                ScriptingImplementation scriptingBackend;
                var wantedScriptingBackend =
                    CommandLineUtility.GetCommandLineValue(commandLine, "scriptingBackend", "mono");
                switch (wantedScriptingBackend)
                {
                case "mono":
                    scriptingBackend = ScriptingImplementation.Mono2x;
                    break;

                case "il2cpp":
                    scriptingBackend = ScriptingImplementation.IL2CPP;
                    break;

                default:
                    throw new BuildFailedException("Unknown scripting backend value: " + wantedScriptingBackend);
                }

                LocalLaunch.BuildConfig();

                foreach (var wantedWorkerType in filteredWorkerTypes)
                {
                    BuildWorkerForEnvironment(wantedWorkerType, buildEnvironment, scriptingBackend);
                }
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                if (e is BuildFailedException)
                {
                    throw;
                }

                throw new BuildFailedException(e);
            }
        }
Example #11
0
        private void DrawBuildTargets(BuildEnvironmentConfig env, int hash)
        {
            // Build a mapping from the 'build target' position in the toolbar to it's position in the 'BuildTargets' array.
            // We do this since sometimes there are different number of targets in the BuildTargets array and those
            // in the toolbar as some targets are deprecated
            if (toolbarMapping.Count == 0)
            {
                var toolbarIndex = 0;
                for (var buildTargetIndex = 0; buildTargetIndex < env.BuildTargets.Count; buildTargetIndex++)
                {
                    if (!env.BuildTargets[buildTargetIndex].Deprecated)
                    {
                        toolbarMapping.Add(toolbarIndex++, buildTargetIndex);
                    }
                }
            }

            // Init cached UI state.
            var selectedBuildTarget = stateManager.GetStateObjectOrDefault <BuildTargetState>(hash ^ typeof(BuildTargetState).GetHashCode());

            if (selectedBuildTarget.Choices == null || invalidateCachedContent > 0)
            {
                selectedBuildTarget.Choices = env.BuildTargets
                                              .Where(c => !c.Deprecated)
                                              .Select(GetBuildTargetGuiContents)
                                              .ToArray();
            }


            // Draw available build targets.
            using (new EditorGUIUtility.IconSizeScope(SmallIconSize))
            {
                selectedBuildTarget.Index =
                    GUILayout.Toolbar(selectedBuildTarget.Index, selectedBuildTarget.Choices);
            }

            // Convert the index from the position selected in the toolbar to the position in the BuildTargets array
            var selectedTargetIndex = toolbarMapping[selectedBuildTarget.Index];

            // Draw selected build target.
            var buildTarget    = env.BuildTargets[selectedTargetIndex];
            var canBuildTarget = BuildSupportChecker.CanBuildTarget(buildTarget.Target);

            var options  = buildTarget.Options;
            var enabled  = buildTarget.Enabled;
            var required = buildTarget.Required;

            // Pick the current backend based on the current build target
            var scriptingImplementation = buildTarget.ScriptingImplementation;

            using (var check = new EditorGUI.ChangeCheckScope())
                using (new EditorGUILayout.VerticalScope(GUILayout.ExpandWidth(true)))
                {
                    BuildConfigEditorStyle.DrawHorizontalLine();
                    EditorGUILayout.Space();

                    enabled = EditorGUILayout.Toggle("Build", enabled);

                    if (!enabled)
                    {
                        required = false;
                    }

                    using (new EditorGUI.DisabledScope(!buildTarget.Enabled))
                    {
                        required = EditorGUILayout.Toggle("Required", required);

                        options = ConfigurePlatform(buildTarget.Target, options);

                        options = ConfigureCompression(options);

                        scriptingImplementation = ConfigureScriptingImplementation(scriptingImplementation, buildTarget.Target);
                    }

                    if (!canBuildTarget)
                    {
                        EditorGUILayout.HelpBox(
                            $"Your Unity Editor is missing build support for {buildTarget.Target.ToString()}.\n" +
                            "Please add the missing build support options to your Unity Editor",
                            buildTarget.Required ? MessageType.Error : MessageType.Warning);
                    }

                    if (check.changed)
                    {
                        RecordUndo("Worker build options");

                        env.BuildTargets[selectedTargetIndex] =
                            new BuildTargetConfig(buildTarget.Target, options, enabled, required, deprecated: false, scriptingImplementation);

                        selectedBuildTarget.Choices = null;
                    }
                }
        }