@@ -125,7 +125,8 @@ def rootfs_variables(d):
'IMAGE_ROOTFS_MAXSIZE','IMAGE_NAME','IMAGE_LINK_NAME','IMAGE_MANIFEST','DEPLOY_DIR_IMAGE','IMAGE_FSTYPES','IMAGE_INSTALL_COMPLEMENTARY','IMAGE_LINGUAS', 'IMAGE_LINGUAS_COMPLEMENTARY', 'IMAGE_LOCALES_ARCHIVE',
'MULTILIBRE_ALLOW_REP','MULTILIB_TEMP_ROOTFS','MULTILIB_VARIANTS','MULTILIBS','ALL_MULTILIB_PACKAGE_ARCHS','MULTILIB_GLOBAL_VARIANTS','BAD_RECOMMENDATIONS','NO_RECOMMENDATIONS',
'PACKAGE_ARCHS','PACKAGE_CLASSES','TARGET_VENDOR','TARGET_ARCH','TARGET_OS','OVERRIDES','BBEXTENDVARIANT','FEED_DEPLOYDIR_BASE_URI','INTERCEPT_DIR','USE_DEVFS',
- 'CONVERSIONTYPES', 'IMAGE_GEN_DEBUGFS', 'ROOTFS_RO_UNNEEDED', 'IMGDEPLOYDIR', 'PACKAGE_EXCLUDE_COMPLEMENTARY', 'REPRODUCIBLE_TIMESTAMP_ROOTFS', 'IMAGE_INSTALL_DEBUGFS']
+ 'CONVERSIONTYPES', 'IMAGE_GEN_DEBUGFS', 'ROOTFS_RO_UNNEEDED', 'IMGDEPLOYDIR', 'PACKAGE_EXCLUDE_COMPLEMENTARY', 'REPRODUCIBLE_TIMESTAMP_ROOTFS', 'IMAGE_INSTALL_DEBUGFS',
+ 'IMAGE_ROOTFS_EXCLUDE_PATH']
variables.extend(rootfs_command_variables(d))
variables.extend(variable_depends(d))
return " ".join(variables)
@@ -497,8 +498,9 @@ python () {
d.setVarFlag(task, 'func', '1')
d.setVarFlag(task, 'fakeroot', '1')
- d.appendVarFlag(task, 'prefuncs', ' ' + debug + ' set_image_size')
+ d.appendVarFlag(task, 'prefuncs', ' ' + debug + ' set_image_size prepare_excluded_directories')
d.prependVarFlag(task, 'postfuncs', 'create_symlinks ')
+ d.appendVarFlag(task, 'postfuncs', ' cleanup_excluded_directories')
d.appendVarFlag(task, 'subimages', ' ' + ' '.join(subimages))
d.appendVarFlag(task, 'vardeps', ' ' + ' '.join(vardeps))
d.appendVarFlag(task, 'vardepsexclude', ' DATETIME DATE ' + ' '.join(vardepsexclude))
@@ -507,6 +509,84 @@ python () {
bb.build.addtask(task, 'do_image_complete', after, d)
}
+python prepare_excluded_directories() {
+ exclude_var = d.getVar('IMAGE_ROOTFS_EXCLUDE_PATH')
+ if not exclude_var:
+ return
+
+ taskname = d.getVar("BB_CURRENTTASK")
+
+ if d.getVarFlag('do_%s' % taskname, 'respect_exclude_path') == '0':
+ bb.debug(1, "'IMAGE_ROOTFS_EXCLUDE_PATH' is set but 'respect_exclude_path' variable flag is 0 for this image type, so ignoring it")
+ return
+
+ import shutil
+ from oe.path import copyhardlinktree
+
+ exclude_list = exclude_var.split()
+
+ rootfs_orig = d.getVar('IMAGE_ROOTFS')
+ # We need a new rootfs directory we can delete files from. Copy to
+ # workdir.
+ new_rootfs = os.path.realpath(oe.path.join(d.getVar("WORKDIR"), "rootfs.%s" % taskname))
+
+ if os.path.lexists(new_rootfs):
+ shutil.rmtree(new_rootfs)
+
+ copyhardlinktree(rootfs_orig, new_rootfs)
+
+ for orig_path in exclude_list:
+ path = orig_path
+ if os.path.isabs(path):
+ bb.fatal("IMAGE_ROOTFS_EXCLUDE_PATH: Must be relative: %s" % orig_path)
+
+ full_path = os.path.realpath(oe.path.join(new_rootfs, path))
+
+ # Disallow climbing outside of parent directory using '..',
+ # because doing so could be quite disastrous (we will delete the
+ # directory).
+ if not full_path.startswith(new_rootfs):
+ bb.fatal("'%s' points to a path outside the rootfs" % orig_path)
+
+ if path.endswith(os.sep):
+ # Delete content only.
+ for entry in os.listdir(full_path):
+ full_entry = oe.path.join(full_path, entry)
+ if os.path.isdir(full_entry) and not os.path.islink(full_entry):
+ shutil.rmtree(full_entry)
+ else:
+ os.remove(full_entry)
+ else:
+ # Delete whole directory.
+ shutil.rmtree(full_path)
+
+ # Save old value for cleanup later.
+ d.setVar('IMAGE_ROOTFS_ORIG', rootfs_orig)
+ d.setVar('IMAGE_ROOTFS', new_rootfs)
+}
+
+python cleanup_excluded_directories() {
+ exclude_var = d.getVar('IMAGE_ROOTFS_EXCLUDE_PATH')
+ if not exclude_var:
+ return
+
+ taskname = d.getVar("BB_CURRENTTASK")
+
+ if d.getVarFlag('do_%s' % taskname, 'respect_exclude_path') == '0':
+ return
+
+ import shutil
+
+ rootfs_dirs_excluded = d.getVar('IMAGE_ROOTFS')
+ rootfs_orig = d.getVar('IMAGE_ROOTFS_ORIG')
+ # This should never happen, since we should have set it to a different
+ # directory in the prepare function.
+ assert rootfs_dirs_excluded != rootfs_orig
+
+ shutil.rmtree(rootfs_dirs_excluded)
+ d.setVar('IMAGE_ROOTFS', rootfs_orig)
+}
+
#
# Compute the rootfs size
#
@@ -196,6 +196,7 @@ IMAGE_CMD:multiubi () {
multiubi_mkfs "${mkubifs_args}" "${ubinize_args}" "${name}"
done
}
+do_image_multiubi[respect_exclude_path] = "0"
IMAGE_CMD:ubi () {
multiubi_mkfs "${MKUBIFS_ARGS}" "${UBINIZE_ARGS}"
@@ -69,6 +69,7 @@ IMAGE_CMD:wic () {
}
IMAGE_CMD:wic[vardepsexclude] = "WKS_FULL_PATH WKS_FILES TOPDIR"
do_image_wic[cleandirs] = "${WORKDIR}/build-wic"
+do_image_wic[respect_exclude_path] = "0"
PSEUDO_IGNORE_PATHS .= ",${WORKDIR}/build-wic"