diff options
author | Robert Yang <liezhi.yang@windriver.com> | 2013-04-27 05:32:07 -0400 |
---|---|---|
committer | Saul Wold <sgw@linux.intel.com> | 2013-05-01 11:09:17 -0700 |
commit | 5853e0f482b22258c909268fe71673a29e31989b (patch) | |
tree | 1a04b86810547ff3dcdb24a4c3028db5342d942b /meta | |
parent | f4b451c8ad8f857b1789d75d68ce8ea8fc73542e (diff) | |
download | openembedded-core-5853e0f482b22258c909268fe71673a29e31989b.tar.gz openembedded-core-5853e0f482b22258c909268fe71673a29e31989b.tar.bz2 openembedded-core-5853e0f482b22258c909268fe71673a29e31989b.zip |
sstate.bbclass: make hard links for staging files
Make hard links for staging files instead of copy to save the disk space
(3G will be saved for a core-image-sato build), and it doesn't affect
much on the build time.
The following directories are affected:
1) The sysroot
2) The DEPLOY_DIR
3) The pkgdata
[YOCTO #4372]
Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
Signed-off-by: Saul Wold <sgw@linux.intel.com>
Diffstat (limited to 'meta')
-rw-r--r-- | meta/classes/sstate.bbclass | 2 | ||||
-rw-r--r-- | meta/lib/oe/path.py | 9 |
2 files changed, 8 insertions, 3 deletions
diff --git a/meta/classes/sstate.bbclass b/meta/classes/sstate.bbclass index 79d38304fd..77ec402704 100644 --- a/meta/classes/sstate.bbclass +++ b/meta/classes/sstate.bbclass @@ -198,7 +198,7 @@ def sstate_install(ss, d): # Run the actual file install for state in ss['dirs']: if os.path.exists(state[1]): - oe.path.copytree(state[1], state[2]) + oe.path.copyhardlinktree(state[1], state[2]) for postinst in (d.getVar('SSTATEPOSTINSTFUNCS', True) or '').split(): bb.build.exec_func(postinst, d) diff --git a/meta/lib/oe/path.py b/meta/lib/oe/path.py index faa0f61fab..4f8b66c2f3 100644 --- a/meta/lib/oe/path.py +++ b/meta/lib/oe/path.py @@ -85,13 +85,18 @@ def copytree(src, dst): check_output(cmd, shell=True, stderr=subprocess.STDOUT) def copyhardlinktree(src, dst): + """ Make the hard link when possible, otherwise copy. """ bb.utils.mkdirhier(dst) + src_bak = src if os.path.isdir(src): if not len(os.listdir(src)): return src = src + "/*" - cmd = 'cp -al %s %s' % (src, dst) - check_output(cmd, shell=True, stderr=subprocess.STDOUT) + if (os.stat(src_bak).st_dev == os.stat(dst).st_dev): + cmd = 'cp -afl %s %s' % (src, dst) + check_output(cmd, shell=True, stderr=subprocess.STDOUT) + else: + copytree(src_bak, dst) def remove(path, recurse=True): """Equivalent to rm -f or rm -rf""" |