Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/mono/sample/Android/AndroidSampleApp.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -79,6 +79,8 @@
Assemblies="@(BundleAssemblies)"
MainLibraryFileName="$(AssemblyName).dll"
StripDebugSymbols="$(StripDebugSymbols)"
RuntimeComponents="$(RuntimeComponents)"
DiagnosticPorts="$(DiagnosticPorts)"
OutputDir="$(ApkDir)"
AppDir="$(PublishDir)">
<Output TaskParameter="ApkBundlePath" PropertyName="ApkBundlePath" />
Expand Down
14 changes: 13 additions & 1 deletion src/mono/sample/Android/Makefile
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,16 @@ DOTNET := ../../../../dotnet.sh
USE_LLVM=true
AOT=false
DEPLOY_AND_RUN?=true
RUNTIME_COMPONENTS=diagnostics_tracing

#If DIAGNOSTIC_PORTS is enabled, RUNTIME_COMPONENTS must also be enabled.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is optional.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is disabled, use DOTNET_DiagnosticPorts when launching application to enable diagnostics.
#RUNTIME_COMPONENTS=diagnostics_tracing
#DIAGNOSTIC_PORTS=10.0.2.2:9000,nosuspend
#DIAGNOSTIC_PORTS=10.0.2.2:9000,suspend
#DIAGNOSTIC_PORTS=$(DOTNET_DiagnosticPorts)
Comment on lines +12 to +15

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just setting DiagnosticPorts and not set RuntimeComponents to at least include diagnostics_tracing will generate a build error.

Since they're all commented out, can it be noted in the makefiles that RUNTIME_COMPONENTS and DIAGNOSTIC_PORTS should be uncommented together if at all?

Also, out of curiosity, how were 10.0.2.2:9000 and 127.0.0.1:9000 selected (having no prior context of diagnostic ports)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can add more comments into the script.

There are no dedicated port numbers, so could be anything.

10.0.2.2 is how you reach host loopback from Android emulator (without need to use adb). On iOS, 127.0.0.1 can still be used from simulator. But as above these are just examples and might need to be adjusted if you run different scenario.



all: runtimepack run

Expand All@@ -18,7 +28,9 @@ run:
/p:DeployAndRun=$(DEPLOY_AND_RUN) \
/p:ForceAOT=$(AOT) \
/p:UseLLVM=$(USE_LLVM) \
/p:RunActivity=false
/p:RunActivity=false \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

clean:
rm -rf ../../../../artifacts/bin/AndroidSampleApp
55 changes: 45 additions & 10 deletions src/mono/sample/iOS/Makefile
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,14 @@ DOTNET := ../../../../dotnet.sh
USE_LLVM=true
AOT=false

#If DIAGNOSTIC_PORTS is enabled, RUNTIME_COMPONENTS must also be enabled.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is optional.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is disabled, use DOTNET_DiagnosticPorts when launching application to enable diagnostics.
#RUNTIME_COMPONENTS=diagnostics_tracing
#DIAGNOSTIC_PORTS=127.0.0.1:9000,nosuspend
#DIAGNOSTIC_PORTS=127.0.0.1:9000,suspend
#DIAGNOSTIC_PORTS=$(DOTNET_DiagnosticPorts)

all: runtimepack run

TOOLS_DIR=../../../tasks
Expand All@@ -15,24 +23,51 @@ runtimepack:
../../../../build.sh Mono+Libs -os iOSSimulator -arch $(MONO_ARCH) -c $(MONO_CONFIG)

run: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT)
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this format
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
instead of like the previous formats
/p:RuntimeComponents=$(RUNTIME_COMPONENTS) \

@lateralusXlateralusXMay 28, 2021

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since it includes , in the value it needs to be quoted or you will get msbuild argument parsing errors, just putting "" around value is not enough so complete property needs to be quoted as well in order to correctly go through shell parsing rules, problem is described here:

dotnet/msbuild#2999

and there are various workarounds to the problem, one of them is in this PR, but also suggested in different places, like here dotnet/msbuild#471 (comment).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, good to know, thanks for the explanation :)

'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-sim: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=iOSSimulator /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT)
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=iOSSimulator \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-catalyst:
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=MacCatalyst /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False /p:ForceAOT=False
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=MacCatalyst \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False \
/p:ForceAOT=False

run-sim-interp: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=iOSSimulator /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT) /p:MonoForceInterpreter=true
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=iOSSimulator \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
/p:MonoForceInterpreter=true \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-catalyst-interp:
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=MacCatalyst /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False /p:ForceAOT=False /p:MonoForceInterpreter=true
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=MacCatalyst \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False \
/p:ForceAOT=False \
/p:MonoForceInterpreter=true

clean:
rm -rf bin
2 changes: 2 additions & 0 deletions src/mono/sample/iOS/Program.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -84,6 +84,8 @@
Optimized="$(Optimized)"
ForceAOT="$(ForceAOT)"
ForceInterpreter="$(MonoForceInterpreter)"
RuntimeComponents="$(RuntimeComponents)"
DiagnosticPorts="$(DiagnosticPorts)"
AppDir="$(MSBuildThisFileDirectory)$(PublishDir)">
<Output TaskParameter="AppBundlePath" PropertyName="AppBundlePath" />
<Output TaskParameter="XcodeProjectPath" PropertyName="XcodeProjectPath" />
Expand Down
6 changes: 6 additions & 0 deletions src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,6 +43,11 @@ public class AndroidAppBuilderTask : Task
/// </summary>
public string? RuntimeComponents { get; set; } = ""!;

/// <summary>
/// Diagnostic ports configuration string
/// </summary>
public string? DiagnosticPorts { get; set; } = ""!;

[Required]
public string RuntimeIdentifier { get; set; } = ""!;

Expand DownExpand Up@@ -102,6 +107,7 @@ public override bool Execute()
apkBuilder.ForceAOT = ForceAOT;
apkBuilder.StaticLinkedRuntime = StaticLinkedRuntime;
apkBuilder.RuntimeComponents = RuntimeComponents;
apkBuilder.DiagnosticPorts = DiagnosticPorts;
apkBuilder.Assemblies = Assemblies;
(ApkBundlePath, ApkPackageId) = apkBuilder.BuildApk(abi, MainLibraryFileName, MonoRuntimeHeaders);

Expand Down
21 changes: 21 additions & 0 deletions src/tasks/AndroidAppBuilder/ApkBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -28,6 +28,7 @@ public class ApkBuilder
public bool EnableRuntimeLogging { get; set; }
public bool StaticLinkedRuntime { get; set; }
public string? RuntimeComponents { get; set; }
public string? DiagnosticPorts { get; set; }
public ITaskItem[] Assemblies { get; set; } = Array.Empty<ITaskItem>();

