最近在RK3568平台上进行Linux SDK编译时遇到了一个典型的报错问题。具体报错信息如下:
code复制make[2]: *** No rule to make target 'drivers/gpu/drm/rockchip/rockchip_drm_drv.c', needed by 'drivers/gpu/drm/rockchip/rockchip_drm_drv.o'. Stop.
这个错误看起来是典型的Makefile规则缺失问题,但实际原因可能更加复杂。RK3568作为Rockchip的中高端处理器,其Linux SDK编译环境相比普通ARM平台更为复杂,涉及多个子系统和驱动模块的协同编译。
首先我们需要确认几个关键点:
提示:RK3568的Linux SDK通常包含uboot、kernel和rootfs三大部分,编译报错可能出现在任何一个阶段,需要根据具体报错信息定位问题阶段。
RK3568的官方推荐编译环境是Ubuntu 18.04/20.04 LTS,需要安装以下基础包:
bash复制sudo apt-get update
sudo apt-get install -y git-core gnupg flex bison gperf build-essential \
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \
libgl1-mesa-dev libxml2-utils xsltproc unzip device-tree-compiler \
liblz4-tool libssl-dev
特别注意:
RK系列芯片的SDK通常通过repo工具管理,需要检查源码完整性:
bash复制repo sync -c -j4
repo forall -c 'git checkout -f'
常见问题包括:
RK3568需要专用的交叉编译工具链,通常在SDK的prebuilts目录下:
bash复制export PATH=$PATH:`pwd`/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin
export CROSS_COMPILE=aarch64-linux-gnu-
验证工具链是否生效:
bash复制aarch64-linux-gnu-gcc --version
原始报错表明rockchip_drm_drv.c文件找不到,可能的原因有:
内核配置问题:
bash复制make ARCH=arm64 menuconfig
确保配置中包含:
code复制CONFIG_DRM_ROCKCHIP=y
CONFIG_ROCKCHIP_DRM_TVE=y
源码目录结构异常:
bash复制find . -name rockchip_drm_drv.c
如果确实缺失,需要从官方仓库重新获取:
bash复制git checkout -- drivers/gpu/drm/rockchip/
Makefile依赖错误:
检查drivers/gpu/drm/rockchip/Makefile,确保包含:
makefile复制rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o \
rockchip_drm_gem.o rockchip_drm_vop.o
头文件缺失:
code复制fatal error: rockchip_drm.h: No such file or directory
解决方案:
bash复制make ARCH=arm64 headers_install
工具链不匹配:
code复制unrecognized command line option '-mno-unaligned-access'
需要更换为SDK配套的工具链版本
内存不足:
code复制gcc: internal compiler error: Killed (program cc1)
增加swap空间或使用-j参数限制并行编译任务数
bash复制# 清理环境
make ARCH=arm64 distclean
# 应用默认配置
make ARCH=arm64 rockchip_linux_defconfig
# 自定义配置(可选)
make ARCH=arm64 menuconfig
# 开始编译
make ARCH=arm64 rk3568-evb.img -j$(nproc)
编译完成后需要生成可烧写的固件:
bash复制./mkimage.sh
生成的固件位于rockdev目录下,包括:
使用更详细的编译输出:
bash复制make V=1 > build.log 2>&1
关键排查点:
导出当前配置与默认配置对比:
bash复制make ARCH=arm64 savedefconfig
diff -u arch/arm64/configs/rockchip_linux_defconfig defconfig
检查模块依赖关系:
bash复制make ARCH=arm64 modules_prepare
make ARCH=arm64 M=drivers/gpu/drm/rockchip modules
为避免环境污染,建议使用:
Docker容器:
bash复制docker run -it --name rk3568-build -v $(pwd):/sdk ubuntu:20.04
版本控制:
bash复制git checkout -b my-build
repo start my-build --all
编译缓存:
bash复制export USE_CCACHE=1
ccache -M 50G
在实际项目中,RK3568的Linux SDK编译问题往往不是单一因素导致。我遇到最棘手的一个案例是由于内核配置中同时开启了CONFIG_DRM_ROCKCHIP和CONFIG_DRM_PANEL_ROCKCHIP的冲突,导致驱动编译顺序异常。解决这类问题需要耐心分析Makefile依赖链,有时需要手动调整编译顺序或临时注释掉部分模块。