Add support for building CoreCLR for MacCatalyst/iOS simulator - #109928

Merged
ivanpovazan merged 16 commits into
dotnet:mainfrom
filipnavara:coreclr-ioslike-2
Jan 24, 2025
Merged

Add support for building CoreCLR for MacCatalyst/iOS simulator#109928
ivanpovazan merged 16 commits into
dotnet:mainfrom
filipnavara:coreclr-ioslike-2

Conversation

@filipnavara

Copy link
Copy Markdown
Member

Re-open and rebase of #98127

Build instructions:

  • Build the runtime pack and tools: ./build.sh clr+clr.runtime+libs+packs -os [iossimulator/maccatalyst] -arch [x64/arm64] -cross -c Release
  • Run the sample app: ./dotnet.sh publish src/mono/sample/iOS/Program.csproj -c Release /p:TargetOS=maccatalyst /p:TargetArchitecture=arm64 /p:DeployAndRun=true /p:UseMonoRuntime=false /p:RunAOTCompilation=false /p:MonoForceInterpreter=false

Related work:

Notably, this doesn't include CI scripts to build this or the runtime packs. I am open to suggestions on how to better split this into more digestible/reviewable chunks.

@ghostghost added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Nov 18, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Nov 18, 2024
Comment threadsrc/coreclr/hosts/inc/coreclrhost.h Outdated
Comment threadsrc/coreclr/pal/src/CMakeLists.txt Outdated
Comment threadsrc/coreclr/pal/src/include/pal/dbgmsg.h
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/native/corehost/hostpolicy/hostpolicy_context.cpp Outdated
Comment threadsrc/native/libs/System.Native/entrypoints.c Outdated
Comment threadsrc/native/libs/System.Security.Cryptography.Native.Apple/entrypoints.c Outdated
Comment threadsrc/native/libs/System.Security.Cryptography.Native.Apple/entrypoints.c Outdated
# add the install targets
install_clr(TARGETS coreclr DESTINATIONS . sharedFramework COMPONENT runtime)
if(CLR_CMAKE_HOST_MACCATALYST OR CLR_CMAKE_HOST_IOS)
install_clr(TARGETS coreclr_static DESTINATIONS . sharedFramework COMPONENT runtime)

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 do we need to install this?

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.

iOS generally restricts linking to static libraries or dynamic frameworks distributed with the app itself. The aim was to include statically built CoreCLR in the runtime pack.

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.

I wonder if that means that the single file is the only deployment mechanism on iOS. If it is the case, then I am not sure what would be the scenario where developers would explicitly use the static version of coreclr.

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.

Linking with a static library typically results in smaller apps, which is why we've always linked Mono statically by default.

Linking dynamically can make the build a little bit faster (from past experience in Xamarin, we never ported this to .NET when we migrated due to time constraints).

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.

The single file is a host statically linked to all the native libraries including coreclr. The scenario when the developers would need static coreclr library would be when they want to use their own host. Thinking about it more, I guess distributing the static coreclr version actually makes sense to enable such scenarios.

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.

Yes, that sounds like what we want.

Note that .dylib won't do (Apple doesn't allow them in iOS apps), each dynamic library has to be made into a .framework (which works).

FWIW Apple has recommended using no more than 6-8 .frameworks because otherwise it affects startup performance.

Comment threadsrc/coreclr/hosts/inc/coreclrhost.h Outdated
Comment threadsrc/coreclr/pal/src/exception/seh-unwind.cpp Outdated
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/coreclr/pal/src/misc/dbgmsg.cpp
Comment threadsrc/native/corehost/apphost/static/CMakeLists.txt Outdated
Comment threadsrc/native/libs/System.Globalization.Native/CMakeLists.txt Outdated
Comment threadsrc/native/libs/System.Native/entrypoints.c Outdated
Comment threadsrc/tests/build.proj Outdated
@ivanpovazan

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@filipnavara

Copy link
Copy Markdown
MemberAuthor

CI has few timeouts and couple of known issues but the rest passed.

@matouskozak

Copy link
Copy Markdown
Member

CI has few timeouts and couple of known issues but the rest passed.

I've triggered re-run for the failing ones to hopefully remove any infrastructure noise (the timeouts were on jobs that usually don't time out)

@ivanpovazanivanpovazan left a 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.

LGTM! Thanks a lot for all the hard work!

I resolved all my comments related to build integration files and sample changes as I will cover them in a separate PR as part of: #111745

@steveisoksteveisok left a 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.

Thanks!

@kotlarmiloskotlarmilos left a 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.

LGTM!

@kotlarmilos

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
Member

The official builds have passed.

@akoeplingerakoeplinger left a 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.

LGTM apart from two small comments that can be addressed in a follow-up PR, thanks!


#import "util.h"

#define APPLE_RUNTIME_IDENTIFIER "iossimulator-arm64"

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.

this should use the template string like runtime.m

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.

Good catch. I assume we can handle that as part of the follow-ups tracked in #111745.

INT cbErrorMessageBuffer,
bool serialize)
{
#if defined(TARGET_IOS)

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.

we should disable this on tvos too

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 didn't enable tvOS in this PR. It requires more work and testing due to lack of Mach signal API.

(Previous versions of this PR enabled the tvOS compilation at one point. I may resubmit them separately at some point for a more thorough review. Mixing them with the rest of the iOS bring up made it unreviewable.)

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.

yes I just wanted to call out so we don't forget to update this spot

@ivanpovazan
ivanpovazan merged commit 717d3b1 into dotnet:mainJan 24, 2025
@vitek-karas

Copy link
Copy Markdown
Member

Thanks a lot Filip - this was a lot of work!!!

add_dependencies(daccess eventing_headers)

if(CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS)
if(CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_APPLE)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@hoyosjs, I think it was this change that broke debugging/diagnostics repo tests on MacOS x64. Adding CLR_CMAKE_HOST_APPLE here will cause the runtime DAC table to be generated in the old "rva" way.

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 don't think the change was intentional. I traced it back to the first commit on my previous branch but it could have been a result of some rebase.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you want to remove/fix this?

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.

Seems like at some point after the initial patch the conditional compilation of machoreader.cpp was added. This still uses the old CLR_CMAKE_TARGET_OSX condition. I'll send a PR to fix this.

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.

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.

@hoyosjs, I think it was this change that broke debugging/diagnostics repo tests on MacOS x64. Adding CLR_CMAKE_HOST_APPLE here will cause the runtime DAC table to be generated in the old "rva" way.

Thanks Mike for drawing attention to this!

Which pipeline is running these tests?
I am thinking about ways to improve test coverage for PRs like this, so that we can catch such regressions earlier.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

These failing tests are part of the diagnostics repo. There is a manual way of running them against a local runtime build, but there currently no way for the runtime repo to use them. There is Jeremy created this issue dotnet/diagnostics#5213 to track this work.

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.

Thanks a lot for the pointers.

endif(CLR_CMAKE_HOST_OSX OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_HAIKU)
endif(CLR_CMAKE_HOST_APPLE OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_HAIKU)

if(CORECLR_SET_RPATH AND CLR_CMAKE_HOST_OSX AND CLR_CMAKE_HOST_ARCH_ARM64)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Has CLR_CMAKE_HOST_OSX been completed replaced by CLR_CMAKE_HOST_APPLE? If so, then the RPATH in the DAC isn't be added.

@hoyosjs

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Never mind. CLR_CMAKE_HOST_OSX is still defined if not maccatalyst.

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.

The idea is to use same parameters for all Apple platforms (macOS, iOS, tvOS) whenever possible. RPATH may still need some tweaks for each platform due to different bundle structure on macOS/MacCatalyst and iOS/tvOS.

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'll need to do another pass over the CLR_CMAKE_HOST_OSX usages. The RPath ones are likely wrong for some platforms. We don't produce packages for those platforms yet, so the code has never been tested. As for other occurrences - createdump is macOS only (but maybe MacCatalyst too?), guards in test code are likely unnecessary because _DARWIN_C_SOURCE is now set globally (to be verified).

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Mar 8, 2025
@filipnavara
filipnavara deleted the coreclr-ioslike-2 branch April 2, 2025 20:07
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issuescommunity-contributionIndicates that the PR has been added by a community memberos-maccatalystMacCatalyst OS

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Resolve TCP/IP EventPipe support on CoreCLR Android

12 participants

@filipnavara@janvorli@jkotas@ivanpovazan@kotlarmilos@matouskozak@vitek-karas@rolfbjarne@steveisok@akoeplinger@mikem8361@AaronRobinsonMSFT
, '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

Add support for building CoreCLR for MacCatalyst/iOS simulator - #109928

Merged
ivanpovazan merged 16 commits into
dotnet:mainfrom
filipnavara:coreclr-ioslike-2
Jan 24, 2025
Merged

Add support for building CoreCLR for MacCatalyst/iOS simulator#109928
ivanpovazan merged 16 commits into
dotnet:mainfrom
filipnavara:coreclr-ioslike-2

Conversation

@filipnavara

Copy link
Copy Markdown
Member

Re-open and rebase of #98127

Build instructions:

  • Build the runtime pack and tools: ./build.sh clr+clr.runtime+libs+packs -os [iossimulator/maccatalyst] -arch [x64/arm64] -cross -c Release
  • Run the sample app: ./dotnet.sh publish src/mono/sample/iOS/Program.csproj -c Release /p:TargetOS=maccatalyst /p:TargetArchitecture=arm64 /p:DeployAndRun=true /p:UseMonoRuntime=false /p:RunAOTCompilation=false /p:MonoForceInterpreter=false

Related work:

Notably, this doesn't include CI scripts to build this or the runtime packs. I am open to suggestions on how to better split this into more digestible/reviewable chunks.

@ghostghost added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Nov 18, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Nov 18, 2024
Comment threadsrc/coreclr/hosts/inc/coreclrhost.h Outdated
Comment threadsrc/coreclr/pal/src/CMakeLists.txt Outdated
Comment threadsrc/coreclr/pal/src/include/pal/dbgmsg.h
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/native/corehost/hostpolicy/hostpolicy_context.cpp Outdated
Comment threadsrc/native/libs/System.Native/entrypoints.c Outdated
Comment threadsrc/native/libs/System.Security.Cryptography.Native.Apple/entrypoints.c Outdated
Comment threadsrc/native/libs/System.Security.Cryptography.Native.Apple/entrypoints.c Outdated
# add the install targets
install_clr(TARGETS coreclr DESTINATIONS . sharedFramework COMPONENT runtime)
if(CLR_CMAKE_HOST_MACCATALYST OR CLR_CMAKE_HOST_IOS)
install_clr(TARGETS coreclr_static DESTINATIONS . sharedFramework COMPONENT runtime)

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 do we need to install this?

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.

iOS generally restricts linking to static libraries or dynamic frameworks distributed with the app itself. The aim was to include statically built CoreCLR in the runtime pack.

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.

I wonder if that means that the single file is the only deployment mechanism on iOS. If it is the case, then I am not sure what would be the scenario where developers would explicitly use the static version of coreclr.

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.

Linking with a static library typically results in smaller apps, which is why we've always linked Mono statically by default.

Linking dynamically can make the build a little bit faster (from past experience in Xamarin, we never ported this to .NET when we migrated due to time constraints).

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.

The single file is a host statically linked to all the native libraries including coreclr. The scenario when the developers would need static coreclr library would be when they want to use their own host. Thinking about it more, I guess distributing the static coreclr version actually makes sense to enable such scenarios.

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.

Yes, that sounds like what we want.

Note that .dylib won't do (Apple doesn't allow them in iOS apps), each dynamic library has to be made into a .framework (which works).

