iotjs移植到openwrt

最近把三星的iotjs移植到了openwrt上跑,在rt5350的板上测试了一下。记录一下遇到的问题。

1.把iotjs clone下来,发现支持linux,
这样就比较简单了,因为openwrt也就是linux的一个变种。大致思路就是把cmake里的
工具链,改成openwrt的工具链就可以了。

2.首先就是到cmake/config目录里,把arm-linux.cmake拷贝一份,
名字改成mips-openwrt.cmake,c编译器改成mipsel-openwrt-linux-gcc,
c++编译器改成mipsel-openwrt-linux-g++。
deps目录下的libtuv和jerry的工具链配置,也是照此办理

3.其次就是,参考iotjs的wiki得知,编译主要由toos/build.py来控制,这里面
关于linux的部分,也照抄一份给openwrt就好了

4.编译起来后,遇到各种CMakeLists.txt报错的问题,也大致是因为target_os
由linux改为openwrt引起的,按照各自的情况处理就好了

5.编译jerrscript的过程中,报”sorry - this program has been built without plugin support”
错误,发现是因为跑了mipsel-openwrt-linux-uclibc-gcc-ar引起的,用
mipsel-openwrt-linux-uclibc-ar替换后问题消失,这部分在deps/jerry/CMakeLists.txt
里控制,添加下面的判断后,问题解决。所以,target_os改成openwrt,还是有些用处的。

   if("${PLATFORM}" STREQUAL "OPENWRT")
    string(REPLACE "gcc" "ar" CMAKE_AR ${FILE_NAME_GCC})
    string(REPLACE "gcc" "ranlib" CMAKE_RANLIB ${FILE_NAME_GCC})
   else()
    string(REPLACE "gcc" "gcc-ar" CMAKE_AR ${FILE_NAME_GCC})
    string(REPLACE "gcc" "gcc-ranlib" CMAKE_RANLIB ${FILE_NAME_GCC})
   endif()

6.改完上面这些后,编译ok,但是跑起来后,初始化uv_default_loop的时候出错退出。
经过一番查找,发现是deps/libtuv/source/linux/uv_linux_syscall.c的uv__eventfd2
报了”Invalid argument”错误,又经过一番查找之后,发现是
deps/libtuv/source/linux/uv_linux_syscall.h里硬编码的UV__O_NONBLOCK(0x800)跟
arch/mips/include/uapi/asm/fcntl.h里定义的O_NONBLOCK(0x80)对不上,导致
eventfd2系统调用检查参数时出错。最后发现,libtuv的最新版本已经解决了这个问题,
而iotjs用的还是有问题的libtuv版本。于是执行

git submodule update –remote –recursive

把submodule的版本都更新到最新,再按照1~5的步骤把该加的都加上,编译出来的iotjs
在rt5350的板子上跑起来就正常了。

7.iotjs程序大小2.6M左右,跑timer测试,占用内存4M左右,
在8M flash + 32M DDR的板上跑起来还可以。

8.最后把源码整理到了这里

你可能感兴趣的:(openwrt)