summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Huber <Manuel.h87@gmail.com>2016-06-11 09:50:02 +0200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-06-15 17:36:37 +0100
commitc00423d6bab9849e331beadf4d3cee90e04fe295 (patch)
tree4b40b855d85b49365e36cb533eee7e8feb739891
parent6025a14dbbd09b2805fe2e17ddc24f2a515cb832 (diff)
downloadopenembedded-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.bbclass20
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))