FWIW Apple has recommended using no more than 6-8 .frameworks because otherwise it affects startup performance.

Comment threadsrc/coreclr/hosts/inc/coreclrhost.h Outdated
Comment threadsrc/coreclr/pal/src/exception/seh-unwind.cpp Outdated
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/coreclr/pal/src/misc/dbgmsg.cpp
Comment threadsrc/native/corehost/apphost/static/CMakeLists.txt Outdated
Comment threadsrc/native/libs/System.Globalization.Native/CMakeLists.txt Outdated
Comment threadsrc/native/libs/System.Native/entrypoints.c Outdated
Comment threadsrc/tests/build.proj Outdated
@ivanpovazan

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@filipnavara

Copy link
Copy Markdown
MemberAuthor

CI has few timeouts and couple of known issues but the rest passed.

@matouskozak

Copy link
Copy Markdown
Member

CI has few timeouts and couple of known issues but the rest passed.

I've triggered re-run for the failing ones to hopefully remove any infrastructure noise (the timeouts were on jobs that usually don't time out)

@ivanpovazanivanpovazan left a 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.

LGTM! Thanks a lot for all the hard work!

I resolved all my comments related to build integration files and sample changes as I will cover them in a separate PR as part of: #111745

@steveisoksteveisok left a 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.

Thanks!

@kotlarmiloskotlarmilos left a 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.

LGTM!

@kotlarmilos

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
Member

The official builds have passed.

@akoeplingerakoeplinger left a 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.

LGTM apart from two small comments that can be addressed in a follow-up PR, thanks!


#import "util.h"

#define APPLE_RUNTIME_IDENTIFIER "iossimulator-arm64"

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.

this should use the template string like runtime.m

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.

Good catch. I assume we can handle that as part of the follow-ups tracked in #111745.

INT cbErrorMessageBuffer,
bool serialize)
{
#if defined(TARGET_IOS)

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.

we should disable this on tvos too

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 didn't enable tvOS in this PR. It requires more work and testing due to lack of Mach signal API.

(Previous versions of this PR enabled the tvOS compilation at one point. I may resubmit them separately at some point for a more thorough review. Mixing them with the rest of the iOS bring up made it unreviewable.)

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.

yes I just wanted to call out so we don't forget to update this spot

@ivanpovazan
ivanpovazan merged commit 717d3b1 into dotnet:mainJan 24, 2025
@vitek-karas

Copy link
Copy Markdown
Member

Thanks a lot Filip - this was a lot of work!!!

add_dependencies(daccess eventing_headers)

if(CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS)
if(CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_APPLE)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@hoyosjs, I think it was this change that broke debugging/diagnostics repo tests on MacOS x64. Adding CLR_CMAKE_HOST_APPLE here will cause the runtime DAC table to be generated in the old "rva" way.

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 don't think the change was intentional. I traced it back to the first commit on my previous branch but it could have been a result of some rebase.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you want to remove/fix this?

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.

Seems like at some point after the initial patch the conditional compilation of machoreader.cpp was added. This still uses the old CLR_CMAKE_TARGET_OSX condition. I'll send a PR to fix this.

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.

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.

@hoyosjs, I think it was this change that broke debugging/diagnostics repo tests on MacOS x64. Adding CLR_CMAKE_HOST_APPLE here will cause the runtime DAC table to be generated in the old "rva" way.

Thanks Mike for drawing attention to this!

Which pipeline is running these tests?
I am thinking about ways to improve test coverage for PRs like this, so that we can catch such regressions earlier.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

These failing tests are part of the diagnostics repo. There is a manual way of running them against a local runtime build, but there currently no way for the runtime repo to use them. There is Jeremy created this issue dotnet/diagnostics#5213 to track this work.

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.

Thanks a lot for the pointers.

endif(CLR_CMAKE_HOST_OSX OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_HAIKU)
endif(CLR_CMAKE_HOST_APPLE OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_HAIKU)

if(CORECLR_SET_RPATH AND CLR_CMAKE_HOST_OSX AND CLR_CMAKE_HOST_ARCH_ARM64)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Has CLR_CMAKE_HOST_OSX been completed replaced by CLR_CMAKE_HOST_APPLE? If so, then the RPATH in the DAC isn't be added.

@hoyosjs

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Never mind. CLR_CMAKE_HOST_OSX is still defined if not maccatalyst.

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.

The idea is to use same parameters for all Apple platforms (macOS, iOS, tvOS) whenever possible. RPATH may still need some tweaks for each platform due to different bundle structure on macOS/MacCatalyst and iOS/tvOS.

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'll need to do another pass over the CLR_CMAKE_HOST_OSX usages. The RPath ones are likely wrong for some platforms. We don't produce packages for those platforms yet, so the code has never been tested. As for other occurrences - createdump is macOS only (but maybe MacCatalyst too?), guards in test code are likely unnecessary because _DARWIN_C_SOURCE is now set globally (to be verified).

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Mar 8, 2025
@filipnavara
filipnavara deleted the coreclr-ioslike-2 branch April 2, 2025 20:07
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issuescommunity-contributionIndicates that the PR has been added by a community memberos-maccatalystMacCatalyst OS

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Resolve TCP/IP EventPipe support on CoreCLR Android

12 participants

@filipnavara@janvorli@jkotas@ivanpovazan@kotlarmilos@matouskozak@vitek-karas@rolfbjarne@steveisok@akoeplinger@mikem8361@AaronRobinsonMSFT
, '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

Add support for building CoreCLR for MacCatalyst/iOS simulator - #109928

Merged
ivanpovazan merged 16 commits into
dotnet:mainfrom
filipnavara:coreclr-ioslike-2
Jan 24, 2025
Merged

Add support for building CoreCLR for MacCatalyst/iOS simulator#109928
ivanpovazan merged 16 commits into
dotnet:mainfrom
filipnavara:coreclr-ioslike-2

Conversation

@filipnavara

Copy link
Copy Markdown
Member

Re-open and rebase of #98127

Build instructions:

  • Build the runtime pack and tools: ./build.sh clr+clr.runtime+libs+packs -os [iossimulator/maccatalyst] -arch [x64/arm64] -cross -c Release
  • Run the sample app: ./dotnet.sh publish src/mono/sample/iOS/Program.csproj -c Release /p:TargetOS=maccatalyst /p:TargetArchitecture=arm64 /p:DeployAndRun=true /p:UseMonoRuntime=false /p:RunAOTCompilation=false /p:MonoForceInterpreter=false

Related work:

Notably, this doesn't include CI scripts to build this or the runtime packs. I am open to suggestions on how to better split this into more digestible/reviewable chunks.

@ghostghost added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Nov 18, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Nov 18, 2024
Comment threadsrc/coreclr/hosts/inc/coreclrhost.h Outdated
Comment threadsrc/coreclr/pal/src/CMakeLists.txt Outdated
Comment threadsrc/coreclr/pal/src/include/pal/dbgmsg.h
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/native/corehost/hostpolicy/hostpolicy_context.cpp Outdated
Comment threadsrc/native/libs/System.Native/entrypoints.c Outdated
Comment threadsrc/native/libs/System.Security.Cryptography.Native.Apple/entrypoints.c Outdated
Comment threadsrc/native/libs/System.Security.Cryptography.Native.Apple/entrypoints.c Outdated
# add the install targets
install_clr(TARGETS coreclr DESTINATIONS . sharedFramework COMPONENT runtime)
if(CLR_CMAKE_HOST_MACCATALYST OR CLR_CMAKE_HOST_IOS)
install_clr(TARGETS coreclr_static DESTINATIONS . sharedFramework COMPONENT runtime)

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 do we need to install this?

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.

iOS generally restricts linking to static libraries or dynamic frameworks distributed with the app itself. The aim was to include statically built CoreCLR in the runtime pack.

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.

I wonder if that means that the single file is the only deployment mechanism on iOS. If it is the case, then I am not sure what would be the scenario where developers would explicitly use the static version of coreclr.

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.

Linking with a static library typically results in smaller apps, which is why we've always linked Mono statically by default.

Linking dynamically can make the build a little bit faster (from past experience in Xamarin, we never ported this to .NET when we migrated due to time constraints).

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.

The single file is a host statically linked to all the native libraries including coreclr. The scenario when the developers would need static coreclr library would be when they want to use their own host. Thinking about it more, I guess distributing the static coreclr version actually makes sense to enable such scenarios.

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.

Yes, that sounds like what we want.

Note that .dylib won't do (Apple doesn't allow them in iOS apps), each dynamic library has to be made into a .framework (which works).

