Skip to content
Permalink
Browse files

Auto merge of #24149 - jdm:opt-in-msbuild, r=<try>

[WIP] Opt in msbuild

<!-- Reviewable:start -->
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/24149)
<!-- Reviewable:end -->
  • Loading branch information...
bors-servo committed Sep 11, 2019
2 parents 86ad841 + ee485c8 commit 29f8937f647a9e46c6711b3b14ec79d58c39d9c3
Showing with 138 additions and 76 deletions.
  1. +30 −3 etc/taskcluster/decision_task.py
  2. +5 −70 python/servo/build_commands.py
  3. +48 −0 python/servo/command_base.py
  4. +55 −3 python/servo/package_commands.py
@@ -55,7 +55,7 @@ def main(task_for):

"try-mac": [macos_unit],
"try-linux": [linux_tidy_unit_docs, linux_release],
"try-windows": [windows_unit, windows_arm64, windows_uwp_x64],
"try-windows": [windows_arm64, windows_uwp_x64, uwp_nightly],
"try-magicleap": [magicleap_dev],
"try-arm": [windows_arm64],
"try-wpt": [linux_wpt],
@@ -92,6 +92,7 @@ def main(task_for):
macos_nightly()
update_wpt()
magicleap_nightly()
uwp_nightly()


# These are disabled in a "real" decision task,
@@ -377,7 +378,11 @@ def windows_arm64():
return (
windows_build_task("UWP dev build", arch="arm64", package=False)
.with_treeherder("Windows arm64")
.with_script("python mach build --dev --uwp --win-arm64")
.with_script(
"python mach build --dev --uwp --win-arm64",
"python mach package --dev --target aarch64-pc-windows-msvc --uwp=arm64",
)
.with_artifacts('repo/support/hololens/AppPackages/ServoApp/ServoApp_1.0.0.0_Debug_Test/ServoApp_1.0.0.0_arm64_Debug.appxbundle')
.find_or_create("build.windows_uwp_arm64_dev." + CONFIG.task_id())
)

@@ -386,11 +391,33 @@ def windows_uwp_x64():
return (
windows_build_task("UWP dev build", package=False)
.with_treeherder("Windows x64")
.with_script("mach build --dev --uwp")
.with_script(
"mach build --dev --uwp",
"mach package --dev --uwp=x64",
)
.with_artifacts('repo/support/hololens/AppPackages/ServoApp/ServoApp_1.0.0.0_Debug_Test/ServoApp_1.0.0.0_x64_Debug.appxbundle')
.find_or_create("build.windows_uwp_x64_dev." + CONFIG.task_id())
)


def uwp_nightly():
return (
windows_build_task("Nightly UWP build and upload", package=False)
.with_treeherder("Windows x64", "UWP Nightly")
#.with_features("taskclusterProxy")
#.with_scopes("secrets:get:project/servo/s3-upload-credentials")
.with_script(
"mach build --release --uwp",
"python mach build --release --uwp --win-arm64",
"mach package --release --uwp=x64 --uwp=arm64",
#"mach upload-nightly uwp --secret-from-taskcluster",
)
.with_artifacts('repo/support/hololens/AppPackages/ServoApp/ServoApp_1.0.0.0_Test/ServoApp_1.0.0.0_x64_arm64.appxbundle')
.with_max_run_time_minutes(3 * 60)
.find_or_create("build.windows_uwp_nightlies." + CONFIG.task_id())
)


