前段时间收到了来自华为和51CTO提供的HiSparkWi-FiIoT智能家饰套件,在此表示谢谢。

linux下使用ninja编译_linux编译语句_linux编译方法

图片来自Pexels

收到以后就迫不及待开始研究了。该套件基于海思Hi3861芯片,在官方文档中,整个LiteOS的编译环境是基于Ubuntu发行版的。

假如你像我一样从事互联网行业,这么可能工作中接触更多的是CentOS。在CentOS中安装LiteOS的编译环境究竟是否可行呢?那和Ubuntu环境的配置又有哪些区别呢?让我们来一起探求一下。

扫码关注HarmonyOS技术社区

专注开源技术,共建鸿蒙生态

首先本文中的CentOS是以CentOS7.8.2003为基础。我事先在VMware中安装了全新的CentOS-7-x86_64-Minimal-2003,尽可能在一个较为干净的系统中,一步步探求编译的最小环境。

下载地址:

http://mirrors.huaweicloud.com/centos/7.8.2003/isos/x86_64/

需求剖析

海思Hi3861芯片的构架为RISC-V(32位版本),因而交叉编译工具链必不可少:gcc_riscv32。

鸿蒙LiteOS的部份源代码是基于gn、ninja建立工具组织的。我们熟悉的Chrome开源版Chromium,使用同样的建立工具管理。

gn拿来实现一种跨平台的、程序员便捷理解的编译管理,执行gn后,会生成给ninja使用的编译预处理配置。

经过ninja预处理后,将会显著推动编译速率。这些特点对于操作系统等超小型项目来讲十分有用。

在鸿蒙LiteOS源代码中,关于Hi3861芯片的一些适配代码,它的编译使用了SCons工具,此工具基于Python。

另外还有一部份源代码(比如第三方库:curl)使用了传统的makefile形式编译,为了实现一条命令即可完成编译,也同样须要Python脚本来进行集成。

安装编译环境

①准备好工具

在编译过程中,输入命令有时侯须要复制粘贴,你须要一个好用的SSH顾客端,这儿我用的是ZOC,类似的像SecureCRT之类的顾客端也可以。

另外,假如你的网路状况不是挺好的话,使用wget形式下载编译器会比较慢,我们可以使用迅雷等工具先把编译器下载好,之后通过rz命令传入CentOS。

yum install -y lrzsz

在官方文档手指出一些必要的工具须要通过下载二补码的方式安装,须要用到wget这样的命令。

在最小化安装的CentOS中,wget等命令是默认未安装的,此时我们要将此工具打算好:

yum install -y wget

②下载交叉编译工具

常规的操作是在CentOS中执行:

wget https://repo.huaweicloud.com/harmonyos/compiler/gcc_riscv32/7.3.0/linux/gcc_riscv32-linux-7.3.0.tar.gz

假如你事先通过迅雷在本地下载好了交叉编译器,可以在CentOS中输入:

rz

命令来激活SSH顾客端的上传窗口,选择本地文件后,点击“打开”即可上传至SSH中的当前目录。

使用tar命令对工具链解压:

tar -xvf gcc_riscv32-linux-7.3.0.tar.gz

这儿有个稍为须要注意的地方,即使压缩包文件名为tar.gz,通常这些文件在tar基础上还使用了gz方法压缩,因而一般解压时须要加-z选项,可真的加上这个选项会提示:

gzip: stdinnot in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now

③安装交叉编译工具

解压好交叉编译工具后,通常根据习惯,我会把这类应用放在/usr/local目录下。

mv gcc_riscv32 /usr/local/

其实,你也可以在上一步解压的过程中直接使用:

tar -xvf gcc_riscv32-linux-7.3.0.tar.gz -C /usr/local

为了能在Shell中直接使用交叉编译命令,须要将工具所在路径加入到PATH环境变量中。

打开全局环境变量配置文件:

vi /etc/profile

快捷命令Shift+g将光标定位到文件尾部。

更改PATH环境变量定义:

export PATH=/usr/local/gcc_riscv32/bin:$PATH

快捷命令:wq!将更改保存。

执行命令:

source /etc/profile

使环境变量配置立刻生效。为了验证安装正确性,可以使用:

cd
riscv32-unknown-elf-gcc --version

应该输出:

riscv32-unknown-elf-gcc (GCC) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

④编译安装Python3

官方文档手指出,Python须要3.7以上版本linux下使用ninja编译,看了一下CentOS官方源的Python版本,是2.7。

但是一些运维的工具也是基于2.7的,不能强行删掉。为此我们变通一下,自己编译个Python3。看了一下官网,目前的最新稳定版本为:3.9.0。

和交叉编译工具一样,你也可以提早下载好源码包,或则使用命令下载:

wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz

之后将源码包解压:

tar -xzvf Python-3.9.0.tgz

在编译开始前,须要安装一些编译过程中依赖的其他组件,以下是我挨个尝试过的,为最精简的依赖包。

linux编译方法_linux编译语句_linux下使用ninja编译

注意:假如你追求一个更为精简的环境,可以在另外一个环境中编译好Python3,之后将二补码包拷贝过来。

