Thanks to the complete GitHub Actions for MSYS2, it is easier than ever to construct a continuous integration setup for building with compilers and toolchains which can run on MSYS2.
The details are available on the official page, github.com/marketplace/actions/setup-msys2. However, perhaps it is best illustrated with a simple but concrete example. As usual, for this illustration, you will see the use of this simplistic Hello, world program in ANSI C. To follow along, check out its repository at github.com/ariya/hello-c90.
Let us take a look at this workflow setup to build this C program with GCC on MSYS2 (on Windows, obviously):
name: amd64_windows_gcc
jobs:
amd64_windows_gcc:
runs-on: windows-2019
defaults:
run:
shell: msys2 {0}
steps:
- uses: actions/checkout@v2
- uses: msys2/setup-msys2@v2
with:
install: gcc make
- run: gcc -v
- run: make CC=gcc
- run: file ./hello.exe
- run: ./hello
The important lines are for the setup-msys2
section. The install
value allows an easy selection of various packages which shall be installed before proceeding to the next step. For this purpose, it is sufficient to install gcc
and make
, but YMMV.
The rest is self-explanatory. Please note also the defaults
section earlier, this is convenient to set the default shell so that we do not need to explicitly call it for every single run
thereafter.
Now let us come up with another variant, this time for Clang instead of GCC (read also my previous post: Clang for Windows)
name: amd64_windows_clang
jobs:
amd64_windows_clang:
runs-on: windows-2019
defaults:
run:
shell: msys2 {0}
steps:
- uses: actions/checkout@v2
- uses: msys2/setup-msys2@v2
with:
install: make mingw-w64-x86_64-clang
- run: clang --version
- run: make CC=clang
- run: file ./hello.exe
- run: ./hello
Pretty straightforward, isn’t it? We just change the package to be installed and the compiler to be used. Since the two YAML files are very similar, to avoid a lot of repeated steps, we can parametrize it as follows. This is basically taking advantage of the matrix strategy feature of GitHub Actions.
amd64_windows:
runs-on: windows-2019
strategy:
matrix:
compiler: [gcc, clang]
defaults:
run:
shell: msys2 {0}
steps:
- uses: actions/checkout@v2
- uses: msys2/setup-msys2@v2
- run: pacman --noconfirm -S make gcc
if: ${{ matrix.compiler == 'gcc' }}
- run: pacman --noconfirm -S make mingw-w64-x86_64-clang
if: ${{ matrix.compiler == 'clang' }}
- run: ${{ matrix.compiler }} --version
- run: make CC=${{ matrix.compiler }}
- run: file ./hello.exe
- run: ./hello
To take it one step further, we can also support both i686 and AMD64 platforms in the same YML, again by parametrizing the architecture. Here is how it looks:
name: windows
jobs:
windows:
runs-on: windows-2019
strategy:
matrix:
compiler: [gcc, clang]
msystem: [MINGW32, MINGW64]
defaults:
run:
shell: msys2 {0}
steps:
- uses: actions/checkout@v2
- uses: msys2/setup-msys2@v2
with:
msystem: ${{ matrix.msystem }}
install: make
- run: pacman --noconfirm -S gcc
if: ${{ matrix.compiler == 'gcc' }}
- run: pacman --noconfirm -S mingw-w64-x86_64-clang
if: ${{ (matrix.msystem == 'MINGW64') && (matrix.compiler == 'clang') }}
- run: pacman --noconfirm -S mingw-w64-i686-clang
if: ${{ (matrix.msystem == 'MINGW32') && (matrix.compiler == 'clang') }}
- run: ${{ matrix.compiler }} --version
- run: make CC=${{ matrix.compiler }}
- run: file ./hello.exe
- run: ./hello
That’s all 4 combinations, 32-bit and 64-bit, for each GCC and Clang, in a simple configuration!