Repository: conda-forge/rapidcheck-feedstock
Pull request #3: Generate the import library on Windows
Author: login: jjerphan
Created: 2025-03-20T14:45:23Z | Merged: 2025-03-21T09:01:21Z

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)
* [ ] 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.

@conda-forge-admin, please rerender


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 8032e96..ac0bf38 100755
--- a/.azure-pipelines/azure-pipelines-osx.yml
+++ b/.azure-pipelines/azure-pipelines-osx.yml
@@ -5,7 +5,7 @@
 jobs:
 - job: osx
   pool:
-    vmImage: macOS-11
+    vmImage: macOS-13
   strategy:
     matrix:
       osx_64_:
@@ -15,11 +15,15 @@ jobs:
         CONFIG: osx_arm64_
         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/.azure-pipelines/azure-pipelines-win.yml b/.azure-pipelines/azure-pipelines-win.yml
index 8a96a72..13022dd 100755
--- a/.azure-pipelines/azure-pipelines-win.yml
+++ b/.azure-pipelines/azure-pipelines-win.yml
@@ -14,73 +14,25 @@ jobs:
   timeoutInMinutes: 360
   variables:
     CONDA_BLD_PATH: D:\\bld\\
+    MINIFORGE_HOME: D:\Miniforge
     UPLOAD_TEMP: D:\\tmp
 
   steps:
-    - task: PythonScript@0
-      displayName: 'Download Miniforge'
-      inputs:
-        scriptSource: inline
-        script: |
-          import urllib.request
-          url = 'https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Windows-x86_64.exe'
-          path = r"$(Build.ArtifactStagingDirectory)/Miniforge.exe"
-          urllib.request.urlretrieve(url, path)
 
     - script: |
-        start /wait "" %BUILD_ARTIFACTSTAGINGDIRECTORY%\Miniforge.exe /InstallationType=JustMe /RegisterPython=0 /S /D=C:\Miniforge
-      displayName: Install Miniforge
-
-    - powershell: Write-Host "##vso[task.prependpath]C:\Miniforge\Scripts"
-      displayName: Add conda to PATH
-
-    - script: |
-        call activate base
-        mamba.exe install "python=3.10" conda-build conda pip boa conda-forge-ci-setup=3 -c conda-forge --strict-channel-priority --yes
-      displayName: Install conda-build
-
-    - script: set PYTHONUNBUFFERED=1
-      displayName: Set PYTHONUNBUFFERED
-
-    # Configure the VM
-    - script: |
-        call activate base
-        setup_conda_rc .\ ".\recipe" .\.ci_support\%CONFIG%.yaml
-      displayName: conda-forge CI setup
-
-    # Configure the VM.
-    - script: |
-        set "CI=azure"
-        call activate base
-        run_conda_forge_build_setup
-      displayName: conda-forge build setup
-
-    - script: |
-        call activate base
-        if EXIST LICENSE.txt (
-          copy LICENSE.txt "recipe\\recipe-scripts-license.txt"
-        )
-        conda.exe mambabuild "recipe" -m .ci_support\%CONFIG%.yaml --suppress-variables
-      displayName: Build recipe
+        call ".scripts\run_win_build.bat"
+      displayName: Run Windows build
       env:
+        MINIFORGE_HOME: $(MINIFORGE_HOME)
+        CONDA_BLD_PATH: $(CONDA_BLD_PATH)
         PYTHONUNBUFFERED: 1
-    - script: |
-        set "FEEDSTOCK_NAME=%BUILD_REPOSITORY_NAME:*/=%"
-        call activate base
-        validate_recipe_outputs "%FEEDSTOCK_NAME%"
-      displayName: Validate Recipe Outputs
-
-    - script: |
-        set "GIT_BRANCH=%BUILD_SOURCEBRANCHNAME%"
-        set "FEEDSTOCK_NAME=%BUILD_REPOSITORY_NAME:*/=%"
-        set "TEMP=$(UPLOAD_TEMP)"
-        if not exist "%TEMP%\" md "%TEMP%"
-        set "TMP=%TEMP%"
-        call activate base
-        upload_package --validate --feedstock-name="%FEEDSTOCK_NAME%" .\ ".\recipe" .ci_support\%CONFIG%.yaml
-      displayName: Upload package
-      env:
+        CONFIG: $(CONFIG)
+        CI: azure
+        flow_run_id: azure_$(Build.BuildNumber).$(System.JobAttempt)
+        remote_url: $(Build.Repository.Uri)
+        sha: $(Build.SourceVersion)
+        UPLOAD_PACKAGES: $(UPLOAD_PACKAGES)
+        UPLOAD_TEMP: $(UPLOAD_TEMP)
         BINSTAR_TOKEN: $(BINSTAR_TOKEN)
         FEEDSTOCK_TOKEN: $(FEEDSTOCK_TOKEN)
