summaryrefslogtreecommitdiff
path: root/.github/workflows/ci.yml
blob: af0bc96d541b60a92d691d973e08dd0810cf2d8c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
name: Build

# Build on every branch push, tag push, and pull request change:
on:
  push:
  pull_request:

jobs:
  build_repo:
    # This is a *private* build container.
    container: ghcr.io/zeldaret/mm-build:main

    name: Build repo (${{ matrix.version }})
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        version:
          - n64-jp-1.1     # N64 Japan 1.1
          - n64-us         # N64 USA
        include:
          - version: n64-jp-1.1
            non_matching: 1

    # By default no version in the matrix contains a non_matching value,
    # meaning ${{ matrix.non_matching }} expand to an empty string, unless it
    # is explicitly listed on the `include` block.
    # Use the value from the matrix if it exists, or fallback to 0 if it doesn't.
    env:
      NON_MATCHING: ${{ matrix.non_matching || 0 }}

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: git config safe.directory
        run: git config --global --add safe.directory "$GITHUB_WORKSPACE"

      - name: Install system dependencies
        run: |
          apt-get install -y git build-essential binutils-mips-linux-gnu curl python3 python3-pip python3-venv libxml2-dev

      - name: Get the dependency
        run: ln -s /orig/${{ matrix.version }}/baserom.z64 baseroms/${{ matrix.version }}/baserom.z64

      # The compiler archives are embedded in the runner image, to avoid downloading them from GitHub (during make setup), which occasionally fails.
      - name: Provide compiler archives
        run: ln -s /compiler_archives tools/compiler_archives/archives

      - name: venv
        run: make -j $(nproc) VERSION=${{ matrix.version }} venv

      - name: Setup
        run: make -j $(nproc) VERSION=${{ matrix.version }} setup 2> >(tee tools/warnings_count/warnings_setup_new.txt)"

      - name: Check setup warnings
        run: ./tools/warnings_count/compare_warnings.sh setup

      - name: Assets
        run: make -j $(nproc) VERSION=${{ matrix.version }} assets 2> >(tee tools/warnings_count/warnings_assets_new.txt)"

      - name: Check assets warnings
        run: ./tools/warnings_count/compare_warnings.sh assets

      - name: Disasm
        run: make -j $(nproc) VERSION=${{ matrix.version }} disasm 2> >(tee tools/warnings_count/warnings_disasm_new.txt)"

      - name: Check disasm warnings
        run: ./tools/warnings_count/compare_warnings.sh disasm

      - name: Build ${{ matrix.version }}
        id: build
        run: make -j $(nproc) VERSION=${{ matrix.version }} rom 2> >(tee tools/warnings_count/warnings_build_new.txt)

      - name: Check build warnings
        run: ./tools/warnings_count/compare_warnings.sh build

      - name: Compress ${{ matrix.version }}
        id: build
        run: make -j $(nproc) VERSION=${{ matrix.version }} compress 2> >(tee tools/warnings_count/warnings_compress_new.txt)

      - name: Check compress warnings
        run: ./tools/warnings_count/compare_warnings.sh compress

      - name: Fix BSS and generate patch
        if: failure() && steps.build.outcome == 'failure'
        uses: ./.github/actions/fix-bss-and-generate-patch
        with:
          version: ${{ matrix.version }}

      - name: Show warnings
        if: failure() && steps.build.outcome == 'failure'
        run: cat tools/warnings_count/warnings_setup_new.txt tools/warnings_count/warnings_assets_new.txt tools/warnings_count/warnings_disasm_new.txt tools/warnings_count/warnings_build_new.txt tools/warnings_count/warnings_compress_new.txt

      - name: Upload map
        uses: actions/upload-artifact@v6
        with:
          name: mm-${{ matrix.version }}.map
          path: build/${{ matrix.version }}/mm-${{ matrix.version }}.map

  # This job does not do anything, its purpose is to be used as a status check in GitHub rules.
  all_versions_built:
    name: All versions built
    needs: [build_repo]
    runs-on: ubuntu-latest
    # Solution 1 from https://github.com/actions/runner/issues/2566#issuecomment-3053484216
    if: always()
    steps:
      - run: |
         if [ "${{ needs.build_repo.result }}" != "success" ]; then
           exit 1
         fi

  merge_bss_fixes:
    name: Merge BSS fixes
    runs-on: ubuntu-latest
    needs: [build_repo]
    if: '!cancelled()'  # Run even if build_repo fails
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Download patches
        uses: actions/download-artifact@v8
        with:
          pattern: fix_bss_*.patch
          merge-multiple: true

      - name: Apply patches
        run: python3 .github/scripts/apply_fix_bss_patches.py

      - name: Generate patch
        run: .github/scripts/generate_patch.sh