Source code

Revision control

Copy as Markdown

Other Tools

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from __future__ import absolute_import, print_function, unicode_literals
import ctypes
import os
import sys
import subprocess
from mozboot.base import BaseBootstrapper
from mozfile import which
def is_aarch64_host():
from ctypes import wintypes
kernel32 = ctypes.windll.kernel32
IMAGE_FILE_MACHINE_UNKNOWN = 0
IMAGE_FILE_MACHINE_ARM64 = 0xAA64
try:
iswow64process2 = kernel32.IsWow64Process2
except Exception:
# If we can't access the symbol, we know we're not on aarch64.
return False
currentProcess = kernel32.GetCurrentProcess()
processMachine = wintypes.USHORT(IMAGE_FILE_MACHINE_UNKNOWN)
nativeMachine = wintypes.USHORT(IMAGE_FILE_MACHINE_UNKNOWN)
gotValue = iswow64process2(
currentProcess, ctypes.byref(processMachine), ctypes.byref(nativeMachine)
)
# If this call fails, we have no idea.
if not gotValue:
return False
return nativeMachine.value == IMAGE_FILE_MACHINE_ARM64
class WindowsBootstrapper(BaseBootstrapper):
"""Bootstrapper for msys2 based environments for building in Windows."""
SYSTEM_PACKAGES = [
"mingw-w64-x86_64-make",
"mingw-w64-x86_64-perl",
"patch",
"patchutils",
"diffutils",
"tar",
"zip",
"unzip",
"mingw-w64-x86_64-toolchain", # TODO: Remove when Mercurial is installable from a wheel.
"mingw-w64-i686-toolchain",
]
BROWSER_PACKAGES = ["mingw-w64-x86_64-nasm", "mingw-w64-i686-nsis"]
def __init__(self, **kwargs):
if (
"MOZ_WINDOWS_BOOTSTRAP" not in os.environ
or os.environ["MOZ_WINDOWS_BOOTSTRAP"] != "1"
):
raise NotImplementedError(
"Bootstrap support for Windows is under development. For "
"now use MozillaBuild to set up a build environment on "
"Windows. If you are testing Windows Bootstrap support, "
"try `export MOZ_WINDOWS_BOOTSTRAP=1`"
)
BaseBootstrapper.__init__(self, **kwargs)
if not which("pacman"):
raise NotImplementedError(
"The Windows bootstrapper only works with msys2 with "
"pacman. Get msys2 at http://msys2.github.io/"
)
print("Using an experimental bootstrapper for Windows.")
def install_system_packages(self):
self.pacman_install(*self.SYSTEM_PACKAGES)
def upgrade_mercurial(self, current):
self.pip_install("mercurial")
def install_browser_packages(self, mozconfig_builder):
self.pacman_install(*self.BROWSER_PACKAGES)
def install_mobile_android_packages(self, mozconfig_builder):
raise NotImplementedError(
"We do not support building Android on Windows. Sorry!"
)
def ensure_mobile_android_packages(self):
raise NotImplementedError(
"We do not support building Android on Windows. Sorry!"
)
def install_mobile_android_artifact_mode_packages(self, mozconfig_builder):
raise NotImplementedError(
"We do not support building Android on Windows. Sorry!"
)
def ensure_clang_static_analysis_package(self):
from mozboot import static_analysis
self.install_toolchain_static_analysis(static_analysis.WINDOWS_CLANG_TIDY)
def ensure_stylo_packages(self):
# On-device artifact builds are supported; on-device desktop builds are not.
if is_aarch64_host():
raise Exception(
"You should not be performing desktop builds on an "
"AArch64 device. If you want to do artifact builds "
"instead, please choose the appropriate artifact build "
"option when beginning bootstrap."
)
self.install_toolchain_artifact("clang")
self.install_toolchain_artifact("cbindgen")
def ensure_nasm_packages(self):
self.install_toolchain_artifact("nasm")
def ensure_node_packages(self):
self.install_toolchain_artifact("node")
def _update_package_manager(self):
self.pacman_update()
def run(self, command):
subprocess.check_call(command, stdin=sys.stdin)
def pacman_update(self):
command = ["pacman", "--sync", "--refresh"]
self.run(command)
def pacman_upgrade(self):
command = ["pacman", "--sync", "--refresh", "--sysupgrade"]
self.run(command)
def pacman_install(self, *packages):
command = ["pacman", "--sync", "--needed"]
if self.no_interactive:
command.append("--noconfirm")
command.extend(packages)
self.run(command)
def pip_install(self, *packages):
command = ["pip", "install", "--upgrade"]
command.extend(packages)
self.run(command)