(二)OpenMptcpRouter - 镜像构建

1. 参考资料

2. 编译环境

  • Ubuntu 20.04,需要梯子,编译过程中会下载大量依赖的包
  • 安装依赖
    sudo apt-get install -y subversion \
      g++ \
      zlib1g-dev \
      build-essential \
      git \
      python \
      python3 \
      python3-distutils \
      libncurses5-dev \
      gawk \
      gettext \
      unzip \
      file \
      libssl-dev \
      wget \
      libelf-dev \
      ecj \
      fastjar \
      java-propose-classpath \
      uuid-dev \
      libell-dev
    

3. 构建树莓派RPI4镜像

3.1 选择使用6.16.12内核

  • 我使用6.16.12内核均构建成功,下面将在构建6.16.12内核遇到的问题进行汇总
  • 开始构建
    # 6.1内核
    OMR_TARGET="rpi4" OMR_FEED_SRC="master" OMR_KERNEL="6.1" ./build.sh -j1 V=s
    
    # 6.12内核
    OMR_TARGET="rpi4" OMR_FEED_SRC="master" OMR_KERNEL="6.12" ./build.sh -j1 V=s
    

3.2 解决 zstd 报错

  • 编译 zstd 报错

  • 错误原因:zstd 的补丁patch有问题

  • 解决方法:替换一下这个patch

  • 打开这个链接:https://git.infobricfleet.com/gtu/openwrt/-/tree/v24.10.0-rc1/tools/zstd,替换掉源码中的source/tools/zstd目录

  • 然后进入到 rpi4/6.12/source目录,直接执行 make; 注意:不要再执行build.sh脚本,否则修改过的文件又会被恢复

  • 首次构建时最好使用单线程,并输出详细的构建过程

    $ cd rpi4/6.12/source
    $ make -j1 V=s
    

3.3 解决 clangllvm 版本报错

  • 糟糕,忘了截图了
  • 错误原因:Ubuntu 20.04上使用的clangllvm版本为V10,需要更新到V12
  • 安装clang-12llvm-12
    $ sudo apt install -y clang-12 llvm-12
    
  • 更新后,发现实际使用的仍是旧版本,需要重建相关软链接,将其链接到更新后的 clang-12llvm-12
    # 由于/usr/bin/clang仍然链接到clang-10,需要重建软链接,将其链接到clang-12 和 llvm-12
    $ sudo rm /usr/bin/clang
    $ sudo ln -s /usr/bin/clang-12 /usr/bin/clang
    
    # 重建clang++软链接,将其链接到clang++-12
    $ sudo rm /usr/bin/clang++
    $ sudo ln -s /usr/bin/clang++-12 /usr/bin/clang++
    
    # 重建LLVM 的opt软链接,将其链接到opt-12
    $ sudo rm /usr/bin/opt
    $ sudo ln -s /usr/bin/opt-12 /usr/bin/opt
    
    # 重建llvm-dis软链接,将其链接到llvm-dis-12
    $ sudo rm /usr/bin/llvm-dis
    $ sudo ln -s /usr/bin/llvm-dis-12 /usr/bin/llvm-dis
    
    # 重建llvm-config软链接,将其链接到llvm-config-12
    $ sudo rm /usr/bin/llvm-config
    $ sudo ln -s /usr/bin/llvm-config-12 /usr/bin/llvm-config
    
    # 再次检查clang版本
    $ clang --version
    Ubuntu clang version 12.0.0-3ubuntu1~20.04.5
    Target: x86_64-pc-linux-gnu
    Thread model: posix
    InstalledDir: /usr/bin
    
    # 再次检查llvm版本
    $ llvm-config --version
    12.0.0
    
  • 重新执行 make
    rpi4/6.12/source$ make -j1 V=s
    

3.4 解决 util-linux 报错

  • 编译 util-linux 报错

  • 错误原因:源码中缺少 util-linux 这个 package

  • 解决方法:从openwrt源码中拷贝这个包

  • 打开这个连接:https://git.infobricfleet.com/gtu/openwrt/-/tree/master/tools/util-linux,将整个目录都拷贝到source/tools目录下

  • 重新执行 make

    rpi4/6.12/source$ make -j1 V=s
    

3.5 解决编译 mptcpd 报错

  • 编译 mptcpd 报错

  • 错误原因: 包含的头文件不对, 如下图,只有在当前平台不支持 MPTCP 路径管理的 netlink API 时,才会包含头文件 linux/mptcp_upstream.h,实际使用的头文件是 mptcp.h,而 mptcp.h 中又缺少两个枚举类型的声明,需要修改 mptcp.h

  • 修改 staging_dir/toolchain-x86_64_gcc-12.3.0_musl/include/linux/mptcp.h文件,添加如下两行代码

3.6 解决编译 dnsmasq 报错

  • 编译 dnsmasq 报错
  • package/network/services/dnsmasq/patches/999-remove-nftset-logs.patch 这个文件中的内容全部删除即可,这个patch就是注释了一行日志,无伤大雅

3.6 编译产生的 img 文件

  • 编译产生的img文件存储在build_dir目录下
    $ find . -name "*img.gz"
    

4. 树莓派CM4启用串口

  • 将编译好的镜像烧录到树莓派后,默认情况下串口是无法使用的,需要修改系统配置以启用串口

  • 将只读文件系统修改为可读可写

    # mount -o remount,rw /
    
  • 修改/etc/inittab,在其中添加下面这行

    ttyAMA0::askfirst:/usr/libexec/login.sh
    
  • 重启即可

    reboot
    

5. 聚合路由器相关设置

  • 聚合路由器设置界面

  • MPTCP设置界面

6. 构建脚本build.sh详解

  • 通过分析修改build.sh脚本,可以了解或实现如下功能:

    • 了解为什么每次对源码进行修改后,不能重新执行build.sh脚本
    • 修改默认的FEED软件源,将其替换为国内源可大大提升下载速度
    • 可以只获取源码,不进行编译
    • 可以定制进入系统的banner信息
    • 可以设置系统运行时的软件源
    • 可以不清理编译产物,加快二次编译速度
    • 可以修改.config文件,启用或关闭某些内核模块
    • ...
  • 为了便于分析,我删除了此脚本中的部分无关内容

#!/bin/sh
#
# Copyright (C) 2017 OVH OverTheBox
# Copyright (C) 2017-2024 Ycarus (Yannick Chabanois) <ycarus@zugaina.org> for OpenMPTCProuter project
#
# This is free software, licensed under the GNU General Public License v3.
# See /LICENSE for more information.
#

set -e

# 设置创建文件时的默认权限掩码,文件所有者拥有全部权限,其他用户和组用户拥有读和执行权限
umask 0022
# 取消设置grep和sed相关的环境变量,确保此这两个命令在任何环境下都能够正常工作
unset GREP_OPTIONS SED

_get_repo() (
	mkdir -p "$1"
	cd "$1"

	# 初始化git仓库
	[ -d .git ] || git init

	# 添加远程仓库
	if git remote get-url origin >/dev/null 2>/dev/null; then
		git remote set-url origin "$2"
	else
		git remote add origin "$2"
	fi

	# 拉取远程仓库
	git fetch origin -f
	git fetch origin --tags -f

	# 检出指定分支/tag
	git checkout -f "origin/$3" -B "build" 2>/dev/null || git checkout -f "$3" -B "build"
)

