diff options
author | Manuel Huber <Manuel.h87@gmail.com> | 2016-06-11 09:50:02 +0200 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-06-15 17:36:37 +0100 |
commit | c00423d6bab9849e331beadf4d3cee90e04fe295 (patch) | |
tree | 4b40b855d85b49365e36cb533eee7e8feb739891 | |
parent | 6025a14dbbd09b2805fe2e17ddc24f2a515cb832 (diff) | |
download | openembedded-core-c00423d6bab9849e331beadf4d3cee90e04fe295.tar.gz openembedded-core-c00423d6bab9849e331beadf4d3cee90e04fe295.tar.bz2 openembedded-core-c00423d6bab9849e331beadf4d3cee90e04fe295.zip |
classes/license: handle EXDEV if hard link to license fails
Hard links can still fail even if st_dev is the same for source
and destination. In case of EXDEV error, fall back to copying.
Signed-off-by: Manuel Huber <manuel.h87@gmail.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
-rw-r--r-- | meta/classes/license.bbclass | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/meta/classes/license.bbclass b/meta/classes/license.bbclass index 10d6ed853a..c543637294 100644 --- a/meta/classes/license.bbclass +++ b/meta/classes/license.bbclass @@ -342,6 +342,7 @@ def add_package_and_files(d): def copy_license_files(lic_files_paths, destdir): import shutil + import errno bb.utils.mkdirhier(destdir) for (basename, path) in lic_files_paths: @@ -350,12 +351,21 @@ def copy_license_files(lic_files_paths, destdir): dst = os.path.join(destdir, basename) if os.path.exists(dst): os.remove(dst) - if os.access(src, os.W_OK) and (os.stat(src).st_dev == os.stat(destdir).st_dev): - os.link(src, dst) + canlink = os.access(src, os.W_OK) and (os.stat(src).st_dev == os.stat(destdir).st_dev) + if canlink: try: - os.chown(dst,0,0) + os.link(src, dst) + except OSError as err: + if err.errno == errno.EXDEV: + # Copy license files if hard-link is not possible even if st_dev is the + # same on source and destination (docker container with device-mapper?) + canlink = False + else: + raise + try: + if canlink: + os.chown(dst,0,0) except OSError as err: - import errno if err.errno in (errno.EPERM, errno.EINVAL): # Suppress "Operation not permitted" error, as # sometimes this function is not executed under pseudo. @@ -364,7 +374,7 @@ def copy_license_files(lic_files_paths, destdir): pass else: raise - else: + if not canlink: shutil.copyfile(src, dst) except Exception as e: bb.warn("Could not copy license file %s to %s: %s" % (src, dst, e)) |