Enable using the Ninja generator instead of Visual Studio on Windows builds. - #41897

Merged
jkoritzinsky merged 65 commits into
dotnet:masterfrom
jkoritzinsky:ninja-windows
Nov 2, 2020
Merged

Enable using the Ninja generator instead of Visual Studio on Windows builds.#41897
jkoritzinsky merged 65 commits into
dotnet:masterfrom
jkoritzinsky:ninja-windows

Conversation

@jkoritzinsky

@jkoritzinskyjkoritzinsky commented Sep 4, 2020

Copy link
Copy Markdown
Member

Summary for Infra Rollout

We're enabling users to use Ninja across the coreclr, libraries, and host native builds instead of Visual Studio or Make. Ninja is a slimmed down build orchestrator that performs much faster than MSBuild on our native Windows CoreCLR build and performs comparably to MSBuild on the Windows libraries and host builds and Make on all non-Windows builds.

You can use the -ninja flag to use Ninja to run the native builds instead of MSBuild or Make. For this rollout, we're not changing the default experience for local development, but we are enabling Ninja builds in CI for the CoreCLR build.

There is one breaking change and one non-breaking change for developers:

  • Breaking: If you are using the src/coreclr/build-runtime.cmd script to build on Windows, you'll need to build either the clr.dactools or clr.runtime subset once from the root script first. The DacTableGen tool used in the Windows build has moved out of the CMake build and is now a regular C# project. As a result, it needs to be built via the root build script once so it is available for the native build.
  • Non breaking: The minimum recommended CMake version is 3.16. If you use CMake 3.16 precompiled headers will be used in all builds. If you use CMake 3.15.5 or lower, precompiled headers will not be used. This is a behavior change, since we used to always have precompiled headers on Windows and never have them on non-Windows. If you notice slowness in your Windows build after pulling down this PR and have not updated CMake, try installing CMake 3.16 to re-enable precompiled headers.

Original Summary

This PR enables using the Ninja generator on Windows instead of the Visual Studio CMake generators via the -ninja switch (for the build-runtime.cmd script) and via a Ninja MSBuild global property. To keep pre-compiled headers working on Windows, this PR bumps the minimum recommended CMake version to 3.16. Using an older CMake version is still possible, but your build will not support precompiled headers. However, now precompiled headers are enabled on all platforms (not just Windows) when using CMake 3.16 or higher.

Since the C# support in CMake is only for the Visual Studio generators, I've moved the DacTableGen project into a subset that's included with the clr.runtime subset and also moved the PIA for DIALib into a checked-in ilproj project by decompiling it with ildasm.

To support opening the CoreCLR VS-generated solution in Visual Studio, I've augmented the root -vs flag. If you pass coreclr.sln (case-insensitive) to the -vs flag, the build script will generate the CoreCLR solution for the provided parameters using the VS generator (if it hasn't been generated already) and open the solution in VS.

I've updated the CoreCLR, Libraries, and Host builds to all enable using Ninja.

For this PR, Ninja usage will be opt-in. In the future, we will make Ninja the default generator and make the Visual Studio generator opt-in.

TODO:

  • CI validation
    • The CI machines don't have Ninja installed yet, so this is blocked on getting it installed.
  • Documentation of new options

Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
…urning on /W3 and disabling any new warnings we hit.
…BRARY abstraction feature in CMake 3.14+ (below the minimum requirement on Windows).
@jkoritzinskyjkoritzinsky added this to the 6.0.0 milestone Sep 4, 2020
@jkoritzinsky
jkoritzinsky requested a review from a teamSeptember 4, 2020 21:57
…the VC++ environment for the correct build tools each time instead of interleaving them and relying on Visual Studio to handle the differing targets.
@jkoritzinskyjkoritzinsky changed the title [WIP] Enable using the Ninja generator instead of Visual Studio on Windows builds.Enable using the Ninja generator instead of Visual Studio on Windows builds.Oct 22, 2020
@jkoritzinsky
jkoritzinsky marked this pull request as ready for review October 22, 2020 18:39
@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

This PR is ready for review!

<Target Name="BuildNativeUnix"
BeforeTargets="Build"
Condition="'$(TargetOS)' != 'Windows_NT'">
Condition="!$([MSBuild]::IsOsPlatform(Windows))">

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.

Unsure if this ever worked but the TargetOS check doesn't assert the current OS but the target one that is passed in via the -os switch.

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.

Can I build the native bits targeting Unix on Windows?

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.

This broke with the WASM on Windows build, since it was going down the build-native.sh path when it should have gone down the build-native.cmd path.

Comment threadsrc/coreclr/build-runtime.cmd
Comment threadeng/pipelines/coreclr/templates/build-job.yml Outdated
Comment threadeng/native/functions.cmake Outdated
Comment threadsrc/coreclr/CMakeLists.txt Outdated
Comment threadsrc/coreclr/runtime.proj
Comment threadsrc/coreclr/src/debug/daccess/dacfn.cpp Outdated
Comment threadsrc/libraries/Native/build-native.cmd
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
@BruceForstall

Copy link
Copy Markdown
Contributor

Looks like you need to add more documentation on Ninja, e.g.:

  1. From where do I install it?
  2. How do I install it?
  3. What is the minimum version?

The answers to these questions need to cover all platforms.

The documents at the various "Requirements" links on https://github.com/dotnet/runtime/blob/master/docs/workflow/README.md should be updated.

@BruceForstall

Copy link
Copy Markdown
Contributor

The minimum recommended CMake version is 3.16

I didn't look thoroughly: is there an easily visible warning on the console if you don't have the recommended minimum cmake version? (i.e., it seems like there should be)

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

We have an error for the minimum required CMake, but not a warning for the minimum recommended CMake (this is the first time they differ). I'll add a warning output.

Comment threaddocs/workflow/requirements/windows-requirements.md Outdated
@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

Test failures are #43983 and #43927

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.

7 participants

@jkoritzinsky@hoyosjs@jashook@trylek@janvorli@BruceForstall@ViktorHofer
, '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

