diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8f710d9..eea6317 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -222,6 +222,7 @@ jobs: exit 41 fi echo "status=success" >> $GITHUB_OUTPUT + echo "FW_VER=$FW_VER" >> $GITHUB_ENV echo "G_DEVICE_NAME=$G_DEVICE_NAME" >> $GITHUB_ENV echo "G_BOARD_NAME=$G_BOARD_NAME" >> $GITHUB_ENV echo "G_SUBTARGET_NAME=$G_SUBTARGET_NAME" >> $GITHUB_ENV @@ -233,6 +234,79 @@ jobs: cat $BUILD_ROOT/.config echo "========================" + - name: Download tools and toolchain + id: tools_download + if: steps.configure.outputs.status == 'success' + run: | + cd $BUILD_ROOT + G_TARGET_ARCH=$( grep -so '^CONFIG_TARGET_ARCH_PACKAGES=' .config | cut -d'"' -f2 ) + echo "G_TARGET_ARCH=$G_TARGET_ARCH" >> $GITHUB_ENV + echo "OpenWrt version: $FW_VER" + SDK_URL_BASE="https://downloads.openwrt.org/releases/${FW_VER}/targets/${G_BOARD_NAME}/${G_SUBTARGET_NAME}" + echo "Searching SDK at $SDK_URL_BASE" + SDK_TARBALL=$( curl -s "$SDK_URL_BASE/" | grep -oE 'openwrt-sdk-[^"]+Linux-x86_64\.tar\.(xz|zst)' | head -n1 ) + if [ -z "$SDK_TARBALL" ]; then + echo "ERROR: SDK not found for ${G_BOARD_NAME}/${G_SUBTARGET_NAME}" + exit 81 + fi + echo "Found SDK: $SDK_TARBALL" + #curl -L --fail --retry 5 --retry-delay 5 --progress-bar -o "$SDK_TARBALL" "$SDK_URL_BASE/$SDK_TARBALL" + wget --progress=dot:mega "$SDK_URL_BASE/$SDK_TARBALL" + if [[ "$SDK_TARBALL" == *.tar.xz ]]; then + tar -xf "$SDK_TARBALL" + elif [[ "$SDK_TARBALL" == *.tar.zst ]]; then + tar -I zstd -xf "$SDK_TARBALL" + else + echo "Unknown archive format: $SDK_TARBALL" + exit 82 + fi + SDK_DIR=$(tar -tf "$SDK_TARBALL" | head -n1 | cut -d/ -f1) + echo "Using SDK dir: $SDK_DIR" + rm -rf staging_dir + mv "$SDK_DIR/staging_dir" . + echo "========= staging_dir ==========" + ls -l staging_dir + echo "================================" + #cp -a "$SDK_DIR"/toolchain/* toolchain/ 2>/dev/null || true + TOOLS_DIR=staging_dir/host + touch $TOOLS_DIR/.prepared + TOOLS_STAMP_DIR=$TOOLS_DIR/stamp + TOOLS_PKGS=$( + find tools/ -maxdepth 1 -mindepth 1 -type d | while read -r d; do + mk="$d/Makefile" + [ -f "$mk" ] || continue + awk -F':=' ' + /^[[:space:]]*PKG_NAME[[:space:]]*:=/ { + v=$2 + gsub(/\r/, "", v) + gsub(/^[[:space:]]+/, "", v) + gsub(/[[:space:]]+$/, "", v) + if (v != "") print v + } + ' "$mk" + done | sort -u + ) + mkdir -p "$TOOLS_STAMP_DIR" + echo "Found host tools packages: $TOOLS_PKGS" + for pkg in $TOOLS_PKGS; do + touch "$TOOLS_STAMP_DIR/.$pkg"_installed + done + TOOLCHAIN_DIR=$( find staging_dir -maxdepth 1 -type d -name "toolchain-*" ) + echo "Found toolchain directory: $TOOLCHAIN_DIR" + #touch $TOOLCHAIN_DIR/.prepared + mkdir -p "$TOOLCHAIN_DIR/stamp" + touch $TOOLCHAIN_DIR/stamp/.binutils_installed + #touch $TOOLCHAIN_DIR/stamp/.fortify-headers_installed + touch $TOOLCHAIN_DIR/stamp/.gcc_final_installed + touch $TOOLCHAIN_DIR/stamp/.gcc_initial_installed + touch $TOOLCHAIN_DIR/stamp/.gdb_installed + #touch $TOOLCHAIN_DIR/stamp/.linux_installed + touch $TOOLCHAIN_DIR/stamp/.musl_installed + touch $TOOLCHAIN_DIR/stamp/.toolchain_compile + echo "Checking cross-compiler..." + find staging_dir -name '*gcc' | head -n 10 + echo "status=success" >> $GITHUB_OUTPUT + - name: Build tools and toolchain id: tools if: steps.configure.outputs.status == 'success' @@ -240,6 +314,7 @@ jobs: cd $BUILD_ROOT MAKE_JOBS=$(nproc) echo "$MAKE_JOBS thread compile" + export CCACHE=1 make tools/install -j$MAKE_JOBS make toolchain/install -j$MAKE_JOBS echo "status=success" >> $GITHUB_OUTPUT @@ -249,11 +324,11 @@ jobs: if: steps.tools.outputs.status == 'success' env: TARGET: ${{ matrix.target }} - FW_VER: ${{ needs.check.outputs.fw_ver }} run: | cd $BUILD_ROOT MAKE_JOBS=$(nproc) echo "$MAKE_JOBS thread compile" + export CCACHE=1 if [ "$FAKE_BUILD" != "true" -a "$TEST_BUILD" = "true" -a "$PACKAGE_DIR" != "" ]; then make $PACKAGE_DIR/compile V=sc BUILD_LOG=1 exit 99