[nativeaot] Add Native AOT cross-build support for iOS-like platforms - #88242

Merged
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:feature/nativeaot-cross-build
Jul 11, 2023
Merged

[nativeaot] Add Native AOT cross-build support for iOS-like platforms#88242
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:feature/nativeaot-cross-build

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Jun 30, 2023

Copy link
Copy Markdown
Member

This PR adds support for the Native AOT cross-build targeting iOS-like platforms. When building for the target platforms, only the jitinterface component is installed, while clrjit is skipped since it is not required for the target platform. The jitinterface, aotsdk, and native libraries components are built for the target platforms, while jitinterface and clrjit components are built for the host as cross-components.

Additionally, this PR makes the cross build path to be a constant (/host), to allow both cross-arch and cross-os scenarios. Previously, the path was architecture-specific and did not support cross-os scenarios where the target and host architectures are the same.

The updated cross build path caused a lot of regressions and would require updating the tests to match the new path. The idea is to use the architecture-specific path in the cross-os scenarios as well.

It should unblock #87260 and #87773.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

This PR adds support for the Native AOT cross-build targeting iOS-like platforms. When building for the target platforms, only the jitinterface component is installed, while clrjit is skipped since it is not required for the target platform. The jitinterface, aotsdk, and native libraries components are built for the target platforms, while jitinterface and clrjit components are built for the host as cross-components.

Additionally, this PR makes the cross build path to be a constant (/host), to allow both cross-arch and cross-os scenarios. Previously, the path was architecture-specific and did not support cross-os scenarios where the target and host architectures are the same.

It should unblock #87260 and #87773.

Author:kotlarmilos
Assignees:kotlarmilos
Labels:

area-NativeAOT-coreclr

Milestone:8.0.0

Comment threadsrc/coreclr/build-runtime.sh Outdated
__ConfigTriplet="linux.$__TargetArch.$__BuildType"
fi
if [[ ! -z "$__OutputRIDOS" ]]; then
__ConfigTriplet="$__OutputRIDOS.$__TargetArch.$__BuildType"

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.

Instead of introducing this override for output path, would it be better to keep the compiler in its default path and invoke it from there?

@kotlarmiloskotlarmilosJul 10, 2023

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.

In that case, the default path for the cross-compiler is $(TargetOS).$(TargetArchitecture).$(Configuration)/$(BuildArchitecture), while the jitinterface and clrjit cross-components are generated in $(HostOS).$(TargetArchitecture).$(Configuration)/$(BuildArchitecture), and these components cannot be found.

<CoreCLRArtifactsPathCondition="'$(CoreCLRArtifactsPath)' == ''">$(RuntimeBinDir)$(CrossHostArch)</CoreCLRArtifactsPath>

When building cross-components for cross-arch scenarios, the DCLR_CMAKE_TARGET_ARCH is used for the output path.

if [[ "$__TargetArch"!="$__HostArch" ]];then
__CMakeArgs="-DCLR_CMAKE_TARGET_ARCH=$__TargetArch$__CMakeArgs"
fi

One approach that I will try is to introduce the -hostos parameter along with -hostarch to indicate the target platform for the cross-components build. Another approach would be to adjust the components path in the _crossarch projects.

@MichalStrehovskyMichalStrehovsky 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.

Looks good otherwise! Thanks for cleaning it up!

Comment threadeng/Subsets.props Outdated
Category="clr" />
</ItemGroup>

<!-- Build the CoreCLR cross tools when we're doing a cross OS build for apple device targets -->

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.

Could this be folded into the above Build the CoreCLR cross tools when we're doing a cross build block? We currently exclude it with '$(TargetsMobile)' != 'true' but it looks pretty much the same. The additional TargetOS and OutputRIDOS properties will probably not harm anything if we add them.

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 think so. Initially, I didn't want to extend the cross-build for unsupported scenarios.

Comment threadeng/Subsets.props Outdated

<ProjectToBuild Condition="'$(NativeAotSupported)' == 'true' and ('$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)')" Include="$(CoreClrProjectRoot)tools\aot\ILCompiler\ILCompiler_crossarch.csproj" Category="clr" />
<ProjectToBuild Condition="'$(TargetArchitecture)' != '$(BuildArchitecture)'" Include="$(CoreClrProjectRoot)tools\aot\crossgen2\crossgen2_crossarch.csproj" Category="clr" />
<ProjectToBuild Condition="'$(NativeAotSupported)' == 'true' and ('$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)' or ('$(HostOS)' != '$(TargetOS)' and '$(TargetsAppleMobile)' == 'true'))" Include="$(CoreClrProjectRoot)tools\aot\ILCompiler\ILCompiler_crossarch.csproj" Category="clr" />

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.

Do we need the '$(TargetsAppleMobile)' == 'true' condition here and below? It feels like extending it to HostOS != TargetOS should be general goodness.

Comment threadeng/build.sh Outdated
Comment threadeng/liveBuilds.targets Outdated
<CoreCLRCrossgen2Dir>$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', 'crossgen2'))</CoreCLRCrossgen2Dir>
<CoreCLRILCompilerDir>$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', 'ilc-published'))</CoreCLRILCompilerDir>
<CoreCLRCrossILCompilerDir Condition="'$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)'">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', '$(BuildArchitecture)', 'ilc'))</CoreCLRCrossILCompilerDir>
<CoreCLRCrossILCompilerDir Condition="'$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)' or ('$(HostOS)' != '$(TargetOS)' and '$(TargetsAppleMobile)' == 'true')">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', '$(BuildArchitecture)', 'ilc'))</CoreCLRCrossILCompilerDir>

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.

Same question about the TargetsAppleMobile condition.

Comment threadeng/liveBuilds.targets Outdated
<CoreCLRSharedFrameworkPdbDir>$([MSBuild]::NormalizeDirectory('$(CoreCLRSharedFrameworkDir)','PDB'))</CoreCLRSharedFrameworkPdbDir>
<CoreCLRCrossTargetComponentDir
Condition="'$(CoreCLRCrossTargetComponentDirName)' != ''">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','$(CoreCLRCrossTargetComponentDirName)','sharedFramework'))</CoreCLRCrossTargetComponentDir>
Condition="'$(CoreCLRCrossTargetComponentDirName)' != ''">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','$(BuildArchitecture)','sharedFramework'))</CoreCLRCrossTargetComponentDir>

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 this change (I was not able to find a use of this property that looked relevant)?

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.

Not needed, it was a temporary change.


<ItemGroup>
<LinkerArg Include="--target=$(TargetTriple)" Condition="'$(TargetOS)' != 'osx' and '$(TargetTriple)' != ''" />
<LinkerArg Include="--target=$(TargetTriple)" Condition="'$(TargetOS)' != 'osx' and '$(TargetsAppleMobile)' != 'true' and '$(TargetTriple)' != ''" />

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.

Would this work?

Suggested change
<LinkerArgInclude="--target=$(TargetTriple)"Condition="'$(TargetOS)' != 'osx' and '$(TargetsAppleMobile)' != 'true' and '$(TargetTriple)' != ''" />
<LinkerArgInclude="--target=$(TargetTriple)"Condition="'$(_IsApplePlatform)' != 'true' and '$(TargetTriple)' != ''" />

kotlarmilosand others added 2 commits July 10, 2023 16:15
Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com>

@MichalStrehovskyMichalStrehovsky 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.

Looks good, thank you! Cc @jkoritzinsky

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

echo "Error: Unknown Android architecture $hostArch."
exit 1
fi
elif [[ "$__TargetOS" == iossimulator ]]; then

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.

@akoeplinger it looks like the $__TargetOS was used by mistake instead of $targetOS, please check.

@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.

LGTM!

@ghostghost locked as resolved and limited conversation to collaborators Aug 13, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@kotlarmilos@steveisok@jkoritzinsky@jkotas@MichalStrehovsky
, '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

