files/toolchain/build.sh
zhao 6d6a4f7709 更新 toolchain/build.sh
Signed-off-by: zhao <zhao@noreply.localhost>
2025-03-23 02:07:55 +08:00

224 lines
10 KiB
Bash

#!/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
if [ "$USE_GCC14" = y ] || [ "$USE_GCC15" = y ]; then
# linux-atm
rm -rf package/network/utils/linux-atm
git clone https://$github/sbwml/package_network_utils_linux-atm package/network/utils/linux-atm
# glibc
# Added the compiler flag -Wno-implicit-function-declaration to suppress
# warnings about implicit function declarations during the build process.
# This change addresses build issues in environments where some functions
# are used without prior declaration.
if [ "$ENABLE_GLIBC" = "y" ]; then
# perl
sed -i "/Target perl/i\TARGET_CFLAGS_PERL += -Wno-implicit-function-declaration -Wno-int-conversion\n" feeds/packages/lang/perl/Makefile
sed -i '/HOST_BUILD_PARALLEL/aPKG_BUILD_FLAGS:=no-mold' feeds/packages/lang/perl/Makefile
# lucihttp
sed -i "/TARGET_CFLAGS/i\TARGET_CFLAGS += -Wno-implicit-function-declaration" feeds/luci/contrib/package/lucihttp/Makefile
# rpcd
sed -i "/TARGET_LDFLAGS/i\TARGET_CFLAGS += -Wno-implicit-function-declaration" package/system/rpcd/Makefile
# ucode-mod-lua
sed -i "/Build\/Configure/i\TARGET_CFLAGS += -Wno-implicit-function-declaration" feeds/luci/contrib/package/ucode-mod-lua/Makefile
# luci-base
sed -i "s/-DNDEBUG/-DNDEBUG -Wno-implicit-function-declaration/g" feeds/luci/modules/luci-base/src/Makefile
# uhttpd
sed -i "/Package\/uhttpd\/install/i\TARGET_CFLAGS += -Wno-implicit-function-declaration\n" package/network/services/uhttpd/Makefile
# shadow
sed -i '/TARGET_LDFLAGS/d' feeds/packages/utils/shadow/Makefile
sed -i 's/libxcrypt/openssl/g' feeds/packages/utils/shadow/Makefile
fi
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