{% set version = "3.9.23" %}
{% set dev = "" %}
{% set dev_ = "" %}
{% set ver2 = '.'.join(version.split('.')[0:2]) %}
{% set ver2nd = ''.join(version.split('.')[0:2]) %}
{% set ver3nd = ''.join(version.split('.')[0:3]) %}
{% set build_number = "0" %}
{% set channel_targets = ('abc', 'def')  %}

# Sanitize build system env. var tweak parameters
# (passed to the build scripts via script_env).
{% set from_source_control = os.environ.get('CONDA_BUILD_FROM_SOURCE_CONTROL', '') %}
{% if from_source_control == '' or from_source_control == 'no' %}
  {% set from_source_control = 'no' %}
{% else %}
  {% set from_source_control = 'yes' %}
{% endif %}
{% set linkage_nature = os.environ.get('PY_INTERP_LINKAGE_NATURE', '') %}
{% if linkage_nature != '' %}
  {% set linkage_nature = "_" ~ linkage_nature %}
{% endif %}
{% if linkage_nature == 'shared' %}
  {% set linkage_nature_env = 'shared' %}
{% else %}
  {% set linkage_nature_env = 'static' %}
{% endif %}
{% set dbg_abi = '' %}
{% set debug = os.environ.get('PY_INTERP_DEBUG', '') %}
{% if debug != '' and debug != 'no' %}
  {% set py_interp_debug = "yes" %}
  {% set debug = "_dbg" %}
  {% set dbg_abi = "d" %}  # [win]
{% else %}
  {% set py_interp_debug = "no" %}
{% endif %}

package:
  name: python-split
  version: {{ version }}{{ dev }}

source:
{% if from_source_control == 'yes' %}
  - git_url: https://github.com/python/CPython.git
    git_tag: v{{ version }}{{ dev }}
{% else %}
  - url: https://www.python.org/ftp/python/{{ version }}/Python-{{ version }}{{ dev }}.tar.xz
    sha256: 61a42919e13d539f7673cf11d1c404380e28e540510860b9d242196e165709c9
{% endif %}
    patches:
      ## - patches/0000-Fix-off-by-one-error-in-_winapi_WaitForMultipleObjec.patch
      - patches/0001-Darwin-Add-arch-x86_64-to-UnicCCompiler-ld_args.patch
      - patches/0002-Win32-Change-FD_SETSIZE-from-512-to-2048.patch
      - patches/0003-Win32-distutils-Add-support-to-cygwinccompiler-for-V.patch
      - patches/0004-Do-not-pass-g-to-GCC-when-not-Py_DEBUG.patch
      - patches/0005-Support-cross-compiling-byte-code.patch
      - patches/0006-Win32-Fixes-for-Windows-GCC-interop-needed-by-RPy2-a.patch
      - patches/0007-Darwin-Look-in-sysroot-usr-lib-include-if-sysroot-is.patch
      - patches/0008-runtime_library_dir_option-Use-1st-word-of-CC-as-com.patch
      - patches/0009-Win32-Do-not-download-externals.patch
      - patches/0010-Add-support-for-_CONDA_PYTHON_SYSCONFIGDATA_NAME-if-.patch
      - patches/0011-Fix-find_library-so-that-it-looks-in-sys.prefix-lib-.patch
      - patches/0012-Disable-new-dtags-in-unixccompiler.py.patch
      - patches/0013-Fix-cross-compilation-on-Debian-based-distros.patch
      - patches/0013-Add-CondaEcosystemModifyDllSearchPath.patch  # [win]
      - patches/0014-Disable-registry-lookup-unless-CONDA_PY_ALLOW_REG_PA.patch
      - patches/0015-Unvendor-openssl.patch
      - patches/0016-Unvendor-sqlite3.patch
      - patches/0017-venv-Revert-a-change-from-https-github.com-python-cp.patch
      - patches/0018-Win-Add-back-the-DLLSuffix-used-to-find-the-openssl-.patch
      - patches/0019-Use-ranlib-from-env-if-env-variable-is-set.patch
      - patches/0020-Add-CondaEcosystemModifyDllSearchPath.patch  # [not win]
      - patches/0021-Add-d1trimfile-SRC_DIR-to-make-pdbs-more-relocatable.patch
      - patches/0022-Doing-d1trimfile.patch
      # May be causing PGO to fail?
      - patches/0023-egg-debugging-with-Windows-debug-builds.patch
      # - patches/0024-Add-CONDA_DLL_SEARCH_MODIFICATION_KEEP_GIL-to-aid-de.patch
      - patches/0025-cross-compile-darwin.patch
      - patches/0026-Unvendor-bzip2.patch
      - patches/0027-Unvendor-libffi.patch
      - patches/0028-Unvendor-tcltk.patch
      - patches/0029-unvendor-xz.patch
      - patches/0030-unvendor-zlib.patch
      - patches/0031-Unvendor-expat.patch
      - patches/0032-Fix-TZPATH-on-windows.patch
      - patches/0033-gh24324.patch
      - patches/0034-have-pyunicode-decodeunicodeescape.patch
      # MailCap CVE (CVE-2015-20107) was fixed in 3.9.16
      # - patches/0035-py39-mailcap-CVE-2015-20107.patch
{% if (openssl | string).startswith('3.0') %}
      - patches/0036-openssl3.patch
{% endif %}
{% if 'conda-forge' not in channel_targets %}
      - patches/9999-Add-Anaconda-Distribution-version-logic.patch  # [not win]
{% endif %}