[nativeaot] Add Native AOT cross-build support for iOS-like platforms - #88242

Merged
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:feature/nativeaot-cross-build
Jul 11, 2023
Merged

[nativeaot] Add Native AOT cross-build support for iOS-like platforms#88242
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:feature/nativeaot-cross-build

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Jun 30, 2023

Copy link
Copy Markdown
Member

This PR adds support for the Native AOT cross-build targeting iOS-like platforms. When building for the target platforms, only the jitinterface component is installed, while clrjit is skipped since it is not required for the target platform. The jitinterface, aotsdk, and native libraries components are built for the target platforms, while jitinterface and clrjit components are built for the host as cross-components.

Additionally, this PR makes the cross build path to be a constant (/host), to allow both cross-arch and cross-os scenarios. Previously, the path was architecture-specific and did not support cross-os scenarios where the target and host architectures are the same.

The updated cross build path caused a lot of regressions and would require updating the tests to match the new path. The idea is to use the architecture-specific path in the cross-os scenarios as well.

It should unblock #87260 and #87773.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

This PR adds support for the Native AOT cross-build targeting iOS-like platforms. When building for the target platforms, only the jitinterface component is installed, while clrjit is skipped since it is not required for the target platform. The jitinterface, aotsdk, and native libraries components are built for the target platforms, while jitinterface and clrjit components are built for the host as cross-components.

Additionally, this PR makes the cross build path to be a constant (/host), to allow both cross-arch and cross-os scenarios. Previously, the path was architecture-specific and did not support cross-os scenarios where the target and host architectures are the same.

It should unblock #87260 and #87773.

Author:kotlarmilos
Assignees:kotlarmilos
Labels:

area-NativeAOT-coreclr

Milestone:8.0.0

Comment threadsrc/coreclr/build-runtime.sh Outdated
__ConfigTriplet="linux.$__TargetArch.$__BuildType"
fi
if [[ ! -z "$__OutputRIDOS" ]]; then
__ConfigTriplet="$__OutputRIDOS.$__TargetArch.$__BuildType"

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.

Instead of introducing this override for output path, would it be better to keep the compiler in its default path and invoke it from there?

@kotlarmiloskotlarmilosJul 10, 2023

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.

In that case, the default path for the cross-compiler is $(TargetOS).$(TargetArchitecture).$(Configuration)/$(BuildArchitecture), while the jitinterface and clrjit cross-components are generated in $(HostOS).$(TargetArchitecture).$(Configuration)/$(BuildArchitecture), and these components cannot be found.

<CoreCLRArtifactsPathCondition="'$(CoreCLRArtifactsPath)' == ''">$(RuntimeBinDir)$(CrossHostArch)</CoreCLRArtifactsPath>

When building cross-components for cross-arch scenarios, the DCLR_CMAKE_TARGET_ARCH is used for the output path.

if [[ "$__TargetArch"!="$__HostArch" ]];then
__CMakeArgs="-DCLR_CMAKE_TARGET_ARCH=$__TargetArch$__CMakeArgs"
fi

One approach that I will try is to introduce the -hostos parameter along with -hostarch to indicate the target platform for the cross-components build. Another approach would be to adjust the components path in the _crossarch projects.

@MichalStrehovskyMichalStrehovsky 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.

Looks good otherwise! Thanks for cleaning it up!

Comment threadeng/Subsets.props Outdated
Category="clr" />
</ItemGroup>

<!-- Build the CoreCLR cross tools when we're doing a cross OS build for apple device targets -->

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.

Could this be folded into the above Build the CoreCLR cross tools when we're doing a cross build block? We currently exclude it with '$(TargetsMobile)' != 'true' but it looks pretty much the same. The additional TargetOS and OutputRIDOS properties will probably not harm anything if we add them.

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 think so. Initially, I didn't want to extend the cross-build for unsupported scenarios.

Comment threadeng/Subsets.props Outdated

<ProjectToBuild Condition="'$(NativeAotSupported)' == 'true' and ('$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)')" Include="$(CoreClrProjectRoot)tools\aot\ILCompiler\ILCompiler_crossarch.csproj" Category="clr" />
<ProjectToBuild Condition="'$(TargetArchitecture)' != '$(BuildArchitecture)'" Include="$(CoreClrProjectRoot)tools\aot\crossgen2\crossgen2_crossarch.csproj" Category="clr" />
<ProjectToBuild Condition="'$(NativeAotSupported)' == 'true' and ('$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)' or ('$(HostOS)' != '$(TargetOS)' and '$(TargetsAppleMobile)' == 'true'))" Include="$(CoreClrProjectRoot)tools\aot\ILCompiler\ILCompiler_crossarch.csproj" Category="clr" />

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.

Do we need the '$(TargetsAppleMobile)' == 'true' condition here and below? It feels like extending it to HostOS != TargetOS should be general goodness.

Comment threadeng/build.sh Outdated
Comment threadeng/liveBuilds.targets Outdated
<CoreCLRCrossgen2Dir>$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', 'crossgen2'))</CoreCLRCrossgen2Dir>
<CoreCLRILCompilerDir>$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', 'ilc-published'))</CoreCLRILCompilerDir>
<CoreCLRCrossILCompilerDir Condition="'$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)'">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', '$(BuildArchitecture)', 'ilc'))</CoreCLRCrossILCompilerDir>
<CoreCLRCrossILCompilerDir Condition="'$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)' or ('$(HostOS)' != '$(TargetOS)' and '$(TargetsAppleMobile)' == 'true')">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', '$(BuildArchitecture)', 'ilc'))</CoreCLRCrossILCompilerDir>

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.

Same question about the TargetsAppleMobile condition.

Comment threadeng/liveBuilds.targets Outdated
<CoreCLRSharedFrameworkPdbDir>$([MSBuild]::NormalizeDirectory('$(CoreCLRSharedFrameworkDir)','PDB'))</CoreCLRSharedFrameworkPdbDir>
<CoreCLRCrossTargetComponentDir
Condition="'$(CoreCLRCrossTargetComponentDirName)' != ''">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','$(CoreCLRCrossTargetComponentDirName)','sharedFramework'))</CoreCLRCrossTargetComponentDir>
Condition="'$(CoreCLRCrossTargetComponentDirName)' != ''">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','$(BuildArchitecture)','sharedFramework'))</CoreCLRCrossTargetComponentDir>

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 this change (I was not able to find a use of this property that looked relevant)?

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.

Not needed, it was a temporary change.


<ItemGroup>
<LinkerArg Include="--target=$(TargetTriple)" Condition="'$(TargetOS)' != 'osx' and '$(TargetTriple)' != ''" />
<LinkerArg Include="--target=$(TargetTriple)" Condition="'$(TargetOS)' != 'osx' and '$(TargetsAppleMobile)' != 'true' and '$(TargetTriple)' != ''" />

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.

Would this work?

Suggested change
<LinkerArgInclude="--target=$(TargetTriple)"Condition="'$(TargetOS)' != 'osx' and '$(TargetsAppleMobile)' != 'true' and '$(TargetTriple)' != ''" />
<LinkerArgInclude="--target=$(TargetTriple)"Condition="'$(_IsApplePlatform)' != 'true' and '$(TargetTriple)' != ''" />

kotlarmilosand others added 2 commits July 10, 2023 16:15
Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com>

@MichalStrehovskyMichalStrehovsky 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.

Looks good, thank you! Cc @jkoritzinsky

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

echo "Error: Unknown Android architecture $hostArch."
exit 1
fi
elif [[ "$__TargetOS" == iossimulator ]]; then

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.

@akoeplinger it looks like the $__TargetOS was used by mistake instead of $targetOS, please check.

@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.

LGTM!

@ghostghost locked as resolved and limited conversation to collaborators Aug 13, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@kotlarmilos@steveisok@jkoritzinsky@jkotas@MichalStrehovsky
, '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

[nativeaot] Add Native AOT cross-build support for iOS-like platforms - #88242

