#!/bin/bash -e # 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 # gcc15 patches curl -s https://raw.githubusercontent.com/oppen321/ZeroWrt-Action/refs/heads/master/patch/gcc-15/202-toolchain-gcc-add-support-for-GCC-15.patch | patch -p1 # fix gcc-15 if [ "$USE_GCC15" = y ]; then # Mbedtls curl -s $mirror/openwrt/patch/openwrt-6.x/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 $mirror/openwrt/patch/openwrt-6.x/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 $mirror/openwrt/patch/openwrt-6.x/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 $mirror/openwrt/patch/openwrt-6.x/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 $mirror/openwrt/patch/openwrt-6.x/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 $mirror/openwrt/patch/openwrt-6.x/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