[poky] [PATCH 1/1] sanity.bbclass: add check for creation of long filenames
Paul Eggleton
paul.eggleton at linux.intel.com
Tue Nov 30 08:40:55 PST 2010
Detect and fail if filesystem in use for TMPDIR or SSTATE_DIR has an
unreasonably short file name length limit (eg. eCryptFS). This can cause
"file name too long" errors during poky builds (e.g. when writing sstate
files for packages with a git revision as the version).
Signed-off-by: Paul Eggleton <paul.eggleton at linux.intel.com>
---
meta/classes/sanity.bbclass | 33 ++++++++++++++++++++++++++++++++-
1 files changed, 32 insertions(+), 1 deletions(-)
diff --git a/meta/classes/sanity.bbclass b/meta/classes/sanity.bbclass
index 06aeddc..90e8911 100644
--- a/meta/classes/sanity.bbclass
+++ b/meta/classes/sanity.bbclass
@@ -21,6 +21,21 @@ def check_conf_exists(fn, data):
return True
return False
+def check_create_long_filename(filepath, pathname):
+ testfile = os.path.join(filepath, ''.join([`num`[-1] for num in xrange(1,200)]))
+ try:
+ if not os.path.exists(filepath):
+ os.path.mkdir(filepath)
+ f = file(testfile, "w")
+ f.close()
+ os.remove(testfile)
+ except IOError as (errno, strerror):
+ if errno == 36: # ENAMETOOLONG
+ return "Failed to create a file with a long name in {0}. Please use a filesystem that does not unreasonably limit filename length.\n".format(pathname)
+ else:
+ return "Failed to create a file in {0}: {1}".format(pathname, strerror)
+ return ""
+
def check_sanity(e):
from bb import note, error, data, __version__
@@ -163,10 +178,26 @@ def check_sanity(e):
if os.path.exists('%s/libc.so.6' % lib32path) and not os.path.exists('/usr/include/gnu/stubs-32.h'):
messages = messages + "You have a 32-bit libc, but no 32-bit headers. You must install the 32-bit libc headers.\n"
+ tmpdir = data.getVar('TMPDIR', e.data, True)
+
+ #
+ # Check that TMPDIR isn't on a filesystem with limited filename length (eg. eCryptFS)
+ #
+ testmsg = check_create_long_filename(tmpdir, "TMPDIR")
+ if testmsg != "":
+ messages = messages + testmsg
+ #
+ # Check that SSTATE_DIR isn't on a filesystem with limited filename length (eg. eCryptFS)
+ #
+ sstatedir = data.getVar('SSTATE_DIR', e.data, True)
+ if sstatedir != "":
+ testmsg = check_create_long_filename(sstatedir, "SSTATE_DIR")
+ if testmsg != "":
+ messages = messages + testmsg
+
#
# Check that TMPDIR hasn't changed location since the last time we were run
#
- tmpdir = data.getVar('TMPDIR', e.data, True)
checkfile = os.path.join(tmpdir, "saved_tmpdir")
if os.path.exists(checkfile):
f = file(checkfile, "r")
--
1.7.1
More information about the poky
mailing list