FWIW Apple has recommended using no more than 6-8 .frameworks because otherwise it affects startup performance.

Comment threadsrc/coreclr/hosts/inc/coreclrhost.h Outdated
Comment threadsrc/coreclr/pal/src/exception/seh-unwind.cpp Outdated
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/coreclr/pal/src/misc/dbgmsg.cpp
Comment threadsrc/native/corehost/apphost/static/CMakeLists.txt Outdated
Comment threadsrc/native/libs/System.Globalization.Native/CMakeLists.txt Outdated
Comment threadsrc/native/libs/System.Native/entrypoints.c Outdated
Comment threadsrc/tests/build.proj Outdated
@ivanpovazan

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@filipnavara

Copy link
Copy Markdown
MemberAuthor

CI has few timeouts and couple of known issues but the rest passed.

@matouskozak

Copy link
Copy Markdown
Member

CI has few timeouts and couple of known issues but the rest passed.

I've triggered re-run for the failing ones to hopefully remove any infrastructure noise (the timeouts were on jobs that usually don't time out)

@ivanpovazanivanpovazan left a 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.

LGTM! Thanks a lot for all the hard work!

I resolved all my comments related to build integration files and sample changes as I will cover them in a separate PR as part of: #111745

@steveisoksteveisok left a 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.

Thanks!

@kotlarmiloskotlarmilos left a 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.

LGTM!

@kotlarmilos

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
Member

The official builds have passed.

@akoeplingerakoeplinger left a 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.

LGTM apart from two small comments that can be addressed in a follow-up PR, thanks!


#import "util.h"

#define APPLE_RUNTIME_IDENTIFIER "iossimulator-arm64"

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.

this should use the template string like runtime.m

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.

Good catch. I assume we can handle that as part of the follow-ups tracked in #111745.

INT cbErrorMessageBuffer,
bool serialize)
{
#if defined(TARGET_IOS)

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.

we should disable this on tvos too

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 didn't enable tvOS in this PR. It requires more work and testing due to lack of Mach signal API.

(Previous versions of this PR enabled the tvOS compilation at one point. I may resubmit them separately at some point for a more thorough review. Mixing them with the rest of the iOS bring up made it unreviewable.)

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.

yes I just wanted to call out so we don't forget to update this spot

@ivanpovazan
ivanpovazan merged commit 717d3b1 into dotnet:mainJan 24, 2025
@vitek-karas

Copy link
Copy Markdown
Member

Thanks a lot Filip - this was a lot of work!!!

add_dependencies(daccess eventing_headers)

if(CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS)
if(CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_APPLE)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@hoyosjs, I think it was this change that broke debugging/diagnostics repo tests on MacOS x64. Adding CLR_CMAKE_HOST_APPLE here will cause the runtime DAC table to be generated in the old "rva" way.

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 don't think the change was intentional. I traced it back to the first commit on my previous branch but it could have been a result of some rebase.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you want to remove/fix this?

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.

Seems like at some point after the initial patch the conditional compilation of machoreader.cpp was added. This still uses the old CLR_CMAKE_TARGET_OSX condition. I'll send a PR to fix this.

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.

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.

@hoyosjs, I think it was this change that broke debugging/diagnostics repo tests on MacOS x64. Adding CLR_CMAKE_HOST_APPLE here will cause the runtime DAC table to be generated in the old "rva" way.

Thanks Mike for drawing attention to this!

Which pipeline is running these tests?
I am thinking about ways to improve test coverage for PRs like this, so that we can catch such regressions earlier.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

These failing tests are part of the diagnostics repo. There is a manual way of running them against a local runtime build, but there currently no way for the runtime repo to use them. There is Jeremy created this issue dotnet/diagnostics#5213 to track this work.

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.

Thanks a lot for the pointers.

endif(CLR_CMAKE_HOST_OSX OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_HAIKU)
endif(CLR_CMAKE_HOST_APPLE OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_HAIKU)

if(CORECLR_SET_RPATH AND CLR_CMAKE_HOST_OSX AND CLR_CMAKE_HOST_ARCH_ARM64)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Has CLR_CMAKE_HOST_OSX been completed replaced by CLR_CMAKE_HOST_APPLE? If so, then the RPATH in the DAC isn't be added.

@hoyosjs

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Never mind. CLR_CMAKE_HOST_OSX is still defined if not maccatalyst.

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.

The idea is to use same parameters for all Apple platforms (macOS, iOS, tvOS) whenever possible. RPATH may still need some tweaks for each platform due to different bundle structure on macOS/MacCatalyst and iOS/tvOS.

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'll need to do another pass over the CLR_CMAKE_HOST_OSX usages. The RPath ones are likely wrong for some platforms. We don't produce packages for those platforms yet, so the code has never been tested. As for other occurrences - createdump is macOS only (but maybe MacCatalyst too?), guards in test code are likely unnecessary because _DARWIN_C_SOURCE is now set globally (to be verified).

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Mar 8, 2025
@filipnavara
filipnavara deleted the coreclr-ioslike-2 branch April 2, 2025 20:07
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issuescommunity-contributionIndicates that the PR has been added by a community memberos-maccatalystMacCatalyst OS

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Resolve TCP/IP EventPipe support on CoreCLR Android

12 participants

@filipnavara@janvorli@jkotas@ivanpovazan@kotlarmilos@matouskozak@vitek-karas@rolfbjarne@steveisok@akoeplinger@mikem8361@AaronRobinsonMSFT
, '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

Add support for building CoreCLR for MacCatalyst/iOS simulator - #109928

Merged
ivanpovazan merged 16 commits into
dotnet:mainfrom
filipnavara:coreclr-ioslike-2
Jan 24, 2025
Merged

Add support for building CoreCLR for MacCatalyst/iOS simulator#109928
ivanpovazan merged 16 commits into
dotnet:mainfrom
filipnavara:coreclr-ioslike-2

Conversation

@filipnavara

Copy link
Copy Markdown
Member

Re-open and rebase of #98127

Build instructions:

  • Build the runtime pack and tools: ./build.sh clr+clr.runtime+libs+packs -os [iossimulator/maccatalyst] -arch [x64/arm64] -cross -c Release
  • Run the sample app: ./dotnet.sh publish src/mono/sample/iOS/Program.csproj -c Release /p:TargetOS=maccatalyst /p:TargetArchitecture=arm64 /p:DeployAndRun=true /p:UseMonoRuntime=false /p:RunAOTCompilation=false /p:MonoForceInterpreter=false

Related work:

Notably, this doesn't include CI scripts to build this or the runtime packs. I am open to suggestions on how to better split this into more digestible/reviewable chunks.

@ghostghost added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Nov 18, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Nov 18, 2024
Comment threadsrc/coreclr/hosts/inc/coreclrhost.h Outdated
Comment threadsrc/coreclr/pal/src/CMakeLists.txt Outdated
Comment threadsrc/coreclr/pal/src/include/pal/dbgmsg.h
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/native/corehost/hostpolicy/hostpolicy_context.cpp Outdated
Comment threadsrc/native/libs/System.Native/entrypoints.c Outdated
Comment threadsrc/native/libs/System.Security.Cryptography.Native.Apple/entrypoints.c Outdated
Comment threadsrc/native/libs/System.Security.Cryptography.Native.Apple/entrypoints.c Outdated
# add the install targets
install_clr(TARGETS coreclr DESTINATIONS . sharedFramework COMPONENT runtime)
if(CLR_CMAKE_HOST_MACCATALYST OR CLR_CMAKE_HOST_IOS)
install_clr(TARGETS coreclr_static DESTINATIONS . sharedFramework COMPONENT runtime)

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 do we need to install this?

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.

iOS generally restricts linking to static libraries or dynamic frameworks distributed with the app itself. The aim was to include statically built CoreCLR in the runtime pack.

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.

I wonder if that means that the single file is the only deployment mechanism on iOS. If it is the case, then I am not sure what would be the scenario where developers would explicitly use the static version of coreclr.

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.

Linking with a static library typically results in smaller apps, which is why we've always linked Mono statically by default.

Linking dynamically can make the build a little bit faster (from past experience in Xamarin, we never ported this to .NET when we migrated due to time constraints).

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.

The single file is a host statically linked to all the native libraries including coreclr. The scenario when the developers would need static coreclr library would be when they want to use their own host. Thinking about it more, I guess distributing the static coreclr version actually makes sense to enable such scenarios.

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.

Yes, that sounds like what we want.

Note that .dylib won't do (Apple doesn't allow them in iOS apps), each dynamic library has to be made into a .framework (which works).