Enable using the Ninja generator instead of Visual Studio on Windows builds. - #41897

Merged
jkoritzinsky merged 65 commits into
dotnet:masterfrom
jkoritzinsky:ninja-windows
Nov 2, 2020
Merged

Enable using the Ninja generator instead of Visual Studio on Windows builds.#41897
jkoritzinsky merged 65 commits into
dotnet:masterfrom
jkoritzinsky:ninja-windows

Conversation

@jkoritzinsky

@jkoritzinskyjkoritzinsky commented Sep 4, 2020

Copy link
Copy Markdown
Member

Summary for Infra Rollout

We're enabling users to use Ninja across the coreclr, libraries, and host native builds instead of Visual Studio or Make. Ninja is a slimmed down build orchestrator that performs much faster than MSBuild on our native Windows CoreCLR build and performs comparably to MSBuild on the Windows libraries and host builds and Make on all non-Windows builds.

You can use the -ninja flag to use Ninja to run the native builds instead of MSBuild or Make. For this rollout, we're not changing the default experience for local development, but we are enabling Ninja builds in CI for the CoreCLR build.

There is one breaking change and one non-breaking change for developers:

  • Breaking: If you are using the src/coreclr/build-runtime.cmd script to build on Windows, you'll need to build either the clr.dactools or clr.runtime subset once from the root script first. The DacTableGen tool used in the Windows build has moved out of the CMake build and is now a regular C# project. As a result, it needs to be built via the root build script once so it is available for the native build.
  • Non breaking: The minimum recommended CMake version is 3.16. If you use CMake 3.16 precompiled headers will be used in all builds. If you use CMake 3.15.5 or lower, precompiled headers will not be used. This is a behavior change, since we used to always have precompiled headers on Windows and never have them on non-Windows. If you notice slowness in your Windows build after pulling down this PR and have not updated CMake, try installing CMake 3.16 to re-enable precompiled headers.

Original Summary

This PR enables using the Ninja generator on Windows instead of the Visual Studio CMake generators via the -ninja switch (for the build-runtime.cmd script) and via a Ninja MSBuild global property. To keep pre-compiled headers working on Windows, this PR bumps the minimum recommended CMake version to 3.16. Using an older CMake version is still possible, but your build will not support precompiled headers. However, now precompiled headers are enabled on all platforms (not just Windows) when using CMake 3.16 or higher.

Since the C# support in CMake is only for the Visual Studio generators, I've moved the DacTableGen project into a subset that's included with the clr.runtime subset and also moved the PIA for DIALib into a checked-in ilproj project by decompiling it with ildasm.

To support opening the CoreCLR VS-generated solution in Visual Studio, I've augmented the root -vs flag. If you pass coreclr.sln (case-insensitive) to the -vs flag, the build script will generate the CoreCLR solution for the provided parameters using the VS generator (if it hasn't been generated already) and open the solution in VS.

I've updated the CoreCLR, Libraries, and Host builds to all enable using Ninja.

For this PR, Ninja usage will be opt-in. In the future, we will make Ninja the default generator and make the Visual Studio generator opt-in.

TODO:

  • CI validation
    • The CI machines don't have Ninja installed yet, so this is blocked on getting it installed.
  • Documentation of new options

Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
…urning on /W3 and disabling any new warnings we hit.
…BRARY abstraction feature in CMake 3.14+ (below the minimum requirement on Windows).
@jkoritzinskyjkoritzinsky added this to the 6.0.0 milestone Sep 4, 2020
@jkoritzinsky
jkoritzinsky requested a review from a teamSeptember 4, 2020 21:57
…the VC++ environment for the correct build tools each time instead of interleaving them and relying on Visual Studio to handle the differing targets.
@jkoritzinskyjkoritzinsky changed the title [WIP] Enable using the Ninja generator instead of Visual Studio on Windows builds.Enable using the Ninja generator instead of Visual Studio on Windows builds.Oct 22, 2020
@jkoritzinsky
jkoritzinsky marked this pull request as ready for review October 22, 2020 18:39
@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

This PR is ready for review!

<Target Name="BuildNativeUnix"
BeforeTargets="Build"
Condition="'$(TargetOS)' != 'Windows_NT'">
Condition="!$([MSBuild]::IsOsPlatform(Windows))">

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.

Unsure if this ever worked but the TargetOS check doesn't assert the current OS but the target one that is passed in via the -os switch.

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.

Can I build the native bits targeting Unix on Windows?

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.

This broke with the WASM on Windows build, since it was going down the build-native.sh path when it should have gone down the build-native.cmd path.

Comment threadsrc/coreclr/build-runtime.cmd
Comment threadeng/pipelines/coreclr/templates/build-job.yml Outdated
Comment threadeng/native/functions.cmake Outdated
Comment threadsrc/coreclr/CMakeLists.txt Outdated
Comment threadsrc/coreclr/runtime.proj
Comment threadsrc/coreclr/src/debug/daccess/dacfn.cpp Outdated
Comment threadsrc/libraries/Native/build-native.cmd
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
@BruceForstall

Copy link
Copy Markdown
Contributor

Looks like you need to add more documentation on Ninja, e.g.:

  1. From where do I install it?
  2. How do I install it?
  3. What is the minimum version?

The answers to these questions need to cover all platforms.

The documents at the various "Requirements" links on https://github.com/dotnet/runtime/blob/master/docs/workflow/README.md should be updated.

@BruceForstall

Copy link
Copy Markdown
Contributor

The minimum recommended CMake version is 3.16

I didn't look thoroughly: is there an easily visible warning on the console if you don't have the recommended minimum cmake version? (i.e., it seems like there should be)

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

We have an error for the minimum required CMake, but not a warning for the minimum recommended CMake (this is the first time they differ). I'll add a warning output.

Comment threaddocs/workflow/requirements/windows-requirements.md Outdated
@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

Test failures are #43983 and #43927

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.

7 participants

@jkoritzinsky@hoyosjs@jashook@trylek@janvorli@BruceForstall@ViktorHofer
, '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

