diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml new file mode 100644 index 0000000..2576c44 --- /dev/null +++ b/.github/workflows/build-user-config.yml @@ -0,0 +1,179 @@ +name: Reusable user config build + +on: + workflow_call: + inputs: + build_matrix_path: + description: "Path to the build matrix file" + default: "build.yaml" + required: false + type: string + config_path: + description: "Path to the config directory" + default: "config" + required: false + type: string + fallback_binary: + description: "Fallback binary format, if no *.uf2 file was built" + default: "bin" + required: false + type: string + archive_name: + description: "Archive output file name" + default: "firmware" + required: false + type: string + +jobs: + matrix: + runs-on: ubuntu-latest + name: Fetch Build Keyboards + outputs: + build_matrix: ${{ env.build_matrix }} + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install yaml2json + run: python3 -m pip install remarshal + + - name: Fetch Build Matrix + run: | + echo "build_matrix=$(yaml2json '${{ inputs.build_matrix_path }}' | jq -c .)" >> $GITHUB_ENV + yaml2json "${{ inputs.build_matrix_path }}" | jq + + build: + runs-on: ubuntu-latest + container: + image: zmkfirmware/zmk-dev-arm:3.5-branch + needs: matrix + name: Build + strategy: + fail-fast: false + matrix: ${{ fromJson(needs.matrix.outputs.build_matrix) }} + steps: + - name: Install adafruit-nrfutil + run: python3 -m pip install adafruit-nrfutil + + - name: Checkout + uses: actions/checkout@v3 + + - name: Create build directory + run: | + echo "build_dir=$(mktemp -d)" >> $GITHUB_ENV + + - name: Prepare variables + shell: sh -x {0} + env: + board: ${{ matrix.board }} + shield: ${{ matrix.shield }} + artifact_name: ${{ matrix.artifact-name }} + run: | + if [ -e zephyr/module.yml ]; then + export zmk_load_arg=" -DZMK_EXTRA_MODULES='${GITHUB_WORKSPACE}'" + export new_tmp_dir=$(mktemp -d) + echo "base_dir=${new_tmp_dir}" >> $GITHUB_ENV + else + echo "base_dir=${GITHUB_WORKSPACE}" >> $GITHUB_ENV + fi + + echo "zephyr_version=${ZEPHYR_VERSION}" >> $GITHUB_ENV + echo "extra_cmake_args=${shield:+-DSHIELD=\"$shield\"}${zmk_load_arg}" >> $GITHUB_ENV + echo "display_name=${shield:+$shield - }${board}" >> $GITHUB_ENV + echo "artifact_name=${artifact_name:-${shield:+$shield-}${board}-zmk}" >> $GITHUB_ENV + + - name: Copy config files to isolated temporary directory + run: | + if [ "${{ env.base_dir }}" != "${GITHUB_WORKSPACE}" ]; then + mkdir "${{ env.base_dir }}/${{ inputs.config_path }}" + cp -R ${{ inputs.config_path }}/* "${{ env.base_dir }}/${{ inputs.config_path }}/" + fi + + - name: Cache west modules + uses: actions/cache@v3.0.11 + continue-on-error: true + env: + cache_name: cache-zephyr-${{ env.zephyr_version }}-modules + with: + path: | + ${{ env.base_dir }}/modules/ + ${{ env.base_dir }}/tools/ + ${{ env.base_dir }}/zephyr/ + ${{ env.base_dir }}/bootloader/ + ${{ env.base_dir }}/zmk/ + key: ${{ runner.os }}-build-${{ env.cache_name }}-${{ hashFiles('**/west.yml', '**/build.yaml') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache_name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + + - name: West Init + working-directory: ${{ env.base_dir }} + run: west init -l "${{ env.base_dir }}/${{ inputs.config_path }}" + + - name: West Update + working-directory: ${{ env.base_dir }} + run: west update + + - name: West Zephyr export + working-directory: ${{ env.base_dir }} + run: west zephyr-export + + - name: West Build (${{ env.display_name }}) + working-directory: ${{ env.base_dir }} + shell: sh -x {0} + run: west build -s zmk/app -d "${{ env.build_dir }}" -b "${{ matrix.board }}" -- -DZMK_CONFIG=${{ env.base_dir }}/${{ inputs.config_path }} ${{ env.extra_cmake_args }} ${{ matrix.cmake-args }} + + - name: Build DFU package + run: adafruit-nrfutil dfu genpkg --dev-type 0x0052 --application "${{ env.build_dir }}/zephyr/zmk.hex" "${{ env.build_dir }}/zephyr/dfu-package.zip" + + - name: ${{ env.display_name }} Kconfig file + run: | + if [ -f "${{ env.build_dir }}/zephyr/.config" ] + then + grep -v -e "^#" -e "^$" "${{ env.build_dir }}/zephyr/.config" | sort + else + echo "No Kconfig output" + fi + if: ${{ !cancelled() }} + + - name: ${{ env.display_name }} Devicetree file + run: | + if [ -f "${{ env.build_dir }}/zephyr/zephyr.dts" ] + then + cat "${{ env.build_dir }}/zephyr/zephyr.dts" + elif [ -f "${{ env.build_dir }}/zephyr/zephyr.dts.pre" ] + then + cat -s "${{ env.build_dir }}/zephyr/zephyr.dts.pre" + else + echo "No Devicetree output" + fi + if: ${{ !cancelled() }} + + - name: Rename artifacts + shell: sh -x {0} + run: | + mkdir "${{ env.build_dir }}/artifacts" + if [ -f "${{ env.build_dir }}/zephyr/zmk.uf2" ] + then + cp "${{ env.build_dir }}/zephyr/zmk.uf2" "${{ env.build_dir }}/artifacts/${{ env.artifact_name }}.uf2" + elif [ -f "${{ env.build_dir }}/zephyr/zmk.${{ inputs.fallback_binary }}" ] + then + cp "${{ env.build_dir }}/zephyr/zmk.${{ inputs.fallback_binary }}" "${{ env.build_dir }}/artifacts/${{ env.artifact_name }}.${{ inputs.fallback_binary }}" + fi + + if [ -f "${{ env.build_dir }}/zephyr/zmk.hex" ] + then + cp "${{ env.build_dir }}/zephyr/zmk.hex" "${{ env.build_dir }}/artifacts/${{ env.artifact_name }}.hex" + fi + + if [ -f "${{ env.build_dir }}/zephyr/dfu-package.zip" ] + then + cp "${{ env.build_dir }}/zephyr/dfu-package.zip" "${{ env.build_dir }}/artifacts/${{ env.artifact_name }}-dfu.zip" + fi + + - name: Archive (${{ env.display_name }}) + uses: actions/upload-artifact@v3 + with: + name: ${{ inputs.archive_name }} + path: ${{ env.build_dir }}/artifacts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d74fb89..21b9ef6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,4 +2,4 @@ on: [push, pull_request, workflow_dispatch] jobs: build: - uses: zmkfirmware/zmk/.github/workflows/build-user-config.yml@main + uses: ./.github/workflows/build-user-config.yml