-        STAGING_BINSTAR_TOKEN: $(STAGING_BINSTAR_TOKEN)
-      condition: and(succeeded(), not(eq(variables['UPLOAD_PACKAGES'], 'False')), not(eq(variables['Build.Reason'], 'PullRequest')))
\ No newline at end of file
+        STAGING_BINSTAR_TOKEN: $(STAGING_BINSTAR_TOKEN)
\ No newline at end of file
diff --git a/.ci_support/linux_64_.yaml b/.ci_support/linux_64_.yaml
index f6b4424..f1ac79a 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,8 +11,8 @@ channel_targets:
 cxx_compiler:
 - gxx
 cxx_compiler_version:
-- '12'
+- '13'
 docker_image:
-- quay.io/condaforge/linux-anvil-cos7-x86_64
+- quay.io/condaforge/linux-anvil-x86_64:alma9
 target_platform:
 - linux-64
diff --git a/.ci_support/osx_64_.yaml b/.ci_support/osx_64_.yaml
index 12bf16e..8beeaa0 100644
--- a/.ci_support/osx_64_.yaml
+++ b/.ci_support/osx_64_.yaml
@@ -1,5 +1,11 @@
 MACOSX_DEPLOYMENT_TARGET:
-- '10.9'
+- '10.13'
+MACOSX_SDK_VERSION:
+- '10.13'
+c_stdlib:
+- macosx_deployment_target
+c_stdlib_version:
+- '10.13'
 channel_sources:
 - conda-forge
 channel_targets:
@@ -7,7 +13,7 @@ channel_targets:
 cxx_compiler:
 - clangxx
 cxx_compiler_version:
-- '15'
+- '18'
 macos_machine:
 - x86_64-apple-darwin13.4.0
 target_platform:
diff --git a/.ci_support/osx_arm64_.yaml b/.ci_support/osx_arm64_.yaml
index 6511b26..d402228 100644
--- a/.ci_support/osx_arm64_.yaml
+++ b/.ci_support/osx_arm64_.yaml
@@ -1,5 +1,11 @@
 MACOSX_DEPLOYMENT_TARGET:
 - '11.0'
+MACOSX_SDK_VERSION:
+- '11.0'
+c_stdlib:
+- macosx_deployment_target
+c_stdlib_version:
+- '11.0'
 channel_sources:
 - conda-forge
 channel_targets:
@@ -7,7 +13,7 @@ channel_targets:
 cxx_compiler:
 - clangxx
 cxx_compiler_version:
-- '15'
+- '18'
 macos_machine:
 - arm64-apple-darwin20.0.0
 target_platform:
diff --git a/.ci_support/win_64_.yaml b/.ci_support/win_64_.yaml
index 31e5d9b..768e455 100644
--- a/.ci_support/win_64_.yaml
+++ b/.ci_support/win_64_.yaml
@@ -1,3 +1,5 @@
+c_stdlib:
+- vs
 channel_sources:
 - conda-forge
 channel_targets:
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/.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 a6b09f6..827a29f 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
-mamba update --update-specs --yes --quiet --channel conda-forge \
-    conda-build pip boa conda-forge-ci-setup=3
+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}"
 
@@ -67,9 +70,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..00f377a 100755
--- a/.scripts/run_docker_build.sh
+++ b/.scripts/run_docker_build.sh
@@ -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 bb00584..0e3c394 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
-mamba update --update-specs --yes --quiet --channel conda-forge \
-    conda-build pip boa conda-forge-ci-setup=3
 
 
 
@@ -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,11 +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 [[ "${HOST_PLATFORM}" != "${BUILD_PLATFORM}" ]]; then
-    EXTRA_CB_OPTIONS="${EXTRA_CB_OPTIONS:-} --no-test"
-fi
-
-
 if [[ -f LICENSE.txt ]]; then
   cp LICENSE.txt "recipe/recipe-scripts-license.txt"
 fi
@@ -75,9 +88,22 @@ if [[ "${BUILD_WITH_CONDA_DEBUG:-0}" == 1 ]]; then
     # Drop into an interactive shell
     /bin/bash
 else
