void CreateWatchOSContainerProject()
        {
            var csproj = new XmlDocument();

            csproj.LoadWithoutNetworkAccess(Path.Combine(Harness.WatchOSContainerTemplate, "Container.csproj"));

            csproj.FindAndReplace("%CONTAINER_PATH%", Path.GetFullPath(Harness.WatchOSContainerTemplate).Replace('/', '\\') + "\\");
            csproj.FindAndReplace("%WATCHAPP_CSPROJ%", Path.GetFileName(WatchOSAppProjectPath));
            csproj.SetProjectReferenceValue(Path.GetFileName(WatchOSAppProjectPath), "Name", Path.GetFileNameWithoutExtension(WatchOSAppProjectPath));
            WatchOSGuid = "{" + Harness.NewStableGuid().ToString().ToUpper() + "}";
            csproj.SetProjectGuid(WatchOSGuid);
            csproj.FixInfoPListInclude(Suffix);
            if (MonoNativeInfo != null)
            {
                csproj.AddAdditionalDefines("MONO_NATIVE_WATCH");
                MonoNativeHelper.AddProjectDefines(csproj, MonoNativeInfo.Flavor);
                MonoNativeHelper.RemoveSymlinkMode(csproj);
            }
            Harness.Save(csproj, WatchOSProjectPath);

            XmlDocument info_plist        = new XmlDocument();
            var         target_info_plist = Path.Combine(TargetDirectory, $"Info{Suffix}.plist");

            info_plist.LoadWithoutNetworkAccess(Path.Combine(Harness.WatchOSContainerTemplate, "Info.plist"));
            info_plist.SetCFBundleIdentifier(BundleIdentifier);
            info_plist.SetCFBundleName(Name);
            info_plist.SetMinimumOSVersion("9.0");
            Harness.Save(info_plist, target_info_plist);
        }
        void CreateWatchOSAppProject()
        {
            var csproj = new XmlDocument();
            var suffix = Suffix + "-app";

            csproj.LoadWithoutNetworkAccess(Path.Combine(Harness.WatchOSAppTemplate, "App.csproj"));
            csproj.FindAndReplace("%WATCHAPP_PATH%", Path.GetFullPath(Harness.WatchOSAppTemplate).Replace('/', '\\') + "\\");
            csproj.FindAndReplace("%WATCHEXTENSION_CSPROJ%", Path.GetFileName(WatchOSExtensionProjectPath));
            csproj.SetProjectReferenceValue(Path.GetFileName(WatchOSExtensionProjectPath), "Project", WatchOSExtensionGuid);
            csproj.SetProjectReferenceValue(Path.GetFileName(WatchOSExtensionProjectPath), "Name", Path.GetFileNameWithoutExtension(WatchOSExtensionProjectPath));
            WatchOSAppGuid = "{" + Harness.NewStableGuid().ToString().ToUpper() + "}";
            csproj.SetProjectGuid(WatchOSAppGuid);
            csproj.FixInfoPListInclude(suffix);
            if (MonoNativeInfo != null)
            {
                csproj.AddAdditionalDefines("MONO_NATIVE_WATCH");
                MonoNativeHelper.AddProjectDefines(csproj, MonoNativeInfo.Flavor);
                MonoNativeHelper.RemoveSymlinkMode(csproj);
            }
            Harness.Save(csproj, WatchOSAppProjectPath);

            XmlDocument info_plist        = new XmlDocument();
            var         target_info_plist = Path.Combine(TargetDirectory, $"Info{Suffix}-app.plist");

            info_plist.LoadWithoutNetworkAccess(Path.Combine(Harness.WatchOSAppTemplate, "Info.plist"));
            info_plist.SetCFBundleIdentifier(BundleIdentifier + ".watchkitapp");
            info_plist.SetPListStringValue("WKCompanionAppBundleIdentifier", BundleIdentifier);
            info_plist.SetPListStringValue("CFBundleName", Name);
            info_plist.SetMinimumOSVersion(GetMinimumOSVersion(info_plist.GetMinimumOSVersion()));
            Harness.Save(info_plist, target_info_plist);
        }
