From 154d51d04cfa26baddea4aa270d6c5ec51dc80cf Mon Sep 17 00:00:00 2001 From: Dmitry Ilyin Date: Thu, 18 Aug 2022 12:19:34 +0300 Subject: [PATCH] Determine toolchain archive name based on profile (#365) --- .github/workflows/hi3516ev200_matrix.yml | 141 +++++++++++++++-------- Makefile | 6 +- scripts/show_toolchains.sh | 110 ++++++++++++------ 3 files changed, 173 insertions(+), 84 deletions(-) diff --git a/.github/workflows/hi3516ev200_matrix.yml b/.github/workflows/hi3516ev200_matrix.yml index 3a2cb515..ff7435c4 100644 --- a/.github/workflows/hi3516ev200_matrix.yml +++ b/.github/workflows/hi3516ev200_matrix.yml @@ -19,44 +19,26 @@ on: jobs: toolchain: - name: Build toolchain + name: Toolchain runs-on: ubuntu-latest - env: - FAMILY: hi3516ev200 + NEEDED: true - outputs: - sdk-file: ${{ steps.build-sdk.outputs.sdk-file }} + strategy: + fail-fast: false + matrix: + platform: + - hi3516cv500 + - hi3516ev200 steps: - name: Checkout - id: checkout uses: actions/checkout@v3 with: fetch-depth: 0 # OR "2" -> To retrieve the preceding commit. - - name: Install build dependencies - run: | - make install-deps - mkdir -p tmp - if [ ! -z "$ACT" ]; then - apt install -y cpio rsync bc - echo "FORCE_UNSAFE_CONFIGURE=1" >> $GITHUB_ENV - else - # https://github.com/actions/runner-images/issues/2577 - echo "1.1.1.1 invisible-mirror.net" | sudo tee -a /etc/hosts - fi - - - name: Free disk space - if: ${{ !env.ACT }} - run: | - sudo apt clean - docker rmi $(docker image ls -aq) - df -h - - - name: Build Buildroot SDK - id: build-sdk + - name: Determine toolchain name and can we skip build run: | HEAD_TAG=$(git tag --points-at HEAD) GIT_HASH=$(git rev-parse --short $GITHUB_SHA) @@ -75,21 +57,51 @@ jobs: echo "PRERELEASE=$PRERELEASE" >> $GITHUB_ENV make prepare - make BOARD=unknown_unknown_${FAMILY}_openipc br-sdk + TOOLNAME=$(make BOARD=unknown_unknown_${{ matrix.platform }}_openipc toolname) + echo "TOOLNAME=$TOOLNAME" >> $GITHUB_ENV + CHECK=$(curl -o /dev/null --silent -Iw '%{http_code}' \ + https://github.com/${GITHUB_REPOSITORY}/${TAG_NAME}/${TOOLNAME}.tgz) + if [ "$CHECK" == "302" ]; then + echo "NEEDED=false" >> $GITHUB_ENV + fi + + - name: Install build dependencies + if: env.NEEDED + run: | + make install-deps + if [ ! -z "$ACT" ]; then + echo "FORCE_UNSAFE_CONFIGURE=1" >> $GITHUB_ENV + else + # https://github.com/actions/runner-images/issues/2577 + echo "1.1.1.1 invisible-mirror.net" | sudo tee -a /etc/hosts + fi + + - name: Free disk space + if: ${{ !env.ACT && env.NEEDED }} + run: | + sudo apt clean + docker rmi $(docker image ls -aq) + + - name: Build Buildroot SDK + if: env.NEEDED + run: | + make BOARD=unknown_unknown_${{ matrix.platform }}_openipc br-sdk SDK_PATH=$(find output/images -name "*_sdk-buildroot.tar.gz") + # Why do we need this crap (only for weird artifact names)? + NEW="$(dirname $SDK_PATH)/${TOOLNAME}.tgz" + mv $SDK_PATH $NEW + SDK_PATH=$NEW echo "SDK_PATH=$SDK_PATH" >> $GITHUB_ENV - SDK_FILE=$(basename $SDK_PATH) - echo "SDK_FILE=$SDK_FILE" >> $GITHUB_ENV - echo "::set-output name=sdk-file::$SDK_FILE" - uses: actions/upload-artifact@v3 + if: ${{ (env.ACT || github.event_name == 'pull_request') && env.NEEDED }} with: - name: ${{ env.SDK_FILE }} + name: '${{ env.TOOLNAME }}.tgz' path: ${{ env.SDK_PATH }} retention-days: 1 - name: Create release - if: ${{ !env.ACT && github.event_name != 'pull_request' }} + if: ${{ !env.ACT && github.event_name != 'pull_request' && env.NEEDED }} uses: actions/create-release@v1 continue-on-error: true env: @@ -101,19 +113,21 @@ jobs: prerelease: ${{ env.PRERELEASE }} - name: Upload SDK to release - if: ${{ !env.ACT && github.event_name != 'pull_request' }} + if: ${{ !env.ACT && github.event_name != 'pull_request' && env.NEEDED }} uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: ${{ env.SDK_PATH }} - asset_name: ${{ env.SDK_FILE }} + asset_name: '${{ env.TOOLNAME }}.tgz' tag: ${{ env.TAG_NAME }} overwrite: true buildroot: - name: Build firmware + name: Firmware needs: toolchain runs-on: ubuntu-latest + env: + FURRY: ${{ secrets.FURRY }} strategy: fail-fast: false @@ -138,17 +152,25 @@ jobs: steps: - name: Checkout - id: checkout uses: actions/checkout@v3 with: fetch-depth: 0 # OR "2" -> To retrieve the preceding commit. + - name: Checkout deps + if: ${{ env.FURRY != '' }} + uses: actions/checkout@v3 + with: + repository: furry-disco/deps + fetch-depth: 0 # OR "2" -> To retrieve the preceding commit. + path: deps + submodules: recursive + ssh-key: ${{ secrets.FURRY }} + - name: Install build dependencies run: | make install-deps - mkdir -p tmp + ls -l deps || true if [ ! -z "$ACT" ]; then - apt install -y cpio rsync bc echo "FORCE_UNSAFE_CONFIGURE=1" >> $GITHUB_ENV else # https://github.com/actions/runner-images/issues/2577 @@ -160,10 +182,8 @@ jobs: run: | sudo apt clean docker rmi $(docker image ls -aq) - df -h - name: Prepare buildroot - id: prepare run: | HEAD_TAG=$(git tag --points-at HEAD) GIT_HASH=$(git rev-parse --short $GITHUB_SHA) @@ -182,11 +202,17 @@ jobs: echo "RELEASE_NAME=$RELEASE_NAME" >> $GITHUB_ENV echo "PRERELEASE=$PRERELEASE" >> $GITHUB_ENV echo "BRANCH=$BRANCH" >> $GITHUB_ENV + + - name: Determine toolchain name + run: | make prepare + TOOLNAME=$(make BOARD=unknown_unknown_${{ matrix.platform }}_openipc toolname) + echo "TOOLNAME=$TOOLNAME" >> $GITHUB_ENV - uses: actions/download-artifact@v3 + if: ${{ (env.ACT || github.event_name == 'pull_request') }} with: - name: ${{ needs.toolchain.outputs.sdk-file }} + name: '${{ env.TOOLNAME }}.tgz' - name: Build firmware run: | @@ -205,19 +231,36 @@ jobs: CONF_PATH=$(find . -name "${BOARD}_defconfig") - echo Using ${{ needs.toolchain.outputs.sdk-file }} + echo Using $TOOLNAME + if [ ! -f "$TOOLNAME.tgz" ]; then + wget https://github.com/${GITHUB_REPOSITORY}/${TAG_NAME}/${TOOLNAME}.tgz + fi + echo "BR2_TOOLCHAIN_EXTERNAL=y" >> $CONF_PATH echo "BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y" >> $CONF_PATH echo "BR2_TOOLCHAIN_EXTERNAL_PREINSTALLED=y" >> $CONF_PATH echo "BR2_TOOLCHAIN_EXTERNAL_PATH=\"/tmp/extsdk\"" >> $CONF_PATH - echo "BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX=\"arm-openipc-linux-musleabi\"" >> $CONF_PATH - echo "BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y" >> $CONF_PATH - echo "BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_9=y" >> $CONF_PATH - echo "BR2_TOOLCHAIN_EXTERNAL_GCC_8=y" >> $CONF_PATH - LIBC="musl" + + LIBC=$(echo $TOOLNAME | cut -d '-' -f 3) + PREFIX="arm-openipc-linux-" + case "$LIBC" in + musl|uclibc) + PREFIX="${PREFIX}${LIBC}eabi" + ;; + glibc) + PREFIX="${PREFIX}gnueabi" + ;; + esac + echo "BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX=\"${PREFIX}\"" >> $CONF_PATH + CAP_LIBC=$(echo $LIBC | tr a-z A-Z) + echo "BR2_TOOLCHAIN_EXTERNAL_CUSTOM_${CAP_LIBC}=y" >> $CONF_PATH + LXHDRS=$(echo $TOOLNAME | cut -d '-' -f 4) + echo "BR2_TOOLCHAIN_EXTERNAL_HEADERS_${LXHDRS}=y" >> $CONF_PATH + GCC_VER=$(echo $TOOLNAME | cut -d '-' -f 2) + echo "BR2_TOOLCHAIN_EXTERNAL_GCC_${GCC_VER:3:1}=y" >> $CONF_PATH echo "BR2_ROOTFS_POST_BUILD_SCRIPT=\"\$(TOPDIR)/../scripts/executing_commands_for_${LIBC}.sh\"" >> $CONF_PATH mkdir /tmp/extsdk - tar xvf ${{ needs.toolchain.outputs.sdk-file }} --strip-components=1 -C /tmp/extsdk >/dev/null + tar xvf ${TOOLNAME}.tgz --strip-components=1 -C /tmp/extsdk >/dev/null HAS_NAND=$(make BOARD=${BOARD} has-nand) echo "HAS_NAND=$HAS_NAND" >> $GITHUB_ENV diff --git a/Makefile b/Makefile index c84de8a3..2d3c9d41 100644 --- a/Makefile +++ b/Makefile @@ -56,7 +56,8 @@ $(BR_DIR): $(ROOT_DIR)/buildroot-$(BR_VER).tar.gz install-deps: - DEBIAN_FRONTEND=noninteractive sudo apt-get update && sudo apt-get -y install build-essential make libncurses-dev wget + DEBIAN_FRONTEND=noninteractive sudo apt-get update && \ + sudo apt-get -y install build-essential make libncurses-dev wget cpio rsync bc %_info: @@ -73,6 +74,9 @@ buildroot-version: has-nand: @sed -rn "s/^BR2_TARGET_ROOTFS_UBI=(y)/\1/p" $(FULL_PATH) +toolname: + @$(SCRIPTS_DIR)/show_toolchains.sh $(FULL_PATH) $(BR_VER) + list-configs: @echo @ls -1 $(BR_EXT_DIR)/configs diff --git a/scripts/show_toolchains.sh b/scripts/show_toolchains.sh index b3296533..14cb247a 100755 --- a/scripts/show_toolchains.sh +++ b/scripts/show_toolchains.sh @@ -2,41 +2,83 @@ shopt -s nullglob -if [ $# -eq 0 ]; then - $0 1 | sort - #$0 1 | sort | uniq -else - for D in br-ext-chip-*; do - for CF in $D/configs/*; do - BR2_VER=$(grep BR2_DEFAULT_KERNEL_VERSION $CF) - if [ ! -z $BR2_VER ]; then - VENDOR=$(echo $CF | cut -d - -f 4 | cut -d / -f 1 | sed -r 's/\<./\U&/g') - VER=$(echo $BR2_VER | cut -d \" -f 2 | awk -F . '{printf "%s_%s", $1, $2}') - GCC_VER=$(sed -rn "s/^BR2_GCC_VERSION_([0-9]*)_X=y/\1/p" $CF) - ARCH=$(sed -rn "s/^BR2_(arm[a-z0-9_]+)=y/\1/p" $CF) - if [ -z "$ARCH" ]; then - ARCH=$(sed -rn "s/^BR2_(cortex_[a-z0-9_]+)=y/\1/p" $CF) - fi - if [ -z "$ARCH" ]; then - ARCH=$(sed -rn "s/^BR2_(arm)=y/\1/p" $CF) - else - # Here we have something from ARM modern family - HF=$(sed -rn "s/^BR2_ARM_EABI(HF)=y/\1/p" $CF | tr '[:upper:]' '[:lower:]') - if [ ! -z "$HF" ]; then - ARCH="${ARCH}_${HF}" - fi - fi +toolchain_by_config() { + CF=$1 + FMT=$2 - if [ -z "$ARCH" ]; then - ARCH=$(sed -rn "s/^BR2_(mips_[a-z]*)=y/\1/p" $CF) - fi - - LIBC=$(sed -rn "s/^BR2_TOOLCHAIN_BUILDROOT_LIBC=\"(.*)\"/\1/p" $CF) - - SOC=$(echo $CF | cut -d _ -f 3) - # $GCC_VER - echo $ARCH $LIBC $VER $VENDOR $CF + BR2_VER=$(grep BR2_DEFAULT_KERNEL_VERSION $CF) + if [ ! -z $BR2_VER ]; then + VENDOR=$(echo $CF | cut -d - -f 4 | cut -d / -f 1 | sed -r 's/\<./\U&/g') + KVER=$(echo $BR2_VER | cut -d \" -f 2 | awk -F . '{printf "%s_%s", $1, $2}') + GCC_VER=$(sed -rn "s/^BR2_GCC_VERSION_([0-9]*)_X=y/\1/p" $CF) + ARCH=$(sed -rn "s/^BR2_(arm[a-z0-9_]+)=y/\1/p" $CF) + if [ -z "$ARCH" ]; then + ARCH=$(sed -rn "s/^BR2_(cortex_[a-z0-9_]+)=y/\1/p" $CF) + fi + if [ -z "$ARCH" ]; then + ARCH=$(sed -rn "s/^BR2_(arm)=y/\1/p" $CF) + else + # Here we have something from ARM modern family + HF=$(sed -rn "s/^BR2_ARM_EABI(HF)=y/\1/p" $CF | tr '[:upper:]' '[:lower:]') + if [ ! -z "$HF" ]; then + ARCH="${ARCH}_${HF}" fi + fi + + if [ -z "$ARCH" ]; then + ARCH=$(sed -rn "s/^BR2_(mips_[a-z]*)=y/\1/p" $CF) + fi + + LIBC=$(sed -rn "s/^BR2_TOOLCHAIN_BUILDROOT_LIBC=\"(.*)\"/\1/p" $CF) + + SOC=$(echo $CF | cut -d _ -f 3) + case $FMT in + list) + echo $ARCH $GCC_VER $LIBC $KVER $VENDOR $CF + ;; + uniq) + echo $ARCH $GCC_VER $LIBC $KVER + ;; + *) + if [ ! -z "$2" ]; then + BR_DIR=buildroot-$2 + GCC_VER=$(sed -rn \ + "s/^\s+default\s+\"([0-9.]+)\"\s+if BR2_GCC_VERSION_${GCC_VER}_X/\1/p" \ + $BR_DIR/package/gcc/Config.in.host) + case $LIBC in + musl) + VER=$(sed -rn "s/^MUSL_VERSION\s*=\s*([0-9.]+)/\1/p" \ + $BR_DIR/package/musl/musl.mk) + ;; + uclibc) + VER=$(sed -rn "s/^UCLIBC_VERSION\s*=\s*([0-9.]+)/\1/p" \ + $BR_DIR/package/uclibc/uclibc.mk) + ;; + glibc) + VER=$(sed -rn "s/^GLIBC_VERSION\s*=\s*([0-9.]+).*/\1/p" \ + $BR_DIR/package/glibc/glibc.mk | tail -1) + ;; + esac + HASH=$(echo $VER | sha1sum | cut -c 1-8) + echo ${ARCH}-gcc${GCC_VER}-${LIBC}-${KVER}-${HASH} + else + echo ${ARCH}-gcc${GCC_VER}-${LIBC}-${KVER} + fi + ;; + esac + fi +} + +if [ $# -eq 0 ]; then + $0 list | sort +else + if [ "$1" != "list" ] && [ "$1" != "uniq" ]; then + toolchain_by_config $1 $2 + else + for D in br-ext-chip-*; do + for CF in $D/configs/*; do + toolchain_by_config $CF $1 + done done - done + fi fi