Enable using the Ninja generator instead of Visual Studio on Windows builds. - #41897

Merged
jkoritzinsky merged 65 commits into
dotnet:masterfrom
jkoritzinsky:ninja-windows
Nov 2, 2020
Merged

Enable using the Ninja generator instead of Visual Studio on Windows builds.#41897
jkoritzinsky merged 65 commits into
dotnet:masterfrom
jkoritzinsky:ninja-windows

Conversation

@jkoritzinsky

@jkoritzinskyjkoritzinsky commented Sep 4, 2020

Copy link
Copy Markdown
Member

Summary for Infra Rollout

We're enabling users to use Ninja across the coreclr, libraries, and host native builds instead of Visual Studio or Make. Ninja is a slimmed down build orchestrator that performs much faster than MSBuild on our native Windows CoreCLR build and performs comparably to MSBuild on the Windows libraries and host builds and Make on all non-Windows builds.

You can use the -ninja flag to use Ninja to run the native builds instead of MSBuild or Make. For this rollout, we're not changing the default experience for local development, but we are enabling Ninja builds in CI for the CoreCLR build.

There is one breaking change and one non-breaking change for developers:

  • Breaking: If you are using the src/coreclr/build-runtime.cmd script to build on Windows, you'll need to build either the clr.dactools or clr.runtime subset once from the root script first. The DacTableGen tool used in the Windows build has moved out of the CMake build and is now a regular C# project. As a result, it needs to be built via the root build script once so it is available for the native build.
  • Non breaking: The minimum recommended CMake version is 3.16. If you use CMake 3.16 precompiled headers will be used in all builds. If you use CMake 3.15.5 or lower, precompiled headers will not be used. This is a behavior change, since we used to always have precompiled headers on Windows and never have them on non-Windows. If you notice slowness in your Windows build after pulling down this PR and have not updated CMake, try installing CMake 3.16 to re-enable precompiled headers.

Original Summary

This PR enables using the Ninja generator on Windows instead of the Visual Studio CMake generators via the -ninja switch (for the build-runtime.cmd script) and via a Ninja MSBuild global property. To keep pre-compiled headers working on Windows, this PR bumps the minimum recommended CMake version to 3.16. Using an older CMake version is still possible, but your build will not support precompiled headers. However, now precompiled headers are enabled on all platforms (not just Windows) when using CMake 3.16 or higher.

Since the C# support in CMake is only for the Visual Studio generators, I've moved the DacTableGen project into a subset that's included with the clr.runtime subset and also moved the PIA for DIALib into a checked-in ilproj project by decompiling it with ildasm.

To support opening the CoreCLR VS-generated solution in Visual Studio, I've augmented the root -vs flag. If you pass coreclr.sln (case-insensitive) to the -vs flag, the build script will generate the CoreCLR solution for the provided parameters using the VS generator (if it hasn't been generated already) and open the solution in VS.

I've updated the CoreCLR, Libraries, and Host builds to all enable using Ninja.

For this PR, Ninja usage will be opt-in. In the future, we will make Ninja the default generator and make the Visual Studio generator opt-in.

TODO:

  • CI validation
    • The CI machines don't have Ninja installed yet, so this is blocked on getting it installed.
  • Documentation of new options

Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
…urning on /W3 and disabling any new warnings we hit.
…BRARY abstraction feature in CMake 3.14+ (below the minimum requirement on Windows).
@jkoritzinskyjkoritzinsky added this to the 6.0.0 milestone Sep 4, 2020
@jkoritzinsky
jkoritzinsky requested a review from a teamSeptember 4, 2020 21:57
…the VC++ environment for the correct build tools each time instead of interleaving them and relying on Visual Studio to handle the differing targets.
@jkoritzinskyjkoritzinsky changed the title [WIP] Enable using the Ninja generator instead of Visual Studio on Windows builds.Enable using the Ninja generator instead of Visual Studio on Windows builds.Oct 22, 2020
@jkoritzinsky
jkoritzinsky marked this pull request as ready for review October 22, 2020 18:39
@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

This PR is ready for review!

<Target Name="BuildNativeUnix"
BeforeTargets="Build"
Condition="'$(TargetOS)' != 'Windows_NT'">
Condition="!$([MSBuild]::IsOsPlatform(Windows))">

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.

Unsure if this ever worked but the TargetOS check doesn't assert the current OS but the target one that is passed in via the -os switch.

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.

Can I build the native bits targeting Unix on Windows?

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.

This broke with the WASM on Windows build, since it was going down the build-native.sh path when it should have gone down the build-native.cmd path.

Comment threadsrc/coreclr/build-runtime.cmd
Comment threadeng/pipelines/coreclr/templates/build-job.yml Outdated
Comment threadeng/native/functions.cmake Outdated
Comment threadsrc/coreclr/CMakeLists.txt Outdated
Comment threadsrc/coreclr/runtime.proj
Comment threadsrc/coreclr/src/debug/daccess/dacfn.cpp Outdated
Comment threadsrc/libraries/Native/build-native.cmd
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
@BruceForstall

Copy link
Copy Markdown
Contributor

Looks like you need to add more documentation on Ninja, e.g.:

  1. From where do I install it?
  2. How do I install it?
  3. What is the minimum version?

The answers to these questions need to cover all platforms.

The documents at the various "Requirements" links on https://github.com/dotnet/runtime/blob/master/docs/workflow/README.md should be updated.

@BruceForstall

Copy link
Copy Markdown
Contributor

The minimum recommended CMake version is 3.16

I didn't look thoroughly: is there an easily visible warning on the console if you don't have the recommended minimum cmake version? (i.e., it seems like there should be)

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

We have an error for the minimum required CMake, but not a warning for the minimum recommended CMake (this is the first time they differ). I'll add a warning output.

Comment threaddocs/workflow/requirements/windows-requirements.md Outdated
@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

Test failures are #43983 and #43927

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.

7 participants

@jkoritzinsky@hoyosjs@jashook@trylek@janvorli@BruceForstall@ViktorHofer
, '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

Enable using the Ninja generator instead of Visual Studio on Windows builds. - #41897