# 设置环境变量的默认值
OMR_DIST=${OMR_DIST:-openmptcprouter}				# OMR发行版名称
OMR_HOST=${OMR_HOST:-$(curl -sS ifconfig.co)}		# 获取当前主机的公网IP
OMR_PORT=${OMR_PORT:-80}							# 用于访问OpenMPTCProuter的端口号						
OMR_KEEPBIN=${OMR_KEEPBIN:-no}						# 是否使用之前已经编译生成的二进制文件,设置为yes可避免重复编译,加快构建速度
OMR_IMG=${OMR_IMG:-yes}								# 是否生成固件镜像文件
OMR_LOG=${OMR_LOG:-no}								# 是否启用编译日志
#OMR_UEFI=${OMR_UEFI:-yes}
OMR_PACKAGES=${OMR_PACKAGES:-full}					# 要安装的软件包列表
OMR_ALL_PACKAGES=${OMR_ALL_PACKAGES:-no}			# 是否编译所有可用的软件包
OMR_TARGET=${OMR_TARGET:-x86_64}					# 目标平台
OMR_TARGET_CONFIG="config-$OMR_TARGET"				# 目标平台的配置文件
UPSTREAM=${UPSTREAM:-no}							# 是否使用原始OpenWrt的上有代码而不是修改过的版本
#SYSLOG=${SYSLOG:-busybox-syslogd}
#SYSLOG=${SYSLOG:-syslog-ng}
SYSLOG=${SYSLOG:-logd}								# 系统日志服务,默认使用logd-OpenWrt的轻量级系统日志守护进程
OMR_KERNEL=${OMR_KERNEL:-5.4}						# 使用的内核版本
SHORTCUT_FE=${SHORTCUT_FE:-no}						# 是否启用快速转发,可以提高路由性能
DISABLE_FAILSAFE=${DISABLE_FAILSAFE:-no}			# 是否禁用故障安全模式
#OMR_RELEASE=${OMR_RELEASE:-$(git describe --tags `git rev-list --tags --max-count=1` | sed 's/^\([0-9.]*\).*/\1/')}
#OMR_RELEASE=${OMR_RELEASE:-$(git tag --sort=committerdate | tail -1)}
OMR_RELEASE=${OMR_RELEASE:-$(git describe --tags `git rev-list --tags --max-count=1` | tail -1)}	# 设置发布版本号
OMR_REPO=${OMR_REPO:-http://$OMR_HOST:$OMR_PORT/release/$OMR_RELEASE-$OMR_KERNEL/$OMR_TARGET}		# 设置软件源仓库的URL

OMR_FEED_URL="${OMR_FEED_URL:-https://github.com/ysurac/openmptcprouter-feeds}"	# FEED软件源URL
OMR_FEED_SRC="${OMR_FEED_SRC:-develop}"											# 使用FEED软件源的develop分支

CUSTOM_FEED_URL="${CUSTOM_FEED_URL}"						# 用户自定义的FEED软件源URL
CUSTOM_FEED_URL_BRANCH="${CUSTOM_FEED_URL_BRANCH:-main}"	# 用户自定义的FEED软件源的分支

OMR_OPENWRT=${OMR_OPENWRT:-default}							# 设置要使用的OpenWrt版本/分支
OMR_OPENWRT_GIT=${OMR_OPENWRT_GIT:-https://github.com}		# OpenWrt仓库的基础URL
OMR_FORCE_DSA=${OMR_FORCE_DSA:-0}	# 是否强制使用DSA(Disributed Switch Architercture),一个管理网络交换机的内核框架

# RUTX12 TELTONIKA Networks公司生产的一系列工业级4G/5G路由器
if [ "$OMR_KERNEL" = "5.4" ] && [ "$OMR_TARGET" = "rutx12" ]; then
	OMR_TARGET_CONFIG="config-rutx"
fi

# 不支持的平台
if [ ! -f "$OMR_TARGET_CONFIG" ]; then
	echo "Target $OMR_TARGET not found !"
	#exit 1
fi

# 根据不同的目标设备,设置相应的实际目标架构
if [ "$OMR_TARGET" = "rpi4" ]; then
	OMR_REAL_TARGET="aarch64_cortex-a72"
elif [ "$OMR_TARGET" = "wrt3200acm" ] || [ "$OMR_TARGET" = "wrt32x" ]; then
	OMR_REAL_TARGET="arm_cortex-a9_vfpv3-d16"
elif [ "$OMR_TARGET" = "rpi2" ] || [ "$OMR_TARGET" = "bpi-r1" ] || [ "$OMR_TARGET" = "bpi-r2" ] || [ "$OMR_TARGET" = "rutx" ] || [ "$OMR_TARGET" = "rutx12" ] || [ "$OMR_TARGET" = "rutx50" ] || [ "$OMR_TARGET" = "p2w_r619ac" ]; then
	OMR_REAL_TARGET="arm_cortex-a7_neon-vfpv4"
elif [ "$OMR_TARGET" = "rpi3" ] || [ "$OMR_TARGET" = "bpi-r3" ] || [ "$OMR_TARGET" = "bpi-r3-mini" ] || [ "$OMR_TARGET" = "bpi-r4" ] || [ "$OMR_TARGET" = "bpi-r4-poe" ] || [ "$OMR_TARGET" = "bpi-r64" ] || [ "$OMR_TARGET" = "espressobin" ] || [ "$OMR_TARGET" = "z8102ax_128m" ] || [ "$OMR_TARGET" = "z8102ax_64m" ] || [ "$OMR_TARGET" = "z8109ax_128m" ] || [ "$OMR_TARGET" = "bpi-r4" ] || [ "$OMR_TARGET" = "bpi-r4-poe" ] || [ "$OMR_TARGET" = "bpi-r3" ] || [ "$OMR_TARGET" = "bpi-r3-mini" ] || [ "$OMR_TARGET" = "espressobin" ] || [ "$OMR_TARGET" = "gl-mt2500" ] || [ "$OMR_TARGET" = "gl-mt6000" ]; then
	OMR_REAL_TARGET="aarch64_cortex-a53"
elif [ "$OMR_TARGET" = "x86" ]; then
	OMR_REAL_TARGET="i386_pentium4"
elif [ "$OMR_TARGET" = "x86_64" ]; then
	OMR_REAL_TARGET="x86_64"
elif [ "$OMR_TARGET" = "r2s" ] || [ "$OMR_TARGET" = "r4s" ] || [ "$OMR_TARGET" = "r5s" ] || [ "$OMR_TARGET" = "armsr64" ]; then
	OMR_REAL_TARGET="aarch64_generic"
elif [ "$OMR_TARGET" = "ubnt-erx" ]; then
	OMR_REAL_TARGET="mipsel_24kc"
else
	OMR_REAL_TARGET=${OMR_TARGET}
fi

# 如果ONLY_PREPARE设置为yes,则只进行准备工作,不克隆代码,不进行编译
if [ "$ONLY_PREPARE" != "yes" ]; then
	#_get_repo source https://github.com/ysurac/openmptcprouter-source "master"

	# 获取openwrt源码/openwrt-package源码/luci源码/openwrt-routing源码
	# openwrt源码保存在/xx(平台)/xx(内核版本)/目录下, 其他源码都保存在feeds/x.xx/目录下
	if [ "$OMR_OPENWRT" = "default" ]; then
		if [ "$OMR_KERNEL" = "5.4" ]; then
			# Use OpenWrt 21.02 for 5.4 kernel
			_get_repo "$OMR_TARGET/${OMR_KERNEL}/source" ${OMR_OPENWRT_GIT}/openwrt/openwrt "170d9e447df0f52882a8b7a61bf940b062b2cacc"
			_get_repo feeds/${OMR_KERNEL}/packages ${OMR_OPENWRT_GIT}/openwrt/packages "b3a6bb839059546a52df00af3e1aa97dba75de22"
			_get_repo feeds/${OMR_KERNEL}/luci ${OMR_OPENWRT_GIT}/openwrt/luci "e4c46338b196e486a88b1a75b78e283708c82bc4"
		elif [ "$OMR_KERNEL" = "6.1" ]; then
			_get_repo "$OMR_TARGET/${OMR_KERNEL}/source" ${OMR_OPENWRT_GIT}/openwrt/openwrt "acf40c022e3d8949c7bb1f9c5212eb91512ae8a9"
			_get_repo feeds/${OMR_KERNEL}/packages ${OMR_OPENWRT_GIT}/openwrt/packages "3ee7b46610e9dbd8fd2bba87bd06024cd0d9c08f"
			_get_repo feeds/${OMR_KERNEL}/luci ${OMR_OPENWRT_GIT}/openwrt/luci "ddda66aa8caa5e929cf7a542a79e2c3ce69eb66c"
		elif [ "$OMR_KERNEL" = "6.6" ] || [ "$OMR_KERNEL" = "6.10" ] || [ "$OMR_KERNEL" = "6.11" ]; then
			# Use OpenWRT 24.10 for 6.6 kernel
			_get_repo "$OMR_TARGET/${OMR_KERNEL}/source" ${OMR_OPENWRT_GIT}/openwrt/openwrt "92e020b50f04535009c91aa708bdb7598f1d9d4a"
			_get_repo feeds/${OMR_KERNEL}/packages ${OMR_OPENWRT_GIT}/openwrt/packages "de69db6abd833d9826668ab21ec488439ce9523a"
			_get_repo feeds/${OMR_KERNEL}/luci ${OMR_OPENWRT_GIT}/openwrt/luci "4f7a183b26c2784c5f64937deec9cafa91d0295a"
			_get_repo feeds/${OMR_KERNEL}/routing ${OMR_OPENWRT_GIT}/openwrt/routing "e87b55c6a642947ad7e24cd5054a637df63d5dbe"
		elif [ "$OMR_KERNEL" = "6.12" ]; then
			_get_repo "$OMR_TARGET/${OMR_KERNEL}/source" ${OMR_OPENWRT_GIT}/openwrt/openwrt "f480fa60d3dd23ba753aaba3616799fc8fd1af46"
			_get_repo feeds/${OMR_KERNEL}/packages ${OMR_OPENWRT_GIT}/openwrt/packages "7c58cd667bb37fd6aec9b4fd625bd6962ec1ed0f"
			_get_repo feeds/${OMR_KERNEL}/luci ${OMR_OPENWRT_GIT}/openwrt/luci "b3d292bf3d9e8761b307f5496ef7ea5f05433bdd"
			_get_repo feeds/${OMR_KERNEL}/routing ${OMR_OPENWRT_GIT}/openwrt/routing "4a65e359c301d30b70e448e8c25c6edc9c909be5"
		fi
	elif [ "$OMR_OPENWRT" = "coolsnowwolfmix" ]; then
		_get_repo "$OMR_TARGET/${OMR_KERNEL}/source" ${OMR_OPENWRT_GIT}/coolsnowwolf/lede.git "master"
		_get_repo feeds/${OMR_KERNEL}/packages ${OMR_OPENWRT_GIT}/openwrt/packages "master"
		_get_repo feeds/${OMR_KERNEL}/luci ${OMR_OPENWRT_GIT}/openwrt/luci "master"
	elif [ "$OMR_OPENWRT" = "coolsnowwolf" ]; then
		_get_repo "$OMR_TARGET/${OMR_KERNEL}/source" ${OMR_OPENWRT_GIT}/coolsnowwolf/lede.git "master"
		_get_repo feeds/${OMR_KERNEL}/packages ${OMR_OPENWRT_GIT}/coolsnowwolf/packages "master"
		_get_repo feeds/${OMR_KERNEL}/luci ${OMR_OPENWRT_GIT}/coolsnowwolf/luci "master"
	elif [ "$OMR_OPENWRT" = "master" ]; then
		_get_repo "$OMR_TARGET/${OMR_KERNEL}/source" ${OMR_OPENWRT_GIT}/openwrt/openwrt "main"
		_get_repo feeds/${OMR_KERNEL}/packages ${OMR_OPENWRT_GIT}/openwrt/packages "main"
		_get_repo feeds/${OMR_KERNEL}/luci ${OMR_OPENWRT_GIT}/openwrt/luci "main"
		_get_repo feeds/${OMR_KERNEL}/luci ${OMR_OPENWRT_GIT}/openwrt/routing "main"
	else
		_get_repo "$OMR_TARGET/${OMR_KERNEL}/source" ${OMR_OPENWRT_GIT}/openwrt/openwrt "${OMR_OPENWRT}"
		_get_repo feeds/${OMR_KERNEL}/packages ${OMR_OPENWRT_GIT}/openwrt/packages "${OMR_OPENWRT}"
		_get_repo feeds/${OMR_KERNEL}/luci ${OMR_OPENWRT_GIT}/openwrt/luci "${OMR_OPENWRT}"
		_get_repo feeds/${OMR_KERNEL}/luci ${OMR_OPENWRT_GIT}/openwrt/routing "${OMR_OPENWRT}"
	fi
fi

# 获取OMR FEED软件源URL,保存在feeds/openmptcprouter目录下
if [ -z "$OMR_FEED" ]; then
	OMR_FEED=feeds/openmptcprouter
	[ "$ONLY_PREPARE" != "yes" ] && _get_repo "$OMR_FEED" "$OMR_FEED_URL" "$OMR_FEED_SRC"
fi

# 获取用户自定义的FEED软件源URL,保存在用户指定目录下
if [ -n "$CUSTOM_FEED_URL" ] && [ -z "$CUSTOM_FEED" ]; then
	CUSTOM_FEED=feeds/${OMR_KERNEL}/${OMR_DIST}
	[ "$ONLY_PREPARE" != "yes" ] && _get_repo "$CUSTOM_FEED" "$CUSTOM_FEED_URL" "$CUSTOM_FEED_URL_BRANCH"
fi

# 通过命令行参数来设置发行版,默认为openmptcprouter
if [ -n "$1" ] && [ -f "$OMR_FEED/$1/Makefile" ]; then
	OMR_DIST=$1
	shift 1
fi

# 是否保留之前已编译好的二进制文件,设置为yes可避免重复编译,加快构建速度
if [ "$OMR_KEEPBIN" = "no" ]; then 
	rm -rf "$OMR_TARGET/${OMR_KERNEL}/source/bin"
fi

# 只获取源码,不进行编译
if [ "$ONLY_GET_REPO" = "yes" ]; then
	exit 0
fi

# 清理编译环境中的临时文件
rm -rf "$OMR_TARGET/${OMR_KERNEL}/source/files" "$OMR_TARGET/${OMR_KERNEL}/source/tmp"

# 5.4内核,瑞芯微uboot
if [ "${OMR_KERNEL}" = "5.4" ]; then
	echo "rm -rf $OMR_TARGET/${OMR_KERNEL}/source/package/boot/uboot-rockchip"
	rm -rf "${OMR_TARGET}/${OMR_KERNEL}/source/package/boot/uboot-rockchip"
fi

#  MVEBU平台
echo "rm -rf $OMR_TARGET/${OMR_KERNEL}/source/package/boot/uboot-mvebu"
rm -rf "${OMR_TARGET}/${OMR_KERNEL}/source/package/boot/uboot-mvebu"

# ipq40xx平台
[ "${OMR_KERNEL}" = "6.1" ] || [ "${OMR_KERNEL}" = "6.6" ] || [ "${OMR_KERNEL}" = "6.10" ] || [ "${OMR_KERNEL}" = "6.11" ] || [ "${OMR_KERNEL}" = "6.12" ] && {
	echo "rm -rf $OMR_TARGET/${OMR_KERNEL}/source/package/boot/uboot-ipq40xx"
	rm -rf "${OMR_TARGET}/${OMR_KERNEL}/source/package/boot/uboot-ipq40xx"
}

# 博通平台,如树莓派CM4使用的就是bcm2711
[ "${OMR_KERNEL}" = "6.1" ] && {
	rm -rf "${OMR_TARGET}/${OMR_KERNEL}/source/target/linux/bcm27xx/patches-6.1"
}

# 5.4内核
[ "${OMR_KERNEL}" = "5.4" ] && rm -rf "$OMR_TARGET/${OMR_KERNEL}/source/tools/firmware-utils"

# RUTX平台,5.4内核
if ([ "$OMR_TARGET" = "rutx" ] || [ "$OMR_TARGET" = "rutx12" ]) && [ "${OMR_KERNEL}" = "5.4" ]; then
#	cp -rf root/* "$OMR_TARGET/${OMR_KERNEL}/source"
	cp -rf common/* "$OMR_TARGET/${OMR_KERNEL}/source/"
	cp -rf ${OMR_KERNEL}/* "$OMR_TARGET/${OMR_KERNEL}/source/"
else
	# There is many customization to support rutx and this seems to break other ipq40xx, so dirty workaround for now
#	[ -d "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/ipq40xx" ] && mv -f "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/ipq40xx" "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/ipq40xx.old"
#	cp -rf root/* "$OMR_TARGET/${OMR_KERNEL}/source"
	echo "cp -rf common/* $OMR_TARGET/${OMR_KERNEL}/source"
	cp -rf common/* "$OMR_TARGET/${OMR_KERNEL}/source"
	echo "cp -rf ${OMR_KERNEL}/* $OMR_TARGET/${OMR_KERNEL}/source"
	cp -rf ${OMR_KERNEL}/* "$OMR_TARGET/${OMR_KERNEL}/source"
#	rm -rf "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/ipq40xx"
#	mv -f "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/ipq40xx.old" "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/ipq40xx"
fi

# 将用户自定义FEED软件包拷贝到OpenWrt源码目录中
if [ -n "$CUSTOM_FEED" ] && [ -d ${CUSTOM_FEED}/source/${OMR_TARGET}/${OMR_KERNEL} ]; then
	echo "Copy ${CUSTOM_FEED}/source/${OMR_TARGET}/${OMR_KERNEL}/* to $OMR_TARGET/${OMR_KERNEL}/source"
	cp -rf ${CUSTOM_FEED}/source/${OMR_TARGET}/${OMR_KERNEL}/* "$OMR_TARGET/${OMR_KERNEL}/source"
fi

# 进入终端时的系统登录横幅,显示一下构建信息
cat >> "$OMR_TARGET/${OMR_KERNEL}/source/package/base-files/files/etc/banner" <<EOF
-----------------------------------------------------
 PACKAGE:     $OMR_DIST
 VERSION:     $OMR_RELEASE
 TARGET:      $OMR_TARGET
 ARCH:        $OMR_REAL_TARGET

 BUILD REPO:  $(git config --get remote.origin.url)
 BUILD DATE:  $(date -u)
-----------------------------------------------------
EOF

# 生成feeds.conf文件,这个文件定义了软件包源的位置
cat > "$OMR_TARGET/${OMR_KERNEL}/source/feeds.conf" <<EOF
src-link packages $(readlink -f feeds/${OMR_KERNEL}/packages)
src-link luci $(readlink -f feeds/${OMR_KERNEL}/luci)
src-link openmptcprouter $(readlink -f "$OMR_FEED")
EOF

# 用户自定义软件包源的位置
if [ -n "$CUSTOM_FEED" ]; then
	echo "src-link ${OMR_DIST} $(readlink -f ${CUSTOM_FEED})" >> "$OMR_TARGET/${OMR_KERNEL}/source/feeds.conf"
fi

# 固件运行时的各种软件包源
if [ "$OMR_KERNEL" != "6.12" ]; then
	if [ "$OMR_DIST" = "openmptcprouter" ]; then
		cat > "$OMR_TARGET/${OMR_KERNEL}/source/package/system/opkg/files/customfeeds.conf" <<-EOF
		src/gz openwrt_luci http://packages.openmptcprouter.com/${OMR_RELEASE}/${OMR_REAL_TARGET}/luci
		src/gz openwrt_packages http://packages.openmptcprouter.com/${OMR_RELEASE}/${OMR_REAL_TARGET}/packages
		src/gz openwrt_base http://packages.openmptcprouter.com/${OMR_RELEASE}/${OMR_REAL_TARGET}/base
		src/gz openwrt_routing http://packages.openmptcprouter.com/${OMR_RELEASE}/${OMR_REAL_TARGET}/routing
		src/gz openwrt_telephony http://packages.openmptcprouter.com/${OMR_RELEASE}/${OMR_REAL_TARGET}/telephony
		EOF
	elif [ -n "$OMR_PACKAGES_URL" ]; then
		cat > "$OMR_TARGET/${OMR_KERNEL}/source/package/system/opkg/files/customfeeds.conf" <<-EOF
		src/gz openwrt_luci ${OMR_PACKAGES_URL}/${OMR_RELEASE}/${OMR_REAL_TARGET}/luci
		src/gz openwrt_packages ${OMR_PACKAGES_URL}/${OMR_RELEASE}/${OMR_REAL_TARGET}/packages
		src/gz openwrt_base ${OMR_PACKAGES_URL}/${OMR_RELEASE}/${OMR_REAL_TARGET}/base
		src/gz openwrt_routing ${OMR_PACKAGES_URL}/${OMR_RELEASE}/${OMR_REAL_TARGET}/routing
		src/gz openwrt_telephony ${OMR_PACKAGES_URL}/${OMR_RELEASE}/${OMR_REAL_TARGET}/telephony
		EOF
	else
	#	cat > "$OMR_TARGET/${OMR_KERNEL}/source/package/system/opkg/files/customfeeds.conf" <<-EOF
	#	src/gz openwrt_luci http://downloads.openwrt.org/snapshots/packages/${OMR_REAL_TARGET}/luci
	#	src/gz openwrt_packages http://downloads.openwrt.org/snapshots/packages/${OMR_REAL_TARGET}/packages
	#	src/gz openwrt_base http://downloads.openwrt.org/snapshots/packages/${OMR_REAL_TARGET}/base
	#	src/gz openwrt_routing http://downloads.openwrt.org/snapshots/packages/${OMR_REAL_TARGET}/routing
	#	src/gz openwrt_telephony http://downloads.openwrt.org/snapshots/packages/${OMR_REAL_TARGET}/telephony
	#	EOF
		# Force use of opkg ipk packages
		cat > "$OMR_TARGET/${OMR_KERNEL}/source/package/system/opkg/files/customfeeds.conf" <<-EOF
		src/gz openwrt_luci http://downloads.openwrt.org/releases/packages-24.10/${OMR_REAL_TARGET}/luci
		src/gz openwrt_packages http://downloads.openwrt.org/releases/packages-24.10/${OMR_REAL_TARGET}/packages
		src/gz openwrt_base http://downloads.openwrt.org/releases/packages-24.10/${OMR_REAL_TARGET}/base
		src/gz openwrt_routing http://downloads.openwrt.org/releases/packages-24.10/${OMR_REAL_TARGET}/routing
		src/gz openwrt_telephony http://downloads.openwrt.org/releases/packages-24.10/${OMR_REAL_TARGET}/telephony
		EOF
	fi
else
	if [ "$OMR_DIST" = "openmptcprouter" ]; then
		cat > "$OMR_TARGET/${OMR_KERNEL}/source/package/system/apk/files/customfeeds.list" <<-EOF
		http://packages.openmptcprouter.com/${OMR_RELEASE}/${OMR_REAL_TARGET}/luci/packages.adb
		http://packages.openmptcprouter.com/${OMR_RELEASE}/${OMR_REAL_TARGET}/packages/packages.adb
		http://packages.openmptcprouter.com/${OMR_RELEASE}/${OMR_REAL_TARGET}/base/packages.adb
		http://packages.openmptcprouter.com/${OMR_RELEASE}/${OMR_REAL_TARGET}/routing/packages.adb
		http://packages.openmptcprouter.com/${OMR_RELEASE}/${OMR_REAL_TARGET}/telephony/packages.adb
		EOF
	elif [ -n "$OMR_PACKAGES_URL" ]; then
		cat > "$OMR_TARGET/${OMR_KERNEL}/source/package/system/apk/files/customfeeds.list" <<-EOF
		${OMR_PACKAGES_URL}/${OMR_RELEASE}/${OMR_REAL_TARGET}/luci/packages.adb
		${OMR_PACKAGES_URL}/${OMR_RELEASE}/${OMR_REAL_TARGET}/packages/packages.adb
		${OMR_PACKAGES_URL}/${OMR_RELEASE}/${OMR_REAL_TARGET}/base/packages.adb
		${OMR_PACKAGES_URL}/${OMR_RELEASE}/${OMR_REAL_TARGET}/routing/packages.adb
		${OMR_PACKAGES_URL}/${OMR_RELEASE}/${OMR_REAL_TARGET}/telephony/packages.adb
		EOF
	else
		cat > "$OMR_TARGET/${OMR_KERNEL}/source/package/system/apk/files/customfeeds.list" <<-EOF
		http://downloads.openwrt.org/snapshots/packages/${OMR_REAL_TARGET}/luci/packages.adb
		http://downloads.openwrt.org/snapshots/packages/${OMR_REAL_TARGET}/packages/packages.adb
		http://downloads.openwrt.org/snapshots/packages/${OMR_REAL_TARGET}/base/packages.adb
		http://downloads.openwrt.org/snapshots/packages/${OMR_REAL_TARGET}/routing/packages.adb
		http://downloads.openwrt.org/snapshots/packages/${OMR_REAL_TARGET}/telephony/packages.adb
		EOF
	fi

fi

# 生成.config文件
if [ -f $OMR_TARGET_CONFIG ]; then
	cat "$OMR_TARGET_CONFIG" config -> "$OMR_TARGET/${OMR_KERNEL}/source/.config" <<-EOF
	CONFIG_IMAGEOPT=y
	CONFIG_VERSIONOPT=y
	CONFIG_VERSION_DIST="$OMR_DIST"
	CONFIG_VERSION_REPO="$OMR_REPO"
	CONFIG_VERSION_NUMBER="${OMR_RELEASE}-${OMR_KERNEL}"
	EOF
else
	cat config -> "$OMR_TARGET/${OMR_KERNEL}/source/.config" <<-EOF
	CONFIG_IMAGEOPT=y
	CONFIG_VERSIONOPT=y
	CONFIG_VERSION_DIST="$OMR_DIST"
	CONFIG_VERSION_REPO="$OMR_REPO"
	CONFIG_VERSION_NUMBER="${OMR_RELEASE}-${OMR_FEED_SRC}-$(git -C "$OMR_FEED" rev-parse --short HEAD)"
	EOF
fi
#if [ "${OMR_KERNEL}" = "5.14" ]; then
#	echo 'CONFIG_KERNEL_GIT_CLONE_URI="https://github.com/multipath-tcp/mptcp_net-next.git"' >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
#	echo 'CONFIG_KERNEL_GIT_REF="78828adaef8fe9b69f9a8c4b60f74b01c5a31c7a"' >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
#fi

# 编译所有软件包
if [ "$OMR_ALL_PACKAGES" = "yes" ]; then
	echo 'CONFIG_ALL=y' >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	echo 'CONFIG_ALL_NONSHARED=y' >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
fi

# x86_64平台,添加对vdi、vmdk、vhdx虚拟机镜像格式的支持
if [ "$OMR_IMG" = "yes" ] && [ "$OMR_TARGET" = "x86_64" ]; then 
	echo 'CONFIG_VDI_IMAGES=y' >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"	# VirtualBox
	echo 'CONFIG_VMDK_IMAGES=y' >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"	# VMware
	echo 'CONFIG_VHDX_IMAGES=y' >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"	# Hyper-V
fi

# 构建日志
if [ "$OMR_LOG" = "yes" ]; then 
	echo 'CONFIG_BUILD_LOG=y' >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
fi

# 禁用安全启动
if [ "$DISABLE_FAILSAFE" = "yes" ]; then
	rm -f "$OMR_TARGET/${OMR_KERNEL}/source/package/base-files/files/lib/preinit/30_failsafe_wait"
	rm -f "$OMR_TARGET/${OMR_KERNEL}/source/package/base-files/files/lib/preinit/40_run_failsafe_hook"
fi

# 将发行版名称和软件包列表写入.config文件
echo "CONFIG_PACKAGE_${OMR_DIST}-${OMR_PACKAGES}=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"

# 系统日志
if [ "$SYSLOG" = "busybox-syslogd" ]; then
	echo "CONFIG_BUSYBOX_CONFIG_FEATURE_SYSLOG=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	echo "CONFIG_BUSYBOX_CONFIG_FEATURE_SYSLOGD_CFG=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	echo "CONFIG_BUSYBOX_CONFIG_FEATURE_SYSLOGD_PRECISE_TIMESTAMP=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	echo "CONFIG_BUSYBOX_CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	echo "CONFIG_BUSYBOX_CONFIG_FEATURE_REMOTE_LOG=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	echo "CONFIG_BUSYBOX_CONFIG_SYSLOGD=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	echo "CONFIG_BUSYBOX_CONFIG_LOGREAD=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	echo "CONFIG_PACKAGE_syslogd=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
elif [ "$SYSLOG" = "syslog-ng" ]; then
	echo "CONFIG_DEFAULT_syslog-ng=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	echo "CONFIG_PACKAGE_syslog-ng=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
elif [ "$SYSLOG" = "logd" ]; then
	echo "CONFIG_DEFAULT_logd=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	echo "CONFIG_PACKAGE_logd=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
fi

# 启用快速转发功能,提高路由器的数据包转发性能,适用于高吞吐量场景 
if [ "$SHORTCUT_FE" = "yes" ]; then
	echo "CONFIG_PACKAGE_kmod-fast-classifier=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	echo "CONFIG_PACKAGE_kmod-shortcut-fe=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	echo "CONFIG_PACKAGE_kmod-shortcut-fe-cm=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	echo "CONFIG_PACKAGE_shortcut-fe-drv=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
else
	echo "# CONFIG_PACKAGE_kmod-fast-classifier is not set" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	echo "# CONFIG_PACKAGE_kmod-shortcut-fe-cm is not set" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	echo "# CONFIG_PACKAGE_kmod-shortcut-fe is not set" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	echo "# CONFIG_PACKAGE_shortcut-fe is not set" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
fi

# Realtek网卡驱动支持 
if [ "$OMR_KERNEL" != "5.4" ] && [ "$OMR_TARGET" != "x86_64" ] && [ "$OMR_TARGET" != "x86" ]; then
	echo "# CONFIG_PACKAGE_kmod-r8125 is not set" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
#	echo "# CONFIG_PACKAGE_kmod-r8168 is not set" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	echo "CONFIG_PACKAGE_kmod-r8168=m" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
fi

# 禁用RTL8812AU驱动
if [ "$OMR_KERNEL" = "6.1" ] || [ "$OMR_KERNEL" = "6.6" ] || [ "$OMR_KERNEL" = "6.10" ] || [ "$OMR_KERNEL" = "6.11" ] || [ "$OMR_KERNEL" = "6.12" ]; then
	echo "# CONFIG_PACKAGE_kmod-rtl8812au-ct is not set" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
fi

# RUTX平台,启用R2EC模块
if ([ "$OMR_TARGET" = "rutx" ] || [ "$OMR_TARGET" = "rutx12" ]) && [ "$OMR_KERNEL" = "5.4" ]; then
	echo "CONFIG_PACKAGE_kmod-r2ec=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/.config"
fi

# bpi-r1,禁用midnight Commander软件包
if [ "$OMR_TARGET" = "bpi-r1" -a "$OMR_OPENWRT" = "master" ]; then
	# We disable mc in master, because it leads to unknown compilation errors on bpi-r1 target
	# No time to check this, now, cause i am focused on make this target work
	# Maybe someone can do this later	
	echo -n "Disabling error causing midnight commander (mc) package..."
	sed -i "s/CONFIG_PACKAGE_mc=y/# CONFIG_PACKAGE_mc is not set/" "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	sed -i "s/CONFIG_MC_EDITOR=y/# CONFIG_MC_EDITOR is not set/" "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	sed -i "s/CONFIG_MC_SUBSHELL=y/# CONFIG_MC_SUBSHELL is not set/" "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	sed -i "s/CONFIG_MC_CHARSET=y/# CONFIG_MC_CHARSET is not set/" "$OMR_TARGET/${OMR_KERNEL}/source/.config"
	sed -i "s/CONFIG_MC_VFS=y/# CONFIG_MC_VFS is not set/" "$OMR_TARGET/${OMR_KERNEL}/source/.config"	
	echo "done"
	# 2021-03-05 Oliver Welter <oliver@welter.rocks>
fi

# bpi-r1
if [ "$OMR_TARGET" = "bpi-r1" ]; then
	# Check kernel version
	if [ "$OMR_KERNEL" != "5.4" ]; then
		echo "Sorry, but for now kernel 5.4 is the only supported one."
		exit 1
	fi
	
	# Remove the 310-Revert-ARM-dts-sun7i-Add-BCM53125-switch-nodes-to-th patch
	echo -n "Removing unwanted patches from kernel $OMR_KERNEL..."
	rm -f "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/sunxi/patches-$OMR_KERNEL/310-Revert-ARM-dts-sun7i-Add-BCM53125-switch-nodes-to-th.patch" >/dev/null 2>&1
	echo "done"
	
	if [ "$OMR_FORCE_DSA" = "1" ]; then 
		# Remove support for swconfig
		echo -n "Removing swconfig support from openwrt config..."
		for i in DEFAULT_swconfig PACKAGE_swconfig PACKAGE_kmod-swconfig; do
			sed -i "s/CONFIG_${i}/# CONFIG_${i} is not set/" "$OMR_TARGET/${OMR_KERNEL}/source/.config"
		done
		echo "done"
		echo -n "Removing B53 swconfig support from kernel $OMR_KERNEL..."
		for i in SWCONFIG_B53 SWCONFIG_B53_PHY_DRIVER SWCONFIG_LEDS LED_TRIGGER_PHY SWCONFIG_B53_PHY_FIXUP SWCONFIG_B53_SPI_DRIVER SWCONFIG_B53_MMAP_DRIVER SWCONFIG_B53_SRAB_DRIVER; do
			sed -i "s/CONFIG_${i}/# CONFIG_${i} is not set/" "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/sunxi/config-${OMR_KERNEL}"
			sed -i "s/CONFIG_${i}/# CONFIG_${i} is not set/" "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/sunxi/cortexa7/config-${OMR_KERNEL}"
		done
		echo "done"

		# Add support for distributed switch architecture
		echo -n "Adding B53 DSA support to kernel ${OMR_KERNEL}..."		
		for i in B53 B53_MDIO_DRIVER BRIDGE_VLAN_FILTERING MDIO_BUS_MUX_MULTIPLEXER NET_DSA NET_DSA_TAG_8021Q NET_DSA_TAG_BRCM NET_DSA_TAG_BRCM_PREPEND; do
			check_sunxi_config=`grep "CONFIG_${i}=y" "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/sunxi/config-${OMR_KERNEL}" || true`
			check_cortexa7_config=`grep "CONFIG_${i}=y" "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/sunxi/cortexa7/config-${OMR_KERNEL}" || true`
			
			[ "$check_sunxi_config" = "" -a "$check_cortexa7_config" = "" ] && echo "CONFIG_${i}=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/sunxi/cortexa7/config-${OMR_KERNEL}"
		done
		echo "done"

		# Create DSA port map file (will be filled on first boot, by uci-defaults and tells the system, that it is in DSA mode)
		touch "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/sunxi/base-files/etc/dsa.map"
		
		# Remove the b53 hack in preinit
		rm -f "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/sunxi/base-files/lib/preinit/03_b53_hack.sh"
	else
		# Remove ip-bridge
		echo -n "Removing ip-bridge support from openwrt config..."
		for i in PACKAGE_ip-bridge; do
			sed -i "s/CONFIG_${i}/# CONFIG_${i} is not set/" "$OMR_TARGET/${OMR_KERNEL}/source/.config"
		done
		echo "done"

		# Remove swconfig parts
		echo -n "Removing unneeded B53 swconfig parts from kernel ${OMR_KERNEL}..."
		for i in SWCONFIG_B53_PHY_FIXUP SWCONFIG_B53_SPI_DRIVER SWCONFIG_B53_MMAP_DRIVER SWCONFIG_B53_SRAB_DRIVER; do
			sed -i "s/CONFIG_${i}/# CONFIG_${i} is not set/" "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/sunxi/config-${OMR_KERNEL}"
			sed -i "s/CONFIG_${i}/# CONFIG_${i} is not set/" "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/sunxi/cortexa7/config-${OMR_KERNEL}"
		done
		echo "done"
	fi
		
	# Add led support
	echo -n "Adding LED TRIGGER support to kernel ${OMR_KERNEL}..."
	if [ "$OMR_FORCE_DSA" != "1" ]; then
		for i in SWCONFIG_LEDS LED_TRIGGER_PHY; do
			check_sunxi_config=`grep "CONFIG_${i}=y" "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/sunxi/config-${OMR_KERNEL}" || true`
			check_cortexa7_config=`grep "CONFIG_${i}=y" "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/sunxi/cortexa7/config-${OMR_KERNEL}" || true`

			[ "$check_sunxi_config" = "" -a "$check_cortexa7_config" = "" ] && echo "CONFIG_${i}=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/sunxi/cortexa7/config-${OMR_KERNEL}"
		done
	fi
	for i in TIMER ONESHOT DISK MTD HEARTBEAT BACKLIGHT CPU ACTIVITY GPIO DEFAULT_ON TRANSIENT CAMERA PANIC NETDEV PATTERN AUDIO; do
		check_sunxi_config=`grep "CONFIG_LEDS_TRIGGER_${i}=y" "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/sunxi/config-${OMR_KERNEL}" || true`
		check_cortexa7_config=`grep "CONFIG_LEDS_TRIGGER_${i}=y" "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/sunxi/cortexa7/config-${OMR_KERNEL}" || true`

		[ "$check_sunxi_config" = "" -a "$check_cortexa7_config" = "" ] && echo "CONFIG_LEDS_TRIGGER_${i}=y" >> "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/sunxi/cortexa7/config-${OMR_KERNEL}"
	done
	echo "done"
fi

# 进入OpenWrt源码目录
cd "$OMR_TARGET/${OMR_KERNEL}/source"

# 不同的内核版本应用不同的nocheck补丁,用于修改OpenWrt的编译检查机制,禁用某些编译时的严格检查
if [ "$OMR_KERNEL" != "6.6" ] && [ "$OMR_KERNEL" != "6.10" ] && [ "$OMR_KERNEL" != "6.11" ] && [ "$OMR_KERNEL" != "6.12" ]; then
	echo "Checking if No check patch is set or not"
	if ! patch -Rf -N -p1 -s --dry-run < ../../../patches/nocheck.patch; then
		echo "apply..."
		patch -N -p1 -s < ../../../patches/nocheck.patch
	fi
	echo "Done"
else
	echo "Checking if No check patch is set or not"
	if ! patch -Rf -N -p1 -s --dry-run < ../../../patches/nocheck.6.6.patch; then
		echo "apply..."
		patch -N -p1 -s < ../../../patches/nocheck.6.6.patch
	fi
	echo "Done"
fi

# 应用Nanqinlang补丁,针对linux内核的性能优化补丁
echo "Checking if Nanqinlang patch is set or not"
if ! patch -Rf -N -p1 -s --dry-run < ../../../patches/nanqinlang.patch; then
	echo "apply..."
	patch -N -p1 -s < ../../../patches/nanqinlang.patch
fi
echo "Done"

# Meson补丁,针对Meson构建系统的修复补丁
echo "Checking if Meson patch is set or not"
if [ "$OMR_KERNEL" = "5.4" ] && ! patch -Rf -N -p1 -s --dry-run < ../../../patches/meson.patch; then
	patch -N -p1 -s < ../../../patches/meson.patch
fi
echo "Done"

#echo "Checking if remove_abi patch is set or not"
#if ! patch -Rf -N -p1 -s --dry-run < ../../../patches/remove_abi.patch; then
#	echo "apply..."
#	patch -N -p1 -s < ../../../patches/remove_abi.patch
#fi
#echo "Done"

# Add BBR2 patch, only working on 64bits images for now
# BBR3 tcp拥塞控制算法
if ([ "$OMR_KERNEL" = "5.4" ] || [ "$OMR_KERNEL" = "5.4" ]) && ([ "$OMR_TARGET" = "x86_64" ] || [ "$OMR_TARGET" = "bpi-r64" ] || [ "$OMR_TARGET" = "rpi4" ] || [ "$OMR_TARGET" = "espressobin" ] || [ "$OMR_TARGET" = "r2s" ] || [ "$OMR_TARGET" = "r4s" ] || [ "$OMR_TARGET" = "rpi3" ]); then
	echo "Checking if BBRv2 patch is set or not"
	if ! patch -Rf -N -p1 -s --dry-run < ../../../patches/bbr2.patch; then
		echo "apply..."
		patch -N -p1 -s < ../../../patches/bbr2.patch
	fi
	echo "Done"
fi

# smsc75xx补丁
echo "Checking if smsc75xx patch is set or not"
if ! patch -Rf -N -p1 -s --dry-run < ../../../patches/smsc75xx.patch; then
	echo "apply..."
	patch -N -p1 -s < ../../../patches/smsc75xx.patch
fi
echo "Done"

#echo "Checking if ipt-nat patch is set or not"
#if ! patch -Rf -N -p1 -s --dry-run < ../../../patches/ipt-nat6.patch; then
#	echo "apply..."
#	patch -N -p1 -s < ../../../patches/ipt-nat6.patch
#fi
#echo "Done"

#echo "Checking if mvebu patch is set or not"
#if [ ! -d target/linux/mvebu/patches-5.4 ]; then
#	echo "apply..."
#	patch -N -p1 -s < ../../../patches/mvebu-5.14.patch
#fi
#echo "Done"

#echo "Checking if opkg install arguement too long patch is set or not"
#if ! patch -Rf -N -p1 -s --dry-run < ../../../patches/package-too-long.patch; then
#	echo "apply..."
#	patch -N -p1 -s < ../../../patches/package-too-long.patch
#fi
#echo "Done"

#echo "Download via IPv4"
#if ! patch -Rf -N -p1 -s --dry-run < ../../../patches/download-ipv4.patch; then
#	patch -N -p1 -s < ../../../patches/download-ipv4.patch
#fi
#echo "Done"

#echo "Remove check rsync"
#if [ "$(grep rsync include/prereq-build.mk)" != "" ]; then
#	patch -N -p1 -s < ../../../patches/check-rsync.patch
#fi
#echo "Done"

if [ -f target/linux/mediatek/patches-5.4/0999-hnat.patch ]; then
	rm -f target/linux/mediatek/patches-5.4/0999-hnat.patch
fi

if [ -f target/linux/ipq806x/patches-5.4/0063-2-tsens-support-configurable-interrupts.patch ]; then
	rm -f target/linux/ipq806x/patches-5.4/0063-*
fi
#if [ -f target/linux/ipq40xx/patches-5.4/100-GPIO-add-named-gpio-exports.patch ]; then
#	rm -f target/linux/ipq40xx/patches-5.4/100-GPIO-add-named-gpio-exports.patch
#fi

if [ -f package/boot/uboot-rockchip/patches/100-rockchip-rk3328-Add-support-for-FriendlyARM-NanoPi-R.patch ]; then
	rm -f package/boot/uboot-rockchip/patches/100-rockchip-rk3328-Add-support-for-FriendlyARM-NanoPi-R.patch
fi

#echo "Patch protobuf wrong hash"
#patch -N -R -p1 -s < ../../../patches/protobuf_hash.patch
#echo "Done"

#echo "Remove gtime dependency"
#if ! patch -Rf -N -p1 -s --dry-run < ../../../patches/gtime.patch; then
#	patch -N -p1 -s < ../../../patches/gtime.patch
#fi
#echo "Done"

#if [ -f target/linux/generic/backport-5.4/370-netfilter-nf_flow_table-fix-offloaded-connection-tim.patch ]; then
#	rm -f target/linux/generic/backport-5.4/370-netfilter-nf_flow_table-fix-offloaded-connection-tim.patch
#fi
#if [ -f target/linux/generic/pending-5.4/640-netfilter-nf_flow_table-add-hardware-offload-support.patch ]; then
#	rm -f target/linux/generic/pending-5.4/640-netfilter-nf_flow_table-add-hardware-offload-support.patch
#fi
#if [ -f target/linux/generic/pending-5.4/641-netfilter-nf_flow_table-support-hw-offload-through-v.patch ]; then
#	rm -f target/linux/generic/pending-5.4/641-netfilter-nf_flow_table-support-hw-offload-through-v.patch
#fi
#if [ -f target/linux/generic/pending-5.4/642-net-8021q-support-hardware-flow-table-offload.patch ]; then
#	rm -f target/linux/generic/pending-5.4/642-net-8021q-support-hardware-flow-table-offload.patch
#fi
#if [ -f target/linux/generic/pending-5.4/643-net-bridge-support-hardware-flow-table-offload.patch ]; then
#	rm -f target/linux/generic/pending-5.4/643-net-bridge-support-hardware-flow-table-offload.patch
#fi
#if [ -f target/linux/generic/pending-5.4/644-net-pppoe-support-hardware-flow-table-offload.patch ]; then
#	rm -f target/linux/generic/pending-5.4/644-net-pppoe-support-hardware-flow-table-offload.patch
#fi
#if [ -f target/linux/generic/pending-5.4/645-netfilter-nf_flow_table-rework-hardware-offload-time.patch ]; then
#	rm -f target/linux/generic/pending-5.4/645-netfilter-nf_flow_table-rework-hardware-offload-time.patch
#fi
#if [ -f target/linux/generic/pending-5.4/647-net-dsa-support-hardware-flow-table-offload.patch ]; then
#	rm -f target/linux/generic/pending-5.4/647-net-dsa-support-hardware-flow-table-offload.patch
#fi
#if [ -f target/linux/generic/hack-5.4/650-netfilter-add-xt_OFFLOAD-target.patch ]; then
#	rm -f target/linux/generic/hack-5.4/650-netfilter-add-xt_OFFLOAD-target.patch
#fi
#if [ -f target/linux/generic/pending-5.4/690-net-add-support-for-threaded-NAPI-polling.patch ]; then
#	rm -f target/linux/generic/pending-5.4/690-net-add-support-for-threaded-NAPI-polling.patch
#fi
#if [ -f target/linux/generic/hack-5.4/647-netfilter-flow-acct.patch ]; then
#	rm -f target/linux/generic/hack-5.4/647-netfilter-flow-acct.patch
#fi
#if [ -f target/linux/generic/hack-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch ]; then
#	rm -f target/linux/generic/hack-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch
#fi
#if [ -f target/linux/bcm27xx/patches-5.4/950-1031-net-lan78xx-Ack-pending-PHY-ints-when-resetting.patch ]; then
#	rm -f target/linux/bcm27xx/patches-5.4/950-1031-net-lan78xx-Ack-pending-PHY-ints-when-resetting.patch
#fi
#if [ -f target/linux/generic/pending-5.4/770-16-net-ethernet-mediatek-mtk_eth_soc-add-flow-offloadin.patch ]; then
#	rm -f target/linux/generic/pending-5.4/770-16-net-ethernet-mediatek-mtk_eth_soc-add-flow-offloadin.patch
#fi
NOT_SUPPORTED="0"

if [ "$OMR_KERNEL" = "5.4" ]; then
	echo "Set to kernel 5.4 for rpi arch"
	find target/linux/bcm27xx -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER=5.10%KERNEL_PATCHVER:=5.4%g' {} \;
	find target/linux/bcm27xx -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=5.10%KERNEL_PATCHVER:=5.4%g' {} \;
	echo "Done"
	echo "Set to kernel 5.4 for x86 arch"
	find target/linux/x86 -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=5.10%KERNEL_PATCHVER:=5.4%g' {} \;
	echo "Done"
	echo "Set to kernel 5.4 for mvebu arch (WRT)"
	find target/linux/mvebu -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=5.10%KERNEL_PATCHVER:=5.4%g' {} \;
	echo "Done"
	echo "Set to kernel 5.4 for mediatek arch (BPI-R2)"
	find target/linux/mediatek -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=5.10%KERNEL_PATCHVER:=5.4%g' {} \;
	echo "Done"
	if [ -f package/kernel/mac80211/patches/build/firmware-replace-HOTPLUG-with-UEVENT-in-FW_ACTION-defines.patch ]; then
		rm -f package/kernel/mac80211/patches/build/firmware-replace-HOTPLUG-with-UEVENT-in-FW_ACTION-defines.patch
	fi
	#if [ -f package/kernel/rtl8812au-ct/patches/003-wireless-5.8.patch ]; then
	#	rm -f package/kernel/rtl8812au-ct/patches/003-wireless-5.8.patch
	#fi
	if [ -f target/linux/mvebu/patches-5.4/021-arm64-dts-marvell-armada-37xx-Move-PCIe-comphy-handl.patch ]; then
		rm -f target/linux/mvebu/patches-5.4/021-arm64-dts-marvell-armada-37xx-Move-PCIe-comphy-handl.patch
	fi
	if [ -f target/linux/mvebu/patches-5.4/022-arm64-dts-marvell-armada-37xx-Move-PCIe-max-link-spe.patch ]; then
		rm -f target/linux/mvebu/patches-5.4/022-arm64-dts-marvell-armada-37xx-Move-PCIe-max-link-spe.patch
	fi
	echo "rm -rf $OMR_TARGET/${OMR_KERNEL}/source/package/boot/uboot-rockchip"
	rm -rf "${OMR_TARGET}/${OMR_KERNEL}/source/package/boot/uboot-rockchip"
	#rm -f target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-photonicat.dts
	echo "CONFIG_VERSION_CODE=5.4" >> ".config"
	if [ "$OMR_TARGET" = "rpi5" ]; then
		echo "Sorry but kernel 5.4 is not supported on your arch yet"
		NOT_SUPPORTED="1"
		exit 1
	fi
	if ([ "$OMR_TARGET" = "bpi-r3" ] || [ "$OMR_TARGET" = "bpi-r4" ] || [ "$OMR_TARGET" = "bpi-r4-poe" ]); then
		echo "Sorry but kernel 5.4 is not supported on your arch"
		NOT_SUPPORTED="1"
		exit 1
	fi
	if ([ "$OMR_TARGET" = "z8102ax_128m" ] || [ "$OMR_TARGET" = "z8102ax_64m" ]); then
		echo "Sorry but kernel 5.4 is not supported on your arch yet"
		NOT_SUPPORTED="1"
		exit 1
	fi
	if [ "$OMR_TARGET" = "rutx50" ]; then
		echo "Sorry but kernel 5.4 is not supported on your arch yet"
		NOT_SUPPORTED="1"
		#exit 1
	fi
fi
if [ "$OMR_KERNEL" = "6.1" ]; then
	echo "Set to kernel 6.1 for x86 arch"
	find target/linux/x86 -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=5.10%KERNEL_PATCHVER:=6.1%g' {} \;
	find target/linux/x86 -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=5.15%KERNEL_PATCHVER:=6.1%g' {} \;
	echo "Done"
	echo "Set to kernel 6.1 for rockchip arch (R2S/R4S)"
	find target/linux/rockchip -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=5.15%KERNEL_PATCHVER:=6.1%g' {} \;
	echo "Done"
	#echo "Set to kernel 6.1 for ipq807x"
	#find target/linux/ipq807x -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=5.15%KERNEL_PATCHVER:=6.1%g' {} \;
	#echo "Done"
	echo "Set to kernel 6.1 for bcm27xx"
	find target/linux/bcm27xx -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=5.15%KERNEL_PATCHVER:=6.1%g' {} \;
	echo "Done"
	echo "Set to kernel 6.1 for mvebu"
	find target/linux/mvebu -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=5.15%KERNEL_PATCHVER:=6.1%g' {} \;
	echo "Done"
	echo "Set to kernel 6.1 for mediatek"
	find target/linux/mediatek -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=5.15%KERNEL_PATCHVER:=6.1%g' {} \;
	echo "Done"
	echo "Set to kernel 6.1 for ipq806x"
	find target/linux/ipq806x -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=5.15%KERNEL_PATCHVER:=6.1%g' {} \;
	echo "Done"
	echo "Set to kernel 6.1 for ipq40xx"
	find target/linux/ipq40xx -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=5.15%KERNEL_PATCHVER:=6.1%g' {} \;
	echo "Done"
	echo "Set to kernel 6.1 for ramips"
	find target/linux/ramips -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=5.15%KERNEL_PATCHVER:=6.1%g' {} \;
	echo "Done"
	rm -f target/linux/bcm27xx/patches-6.1/950-0509-README-Add-README.md-with-CI-kernel-build-status-tag.patch
	rm -f target/linux/bcm27xx/patches-6.1/950-0555-README.md-Replace-6.0-build-status-with-6.2.patch
	rm -f target/linux/mvebu/patches-6.1/102-leds-turris-omnia-support-HW-controlled-mode-via-pri.patch
	rm -f target/linux/bcm27xx/modules/sound.mk
	rm -f package/kernel/rtl8812au-ct/patches/002-*
	rm -f package/kernel/rtl8812au-ct/patches/003-*
	rm -f package/kernel/rtl8812au-ct/patches/004-*
	rm -f package/kernel/rtl8812au-ct/patches/100-api_update.patch
	#rm -f target/linux/bcm27xx/modules/sound.mk
	rm -f package/libs/elfutils/patches/101-no-fts.patch
	#rm -f package/kernel/mwlwifi/patches/001-*
	#rm -f package/kernel/mwlwifi/patches/002-*
	#rm -f package/kernel/mwlwifi/patches/003-*
	#rm -rf package/kernel/mt76
	rm -rf target/linux/ipq40xx/files/drivers/net/dsa
	rm -rf target/linux/ipq40xx/files/drivers/net/ethernet

#	echo "CONFIG_DEVEL=y" >> ".config"
#	echo "CONFIG_NEED_TOOLCHAIN=y" >> ".config"
#	echo "CONFIG_TOOLCHAINOPTS=y" >> ".config"
#	echo 'CONFIG_BINUTILS_VERSION_2_36_1=y' >> ".config"
#	echo 'CONFIG_BINUTILS_VERSION="2.36.1"' >> ".config"
#	echo "CONFIG_BINUTILS_USE_VERSION_2_36_1=y" >> ".config"
#	#echo "CONFIG_GCC_USE_VERSION_10=y" >> ".config"
#	#echo "CONFIG_GCC_VERSION_10=y" >> ".config"
#	#echo 'CONFIG_GCC_VERSION="10.3.0"' >> ".config"
	echo "CONFIG_VERSION_CODE=6.1" >> ".config"
#	#echo "CONFIG_GCC_USE_VERSION_10=y" >> ".config"
	if [ "$TARGET" = "bpi-r2" ]; then
		echo "# CONFIG_VERSION_CODE_FILENAMES is not set" >> ".config"
	fi
	if [ "$OMR_TARGET" = "bpi-r1" ]; then
		echo "Sorry but kernel 6.1 is not supported on your arch yet"
		NOT_SUPPORTED="1"
		#exit 1
	fi
fi
if [ "$OMR_KERNEL" = "6.6" ]; then
	echo "Set to kernel 6.6 for x86 arch"
	find target/linux/x86 -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.1%KERNEL_PATCHVER:=6.6%g' {} \;
	echo "Done"
	echo "Set to kernel 6.6 for mediatek"
	find target/linux/mediatek -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.1%KERNEL_PATCHVER:=6.6%g' {} \;
	echo "Done"
	echo "Set to kernel 6.6 for qualcommmax"
	find target/linux/qualcommax -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.1%KERNEL_PATCHVER:=6.6%g' {} \;
	echo "Done"
	echo "Set to kernel 6.6 for bcm27xx"
	find target/linux/bcm27xx -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.1%KERNEL_PATCHVER:=6.6%g' {} \;
	echo "Done"
	echo "Set to kernel 6.6 for ipq40xx"
	find target/linux/ipq40xx -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.1%KERNEL_PATCHVER:=6.6%g' {} \;
	echo "Done"
	echo "Set to kernel 6.6 for ipq806x"
	find target/linux/ipq806x -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.1%KERNEL_PATCHVER:=6.6%g' {} \;
	echo "Done"
	echo "Set to kernel 6.6 for kirkwood"
	find target/linux/kirkwood -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.1%KERNEL_PATCHVER:=6.6%g' {} \;
	echo "Done"
	echo "Set to kernel 6.6 for mpc85xx"
	find target/linux/mpc85xx -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.1%KERNEL_PATCHVER:=6.6%g' {} \;
	echo "Done"
	echo "Set to kernel 6.6 for mvebu"
	find target/linux/mvebu -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.1%KERNEL_PATCHVER:=6.6%g' {} \;
	echo "Done"
	echo "Set to kernel 6.6 for ramips"
	find target/linux/ramips -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.1%KERNEL_PATCHVER:=6.6%g' {} \;
	echo "Done"
	echo "Set to kernel 6.6 for rockchip"
	find target/linux/rockchip -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.1%KERNEL_PATCHVER:=6.6%g' {} \;
	echo "Done"

	#[ -d target/linux/ipq40xx/files-6.6/arch/arm/boot/dts/qcom ] && mv -f target/linux/ipq40xx/files-6.6/arch/arm/boot/dts/qcom/* target/linux/ipq40xx/files-6.6/arch/arm/boot/dts/ && rm -fr target/linux/ipq40xx/files-6.6/arch/arm/boot/dts/qcom
	#echo "CONFIG_VERSION_CODE=6.6" >> ".config"
	#echo "# CONFIG_PACKAGE_kmod-gpio-button-hotplug is not set" >> ".config"
	#echo "# CONFIG_PACKAGE_kmod-meraki-mx100 is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-gpio-nct5104d is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-vfio is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-vfio-pci is not set" >> ".config"
	#echo "# CONFIG_PACKAGE_kmod-r8168 is not set" >> ".config"
	#echo "# CONFIG_PACKAGE_kmod-button-hotplug is not set" >> ".config"
	#echo "# CONFIG_PACKAGE_kmod-cryptodev is not set" >> ".config"
	if [ "$OMR_TARGET" != "ubnt-erx" ] && [ "$OMR_TARGET" != "r7800" ]; then
		echo "CONFIG_BPF_TOOLCHAIN=y" >> ".config"
		echo "CONFIG_BPF_TOOLCHAIN_HOST=y" >> ".config"
		echo "CONFIG_KERNEL_BPF_EVENTS=y" >> ".config"
		echo "CONFIG_KERNEL_DEBUG_INFO=y" >> ".config"
		echo "CONFIG_KERNEL_DEBUG_INFO_BTF=y" >> ".config"
		echo "CONFIG_KERNEL_DEBUG_INFO_BTF_MODULES=y" >> ".config"
		echo "# CONFIG_KERNEL_DEBUG_INFO_REDUCED is not set" >> ".config"
		echo "CONFIG_KERNEL_MODULE_ALLOW_BTF_MISMATCH=y" >> ".config"
	fi
	# Remove for now packages that doesn't compile
	#rm -rf package/kernel/mt76
	#rm -rf package/kernel/rtl8812au-ct
	# Remove not needed patches
	#rm -f package/kernel/mac80211/patches/build/200-Revert-wifi-iwlwifi-Use-generic-thermal_zone_get_tri.patch
	#rm -f package/kernel/mac80211/patches/build/210-revert-split-op.patch
	#rm -f package/kernel/mac80211/patches/subsys/301-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch
	#rm -f package/kernel/rtl8812au-ct/patches/099-cut-linkid-linux-version-code-conditionals.patch
	#rm -f package/kernel/rtl8812au-ct/patches/100-api_update.patch
	rm -f target/linux/generic/hack-6.6/212-tools_portability.patch
	if [ ! -d target/linux/`sed -nE 's/CONFIG_TARGET_([a-z0-9]*)=y/\1/p' ".config" | tr -d "\n"`/patches-6.6 ]; then
		echo "Sorry but kernel 6.6 is not supported on your arch yet"
		NOT_SUPPORTED="1"
	fi
fi
if [ "$OMR_KERNEL" = "6.10" ]; then
	echo "Set to kernel 6.10 for x86 arch"
	find target/linux/x86 -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.6%KERNEL_PATCHVER:=6.10%g' {} \;
	echo "Done"
	echo "Set to kernel 6.10 for mediatek"
	find target/linux/mediatek -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.6%KERNEL_PATCHVER:=6.10%g' {} \;
	echo "Done"
	echo "CONFIG_VERSION_CODE=6.10" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-gpio-button-hotplug is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-meraki-mx100 is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-gpio-nct5104d is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-r8168 is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-button-hotplug is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-cryptodev is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-trelay is not set" >> ".config"
	echo "# CONFIG_PACKAGE_464xlat is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-nat46 is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-ath10k-ct-smallbuffers is not set" >> ".config"
	echo "CONFIG_BPF_TOOLCHAIN=y" >> ".config"
	echo "CONFIG_BPF_TOOLCHAIN_HOST=y" >> ".config"
	echo "CONFIG_KERNEL_BPF_EVENTS=y" >> ".config"
	echo "CONFIG_KERNEL_DEBUG_INFO=y" >> ".config"
	echo "CONFIG_KERNEL_DEBUG_INFO_BTF=y" >> ".config"
	echo "CONFIG_KERNEL_DEBUG_INFO_BTF_MODULES=y" >> ".config"
	echo "# CONFIG_KERNEL_DEBUG_INFO_REDUCED is not set" >> ".config"
	echo "CONFIG_KERNEL_MODULE_ALLOW_BTF_MISMATCH=y" >> ".config"
	# Remove for now packages that doesn't compile
	rm -rf package/kernel/mt76
	rm -rf package/kernel/rtl8812au-ct
	# Remove not needed patches
	rm -f package/kernel/mac80211/patches/build/200-Revert-wifi-iwlwifi-Use-generic-thermal_zone_get_tri.patch
	rm -f package/kernel/mac80211/patches/build/210-revert-split-op.patch
	rm -f package/kernel/mac80211/patches/subsys/301-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch
	rm -f package/kernel/mac80211/patches/build/240-backport_genl_split_ops.patch
	rm -f package/kernel/mac80211/patches/build/250-backport_iwlwifi_thermal.patch
	rm -f package/kernel/rtl8812au-ct/patches/099-cut-linkid-linux-version-code-conditionals.patch
	rm -f package/kernel/rtl8812au-ct/patches/100-api_update.patch
	echo 'CONFIG_KERNEL_GIT_CLONE_URI="https://github.com/multipath-tcp/mptcp_net-next.git"' >> ".config"
	echo 'CONFIG_KERNEL_GIT_REF="30be9e34452a634aab77a15634890e9c7637812a"' >> ".config"
fi
if [ "$OMR_KERNEL" = "6.11" ]; then
	echo "Set to kernel 6.11 for x86 arch"
	find target/linux/x86 -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.6%KERNEL_PATCHVER:=6.11%g' {} \;
	echo "Done"
	echo "Set to kernel 6.11 for mediatek"
	find target/linux/mediatek -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.6%KERNEL_PATCHVER:=6.11%g' {} \;
	echo "Done"
	echo "CONFIG_VERSION_CODE=6.11" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-gpio-button-hotplug is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-meraki-mx100 is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-gpio-nct5104d is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-r8168 is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-r8125 is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-r8125-rss is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-r8126 is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-r8126-rss is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-button-hotplug is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-cryptodev is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-trelay is not set" >> ".config"
	echo "# CONFIG_PACKAGE_464xlat is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-nat46 is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-ath10k-ct-smallbuffers is not set" >> ".config"
	echo "CONFIG_BPF_TOOLCHAIN=y" >> ".config"
	echo "CONFIG_BPF_TOOLCHAIN_HOST=y" >> ".config"
	echo "CONFIG_KERNEL_BPF_EVENTS=y" >> ".config"
	echo "CONFIG_KERNEL_DEBUG_INFO=y" >> ".config"
	echo "CONFIG_KERNEL_DEBUG_INFO_BTF=y" >> ".config"
	echo "CONFIG_KERNEL_DEBUG_INFO_BTF_MODULES=y" >> ".config"
	echo "# CONFIG_KERNEL_DEBUG_INFO_REDUCED is not set" >> ".config"
	echo "CONFIG_KERNEL_MODULE_ALLOW_BTF_MISMATCH=y" >> ".config"
	# Remove for now packages that doesn't compile
	rm -rf package/kernel/mt76
	rm -rf package/kernel/rtl8812au-ct
	# Remove not needed patches
	rm -f package/kernel/mac80211/patches/build/200-Revert-wifi-iwlwifi-Use-generic-thermal_zone_get_tri.patch
	rm -f package/kernel/mac80211/patches/build/210-revert-split-op.patch
	rm -f package/kernel/mac80211/patches/subsys/301-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch
	rm -f package/kernel/mac80211/patches/build/240-backport_genl_split_ops.patch
	rm -f package/kernel/mac80211/patches/build/250-backport_iwlwifi_thermal.patch
	rm -f package/kernel/rtl8812au-ct/patches/099-cut-linkid-linux-version-code-conditionals.patch
	rm -f package/kernel/rtl8812au-ct/patches/100-api_update.patch
	#echo 'CONFIG_KERNEL_GIT_CLONE_URI="https://github.com/multipath-tcp/mptcp_net-next.git"' >> ".config"
	#echo 'CONFIG_KERNEL_GIT_REF="92590173530711151d50d13b145a9621b5e8d239"' >> ".config"
fi

# 6.12内核
if [ "$OMR_KERNEL" = "6.12" ]; then
	
	# 修改Makefile中的内核版本号
	echo "Set to kernel 6.12 for x86 arch"
	find target/linux/x86 -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.6%KERNEL_PATCHVER:=6.12%g' {} \;
	echo "Done"
	echo "Set to kernel 6.12 for mediatek"
	find target/linux/mediatek -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.6%KERNEL_PATCHVER:=6.12%g' {} \;
	echo "Done"
	echo "Set to kernel 6.12 for bcm27xx"
	find target/linux/bcm27xx -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.6%KERNEL_PATCHVER:=6.12%g' {} \;
	echo "Done"
	echo "Set to kernel 6.12 for bcm27xx"
	find target/linux/qualcommax -type f -name Makefile -exec sed -i 's%KERNEL_PATCHVER:=6.6%KERNEL_PATCHVER:=6.12%g' {} \;
	echo "Done"

	echo "CONFIG_VERSION_CODE=6.12" >> ".config"
	
	# 内核模块
	echo "# CONFIG_PACKAGE_kmod-gpio-button-hotplug is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-meraki-mx100 is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-gpio-nct5104d is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-r8168 is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-r8125 is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-r8125-rss is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-r8126 is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-r8126-rss is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-button-hotplug is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-cryptodev is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-trelay is not set" >> ".config"
	echo "# CONFIG_PACKAGE_464xlat is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-nat46 is not set" >> ".config"
	echo "# CONFIG_PACKAGE_kmod-ath10k-ct-smallbuffers is not set" >> ".config"
	
	# BPF
	echo "CONFIG_BPF_TOOLCHAIN=y" >> ".config"
	echo "CONFIG_BPF_TOOLCHAIN_HOST=y" >> ".config"
	echo "CONFIG_KERNEL_BPF_EVENTS=y" >> ".config"
	echo "CONFIG_KERNEL_DEBUG_INFO=y" >> ".config"
	echo "CONFIG_KERNEL_DEBUG_INFO_BTF=y" >> ".config"
	echo "CONFIG_KERNEL_DEBUG_INFO_BTF_MODULES=y" >> ".config"
	echo "# CONFIG_KERNEL_DEBUG_INFO_REDUCED is not set" >> ".config"
	echo "CONFIG_KERNEL_MODULE_ALLOW_BTF_MISMATCH=y" >> ".config"
	echo 'CONFIG_EXTRA_OPTIMIZATION="-fno-caller-saves -fno-plt -Wno-stringop-truncation -Wno-stringop-overread -Wno-calloc-transposed-args"' >> ".config"
	
	# Remove for now packages that doesn't compile
	rm -rf package/kernel/mt76
	rm -rf package/kernel/rtl8812au-ct
	
	# Remove not needed patches
	rm -f package/kernel/mac80211/patches/build/200-Revert-wifi-iwlwifi-Use-generic-thermal_zone_get_tri.patch
	rm -f package/kernel/mac80211/patches/build/210-revert-split-op.patch
	rm -f package/kernel/mac80211/patches/subsys/301-mac80211-sta-randomize-BA-session-dialog-token-alloc.patch
	rm -f package/kernel/mac80211/patches/build/240-backport_genl_split_ops.patch
	rm -f package/kernel/mac80211/patches/build/250-backport_iwlwifi_thermal.patch
	rm -f package/kernel/rtl8812au-ct/patches/099-cut-linkid-linux-version-code-conditionals.patch
	rm -f package/kernel/rtl8812au-ct/patches/100-api_update.patch
	
	#echo 'CONFIG_KERNEL_GIT_CLONE_URI="https://github.com/multipath-tcp/mptcp_net-next.git"' >> ".config"
	#echo 'CONFIG_KERNEL_GIT_REF="92590173530711151d50d13b145a9621b5e8d239"' >> ".config"
	echo 'CONFIG_PACKAGE_apk-openssl=y' >> ".config"
	
	# 检查当前架构是否支持6.12内核
	if [ ! -d target/linux/`sed -nE 's/CONFIG_TARGET_([a-z0-9]*)=y/\1/p' ".config" | tr -d "\n"`/patches-6.12 ]; then
		echo "Sorry but kernel 6.12 is not supported on your arch yet"
		NOT_SUPPORTED="1"
	fi
fi

#rm -rf feeds/packages/libs/libwebp
cd "../../.."
rm -rf feeds/${OMR_KERNEL}/luci/modules/luci-mod-network

# LUCI系统日志补丁
if [ -d feeds/${OMR_KERNEL}/${OMR_DIST}/luci-mod-status ]; then
	rm -rf feeds/${OMR_KERNEL}/luci/modules/luci-mod-status
elif [ "$OMR_KERNEL" = "6.6" ] || [ "$OMR_KERNEL" = "6.10" ] || [ "$OMR_KERNEL" = "6.11" ] || [ "$OMR_KERNEL" = "6.12" ]; then
	cd feeds/${OMR_KERNEL}
	#if ! patch -Rf -N -p1 -s --dry-run < ../../patches/luci-syslog-6.6.patch; then
	#	patch -N -p1 -s < ../../patches/luci-syslog-6.6.patch
	#fi
	if ! patch -Rf -N -p1 -s --dry-run < ../../patches/luci-syslog-6.10.patch; then
		patch -N -p1 -s < ../../patches/luci-syslog-6.10.patch
	fi
	cd -
else
	cd feeds/${OMR_KERNEL}
	if ! patch -Rf -N -p1 -s --dry-run < ../../patches/luci-syslog.patch; then
		patch -N -p1 -s < ../../patches/luci-syslog.patch
	fi
	cd -
fi

# LUCI ubbound DNS服务器日志补丁
cd feeds/${OMR_KERNEL}
if ! patch -Rf -N -p1 -s --dry-run < ../../patches/luci-unbound-logread.patch; then
	patch -N -p1 -s < ../../patches/luci-unbound-logread.patch
fi
cd -

# 清理特定的LUCI模块
[ -d feeds/${OMR_KERNEL}/${OMR_DIST}/luci-app-statistics ] && rm -rf feeds/${OMR_KERNEL}/luci/applications/luci-app-statistics
[ -d feeds/${OMR_KERNEL}/${OMR_DIST}/luci-proto-modemmanager ] && rm -rf feeds/${OMR_KERNEL}/luci/protocols/luci-proto-modemmanager

# 清理特定的软件包
[ -d ${OMR_FEED}/libgpiod ] && rm -rf feeds/${OMR_KERNEL}/packages/libs/libgpiod
[ -d ${OMR_FEED}/iperf3 ] && rm -rf feeds/${OMR_KERNEL}/packages/net/iperf3
[ -d ${OMR_FEED}/golang ] && {
	rm -rf feeds/${OMR_KERNEL}/packages/lang/golang
	cp -r ${OMR_FEED}/golang feeds/${OMR_KERNEL}/packages/lang/
}
[ -d ${OMR_FEED}/openvpn ] && rm -rf feeds/${OMR_KERNEL}/packages/net/openvpn
[ -d ${OMR_FEED}/iproute2 ] && rm -rf feeds/${OMR_KERNEL}/packages/network/utils/iproute2
[ -d ${CUSTOM_FEED}/syslog-ng ] && rm -rf feeds/${OMR_KERNEL}/packages/admin/syslog-ng
([ "$OMR_KERNEL" = "6.6" ] || [ "$OMR_KERNEL" = "6.10" ]) && [ -d ${OMR_FEED}/xtables-addons ] && rm -rf feeds/${OMR_KERNEL}/packages/net/xtables-addons

# 添加法国奥克语支持
echo "Add Occitan translation support"
cd feeds/${OMR_KERNEL}
if ! patch -Rf -N -p1 -s --dry-run < ../../patches/luci-occitan.patch; then
	patch -N -p1 -s < ../../patches/luci-occitan.patch
	#sh feeds/luci/build/i18n-add-language.sh oc
fi

# 数组排序工具补丁
if [ "$OMR_KERNEL" = "5.4" ] && ! patch -Rf -N -p1 -s --dry-run < ../../patches/luci-base-add_array_sort_utilities.patch; then
	patch -N -p1 -s < ../../patches/luci-base-add_array_sort_utilities.patch
fi

# 法国奥克语支持
cd ../..
[ -d $OMR_FEED/luci-base/po/oc ] && cp -rf $OMR_FEED/luci-base/po/oc feeds/${OMR_KERNEL}/luci/modules/luci-base/po/
echo "Done"

# 更新软件源
cd "$OMR_TARGET/${OMR_KERNEL}/source"
echo "Update feeds index"
cp .config .config.keep
scripts/feeds clean
scripts/feeds update -a

# 安装依赖的软件包和luci模块
if [ "$OMR_ALL_PACKAGES" = "yes" ]; then
	scripts/feeds install -a -d m -p packages
	scripts/feeds install -a -d m -p luci
fi
if [ -n "$CUSTOM_FEED" ]; then
	scripts/feeds install -a -d m -p openmptcprouter
	scripts/feeds install -a -d y -f -p ${OMR_DIST}
else
	scripts/feeds install -a -d y -f -p openmptcprouter
fi

# Use iproute2 package from the normal repo for 5.4
if [ "$OMR_KERNEL" = "5.4" ]; then
	scripts/feeds uninstall iproute2
	scripts/feeds uninstall libbpf
	scripts/feeds uninstall netifd
	scripts/feeds install iproute2
	scripts/feeds install netifd
fi


# 安装kmod-macremapper内核模块
cp .config.keep .config
scripts/feeds install kmod-macremapper
echo "Done"

if [ ! -f "../../../$OMR_TARGET_CONFIG" ] || [ "$NOT_SUPPORTED" = "1" ]; then
	echo "Target $OMR_TARGET not found ! You have to configure and compile your kernel manually."
	exit 1
fi

# 开始编译
[ "$ONLY_PREPARE" = "yes" ] && exit 0
echo "Building $OMR_DIST for the target $OMR_TARGET with kernel ${OMR_KERNEL}"
make defconfig
make IGNORE_ERRORS=m "$@"
echo "Done"
posted @ 2025-04-21 14:27  zhijun  阅读(343)  评论(0)    收藏  举报