build: bring in a later compiler for Windows on Arm (#18591)

* build: allow pulling in a later version of Clang

Due to a code-generation defect related to virtual method thunks in the
official compiler used for Chromium M76, it's necessary to build for WoA
with a later version of Clang. When running gclient sync, setting
ELECTRON_BUILD_WOA=1 in the environment will download a corrected
compiler which doesn't have this defect.

* docs: add a note about building for Windows on Arm
This commit is contained in:
Richard Townsend 2019-06-03 22:29:25 +01:00 committed by John Kleinschmidt
parent b4276835d8
commit 3c8acf3687
3 changed files with 65 additions and 4 deletions

View file

@ -194,16 +194,39 @@ $ gn gen out/Debug-x86 --args='... target_cpu = "x86"'
``` ```
Not all combinations of source and target CPU/OS are supported by Chromium. Not all combinations of source and target CPU/OS are supported by Chromium.
Only cross-compiling Windows 32-bit from Windows 64-bit and Linux 32-bit from
Linux 64-bit have been tested in Electron. If you test other combinations and <table>
find them to work, please update this document :) <tr><th>Host</th><th>Target</th><th>Status</th></tr>
<tr><td>Windows x64</td><td>Windows arm64</td><td>Experimental</td>
<tr><td>Windows x64</td><td>Windows x86</td><td>Automatically tested</td></tr>
<tr><td>Linux x64</td><td>Linux x86</td><td>Automatically tested</td></tr>
</table>
If you test other combinations and find them to work, please update this document :)
See the GN reference for allowable values of [`target_os`][target_os values] See the GN reference for allowable values of [`target_os`][target_os values]
and [`target_cpu`][target_cpu values] and [`target_cpu`][target_cpu values].
[target_os values]: https://gn.googlesource.com/gn/+/master/docs/reference.md#built_in-predefined-variables-target_os_the-desired-operating-system-for-the-build-possible-values [target_os values]: https://gn.googlesource.com/gn/+/master/docs/reference.md#built_in-predefined-variables-target_os_the-desired-operating-system-for-the-build-possible-values
[target_cpu values]: https://gn.googlesource.com/gn/+/master/docs/reference.md#built_in-predefined-variables-target_cpu_the-desired-cpu-architecture-for-the-build-possible-values [target_cpu values]: https://gn.googlesource.com/gn/+/master/docs/reference.md#built_in-predefined-variables-target_cpu_the-desired-cpu-architecture-for-the-build-possible-values
#### Windows on Arm (experimental)
To cross-compile for Windows on Arm, [follow Chromium's guide](https://chromium.googlesource.com/chromium/src/+/refs/heads/master/docs/windows_build_instructions.md#Visual-Studio) to get the necessary dependencies, SDK and libraries, then build with `ELECTRON_BUILDING_WOA=1` in your environment before running `gclient sync`.
```bat
set ELECTRON_BUILDING_WOA=1
gclient sync -f --with_branch_heads --with_tags
```
Or (if using PowerShell):
```powershell
$env:ELECTRON_BUILDING_WOA=1
gclient sync -f --with_branch_heads --with_tags
```
Next, run `gn gen` as above with `target_cpu="arm64"`.
## Tests ## Tests
To run the tests, you'll first need to build the test modules against the To run the tests, you'll first need to build the test modules against the

View file

@ -78,3 +78,4 @@ worker_context_will_destroy.patch
fix_breakpad_symbol_generation_on_linux_arm.patch fix_breakpad_symbol_generation_on_linux_arm.patch
cross_site_document_resource_handler.patch cross_site_document_resource_handler.patch
frame_host_manager.patch frame_host_manager.patch
woa_compiler_workaround.patch

View file

@ -0,0 +1,37 @@
From b3414d055399d0a21f6166a536467ea752b2aa8a Mon Sep 17 00:00:00 2001
From: Richard Townsend <richard.townsend@arm.com>
Date: Mon, 3 Jun 2019 09:52:49 +0100
Subject: build: pull in a fixed compiler for Windows on Arm
Due to a code-generation defect in the version of Clang used for the M76
branch related to virtual method thunks, it's necessary to build M76
with a later version of Clang. This change pulls in a corrected version
by setting ELECTRON_BUILDING_WOA=1 or similar in the environment.
This PR is only intended to be a temporary workaround and will be
removed when Electron's Chromium updates to a compiler unaffected by
this issue.
---
tools/clang/scripts/update.py | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index 876fb66d1ac6..69c2688aaf55 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -40,6 +40,12 @@ CLANG_REVISION = '67510fac36d27b2e22c7cd955fc167136b737b93'
CLANG_SVN_REVISION = '361212'
CLANG_SUB_REVISION = 2
+if os.getenv('ELECTRON_BUILDING_WOA'):
+ CLANG_REVISION = '56bee1a90a71876cb5067b108bf5715fa1c4e843'
+ CLANG_SVN_REVISION = '361657'
+ CLANG_SUB_REVISION = 1
+
+
PACKAGE_VERSION = '%s-%s-%s' % (CLANG_SVN_REVISION, CLANG_REVISION[:8],
CLANG_SUB_REVISION)
RELEASE_VERSION = '9.0.0'
--
2.19.1.windows.1