From 6442465bf1adaab9bac97a7207b46ffe47f78ad7 Mon Sep 17 00:00:00 2001 From: tylerjenningsw Date: Mon, 19 Oct 2026 12:59:32 -0400 Subject: [PATCH 01/11] CI: build the desktop app and CLI on Windows with MSVC, GNU, and GNU with bundled LLD (refs #1886) --- .github/workflows/windows-toolchains.yml | 70 ++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 .github/workflows/windows-toolchains.yml diff --git a/.github/workflows/windows-toolchains.yml b/.github/workflows/windows-toolchains.yml new file mode 100644 index 000000000..9c51e8acc --- /dev/null +++ b/.github/workflows/windows-toolchains.yml @@ -0,0 +1,70 @@ +# Windows builds with the toolchains contributors use, not just the MSVC one releases use: build +# the desktop app and the CLI with MSVC, with GNU (mingw-w64 from MSYS2, the setup CONTRIBUTING.md +# describes), and with GNU linked by Rust's bundled LLD plus mingw-w64's import libraries (#1886), +# then run each binary with `--version`. Both packages build in one `cargo build`, the way people +# build them, so features unify and the CLI links everything the desktop app pulls in. +name: Windows toolchains + +# Nightly on main (a dependency update is what brings in a new system library), and on PRs that +# change this workflow or the lockfile. +on: + schedule: + - cron: "41 5 * * *" + pull_request: + paths: + - .github/workflows/windows-toolchains.yml + - Cargo.lock + workflow_dispatch: + +concurrency: + group: windows-toolchains-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +permissions: + contents: read + +jobs: + build: + name: ${{ matrix.name }} + runs-on: windows-latest + timeout-minutes: 90 + strategy: + fail-fast: false + matrix: + include: + - { name: msvc, target: x86_64-pc-windows-msvc } + - { name: gnu, target: x86_64-pc-windows-gnu } + - { name: gnu-rust-lld, target: x86_64-pc-windows-gnu, rust-lld: true } + defaults: + run: + shell: bash + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - name: Rust (stable-${{ matrix.target }}) + run: | + rustup toolchain install stable-${{ matrix.target }} --profile minimal --no-self-update + rustup default stable-${{ matrix.target }} + rustc -vV + - name: mingw-w64 from MSYS2 + if: matrix.target == 'x86_64-pc-windows-gnu' + run: /c/msys64/usr/bin/pacman -Sy --noconfirm --needed mingw-w64-x86_64-gcc + - name: Put it first on PATH + if: matrix.target == 'x86_64-pc-windows-gnu' && !matrix.rust-lld + run: | + echo 'C:\msys64\mingw64\bin' >> "$GITHUB_PATH" + - name: Link with Rust's bundled LLD and mingw-w64's import libraries + if: matrix.rust-lld + run: | + echo 'CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER=rust-lld' >> "$GITHUB_ENV" + echo 'CARGO_TARGET_X86_64_PC_WINDOWS_GNU_RUSTFLAGS=-C link-self-contained=yes -L native=C:/msys64/mingw64/lib' >> "$GITHUB_ENV" + - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2 + with: + key: ${{ matrix.name }} + - name: Build the desktop app and the CLI + run: | + gcc --version | head -1 || true + cargo build --locked --target ${{ matrix.target }} -p effectcraft -p effectcraft-cli + - name: Run them + run: | + target/${{ matrix.target }}/debug/effectcraft.exe --version + target/${{ matrix.target }}/debug/effectcraft-cli.exe --version From 1e1e3d830cde01d2b5801980811e7df7cb887a76 Mon Sep 17 00:00:00 2001 From: tylerjenningsw Date: Mon, 19 Oct 2026 12:59:50 -0400 Subject: [PATCH 02/11] Docs: building on Windows with MSVC, GNU, or GNU with bundled LLD (refs #1886) --- CONTRIBUTING.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dfa28c9f0..42f23f771 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,6 +13,37 @@ cargo test --workspace cargo xtask ci # what every commit must pass ``` +### Windows + +The MSVC toolchain, rustup's default on Windows, is what the releases use: with the Visual Studio +C++ build tools installed, the commands above work as they are. + +The GNU toolchain (`x86_64-pc-windows-gnu`) needs a current mingw-w64 GCC and binutils first on +`PATH`. They provide the linker and the Windows import libraries, such as `libshlwapi.a` for +opening links from the app. With [MSYS2](https://www.msys2.org/): + +```powershell +C:\msys64\usr\bin\pacman.exe -S --needed mingw-w64-x86_64-gcc +$env:PATH = "C:\msys64\mingw64\bin;$env:PATH" +cargo +stable-x86_64-pc-windows-gnu run -p effectcraft -- --demo +``` + +An older MinGW earlier on `PATH` can break the build: CodeBlocks' GCC 8.1 fails to link +`boa_engine` ([#1882](https://github.com/storytold/effectcraft/issues/1882)). + +Rust's bundled LLD and self-contained libraries don't include every import library EffectCraft +needs, so on their own they stop with `unable to find library -lshlwapi` +([#1886](https://github.com/storytold/effectcraft/issues/1886)). To link that way, add mingw-w64's +libraries to the search path in your own Cargo config (`%USERPROFILE%\.cargo\config.toml`): + +```toml +[target.x86_64-pc-windows-gnu] +linker = "rust-lld" +rustflags = ["-C", "link-self-contained=yes", "-L", "native=C:/msys64/mingw64/lib"] +``` + +The `Windows toolchains` workflow builds the app and the CLI each of these three ways every night. + ## Ground rules - **Clean room.** Work from After Effects' public documentation and its observable behaviour only. From f0af0f736af111508bdc657a3378dd0579603aa9 Mon Sep 17 00:00:00 2001 From: tylerjenningsw Date: Mon, 19 Oct 2026 13:01:43 -0400 Subject: [PATCH 03/11] CI: write the MSYS2 PATH entry with printf, for shellcheck (refs #1886) --- .github/workflows/windows-toolchains.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/windows-toolchains.yml b/.github/workflows/windows-toolchains.yml index 9c51e8acc..3d8b37ea8 100644 --- a/.github/workflows/windows-toolchains.yml +++ b/.github/workflows/windows-toolchains.yml @@ -51,7 +51,7 @@ jobs: - name: Put it first on PATH if: matrix.target == 'x86_64-pc-windows-gnu' && !matrix.rust-lld run: | - echo 'C:\msys64\mingw64\bin' >> "$GITHUB_PATH" + printf '%s\n' 'C:\msys64\mingw64\bin' >> "$GITHUB_PATH" - name: Link with Rust's bundled LLD and mingw-w64's import libraries if: matrix.rust-lld run: | From 82e383deb27abe3bf994d36ccaf5b30c29836d43 Mon Sep 17 00:00:00 2001 From: tylerjenningsw Date: Mon, 19 Oct 2026 13:26:19 -0400 Subject: [PATCH 04/11] CI: give bundled LLD only libshlwapi.a, not all of mingw-w64's libraries (refs #1886) --- .github/workflows/windows-toolchains.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/windows-toolchains.yml b/.github/workflows/windows-toolchains.yml index 3d8b37ea8..b6765455e 100644 --- a/.github/workflows/windows-toolchains.yml +++ b/.github/workflows/windows-toolchains.yml @@ -1,6 +1,6 @@ # Windows builds with the toolchains contributors use, not just the MSVC one releases use: build # the desktop app and the CLI with MSVC, with GNU (mingw-w64 from MSYS2, the setup CONTRIBUTING.md -# describes), and with GNU linked by Rust's bundled LLD plus mingw-w64's import libraries (#1886), +# describes), and with GNU linked by Rust's bundled LLD plus mingw-w64's `libshlwapi.a` (#1886), # then run each binary with `--version`. Both packages build in one `cargo build`, the way people # build them, so features unify and the CLI links everything the desktop app pulls in. name: Windows toolchains @@ -52,11 +52,15 @@ jobs: if: matrix.target == 'x86_64-pc-windows-gnu' && !matrix.rust-lld run: | printf '%s\n' 'C:\msys64\mingw64\bin' >> "$GITHUB_PATH" - - name: Link with Rust's bundled LLD and mingw-w64's import libraries + # Only libshlwapi.a, in a folder of its own: with all of mingw-w64's lib folder on the search + # path, its C runtime mixes with Rust's bundled one (undefined `DllEntryPoint`). + - name: Link with Rust's bundled LLD and mingw-w64's shlwapi import library if: matrix.rust-lld run: | + mkdir -p /c/gnu-import-libs + cp /c/msys64/mingw64/lib/libshlwapi.a /c/gnu-import-libs/ echo 'CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER=rust-lld' >> "$GITHUB_ENV" - echo 'CARGO_TARGET_X86_64_PC_WINDOWS_GNU_RUSTFLAGS=-C link-self-contained=yes -L native=C:/msys64/mingw64/lib' >> "$GITHUB_ENV" + echo 'CARGO_TARGET_X86_64_PC_WINDOWS_GNU_RUSTFLAGS=-C link-self-contained=yes -L native=C:/gnu-import-libs' >> "$GITHUB_ENV" - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2 with: key: ${{ matrix.name }} From d5a7ab0a136a7f20e4dd1ecc755996b4b985d309 Mon Sep 17 00:00:00 2001 From: tylerjenningsw Date: Mon, 19 Oct 2026 13:26:19 -0400 Subject: [PATCH 05/11] Docs: bundled LLD takes libshlwapi.a in a folder of its own (refs #1886) --- CONTRIBUTING.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 42f23f771..5f36bc5cb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -33,13 +33,20 @@ An older MinGW earlier on `PATH` can break the build: CodeBlocks' GCC 8.1 fails Rust's bundled LLD and self-contained libraries don't include every import library EffectCraft needs, so on their own they stop with `unable to find library -lshlwapi` -([#1886](https://github.com/storytold/effectcraft/issues/1886)). To link that way, add mingw-w64's -libraries to the search path in your own Cargo config (`%USERPROFILE%\.cargo\config.toml`): +([#1886](https://github.com/storytold/effectcraft/issues/1886)). To link that way, copy +mingw-w64's `libshlwapi.a` into a folder of its own and add that folder to the search path in your +own Cargo config (`%USERPROFILE%\.cargo\config.toml`). Don't add all of mingw-w64's `lib` folder: +its C runtime clashes with Rust's bundled one (`undefined symbol: DllEntryPoint`). + +```powershell +New-Item -ItemType Directory -Force C:\gnu-import-libs +Copy-Item C:\msys64\mingw64\lib\libshlwapi.a C:\gnu-import-libs\ +``` ```toml [target.x86_64-pc-windows-gnu] linker = "rust-lld" -rustflags = ["-C", "link-self-contained=yes", "-L", "native=C:/msys64/mingw64/lib"] +rustflags = ["-C", "link-self-contained=yes", "-L", "native=C:/gnu-import-libs"] ``` The `Windows toolchains` workflow builds the app and the CLI each of these three ways every night. From d3d3b865395781551c0002aee6f03655d0a16815 Mon Sep 17 00:00:00 2001 From: tylerjenningsw Date: Thu, 29 Oct 2026 17:27:06 -0400 Subject: [PATCH 06/11] CI: the Windows toolchain jobs don't keep the checkout token on disk (refs #1886) --- .github/workflows/windows-toolchains.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/windows-toolchains.yml b/.github/workflows/windows-toolchains.yml index b6765455e..6d22ffc12 100644 --- a/.github/workflows/windows-toolchains.yml +++ b/.github/workflows/windows-toolchains.yml @@ -39,7 +39,10 @@ jobs: run: shell: bash steps: + # Build scripts run as this job's user; nothing here pushes, so don't leave the token on disk. - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false - name: Rust (stable-${{ matrix.target }}) run: | rustup toolchain install stable-${{ matrix.target }} --profile minimal --no-self-update From 09d41e54ca799bac62bb22b7095aa3a53c64e6e8 Mon Sep 17 00:00:00 2001 From: tylerjenningsw Date: Thu, 29 Oct 2026 17:27:12 -0400 Subject: [PATCH 07/11] CI: bundled LLD also gets the ktmw32, propsys and version import libraries winsafe binds (refs #1886) --- .github/workflows/windows-toolchains.yml | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/.github/workflows/windows-toolchains.yml b/.github/workflows/windows-toolchains.yml index 6d22ffc12..1d00276c8 100644 --- a/.github/workflows/windows-toolchains.yml +++ b/.github/workflows/windows-toolchains.yml @@ -1,8 +1,9 @@ # Windows builds with the toolchains contributors use, not just the MSVC one releases use: build # the desktop app and the CLI with MSVC, with GNU (mingw-w64 from MSYS2, the setup CONTRIBUTING.md -# describes), and with GNU linked by Rust's bundled LLD plus mingw-w64's `libshlwapi.a` (#1886), -# then run each binary with `--version`. Both packages build in one `cargo build`, the way people -# build them, so features unify and the CLI links everything the desktop app pulls in. +# describes), and with GNU linked by Rust's bundled LLD plus the mingw-w64 import libraries its +# self-contained sysroot lacks (#1886), then run each binary with `--version`. Both packages build +# in one `cargo build`, the way people build them, so features unify and the CLI links everything +# the desktop app pulls in. name: Windows toolchains # Nightly on main (a dependency update is what brings in a new system library), and on PRs that @@ -55,13 +56,17 @@ jobs: if: matrix.target == 'x86_64-pc-windows-gnu' && !matrix.rust-lld run: | printf '%s\n' 'C:\msys64\mingw64\bin' >> "$GITHUB_PATH" - # Only libshlwapi.a, in a folder of its own: with all of mingw-w64's lib folder on the search - # path, its C runtime mixes with Rust's bundled one (undefined `DllEntryPoint`). - - name: Link with Rust's bundled LLD and mingw-w64's shlwapi import library + # Only the import libraries the self-contained sysroot lacks, in a folder of its own: with all + # of mingw-w64's lib folder on the search path, its C runtime mixes with Rust's bundled one + # (undefined `DllEntryPoint`). webbrowser, which opens links, binds shlwapi; winsafe, which the + # updater (craft-update) uses, binds shlwapi, ktmw32, propsys and version. + - name: Link with Rust's bundled LLD and mingw-w64's missing import libraries if: matrix.rust-lld run: | mkdir -p /c/gnu-import-libs - cp /c/msys64/mingw64/lib/libshlwapi.a /c/gnu-import-libs/ + for lib in shlwapi ktmw32 propsys version; do + cp "/c/msys64/mingw64/lib/lib$lib.a" /c/gnu-import-libs/ + done echo 'CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER=rust-lld' >> "$GITHUB_ENV" echo 'CARGO_TARGET_X86_64_PC_WINDOWS_GNU_RUSTFLAGS=-C link-self-contained=yes -L native=C:/gnu-import-libs' >> "$GITHUB_ENV" - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2 From 6e7a008f6fcaf94730c772148b0ee67dad4da374 Mon Sep 17 00:00:00 2001 From: tylerjenningsw Date: Thu, 29 Oct 2026 17:27:26 -0400 Subject: [PATCH 08/11] Docs: bundled LLD needs mingw-w64's ktmw32, propsys and version import libraries too (refs #1886) --- CONTRIBUTING.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 840f29ed6..600239efa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -56,15 +56,18 @@ An older MinGW earlier on `PATH` can break the build: CodeBlocks' GCC 8.1 fails `boa_engine` ([#1882](https://github.com/storytold/effectcraft/issues/1882)). Rust's bundled LLD and self-contained libraries don't include every import library EffectCraft -needs, so on their own they stop with `unable to find library -lshlwapi` -([#1886](https://github.com/storytold/effectcraft/issues/1886)). To link that way, copy -mingw-w64's `libshlwapi.a` into a folder of its own and add that folder to the search path in your -own Cargo config (`%USERPROFILE%\.cargo\config.toml`). Don't add all of mingw-w64's `lib` folder: -its C runtime clashes with Rust's bundled one (`undefined symbol: DllEntryPoint`). +needs, so on their own they stop with `unable to find library` for `-lshlwapi`, `-lktmw32`, +`-lpropsys` and `-lversion` ([#1886](https://github.com/storytold/effectcraft/issues/1886)). To +link that way, copy those four from mingw-w64 into a folder of its own and add that folder to the +search path in your own Cargo config (`%USERPROFILE%\.cargo\config.toml`). Don't add all of +mingw-w64's `lib` folder: its C runtime clashes with Rust's bundled one +(`undefined symbol: DllEntryPoint`). ```powershell New-Item -ItemType Directory -Force C:\gnu-import-libs -Copy-Item C:\msys64\mingw64\lib\libshlwapi.a C:\gnu-import-libs\ +foreach ($lib in "shlwapi", "ktmw32", "propsys", "version") { + Copy-Item "C:\msys64\mingw64\lib\lib$lib.a" C:\gnu-import-libs\ +} ``` ```toml From 41d9083aea77fea2a9029dd0344e6fb093134ffe Mon Sep 17 00:00:00 2001 From: tylerjenningsw Date: Thu, 29 Oct 2026 20:57:11 -0400 Subject: [PATCH 09/11] CI: drop the Windows toolchains workflow (refs #1886) --- .github/workflows/windows-toolchains.yml | 82 ------------------------ 1 file changed, 82 deletions(-) delete mode 100644 .github/workflows/windows-toolchains.yml diff --git a/.github/workflows/windows-toolchains.yml b/.github/workflows/windows-toolchains.yml deleted file mode 100644 index 1d00276c8..000000000 --- a/.github/workflows/windows-toolchains.yml +++ /dev/null @@ -1,82 +0,0 @@ -# Windows builds with the toolchains contributors use, not just the MSVC one releases use: build -# the desktop app and the CLI with MSVC, with GNU (mingw-w64 from MSYS2, the setup CONTRIBUTING.md -# describes), and with GNU linked by Rust's bundled LLD plus the mingw-w64 import libraries its -# self-contained sysroot lacks (#1886), then run each binary with `--version`. Both packages build -# in one `cargo build`, the way people build them, so features unify and the CLI links everything -# the desktop app pulls in. -name: Windows toolchains - -# Nightly on main (a dependency update is what brings in a new system library), and on PRs that -# change this workflow or the lockfile. -on: - schedule: - - cron: "41 5 * * *" - pull_request: - paths: - - .github/workflows/windows-toolchains.yml - - Cargo.lock - workflow_dispatch: - -concurrency: - group: windows-toolchains-${{ github.ref }} - cancel-in-progress: ${{ github.event_name == 'pull_request' }} - -permissions: - contents: read - -jobs: - build: - name: ${{ matrix.name }} - runs-on: windows-latest - timeout-minutes: 90 - strategy: - fail-fast: false - matrix: - include: - - { name: msvc, target: x86_64-pc-windows-msvc } - - { name: gnu, target: x86_64-pc-windows-gnu } - - { name: gnu-rust-lld, target: x86_64-pc-windows-gnu, rust-lld: true } - defaults: - run: - shell: bash - steps: - # Build scripts run as this job's user; nothing here pushes, so don't leave the token on disk. - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - persist-credentials: false - - name: Rust (stable-${{ matrix.target }}) - run: | - rustup toolchain install stable-${{ matrix.target }} --profile minimal --no-self-update - rustup default stable-${{ matrix.target }} - rustc -vV - - name: mingw-w64 from MSYS2 - if: matrix.target == 'x86_64-pc-windows-gnu' - run: /c/msys64/usr/bin/pacman -Sy --noconfirm --needed mingw-w64-x86_64-gcc - - name: Put it first on PATH - if: matrix.target == 'x86_64-pc-windows-gnu' && !matrix.rust-lld - run: | - printf '%s\n' 'C:\msys64\mingw64\bin' >> "$GITHUB_PATH" - # Only the import libraries the self-contained sysroot lacks, in a folder of its own: with all - # of mingw-w64's lib folder on the search path, its C runtime mixes with Rust's bundled one - # (undefined `DllEntryPoint`). webbrowser, which opens links, binds shlwapi; winsafe, which the - # updater (craft-update) uses, binds shlwapi, ktmw32, propsys and version. - - name: Link with Rust's bundled LLD and mingw-w64's missing import libraries - if: matrix.rust-lld - run: | - mkdir -p /c/gnu-import-libs - for lib in shlwapi ktmw32 propsys version; do - cp "/c/msys64/mingw64/lib/lib$lib.a" /c/gnu-import-libs/ - done - echo 'CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER=rust-lld' >> "$GITHUB_ENV" - echo 'CARGO_TARGET_X86_64_PC_WINDOWS_GNU_RUSTFLAGS=-C link-self-contained=yes -L native=C:/gnu-import-libs' >> "$GITHUB_ENV" - - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2 - with: - key: ${{ matrix.name }} - - name: Build the desktop app and the CLI - run: | - gcc --version | head -1 || true - cargo build --locked --target ${{ matrix.target }} -p effectcraft -p effectcraft-cli - - name: Run them - run: | - target/${{ matrix.target }}/debug/effectcraft.exe --version - target/${{ matrix.target }}/debug/effectcraft-cli.exe --version From 93b9451f3d69f67344d2b1f6777e0a7fa0ee730f Mon Sep 17 00:00:00 2001 From: tylerjenningsw Date: Thu, 29 Oct 2026 20:57:11 -0400 Subject: [PATCH 10/11] Docs: the Windows section no longer mentions a toolchains workflow (refs #1886) --- CONTRIBUTING.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 600239efa..eff8208c9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -76,8 +76,6 @@ linker = "rust-lld" rustflags = ["-C", "link-self-contained=yes", "-L", "native=C:/gnu-import-libs"] ``` -The `Windows toolchains` workflow builds the app and the CLI each of these three ways every night. - ## Ground rules - **Clean room.** Work from After Effects' public documentation and its observable behaviour only. From 35d21d45bb849e5ff4be1ac623c8bb0e2cd7c8e7 Mon Sep 17 00:00:00 2001 From: tylerjenningsw Date: Thu, 29 Oct 2026 20:57:12 -0400 Subject: [PATCH 11/11] Docs: MSYS2 is plain text in the Windows section (refs #1886) --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index eff8208c9..29521ad73 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,7 +44,7 @@ C++ build tools installed, the commands above work as they are. The GNU toolchain (`x86_64-pc-windows-gnu`) needs a current mingw-w64 GCC and binutils first on `PATH`. They provide the linker and the Windows import libraries, such as `libshlwapi.a` for -opening links from the app. With [MSYS2](https://www.msys2.org/): +opening links from the app. With MSYS2: ```powershell C:\msys64\usr\bin\pacman.exe -S --needed mingw-w64-x86_64-gcc