Merged
jkoritzinsky merged 65 commits into
dotnet:masterfrom
jkoritzinsky:ninja-windows
Nov 2, 2020
Merged

Enable using the Ninja generator instead of Visual Studio on Windows builds.#41897
jkoritzinsky merged 65 commits into
dotnet:masterfrom
jkoritzinsky:ninja-windows

Conversation

@jkoritzinsky

@jkoritzinskyjkoritzinsky commented Sep 4, 2020

Copy link
Copy Markdown
Member

Summary for Infra Rollout

We're enabling users to use Ninja across the coreclr, libraries, and host native builds instead of Visual Studio or Make. Ninja is a slimmed down build orchestrator that performs much faster than MSBuild on our native Windows CoreCLR build and performs comparably to MSBuild on the Windows libraries and host builds and Make on all non-Windows builds.

You can use the -ninja flag to use Ninja to run the native builds instead of MSBuild or Make. For this rollout, we're not changing the default experience for local development, but we are enabling Ninja builds in CI for the CoreCLR build.

There is one breaking change and one non-breaking change for developers:

  • Breaking: If you are using the src/coreclr/build-runtime.cmd script to build on Windows, you'll need to build either the clr.dactools or clr.runtime subset once from the root script first. The DacTableGen tool used in the Windows build has moved out of the CMake build and is now a regular C# project. As a result, it needs to be built via the root build script once so it is available for the native build.
  • Non breaking: The minimum recommended CMake version is 3.16. If you use CMake 3.16 precompiled headers will be used in all builds. If you use CMake 3.15.5 or lower, precompiled headers will not be used. This is a behavior change, since we used to always have precompiled headers on Windows and never have them on non-Windows. If you notice slowness in your Windows build after pulling down this PR and have not updated CMake, try installing CMake 3.16 to re-enable precompiled headers.

Original Summary

This PR enables using the Ninja generator on Windows instead of the Visual Studio CMake generators via the -ninja switch (for the build-runtime.cmd script) and via a Ninja MSBuild global property. To keep pre-compiled headers working on Windows, this PR bumps the minimum recommended CMake version to 3.16. Using an older CMake version is still possible, but your build will not support precompiled headers. However, now precompiled headers are enabled on all platforms (not just Windows) when using CMake 3.16 or higher.

Since the C# support in CMake is only for the Visual Studio generators, I've moved the DacTableGen project into a subset that's included with the clr.runtime subset and also moved the PIA for DIALib into a checked-in ilproj project by decompiling it with ildasm.

To support opening the CoreCLR VS-generated solution in Visual Studio, I've augmented the root -vs flag. If you pass coreclr.sln (case-insensitive) to the -vs flag, the build script will generate the CoreCLR solution for the provided parameters using the VS generator (if it hasn't been generated already) and open the solution in VS.

I've updated the CoreCLR, Libraries, and Host builds to all enable using Ninja.

For this PR, Ninja usage will be opt-in. In the future, we will make Ninja the default generator and make the Visual Studio generator opt-in.

TODO:

  • CI validation
    • The CI machines don't have Ninja installed yet, so this is blocked on getting it installed.
  • Documentation of new options

Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
…urning on /W3 and disabling any new warnings we hit.
…BRARY abstraction feature in CMake 3.14+ (below the minimum requirement on Windows).
@jkoritzinskyjkoritzinsky added this to the 6.0.0 milestone Sep 4, 2020
@jkoritzinsky
jkoritzinsky requested a review from a teamSeptember 4, 2020 21:57
…the VC++ environment for the correct build tools each time instead of interleaving them and relying on Visual Studio to handle the differing targets.
@jkoritzinskyjkoritzinsky changed the title [WIP] Enable using the Ninja generator instead of Visual Studio on Windows builds.Enable using the Ninja generator instead of Visual Studio on Windows builds.Oct 22, 2020
@jkoritzinsky
jkoritzinsky marked this pull request as ready for review October 22, 2020 18:39
@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

This PR is ready for review!

<Target Name="BuildNativeUnix"
BeforeTargets="Build"
Condition="'$(TargetOS)' != 'Windows_NT'">
Condition="!$([MSBuild]::IsOsPlatform(Windows))">

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.

Unsure if this ever worked but the TargetOS check doesn't assert the current OS but the target one that is passed in via the -os switch.

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.

Can I build the native bits targeting Unix on Windows?

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.

This broke with the WASM on Windows build, since it was going down the build-native.sh path when it should have gone down the build-native.cmd path.

Comment threadsrc/coreclr/build-runtime.cmd
Comment threadeng/pipelines/coreclr/templates/build-job.yml Outdated
Comment threadeng/native/functions.cmake Outdated
Comment threadsrc/coreclr/CMakeLists.txt Outdated
Comment threadsrc/coreclr/runtime.proj
Comment threadsrc/coreclr/src/debug/daccess/dacfn.cpp Outdated
Comment threadsrc/libraries/Native/build-native.cmd
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
@BruceForstall

Copy link
Copy Markdown
Contributor

Looks like you need to add more documentation on Ninja, e.g.:

  1. From where do I install it?
  2. How do I install it?
  3. What is the minimum version?

The answers to these questions need to cover all platforms.

The documents at the various "Requirements" links on https://github.com/dotnet/runtime/blob/master/docs/workflow/README.md should be updated.

@BruceForstall

Copy link
Copy Markdown
Contributor

The minimum recommended CMake version is 3.16

I didn't look thoroughly: is there an easily visible warning on the console if you don't have the recommended minimum cmake version? (i.e., it seems like there should be)

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

We have an error for the minimum required CMake, but not a warning for the minimum recommended CMake (this is the first time they differ). I'll add a warning output.

Comment threaddocs/workflow/requirements/windows-requirements.md Outdated
@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

Test failures are #43983 and #43927

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.

7 participants

@jkoritzinsky@hoyosjs@jashook@trylek@janvorli@BruceForstall@ViktorHofer
, '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

Enable using the Ninja generator instead of Visual Studio on Windows builds. - #41897

