Compare commits

..
42 Commits
Author SHA1 Message Date
remittor 1d4e85a28d xmake: Fix dropbear downgrade 2026-01-04 19:43:40 +03:00
remittor 1aa0b402c5 build: Enable use_cache by default 2026-01-04 12:04:05 +03:00
remittor ca4573f31f build: Fix reuse cache and rename env PACKAGE_DIR 2026-01-03 21:05:22 +03:00
remittor f01482890b build: Add step "Set fixed workspace" 2026-01-02 18:59:05 +03:00
remittor 510a31e7ec build: Add step "Fix time stamps into restored dirs" 2026-01-02 16:44:12 +03:00
remittor 8f6a81ecd2 build: Add step "Configure 2" 2026-01-02 15:50:43 +03:00
remittor 68cb027109 build: Fix restore cache and disable step "Kernel compile" 2026-01-02 12:58:09 +03:00
remittor acff39477b build: Fix save and restore cache for host tools 2026-01-01 22:28:00 +03:00
remittor e57e548f61 xmake: Fix install fantastic packages keys and src 2026-01-01 21:12:16 +03:00
remittor eb978ba58e build: Fix kernel step 2026-01-01 20:19:22 +03:00
remittor 61f33e4c33 proxy: Delete tpws, mdig, ip2set packages 2026-01-01 17:06:01 +03:00
remittor 0a66ad1f3a build: Add step "Download sources (dl)" 2026-01-01 16:48:14 +03:00
remittor e67a3d001b build: Add new option "Use cache for host tools'" 2026-01-01 15:50:28 +03:00
remittor b01b370c51 build: Fix key of cache 2026-01-01 12:43:21 +03:00
remittor 75542fe301 build: Fix cache steps 2026-01-01 11:44:10 +03:00
remittor 8739c51995 build: Disable step "Cache toolchain" and fix host dir 2025-12-31 22:52:42 +03:00
remittor ea8d7eea5f build: Add show CPU cores 2025-12-31 19:48:32 +03:00
remittor 1d93b461b7 build: Add step "Increase swap" and "Check OOM error" 2025-12-31 19:27:22 +03:00
remittor cfc8241f53 build: Add option save-always: true 2025-12-31 19:13:43 +03:00
remittor 8c2f6fd7de build: Add step "Monitor memory" 2025-12-31 18:57:30 +03:00
remittor e021297496 build: Disable step "Cache downloads" 2025-12-31 16:12:04 +03:00
remittor 0cb316891c build: Add step "Save cache for toolchain" and "Save cache for tools" 2025-12-31 15:32:49 +03:00
remittor aed5f171a8 builf: Add step "Check for failed builds" 2025-12-31 15:14:43 +03:00
remittor 08cccf41b7 build: Fix using github cache (also on failure) 2025-12-31 15:03:41 +03:00
remittor e6e97ddbc8 build: Fix G_TARGET_ARCH 2025-12-31 14:16:48 +03:00
remittor b650894e8a build: Add option first_kernel_compile 2025-12-31 14:07:15 +03:00
remittor 78cc0dee60 build: Use github cache for dl, tools and toolchain 2025-12-31 11:54:48 +03:00
remittor 0b066fe854 Revert "xmake: Fix warning "your configuration is out of sync""
This reverts commit b788e7e165.
2025-12-31 09:51:06 +03:00
remittor 67e187b849 build: Delete env.BUILD_ROOT 2025-12-31 09:45:30 +03:00
remittor ef5e7155b5 build: Fix dependencies and disable step "Download tools" 2025-12-30 16:53:59 +03:00
remittor b788e7e165 xmake: Fix warning "your configuration is out of sync" 2025-12-30 16:51:50 +03:00
remittor a775b82e5b build: Add step "Download tools and toolchain" 2025-12-30 14:13:45 +03:00
remittor f9ab8e3841 build: Add make tools and toolchain 2025-12-30 08:45:47 +03:00
remittor 4e7389f304 build: Add option PACKAGE_DIR 2025-12-30 08:17:47 +03:00
remittor 887d928a4b build: Add configure step 2025-12-29 19:22:58 +03:00
remittor 5167d394e1 build: Add test_build option 2025-12-29 12:53:00 +03:00
remittor dd3a9395f2 xmake: Downgrade dropbear to 2024.86 2025-12-28 11:28:07 +03:00
remittor 2f112defb4 build: Fix branch name 2025-12-27 19:29:18 +03:00
remittor 9104838c9b addons: Fix download zapret2 packages 2025-12-27 17:51:09 +03:00
remittor 4e60cabc73 addons: Update sources for packages 2025-12-26 16:32:36 +03:00
remittor 295d495e81 build: Adapt for OpenWrt 25.12 2025-12-26 15:21:00 +03:00
remittor d147c0c72d xmake: Adapt fantastic packages for 25.12 2025-12-26 15:17:36 +03:00
26 changed files with 133 additions and 303 deletions

No files matched your search