FWIW Apple has recommended using no more than 6-8 .frameworks because otherwise it affects startup performance.

Comment threadsrc/coreclr/hosts/inc/coreclrhost.h Outdated
Comment threadsrc/coreclr/pal/src/exception/seh-unwind.cpp Outdated
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/coreclr/pal/src/misc/dbgmsg.cpp
Comment threadsrc/native/corehost/apphost/static/CMakeLists.txt Outdated
Comment threadsrc/native/libs/System.Globalization.Native/CMakeLists.txt Outdated
Comment threadsrc/native/libs/System.Native/entrypoints.c Outdated
Comment threadsrc/tests/build.proj Outdated
@ivanpovazan

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@filipnavara

Copy link
Copy Markdown
MemberAuthor

CI has few timeouts and couple of known issues but the rest passed.

@matouskozak

Copy link
Copy Markdown
Member

CI has few timeouts and couple of known issues but the rest passed.

I've triggered re-run for the failing ones to hopefully remove any infrastructure noise (the timeouts were on jobs that usually don't time out)

@ivanpovazanivanpovazan left a 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.

LGTM! Thanks a lot for all the hard work!

I resolved all my comments related to build integration files and sample changes as I will cover them in a separate PR as part of: #111745

@steveisoksteveisok left a 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.

Thanks!

@kotlarmiloskotlarmilos left a 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.

LGTM!

@kotlarmilos

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
Member

The official builds have passed.

@akoeplingerakoeplinger left a 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.

LGTM apart from two small comments that can be addressed in a follow-up PR, thanks!


#import "util.h"

#define APPLE_RUNTIME_IDENTIFIER "iossimulator-arm64"

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.

this should use the template string like runtime.m

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.

Good catch. I assume we can handle that as part of the follow-ups tracked in #111745.

INT cbErrorMessageBuffer,
bool serialize)
{
#if defined(TARGET_IOS)

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.

we should disable this on tvos too

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 didn't enable tvOS in this PR. It requires more work and testing due to lack of Mach signal API.

(Previous versions of this PR enabled the tvOS compilation at one point. I may resubmit them separately at some point for a more thorough review. Mixing them with the rest of the iOS bring up made it unreviewable.)

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.

yes I just wanted to call out so we don't forget to update this spot

@ivanpovazan
ivanpovazan merged commit 717d3b1 into dotnet:mainJan 24, 2025
@vitek-karas

Copy link
Copy Markdown
Member

Thanks a lot Filip - this was a lot of work!!!

add_dependencies(daccess eventing_headers)

if(CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS)
if(CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_APPLE)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@hoyosjs, I think it was this change that broke debugging/diagnostics repo tests on MacOS x64. Adding CLR_CMAKE_HOST_APPLE here will cause the runtime DAC table to be generated in the old "rva" way.

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 don't think the change was intentional. I traced it back to the first commit on my previous branch but it could have been a result of some rebase.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you want to remove/fix this?

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.

Seems like at some point after the initial patch the conditional compilation of machoreader.cpp was added. This still uses the old CLR_CMAKE_TARGET_OSX condition. I'll send a PR to fix this.

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.

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.

@hoyosjs, I think it was this change that broke debugging/diagnostics repo tests on MacOS x64. Adding CLR_CMAKE_HOST_APPLE here will cause the runtime DAC table to be generated in the old "rva" way.

Thanks Mike for drawing attention to this!

Which pipeline is running these tests?
I am thinking about ways to improve test coverage for PRs like this, so that we can catch such regressions earlier.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

These failing tests are part of the diagnostics repo. There is a manual way of running them against a local runtime build, but there currently no way for the runtime repo to use them. There is Jeremy created this issue dotnet/diagnostics#5213 to track this work.

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.

Thanks a lot for the pointers.

endif(CLR_CMAKE_HOST_OSX OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_HAIKU)
endif(CLR_CMAKE_HOST_APPLE OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_HAIKU)

if(CORECLR_SET_RPATH AND CLR_CMAKE_HOST_OSX AND CLR_CMAKE_HOST_ARCH_ARM64)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Has CLR_CMAKE_HOST_OSX been completed replaced by CLR_CMAKE_HOST_APPLE? If so, then the RPATH in the DAC isn't be added.

@hoyosjs

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Never mind. CLR_CMAKE_HOST_OSX is still defined if not maccatalyst.

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.

The idea is to use same parameters for all Apple platforms (macOS, iOS, tvOS) whenever possible. RPATH may still need some tweaks for each platform due to different bundle structure on macOS/MacCatalyst and iOS/tvOS.

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'll need to do another pass over the CLR_CMAKE_HOST_OSX usages. The RPath ones are likely wrong for some platforms. We don't produce packages for those platforms yet, so the code has never been tested. As for other occurrences - createdump is macOS only (but maybe MacCatalyst too?), guards in test code are likely unnecessary because _DARWIN_C_SOURCE is now set globally (to be verified).

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Mar 8, 2025
@filipnavara
filipnavara deleted the coreclr-ioslike-2 branch April 2, 2025 20:07
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issuescommunity-contributionIndicates that the PR has been added by a community memberos-maccatalystMacCatalyst OS

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Resolve TCP/IP EventPipe support on CoreCLR Android

12 participants

@filipnavara@janvorli@jkotas@ivanpovazan@kotlarmilos@matouskozak@vitek-karas@rolfbjarne@steveisok@akoeplinger@mikem8361@AaronRobinsonMSFT
, '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

Add support for building CoreCLR for MacCatalyst/iOS simulator - #109928

Merged
ivanpovazan merged 16 commits into
dotnet:mainfrom
filipnavara:coreclr-ioslike-2
Jan 24, 2025
Merged

Add support for building CoreCLR for MacCatalyst/iOS simulator#109928
ivanpovazan merged 16 commits into
dotnet:mainfrom
filipnavara:coreclr-ioslike-2

Conversation

@filipnavara

Copy link
Copy Markdown
Member

Re-open and rebase of #98127

Build instructions:

  • Build the runtime pack and tools: ./build.sh clr+clr.runtime+libs+packs -os [iossimulator/maccatalyst] -arch [x64/arm64] -cross -c Release
  • Run the sample app: ./dotnet.sh publish src/mono/sample/iOS/Program.csproj -c Release /p:TargetOS=maccatalyst /p:TargetArchitecture=arm64 /p:DeployAndRun=true /p:UseMonoRuntime=false /p:RunAOTCompilation=false /p:MonoForceInterpreter=false

Related work:

Notably, this doesn't include CI scripts to build this or the runtime packs. I am open to suggestions on how to better split this into more digestible/reviewable chunks.

@ghostghost added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Nov 18, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Nov 18, 2024
Comment threadsrc/coreclr/hosts/inc/coreclrhost.h Outdated
Comment threadsrc/coreclr/pal/src/CMakeLists.txt Outdated
Comment threadsrc/coreclr/pal/src/include/pal/dbgmsg.h
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/native/corehost/hostpolicy/hostpolicy_context.cpp Outdated
Comment threadsrc/native/libs/System.Native/entrypoints.c Outdated
Comment threadsrc/native/libs/System.Security.Cryptography.Native.Apple/entrypoints.c Outdated
Comment threadsrc/native/libs/System.Security.Cryptography.Native.Apple/entrypoints.c Outdated
# add the install targets
install_clr(TARGETS coreclr DESTINATIONS . sharedFramework COMPONENT runtime)
if(CLR_CMAKE_HOST_MACCATALYST OR CLR_CMAKE_HOST_IOS)
install_clr(TARGETS coreclr_static DESTINATIONS . sharedFramework COMPONENT runtime)

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 do we need to install this?

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.

iOS generally restricts linking to static libraries or dynamic frameworks distributed with the app itself. The aim was to include statically built CoreCLR in the runtime pack.

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.

I wonder if that means that the single file is the only deployment mechanism on iOS. If it is the case, then I am not sure what would be the scenario where developers would explicitly use the static version of coreclr.

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.

Linking with a static library typically results in smaller apps, which is why we've always linked Mono statically by default.

Linking dynamically can make the build a little bit faster (from past experience in Xamarin, we never ported this to .NET when we migrated due to time constraints).

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.

The single file is a host statically linked to all the native libraries including coreclr. The scenario when the developers would need static coreclr library would be when they want to use their own host. Thinking about it more, I guess distributing the static coreclr version actually makes sense to enable such scenarios.

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.

Yes, that sounds like what we want.

Note that .dylib won't do (Apple doesn't allow them in iOS apps), each dynamic library has to be made into a .framework (which works).

