[文章]鸿蒙系统移植操作步骤指引---树莓派交叉编译工具链配置篇(配置出错修改中)

阅读量0
0
0


很多朋友对移植鸿蒙存在不少疑惑,其中对交叉编译工具链的配置也完全不清楚。现在我们来一步步完成树莓派3上鸿蒙系统的交叉编译工具链配置操作。
首先,我们在命令行中输入
  1. python build.py rpi3
复制代码
结果肯定是失败的,我们来看看提示。如下图所示,提示的内容是找不到 build/lite/product/rpi3.json 这个文件。 这么说来,编译脚本第一步就是先定位这个 product 文件夹里的设置内容,然后根据该文件的设置布置编译任务。

01.png


那我们配置的第一步,就是新建这个文件了

--------------------------------------------------------------------------------------

1、新建build/lite/product/rpi3.json ,并复制3518的内容
     我们在这个文件夹新建 build/lite/product/rpi3.json  文件,并输入以下内容。
  1. {
  2.     "ohos_version": "OpenHarmony 1.0",
  3.     "board": "rpi3",
  4.     "kernel": "liteos_a",
  5.     "compiler": "arm-none-eabi-gcc",
  6.     "subsystem": [
  7.       {
  8.         "name": "hiviewdfx",
  9.         "component": [
  10.           { "name": "hilog_lite", "dir": "//base/hiviewdfx/frameworks/hilog_lite/featured:hilog_static", "features":[] },
  11.           { "name": "hilog_lite", "dir": "//base/hiviewdfx/frameworks/hilog_lite/featured:hilog_shared", "features":[] }
  12.         ]
  13.       },
  14.       {
  15.         "name": "distributedschedule",
  16.         "component": [
  17.           { "name": "samgr_lite", "dir": "//foundation/distributedschedule/services/samgr_lite:samgr", "features":[] },
  18.           { "name": "safwk_lite", "dir": "//foundation/distributedschedule/services/safwk_lite:safwk_lite", "features":[] },
  19.           { "name": "dtbschedmgr_lite", "dir": "//foundation/distributedschedule/services/dtbschedmgr_lite:dtbschedmgr", "features":[] }
  20.         ]
  21.       },
  22.       {
  23.         "name": "security",
  24.         "component": [
  25.           { "name": "hichainsdk_lite", "dir": "//base/security/frameworks/hichainsdk_lite:hichainsdk", "features":[] },
  26.           { "name": "iam_lite", "dir": "//base/security/services/iam_lite:pms_lite", "features":[] },
  27.           { "name": "app_verify", "dir": "//base/security/frameworks/app_verify:verify", "features":[] }
  28.         ]
  29.       },
  30.       {
  31.         "name": "multimedia",
  32.         "component": [
  33.           { "name": "media_lite", "dir": "//foundation/multimedia/services/media_lite:media_lite", "features":[] }
  34.         ]
  35.       },
  36.       {
  37.         "name": "startup",
  38.         "component": [
  39.           { "name": "bootstrap_lite", "dir": "//base/startup/services/bootstrap_lite/source:bootstrap", "features":[] },
  40.           { "name": "parameter", "dir": "//base/startup/frameworks/syspara_lite/parameter:parameter", "features":[] },
  41.           { "name": "token", "dir": "//base/startup/frameworks/syspara_lite/token:token", "features":[] },
  42.           { "name": "init_lite", "dir": "//base/startup/services/init_lite:init_lite", "features":[] },
  43.           { "name": "appspawn_lite", "dir": "//base/startup/services/appspawn_lite:appspawn_lite", "features":[] }
  44.         ]
  45.       },
  46.       {
  47.         "name": "kernel",
  48.         "component": [
  49.           { "name": "liteos_a", "dir": "//kernel/liteos_a:kernel", "features":[] }
  50.         ]
  51.       },
  52.       {
  53.         "name": "communication",
  54.         "component": [
  55.           { "name": "ipc_lite", "dir": "//foundation/communication/frameworks/ipc_lite:liteipc", "features":[] },
  56.           { "name": "softbus_lite", "dir": "//foundation/communication/services/softbus_lite:softbus", "features":[] },
  57.           { "name": "wpa_supplicant", "dir": "//third_party/wpa_supplicant/wpa_supplicant-2.9:wpa_supplicant", "features":[] }
  58.         ]
  59.       },
  60.       {
  61.         "name": "hdf",
  62.         "component": [
  63.           { "name": "posix", "dir": "//drivers/hdf/lite/posix:hdf_posix", "features":[] },
  64.           { "name": "manager", "dir": "//drivers/hdf/lite/manager:hdf_manager", "features":[] },
  65.           { "name": "wifi", "dir": "//vendor/huawei/hdf/wifi:wifi_firmware", "features":[] },
  66.           { "name": "display", "dir": "//vendor/huawei/hdf/display/hdi:hdi_display", "features":[] },
  67.           { "name": "input", "dir": "//vendor/huawei/hdf/input/hdi:hdi_input", "features":[] }
  68.         ]
  69.       },
  70.       {
  71.         "name": "appexecfwk",
  72.         "component": [
  73.           { "name": "bundle_lite", "dir": "//foundation/appexecfwk/frameworks/bundle_lite:appexecfwk_kits_lite", "features":[] },
  74.           { "name": "bundlemgr_lite", "dir": "//foundation/appexecfwk/services/bundlemgr_lite:appexecfwk_services_lite", "features":[] }
  75.         ]
  76.       },
  77.       {
  78.         "name": "utils",
  79.         "component": [
  80.           { "name": "kv_store", "dir": "//utils/native/lite/kv_store:kv_store", "features":[] }
  81.         ]
  82.       },
  83.       {
  84.         "name": "vendor",
  85.         "component": [
  86.           { "name": "middleware", "dir": "//vendor/hisi/hi35xx/middleware:middleware_source_sdk", "features":[] },
  87.           { "name": "hardware", "dir": "//vendor/hisi/hi35xx/hardware:hardware_media_sdk", "features":[] }
  88.         ]
  89.       },
  90.       {
  91.         "name": "test",
  92.         "component": [
  93.           { "name": "xts_act", "dir": "//test/xts/acts", "features":[] },
  94.           { "name": "xts_tools", "dir": "//test/xts/tools", "features":[] },
  95.           { "name": "test", "dir": "//test/developertest:test", "features":[] }
  96.         ]
  97.       }
  98.     ],
  99.     "vendor_adapter_dir": "//vendor/hisi/hi35xx/hi3518ev300/hi3518ev300_adapter",
  100.     "third_party_dir": "//third_party",
  101.     "ohos_product_type":"",
  102.     "ohos_manufacture":"",
  103.     "ohos_brand":"",
  104.     "ohos_market_name":"",
  105.     "ohos_product_series":"",
  106.     "ohos_product_model":"",
  107.     "ohos_software_model":"",
  108.     "ohos_hardware_model":"",
  109.     "ohos_hardware_profile":"",
  110.     "ohos_serial":"",
  111.     "ohos_bootloader_version":"",
  112.     "ohos_secure_patch_level":"",
  113.     "ohos_abi_list":""
  114.   }
  115.   