Exemple #3
0
        protected override void ProcessProject()
        {
            base.ProcessProject();

            if (MonoNativeInfo != null)
            {
                inputProject.AddAdditionalDefines("MONO_NATIVE_TV");
                MonoNativeHelper.AddProjectDefines(inputProject, MonoNativeInfo.Flavor);
                MonoNativeHelper.RemoveSymlinkMode(inputProject);
            }

            var srcDirectory = Path.Combine(Harness.RootDirectory, "..", "src");

            string project_guid;
            var    mt_nunitlite_project_path = Path.GetFullPath(Path.Combine(srcDirectory, "MonoTouch.NUnitLite.tvos.csproj"));

            if (!project_guids.TryGetValue(mt_nunitlite_project_path, out project_guid))
            {
                XmlDocument mt_nunitlite_project = new XmlDocument();
                mt_nunitlite_project.LoadWithoutNetworkAccess(mt_nunitlite_project_path);
                project_guid = mt_nunitlite_project.GetProjectGuid();
                project_guids [mt_nunitlite_project_path] = project_guid;
            }
            inputProject.CreateProjectReferenceValue("MonoTouch.NUnitLite", mt_nunitlite_project_path, project_guid, "MonoTouch.NUnitLite");

            inputProject.AddExtraMtouchArgs("--bitcode:asmonly", "iPhone", "Release");
            inputProject.SetMtouchUseLlvm(true, "iPhone", "Release");

            // Remove bitcode from executables, since we don't need it for testing, and it makes test apps bigger (and the Apple TV might refuse to install them).
            var configurations = new string [] { "Debug", "Debug64", "Release", "Release64" };

            foreach (var c in configurations)
            {
                inputProject.AddExtraMtouchArgs($"--gcc_flags=-fembed-bitcode-marker", "iPhone", c);
            }
        }
        void CreateWatchOSExtensionProject()
        {
            var csproj = inputProject;
            var suffix = Suffix + "-extension";

            // Remove unused configurations
            csproj.DeleteConfiguration("iPhone", "Release-bitcode");
            csproj.DeleteConfiguration("iPhone", "Release64");
            csproj.DeleteConfiguration("iPhone", "Debug64");

            csproj.FixArchitectures("i386", "ARMv7k", "iPhone", "Release32");
            csproj.FixArchitectures("i386", "ARMv7k", "iPhone", "Debug32");

            // add Release64_32 and set the correct architecture
            csproj.CloneConfiguration("iPhone", "Release", "Release64_32");
            csproj.FixArchitectures("i386", "ARM64_32", "iPhone", "Release64_32");

            // add Debug64_32 and set the correct architecture
            csproj.CloneConfiguration("iPhone", "Debug", "Debug64_32");
            csproj.FixArchitectures("i386", "ARM64_32", "iPhone", "Debug64_32");

            csproj.FixArchitectures(SimulatorArchitectures, DeviceArchitectures, "iPhoneSimulator", "Debug");
            csproj.FixArchitectures(SimulatorArchitectures, DeviceArchitectures, "iPhoneSimulator", "Release");
            csproj.FixArchitectures(SimulatorArchitectures, DeviceArchitectures, "iPhone", "Debug");
            csproj.FixArchitectures(SimulatorArchitectures, DeviceArchitectures, "iPhone", "Release");

            csproj.SetProjectTypeGuids("{1E2E965C-F6D2-49ED-B86E-418A60C69EEF};" + LanguageGuid);
            csproj.SetOutputPath("bin\\$(Platform)\\$(Configuration)" + suffix);
            csproj.SetIntermediateOutputPath("obj\\$(Platform)\\$(Configuration)" + suffix);
            csproj.RemoveTargetFrameworkIdentifier();
            csproj.SetPlatformAssembly("Xamarin.WatchOS");
            csproj.SetImport(IsFSharp ? "$(MSBuildExtensionsPath)\\Xamarin\\WatchOS\\Xamarin.WatchOS.AppExtension.FSharp.targets" : "$(MSBuildExtensionsPath)\\Xamarin\\WatchOS\\Xamarin.WatchOS.AppExtension.CSharp.targets");
            csproj.FixProjectReferences("-watchos");

            csproj.FixInfoPListInclude(suffix);
            csproj.SetOutputType("Library");
            csproj.AddAdditionalDefines("BITCODE", "iPhone", "Release");
            csproj.AddAdditionalDefines("XAMCORE_2_0;XAMCORE_3_0;FEATURE_NO_BSD_SOCKETS;MONOTOUCH_WATCH;");
            csproj.RemoveReferences("OpenTK-1.0");
            var ext = IsFSharp ? "fs" : "cs";

            csproj.AddCompileInclude("InterfaceController." + ext, Path.Combine(Harness.WatchOSExtensionTemplate, "InterfaceController." + ext));
            csproj.SetExtraLinkerDefs("extra-linker-defs" + ExtraLinkerDefsSuffix + ".xml");
            csproj.SetMtouchUseBitcode(true, "iPhone", "Release");
            csproj.SetMtouchUseLlvm(true, "iPhone", "Release");

            if (MonoNativeInfo != null)
            {
                csproj.AddAdditionalDefines("MONO_NATIVE_WATCH");
                MonoNativeHelper.AddProjectDefines(csproj, MonoNativeInfo.Flavor);
                MonoNativeHelper.RemoveSymlinkMode(csproj);
            }

            // Not linking a watch extensions requires passing -Os to the native compiler.
            // https://github.com/mono/mono/issues/9867
            var configurations = new string [] { "Debug", "Debug32", "Debug64_32", "Release", "Release32", "Release64_32" };

            foreach (var c in configurations)
            {
                var flags = "-fembed-bitcode-marker";
                if (csproj.GetMtouchLink("iPhone", c) == "None")
                {
                    flags += " -Os";
                }

                csproj.AddExtraMtouchArgs($"--gcc_flags='{flags}'", "iPhone", c);
            }

            Harness.Save(csproj, WatchOSExtensionProjectPath);

            WatchOSExtensionGuid = csproj.GetProjectGuid();

            XmlDocument info_plist        = new XmlDocument();
            var         target_info_plist = Path.Combine(TargetDirectory, $"Info{Suffix}-extension.plist");

            info_plist.LoadWithoutNetworkAccess(Path.Combine(TargetDirectory, "Info.plist"));
            BundleIdentifier = info_plist.GetCFBundleIdentifier() + "_watch";
            if (BundleIdentifier.Length >= 58)
            {
                BundleIdentifier = BundleIdentifier.Substring(0, 57);                  // If the main app's bundle id is 58 characters (or sometimes more), then the watch extension crashes at launch. radar #29847128.
            }
            info_plist.SetCFBundleIdentifier(BundleIdentifier + ".watchkitapp.watchkitextension");
            info_plist.SetMinimumOSVersion(GetMinimumOSVersion("2.0"));
            info_plist.SetUIDeviceFamily(4);
            info_plist.AddPListStringValue("RemoteInterfacePrincipleClass", "InterfaceController");
            info_plist.AddPListKeyValuePair("NSExtension", "dict", string.Format(
                                                @"
    <key>NSExtensionAttributes</key>
    <dict>
    <key>WKAppBundleIdentifier</key>
    <string>{0}.watchkitapp</string>
    </dict>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.watchkit</string>
", BundleIdentifier));
            if (!info_plist.ContainsKey("NSAppTransportSecurity"))
            {
                info_plist.AddPListKeyValuePair("NSAppTransportSecurity", "dict",
                                                @"
		  <key>NSAllowsArbitraryLoads</key>
		  <true/>
		"        );
            }
            Harness.Save(info_plist, target_info_plist);
        }