Merged
jkoritzinsky merged 65 commits into
dotnet:masterfrom
jkoritzinsky:ninja-windows
Nov 2, 2020
Merged

Enable using the Ninja generator instead of Visual Studio on Windows builds.#41897
jkoritzinsky merged 65 commits into
dotnet:masterfrom
jkoritzinsky:ninja-windows

Conversation

@jkoritzinsky

@jkoritzinskyjkoritzinsky commented Sep 4, 2020

Copy link
Copy Markdown
Member

Summary for Infra Rollout

We're enabling users to use Ninja across the coreclr, libraries, and host native builds instead of Visual Studio or Make. Ninja is a slimmed down build orchestrator that performs much faster than MSBuild on our native Windows CoreCLR build and performs comparably to MSBuild on the Windows libraries and host builds and Make on all non-Windows builds.

You can use the -ninja flag to use Ninja to run the native builds instead of MSBuild or Make. For this rollout, we're not changing the default experience for local development, but we are enabling Ninja builds in CI for the CoreCLR build.

There is one breaking change and one non-breaking change for developers:

  • Breaking: If you are using the src/coreclr/build-runtime.cmd script to build on Windows, you'll need to build either the clr.dactools or clr.runtime subset once from the root script first. The DacTableGen tool used in the Windows build has moved out of the CMake build and is now a regular C# project. As a result, it needs to be built via the root build script once so it is available for the native build.
  • Non breaking: The minimum recommended CMake version is 3.16. If you use CMake 3.16 precompiled headers will be used in all builds. If you use CMake 3.15.5 or lower, precompiled headers will not be used. This is a behavior change, since we used to always have precompiled headers on Windows and never have them on non-Windows. If you notice slowness in your Windows build after pulling down this PR and have not updated CMake, try installing CMake 3.16 to re-enable precompiled headers.

Original Summary

This PR enables using the Ninja generator on Windows instead of the Visual Studio CMake generators via the -ninja switch (for the build-runtime.cmd script) and via a Ninja MSBuild global property. To keep pre-compiled headers working on Windows, this PR bumps the minimum recommended CMake version to 3.16. Using an older CMake version is still possible, but your build will not support precompiled headers. However, now precompiled headers are enabled on all platforms (not just Windows) when using CMake 3.16 or higher.

Since the C# support in CMake is only for the Visual Studio generators, I've moved the DacTableGen project into a subset that's included with the clr.runtime subset and also moved the PIA for DIALib into a checked-in ilproj project by decompiling it with ildasm.

To support opening the CoreCLR VS-generated solution in Visual Studio, I've augmented the root -vs flag. If you pass coreclr.sln (case-insensitive) to the -vs flag, the build script will generate the CoreCLR solution for the provided parameters using the VS generator (if it hasn't been generated already) and open the solution in VS.

I've updated the CoreCLR, Libraries, and Host builds to all enable using Ninja.

For this PR, Ninja usage will be opt-in. In the future, we will make Ninja the default generator and make the Visual Studio generator opt-in.

TODO:

  • CI validation
    • The CI machines don't have Ninja installed yet, so this is blocked on getting it installed.
  • Documentation of new options

Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
…urning on /W3 and disabling any new warnings we hit.
…BRARY abstraction feature in CMake 3.14+ (below the minimum requirement on Windows).
@jkoritzinskyjkoritzinsky added this to the 6.0.0 milestone Sep 4, 2020
@jkoritzinsky
jkoritzinsky requested a review from a teamSeptember 4, 2020 21:57
…the VC++ environment for the correct build tools each time instead of interleaving them and relying on Visual Studio to handle the differing targets.
@jkoritzinskyjkoritzinsky changed the title [WIP] Enable using the Ninja generator instead of Visual Studio on Windows builds.Enable using the Ninja generator instead of Visual Studio on Windows builds.Oct 22, 2020
@jkoritzinsky
jkoritzinsky marked this pull request as ready for review October 22, 2020 18:39
@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

This PR is ready for review!

<Target Name="BuildNativeUnix"
BeforeTargets="Build"
Condition="'$(TargetOS)' != 'Windows_NT'">
Condition="!$([MSBuild]::IsOsPlatform(Windows))">

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.

Unsure if this ever worked but the TargetOS check doesn't assert the current OS but the target one that is passed in via the -os switch.

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.

Can I build the native bits targeting Unix on Windows?

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.

This broke with the WASM on Windows build, since it was going down the build-native.sh path when it should have gone down the build-native.cmd path.

Comment threadsrc/coreclr/build-runtime.cmd
Comment threadeng/pipelines/coreclr/templates/build-job.yml Outdated
Comment threadeng/native/functions.cmake Outdated
Comment threadsrc/coreclr/CMakeLists.txt Outdated
Comment threadsrc/coreclr/runtime.proj
Comment threadsrc/coreclr/src/debug/daccess/dacfn.cpp Outdated
Comment threadsrc/libraries/Native/build-native.cmd
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
@BruceForstall

Copy link
Copy Markdown
Contributor

Looks like you need to add more documentation on Ninja, e.g.:

  1. From where do I install it?
  2. How do I install it?
  3. What is the minimum version?

The answers to these questions need to cover all platforms.

The documents at the various "Requirements" links on https://github.com/dotnet/runtime/blob/master/docs/workflow/README.md should be updated.

@BruceForstall

Copy link
Copy Markdown
Contributor

The minimum recommended CMake version is 3.16

I didn't look thoroughly: is there an easily visible warning on the console if you don't have the recommended minimum cmake version? (i.e., it seems like there should be)

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

We have an error for the minimum required CMake, but not a warning for the minimum recommended CMake (this is the first time they differ). I'll add a warning output.

Comment threaddocs/workflow/requirements/windows-requirements.md Outdated
@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

Test failures are #43983 and #43927

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.

7 participants

@jkoritzinsky@hoyosjs@jashook@trylek@janvorli@BruceForstall@ViktorHofer
, '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

Enable using the Ninja generator instead of Visual Studio on Windows builds. - #41897