Merged
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:feature/nativeaot-cross-build
Jul 11, 2023
Merged

[nativeaot] Add Native AOT cross-build support for iOS-like platforms#88242
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:feature/nativeaot-cross-build

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Jun 30, 2023

Copy link
Copy Markdown
Member

This PR adds support for the Native AOT cross-build targeting iOS-like platforms. When building for the target platforms, only the jitinterface component is installed, while clrjit is skipped since it is not required for the target platform. The jitinterface, aotsdk, and native libraries components are built for the target platforms, while jitinterface and clrjit components are built for the host as cross-components.

Additionally, this PR makes the cross build path to be a constant (/host), to allow both cross-arch and cross-os scenarios. Previously, the path was architecture-specific and did not support cross-os scenarios where the target and host architectures are the same.

The updated cross build path caused a lot of regressions and would require updating the tests to match the new path. The idea is to use the architecture-specific path in the cross-os scenarios as well.

It should unblock #87260 and #87773.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

This PR adds support for the Native AOT cross-build targeting iOS-like platforms. When building for the target platforms, only the jitinterface component is installed, while clrjit is skipped since it is not required for the target platform. The jitinterface, aotsdk, and native libraries components are built for the target platforms, while jitinterface and clrjit components are built for the host as cross-components.

Additionally, this PR makes the cross build path to be a constant (/host), to allow both cross-arch and cross-os scenarios. Previously, the path was architecture-specific and did not support cross-os scenarios where the target and host architectures are the same.

It should unblock #87260 and #87773.

Author:kotlarmilos
Assignees:kotlarmilos
Labels:

area-NativeAOT-coreclr

Milestone:8.0.0

Comment threadsrc/coreclr/build-runtime.sh Outdated
__ConfigTriplet="linux.$__TargetArch.$__BuildType"
fi
if [[ ! -z "$__OutputRIDOS" ]]; then
__ConfigTriplet="$__OutputRIDOS.$__TargetArch.$__BuildType"

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.

Instead of introducing this override for output path, would it be better to keep the compiler in its default path and invoke it from there?

@kotlarmiloskotlarmilosJul 10, 2023

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.

In that case, the default path for the cross-compiler is $(TargetOS).$(TargetArchitecture).$(Configuration)/$(BuildArchitecture), while the jitinterface and clrjit cross-components are generated in $(HostOS).$(TargetArchitecture).$(Configuration)/$(BuildArchitecture), and these components cannot be found.

<CoreCLRArtifactsPathCondition="'$(CoreCLRArtifactsPath)' == ''">$(RuntimeBinDir)$(CrossHostArch)</CoreCLRArtifactsPath>

When building cross-components for cross-arch scenarios, the DCLR_CMAKE_TARGET_ARCH is used for the output path.

if [[ "$__TargetArch"!="$__HostArch" ]];then
__CMakeArgs="-DCLR_CMAKE_TARGET_ARCH=$__TargetArch$__CMakeArgs"
fi

One approach that I will try is to introduce the -hostos parameter along with -hostarch to indicate the target platform for the cross-components build. Another approach would be to adjust the components path in the _crossarch projects.

@MichalStrehovskyMichalStrehovsky 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.

Looks good otherwise! Thanks for cleaning it up!

Comment threadeng/Subsets.props Outdated
Category="clr" />
</ItemGroup>

<!-- Build the CoreCLR cross tools when we're doing a cross OS build for apple device targets -->

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.

Could this be folded into the above Build the CoreCLR cross tools when we're doing a cross build block? We currently exclude it with '$(TargetsMobile)' != 'true' but it looks pretty much the same. The additional TargetOS and OutputRIDOS properties will probably not harm anything if we add them.

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 think so. Initially, I didn't want to extend the cross-build for unsupported scenarios.

Comment threadeng/Subsets.props Outdated

<ProjectToBuild Condition="'$(NativeAotSupported)' == 'true' and ('$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)')" Include="$(CoreClrProjectRoot)tools\aot\ILCompiler\ILCompiler_crossarch.csproj" Category="clr" />
<ProjectToBuild Condition="'$(TargetArchitecture)' != '$(BuildArchitecture)'" Include="$(CoreClrProjectRoot)tools\aot\crossgen2\crossgen2_crossarch.csproj" Category="clr" />
<ProjectToBuild Condition="'$(NativeAotSupported)' == 'true' and ('$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)' or ('$(HostOS)' != '$(TargetOS)' and '$(TargetsAppleMobile)' == 'true'))" Include="$(CoreClrProjectRoot)tools\aot\ILCompiler\ILCompiler_crossarch.csproj" Category="clr" />

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.

Do we need the '$(TargetsAppleMobile)' == 'true' condition here and below? It feels like extending it to HostOS != TargetOS should be general goodness.

Comment threadeng/build.sh Outdated
Comment threadeng/liveBuilds.targets Outdated
<CoreCLRCrossgen2Dir>$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', 'crossgen2'))</CoreCLRCrossgen2Dir>
<CoreCLRILCompilerDir>$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', 'ilc-published'))</CoreCLRILCompilerDir>
<CoreCLRCrossILCompilerDir Condition="'$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)'">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', '$(BuildArchitecture)', 'ilc'))</CoreCLRCrossILCompilerDir>
<CoreCLRCrossILCompilerDir Condition="'$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)' or ('$(HostOS)' != '$(TargetOS)' and '$(TargetsAppleMobile)' == 'true')">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', '$(BuildArchitecture)', 'ilc'))</CoreCLRCrossILCompilerDir>

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.

Same question about the TargetsAppleMobile condition.

Comment threadeng/liveBuilds.targets Outdated
<CoreCLRSharedFrameworkPdbDir>$([MSBuild]::NormalizeDirectory('$(CoreCLRSharedFrameworkDir)','PDB'))</CoreCLRSharedFrameworkPdbDir>
<CoreCLRCrossTargetComponentDir
Condition="'$(CoreCLRCrossTargetComponentDirName)' != ''">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','$(CoreCLRCrossTargetComponentDirName)','sharedFramework'))</CoreCLRCrossTargetComponentDir>
Condition="'$(CoreCLRCrossTargetComponentDirName)' != ''">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','$(BuildArchitecture)','sharedFramework'))</CoreCLRCrossTargetComponentDir>

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 this change (I was not able to find a use of this property that looked relevant)?

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.

Not needed, it was a temporary change.


<ItemGroup>
<LinkerArg Include="--target=$(TargetTriple)" Condition="'$(TargetOS)' != 'osx' and '$(TargetTriple)' != ''" />
<LinkerArg Include="--target=$(TargetTriple)" Condition="'$(TargetOS)' != 'osx' and '$(TargetsAppleMobile)' != 'true' and '$(TargetTriple)' != ''" />

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.

Would this work?

Suggested change
<LinkerArgInclude="--target=$(TargetTriple)"Condition="'$(TargetOS)' != 'osx' and '$(TargetsAppleMobile)' != 'true' and '$(TargetTriple)' != ''" />
<LinkerArgInclude="--target=$(TargetTriple)"Condition="'$(_IsApplePlatform)' != 'true' and '$(TargetTriple)' != ''" />

kotlarmilosand others added 2 commits July 10, 2023 16:15
Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com>

@MichalStrehovskyMichalStrehovsky 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.

Looks good, thank you! Cc @jkoritzinsky

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

echo "Error: Unknown Android architecture $hostArch."
exit 1
fi
elif [[ "$__TargetOS" == iossimulator ]]; then

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.

@akoeplinger it looks like the $__TargetOS was used by mistake instead of $targetOS, please check.

@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.

LGTM!

@ghostghost locked as resolved and limited conversation to collaborators Aug 13, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@kotlarmilos@steveisok@jkoritzinsky@jkotas@MichalStrehovsky
, '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

[nativeaot] Add Native AOT cross-build support for iOS-like platforms - #88242

