From 670c18c3ef8f1199b776d5826806e31a827007df Mon Sep 17 00:00:00 2001 From: Paul Eggleton Date: Thu, 16 Dec 2010 17:35:31 +0000 Subject: sanity.bbclass: add check for creation of long filenames 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 --- meta/classes/sanity.bbclass | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) (limited to 'meta') diff --git a/meta/classes/sanity.bbclass b/meta/classes/sanity.bbclass index 969cc2e59b..9d183e352f 100644 --- a/meta/classes/sanity.bbclass +++ b/meta/classes/sanity.bbclass @@ -21,18 +21,41 @@ def check_conf_exists(fn, data): return True return False -def check_sanity_sstate_dir_change(): +def check_sanity_sstate_dir_change(sstate_dir): # Sanity checks to be done when the value of SSTATE_DIR changes - return "" -def check_sanity_tmpdir_change(): + # Check that SSTATE_DIR isn't on a filesystem with limited filename length (eg. eCryptFS) + testmsg = "" + if sstate_dir != "": + testmsg = check_create_long_filename(sstate_dir, "SSTATE_DIR") + return testmsg + +def check_sanity_tmpdir_change(tmpdir): # Sanity checks to be done when the value of TMPDIR changes - return "" + + # Check that TMPDIR isn't on a filesystem with limited filename length (eg. eCryptFS) + testmsg = check_create_long_filename(tmpdir, "TMPDIR") + return testmsg def check_sanity_version_change(): # Sanity checks to be done when SANITY_VERSION changes return "" +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): + bb.utils.mkdirhier(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 %s. Please use a filesystem that does not unreasonably limit filename length.\n" % pathname + else: + return "Failed to create a file in %s: %s" % (pathname, strerror) + return "" + def check_sanity(e): from bb import note, error, data, __version__ @@ -206,13 +229,13 @@ def check_sanity(e): sanity_version = int(data.getVar('SANITY_VERSION', e.data, True) or 1) if last_sanity_version < sanity_version: messages = messages + check_sanity_version_change() - messages = messages + check_sanity_tmpdir_change() - messages = messages + check_sanity_sstate_dir_change() + messages = messages + check_sanity_tmpdir_change(tmpdir) + messages = messages + check_sanity_sstate_dir_change(sstate_dir) else: if last_tmpdir != tmpdir: - messages = messages + check_sanity_tmpdir_change() + messages = messages + check_sanity_tmpdir_change(tmpdir) if last_sstate_dir != sstate_dir: - messages = messages + check_sanity_sstate_dir_change() + messages = messages + check_sanity_sstate_dir_change(sstate_dir) if os.path.exists("conf"): f = file(sanityverfile, 'w') -- cgit v1.2.3-54-g00ecf