-    conda mambabuild ./recipe -m ./.ci_support/${CONFIG}.yaml \
+
+    if [[ "${HOST_PLATFORM}" != "${BUILD_PLATFORM}" ]]; then
+        EXTRA_CB_OPTIONS="${EXTRA_CB_OPTIONS:-} --no-test"
+    fi
+
+    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/.scripts/run_win_build.bat b/.scripts/run_win_build.bat
new file mode 100755
index 0000000..283e143
--- /dev/null
+++ b/.scripts/run_win_build.bat
@@ -0,0 +1,151 @@
+:: PLEASE NOTE: This script has been automatically generated by conda-smithy. Any changes here
+:: will be lost next time ``conda smithy rerender`` is run. If you would like to make permanent
+:: changes to this script, consider a proposal to conda-smithy so that other feedstocks can also
+:: benefit from the improvement.
+
+:: INPUTS (required environment variables)
+:: CONFIG: name of the .ci_support/*.yaml file for this job
+:: CI: azure, github_actions, or unset
+:: MINIFORGE_HOME: where to install the base conda environment
+:: UPLOAD_PACKAGES: true or false
+:: UPLOAD_ON_BRANCH: true or false
+
+setlocal enableextensions enabledelayedexpansion
+
+FOR %%A IN ("%~dp0.") DO SET "REPO_ROOT=%%~dpA"
+if "%MINIFORGE_HOME%"=="" set "MINIFORGE_HOME=%USERPROFILE%\Miniforge3"
+:: Remove trailing backslash, if present
+if "%MINIFORGE_HOME:~-1%"=="\" set "MINIFORGE_HOME=%MINIFORGE_HOME:~0,-1%"
+call :start_group "Provisioning base env with micromamba"
+set "MAMBA_ROOT_PREFIX=%MINIFORGE_HOME%-micromamba-%RANDOM%"
+set "MICROMAMBA_VERSION=1.5.10-0"
+set "MICROMAMBA_URL=https://github.com/mamba-org/micromamba-releases/releases/download/%MICROMAMBA_VERSION%/micromamba-win-64"
+set "MICROMAMBA_TMPDIR=%TMP%\micromamba-%RANDOM%"
+set "MICROMAMBA_EXE=%MICROMAMBA_TMPDIR%\micromamba.exe"
+
+echo Downloading micromamba %MICROMAMBA_VERSION%
+if not exist "%MICROMAMBA_TMPDIR%" mkdir "%MICROMAMBA_TMPDIR%"
+certutil -urlcache -split -f "%MICROMAMBA_URL%" "%MICROMAMBA_EXE%"
+if !errorlevel! neq 0 exit /b !errorlevel!
+
+echo Creating environment
+call "%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"
+if !errorlevel! neq 0 exit /b !errorlevel!
+echo Removing %MAMBA_ROOT_PREFIX%
+del /S /Q "%MAMBA_ROOT_PREFIX%" >nul
+del /S /Q "%MICROMAMBA_TMPDIR%" >nul
+call :end_group
+
+call :start_group "Configuring conda"
+
+:: Activate the base conda environment
+echo Activating environment
+call "%MINIFORGE_HOME%\Scripts\activate.bat"
+:: Configure the solver
+set "CONDA_SOLVER=libmamba"
+if !errorlevel! neq 0 exit /b !errorlevel!
+set "CONDA_LIBMAMBA_SOLVER_NO_CHANNELS_FROM_INSTALLED=1"
+
+:: Set basic configuration
+echo Setting up configuration
+setup_conda_rc .\ ".\recipe" .\.ci_support\%CONFIG%.yaml
+if !errorlevel! neq 0 exit /b !errorlevel!
+echo Running build setup
+CALL run_conda_forge_build_setup
+
+
+if !errorlevel! neq 0 exit /b !errorlevel!
+
+if EXIST LICENSE.txt (
+    echo Copying feedstock license
+    copy LICENSE.txt "recipe\\recipe-scripts-license.txt"
+)
+if NOT [%HOST_PLATFORM%] == [%BUILD_PLATFORM%] (
+    if [%CROSSCOMPILING_EMULATOR%] == [] (
+        set "EXTRA_CB_OPTIONS=%EXTRA_CB_OPTIONS% --no-test"
+    )
+)
+
+if NOT [%flow_run_id%] == [] (
+        set "EXTRA_CB_OPTIONS=%EXTRA_CB_OPTIONS% --extra-meta flow_run_id=%flow_run_id% remote_url=%remote_url% sha=%sha%"
+)
+
+call :end_group
+
+:: Build the recipe
+echo Building recipe
+conda-build.exe "recipe" -m .ci_support\%CONFIG%.yaml --suppress-variables %EXTRA_CB_OPTIONS%
+if !errorlevel! neq 0 exit /b !errorlevel!
+
+call :start_group "Inspecting artifacts"
+:: inspect_artifacts was only added in conda-forge-ci-setup 4.9.4
+WHERE inspect_artifacts >nul 2>nul && inspect_artifacts --recipe-dir ".\recipe" -m .ci_support\%CONFIG%.yaml || echo "inspect_artifacts needs conda-forge-ci-setup >=4.9.4"
+call :end_group
+
+:: Prepare some environment variables for the upload step
+if /i "%CI%" == "github_actions" (
+    set "FEEDSTOCK_NAME=%GITHUB_REPOSITORY:*/=%"
+    set "GIT_BRANCH=%GITHUB_REF:refs/heads/=%"
+    if /i "%GITHUB_EVENT_NAME%" == "pull_request" (
+        set "IS_PR_BUILD=True"
+    ) else (
+        set "IS_PR_BUILD=False"
+    )
+    set "TEMP=%RUNNER_TEMP%"
+)
+if /i "%CI%" == "azure" (
+    set "FEEDSTOCK_NAME=%BUILD_REPOSITORY_NAME:*/=%"
+    set "GIT_BRANCH=%BUILD_SOURCEBRANCHNAME%"
+    if /i "%BUILD_REASON%" == "PullRequest" (
+        set "IS_PR_BUILD=True"
+    ) else (
+        set "IS_PR_BUILD=False"
+    )
+    set "TEMP=%UPLOAD_TEMP%"
+)
+
+:: Validate
+call :start_group "Validating outputs"
+validate_recipe_outputs "%FEEDSTOCK_NAME%"
+if !errorlevel! neq 0 exit /b !errorlevel!
+call :end_group
+
+if /i "%UPLOAD_PACKAGES%" == "true" (
+    if /i "%IS_PR_BUILD%" == "false" (
+        call :start_group "Uploading packages"
+        if not exist "%TEMP%\" md "%TEMP%"
+        set "TMP=%TEMP%"
+        upload_package --validate --feedstock-name="%FEEDSTOCK_NAME%" .\ ".\recipe" .ci_support\%CONFIG%.yaml
+        if !errorlevel! neq 0 exit /b !errorlevel!
+        call :end_group
+    )
+)
+
+exit
+
+:: Logging subroutines
+
+:start_group
+if /i "%CI%" == "github_actions" (
+    echo ::group::%~1
+    exit /b
+)
+if /i "%CI%" == "azure" (
+    echo ##[group]%~1
+    exit /b
+)
+echo %~1
+exit /b
+
+:end_group
+if /i "%CI%" == "github_actions" (
+    echo ::endgroup::
+    exit /b
+)
+if /i "%CI%" == "azure" (
+    echo ##[endgroup]
+    exit /b
+)
+exit /b
\ No newline at end of file
diff --git a/README.md b/README.md
index 719f098..bb2d46a 100644
--- a/README.md
+++ b/README.md
@@ -147,7 +147,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
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 6b346f5..eff4ad6 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -2,7 +2,32 @@
 # 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-win.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