Merged
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:feature/nativeaot-cross-build
Jul 11, 2023
Merged

[nativeaot] Add Native AOT cross-build support for iOS-like platforms#88242
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:feature/nativeaot-cross-build

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Jun 30, 2023

Copy link
Copy Markdown
Member

This PR adds support for the Native AOT cross-build targeting iOS-like platforms. When building for the target platforms, only the jitinterface component is installed, while clrjit is skipped since it is not required for the target platform. The jitinterface, aotsdk, and native libraries components are built for the target platforms, while jitinterface and clrjit components are built for the host as cross-components.

Additionally, this PR makes the cross build path to be a constant (/host), to allow both cross-arch and cross-os scenarios. Previously, the path was architecture-specific and did not support cross-os scenarios where the target and host architectures are the same.

The updated cross build path caused a lot of regressions and would require updating the tests to match the new path. The idea is to use the architecture-specific path in the cross-os scenarios as well.

It should unblock #87260 and #87773.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

This PR adds support for the Native AOT cross-build targeting iOS-like platforms. When building for the target platforms, only the jitinterface component is installed, while clrjit is skipped since it is not required for the target platform. The jitinterface, aotsdk, and native libraries components are built for the target platforms, while jitinterface and clrjit components are built for the host as cross-components.

Additionally, this PR makes the cross build path to be a constant (/host), to allow both cross-arch and cross-os scenarios. Previously, the path was architecture-specific and did not support cross-os scenarios where the target and host architectures are the same.

It should unblock #87260 and #87773.

Author:kotlarmilos
Assignees:kotlarmilos
Labels:

area-NativeAOT-coreclr

Milestone:8.0.0

Comment threadsrc/coreclr/build-runtime.sh Outdated
__ConfigTriplet="linux.$__TargetArch.$__BuildType"
fi
if [[ ! -z "$__OutputRIDOS" ]]; then
__ConfigTriplet="$__OutputRIDOS.$__TargetArch.$__BuildType"

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.

Instead of introducing this override for output path, would it be better to keep the compiler in its default path and invoke it from there?

@kotlarmiloskotlarmilosJul 10, 2023

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.

In that case, the default path for the cross-compiler is $(TargetOS).$(TargetArchitecture).$(Configuration)/$(BuildArchitecture), while the jitinterface and clrjit cross-components are generated in $(HostOS).$(TargetArchitecture).$(Configuration)/$(BuildArchitecture), and these components cannot be found.

<CoreCLRArtifactsPathCondition="'$(CoreCLRArtifactsPath)' == ''">$(RuntimeBinDir)$(CrossHostArch)</CoreCLRArtifactsPath>

When building cross-components for cross-arch scenarios, the DCLR_CMAKE_TARGET_ARCH is used for the output path.

if [[ "$__TargetArch"!="$__HostArch" ]];then
__CMakeArgs="-DCLR_CMAKE_TARGET_ARCH=$__TargetArch$__CMakeArgs"
fi

One approach that I will try is to introduce the -hostos parameter along with -hostarch to indicate the target platform for the cross-components build. Another approach would be to adjust the components path in the _crossarch projects.

@MichalStrehovskyMichalStrehovsky 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.

Looks good otherwise! Thanks for cleaning it up!

Comment threadeng/Subsets.props Outdated
Category="clr" />
</ItemGroup>

<!-- Build the CoreCLR cross tools when we're doing a cross OS build for apple device targets -->

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.

Could this be folded into the above Build the CoreCLR cross tools when we're doing a cross build block? We currently exclude it with '$(TargetsMobile)' != 'true' but it looks pretty much the same. The additional TargetOS and OutputRIDOS properties will probably not harm anything if we add them.

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 think so. Initially, I didn't want to extend the cross-build for unsupported scenarios.

Comment threadeng/Subsets.props Outdated

<ProjectToBuild Condition="'$(NativeAotSupported)' == 'true' and ('$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)')" Include="$(CoreClrProjectRoot)tools\aot\ILCompiler\ILCompiler_crossarch.csproj" Category="clr" />
<ProjectToBuild Condition="'$(TargetArchitecture)' != '$(BuildArchitecture)'" Include="$(CoreClrProjectRoot)tools\aot\crossgen2\crossgen2_crossarch.csproj" Category="clr" />
<ProjectToBuild Condition="'$(NativeAotSupported)' == 'true' and ('$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)' or ('$(HostOS)' != '$(TargetOS)' and '$(TargetsAppleMobile)' == 'true'))" Include="$(CoreClrProjectRoot)tools\aot\ILCompiler\ILCompiler_crossarch.csproj" Category="clr" />

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.

Do we need the '$(TargetsAppleMobile)' == 'true' condition here and below? It feels like extending it to HostOS != TargetOS should be general goodness.

Comment threadeng/build.sh Outdated
Comment threadeng/liveBuilds.targets Outdated
<CoreCLRCrossgen2Dir>$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', 'crossgen2'))</CoreCLRCrossgen2Dir>
<CoreCLRILCompilerDir>$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', 'ilc-published'))</CoreCLRILCompilerDir>
<CoreCLRCrossILCompilerDir Condition="'$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)'">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', '$(BuildArchitecture)', 'ilc'))</CoreCLRCrossILCompilerDir>
<CoreCLRCrossILCompilerDir Condition="'$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)' or ('$(HostOS)' != '$(TargetOS)' and '$(TargetsAppleMobile)' == 'true')">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', '$(BuildArchitecture)', 'ilc'))</CoreCLRCrossILCompilerDir>

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.

Same question about the TargetsAppleMobile condition.

Comment threadeng/liveBuilds.targets Outdated
<CoreCLRSharedFrameworkPdbDir>$([MSBuild]::NormalizeDirectory('$(CoreCLRSharedFrameworkDir)','PDB'))</CoreCLRSharedFrameworkPdbDir>
<CoreCLRCrossTargetComponentDir
Condition="'$(CoreCLRCrossTargetComponentDirName)' != ''">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','$(CoreCLRCrossTargetComponentDirName)','sharedFramework'))</CoreCLRCrossTargetComponentDir>
Condition="'$(CoreCLRCrossTargetComponentDirName)' != ''">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','$(BuildArchitecture)','sharedFramework'))</CoreCLRCrossTargetComponentDir>

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 this change (I was not able to find a use of this property that looked relevant)?

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.

Not needed, it was a temporary change.


<ItemGroup>
<LinkerArg Include="--target=$(TargetTriple)" Condition="'$(TargetOS)' != 'osx' and '$(TargetTriple)' != ''" />
<LinkerArg Include="--target=$(TargetTriple)" Condition="'$(TargetOS)' != 'osx' and '$(TargetsAppleMobile)' != 'true' and '$(TargetTriple)' != ''" />

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.

Would this work?

Suggested change
<LinkerArgInclude="--target=$(TargetTriple)"Condition="'$(TargetOS)' != 'osx' and '$(TargetsAppleMobile)' != 'true' and '$(TargetTriple)' != ''" />
<LinkerArgInclude="--target=$(TargetTriple)"Condition="'$(_IsApplePlatform)' != 'true' and '$(TargetTriple)' != ''" />

kotlarmilosand others added 2 commits July 10, 2023 16:15
Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com>

@MichalStrehovskyMichalStrehovsky 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.

Looks good, thank you! Cc @jkoritzinsky

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

echo "Error: Unknown Android architecture $hostArch."
exit 1
fi
elif [[ "$__TargetOS" == iossimulator ]]; then

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.

@akoeplinger it looks like the $__TargetOS was used by mistake instead of $targetOS, please check.

@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.

LGTM!

@ghostghost locked as resolved and limited conversation to collaborators Aug 13, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@kotlarmilos@steveisok@jkoritzinsky@jkotas@MichalStrehovsky
, '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

[nativeaot] Add Native AOT cross-build support for iOS-like platforms - #88242

Merged
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:feature/nativeaot-cross-build
Jul 11, 2023
Merged

