回复
如何添加新的芯片架构到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 ,编译目标芯片
可以看到内核正常编译,单编译sysroot_lite时出错
在build/lite/BUILD.gn中定义了如下内容问题出在third_party/musl/scripts/build_lite/BUILD.gn
group("prebuilts") {
public_deps = [ "//third_party/musl:sysroot_lite" ]
}
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 !
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
赞
收藏
回复
相关推荐