public (string apk, string packageId) BuildApk(
Expand DownExpand Up@@ -79,6 +80,21 @@ public class ApkBuilder
throw new InvalidOperationException("Interpreter and AOT cannot be enabled at the same time");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
bool validDiagnosticsConfig = false;

if (string.IsNullOrEmpty(RuntimeComponents))
validDiagnosticsConfig = false;
else if (RuntimeComponents.Equals("*", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;
else if (RuntimeComponents.Contains("diagnostics_tracing", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;

if (!validDiagnosticsConfig)
throw new ArgumentException("Using DiagnosticPorts require diagnostics_tracing runtime component.");
}

// Try to get the latest build-tools version if not specified
if (string.IsNullOrEmpty(BuildToolsVersion))
BuildToolsVersion = GetLatestBuildTools(AndroidSdk);
Expand DownExpand Up@@ -268,6 +284,11 @@ public class ApkBuilder
defines = "add_definitions(-DFORCE_AOT=1)";
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines += "\nadd_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")";
}

cmakeLists = cmakeLists.Replace("%Defines%", defines);

File.WriteAllText(Path.Combine(OutputDir, "CMakeLists.txt"), cmakeLists);
Expand Down
20 changes: 16 additions & 4 deletions src/tasks/AndroidAppBuilder/Templates/monodroid.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -205,12 +205,20 @@ cleanup_runtime_config (MonovmRuntimeConfigArguments *args, void *user_data)
int
mono_droid_runtime_init (const char* executable, int managed_argc, char* managed_argv[])
{
// NOTE: these options can be set via command line args for adb or xharness, see AndroidSampleApp.csproj

// uncomment for debug output:
//
//setenv ("XUNIT_VERBOSE", "true", true);
//setenv ("MONO_LOG_LEVEL", "debug", true);
//setenv ("MONO_LOG_MASK", "all", true);
// NOTE: these options can be set via command line args for adb or xharness, see AndroidSampleApp.csproj

// build using DiagnosticPorts property in AndroidAppBuilder
// or set DOTNET_DiagnosticPorts env via adb, xharness when undefined.
// NOTE, using DOTNET_DiagnosticPorts requires app build using AndroidAppBuilder and RuntimeComponents=diagnostics_tracing
#ifdef DIAGNOSTIC_PORTS
setenv ("DOTNET_DiagnosticPorts", DIAGNOSTIC_PORTS, true);
#endif

bool wait_for_debugger = false;
chdir (bundle_path);
Expand DownExpand Up@@ -266,14 +274,18 @@ mono_droid_runtime_init (const char* executable, int managed_argc, char* managed
mono_jit_set_aot_mode(MONO_AOT_MODE_FULL);
#endif

mono_jit_init_version ("dotnet.android", "mobile");
MonoDomain *domain = mono_jit_init_version ("dotnet.android", "mobile");
assert (domain);

MonoAssembly *assembly = mono_droid_load_assembly (executable, NULL);
assert (assembly);
LOG_INFO ("Executable: %s", executable);

int res = mono_jit_exec (mono_domain_get (), assembly, managed_argc, managed_argv);
LOG_INFO ("Executable: %s", executable);
int res = mono_jit_exec (domain, assembly, managed_argc, managed_argv);
LOG_INFO ("Exit code: %d.", res);

mono_jit_cleanup (domain);

return res;
}

Expand Down
21 changes: 21 additions & 0 deletions src/tasks/AppleAppBuilder/AppleAppBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -131,6 +131,11 @@ public string TargetOS
/// </summary>
public string? RuntimeComponents { get; set; } = ""!;

/// <summary>
/// Diagnostic ports configuration string
/// </summary>
public string? DiagnosticPorts { get; set; } = ""!;

/// <summary>
/// Forces the runtime to use the invariant mode
/// </summary>
Expand DownExpand Up@@ -198,10 +203,26 @@ public override bool Execute()
throw new InvalidOperationException("Interpreter and AOT cannot be enabled at the same time");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
bool validDiagnosticsConfig = false;

if (string.IsNullOrEmpty(RuntimeComponents))
validDiagnosticsConfig = false;
else if (RuntimeComponents.Equals("*", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;
else if (RuntimeComponents.Contains("diagnostics_tracing", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;

if (!validDiagnosticsConfig)
throw new ArgumentException("Using DiagnosticPorts require diagnostics_tracing runtime component.");
}

if (GenerateXcodeProject)
{
Xcode generator = new Xcode(TargetOS, Arch);
generator.EnableRuntimeLogging = EnableRuntimeLogging;
generator.DiagnosticPorts = DiagnosticPorts;

XcodeProjectPath = generator.GenerateXCode(ProjectName, MainLibraryFileName, assemblerFiles,
AppDir, binDir, MonoRuntimeHeaders, !isDevice, UseConsoleUITemplate, ForceAOT, ForceInterpreter, InvariantGlobalization, Optimized, RuntimeComponents, NativeMainSource);
Expand Down
13 changes: 12 additions & 1 deletion src/tasks/AppleAppBuilder/Templates/runtime.m
Original file line numberDiff line numberDiff line change
Expand Up@@ -231,6 +231,13 @@
setenv ("MONO_LOG_MASK", "all", TRUE);
#endif

// build using DiagnosticPorts property in AppleAppBuilder
// or set DOTNET_DiagnosticPorts env via mlaunch, xharness when undefined.
// NOTE, using DOTNET_DiagnosticPorts requires app build using AppleAppBuilder and RuntimeComponents=diagnostics_tracing
#ifdef DIAGNOSTIC_PORTS
setenv ("DOTNET_DiagnosticPorts", DIAGNOSTIC_PORTS, true);
#endif

id args_array = [[NSProcessInfo processInfo] arguments];
assert ([args_array count] <= 128);
const char *managed_argv [128];
Expand DownExpand Up@@ -308,7 +315,9 @@
char* options[] = { "--debugger-agent=transport=dt_socket,server=y,address=0.0.0.0:55555" };
mono_jit_parse_options (1, options);
}
mono_jit_init_version ("dotnet.ios", "mobile");

MonoDomain *domain = mono_jit_init_version ("dotnet.ios", "mobile");
assert (domain);

#if !FORCE_INTERPRETER && (!TARGET_OS_SIMULATOR || FORCE_AOT)
// device runtimes are configured to use lazy gc thread creation
Expand All@@ -326,5 +335,7 @@
// Print this so apps parsing logs can detect when we exited
os_log_info (OS_LOG_DEFAULT, "Exit code: %d.", res);

mono_jit_cleanup (domain);

exit (res);
}
6 changes: 6 additions & 0 deletions src/tasks/AppleAppBuilder/Xcode.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,6 +41,7 @@ public Xcode(string target, string arch)
}

public bool EnableRuntimeLogging { get; set; }
public string? DiagnosticPorts { get; set; } = ""!;

public string GenerateXCode(
string projectName,
Expand DownExpand Up@@ -212,6 +213,11 @@ public string GenerateXCode(
defines.AppendLine("add_definitions(-DENABLE_RUNTIME_LOGGING=1)");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines.AppendLine("\nadd_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")");
}

cmakeLists = cmakeLists.Replace("%Defines%", defines.ToString());

string plist = Utils.GetEmbeddedResource("Info.plist.template")
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/mono/sample/Android/AndroidSampleApp.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -79,6 +79,8 @@
Assemblies="@(BundleAssemblies)"
MainLibraryFileName="$(AssemblyName).dll"
StripDebugSymbols="$(StripDebugSymbols)"
RuntimeComponents="$(RuntimeComponents)"
DiagnosticPorts="$(DiagnosticPorts)"
OutputDir="$(ApkDir)"
AppDir="$(PublishDir)">
<Output TaskParameter="ApkBundlePath" PropertyName="ApkBundlePath" />
Expand Down
14 changes: 13 additions & 1 deletion src/mono/sample/Android/Makefile
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,16 @@ DOTNET := ../../../../dotnet.sh
USE_LLVM=true
AOT=false
DEPLOY_AND_RUN?=true
RUNTIME_COMPONENTS=diagnostics_tracing

#If DIAGNOSTIC_PORTS is enabled, RUNTIME_COMPONENTS must also be enabled.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is optional.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is disabled, use DOTNET_DiagnosticPorts when launching application to enable diagnostics.
#RUNTIME_COMPONENTS=diagnostics_tracing
#DIAGNOSTIC_PORTS=10.0.2.2:9000,nosuspend
#DIAGNOSTIC_PORTS=10.0.2.2:9000,suspend
#DIAGNOSTIC_PORTS=$(DOTNET_DiagnosticPorts)
Comment on lines +12 to +15

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just setting DiagnosticPorts and not set RuntimeComponents to at least include diagnostics_tracing will generate a build error.

Since they're all commented out, can it be noted in the makefiles that RUNTIME_COMPONENTS and DIAGNOSTIC_PORTS should be uncommented together if at all?

Also, out of curiosity, how were 10.0.2.2:9000 and 127.0.0.1:9000 selected (having no prior context of diagnostic ports)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can add more comments into the script.

There are no dedicated port numbers, so could be anything.

10.0.2.2 is how you reach host loopback from Android emulator (without need to use adb). On iOS, 127.0.0.1 can still be used from simulator. But as above these are just examples and might need to be adjusted if you run different scenario.



all: runtimepack run

Expand All@@ -18,7 +28,9 @@ run:
/p:DeployAndRun=$(DEPLOY_AND_RUN) \
/p:ForceAOT=$(AOT) \
/p:UseLLVM=$(USE_LLVM) \
/p:RunActivity=false
/p:RunActivity=false \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

clean:
rm -rf ../../../../artifacts/bin/AndroidSampleApp
55 changes: 45 additions & 10 deletions src/mono/sample/iOS/Makefile
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,14 @@ DOTNET := ../../../../dotnet.sh
USE_LLVM=true
AOT=false

#If DIAGNOSTIC_PORTS is enabled, RUNTIME_COMPONENTS must also be enabled.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is optional.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is disabled, use DOTNET_DiagnosticPorts when launching application to enable diagnostics.
#RUNTIME_COMPONENTS=diagnostics_tracing
#DIAGNOSTIC_PORTS=127.0.0.1:9000,nosuspend
#DIAGNOSTIC_PORTS=127.0.0.1:9000,suspend
#DIAGNOSTIC_PORTS=$(DOTNET_DiagnosticPorts)

all: runtimepack run

TOOLS_DIR=../../../tasks
Expand All@@ -15,24 +23,51 @@ runtimepack:
../../../../build.sh Mono+Libs -os iOSSimulator -arch $(MONO_ARCH) -c $(MONO_CONFIG)

run: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT)
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this format
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
instead of like the previous formats
/p:RuntimeComponents=$(RUNTIME_COMPONENTS) \

@lateralusXlateralusXMay 28, 2021

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since it includes , in the value it needs to be quoted or you will get msbuild argument parsing errors, just putting "" around value is not enough so complete property needs to be quoted as well in order to correctly go through shell parsing rules, problem is described here:

dotnet/msbuild#2999

and there are various workarounds to the problem, one of them is in this PR, but also suggested in different places, like here dotnet/msbuild#471 (comment).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, good to know, thanks for the explanation :)

'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-sim: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=iOSSimulator /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT)
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=iOSSimulator \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-catalyst:
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=MacCatalyst /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False /p:ForceAOT=False
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=MacCatalyst \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False \
/p:ForceAOT=False

run-sim-interp: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=iOSSimulator /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT) /p:MonoForceInterpreter=true
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=iOSSimulator \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
/p:MonoForceInterpreter=true \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-catalyst-interp:
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=MacCatalyst /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False /p:ForceAOT=False /p:MonoForceInterpreter=true
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=MacCatalyst \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False \
/p:ForceAOT=False \
/p:MonoForceInterpreter=true

clean:
rm -rf bin
2 changes: 2 additions & 0 deletions src/mono/sample/iOS/Program.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -84,6 +84,8 @@
Optimized="$(Optimized)"
ForceAOT="$(ForceAOT)"
ForceInterpreter="$(MonoForceInterpreter)"
RuntimeComponents="$(RuntimeComponents)"
DiagnosticPorts="$(DiagnosticPorts)"
AppDir="$(MSBuildThisFileDirectory)$(PublishDir)">
<Output TaskParameter="AppBundlePath" PropertyName="AppBundlePath" />
<Output TaskParameter="XcodeProjectPath" PropertyName="XcodeProjectPath" />
Expand Down
6 changes: 6 additions & 0 deletions src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,6 +43,11 @@ public class AndroidAppBuilderTask : Task
/// </summary>
public string? RuntimeComponents { get; set; } = ""!;

/// <summary>
/// Diagnostic ports configuration string
/// </summary>
public string? DiagnosticPorts { get; set; } = ""!;

[Required]
public string RuntimeIdentifier { get; set; } = ""!;

Expand DownExpand Up@@ -102,6 +107,7 @@ public override bool Execute()
apkBuilder.ForceAOT = ForceAOT;
apkBuilder.StaticLinkedRuntime = StaticLinkedRuntime;
apkBuilder.RuntimeComponents = RuntimeComponents;
apkBuilder.DiagnosticPorts = DiagnosticPorts;
apkBuilder.Assemblies = Assemblies;
(ApkBundlePath, ApkPackageId) = apkBuilder.BuildApk(abi, MainLibraryFileName, MonoRuntimeHeaders);

Expand Down
21 changes: 21 additions & 0 deletions src/tasks/AndroidAppBuilder/ApkBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -28,6 +28,7 @@ public class ApkBuilder
public bool EnableRuntimeLogging { get; set; }
public bool StaticLinkedRuntime { get; set; }
public string? RuntimeComponents { get; set; }
public string? DiagnosticPorts { get; set; }
public ITaskItem[] Assemblies { get; set; } = Array.Empty<ITaskItem>();

public (string apk, string packageId) BuildApk(
Expand DownExpand Up@@ -79,6 +80,21 @@ public class ApkBuilder
throw new InvalidOperationException("Interpreter and AOT cannot be enabled at the same time");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
bool validDiagnosticsConfig = false;

if (string.IsNullOrEmpty(RuntimeComponents))
validDiagnosticsConfig = false;
else if (RuntimeComponents.Equals("*", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;
else if (RuntimeComponents.Contains("diagnostics_tracing", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;

if (!validDiagnosticsConfig)
throw new ArgumentException("Using DiagnosticPorts require diagnostics_tracing runtime component.");
}

// Try to get the latest build-tools version if not specified
if (string.IsNullOrEmpty(BuildToolsVersion))
BuildToolsVersion = GetLatestBuildTools(AndroidSdk);
Expand DownExpand Up@@ -268,6 +284,11 @@ public class ApkBuilder
defines = "add_definitions(-DFORCE_AOT=1)";
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines += "\nadd_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")";
}

cmakeLists = cmakeLists.Replace("%Defines%", defines);

File.WriteAllText(Path.Combine(OutputDir, "CMakeLists.txt"), cmakeLists);
Expand Down
20 changes: 16 additions & 4 deletions src/tasks/AndroidAppBuilder/Templates/monodroid.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -205,12 +205,20 @@ cleanup_runtime_config (MonovmRuntimeConfigArguments *args, void *user_data)
int
mono_droid_runtime_init (const char* executable, int managed_argc, char* managed_argv[])
{
// NOTE: these options can be set via command line args for adb or xharness, see AndroidSampleApp.csproj

// uncomment for debug output:
//
//setenv ("XUNIT_VERBOSE", "true", true);
//setenv ("MONO_LOG_LEVEL", "debug", true);
//setenv ("MONO_LOG_MASK", "all", true);
// NOTE: these options can be set via command line args for adb or xharness, see AndroidSampleApp.csproj

// build using DiagnosticPorts property in AndroidAppBuilder
// or set DOTNET_DiagnosticPorts env via adb, xharness when undefined.
// NOTE, using DOTNET_DiagnosticPorts requires app build using AndroidAppBuilder and RuntimeComponents=diagnostics_tracing
#ifdef DIAGNOSTIC_PORTS
setenv ("DOTNET_DiagnosticPorts", DIAGNOSTIC_PORTS, true);
#endif

bool wait_for_debugger = false;
chdir (bundle_path);
Expand DownExpand Up@@ -266,14 +274,18 @@ mono_droid_runtime_init (const char* executable, int managed_argc, char* managed
mono_jit_set_aot_mode(MONO_AOT_MODE_FULL);
#endif

mono_jit_init_version ("dotnet.android", "mobile");
MonoDomain *domain = mono_jit_init_version ("dotnet.android", "mobile");
assert (domain);

MonoAssembly *assembly = mono_droid_load_assembly (executable, NULL);
assert (assembly);
LOG_INFO ("Executable: %s", executable);

int res = mono_jit_exec (mono_domain_get (), assembly, managed_argc, managed_argv);
LOG_INFO ("Executable: %s", executable);
int res = mono_jit_exec (domain, assembly, managed_argc, managed_argv);
LOG_INFO ("Exit code: %d.", res);

mono_jit_cleanup (domain);

return res;
}

Expand Down
21 changes: 21 additions & 0 deletions src/tasks/AppleAppBuilder/AppleAppBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -131,6 +131,11 @@ public string TargetOS
/// </summary>
public string? RuntimeComponents { get; set; } = ""!;

/// <summary>
/// Diagnostic ports configuration string
/// </summary>
public string? DiagnosticPorts { get; set; } = ""!;

/// <summary>
/// Forces the runtime to use the invariant mode
/// </summary>
Expand DownExpand Up@@ -198,10 +203,26 @@ public override bool Execute()
throw new InvalidOperationException("Interpreter and AOT cannot be enabled at the same time");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
bool validDiagnosticsConfig = false;

if (string.IsNullOrEmpty(RuntimeComponents))
validDiagnosticsConfig = false;
else if (RuntimeComponents.Equals("*", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;
else if (RuntimeComponents.Contains("diagnostics_tracing", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;

if (!validDiagnosticsConfig)
throw new ArgumentException("Using DiagnosticPorts require diagnostics_tracing runtime component.");
}

if (GenerateXcodeProject)
{
Xcode generator = new Xcode(TargetOS, Arch);
generator.EnableRuntimeLogging = EnableRuntimeLogging;
generator.DiagnosticPorts = DiagnosticPorts;

XcodeProjectPath = generator.GenerateXCode(ProjectName, MainLibraryFileName, assemblerFiles,
AppDir, binDir, MonoRuntimeHeaders, !isDevice, UseConsoleUITemplate, ForceAOT, ForceInterpreter, InvariantGlobalization, Optimized, RuntimeComponents, NativeMainSource);
Expand Down
13 changes: 12 additions & 1 deletion src/tasks/AppleAppBuilder/Templates/runtime.m
Original file line numberDiff line numberDiff line change
Expand Up@@ -231,6 +231,13 @@
setenv ("MONO_LOG_MASK", "all", TRUE);
#endif

// build using DiagnosticPorts property in AppleAppBuilder
// or set DOTNET_DiagnosticPorts env via mlaunch, xharness when undefined.
// NOTE, using DOTNET_DiagnosticPorts requires app build using AppleAppBuilder and RuntimeComponents=diagnostics_tracing
#ifdef DIAGNOSTIC_PORTS
setenv ("DOTNET_DiagnosticPorts", DIAGNOSTIC_PORTS, true);
#endif

id args_array = [[NSProcessInfo processInfo] arguments];
assert ([args_array count] <= 128);
const char *managed_argv [128];
Expand DownExpand Up@@ -308,7 +315,9 @@
char* options[] = { "--debugger-agent=transport=dt_socket,server=y,address=0.0.0.0:55555" };
mono_jit_parse_options (1, options);
}
mono_jit_init_version ("dotnet.ios", "mobile");

MonoDomain *domain = mono_jit_init_version ("dotnet.ios", "mobile");
assert (domain);

#if !FORCE_INTERPRETER && (!TARGET_OS_SIMULATOR || FORCE_AOT)
// device runtimes are configured to use lazy gc thread creation
Expand All@@ -326,5 +335,7 @@
// Print this so apps parsing logs can detect when we exited
os_log_info (OS_LOG_DEFAULT, "Exit code: %d.", res);

mono_jit_cleanup (domain);

exit (res);
}
6 changes: 6 additions & 0 deletions src/tasks/AppleAppBuilder/Xcode.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,6 +41,7 @@ public Xcode(string target, string arch)
}

public bool EnableRuntimeLogging { get; set; }
public string? DiagnosticPorts { get; set; } = ""!;

public string GenerateXCode(
string projectName,
Expand DownExpand Up@@ -212,6 +213,11 @@ public string GenerateXCode(
defines.AppendLine("add_definitions(-DENABLE_RUNTIME_LOGGING=1)");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines.AppendLine("\nadd_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")");
}

cmakeLists = cmakeLists.Replace("%Defines%", defines.ToString());

string plist = Utils.GetEmbeddedResource("Info.plist.template")
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/mono/sample/Android/AndroidSampleApp.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -79,6 +79,8 @@
Assemblies="@(BundleAssemblies)"
MainLibraryFileName="$(AssemblyName).dll"
StripDebugSymbols="$(StripDebugSymbols)"
RuntimeComponents="$(RuntimeComponents)"
DiagnosticPorts="$(DiagnosticPorts)"
OutputDir="$(ApkDir)"
AppDir="$(PublishDir)">
<Output TaskParameter="ApkBundlePath" PropertyName="ApkBundlePath" />
Expand Down
14 changes: 13 additions & 1 deletion src/mono/sample/Android/Makefile
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,16 @@ DOTNET := ../../../../dotnet.sh
USE_LLVM=true
AOT=false
DEPLOY_AND_RUN?=true
RUNTIME_COMPONENTS=diagnostics_tracing

#If DIAGNOSTIC_PORTS is enabled, RUNTIME_COMPONENTS must also be enabled.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is optional.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is disabled, use DOTNET_DiagnosticPorts when launching application to enable diagnostics.
#RUNTIME_COMPONENTS=diagnostics_tracing
#DIAGNOSTIC_PORTS=10.0.2.2:9000,nosuspend
#DIAGNOSTIC_PORTS=10.0.2.2:9000,suspend
#DIAGNOSTIC_PORTS=$(DOTNET_DiagnosticPorts)
Comment on lines +12 to +15

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just setting DiagnosticPorts and not set RuntimeComponents to at least include diagnostics_tracing will generate a build error.

Since they're all commented out, can it be noted in the makefiles that RUNTIME_COMPONENTS and DIAGNOSTIC_PORTS should be uncommented together if at all?

Also, out of curiosity, how were 10.0.2.2:9000 and 127.0.0.1:9000 selected (having no prior context of diagnostic ports)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can add more comments into the script.

There are no dedicated port numbers, so could be anything.

10.0.2.2 is how you reach host loopback from Android emulator (without need to use adb). On iOS, 127.0.0.1 can still be used from simulator. But as above these are just examples and might need to be adjusted if you run different scenario.



all: runtimepack run

Expand All@@ -18,7 +28,9 @@ run:
/p:DeployAndRun=$(DEPLOY_AND_RUN) \
/p:ForceAOT=$(AOT) \
/p:UseLLVM=$(USE_LLVM) \
/p:RunActivity=false
/p:RunActivity=false \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

clean:
rm -rf ../../../../artifacts/bin/AndroidSampleApp
55 changes: 45 additions & 10 deletions src/mono/sample/iOS/Makefile
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,14 @@ DOTNET := ../../../../dotnet.sh
USE_LLVM=true
AOT=false

#If DIAGNOSTIC_PORTS is enabled, RUNTIME_COMPONENTS must also be enabled.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is optional.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is disabled, use DOTNET_DiagnosticPorts when launching application to enable diagnostics.
#RUNTIME_COMPONENTS=diagnostics_tracing
#DIAGNOSTIC_PORTS=127.0.0.1:9000,nosuspend
#DIAGNOSTIC_PORTS=127.0.0.1:9000,suspend
#DIAGNOSTIC_PORTS=$(DOTNET_DiagnosticPorts)

all: runtimepack run

TOOLS_DIR=../../../tasks
Expand All@@ -15,24 +23,51 @@ runtimepack:
../../../../build.sh Mono+Libs -os iOSSimulator -arch $(MONO_ARCH) -c $(MONO_CONFIG)

run: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT)
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this format
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
instead of like the previous formats
/p:RuntimeComponents=$(RUNTIME_COMPONENTS) \

@lateralusXlateralusXMay 28, 2021

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since it includes , in the value it needs to be quoted or you will get msbuild argument parsing errors, just putting "" around value is not enough so complete property needs to be quoted as well in order to correctly go through shell parsing rules, problem is described here:

dotnet/msbuild#2999

and there are various workarounds to the problem, one of them is in this PR, but also suggested in different places, like here dotnet/msbuild#471 (comment).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, good to know, thanks for the explanation :)

'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-sim: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=iOSSimulator /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT)
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=iOSSimulator \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-catalyst:
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=MacCatalyst /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False /p:ForceAOT=False
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=MacCatalyst \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False \
/p:ForceAOT=False

run-sim-interp: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=iOSSimulator /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT) /p:MonoForceInterpreter=true
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=iOSSimulator \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
/p:MonoForceInterpreter=true \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-catalyst-interp:
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=MacCatalyst /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False /p:ForceAOT=False /p:MonoForceInterpreter=true
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=MacCatalyst \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False \
/p:ForceAOT=False \
/p:MonoForceInterpreter=true

clean:
rm -rf bin
2 changes: 2 additions & 0 deletions src/mono/sample/iOS/Program.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -84,6 +84,8 @@
Optimized="$(Optimized)"
ForceAOT="$(ForceAOT)"
ForceInterpreter="$(MonoForceInterpreter)"
RuntimeComponents="$(RuntimeComponents)"
DiagnosticPorts="$(DiagnosticPorts)"
AppDir="$(MSBuildThisFileDirectory)$(PublishDir)">
<Output TaskParameter="AppBundlePath" PropertyName="AppBundlePath" />
<Output TaskParameter="XcodeProjectPath" PropertyName="XcodeProjectPath" />
Expand Down
6 changes: 6 additions & 0 deletions src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,6 +43,11 @@ public class AndroidAppBuilderTask : Task
/// </summary>
public string? RuntimeComponents { get; set; } = ""!;

/// <summary>
/// Diagnostic ports configuration string
/// </summary>
public string? DiagnosticPorts { get; set; } = ""!;

[Required]
public string RuntimeIdentifier { get; set; } = ""!;

Expand DownExpand Up@@ -102,6 +107,7 @@ public override bool Execute()
apkBuilder.ForceAOT = ForceAOT;
apkBuilder.StaticLinkedRuntime = StaticLinkedRuntime;
apkBuilder.RuntimeComponents = RuntimeComponents;
apkBuilder.DiagnosticPorts = DiagnosticPorts;
apkBuilder.Assemblies = Assemblies;
(ApkBundlePath, ApkPackageId) = apkBuilder.BuildApk(abi, MainLibraryFileName, MonoRuntimeHeaders);

Expand Down
21 changes: 21 additions & 0 deletions src/tasks/AndroidAppBuilder/ApkBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -28,6 +28,7 @@ public class ApkBuilder
public bool EnableRuntimeLogging { get; set; }
public bool StaticLinkedRuntime { get; set; }
public string? RuntimeComponents { get; set; }
public string? DiagnosticPorts { get; set; }
public ITaskItem[] Assemblies { get; set; } = Array.Empty<ITaskItem>();

public (string apk, string packageId) BuildApk(
Expand DownExpand Up@@ -79,6 +80,21 @@ public class ApkBuilder
throw new InvalidOperationException("Interpreter and AOT cannot be enabled at the same time");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
bool validDiagnosticsConfig = false;

if (string.IsNullOrEmpty(RuntimeComponents))
validDiagnosticsConfig = false;
else if (RuntimeComponents.Equals("*", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;
else if (RuntimeComponents.Contains("diagnostics_tracing", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;

if (!validDiagnosticsConfig)
throw new ArgumentException("Using DiagnosticPorts require diagnostics_tracing runtime component.");
}

// Try to get the latest build-tools version if not specified
if (string.IsNullOrEmpty(BuildToolsVersion))
BuildToolsVersion = GetLatestBuildTools(AndroidSdk);
Expand DownExpand Up@@ -268,6 +284,11 @@ public class ApkBuilder
defines = "add_definitions(-DFORCE_AOT=1)";
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines += "\nadd_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")";
}

cmakeLists = cmakeLists.Replace("%Defines%", defines);

File.WriteAllText(Path.Combine(OutputDir, "CMakeLists.txt"), cmakeLists);
Expand Down
20 changes: 16 additions & 4 deletions src/tasks/AndroidAppBuilder/Templates/monodroid.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -205,12 +205,20 @@ cleanup_runtime_config (MonovmRuntimeConfigArguments *args, void *user_data)
int
mono_droid_runtime_init (const char* executable, int managed_argc, char* managed_argv[])
{
// NOTE: these options can be set via command line args for adb or xharness, see AndroidSampleApp.csproj

// uncomment for debug output:
//
//setenv ("XUNIT_VERBOSE", "true", true);
//setenv ("MONO_LOG_LEVEL", "debug", true);
//setenv ("MONO_LOG_MASK", "all", true);
// NOTE: these options can be set via command line args for adb or xharness, see AndroidSampleApp.csproj

// build using DiagnosticPorts property in AndroidAppBuilder
// or set DOTNET_DiagnosticPorts env via adb, xharness when undefined.
// NOTE, using DOTNET_DiagnosticPorts requires app build using AndroidAppBuilder and RuntimeComponents=diagnostics_tracing
#ifdef DIAGNOSTIC_PORTS
setenv ("DOTNET_DiagnosticPorts", DIAGNOSTIC_PORTS, true);
#endif

bool wait_for_debugger = false;
chdir (bundle_path);
Expand DownExpand Up@@ -266,14 +274,18 @@ mono_droid_runtime_init (const char* executable, int managed_argc, char* managed
mono_jit_set_aot_mode(MONO_AOT_MODE_FULL);
#endif

mono_jit_init_version ("dotnet.android", "mobile");
MonoDomain *domain = mono_jit_init_version ("dotnet.android", "mobile");
assert (domain);

MonoAssembly *assembly = mono_droid_load_assembly (executable, NULL);
assert (assembly);
LOG_INFO ("Executable: %s", executable);

int res = mono_jit_exec (mono_domain_get (), assembly, managed_argc, managed_argv);
LOG_INFO ("Executable: %s", executable);
int res = mono_jit_exec (domain, assembly, managed_argc, managed_argv);
LOG_INFO ("Exit code: %d.", res);

mono_jit_cleanup (domain);

return res;
}

Expand Down
21 changes: 21 additions & 0 deletions src/tasks/AppleAppBuilder/AppleAppBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -131,6 +131,11 @@ public string TargetOS
/// </summary>
public string? RuntimeComponents { get; set; } = ""!;

/// <summary>
/// Diagnostic ports configuration string
/// </summary>
public string? DiagnosticPorts { get; set; } = ""!;

/// <summary>
/// Forces the runtime to use the invariant mode
/// </summary>
Expand DownExpand Up@@ -198,10 +203,26 @@ public override bool Execute()
throw new InvalidOperationException("Interpreter and AOT cannot be enabled at the same time");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
bool validDiagnosticsConfig = false;

if (string.IsNullOrEmpty(RuntimeComponents))
validDiagnosticsConfig = false;
else if (RuntimeComponents.Equals("*", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;
else if (RuntimeComponents.Contains("diagnostics_tracing", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;

if (!validDiagnosticsConfig)
throw new ArgumentException("Using DiagnosticPorts require diagnostics_tracing runtime component.");
}

if (GenerateXcodeProject)
{
Xcode generator = new Xcode(TargetOS, Arch);
generator.EnableRuntimeLogging = EnableRuntimeLogging;
generator.DiagnosticPorts = DiagnosticPorts;

XcodeProjectPath = generator.GenerateXCode(ProjectName, MainLibraryFileName, assemblerFiles,
AppDir, binDir, MonoRuntimeHeaders, !isDevice, UseConsoleUITemplate, ForceAOT, ForceInterpreter, InvariantGlobalization, Optimized, RuntimeComponents, NativeMainSource);
Expand Down
13 changes: 12 additions & 1 deletion src/tasks/AppleAppBuilder/Templates/runtime.m
Original file line numberDiff line numberDiff line change
Expand Up@@ -231,6 +231,13 @@
setenv ("MONO_LOG_MASK", "all", TRUE);
#endif

// build using DiagnosticPorts property in AppleAppBuilder
// or set DOTNET_DiagnosticPorts env via mlaunch, xharness when undefined.
// NOTE, using DOTNET_DiagnosticPorts requires app build using AppleAppBuilder and RuntimeComponents=diagnostics_tracing
#ifdef DIAGNOSTIC_PORTS
setenv ("DOTNET_DiagnosticPorts", DIAGNOSTIC_PORTS, true);
#endif

id args_array = [[NSProcessInfo processInfo] arguments];
assert ([args_array count] <= 128);
const char *managed_argv [128];
Expand DownExpand Up@@ -308,7 +315,9 @@
char* options[] = { "--debugger-agent=transport=dt_socket,server=y,address=0.0.0.0:55555" };
mono_jit_parse_options (1, options);
}
mono_jit_init_version ("dotnet.ios", "mobile");

MonoDomain *domain = mono_jit_init_version ("dotnet.ios", "mobile");
assert (domain);

#if !FORCE_INTERPRETER && (!TARGET_OS_SIMULATOR || FORCE_AOT)
// device runtimes are configured to use lazy gc thread creation
Expand All@@ -326,5 +335,7 @@
// Print this so apps parsing logs can detect when we exited
os_log_info (OS_LOG_DEFAULT, "Exit code: %d.", res);

mono_jit_cleanup (domain);

exit (res);
}
6 changes: 6 additions & 0 deletions src/tasks/AppleAppBuilder/Xcode.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,6 +41,7 @@ public Xcode(string target, string arch)
}

public bool EnableRuntimeLogging { get; set; }
public string? DiagnosticPorts { get; set; } = ""!;

public string GenerateXCode(
string projectName,
Expand DownExpand Up@@ -212,6 +213,11 @@ public string GenerateXCode(
defines.AppendLine("add_definitions(-DENABLE_RUNTIME_LOGGING=1)");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines.AppendLine("\nadd_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")");
}

cmakeLists = cmakeLists.Replace("%Defines%", defines.ToString());

string plist = Utils.GetEmbeddedResource("Info.plist.template")
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/mono/sample/Android/AndroidSampleApp.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -79,6 +79,8 @@
Assemblies="@(BundleAssemblies)"
MainLibraryFileName="$(AssemblyName).dll"
StripDebugSymbols="$(StripDebugSymbols)"
RuntimeComponents="$(RuntimeComponents)"
DiagnosticPorts="$(DiagnosticPorts)"
OutputDir="$(ApkDir)"
AppDir="$(PublishDir)">
<Output TaskParameter="ApkBundlePath" PropertyName="ApkBundlePath" />
Expand Down
14 changes: 13 additions & 1 deletion src/mono/sample/Android/Makefile
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,16 @@ DOTNET := ../../../../dotnet.sh
USE_LLVM=true
AOT=false
DEPLOY_AND_RUN?=true
RUNTIME_COMPONENTS=diagnostics_tracing

#If DIAGNOSTIC_PORTS is enabled, RUNTIME_COMPONENTS must also be enabled.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is optional.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is disabled, use DOTNET_DiagnosticPorts when launching application to enable diagnostics.
#RUNTIME_COMPONENTS=diagnostics_tracing
#DIAGNOSTIC_PORTS=10.0.2.2:9000,nosuspend
#DIAGNOSTIC_PORTS=10.0.2.2:9000,suspend
#DIAGNOSTIC_PORTS=$(DOTNET_DiagnosticPorts)
Comment on lines +12 to +15

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just setting DiagnosticPorts and not set RuntimeComponents to at least include diagnostics_tracing will generate a build error.

Since they're all commented out, can it be noted in the makefiles that RUNTIME_COMPONENTS and DIAGNOSTIC_PORTS should be uncommented together if at all?

Also, out of curiosity, how were 10.0.2.2:9000 and 127.0.0.1:9000 selected (having no prior context of diagnostic ports)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can add more comments into the script.

There are no dedicated port numbers, so could be anything.

10.0.2.2 is how you reach host loopback from Android emulator (without need to use adb). On iOS, 127.0.0.1 can still be used from simulator. But as above these are just examples and might need to be adjusted if you run different scenario.



all: runtimepack run

Expand All@@ -18,7 +28,9 @@ run:
/p:DeployAndRun=$(DEPLOY_AND_RUN) \
/p:ForceAOT=$(AOT) \
/p:UseLLVM=$(USE_LLVM) \
/p:RunActivity=false
/p:RunActivity=false \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

clean:
rm -rf ../../../../artifacts/bin/AndroidSampleApp
55 changes: 45 additions & 10 deletions src/mono/sample/iOS/Makefile
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,14 @@ DOTNET := ../../../../dotnet.sh
USE_LLVM=true
AOT=false

#If DIAGNOSTIC_PORTS is enabled, RUNTIME_COMPONENTS must also be enabled.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is optional.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is disabled, use DOTNET_DiagnosticPorts when launching application to enable diagnostics.
#RUNTIME_COMPONENTS=diagnostics_tracing
#DIAGNOSTIC_PORTS=127.0.0.1:9000,nosuspend
#DIAGNOSTIC_PORTS=127.0.0.1:9000,suspend
#DIAGNOSTIC_PORTS=$(DOTNET_DiagnosticPorts)

all: runtimepack run

TOOLS_DIR=../../../tasks
Expand All@@ -15,24 +23,51 @@ runtimepack:
../../../../build.sh Mono+Libs -os iOSSimulator -arch $(MONO_ARCH) -c $(MONO_CONFIG)

run: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT)
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this format
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
instead of like the previous formats
/p:RuntimeComponents=$(RUNTIME_COMPONENTS) \

@lateralusXlateralusXMay 28, 2021

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since it includes , in the value it needs to be quoted or you will get msbuild argument parsing errors, just putting "" around value is not enough so complete property needs to be quoted as well in order to correctly go through shell parsing rules, problem is described here:

dotnet/msbuild#2999

and there are various workarounds to the problem, one of them is in this PR, but also suggested in different places, like here dotnet/msbuild#471 (comment).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, good to know, thanks for the explanation :)

'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-sim: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=iOSSimulator /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT)
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=iOSSimulator \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-catalyst:
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=MacCatalyst /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False /p:ForceAOT=False
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=MacCatalyst \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False \
/p:ForceAOT=False

run-sim-interp: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=iOSSimulator /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT) /p:MonoForceInterpreter=true
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=iOSSimulator \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
/p:MonoForceInterpreter=true \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-catalyst-interp:
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=MacCatalyst /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False /p:ForceAOT=False /p:MonoForceInterpreter=true
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=MacCatalyst \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False \
/p:ForceAOT=False \
/p:MonoForceInterpreter=true

clean:
rm -rf bin
2 changes: 2 additions & 0 deletions src/mono/sample/iOS/Program.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -84,6 +84,8 @@
Optimized="$(Optimized)"
ForceAOT="$(ForceAOT)"
ForceInterpreter="$(MonoForceInterpreter)"
RuntimeComponents="$(RuntimeComponents)"
DiagnosticPorts="$(DiagnosticPorts)"
AppDir="$(MSBuildThisFileDirectory)$(PublishDir)">
<Output TaskParameter="AppBundlePath" PropertyName="AppBundlePath" />
<Output TaskParameter="XcodeProjectPath" PropertyName="XcodeProjectPath" />
Expand Down
6 changes: 6 additions & 0 deletions src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,6 +43,11 @@ public class AndroidAppBuilderTask : Task
/// </summary>
public string? RuntimeComponents { get; set; } = ""!;

/// <summary>
/// Diagnostic ports configuration string
/// </summary>
public string? DiagnosticPorts { get; set; } = ""!;

[Required]
public string RuntimeIdentifier { get; set; } = ""!;

Expand DownExpand Up@@ -102,6 +107,7 @@ public override bool Execute()
apkBuilder.ForceAOT = ForceAOT;
apkBuilder.StaticLinkedRuntime = StaticLinkedRuntime;
apkBuilder.RuntimeComponents = RuntimeComponents;
apkBuilder.DiagnosticPorts = DiagnosticPorts;
apkBuilder.Assemblies = Assemblies;
(ApkBundlePath, ApkPackageId) = apkBuilder.BuildApk(abi, MainLibraryFileName, MonoRuntimeHeaders);

Expand Down
21 changes: 21 additions & 0 deletions src/tasks/AndroidAppBuilder/ApkBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -28,6 +28,7 @@ public class ApkBuilder
public bool EnableRuntimeLogging { get; set; }
public bool StaticLinkedRuntime { get; set; }
public string? RuntimeComponents { get; set; }
public string? DiagnosticPorts { get; set; }
public ITaskItem[] Assemblies { get; set; } = Array.Empty<ITaskItem>();

public (string apk, string packageId) BuildApk(
Expand DownExpand Up@@ -79,6 +80,21 @@ public class ApkBuilder
throw new InvalidOperationException("Interpreter and AOT cannot be enabled at the same time");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
bool validDiagnosticsConfig = false;

if (string.IsNullOrEmpty(RuntimeComponents))
validDiagnosticsConfig = false;
else if (RuntimeComponents.Equals("*", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;
else if (RuntimeComponents.Contains("diagnostics_tracing", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;

if (!validDiagnosticsConfig)
throw new ArgumentException("Using DiagnosticPorts require diagnostics_tracing runtime component.");
}

// Try to get the latest build-tools version if not specified
if (string.IsNullOrEmpty(BuildToolsVersion))
BuildToolsVersion = GetLatestBuildTools(AndroidSdk);
Expand DownExpand Up@@ -268,6 +284,11 @@ public class ApkBuilder
defines = "add_definitions(-DFORCE_AOT=1)";
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines += "\nadd_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")";
}

cmakeLists = cmakeLists.Replace("%Defines%", defines);

File.WriteAllText(Path.Combine(OutputDir, "CMakeLists.txt"), cmakeLists);
Expand Down
20 changes: 16 additions & 4 deletions src/tasks/AndroidAppBuilder/Templates/monodroid.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -205,12 +205,20 @@ cleanup_runtime_config (MonovmRuntimeConfigArguments *args, void *user_data)
int
mono_droid_runtime_init (const char* executable, int managed_argc, char* managed_argv[])
{
// NOTE: these options can be set via command line args for adb or xharness, see AndroidSampleApp.csproj

// uncomment for debug output:
//
//setenv ("XUNIT_VERBOSE", "true", true);
//setenv ("MONO_LOG_LEVEL", "debug", true);
//setenv ("MONO_LOG_MASK", "all", true);
// NOTE: these options can be set via command line args for adb or xharness, see AndroidSampleApp.csproj

// build using DiagnosticPorts property in AndroidAppBuilder
// or set DOTNET_DiagnosticPorts env via adb, xharness when undefined.
// NOTE, using DOTNET_DiagnosticPorts requires app build using AndroidAppBuilder and RuntimeComponents=diagnostics_tracing
#ifdef DIAGNOSTIC_PORTS
setenv ("DOTNET_DiagnosticPorts", DIAGNOSTIC_PORTS, true);
#endif

bool wait_for_debugger = false;
chdir (bundle_path);
Expand DownExpand Up@@ -266,14 +274,18 @@ mono_droid_runtime_init (const char* executable, int managed_argc, char* managed
mono_jit_set_aot_mode(MONO_AOT_MODE_FULL);
#endif

mono_jit_init_version ("dotnet.android", "mobile");
MonoDomain *domain = mono_jit_init_version ("dotnet.android", "mobile");
assert (domain);

MonoAssembly *assembly = mono_droid_load_assembly (executable, NULL);
assert (assembly);
LOG_INFO ("Executable: %s", executable);

int res = mono_jit_exec (mono_domain_get (), assembly, managed_argc, managed_argv);
LOG_INFO ("Executable: %s", executable);
int res = mono_jit_exec (domain, assembly, managed_argc, managed_argv);
LOG_INFO ("Exit code: %d.", res);

mono_jit_cleanup (domain);

return res;
}

Expand Down
21 changes: 21 additions & 0 deletions src/tasks/AppleAppBuilder/AppleAppBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -131,6 +131,11 @@ public string TargetOS
/// </summary>
public string? RuntimeComponents { get; set; } = ""!;

/// <summary>
/// Diagnostic ports configuration string
/// </summary>
public string? DiagnosticPorts { get; set; } = ""!;

/// <summary>
/// Forces the runtime to use the invariant mode
/// </summary>
Expand DownExpand Up@@ -198,10 +203,26 @@ public override bool Execute()
throw new InvalidOperationException("Interpreter and AOT cannot be enabled at the same time");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
bool validDiagnosticsConfig = false;

if (string.IsNullOrEmpty(RuntimeComponents))
validDiagnosticsConfig = false;
else if (RuntimeComponents.Equals("*", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;
else if (RuntimeComponents.Contains("diagnostics_tracing", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;

if (!validDiagnosticsConfig)
throw new ArgumentException("Using DiagnosticPorts require diagnostics_tracing runtime component.");
}

if (GenerateXcodeProject)
{
Xcode generator = new Xcode(TargetOS, Arch);
generator.EnableRuntimeLogging = EnableRuntimeLogging;
generator.DiagnosticPorts = DiagnosticPorts;

XcodeProjectPath = generator.GenerateXCode(ProjectName, MainLibraryFileName, assemblerFiles,
AppDir, binDir, MonoRuntimeHeaders, !isDevice, UseConsoleUITemplate, ForceAOT, ForceInterpreter, InvariantGlobalization, Optimized, RuntimeComponents, NativeMainSource);
Expand Down
13 changes: 12 additions & 1 deletion src/tasks/AppleAppBuilder/Templates/runtime.m
Original file line numberDiff line numberDiff line change
Expand Up@@ -231,6 +231,13 @@
setenv ("MONO_LOG_MASK", "all", TRUE);
#endif

// build using DiagnosticPorts property in AppleAppBuilder
// or set DOTNET_DiagnosticPorts env via mlaunch, xharness when undefined.
// NOTE, using DOTNET_DiagnosticPorts requires app build using AppleAppBuilder and RuntimeComponents=diagnostics_tracing
#ifdef DIAGNOSTIC_PORTS
setenv ("DOTNET_DiagnosticPorts", DIAGNOSTIC_PORTS, true);
#endif

id args_array = [[NSProcessInfo processInfo] arguments];
assert ([args_array count] <= 128);
const char *managed_argv [128];
Expand DownExpand Up@@ -308,7 +315,9 @@
char* options[] = { "--debugger-agent=transport=dt_socket,server=y,address=0.0.0.0:55555" };
mono_jit_parse_options (1, options);
}
mono_jit_init_version ("dotnet.ios", "mobile");

MonoDomain *domain = mono_jit_init_version ("dotnet.ios", "mobile");
assert (domain);

#if !FORCE_INTERPRETER && (!TARGET_OS_SIMULATOR || FORCE_AOT)
// device runtimes are configured to use lazy gc thread creation
Expand All@@ -326,5 +335,7 @@
// Print this so apps parsing logs can detect when we exited
os_log_info (OS_LOG_DEFAULT, "Exit code: %d.", res);

mono_jit_cleanup (domain);

exit (res);
}
6 changes: 6 additions & 0 deletions src/tasks/AppleAppBuilder/Xcode.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,6 +41,7 @@ public Xcode(string target, string arch)
}

public bool EnableRuntimeLogging { get; set; }
public string? DiagnosticPorts { get; set; } = ""!;

public string GenerateXCode(
string projectName,
Expand DownExpand Up@@ -212,6 +213,11 @@ public string GenerateXCode(
defines.AppendLine("add_definitions(-DENABLE_RUNTIME_LOGGING=1)");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines.AppendLine("\nadd_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")");
}

cmakeLists = cmakeLists.Replace("%Defines%", defines.ToString());

string plist = Utils.GetEmbeddedResource("Info.plist.template")
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/mono/sample/Android/AndroidSampleApp.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -79,6 +79,8 @@
Assemblies="@(BundleAssemblies)"
MainLibraryFileName="$(AssemblyName).dll"
StripDebugSymbols="$(StripDebugSymbols)"
RuntimeComponents="$(RuntimeComponents)"
DiagnosticPorts="$(DiagnosticPorts)"
OutputDir="$(ApkDir)"
AppDir="$(PublishDir)">
<Output TaskParameter="ApkBundlePath" PropertyName="ApkBundlePath" />
Expand Down
14 changes: 13 additions & 1 deletion src/mono/sample/Android/Makefile
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,16 @@ DOTNET := ../../../../dotnet.sh
USE_LLVM=true
AOT=false
DEPLOY_AND_RUN?=true
RUNTIME_COMPONENTS=diagnostics_tracing

#If DIAGNOSTIC_PORTS is enabled, RUNTIME_COMPONENTS must also be enabled.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is optional.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is disabled, use DOTNET_DiagnosticPorts when launching application to enable diagnostics.
#RUNTIME_COMPONENTS=diagnostics_tracing
#DIAGNOSTIC_PORTS=10.0.2.2:9000,nosuspend
#DIAGNOSTIC_PORTS=10.0.2.2:9000,suspend
#DIAGNOSTIC_PORTS=$(DOTNET_DiagnosticPorts)
Comment on lines +12 to +15

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just setting DiagnosticPorts and not set RuntimeComponents to at least include diagnostics_tracing will generate a build error.

Since they're all commented out, can it be noted in the makefiles that RUNTIME_COMPONENTS and DIAGNOSTIC_PORTS should be uncommented together if at all?

Also, out of curiosity, how were 10.0.2.2:9000 and 127.0.0.1:9000 selected (having no prior context of diagnostic ports)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can add more comments into the script.

There are no dedicated port numbers, so could be anything.

10.0.2.2 is how you reach host loopback from Android emulator (without need to use adb). On iOS, 127.0.0.1 can still be used from simulator. But as above these are just examples and might need to be adjusted if you run different scenario.



all: runtimepack run

Expand All@@ -18,7 +28,9 @@ run:
/p:DeployAndRun=$(DEPLOY_AND_RUN) \
/p:ForceAOT=$(AOT) \
/p:UseLLVM=$(USE_LLVM) \
/p:RunActivity=false
/p:RunActivity=false \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

clean:
rm -rf ../../../../artifacts/bin/AndroidSampleApp
55 changes: 45 additions & 10 deletions src/mono/sample/iOS/Makefile
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,14 @@ DOTNET := ../../../../dotnet.sh
USE_LLVM=true
AOT=false

#If DIAGNOSTIC_PORTS is enabled, RUNTIME_COMPONENTS must also be enabled.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is optional.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is disabled, use DOTNET_DiagnosticPorts when launching application to enable diagnostics.
#RUNTIME_COMPONENTS=diagnostics_tracing
#DIAGNOSTIC_PORTS=127.0.0.1:9000,nosuspend
#DIAGNOSTIC_PORTS=127.0.0.1:9000,suspend
#DIAGNOSTIC_PORTS=$(DOTNET_DiagnosticPorts)

all: runtimepack run

TOOLS_DIR=../../../tasks
Expand All@@ -15,24 +23,51 @@ runtimepack:
../../../../build.sh Mono+Libs -os iOSSimulator -arch $(MONO_ARCH) -c $(MONO_CONFIG)

run: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT)
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this format
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
instead of like the previous formats
/p:RuntimeComponents=$(RUNTIME_COMPONENTS) \

@lateralusXlateralusXMay 28, 2021

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since it includes , in the value it needs to be quoted or you will get msbuild argument parsing errors, just putting "" around value is not enough so complete property needs to be quoted as well in order to correctly go through shell parsing rules, problem is described here:

dotnet/msbuild#2999

and there are various workarounds to the problem, one of them is in this PR, but also suggested in different places, like here dotnet/msbuild#471 (comment).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, good to know, thanks for the explanation :)

'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-sim: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=iOSSimulator /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT)
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=iOSSimulator \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-catalyst:
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=MacCatalyst /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False /p:ForceAOT=False
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=MacCatalyst \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False \
/p:ForceAOT=False

run-sim-interp: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=iOSSimulator /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT) /p:MonoForceInterpreter=true
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=iOSSimulator \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
/p:MonoForceInterpreter=true \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-catalyst-interp:
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=MacCatalyst /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False /p:ForceAOT=False /p:MonoForceInterpreter=true
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=MacCatalyst \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False \
/p:ForceAOT=False \
/p:MonoForceInterpreter=true

clean:
rm -rf bin
2 changes: 2 additions & 0 deletions src/mono/sample/iOS/Program.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -84,6 +84,8 @@
Optimized="$(Optimized)"
ForceAOT="$(ForceAOT)"
ForceInterpreter="$(MonoForceInterpreter)"
RuntimeComponents="$(RuntimeComponents)"
DiagnosticPorts="$(DiagnosticPorts)"
AppDir="$(MSBuildThisFileDirectory)$(PublishDir)">
<Output TaskParameter="AppBundlePath" PropertyName="AppBundlePath" />
<Output TaskParameter="XcodeProjectPath" PropertyName="XcodeProjectPath" />
Expand Down
6 changes: 6 additions & 0 deletions src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,6 +43,11 @@ public class AndroidAppBuilderTask : Task
/// </summary>
public string? RuntimeComponents { get; set; } = ""!;

/// <summary>
/// Diagnostic ports configuration string
/// </summary>
public string? DiagnosticPorts { get; set; } = ""!;

[Required]
public string RuntimeIdentifier { get; set; } = ""!;

Expand DownExpand Up@@ -102,6 +107,7 @@ public override bool Execute()
apkBuilder.ForceAOT = ForceAOT;
apkBuilder.StaticLinkedRuntime = StaticLinkedRuntime;
apkBuilder.RuntimeComponents = RuntimeComponents;
apkBuilder.DiagnosticPorts = DiagnosticPorts;
apkBuilder.Assemblies = Assemblies;
(ApkBundlePath, ApkPackageId) = apkBuilder.BuildApk(abi, MainLibraryFileName, MonoRuntimeHeaders);

Expand Down
21 changes: 21 additions & 0 deletions src/tasks/AndroidAppBuilder/ApkBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -28,6 +28,7 @@ public class ApkBuilder
public bool EnableRuntimeLogging { get; set; }
public bool StaticLinkedRuntime { get; set; }
public string? RuntimeComponents { get; set; }
public string? DiagnosticPorts { get; set; }
public ITaskItem[] Assemblies { get; set; } = Array.Empty<ITaskItem>();

public (string apk, string packageId) BuildApk(
Expand DownExpand Up@@ -79,6 +80,21 @@ public class ApkBuilder
throw new InvalidOperationException("Interpreter and AOT cannot be enabled at the same time");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
bool validDiagnosticsConfig = false;

if (string.IsNullOrEmpty(RuntimeComponents))
validDiagnosticsConfig = false;
else if (RuntimeComponents.Equals("*", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;
else if (RuntimeComponents.Contains("diagnostics_tracing", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;

if (!validDiagnosticsConfig)
throw new ArgumentException("Using DiagnosticPorts require diagnostics_tracing runtime component.");
}

// Try to get the latest build-tools version if not specified
if (string.IsNullOrEmpty(BuildToolsVersion))
BuildToolsVersion = GetLatestBuildTools(AndroidSdk);
Expand DownExpand Up@@ -268,6 +284,11 @@ public class ApkBuilder
defines = "add_definitions(-DFORCE_AOT=1)";
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines += "\nadd_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")";
}

cmakeLists = cmakeLists.Replace("%Defines%", defines);

File.WriteAllText(Path.Combine(OutputDir, "CMakeLists.txt"), cmakeLists);
Expand Down
20 changes: 16 additions & 4 deletions src/tasks/AndroidAppBuilder/Templates/monodroid.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -205,12 +205,20 @@ cleanup_runtime_config (MonovmRuntimeConfigArguments *args, void *user_data)
int
mono_droid_runtime_init (const char* executable, int managed_argc, char* managed_argv[])
{
// NOTE: these options can be set via command line args for adb or xharness, see AndroidSampleApp.csproj

// uncomment for debug output:
//
//setenv ("XUNIT_VERBOSE", "true", true);
//setenv ("MONO_LOG_LEVEL", "debug", true);
//setenv ("MONO_LOG_MASK", "all", true);
// NOTE: these options can be set via command line args for adb or xharness, see AndroidSampleApp.csproj

// build using DiagnosticPorts property in AndroidAppBuilder
// or set DOTNET_DiagnosticPorts env via adb, xharness when undefined.
// NOTE, using DOTNET_DiagnosticPorts requires app build using AndroidAppBuilder and RuntimeComponents=diagnostics_tracing
#ifdef DIAGNOSTIC_PORTS
setenv ("DOTNET_DiagnosticPorts", DIAGNOSTIC_PORTS, true);
#endif

bool wait_for_debugger = false;
chdir (bundle_path);
Expand DownExpand Up@@ -266,14 +274,18 @@ mono_droid_runtime_init (const char* executable, int managed_argc, char* managed
mono_jit_set_aot_mode(MONO_AOT_MODE_FULL);
#endif

mono_jit_init_version ("dotnet.android", "mobile");
MonoDomain *domain = mono_jit_init_version ("dotnet.android", "mobile");
assert (domain);

MonoAssembly *assembly = mono_droid_load_assembly (executable, NULL);
assert (assembly);
LOG_INFO ("Executable: %s", executable);

int res = mono_jit_exec (mono_domain_get (), assembly, managed_argc, managed_argv);
LOG_INFO ("Executable: %s", executable);
int res = mono_jit_exec (domain, assembly, managed_argc, managed_argv);
LOG_INFO ("Exit code: %d.", res);

mono_jit_cleanup (domain);

return res;
}

Expand Down
21 changes: 21 additions & 0 deletions src/tasks/AppleAppBuilder/AppleAppBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -131,6 +131,11 @@ public string TargetOS
/// </summary>
public string? RuntimeComponents { get; set; } = ""!;

/// <summary>
/// Diagnostic ports configuration string
/// </summary>
public string? DiagnosticPorts { get; set; } = ""!;

/// <summary>
/// Forces the runtime to use the invariant mode
/// </summary>
Expand DownExpand Up@@ -198,10 +203,26 @@ public override bool Execute()
throw new InvalidOperationException("Interpreter and AOT cannot be enabled at the same time");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
bool validDiagnosticsConfig = false;

if (string.IsNullOrEmpty(RuntimeComponents))
validDiagnosticsConfig = false;
else if (RuntimeComponents.Equals("*", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;
else if (RuntimeComponents.Contains("diagnostics_tracing", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;

if (!validDiagnosticsConfig)
throw new ArgumentException("Using DiagnosticPorts require diagnostics_tracing runtime component.");
}

if (GenerateXcodeProject)
{
Xcode generator = new Xcode(TargetOS, Arch);
generator.EnableRuntimeLogging = EnableRuntimeLogging;
generator.DiagnosticPorts = DiagnosticPorts;

XcodeProjectPath = generator.GenerateXCode(ProjectName, MainLibraryFileName, assemblerFiles,
AppDir, binDir, MonoRuntimeHeaders, !isDevice, UseConsoleUITemplate, ForceAOT, ForceInterpreter, InvariantGlobalization, Optimized, RuntimeComponents, NativeMainSource);
Expand Down
13 changes: 12 additions & 1 deletion src/tasks/AppleAppBuilder/Templates/runtime.m
Original file line numberDiff line numberDiff line change
Expand Up@@ -231,6 +231,13 @@
setenv ("MONO_LOG_MASK", "all", TRUE);
#endif

// build using DiagnosticPorts property in AppleAppBuilder
// or set DOTNET_DiagnosticPorts env via mlaunch, xharness when undefined.
// NOTE, using DOTNET_DiagnosticPorts requires app build using AppleAppBuilder and RuntimeComponents=diagnostics_tracing
#ifdef DIAGNOSTIC_PORTS
setenv ("DOTNET_DiagnosticPorts", DIAGNOSTIC_PORTS, true);
#endif

id args_array = [[NSProcessInfo processInfo] arguments];
assert ([args_array count] <= 128);
const char *managed_argv [128];
Expand DownExpand Up@@ -308,7 +315,9 @@
char* options[] = { "--debugger-agent=transport=dt_socket,server=y,address=0.0.0.0:55555" };
mono_jit_parse_options (1, options);
}
mono_jit_init_version ("dotnet.ios", "mobile");

MonoDomain *domain = mono_jit_init_version ("dotnet.ios", "mobile");
assert (domain);

#if !FORCE_INTERPRETER && (!TARGET_OS_SIMULATOR || FORCE_AOT)
// device runtimes are configured to use lazy gc thread creation
Expand All@@ -326,5 +335,7 @@
// Print this so apps parsing logs can detect when we exited
os_log_info (OS_LOG_DEFAULT, "Exit code: %d.", res);

mono_jit_cleanup (domain);

exit (res);
}
6 changes: 6 additions & 0 deletions src/tasks/AppleAppBuilder/Xcode.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,6 +41,7 @@ public Xcode(string target, string arch)
}

public bool EnableRuntimeLogging { get; set; }
public string? DiagnosticPorts { get; set; } = ""!;

public string GenerateXCode(
string projectName,
Expand DownExpand Up@@ -212,6 +213,11 @@ public string GenerateXCode(
defines.AppendLine("add_definitions(-DENABLE_RUNTIME_LOGGING=1)");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines.AppendLine("\nadd_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")");
}

cmakeLists = cmakeLists.Replace("%Defines%", defines.ToString());

string plist = Utils.GetEmbeddedResource("Info.plist.template")
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/mono/sample/Android/AndroidSampleApp.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -79,6 +79,8 @@
Assemblies="@(BundleAssemblies)"
MainLibraryFileName="$(AssemblyName).dll"
StripDebugSymbols="$(StripDebugSymbols)"
RuntimeComponents="$(RuntimeComponents)"
DiagnosticPorts="$(DiagnosticPorts)"
OutputDir="$(ApkDir)"
AppDir="$(PublishDir)">
<Output TaskParameter="ApkBundlePath" PropertyName="ApkBundlePath" />
Expand Down
14 changes: 13 additions & 1 deletion src/mono/sample/Android/Makefile
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,16 @@ DOTNET := ../../../../dotnet.sh
USE_LLVM=true
AOT=false
DEPLOY_AND_RUN?=true
RUNTIME_COMPONENTS=diagnostics_tracing

#If DIAGNOSTIC_PORTS is enabled, RUNTIME_COMPONENTS must also be enabled.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is optional.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is disabled, use DOTNET_DiagnosticPorts when launching application to enable diagnostics.
#RUNTIME_COMPONENTS=diagnostics_tracing
#DIAGNOSTIC_PORTS=10.0.2.2:9000,nosuspend
#DIAGNOSTIC_PORTS=10.0.2.2:9000,suspend
#DIAGNOSTIC_PORTS=$(DOTNET_DiagnosticPorts)
Comment on lines +12 to +15

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just setting DiagnosticPorts and not set RuntimeComponents to at least include diagnostics_tracing will generate a build error.

Since they're all commented out, can it be noted in the makefiles that RUNTIME_COMPONENTS and DIAGNOSTIC_PORTS should be uncommented together if at all?

Also, out of curiosity, how were 10.0.2.2:9000 and 127.0.0.1:9000 selected (having no prior context of diagnostic ports)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can add more comments into the script.

There are no dedicated port numbers, so could be anything.

10.0.2.2 is how you reach host loopback from Android emulator (without need to use adb). On iOS, 127.0.0.1 can still be used from simulator. But as above these are just examples and might need to be adjusted if you run different scenario.



all: runtimepack run

Expand All@@ -18,7 +28,9 @@ run:
/p:DeployAndRun=$(DEPLOY_AND_RUN) \
/p:ForceAOT=$(AOT) \
/p:UseLLVM=$(USE_LLVM) \
/p:RunActivity=false
/p:RunActivity=false \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

clean:
rm -rf ../../../../artifacts/bin/AndroidSampleApp
55 changes: 45 additions & 10 deletions src/mono/sample/iOS/Makefile
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,14 @@ DOTNET := ../../../../dotnet.sh
USE_LLVM=true
AOT=false

#If DIAGNOSTIC_PORTS is enabled, RUNTIME_COMPONENTS must also be enabled.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is optional.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is disabled, use DOTNET_DiagnosticPorts when launching application to enable diagnostics.
#RUNTIME_COMPONENTS=diagnostics_tracing
#DIAGNOSTIC_PORTS=127.0.0.1:9000,nosuspend
#DIAGNOSTIC_PORTS=127.0.0.1:9000,suspend
#DIAGNOSTIC_PORTS=$(DOTNET_DiagnosticPorts)

all: runtimepack run

TOOLS_DIR=../../../tasks
Expand All@@ -15,24 +23,51 @@ runtimepack:
../../../../build.sh Mono+Libs -os iOSSimulator -arch $(MONO_ARCH) -c $(MONO_CONFIG)

run: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT)
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this format
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
instead of like the previous formats
/p:RuntimeComponents=$(RUNTIME_COMPONENTS) \

@lateralusXlateralusXMay 28, 2021

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since it includes , in the value it needs to be quoted or you will get msbuild argument parsing errors, just putting "" around value is not enough so complete property needs to be quoted as well in order to correctly go through shell parsing rules, problem is described here:

dotnet/msbuild#2999

and there are various workarounds to the problem, one of them is in this PR, but also suggested in different places, like here dotnet/msbuild#471 (comment).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, good to know, thanks for the explanation :)

'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-sim: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=iOSSimulator /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT)
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=iOSSimulator \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-catalyst:
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=MacCatalyst /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False /p:ForceAOT=False
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=MacCatalyst \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False \
/p:ForceAOT=False

run-sim-interp: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=iOSSimulator /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT) /p:MonoForceInterpreter=true
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=iOSSimulator \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
/p:MonoForceInterpreter=true \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-catalyst-interp:
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=MacCatalyst /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False /p:ForceAOT=False /p:MonoForceInterpreter=true
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=MacCatalyst \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False \
/p:ForceAOT=False \
/p:MonoForceInterpreter=true

clean:
rm -rf bin
2 changes: 2 additions & 0 deletions src/mono/sample/iOS/Program.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -84,6 +84,8 @@
Optimized="$(Optimized)"
ForceAOT="$(ForceAOT)"
ForceInterpreter="$(MonoForceInterpreter)"
RuntimeComponents="$(RuntimeComponents)"
DiagnosticPorts="$(DiagnosticPorts)"
AppDir="$(MSBuildThisFileDirectory)$(PublishDir)">
<Output TaskParameter="AppBundlePath" PropertyName="AppBundlePath" />
<Output TaskParameter="XcodeProjectPath" PropertyName="XcodeProjectPath" />
Expand Down
6 changes: 6 additions & 0 deletions src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,6 +43,11 @@ public class AndroidAppBuilderTask : Task
/// </summary>
public string? RuntimeComponents { get; set; } = ""!;

/// <summary>
/// Diagnostic ports configuration string
/// </summary>
public string? DiagnosticPorts { get; set; } = ""!;

[Required]
public string RuntimeIdentifier { get; set; } = ""!;

Expand DownExpand Up@@ -102,6 +107,7 @@ public override bool Execute()
apkBuilder.ForceAOT = ForceAOT;
apkBuilder.StaticLinkedRuntime = StaticLinkedRuntime;
apkBuilder.RuntimeComponents = RuntimeComponents;
apkBuilder.DiagnosticPorts = DiagnosticPorts;
apkBuilder.Assemblies = Assemblies;
(ApkBundlePath, ApkPackageId) = apkBuilder.BuildApk(abi, MainLibraryFileName, MonoRuntimeHeaders);

Expand Down
21 changes: 21 additions & 0 deletions src/tasks/AndroidAppBuilder/ApkBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -28,6 +28,7 @@ public class ApkBuilder
public bool EnableRuntimeLogging { get; set; }
public bool StaticLinkedRuntime { get; set; }
public string? RuntimeComponents { get; set; }
public string? DiagnosticPorts { get; set; }
public ITaskItem[] Assemblies { get; set; } = Array.Empty<ITaskItem>();

public (string apk, string packageId) BuildApk(
Expand DownExpand Up@@ -79,6 +80,21 @@ public class ApkBuilder
throw new InvalidOperationException("Interpreter and AOT cannot be enabled at the same time");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
bool validDiagnosticsConfig = false;

if (string.IsNullOrEmpty(RuntimeComponents))
validDiagnosticsConfig = false;
else if (RuntimeComponents.Equals("*", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;
else if (RuntimeComponents.Contains("diagnostics_tracing", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;

if (!validDiagnosticsConfig)
throw new ArgumentException("Using DiagnosticPorts require diagnostics_tracing runtime component.");
}

// Try to get the latest build-tools version if not specified
if (string.IsNullOrEmpty(BuildToolsVersion))
BuildToolsVersion = GetLatestBuildTools(AndroidSdk);
Expand DownExpand Up@@ -268,6 +284,11 @@ public class ApkBuilder
defines = "add_definitions(-DFORCE_AOT=1)";
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines += "\nadd_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")";
}

cmakeLists = cmakeLists.Replace("%Defines%", defines);

File.WriteAllText(Path.Combine(OutputDir, "CMakeLists.txt"), cmakeLists);
Expand Down
20 changes: 16 additions & 4 deletions src/tasks/AndroidAppBuilder/Templates/monodroid.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -205,12 +205,20 @@ cleanup_runtime_config (MonovmRuntimeConfigArguments *args, void *user_data)
int
mono_droid_runtime_init (const char* executable, int managed_argc, char* managed_argv[])
{
// NOTE: these options can be set via command line args for adb or xharness, see AndroidSampleApp.csproj

// uncomment for debug output:
//
//setenv ("XUNIT_VERBOSE", "true", true);
//setenv ("MONO_LOG_LEVEL", "debug", true);
//setenv ("MONO_LOG_MASK", "all", true);
// NOTE: these options can be set via command line args for adb or xharness, see AndroidSampleApp.csproj

// build using DiagnosticPorts property in AndroidAppBuilder
// or set DOTNET_DiagnosticPorts env via adb, xharness when undefined.
// NOTE, using DOTNET_DiagnosticPorts requires app build using AndroidAppBuilder and RuntimeComponents=diagnostics_tracing
#ifdef DIAGNOSTIC_PORTS
setenv ("DOTNET_DiagnosticPorts", DIAGNOSTIC_PORTS, true);
#endif

bool wait_for_debugger = false;
chdir (bundle_path);
Expand DownExpand Up@@ -266,14 +274,18 @@ mono_droid_runtime_init (const char* executable, int managed_argc, char* managed
mono_jit_set_aot_mode(MONO_AOT_MODE_FULL);
#endif

mono_jit_init_version ("dotnet.android", "mobile");
MonoDomain *domain = mono_jit_init_version ("dotnet.android", "mobile");
assert (domain);

MonoAssembly *assembly = mono_droid_load_assembly (executable, NULL);
assert (assembly);
LOG_INFO ("Executable: %s", executable);

int res = mono_jit_exec (mono_domain_get (), assembly, managed_argc, managed_argv);
LOG_INFO ("Executable: %s", executable);
int res = mono_jit_exec (domain, assembly, managed_argc, managed_argv);
LOG_INFO ("Exit code: %d.", res);

mono_jit_cleanup (domain);

return res;
}

Expand Down
21 changes: 21 additions & 0 deletions src/tasks/AppleAppBuilder/AppleAppBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -131,6 +131,11 @@ public string TargetOS
/// </summary>
public string? RuntimeComponents { get; set; } = ""!;

/// <summary>
/// Diagnostic ports configuration string
/// </summary>
public string? DiagnosticPorts { get; set; } = ""!;

/// <summary>
/// Forces the runtime to use the invariant mode
/// </summary>
Expand DownExpand Up@@ -198,10 +203,26 @@ public override bool Execute()
throw new InvalidOperationException("Interpreter and AOT cannot be enabled at the same time");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
bool validDiagnosticsConfig = false;

if (string.IsNullOrEmpty(RuntimeComponents))
validDiagnosticsConfig = false;
else if (RuntimeComponents.Equals("*", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;
else if (RuntimeComponents.Contains("diagnostics_tracing", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;

if (!validDiagnosticsConfig)
throw new ArgumentException("Using DiagnosticPorts require diagnostics_tracing runtime component.");
}

if (GenerateXcodeProject)
{
Xcode generator = new Xcode(TargetOS, Arch);
generator.EnableRuntimeLogging = EnableRuntimeLogging;
generator.DiagnosticPorts = DiagnosticPorts;

XcodeProjectPath = generator.GenerateXCode(ProjectName, MainLibraryFileName, assemblerFiles,
AppDir, binDir, MonoRuntimeHeaders, !isDevice, UseConsoleUITemplate, ForceAOT, ForceInterpreter, InvariantGlobalization, Optimized, RuntimeComponents, NativeMainSource);
Expand Down
13 changes: 12 additions & 1 deletion src/tasks/AppleAppBuilder/Templates/runtime.m
Original file line numberDiff line numberDiff line change
Expand Up@@ -231,6 +231,13 @@
setenv ("MONO_LOG_MASK", "all", TRUE);
#endif

// build using DiagnosticPorts property in AppleAppBuilder
// or set DOTNET_DiagnosticPorts env via mlaunch, xharness when undefined.
// NOTE, using DOTNET_DiagnosticPorts requires app build using AppleAppBuilder and RuntimeComponents=diagnostics_tracing
#ifdef DIAGNOSTIC_PORTS
setenv ("DOTNET_DiagnosticPorts", DIAGNOSTIC_PORTS, true);
#endif

id args_array = [[NSProcessInfo processInfo] arguments];
assert ([args_array count] <= 128);
const char *managed_argv [128];
Expand DownExpand Up@@ -308,7 +315,9 @@
char* options[] = { "--debugger-agent=transport=dt_socket,server=y,address=0.0.0.0:55555" };
mono_jit_parse_options (1, options);
}
mono_jit_init_version ("dotnet.ios", "mobile");

MonoDomain *domain = mono_jit_init_version ("dotnet.ios", "mobile");
assert (domain);

#if !FORCE_INTERPRETER && (!TARGET_OS_SIMULATOR || FORCE_AOT)
// device runtimes are configured to use lazy gc thread creation
Expand All@@ -326,5 +335,7 @@
// Print this so apps parsing logs can detect when we exited
os_log_info (OS_LOG_DEFAULT, "Exit code: %d.", res);

mono_jit_cleanup (domain);

exit (res);
}
6 changes: 6 additions & 0 deletions src/tasks/AppleAppBuilder/Xcode.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,6 +41,7 @@ public Xcode(string target, string arch)
}

public bool EnableRuntimeLogging { get; set; }
public string? DiagnosticPorts { get; set; } = ""!;

public string GenerateXCode(
string projectName,
Expand DownExpand Up@@ -212,6 +213,11 @@ public string GenerateXCode(
defines.AppendLine("add_definitions(-DENABLE_RUNTIME_LOGGING=1)");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines.AppendLine("\nadd_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")");
}

cmakeLists = cmakeLists.Replace("%Defines%", defines.ToString());

string plist = Utils.GetEmbeddedResource("Info.plist.template")
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/mono/sample/Android/AndroidSampleApp.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -79,6 +79,8 @@
Assemblies="@(BundleAssemblies)"
MainLibraryFileName="$(AssemblyName).dll"
StripDebugSymbols="$(StripDebugSymbols)"
RuntimeComponents="$(RuntimeComponents)"
DiagnosticPorts="$(DiagnosticPorts)"
OutputDir="$(ApkDir)"
AppDir="$(PublishDir)">
<Output TaskParameter="ApkBundlePath" PropertyName="ApkBundlePath" />
Expand Down
14 changes: 13 additions & 1 deletion src/mono/sample/Android/Makefile
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,16 @@ DOTNET := ../../../../dotnet.sh
USE_LLVM=true
AOT=false
DEPLOY_AND_RUN?=true
RUNTIME_COMPONENTS=diagnostics_tracing

#If DIAGNOSTIC_PORTS is enabled, RUNTIME_COMPONENTS must also be enabled.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is optional.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is disabled, use DOTNET_DiagnosticPorts when launching application to enable diagnostics.
#RUNTIME_COMPONENTS=diagnostics_tracing
#DIAGNOSTIC_PORTS=10.0.2.2:9000,nosuspend
#DIAGNOSTIC_PORTS=10.0.2.2:9000,suspend
#DIAGNOSTIC_PORTS=$(DOTNET_DiagnosticPorts)
Comment on lines +12 to +15

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just setting DiagnosticPorts and not set RuntimeComponents to at least include diagnostics_tracing will generate a build error.

Since they're all commented out, can it be noted in the makefiles that RUNTIME_COMPONENTS and DIAGNOSTIC_PORTS should be uncommented together if at all?

Also, out of curiosity, how were 10.0.2.2:9000 and 127.0.0.1:9000 selected (having no prior context of diagnostic ports)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can add more comments into the script.

There are no dedicated port numbers, so could be anything.

10.0.2.2 is how you reach host loopback from Android emulator (without need to use adb). On iOS, 127.0.0.1 can still be used from simulator. But as above these are just examples and might need to be adjusted if you run different scenario.



all: runtimepack run

Expand All@@ -18,7 +28,9 @@ run:
/p:DeployAndRun=$(DEPLOY_AND_RUN) \
/p:ForceAOT=$(AOT) \
/p:UseLLVM=$(USE_LLVM) \
/p:RunActivity=false
/p:RunActivity=false \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

clean:
rm -rf ../../../../artifacts/bin/AndroidSampleApp
55 changes: 45 additions & 10 deletions src/mono/sample/iOS/Makefile
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,14 @@ DOTNET := ../../../../dotnet.sh
USE_LLVM=true
AOT=false

#If DIAGNOSTIC_PORTS is enabled, RUNTIME_COMPONENTS must also be enabled.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is optional.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is disabled, use DOTNET_DiagnosticPorts when launching application to enable diagnostics.
#RUNTIME_COMPONENTS=diagnostics_tracing
#DIAGNOSTIC_PORTS=127.0.0.1:9000,nosuspend
#DIAGNOSTIC_PORTS=127.0.0.1:9000,suspend
#DIAGNOSTIC_PORTS=$(DOTNET_DiagnosticPorts)

all: runtimepack run

TOOLS_DIR=../../../tasks
Expand All@@ -15,24 +23,51 @@ runtimepack:
../../../../build.sh Mono+Libs -os iOSSimulator -arch $(MONO_ARCH) -c $(MONO_CONFIG)

run: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT)
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this format
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
instead of like the previous formats
/p:RuntimeComponents=$(RUNTIME_COMPONENTS) \

@lateralusXlateralusXMay 28, 2021

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since it includes , in the value it needs to be quoted or you will get msbuild argument parsing errors, just putting "" around value is not enough so complete property needs to be quoted as well in order to correctly go through shell parsing rules, problem is described here:

dotnet/msbuild#2999

and there are various workarounds to the problem, one of them is in this PR, but also suggested in different places, like here dotnet/msbuild#471 (comment).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, good to know, thanks for the explanation :)

'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-sim: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=iOSSimulator /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT)
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=iOSSimulator \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-catalyst:
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=MacCatalyst /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False /p:ForceAOT=False
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=MacCatalyst \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False \
/p:ForceAOT=False

run-sim-interp: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=iOSSimulator /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT) /p:MonoForceInterpreter=true
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=iOSSimulator \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
/p:MonoForceInterpreter=true \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-catalyst-interp:
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=MacCatalyst /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False /p:ForceAOT=False /p:MonoForceInterpreter=true
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=MacCatalyst \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False \
/p:ForceAOT=False \
/p:MonoForceInterpreter=true

clean:
rm -rf bin
2 changes: 2 additions & 0 deletions src/mono/sample/iOS/Program.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -84,6 +84,8 @@
Optimized="$(Optimized)"
ForceAOT="$(ForceAOT)"
ForceInterpreter="$(MonoForceInterpreter)"
RuntimeComponents="$(RuntimeComponents)"
DiagnosticPorts="$(DiagnosticPorts)"
AppDir="$(MSBuildThisFileDirectory)$(PublishDir)">
<Output TaskParameter="AppBundlePath" PropertyName="AppBundlePath" />
<Output TaskParameter="XcodeProjectPath" PropertyName="XcodeProjectPath" />
Expand Down
6 changes: 6 additions & 0 deletions src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,6 +43,11 @@ public class AndroidAppBuilderTask : Task
/// </summary>
public string? RuntimeComponents { get; set; } = ""!;

/// <summary>
/// Diagnostic ports configuration string
/// </summary>
public string? DiagnosticPorts { get; set; } = ""!;

[Required]
public string RuntimeIdentifier { get; set; } = ""!;

Expand DownExpand Up@@ -102,6 +107,7 @@ public override bool Execute()
apkBuilder.ForceAOT = ForceAOT;
apkBuilder.StaticLinkedRuntime = StaticLinkedRuntime;
apkBuilder.RuntimeComponents = RuntimeComponents;
apkBuilder.DiagnosticPorts = DiagnosticPorts;
apkBuilder.Assemblies = Assemblies;
(ApkBundlePath, ApkPackageId) = apkBuilder.BuildApk(abi, MainLibraryFileName, MonoRuntimeHeaders);

Expand Down
21 changes: 21 additions & 0 deletions src/tasks/AndroidAppBuilder/ApkBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -28,6 +28,7 @@ public class ApkBuilder
public bool EnableRuntimeLogging { get; set; }
public bool StaticLinkedRuntime { get; set; }
public string? RuntimeComponents { get; set; }
public string? DiagnosticPorts { get; set; }
public ITaskItem[] Assemblies { get; set; } = Array.Empty<ITaskItem>();

public (string apk, string packageId) BuildApk(
Expand DownExpand Up@@ -79,6 +80,21 @@ public class ApkBuilder
throw new InvalidOperationException("Interpreter and AOT cannot be enabled at the same time");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
bool validDiagnosticsConfig = false;

if (string.IsNullOrEmpty(RuntimeComponents))
validDiagnosticsConfig = false;
else if (RuntimeComponents.Equals("*", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;
else if (RuntimeComponents.Contains("diagnostics_tracing", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;

if (!validDiagnosticsConfig)
throw new ArgumentException("Using DiagnosticPorts require diagnostics_tracing runtime component.");
}

// Try to get the latest build-tools version if not specified
if (string.IsNullOrEmpty(BuildToolsVersion))
BuildToolsVersion = GetLatestBuildTools(AndroidSdk);
Expand DownExpand Up@@ -268,6 +284,11 @@ public class ApkBuilder
defines = "add_definitions(-DFORCE_AOT=1)";
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines += "\nadd_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")";
}

cmakeLists = cmakeLists.Replace("%Defines%", defines);

File.WriteAllText(Path.Combine(OutputDir, "CMakeLists.txt"), cmakeLists);
Expand Down
20 changes: 16 additions & 4 deletions src/tasks/AndroidAppBuilder/Templates/monodroid.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -205,12 +205,20 @@ cleanup_runtime_config (MonovmRuntimeConfigArguments *args, void *user_data)
int
mono_droid_runtime_init (const char* executable, int managed_argc, char* managed_argv[])
{
// NOTE: these options can be set via command line args for adb or xharness, see AndroidSampleApp.csproj

// uncomment for debug output:
//
//setenv ("XUNIT_VERBOSE", "true", true);
//setenv ("MONO_LOG_LEVEL", "debug", true);
//setenv ("MONO_LOG_MASK", "all", true);
// NOTE: these options can be set via command line args for adb or xharness, see AndroidSampleApp.csproj

// build using DiagnosticPorts property in AndroidAppBuilder
// or set DOTNET_DiagnosticPorts env via adb, xharness when undefined.
// NOTE, using DOTNET_DiagnosticPorts requires app build using AndroidAppBuilder and RuntimeComponents=diagnostics_tracing
#ifdef DIAGNOSTIC_PORTS
setenv ("DOTNET_DiagnosticPorts", DIAGNOSTIC_PORTS, true);
#endif

bool wait_for_debugger = false;
chdir (bundle_path);
Expand DownExpand Up@@ -266,14 +274,18 @@ mono_droid_runtime_init (const char* executable, int managed_argc, char* managed
mono_jit_set_aot_mode(MONO_AOT_MODE_FULL);
#endif

mono_jit_init_version ("dotnet.android", "mobile");
MonoDomain *domain = mono_jit_init_version ("dotnet.android", "mobile");
assert (domain);

MonoAssembly *assembly = mono_droid_load_assembly (executable, NULL);
assert (assembly);
LOG_INFO ("Executable: %s", executable);

int res = mono_jit_exec (mono_domain_get (), assembly, managed_argc, managed_argv);
LOG_INFO ("Executable: %s", executable);
int res = mono_jit_exec (domain, assembly, managed_argc, managed_argv);
LOG_INFO ("Exit code: %d.", res);

mono_jit_cleanup (domain);

return res;
}

Expand Down
21 changes: 21 additions & 0 deletions src/tasks/AppleAppBuilder/AppleAppBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -131,6 +131,11 @@ public string TargetOS
/// </summary>
public string? RuntimeComponents { get; set; } = ""!;

/// <summary>
/// Diagnostic ports configuration string
/// </summary>
public string? DiagnosticPorts { get; set; } = ""!;

/// <summary>
/// Forces the runtime to use the invariant mode
/// </summary>
Expand DownExpand Up@@ -198,10 +203,26 @@ public override bool Execute()
throw new InvalidOperationException("Interpreter and AOT cannot be enabled at the same time");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
bool validDiagnosticsConfig = false;

if (string.IsNullOrEmpty(RuntimeComponents))
validDiagnosticsConfig = false;
else if (RuntimeComponents.Equals("*", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;
else if (RuntimeComponents.Contains("diagnostics_tracing", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;

if (!validDiagnosticsConfig)
throw new ArgumentException("Using DiagnosticPorts require diagnostics_tracing runtime component.");
}

if (GenerateXcodeProject)
{
Xcode generator = new Xcode(TargetOS, Arch);
generator.EnableRuntimeLogging = EnableRuntimeLogging;
generator.DiagnosticPorts = DiagnosticPorts;

XcodeProjectPath = generator.GenerateXCode(ProjectName, MainLibraryFileName, assemblerFiles,
AppDir, binDir, MonoRuntimeHeaders, !isDevice, UseConsoleUITemplate, ForceAOT, ForceInterpreter, InvariantGlobalization, Optimized, RuntimeComponents, NativeMainSource);
Expand Down
13 changes: 12 additions & 1 deletion src/tasks/AppleAppBuilder/Templates/runtime.m
Original file line numberDiff line numberDiff line change
Expand Up@@ -231,6 +231,13 @@
setenv ("MONO_LOG_MASK", "all", TRUE);
#endif

// build using DiagnosticPorts property in AppleAppBuilder
// or set DOTNET_DiagnosticPorts env via mlaunch, xharness when undefined.
// NOTE, using DOTNET_DiagnosticPorts requires app build using AppleAppBuilder and RuntimeComponents=diagnostics_tracing
#ifdef DIAGNOSTIC_PORTS
setenv ("DOTNET_DiagnosticPorts", DIAGNOSTIC_PORTS, true);
#endif

id args_array = [[NSProcessInfo processInfo] arguments];
assert ([args_array count] <= 128);
const char *managed_argv [128];
Expand DownExpand Up@@ -308,7 +315,9 @@
char* options[] = { "--debugger-agent=transport=dt_socket,server=y,address=0.0.0.0:55555" };
mono_jit_parse_options (1, options);
}
mono_jit_init_version ("dotnet.ios", "mobile");

MonoDomain *domain = mono_jit_init_version ("dotnet.ios", "mobile");
assert (domain);

#if !FORCE_INTERPRETER && (!TARGET_OS_SIMULATOR || FORCE_AOT)
// device runtimes are configured to use lazy gc thread creation
Expand All@@ -326,5 +335,7 @@
// Print this so apps parsing logs can detect when we exited
os_log_info (OS_LOG_DEFAULT, "Exit code: %d.", res);

mono_jit_cleanup (domain);

exit (res);
}
6 changes: 6 additions & 0 deletions src/tasks/AppleAppBuilder/Xcode.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,6 +41,7 @@ public Xcode(string target, string arch)
}

public bool EnableRuntimeLogging { get; set; }
public string? DiagnosticPorts { get; set; } = ""!;

public string GenerateXCode(
string projectName,
Expand DownExpand Up@@ -212,6 +213,11 @@ public string GenerateXCode(
defines.AppendLine("add_definitions(-DENABLE_RUNTIME_LOGGING=1)");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines.AppendLine("\nadd_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")");
}

cmakeLists = cmakeLists.Replace("%Defines%", defines.ToString());

string plist = Utils.GetEmbeddedResource("Info.plist.template")
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/mono/sample/Android/AndroidSampleApp.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -79,6 +79,8 @@
Assemblies="@(BundleAssemblies)"
MainLibraryFileName="$(AssemblyName).dll"
StripDebugSymbols="$(StripDebugSymbols)"
RuntimeComponents="$(RuntimeComponents)"
DiagnosticPorts="$(DiagnosticPorts)"
OutputDir="$(ApkDir)"
AppDir="$(PublishDir)">
<Output TaskParameter="ApkBundlePath" PropertyName="ApkBundlePath" />
Expand Down
14 changes: 13 additions & 1 deletion src/mono/sample/Android/Makefile
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,16 @@ DOTNET := ../../../../dotnet.sh
USE_LLVM=true
AOT=false
DEPLOY_AND_RUN?=true
RUNTIME_COMPONENTS=diagnostics_tracing

#If DIAGNOSTIC_PORTS is enabled, RUNTIME_COMPONENTS must also be enabled.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is optional.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is disabled, use DOTNET_DiagnosticPorts when launching application to enable diagnostics.
#RUNTIME_COMPONENTS=diagnostics_tracing
#DIAGNOSTIC_PORTS=10.0.2.2:9000,nosuspend
#DIAGNOSTIC_PORTS=10.0.2.2:9000,suspend
#DIAGNOSTIC_PORTS=$(DOTNET_DiagnosticPorts)
Comment on lines +12 to +15

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just setting DiagnosticPorts and not set RuntimeComponents to at least include diagnostics_tracing will generate a build error.

Since they're all commented out, can it be noted in the makefiles that RUNTIME_COMPONENTS and DIAGNOSTIC_PORTS should be uncommented together if at all?

Also, out of curiosity, how were 10.0.2.2:9000 and 127.0.0.1:9000 selected (having no prior context of diagnostic ports)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can add more comments into the script.

There are no dedicated port numbers, so could be anything.

10.0.2.2 is how you reach host loopback from Android emulator (without need to use adb). On iOS, 127.0.0.1 can still be used from simulator. But as above these are just examples and might need to be adjusted if you run different scenario.



all: runtimepack run

Expand All@@ -18,7 +28,9 @@ run:
/p:DeployAndRun=$(DEPLOY_AND_RUN) \
/p:ForceAOT=$(AOT) \
/p:UseLLVM=$(USE_LLVM) \
/p:RunActivity=false
/p:RunActivity=false \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

clean:
rm -rf ../../../../artifacts/bin/AndroidSampleApp
55 changes: 45 additions & 10 deletions src/mono/sample/iOS/Makefile
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,14 @@ DOTNET := ../../../../dotnet.sh
USE_LLVM=true
AOT=false

#If DIAGNOSTIC_PORTS is enabled, RUNTIME_COMPONENTS must also be enabled.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is optional.
#If RUNTIME_COMPONENTS is enabled, DIAGNOSTIC_PORTS is disabled, use DOTNET_DiagnosticPorts when launching application to enable diagnostics.
#RUNTIME_COMPONENTS=diagnostics_tracing
#DIAGNOSTIC_PORTS=127.0.0.1:9000,nosuspend
#DIAGNOSTIC_PORTS=127.0.0.1:9000,suspend
#DIAGNOSTIC_PORTS=$(DOTNET_DiagnosticPorts)

all: runtimepack run

TOOLS_DIR=../../../tasks
Expand All@@ -15,24 +23,51 @@ runtimepack:
../../../../build.sh Mono+Libs -os iOSSimulator -arch $(MONO_ARCH) -c $(MONO_CONFIG)

run: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT)
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this format
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
instead of like the previous formats
/p:RuntimeComponents=$(RUNTIME_COMPONENTS) \

@lateralusXlateralusXMay 28, 2021

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since it includes , in the value it needs to be quoted or you will get msbuild argument parsing errors, just putting "" around value is not enough so complete property needs to be quoted as well in order to correctly go through shell parsing rules, problem is described here:

dotnet/msbuild#2999

and there are various workarounds to the problem, one of them is in this PR, but also suggested in different places, like here dotnet/msbuild#471 (comment).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, good to know, thanks for the explanation :)

'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-sim: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=iOSSimulator /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT)
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=iOSSimulator \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-catalyst:
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=MacCatalyst /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False /p:ForceAOT=False
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=MacCatalyst \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False \
/p:ForceAOT=False

run-sim-interp: clean appbuilder
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=iOSSimulator /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) /p:ForceAOT=$(AOT) /p:MonoForceInterpreter=true
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=iOSSimulator \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=$(USE_LLVM) \
/p:ForceAOT=$(AOT) \
/p:MonoForceInterpreter=true \
'/p:RuntimeComponents="$(RUNTIME_COMPONENTS)"' \
'/p:DiagnosticPorts="$(DIAGNOSTIC_PORTS)"'

run-catalyst-interp:
$(DOTNET) publish -c $(MONO_CONFIG) /p:TargetOS=MacCatalyst /p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False /p:ForceAOT=False /p:MonoForceInterpreter=true
$(DOTNET) publish \
-c $(MONO_CONFIG) \
/p:TargetOS=MacCatalyst \
/p:TargetArchitecture=$(MONO_ARCH) \
/p:UseLLVM=False \
/p:ForceAOT=False \
/p:MonoForceInterpreter=true

clean:
rm -rf bin
2 changes: 2 additions & 0 deletions src/mono/sample/iOS/Program.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -84,6 +84,8 @@
Optimized="$(Optimized)"
ForceAOT="$(ForceAOT)"
ForceInterpreter="$(MonoForceInterpreter)"
RuntimeComponents="$(RuntimeComponents)"
DiagnosticPorts="$(DiagnosticPorts)"
AppDir="$(MSBuildThisFileDirectory)$(PublishDir)">
<Output TaskParameter="AppBundlePath" PropertyName="AppBundlePath" />
<Output TaskParameter="XcodeProjectPath" PropertyName="XcodeProjectPath" />
Expand Down
6 changes: 6 additions & 0 deletions src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -43,6 +43,11 @@ public class AndroidAppBuilderTask : Task
/// </summary>
public string? RuntimeComponents { get; set; } = ""!;

/// <summary>
/// Diagnostic ports configuration string
/// </summary>
public string? DiagnosticPorts { get; set; } = ""!;

[Required]
public string RuntimeIdentifier { get; set; } = ""!;

Expand DownExpand Up@@ -102,6 +107,7 @@ public override bool Execute()
apkBuilder.ForceAOT = ForceAOT;
apkBuilder.StaticLinkedRuntime = StaticLinkedRuntime;
apkBuilder.RuntimeComponents = RuntimeComponents;
apkBuilder.DiagnosticPorts = DiagnosticPorts;
apkBuilder.Assemblies = Assemblies;
(ApkBundlePath, ApkPackageId) = apkBuilder.BuildApk(abi, MainLibraryFileName, MonoRuntimeHeaders);

Expand Down
21 changes: 21 additions & 0 deletions src/tasks/AndroidAppBuilder/ApkBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -28,6 +28,7 @@ public class ApkBuilder
public bool EnableRuntimeLogging { get; set; }
public bool StaticLinkedRuntime { get; set; }
public string? RuntimeComponents { get; set; }
public string? DiagnosticPorts { get; set; }
public ITaskItem[] Assemblies { get; set; } = Array.Empty<ITaskItem>();

public (string apk, string packageId) BuildApk(
Expand DownExpand Up@@ -79,6 +80,21 @@ public class ApkBuilder
throw new InvalidOperationException("Interpreter and AOT cannot be enabled at the same time");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
bool validDiagnosticsConfig = false;

if (string.IsNullOrEmpty(RuntimeComponents))
validDiagnosticsConfig = false;
else if (RuntimeComponents.Equals("*", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;
else if (RuntimeComponents.Contains("diagnostics_tracing", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;

if (!validDiagnosticsConfig)
throw new ArgumentException("Using DiagnosticPorts require diagnostics_tracing runtime component.");
}

// Try to get the latest build-tools version if not specified
if (string.IsNullOrEmpty(BuildToolsVersion))
BuildToolsVersion = GetLatestBuildTools(AndroidSdk);
Expand DownExpand Up@@ -268,6 +284,11 @@ public class ApkBuilder
defines = "add_definitions(-DFORCE_AOT=1)";
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines += "\nadd_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")";
}

cmakeLists = cmakeLists.Replace("%Defines%", defines);

File.WriteAllText(Path.Combine(OutputDir, "CMakeLists.txt"), cmakeLists);
Expand Down
20 changes: 16 additions & 4 deletions src/tasks/AndroidAppBuilder/Templates/monodroid.c
Original file line numberDiff line numberDiff line change
Expand Up@@ -205,12 +205,20 @@ cleanup_runtime_config (MonovmRuntimeConfigArguments *args, void *user_data)
int
mono_droid_runtime_init (const char* executable, int managed_argc, char* managed_argv[])
{
// NOTE: these options can be set via command line args for adb or xharness, see AndroidSampleApp.csproj

// uncomment for debug output:
//
//setenv ("XUNIT_VERBOSE", "true", true);
//setenv ("MONO_LOG_LEVEL", "debug", true);
//setenv ("MONO_LOG_MASK", "all", true);
// NOTE: these options can be set via command line args for adb or xharness, see AndroidSampleApp.csproj

// build using DiagnosticPorts property in AndroidAppBuilder
// or set DOTNET_DiagnosticPorts env via adb, xharness when undefined.
// NOTE, using DOTNET_DiagnosticPorts requires app build using AndroidAppBuilder and RuntimeComponents=diagnostics_tracing
#ifdef DIAGNOSTIC_PORTS
setenv ("DOTNET_DiagnosticPorts", DIAGNOSTIC_PORTS, true);
#endif

bool wait_for_debugger = false;
chdir (bundle_path);
Expand DownExpand Up@@ -266,14 +274,18 @@ mono_droid_runtime_init (const char* executable, int managed_argc, char* managed
mono_jit_set_aot_mode(MONO_AOT_MODE_FULL);
#endif

mono_jit_init_version ("dotnet.android", "mobile");
MonoDomain *domain = mono_jit_init_version ("dotnet.android", "mobile");
assert (domain);

MonoAssembly *assembly = mono_droid_load_assembly (executable, NULL);
assert (assembly);
LOG_INFO ("Executable: %s", executable);

int res = mono_jit_exec (mono_domain_get (), assembly, managed_argc, managed_argv);
LOG_INFO ("Executable: %s", executable);
int res = mono_jit_exec (domain, assembly, managed_argc, managed_argv);
LOG_INFO ("Exit code: %d.", res);

mono_jit_cleanup (domain);

return res;
}

Expand Down
21 changes: 21 additions & 0 deletions src/tasks/AppleAppBuilder/AppleAppBuilder.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -131,6 +131,11 @@ public string TargetOS
/// </summary>
public string? RuntimeComponents { get; set; } = ""!;

/// <summary>
/// Diagnostic ports configuration string
/// </summary>
public string? DiagnosticPorts { get; set; } = ""!;

/// <summary>
/// Forces the runtime to use the invariant mode
/// </summary>
Expand DownExpand Up@@ -198,10 +203,26 @@ public override bool Execute()
throw new InvalidOperationException("Interpreter and AOT cannot be enabled at the same time");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
bool validDiagnosticsConfig = false;

if (string.IsNullOrEmpty(RuntimeComponents))
validDiagnosticsConfig = false;
else if (RuntimeComponents.Equals("*", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;
else if (RuntimeComponents.Contains("diagnostics_tracing", StringComparison.OrdinalIgnoreCase))
validDiagnosticsConfig = true;

if (!validDiagnosticsConfig)
throw new ArgumentException("Using DiagnosticPorts require diagnostics_tracing runtime component.");
}

if (GenerateXcodeProject)
{
Xcode generator = new Xcode(TargetOS, Arch);
generator.EnableRuntimeLogging = EnableRuntimeLogging;
generator.DiagnosticPorts = DiagnosticPorts;

XcodeProjectPath = generator.GenerateXCode(ProjectName, MainLibraryFileName, assemblerFiles,
AppDir, binDir, MonoRuntimeHeaders, !isDevice, UseConsoleUITemplate, ForceAOT, ForceInterpreter, InvariantGlobalization, Optimized, RuntimeComponents, NativeMainSource);
Expand Down
13 changes: 12 additions & 1 deletion src/tasks/AppleAppBuilder/Templates/runtime.m
Original file line numberDiff line numberDiff line change
Expand Up@@ -231,6 +231,13 @@
setenv ("MONO_LOG_MASK", "all", TRUE);
#endif

// build using DiagnosticPorts property in AppleAppBuilder
// or set DOTNET_DiagnosticPorts env via mlaunch, xharness when undefined.
// NOTE, using DOTNET_DiagnosticPorts requires app build using AppleAppBuilder and RuntimeComponents=diagnostics_tracing
#ifdef DIAGNOSTIC_PORTS
setenv ("DOTNET_DiagnosticPorts", DIAGNOSTIC_PORTS, true);
#endif

id args_array = [[NSProcessInfo processInfo] arguments];
assert ([args_array count] <= 128);
const char *managed_argv [128];
Expand DownExpand Up@@ -308,7 +315,9 @@
char* options[] = { "--debugger-agent=transport=dt_socket,server=y,address=0.0.0.0:55555" };
mono_jit_parse_options (1, options);
}
mono_jit_init_version ("dotnet.ios", "mobile");

MonoDomain *domain = mono_jit_init_version ("dotnet.ios", "mobile");
assert (domain);

#if !FORCE_INTERPRETER && (!TARGET_OS_SIMULATOR || FORCE_AOT)
// device runtimes are configured to use lazy gc thread creation
Expand All@@ -326,5 +335,7 @@
// Print this so apps parsing logs can detect when we exited
os_log_info (OS_LOG_DEFAULT, "Exit code: %d.", res);

mono_jit_cleanup (domain);

exit (res);
}
6 changes: 6 additions & 0 deletions src/tasks/AppleAppBuilder/Xcode.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,6 +41,7 @@ public Xcode(string target, string arch)
}

public bool EnableRuntimeLogging { get; set; }
public string? DiagnosticPorts { get; set; } = ""!;

public string GenerateXCode(
string projectName,
Expand DownExpand Up@@ -212,6 +213,11 @@ public string GenerateXCode(
defines.AppendLine("add_definitions(-DENABLE_RUNTIME_LOGGING=1)");
}

if (!string.IsNullOrEmpty(DiagnosticPorts))
{
defines.AppendLine("\nadd_definitions(-DDIAGNOSTIC_PORTS=\"" + DiagnosticPorts + "\")");
}

cmakeLists = cmakeLists.Replace("%Defines%", defines.ToString());

string plist = Utils.GetEmbeddedResource("Info.plist.template")
Expand Down