From d8c0b87eb20f5c8e511ea920358d51c5199ccfab Mon Sep 17 00:00:00 2001 From: Jack Moffitt Date: Thu, 30 Jun 2016 11:51:44 -0600 Subject: [PATCH] Add Windows packaging to create an MSI installer --- components/servo/.cargo/config | 3 + components/servo/fake-ld.cmd | 2 + etc/ci/upload_nightly.sh | 4 +- python/servo/package_commands.py | 59 ++++++++- resources/Servo.ico | Bin 0 -> 32988 bytes support/windows/Servo.wxs.mako | 207 +++++++++++++++++++++++++++++++ support/windows/fonts.conf | 44 +++++++ 7 files changed, 312 insertions(+), 7 deletions(-) create mode 100644 components/servo/fake-ld.cmd create mode 100644 resources/Servo.ico create mode 100644 support/windows/Servo.wxs.mako create mode 100644 support/windows/fonts.conf diff --git a/components/servo/.cargo/config b/components/servo/.cargo/config index dffe440072c1..1cea095353fd 100644 --- a/components/servo/.cargo/config +++ b/components/servo/.cargo/config @@ -9,3 +9,6 @@ ar = "arm-linux-gnueabihf-ar" [target.aarch64-unknown-linux-gnu] linker = "aarch64-linux-gnu-gcc" ar = "aarch64-linux-gnu-ar" + +[target.'cfg(target_os=windows)'] +linker = "./fake-ld.cmd" \ No newline at end of file diff --git a/components/servo/fake-ld.cmd b/components/servo/fake-ld.cmd new file mode 100644 index 000000000000..b13c7e818ab6 --- /dev/null +++ b/components/servo/fake-ld.cmd @@ -0,0 +1,2 @@ +@echo off +gcc -mwindows %* diff --git a/etc/ci/upload_nightly.sh b/etc/ci/upload_nightly.sh index e3033cc0902e..dfde162e354c 100755 --- a/etc/ci/upload_nightly.sh +++ b/etc/ci/upload_nightly.sh @@ -41,8 +41,8 @@ main() { extension=dmg package=target/*."${extension}" elif [[ "${platform}" == "windows" ]]; then - extension=tar.gz - package=target/*."${extension}" + extension=msi + package=target/msi/*.msi else usage >&2 return 1 diff --git a/python/servo/package_commands.py b/python/servo/package_commands.py index d3d7877c674d..1bd91e6eae12 100644 --- a/python/servo/package_commands.py +++ b/python/servo/package_commands.py @@ -9,8 +9,11 @@ from __future__ import print_function, unicode_literals -import os +import sys import os.path as path +sys.path.append(path.join(path.dirname(sys.argv[0]), "components", "style", "properties", "Mako-0.9.1.zip")) + +import os import shutil import subprocess import tarfile @@ -24,7 +27,9 @@ Command, ) -from servo.command_base import CommandBase, cd, BuildNotFound, is_macosx +from mako.template import Template + +from servo.command_base import CommandBase, cd, BuildNotFound, is_macosx, is_windows from servo.post_build_commands import find_dep_path_newest @@ -42,6 +47,11 @@ def otool(s): yield l.split(' ', 1)[0][1:] +def listfiles(directory): + return [f for f in os.listdir(directory) + if path.isfile(path.join(directory, f))] + + def install_name_tool(old, new, binary): try: subprocess.check_call(['install_name_tool', '-change', old, '@executable_path/' + new, binary]) @@ -76,7 +86,7 @@ def package(self, release=False, dev=False, android=None, debug=False, debugger= env["ANT_FLAVOR"] = "release" dev_flag = "" - target_dir = os.path.dirname(binary_path) + target_dir = path.dirname(binary_path) output_apk = "{}.apk".format(binary_path) try: with cd(path.join("support", "android", "build-apk")): @@ -91,7 +101,7 @@ def package(self, release=False, dev=False, android=None, debug=False, debugger= dir_to_app = dir_to_dmg + '/Servo.app' dir_to_resources = dir_to_app + '/Contents/Resources/' dir_to_root = '/'.join(binary_path.split('/')[:-3]) - if os.path.exists(dir_to_dmg): + if path.exists(dir_to_dmg): print("Cleaning up from previous packaging") delete(dir_to_dmg) browserhtml_path = find_dep_path_newest('browserhtml', binary_path) @@ -123,7 +133,7 @@ def package(self, release=False, dev=False, android=None, debug=False, debugger= continue need_relinked = set(otool(f)) new_path = dir_to_app + '/Contents/MacOS/' + f.split('/')[-1] - if not os.path.exists(new_path): + if not path.exists(new_path): shutil.copyfile(f, new_path) for dylib in need_relinked: if '/System/Library' in dylib or '/usr/lib' in dylib or 'servo' in dylib: @@ -153,6 +163,45 @@ def package(self, release=False, dev=False, android=None, debug=False, debugger= print("Cleaning up") delete(dir_to_dmg) print("Packaged Servo into " + dmg_path) + elif is_windows(): + dir_to_package = path.dirname(binary_path) + dir_to_root = self.get_top_dir() + dir_to_msi = path.join(dir_to_package, 'msi') + if path.exists(dir_to_msi): + print("Cleaning up from previous packaging") + delete(dir_to_msi) + os.makedirs(dir_to_msi) + top_path = dir_to_root + browserhtml_path = find_dep_path_newest('browserhtml', binary_path) + if browserhtml_path is None: + print("Could not find browserhtml package; perhaps you haven't built Servo.") + return 1 + browserhtml_path = path.join(browserhtml_path, "out") + # generate Servo.wxs + template_path = path.join(dir_to_root, "support", "windows", "Servo.wxs.mako") + template = Template(open(template_path).read()) + wxs_path = path.join(dir_to_msi, "Servo.wxs") + open(wxs_path, "w").write(template.render( + exe_path=dir_to_package, + top_path=top_path, + browserhtml_path=browserhtml_path)) + # run candle and light + print("Creating MSI") + try: + with cd(dir_to_msi): + subprocess.check_call(['candle', wxs_path]) + except subprocess.CalledProcessError as e: + print("WiX candle exited with return value %d" % e.returncode) + return e.returncode + try: + wxsobj_path = "{}.wixobj".format(path.splitext(wxs_path)[0]) + with cd(dir_to_msi): + subprocess.check_call(['light', wxsobj_path]) + except subprocess.CalledProcessError as e: + print("WiX light exited with return value %d" % e.returncode) + return e.returncode + msi_path = path.join(dir_to_msi, "Servo.msi") + print("Packaged Servo into {}".format(msi_path)) else: dir_to_package = '/'.join(binary_path.split('/')[:-1]) dir_to_root = '/'.join(binary_path.split('/')[:-3]) diff --git a/resources/Servo.ico b/resources/Servo.ico new file mode 100644 index 0000000000000000000000000000000000000000..71d38a0c1478abf14b0de4cdaaeb198566b02a7c GIT binary patch literal 32988 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 literal 0 HcmV?d00001 diff --git a/support/windows/Servo.wxs.mako b/support/windows/Servo.wxs.mako new file mode 100644 index 000000000000..2532267758a4 --- /dev/null +++ b/support/windows/Servo.wxs.mako @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${include_directory(path.join(top_path, "resources"), "resources")} + ${include_directory(browserhtml_path, "browserhtml")} + + + + + + + + + + + + + + + + + + % for c in components: + + % endfor + + + + + + +<%! +import os +import os.path as path +import re +import uuid + +def make_id(s): + return "Id{}".format(s.replace("-", "_").replace("/", "_")) + +def listfiles(directory): + return [f for f in os.listdir(directory) + if path.isfile(path.join(directory, f))] + +def listdirs(directory): + return [f for f in os.listdir(directory) + if path.isdir(path.join(directory, f))] + +def windowize(p): + if not p.startswith("/"): + return p + return re.sub("^/([^/])+", "\\1:", p) + +components = [] +%> +<%def name="include_directory(d, n)"> + + + + <% components.append(make_id(path.basename(d))) %> + % for f in listfiles(d): + + % endfor + + + % for f in listdirs(d): + ${include_directory(path.join(d, f), f)} + % endfor + + diff --git a/support/windows/fonts.conf b/support/windows/fonts.conf new file mode 100644 index 000000000000..d43480eead52 --- /dev/null +++ b/support/windows/fonts.conf @@ -0,0 +1,44 @@ + + + + C:\Windows\Fonts + + + + mono + + + monospace + + + + + + + sans serif + + + sans-serif + + + + + + + sans + + + sans-serif + + + + + + ~/.fontconfig +