环境

系统:Ubuntu20.04

工程:OpenHarmony 5.x release

 

问题描述

项目中遇到要将kernel编译生成的某个ko文件放到设备vendor/etc/modules目录下。

使用:

ohos_prebuilt_etc("xxxx.ko") {
 source = "$root_out_dir/../kernel/src_tmp/$linux_kernel_version/boot_linux/xxxx.ko"    //out产品目录下生成的ko文件路径
 install_images = [ "vendor" ]
 relative_install_dir = "modules"
 part_name = xxxxx
}

编译时出现报错,提示:file not found

 

分析过程

1、提示文件找不到,说明在执行编译ohos_prebuilt_etc("xxxx.ko") 组件的时候,kernel编译的ko文件还没有生成。

ko文件是编译kernel时生成的,则该组件需要在kenel编译完成后执行。

//kernel编译组件
action("kernel") {
 script = "build_kernel.sh"
 sources = [ kernel_source_dir ]
​
 product_path = "vendor/$product_company/$product_name"
 outputs = [
  "$root_build_dir/../kernel/src_tmp/${linux_kernel_version}/boot_linux",
  "$root_build_dir/../kernel/checkpoint/compile_check",
 ]
 
 args = [
  rebase_path(kernel_build_script_dir, root_build_dir),
  rebase_path("$root_build_dir/packages/phone/images"),
  rebase_path("//device/board/hihope/$device_name"),
  product_path,
  ......
 ]
}

这里通过添加deps依赖可实现编译的先后顺序,依赖的组件会在该组件前编译:

ohos_prebuilt_etc("xxxx.ko") {
 source = "$root_out_dir/../kernel/src_tmp/$linux_kernel_version/boot_linux/xxxx.ko"    //out产品目录下生成的ko文件路径
 install_images = [ "vendor" ]
 deps = [ "kernel" ]   // kernel和该组件在同一部件下,则直接使用deps即可
 relative_install_dir = "modules"
 part_name = xxxxx
}

 

2、修改后编译,出现新的错误:

[OHOS INFO] ERROR Input to target not generated by a dependency.
​
[OHOS INFO] The file: //out/xxxx/xxxx.ko
​
[OHOS INFO] is listed as an input or source for the target: //xxxx/组件名
​
[OHOS INFO] but not targets in the build generate that file.

该错误表示目标文件(也就是ohos_prebuilt_etc("xxxx.ko")中指向的ko文件)没有被依赖项生成。

说明在使用ohos_prebuilt_etc模版时,如果有deps选项,则source指向的文件必须由deps项显式标明。

即在kernel组件的outputs配置项中添加:

action("kernel") {
 ......
 outputs = [
  ......
  //添加上要生成的ko文件路径
  "$root_out_dir/../kernel/src_tmp/$linux_kernel_version/boot_linux/xxxx.ko" 
 ]

再次编译,问题解决。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