这样就不用安装下边的组件了:

yum groupinstall -y "Development tools"
yum install -y openssl-devel
yum install -y libffi libffi-devel
yum install -y bzip2-devel
yum install -y sqlite-devel
yum install -y readline-devel
yum install -y libuuid-devel
yum install -y uuid-devel
yum install -y xz-devel
yum install -y gdbm-devel
yum install -y tk-devel

根据习惯,希望将Python3安装到/usr/local/python3目录下。须要配置编译,指定prefix:

cd Python-3.9.0
./configure --prefix=/usr/local/python3

接出来进行编译Python3:

make -j8 && make install

这儿的参数-j是并行job数。请结合自身CentOS运行实际硬件环境(CPU核数)配置,过大、过小都不太好,适当优化可改善编译速率。

为了能在Shell中直接使用Python3命令,又不与系统中的Python2.7形成冲突,我们须要创建两个软链接:

ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

/usr/bin目录是默认在PATH环境变量中的,上述两个软链接创建好后即可直接在Shell中使用了:

[root@localhost ~]# python3 --version
Python 3.9.0
[root@localhost ~]# pip3 --version
pip 20.2.3 from /usr/local/python3/lib/python3.9/site-packages/pip (python 3.9)

⑤安装一些基于Python3的必要组件

安装完Python3以后,按照官方指导,还须要安装一些基于Python3的编译时用到的组件,整理如下:

pip3 install setuptools
pip3 install kconfiglib
pip3 install pycryptodome
pip3 install six --upgrade --ignore-installed six
pip3 install ecdsa

假如你在安装时遇见了这样的提示:

WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate is not yet valid (_ssl.c:1122)'))': /simple/kconfiglib/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate is not yet valid (_ssl.c:1122)'))': /simple/kconfiglib/
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate is not yet valid (_ssl.c:1122)'))': /simple/kconfiglib/

请复查一下是否本地时间与真实时间相差比较大(写这篇文章时的时间为2020年10月14日):

[root@localhost ~]date
2020年 09月 23日 星期三 15:46:28 CST

可以使用如下代码来校正本地时间:

ntpdate -u time.windows.com

⑥安装SCons

上文中提及,鸿蒙LiteOS的源码编译过程还须要Scons工具,接出来要安装一下。

首先下载其源代码:

wget http://prdownloads.sourceforge.net/scons/scons-4.0.1.tar.gz

解压:

tar -xzvf scons-4.0.1.tar.gz

安装:

cd SCons-4.0.1/
python3 setup.py install

生成SCons命令的软链接,使其在Shell中就能直接使用:

ln -s /usr/local/python3/bin/scons /usr/bin/scons

linux编译语句_linux下使用ninja编译_linux编译方法

⑦安装gn工具(拿来形成ninja编译脚本)

gn工具是由Google公司开发的一套预编译工具,源代码地址:

https://gn.googlesource.com/gn/

因为一些众所周知的缘由,国外下载源码不太便捷,幸而华为为我们提供了编译好的二补码文件。(假如你感兴趣,想自己编译的话,须要事先打算Python、ninja和LLVM环境)

下载:

wget https://repo.huaweicloud.com/harmonyos/compiler/gn/1523/linux/gn.1523.tar

解压:

tar -xvf gn.1523.tar

安装:

mv gn /usr/local/
ln -s /usr/local/gn/gn /usr/bin/gn

验证:

[root@localhost ~]# gn --version
1523 (5bd8e26b)

⑧安装ninja工具

同样,华为为我们也提供了相应的二补码版本。

下载:

wget https://repo.huaweicloud.com/harmonyos/compiler/ninja/1.9.0/linux/ninja.1.9.0.tar

解压:

tar -xvf ninja.1.9.0.tar

安装:

mv ninja /usr/local
ln -s /usr/local/ninja/ninja /usr/bin/ninja

验证:

[root@localhost ~]ninja --version
1.9.0

⑨测试编译

经过上述步骤,编译环境已基本安装完成linux格式化命令,我们来尝试编译一下。

下载全量源代码:

wget https://repo.huaweicloud.com/harmonyos/os/1.0/code-1.0.tar.gz

解压:

mkdir liteos
tar -xzvf code-1.0.tar.gz -C liteos

注意,源代码压缩文件内部未包含单独的目录,会解压下来一大堆文件,应该先构建一个目录,再向该目录解压!

解压好以后,根据官方提供的命令进行编译。因为我们安装的Python3为了防止与Python2.7命令冲突,可执行命令变为python3,故编译稍有差异:

python3 build.py wifiiot

我们听到,最终编译成功,且输出了可以烧录的固件:out/wifiiot/Hi3861_wifiiot_app_allinone.bin。

小结:上述过程,尽管稍显冗长,但大致的思路就是假如有二补码版本linux下使用ninja编译,直接下载、解压、安装、验证,这样的步骤。

没有提供二补码版本的,可以尝试通过CentOS官方源来解决。假如官方源始终未能满足要求(比如Python3),也可以尝试自行通过源码编译的方法来解决。

启用局域网共享