[nativeaot] Add Native AOT cross-build support for iOS-like platforms#88242
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:feature/nativeaot-cross-build

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Jun 30, 2023

Copy link
Copy Markdown
Member

This PR adds support for the Native AOT cross-build targeting iOS-like platforms. When building for the target platforms, only the jitinterface component is installed, while clrjit is skipped since it is not required for the target platform. The jitinterface, aotsdk, and native libraries components are built for the target platforms, while jitinterface and clrjit components are built for the host as cross-components.

Additionally, this PR makes the cross build path to be a constant (/host), to allow both cross-arch and cross-os scenarios. Previously, the path was architecture-specific and did not support cross-os scenarios where the target and host architectures are the same.

The updated cross build path caused a lot of regressions and would require updating the tests to match the new path. The idea is to use the architecture-specific path in the cross-os scenarios as well.

It should unblock #87260 and #87773.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

This PR adds support for the Native AOT cross-build targeting iOS-like platforms. When building for the target platforms, only the jitinterface component is installed, while clrjit is skipped since it is not required for the target platform. The jitinterface, aotsdk, and native libraries components are built for the target platforms, while jitinterface and clrjit components are built for the host as cross-components.

Additionally, this PR makes the cross build path to be a constant (/host), to allow both cross-arch and cross-os scenarios. Previously, the path was architecture-specific and did not support cross-os scenarios where the target and host architectures are the same.

It should unblock #87260 and #87773.

Author:kotlarmilos
Assignees:kotlarmilos
Labels:

area-NativeAOT-coreclr

Milestone:8.0.0

Comment threadsrc/coreclr/build-runtime.sh Outdated
__ConfigTriplet="linux.$__TargetArch.$__BuildType"
fi
if [[ ! -z "$__OutputRIDOS" ]]; then
__ConfigTriplet="$__OutputRIDOS.$__TargetArch.$__BuildType"

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.

Instead of introducing this override for output path, would it be better to keep the compiler in its default path and invoke it from there?

@kotlarmiloskotlarmilosJul 10, 2023

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.

In that case, the default path for the cross-compiler is $(TargetOS).$(TargetArchitecture).$(Configuration)/$(BuildArchitecture), while the jitinterface and clrjit cross-components are generated in $(HostOS).$(TargetArchitecture).$(Configuration)/$(BuildArchitecture), and these components cannot be found.

<CoreCLRArtifactsPathCondition="'$(CoreCLRArtifactsPath)' == ''">$(RuntimeBinDir)$(CrossHostArch)</CoreCLRArtifactsPath>

When building cross-components for cross-arch scenarios, the DCLR_CMAKE_TARGET_ARCH is used for the output path.

if [[ "$__TargetArch"!="$__HostArch" ]];then
__CMakeArgs="-DCLR_CMAKE_TARGET_ARCH=$__TargetArch$__CMakeArgs"
fi

One approach that I will try is to introduce the -hostos parameter along with -hostarch to indicate the target platform for the cross-components build. Another approach would be to adjust the components path in the _crossarch projects.

@MichalStrehovskyMichalStrehovsky 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.

Looks good otherwise! Thanks for cleaning it up!

Comment threadeng/Subsets.props Outdated
Category="clr" />
</ItemGroup>

<!-- Build the CoreCLR cross tools when we're doing a cross OS build for apple device targets -->

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.

Could this be folded into the above Build the CoreCLR cross tools when we're doing a cross build block? We currently exclude it with '$(TargetsMobile)' != 'true' but it looks pretty much the same. The additional TargetOS and OutputRIDOS properties will probably not harm anything if we add them.

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 think so. Initially, I didn't want to extend the cross-build for unsupported scenarios.

Comment threadeng/Subsets.props Outdated

<ProjectToBuild Condition="'$(NativeAotSupported)' == 'true' and ('$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)')" Include="$(CoreClrProjectRoot)tools\aot\ILCompiler\ILCompiler_crossarch.csproj" Category="clr" />
<ProjectToBuild Condition="'$(TargetArchitecture)' != '$(BuildArchitecture)'" Include="$(CoreClrProjectRoot)tools\aot\crossgen2\crossgen2_crossarch.csproj" Category="clr" />
<ProjectToBuild Condition="'$(NativeAotSupported)' == 'true' and ('$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)' or ('$(HostOS)' != '$(TargetOS)' and '$(TargetsAppleMobile)' == 'true'))" Include="$(CoreClrProjectRoot)tools\aot\ILCompiler\ILCompiler_crossarch.csproj" Category="clr" />

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.

Do we need the '$(TargetsAppleMobile)' == 'true' condition here and below? It feels like extending it to HostOS != TargetOS should be general goodness.

Comment threadeng/build.sh Outdated
Comment threadeng/liveBuilds.targets Outdated
<CoreCLRCrossgen2Dir>$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', 'crossgen2'))</CoreCLRCrossgen2Dir>
<CoreCLRILCompilerDir>$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', 'ilc-published'))</CoreCLRILCompilerDir>
<CoreCLRCrossILCompilerDir Condition="'$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)'">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', '$(BuildArchitecture)', 'ilc'))</CoreCLRCrossILCompilerDir>
<CoreCLRCrossILCompilerDir Condition="'$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)' or ('$(HostOS)' != '$(TargetOS)' and '$(TargetsAppleMobile)' == 'true')">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', '$(BuildArchitecture)', 'ilc'))</CoreCLRCrossILCompilerDir>

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.

Same question about the TargetsAppleMobile condition.

Comment threadeng/liveBuilds.targets Outdated
<CoreCLRSharedFrameworkPdbDir>$([MSBuild]::NormalizeDirectory('$(CoreCLRSharedFrameworkDir)','PDB'))</CoreCLRSharedFrameworkPdbDir>
<CoreCLRCrossTargetComponentDir
Condition="'$(CoreCLRCrossTargetComponentDirName)' != ''">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','$(CoreCLRCrossTargetComponentDirName)','sharedFramework'))</CoreCLRCrossTargetComponentDir>
Condition="'$(CoreCLRCrossTargetComponentDirName)' != ''">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','$(BuildArchitecture)','sharedFramework'))</CoreCLRCrossTargetComponentDir>

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 this change (I was not able to find a use of this property that looked relevant)?

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.

Not needed, it was a temporary change.


<ItemGroup>
<LinkerArg Include="--target=$(TargetTriple)" Condition="'$(TargetOS)' != 'osx' and '$(TargetTriple)' != ''" />
<LinkerArg Include="--target=$(TargetTriple)" Condition="'$(TargetOS)' != 'osx' and '$(TargetsAppleMobile)' != 'true' and '$(TargetTriple)' != ''" />

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.

Would this work?

Suggested change
<LinkerArgInclude="--target=$(TargetTriple)"Condition="'$(TargetOS)' != 'osx' and '$(TargetsAppleMobile)' != 'true' and '$(TargetTriple)' != ''" />
<LinkerArgInclude="--target=$(TargetTriple)"Condition="'$(_IsApplePlatform)' != 'true' and '$(TargetTriple)' != ''" />

kotlarmilosand others added 2 commits July 10, 2023 16:15
Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com>

@MichalStrehovskyMichalStrehovsky 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.

Looks good, thank you! Cc @jkoritzinsky

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

echo "Error: Unknown Android architecture $hostArch."
exit 1
fi
elif [[ "$__TargetOS" == iossimulator ]]; then

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.

@akoeplinger it looks like the $__TargetOS was used by mistake instead of $targetOS, please check.

@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.

LGTM!

@ghostghost locked as resolved and limited conversation to collaborators Aug 13, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@kotlarmilos@steveisok@jkoritzinsky@jkotas@MichalStrehovsky
, '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

[nativeaot] Add Native AOT cross-build support for iOS-like platforms - #88242

Merged
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:feature/nativeaot-cross-build
Jul 11, 2023
Merged

