diff options
author | Jack Moffitt <jack@metajack.im> | 2016-06-30 11:51:44 -0600 |
---|---|---|
committer | Jack Moffitt <jack@metajack.im> | 2016-07-25 14:58:33 -0600 |
commit | d8c0b87eb20f5c8e511ea920358d51c5199ccfab (patch) | |
tree | 61f558fd882c6c319ce3d68d000fa81f02daa4f3 | |
parent | 4ae0897175143351439ff5b903d05a79c17e3725 (diff) | |
download | servo-d8c0b87eb20f5c8e511ea920358d51c5199ccfab.tar.gz servo-d8c0b87eb20f5c8e511ea920358d51c5199ccfab.zip |
Add Windows packaging to create an MSI installer
-rw-r--r-- | components/servo/.cargo/config | 3 | ||||
-rw-r--r-- | components/servo/fake-ld.cmd | 2 | ||||
-rwxr-xr-x | etc/ci/upload_nightly.sh | 4 | ||||
-rw-r--r-- | python/servo/package_commands.py | 59 | ||||
-rw-r--r-- | resources/Servo.ico | bin | 0 -> 32988 bytes | |||
-rw-r--r-- | support/windows/Servo.wxs.mako | 207 | ||||
-rw-r--r-- | support/windows/fonts.conf | 44 |
7 files changed, 312 insertions, 7 deletions
diff --git a/components/servo/.cargo/config b/components/servo/.cargo/config index dffe440072c..1cea095353f 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 00000000000..b13c7e818ab --- /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 e3033cc0902..dfde162e354 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 d3d7877c674..1bd91e6eae1 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 @@ from mach.decorators import ( 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 @@ class PackageCommands(CommandBase): 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 @@ class PackageCommands(CommandBase): 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 @@ class PackageCommands(CommandBase): 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 @@ class PackageCommands(CommandBase): 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 Binary files differnew file mode 100644 index 00000000000..71d38a0c147 --- /dev/null +++ b/resources/Servo.ico diff --git a/support/windows/Servo.wxs.mako b/support/windows/Servo.wxs.mako new file mode 100644 index 00000000000..2532267758a --- /dev/null +++ b/support/windows/Servo.wxs.mako @@ -0,0 +1,207 @@ +<?xml version="1.0" encoding="utf-8"?> +<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> + <Product Name="Servo Tech Demo" + Manufacturer="Mozilla Research" + Id="5807391a-3a17-476b-a5d2-5f1912569762" + UpgradeCode="060cd15d-eab1-4614-b438-3988e3efdcf1" + Language="1033" + Codepage="1252" + Version="1.0.0"> + <Package Id="*" + Keywords="Installer" + Description="Servo Tech Demo Installer" + Manufacturer="Mozilla Research" + InstallerVersion="200" + Platform="x64" + Languages="1033" + SummaryCodepage="1252" + Compressed="yes"/> + <Media Id="1" + Cabinet="Servo.cab" + EmbedCab="yes"/> + <Directory Id="TARGETDIR" Name="SourceDir"> + <Directory Id="ProgramFiles64Folder" Name="PFiles"> + <Directory Id="MozResearch" Name="Mozilla Research"> + <Directory Id="INSTALLDIR" Name="Servo Tech Demo"> + <Component Id="Servo" + Guid="95bcea71-78bb-4ec8-9766-44bc01443840" + Win64="yes"> + <File Id="ServoEXE" + Name="servo.exe" + DiskId="1" + Source="${windowize(exe_path)}\servo.exe" + KeyPath="yes"> + <Shortcut Id="StartMenuServoTechDemo" + Directory="ProgramMenuDir" + Name="Servo Tech Demo" + WorkingDirectory="INSTALLDIR" + Icon="Servo.ico" + IconIndex="0" + Arguments="-w --pref dom.mozbrowser.enabled --pref shell.builtin-key-shortcuts.enabled=false browserhtml\index.html" + Advertise="yes"/> + </File> + <File Id="ServoManifest" + Name="servo.exe.manifest" + Source="${windowize(exe_path)}\servo.exe.manifest" + DiskId="1"/> + + <File Id="StdcxxDLL" + Name="libstdc++-6.dll" + Source="C:\msys64\mingw64\bin\libstdc++-6.dll" + DiskId="1"/> + <File Id="WinpthreadDll" + Name="libwinpthread-1.dll" + Source="C:\msys64\mingw64\bin\libwinpthread-1.dll" + DiskId="1"/> + <File Id="Bzip2Dll" + Name="libbz2-1.dll" + Source="C:\msys64\mingw64\bin\libbz2-1.dll" + DiskId="1"/> + <File Id="GccsehDll" + Name="libgcc_s_seh-1.dll" + Source="C:\msys64\mingw64\bin\libgcc_s_seh-1.dll" + DiskId="1"/> + <File Id="ExpatDll" + Name="libexpat-1.dll" + Source="C:\msys64\mingw64\bin\libexpat-1.dll" + DiskId="1"/> + <File Id="ZlibDll" + Name="zlib1.dll" + Source="C:\msys64\mingw64\bin\zlib1.dll" + DiskId="1"/> + <File Id="PngDll" + Name="libpng16-16.dll" + Source="C:\msys64\mingw64\bin\libpng16-16.dll" + DiskId="1"/> + <File Id="IconvDll" + Name="libiconv-2.dll" + Source="C:\msys64\mingw64\bin\libiconv-2.dll" + DiskId="1"/> + <File Id="GlibDll" + Name="libglib-2.0-0.dll" + Source="C:\msys64\mingw64\bin\libglib-2.0-0.dll" + DiskId="1"/> + <File Id="GraphiteDll" + Name="libgraphite2.dll" + Source="C:\msys64\mingw64\bin\libgraphite2.dll" + DiskId="1"/> + <File Id="IntlDll" + Name="libintl-8.dll" + Source="C:\msys64\mingw64\bin\libintl-8.dll" + DiskId="1"/> + <File Id="PcreDll" + Name="libpcre-1.dll" + Source="C:\msys64\mingw64\bin\libpcre-1.dll" + DiskId="1"/> + <File Id="Eay32Dll" + Name="libeay32.dll" + Source="C:\msys64\mingw64\bin\libeay32.dll" + DiskId="1"/> + <File Id="Ssleay32Dll" + Name="ssleay32.dll" + Source="C:\msys64\mingw64\bin\ssleay32.dll" + DiskId="1"/> + <File Id="HarfbuzzDll" + Name="libharfbuzz-0.dll" + Source="C:\msys64\mingw64\bin\libharfbuzz-0.dll" + DiskId="1"/> + <File Id="FreetypeDll" + Name="libfreetype-6.dll" + Source="C:\msys64\mingw64\bin\libfreetype-6.dll" + DiskId="1"/> + <File Id="FontconfigDll" + Name="libfontconfig-1.dll" + Source="C:\msys64\mingw64\bin\libfontconfig-1.dll" + DiskId="1"/> + </Component> + + <Directory Id="EtcDir" Name="etc"> + <Directory Id="FontsDir" Name="fonts"> + <Component Id="FontsDir" + Guid="8d37ee61-9237-438d-b976-f163bd6b0578" + Win64="yes"> + <File Id="ServoFontsConfig" + KeyPath="yes" + Name="fonts.conf" + Source="${windowize(top_path)}\support\windows\fonts.conf" + DiskId="1"/> + </Component> + </Directory> + </Directory> + + ${include_directory(path.join(top_path, "resources"), "resources")} + ${include_directory(browserhtml_path, "browserhtml")} + </Directory> + </Directory> + </Directory> + + <Directory Id="ProgramMenuFolder" Name="Programs"> + <Directory Id="ProgramMenuDir" Name="Servo Tech Demo"> + <Component Id="ProgramMenuDir" Guid="e04737ce-16eb-4977-9b4c-ed2db8a5a77d"> + <RemoveFolder Id="ProgramMenuDir" On="uninstall"/> + <RegistryValue Root="HKCU" + Key="Software\Mozilla Research\Servo Tech Demo" + Type="string" + Value="" + KeyPath="yes"/> + </Component> + </Directory> + </Directory> + </Directory> + + <Feature Id="Complete" Level="1"> + <ComponentRef Id="Servo"/> + <ComponentRef Id="FontsDir"/> + % for c in components: + <ComponentRef Id="${c}"/> + % endfor + <ComponentRef Id="ProgramMenuDir"/> + </Feature> + + <Icon Id="Servo.ico" SourceFile="${windowize(top_path)}\resources\Servo.ico"/> + </Product> +</Wix> +<%! +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)"> +<Directory Id="${make_id(path.basename(d))}" Name="${n}"> + <Component Id="${make_id(path.basename(d))}" + Guid="${uuid.uuid4()}" + Win64="yes"> + <CreateFolder/> + <% components.append(make_id(path.basename(d))) %> + % for f in listfiles(d): + <File Id="${make_id(path.join(d, f))}" + Name="${f}" + Source="${windowize(path.join(d, f))}" + DiskId="1"/> + % endfor + </Component> + + % for f in listdirs(d): + ${include_directory(path.join(d, f), f)} + % endfor +</Directory> +</%def> diff --git a/support/windows/fonts.conf b/support/windows/fonts.conf new file mode 100644 index 00000000000..d43480eead5 --- /dev/null +++ b/support/windows/fonts.conf @@ -0,0 +1,44 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> + <dir>C:\Windows\Fonts</dir> +<!-- + Accept deprecated 'mono' alias, replacing it with 'monospace' +--> + <match target="pattern"> + <test qual="any" name="family"> + <string>mono</string> + </test> + <edit name="family" mode="assign" binding="same"> + <string>monospace</string> + </edit> + </match> + +<!-- + Accept alternate 'sans serif' spelling, replacing it with 'sans-serif' +--> + <match target="pattern"> + <test qual="any" name="family"> + <string>sans serif</string> + </test> + <edit name="family" mode="assign" binding="same"> + <string>sans-serif</string> + </edit> + </match> + +<!-- + Accept deprecated 'sans' alias, replacing it with 'sans-serif' +--> + <match target="pattern"> + <test qual="any" name="family"> + <string>sans</string> + </test> + <edit name="family" mode="assign" binding="same"> + <string>sans-serif</string> + </edit> + </match> + +<!-- Font cache directory list --> + + <cachedir>~/.fontconfig</cachedir> +</fontconfig> |