复制代码
说明:板子设定为rpi3,编译器设定为 arm-none-eabi-gcc,并删掉一些组件
=========
接下来,我们再运行一下编译命令(python build.py rpi3 。我们填写了一个不在原系统里支持的编译器,运行命令也是会出错的。果然,提示不支持这个编译器。
02.png


好的,那第二步的工作就确定了

--------------------------------------------------------------------------------------
2、编写  arm-none-eabi-gcc  配置文件     我们先用VScode搜索一下  Error: Unsupport compiler  这个错误。然后定位到  build/lite/config.py  这个文件的124行附件。将内容修改为以下内容
  1.         if compiler == "clang":
  2.             compiler_bin = "clang"
  3.         elif compiler == "arm-none-eabi-gcc":
  4.             compiler_bin = "arm-none-eabi-gcc"
  5.         elif compiler == "gcc":
  6.             compiler_bin = "riscv32-unknown-elf-gcc"
  7.         else:
复制代码
新增了编译器设置为 arm-none-eabi-gcc  的判断和执行部分
=======   
然后我们再次运行编译命令,又出现了一个新错误提示,如下图。
03.png

好的,这次我们在VScode中搜索 not OHOS compiler  ,同样是在 build/lite/config.py  这个文件的 160行附近找到了对应判断语句。
我们来将对应内容修改为
  1.         if compiler == 'gcc' or compiler == 'arm-none-eabi-gcc':
  2.             return True
复制代码
======
然后我们再次运行编译命令,又出现了一个新错误提示,如下图。
04.png


好的,根据提示缺少的文件,我们新建 build/lite/config/boards/rpi3.gni 文件,并添加以下内容。
  1. # Copyright (c) 2020 Huawei Device Co., Ltd.
  2. # Licensed under the Apache License, Version 2.0 (the "License");
  3. # you may not use this file except in compliance with the License.
  4. # You may obtain a copy of the License at
  5. #
  6. #     http://www.apache.org/licenses/LICENSE-2.0
  7. #
  8. # Unless required by applicable law or agreed to in writing, software
  9. # distributed under the License is distributed on an "AS IS" BASIS,
  10. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. # See the License for the specific language governing permissions and
  12. # limitations under the License.

  13. board_arch = "armv7-a"
  14. board_cpu = "cortex-a7"
复制代码
=======   
然后我们再次运行编译命令,又出现了一个新错误提示,如下图。
05.png

然后继续新建缺少的文件 build/lite/toolchain/arm-none-eabi-gcc.gni ,添加以下内容
  1. # Copyright (c) 2020 Huawei Device Co., Ltd.
  2. # Licensed under the Apache License, Version 2.0 (the "License");
  3. # you may not use this file except in compliance with the License.
  4. # You may obtain a copy of the License at
  5. #
  6. #     http://www.apache.org/licenses/LICENSE-2.0
  7. #
  8. # Unless required by applicable law or agreed to in writing, software
  9. # distributed under the License is distributed on an "AS IS" BASIS,
  10. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. # See the License for the specific language governing permissions and
  12. # limitations under the License.

  13. ohos_build_compiler_so_strip = "arm-none-eabi-objcopy --strip-all"
  14. ohos_build_compiler_bin_strip = "arm-none-eabi-objcopy --strip-all"

  15. template("arm_none_eabi_gcc_toolchain") {
  16.     toolchain(target_name) {
  17.         assert(defined(invoker.cc), "clang toolchain must specify a "cc" value")
  18.         assert(defined(invoker.cxx), "clang toolchain must specify a "cxx" value")
  19.         assert(defined(invoker.ar), "clang toolchain must specify a "ar" value")
  20.         assert(defined(invoker.as), "clang toolchain must specify a "as" value")
  21.         assert(defined(invoker.ld), "clang toolchain must specify a "ld" value")

  22.         cc = invoker.cc
  23.         cxx = invoker.cxx
  24.         ar = invoker.ar
  25.         as = invoker.as
  26.         ld = invoker.ld

  27.         need_strip = false
  28.         if(defined(invoker.strip)) {
  29.             strip = invoker.strip
  30.             need_strip = true
  31.         }

  32.         tool("cc") {
  33.             command = "$cc {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
  34.             description = "arm-none-eabi-gcc {{output}}"
  35.             outputs = [
  36.                 "{{source_out_dir}}/{{source_name_part}}.o",
  37.             ]
  38.         }
  39.         tool("cxx") {
  40.             depfile = "{{output}}.d"
  41.             command = "$cxx {{defines}} {{include_dirs}} {{cflags_cc}} -c {{source}} -o {{output}}"
  42.             description = "arm-none-eabi-g++ {{output}}"
  43.             outputs = [
  44.                 "{{source_out_dir}}/{{source_name_part}}.o",
  45.             ]
  46.         }
  47.         tool("asm") {
  48.             depfile = "{{output}}.d"
  49.             command = "$as {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}"
  50.             description = "arm-none-eabi-as {{output}}"
  51.             outputs = [
  52.                 "{{source_out_dir}}/{{source_name_part}}.o",
  53.             ]
  54.         }
  55.         tool("alink") {
  56.             outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
  57.             rspfile = "{{output}}.rsp"
  58.             rspfile_content = "{{inputs}}"
  59.             command = "$ar -cr {{output}} @"$rspfile""
  60.             description = "arm-none-eabi-ar {{output}}"
  61.             outputs = [
  62.                 outfile,
  63.             ]
  64.             default_output_dir = "{{root_out_dir}}/libs"
  65.             default_output_extension = ".a"
  66.             output_prefix = "lib"
  67.         }
  68.         tool("solink") {
  69.             outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
  70.             rspfile = "$outfile.rsp"
  71.             rspfile_content = "{{inputs}}"
  72.             command = "$ld -shared {{ldflags}} {{inputs}} -o $outfile"
  73.             if (need_strip) {
  74.                 unstripped_outfile = outfile
  75.                 command += " && $strip" + " "$unstripped_outfile" "$outfile""
  76.             }
  77.             default_output_extension = ".so"
  78.             description = "SOLINK $outfile"
  79.             default_output_dir = "{{root_out_dir}}"
  80.             output_prefix = "lib"
  81.             outputs = [
  82.                 outfile
  83.             ]
  84.         }
  85.         tool("link") {
  86.             outfile = "{{output_dir}}/bin/{{target_output_name}}{{output_extension}}"
  87.             rspfile = "$outfile.rsp"
  88.             custom_ld_flags = " "
  89.             command = "$cc {{ldflags}} {{inputs}} $custom_ld_flags -o $outfile"
  90.             if (need_strip) {
  91.                 command += " && $strip $outfile"
  92.             }

  93.             description = "GCC LINK $outfile"
  94.             default_output_dir = "{{root_out_dir}}"
  95.             rspfile_content = "{{inputs}}"
  96.             outputs = [
  97.                 outfile
  98.             ]
  99.         }
  100.         tool("stamp") {
  101.             if (host_os == "win") {
  102.                 command = "cmd /c type nul > "{{output}}""
  103.             } else {
  104.                 command = "/usr/bin/touch {{output}}"
  105.             }
  106.             description = "STAMP {{output}}"
  107.         }

  108.         tool("copy") {
  109.             command = "cp -afd {{source}} {{output}}"
  110.             description = "COPY {{source}} {{output}}"
  111.         }
  112.     }
  113. }
复制代码


================
再运行
编译命令,继续查看错误输出,如下图
06.png

是的,到这一步的时候,提示就有点奇怪了。明明设置了 arm-none-eabi-gcc ,却依然提示找 linux_x86_64_clang 。还是老方法,VScode搜索,找到了 build/lite/config/BUILDCONFIG.gn  的 28 行 ,将内容修改为:
  1.     if(ohos_kernel_type == "liteos_a") {
  2.         if(target_cpu == "cortex-a8") {
  3.             set_default_toolchain("//build/lite/toolchain:linux_arm_none_eabi_gcc")
  4.         } else {
  5.             set_default_toolchain("//build/lite/toolchain:linux_x86_64_clang")
  6.         }
  7.         default_target_configs = [ "//build/lite/config:liteos_a" ]
复制代码

同时,build/lite/toolchain/BUILD.gn
  文件中似乎也缺少定义,在文件最后添加以下内容

  1. if (ohos_build_compiler == "arm-none-eabi-gcc") {
  2.     arm_none_eabi_gcc_toolchain("linux_arm_none_eabi_gcc") {
  3.         ohos_build_compiler_prefix = "arm-none-eabi"
  4.         cc  = "${ohos_build_compiler_prefix}-gcc"
  5.         cxx = "${ohos_build_compiler_prefix}-g++"
  6.         ar  = "${ohos_build_compiler_prefix}-ar"
  7.         as  = "${ohos_build_compiler_prefix}-as"
  8.         ld  = cc
  9.         if (ohos_build_type == "release") {
  10.             strip = "${ohos_build_compiler_prefix}-objcopy  --strip-all"
  11.         }
  12.     }
  13. }
复制代码
================

再运行
编译命令,继续查看错误输出,如下图  
07.png

好的,到这里,基本上就配置得差不多了,我们看一下  out/rpi3/toolchain.ninja
这个文件,如下图,gn 工具已经正确识别了工具链了
08.png

这时候大家可以再仔细检查一下,编译命令是否正确,不正确的话就回去修改 build/lite/toolchain/arm-none-eabi-gcc.gni
文件。
===========
树莓派编译工具链移植暂时就在这里停止先,还未完成

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友