如何添加新的芯片架构到OH编译工具链 原创

Hello_Kun
发布于 2024-9-19 14:53
浏览
0收藏

OpenHarmony中的编译工具链支持arm、arm64等架构的CPU,如果适配的芯片架构不同(如csky),需要新增其他架构类型的CPU到编译框架。流程如下:

1 添加csky到OH编译框架

修改build相关文件

# 1. build/config/ohos/config.gni 添加csky判断
 36行添加
  } else if (current_cpu == "csky") {
    abi_target = "csky-linux-ohos"
  } else {
    assert(false, "Architecture not supported")
  }
-------------------------------------------------------------------------------------------------
# 2. build/config/ohos/abi.gni 添加csky判断
 43行
 }else if (current_cpu == "csky") {
   ohos_app_abi = "csky"
 }  
---------------------------
 52行
  } else if (target_cpu == "arm" || target_cpu == "x86" || target_cpu == "csky") {
  ohos_64bit_target_cpu = false
} else {
  assert(false, "Unknown target CPU: $target_cpu")
}
-------------------------------------------------------------------------------------------------
# 3. build/templates/metadata/module_info.gni #1-4 在arm等同类型参数位置添加csky参数判断
   75行
   } else if (target_cpu == "arm" || target_cpu == "x86" || target_cpu == "csky") {
      module_type = "lib"
-------------------------------------------------------------------------------------------------      
# 4. build/ohos/kernel/kernel.gni 修改默认内核为4.19.15
    declare_args() {
        # linux_kernel_version = "linux-5.10"
        linux_kernel_version = "linux-4.19.15"
    }} 
-------------------------------------------------------------------------------------------------
# 5. kernel/linux/build/kernel.mk 
    5.1 变量 KERNEL_CROSS_COMPILE += CC="$(CLANG_CC)" 添加判断条件
    ifneq ($(KERNEL_ARCH), csky)
    KERNEL_CROSS_COMPILE += CC="$(CLANG_CC)"
    endif
 ---------------------------   
    5.2 添加csky编译工具链路径
    else ifeq ($(KERNEL_ARCH), csky)
    KERNEL_TARGET_TOOLCHAIN :=  $(PREBUILTS_GCC_DIR)/linux-x86/csky/bin
    KERNEL_TARGET_TOOLCHAIN_PREFIX :=$(KERNEL_TARGET_TOOLCHAIN)/csky-abiv2-linux-
-------------------------------------------------------------------------------------------------
# 6. kernel/linux/build/build_module_kernel.sh #配置编译出的内核输出为Image
40行
elif [ "$KERNEL_ARCH" == "csky" ];then
    kernel_image="Image"
fi
-------------------------------------------------------------------------------------------------
# 7. kernel/linux/build/kernel_build.sh #添加csky判断,拷贝编译出的内核到输出路径
44行
elif [ "$5" == "csky" ];then
    cp ${2}/kernel/OBJ/${8}/arch/csky/boot/Image ${3}/Image
fi
-------------------------------------------------------------------------------------------------
#8 kernel/linux/build/BUILD.gn
30行
} else if (target_cpu == "csky") {
  kernel_image = "Image"
}
-------------------------------------------------------------------------------------------------
# 9. third_party/musl/musl_config.gni  添加csky判断
   13行
  } else if (current_cpu == "csky" ) {
    musl_arch = "ck860"
  }
-------------------------------------------------------------------------------------------------    
# 10. third_party/musl/scripts/build_lite/BUILD.gn 后续修改

2 添加自己的交叉编译工具

将目标芯片的交叉编译工具链压缩包解压到OH源码指定的目录中(kernel/linux/build/kernel.mk中KERNEL_TARGET_TOOLCHAIN我们指定了编译路径为prebuilts/linux-x86/csky/bin),以本机为例,在OH源码根目录//prebuilts/gcc/linux-x86下新建csky文件夹,解压交叉编译工具链到OH源码根目录/prebuilts/gcc/linux-x86/csky路径下,命令如下:

cd csky
sudo tar zxvf csky-linux-gunabiv2-tools-x86_64-glibc-linux-4.19.15-20201003.tar.gz

2.1 编译目标芯片

执行hb build -f ,编译目标芯片
 如何添加新的芯片架构到OH编译工具链-鸿蒙开发者社区
可以看到内核正常编译,单编译sysroot_lite时出错