[nativeaot] Add Native AOT cross-build support for iOS-like platforms#88242
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:feature/nativeaot-cross-build

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Jun 30, 2023

Copy link
Copy Markdown
Member

This PR adds support for the Native AOT cross-build targeting iOS-like platforms. When building for the target platforms, only the jitinterface component is installed, while clrjit is skipped since it is not required for the target platform. The jitinterface, aotsdk, and native libraries components are built for the target platforms, while jitinterface and clrjit components are built for the host as cross-components.

Additionally, this PR makes the cross build path to be a constant (/host), to allow both cross-arch and cross-os scenarios. Previously, the path was architecture-specific and did not support cross-os scenarios where the target and host architectures are the same.

The updated cross build path caused a lot of regressions and would require updating the tests to match the new path. The idea is to use the architecture-specific path in the cross-os scenarios as well.

It should unblock #87260 and #87773.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

This PR adds support for the Native AOT cross-build targeting iOS-like platforms. When building for the target platforms, only the jitinterface component is installed, while clrjit is skipped since it is not required for the target platform. The jitinterface, aotsdk, and native libraries components are built for the target platforms, while jitinterface and clrjit components are built for the host as cross-components.

Additionally, this PR makes the cross build path to be a constant (/host), to allow both cross-arch and cross-os scenarios. Previously, the path was architecture-specific and did not support cross-os scenarios where the target and host architectures are the same.

It should unblock #87260 and #87773.

Author:kotlarmilos
Assignees:kotlarmilos
Labels:

area-NativeAOT-coreclr

Milestone:8.0.0

Comment threadsrc/coreclr/build-runtime.sh Outdated
__ConfigTriplet="linux.$__TargetArch.$__BuildType"
fi
if [[ ! -z "$__OutputRIDOS" ]]; then
__ConfigTriplet="$__OutputRIDOS.$__TargetArch.$__BuildType"

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.

Instead of introducing this override for output path, would it be better to keep the compiler in its default path and invoke it from there?

@kotlarmiloskotlarmilosJul 10, 2023

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.

In that case, the default path for the cross-compiler is $(TargetOS).$(TargetArchitecture).$(Configuration)/$(BuildArchitecture), while the jitinterface and clrjit cross-components are generated in $(HostOS).$(TargetArchitecture).$(Configuration)/$(BuildArchitecture), and these components cannot be found.

<CoreCLRArtifactsPathCondition="'$(CoreCLRArtifactsPath)' == ''">$(RuntimeBinDir)$(CrossHostArch)</CoreCLRArtifactsPath>

When building cross-components for cross-arch scenarios, the DCLR_CMAKE_TARGET_ARCH is used for the output path.

if [[ "$__TargetArch"!="$__HostArch" ]];then
__CMakeArgs="-DCLR_CMAKE_TARGET_ARCH=$__TargetArch$__CMakeArgs"
fi

One approach that I will try is to introduce the -hostos parameter along with -hostarch to indicate the target platform for the cross-components build. Another approach would be to adjust the components path in the _crossarch projects.

@MichalStrehovskyMichalStrehovsky 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.

Looks good otherwise! Thanks for cleaning it up!

Comment threadeng/Subsets.props Outdated
Category="clr" />
</ItemGroup>

<!-- Build the CoreCLR cross tools when we're doing a cross OS build for apple device targets -->

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.

Could this be folded into the above Build the CoreCLR cross tools when we're doing a cross build block? We currently exclude it with '$(TargetsMobile)' != 'true' but it looks pretty much the same. The additional TargetOS and OutputRIDOS properties will probably not harm anything if we add them.

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 think so. Initially, I didn't want to extend the cross-build for unsupported scenarios.

Comment threadeng/Subsets.props Outdated

<ProjectToBuild Condition="'$(NativeAotSupported)' == 'true' and ('$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)')" Include="$(CoreClrProjectRoot)tools\aot\ILCompiler\ILCompiler_crossarch.csproj" Category="clr" />
<ProjectToBuild Condition="'$(TargetArchitecture)' != '$(BuildArchitecture)'" Include="$(CoreClrProjectRoot)tools\aot\crossgen2\crossgen2_crossarch.csproj" Category="clr" />
<ProjectToBuild Condition="'$(NativeAotSupported)' == 'true' and ('$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)' or ('$(HostOS)' != '$(TargetOS)' and '$(TargetsAppleMobile)' == 'true'))" Include="$(CoreClrProjectRoot)tools\aot\ILCompiler\ILCompiler_crossarch.csproj" Category="clr" />

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.

Do we need the '$(TargetsAppleMobile)' == 'true' condition here and below? It feels like extending it to HostOS != TargetOS should be general goodness.

Comment threadeng/build.sh Outdated
Comment threadeng/liveBuilds.targets Outdated
<CoreCLRCrossgen2Dir>$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', 'crossgen2'))</CoreCLRCrossgen2Dir>
<CoreCLRILCompilerDir>$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', 'ilc-published'))</CoreCLRILCompilerDir>
<CoreCLRCrossILCompilerDir Condition="'$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)'">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', '$(BuildArchitecture)', 'ilc'))</CoreCLRCrossILCompilerDir>
<CoreCLRCrossILCompilerDir Condition="'$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)' or ('$(HostOS)' != '$(TargetOS)' and '$(TargetsAppleMobile)' == 'true')">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', '$(BuildArchitecture)', 'ilc'))</CoreCLRCrossILCompilerDir>

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.

Same question about the TargetsAppleMobile condition.

Comment threadeng/liveBuilds.targets Outdated
<CoreCLRSharedFrameworkPdbDir>$([MSBuild]::NormalizeDirectory('$(CoreCLRSharedFrameworkDir)','PDB'))</CoreCLRSharedFrameworkPdbDir>
<CoreCLRCrossTargetComponentDir
Condition="'$(CoreCLRCrossTargetComponentDirName)' != ''">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','$(CoreCLRCrossTargetComponentDirName)','sharedFramework'))</CoreCLRCrossTargetComponentDir>
Condition="'$(CoreCLRCrossTargetComponentDirName)' != ''">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','$(BuildArchitecture)','sharedFramework'))</CoreCLRCrossTargetComponentDir>

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 this change (I was not able to find a use of this property that looked relevant)?

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.

Not needed, it was a temporary change.


<ItemGroup>
<LinkerArg Include="--target=$(TargetTriple)" Condition="'$(TargetOS)' != 'osx' and '$(TargetTriple)' != ''" />
<LinkerArg Include="--target=$(TargetTriple)" Condition="'$(TargetOS)' != 'osx' and '$(TargetsAppleMobile)' != 'true' and '$(TargetTriple)' != ''" />

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.

Would this work?

Suggested change
<LinkerArgInclude="--target=$(TargetTriple)"Condition="'$(TargetOS)' != 'osx' and '$(TargetsAppleMobile)' != 'true' and '$(TargetTriple)' != ''" />
<LinkerArgInclude="--target=$(TargetTriple)"Condition="'$(_IsApplePlatform)' != 'true' and '$(TargetTriple)' != ''" />

kotlarmilosand others added 2 commits July 10, 2023 16:15
Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com>

@MichalStrehovskyMichalStrehovsky 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.

Looks good, thank you! Cc @jkoritzinsky

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

echo "Error: Unknown Android architecture $hostArch."
exit 1
fi
elif [[ "$__TargetOS" == iossimulator ]]; then

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.

@akoeplinger it looks like the $__TargetOS was used by mistake instead of $targetOS, please check.

@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.

LGTM!

@ghostghost locked as resolved and limited conversation to collaborators Aug 13, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@kotlarmilos@steveisok@jkoritzinsky@jkotas@MichalStrehovsky
, '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

[nativeaot] Add Native AOT cross-build support for iOS-like platforms - #88242

Merged
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:feature/nativeaot-cross-build
Jul 11, 2023
Merged

