[tests] Set the correct mono-native link mode and flavor defines in the csproj itself.

This makes it possible to simplify a lot of C# code.
This commit is contained in:
Rolf Bjarne Kvinge 2020-07-22 10:15:29 +02:00
Родитель 92a9aacbd3
Коммит e47a995797
5 изменённых файлов: 35 добавлений и 85 удалений

Просмотреть файл

@ -14,14 +14,18 @@
<NoWarn>168,169,219,414,612,618,649,672</NoWarn>
<TargetFrameworkIdentifier>Xamarin.iOS</TargetFrameworkIdentifier>
<IntermediateOutputPath>obj\$(Platform)\$(Configuration)-unified</IntermediateOutputPath>
<DefineConstants></DefineConstants>
</PropertyGroup>
<PropertyGroup>
<MonoNativeMode Condition="'$(TargetFrameworkIdentifier)|$(Configuration)|$(Platform)' == 'Xamarin.iOS|Debug|iPhoneSimulator'">MONO_NATIVE_SYMLINK</MonoNativeMode>
<MonoNativeMode Condition="'$(MonoNativeMode)' == ''">MONO_NATIVE_STATIC</MonoNativeMode>
<DefineConstants>$(MonoNativeMode);$(DefineConstants)</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhoneSimulator' ">
<DebugSymbols>True</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>False</Optimize>
<OutputPath>bin\iPhoneSimulator\$(Configuration)-unified</OutputPath>
<DefineConstants>DEBUG;MONO_NATIVE_SYMLINK;$(DefineConstants)</DefineConstants>
<DefineConstants>DEBUG;$(DefineConstants)</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<MtouchDebug>True</MtouchDebug>
@ -36,7 +40,7 @@
<DebugType>none</DebugType>
<Optimize>True</Optimize>
<OutputPath>bin\iPhoneSimulator\$(Configuration)-unified</OutputPath>
<DefineConstants>MONO_NATIVE_STATIC;$(DefineConstants)</DefineConstants>
<DefineConstants>$(DefineConstants)</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<MtouchLink>None</MtouchLink>
@ -50,7 +54,7 @@
<DebugType>full</DebugType>
<Optimize>False</Optimize>
<OutputPath>bin\iPhone\$(Configuration)-unified</OutputPath>
<DefineConstants>DEBUG;MONO_NATIVE_STATIC;$(DefineConstants)</DefineConstants>
<DefineConstants>DEBUG;$(DefineConstants)</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignKey>iPhone Developer</CodesignKey>
@ -66,7 +70,7 @@
<DebugType>full</DebugType>
<Optimize>False</Optimize>
<OutputPath>bin\iPhone\$(Configuration)-unified</OutputPath>
<DefineConstants>DEBUG;MONO_NATIVE_STATIC;$(DefineConstants)</DefineConstants>
<DefineConstants>DEBUG;$(DefineConstants)</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignKey>iPhone Developer</CodesignKey>
@ -82,7 +86,7 @@
<DebugType>full</DebugType>
<Optimize>False</Optimize>
<OutputPath>bin\iPhone\$(Configuration)-unified</OutputPath>
<DefineConstants>DEBUG;MONO_NATIVE_STATIC;$(DefineConstants)</DefineConstants>
<DefineConstants>DEBUG;$(DefineConstants)</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignKey>iPhone Developer</CodesignKey>
@ -97,7 +101,7 @@
<DebugType>none</DebugType>
<Optimize>True</Optimize>
<OutputPath>bin\iPhone\$(Configuration)-unified</OutputPath>
<DefineConstants>MONO_NATIVE_STATIC;$(DefineConstants)</DefineConstants>
<DefineConstants>$(DefineConstants)</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignKey>iPhone Developer</CodesignKey>
@ -112,7 +116,7 @@
<DebugType>none</DebugType>
<Optimize>True</Optimize>
<OutputPath>bin\iPhone\$(Configuration)-unified</OutputPath>
<DefineConstants>MONO_NATIVE_STATIC;$(DefineConstants)</DefineConstants>
<DefineConstants>$(DefineConstants)</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignKey>iPhone Developer</CodesignKey>
@ -127,7 +131,7 @@
<DebugType>none</DebugType>
<Optimize>True</Optimize>
<OutputPath>bin\iPhone\$(Configuration)-unified</OutputPath>
<DefineConstants>MONO_NATIVE_STATIC;$(DefineConstants)</DefineConstants>
<DefineConstants>$(DefineConstants)</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignKey>iPhone Developer</CodesignKey>
@ -142,7 +146,7 @@
<DebugType>none</DebugType>
<Optimize>True</Optimize>
<OutputPath>bin\iPhone\$(Configuration)-unified</OutputPath>
<DefineConstants>MONO_NATIVE_STATIC;$(DefineConstants)</DefineConstants>
<DefineConstants>$(DefineConstants)</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignKey>iPhone Developer</CodesignKey>