+31 -124
View File
@@ -42,14 +42,6 @@ on:
options: options:
- true - true
- false - false
trx_build:
description: 'TRX images build'
required: true
default: 'false'
type: choice
options:
- true
- false
suffix: suffix:
description: 'TAG suffix' description: 'TAG suffix'
required: false required: false
@@ -58,13 +50,14 @@ on:
env: env:
TEST_BUILD: ${{ github.event.inputs.test_build == 'true' }} TEST_BUILD: ${{ github.event.inputs.test_build == 'true' }}
FAKE_BUILD: ${{ github.event.inputs.fake_build == 'true' }}
TAG_SUFFIX: ${{ github.event.inputs.fake_build == 'true' && '-fake' || github.event.inputs.test_build == 'true' && '-test' || '' }} TAG_SUFFIX: ${{ github.event.inputs.fake_build == 'true' && '-fake' || github.event.inputs.test_build == 'true' && '-test' || '' }}
TARGET_NAME: ${{ github.event.inputs.target_name }} TARGET_NAME: ${{ github.event.inputs.target_name }}
G_PKG_DIR: ${{ github.event.inputs.package_dir }} G_PKG_DIR: ${{ github.event.inputs.package_dir }}
REPO_URL: https://github.com/openwrt-xiaomi/openwrt REPO_URL: https://github.com/openwrt-xiaomi/openwrt
REPO_LNK: openwrt-xiaomi/openwrt REPO_LNK: openwrt-xiaomi/openwrt
REPO_BRANCH: xq-24.10 REPO_BRANCH: xq-25.12
TAG_PREFIX: v24- TAG_PREFIX: v25-
TZ: UTC TZ: UTC
DEVICE_NAME: unknown DEVICE_NAME: unknown
BUILD_DATE: unknown BUILD_DATE: unknown
@@ -164,9 +157,8 @@ jobs:
- rt-ax57m - rt-ax57m
- rt-ax59u - rt-ax59u
- rt-ax89x - rt-ax89x
- tuf-ax4200 - tuf_ax4200
- tuf-ax4200q - tuf_ax6000
- tuf-ax6000
- zen-bt8 - zen-bt8
isTest: isTest:
- ${{ needs.check.outputs.test_build == 'true' }} - ${{ needs.check.outputs.test_build == 'true' }}
@@ -211,31 +203,6 @@ jobs:
- name: Checkout builder - name: Checkout builder
uses: actions/checkout@main uses: actions/checkout@main
- name: Prepare env params
env:
INP_FAKE_BUILD: ${{ github.event.inputs.fake_build == 'true' }}
INP_TRX_BUILD: ${{ github.event.inputs.trx_build == 'true' }}
TARGET: ${{ matrix.target }}
run: |
FAKE_BUILD=$INP_FAKE_BUILD
TRX_BUILD=false
if [ "$INP_TRX_BUILD" = true ]; then
CFG="./_initramfs/$TARGET.config"
if [ -f "$CFG" ]; then
TRX_BUILD=true
echo "Start TRX build for $CFG"
echo "OPT_INITRAMFS=-i" >> $GITHUB_ENV
else
FAKE_BUILD=true
echo "Start FAKE build for $TARGET"
echo "SKIP_ME=true" >> $GITHUB_ENV
fi
fi
echo "FAKE_BUILD = $FAKE_BUILD"
echo "TRX_BUILD = $TRX_BUILD"
echo "FAKE_BUILD=$FAKE_BUILD" >> $GITHUB_ENV
echo "TRX_BUILD=$TRX_BUILD" >> $GITHUB_ENV
- name: Download OpenWrt sources - name: Download OpenWrt sources
run: | run: |
git clone --branch $REPO_BRANCH $REPO_URL.git openwrt git clone --branch $REPO_BRANCH $REPO_URL.git openwrt
@@ -246,7 +213,8 @@ jobs:
- name: Init builder - name: Init builder
run: | run: |
chmod +x *.sh chmod +x *.sh
wget https://github.com/fantastic-packages/packages/raw/refs/heads/24.10/keys/usign/53FF2B6672243D28.pub #wget https://github.com/fantastic-packages/packages/raw/refs/heads/master/keys/apksign/20241123170031.pub
wget https://fantastic-packages.github.io/releases/25.12/20241123170031.pub
- name: Update OpenWrt packages - name: Update OpenWrt packages
id: update id: update
@@ -323,7 +291,7 @@ jobs:
TARGET: ${{ matrix.target }} TARGET: ${{ matrix.target }}
FW_VER: ${{ needs.check.outputs.fw_ver }} FW_VER: ${{ needs.check.outputs.fw_ver }}
run: | run: |
./xmake.sh $OPT_INITRAMFS -I -t $TARGET ./xmake.sh -I -t $TARGET
G_DEVICE_NAME=$( grep -so '^CONFIG_TARGET.*DEVICE.*=y' .config | sed -r 's/.*DEVICE_(.*)=y/\1/' ) G_DEVICE_NAME=$( grep -so '^CONFIG_TARGET.*DEVICE.*=y' .config | sed -r 's/.*DEVICE_(.*)=y/\1/' )
[ -z "$G_DEVICE_NAME" ] && exit 31 [ -z "$G_DEVICE_NAME" ] && exit 31
G_BOARD_NAME=$( grep -so '^CONFIG_TARGET_BOARD=.*' .config | cut -d'"' -f2 ) G_BOARD_NAME=$( grep -so '^CONFIG_TARGET_BOARD=.*' .config | cut -d'"' -f2 )
@@ -369,7 +337,7 @@ jobs:
- name: Download sources (dl) - name: Download sources (dl)
id: download id: download
if: ${{ steps.configure.outputs.status == 'success' && env.FAKE_BUILD != 'true' }} if: ${{ steps.configure.outputs.status == 'success' && github.event.inputs.fake_build != 'true' }}
run: | run: |
make -j$(nproc) download make -j$(nproc) download
echo "status=success" >> $GITHUB_OUTPUT echo "status=success" >> $GITHUB_OUTPUT
@@ -386,7 +354,7 @@ jobs:
- name: Build tools and toolchain - name: Build tools and toolchain
id: tools id: tools
if: ${{ steps.configure.outputs.status == 'success' && env.FAKE_BUILD != 'true' }} if: ${{ steps.configure.outputs.status == 'success' && github.event.inputs.fake_build != 'true' }}
run: | run: |
make toolchain/install -j$(nproc) make toolchain/install -j$(nproc)
echo "status=success" >> $GITHUB_OUTPUT echo "status=success" >> $GITHUB_OUTPUT
@@ -408,14 +376,14 @@ jobs:
TARGET: ${{ matrix.target }} TARGET: ${{ matrix.target }}
run: | run: |
make clean make clean
./xmake.sh $OPT_INITRAMFS -I -t $TARGET ./xmake.sh -I -t $TARGET
mkdir -p logs mkdir -p logs
cp -f .config logs/config2 cp -f .config logs/config2
[ -f config1 ] && cp -f config1 logs/config1 [ -f config1 ] && cp -f config1 logs/config1
- name: Kernel compile - name: Kernel compile
id: kernel id: kernel
if: ${{ steps.tools.outputs.status == 'success' && env.FAKE_BUILD != 'true' }} if: ${{ steps.tools.outputs.status == 'success' && github.event.inputs.fake_build != 'true' }}
run: | run: |
make target/linux/compile -j$(nproc) make target/linux/compile -j$(nproc)
echo "status=success" >> $GITHUB_OUTPUT echo "status=success" >> $GITHUB_OUTPUT
@@ -450,57 +418,29 @@ jobs:
make V=sc world make V=sc world
fi fi
fi fi
echo "status=success" >> $GITHUB_OUTPUT # process results
OUT_DIR=bin/targets/$G_BOARD_NAME/$G_SUBTARGET_NAME
- name: Process out results if [ "$FAKE_BUILD" = "true" ]; then
id: install
if: steps.compile.outputs.status == 'success' || env.FAKE_BUILD == 'true'
env:
TARGET: ${{ matrix.target }}
OUT_DIR: ./bin/targets/${{ env.G_BOARD_NAME }}/${{ env.G_SUBTARGET_NAME }}
run: |
if [ "$FAKE_BUILD" = true ]; then
mkdir -p logs mkdir -p logs
mkdir -p "$OUT_DIR" mkdir -p $OUT_DIR
cd "$OUT_DIR" echo "$G_BOARD_NAME $G_SUBTARGET_NAME $G_DEVICE_NAME" > "$OUT_DIR/$G_DEVICE_NAME.txt"
echo "$G_BOARD_NAME $G_SUBTARGET_NAME $G_DEVICE_NAME" > "$G_DEVICE_NAME.txt" touch "$OUT_DIR/kernel-debug.tar.zst"
touch FAKE_BUILD.bin
touch kernel-debug.tar.zst
BLD_VER=$FW_VER BLD_VER=$FW_VER
else else
if [ ! -d "$OUT_DIR" ]; then BLD_VER=$( cat $OUT_DIR/profiles.json | grep -so '"version_number":"[^"]*' | grep -so '[^"]*$' )
echo "OUT_DIR not found!"
exit 99
fi
cd "$OUT_DIR"
BLD_VER=$( cat profiles.json | grep -so '"version_number":"[^"]*' | grep -so '[^"]*$' )
fi
if [ "$SKIP_ME" = true ]; then
touch FLAG-SKIP_ME
fi
if [ "$TRX_BUILD" = true ]; then
touch FLAG-TRX_BUILD
fi fi
echo "Firmware $BLD_VER [$FILE_DATE] builded!" echo "Firmware $BLD_VER [$FILE_DATE] builded!"
if [ ! -f kernel-debug.tar.zst ]; then if [ ! -f $OUT_DIR/kernel-debug.tar.zst ]; then
echo "File kernel-debug.tar.zst not found!" echo "File kernel-debug.tar.zst not found!"
exit 100 exit 100
fi fi
if [ "$TRX_BUILD" = true ]; then
find . -maxdepth 1 -type f ! -name '*-initramfs*' ! -name 'FLAG-*' -delete
VER_MAJOR=$( echo "$BLD_VER" | cut -d. -f1 )
STD_IMG_DIR="openwrt-initramfs-bin-for-luci"
mkdir $STD_IMG_DIR
find . -maxdepth 1 -type f -name '*-initramfs*.bin' -exec mv -f {} $STD_IMG_DIR/openwrt-${VER_MAJOR}_${TARGET}_initramfs.bin \;
find . -maxdepth 1 -type f -name '*-initramfs*.trx' -exec mv -f {} openwrt-${VER_MAJOR}_${TARGET}_initramfs.trx \;
fi
echo "status=success" >> $GITHUB_OUTPUT echo "status=success" >> $GITHUB_OUTPUT
echo "FW_BUILD_OK=1" >> $GITHUB_ENV echo "FW_BUILD_OK=1" >> $GITHUB_ENV
echo "BLD_VER=$BLD_VER" >> $GITHUB_ENV echo "BLD_VER=$BLD_VER" >> $GITHUB_ENV
echo "OUT_DIR=$OUT_DIR" >> $GITHUB_ENV echo "OUT_DIR=$OUT_DIR" >> $GITHUB_ENV
- name: Mark firmware build failed - name: Mark firmware build failed
if: false # steps.install.outcome == 'failure' || steps.compile.outcome == 'failure' if: false # steps.compile.outcome == 'failure'
run: | run: |
echo "Firmware build failed, continuing pipeline" echo "Firmware build failed, continuing pipeline"
echo "FW_BUILD_OK=0" >> $GITHUB_ENV echo "FW_BUILD_OK=0" >> $GITHUB_ENV
@@ -531,7 +471,7 @@ jobs:
tar -cJvf logs-$TARGET-$FW_DATE.tar.xz logs tar -cJvf logs-$TARGET-$FW_DATE.tar.xz logs
- name: Cleanup OUT directory - name: Cleanup OUT directory
if: steps.install.outputs.status == 'success' if: steps.compile.outputs.status == 'success'
env: env:
OUT_DIR: ${{ env.OUT_DIR }} OUT_DIR: ${{ env.OUT_DIR }}
run: | run: |
@@ -551,7 +491,7 @@ jobs:
- name: Upload OUT directory - name: Upload OUT directory
uses: actions/upload-artifact@main uses: actions/upload-artifact@main
if: steps.install.outputs.status == 'success' if: steps.compile.outputs.status == 'success'
with: with:
name: openwrt-${{ env.BLD_VER }}-${{ needs.check.outputs.build_date }}-${{ env.G_DEVICE_NAME }} name: openwrt-${{ env.BLD_VER }}-${{ needs.check.outputs.build_date }}-${{ env.G_DEVICE_NAME }}
path: ${{ env.OUT_DIR }} path: ${{ env.OUT_DIR }}
@@ -590,52 +530,19 @@ jobs:
- name: Put images into zip - name: Put images into zip
run: | run: |
mkdir -p public mkdir -p public
for DIR in openwrt-*; do find . -mindepth 1 -type d -name 'openwrt-*' -exec sh -c 'zip -0 ./public/$(basename {}).zip -j {} {}/*' \;
[ -d "$DIR" ] || continue
if [ -f "$DIR/FLAG-SKIP_ME" ]; then
echo "Skip $DIR"
continue
fi
ZIP_SUFFIX=""
if [ -f "$DIR/FLAG-TRX_BUILD" ]; then
echo "TRX_BUILD=true" >> $GITHUB_ENV
ZIP_SUFFIX=".trx"
fi
rm -f "$DIR"/FLAG-*
zip_name="./public/$(basename "$DIR")${ZIP_SUFFIX}.zip"
echo "Creating $zip_name"
( cd "$DIR"; zip -0 -r "../$zip_name" . )
done
- name: Show all zip files
run: |
ls -lh ./public/*.zip ls -lh ./public/*.zip
- name: Generate names
env:
TAG: ${{ needs.check.outputs.tag }}
FW_VER: ${{ needs.check.outputs.fw_ver }}
FW_DATE: ${{ needs.check.outputs.fw_date }}
run: |
NAME="$TAG"
DESC="OpenWrt $FW_VER [$FW_DATE]"
if [ "$TRX_BUILD" = true ]; then
NAME="TRX-$TAG"
TAG="$TAG-trx"
DESC="TRX images based on $DESC"
fi
echo "REL_TAG=$TAG" >> $GITHUB_ENV
echo "REL_NAME=$NAME" >> $GITHUB_ENV
echo "REL_DESC=$DESC" >> $GITHUB_ENV
- name: Upload assets - name: Upload assets
uses: softprops/action-gh-release@v2 uses: andelf/nightly-release@main
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAG: ${{ needs.check.outputs.tag }}
with: with:
draft: ${{ env.TEST_BUILD == 'true' || github.event.inputs.fake_build == 'true' }}
prerelease: true prerelease: true
tag_name: ${{ env.REL_TAG }}${{ env.TAG_SUFFIX }} tag_name: ${{ needs.check.outputs.tag }}${{ env.TAG_SUFFIX }}
name: '${{ env.REL_NAME }}' name: '${{ needs.check.outputs.tag }}'
body: | body: |
${{ env.REL_DESC }} OpenWrt ${{ needs.check.outputs.fw_ver }} [${{ needs.check.outputs.fw_date }}]
author: [remittor](https://github.com/remittor) author: [remittor](https://github.com/remittor)
files: ./public/*.zip files: ./public/*.zip
+1 -1
View File
@@ -1,6 +1,6 @@
[![Github All Releases](https://img.shields.io/github/downloads/openwrt-xiaomi/builder/total.svg)](https://github.com/openwrt-xiaomi/builder/releases) [![Github All Releases](https://img.shields.io/github/downloads/openwrt-xiaomi/builder/total.svg)](https://github.com/openwrt-xiaomi/builder/releases)
[![Github Latest Release](https://img.shields.io/github/downloads/openwrt-xiaomi/builder/latest/total.svg)](https://github.com/openwrt-xiaomi/builder/releases)
[![ViewCount](https://views.whatilearened.today/views/github/openwrt-xiaomi/builder.svg)](https://github.com/openwrt-xiaomi/builder/releases) [![ViewCount](https://views.whatilearened.today/views/github/openwrt-xiaomi/builder.svg)](https://github.com/openwrt-xiaomi/builder/releases)
[![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Fopenwrt-xiaomi%2Fbuilder&count_bg=%2379C83D&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=hits&edge_flat=false)](https://github.com/openwrt-xiaomi/builder/releases)
[![Donations Page](https://github.com/andry81-cache/gh-content-static-cache/raw/master/common/badges/donate/donate.svg)](https://github.com/remittor/donate) [![Donations Page](https://github.com/andry81-cache/gh-content-static-cache/raw/master/common/badges/donate/donate.svg)](https://github.com/remittor/donate)
# OpenWrt builder # OpenWrt builder
File renamed without changes.
File renamed without changes.
File renamed without changes.
-4
View File
@@ -45,8 +45,6 @@ CONFIG_PACKAGE_luci-app-filemanager=y
CONFIG_PACKAGE_luci-i18n-filemanager-ru=y CONFIG_PACKAGE_luci-i18n-filemanager-ru=y
#CONFIG_PACKAGE_atftp=y #CONFIG_PACKAGE_atftp=y
#CONFIG_PACKAGE_atftpd=y #CONFIG_PACKAGE_atftpd=y
CONFIG_PACKAGE_lscpu=y
CONFIG_PACKAGE_bind-tools=y
CONFIG_PACKAGE_facinstall=y CONFIG_PACKAGE_facinstall=y
### Add-on programs ### Add-on programs
@@ -123,7 +121,6 @@ CONFIG_PACKAGE_relayd=y
CONFIG_PACKAGE_luci-proto-relay=y CONFIG_PACKAGE_luci-proto-relay=y
### Luci proto ### Luci proto
CONFIG_PACKAGE_luci-proto-gre=y
CONFIG_PACKAGE_luci-proto-3g=y CONFIG_PACKAGE_luci-proto-3g=y
CONFIG_PACKAGE_luci-proto-ipv6=y CONFIG_PACKAGE_luci-proto-ipv6=y
@@ -189,7 +186,6 @@ CONFIG_OPENSSL_WITH_MDC2=y
CONFIG_OPENSSL_WITH_WHIRLPOOL=y CONFIG_OPENSSL_WITH_WHIRLPOOL=y
### SSL certificates ### SSL certificates
CONFIG_PACKAGE_ca-bundle=y
CONFIG_PACKAGE_ca-certificates=y CONFIG_PACKAGE_ca-certificates=y
### Luci ### Luci
@@ -37,14 +37,12 @@ CONFIG_PACKAGE_uboot-envtools=y
CONFIG_PACKAGE_mtd-utils=y CONFIG_PACKAGE_mtd-utils=y
CONFIG_PACKAGE_iw=y CONFIG_PACKAGE_iw=y
CONFIG_PACKAGE_mc=y CONFIG_PACKAGE_mc=y
CONFIG_PACKAGE_rsync=y
CONFIG_PACKAGE_luci-app-ttyd=y CONFIG_PACKAGE_luci-app-ttyd=y
CONFIG_PACKAGE_luci-i18n-ttyd-ru=y CONFIG_PACKAGE_luci-i18n-ttyd-ru=y
CONFIG_PACKAGE_luci-app-filemanager=y CONFIG_PACKAGE_luci-app-filemanager=y
CONFIG_PACKAGE_luci-i18n-filemanager-ru=y CONFIG_PACKAGE_luci-i18n-filemanager-ru=y
CONFIG_PACKAGE_atftp=y CONFIG_PACKAGE_atftp=y
#CONFIG_PACKAGE_atftpd=y #CONFIG_PACKAGE_atftpd=y
CONFIG_PACKAGE_lscpu=y
CONFIG_PACKAGE_facinstall=y CONFIG_PACKAGE_facinstall=y
CONFIG_PACKAGE_kmod-mtd-rw=y CONFIG_PACKAGE_kmod-mtd-rw=y
@@ -57,7 +55,6 @@ CONFIG_PACKAGE_iperf3=y
CONFIG_PACKAGE_htop=y CONFIG_PACKAGE_htop=y
CONFIG_PACKAGE_nano=y CONFIG_PACKAGE_nano=y
CONFIG_PACKAGE_ccrypt=y CONFIG_PACKAGE_ccrypt=y
CONFIG_PACKAGE_curl=y
CONFIG_PACKAGE_wget=y CONFIG_PACKAGE_wget=y
CONFIG_PACKAGE_patch=y CONFIG_PACKAGE_patch=y
CONFIG_PACKAGE_diffutils=y CONFIG_PACKAGE_diffutils=y
@@ -67,10 +64,6 @@ CONFIG_PACKAGE_terminfo=y
CONFIG_PACKAGE_zlib=y CONFIG_PACKAGE_zlib=y
CONFIG_PACKAGE_ethtool=y CONFIG_PACKAGE_ethtool=y
### SSL certificates
CONFIG_PACKAGE_ca-bundle=y
CONFIG_PACKAGE_ca-certificates=y
### Luci ### Luci
CONFIG_LUCI_LANG_en=y CONFIG_LUCI_LANG_en=y
CONFIG_LUCI_LANG_ru=y CONFIG_LUCI_LANG_ru=y
-14
View File
@@ -1,14 +0,0 @@
CONFIG_TARGET_mediatek=y
CONFIG_TARGET_mediatek_filogic=y
CONFIG_TARGET_mediatek_filogic_DEVICE_asus_tuf-ax4200q=y
#include _addons.config
#include _base_initrd.config
#include _wifi_en.config
CONFIG_TARGET_INITRAMFS_FORCE=y
CONFIG_TARGET_ROOTFS_INITRAMFS=y
CONFIG_USES_SEPARATE_INITRAMFS=n
CONFIG_TARGET_ROOTFS_INITRAMFS_SEPARATE=n
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
View File
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
-44
View File
@@ -1,44 +0,0 @@
CONFIG_TARGET_mediatek=y
CONFIG_TARGET_mediatek_filogic=y
CONFIG_TARGET_mediatek_filogic_DEVICE_asus_tuf-ax4200q=y
#include _addons.config
#include _base.config
#include _wifi_en.config
#include _printer.config
#include _samba.config
#include _torrents.config
#include _proxy.config
#include _argon.config
#include _vpn.config
### Temp and sensors
CONFIG_PACKAGE_lm-sensors=y
CONFIG_PACKAGE_lm-sensors-detect=y
CONFIG_PACKAGE_luci-app-temp-status=y
CONFIG_PACKAGE_luci-i18n-temp-status-ru=y
CONFIG_PACKAGE_collectd-mod-sensors=y
### HDD tools
CONFIG_PACKAGE_smartmontools=y
CONFIG_PACKAGE_hdparm=y
CONFIG_PACKAGE_hd-idle=y
CONFIG_PACKAGE_luci-app-hd-idle=y
#CONFIG_PACKAGE_luci-i18n-hd-idle-ru=y
CONFIG_PACKAGE_luci-app-disks-info=y
#CONFIG_PACKAGE_luci-i18n-disks-info-ru=y
CONFIG_PACKAGE_luci-app-diskman=y
### Luci dashboard
CONFIG_PACKAGE_luci-mod-dashboard=y
CONFIG_PACKAGE_luci-i18n-dashboard-ru=y
### Network Ports viewer
CONFIG_PACKAGE_luci-app-tn-netports=y
CONFIG_PACKAGE_luci-i18n-tn-netports-ru=y
### TimeControl
CONFIG_PACKAGE_luci-app-timecontrol=m
CONFIG_PACKAGE_fantastic-feeds=m
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+99 -107
View File
@@ -15,6 +15,7 @@ OPT_FULL_REBUILD=false
KALLSYMS=false KALLSYMS=false
TESTING_KERNEL=false TESTING_KERNEL=false
BUILD_ONLY_INITRAMFS=false BUILD_ONLY_INITRAMFS=false
BUILD_SKIP_INITRAMFS=false
ONLY_INIT=false ONLY_INIT=false
while getopts "j:t:fiskTI" opt; do while getopts "j:t:fiskTI" opt; do
@@ -25,6 +26,7 @@ while getopts "j:t:fiskTI" opt; do
k) KALLSYMS=true;; k) KALLSYMS=true;;
T) TESTING_KERNEL=true;; T) TESTING_KERNEL=true;;
i) BUILD_ONLY_INITRAMFS=true;; i) BUILD_ONLY_INITRAMFS=true;;
s) BUILD_SKIP_INITRAMFS=true;;
I) ONLY_INIT=true;; I) ONLY_INIT=true;;
esac esac
done done
@@ -68,7 +70,7 @@ function build_target {
fi fi
inclst=$( get_cfg_inc_lst $CFG ) inclst=$( get_cfg_inc_lst $CFG )
for inc in $inclst; do for inc in $inclst; do
incfn=$XDIR/_cfginc/$inc incfn=$XDIR/$inc
[ ! -f $incfn ] && die "File '$inc' not found!" [ ! -f $incfn ] && die "File '$inc' not found!"
sed -i "/#include $inc/a <<LF>><<LF>>" $CFG sed -i "/#include $inc/a <<LF>><<LF>>" $CFG
sed -i "s/<<LF>>/\n/g" $CFG sed -i "s/<<LF>>/\n/g" $CFG
@@ -117,22 +119,12 @@ function build_target {
sed -i 's/ squashfs-sys/ sys/g' $XDIR/target/linux/mediatek/image/mt7622.mk sed -i 's/ squashfs-sys/ sys/g' $XDIR/target/linux/mediatek/image/mt7622.mk
sed -i 's/ squashfs-sys/ sys/g' $XDIR/target/linux/mediatek/image/mt7623.mk sed -i 's/ squashfs-sys/ sys/g' $XDIR/target/linux/mediatek/image/mt7623.mk
fi fi
fi fi
BATADV_DIR=$XDIR/feeds/luci/protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol
if [ -d $BATADV_DIR ]; then
if [ ! -f $BATADV_DIR/batadv_vlan.js ]; then
BATADV_VLAN_URL="https://github.com/luminem/luci/raw/4e0612a45e4be8c58de2bbd21c3bffbcf5252be4/protocols/luci-proto-batman-adv/htdocs/luci-static/resources/protocol/batadv_vlan.js"
curl -sSL "$BATADV_VLAN_URL" -o "$BATADV_DIR/batadv_vlan.js"
echo ">>> batman_adv patched !!!"
fi
fi
RAB_LUCI_MK=$XDIR/package/feeds/_ruantiblock/luci-app-ruantiblock/Makefile AWG_LUCI_MK=$XDIR/package/feeds/_ruantiblock/luci-app-ruantiblock/Makefile
if [ -f $RAB_LUCI_MK ]; then if [ -f $AWG_LUCI_MK ]; then
if ! grep "PKG_PROVIDES" $RAB_LUCI_MK >/dev/null ; then if ! grep "PKG_PROVIDES" $AWG_LUCI_MK >/dev/null ; then
sed -i 's/LUCI_PKGARCH:=all/LUCI_PKGARCH:=all\nPKG_PROVIDES:=luci-app-ruantiblock/g' $RAB_LUCI_MK sed -i 's/LUCI_PKGARCH:=all/LUCI_PKGARCH:=all\nPKG_PROVIDES:=luci-app-ruantiblock/g' $AWG_LUCI_MK
echo ">>> ruantiblock patched !!!"
fi fi
fi fi
@@ -143,51 +135,51 @@ function build_target {
fi fi
fi fi
PODKOP_DIR=$XDIR/package/feeds/_podkop PODKOP_MK=$XDIR/package/feeds/_podkop/podkop/Makefile
if [ -d $PODKOP_DIR ]; then if [ -f $PODKOP_MK ]; then
PODKOP_PATCH= sed -i 's/+sing-box / /g' $PODKOP_MK
PODKOP_MK=$PODKOP_DIR/podkop/Makefile sed -i 's/CONFLICTS:=.*/CONFLICTS:=/g' $PODKOP_MK
if [ -f $PODKOP_MK ] && grep -q '+sing-box' $PODKOP_MK ; then fi
sed -i 's/+sing-box / /g' $PODKOP_MK PODKOP_SH=$XDIR/package/feeds/_podkop/podkop/files/usr/bin/podkop
sed -i 's/CONFLICTS:=.*/CONFLICTS:=/g' $PODKOP_MK if [ -f $PODKOP_SH ] && ! grep -q '(which sing-box)' $PODKOP_SH ; then
PODKOP_PATCH="$PODKOP_PATCH (del depend sing-box)" sed -i '/,\\"dns_configured\\":/i [ -z "$(which sing-box)" ] && status="not installed"' $PODKOP_SH
fi echo ">>> podkop patched !!!"
PODKOP_SH=$PODKOP_DIR/podkop/files/usr/bin/podkop
if [ -f $PODKOP_SH ] && ! grep -q '(which sing-box)' $PODKOP_SH ; then
sed -i '/,\\"dns_configured\\":/i [ -z "$(which sing-box)" ] && status="not installed"' $PODKOP_SH
PODKOP_PATCH="$PODKOP_PATCH (status for sing-box)"
fi
if [ -f $PODKOP_MK ] && grep -q 'PODKOP_VERSION' $PODKOP_MK ; then
PKGVERLIST=$( git ls-remote --tags https://github.com/itdoginfo/podkop.git | awk -F/ '{print $3}' | grep -Ev '^v' | sort -V | tail -n 2 )
VER_PREV=$( sed -n '1p' <<< "$PKGVERLIST" )
VER_LATEST=$( sed -n '2p' <<< "$PKGVERLIST" )
[ -z "$VER_LATEST" ] && { echo "ERROR: cannot detect version of podkop!"; exit 1; }
sed -i 's/PKG_VERSION :=.*/PKG_VERSION:='$VER_LATEST'/g' $PODKOP_MK
PODKOP_PATCH="$PODKOP_PATCH (set ver $VER_LATEST)"
fi
PODKOP_MK=$PODKOP_DIR/luci-app-podkop/Makefile
if [ -f $PODKOP_MK ] && grep -q 'PODKOP_VERSION' $PODKOP_MK ; then
PKGVERLIST=$( git ls-remote --tags https://github.com/itdoginfo/podkop.git | awk -F/ '{print $3}' | grep -Ev '^v' | sort -V | tail -n 2 )
VER_PREV=$( sed -n '1p' <<< "$PKGVERLIST" )
VER_LATEST=$( sed -n '2p' <<< "$PKGVERLIST" )
[ -z "$VER_LATEST" ] && { echo "ERROR: cannot detect version of podkop!"; exit 1; }
sed -i 's/PKG_VERSION :=.*/PKG_VERSION:='$VER_LATEST'/g' $PODKOP_MK
PODKOP_PATCH="$PODKOP_PATCH (Set Ver $VER_LATEST)"
fi
[ "$PODKOP_PATCH" != "" ] && echo ">>> podkop patched !!! $PODKOP_PATCH"
fi fi
DROPBEAR_MK=$XDIR/package/network/services/dropbear/Makefile DROPBEAR_DIR=$XDIR/package/network/services/dropbear
DROPBEAR_MK=$DROPBEAR_DIR/Makefile
TMP_DROPBEAR_DIR=$XDIR/_dropbear2024
TMP_DROPBEAR_MK=$TMP_DROPBEAR_DIR/Makefile
if [ -f $DROPBEAR_MK ]; then if [ -f $DROPBEAR_MK ]; then
# download dropbear 2024.86 (OpenWrt v24.10)
if [ ! -f $TMP_DROPBEAR_DIR/Makefile ]; then
rm -rf $TMP_DROPBEAR_DIR
git clone --depth 1 --filter=blob:none --sparse https://github.com/openwrt/openwrt.git $TMP_DROPBEAR_DIR && (
cd $TMP_DROPBEAR_DIR
git sparse-checkout set package/network/services/dropbear
git checkout a2f0cd35ac1d15e69f4897b35c049e175dd06825 # commit 2024-12-12 https://github.com/openwrt/openwrt/commits/openwrt-25.12/package/network/services/dropbear
mv package/network/services/dropbear/* .
)
rm -rf $TMP_DROPBEAR_DIR/package
rm -rf $TMP_DROPBEAR_DIR/.git
fi
fi
if [ -f $TMP_DROPBEAR_MK ] && ! grep -q 'PKG_RELEASE:=0' $TMP_DROPBEAR_MK ; then
# patch: Disable MODERN and enable RSA/DH-SHA1 # patch: Disable MODERN and enable RSA/DH-SHA1
sed -i 's/^PKG_RELEASE:=.*/PKG_RELEASE:=0/g' $DROPBEAR_MK sed -i 's/^PKG_RELEASE:=.*/PKG_RELEASE:=0/g' $TMP_DROPBEAR_MK
sed -i '/,CONFIG_DROPBEAR_MODERN_ONLY,/d' $DROPBEAR_MK sed -i '/,CONFIG_DROPBEAR_MODERN_ONLY,/d' $TMP_DROPBEAR_MK
sed -i 's/\tCONFIG_DROPBEAR_MODERN_ONLY/ /g' $DROPBEAR_MK sed -i 's/\tCONFIG_DROPBEAR_MODERN_ONLY/ /g' $TMP_DROPBEAR_MK
sed -i 's/ CONFIG_DROPBEAR_MODERN_ONLY/ /g' $DROPBEAR_MK sed -i 's/ CONFIG_DROPBEAR_MODERN_ONLY/ /g' $TMP_DROPBEAR_MK
sed -i 's/DROPBEAR_DH_GROUP14_SHA1,0/ /g' $DROPBEAR_MK sed -i 's/DROPBEAR_DH_GROUP14_SHA1,0/ /g' $TMP_DROPBEAR_MK
sed -i 's/DROPBEAR_SHA1_HMAC,0/ /g' $DROPBEAR_MK sed -i 's/DROPBEAR_SHA1_HMAC,0/ /g' $TMP_DROPBEAR_MK
echo ">>> dropbear patched !!! (disable MODERN_ONLY)" echo ">>> dropbear patched !!! (disable MODERN_ONLY)"
fi fi
if [ -f $DROPBEAR_MK ] && [ -f $TMP_DROPBEAR_MK ] && ! cmp -s $DROPBEAR_MK $TMP_DROPBEAR_MK ; then
# downgrade dropbear to 2024.86 (OpenWrt v24.10)
rm -rf $DROPBEAR_DIR/*
cp -a $TMP_DROPBEAR_DIR/. $DROPBEAR_DIR/
echo ">>> dropbear downgraded to 2024.86 !!!"
fi
make defconfig make defconfig
@@ -224,10 +216,7 @@ function build_target {
echo -e "\nCONFIG_PACKAGE_wpad-openssl=y\n" >> $CFG echo -e "\nCONFIG_PACKAGE_wpad-openssl=y\n" >> $CFG
fi fi
DASHBRDPO=$XDIR/feeds/luci/modules/luci-mod-dashboard/po/ru/dashboard.po #DASHBRDPO=$XDIR/feeds/luci/modules/luci-mod-dashboard/po/ru/dashboard.po
if [ -f $DASHBRDPO ]; then
sed -i 's/msgid "Dashboard"/msgid "__dash_board__"/g' $DASHBRDPO
fi
DASHBRDPO=$XDIR/package/feeds/luci/luci-mod-dashboard/po/ru/dashboard.po DASHBRDPO=$XDIR/package/feeds/luci/luci-mod-dashboard/po/ru/dashboard.po
if [ -f $DASHBRDPO ]; then if [ -f $DASHBRDPO ]; then
sed -i 's/msgid "Dashboard"/msgid "__dash_board__"/g' $DASHBRDPO sed -i 's/msgid "Dashboard"/msgid "__dash_board__"/g' $DASHBRDPO
@@ -299,31 +288,29 @@ function build_target {
echo "Patch '$(basename $incfn)' result: OK" echo "Patch '$(basename $incfn)' result: OK"
done done
OPKG_DIR=$XDIR/files/etc/opkg APK_DIR=$XDIR/files/etc/apk
if [ -d $OPKG_DIR ]; then if [ -d $APK_DIR ]; then
rm -rf $OPKG_DIR rm -rf $APK_DIR
fi fi
FANT_PKG_KEY=$XDIR/53FF2B6672243D28.pub FANT_PKG_KEY=$XDIR/20241123170031.pub
if [ -f $FANT_PKG_KEY ]; then if [ -f $FANT_PKG_KEY ]; then
OPKG_SRC_DIR=$XDIR/package/system/opkg/files APK_SRC_DIR=$XDIR/package/system/apk/files
OPKG_KEYS_DIR=$OPKG_DIR/keys APK_KEYS_DIR=$APK_DIR/keys
mkdir -p $OPKG_KEYS_DIR mkdir -p $APK_KEYS_DIR
cp $FANT_PKG_KEY $OPKG_KEYS_DIR/53ff2b6672243d28 cp $FANT_PKG_KEY $APK_KEYS_DIR/fantastic-packages-20241123170031.pem
OPKG_CFEED_FN=$OPKG_DIR/customfeeds.conf APK_CFEED_FN=$APK_DIR/repositories.d/customfeeds.list
cp $OPKG_SRC_DIR/customfeeds.conf $OPKG_CFEED_FN mkdir -p $APK_DIR/repositories.d
PKG_LINK="https://fantastic-packages.github.io/packages/releases/<<VER>>/packages/<<ARCH>>" cp $APK_SRC_DIR/customfeeds.list $APK_CFEED_FN
echo "" >> $OPKG_CFEED_FN PKG_LINK="https://fantastic-packages.github.io/releases/<<VER>>/packages/<<ARCH>>"
echo "src/gz fantastic_packages_luci $PKG_LINK/luci" >> $OPKG_CFEED_FN echo "" >> $APK_CFEED_FN
echo "src/gz fantastic_packages_packages $PKG_LINK/packages" >> $OPKG_CFEED_FN echo "$PKG_LINK/luci/packages.adb" >> $APK_CFEED_FN
echo "src/gz fantastic_packages_special $PKG_LINK/special" >> $OPKG_CFEED_FN echo "$PKG_LINK/packages/packages.adb" >> $APK_CFEED_FN
echo "$PKG_LINK/special/packages.adb" >> $APK_CFEED_FN
TARGET_ARCH_PACKAGES=$( get_cfg_opt_value $CFG TARGET_ARCH_PACKAGES ) TARGET_ARCH_PACKAGES=$( get_cfg_opt_value $CFG TARGET_ARCH_PACKAGES )
[ -z "$TARGET_ARCH_PACKAGES" ] && die "Cannot find TARGET ARCH" [ -z "$TARGET_ARCH_PACKAGES" ] && die "Cannot find TARGET ARCH"
sed -i "s/<<VER>>/24.10/g" $OPKG_CFEED_FN sed -i "s/<<VER>>/25.12/g" $APK_CFEED_FN
sed -i "s/<<ARCH>>/$TARGET_ARCH_PACKAGES/g" $OPKG_CFEED_FN sed -i "s/<<ARCH>>/$TARGET_ARCH_PACKAGES/g" $APK_CFEED_FN
logmsg "Added support of Fantastic packages [https://fantastic-packages.github.io/packages]" logmsg "Added support of Fantastic packages [https://fantastic-packages.github.io/releases]"
fi
if [ $BUILD_ONLY_INITRAMFS = true ]; then
rm -f $OPKG_DIR/customfeeds.conf
fi fi
SYSCTLCONF_FN=$XDIR/files/etc/sysctl.conf SYSCTLCONF_FN=$XDIR/files/etc/sysctl.conf
@@ -354,19 +341,13 @@ function build_config {
local cfg=$1 local cfg=$1
local cfg_name=$( basename $cfg ) local cfg_name=$( basename $cfg )
local target_name=${cfg_name%.*} local target_name=${cfg_name%.*}
local initramfs=false
local board=$( get_cfg_board $cfg ) local board=$( get_cfg_board $cfg )
local subtarget=$( get_cfg_subtarget $cfg $board ) local subtarget=$( get_cfg_subtarget $cfg $board )
local device=$( get_cfg_dev_lst $cfg $board $subtarget ) local device=$( get_cfg_dev_lst $cfg $board $subtarget )
local outdir=$XDIR/bin/targets/$board/$subtarget local outdir=$XDIR/bin/targets/$board/$subtarget
echo Start build for target $cfg_name "($board-$subtarget-$device)"
if echo "$cfg" | grep -q '_initramfs/' ; then
initramfs=true build_target $cfg_name
target_name=${target_name}_initramfs
fi
echo Start build for target $target_name "($board-$subtarget-$device)"
build_target $cfg
if [ ! -f $outdir/kernel-debug.tar.zst ]; then if [ ! -f $outdir/kernel-debug.tar.zst ]; then
echo "ERROR: cannot build images for target $target_name" echo "ERROR: cannot build images for target $target_name"
@@ -381,9 +362,6 @@ function build_config {
if [ "$XTARGET" != "*" ]; then if [ "$XTARGET" != "*" ]; then
TARGETCFG=$XDIR/$XTARGET TARGETCFG=$XDIR/$XTARGET
if [ $BUILD_ONLY_INITRAMFS = true ]; then
TARGETCFG=$XDIR/_initramfs/$XTARGET
fi
XTARGET_EXT="${XTARGET##*.}" XTARGET_EXT="${XTARGET##*.}"
[ $XTARGET_EXT != config ] && TARGETCFG=$TARGETCFG.config [ $XTARGET_EXT != config ] && TARGETCFG=$TARGETCFG.config
[ ! -f $TARGETCFG ] && die "File '"`basename $TARGETCFG`"' not found!" [ ! -f $TARGETCFG ] && die "File '"`basename $TARGETCFG`"' not found!"
@@ -395,12 +373,7 @@ if [ "$XTARGET" != "*" ]; then
fi fi
XOUT=$XDIR/xout XOUT=$XDIR/xout
CFG_LIST=$( find $XDIR/* -maxdepth 1 -name '[a-z0-9]*.config' )
if [ $BUILD_ONLY_INITRAMFS = true ]; then
CFG_LIST=$( find $XDIR/_initramfs/* -maxdepth 1 -name '[a-z0-9]*.config' )
else
CFG_LIST=$( find $XDIR/* -maxdepth 1 -name '[a-z0-9]*.config' )
fi
rm -rf $XOUT rm -rf $XOUT
@@ -409,16 +382,35 @@ if [ -z "$CFG_LIST" ]; then
exit 1 exit 1
fi fi
if [ $BUILD_ONLY_INITRAMFS = true ]; then INITRAMFS_COUNT=0
echo "Start make initramfs configs!"
else
echo "Start make non initramfs configs!"
fi
clean_all
for CFG in $CFG_LIST; do for CFG in $CFG_LIST; do
build_config $CFG if [[ "$CFG" == *"_initramfs"* ]]; then
INITRAMFS_COUNT=$(( INITRAMFS_COUNT + 1 ))
fi
done done
if [ $INITRAMFS_COUNT = 0 ] && [ $BUILD_ONLY_INITRAMFS = true ]; then
echo "ERROR: Cannot found initramfs configs!"
exit 1
fi
if [ $INITRAMFS_COUNT -gt 0 ] && [ $BUILD_SKIP_INITRAMFS != true ]; then
echo "Start make initramfs configs!"
clean_all
for CFG in $CFG_LIST; do
[[ "$CFG" != *"_initramfs"* ]] && continue # process only initramfs configs
build_config $CFG
done
fi
if [ $BUILD_ONLY_INITRAMFS != true ]; then
echo "Start make non initramfs configs!"
clean_all
for CFG in $CFG_LIST; do
[[ "$CFG" == *"_initramfs"* ]] && continue # skip initramfs configs
build_config $CFG
done
fi
echo "All targets was builded!" echo "All targets was builded!"
+2 -2
View File
@@ -4,8 +4,8 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
export XDIR=$SCRIPT_DIR export XDIR=$SCRIPT_DIR
export XADDONSDIR=$XDIR/package/addons export XADDONSDIR=$XDIR/package/addons
FEEDSDIR=$XDIR/package/feeds FEEDSDIR=$XDIR/package/feeds
ADDONSCFG=$XDIR/_cfginc/_addons.config ADDONSCFG=$XDIR/_addons.config
ADDONSNSS=$XDIR/_cfginc/_addons_nss.config ADDONSNSS=$XDIR/_addons_nss.config
. ./xcommon.sh . ./xcommon.sh
File renamed without changes.