diff options
Diffstat (limited to 'python/servo')
-rw-r--r-- | python/servo/build_commands.py | 100 | ||||
-rw-r--r-- | python/servo/command_base.py | 25 | ||||
-rw-r--r-- | python/servo/package_commands.py | 49 |
3 files changed, 131 insertions, 43 deletions
diff --git a/python/servo/build_commands.py b/python/servo/build_commands.py index 0fea67f9a70..9abd2e05218 100644 --- a/python/servo/build_commands.py +++ b/python/servo/build_commands.py @@ -18,6 +18,7 @@ import subprocess import sys import urllib import zipfile +import stat from time import time @@ -592,6 +593,105 @@ class MachCommands(CommandBase): for ssl_lib in ["libcryptoMD.dll", "libsslMD.dll"]: shutil.copy(path.join(env['OPENSSL_LIB_DIR'], "../bin" + msvc_x64, ssl_lib), servo_exe_dir) + # Search for the generated nspr4.dll + build_path = path.join(servo_exe_dir, "build") + nspr4 = "nspr4.dll" + nspr4_path = None + for root, dirs, files in os.walk(build_path): + if nspr4 in files: + nspr4_path = path.join(root, nspr4) + break + if nspr4_path is None: + print("WARNING: could not find nspr4.dll") + else: + shutil.copy(nspr4_path, servo_exe_dir) + # copy needed gstreamer DLLs in to servo.exe dir + gst_x64 = "X86_64" if msvc_x64 == "64" else "X86" + gst_root = "" + gst_default_path = path.join("C:\\gstreamer\\1.0", gst_x64) + gst_env = "GSTREAMER_1_0_ROOT_" + gst_x64 + if os.path.exists(path.join(gst_default_path, "bin", "libz.dll")): + gst_root = gst_default_path + elif os.environ.get(gst_env) is not None: + gst_root = os.environ.get(gst_env) + else: + print("Could not found GStreamer installation directory.") + status = 1 + gst_dlls = [ + "libz.dll", + "libintl-8.dll", + "liborc-0.4-0.dll", + "libwinpthread-1.dll", + "libffi-7.dll", + "libgobject-2.0-0.dll", + "libglib-2.0-0.dll", + "libgmodule-2.0-0.dll", + "libgstreamer-1.0-0.dll", + "libgstplayer-1.0-0.dll", + "libgstapp-1.0-0.dll", + "libgstaudio-1.0-0.dll", + "libgstvideo-1.0-0.dll", + "libgsttag-1.0-0.dll", + "libgstbase-1.0-0.dll", + "libgstpbutils-1.0-0.dll", + ] + if gst_root: + for gst_lib in gst_dlls: + shutil.copy(path.join(gst_root, "bin", gst_lib), + servo_exe_dir) + # copy some MSVC DLLs to servo.exe dir + msvc_redist_dir = None + vs_platform = os.environ.get("PLATFORM", "").lower() + vc_dir = os.environ.get("VCINSTALLDIR", "") + vs_version = os.environ.get("VisualStudioVersion", "") + msvc_deps = [ + "api-ms-win-crt-runtime-l1-1-0.dll", + "msvcp140.dll", + "vcruntime140.dll", + ] + # Check if it's Visual C++ Build Tools or Visual Studio 2015 + vs14_vcvars = path.join(vc_dir, "vcvarsall.bat") + is_vs14 = True if os.path.isfile(vs14_vcvars) or vs_version == "14.0" else False + if is_vs14: + msvc_redist_dir = path.join(vc_dir, "redist", vs_platform, "Microsoft.VC140.CRT") + elif vs_version == "15.0": + redist_dir = path.join(os.environ.get("VCINSTALLDIR", ""), "Redist", "MSVC") + if os.path.isdir(redist_dir): + for p in os.listdir(redist_dir)[::-1]: + redist_path = path.join(redist_dir, p) + for v in ["VC141", "VC150"]: + # there are two possible paths + # `x64\Microsoft.VC*.CRT` or `onecore\x64\Microsoft.VC*.CRT` + redist1 = path.join(redist_path, vs_platform, "Microsoft.{}.CRT".format(v)) + redist2 = path.join(redist_path, "onecore", vs_platform, "Microsoft.{}.CRT".format(v)) + if os.path.isdir(redist1): + msvc_redist_dir = redist1 + break + elif os.path.isdir(redist2): + msvc_redist_dir = redist2 + break + if msvc_redist_dir: + break + if msvc_redist_dir: + redist_dirs = [ + msvc_redist_dir, + path.join(os.environ["WindowsSdkDir"], "Redist", "ucrt", "DLLs", vs_platform), + ] + for msvc_dll in msvc_deps: + dll_found = False + for dll_dir in redist_dirs: + dll = path.join(dll_dir, msvc_dll) + servo_dir_dll = path.join(servo_exe_dir, msvc_dll) + if os.path.isfile(dll): + if os.path.isfile(servo_dir_dll): + # avoid permission denied error when overwrite dll in servo build directory + os.chmod(servo_dir_dll, stat.S_IWUSR) + shutil.copy(dll, servo_exe_dir) + dll_found = True + break + if not dll_found: + print("DLL file `{}` not found!".format(msvc_dll)) + status = 1 elif sys.platform == "darwin": # On the Mac, set a lovely icon. This makes it easier to pick out the Servo binary in tools diff --git a/python/servo/command_base.py b/python/servo/command_base.py index 393808213a6..a8bba6c6d59 100644 --- a/python/servo/command_base.py +++ b/python/servo/command_base.py @@ -22,6 +22,7 @@ import subprocess from subprocess import PIPE import sys import tarfile +import zipfile from xml.etree.ElementTree import XML from servo.util import download_file import urllib2 @@ -86,10 +87,14 @@ def archive_deterministically(dir_to_archive, dest_archive, prepend_path=None): dest_archive = os.path.abspath(dest_archive) with cd(dir_to_archive): current_dir = "." - file_list = [current_dir] + file_list = [] for root, dirs, files in os.walk(current_dir): - for name in itertools.chain(dirs, files): - file_list.append(os.path.join(root, name)) + if dest_archive.endswith(".zip"): + for f in files: + file_list.append(os.path.join(root, f)) + else: + for name in itertools.chain(dirs, files): + file_list.append(os.path.join(root, name)) # Sort file entries with the fixed locale with setlocale('C'): @@ -100,13 +105,21 @@ def archive_deterministically(dir_to_archive, dest_archive, prepend_path=None): # TODO do this in a temporary folder after #11983 is fixed temp_file = '{}.temp~'.format(dest_archive) with os.fdopen(os.open(temp_file, os.O_WRONLY | os.O_CREAT, 0644), 'w') as out_file: - with gzip.GzipFile('wb', fileobj=out_file, mtime=0) as gzip_file: - with tarfile.open(fileobj=gzip_file, mode='w:') as tar_file: + if dest_archive.endswith('.zip'): + with zipfile.ZipFile(temp_file, 'w', zipfile.ZIP_DEFLATED) as zip_file: for entry in file_list: arcname = entry if prepend_path is not None: arcname = os.path.normpath(os.path.join(prepend_path, arcname)) - tar_file.add(entry, filter=reset, recursive=False, arcname=arcname) + zip_file.write(entry, arcname=arcname) + else: + with gzip.GzipFile('wb', fileobj=out_file, mtime=0) as gzip_file: + with tarfile.open(fileobj=gzip_file, mode='w:') as tar_file: + for entry in file_list: + arcname = entry + if prepend_path is not None: + arcname = os.path.normpath(os.path.join(prepend_path, arcname)) + tar_file.add(entry, filter=reset, recursive=False, arcname=arcname) os.rename(temp_file, dest_archive) diff --git a/python/servo/package_commands.py b/python/servo/package_commands.py index 5449cfc509a..83f308f1816 100644 --- a/python/servo/package_commands.py +++ b/python/servo/package_commands.py @@ -19,7 +19,6 @@ import shutil import subprocess import sys import tempfile -import urllib from mach.decorators import ( CommandArgument, @@ -147,26 +146,9 @@ def copy_dependencies(binary_path, lib_path): def copy_windows_dependencies(binary_path, destination): - deps = [ - "libcryptoMD.dll", - "libsslMD.dll", - ] - for d in deps: - shutil.copy(path.join(binary_path, d), destination) - - # Search for the generated nspr4.dll - build_path = path.join(binary_path, "build") - nspr4 = "nspr4.dll" - nspr4_path = None - for root, dirs, files in os.walk(build_path): - if nspr4 in files: - nspr4_path = path.join(root, nspr4) - break - - if nspr4_path is None: - print("WARNING: could not find nspr4.dll") - else: - shutil.copy(nspr4_path, destination) + for f in os.listdir(binary_path): + if os.path.isfile(path.join(binary_path, f)) and f.endswith(".dll"): + shutil.copy(path.join(binary_path, f), destination) def change_prefs(resources_path, platform, vr=False): @@ -397,11 +379,10 @@ class PackageCommands(CommandBase): print("Copying files") dir_to_temp = path.join(dir_to_msi, 'temp') - dir_to_temp_servo = path.join(dir_to_temp, 'servo') - dir_to_resources = path.join(dir_to_temp_servo, 'resources') + dir_to_resources = path.join(dir_to_temp, 'resources') shutil.copytree(path.join(dir_to_root, 'resources'), dir_to_resources) - shutil.copy(binary_path, dir_to_temp_servo) - copy_windows_dependencies(target_dir, dir_to_temp_servo) + shutil.copy(binary_path, dir_to_temp) + copy_windows_dependencies(target_dir, dir_to_temp) change_prefs(dir_to_resources, "windows") @@ -412,7 +393,7 @@ class PackageCommands(CommandBase): wxs_path = path.join(dir_to_msi, "Installer.wxs") open(wxs_path, "w").write(template.render( exe_path=target_dir, - dir_to_temp=dir_to_temp_servo, + dir_to_temp=dir_to_temp, resources_path=dir_to_resources)) # run candle and light @@ -433,14 +414,7 @@ class PackageCommands(CommandBase): dir_to_installer = path.join(dir_to_msi, "Installer.msi") print("Packaged Servo into " + dir_to_installer) - # Download GStreamer installer. Only once. - gstreamer_msi_path = path.join(dir_to_msi, 'Gstreamer.msi') - if not os.path.exists(gstreamer_msi_path): - print('Fetching GStreamer installer. This may take a while...') - gstreamer_url = 'https://gstreamer.freedesktop.org/data/pkg/windows/1.14.2/gstreamer-1.0-x86-1.14.2.msi' - urllib.urlretrieve(gstreamer_url, gstreamer_msi_path) - - # Generate bundle with GStreamer and Servo installers. + # Generate bundle with Servo installer. print("Creating bundle") shutil.copy(path.join(dir_to_root, 'support', 'windows', 'Servo.wxs'), dir_to_msi) bundle_wxs_path = path.join(dir_to_msi, 'Servo.wxs') @@ -457,11 +431,12 @@ class PackageCommands(CommandBase): except subprocess.CalledProcessError as e: print("WiX light exited with return value %d" % e.returncode) return e.returncode - print("Packaged Servo into " + path.join(dir_to_msi, "Servo.msi")) + print("Packaged Servo into " + path.join(dir_to_msi, "Servo.exe")) print("Creating ZIP") - shutil.make_archive(path.join(dir_to_msi, "Servo"), "zip", dir_to_temp) - print("Packaged Servo into " + path.join(dir_to_msi, "Servo.zip")) + zip_path = path.join(dir_to_msi, "Servo.zip") + archive_deterministically(dir_to_temp, zip_path, prepend_path='servo/') + print("Packaged Servo into " + zip_path) print("Cleaning up") delete(dir_to_temp) |