Merged
jkoritzinsky merged 65 commits into
dotnet:masterfrom
jkoritzinsky:ninja-windows
Nov 2, 2020
Merged

Enable using the Ninja generator instead of Visual Studio on Windows builds.#41897
jkoritzinsky merged 65 commits into
dotnet:masterfrom
jkoritzinsky:ninja-windows

Conversation

@jkoritzinsky

@jkoritzinskyjkoritzinsky commented Sep 4, 2020

Copy link
Copy Markdown
Member

Summary for Infra Rollout

We're enabling users to use Ninja across the coreclr, libraries, and host native builds instead of Visual Studio or Make. Ninja is a slimmed down build orchestrator that performs much faster than MSBuild on our native Windows CoreCLR build and performs comparably to MSBuild on the Windows libraries and host builds and Make on all non-Windows builds.

You can use the -ninja flag to use Ninja to run the native builds instead of MSBuild or Make. For this rollout, we're not changing the default experience for local development, but we are enabling Ninja builds in CI for the CoreCLR build.

There is one breaking change and one non-breaking change for developers:

  • Breaking: If you are using the src/coreclr/build-runtime.cmd script to build on Windows, you'll need to build either the clr.dactools or clr.runtime subset once from the root script first. The DacTableGen tool used in the Windows build has moved out of the CMake build and is now a regular C# project. As a result, it needs to be built via the root build script once so it is available for the native build.
  • Non breaking: The minimum recommended CMake version is 3.16. If you use CMake 3.16 precompiled headers will be used in all builds. If you use CMake 3.15.5 or lower, precompiled headers will not be used. This is a behavior change, since we used to always have precompiled headers on Windows and never have them on non-Windows. If you notice slowness in your Windows build after pulling down this PR and have not updated CMake, try installing CMake 3.16 to re-enable precompiled headers.

Original Summary

This PR enables using the Ninja generator on Windows instead of the Visual Studio CMake generators via the -ninja switch (for the build-runtime.cmd script) and via a Ninja MSBuild global property. To keep pre-compiled headers working on Windows, this PR bumps the minimum recommended CMake version to 3.16. Using an older CMake version is still possible, but your build will not support precompiled headers. However, now precompiled headers are enabled on all platforms (not just Windows) when using CMake 3.16 or higher.

Since the C# support in CMake is only for the Visual Studio generators, I've moved the DacTableGen project into a subset that's included with the clr.runtime subset and also moved the PIA for DIALib into a checked-in ilproj project by decompiling it with ildasm.

To support opening the CoreCLR VS-generated solution in Visual Studio, I've augmented the root -vs flag. If you pass coreclr.sln (case-insensitive) to the -vs flag, the build script will generate the CoreCLR solution for the provided parameters using the VS generator (if it hasn't been generated already) and open the solution in VS.

I've updated the CoreCLR, Libraries, and Host builds to all enable using Ninja.

For this PR, Ninja usage will be opt-in. In the future, we will make Ninja the default generator and make the Visual Studio generator opt-in.

TODO:

  • CI validation
    • The CI machines don't have Ninja installed yet, so this is blocked on getting it installed.
  • Documentation of new options

Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
…urning on /W3 and disabling any new warnings we hit.
…BRARY abstraction feature in CMake 3.14+ (below the minimum requirement on Windows).
@jkoritzinskyjkoritzinsky added this to the 6.0.0 milestone Sep 4, 2020
@jkoritzinsky
jkoritzinsky requested a review from a teamSeptember 4, 2020 21:57
…the VC++ environment for the correct build tools each time instead of interleaving them and relying on Visual Studio to handle the differing targets.
@jkoritzinskyjkoritzinsky changed the title [WIP] Enable using the Ninja generator instead of Visual Studio on Windows builds.Enable using the Ninja generator instead of Visual Studio on Windows builds.Oct 22, 2020
@jkoritzinsky
jkoritzinsky marked this pull request as ready for review October 22, 2020 18:39
@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

This PR is ready for review!

<Target Name="BuildNativeUnix"
BeforeTargets="Build"
Condition="'$(TargetOS)' != 'Windows_NT'">
Condition="!$([MSBuild]::IsOsPlatform(Windows))">

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.

Unsure if this ever worked but the TargetOS check doesn't assert the current OS but the target one that is passed in via the -os switch.

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.

Can I build the native bits targeting Unix on Windows?

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.

This broke with the WASM on Windows build, since it was going down the build-native.sh path when it should have gone down the build-native.cmd path.

Comment threadsrc/coreclr/build-runtime.cmd
Comment threadeng/pipelines/coreclr/templates/build-job.yml Outdated
Comment threadeng/native/functions.cmake Outdated
Comment threadsrc/coreclr/CMakeLists.txt Outdated
Comment threadsrc/coreclr/runtime.proj
Comment threadsrc/coreclr/src/debug/daccess/dacfn.cpp Outdated
Comment threadsrc/libraries/Native/build-native.cmd
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
@BruceForstall

Copy link
Copy Markdown
Contributor

Looks like you need to add more documentation on Ninja, e.g.:

  1. From where do I install it?
  2. How do I install it?
  3. What is the minimum version?

The answers to these questions need to cover all platforms.

The documents at the various "Requirements" links on https://github.com/dotnet/runtime/blob/master/docs/workflow/README.md should be updated.

@BruceForstall

Copy link
Copy Markdown
Contributor

The minimum recommended CMake version is 3.16

I didn't look thoroughly: is there an easily visible warning on the console if you don't have the recommended minimum cmake version? (i.e., it seems like there should be)

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

We have an error for the minimum required CMake, but not a warning for the minimum recommended CMake (this is the first time they differ). I'll add a warning output.

Comment threaddocs/workflow/requirements/windows-requirements.md Outdated
@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

Test failures are #43983 and #43927

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.

7 participants

@jkoritzinsky@hoyosjs@jashook@trylek@janvorli@BruceForstall@ViktorHofer
, '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

Enable using the Ninja generator instead of Visual Studio on Windows builds. - #41897