def windows_unit():
return (
windows_build_task("Dev build + unit tests")
@@ -249,25 +249,18 @@ def build(self, release=False, dev=False, jobs=None, params=None,
env["CXXFLAGS"] += "-mmacosx-version-min=10.10"

if 'windows' in host:
vsinstalldir = os.environ.get('VSINSTALLDIR')
vcinstalldir = None
vs_version = os.environ.get('VisualStudioVersion')
if vsinstalldir and vs_version:
msbuild_version = get_msbuild_version(vs_version)
else:
(vsinstalldir, vs_version, msbuild_version) = find_highest_msvc_version()
msbuildinstalldir = os.path.join(vsinstalldir, "MSBuild",
msbuild_version, "Bin")
vs_dirs = self.vs_dirs()
msbuildinstalldir = vs_dirs['msbuild']

if host != target_triple and 'windows' in target_triple:
if os.environ.get('VisualStudioVersion'):
print("Can't cross-compile for Windows inside of a Visual Studio shell.\n"
"Please run `python mach build [arguments]` to bypass automatic "
"Visual Studio shell.")
sys.exit(1)
vcinstalldir = os.environ.get("VCINSTALLDIR", "") or os.path.join(vsinstalldir, "VC")
vcinstalldir = vs_dirs['vcdir']
if not os.path.exists(vcinstalldir):
print("Can't find Visual C++ %s installation at %s." % (vs_version, vcinstalldir))
print("Can't find Visual C++ %s installation at %s." % (vs_dirs['vs_version'], vcinstalldir))
sys.exit(1)

env['PKG_CONFIG_ALLOW_CROSS'] = "1"
@@ -695,13 +688,9 @@ def package_generated_shared_libraries(libs, build_path, servo_exe_dir):

# UWP app packaging already bundles all required DLLs for us.
print("Packaging MSVC DLLs")
if not package_msvc_dlls(servo_exe_dir, target_triple, vcinstalldir, vs_version):
if not package_msvc_dlls(servo_exe_dir, target_triple, vs_dirs['vcdir'], vs_dirs['vs_version']):
status = 1

# UWP build hololens
if uwp and status == 0:
build_uwp_hololens(target_triple, dev, msbuildinstalldir)

elif sys.platform == "darwin":
# On the Mac, set a lovely icon. This makes it easier to pick out the Servo binary in tools
# like Instruments.app.
@@ -907,31 +896,6 @@ def package_gstreamer_dlls(env, servo_exe_dir, target, uwp):
return not missing


def build_uwp_hololens(target, dev, msbuild_dir):
# determine Visual studio Build Configuration (Debug/Release) and
# Build Platform (x64 vs arm64)
vs_platforms = {
"x86_64": "x64",
"i686": "x86",
"aarch64": "arm64",
}
target_arch = target.split('-')[0]
vs_platform = vs_platforms[target_arch]

if dev:
Configuration = "Debug"
else:
Configuration = "Release"

# execute msbuild
# Note: /m implies to use as many CPU cores as possible while building.
# msbuild /m /p:project=ServoApp .\support\hololens\servoapp.sln /p:SolutionDir=.\support\hololens
# /p:Configuration="Debug" /p:Platform="x64" /property:AppxBundle=Always;AppxBundlePlatforms="x64"
check_call([msbuild_dir + "\msbuild.exe", "/m", "/p:project=ServoApp", ".\support\hololens\ServoApp.sln",
"/p:SolutionDir=.\support\hololens",
"/p:Configuration=" + Configuration,
"/p:Platform=" + vs_platform,
"/p:AppxBundle=Always;AppxBundlePlatforms=" + vs_platform])


def package_msvc_dlls(servo_exe_dir, target, vcinstalldir, vs_version):
@@ -1004,32 +968,3 @@ def package_msvc_dlls(servo_exe_dir, target, vcinstalldir, vs_version):
return not missing


def get_msbuild_version(vs_version):
if vs_version in ("15.0", "14.0"):
msbuild_version = vs_version
else:
msbuild_version = "Current"
return msbuild_version


def find_highest_msvc_version():
editions = ["Enterprise", "Professional", "Community", "BuildTools"]
prog_files = os.environ.get("ProgramFiles(x86)")
base_vs_path = os.path.join(prog_files, "Microsoft Visual Studio")

vs_versions = ["2019", "2017"]
versions = {
("2019", "vs"): "16.0",
("2017", "vs"): "15.0",
}

for version in vs_versions:
for edition in editions:
vs_version = versions[version, "vs"]
msbuild_version = get_msbuild_version(vs_version)

vsinstalldir = os.path.join(base_vs_path, version, edition)
if os.path.exists(vsinstalldir):
return (vsinstalldir, vs_version, msbuild_version)
print("Can't find MSBuild.exe installation under %s." % base_vs_path)
sys.exit(1)
@@ -597,6 +597,23 @@ def set_run_env(self, android=False):
def msvc_package_dir(self, package):
return path.join(self.context.sharedir, "msvc-dependencies", package, msvc_deps[package])

def vs_dirs(self):
assert 'windows' in host_triple()
vsinstalldir = os.environ.get('VSINSTALLDIR')
vs_version = os.environ.get('VisualStudioVersion')
if vsinstalldir and vs_version:
msbuild_version = get_msbuild_version(vs_version)
else:
(vsinstalldir, vs_version, msbuild_version) = find_highest_msvc_version()
msbuildinstalldir = os.path.join(vsinstalldir, "MSBuild", msbuild_version, "Bin")
vcinstalldir = os.environ.get("VCINSTALLDIR", "") or os.path.join(vsinstalldir, "VC")
return {
'msbuild': msbuildinstalldir,
'vsdir': vsinstalldir,
'vs_version': vs_version,
'vcdir': vcinstalldir,
}

def build_env(self, hosts_file_path=None, target=None, is_build=False, test_unit=False):
"""Return an extended environment dictionary."""
env = os.environ.copy()
@@ -978,3 +995,34 @@ def ensure_clobbered(self, target_dir=None):
sys.exit(error)
else:
print("Clobber not needed.")


def find_highest_msvc_version():
editions = ["Enterprise", "Professional", "Community", "BuildTools"]
prog_files = os.environ.get("ProgramFiles(x86)")
base_vs_path = os.path.join(prog_files, "Microsoft Visual Studio")

vs_versions = ["2019", "2017"]
versions = {
("2019", "vs"): "16.0",
("2017", "vs"): "15.0",
}

for version in vs_versions:
for edition in editions:
vs_version = versions[version, "vs"]
msbuild_version = get_msbuild_version(vs_version)

vsinstalldir = os.path.join(base_vs_path, version, edition)
if os.path.exists(vsinstalldir):
return (vsinstalldir, vs_version, msbuild_version)
print("Can't find MSBuild.exe installation under %s." % base_vs_path)
sys.exit(1)


def get_msbuild_version(vs_version):
if vs_version in ("15.0", "14.0"):
msbuild_version = vs_version
else:
msbuild_version = "Current"
return msbuild_version
@@ -34,6 +34,7 @@
from servo.command_base import (
archive_deterministically,
BuildNotFound,
check_call,
cd,
CommandBase,
is_macosx,
@@ -67,6 +68,9 @@
r'target\release\msi\Servo.exe',
r'target\release\msi\Servo.zip',
],
'uwp': [
r'support\hololens\AppPackages\ServoApp\ServoApp_1.0.0.0_Test\ServoApp_1.0.0.0_x64_arm64.appxbundle',
],
}


@@ -202,8 +206,12 @@ class PackageCommands(CommandBase):
default=None,
action='store_true',
help='Create a local Maven repository')
@CommandArgument('--uwp',
default=None,
action='append',
help='Create an APPX package')
def package(self, release=False, dev=False, android=None, magicleap=None, debug=False,
debugger=None, target=None, flavor=None, maven=False):
debugger=None, target=None, flavor=None, maven=False, uwp=None):
if android is None:
android = self.config["build"]["android"]
if target and android:
@@ -219,10 +227,13 @@ def package(self, release=False, dev=False, android=None, magicleap=None, debug=
if magicleap:
target = "aarch64-linux-android"
env = self.build_env(target=target)
binary_path = self.get_binary_path(release, dev, target=target, android=android, magicleap=magicleap)
binary_path = self.get_binary_path(release, dev, target=target, android=android, magicleap=magicleap, simpleservo=uwp is not None)
dir_to_root = self.get_top_dir()
target_dir = path.dirname(binary_path)
if magicleap:
if uwp:
vs_info = self.vs_dirs()
build_uwp(uwp, dev, vs_info['msbuild'])
elif magicleap:
if platform.system() not in ["Darwin"]:
raise Exception("Magic Leap builds are only supported on macOS.")
if not env.get("MAGICLEAP_SDK"):
@@ -724,3 +735,44 @@ def call_git(cmd, **kwargs):
update_brew(packages[0], timestamp)

return 0


def build_uwp(platforms, dev, msbuild_dir):
if any(map(lambda p: p not in ['x64', 'x86', 'arm64'], platforms)):
raise Exception("Unsupported appx platforms: " + str(platforms))
if dev and len(platforms) > 1:
raise Exception("Debug package with multiple architectures is unsupported")


if dev:
Configuration = "Debug"
else:
Configuration = "Release"

# execute msbuild
# Note: /m implies to use as many CPU cores as possible while building.
# msbuild /m /p:project=ServoApp .\support\hololens\servoapp.sln
# /p:Configuration="Debug" /p:Platform="x64" /property:AppxBundle=Always;AppxBundlePlatforms="x64"
msbuild = path.join(msbuild_dir, "msbuild.exe")
project = path.join('.', 'support', 'hololens', 'ServoApp.sln')
for platform in platforms:
subprocess.check_call([
msbuild,
"/m",
"/p:project=ServoApp",
project,
"/p:Configuration=" + Configuration,
'/p:Platform=%s' % platform,
])

# Generate an appxbundle by combining all of the previous builds.
subprocess.check_call([
msbuild,
"/m",
"/p:project=ServoApp",
project,
"/p:Configuration=" + Configuration,
"/p:AppxBundle=Always",
"/p:Platform=%s" % platforms[0],
"/p:AppxBundlePlatforms=%s" % '|'.join(platforms),
])

0 comments on commit 29f8937

Please sign in to comment.
You can’t perform that action at this time.