[nativeaot] Add Native AOT cross-build support for iOS-like platforms#88242
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:feature/nativeaot-cross-build

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Jun 30, 2023

Copy link
Copy Markdown
Member

This PR adds support for the Native AOT cross-build targeting iOS-like platforms. When building for the target platforms, only the jitinterface component is installed, while clrjit is skipped since it is not required for the target platform. The jitinterface, aotsdk, and native libraries components are built for the target platforms, while jitinterface and clrjit components are built for the host as cross-components.

Additionally, this PR makes the cross build path to be a constant (/host), to allow both cross-arch and cross-os scenarios. Previously, the path was architecture-specific and did not support cross-os scenarios where the target and host architectures are the same.

The updated cross build path caused a lot of regressions and would require updating the tests to match the new path. The idea is to use the architecture-specific path in the cross-os scenarios as well.

It should unblock #87260 and #87773.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

This PR adds support for the Native AOT cross-build targeting iOS-like platforms. When building for the target platforms, only the jitinterface component is installed, while clrjit is skipped since it is not required for the target platform. The jitinterface, aotsdk, and native libraries components are built for the target platforms, while jitinterface and clrjit components are built for the host as cross-components.

Additionally, this PR makes the cross build path to be a constant (/host), to allow both cross-arch and cross-os scenarios. Previously, the path was architecture-specific and did not support cross-os scenarios where the target and host architectures are the same.

It should unblock #87260 and #87773.

Author:kotlarmilos
Assignees:kotlarmilos
Labels:

area-NativeAOT-coreclr

Milestone:8.0.0

Comment threadsrc/coreclr/build-runtime.sh Outdated
__ConfigTriplet="linux.$__TargetArch.$__BuildType"
fi
if [[ ! -z "$__OutputRIDOS" ]]; then
__ConfigTriplet="$__OutputRIDOS.$__TargetArch.$__BuildType"

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.

Instead of introducing this override for output path, would it be better to keep the compiler in its default path and invoke it from there?

@kotlarmiloskotlarmilosJul 10, 2023

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.

In that case, the default path for the cross-compiler is $(TargetOS).$(TargetArchitecture).$(Configuration)/$(BuildArchitecture), while the jitinterface and clrjit cross-components are generated in $(HostOS).$(TargetArchitecture).$(Configuration)/$(BuildArchitecture), and these components cannot be found.

<CoreCLRArtifactsPathCondition="'$(CoreCLRArtifactsPath)' == ''">$(RuntimeBinDir)$(CrossHostArch)</CoreCLRArtifactsPath>

When building cross-components for cross-arch scenarios, the DCLR_CMAKE_TARGET_ARCH is used for the output path.

if [[ "$__TargetArch"!="$__HostArch" ]];then
__CMakeArgs="-DCLR_CMAKE_TARGET_ARCH=$__TargetArch$__CMakeArgs"
fi

One approach that I will try is to introduce the -hostos parameter along with -hostarch to indicate the target platform for the cross-components build. Another approach would be to adjust the components path in the _crossarch projects.

@MichalStrehovskyMichalStrehovsky 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.

Looks good otherwise! Thanks for cleaning it up!

Comment threadeng/Subsets.props Outdated
Category="clr" />
</ItemGroup>

<!-- Build the CoreCLR cross tools when we're doing a cross OS build for apple device targets -->

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.

Could this be folded into the above Build the CoreCLR cross tools when we're doing a cross build block? We currently exclude it with '$(TargetsMobile)' != 'true' but it looks pretty much the same. The additional TargetOS and OutputRIDOS properties will probably not harm anything if we add them.

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 think so. Initially, I didn't want to extend the cross-build for unsupported scenarios.

Comment threadeng/Subsets.props Outdated

<ProjectToBuild Condition="'$(NativeAotSupported)' == 'true' and ('$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)')" Include="$(CoreClrProjectRoot)tools\aot\ILCompiler\ILCompiler_crossarch.csproj" Category="clr" />
<ProjectToBuild Condition="'$(TargetArchitecture)' != '$(BuildArchitecture)'" Include="$(CoreClrProjectRoot)tools\aot\crossgen2\crossgen2_crossarch.csproj" Category="clr" />
<ProjectToBuild Condition="'$(NativeAotSupported)' == 'true' and ('$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)' or ('$(HostOS)' != '$(TargetOS)' and '$(TargetsAppleMobile)' == 'true'))" Include="$(CoreClrProjectRoot)tools\aot\ILCompiler\ILCompiler_crossarch.csproj" Category="clr" />

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.

Do we need the '$(TargetsAppleMobile)' == 'true' condition here and below? It feels like extending it to HostOS != TargetOS should be general goodness.

Comment threadeng/build.sh Outdated
Comment threadeng/liveBuilds.targets Outdated
<CoreCLRCrossgen2Dir>$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', 'crossgen2'))</CoreCLRCrossgen2Dir>
<CoreCLRILCompilerDir>$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', 'ilc-published'))</CoreCLRILCompilerDir>
<CoreCLRCrossILCompilerDir Condition="'$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)'">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', '$(BuildArchitecture)', 'ilc'))</CoreCLRCrossILCompilerDir>
<CoreCLRCrossILCompilerDir Condition="'$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)' or ('$(HostOS)' != '$(TargetOS)' and '$(TargetsAppleMobile)' == 'true')">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', '$(BuildArchitecture)', 'ilc'))</CoreCLRCrossILCompilerDir>

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.

Same question about the TargetsAppleMobile condition.

Comment threadeng/liveBuilds.targets Outdated
<CoreCLRSharedFrameworkPdbDir>$([MSBuild]::NormalizeDirectory('$(CoreCLRSharedFrameworkDir)','PDB'))</CoreCLRSharedFrameworkPdbDir>
<CoreCLRCrossTargetComponentDir
Condition="'$(CoreCLRCrossTargetComponentDirName)' != ''">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','$(CoreCLRCrossTargetComponentDirName)','sharedFramework'))</CoreCLRCrossTargetComponentDir>
Condition="'$(CoreCLRCrossTargetComponentDirName)' != ''">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','$(BuildArchitecture)','sharedFramework'))</CoreCLRCrossTargetComponentDir>

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 this change (I was not able to find a use of this property that looked relevant)?

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.

Not needed, it was a temporary change.


<ItemGroup>
<LinkerArg Include="--target=$(TargetTriple)" Condition="'$(TargetOS)' != 'osx' and '$(TargetTriple)' != ''" />
<LinkerArg Include="--target=$(TargetTriple)" Condition="'$(TargetOS)' != 'osx' and '$(TargetsAppleMobile)' != 'true' and '$(TargetTriple)' != ''" />

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.

Would this work?

Suggested change
<LinkerArgInclude="--target=$(TargetTriple)"Condition="'$(TargetOS)' != 'osx' and '$(TargetsAppleMobile)' != 'true' and '$(TargetTriple)' != ''" />
<LinkerArgInclude="--target=$(TargetTriple)"Condition="'$(_IsApplePlatform)' != 'true' and '$(TargetTriple)' != ''" />

kotlarmilosand others added 2 commits July 10, 2023 16:15
Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com>

@MichalStrehovskyMichalStrehovsky 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.

Looks good, thank you! Cc @jkoritzinsky

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

echo "Error: Unknown Android architecture $hostArch."
exit 1
fi
elif [[ "$__TargetOS" == iossimulator ]]; then

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.

@akoeplinger it looks like the $__TargetOS was used by mistake instead of $targetOS, please check.

@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.

LGTM!

@ghostghost locked as resolved and limited conversation to collaborators Aug 13, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@kotlarmilos@steveisok@jkoritzinsky@jkotas@MichalStrehovsky
, '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

[nativeaot] Add Native AOT cross-build support for iOS-like platforms - #88242

Merged
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:feature/nativeaot-cross-build
Jul 11, 2023
Merged