FWIW Apple has recommended using no more than 6-8 .frameworks because otherwise it affects startup performance.

Comment threadsrc/coreclr/hosts/inc/coreclrhost.h Outdated
Comment threadsrc/coreclr/pal/src/exception/seh-unwind.cpp Outdated
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/coreclr/pal/src/misc/dbgmsg.cpp
Comment threadsrc/native/corehost/apphost/static/CMakeLists.txt Outdated
Comment threadsrc/native/libs/System.Globalization.Native/CMakeLists.txt Outdated
Comment threadsrc/native/libs/System.Native/entrypoints.c Outdated
Comment threadsrc/tests/build.proj Outdated
@ivanpovazan

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@filipnavara

Copy link
Copy Markdown
MemberAuthor

CI has few timeouts and couple of known issues but the rest passed.

@matouskozak

Copy link
Copy Markdown
Member

CI has few timeouts and couple of known issues but the rest passed.

I've triggered re-run for the failing ones to hopefully remove any infrastructure noise (the timeouts were on jobs that usually don't time out)

@ivanpovazanivanpovazan left a 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.

LGTM! Thanks a lot for all the hard work!

I resolved all my comments related to build integration files and sample changes as I will cover them in a separate PR as part of: #111745

@steveisoksteveisok left a 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.

Thanks!

@kotlarmiloskotlarmilos left a 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.

LGTM!

@kotlarmilos

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
Member

The official builds have passed.

@akoeplingerakoeplinger left a 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.

LGTM apart from two small comments that can be addressed in a follow-up PR, thanks!


#import "util.h"

#define APPLE_RUNTIME_IDENTIFIER "iossimulator-arm64"

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.

this should use the template string like runtime.m

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.

Good catch. I assume we can handle that as part of the follow-ups tracked in #111745.

INT cbErrorMessageBuffer,
bool serialize)
{
#if defined(TARGET_IOS)

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.

we should disable this on tvos too

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 didn't enable tvOS in this PR. It requires more work and testing due to lack of Mach signal API.

(Previous versions of this PR enabled the tvOS compilation at one point. I may resubmit them separately at some point for a more thorough review. Mixing them with the rest of the iOS bring up made it unreviewable.)

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.

yes I just wanted to call out so we don't forget to update this spot

@ivanpovazan
ivanpovazan merged commit 717d3b1 into dotnet:mainJan 24, 2025
@vitek-karas

Copy link
Copy Markdown
Member

Thanks a lot Filip - this was a lot of work!!!

add_dependencies(daccess eventing_headers)

if(CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS)
if(CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_APPLE)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@hoyosjs, I think it was this change that broke debugging/diagnostics repo tests on MacOS x64. Adding CLR_CMAKE_HOST_APPLE here will cause the runtime DAC table to be generated in the old "rva" way.

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 don't think the change was intentional. I traced it back to the first commit on my previous branch but it could have been a result of some rebase.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you want to remove/fix this?

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.

Seems like at some point after the initial patch the conditional compilation of machoreader.cpp was added. This still uses the old CLR_CMAKE_TARGET_OSX condition. I'll send a PR to fix this.

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.

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.

@hoyosjs, I think it was this change that broke debugging/diagnostics repo tests on MacOS x64. Adding CLR_CMAKE_HOST_APPLE here will cause the runtime DAC table to be generated in the old "rva" way.

Thanks Mike for drawing attention to this!

Which pipeline is running these tests?
I am thinking about ways to improve test coverage for PRs like this, so that we can catch such regressions earlier.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

These failing tests are part of the diagnostics repo. There is a manual way of running them against a local runtime build, but there currently no way for the runtime repo to use them. There is Jeremy created this issue dotnet/diagnostics#5213 to track this work.

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.

Thanks a lot for the pointers.

endif(CLR_CMAKE_HOST_OSX OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_HAIKU)
endif(CLR_CMAKE_HOST_APPLE OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_HAIKU)

if(CORECLR_SET_RPATH AND CLR_CMAKE_HOST_OSX AND CLR_CMAKE_HOST_ARCH_ARM64)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Has CLR_CMAKE_HOST_OSX been completed replaced by CLR_CMAKE_HOST_APPLE? If so, then the RPATH in the DAC isn't be added.

@hoyosjs

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Never mind. CLR_CMAKE_HOST_OSX is still defined if not maccatalyst.

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.

The idea is to use same parameters for all Apple platforms (macOS, iOS, tvOS) whenever possible. RPATH may still need some tweaks for each platform due to different bundle structure on macOS/MacCatalyst and iOS/tvOS.

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'll need to do another pass over the CLR_CMAKE_HOST_OSX usages. The RPath ones are likely wrong for some platforms. We don't produce packages for those platforms yet, so the code has never been tested. As for other occurrences - createdump is macOS only (but maybe MacCatalyst too?), guards in test code are likely unnecessary because _DARWIN_C_SOURCE is now set globally (to be verified).

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Mar 8, 2025
@filipnavara
filipnavara deleted the coreclr-ioslike-2 branch April 2, 2025 20:07
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issuescommunity-contributionIndicates that the PR has been added by a community memberos-maccatalystMacCatalyst OS

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Resolve TCP/IP EventPipe support on CoreCLR Android

12 participants

@filipnavara@janvorli@jkotas@ivanpovazan@kotlarmilos@matouskozak@vitek-karas@rolfbjarne@steveisok@akoeplinger@mikem8361@AaronRobinsonMSFT
, '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

Add support for building CoreCLR for MacCatalyst/iOS simulator - #109928

Merged
ivanpovazan merged 16 commits into
dotnet:mainfrom
filipnavara:coreclr-ioslike-2
Jan 24, 2025
Merged

Add support for building CoreCLR for MacCatalyst/iOS simulator#109928
ivanpovazan merged 16 commits into
dotnet:mainfrom
filipnavara:coreclr-ioslike-2

Conversation

@filipnavara

Copy link
Copy Markdown
Member

Re-open and rebase of #98127

Build instructions:

  • Build the runtime pack and tools: ./build.sh clr+clr.runtime+libs+packs -os [iossimulator/maccatalyst] -arch [x64/arm64] -cross -c Release
  • Run the sample app: ./dotnet.sh publish src/mono/sample/iOS/Program.csproj -c Release /p:TargetOS=maccatalyst /p:TargetArchitecture=arm64 /p:DeployAndRun=true /p:UseMonoRuntime=false /p:RunAOTCompilation=false /p:MonoForceInterpreter=false

Related work:

Notably, this doesn't include CI scripts to build this or the runtime packs. I am open to suggestions on how to better split this into more digestible/reviewable chunks.

@ghostghost added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Nov 18, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Nov 18, 2024
Comment threadsrc/coreclr/hosts/inc/coreclrhost.h Outdated
Comment threadsrc/coreclr/pal/src/CMakeLists.txt Outdated
Comment threadsrc/coreclr/pal/src/include/pal/dbgmsg.h
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/native/corehost/hostpolicy/hostpolicy_context.cpp Outdated
Comment threadsrc/native/libs/System.Native/entrypoints.c Outdated
Comment threadsrc/native/libs/System.Security.Cryptography.Native.Apple/entrypoints.c Outdated
Comment threadsrc/native/libs/System.Security.Cryptography.Native.Apple/entrypoints.c Outdated
# add the install targets
install_clr(TARGETS coreclr DESTINATIONS . sharedFramework COMPONENT runtime)
if(CLR_CMAKE_HOST_MACCATALYST OR CLR_CMAKE_HOST_IOS)
install_clr(TARGETS coreclr_static DESTINATIONS . sharedFramework COMPONENT runtime)

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 do we need to install this?

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.

iOS generally restricts linking to static libraries or dynamic frameworks distributed with the app itself. The aim was to include statically built CoreCLR in the runtime pack.

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.

I wonder if that means that the single file is the only deployment mechanism on iOS. If it is the case, then I am not sure what would be the scenario where developers would explicitly use the static version of coreclr.

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.

Linking with a static library typically results in smaller apps, which is why we've always linked Mono statically by default.

Linking dynamically can make the build a little bit faster (from past experience in Xamarin, we never ported this to .NET when we migrated due to time constraints).

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.

The single file is a host statically linked to all the native libraries including coreclr. The scenario when the developers would need static coreclr library would be when they want to use their own host. Thinking about it more, I guess distributing the static coreclr version actually makes sense to enable such scenarios.

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.

Yes, that sounds like what we want.

Note that .dylib won't do (Apple doesn't allow them in iOS apps), each dynamic library has to be made into a .framework (which works).

