编译LEDE

本文最后更新于:2022年10月26日 凌晨

记录在ubuntu,wsl,github actions上编译LEDE的经历

1ubutut方式

该方式基本安装readme照着做即可,没啥奇怪问题。

1.1 安装环境

使用的是ubuntu 20.04 LTS,64位系统。

  • 执行下面命令以安装环境
    1
    2
    3
    sudo apt-get update

    sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf wget curl swig rsync
  • 克隆源码
    1
    git clone https://github.com/coolsnowwolf/lede

1.2 格外配置

1.2.1 添加科学上网

打开lede\feeds.conf.default文件,添加

1
2
src-git helloworld https://github.com/fw876/helloworld
src-git small https://github.com/kenzok8/small

1.2.2 其他软件源

1
sed -i '$a src-git NueXini_Packages https://github.com/NueXini/NueXini_Packages.git' feeds.conf.default

1.2.3 修改登录IP

实体文件在lede\package\base-files\files\bin\config_generate在150行

1
lan) ipad=${ipaddr:-"192.168.1.1"} ;;

1.3 更新软件包

1
2
./scripts/feeds update -a
./scripts/feeds install -a

第一次install的时候会有一些警告,第二次执行就没了。

1.4 配置

1
make menuconfig

可以参考这里
如果是编译R2S固件,前三项设置为:Rockchip、默认、R2S。
退出保存文件就在根目录,名为.config
也可以通过下列命令生成默认配置

1
make defconfig

1.5 下载支持库

这里需要翻墙了,这里容易出现下载不完整导致之后编译错误,注意以下dl文件夹里面文件的大小

1
make -j8 download

1.6 编译

首次编译用单线程,主机是1.8GHz双核,下午2点开始,第二天上班发现编译完成。

1
make -j1 V=s

2 wsl方式

** 该方式未能成功编译,但是仍然记录下来,之后找到问题再进行需改 **

2.1 设置区分大小写

首先建立个文件夹openwrt,然后设置为区分大小写,不然之后会报错,没权限就用管理员运行cmd

1
fsutil.exe file setCaseSensitiveInfo openwrt enable

结果:

1
Case sensitive attribute on directory D:\code\ggggg\openwrt is enabled.

2.2 安装环境

然后进入wsl,执行下列命令

1
2
3
4
5

sudo apt update -y
sudo apt full-upgrade -y

sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential bzip2 ccache cmake cpio curl device-tree-compiler ecj fastjar flex gawk gettext git git-core gperf haveged help2man intltool lib32gcc1 libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev libncurses5-dev libreadline-dev libssl-dev libtool libz-dev lrzsz mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip python3-ply python-docutils qemu-utils re2c rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev

2.3 解决空格问题

文件名是不能有空格的,需要解决空格问题,参考
依次输入

1
2
3
4
5
sudo tee -a /etc/wsl.conf << EOF > /dev/null
[interop]
appendWindowsPath = false
EOF
exit

重启WSL

1
wsl --shutdown

2.4 下载源码

克隆源码到openwrt文件夹,wsl没git就在外面克隆一样

1
git clone https://github.com/coolsnowwolf/lede

2.5 文件夹权限

处理方式来源
在/etc/wsl.conf中添加内容

1
2
3
4
5
6
[automount] 
options = "metadata,umask=22,fmask=111"
mountFsTab = true

[filesystem]
umask = 022

编辑/etc/fstab,添加:

1
C:\ /mnt/c drvfs rw,noatime,uid=1000,gid=1000,metadata,umask=22,fmask=11 0 0

之后重启。

这里补充下,可能需要进行的修改:

  • 如果在克隆仓库后发现所以文件都被标为了modified,那可能是权限和换行符发生了变化。
    来源

在WSL中执行

1
2
git config --global core.filemode false
git config --global core.autocrlf input

2.6 额外配置

在lede\feeds.conf.default里末尾添加科学上网

1
src-git helloworld https://github.com/fw876/helloworld

或者

1
2
git clone https://github.com/kenzok8/openwrt-packages.git
src-git small https://github.com/kenzok8/small

下面这个命令也是添加一个额外的软件源,可选

1
sed -i '$a src-git NueXini_Packages https://github.com/NueXini/NueXini_Packages.git' feeds.conf.default

修改登录IP
lede\package\base-files\files\bin\config_generate
在150行。

1
lan) ipad=${ipaddr:-"192.168.1.1"} ;;

2.7 安装更新软件包

在wsl中执行

1
2
./scripts/feeds update -a
./scripts/feeds install -a

配置,可以参考这里,我这里编译的是R2S,所以前三项配置是:Rockchip、默认、R2S。

2.8 配置

1
make menuconfig

如果之前由自己的配置,则直接覆盖。测试阶段仅选择编译平台(rockchip/RK33xx/FriendlyARM NanoPi R2S),其他默认。

2.9 下载dl库

这里需要翻墙,并且容易下载不完整,可以删除不完整文件后反复下载。

1
make -j8 download V=s

2.10 编译

最后是编译了,由于上面修改了空格问题,可以直接

1
make -j1 V=s

否则要使用

1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin make -j1 V=s 