build:
  number: {{ build_number }}

requirements:
  build:
{% if from_source_control == 'yes' %}
    - git
{% else %}
    - patch  # [not win]
    - m2-patch  # [win]
    - m2-gcc-libs  # [win]
{% endif %}
  host:

outputs:
  - name: python
    script: build_base.sh  # [unix]
    script: build_base.bat  # [win]
    build:
      number: {{ build_number }}
      activate_in_script: true
      # Windows has issues updating python if conda is using files itself.
      # Copy rather than link.
      no_link:
        - DLLs/_ctypes.pyd  # [win]
      ignore_run_exports_from:   # [unix]
        # C++ only installed so CXX is defined for distutils/sysconfig.
        - {{ compiler('cxx') }}  # [unix]        
        # These two are just to get the headers needed for tk.h, but is unused
        - xorg-libx11     # [linux]
        - xorg-xorgproto  # [linux]
      # Disabled until verified to work correctly
      detect_binary_files_with_prefix: true
      # detect_binary_files_with_prefix: False
      # binary_has_prefix_files:
      #   - lib/libpython{{ ver2 }}.*.1.0
      #   - bin/python{{ ver2 }}  # [linux]
      #   - lib/libpython{{ ver2 }}.a  # [linux]
      #   - lib/libpython{{ ver2 }}.nolto.a  # [linux]
      #   - lib/libpython3.so  # [linux]
      #   - lib/python{{ ver2 }}/lib-dynload/_hashlib.cpython-{{ ver2nd }}-x86_64-linux-gnu.so  # [linux]
      #   - lib/libpython3.dylib  # [osx]
      # match python.org compiler standard
      skip: true            # [win and int(float(vc)) < 14]
      # skip_compile_pyc:
      #  - '*.py'            # [osx and arm64]
{% if 'conda-forge' in channel_targets %}
      string: {{ dev_ }}h{{ PKG_HASH }}_{{ PKG_BUILDNUM }}{{ linkage_nature }}{{ debug }}_cpython
{% else %}
      string: h{{ PKG_HASH }}_{{ PKG_BUILDNUM }}{{ linkage_nature }}{{ debug }}
{% endif %}
{% if 'conda-forge' in channel_targets %}
      run_exports:
        noarch:
          - python
        weak:
          - python_abi {{ ver2 }}.* *_cp{{ ver2nd }}
{% endif %}
      script_env:
        - PY_INTERP_LINKAGE_NATURE={{ linkage_nature_env }}
        - PY_INTERP_DEBUG={{ py_interp_debug }}
        # Putting these here means they get emitted to build_env_setup.{sh,bat} meaning we can launch IDEs
        # after sourcing or calling that script without examine the contents of conda_build.{sh,bat} for
        # important env. vars.
        - OPENSSL_DIR=%PREFIX%\Library  # [win]
        - SQLITE3_DIR=%PREFIX%\Library  # [win]
{% if 'conda-forge' in channel_targets %}
        - CONDA_FORGE=yes
{% else %}
        - CONDA_FORGE=no
{% endif %}
      missing_dso_whitelist:
        - '**/MSVCR71.dll'  # [win]
        - '**/MSVCR80.dll'  # [win]
        # I have no idea why this is not in C:\Windows\System32\downlevel
        - '**/api-ms-win-core-path-l1-1-0.dll'  # [win]
          # -=- libs that come from the sysroot.
        - '$RPATH/libc.so.6'        # [linux64 or ppc64le]
        - '$RPATH/libcrypt.so.1'    # [linux64 or ppc64le]
        - '$RPATH/libdl.so.2'       # [linux64 or ppc64le]
        - '$RPATH/libm.so.6'        # [linux64 or ppc64le]
        - '$RPATH/libnsl.so.1'      # [linux64 or ppc64le]
        - '$RPATH/libpthread.so.0'  # [linux64 or ppc64le]
        - '$RPATH/librt.so.1'       # [linux64 or ppc64le]
        - '$RPATH/libutil.so.1'     # [linux64 or ppc64le]
    requirements:
      build:
        - {{ compiler('c') }}
        - {{ compiler('cxx') }}
        - {{ ccache('native') }}  # [unix]
        - ripgrep
        - sed  # [unix]
        - {{ cdt('libuuid-devel') }}  # [linux and not (ppc64le or aarch64)]
        - make  # [not win]
        - libtool  # [unix]
        - pkg-config  # [not win]
        # configure script looks for llvm-ar for lto
        - llvm-tools  # [osx]
        - ld_impl_{{ target_platform }}  # [linux]
{% if 'conda-forge' in channel_targets %}
        - binutils_impl_{{ target_platform }}  # [linux]
{% endif %}
      host:
        - bzip2 {{ bzip2 }}
        - sqlite {{ sqlite }}
        - xz {{ xz }}
        - unzip  # [not win]
        - zlib {{ zlib }}
        - openssl {{ openssl }}
        - readline {{ readline }} # [not win]
        - tk {{ tk }}
        # These two are just to get the headers needed for tk.h, but is unused
        - xorg-libx11  # [linux]
        - xorg-xorgproto  # [linux]
        - ncurses  # [unix]
        - libffi {{ libffi }}
        - ld_impl_{{ target_platform }}  # [linux]
        - expat {{ expat }}
      run:
        - ld_impl_{{ target_platform }}  # [linux]
        - tzdata
{% if 'conda-forge' in channel_targets %}
        - ncurses  # [unix]
      run_constrained:
        - python_abi {{ ver2 }}.* *_cp{{ ver2nd }}
{% endif %}
    test:
      downstreams:
        - cython
        - setuptools
      requires:
        - ripgrep
        - cmake-no-system  # [not (linux and ppc64le)] changed from cmake to support OpenSSL 3 bootstrap build
        - make  # [unix]
        - ninja-base # changed from ninja to support OpenSSL 3 bootstrap build
        - {{ compiler('c') }}
        # Tried to use enable_language(C) to avoid needing this. It does not work.
        - {{ compiler('cxx') }}
      files:
        - tests/distutils/*
        - tests/cmake/*
        - tests/cython/*
        - tests/embedding-interpreter/*
        - tests/processpoolexecutor-max_workers-61/*
        - run_test.py
      commands:
        - echo on  # [win]
        - set  # [win]
        - python -V
        - python3 -V            # [not win]
        - 2to3 -h
        - pydoc -h
        - python3-config --help  # [not win]
        - python run_test.py
        - set "PIP_NO_BUILD_ISOLATION=False"  # [win]
        - set "PIP_NO_DEPENDENCIES=True"  # [win]
        - set "PIP_IGNORE_INSTALLED=True"  # [win]
        - set "PIP_NO_INDEX=True"  # [win]
        - set "PIP_CACHE_DIR=%CONDA_PREFIX%/pip_cache"  # [win]
        - set "TEMP=%CONDA_PREFIX%/tmp"  # [win]
        - mkdir "%TEMP%"  # [win]
        - python -Im ensurepip --upgrade --default-pip  # [win]
        # tzdata/zoneinfo test that will need the tzdata package to pass
        - python -c "from zoneinfo import ZoneInfo; from datetime import datetime; dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo('America/Los_Angeles')); print(dt.tzname())"
        - python -m venv test-venv
        - python -c "import sysconfig; print(sysconfig.get_config_var('CC'))"  # [not win]
        # disabled due this test has issues with updated operating system version
        # -  _CONDA_PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata_x86_64_conda_cos6_linux_gnu python -c "import sysconfig; print(sysconfig.get_config_var('CC'))"  # [linux64]
        # check for unreplaced @ symbols in sysconfig files
        - for f in ${CONDA_PREFIX}/lib/python*/_sysconfig*.py; do echo "Checking $f:"; if [[ `rg @ $f` ]]; then echo "FAILED ON $f"; cat $f; exit 1; fi; done  # [linux64 or osx]
        - test ! -f ${PREFIX}/lib/libpython${PKG_VERSION%.*}.a  # [unix]
        - test ! -f ${PREFIX}/lib/libpython${PKG_VERSION%.*}.nolto.a  # [unix]
        # https://github.com/conda-forge/python-feedstock/issues/384
        - if exist %PREFIX%\\Scripts\\pydoc exit 1  # [win]
        - if exist %PREFIX%\\Scripts\\idle exit 1  # [win]
        - if exist %PREFIX%\\Scripts\\2to3 exit 1  # [win]
        - if not exist %PREFIX%\\Scripts\\pydoc-script.py exit 1  # [win]
        - if not exist %PREFIX%\\Scripts\\idle-script.py exit 1  # [win]
        - if not exist %PREFIX%\\Scripts\\2to3-script.py exit 1  # [win]
        - if not exist %PREFIX%\\Scripts\\idle.exe exit 1  # [win]
        - if not exist %PREFIX%\\Scripts\\2to3.exe exit 1  # [win]
        - if not exist %PREFIX%\\Scripts\\pydoc.exe exit 1  # [win]
        - pushd tests
        -   pushd distutils
        -     python setup.py install -v -v
        -     python -c "import foobar"
        -   popd
        -   pushd embedding-interpreter  # [unix]
        -     bash build-and-test.sh  # [unix and not (linux and aarch64)]
        -   popd  # [unix]
        -   pushd cmake  # [not (linux and ppc64le)]
        -     run_cmake_test.bat {{ version }}  # [win]
        -     bash run_cmake_test.sh {{ version }}  # [not win and not (linux and ppc64le)]
        -   popd  # [not (linux and ppc64le)]
        -   pushd processpoolexecutor-max_workers-61
        -     python ppe.py
        -   popd
        - popd
        - test ! -f default.profraw   # [osx]
        - python -c "import ssl; assert ' {{ openssl }}' in ssl.OPENSSL_VERSION"

  - name: python-regr-testsuite
    requirements:
      host:
        - {{ pin_subpackage('python', exact=True) }}
    script: install_regr_testsuite.sh  # [unix]

  - name: libpython-static
    noarch: python  # [unix]
    script: build_static.sh  # [unix]
    script: build_static.bat  # [win]
    skip: true  # [win]
    build:
      number: {{ build_number }}
      activate_in_script: true
      ignore_run_exports:
        - python_abi
{% if 'conda-forge' in channel_targets %}
      string: h{{ PKG_HASH }}_{{ PKG_BUILDNUM }}{{ linkage_nature }}{{ debug }}_cpython
{% else %}
      string: h{{ PKG_HASH }}_{{ PKG_BUILDNUM }}{{ linkage_nature }}{{ debug }}
{% endif %}
    requirements:
      build:
        - {{ compiler('c') }}
        - {{ compiler('cxx') }}
{% if from_source_control == 'yes' %}
        - git
{% endif %}
        - {{ ccache('native') }}  # [unix]
      host:
        - {{ pin_subpackage('python', exact=True) }}
      run:
        - {{ pin_subpackage('python', exact=True) }}
    test:
      files:
        - tests/embedding-interpreter/*
      requires:
        - ripgrep
        - cmake  # [not (linux and ppc64le)]
        - make  # [unix]
        - {{ compiler('c') }}
        # Tried to use enable_language(C) to avoid needing this. It does not work.
        - {{ compiler('cxx') }}
      commands:
        - test -f ${PREFIX}/lib/libpython${PKG_VERSION%.*}.a  # [unix]
        - test -f ${PREFIX}/lib/libpython${PKG_VERSION%.*}.nolto.a  # [unix]
        - test -f ${PREFIX}/lib/python${PKG_VERSION%.*}/config-${PKG_VERSION%.*}-darwin/libpython${PKG_VERSION%.*}.a  # [osx]
        - pushd tests  # [unix]
        -   pushd embedding-interpreter  # [unix]
        -     bash build-and-test.sh  # [unix]
        -   popd  # [unix]
        - popd  # [unix]

about:
  home: https://www.python.org/
  license: PSF-2.0
  license_family: PSF
  license_file: LICENSE
  license_url: https://docs.python.org/3.9/license.html
  summary: General purpose programming language
  description: |
    Python is a widely used high-level, general-purpose, interpreted, dynamic
    programming language. Its design philosophy emphasizes code
    readability, and its syntax allows programmers to express concepts in
    fewer lines of code than would be possible in languages such as C++ or
    Java. The language provides constructs intended to enable clear programs
    on both a small and large scale.
  doc_url: https://www.python.org/doc/versions/
  dev_url: https://devguide.python.org/

extra:
  feedstock-name: python
  recipe-maintainers:
    - isuruf
    - jakirkham
    - mbargull
    - mingwandroid
    - msarahan
    - pelson
    - ocefpaf
    - scopatz
