name: Windows Build on: push: branches: - dev - releases - 'release-[0-9]+.*' tags: - '[0-9]+.*' pull_request: branches: - dev - releases - 'release-[0-9]+.*' workflow_dispatch: env: publish_pre_dev_labels: '[]' jobs: build: runs-on: windows-latest defaults: run: shell: msys2 {0} strategy: fail-fast: false matrix: build_type: [release, debug] steps: - name: Checkout source uses: actions/checkout@v4 with: fetch-depth: 0 - name: Install dependencies uses: msys2/setup-msys2@v2 with: location: C:\msys2 update: true msystem: MINGW64 install: | git intltool pacboy: | cc:p pkgconf:p cmake:p autotools:p ninja:p gtkmm3:p lcms2:p fftw:p lensfun:p libiptcdata:p libjxl:p exiv2:p - name: Configure build run: | export REF_NAME_FILTERED="$(echo '${{github.ref_name}}' | sed 's/[^A-z0-9_.-]//g')" if [ '${{github.ref_type}}' == 'tag' ]; then export CACHE_SUFFIX="" else echo "Setting cache suffix." export CACHE_SUFFIX="5-$REF_NAME_FILTERED" echo "Cache suffix is '$CACHE_SUFFIX'." fi echo "Running CMake configure." cmake \ -G "Ninja" \ -DCMAKE_BUILD_TYPE='${{matrix.build_type}}' \ -DCACHE_NAME_SUFFIX="$CACHE_SUFFIX" \ -DPROC_TARGET_NUMBER="1" \ -DLENSFUNDBDIR="share/lensfun" \ -S . -B build echo "Recording filtered ref name." echo "REF_NAME_FILTERED=$REF_NAME_FILTERED" >> "$(cygpath -u $GITHUB_ENV)" - name: Build RawTherapee run: | echo "Running CMake install." cmake --build build --target install - name: Include Lensfun run: | echo "Updating Lensfun database." lensfun-update-data echo "Creating Lensfun directory in the build directory." mkdir -p 'build/${{matrix.build_type}}/share' echo "Copying Lensfun database to the build directory." cp -R "/C/msys2/msys64/mingw64/var/lib/lensfun-updates/version_1" 'build/${{matrix.build_type}}/share/lensfun' - name: Bundle dependencies run: | echo "Listing shared library dependencies." ldd "./build/${{matrix.build_type}}/rawtherapee.exe" echo "Finding DLLs to include." DLLS=($(ldd "./build/${{matrix.build_type}}/rawtherapee.exe" | grep '/mingw64/bin/' | awk '{print($1)'})) echo "Required DLLs are: ${DLLS[*]}" echo "Getting workspace path." export BUILD_DIR="$(pwd)/build/${{matrix.build_type}}" echo "Build directory is '$BUILD_DIR'." echo "Changing working directory to MSYS2 MINGW64." cd "/C/msys2/msys64/mingw64" echo "Copying DLLs and EXEs." cd ./bin cp \ "gdbus.exe" \ "gspawn-win64-helper.exe" \ "gspawn-win64-helper-console.exe" \ ${DLLS[*]} \ "$BUILD_DIR" cd - echo "Copying Adwaita theme." mkdir -p "$BUILD_DIR/share/icons/Adwaita" cd 'share/icons/Adwaita/' mkdir -p "$BUILD_DIR/share/icons/Adwaita/symbolic" cp -r \ "symbolic/actions" \ "symbolic/devices" \ "symbolic/mimetypes" \ "symbolic/places" \ "symbolic/status" \ "symbolic/ui" \ "$BUILD_DIR/share/icons/Adwaita/symbolic" cp 'index.theme' "$BUILD_DIR/share/icons/Adwaita" cd - echo "Copying GDK pixbuf." mkdir -p "$BUILD_DIR/lib" cp -r 'lib/gdk-pixbuf-2.0' "$BUILD_DIR/lib/gdk-pixbuf-2.0" echo "Copying GLib schemas." mkdir -p "$BUILD_DIR/share/glib-2.0/schemas" cp 'share/glib-2.0/schemas/gschemas.compiled' "$BUILD_DIR/share/glib-2.0/schemas" echo "Creating GTK settings.ini." mkdir -p "$BUILD_DIR/share/gtk-3.0/" echo -e '[Settings]\ngtk-button-images=1' > "$BUILD_DIR/share/gtk-3.0/settings.ini" - name: Create installer if: ${{matrix.build_type == 'release' && (github.ref_type == 'tag' || github.ref_name == 'dev')}} working-directory: build/${{matrix.build_type}} shell: pwsh run: | echo "Installing Inno Setup." choco install innosetup echo "Setup file:" type "WindowsInnoSetup.iss" echo "Creating installer from script." iscc /F"installer" "WindowsInnoSetup.iss" - name: Prepare artifact name run: | if [ '${{github.ref_type}}' == 'tag' ]; then ARTIFACT_NAME="RawTherapee_${REF_NAME_FILTERED}_win64_${{matrix.build_type}}" else echo "Getting RawTherapee version." export VERSION="$(grep -m 1 '^Version: .*$' './build/${{matrix.build_type}}/AboutThisBuild.txt' | sed 's/^Version: \(.\+\)$/\1/')" echo "Version is '$VERSION'." FILTERED_VERSION="$(echo "$VERSION" | sed 's/[^A-z0-9_.-]//g')" ARTIFACT_NAME="RawTherapee_${REF_NAME_FILTERED}_${FILTERED_VERSION}_win64_${{matrix.build_type}}" fi echo "Artifact name is '$ARTIFACT_NAME'." echo "Recording artifact name." echo "ARTIFACT_NAME=$ARTIFACT_NAME" >> "$(cygpath -u $GITHUB_ENV)" echo "Recording RawTherapee version." echo "RT_VERSION=$VERSION" >> "$(cygpath -u $GITHUB_ENV)" echo "Renaming artifact." mv './build/${{matrix.build_type}}' "./build/$ARTIFACT_NAME" if [ -e './build/installer.exe' ]; then echo "Renaming installer." mv './build/installer.exe' "./build/$ARTIFACT_NAME.exe" fi - name: Create ZIP archive shell: cmd working-directory: ./build run: | echo "Zipping artifact." 7z a -tzip "%ARTIFACT_NAME%.zip" "./%ARTIFACT_NAME%" - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: ${{env.ARTIFACT_NAME}} path: build\${{env.ARTIFACT_NAME}} - name: Upload installer if: ${{matrix.build_type == 'release' && (github.ref_type == 'tag' || github.ref_name == 'dev')}} uses: actions/upload-artifact@v4 with: name: ${{env.ARTIFACT_NAME}}.exe path: build\${{env.ARTIFACT_NAME}}.exe - name: Prepare for publishing if: ${{github.ref_type == 'tag' || github.ref_name == 'dev'}} run: | echo "Setting publish name." PUBLISH_NAME="RawTherapee_${REF_NAME_FILTERED}_win64_${{matrix.build_type}}" echo "Publish name is '$PUBLISH_NAME'." if [ "$ARTIFACT_NAME" != "$PUBLISH_NAME" ]; then echo "Renaming ZIP file." cp "build/$ARTIFACT_NAME.zip" "build/$PUBLISH_NAME.zip" if [ -e "./build/$ARTIFACT_NAME.exe" ]; then echo "Renaming installer." mv "./build/$ARTIFACT_NAME.exe" "./build/$PUBLISH_NAME.exe" fi fi echo "Creating version file." cp "build/$ARTIFACT_NAME/AboutThisBuild.txt" "build/$PUBLISH_NAME-AboutThisBuild.txt" echo "Recording publish name." echo "PUBLISH_NAME=$PUBLISH_NAME" >> "$(cygpath -u $GITHUB_ENV)" - name: Publish artifacts uses: softprops/action-gh-release@v2 if: ${{github.ref_type == 'tag' || github.ref_name == 'dev'}} with: tag_name: nightly-github-actions files: | build/${{env.PUBLISH_NAME}}.zip build/${{env.PUBLISH_NAME}}-AboutThisBuild.txt - name: Publish installer uses: softprops/action-gh-release@v2 if: ${{matrix.build_type == 'release' && (github.ref_type == 'tag' || github.ref_name == 'dev')}} with: tag_name: nightly-github-actions files: build/${{env.PUBLISH_NAME}}.exe - name: Prepare for publishing pre-dev id: prepare-publish-pre-dev if: ${{github.event_name == 'pull_request' && contains(fromJSON(env.publish_pre_dev_labels), github.event.pull_request.head.label)}} run: | echo "Making ref name." REF_NAME_FILTERED="$(echo '${{github.event.pull_request.head.label}}' | tr ':' '_' | sed 's/[^A-z0-9_.-]//g')" echo "Ref name is '$REF_NAME_FILTERED'." echo "Setting publish name." PUBLISH_NAME="RawTherapee_${REF_NAME_FILTERED}_win64_${{matrix.build_type}}" echo "Publish name is '$PUBLISH_NAME'." if [ "$ARTIFACT_NAME" != "$PUBLISH_NAME" ]; then echo "Renaming ZIP file." cp "build/$ARTIFACT_NAME.zip" "build/$PUBLISH_NAME.zip" if [ -e "./build/$ARTIFACT_NAME.exe" ]; then echo "Renaming installer." mv "./build/$ARTIFACT_NAME.exe" "./build/$PUBLISH_NAME.exe" fi fi echo "Creating version file." cp "build/$ARTIFACT_NAME/AboutThisBuild.txt" "build/$PUBLISH_NAME-AboutThisBuild.txt" echo "Recording publish name." echo "PUBLISH_NAME=$PUBLISH_NAME" >> "$(cygpath -u $GITHUB_ENV)" - name: Publish pre-dev artifacts uses: softprops/action-gh-release@v2 if: ${{steps.prepare-publish-pre-dev.outcome == 'success'}} with: tag_name: pre-dev-github-actions repository: Beep6581/RawTherapee files: | build/${{env.PUBLISH_NAME}}.zip build/${{env.PUBLISH_NAME}}-AboutThisBuild.txt - name: Publish pre-dev installer uses: softprops/action-gh-release@v2 if: ${{steps.prepare-publish-pre-dev.outcome == 'success' && matrix.build_type == 'release'}} with: tag_name: pre-dev-github-actions repository: Beep6581/RawTherapee files: build/${{env.PUBLISH_NAME}}.exe