Exemplo n.º 1
0
        protected override string GenerateCommandLineCommands()
        {
            var args = new ProcessArgumentBuilder ();
            TargetArchitecture architectures;

            if (string.IsNullOrEmpty (Architectures) || !Enum.TryParse (Architectures, out architectures))
                architectures = TargetArchitecture.Default;

            if (architectures == TargetArchitecture.ARMv6) {
                Log.LogError ("Target architecture ARMv6 is no longer supported in Xamarin.iOS. Please select a supported architecture.");
                return null;
            }

            if (IsClassic && minimumOSVersion < IPhoneSdkVersion.V3_1 && architectures.HasFlag (TargetArchitecture.ARMv7)) {
                Log.LogWarning (null, null, null, AppManifest.ItemSpec, 0, 0, 0, 0, "Deployment Target changed from iOS {0} to iOS 3.1 (minimum requirement for ARMv7)", minimumOSVersion);
                minimumOSVersion = IPhoneSdkVersion.V3_1;
            }

            if (!string.IsNullOrEmpty (IntermediateOutputPath)) {
                Directory.CreateDirectory (IntermediateOutputPath);

                args.Add ("--cache");
                args.AddQuoted (Path.GetFullPath (IntermediateOutputPath));
            }

            if (IsClassic || IPhoneSdks.MonoTouch.Version < new IPhoneSdkVersion (8, 5, 0)) {
                args.Add ("--nomanifest");
                args.Add ("--nosign");
            }

            args.Add (SdkIsSimulator ? "--sim" : "--dev");
            args.AddQuoted (Path.GetFullPath (AppBundleDir));

            if (AppleSdkSettings.XcodeVersion.Major >= 5 && IPhoneSdks.MonoTouch.Version.CompareTo (new IPhoneSdkVersion (6, 3, 7)) < 0)
                args.Add ("--compiler", "clang");

            args.Add ("--executable");
            args.AddQuoted (ExecutableName);

            if (IsAppExtension)
                args.Add ("--extension");

            if (Debug) {
                if (FastDev && IPhoneSdks.MonoTouch.SupportsFastDev)
                    args.Add ("--fastdev");

                args.Add ("--debug");
            }

            if (Profiling)
                args.Add ("--profiling");

            if (LinkerDumpDependencies)
                args.Add ("--linkerdumpdependencies");

            switch (LinkMode.ToLowerInvariant ()) {
            case "sdkonly": args.Add ("--linksdkonly"); break;
            case "none":    args.Add ("--nolink"); break;
            }

            if (!string.IsNullOrEmpty (I18n)) {
                args.Add ("--i18n");
                args.AddQuotedFormat (I18n);
            }

            args.Add ("--sdkroot");
            args.AddQuoted (SdkRoot);

            args.Add ("--sdk");
            args.AddQuoted (SdkVersion);

            if (!minimumOSVersion.IsUseDefault) {
                args.Add ("--targetver");
                args.AddQuoted (minimumOSVersion.ToString ());
            }

            if (UseFloat32 /* We want to compile 32-bit floating point code to use 32-bit floating point operations */)
                args.Add ("--aot-options=-O=float32");

            if (IPhoneSdks.MonoTouch.SupportsGenericValueTypeSharing) {
                if (!EnableGenericValueTypeSharing)
                    args.Add ("--gsharedvt=false");
            }

            if (LinkDescriptions != null) {
                foreach (var desc in LinkDescriptions)
                    args.AddQuoted (string.Format ("--xml={0}", desc.ItemSpec));
            }

            if (EnableBitcode) {
                switch (Framework) {
                case PlatformFramework.WatchOS:
                    args.Add ("--bitcode=full");
                    break;
                case PlatformFramework.TVOS:
                    args.Add ("--bitcode=asmonly");
                    break;
                default:
                    throw new InvalidOperationException (string.Format ("Bitcode is currently not supported on {0}.", Framework));
                }
            }

            if (!string.IsNullOrEmpty (HttpClientHandler))
                args.Add (string.Format ("--http-message-handler={0}", HttpClientHandler));

            if (!string.IsNullOrEmpty (TLSProvider))
                args.Add (string.Format ("--tls-provider={0}", TLSProvider.ToLowerInvariant()));

            string thumb = UseThumb && UseLlvm ? "+thumb2" : "";
            string llvm = UseLlvm ? "+llvm" : "";
            string abi = "";

            if (SdkIsSimulator) {
                if (architectures.HasFlag (TargetArchitecture.i386))
                    abi += (abi.Length > 0 ? "," : "") + "i386";

                if (architectures.HasFlag (TargetArchitecture.x86_64))
                    abi += (abi.Length > 0 ? "," : "") + "x86_64";

                if (string.IsNullOrEmpty (abi)) {
                    architectures = TargetArchitecture.i386;
                    abi = "i386";
                }
            } else {
                if (architectures == TargetArchitecture.Default)
                    architectures = TargetArchitecture.ARMv7;

                if (architectures.HasFlag (TargetArchitecture.ARMv7))
                    abi += (abi.Length > 0 ? "," : "") + "armv7" + llvm + thumb;

                if (architectures.HasFlag (TargetArchitecture.ARMv7s))
                    abi += (abi.Length > 0 ? "," : "") + "armv7s" + llvm + thumb;

                if (architectures.HasFlag (TargetArchitecture.ARM64)) {
                    // Note: ARM64 does not have thumb.
                    abi += (abi.Length > 0 ? "," : "") + "arm64" + llvm;
                }

                if (architectures.HasFlag (TargetArchitecture.ARMv7k))
                    abi += (abi.Length > 0 ? "," : "") + "armv7k";

                if (string.IsNullOrEmpty (abi))
                    abi = "armv7" + llvm + thumb;
            }

            // Output the CompiledArchitectures
            CompiledArchitectures = architectures.ToString ();

            args.Add ("--abi=" + abi);

            // output symbols to preserve when stripping
            args.Add ("--symbollist");
            args.AddQuoted (Path.GetFullPath (SymbolsList));

            // don't have mtouch generate the dsyms...
            args.Add ("--dsym=no");

            var gcc = new GccOptions ();

            if (!string.IsNullOrEmpty (ExtraArgs)) {
                var extraArgs = ProcessArgumentBuilder.Parse (ExtraArgs);
                var target = MainAssembly.ItemSpec;
                string projectDir;

                if (ProjectDir.StartsWith ("~/", StringComparison.Ordinal)) {
                    // Note: Since the Visual Studio plugin doesn't know the user's home directory on the Mac build host,
                    // it simply uses paths relative to "~/". Expand these paths to their full path equivalents.
                    var home = Environment.GetFolderPath (Environment.SpecialFolder.UserProfile);

                    projectDir = Path.Combine (home, ProjectDir.Substring (2));
                } else {
                    projectDir = ProjectDir;
                }

                var customTags = new Dictionary<string, string> (StringComparer.OrdinalIgnoreCase) {
                    { "projectdir",   projectDir },
                    // Apparently msbuild doesn't propagate the solution path, so we can't get it.
                    // { "solutiondir",  proj.ParentSolution != null ? proj.ParentSolution.BaseDirectory : proj.BaseDirectory },
                    { "appbundledir", AppBundleDir },
                    { "targetpath",   Path.Combine (Path.GetDirectoryName (target), Path.GetFileName (target)) },
                    { "targetdir",    Path.GetDirectoryName (target) },
                    { "targetname",   Path.GetFileName (target) },
                    { "targetext",    Path.GetExtension (target) },
                };

                for (int i = 0; i < extraArgs.Length; i++) {
                    if (extraArgs[i] == "-gcc_flags" || extraArgs[i] == "--gcc_flags") {
                        // user-defined -gcc_flags argument
                        if (i + 1 < extraArgs.Length && !string.IsNullOrEmpty (extraArgs[i + 1])) {
                            var gccArgs = ProcessArgumentBuilder.Parse (extraArgs[i + 1]);

                            for (int j = 0; j < gccArgs.Length; j++)
                                gcc.Arguments.Add (StringParserService.Parse (gccArgs[j], customTags));
                        }

                        i++;
                    } else {
                        // other user-defined mtouch arguments
                        args.AddQuoted (StringParserService.Parse (extraArgs[i], customTags));
                    }
                }
            }

            BuildNativeReferenceFlags (gcc);
            BuildEntitlementFlags (gcc);

            foreach (var framework in gcc.Frameworks) {
                args.Add ("-framework");
                args.AddQuoted (framework);
            }

            foreach (var framework in gcc.WeakFrameworks) {
                args.Add ("-weak-framework");
                args.AddQuoted (framework);
            }

            if (gcc.Cxx)
                args.Add ("--cxx");

            if (gcc.Arguments.Length > 0) {
                args.Add ("--gcc_flags");
                args.AddQuoted (gcc.Arguments.ToString ());
            }

            foreach (var asm in References) {
                args.Add ("-r");
                if (IsFrameworkItem(asm)) {
                    args.AddQuoted (ResolveFrameworkFile(asm.ItemSpec));
                } else {
                    args.AddQuoted (Path.GetFullPath (asm.ItemSpec));
                }
            }

            foreach (var ext in AppExtensionReferences) {
                args.Add ("--app-extension");
                args.AddQuoted (Path.GetFullPath (ext.ItemSpec));
            }

            args.Add ("--target-framework");
            args.Add (TargetFrameworkIdentifier + "," + TargetFrameworkVersion);

            args.AddQuoted (MainAssembly.ItemSpec);

            // We give the priority to the ExtraArgs to set the mtouch verbosity.
            if (string.IsNullOrEmpty (ExtraArgs) || (!string.IsNullOrEmpty (ExtraArgs) && !ExtraArgs.Contains ("-q") && !ExtraArgs.Contains ("-v")))
                args.Add (GetVerbosityLevel (Verbosity));

            if (!string.IsNullOrWhiteSpace (License))
                args.Add (string.Format("--license={0}", License));

            return args.ToString ();
        }