在build/lite/BUILD.gn中定义了如下内容问题出在third_party/musl/scripts/build_lite/BUILD.gn

group("prebuilts") {

 public_deps = [ "//third_party/musl:sysroot_lite" ]

}

 如何添加新的芯片架构到OH编译工具链-鸿蒙开发者社区

2.2 解决musl报错

因为OH默认加载musl内部的libc libc++等库,但是musl中并没有csky的C库,所以使用需要目标芯片的编译工具链提供的c库,包括libc、lib,处理方式如下:

// 1. 准备C库,目标芯片的c库在OH中编译时不会自己加载,需要我们自己获取so文件
   //1.0 # prebuilts/gcc/linux-x86/csky/csky-linux-gnuabiv2/lib/ck860v/hard-fp
   hdf需要libstdc++.so,如果libc库有名称差异,先创建软连接,创建软连接 libc++.so链接到libstdc++.so
   $ ln -s libstdc++.so libc++.so 
   然后交叉编译工具路径下so文件
   //1.1 # prebuilts/gcc/linux-x86/csky/csky-linux-gnuabiv2/lib/ck860v/hard-fp/
   //1.2 # prebuilts/gcc/linux-x86/csky/csky-linux-gnuabiv2/libc/ck860v/hard-fp/lib
   //1.3 # prebuilts/gcc/linux-x86/csky/csky-linux-gnuabiv2/libc/ck860v/hard-fp/usr/lib
   //1.4 # prebuilts/gcc/linux-x86/csky/lib/gcc/csky-linux-gnuabiv2/6.3.0/ck860v/hard-fp
  
// 2. 修改musl的编译GN文件 //third_party/musl/scripts/build_lite/BUILD.gn 70行开始
// 2.1 修改71行开始这一段代码,不添加--sysroot=,添加后编译器找不到头文件这些的问题。
  # copy C/C++ runtime libraries to lib out dir
  if (ohos_build_compiler == "clang") {
    runtime_libs = [
      "libc++.so",
      "libc.so",
    ]
    compiler_cmd = "$ohos_current_cxx_command --target=$target_triple --sysroot=$sysroot_path $arch_cflags"
  } else {
    runtime_libs = [
      ·······交叉编译工具路径下的so文件·····
    ]
    if(board_configed_sysroot == "//prebuilts/gcc/linux-x86/csky/csky-linux-gnuabiv2/libc/ck860v/hard-fp/lib/")
    {
        compiler_cmd = "$ohos_current_cxx_command  $sysroot_path $arch_cflags"
        # 添加判断,csky时 $sysroot_path前面,不添加--sysroot=,会自动找.so 还有头文件
    }
    else{
       compiler_cmd = "$ohos_current_cxx_command --sysroot=$sysroot_path $arch_cflags"
    }
       
  }

// 2.2 144行开始修改这一段代码,自定义cflags
config("sysroot_flags") {
  if (ohos_build_compiler == "clang") {
    cflags = [
      "--target=$target_triple",
      "--sysroot=$sysroot_path",
    ]
  } else {
    cflags = [
      # "--sysroot=$sysroot_path", #注释掉default参数
      # "-specs=musl-gcc.specs",   #注释掉default参数
    ]
  }
  cflags_cc = cflags
  ldflags = cflags
  asmflags = cflags
}

// 3. 修改目标芯片的config.gni //device/board/openvalley/fx6evb/linux/config.gni
  // 3.1 配置sysroot_path为编译工具链内部的lib库路径
     # Sysroot path. #使用ck860v的硬浮点c库
     board_configed_sysroot = "//prebuilts/gcc/linux-x86/csky/csky-linux-gnuabiv2/libc/ck860v/hard-fp/lib/"

  // 3.2 修改架构
       【编译框架是比较混杂的,需要梳理清楚,arch在编译内核的时候要为csky,配置的时候虽然可以改为ck860,但是在内核makefile中需要是csky】
       【在编译其他部件,比如musl时,这个需要arch为ck860,因为架构没法在编译时修改,
        所以我们在vendor中配置 "target_cpu": "csky",此处的config.gni中的board_arch为ck860v】
     # Board arch, e.g.  "armv7-a", "rv32imac".
     board_arch = "ck860v"

执行编译,通过third_party/musl !

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏
回复
举报
回复
    相关推荐