然后就报错了,日志如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Initializing Automake:
checking for a BSD-compatible install... /mnt/d/code/ggggg/openwrt/lede/staging_dir/host/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... cat: -: No such file or directory
no
checking whether make supports nested variables... yes
cat: -: No such file or directory
cat: -: No such file or directory
checking whether ln -s works... yes
checking whether make supports the include directive... cat: -: No such file or directory
no
checking for x86_64-pc-linux-gnu-gcc... gcc
cat: -: No such file or directory
checking whether the C compiler works... no
configure: error: in `/mnt/d/code/ggggg/openwrt/lede/build_dir/host/xz-5.2.5':
configure: error: C compiler cannot create executables
See `config.log' for more details
make[3]: *** [Makefile:37: /mnt/d/code/ggggg/openwrt/lede/build_dir/host/xz-5.2.5/.configured] Error 77
make[3]: Leaving directory '/mnt/d/code/ggggg/openwrt/lede/tools/xz'
time: tools/xz/compile#0.50#0.07#1.89
ERROR: tools/xz failed to build.
make[2]: *** [tools/Makefile:159: tools/xz/compile] Error 1
make[2]: Leaving directory '/mnt/d/code/ggggg/openwrt/lede'
make[1]: *** [tools/Makefile:155: /mnt/d/code/ggggg/openwrt/lede/staging_dir/host/stamp/.tools_compile_yyynyynnyyyynyyyyyynyynnyyynyyyyyyyyyyyyyyyyynynnyyyyyyyyyy] Error 2
make[1]: Leaving directory '/mnt/d/code/ggggg/openwrt/lede'
make: *** [/mnt/d/code/ggggg/openwrt/lede/include/toplevel.mk:230: world] Error 2

2.11 删除相关

挑错阶段需要反复删除一些东西,我特么觉得全部删了,重新克隆更可靠,当还是列出下列命令。

清除旧编译中间文件

1
make clean

清除编译目录,在更换架构前执行

1
make dirclean

git回滚到拉取的初始状态

1
git clean -xdf

删除menuconfig产生的临时文件,如果修改了软件包需要执行

1
rm -rf tmp

3 Github Action方式

3.1快速使用

  • 方式来源于P3TERX,使用的是lean的源码

  • 点击 Use this template 建立一个用于编译的工程,里面的文件是一些配置参数。

  • 在根目录创建一个.config,将本地选择好的配置选项复制进去。就是本地编译的时候make menuconfig生成在根目录的那个文件啦。

  • 点击Actions,然后左侧点击build Openwrt,之后右边点击run workflow,便开始编译了。

  • 花了三个半小时,还是比我那个mini-PC快不少- -|

  • 在build openwrt页面里的Artifacts栏下载编译好的压缩包,解压后得到实际固件

  • 烧入SD卡,启动R2S,插入网线,输入192.168.1.1,密码password登入,OK搞定

3.2自定义配置

3.2.1自定义环境变量与功能

.github/workflows/build-openwrt.yml

1
2
3
4
5
6
7
8
9
10
11
env: REPO_URL: https://github.com/coolsnowwolf/lede 
REPO_BRANCH: master
FEEDS_CONF: feeds.conf.default
CONFIG_FILE: .config
DIY_P1_SH: diy-part1.sh
DIY_P2_SH: diy-part2.sh
UPLOAD_BIN_DIR: false
UPLOAD_FIRMWARE: true
UPLOAD_COWTRANSFER: false
UPLOAD_WETRANSFER: false
UPLOAD_RELEASE: false TZ: Asia/Shanghai
环境变量 功能
REPO_URL 源码仓库地址
REPO_BRANCH 源码分支
FEEDS_CONF 自定义feeds.conf.default文件名
CONFIG_FILE 自定义.config文件名
DIY_P1_SH 自定义diy-part1.sh文件名
DIY_P2_SH 自定义diy-part2.sh文件名
UPLOAD_BIN_DIR 上传 bin 目录。即包含所有 ipk 文件和固件的目录。默认false
UPLOAD_FIRMWARE 上传固件目录。默认true
UPLOAD_COWTRANSFER 上传固件到奶牛快传。默认false
UPLOAD_WERANSFER 上传固件到 WeTransfer 。默认false
UPLOAD_RELEASE 上传固件到 releases 。默认falseTZ时区设置

3.2.2DIY脚本

在根目录下的diy-part1.sh,会在下列命令前执行

1
./scripts/feeds update -a

通过修改此文件可以实现增加软件包源,例如在里面添加命令

1
echo 'src-git helloworld https://github.com/fw876/helloworld' >>feeds.conf.default

而diy-part2.sh则是在install后执行,可以进行一个系统配置,例如修改登录IP

1
sed -i 's/192.168.1.1/192.168.50.5/g' package/base-files/files/bin/config_generate

3.2.3自定义feeds配置

在上面快速使用中,仅增加了config文件,而feeds.conf.default文件是使用了默认的,如果有意修改,则扔到根目录即可

3.2.4源码更新自动进行编译。

对自己github头像点设置,然后选择子项Developer settings->Personal access tokens
右边点击,Generate new token。
页面中勾选repo,下方点击创建token,时候会生成key,先复制保存下来。
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

  • 之后在自己仓库的settings选项中,点击Secrets,创建一个新的secret,名称填入ACTIONS_TRIGGER_PAT,值填入上面生成的key。

  • 在Actions页面选择Update Checker,点击Run workflow手动进行一次测试运行。如果没有报错且 OpenWrt 编译工作流程被触发,则代表测试通过

  • 最后编辑Update Checker的 workflow 文件(.github/workflows/update-checker.yml),取消注释(删除#)定时触发相关的部分。这里可以根据 cron 格式来设定检测的时间,时区为 UTC 。

1
2
# schedule: 
# - cron: 0 */18 * * *

编译LEDE
https://blog.kala.love/posts/705822da/
作者
Lissettecarlr
发布于
2021年10月16日
许可协议