Repository: conda-forge/quazip-feedstock
Pull request #7: build: Rebuild for Qt6
Author: login: effigies
Created: 2025-03-06T19:13:19Z | Merged: 2025-05-23T19:59:24Z

This PR is intended to allow `quazip` to be used in qt5 or qt6 environments, which will in turn allow downstream tools to provide qt5/qt6 variants.

The motivation here is that I have an environment with a CLI that is built against qt5 and the latest matplotlib is built against qt6, so I can't upgrade. I'm trying to upgrade the CLI feedstock in a similar fashion, and this PR will help there.

Checklist
* [x] Used a [personal fork of the feedstock to propose changes](https://conda-forge.org/docs/maintainer/updating_pkgs.html#forking-and-pull-requests)
* [x] Bumped the build number (if the version is unchanged)
* [x] Reset the build number to `0` (if the version changed)
* [x] [Re-rendered]( https://conda-forge.org/docs/maintainer/updating_pkgs.html#rerendering-feedstocks ) with the latest `conda-smithy` (Use the phrase <code>@<space/>conda-forge-admin, please rerender</code> in a comment in this PR for automated rerendering)
* [x] Ensured the license file is being packaged.


Diff:
diff --git a/.azure-pipelines/azure-pipelines-linux.yml b/.azure-pipelines/azure-pipelines-linux.yml
index 974e878..1741648 100755
--- a/.azure-pipelines/azure-pipelines-linux.yml
+++ b/.azure-pipelines/azure-pipelines-linux.yml
@@ -11,15 +11,11 @@ jobs:
       linux_64_:
         CONFIG: linux_64_
         UPLOAD_PACKAGES: 'True'
-        DOCKER_IMAGE: quay.io/condaforge/linux-anvil-cos7-x86_64
+        DOCKER_IMAGE: quay.io/condaforge/linux-anvil-x86_64:alma9
   timeoutInMinutes: 360
+  variables: {}
 
   steps:
-  - script: |
-         rm -rf /opt/ghc
-         df -h
-    displayName: Manage disk space
-
   # configure qemu binfmt-misc running.  This allows us to run docker containers
   # embedded qemu-static
   - script: |
@@ -30,6 +26,9 @@ jobs:
 
   - script: |
         export CI=azure
+        export flow_run_id=azure_$(Build.BuildNumber).$(System.JobAttempt)
+        export remote_url=$(Build.Repository.Uri)
+        export sha=$(Build.SourceVersion)
         export GIT_BRANCH=$BUILD_SOURCEBRANCHNAME
         export FEEDSTOCK_NAME=$(basename ${BUILD_REPOSITORY_NAME})
         if [[ "${BUILD_REASON:-}" == "PullRequest" ]]; then
diff --git a/.azure-pipelines/azure-pipelines-osx.yml b/.azure-pipelines/azure-pipelines-osx.yml
index 9e4e167..215eeeb 100755
--- a/.azure-pipelines/azure-pipelines-osx.yml
+++ b/.azure-pipelines/azure-pipelines-osx.yml
@@ -5,18 +5,22 @@
 jobs:
 - job: osx
   pool:
-    vmImage: macOS-11
+    vmImage: macOS-13
   strategy:
     matrix:
       osx_64_:
         CONFIG: osx_64_
         UPLOAD_PACKAGES: 'True'
   timeoutInMinutes: 360
+  variables: {}
 
   steps:
   # TODO: Fast finish on azure pipelines?
   - script: |
       export CI=azure
+      export flow_run_id=azure_$(Build.BuildNumber).$(System.JobAttempt)
+      export remote_url=$(Build.Repository.Uri)
+      export sha=$(Build.SourceVersion)
       export OSX_FORCE_SDK_DOWNLOAD="1"
       export GIT_BRANCH=$BUILD_SOURCEBRANCHNAME
       export FEEDSTOCK_NAME=$(basename ${BUILD_REPOSITORY_NAME})
diff --git a/.ci_support/linux_64_.yaml b/.ci_support/linux_64_.yaml
index 45313df..1bff31c 100644
--- a/.ci_support/linux_64_.yaml
+++ b/.ci_support/linux_64_.yaml
@@ -1,5 +1,9 @@
+c_stdlib:
+- sysroot
+c_stdlib_version:
+- '2.17'
 cdt_name:
-- cos6
+- conda
 channel_sources:
 - conda-forge
 channel_targets:
@@ -7,12 +11,12 @@ channel_targets:
 cxx_compiler:
 - gxx
 cxx_compiler_version:
-- '11'
+- '13'
 docker_image:
-- quay.io/condaforge/linux-anvil-cos7-x86_64
-qt_main:
-- '5.15'
+- quay.io/condaforge/linux-anvil-x86_64:alma9
+qt6_main:
+- '6.9'
 target_platform:
 - linux-64
 zlib:
-- '1.2'
+- '1'
diff --git a/.ci_support/migrations/qt515.yaml b/.ci_support/migrations/qt515.yaml
deleted file mode 100644
index 33bea1b..0000000
--- a/.ci_support/migrations/qt515.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-migrator_ts: 1653771978
-__migrator:
-  kind: version
-  migration_number: 1
-  bump_number: 1
-
-qt:
-  - 5.15
-qt_main:
-  - 5.15
diff --git a/.ci_support/osx_64_.yaml b/.ci_support/osx_64_.yaml
index 8f0b605..a4bf856 100644
--- a/.ci_support/osx_64_.yaml
+++ b/.ci_support/osx_64_.yaml
@@ -1,5 +1,11 @@
 MACOSX_DEPLOYMENT_TARGET:
-- '10.9'
+- '11.0'
+MACOSX_SDK_VERSION:
+- '11.0'
+c_stdlib:
+- macosx_deployment_target
+c_stdlib_version:
+- '11.0'
 channel_sources:
 - conda-forge
 channel_targets:
@@ -7,12 +13,12 @@ channel_targets:
 cxx_compiler:
 - clangxx
 cxx_compiler_version:
-- '14'
+- '18'
 macos_machine:
 - x86_64-apple-darwin13.4.0
-qt_main:
-- '5.15'
+qt6_main:
+- '6.9'
 target_platform:
 - osx-64
 zlib:
-- '1.2'
+- '1'
diff --git a/.gitattributes b/.gitattributes
index 7f32763..18f114a 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -20,8 +20,8 @@ bld.bat text eol=crlf
 .travis.yml linguist-generated=true
 .scripts/* linguist-generated=true
 .woodpecker.yml linguist-generated=true
-LICENSE.txt linguist-generated=true
-README.md linguist-generated=true
+/LICENSE.txt linguist-generated=true
+/README.md linguist-generated=true
 azure-pipelines.yml linguist-generated=true
 build-locally.py linguist-generated=true
 shippable.yml linguist-generated=true
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 19c1565..53cb8a1 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1 +1 @@
-* @izahn
\ No newline at end of file
+* @effigies @izahn
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index c89ecb7..47b5408 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,29 @@
+# User content belongs under recipe/.
+# Feedstock configuration goes in `conda-forge.yml`
+# Everything else is managed by the conda-smithy rerender process.
+# Please do not modify
+
+# Ignore all files and folders in root
+*
+!/conda-forge.yml
+
+# Don't ignore any files/folders if the parent folder is 'un-ignored'
+# This also avoids warnings when adding an already-checked file with an ignored parent.
+!/**/
+# Don't ignore any files/folders recursively in the following folders
+!/recipe/**
+!/.ci_support/**
+
+# Since we ignore files/folders recursively, any folders inside
+# build_artifacts gets ignored which trips some build systems.
+# To avoid that we 'un-ignore' all files/folders recursively
+# and only ignore the root build_artifacts folder.
+!/build_artifacts/**
+/build_artifacts
+
 *.pyc
 
-build_artifacts
+# Rattler-build's artifacts are in `output` when not specifying anything.
+/output
+# Pixi's configuration
+.pixi
diff --git a/.scripts/build_steps.sh b/.scripts/build_steps.sh
index 71a4242..f8051ab 100755
--- a/.scripts/build_steps.sh
+++ b/.scripts/build_steps.sh
@@ -28,20 +28,23 @@ conda-build:
 pkgs_dirs:
   - ${FEEDSTOCK_ROOT}/build_artifacts/pkg_cache
   - /opt/conda/pkgs
+solver: libmamba
 
 CONDARC
-
-
-mamba install --update-specs --yes --quiet --channel conda-forge \
-    conda-build pip boa conda-forge-ci-setup=3 "py-lief<0.12"
-mamba update --update-specs --yes --quiet --channel conda-forge \
-    conda-build pip boa conda-forge-ci-setup=3 "py-lief<0.12"
+mv /opt/conda/conda-meta/history /opt/conda/conda-meta/history.$(date +%Y-%m-%d-%H-%M-%S)
+echo > /opt/conda/conda-meta/history
+micromamba install --root-prefix ~/.conda --prefix /opt/conda \
+    --yes --override-channels --channel conda-forge --strict-channel-priority \
+    pip  python=3.12 conda-build conda-forge-ci-setup=4 "conda-build>=24.1"
+export CONDA_LIBMAMBA_SOLVER_NO_CHANNELS_FROM_INSTALLED=1
 
 # set up the condarc
 setup_conda_rc "${FEEDSTOCK_ROOT}" "${RECIPE_ROOT}" "${CONFIG_FILE}"
 
 source run_conda_forge_build_setup
 
+
+
 # make the build number clobber
 make_build_number "${FEEDSTOCK_ROOT}" "${RECIPE_ROOT}" "${CONFIG_FILE}"
 
@@ -64,9 +67,16 @@ if [[ "${BUILD_WITH_CONDA_DEBUG:-0}" == 1 ]]; then
     # Drop into an interactive shell
     /bin/bash
 else
-    conda mambabuild "${RECIPE_ROOT}" -m "${CI_SUPPORT}/${CONFIG}.yaml" \
+    conda-build "${RECIPE_ROOT}" -m "${CI_SUPPORT}/${CONFIG}.yaml" \
         --suppress-variables ${EXTRA_CB_OPTIONS:-} \
-        --clobber-file "${CI_SUPPORT}/clobber_${CONFIG}.yaml"
+        --clobber-file "${CI_SUPPORT}/clobber_${CONFIG}.yaml" \
+        --extra-meta flow_run_id="${flow_run_id:-}" remote_url="${remote_url:-}" sha="${sha:-}"
+    ( startgroup "Inspecting artifacts" ) 2> /dev/null
+
+    # inspect_artifacts was only added in conda-forge-ci-setup 4.9.4
+    command -v inspect_artifacts >/dev/null 2>&1 && inspect_artifacts --recipe-dir "${RECIPE_ROOT}" -m "${CONFIG_FILE}" || echo "inspect_artifacts needs conda-forge-ci-setup >=4.9.4"
+
+    ( endgroup "Inspecting artifacts" ) 2> /dev/null
     ( startgroup "Validating outputs" ) 2> /dev/null
 
     validate_recipe_outputs "${FEEDSTOCK_NAME}"
diff --git a/.scripts/logging_utils.sh b/.scripts/logging_utils.sh
index 57bc95c..aff009f 100644
--- a/.scripts/logging_utils.sh
+++ b/.scripts/logging_utils.sh
@@ -12,7 +12,7 @@ function startgroup {
             echo "##[group]$1";;
         travis )
             echo "$1"
-            echo -en 'travis_fold:start:'"${1// /}"'\\r';;
+            echo -en 'travis_fold:start:'"${1// /}"'\r';;
         github_actions )
             echo "::group::$1";;
         * )
@@ -28,7 +28,7 @@ function endgroup {
         azure )
             echo "##[endgroup]";;
         travis )
-            echo -en 'travis_fold:end:'"${1// /}"'\\r';;
+            echo -en 'travis_fold:end:'"${1// /}"'\r';;
         github_actions )
             echo "::endgroup::";;
     esac
diff --git a/.scripts/run_docker_build.sh b/.scripts/run_docker_build.sh
index 9236239..6ee04aa 100755
--- a/.scripts/run_docker_build.sh
+++ b/.scripts/run_docker_build.sh
@@ -12,7 +12,7 @@ source .scripts/logging_utils.sh
 set -xeo pipefail
 
 THISDIR="$( cd "$( dirname "$0" )" >/dev/null && pwd )"
-PROVIDER_DIR="$(basename $THISDIR)"
+PROVIDER_DIR="$(basename "$THISDIR")"
 
 FEEDSTOCK_ROOT="$( cd "$( dirname "$0" )/.." >/dev/null && pwd )"
 RECIPE_ROOT="${FEEDSTOCK_ROOT}/recipe"
@@ -21,6 +21,12 @@ if [ -z ${FEEDSTOCK_NAME} ]; then
     export FEEDSTOCK_NAME=$(basename ${FEEDSTOCK_ROOT})
 fi
 
+if [[ "${sha:-}" == "" ]]; then
+  pushd "${FEEDSTOCK_ROOT}"
+  sha=$(git rev-parse HEAD)
+  popd
+fi
+
 docker info
 
 # In order for the conda-build process in the container to write to the mounted
@@ -91,6 +97,9 @@ docker run ${DOCKER_RUN_ARGS} \
            -e CPU_COUNT \
            -e BUILD_WITH_CONDA_DEBUG \
            -e BUILD_OUTPUT_ID \
+           -e flow_run_id \
+           -e remote_url \
+           -e sha \
            -e BINSTAR_TOKEN \
            -e FEEDSTOCK_TOKEN \
            -e STAGING_BINSTAR_TOKEN \
diff --git a/.scripts/run_osx_build.sh b/.scripts/run_osx_build.sh
index caa788e..ee996f4 100755
--- a/.scripts/run_osx_build.sh
+++ b/.scripts/run_osx_build.sh
@@ -6,27 +6,41 @@ source .scripts/logging_utils.sh
 
 set -xe
 
-MINIFORGE_HOME=${MINIFORGE_HOME:-${HOME}/miniforge3}
-
-( startgroup "Installing a fresh version of Miniforge" ) 2> /dev/null
-
-MINIFORGE_URL="https://github.com/conda-forge/miniforge/releases/latest/download"
-MINIFORGE_FILE="Mambaforge-MacOSX-$(uname -m).sh"
-curl -L -O "${MINIFORGE_URL}/${MINIFORGE_FILE}"
-rm -rf ${MINIFORGE_HOME}
-bash $MINIFORGE_FILE -b -p ${MINIFORGE_HOME}
-
-( endgroup "Installing a fresh version of Miniforge" ) 2> /dev/null
+MINIFORGE_HOME="${MINIFORGE_HOME:-${HOME}/miniforge3}"
+MINIFORGE_HOME="${MINIFORGE_HOME%/}" # remove trailing slash
+export CONDA_BLD_PATH="${CONDA_BLD_PATH:-${MINIFORGE_HOME}/conda-bld}"
+
+( startgroup "Provisioning base env with micromamba" ) 2> /dev/null
+MICROMAMBA_VERSION="1.5.10-0"
+if [[ "$(uname -m)" == "arm64" ]]; then
+  osx_arch="osx-arm64"
+else
+  osx_arch="osx-64"
+fi
+MICROMAMBA_URL="https://github.com/mamba-org/micromamba-releases/releases/download/${MICROMAMBA_VERSION}/micromamba-${osx_arch}"
+MAMBA_ROOT_PREFIX="${MINIFORGE_HOME}-micromamba-$(date +%s)"
+echo "Downloading micromamba ${MICROMAMBA_VERSION}"
+micromamba_exe="$(mktemp -d)/micromamba"
+curl -L -o "${micromamba_exe}" "${MICROMAMBA_URL}"
+chmod +x "${micromamba_exe}"
+echo "Creating environment"
+"${micromamba_exe}" create --yes --root-prefix "${MAMBA_ROOT_PREFIX}" --prefix "${MINIFORGE_HOME}" \
+  --channel conda-forge \
+  pip python=3.12 conda-build conda-forge-ci-setup=4 "conda-build>=24.1"
+echo "Moving pkgs cache from ${MAMBA_ROOT_PREFIX} to ${MINIFORGE_HOME}"
+mv "${MAMBA_ROOT_PREFIX}/pkgs" "${MINIFORGE_HOME}"
+echo "Cleaning up micromamba"
+rm -rf "${MAMBA_ROOT_PREFIX}" "${micromamba_exe}" || true
+( endgroup "Provisioning base env with micromamba" ) 2> /dev/null
 
 ( startgroup "Configuring conda" ) 2> /dev/null
-
-source ${MINIFORGE_HOME}/etc/profile.d/conda.sh
+echo "Activating environment"
+source "${MINIFORGE_HOME}/etc/profile.d/conda.sh"
 conda activate base
+export CONDA_SOLVER="libmamba"
+export CONDA_LIBMAMBA_SOLVER_NO_CHANNELS_FROM_INSTALLED=1
+
 
-mamba install --update-specs --quiet --yes --channel conda-forge \
-    conda-build pip boa conda-forge-ci-setup=3 "py-lief<0.12"
-mamba update --update-specs --yes --quiet --channel conda-forge \
-    conda-build pip boa conda-forge-ci-setup=3 "py-lief<0.12"
 
 
 
@@ -45,6 +59,10 @@ else
   echo -e "\n\nNot mangling homebrew as we are not running in CI"
 fi
 
+if [[ "${sha:-}" == "" ]]; then
+  sha=$(git rev-parse HEAD)
+fi
+
 echo -e "\n\nRunning the build setup script."
 source run_conda_forge_build_setup
 
@@ -55,7 +73,6 @@ source run_conda_forge_build_setup
 echo -e "\n\nMaking the build clobber file"
 make_build_number ./ ./recipe ./.ci_support/${CONFIG}.yaml
 
-
 if [[ -f LICENSE.txt ]]; then
   cp LICENSE.txt "recipe/recipe-scripts-license.txt"
 fi
@@ -71,9 +88,18 @@ if [[ "${BUILD_WITH_CONDA_DEBUG:-0}" == 1 ]]; then
     # Drop into an interactive shell
     /bin/bash
 else
-    conda mambabuild ./recipe -m ./.ci_support/${CONFIG}.yaml \
+
+    conda-build ./recipe -m ./.ci_support/${CONFIG}.yaml \
         --suppress-variables ${EXTRA_CB_OPTIONS:-} \
-        --clobber-file ./.ci_support/clobber_${CONFIG}.yaml
+        --clobber-file ./.ci_support/clobber_${CONFIG}.yaml \
+        --extra-meta flow_run_id="$flow_run_id" remote_url="$remote_url" sha="$sha"
+
+    ( startgroup "Inspecting artifacts" ) 2> /dev/null
+
+    # inspect_artifacts was only added in conda-forge-ci-setup 4.9.4
+    command -v inspect_artifacts >/dev/null 2>&1 && inspect_artifacts --recipe-dir ./recipe -m ./.ci_support/${CONFIG}.yaml || echo "inspect_artifacts needs conda-forge-ci-setup >=4.9.4"
+
+    ( endgroup "Inspecting artifacts" ) 2> /dev/null
     ( startgroup "Validating outputs" ) 2> /dev/null
 
     validate_recipe_outputs "${FEEDSTOCK_NAME}"
diff --git a/README.md b/README.md
index c3ab987..58c78f1 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,12 @@
-About quazip
-============
+About quazip-feedstock
+======================
+
+Feedstock license: [BSD-3-Clause](https://github.com/conda-forge/quazip-feedstock/blob/main/LICENSE.txt)
 
 Home: https://stachenov.github.io/quazip/
 
 Package license: GPL-2.0-only
 
-Feedstock license: [BSD-3-Clause](https://github.com/conda-forge/quazip-feedstock/blob/main/LICENSE.txt)
-
 Summary: Qt/C++ wrapper over minizip
 
 Current build status
@@ -121,7 +121,7 @@ available continuous integration services. Thanks to the awesome service provide
 [CircleCI](https://circleci.com/), [AppVeyor](https://www.appveyor.com/),
 [Drone](https://cloud.drone.io/welcome), and [TravisCI](https://travis-ci.com/)
 it is possible to build and upload installable packages to the
-[conda-forge](https://anaconda.org/conda-forge) [Anaconda-Cloud](https://anaconda.org/)
+[conda-forge](https://anaconda.org/conda-forge) [anaconda.org](https://anaconda.org/)
 channel for Linux, Windows and OSX respectively.
 
 To manage the continuous integration and simplify feedstock maintenance
@@ -169,5 +169,6 @@ In order to produce a uniquely identifiable distribution:
 Feedstock Maintainers
 =====================
 
+* [@effigies](https://github.com/effigies/)
 * [@izahn](https://github.com/izahn/)
 
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 33a441c..013bdc1 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -2,6 +2,31 @@
 # update the conda-forge.yml and/or the recipe/meta.yaml.
 # -*- mode: yaml -*-
 
-jobs:
-  - template: ./.azure-pipelines/azure-pipelines-linux.yml
-  - template: ./.azure-pipelines/azure-pipelines-osx.yml
\ No newline at end of file
+stages:
+- stage: Check
+  jobs:
+    - job: Skip
+      pool:
+        vmImage: 'ubuntu-22.04'
+      variables:
+        DECODE_PERCENTS: 'false'
+        RET: 'true'
+      steps:
+      - checkout: self
+        fetchDepth: '2'
+      - bash: |
+          git_log=`git log --max-count=1 --skip=1 --pretty=format:"%B" | tr "\n" " "`
+          echo "##vso[task.setvariable variable=log]$git_log"
+        displayName: Obtain commit message
+      - bash: echo "##vso[task.setvariable variable=RET]false"
+        condition: and(eq(variables['Build.Reason'], 'PullRequest'), or(contains(variables.log, '[skip azp]'), contains(variables.log, '[azp skip]'), contains(variables.log, '[skip ci]'), contains(variables.log, '[ci skip]')))
+        displayName: Skip build?
+      - bash: echo "##vso[task.setvariable variable=start_main;isOutput=true]$RET"
+        name: result
+        displayName: Export result
+- stage: Build
+  condition: and(succeeded(), eq(dependencies.Check.outputs['Skip.result.start_main'], 'true'))
+  dependsOn: Check
+  jobs:
+    - template: ./.azure-pipelines/azure-pipelines-linux.yml
+    - template: ./.azure-pipelines/azure-pipelines-osx.yml
\ No newline at end of file
diff --git a/build-locally.py b/build-locally.py
index 3f4b7a7..02c2374 100755
--- a/build-locally.py
+++ b/build-locally.py
@@ -1,13 +1,17 @@
-#!/usr/bin/env python3
+#!/bin/sh
+"""exec" "python3" "$0" "$@" #"""  # fmt: off # fmt: on
 #
 # This file has been generated by conda-smithy in order to build the recipe
 # locally.
 #
-import os
+# The line above this comment is a bash / sh / zsh guard
+# to stop people from running it with the wrong interpreter
 import glob
+import os
+import platform
 import subprocess
+import sys
 from argparse import ArgumentParser
-import platform
 
 
 def setup_environment(ns):
@@ -23,6 +27,13 @@ def setup_environment(ns):
             os.path.dirname(__file__), "miniforge3"
         )
 
+    # The default cache location might not be writable using docker on macOS.
+    if ns.config.startswith("linux") and platform.system() == "Darwin":
+        os.environ["CONDA_FORGE_DOCKER_RUN_ARGS"] = (
+            os.environ.get("CONDA_FORGE_DOCKER_RUN_ARGS", "")
+            + " -e RATTLER_CACHE_DIR=/tmp/rattler_cache"
+        )
+
 
 def run_docker_build(ns):
     script = ".scripts/run_docker_build.sh"
@@ -34,10 +45,19 @@ def run_osx_build(ns):
     subprocess.check_call([script])
 
 
+def run_win_build(ns):
+    script = ".scripts/run_win_build.bat"
+    subprocess.check_call(["cmd", "/D", "/Q", "/C", f"CALL {script}"])
+
+
 def verify_config(ns):
+    choices_filter = ns.filter or "*"
     valid_configs = {
-        os.path.basename(f)[:-5] for f in glob.glob(".ci_support/*.yaml")
+        os.path.basename(f)[:-5]
+        for f in glob.glob(f".ci_support/{choices_filter}.yaml")
     }
+    if choices_filter != "*":
+        print(f"filtering for '{choices_filter}.yaml' configs")
     print(f"valid configs are {valid_configs}")
     if ns.config in valid_configs:
         print("Using " + ns.config + " configuration")
@@ -50,29 +70,37 @@ def verify_config(ns):
         selections = list(enumerate(sorted(valid_configs), 1))
         for i, c in selections:
             print(f"{i}. {c}")
-        s = input("\n> ")
+        try:
+            s = input("\n> ")
+        except KeyboardInterrupt:
+            print("\nno option selected, bye!", file=sys.stderr)
+            sys.exit(1)
         idx = int(s) - 1
         ns.config = selections[idx][1]
         print(f"selected {ns.config}")
     else:
         raise ValueError("config " + ns.config + " is not valid")
-    # Remove the following, as implemented
-    if ns.config.startswith("win"):
-        raise ValueError(
-            f"only Linux/macOS configs currently supported, got {ns.config}"
+    if (
+        ns.config.startswith("osx")
+        and platform.system() == "Darwin"
+        and not os.environ.get("OSX_SDK_DIR")
+    ):
+        raise RuntimeError(
+            "Need OSX_SDK_DIR env variable set. Run 'export OSX_SDK_DIR=$PWD/SDKs' "
+            "to download the SDK automatically to '$PWD/SDKs/MacOSX<ver>.sdk'. "
+            "Note: OSX_SDK_DIR must be set to an absolute path. "
+            "Setting this variable implies agreement to the licensing terms of the SDK by Apple."
         )
-    elif ns.config.startswith("osx"):
-        if "OSX_SDK_DIR" not in os.environ:
-            raise RuntimeError(
-                "Need OSX_SDK_DIR env variable set. Run 'export OSX_SDK_DIR=SDKs' "
-                "to download the SDK automatically to 'SDKs/MacOSX<ver>.sdk'. "
-                "Setting this variable implies agreement to the licensing terms of the SDK by Apple."
-            )
 
 
 def main(args=None):
     p = ArgumentParser("build-locally")
     p.add_argument("config", default=None, nargs="?")
+    p.add_argument(
+        "--filter",
+        default=None,
+        help="Glob string to filter which build choices are presented in interactive mode.",
+    )
     p.add_argument(
         "--debug",
         action="store_true",
@@ -93,6 +121,8 @@ def main(args=None):
             run_docker_build(ns)
         elif ns.config.startswith("osx"):
             run_osx_build(ns)
+        elif ns.config.startswith("win"):
+            run_win_build(ns)
     finally:
         recipe_license_file = os.path.join(
             "recipe", "recipe-scripts-license.txt"
diff --git a/recipe/build.sh b/recipe/build.sh
index b2c1bf3..fdb3caa 100644
--- a/recipe/build.sh
+++ b/recipe/build.sh
@@ -2,7 +2,11 @@
 
 mkdir build
 
-cmake -B build -S . ${CMAKE_ARGS} -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_INSTALL_LIBDIR=lib
+CXXFLAGS="${CXXFLAGS} -D_LIBCPP_DISABLE_AVAILABILITY"
+
+cmake -B build -S . ${CMAKE_ARGS} \
+    -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_INSTALL_LIBDIR=lib \
+    -DCMAKE_CXX_FLAGS="${CXXFLAGS}"
 cmake --build build
 cmake --install build
 
diff --git a/recipe/conda_build_config.yaml b/recipe/conda_build_config.yaml
new file mode 100644
index 0000000..7742be3
--- /dev/null
+++ b/recipe/conda_build_config.yaml
@@ -0,0 +1,2 @@
+c_stdlib_version:          # [osx]
+  - '11.0'                 # [osx]
diff --git a/recipe/meta.yaml b/recipe/meta.yaml
index bf4eaf3..dde2c33 100644
--- a/recipe/meta.yaml
+++ b/recipe/meta.yaml
@@ -10,7 +10,7 @@ source:
   sha256: 79633fd3a18e2d11a7d5c40c4c79c1786ba0c74b59ad752e8429746fe1781dd6
 
 build:
-  number: 0
+  number: 1
   skip: true  # [win]
   run_exports:
     - {{ pin_subpackage('quazip', max_pin='x') }}
@@ -20,16 +20,14 @@ requirements:
     - cmake
     - make
     - {{ compiler('cxx') }}
+    - {{ stdlib('c') }}
   host:
-    - qt-main
-    - zlib
-  run:
-    - qt-main
+    - qt6-main
     - zlib
 
 test:
   commands:
-    - test -f $PREFIX/lib/libquazip1-qt5.so  # [linux]
+    - test -f $PREFIX/lib/libquazip1-qt6.so  # [linux]
 
 about:
   home: https://stachenov.github.io/quazip/
@@ -41,3 +39,4 @@ about:
 extra:
   recipe-maintainers:
     - izahn
+    - effigies


Reviews:
user: login: h-vetinari
body: Thanks for stepping up! Two nits (not important), but one question about what you're doing with zlib.
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-23T02:45:37Z
user: login: hmaarrfk
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-23T04:26:52Z
user: login: effigies
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-23T12:01:06Z
user: login: effigies
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-23T12:17:06Z

Review comments:
diff_hunk: @@ -0,0 +1,11 @@
+c_stdlib_version:          # [osx]
+  - '11.0'                 # [osx]
+MACOSX_SDK_VERSION:        # [osx]
+  - '11.0'                 # [osx]
+
+c_stdlib_version:          # [linux]
+  - 2.17                   # [linux]
path: recipe/conda_build_config.yaml
user: login: h-vetinari
body: This is not necessary anymore, as it's not the default.
created_at: 2025-05-23T02:42:22Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,11 @@
+c_stdlib_version:          # [osx]
+  - '11.0'                 # [osx]
+MACOSX_SDK_VERSION:        # [osx]
+  - '11.0'                 # [osx]
path: recipe/conda_build_config.yaml
user: login: h-vetinari
body: If you raise the stdlib version, then the MACOSX_SDK_VERSION does not need to be specified (it always satisfied >=c_stdlib_version).
created_at: 2025-05-23T02:43:08Z
author_association: MEMBER
diff_hunk: @@ -20,16 +24,20 @@ requirements:
     - cmake
     - make
     - {{ compiler('cxx') }}
+    - {{ stdlib('c') }}
+    - noqt6                          # [build_variant == "qt5"]
+    - noqt5                          # [build_variant == "qt6"]
   host:
-    - qt-main
-    - zlib
-  run:
-    - qt-main
-    - zlib
+    - qt-main                        # [build_variant == "qt5"]
+    - qt6-main                       # [build_variant == "qt6"]
+    # Compatible with 1.2 and 1.3
+    - zlib =1.2                      # [build_variant == "qt5"]
+    - zlib =1.3                      # [build_variant == "qt6"]
path: recipe/meta.yaml
user: login: h-vetinari
body: Why are you building the qt5 variant against zlib 1.2? Everything built against 1.2 is compatible with 1.3 (and we've patched this retroactively), so I don't see why this is necessary. It should stay
```suggestion
    - zlib
```
created_at: 2025-05-23T02:45:07Z
author_association: MEMBER
diff_hunk: @@ -20,16 +24,20 @@ requirements:
     - cmake
     - make
     - {{ compiler('cxx') }}
+    - {{ stdlib('c') }}
+    - noqt6                          # [build_variant == "qt5"]
+    - noqt5                          # [build_variant == "qt6"]
path: recipe/meta.yaml
user: login: hmaarrfk
body: These noqt stuff are not necessary. Your build dependencies are very simple. 
created_at: 2025-05-23T04:26:52Z
author_association: CONTRIBUTOR
diff_hunk: @@ -20,16 +24,20 @@ requirements:
     - cmake
     - make
     - {{ compiler('cxx') }}
+    - {{ stdlib('c') }}
+    - noqt6                          # [build_variant == "qt5"]
+    - noqt5                          # [build_variant == "qt6"]
   host:
-    - qt-main
-    - zlib
-  run:
-    - qt-main
-    - zlib
+    - qt-main                        # [build_variant == "qt5"]
+    - qt6-main                       # [build_variant == "qt6"]
+    # Compatible with 1.2 and 1.3
+    - zlib =1.2                      # [build_variant == "qt5"]
+    - zlib =1.3                      # [build_variant == "qt6"]
path: recipe/meta.yaml
user: login: effigies
body: I believe this helped with dependency resolution for things built with older versions of zlib 1.2 that had pins of `<1.3`. I will build locally and see if I can install packages with just zlib.
created_at: 2025-05-23T12:01:06Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,11 @@
+c_stdlib_version:          # [osx]
+  - '11.0'                 # [osx]
+MACOSX_SDK_VERSION:        # [osx]
+  - '11.0'                 # [osx]
+
+c_stdlib_version:          # [linux]
+  - 2.17                   # [linux]
path: recipe/conda_build_config.yaml
user: login: effigies
body: I thought if we didn't pin 2.17, then newer glibc will be used, and the packages won't work for users stuck on centos7 (most academic HPC users, AFAICT)?
created_at: 2025-05-23T12:17:06Z
author_association: CONTRIBUTOR

PR comments:
user: login: conda-forge-admin
created_at: 2025-03-06T19:14:48Z
body: Hi! This is the friendly automated conda-forge-linting service.

I wanted to let you know that I linted all conda-recipes in your PR (```recipe/meta.yaml```) and found some lint.

Here's what I've got...


For **recipe/meta.yaml**:

 * ❌ This recipe is using a compiler, which now requires adding a build dependence on `{{ stdlib("c") }}` as well. Note that this rule applies to each output of the recipe using a compiler. For further details, please see https://github.com/conda-forge/conda-forge.github.io/issues/2102.


<sub>This message was generated by GitHub Actions workflow run [https://github.com/conda-forge/conda-forge-webservices/actions/runs/13706365411](https://github.com/conda-forge/conda-forge-webservices/actions/runs/13706365411). Examine the logs at this URL for more detail.</sub>

author_association: CONTRIBUTOR
user: login: conda-forge-admin
created_at: 2025-03-06T19:24:26Z
body: Hi! This is the friendly automated conda-forge-linting service.

I just wanted to let you know that I linted all conda-recipes in your PR (```recipe/meta.yaml```) and found it was in an excellent condition.

author_association: CONTRIBUTOR
user: login: effigies
created_at: 2025-03-07T15:23:19Z
body: @izahn This is ready to go, if you wouldn't mind taking a look!
author_association: CONTRIBUTOR
user: login: effigies
created_at: 2025-05-15T15:00:46Z
body: @conda-forge-admin, please rerender
author_association: CONTRIBUTOR
user: login: effigies
created_at: 2025-05-15T16:38:19Z
body: @izahn I wonder if you have time to look at this?
author_association: CONTRIBUTOR
user: login: effigies
created_at: 2025-05-23T02:26:17Z
body: @conda-forge-admin, please rerender
author_association: CONTRIBUTOR
user: login: effigies
created_at: 2025-05-23T02:27:31Z
body: @conda-forge/core I'm willing to maintain this recipe. I've added myself to the maintainers' list. I am on a number of other recipes: https://github.com/search?q=org%3Aconda-forge%20%2F-%20effigies%2F&type=code
author_association: CONTRIBUTOR
user: login: effigies
created_at: 2025-05-23T13:11:52Z
body: @h-vetinari @hmaarrfk Thanks for the reviews. I simplified the dependencies and things seem to be working. I will ping you if it seems like I need to complicate them again, if that's alright.
author_association: CONTRIBUTOR
user: login: hmaarrfk
created_at: 2025-05-23T13:49:49Z
body: one question i have for you is:

do you need both qt5 and qt6 support?

The increase in build matrix and complexity is rather cumbersome to continue.

Why not just move to qt6?
author_association: CONTRIBUTOR
user: login: effigies
created_at: 2025-05-23T14:32:38Z
body: Unless things have changed, I couldn't install both qt5 and qt6 tools into the same conda environment. Thus, if my dependency tree contained a tool built with qt5 and a tool built with qt6, I couldn't resolve.

So the goal here is to allow tools that depend on quazip to also have qt5 and qt6 builds. I suppose I could move to qt6, and the downstream build would use the older version for qt5 and the newer versions for qt6.
author_association: CONTRIBUTOR
user: login: hmaarrfk
created_at: 2025-05-23T14:48:33Z
body: > I suppose I could move to qt6, and the downstream build would use the older version for qt5 and the newer versions for qt6.

This is MUCH MUCH simpler to support and I would strongly encourage this.

I moved opencv to drop all qt5 builds.

> Unless things have changed, I couldn't install both qt5 and qt6 tools

We have worked hard to enable this possibility, so i'm surprised that this is what you experienced. However, it is almost not worth troubleshooting IMO.
author_association: CONTRIBUTOR
user: login: effigies
created_at: 2025-05-23T16:44:32Z
body: @hmaarrfk Done.
author_association: CONTRIBUTOR