FWIW Apple has recommended using no more than 6-8 .frameworks because otherwise it affects startup performance.

Comment threadsrc/coreclr/hosts/inc/coreclrhost.h Outdated
Comment threadsrc/coreclr/pal/src/exception/seh-unwind.cpp Outdated
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/coreclr/pal/src/misc/dbgmsg.cpp
Comment threadsrc/native/corehost/apphost/static/CMakeLists.txt Outdated
Comment threadsrc/native/libs/System.Globalization.Native/CMakeLists.txt Outdated
Comment threadsrc/native/libs/System.Native/entrypoints.c Outdated
Comment threadsrc/tests/build.proj Outdated
@ivanpovazan

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@filipnavara

Copy link
Copy Markdown
MemberAuthor

CI has few timeouts and couple of known issues but the rest passed.

@matouskozak

Copy link
Copy Markdown
Member

CI has few timeouts and couple of known issues but the rest passed.

I've triggered re-run for the failing ones to hopefully remove any infrastructure noise (the timeouts were on jobs that usually don't time out)

@ivanpovazanivanpovazan left a 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.

LGTM! Thanks a lot for all the hard work!

I resolved all my comments related to build integration files and sample changes as I will cover them in a separate PR as part of: #111745

@steveisoksteveisok left a 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.

Thanks!

@kotlarmiloskotlarmilos left a 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.

LGTM!

@kotlarmilos

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
Member

The official builds have passed.

@akoeplingerakoeplinger left a 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.

LGTM apart from two small comments that can be addressed in a follow-up PR, thanks!


#import "util.h"

#define APPLE_RUNTIME_IDENTIFIER "iossimulator-arm64"

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.

this should use the template string like runtime.m

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.

Good catch. I assume we can handle that as part of the follow-ups tracked in #111745.

INT cbErrorMessageBuffer,
bool serialize)
{
#if defined(TARGET_IOS)

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.

we should disable this on tvos too

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 didn't enable tvOS in this PR. It requires more work and testing due to lack of Mach signal API.

(Previous versions of this PR enabled the tvOS compilation at one point. I may resubmit them separately at some point for a more thorough review. Mixing them with the rest of the iOS bring up made it unreviewable.)

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.

yes I just wanted to call out so we don't forget to update this spot

@ivanpovazan
ivanpovazan merged commit 717d3b1 into dotnet:mainJan 24, 2025
@vitek-karas

Copy link
Copy Markdown
Member

Thanks a lot Filip - this was a lot of work!!!

add_dependencies(daccess eventing_headers)

if(CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS)
if(CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_APPLE)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@hoyosjs, I think it was this change that broke debugging/diagnostics repo tests on MacOS x64. Adding CLR_CMAKE_HOST_APPLE here will cause the runtime DAC table to be generated in the old "rva" way.

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 don't think the change was intentional. I traced it back to the first commit on my previous branch but it could have been a result of some rebase.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you want to remove/fix this?

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.

Seems like at some point after the initial patch the conditional compilation of machoreader.cpp was added. This still uses the old CLR_CMAKE_TARGET_OSX condition. I'll send a PR to fix this.

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.

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.

@hoyosjs, I think it was this change that broke debugging/diagnostics repo tests on MacOS x64. Adding CLR_CMAKE_HOST_APPLE here will cause the runtime DAC table to be generated in the old "rva" way.

Thanks Mike for drawing attention to this!

Which pipeline is running these tests?
I am thinking about ways to improve test coverage for PRs like this, so that we can catch such regressions earlier.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

These failing tests are part of the diagnostics repo. There is a manual way of running them against a local runtime build, but there currently no way for the runtime repo to use them. There is Jeremy created this issue dotnet/diagnostics#5213 to track this work.

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.

Thanks a lot for the pointers.

endif(CLR_CMAKE_HOST_OSX OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_HAIKU)
endif(CLR_CMAKE_HOST_APPLE OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_HAIKU)

if(CORECLR_SET_RPATH AND CLR_CMAKE_HOST_OSX AND CLR_CMAKE_HOST_ARCH_ARM64)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Has CLR_CMAKE_HOST_OSX been completed replaced by CLR_CMAKE_HOST_APPLE? If so, then the RPATH in the DAC isn't be added.

@hoyosjs

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Never mind. CLR_CMAKE_HOST_OSX is still defined if not maccatalyst.

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.

The idea is to use same parameters for all Apple platforms (macOS, iOS, tvOS) whenever possible. RPATH may still need some tweaks for each platform due to different bundle structure on macOS/MacCatalyst and iOS/tvOS.

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'll need to do another pass over the CLR_CMAKE_HOST_OSX usages. The RPath ones are likely wrong for some platforms. We don't produce packages for those platforms yet, so the code has never been tested. As for other occurrences - createdump is macOS only (but maybe MacCatalyst too?), guards in test code are likely unnecessary because _DARWIN_C_SOURCE is now set globally (to be verified).

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Mar 8, 2025
@filipnavara
filipnavara deleted the coreclr-ioslike-2 branch April 2, 2025 20:07
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issuescommunity-contributionIndicates that the PR has been added by a community memberos-maccatalystMacCatalyst OS

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Resolve TCP/IP EventPipe support on CoreCLR Android

12 participants

@filipnavara@janvorli@jkotas@ivanpovazan@kotlarmilos@matouskozak@vitek-karas@rolfbjarne@steveisok@akoeplinger@mikem8361@AaronRobinsonMSFT
, '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

Add support for building CoreCLR for MacCatalyst/iOS simulator - #109928

Merged
ivanpovazan merged 16 commits into
dotnet:mainfrom
filipnavara:coreclr-ioslike-2
Jan 24, 2025
Merged

Add support for building CoreCLR for MacCatalyst/iOS simulator#109928
ivanpovazan merged 16 commits into
dotnet:mainfrom
filipnavara:coreclr-ioslike-2

Conversation

@filipnavara

Copy link
Copy Markdown
Member

Re-open and rebase of #98127

Build instructions:

  • Build the runtime pack and tools: ./build.sh clr+clr.runtime+libs+packs -os [iossimulator/maccatalyst] -arch [x64/arm64] -cross -c Release
  • Run the sample app: ./dotnet.sh publish src/mono/sample/iOS/Program.csproj -c Release /p:TargetOS=maccatalyst /p:TargetArchitecture=arm64 /p:DeployAndRun=true /p:UseMonoRuntime=false /p:RunAOTCompilation=false /p:MonoForceInterpreter=false

Related work:

Notably, this doesn't include CI scripts to build this or the runtime packs. I am open to suggestions on how to better split this into more digestible/reviewable chunks.

@ghostghost added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Nov 18, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Nov 18, 2024
Comment threadsrc/coreclr/hosts/inc/coreclrhost.h Outdated
Comment threadsrc/coreclr/pal/src/CMakeLists.txt Outdated
Comment threadsrc/coreclr/pal/src/include/pal/dbgmsg.h
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/native/corehost/hostpolicy/hostpolicy_context.cpp Outdated
Comment threadsrc/native/libs/System.Native/entrypoints.c Outdated
Comment threadsrc/native/libs/System.Security.Cryptography.Native.Apple/entrypoints.c Outdated
Comment threadsrc/native/libs/System.Security.Cryptography.Native.Apple/entrypoints.c Outdated
# add the install targets
install_clr(TARGETS coreclr DESTINATIONS . sharedFramework COMPONENT runtime)
if(CLR_CMAKE_HOST_MACCATALYST OR CLR_CMAKE_HOST_IOS)
install_clr(TARGETS coreclr_static DESTINATIONS . sharedFramework COMPONENT runtime)

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 do we need to install this?

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.

iOS generally restricts linking to static libraries or dynamic frameworks distributed with the app itself. The aim was to include statically built CoreCLR in the runtime pack.

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.

I wonder if that means that the single file is the only deployment mechanism on iOS. If it is the case, then I am not sure what would be the scenario where developers would explicitly use the static version of coreclr.

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.

Linking with a static library typically results in smaller apps, which is why we've always linked Mono statically by default.

Linking dynamically can make the build a little bit faster (from past experience in Xamarin, we never ported this to .NET when we migrated due to time constraints).

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.

The single file is a host statically linked to all the native libraries including coreclr. The scenario when the developers would need static coreclr library would be when they want to use their own host. Thinking about it more, I guess distributing the static coreclr version actually makes sense to enable such scenarios.

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.

Yes, that sounds like what we want.

Note that .dylib won't do (Apple doesn't allow them in iOS apps), each dynamic library has to be made into a .framework (which works).