[nativeaot] Add Native AOT cross-build support for iOS-like platforms#88242
kotlarmilos merged 5 commits into
dotnet:mainfrom
kotlarmilos:feature/nativeaot-cross-build

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Jun 30, 2023

Copy link
Copy Markdown
Member

This PR adds support for the Native AOT cross-build targeting iOS-like platforms. When building for the target platforms, only the jitinterface component is installed, while clrjit is skipped since it is not required for the target platform. The jitinterface, aotsdk, and native libraries components are built for the target platforms, while jitinterface and clrjit components are built for the host as cross-components.

Additionally, this PR makes the cross build path to be a constant (/host), to allow both cross-arch and cross-os scenarios. Previously, the path was architecture-specific and did not support cross-os scenarios where the target and host architectures are the same.

The updated cross build path caused a lot of regressions and would require updating the tests to match the new path. The idea is to use the architecture-specific path in the cross-os scenarios as well.

It should unblock #87260 and #87773.

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @agocke, @MichalStrehovsky, @jkotas
See info in area-owners.md if you want to be subscribed.

Issue Details

This PR adds support for the Native AOT cross-build targeting iOS-like platforms. When building for the target platforms, only the jitinterface component is installed, while clrjit is skipped since it is not required for the target platform. The jitinterface, aotsdk, and native libraries components are built for the target platforms, while jitinterface and clrjit components are built for the host as cross-components.

Additionally, this PR makes the cross build path to be a constant (/host), to allow both cross-arch and cross-os scenarios. Previously, the path was architecture-specific and did not support cross-os scenarios where the target and host architectures are the same.

It should unblock #87260 and #87773.

Author:kotlarmilos
Assignees:kotlarmilos
Labels:

area-NativeAOT-coreclr

Milestone:8.0.0

Comment threadsrc/coreclr/build-runtime.sh Outdated
__ConfigTriplet="linux.$__TargetArch.$__BuildType"
fi
if [[ ! -z "$__OutputRIDOS" ]]; then
__ConfigTriplet="$__OutputRIDOS.$__TargetArch.$__BuildType"

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.

Instead of introducing this override for output path, would it be better to keep the compiler in its default path and invoke it from there?

@kotlarmiloskotlarmilosJul 10, 2023

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.

In that case, the default path for the cross-compiler is $(TargetOS).$(TargetArchitecture).$(Configuration)/$(BuildArchitecture), while the jitinterface and clrjit cross-components are generated in $(HostOS).$(TargetArchitecture).$(Configuration)/$(BuildArchitecture), and these components cannot be found.

<CoreCLRArtifactsPathCondition="'$(CoreCLRArtifactsPath)' == ''">$(RuntimeBinDir)$(CrossHostArch)</CoreCLRArtifactsPath>

When building cross-components for cross-arch scenarios, the DCLR_CMAKE_TARGET_ARCH is used for the output path.

if [[ "$__TargetArch"!="$__HostArch" ]];then
__CMakeArgs="-DCLR_CMAKE_TARGET_ARCH=$__TargetArch$__CMakeArgs"
fi

One approach that I will try is to introduce the -hostos parameter along with -hostarch to indicate the target platform for the cross-components build. Another approach would be to adjust the components path in the _crossarch projects.

@MichalStrehovskyMichalStrehovsky 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.

Looks good otherwise! Thanks for cleaning it up!

Comment threadeng/Subsets.props Outdated
Category="clr" />
</ItemGroup>

<!-- Build the CoreCLR cross tools when we're doing a cross OS build for apple device targets -->

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.

Could this be folded into the above Build the CoreCLR cross tools when we're doing a cross build block? We currently exclude it with '$(TargetsMobile)' != 'true' but it looks pretty much the same. The additional TargetOS and OutputRIDOS properties will probably not harm anything if we add them.

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 think so. Initially, I didn't want to extend the cross-build for unsupported scenarios.

Comment threadeng/Subsets.props Outdated

<ProjectToBuild Condition="'$(NativeAotSupported)' == 'true' and ('$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)')" Include="$(CoreClrProjectRoot)tools\aot\ILCompiler\ILCompiler_crossarch.csproj" Category="clr" />
<ProjectToBuild Condition="'$(TargetArchitecture)' != '$(BuildArchitecture)'" Include="$(CoreClrProjectRoot)tools\aot\crossgen2\crossgen2_crossarch.csproj" Category="clr" />
<ProjectToBuild Condition="'$(NativeAotSupported)' == 'true' and ('$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)' or ('$(HostOS)' != '$(TargetOS)' and '$(TargetsAppleMobile)' == 'true'))" Include="$(CoreClrProjectRoot)tools\aot\ILCompiler\ILCompiler_crossarch.csproj" Category="clr" />

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.

Do we need the '$(TargetsAppleMobile)' == 'true' condition here and below? It feels like extending it to HostOS != TargetOS should be general goodness.

Comment threadeng/build.sh Outdated
Comment threadeng/liveBuilds.targets Outdated
<CoreCLRCrossgen2Dir>$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', 'crossgen2'))</CoreCLRCrossgen2Dir>
<CoreCLRILCompilerDir>$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', 'ilc-published'))</CoreCLRILCompilerDir>
<CoreCLRCrossILCompilerDir Condition="'$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)'">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', '$(BuildArchitecture)', 'ilc'))</CoreCLRCrossILCompilerDir>
<CoreCLRCrossILCompilerDir Condition="'$(CrossBuild)' == 'true' or '$(BuildArchitecture)' != '$(TargetArchitecture)' or ('$(HostOS)' != '$(TargetOS)' and '$(TargetsAppleMobile)' == 'true')">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)', '$(BuildArchitecture)', 'ilc'))</CoreCLRCrossILCompilerDir>

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.

Same question about the TargetsAppleMobile condition.

Comment threadeng/liveBuilds.targets Outdated
<CoreCLRSharedFrameworkPdbDir>$([MSBuild]::NormalizeDirectory('$(CoreCLRSharedFrameworkDir)','PDB'))</CoreCLRSharedFrameworkPdbDir>
<CoreCLRCrossTargetComponentDir
Condition="'$(CoreCLRCrossTargetComponentDirName)' != ''">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','$(CoreCLRCrossTargetComponentDirName)','sharedFramework'))</CoreCLRCrossTargetComponentDir>
Condition="'$(CoreCLRCrossTargetComponentDirName)' != ''">$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','$(BuildArchitecture)','sharedFramework'))</CoreCLRCrossTargetComponentDir>

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 this change (I was not able to find a use of this property that looked relevant)?

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.

Not needed, it was a temporary change.


<ItemGroup>
<LinkerArg Include="--target=$(TargetTriple)" Condition="'$(TargetOS)' != 'osx' and '$(TargetTriple)' != ''" />
<LinkerArg Include="--target=$(TargetTriple)" Condition="'$(TargetOS)' != 'osx' and '$(TargetsAppleMobile)' != 'true' and '$(TargetTriple)' != ''" />

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.

Would this work?

Suggested change
<LinkerArgInclude="--target=$(TargetTriple)"Condition="'$(TargetOS)' != 'osx' and '$(TargetsAppleMobile)' != 'true' and '$(TargetTriple)' != ''" />
<LinkerArgInclude="--target=$(TargetTriple)"Condition="'$(_IsApplePlatform)' != 'true' and '$(TargetTriple)' != ''" />

kotlarmilosand others added 2 commits July 10, 2023 16:15
Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com>

@MichalStrehovskyMichalStrehovsky 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.

Looks good, thank you! Cc @jkoritzinsky

@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

echo "Error: Unknown Android architecture $hostArch."
exit 1
fi
elif [[ "$__TargetOS" == iossimulator ]]; then

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.

@akoeplinger it looks like the $__TargetOS was used by mistake instead of $targetOS, please check.

@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.

LGTM!

@ghostghost locked as resolved and limited conversation to collaborators Aug 13, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@kotlarmilos@steveisok@jkoritzinsky@jkotas@MichalStrehovsky