+    - template: ./.azure-pipelines/azure-pipelines-win.yml
\ No newline at end of file
diff --git a/build-locally.py b/build-locally.py
index 3f4b7a7..c4a56c6 100755
--- a/build-locally.py
+++ b/build-locally.py
@@ -1,13 +1,16 @@
-#!/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
 from argparse import ArgumentParser
-import platform
 
 
 def setup_environment(ns):
@@ -23,6 +26,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"
@@ -64,8 +74,9 @@ def verify_config(ns):
     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'. "
+                "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."
             )
 
diff --git a/recipe/bld.bat b/recipe/bld.bat
index 0f07471..39be22b 100644
--- a/recipe/bld.bat
+++ b/recipe/bld.bat
@@ -10,6 +10,7 @@ cmake -G "NMake Makefiles" ^
       -DCMAKE_BUILD_TYPE:STRING=Release ^
       -DBUILD_SHARED_LIBS=ON ^
       -DRC_ENABLE_GTEST=ON ^
+      -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON ^
     ..
 
 
diff --git a/recipe/meta.yaml b/recipe/meta.yaml
index 18bc113..c92fe3a 100644
--- a/recipe/meta.yaml
+++ b/recipe/meta.yaml
@@ -13,11 +13,12 @@ source:
   sha256: 9a754942f99027c66c0aed14a684cd4a36b28ab232d9079473d427d09af57871
 
 build:
-  number: 2
+  number: 3
 
 requirements:
   build:
     - make  # [unix]
+    - {{ stdlib("c") }}
     - {{ compiler('cxx') }}
     - cmake
   host:
@@ -30,18 +31,20 @@ test:
     - test -e ${PREFIX}/share/rapidcheck/cmake/rapidcheckConfig.cmake  # [unix]
     - test -e ${PREFIX}/lib/librapidcheck.so  # [linux]
     - if not exist %LIBRARY_PREFIX%\include\rapidcheck.h (exit 1)  # [win]
-
+    # The import and shared library must be present on Windows
+    - if not exist %LIBRARY_PREFIX%\lib\rapidcheck.lib (exit 1)  # [win]
+    - if not exist %LIBRARY_PREFIX%\bin\rapidcheck.dll (exit 1)  # [win]
 
 
 about:
   home: https://github.com/emil-e/rapidcheck
   summary: 'RapidCheck is a C++ framework for property based testing inspired by QuickCheck and other similar frameworks.'
   description: |
-    RapidCheck is a C++ framework for property based testing inspired by QuickCheck and other similar frameworks. 
+    RapidCheck is a C++ framework for property based testing inspired by QuickCheck and other similar frameworks.
     In property based testing, you state facts about your code that given certain precondition should always be true.
-    RapidCheck then generates random test data to try and find a case for which the property doesn't hold. 
-    If such a case is found, RapidCheck tries to find the smallest case (for some definition of smallest) 
-    for which the property is still false and then displays this as a counterexample. 
+    RapidCheck then generates random test data to try and find a case for which the property doesn't hold.
+    If such a case is found, RapidCheck tries to find the smallest case (for some definition of smallest)
+    for which the property is still false and then displays this as a counterexample.
     For example, if the input is an integer, RapidCheck tries to find the smallest integer for which the property is false.
 
   license: BSD-3-Clause


Reviews:
user: login: jjerphan
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-21T08:44:59Z
user: login: DerThorsten
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-21T09:00:50Z
user: login: jjerphan
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-21T09:56:39Z

Review comments:
diff_hunk: @@ -10,6 +10,7 @@ cmake -G "NMake Makefiles" ^
       -DCMAKE_BUILD_TYPE:STRING=Release ^
       -DBUILD_SHARED_LIBS=ON ^
       -DRC_ENABLE_GTEST=ON ^
+      -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON ^
path: recipe/bld.bat
user: login: jjerphan
body: I really do not like this, but I have not been able to find a way to generate the `.lib` file unfortunately.

On conda-forge, no project depend on rapidcheck:
```
mamba repoquery whoneeds -c conda-forge rapidcheck         
```

ArcticDB only uses it for tests (like other projects I suppose).
created_at: 2025-03-21T08:44:59Z
author_association: MEMBER
diff_hunk: @@ -10,6 +10,7 @@ cmake -G "NMake Makefiles" ^
       -DCMAKE_BUILD_TYPE:STRING=Release ^
       -DBUILD_SHARED_LIBS=ON ^
       -DRC_ENABLE_GTEST=ON ^
+      -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON ^
path: recipe/bld.bat
user: login: jjerphan
body: For reference, [a discussion with Le Chat](https://chat.mistral.ai/chat/07ded5ba-2521-410b-9a9c-3409aef03aeb).

I think that's the best option for this library for now.
created_at: 2025-03-21T09:56:39Z
author_association: MEMBER

PR comments:
user: login: conda-forge-admin
created_at: 2025-03-20T14:46:52Z
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/13972231321](https://github.com/conda-forge/conda-forge-webservices/actions/runs/13972231321). Examine the logs at this URL for more detail.</sub>

author_association: CONTRIBUTOR
user: login: jjerphan
created_at: 2025-03-20T14:49:48Z
body: @conda-forge-admin, please rerender
author_association: MEMBER
user: login: conda-forge-admin
created_at: 2025-03-20T14:51:06Z
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: conda-forge-admin
created_at: 2025-03-21T08:48:13Z
body: Hi! This is the friendly automated conda-forge-webservice.

I tried to rerender for you, but it looks like there was nothing to do.


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

author_association: CONTRIBUTOR