Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
176 changes: 176 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -178,3 +178,179 @@ jobs:
userdata: "GeneralsReplays/GeneralsZH/1.04"
preset: ${{ matrix.preset }}
secrets: inherit

build-mingw-generals:
name: Build Generals MinGW-w64 (${{ matrix.preset }})
needs: detect-changes
if: ${{ github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.generals == 'true' || needs.detect-changes.outputs.shared == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 45
strategy:
matrix:
preset: ["mingw-w64-i686", "mingw-w64-i686-debug"]
# Note: mingw-w64-i686-profile excluded - profiling uses ASM with no GCC equivalent
fail-fast: false

steps:
- name: Checkout Code
uses: actions/checkout@v4

- name: Install MinGW-w64 Toolchain
run: |
sudo apt-get update
sudo apt-get install -y mingw-w64 cmake

- name: Install Wine and widl
run: |

# Add Wine repository
sudo dpkg --add-architecture i386
sudo mkdir -pm755 /etc/apt/keyrings
sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key

# Determine Ubuntu codename
CODENAME=$(lsb_release -cs)

# Download appropriate sources file
sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/${CODENAME}/winehq-${CODENAME}.sources || {
sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/jammy/winehq-jammy.sources
}

# Update and install Wine
sudo apt-get update
sudo apt-get install -y --install-recommends winehq-stable wine-stable-dev || {
sudo apt-get install -y wine-stable-dev
}

- name: Cache CMake Dependencies
id: cache-cmake-deps
uses: actions/cache@v4
with:
path: build/${{ matrix.preset }}/_deps
key: cmake-deps-mingw-${{ matrix.preset }}-${{ hashFiles('CMakePresets.json','cmake/**/*.cmake','**/CMakeLists.txt') }}
Comment on lines +225 to +230
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cache key collision between concurrent jobs: both build-mingw-generals and build-mingw-generalsmd produce identical cache keys for matching preset values (e.g., both output cmake-deps-mingw-mingw-w64-i686-<hash>). When these jobs run in parallel, whichever finishes first wins the single cache slot; the other job's save is silently dropped.

While the CMake dependencies are likely identical today, the pattern is fragile. If Generals and GeneralsMD ever require different sub-dependencies, one job will silently restore the wrong cached tree. Add a job-specific discriminator to the cache key to eliminate ambiguity — for example, use cmake-deps-mingw-generals-${{ matrix.preset }}-... in build-mingw-generals and cmake-deps-mingw-generalsmd-${{ matrix.preset }}-... in build-mingw-generalsmd.

The same collision exists in build-mingw-generalsmd at line 313–318.

Prompt To Fix With AI
This is a comment left during a code review.
Path: .github/workflows/ci.yml
Line: 225-230

Comment:
Cache key collision between concurrent jobs: both `build-mingw-generals` and `build-mingw-generalsmd` produce identical cache keys for matching preset values (e.g., both output `cmake-deps-mingw-mingw-w64-i686-<hash>`). When these jobs run in parallel, whichever finishes first wins the single cache slot; the other job's save is silently dropped.

While the CMake dependencies are likely identical today, the pattern is fragile. If Generals and GeneralsMD ever require different sub-dependencies, one job will silently restore the wrong cached tree. Add a job-specific discriminator to the cache key to eliminate ambiguity — for example, use `cmake-deps-mingw-generals-${{ matrix.preset }}-...` in `build-mingw-generals` and `cmake-deps-mingw-generalsmd-${{ matrix.preset }}-...` in `build-mingw-generalsmd`.

The same collision exists in `build-mingw-generalsmd` at line 313–318.

How can I resolve this? If you propose a fix, please make it concise.


- name: Configure Generals with CMake (${{ matrix.preset }})
run: |

# Unset LD_LIBRARY_PATH to avoid library conflicts
unset LD_LIBRARY_PATH

# Configure with appropriate flags
cmake --preset ${{ matrix.preset }} \
-DRTS_BUILD_ZEROHOUR=OFF \
-DRTS_BUILD_GENERALS=ON \
-DRTS_BUILD_CORE_TOOLS=OFF \
-DRTS_BUILD_GENERALS_TOOLS=OFF \
-DRTS_BUILD_ZEROHOUR_TOOLS=OFF \
-DRTS_BUILD_CORE_EXTRAS=OFF \
-DRTS_BUILD_GENERALS_EXTRAS=OFF \
-DRTS_BUILD_ZEROHOUR_EXTRAS=OFF
- name: Build Generals (${{ matrix.preset }})
run: |

# Build with parallel jobs
cmake --build build/${{ matrix.preset }} --target g_generals -j$(nproc)

- name: Collect Generals Artifacts
run: |
ARTIFACTS_DIR="build/${{ matrix.preset }}/Generals/artifacts"
mkdir -p "$ARTIFACTS_DIR"

# Copy executables, DLLs, and debug symbols
find build/${{ matrix.preset }}/Core build/${{ matrix.preset }}/Generals -type f \( -name "*.exe" -o -name "*.dll" -o -name "*.exe.debug" \) -exec cp {} "$ARTIFACTS_DIR/" \; 2>/dev/null || true

- name: Upload Generals ${{ matrix.preset }} Artifact
uses: actions/upload-artifact@v4
with:
name: Generals-${{ matrix.preset }}
path: build/${{ matrix.preset }}/Generals/artifacts
retention-days: 30
if-no-files-found: error

build-mingw-generalsmd:
name: Build GeneralsMD MinGW-w64 (${{ matrix.preset }})
needs: detect-changes
if: ${{ github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.generalsmd == 'true' || needs.detect-changes.outputs.shared == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 45
strategy:
matrix:
preset: ["mingw-w64-i686", "mingw-w64-i686-debug"]
# Note: mingw-w64-i686-profile excluded - profiling uses ASM with no GCC equivalent
fail-fast: false

steps:
- name: Checkout Code
uses: actions/checkout@v4

- name: Install MinGW-w64 Toolchain
run: |
sudo apt-get update
sudo apt-get install -y mingw-w64 cmake

- name: Install Wine and widl
run: |

# Add Wine repository
sudo dpkg --add-architecture i386
sudo mkdir -pm755 /etc/apt/keyrings
sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key

# Determine Ubuntu codename
CODENAME=$(lsb_release -cs)

# Download appropriate sources file
sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/${CODENAME}/winehq-${CODENAME}.sources || {
sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/jammy/winehq-jammy.sources
}

# Update and install Wine
sudo apt-get update
sudo apt-get install -y --install-recommends winehq-stable wine-stable-dev || {
sudo apt-get install -y wine-stable-dev
}

- name: Cache CMake Dependencies
id: cache-cmake-deps
uses: actions/cache@v4
with:
path: build/${{ matrix.preset }}/_deps
key: cmake-deps-mingw-${{ matrix.preset }}-${{ hashFiles('CMakePresets.json','cmake/**/*.cmake','**/CMakeLists.txt') }}

- name: Configure GeneralsMD with CMake (${{ matrix.preset }})
run: |

# Unset LD_LIBRARY_PATH to avoid library conflicts
unset LD_LIBRARY_PATH

# Configure with appropriate flags
cmake --preset ${{ matrix.preset }} \
-DRTS_BUILD_ZEROHOUR=ON \
-DRTS_BUILD_GENERALS=OFF \
-DRTS_BUILD_CORE_TOOLS=OFF \
-DRTS_BUILD_GENERALS_TOOLS=OFF \
-DRTS_BUILD_ZEROHOUR_TOOLS=OFF \
-DRTS_BUILD_CORE_EXTRAS=OFF \
-DRTS_BUILD_GENERALS_EXTRAS=OFF \
-DRTS_BUILD_ZEROHOUR_EXTRAS=OFF
- name: Build GeneralsMD (${{ matrix.preset }})
run: |

# Build with parallel jobs
cmake --build build/${{ matrix.preset }} --target z_generals -j$(nproc)

- name: Collect GeneralsMD Artifacts
run: |
ARTIFACTS_DIR="build/${{ matrix.preset }}/GeneralsMD/artifacts"
mkdir -p "$ARTIFACTS_DIR"

# Copy executables, DLLs, and debug symbols
find build/${{ matrix.preset }}/Core build/${{ matrix.preset }}/GeneralsMD -type f \( -name "*.exe" -o -name "*.dll" -o -name "*.exe.debug" \) -exec cp {} "$ARTIFACTS_DIR/" \; 2>/dev/null || true

- name: Upload GeneralsMD ${{ matrix.preset }} Artifact
uses: actions/upload-artifact@v4
with:
name: GeneralsMD-${{ matrix.preset }}
path: build/${{ matrix.preset }}/GeneralsMD/artifacts
retention-days: 30
if-no-files-found: error
Loading