Merged
jkoritzinsky merged 65 commits into
dotnet:masterfrom
jkoritzinsky:ninja-windows
Nov 2, 2020
Merged

Enable using the Ninja generator instead of Visual Studio on Windows builds.#41897
jkoritzinsky merged 65 commits into
dotnet:masterfrom
jkoritzinsky:ninja-windows

Conversation

@jkoritzinsky

@jkoritzinskyjkoritzinsky commented Sep 4, 2020

Copy link
Copy Markdown
Member

Summary for Infra Rollout

We're enabling users to use Ninja across the coreclr, libraries, and host native builds instead of Visual Studio or Make. Ninja is a slimmed down build orchestrator that performs much faster than MSBuild on our native Windows CoreCLR build and performs comparably to MSBuild on the Windows libraries and host builds and Make on all non-Windows builds.

You can use the -ninja flag to use Ninja to run the native builds instead of MSBuild or Make. For this rollout, we're not changing the default experience for local development, but we are enabling Ninja builds in CI for the CoreCLR build.

There is one breaking change and one non-breaking change for developers:

  • Breaking: If you are using the src/coreclr/build-runtime.cmd script to build on Windows, you'll need to build either the clr.dactools or clr.runtime subset once from the root script first. The DacTableGen tool used in the Windows build has moved out of the CMake build and is now a regular C# project. As a result, it needs to be built via the root build script once so it is available for the native build.
  • Non breaking: The minimum recommended CMake version is 3.16. If you use CMake 3.16 precompiled headers will be used in all builds. If you use CMake 3.15.5 or lower, precompiled headers will not be used. This is a behavior change, since we used to always have precompiled headers on Windows and never have them on non-Windows. If you notice slowness in your Windows build after pulling down this PR and have not updated CMake, try installing CMake 3.16 to re-enable precompiled headers.

Original Summary

This PR enables using the Ninja generator on Windows instead of the Visual Studio CMake generators via the -ninja switch (for the build-runtime.cmd script) and via a Ninja MSBuild global property. To keep pre-compiled headers working on Windows, this PR bumps the minimum recommended CMake version to 3.16. Using an older CMake version is still possible, but your build will not support precompiled headers. However, now precompiled headers are enabled on all platforms (not just Windows) when using CMake 3.16 or higher.

Since the C# support in CMake is only for the Visual Studio generators, I've moved the DacTableGen project into a subset that's included with the clr.runtime subset and also moved the PIA for DIALib into a checked-in ilproj project by decompiling it with ildasm.

To support opening the CoreCLR VS-generated solution in Visual Studio, I've augmented the root -vs flag. If you pass coreclr.sln (case-insensitive) to the -vs flag, the build script will generate the CoreCLR solution for the provided parameters using the VS generator (if it hasn't been generated already) and open the solution in VS.

I've updated the CoreCLR, Libraries, and Host builds to all enable using Ninja.

For this PR, Ninja usage will be opt-in. In the future, we will make Ninja the default generator and make the Visual Studio generator opt-in.

TODO:

  • CI validation
    • The CI machines don't have Ninja installed yet, so this is blocked on getting it installed.
  • Documentation of new options

Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
…urning on /W3 and disabling any new warnings we hit.
…BRARY abstraction feature in CMake 3.14+ (below the minimum requirement on Windows).
@jkoritzinskyjkoritzinsky added this to the 6.0.0 milestone Sep 4, 2020
@jkoritzinsky
jkoritzinsky requested a review from a teamSeptember 4, 2020 21:57
…the VC++ environment for the correct build tools each time instead of interleaving them and relying on Visual Studio to handle the differing targets.
@jkoritzinskyjkoritzinsky changed the title [WIP] Enable using the Ninja generator instead of Visual Studio on Windows builds.Enable using the Ninja generator instead of Visual Studio on Windows builds.Oct 22, 2020
@jkoritzinsky
jkoritzinsky marked this pull request as ready for review October 22, 2020 18:39
@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

This PR is ready for review!

<Target Name="BuildNativeUnix"
BeforeTargets="Build"
Condition="'$(TargetOS)' != 'Windows_NT'">
Condition="!$([MSBuild]::IsOsPlatform(Windows))">

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.

Unsure if this ever worked but the TargetOS check doesn't assert the current OS but the target one that is passed in via the -os switch.

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.

Can I build the native bits targeting Unix on Windows?

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.

This broke with the WASM on Windows build, since it was going down the build-native.sh path when it should have gone down the build-native.cmd path.

Comment threadsrc/coreclr/build-runtime.cmd
Comment threadeng/pipelines/coreclr/templates/build-job.yml Outdated
Comment threadeng/native/functions.cmake Outdated
Comment threadsrc/coreclr/CMakeLists.txt Outdated
Comment threadsrc/coreclr/runtime.proj
Comment threadsrc/coreclr/src/debug/daccess/dacfn.cpp Outdated
Comment threadsrc/libraries/Native/build-native.cmd
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
@BruceForstall

Copy link
Copy Markdown
Contributor

Looks like you need to add more documentation on Ninja, e.g.:

  1. From where do I install it?
  2. How do I install it?
  3. What is the minimum version?

The answers to these questions need to cover all platforms.

The documents at the various "Requirements" links on https://github.com/dotnet/runtime/blob/master/docs/workflow/README.md should be updated.

@BruceForstall

Copy link
Copy Markdown
Contributor

The minimum recommended CMake version is 3.16

I didn't look thoroughly: is there an easily visible warning on the console if you don't have the recommended minimum cmake version? (i.e., it seems like there should be)

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

We have an error for the minimum required CMake, but not a warning for the minimum recommended CMake (this is the first time they differ). I'll add a warning output.

Comment threaddocs/workflow/requirements/windows-requirements.md Outdated
@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

Test failures are #43983 and #43927

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.

7 participants

@jkoritzinsky@hoyosjs@jashook@trylek@janvorli@BruceForstall@ViktorHofer
, '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

Enable using the Ninja generator instead of Visual Studio on Windows builds. - #41897