Просмотреть файл

@ -18,7 +18,6 @@ namespace Xharness.Jenkins {
public bool? Ignored;
public bool EnableSGenConc;
public bool UseThumb;
public MonoNativeFlavor MonoNativeFlavor;
public MonoNativeLinkMode MonoNativeLinkMode;
public IEnumerable<IDevice> Candidates;
}

Просмотреть файл

@ -29,19 +29,6 @@ namespace Xharness.Jenkins {
{
// This function returns additional test configurations (in addition to the default one) for the specific test
MonoNativeFlavor flavor;
switch (test.TestName) {
case "mono-native-compat":
flavor = MonoNativeFlavor.Compat;
break;
case "mono-native-unified":
flavor = MonoNativeFlavor.Unified;
break;
default:
flavor = MonoNativeFlavor.None;
break;
}
// 32-bit interpreter doesn't work yet: https://github.com/mono/mono/issues/9871
var supports_interpreter = test.Platform != TestPlatform.iOS_Unified32;
var supports_dynamic_registrar_on_device = test.Platform == TestPlatform.iOS_Unified64 || test.Platform == TestPlatform.tvOS;
@ -54,17 +41,17 @@ namespace Xharness.Jenkins {
/* we don't add --assembly-build-target=@all=staticobject because that's the default in all our test projects */
if (supports_debug) {
yield return new TestData { Variation = "AssemblyBuildTarget: dylib (debug)", MTouchExtraArgs = $"--assembly-build-target=@all=dynamiclibrary {test.TestProject.MTouchExtraArgs}", Debug = true, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Dynamic, MonoNativeFlavor = flavor };
yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (debug)", MTouchExtraArgs = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject {test.TestProject.MTouchExtraArgs}", Debug = true, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static, MonoNativeFlavor = flavor };
yield return new TestData { Variation = "AssemblyBuildTarget: dylib (debug, profiling)", MTouchExtraArgs = $"--assembly-build-target=@all=dynamiclibrary {test.TestProject.MTouchExtraArgs}", Debug = true, Profiling = true, MonoNativeLinkMode = MonoNativeLinkMode.Dynamic, MonoNativeFlavor = flavor };
yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (debug, profiling)", MTouchExtraArgs = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject {test.TestProject.MTouchExtraArgs}", Debug = true, Profiling = true, MonoNativeLinkMode = MonoNativeLinkMode.Static, MonoNativeFlavor = flavor };
yield return new TestData { Variation = "AssemblyBuildTarget: dylib (debug)", MTouchExtraArgs = $"--assembly-build-target=@all=dynamiclibrary {test.TestProject.MTouchExtraArgs}", Debug = true, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Dynamic };
yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (debug)", MTouchExtraArgs = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject {test.TestProject.MTouchExtraArgs}", Debug = true, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static };
yield return new TestData { Variation = "AssemblyBuildTarget: dylib (debug, profiling)", MTouchExtraArgs = $"--assembly-build-target=@all=dynamiclibrary {test.TestProject.MTouchExtraArgs}", Debug = true, Profiling = true, MonoNativeLinkMode = MonoNativeLinkMode.Dynamic };
yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (debug, profiling)", MTouchExtraArgs = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject {test.TestProject.MTouchExtraArgs}", Debug = true, Profiling = true, MonoNativeLinkMode = MonoNativeLinkMode.Static };
}
if (test.ProjectConfiguration.Contains ("Debug"))
yield return new TestData { Variation = "Release", MTouchExtraArgs = test.TestProject.MTouchExtraArgs, Debug = false, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static };
if (test.Platform == TestPlatform.iOS_Unified32)
yield return new TestData { Variation = "Release: UseThumb", MTouchExtraArgs = test.TestProject.MTouchExtraArgs, Debug = false, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static, UseThumb = true };
yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (release)", MTouchExtraArgs = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject {test.TestProject.MTouchExtraArgs}", Debug = false, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static, MonoNativeFlavor = flavor };
yield return new TestData { Variation = "AssemblyBuildTarget: SDK framework (release)", MTouchExtraArgs = $"--assembly-build-target=@sdk=framework=Xamarin.Sdk --assembly-build-target=@all=staticobject {test.TestProject.MTouchExtraArgs}", Debug = false, Profiling = false, MonoNativeLinkMode = MonoNativeLinkMode.Static };
switch (test.TestName) {
case "monotouch-test":
@ -203,11 +190,11 @@ namespace Xharness.Jenkins {
}
}
clone.Xml.SetNode (isMac ? "Profiling" : "MTouchProfiling", profiling ? "True" : "False", task.ProjectPlatform, configuration);
if (test_data.MonoNativeFlavor != MonoNativeFlavor.None) {
if (test_data.MonoNativeLinkMode != MonoNativeLinkMode.None) {
var mono_native_link = test_data.MonoNativeLinkMode;
if (!canSymlink && mono_native_link == MonoNativeLinkMode.Symlink)
mono_native_link = MonoNativeLinkMode.Static;
MonoNativeHelper.AddProjectDefines (clone.Xml, test_data.MonoNativeFlavor, mono_native_link, task.ProjectPlatform, configuration);
MonoNativeHelper.AddProjectDefines (clone.Xml, mono_native_link);
}
if (test_data.EnableSGenConc)
clone.Xml.SetNode ("MtouchEnableSGenConc", "true", task.ProjectPlatform, configuration);

Просмотреть файл

@ -48,64 +48,23 @@ namespace Microsoft.DotNet.XHarness.iOS.Shared {
public static class MonoNativeHelper
{
public static void AddProjectDefines (
XmlDocument project, MonoNativeFlavor flavor, MonoNativeLinkMode link,
string platform, string config)
{
AddProjectDefines (project, flavor, platform, config);
AddProjectDefines (project, link, platform, config);
}
public static void AddProjectDefines (
XmlDocument project, MonoNativeFlavor flavor,
string platform = null, string config = null)
{
switch (flavor) {
case MonoNativeFlavor.Compat:
if (platform != null)
project.AddAdditionalDefines ("MONO_NATIVE_COMPAT", platform, config);
else
project.AddAdditionalDefines ("MONO_NATIVE_COMPAT");
break;
case MonoNativeFlavor.Unified:
if (platform != null)
project.AddAdditionalDefines ("MONO_NATIVE_UNIFIED", platform, config);
else
project.AddAdditionalDefines ("MONO_NATIVE_UNIFIED");
break;
default:
throw new Exception ($"Unknown MonoNativeFlavor: {flavor}");
}
}
public static void AddProjectDefines (
XmlDocument project, MonoNativeLinkMode link,
string platform, string config)
public static void AddProjectDefines (XmlDocument project, MonoNativeLinkMode link)
{
switch (link) {
case MonoNativeLinkMode.Static:
project.AddAdditionalDefines ("MONO_NATIVE_STATIC", platform, config);
project.RemoveDefines ("MONO_NATIVE_DYNAMIC; MONO_NATIVE_SYMLINK", platform, config);
project.AddTopLevelProperty ("MonoNativeMode", "MONO_NATIVE_STATIC");;
break;
case MonoNativeLinkMode.Dynamic:
project.AddAdditionalDefines ("MONO_NATIVE_DYNAMIC", platform, config);
project.RemoveDefines ("MONO_NATIVE_STATIC; MONO_NATIVE_SYMLINK", platform, config);
project.AddTopLevelProperty ("MonoNativeMode", "MONO_NATIVE_DYNAMIC");
break;
case MonoNativeLinkMode.Symlink:
project.AddAdditionalDefines ("MONO_NATIVE_SYMLINK", platform, config);
project.RemoveDefines ("MONO_NATIVE_MONO_NATIVE_STATIC; MONO_NATIVE_DYNAMIC", platform, config);
project.AddTopLevelProperty ("MonoNativeMode", "MONO_NATIVE_SYMLINK");
break;
default:
throw new Exception ($"Unknown MonoNativeLinkMode: {link}");
}
}
public static void RemoveSymlinkMode (XmlDocument project)
{
AddProjectDefines (project, MonoNativeLinkMode.Static, "iPhone", "Debug");
AddProjectDefines (project, MonoNativeLinkMode.Static, "iPhoneSimulator", "Debug");
}
public static string GetMinimumOSVersion (DevicePlatform platform, MonoNativeFlavor flavor)
{
switch (flavor) {
@ -168,9 +127,8 @@ namespace Microsoft.DotNet.XHarness.iOS.Shared {
var xml = File.ReadAllText (TemplatePath);
inputProject.LoadXmlWithoutNetworkAccess (xml);
inputProject.SetOutputPath ("bin\\$(Platform)\\$(Configuration)" + FlavorSuffix);
inputProject.SetIntermediateOutputPath ("obj\\$(Platform)\\$(Configuration)" + FlavorSuffix);
inputProject.SetAssemblyName (inputProject.GetAssemblyName () + FlavorSuffix);
inputProject.AddAdditionalDefines (Flavor == MonoNativeFlavor.Compat ? "MONO_NATIVE_COMPAT" : "MONO_NATIVE_UNIFIED");
inputProject.ResolveAllPaths (TemplatePath);
var template_info_plist = inputProject.GetInfoPListInclude ().Replace ('\\', '/');
@ -178,16 +136,9 @@ namespace Microsoft.DotNet.XHarness.iOS.Shared {
SetInfoPListMinimumOSVersion (template_info_plist, target_info_plist);
inputProject.FixInfoPListInclude (FlavorSuffix, newName: target_info_plist);
AddProjectDefines (inputProject);
inputProject.Save (ProjectPath, log);
}
public void AddProjectDefines (XmlDocument project)
{
MonoNativeHelper.AddProjectDefines (project, Flavor);
}
public XmlDocument SetInfoPListMinimumOSVersion (string template_plist, string target_plist)
{
var template_info_plist = template_plist;

Просмотреть файл

@ -817,6 +817,15 @@ namespace Microsoft.DotNet.XHarness.iOS.Shared.Utilities {
throw new Exception ("Could not find where to add a new DefineConstants node");
}
public static void AddTopLevelProperty (this XmlDocument csproj, string property, string value)
{
var propertyGroup = csproj.SelectNodes ("//*[local-name() = 'PropertyGroup' and not(@Condition)]") [0];
var propertyNode = csproj.CreateElement (property, csproj.GetNamespace ());
propertyNode.InnerText = value;
propertyGroup.AppendChild (propertyNode);
}
public static void SetNode (this XmlDocument csproj, string node, string value)
{
var nodes = csproj.SelectNodes ("/*/*/*[local-name() = '" + node + "']");