From 928a5249dad9543a669ab07a0108aca26c0642cb Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Mon, 7 May 2018 17:19:57 +0200 Subject: Make sure copied libclang file has write permissions When doing a standalone rebuild on macOS, if the libclang library copied over has no write permissions set, the install procedure will fail with permission denied error. Make sure to make the file owner writable, so that any subsequent rebuilds don't cause a failure. Change-Id: I54bb3f6e8bd8db7f8ed2de17892fcedec09b6c32 Reviewed-by: Qt CI Bot Reviewed-by: Friedemann Kleint Reviewed-by: Cristian Maureira-Fredes --- build_scripts/main.py | 7 ++++++- build_scripts/utils.py | 10 +++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) (limited to 'build_scripts') diff --git a/build_scripts/main.py b/build_scripts/main.py index a98a254e0..eb1a12ac2 100644 --- a/build_scripts/main.py +++ b/build_scripts/main.py @@ -1211,7 +1211,12 @@ class pyside_build(_build): 'pyside_package')) if os.path.exists(clang_lib_path): log.info('Copying libclang shared library to the package folder.') - copyfile(clang_lib_path, destination_dir) + basename = os.path.basename(clang_lib_path) + destination_path = os.path.join(destination_dir, basename) + + # Need to modify permissions in case file is not writable + # (a reinstall would cause a permission denied error). + copyfile(clang_lib_path, destination_path, make_writable_by_owner=True) else: raise RuntimeError("Error copying libclang library " "from {} to {}. ".format( diff --git a/build_scripts/utils.py b/build_scripts/utils.py index db95df8a8..af40916b7 100644 --- a/build_scripts/utils.py +++ b/build_scripts/utils.py @@ -39,6 +39,7 @@ import sys import os +import stat import re import stat import errno @@ -274,7 +275,8 @@ def init_msvc_env(platform_arch, build_type): log.info("Done initializing MSVC env") -def copyfile(src, dst, force=True, vars=None, force_copy_symlink=False): +def copyfile(src, dst, force=True, vars=None, force_copy_symlink=False, + make_writable_by_owner=False): if vars is not None: src = src.format(**vars) dst = dst.format(**vars) @@ -287,6 +289,9 @@ def copyfile(src, dst, force=True, vars=None, force_copy_symlink=False): if not os.path.islink(src) or force_copy_symlink: log.info("Copying file {} to {}.".format(src, dst)) shutil.copy2(src, dst) + if make_writable_by_owner: + make_file_writable_by_owner(dst) + else: linkTargetPath = os.path.realpath(src) if os.path.dirname(linkTargetPath) == os.path.dirname(src): @@ -400,6 +405,9 @@ def copydir(src, dst, filter=None, ignore=None, force=True, recursive=True, raise EnvironmentError(errors) return results +def make_file_writable_by_owner(path): + current_permissions = stat.S_IMODE(os.lstat(path).st_mode) + os.chmod(path, current_permissions | stat.S_IWUSR) def rmtree(dirname): def handleRemoveReadonly(func, path, exc): -- cgit v1.2.3