FWIW Apple has recommended using no more than 6-8 .frameworks because otherwise it affects startup performance.

Comment threadsrc/coreclr/hosts/inc/coreclrhost.h Outdated
Comment threadsrc/coreclr/pal/src/exception/seh-unwind.cpp Outdated
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/coreclr/pal/src/misc/dbgmsg.cpp
Comment threadsrc/native/corehost/apphost/static/CMakeLists.txt Outdated
Comment threadsrc/native/libs/System.Globalization.Native/CMakeLists.txt Outdated
Comment threadsrc/native/libs/System.Native/entrypoints.c Outdated
Comment threadsrc/tests/build.proj Outdated
@ivanpovazan

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@filipnavara

Copy link
Copy Markdown
MemberAuthor

CI has few timeouts and couple of known issues but the rest passed.

@matouskozak

Copy link
Copy Markdown
Member

CI has few timeouts and couple of known issues but the rest passed.

I've triggered re-run for the failing ones to hopefully remove any infrastructure noise (the timeouts were on jobs that usually don't time out)

@ivanpovazanivanpovazan left a 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.

LGTM! Thanks a lot for all the hard work!

I resolved all my comments related to build integration files and sample changes as I will cover them in a separate PR as part of: #111745

@steveisoksteveisok left a 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.

Thanks!

@kotlarmiloskotlarmilos left a 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.

LGTM!

@kotlarmilos

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
Member

The official builds have passed.

@akoeplingerakoeplinger left a 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.

LGTM apart from two small comments that can be addressed in a follow-up PR, thanks!


#import "util.h"

#define APPLE_RUNTIME_IDENTIFIER "iossimulator-arm64"

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.

this should use the template string like runtime.m

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.

Good catch. I assume we can handle that as part of the follow-ups tracked in #111745.

INT cbErrorMessageBuffer,
bool serialize)
{
#if defined(TARGET_IOS)

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.

we should disable this on tvos too

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 didn't enable tvOS in this PR. It requires more work and testing due to lack of Mach signal API.

(Previous versions of this PR enabled the tvOS compilation at one point. I may resubmit them separately at some point for a more thorough review. Mixing them with the rest of the iOS bring up made it unreviewable.)

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.

yes I just wanted to call out so we don't forget to update this spot

@ivanpovazan
ivanpovazan merged commit 717d3b1 into dotnet:mainJan 24, 2025
@vitek-karas

Copy link
Copy Markdown
Member

Thanks a lot Filip - this was a lot of work!!!

add_dependencies(daccess eventing_headers)

if(CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS)
if(CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_APPLE)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@hoyosjs, I think it was this change that broke debugging/diagnostics repo tests on MacOS x64. Adding CLR_CMAKE_HOST_APPLE here will cause the runtime DAC table to be generated in the old "rva" way.

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 don't think the change was intentional. I traced it back to the first commit on my previous branch but it could have been a result of some rebase.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you want to remove/fix this?

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.

Seems like at some point after the initial patch the conditional compilation of machoreader.cpp was added. This still uses the old CLR_CMAKE_TARGET_OSX condition. I'll send a PR to fix this.

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.

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.

@hoyosjs, I think it was this change that broke debugging/diagnostics repo tests on MacOS x64. Adding CLR_CMAKE_HOST_APPLE here will cause the runtime DAC table to be generated in the old "rva" way.

Thanks Mike for drawing attention to this!

Which pipeline is running these tests?
I am thinking about ways to improve test coverage for PRs like this, so that we can catch such regressions earlier.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

These failing tests are part of the diagnostics repo. There is a manual way of running them against a local runtime build, but there currently no way for the runtime repo to use them. There is Jeremy created this issue dotnet/diagnostics#5213 to track this work.

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.

Thanks a lot for the pointers.

endif(CLR_CMAKE_HOST_OSX OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_HAIKU)
endif(CLR_CMAKE_HOST_APPLE OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_HAIKU)

if(CORECLR_SET_RPATH AND CLR_CMAKE_HOST_OSX AND CLR_CMAKE_HOST_ARCH_ARM64)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Has CLR_CMAKE_HOST_OSX been completed replaced by CLR_CMAKE_HOST_APPLE? If so, then the RPATH in the DAC isn't be added.

@hoyosjs

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Never mind. CLR_CMAKE_HOST_OSX is still defined if not maccatalyst.

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.

The idea is to use same parameters for all Apple platforms (macOS, iOS, tvOS) whenever possible. RPATH may still need some tweaks for each platform due to different bundle structure on macOS/MacCatalyst and iOS/tvOS.

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'll need to do another pass over the CLR_CMAKE_HOST_OSX usages. The RPath ones are likely wrong for some platforms. We don't produce packages for those platforms yet, so the code has never been tested. As for other occurrences - createdump is macOS only (but maybe MacCatalyst too?), guards in test code are likely unnecessary because _DARWIN_C_SOURCE is now set globally (to be verified).

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Mar 8, 2025
@filipnavara
filipnavara deleted the coreclr-ioslike-2 branch April 2, 2025 20:07
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issuescommunity-contributionIndicates that the PR has been added by a community memberos-maccatalystMacCatalyst OS

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Resolve TCP/IP EventPipe support on CoreCLR Android

12 participants

@filipnavara@janvorli@jkotas@ivanpovazan@kotlarmilos@matouskozak@vitek-karas@rolfbjarne@steveisok@akoeplinger@mikem8361@AaronRobinsonMSFT
, '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

Add support for building CoreCLR for MacCatalyst/iOS simulator - #109928

Merged
ivanpovazan merged 16 commits into
dotnet:mainfrom
filipnavara:coreclr-ioslike-2
Jan 24, 2025
Merged

Add support for building CoreCLR for MacCatalyst/iOS simulator#109928
ivanpovazan merged 16 commits into
dotnet:mainfrom
filipnavara:coreclr-ioslike-2

Conversation

@filipnavara

Copy link
Copy Markdown
Member

Re-open and rebase of #98127

Build instructions:

  • Build the runtime pack and tools: ./build.sh clr+clr.runtime+libs+packs -os [iossimulator/maccatalyst] -arch [x64/arm64] -cross -c Release
  • Run the sample app: ./dotnet.sh publish src/mono/sample/iOS/Program.csproj -c Release /p:TargetOS=maccatalyst /p:TargetArchitecture=arm64 /p:DeployAndRun=true /p:UseMonoRuntime=false /p:RunAOTCompilation=false /p:MonoForceInterpreter=false

Related work:

Notably, this doesn't include CI scripts to build this or the runtime packs. I am open to suggestions on how to better split this into more digestible/reviewable chunks.

@ghostghost added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Nov 18, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Nov 18, 2024
Comment threadsrc/coreclr/hosts/inc/coreclrhost.h Outdated
Comment threadsrc/coreclr/pal/src/CMakeLists.txt Outdated
Comment threadsrc/coreclr/pal/src/include/pal/dbgmsg.h
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/native/corehost/hostpolicy/hostpolicy_context.cpp Outdated
Comment threadsrc/native/libs/System.Native/entrypoints.c Outdated
Comment threadsrc/native/libs/System.Security.Cryptography.Native.Apple/entrypoints.c Outdated
Comment threadsrc/native/libs/System.Security.Cryptography.Native.Apple/entrypoints.c Outdated
# add the install targets
install_clr(TARGETS coreclr DESTINATIONS . sharedFramework COMPONENT runtime)
if(CLR_CMAKE_HOST_MACCATALYST OR CLR_CMAKE_HOST_IOS)
install_clr(TARGETS coreclr_static DESTINATIONS . sharedFramework COMPONENT runtime)

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 do we need to install this?

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.

iOS generally restricts linking to static libraries or dynamic frameworks distributed with the app itself. The aim was to include statically built CoreCLR in the runtime pack.

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.

I wonder if that means that the single file is the only deployment mechanism on iOS. If it is the case, then I am not sure what would be the scenario where developers would explicitly use the static version of coreclr.

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.

Linking with a static library typically results in smaller apps, which is why we've always linked Mono statically by default.

Linking dynamically can make the build a little bit faster (from past experience in Xamarin, we never ported this to .NET when we migrated due to time constraints).

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.

The single file is a host statically linked to all the native libraries including coreclr. The scenario when the developers would need static coreclr library would be when they want to use their own host. Thinking about it more, I guess distributing the static coreclr version actually makes sense to enable such scenarios.

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.

Yes, that sounds like what we want.

Note that .dylib won't do (Apple doesn't allow them in iOS apps), each dynamic library has to be made into a .framework (which works).

