总结
在使用OK536N-C的sdk搭建环境时总体是非常顺利的,只是qt_demo折腾了一下。希望飞凌的团队能看到并更新SDK压缩包.
PC准备开发环境
先下载到源码
OKT536-linux-sdk.tar.bz2比较大,被分成了6个子压缩包:
truedei@truedei-code:1-源码$ ls -l
总计 10747185
-rwxrwxrwx 1 root root 372 5月 16 20:48 md5sum.txt
-rwxrwxrwx 1 root root 2147483648 5月 16 21:04 OKT536-linux-sdk.tar.bz2.00
-rwxrwxrwx 1 root root 2147483648 5月 16 21:02 OKT536-linux-sdk.tar.bz2.01
-rwxrwxrwx 1 root root 2147483648 5月 16 21:03 OKT536-linux-sdk.tar.bz2.02
-rwxrwxrwx 1 root root 2147483648 5月 16 21:03 OKT536-linux-sdk.tar.bz2.03
-rwxrwxrwx 1 root root 2147483648 5月 16 21:05 OKT536-linux-sdk.tar.bz2.04
-rwxrwxrwx 1 root root 267695134 5月 16 21:05 OKT536-linux-sdk.tar.bz2.05
truedei@truedei-code:1-源码$
如果你害怕搞没,不想重新下载的话,可以先备份下:
truedei@truedei-code:1-源码$ cd ..
truedei@truedei-code:2-镜像及源码$ cp -arf 1-源码 1-源码_bak
可以使用md5sum校验:
truedei@truedei-code:1-源码$ cat md5sum.txt
81a2f7adbe52c3768eee4096aca3fefa OKT536-linux-sdk.tar.bz2.00
0ae30ee64b0fd44b5c8b563b0eff2d59 OKT536-linux-sdk.tar.bz2.01
9204b1fbfdc347864766fefe574f8b94 OKT536-linux-sdk.tar.bz2.02
2efca04ab16c43a2efe7c1cd68c85644 OKT536-linux-sdk.tar.bz2.03
3ebdef7248d268109b8617d5f83717ce OKT536-linux-sdk.tar.bz2.04
bc29ad68a624664439d2cea2e1634694 OKT536-linux-sdk.tar.bz2.05
truedei@truedei-code:1-源码$
truedei@truedei-code:1-源码$
truedei@truedei-code:1-源码$ md5sum OKT536-linux-sdk.tar.bz2.0*
81a2f7adbe52c3768eee4096aca3fefa OKT536-linux-sdk.tar.bz2.00
0ae30ee64b0fd44b5c8b563b0eff2d59 OKT536-linux-sdk.tar.bz2.01
9204b1fbfdc347864766fefe574f8b94 OKT536-linux-sdk.tar.bz2.02
2efca04ab16c43a2efe7c1cd68c85644 OKT536-linux-sdk.tar.bz2.03
3ebdef7248d268109b8617d5f83717ce OKT536-linux-sdk.tar.bz2.04
bc29ad68a624664439d2cea2e1634694 OKT536-linux-sdk.tar.bz2.05
truedei@truedei-code:1-源码$
解压多个被分割的压缩包时,需要先合并:
cat OKT536-linux-sdk.tar.bz2.0* > OKT536-linux-sdk.tar.bz2
然后解压tz2:
bunzip2 OKT536-linux-sdk.tar.bz2
#得到:
22G 5月 16 21:40 OKT536-linux-sdk.tar
会得到.tar,再继续解压.tar:
tar -xvf OKT536-linux-sdk.tar
解压完整个目录22G:
truedei@truedei-code:1-源码$ du -sh OKT536-linux-sdk
22G OKT536-linux-sdk
truedei@truedei-code:1-源码$
然后拷贝不是中文的目录:例如我的:/media/truedei/soft/Ok536N-C
truedei@truedei-code:1-源码$ cp -arf OKT536-linux-sdk ../../../../
我是觉得解压一次不容易,还是cp过去一份比较好,虽然多占了22GB的空间,但是相对安全,例如某个操作破坏了当前的sdk内容,你还可以节省前面所有的操作。
初探经验:最好赋予下权限,不然build.sh时会报权限不足:
truedei@truedei-code:OKT536-linux-sdk$ chmod o+w ./ -R
truedei@truedei-code:OKT536-linux-sdk$
调用时报:
/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/build/mkcmd.sh: line 750: python: command not found
原因是我系统中只有python3,没有低版本的python
ubuntu24.04这样解决:
sudo apt install python-is-python3
先编译配置:
sudo ./build.sh config
然后直接执行./build.sh编译
truedei@truedei-code:OKT536-linux-sdk$ ./build.sh
05-17 01:15:26.517 31732 D mkcommon : ========ACTION List: build_linuxdev;========
05-17 01:15:26.519 31732 D mkcommon : options :
05-17 01:15:26.520 31732 I mkcommon : ----------------------------------------
05-17 01:15:26.521 31732 I mkcommon : build linuxdev ...
05-17 01:15:26.522 31732 I mkcommon : chip: sun55iw6p1
05-17 01:15:26.523 31732 I mkcommon : platform: linux
05-17 01:15:26.525 31732 I mkcommon : kernel: linux-5.10-origin
05-17 01:15:26.526 31732 I mkcommon : board: OKT536-C
05-17 01:15:26.527 31732 I mkcommon : output: /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot
05-17 01:15:26.528 31732 I mkcommon : ----------------------------------------
05-17 01:15:26.554 31732 I mkcommon : build rtos ...
buildroot编译不过去:
05-17 01:36:23.072 56507 I mkcommon : build buildroot ...
make: Entering directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/buildroot-202205'
You seem to have the current working directory in your
LD_LIBRARY_PATH environment variable. This doesn't work.
make[1]: *** [support/dependencies/dependencies.mk:27: dependencies] Error 1
make: *** [Makefile:96: _all] Error 2
make: Leaving directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/buildroot-202205'
05-17 01:36:28.549 56507 E mkcommon : build buildroot Failed
05-17 01:36:28.550 56507 F mkcommon : build_buildroot_rootfs failed
truedei@truedei-code:OKT536-linux-sdk$
LD_LIBRARY_PATH environment variable. This doesn't work.
说我的环境中存在LD_LIBRARY_PATH变量。
先临时解决下:
truedei@truedei-code:OKT536-linux-sdk$ echo $LD_LIBRARY_PATH
/home/truedei/local/lib:
truedei@truedei-code:OKT536-linux-sdk$
truedei@truedei-code:OKT536-linux-sdk$ export LD_LIBRARY_PATH=""
truedei@truedei-code:OKT536-linux-sdk$ echo $LD_LIBRARY_PATH
truedei@truedei-code:OKT536-linux-sdk$
为了节省时间,这次可以单独编译rootfs:
因为我遇到了权限问题,所以加了sudo
truedei@truedei-code:OKT536-linux-sdk$ sudo ./build.sh buildroot_rootfs
成功之后是这样的:
media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/buildroot-202205
build auto finish
05-17 03:14:42.112 94974 I mkcommon : copy the config files form device ...
make: Entering directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/platform'
Makefile:35: "----------1--------"
Makefile:36: /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/platform
make: Nothing to be done for 'INSTALL_FILES'.
make: Leaving directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/platform'
05-17 03:14:42.139 94974 I mkcommon : build buildroot OK.
truedei@truedei-code:OKT536-linux-sdk$
如果你执行build.sh成功的话是这样的:
05-17 07:53:53.660 46608 D mkcommon : Number of gids 1
05-17 07:53:53.661 46608 D mkcommon : root (0)
05-17 07:53:53.663 46608 I mkcommon : pack rootfs ok ...
05-17 07:53:53.664 46608 I mkcommon : ----------------------------------------
05-17 07:53:53.666 46608 I mkcommon : build OK.
05-17 07:53:53.667 46608 I mkcommon : ----------------------------------------
truedei@truedei-code:OKT536-linux-sdk$
truedei@truedei-code:OKT536-linux-sdk$
truedei@truedei-code:OKT536-linux-sdk$
truedei@truedei-code:OKT536-linux-sdk$
truedei@truedei-code:OKT536-linux-sdk$
truedei@truedei-code:OKT536-linux-sdk$ sudo ./build.sh -j10
我还发现了一个问题,在编译qt_demo时,Makefile中的qmake路径是写死的:
cd browser/ && ( test -e Makefile || /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/browser/browser.pro ) && make -f Makefile
cd backlight/ && ( test -e Makefile || /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/backlight/backlight.pro ) && make -f Makefile
cd adc/ && ( test -e Makefile || /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/adc/adc.pro ) && make -f Makefile
make[1]: Entering directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/musicplayer'
/home/yy/work/T536/.release/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile musicplayer.pro
make[1]: /home/yy/work/T536/.release/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake: No such file or directory
make[1]: *** [Makefile:282: Makefile] Error 127
make[1]: Leaving directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/musicplayer'
make: *** [Makefile:111: sub-musicplayer-make_first] Error 2
make: *** Waiting for unfinished jobs....
make[1]: Entering directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/watchdog'
/home/yy/work/T536/.release/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile watchdog.pro
make[1]: /home/yy/work/T536/.release/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake: No such file or directory
make[1]: *** [Makefile:276: Makefile] Error 127
报错的路径:
/home/yy/work/T536/.release/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake
正确的路径:
/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake
导致该问题的原因:
现在我在刚解压过的原始sdk中,没做过任何编译:
truedei@truedei-code:qt_demo$ pwd
/media/truedei/soft/Ok536N-C/doc/OK536x-C_Linux5.10.198+Qt5.15.8_用户资料_R1/2-镜像及源码/1-源码/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo
truedei@truedei-code:qt_demo$
发现已经生成了.qmake.stash和Makefile:
truedei@truedei-code:qt_demo$ ls -alh
总计 177K
drwxrwxrwx 1 root root 4.0K 2月 13 19:08 .
drwxrwxrwx 1 root root 0 2月 13 17:49 ..
drwxrwxrwx 1 root root 4.0K 2月 13 19:08 4g
drwxrwxrwx 1 root root 4.0K 2月 13 19:08 adc
drwxrwxrwx 1 root root 4.0K 2月 13 19:08 backlight
drwxrwxrwx 1 root root 4.0K 2月 13 19:08 books
drwxrwxrwx 1 root root 28K 2月 13 19:08 browser
drwxrwxrwx 1 root root 0 2月 13 19:08 DWKeyboard
-rwxrwxrwx 1 root root 338 2月 13 17:49 examples.pro
-rwxrwxrwx 1 root root 34 2月 13 17:49 .gitignore
drwxrwxrwx 1 root root 4.0K 2月 13 19:08 keypad
-rwxrwxrwx 1 root root 84K 2月 13 19:08 Makefile
drwxrwxrwx 1 root root 4.0K 2月 13 19:08 matrix-browser
drwxrwxrwx 1 root root 4.0K 2月 13 19:08 musicplayer
drwxrwxrwx 1 root root 4.0K 2月 13 19:08 network
drwxrwxrwx 1 root root 4.0K 2月 13 19:08 ping_test
-rwxrwxrwx 1 root root 2.1K 2月 13 17:49 .qmake.stash
drwxrwxrwx 1 root root 4.0K 2月 13 19:08 rtc
drwxrwxrwx 1 root root 4.0K 2月 13 19:08 spitest
drwxrwxrwx 1 root root 4.0K 2月 13 19:08 terminal
drwxrwxrwx 1 root root 4.0K 2月 13 19:08 watchdog
drwxrwxrwx 1 root root 4.0K 2月 13 19:08 wifi
truedei@truedei-code:qt_demo$
truedei@truedei-code:qt_demo$ cat .qmake.stash
QMAKE_CXX.QT_COMPILER_STDCXX = 201402L
QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 10
QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 3
QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 1
QMAKE_CXX.COMPILER_MACROS = \
QT_COMPILER_STDCXX \
QMAKE_GCC_MAJOR_VERSION \
QMAKE_GCC_MINOR_VERSION \
QMAKE_GCC_PATCH_VERSION
QMAKE_CXX.INCDIRS = \
/home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/include/c++/10.3.1 \
/home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/include/c++/10.3.1/aarch64-none-linux-gnu \
/home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/include/c++/10.3.1/backward \
/home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/lib/gcc/aarch64-none-linux-gnu/10.3.1/include \
/home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/lib/gcc/aarch64-none-linux-gnu/10.3.1/include-fixed \
/home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/include \
/home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/aarch64-buildroot-linux-gnu/sysroot/usr/include
QMAKE_CXX.LIBDIRS = \
/home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/lib/gcc/aarch64-none-linux-gnu/10.3.1 \
/home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/lib/gcc \
/home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/lib64 \
/home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/aarch64-buildroot-linux-gnu/sysroot/lib64 \
/home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib64 \
/home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/lib \
/home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/aarch64-buildroot-linux-gnu/sysroot/lib \
/home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib
truedei@truedei-code:qt_demo$
truedei@truedei-code:qt_demo$ find ./ -name "Makefile"
./4g/Makefile
./adc/Makefile
./backlight/Makefile
./books/Makefile
./browser/Makefile
./keypad/Makefile
./Makefile
./matrix-browser/Makefile
./musicplayer/Makefile
./network/Makefile
./ping_test/Makefile
./rtc/Makefile
./spitest/Makefile
./terminal/Makefile
./watchdog/Makefile
./wifi/Makefile
truedei@truedei-code:qt_demo$
随便打开一个Makefile看下心里就有数了:
排查的最终解决方案:
清理掉qt_demo的所有Makefile和.qmake.stash。
truedei@truedei-code:qt_demo$ find ./ -name "Makefile"
./4g/Makefile
./adc/Makefile
./backlight/Makefile
./books/Makefile
./browser/Makefile
./keypad/Makefile
./Makefile
./matrix-browser/Makefile
./musicplayer/Makefile
./network/Makefile
./ping_test/Makefile
./rtc/Makefile
./spitest/Makefile
./terminal/Makefile
./watchdog/Makefile
./wifi/Makefile
truedei@truedei-code:qt_demo$
###删除:
truedei@truedei-code:qt_demo$ find ./ -name "Makefile" -delete
truedei@truedei-code:qt_demo$ find ./ -name "Makefile"
truedei@truedei-code:qt_demo$
truedei@truedei-code:qt_demo$
###删除qmake的缓存
truedei@truedei-code:qt_demo$ rm -rf .qmake.stash
truedei@truedei-code:qt_demo$
这个问题的关键在与:
- 1.我认为飞凌的团队在提供原始代码的时候,应该清理掉该项目编译生产的.o,Makefile,qt的stash文件;
- 2.shell脚本可以优化下:
现在的:
cd 4g/ && ( test -e Makefile || /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/4g/4g.pro ) && make -f Makefile
会出现的问题:
test -e Makefile命令会检测是否存在Makefile,如果存在就不执行后面的语句重新生产了;
其实去掉test -e Makefile或者把||改成&&(感觉改成&&就起不到什么作用了,和检查不检查没区别)。
写这个脚本的作者应该是这样想的:
- 用户初次生产之后,就不让再次生成了,编译时可以节省时间;
创建自己的项目
这个牵扯到项目放在哪里,想知道放在哪里合适,就需要熟悉项目的整体架构。
砍下这个目录:
truedei@truedei-code:auto$ pwd
/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto
truedei@truedei-code:auto$
truedei@truedei-code:auto$ ls -l
总计 32
drwxrwxrwx 1 root root 0 2月 13 17:49 allwinner
-rwxrwxrwx 1 root root 5347 5月 18 19:44 build.sh
drwxrwxrwx 1 root root 0 2月 13 17:49 forlinx
-rwxrwxrwx 1 root root 4024 5月 18 15:08 makefile_cfg
drwxrwxrwx 1 root root 0 2月 13 17:49 qt-demo
-rwxrwxrwx 1 root root 5797 2月 13 17:49 ReadMe.md
drwxrwxrwx 1 root root 4096 2月 13 17:49 sdk_demo
drwxrwxrwx 1 root root 4096 2月 13 19:08 sdk_lib
truedei@truedei-code:auto$
可以打开OKT536-linux-sdk/buildroot/package/auto/build.sh研究下:
看得出来,这各forlinx就是飞凌新增的脚本片段。
我们可以把OKT536-linux-sdk/buildroot/package/auto目录当项目根目录,继续创建目录
我完全是把OKT536-linux-sdk/buildroot/package/auto/sdk_demo/usbcam_test拷贝过来了,改了个名字
build.sh脚本新增:
#########truedei#########
echo "build $1 truedei ..."
make -C $LICHEE_BUILDROOT_DIR/package/auto/truedei/ $1
if [ $? -ne 0 ]; then
echo "build truedei fail ..."
exit 1
else
cp -rf $LICHEE_BUILDROOT_DIR/package/auto/truedei/bin/* $LICHEE_BR_OUT/target/usr/bin/
fi
Makefile需要修改下:
INSTALL_TRUEDEI_PATH变量是在auto目录下的makefile_cfg中定义的:
# 自定义自己的项目
INSTALL_TRUEDEI_PATH = $(PACKAGE_PATH)/truedei/bin
然后就可以编译了,为了省时间,可以直接到项目中编译即可:
truedei@truedei-code:truedei$
truedei@truedei-code:truedei$ pwd
/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/truedei
truedei@truedei-code:truedei$
truedei@truedei-code:truedei$
truedei@truedei-code:truedei$
truedei@truedei-code:truedei$ make
-e
/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/aarch64-none-linux-gnu-g++ -g -o truedei ./usbcam_test.o -L/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/sdk_lib
generate truedei success!!!
cp -f truedei /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/truedei/bin
make finish!!!
truedei@truedei-code:truedei$