我有一个目录,其中再次包含子目录,这些子目录构建时具有其他配方的一部分,并使用deploy bb类移动到DEPLOY_DIR_IMAGE。所以现在我想把它复制到主映像引导分区。
如果它是一个文件,那么将所需的文件名附加到IMAGE_EFI_BOOT_FILES变量,然后yocto将其复制到/boot。但同样的不工作的目录包含子目录,请提供风格,包括甚至子目录。谢谢你
PS:我已经尝试追加IMAGE_EFI_BOOT_FILES += "parent_dir/*"没有工作。
很明显,IMAGE_EFI_BOOT_FILES
的作用类似于众所周知的IMAGE_BOOT_FILES
和其他变量,它们负责在引导分区中提供必要的文件。这需要文件,而不是目录。
因此,如果您不需要手动指定所有文件,而是希望传递目录,我建议您使用python方法为您收集文件并将它们附加到变量。
请看下面我开发和测试的例子:
def get_files(d, dir):
import os
dir_path = dir
if not os.path.exists(os.path.dirname(dir)):
dir_path = d.getVar(dir)
return ' '.join(f for f in os.listdir(d.getVar(dir)) if os.path.isfile(f))
IMAGE_EFI_BOOT_FILES += "${@get_files(d, 'DEPLOY_DIR_IMAGE')}"
该方法将测试参数是否是一个真实的路径,然后它将直接检查文件,如果不是,它将假设它是一个位烘烤变量,它将得到它的内容,所以如果DEPLOY_DIR_IMAGE
是,例如,/home/user/dir
,传递DEPLOY_DIR_IMAGE
或/home/usr/dir
将给出相同的结果。
重要
很明显,IMAGE_EFI_BOOT_FILES
在.conf
文件(如local.conf
)或自定义机器配置文件中使用。因此,在.conf
文件中添加python函数将不起作用。我建议为它创建一个类,并在您的.conf
文件中全局继承它:
meta-custom/类/utils.bbclass
local.conf:
INHERIT += "utils"
IMAGE_EFI_BOOT_FILES += "${@get_files(d, 'DEPLOY_DIR_IMAGE')}"
试试这个,并在评论中告诉我。
编辑
我刚刚意识到bitbake已经在python表达式展开中导入了os
,所以你可以在一行中完成它,而不需要单独的python函数:
PATH = "/path/to/directory/" or
PATH = "A variable containing the path"
IMAGE_EFI_BOOT_FILES += "${@' '.join('%s' % f for f in os.listdir('${PATH}') if os.path.isfile(f))}"
注意:我正在寻找可以实现上述解决方案的Yocto内置,希望分享其他方法来解决社区的功能。
在bb文件中添加以下内容,如果您正在使用一个或参考talel-belhadjsalem答案来使用utils.bbclass。
def add_directory_bootfs(d, dirname, bootfs_dir):
file_list = list()
boot_files_list = list()
deploy_dir_image = d.getVar('DEPLOY_DIR_IMAGE')
for (dirpath, dirnames, filenames) in os.walk(os.path.join(deploy_dir_image, dirname)):
file_list += [os.path.join(dirpath, file) for file in filenames]
for file in file_list:
file_rel_path = os.path.relpath(file, os.path.join(deploy_dir_image, dirname))
boot_file_entry = os.path.join(dirname, file_rel_path) + ';' + os.path.join(bootfs_dir, dirname, file_rel_path)
boot_files_list.append(boot_file_entry)
return ' '.join(boot_files_list)
IMAGE_EFI_BOOT_FILES += "${@add_directory_bootfs(d, 'relative_path_to_dir_in_deploy_dir_image', 'EFI/BOOT')}"