Exemplo n.º 2
0
        int CopySceneKitAssets(string scnassets, string output, string intermediate)
        {
            var environment = new Dictionary<string, string> ();
            var args = new ProcessArgumentBuilder ();

            environment.Add ("PATH", DeveloperRootBinDir);
            environment.Add ("DEVELOPER_DIR", SdkDevPath);
            environment.Add ("XCODE_DEVELOPER_USR_PATH", DeveloperRootBinDir);

            args.AddQuoted (Path.GetFullPath (scnassets));
            args.Add ("-o");
            args.AddQuoted (Path.GetFullPath (output));
            args.AddQuotedFormat ("--sdk-root={0}", SdkRoot);
            args.AddQuotedFormat ("--target-version-{0}={1}", OperatingSystem, SdkVersion);
            args.AddQuotedFormat ("--target-build-dir={0}", Path.GetFullPath (intermediate));

            var startInfo = GetProcessStartInfo (environment, GetFullPathToTool (), args.ToString ());

            try {
                using (var process = new Process ()) {
                    Log.LogMessage (MessageImportance.Normal, "Tool {0} execution started with arguments: {1}", startInfo.FileName, startInfo.Arguments);

                    process.StartInfo = startInfo;
                    process.OutputDataReceived += (sender, e) => {
                        if (e.Data == null)
                            return;

                        Log.LogMessage (MessageImportance.Low, "{0}", e.Data);
                    };

                    process.Start ();
                    process.BeginOutputReadLine ();
                    process.WaitForExit ();

                    Log.LogMessage (MessageImportance.Low, "Tool {0} execution finished.", startInfo.FileName);

                    return process.ExitCode;
                }
            } catch (Exception ex) {
                Log.LogError ("Error executing tool '{0}': {1}", startInfo.FileName, ex.Message);
                return -1;
            }
        }