Merged
jkoritzinsky merged 65 commits into
dotnet:masterfrom
jkoritzinsky:ninja-windows
Nov 2, 2020
Merged

Enable using the Ninja generator instead of Visual Studio on Windows builds.#41897
jkoritzinsky merged 65 commits into
dotnet:masterfrom
jkoritzinsky:ninja-windows

Conversation

@jkoritzinsky

@jkoritzinskyjkoritzinsky commented Sep 4, 2020

Copy link
Copy Markdown
Member

Summary for Infra Rollout

We're enabling users to use Ninja across the coreclr, libraries, and host native builds instead of Visual Studio or Make. Ninja is a slimmed down build orchestrator that performs much faster than MSBuild on our native Windows CoreCLR build and performs comparably to MSBuild on the Windows libraries and host builds and Make on all non-Windows builds.

You can use the -ninja flag to use Ninja to run the native builds instead of MSBuild or Make. For this rollout, we're not changing the default experience for local development, but we are enabling Ninja builds in CI for the CoreCLR build.

There is one breaking change and one non-breaking change for developers:

  • Breaking: If you are using the src/coreclr/build-runtime.cmd script to build on Windows, you'll need to build either the clr.dactools or clr.runtime subset once from the root script first. The DacTableGen tool used in the Windows build has moved out of the CMake build and is now a regular C# project. As a result, it needs to be built via the root build script once so it is available for the native build.
  • Non breaking: The minimum recommended CMake version is 3.16. If you use CMake 3.16 precompiled headers will be used in all builds. If you use CMake 3.15.5 or lower, precompiled headers will not be used. This is a behavior change, since we used to always have precompiled headers on Windows and never have them on non-Windows. If you notice slowness in your Windows build after pulling down this PR and have not updated CMake, try installing CMake 3.16 to re-enable precompiled headers.

Original Summary

This PR enables using the Ninja generator on Windows instead of the Visual Studio CMake generators via the -ninja switch (for the build-runtime.cmd script) and via a Ninja MSBuild global property. To keep pre-compiled headers working on Windows, this PR bumps the minimum recommended CMake version to 3.16. Using an older CMake version is still possible, but your build will not support precompiled headers. However, now precompiled headers are enabled on all platforms (not just Windows) when using CMake 3.16 or higher.

Since the C# support in CMake is only for the Visual Studio generators, I've moved the DacTableGen project into a subset that's included with the clr.runtime subset and also moved the PIA for DIALib into a checked-in ilproj project by decompiling it with ildasm.

To support opening the CoreCLR VS-generated solution in Visual Studio, I've augmented the root -vs flag. If you pass coreclr.sln (case-insensitive) to the -vs flag, the build script will generate the CoreCLR solution for the provided parameters using the VS generator (if it hasn't been generated already) and open the solution in VS.

I've updated the CoreCLR, Libraries, and Host builds to all enable using Ninja.

For this PR, Ninja usage will be opt-in. In the future, we will make Ninja the default generator and make the Visual Studio generator opt-in.

TODO:

  • CI validation
    • The CI machines don't have Ninja installed yet, so this is blocked on getting it installed.
  • Documentation of new options

Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
…urning on /W3 and disabling any new warnings we hit.
…BRARY abstraction feature in CMake 3.14+ (below the minimum requirement on Windows).
@jkoritzinskyjkoritzinsky added this to the 6.0.0 milestone Sep 4, 2020
@jkoritzinsky
jkoritzinsky requested a review from a teamSeptember 4, 2020 21:57
…the VC++ environment for the correct build tools each time instead of interleaving them and relying on Visual Studio to handle the differing targets.
@jkoritzinskyjkoritzinsky changed the title [WIP] Enable using the Ninja generator instead of Visual Studio on Windows builds.Enable using the Ninja generator instead of Visual Studio on Windows builds.Oct 22, 2020
@jkoritzinsky
jkoritzinsky marked this pull request as ready for review October 22, 2020 18:39
@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

This PR is ready for review!

<Target Name="BuildNativeUnix"
BeforeTargets="Build"
Condition="'$(TargetOS)' != 'Windows_NT'">
Condition="!$([MSBuild]::IsOsPlatform(Windows))">

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.

Unsure if this ever worked but the TargetOS check doesn't assert the current OS but the target one that is passed in via the -os switch.

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.

Can I build the native bits targeting Unix on Windows?

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.

This broke with the WASM on Windows build, since it was going down the build-native.sh path when it should have gone down the build-native.cmd path.

Comment threadsrc/coreclr/build-runtime.cmd
Comment threadeng/pipelines/coreclr/templates/build-job.yml Outdated
Comment threadeng/native/functions.cmake Outdated
Comment threadsrc/coreclr/CMakeLists.txt Outdated
Comment threadsrc/coreclr/runtime.proj
Comment threadsrc/coreclr/src/debug/daccess/dacfn.cpp Outdated
Comment threadsrc/libraries/Native/build-native.cmd
Signed-off-by: Jeremy Koritzinsky <jekoritz@microsoft.com>
@BruceForstall

Copy link
Copy Markdown
Contributor

Looks like you need to add more documentation on Ninja, e.g.:

  1. From where do I install it?
  2. How do I install it?
  3. What is the minimum version?

The answers to these questions need to cover all platforms.

The documents at the various "Requirements" links on https://github.com/dotnet/runtime/blob/master/docs/workflow/README.md should be updated.

@BruceForstall

Copy link
Copy Markdown
Contributor

The minimum recommended CMake version is 3.16

I didn't look thoroughly: is there an easily visible warning on the console if you don't have the recommended minimum cmake version? (i.e., it seems like there should be)

@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

We have an error for the minimum required CMake, but not a warning for the minimum recommended CMake (this is the first time they differ). I'll add a warning output.

Comment threaddocs/workflow/requirements/windows-requirements.md Outdated
@jkoritzinsky

Copy link
Copy Markdown
MemberAuthor

Test failures are #43983 and #43927

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.

7 participants

@jkoritzinsky@hoyosjs@jashook@trylek@janvorli@BruceForstall@ViktorHofer