之所以要打开局域网共享,还是由于目前的开发环境还不健全。RISC-V构架的编译器只提供了Linux版,这就决定了编译必须在Linux环境中。

而Hi3861的芯片烧写程序,只提供了Windows版(有时间我们可以谈谈鸿蒙LiteOS开发环境Deveco的烧写原理)。

但是大多数从事单片机开发的工程师(或则说单片机厂商提供的开发环境,比如烧写驱动、烧录工具)还都是以Windows平台为主。

我们希望编译完后直接能领到二补码文件进行烧写,所以想到了这样一种变通方法。

①安装samba

samba合同即Windows中的网上邻居所使用的合同。在CentOS的最小安装环境下须要单独安装。

yum install -y samba

容许开机启动,这样在编译服务器掉电恢复后能手动启动局域网共享:

systemctl enable smb

②配置samba服务前的一些打算工作

我们先创建一个用于文件共享的帐号,由于后续好多的操作都是基于这个帐号的。

假定这个帐号名为:harmony

useradd -r -s /bin/false harmony

使用useradd创建一个“三无帐户”,即:没有home目录,没有密码,没有系统Shell。

虽然我们只是希望有个专用身分而已。此后,要在samba系统中添加刚才创建的帐户,但是设置samba专用密码。

此处示例设置密码为:harmony。即用户名密码均为:harmony。其实也可以按照自己喜好设置。

smbpasswd -a harmony

帐号初始化以后,就可以创建一个专门用于储存共享代码的目录了:

mkdir /data

BTW:虽然愈发稳当的操作是在安装系统时单独分一个/data挂载点分区,这样一旦系统发生故障,哪怕重装系统,我们的代码也不会遗失。

由于创建该目录的用户是root,所以samba用户还不能对这个目录进行写入操作,要更改目录所有者:

chown -R harmony:harmony /data

③配置samba服务

接出来就是最关键的配置samba服务环节了。原本希望配置一个不须要用户名密码即可上传、下载的共享目录。但后来查阅资料,发觉Windows10默认情况下早已不容许这些方法了。

修改Windows安全策略来实现倒也不是不可以,只是以牺牲我们操作系统的安全性为代价不实惠,所以我们选择了在CentOS中创建一个Samba专用帐户,用它来登入。

首先将默认配置备份一下,之后假如配置错误,还可以回滚到初始状态:

cd /etc/samba
cp smb.conf smb.conf.bak

之后使用vi命令编辑smb.conf文件:

vi smb.conf

linux编译语句_linux下使用ninja编译_linux编译方法

下边的这段是我之前整理好的一套配置:

[global]
        netbios name = Compiler
        server string = RISC-V Compiler
        workgroup = WORKGROUP
        security = user
        map to guest = Bad User
        passdb backend = tdbsam
        log file = /var/log/samba/log.%m

[code]
        comment = Public Stuff
        path = /data
        valid users = harmony
        browseable = yes
        writable = yes
        available = yes
        read only = no
        create mode = 0644
        directory mode = 0755

这儿简单解释一下,[code]表示挂载点,假如你使用Windows,在地址栏输入\[IP]以后,出现的第一级目录,即挂载点。

validusers表示准许我们的harmony用户访问。由于要拥有写入权限,因而writable设置为yes,readonly设置为no。

新建文件的默认权限为644,即:rw-r--r--;新建目录的默认权限为755,即:drwxr-xr-x,必须拥有执行权限,否则新建完的目录删不掉。

④开启SELinux的安全选项

在CentOS中,默认开启了SELinux,此功能是构建在系统内核的一套安全机制,对于samba服务,默认是不容许用户向服务器写入内容的。

既然我们有这个需求,那就将此功能启用:

setsebool -P samba_export_all_rw 1

另附:查看SELinux中关于samba服务配置的选项状态:

sestatus -b | grep samba

⑤别忘了防火墙

在CentOS中,防火墙默认开启,samba服务相关的端口不在防火墙策略中,此时即使开启服务,外部也难以访问,因而须要将端口加入到防火墙容许策略中:

firewall-cmd --zone=public --add-port=139/tcp --permanent
firewall-cmd --zone=public --add-port=389/tcp --permanent
firewall-cmd --zone=public --add-port=445/tcp --permanent
firewall-cmd --zone=public --add-port=901/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all

其实,最简单的还是禁用防火墙,而且会带来安全隐患,请酌情使用。

systemctl stop firewalld
systemctl disable firewalld

⑥启动共享服务

一切配置好后,就可以启动共享服务了:

systemctl start smb

也可以查看服务的运行状态:

systemctl status smb

在Windows中,地址栏输入\[IP]地址,即可看见之前共享的目录内容。

⑦额外补充

假如后续使用中linux文件系统,samba用户密码更改,或则用户名修改。这么在Windows下,先前才能正常访问也有可能显得不能访问了。

这时我们在控制面板中搜索“凭据”,在“凭据管理器”->“Windows凭据”中删掉之前老的登陆帐号即可。假如登陆时没有勾选过记住凭据,可以在Windows的命令行中使用:

net use * /del

来消除联接缓存。

参考资料:

扫码关注HarmonyOS技术社区

专注开源技术,共建鸿蒙生态

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复