files/toolchain/build.sh
zhao fdd9627f5f 更新 toolchain/build.sh
Signed-off-by: zhao <zhao@noreply.localhost>
2025-03-23 01:44:58 +08:00

217 lines
9.4 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash -e
export Github=https://raw.githubusercontent.com/oppen321/ZeroWrt-Action/refs/heads/master/patch
# Clone source code
git clone -b openwrt-24.10 --single-branch --filter=blob:none https://github.com/immortalwrt/immortalwrt openwrt
# Enter source code
cd openwrt
# Init feeds
./scripts/feeds update -a
./scripts/feeds install -a
# x86 - disable mitigations
sed -i 's/noinitrd/noinitrd mitigations=off/g' target/linux/x86/image/grub-efi.cfg
# gcc15 patches
curl -s $Github/gcc-15/202-toolchain-gcc-add-support-for-GCC-15.patch | patch -p1
# GCC Optimization level -O3
if [ "$model" = "OpenWrt_Rockchip_v24.10" ]; then
curl -s $Github/target-modify_for_rockchip.patch | patch -p1
elif [ "$model" = "OpenWrt_X86_64_v24.10" ]; then
curl -s $Github/target-modify_for_x86_64.patch | patch -p1
fi
# fix gcc14 and gcc15
if [ "$USE_GCC14" = y ] || [ "$USE_GCC15" = y ]; then
# 如果是 GCC 14 或 GCC 15则替换并克隆修复后的 linux-atm
echo "Detected GCC 14 or 15. Replacing linux-atm with a fixed version..."
# 移除原有的 linux-atm 软件包
rm -rf package/network/utils/linux-atm
# 从 GitHub 克隆修复后的 linux-atm 软件包
git clone https://github.com/sbwml/package_network_utils_linux-atm package/network/utils/linux-atm
# 检查是否克隆成功
if [ -d "package/network/utils/linux-atm" ]; then
echo "linux-atm has been successfully replaced for GCC 14/15 compatibility."
else
echo "Failed to clone the fixed linux-atm package. Please check your network or the repository URL."
exit 1
fi
else
# 如果不是 GCC 14 或 GCC 15则什么都不做
echo "GCC 14 or 15 not enabled. Skipping linux-atm replacement."
fi
# fix gcc-15
if [ "$USE_GCC15" = y ]; then
# Mbedtls
curl -s $Github/gcc-15/mbedtls/901-tests-fix-string-initialization-error-on-gcc15.patch > package/libs/mbedtls/patches/901-tests-fix-string-initialization-error-on-gcc15.patch
sed -i '/TARGET_CFLAGS/ s/$/ -Wno-error=unterminated-string-initialization/' package/libs/mbedtls/Makefile
# elfutils
curl -s $Github/gcc-15/elfutils/901-backends-fix-string-initialization-error-on-gcc15.patch > package/libs/elfutils/patches/901-backends-fix-string-initialization-error-on-gcc15.patch
# libwebsockets
mkdir -p feeds/packages/libs/libwebsockets/patches
curl -s $Github/gcc-15/libwebsockets/901-fix-string-initialization-error-on-gcc15.patch > feeds/packages/libs/libwebsockets/patches/901-fix-string-initialization-error-on-gcc15.patch
# libxcrypt
mkdir -p feeds/packages/libs/libxcrypt/patches
curl -s $Github/gcc-15/libxcrypt/901-fix-string-initialization-error-on-gcc15.patch > feeds/packages/libs/libxcrypt/patches/901-fix-string-initialization-error-on-gcc15.patch
fi
# fix gcc-15.0.1 C23
if [ "$USE_GCC15" = y ]; then
# gmp
mkdir -p package/libs/gmp/patches
curl -s $Github/gcc-15-c23/gmp/001-fix-build-with-gcc-15.patch > package/libs/gmp/patches/001-fix-build-with-gcc-15.patch
# htop
mkdir -p feeds/packages/admin/htop/patches
curl -s $Github/gcc-15-c23/htop/001-Avoid-compilation-issues-with-ncurses-on-GCC-15.patch > feeds/packages/admin/htop/patches/001-Avoid-compilation-issues-with-ncurses-on-GCC-15.patch
# libtirpc
sed -i '/TARGET_CFLAGS/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/libs/libtirpc/Makefile
# libsepol
sed -i '/HOST_MAKE_FLAGS/i TARGET_CFLAGS += -std=gnu17\n' package/libs/libsepol/Makefile
# tree
sed -i '/MAKE_FLAGS/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/utils/tree/Makefile
# gdbm
sed -i '/CONFIGURE_ARGS/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/libs/gdbm/Makefile
# libical
sed -i '/CMAKE_OPTIONS/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/libs/libical/Makefile
# libconfig
sed -i '/CONFIGURE_ARGS/i TARGET_CFLAGS += -std=gnu17\n' package/feeds/packages/libconfig/Makefile
# lsof
sed -i '/CONFIGURE_ARGS/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/utils/lsof/Makefile
# screen
sed -i '/CONFIGURE_ARGS/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/utils/screen/Makefile
# ppp
sed -i '/CONFIGURE_VARS/i \\nTARGET_CFLAGS += -std=gnu17\n' package/network/services/ppp/Makefile
# vim
sed -i '/CONFIGURE_ARGS/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/utils/vim/Makefile
# mtd
sed -i '/target=/i TARGET_CFLAGS += -std=gnu17\n' package/system/mtd/Makefile
# libselinux
sed -i '/MAKE_FLAGS/i TARGET_CFLAGS += -std=gnu17\n' package/libs/libselinux/Makefile
# avahi
sed -i '/TARGET_CFLAGS +=/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/libs/avahi/Makefile
# bash
sed -i '/CONFIGURE_ARGS/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/utils/bash/Makefile
# xl2tpd
sed -i '/ifneq (0,0)/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/net/xl2tpd/Makefile
# dnsmasq
sed -i '/MAKE_FLAGS/i TARGET_CFLAGS += -std=gnu17\n' package/network/services/dnsmasq/Makefile
# bluez
sed -i '/CONFIGURE_ARGS/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/utils/bluez/Makefile
# e2fsprogs
sed -i '/CONFIGURE_ARGS/i TARGET_CFLAGS += -std=gnu17\n' package/utils/e2fsprogs/Makefile
# f2fs-tools
sed -i '/CONFIGURE_ARGS/i TARGET_CFLAGS += -std=gnu17\n' package/utils/f2fs-tools/Makefile
# krb5
sed -i '/CONFIGURE_VARS/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/net/krb5/Makefile
# parted
sed -i '/CONFIGURE_ARGS/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/utils/parted/Makefile
# iperf3
sed -i '/CONFIGURE_ARGS/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/net/iperf3/Makefile
# db
sed -i '/CONFIGURE_ARGS/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/libs/db/Makefile
# python3
sed -i '/TARGET_CONFIGURE_OPTS/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/lang/python/python3/Makefile
# uwsgi
sed -i '/MAKE_VARS/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/net/uwsgi/Makefile
# perl
sed -i '/Target perl/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/lang/perl/Makefile
# rsync
sed -i '/CONFIGURE_ARGS/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/net/rsync/Makefile
# shine
sed -i '/Build\/InstallDev/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/sound/shine/Makefile
# jq
sed -i '/CONFIGURE_ARGS/i TARGET_CFLAGS += -std=gnu17\n' feeds/packages/utils/jq/Makefile
fi
# Load devices Config
if [ "$model" = "OpenWrt_Rockchip_v24.10" ]; then
curl -s https://git.kejizero.online/zhao/files/raw/branch/main/toolchain/Configs/immortalwrt_rockchip.config > .config
elif [ "$model" = "OpenWrt_X86_64_v24.10" ]; then
curl -s https://git.kejizero.online/zhao/files/raw/branch/main/toolchain/Configs/immortalwrt_x86_64.config > .config
fi
# gcc14 & 15
if [ "$USE_GCC13" = y ]; then
export USE_GCC13=y gcc_version=13
elif [ "$USE_GCC14" = y ]; then
export USE_GCC14=y gcc_version=14
elif [ "$USE_GCC15" = y ]; then
export USE_GCC15=y gcc_version=15
else
export USE_GCC14=y gcc_version=14
fi
# gcc config
echo -e "\n# gcc ${gcc_version}" >> .config
echo -e "CONFIG_DEVEL=y" >> .config
echo -e "CONFIG_TOOLCHAINOPTS=y" >> .config
echo -e "CONFIG_GCC_USE_VERSION_${gcc_version}=y\n" >> .config
# Compile
make defconfig
make -j$(nproc)
# Organize files
if [ "$model" = "Padavanonly_MT798X_v24.10" ] || [ "$model" = "Hanwckf_MT798X_v21.02" ]; then
rm -rf build_dir/hostpkg
rm -rf staging_dir/hostpkg
rm -rf staging_dir/packages
rm -rf staging_dir/target-aarch64_cortex-a53_musl/host
rm -rf staging_dir/target-aarch64_cortex-a53_musl/packages
rm -rf staging_dir/target-aarch64_cortex-a53_musl/pkginfo
rm -rf staging_dir/target-aarch64_cortex-a53_musl/root-mediatek
find build_dir/target-aarch64_cortex-a53_musl -mindepth 1 -maxdepth 1 ! -name 'stamp' -exec rm -rf {} +
elif [ "$model" = "OpenWrt_Rockchip_v24.10" ]; then
rm -rf build_dir/hostpkg
rm -rf staging_dir/hostpkg
rm -rf staging_dir/packages
rm -rf staging_dir/target-aarch64_generic_musl/image
rm -rf staging_dir/target-aarch64_generic_musl/host
rm -rf staging_dir/target-aarch64_generic_musl/packages
rm -rf staging_dir/target-aarch64_generic_musl/pkginfo
rm -rf staging_dir/target-aarch64_generic_musl/root-rockchip
find build_dir/target-aarch64_generic_musl -mindepth 1 -maxdepth 1 ! -name 'stamp' -exec rm -rf {} +
elif [ "$model" = "OpenWrt_X86_64_v24.10" ]; then
rm -rf build_dir/hostpkg
rm -rf staging_dir/hostpkg
rm -rf staging_dir/packages
rm -rf staging_dir/target-x86_64_musl/image
rm -rf staging_dir/target-x86_64_musl/host
rm -rf staging_dir/target-x86_64_musl/packages
rm -rf staging_dir/target-x86_64_musl/pkginfo
rm -rf staging_dir/target-x86_64_musl/root-x86
find build_dir/target-x86_64_musl -mindepth 1 -maxdepth 1 ! -name 'stamp' -exec rm -rf {} +
fi
# Create folder
mkdir toolchain-cache
# Compression toolchain
case "$model" in
"OpenWrt_Rockchip_v24.10" | "OpenWrt_X86_64_v24.10")
if [ -z "$gcc_version" ]; then
echo "Error: GCC version not set!"
exit 1
fi
if [ "$model" = "OpenWrt_Rockchip_v24.10" ]; then
output_file="toolchain_musl_openwrt_rockchip_gcc-${gcc_version}.tar.zst"
elif [ "$model" = "OpenWrt_X86_64_v24.10" ]; then
output_file="toolchain_musl_openwrt_X86_64_gcc-${gcc_version}.tar.zst"
fi
tar -I zstd -cvf "toolchain-cache/${output_file}" build_dir dl tmp staging_dir
;;
*)
echo "Error: Unknown model '$model'!"
exit 1
;;
esac