FWIW Apple has recommended using no more than 6-8 .frameworks because otherwise it affects startup performance.

Comment threadsrc/coreclr/hosts/inc/coreclrhost.h Outdated
Comment threadsrc/coreclr/pal/src/exception/seh-unwind.cpp Outdated
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/coreclr/pal/src/map/virtual.cpp Outdated
Comment threadsrc/coreclr/pal/src/misc/dbgmsg.cpp
Comment threadsrc/native/corehost/apphost/static/CMakeLists.txt Outdated
Comment threadsrc/native/libs/System.Globalization.Native/CMakeLists.txt Outdated
Comment threadsrc/native/libs/System.Native/entrypoints.c Outdated
Comment threadsrc/tests/build.proj Outdated
@ivanpovazan

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@filipnavara

Copy link
Copy Markdown
MemberAuthor

CI has few timeouts and couple of known issues but the rest passed.

@matouskozak

Copy link
Copy Markdown
Member

CI has few timeouts and couple of known issues but the rest passed.

I've triggered re-run for the failing ones to hopefully remove any infrastructure noise (the timeouts were on jobs that usually don't time out)

@ivanpovazanivanpovazan left a 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.

LGTM! Thanks a lot for all the hard work!

I resolved all my comments related to build integration files and sample changes as I will cover them in a separate PR as part of: #111745

@steveisoksteveisok left a 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.

Thanks!

@kotlarmiloskotlarmilos left a 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.

LGTM!

@kotlarmilos

Copy link
Copy Markdown
Member

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@kotlarmilos

Copy link
Copy Markdown
Member

The official builds have passed.

@akoeplingerakoeplinger left a 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.

LGTM apart from two small comments that can be addressed in a follow-up PR, thanks!


#import "util.h"

#define APPLE_RUNTIME_IDENTIFIER "iossimulator-arm64"

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.

this should use the template string like runtime.m

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.

Good catch. I assume we can handle that as part of the follow-ups tracked in #111745.

INT cbErrorMessageBuffer,
bool serialize)
{
#if defined(TARGET_IOS)

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.

we should disable this on tvos too

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 didn't enable tvOS in this PR. It requires more work and testing due to lack of Mach signal API.

(Previous versions of this PR enabled the tvOS compilation at one point. I may resubmit them separately at some point for a more thorough review. Mixing them with the rest of the iOS bring up made it unreviewable.)

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.

yes I just wanted to call out so we don't forget to update this spot

@ivanpovazan
ivanpovazan merged commit 717d3b1 into dotnet:mainJan 24, 2025
@vitek-karas

Copy link
Copy Markdown
Member

Thanks a lot Filip - this was a lot of work!!!

add_dependencies(daccess eventing_headers)

if(CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS)
if(CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_APPLE)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@hoyosjs, I think it was this change that broke debugging/diagnostics repo tests on MacOS x64. Adding CLR_CMAKE_HOST_APPLE here will cause the runtime DAC table to be generated in the old "rva" way.

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 don't think the change was intentional. I traced it back to the first commit on my previous branch but it could have been a result of some rebase.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Do you want to remove/fix this?

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.

Seems like at some point after the initial patch the conditional compilation of machoreader.cpp was added. This still uses the old CLR_CMAKE_TARGET_OSX condition. I'll send a PR to fix this.

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.

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.

@hoyosjs, I think it was this change that broke debugging/diagnostics repo tests on MacOS x64. Adding CLR_CMAKE_HOST_APPLE here will cause the runtime DAC table to be generated in the old "rva" way.

Thanks Mike for drawing attention to this!

Which pipeline is running these tests?
I am thinking about ways to improve test coverage for PRs like this, so that we can catch such regressions earlier.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

These failing tests are part of the diagnostics repo. There is a manual way of running them against a local runtime build, but there currently no way for the runtime repo to use them. There is Jeremy created this issue dotnet/diagnostics#5213 to track this work.

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.

Thanks a lot for the pointers.

endif(CLR_CMAKE_HOST_OSX OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_HAIKU)
endif(CLR_CMAKE_HOST_APPLE OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_HAIKU)

if(CORECLR_SET_RPATH AND CLR_CMAKE_HOST_OSX AND CLR_CMAKE_HOST_ARCH_ARM64)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Has CLR_CMAKE_HOST_OSX been completed replaced by CLR_CMAKE_HOST_APPLE? If so, then the RPATH in the DAC isn't be added.

@hoyosjs

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Never mind. CLR_CMAKE_HOST_OSX is still defined if not maccatalyst.

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.

The idea is to use same parameters for all Apple platforms (macOS, iOS, tvOS) whenever possible. RPATH may still need some tweaks for each platform due to different bundle structure on macOS/MacCatalyst and iOS/tvOS.

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'll need to do another pass over the CLR_CMAKE_HOST_OSX usages. The RPath ones are likely wrong for some platforms. We don't produce packages for those platforms yet, so the code has never been tested. As for other occurrences - createdump is macOS only (but maybe MacCatalyst too?), guards in test code are likely unnecessary because _DARWIN_C_SOURCE is now set globally (to be verified).

@github-actionsgithub-actionsBot locked and limited conversation to collaborators Mar 8, 2025
@filipnavara
filipnavara deleted the coreclr-ioslike-2 branch April 2, 2025 20:07
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issuescommunity-contributionIndicates that the PR has been added by a community memberos-maccatalystMacCatalyst OS

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Resolve TCP/IP EventPipe support on CoreCLR Android

12 participants

@filipnavara@janvorli@jkotas@ivanpovazan@kotlarmilos@matouskozak@vitek-karas@rolfbjarne@steveisok@akoeplinger@mikem8361@AaronRobinsonMSFT