17db96d56Sopenharmony_cidiff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
27db96d56Sopenharmony_cinew file mode 100755
37db96d56Sopenharmony_ciindex 0000000..c2293cb
47db96d56Sopenharmony_ci--- /dev/null
57db96d56Sopenharmony_ci+++ b/.github/workflows/build.yml
67db96d56Sopenharmony_ci@@ -0,0 +1,418 @@
77db96d56Sopenharmony_ci+name: Tests
87db96d56Sopenharmony_ci+
97db96d56Sopenharmony_ci+# gh-84728: "paths-ignore" is not used to skip documentation-only PRs, because
107db96d56Sopenharmony_ci+# it prevents to mark a job as mandatory. A PR cannot be merged if a job is
117db96d56Sopenharmony_ci+# mandatory but not scheduled because of "paths-ignore".
127db96d56Sopenharmony_ci+on:
137db96d56Sopenharmony_ci+  workflow_dispatch:
147db96d56Sopenharmony_ci+  push:
157db96d56Sopenharmony_ci+    branches:
167db96d56Sopenharmony_ci+    - 'main'
177db96d56Sopenharmony_ci+    - '3.11'
187db96d56Sopenharmony_ci+    - '3.10'
197db96d56Sopenharmony_ci+    - '3.9'
207db96d56Sopenharmony_ci+    - '3.8'
217db96d56Sopenharmony_ci+    - '3.7'
227db96d56Sopenharmony_ci+  pull_request:
237db96d56Sopenharmony_ci+    branches:
247db96d56Sopenharmony_ci+    - 'main'
257db96d56Sopenharmony_ci+    - '3.11'
267db96d56Sopenharmony_ci+    - '3.10'
277db96d56Sopenharmony_ci+    - '3.9'
287db96d56Sopenharmony_ci+    - '3.8'
297db96d56Sopenharmony_ci+    - '3.7'
307db96d56Sopenharmony_ci+
317db96d56Sopenharmony_ci+permissions:
327db96d56Sopenharmony_ci+  contents: read
337db96d56Sopenharmony_ci+
347db96d56Sopenharmony_ci+concurrency:
357db96d56Sopenharmony_ci+  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
367db96d56Sopenharmony_ci+  cancel-in-progress: true
377db96d56Sopenharmony_ci+
387db96d56Sopenharmony_ci+jobs:
397db96d56Sopenharmony_ci+  check_source:
407db96d56Sopenharmony_ci+    name: 'Check for source changes'
417db96d56Sopenharmony_ci+    runs-on: ubuntu-latest
427db96d56Sopenharmony_ci+    timeout-minutes: 10
437db96d56Sopenharmony_ci+    outputs:
447db96d56Sopenharmony_ci+      run_tests: ${{ steps.check.outputs.run_tests }}
457db96d56Sopenharmony_ci+      run_ssl_tests: ${{ steps.check.outputs.run_ssl_tests }}
467db96d56Sopenharmony_ci+      config_hash: ${{ steps.config_hash.outputs.hash }}
477db96d56Sopenharmony_ci+    steps:
487db96d56Sopenharmony_ci+      - uses: actions/checkout@v3
497db96d56Sopenharmony_ci+      - name: Check for source changes
507db96d56Sopenharmony_ci+        id: check
517db96d56Sopenharmony_ci+        run: |
527db96d56Sopenharmony_ci+          if [ -z "$GITHUB_BASE_REF" ]; then
537db96d56Sopenharmony_ci+            echo "run_tests=true" >> $GITHUB_OUTPUT
547db96d56Sopenharmony_ci+            echo "run_ssl_tests=true" >> $GITHUB_OUTPUT
557db96d56Sopenharmony_ci+          else
567db96d56Sopenharmony_ci+            git fetch origin $GITHUB_BASE_REF --depth=1
577db96d56Sopenharmony_ci+            # git diff "origin/$GITHUB_BASE_REF..." (3 dots) may be more
587db96d56Sopenharmony_ci+            # reliable than git diff "origin/$GITHUB_BASE_REF.." (2 dots),
597db96d56Sopenharmony_ci+            # but it requires to download more commits (this job uses
607db96d56Sopenharmony_ci+            # "git fetch --depth=1").
617db96d56Sopenharmony_ci+            #
627db96d56Sopenharmony_ci+            # git diff "origin/$GITHUB_BASE_REF..." (3 dots) works with Git
637db96d56Sopenharmony_ci+            # 2.26, but Git 2.28 is stricter and fails with "no merge base".
647db96d56Sopenharmony_ci+            #
657db96d56Sopenharmony_ci+            # git diff "origin/$GITHUB_BASE_REF.." (2 dots) should be enough on
667db96d56Sopenharmony_ci+            # GitHub, since GitHub starts by merging origin/$GITHUB_BASE_REF
677db96d56Sopenharmony_ci+            # into the PR branch anyway.
687db96d56Sopenharmony_ci+            #
697db96d56Sopenharmony_ci+            # https://github.com/python/core-workflow/issues/373
707db96d56Sopenharmony_ci+            git diff --name-only origin/$GITHUB_BASE_REF.. | grep -qvE '(\.rst$|^Doc|^Misc)' && echo "run_tests=true" >> $GITHUB_OUTPUT || true
717db96d56Sopenharmony_ci+            git diff --name-only origin/$GITHUB_BASE_REF.. | grep -qE '(ssl|hashlib|hmac|^.github)' && echo "run_ssl_tests=true" >> $GITHUB_OUTPUT || true
727db96d56Sopenharmony_ci+          fi
737db96d56Sopenharmony_ci+      - name: Compute hash for config cache key
747db96d56Sopenharmony_ci+        id: config_hash
757db96d56Sopenharmony_ci+        run: |
767db96d56Sopenharmony_ci+          echo "hash=${{ hashFiles('configure', 'configure.ac', '.github/workflows/build.yml') }}" >> $GITHUB_OUTPUT
777db96d56Sopenharmony_ci+
787db96d56Sopenharmony_ci+  check_abi:
797db96d56Sopenharmony_ci+    name: 'Check if the ABI has changed'
807db96d56Sopenharmony_ci+    runs-on: ubuntu-20.04
817db96d56Sopenharmony_ci+    needs: check_source
827db96d56Sopenharmony_ci+    if: needs.check_source.outputs.run_tests == 'true'
837db96d56Sopenharmony_ci+    steps:
847db96d56Sopenharmony_ci+      - uses: actions/checkout@v2
857db96d56Sopenharmony_ci+      - uses: actions/setup-python@v2
867db96d56Sopenharmony_ci+      - name: Install Dependencies
877db96d56Sopenharmony_ci+        run: |
887db96d56Sopenharmony_ci+            sudo ./.github/workflows/posix-deps-apt.sh
897db96d56Sopenharmony_ci+            sudo apt-get install -yq abigail-tools
907db96d56Sopenharmony_ci+      - name: Build CPython
917db96d56Sopenharmony_ci+        env:
927db96d56Sopenharmony_ci+          CFLAGS: -g3 -O0
937db96d56Sopenharmony_ci+        run: |
947db96d56Sopenharmony_ci+          # Build Python with the libpython dynamic library
957db96d56Sopenharmony_ci+          ./configure --enable-shared
967db96d56Sopenharmony_ci+          make -j4
977db96d56Sopenharmony_ci+      - name: Check for changes in the ABI
987db96d56Sopenharmony_ci+        id: check
997db96d56Sopenharmony_ci+        run: |
1007db96d56Sopenharmony_ci+          if ! make check-abidump; then
1017db96d56Sopenharmony_ci+            echo "Generated ABI file is not up to date."
1027db96d56Sopenharmony_ci+            echo "Please, add the release manager of this branch as a reviewer of this PR."
1037db96d56Sopenharmony_ci+            echo ""
1047db96d56Sopenharmony_ci+            echo "The up to date ABI file should be attached to this build as an artifact."
1057db96d56Sopenharmony_ci+            echo ""
1067db96d56Sopenharmony_ci+            echo "To learn more about this check: https://devguide.python.org/setup/#regenerate-the-abi-dump"
1077db96d56Sopenharmony_ci+            echo ""
1087db96d56Sopenharmony_ci+            exit 1
1097db96d56Sopenharmony_ci+          fi
1107db96d56Sopenharmony_ci+      - name: Generate updated ABI files
1117db96d56Sopenharmony_ci+        if: ${{ failure() && steps.check.conclusion == 'failure' }}
1127db96d56Sopenharmony_ci+        run: |
1137db96d56Sopenharmony_ci+          make regen-abidump
1147db96d56Sopenharmony_ci+      - uses: actions/upload-artifact@v3
1157db96d56Sopenharmony_ci+        name: Publish updated ABI files
1167db96d56Sopenharmony_ci+        if: ${{ failure() && steps.check.conclusion == 'failure' }}
1177db96d56Sopenharmony_ci+        with:
1187db96d56Sopenharmony_ci+          name: abi-data
1197db96d56Sopenharmony_ci+          path: ./Doc/data/*.abi
1207db96d56Sopenharmony_ci+
1217db96d56Sopenharmony_ci+  check_generated_files:
1227db96d56Sopenharmony_ci+    name: 'Check if generated files are up to date'
1237db96d56Sopenharmony_ci+    runs-on: ubuntu-latest
1247db96d56Sopenharmony_ci+    timeout-minutes: 60
1257db96d56Sopenharmony_ci+    needs: check_source
1267db96d56Sopenharmony_ci+    if: needs.check_source.outputs.run_tests == 'true'
1277db96d56Sopenharmony_ci+    steps:
1287db96d56Sopenharmony_ci+      - uses: actions/checkout@v3
1297db96d56Sopenharmony_ci+      - name: Restore config.cache
1307db96d56Sopenharmony_ci+        uses: actions/cache@v3
1317db96d56Sopenharmony_ci+        with:
1327db96d56Sopenharmony_ci+          path: config.cache
1337db96d56Sopenharmony_ci+          key: ${{ github.job }}-${{ runner.os }}-${{ needs.check_source.outputs.config_hash }}
1347db96d56Sopenharmony_ci+      - uses: actions/setup-python@v3
1357db96d56Sopenharmony_ci+      - name: Install Dependencies
1367db96d56Sopenharmony_ci+        run: sudo ./.github/workflows/posix-deps-apt.sh
1377db96d56Sopenharmony_ci+      - name: Add ccache to PATH
1387db96d56Sopenharmony_ci+        run: echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV
1397db96d56Sopenharmony_ci+      - name: Configure ccache action
1407db96d56Sopenharmony_ci+        uses: hendrikmuhs/ccache-action@v1.2
1417db96d56Sopenharmony_ci+      - name: Check Autoconf version 2.69 and aclocal 1.16.3
1427db96d56Sopenharmony_ci+        run: |
1437db96d56Sopenharmony_ci+          grep "Generated by GNU Autoconf 2.69" configure
1447db96d56Sopenharmony_ci+          grep "aclocal 1.16.3" aclocal.m4
1457db96d56Sopenharmony_ci+          grep -q "runstatedir" configure
1467db96d56Sopenharmony_ci+          grep -q "PKG_PROG_PKG_CONFIG" aclocal.m4
1477db96d56Sopenharmony_ci+      - name: Configure CPython
1487db96d56Sopenharmony_ci+        run: |
1497db96d56Sopenharmony_ci+          # Build Python with the libpython dynamic library
1507db96d56Sopenharmony_ci+          ./configure --config-cache --with-pydebug --enable-shared
1517db96d56Sopenharmony_ci+      - name: Regenerate autoconf files with container image
1527db96d56Sopenharmony_ci+        run: make regen-configure
1537db96d56Sopenharmony_ci+      - name: Build CPython
1547db96d56Sopenharmony_ci+        run: |
1557db96d56Sopenharmony_ci+          # Deepfreeze will usually cause global objects to be added or removed,
1567db96d56Sopenharmony_ci+          # so we run it before regen-global-objects gets rum (in regen-all).
1577db96d56Sopenharmony_ci+          make regen-deepfreeze
1587db96d56Sopenharmony_ci+          make -j4 regen-all
1597db96d56Sopenharmony_ci+          make regen-stdlib-module-names
1607db96d56Sopenharmony_ci+      - name: Check for changes
1617db96d56Sopenharmony_ci+        run: |
1627db96d56Sopenharmony_ci+          git add -u
1637db96d56Sopenharmony_ci+          changes=$(git status --porcelain)
1647db96d56Sopenharmony_ci+          # Check for changes in regenerated files
1657db96d56Sopenharmony_ci+          if test -n "$changes"; then
1667db96d56Sopenharmony_ci+            echo "Generated files not up to date."
1677db96d56Sopenharmony_ci+            echo "Perhaps you forgot to run make regen-all or build.bat --regen. ;)"
1687db96d56Sopenharmony_ci+            echo "configure files must be regenerated with a specific version of autoconf."
1697db96d56Sopenharmony_ci+            echo "$changes"
1707db96d56Sopenharmony_ci+            echo ""
1717db96d56Sopenharmony_ci+            git diff --staged || true
1727db96d56Sopenharmony_ci+            exit 1
1737db96d56Sopenharmony_ci+          fi
1747db96d56Sopenharmony_ci+      - name: Check exported libpython symbols
1757db96d56Sopenharmony_ci+        run: make smelly
1767db96d56Sopenharmony_ci+      - name: Check limited ABI symbols
1777db96d56Sopenharmony_ci+        run: make check-limited-abi
1787db96d56Sopenharmony_ci+
1797db96d56Sopenharmony_ci+  build_win32:
1807db96d56Sopenharmony_ci+    name: 'Windows (x86)'
1817db96d56Sopenharmony_ci+    runs-on: windows-latest
1827db96d56Sopenharmony_ci+    timeout-minutes: 60
1837db96d56Sopenharmony_ci+    needs: check_source
1847db96d56Sopenharmony_ci+    if: needs.check_source.outputs.run_tests == 'true'
1857db96d56Sopenharmony_ci+    env:
1867db96d56Sopenharmony_ci+       IncludeUwp: 'true'
1877db96d56Sopenharmony_ci+    steps:
1887db96d56Sopenharmony_ci+    - uses: actions/checkout@v3
1897db96d56Sopenharmony_ci+    - name: Build CPython
1907db96d56Sopenharmony_ci+      run: .\PCbuild\build.bat -e -d -p Win32
1917db96d56Sopenharmony_ci+    - name: Display build info
1927db96d56Sopenharmony_ci+      run: .\python.bat -m test.pythoninfo
1937db96d56Sopenharmony_ci+    - name: Tests
1947db96d56Sopenharmony_ci+      run: .\PCbuild\rt.bat -p Win32 -d -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0
1957db96d56Sopenharmony_ci+
1967db96d56Sopenharmony_ci+  build_win_amd64:
1977db96d56Sopenharmony_ci+    name: 'Windows (x64)'
1987db96d56Sopenharmony_ci+    runs-on: windows-latest
1997db96d56Sopenharmony_ci+    timeout-minutes: 60
2007db96d56Sopenharmony_ci+    needs: check_source
2017db96d56Sopenharmony_ci+    if: needs.check_source.outputs.run_tests == 'true'
2027db96d56Sopenharmony_ci+    env:
2037db96d56Sopenharmony_ci+       IncludeUwp: 'true'
2047db96d56Sopenharmony_ci+    steps:
2057db96d56Sopenharmony_ci+    - uses: actions/checkout@v3
2067db96d56Sopenharmony_ci+    - name: Register MSVC problem matcher
2077db96d56Sopenharmony_ci+      run: echo "::add-matcher::.github/problem-matchers/msvc.json"
2087db96d56Sopenharmony_ci+    - name: Build CPython
2097db96d56Sopenharmony_ci+      run: .\PCbuild\build.bat -e -d -p x64
2107db96d56Sopenharmony_ci+    - name: Display build info
2117db96d56Sopenharmony_ci+      run: .\python.bat -m test.pythoninfo
2127db96d56Sopenharmony_ci+    - name: Tests
2137db96d56Sopenharmony_ci+      run: .\PCbuild\rt.bat -p x64 -d -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0
2147db96d56Sopenharmony_ci+
2157db96d56Sopenharmony_ci+  build_macos:
2167db96d56Sopenharmony_ci+    name: 'macOS'
2177db96d56Sopenharmony_ci+    runs-on: macos-latest
2187db96d56Sopenharmony_ci+    timeout-minutes: 60
2197db96d56Sopenharmony_ci+    needs: check_source
2207db96d56Sopenharmony_ci+    if: needs.check_source.outputs.run_tests == 'true'
2217db96d56Sopenharmony_ci+    env:
2227db96d56Sopenharmony_ci+      HOMEBREW_NO_ANALYTICS: 1
2237db96d56Sopenharmony_ci+      HOMEBREW_NO_AUTO_UPDATE: 1
2247db96d56Sopenharmony_ci+      HOMEBREW_NO_INSTALL_CLEANUP: 1
2257db96d56Sopenharmony_ci+      PYTHONSTRICTEXTENSIONBUILD: 1
2267db96d56Sopenharmony_ci+    steps:
2277db96d56Sopenharmony_ci+    - uses: actions/checkout@v3
2287db96d56Sopenharmony_ci+    - name: Restore config.cache
2297db96d56Sopenharmony_ci+      uses: actions/cache@v3
2307db96d56Sopenharmony_ci+      with:
2317db96d56Sopenharmony_ci+        path: config.cache
2327db96d56Sopenharmony_ci+        key: ${{ github.job }}-${{ runner.os }}-${{ needs.check_source.outputs.config_hash }}
2337db96d56Sopenharmony_ci+    - name: Install Homebrew dependencies
2347db96d56Sopenharmony_ci+      run: brew install pkg-config openssl@1.1 xz gdbm tcl-tk
2357db96d56Sopenharmony_ci+    - name: Configure CPython
2367db96d56Sopenharmony_ci+      run: |
2377db96d56Sopenharmony_ci+        CFLAGS="-I$(brew --prefix gdbm)/include -I$(brew --prefix xz)/include" \
2387db96d56Sopenharmony_ci+        LDFLAGS="-L$(brew --prefix gdbm)/lib -I$(brew --prefix xz)/lib" \
2397db96d56Sopenharmony_ci+        PKG_CONFIG_PATH="$(brew --prefix tcl-tk)/lib/pkgconfig" \
2407db96d56Sopenharmony_ci+        ./configure \
2417db96d56Sopenharmony_ci+          --config-cache \
2427db96d56Sopenharmony_ci+          --with-pydebug \
2437db96d56Sopenharmony_ci+          --prefix=/opt/python-dev \
2447db96d56Sopenharmony_ci+          --with-openssl="$(brew --prefix openssl@1.1)"
2457db96d56Sopenharmony_ci+    - name: Build CPython
2467db96d56Sopenharmony_ci+      run: make -j4
2477db96d56Sopenharmony_ci+    - name: Display build info
2487db96d56Sopenharmony_ci+      run: make pythoninfo
2497db96d56Sopenharmony_ci+    - name: Tests
2507db96d56Sopenharmony_ci+      run: make buildbottest TESTOPTS="-j4 -uall,-cpu"
2517db96d56Sopenharmony_ci+
2527db96d56Sopenharmony_ci+  build_ubuntu:
2537db96d56Sopenharmony_ci+    name: 'Ubuntu'
2547db96d56Sopenharmony_ci+    runs-on: ubuntu-20.04
2557db96d56Sopenharmony_ci+    timeout-minutes: 60
2567db96d56Sopenharmony_ci+    needs: check_source
2577db96d56Sopenharmony_ci+    if: needs.check_source.outputs.run_tests == 'true'
2587db96d56Sopenharmony_ci+    env:
2597db96d56Sopenharmony_ci+      OPENSSL_VER: 1.1.1u
2607db96d56Sopenharmony_ci+      PYTHONSTRICTEXTENSIONBUILD: 1
2617db96d56Sopenharmony_ci+    steps:
2627db96d56Sopenharmony_ci+    - uses: actions/checkout@v3
2637db96d56Sopenharmony_ci+    - name: Register gcc problem matcher
2647db96d56Sopenharmony_ci+      run: echo "::add-matcher::.github/problem-matchers/gcc.json"
2657db96d56Sopenharmony_ci+    - name: Install Dependencies
2667db96d56Sopenharmony_ci+      run: sudo ./.github/workflows/posix-deps-apt.sh
2677db96d56Sopenharmony_ci+    - name: Configure OpenSSL env vars
2687db96d56Sopenharmony_ci+      run: |
2697db96d56Sopenharmony_ci+        echo "MULTISSL_DIR=${GITHUB_WORKSPACE}/multissl" >> $GITHUB_ENV
2707db96d56Sopenharmony_ci+        echo "OPENSSL_DIR=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}" >> $GITHUB_ENV
2717db96d56Sopenharmony_ci+        echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV
2727db96d56Sopenharmony_ci+    - name: 'Restore OpenSSL build'
2737db96d56Sopenharmony_ci+      id: cache-openssl
2747db96d56Sopenharmony_ci+      uses: actions/cache@v3
2757db96d56Sopenharmony_ci+      with:
2767db96d56Sopenharmony_ci+        path: ./multissl/openssl/${{ env.OPENSSL_VER }}
2777db96d56Sopenharmony_ci+        key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }}
2787db96d56Sopenharmony_ci+    - name: Install OpenSSL
2797db96d56Sopenharmony_ci+      if: steps.cache-openssl.outputs.cache-hit != 'true'
2807db96d56Sopenharmony_ci+      run: python3 Tools/ssl/multissltests.py --steps=library --base-directory $MULTISSL_DIR --openssl $OPENSSL_VER --system Linux
2817db96d56Sopenharmony_ci+    - name: Add ccache to PATH
2827db96d56Sopenharmony_ci+      run: |
2837db96d56Sopenharmony_ci+        echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV
2847db96d56Sopenharmony_ci+    - name: Configure ccache action
2857db96d56Sopenharmony_ci+      uses: hendrikmuhs/ccache-action@v1.2
2867db96d56Sopenharmony_ci+    - name: Setup directory envs for out-of-tree builds
2877db96d56Sopenharmony_ci+      run: |
2887db96d56Sopenharmony_ci+        echo "CPYTHON_RO_SRCDIR=$(realpath -m ${GITHUB_WORKSPACE}/../cpython-ro-srcdir)" >> $GITHUB_ENV
2897db96d56Sopenharmony_ci+        echo "CPYTHON_BUILDDIR=$(realpath -m ${GITHUB_WORKSPACE}/../cpython-builddir)" >> $GITHUB_ENV
2907db96d56Sopenharmony_ci+    - name: Create directories for read-only out-of-tree builds
2917db96d56Sopenharmony_ci+      run: mkdir -p $CPYTHON_RO_SRCDIR $CPYTHON_BUILDDIR
2927db96d56Sopenharmony_ci+    - name: Bind mount sources read-only
2937db96d56Sopenharmony_ci+      run: sudo mount --bind -o ro $GITHUB_WORKSPACE $CPYTHON_RO_SRCDIR
2947db96d56Sopenharmony_ci+    - name: Restore config.cache
2957db96d56Sopenharmony_ci+      uses: actions/cache@v3
2967db96d56Sopenharmony_ci+      with:
2977db96d56Sopenharmony_ci+        path: ${{ env.CPYTHON_BUILDDIR }}/config.cache
2987db96d56Sopenharmony_ci+        key: ${{ github.job }}-${{ runner.os }}-${{ needs.check_source.outputs.config_hash }}
2997db96d56Sopenharmony_ci+    - name: Configure CPython out-of-tree
3007db96d56Sopenharmony_ci+      working-directory: ${{ env.CPYTHON_BUILDDIR }}
3017db96d56Sopenharmony_ci+      run: |
3027db96d56Sopenharmony_ci+        ../cpython-ro-srcdir/configure \
3037db96d56Sopenharmony_ci+          --config-cache \
3047db96d56Sopenharmony_ci+          --with-pydebug \
3057db96d56Sopenharmony_ci+          --with-openssl=$OPENSSL_DIR
3067db96d56Sopenharmony_ci+    - name: Build CPython out-of-tree
3077db96d56Sopenharmony_ci+      working-directory: ${{ env.CPYTHON_BUILDDIR }}
3087db96d56Sopenharmony_ci+      run: make -j4
3097db96d56Sopenharmony_ci+    - name: Display build info
3107db96d56Sopenharmony_ci+      working-directory: ${{ env.CPYTHON_BUILDDIR }}
3117db96d56Sopenharmony_ci+      run: make pythoninfo
3127db96d56Sopenharmony_ci+    - name: Remount sources writable for tests
3137db96d56Sopenharmony_ci+      # some tests write to srcdir, lack of pyc files slows down testing
3147db96d56Sopenharmony_ci+      run: sudo mount $CPYTHON_RO_SRCDIR -oremount,rw
3157db96d56Sopenharmony_ci+    - name: Tests
3167db96d56Sopenharmony_ci+      working-directory: ${{ env.CPYTHON_BUILDDIR }}
3177db96d56Sopenharmony_ci+      run: xvfb-run make buildbottest TESTOPTS="-j4 -uall,-cpu"
3187db96d56Sopenharmony_ci+
3197db96d56Sopenharmony_ci+  build_ubuntu_ssltests:
3207db96d56Sopenharmony_ci+    name: 'Ubuntu SSL tests with OpenSSL'
3217db96d56Sopenharmony_ci+    runs-on: ubuntu-20.04
3227db96d56Sopenharmony_ci+    timeout-minutes: 60
3237db96d56Sopenharmony_ci+    needs: check_source
3247db96d56Sopenharmony_ci+    if: needs.check_source.outputs.run_tests == 'true' && needs.check_source.outputs.run_ssl_tests == 'true'
3257db96d56Sopenharmony_ci+    strategy:
3267db96d56Sopenharmony_ci+      fail-fast: false
3277db96d56Sopenharmony_ci+      matrix:
3287db96d56Sopenharmony_ci+        openssl_ver: [1.1.1u, 3.0.9, 3.1.1]
3297db96d56Sopenharmony_ci+    env:
3307db96d56Sopenharmony_ci+      OPENSSL_VER: ${{ matrix.openssl_ver }}
3317db96d56Sopenharmony_ci+      MULTISSL_DIR: ${{ github.workspace }}/multissl
3327db96d56Sopenharmony_ci+      OPENSSL_DIR: ${{ github.workspace }}/multissl/openssl/${{ matrix.openssl_ver }}
3337db96d56Sopenharmony_ci+      LD_LIBRARY_PATH: ${{ github.workspace }}/multissl/openssl/${{ matrix.openssl_ver }}/lib
3347db96d56Sopenharmony_ci+    steps:
3357db96d56Sopenharmony_ci+    - uses: actions/checkout@v3
3367db96d56Sopenharmony_ci+    - name: Restore config.cache
3377db96d56Sopenharmony_ci+      uses: actions/cache@v3
3387db96d56Sopenharmony_ci+      with:
3397db96d56Sopenharmony_ci+        path: config.cache
3407db96d56Sopenharmony_ci+        key: ${{ github.job }}-${{ runner.os }}-${{ needs.check_source.outputs.config_hash }}
3417db96d56Sopenharmony_ci+    - name: Register gcc problem matcher
3427db96d56Sopenharmony_ci+      run: echo "::add-matcher::.github/problem-matchers/gcc.json"
3437db96d56Sopenharmony_ci+    - name: Install Dependencies
3447db96d56Sopenharmony_ci+      run: sudo ./.github/workflows/posix-deps-apt.sh
3457db96d56Sopenharmony_ci+    - name: Configure OpenSSL env vars
3467db96d56Sopenharmony_ci+      run: |
3477db96d56Sopenharmony_ci+        echo "MULTISSL_DIR=${GITHUB_WORKSPACE}/multissl" >> $GITHUB_ENV
3487db96d56Sopenharmony_ci+        echo "OPENSSL_DIR=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}" >> $GITHUB_ENV
3497db96d56Sopenharmony_ci+        echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV
3507db96d56Sopenharmony_ci+    - name: 'Restore OpenSSL build'
3517db96d56Sopenharmony_ci+      id: cache-openssl
3527db96d56Sopenharmony_ci+      uses: actions/cache@v3
3537db96d56Sopenharmony_ci+      with:
3547db96d56Sopenharmony_ci+        path: ./multissl/openssl/${{ env.OPENSSL_VER }}
3557db96d56Sopenharmony_ci+        key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }}
3567db96d56Sopenharmony_ci+    - name: Install OpenSSL
3577db96d56Sopenharmony_ci+      if: steps.cache-openssl.outputs.cache-hit != 'true'
3587db96d56Sopenharmony_ci+      run: python3 Tools/ssl/multissltests.py --steps=library --base-directory $MULTISSL_DIR --openssl $OPENSSL_VER --system Linux
3597db96d56Sopenharmony_ci+    - name: Add ccache to PATH
3607db96d56Sopenharmony_ci+      run: |
3617db96d56Sopenharmony_ci+        echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV
3627db96d56Sopenharmony_ci+    - name: Configure ccache action
3637db96d56Sopenharmony_ci+      uses: hendrikmuhs/ccache-action@v1.2
3647db96d56Sopenharmony_ci+    - name: Configure CPython
3657db96d56Sopenharmony_ci+      run: ./configure --config-cache --with-pydebug --with-openssl=$OPENSSL_DIR
3667db96d56Sopenharmony_ci+    - name: Build CPython
3677db96d56Sopenharmony_ci+      run: make -j4
3687db96d56Sopenharmony_ci+    - name: Display build info
3697db96d56Sopenharmony_ci+      run: make pythoninfo
3707db96d56Sopenharmony_ci+    - name: SSL tests
3717db96d56Sopenharmony_ci+      run: ./python Lib/test/ssltests.py
3727db96d56Sopenharmony_ci+
3737db96d56Sopenharmony_ci+  build_asan:
3747db96d56Sopenharmony_ci+    name: 'Address sanitizer'
3757db96d56Sopenharmony_ci+    runs-on: ubuntu-20.04
3767db96d56Sopenharmony_ci+    timeout-minutes: 60
3777db96d56Sopenharmony_ci+    needs: check_source
3787db96d56Sopenharmony_ci+    if: needs.check_source.outputs.run_tests == 'true'
3797db96d56Sopenharmony_ci+    env:
3807db96d56Sopenharmony_ci+      OPENSSL_VER: 1.1.1u
3817db96d56Sopenharmony_ci+      PYTHONSTRICTEXTENSIONBUILD: 1
3827db96d56Sopenharmony_ci+      ASAN_OPTIONS: detect_leaks=0:allocator_may_return_null=1:handle_segv=0
3837db96d56Sopenharmony_ci+    steps:
3847db96d56Sopenharmony_ci+    - uses: actions/checkout@v3
3857db96d56Sopenharmony_ci+    - name: Restore config.cache
3867db96d56Sopenharmony_ci+      uses: actions/cache@v3
3877db96d56Sopenharmony_ci+      with:
3887db96d56Sopenharmony_ci+        path: config.cache
3897db96d56Sopenharmony_ci+        key: ${{ github.job }}-${{ runner.os }}-${{ needs.check_source.outputs.config_hash }}
3907db96d56Sopenharmony_ci+    - name: Register gcc problem matcher
3917db96d56Sopenharmony_ci+      run: echo "::add-matcher::.github/problem-matchers/gcc.json"
3927db96d56Sopenharmony_ci+    - name: Install Dependencies
3937db96d56Sopenharmony_ci+      run: sudo ./.github/workflows/posix-deps-apt.sh
3947db96d56Sopenharmony_ci+    - name: Set up GCC-10 for ASAN
3957db96d56Sopenharmony_ci+      uses: egor-tensin/setup-gcc@v1
3967db96d56Sopenharmony_ci+      with:
3977db96d56Sopenharmony_ci+        version: 10
3987db96d56Sopenharmony_ci+    - name: Configure OpenSSL env vars
3997db96d56Sopenharmony_ci+      run: |
4007db96d56Sopenharmony_ci+        echo "MULTISSL_DIR=${GITHUB_WORKSPACE}/multissl" >> $GITHUB_ENV
4017db96d56Sopenharmony_ci+        echo "OPENSSL_DIR=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}" >> $GITHUB_ENV
4027db96d56Sopenharmony_ci+        echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV
4037db96d56Sopenharmony_ci+    - name: 'Restore OpenSSL build'
4047db96d56Sopenharmony_ci+      id: cache-openssl
4057db96d56Sopenharmony_ci+      uses: actions/cache@v3
4067db96d56Sopenharmony_ci+      with:
4077db96d56Sopenharmony_ci+        path: ./multissl/openssl/${{ env.OPENSSL_VER }}
4087db96d56Sopenharmony_ci+        key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }}
4097db96d56Sopenharmony_ci+    - name: Install OpenSSL
4107db96d56Sopenharmony_ci+      if: steps.cache-openssl.outputs.cache-hit != 'true'
4117db96d56Sopenharmony_ci+      run: python3 Tools/ssl/multissltests.py --steps=library --base-directory $MULTISSL_DIR --openssl $OPENSSL_VER --system Linux
4127db96d56Sopenharmony_ci+    - name: Add ccache to PATH
4137db96d56Sopenharmony_ci+      run: |
4147db96d56Sopenharmony_ci+        echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV
4157db96d56Sopenharmony_ci+    - name: Configure ccache action
4167db96d56Sopenharmony_ci+      uses: hendrikmuhs/ccache-action@v1.2
4177db96d56Sopenharmony_ci+    - name: Configure CPython
4187db96d56Sopenharmony_ci+      run: ./configure --config-cache --with-address-sanitizer --without-pymalloc
4197db96d56Sopenharmony_ci+    - name: Build CPython
4207db96d56Sopenharmony_ci+      run: make -j4
4217db96d56Sopenharmony_ci+    - name: Display build info
4227db96d56Sopenharmony_ci+      run: make pythoninfo
4237db96d56Sopenharmony_ci+    - name: Tests
4247db96d56Sopenharmony_ci+      run: xvfb-run make buildbottest TESTOPTS="-j4 -uall,-cpu"
4257db96d56Sopenharmony_cidiff --git a/.gitignore b/.gitignore
4267db96d56Sopenharmony_ciindex 0ddfd71..d42e111 100644
4277db96d56Sopenharmony_ci--- a/.gitignore
4287db96d56Sopenharmony_ci+++ b/.gitignore
4297db96d56Sopenharmony_ci@@ -114,6 +114,7 @@ PCbuild/win32/
4307db96d56Sopenharmony_ci Tools/unicode/data/
4317db96d56Sopenharmony_ci /autom4te.cache
4327db96d56Sopenharmony_ci /build/
4337db96d56Sopenharmony_ci+/builddir/
4347db96d56Sopenharmony_ci /config.cache
4357db96d56Sopenharmony_ci /config.log
4367db96d56Sopenharmony_ci /config.status
4377db96d56Sopenharmony_ci@@ -150,6 +151,3 @@ Python/frozen_modules/MANIFEST
4387db96d56Sopenharmony_ci # Ignore ./python binary on Unix but still look into ./Python/ directory.
4397db96d56Sopenharmony_ci /python
4407db96d56Sopenharmony_ci !/Python/
4417db96d56Sopenharmony_ci-
4427db96d56Sopenharmony_ci-# main branch only: ABI files are not checked/maintained
4437db96d56Sopenharmony_ci-Doc/data/python*.abi
4447db96d56Sopenharmony_cidiff --git a/Include/bytesobject.h b/Include/bytesobject.h
4457db96d56Sopenharmony_ciindex 4c4dc40..cd88bed 100644
4467db96d56Sopenharmony_ci--- a/Include/bytesobject.h
4477db96d56Sopenharmony_ci+++ b/Include/bytesobject.h
4487db96d56Sopenharmony_ci@@ -35,9 +35,9 @@ PyAPI_FUNC(PyObject *) PyBytes_FromStringAndSize(const char *, Py_ssize_t);
4497db96d56Sopenharmony_ci PyAPI_FUNC(PyObject *) PyBytes_FromString(const char *);
4507db96d56Sopenharmony_ci PyAPI_FUNC(PyObject *) PyBytes_FromObject(PyObject *);
4517db96d56Sopenharmony_ci PyAPI_FUNC(PyObject *) PyBytes_FromFormatV(const char*, va_list)
4527db96d56Sopenharmony_ci-                                Py_GCC_ATTRIBUTE((format(printf, 1, 0)));
4537db96d56Sopenharmony_ci+                                Py_PRINTF(1, 0);
4547db96d56Sopenharmony_ci PyAPI_FUNC(PyObject *) PyBytes_FromFormat(const char*, ...)
4557db96d56Sopenharmony_ci-                                Py_GCC_ATTRIBUTE((format(printf, 1, 2)));
4567db96d56Sopenharmony_ci+                                Py_PRINTF(1, 2);
4577db96d56Sopenharmony_ci PyAPI_FUNC(Py_ssize_t) PyBytes_Size(PyObject *);
4587db96d56Sopenharmony_ci PyAPI_FUNC(char *) PyBytes_AsString(PyObject *);
4597db96d56Sopenharmony_ci PyAPI_FUNC(PyObject *) PyBytes_Repr(PyObject *, int);
4607db96d56Sopenharmony_cidiff --git a/Include/fileobject.h b/Include/fileobject.h
4617db96d56Sopenharmony_ciindex 4c983e7..260e4c1 100644
4627db96d56Sopenharmony_ci--- a/Include/fileobject.h
4637db96d56Sopenharmony_ci+++ b/Include/fileobject.h
4647db96d56Sopenharmony_ci@@ -30,7 +30,7 @@ PyAPI_DATA(int) Py_UTF8Mode;
4657db96d56Sopenharmony_ci #endif
4667db96d56Sopenharmony_ci 
4677db96d56Sopenharmony_ci /* A routine to check if a file descriptor can be select()-ed. */
4687db96d56Sopenharmony_ci-#ifdef _MSC_VER
4697db96d56Sopenharmony_ci+#ifdef MS_WINDOWS
4707db96d56Sopenharmony_ci     /* On Windows, any socket fd can be select()-ed, no matter how high */
4717db96d56Sopenharmony_ci     #define _PyIsSelectable_fd(FD) (1)
4727db96d56Sopenharmony_ci #else
4737db96d56Sopenharmony_cidiff --git a/Include/internal/pycore_condvar.h b/Include/internal/pycore_condvar.h
4747db96d56Sopenharmony_ciindex 981c962..ed9e6a7 100644
4757db96d56Sopenharmony_ci--- a/Include/internal/pycore_condvar.h
4767db96d56Sopenharmony_ci+++ b/Include/internal/pycore_condvar.h
4777db96d56Sopenharmony_ci@@ -5,6 +5,12 @@
4787db96d56Sopenharmony_ci #  error "this header requires Py_BUILD_CORE define"
4797db96d56Sopenharmony_ci #endif
4807db96d56Sopenharmony_ci 
4817db96d56Sopenharmony_ci+#ifdef __MINGW32__
4827db96d56Sopenharmony_ci+# if !defined(HAVE_PTHREAD_H) || defined(NT_THREADS)
4837db96d56Sopenharmony_ci+#  undef _POSIX_THREADS
4847db96d56Sopenharmony_ci+# endif
4857db96d56Sopenharmony_ci+#endif
4867db96d56Sopenharmony_ci+
4877db96d56Sopenharmony_ci #ifndef _POSIX_THREADS
4887db96d56Sopenharmony_ci /* This means pthreads are not implemented in libc headers, hence the macro
4897db96d56Sopenharmony_ci    not present in unistd.h. But they still can be implemented as an external
4907db96d56Sopenharmony_ci@@ -39,6 +45,10 @@
4917db96d56Sopenharmony_ci /* include windows if it hasn't been done before */
4927db96d56Sopenharmony_ci #define WIN32_LEAN_AND_MEAN
4937db96d56Sopenharmony_ci #include <windows.h>
4947db96d56Sopenharmony_ci+/* winpthreads are involved via windows header, so need undef _POSIX_THREADS after header include */
4957db96d56Sopenharmony_ci+#if defined(_POSIX_THREADS)
4967db96d56Sopenharmony_ci+#undef _POSIX_THREADS
4977db96d56Sopenharmony_ci+#endif
4987db96d56Sopenharmony_ci 
4997db96d56Sopenharmony_ci /* options */
5007db96d56Sopenharmony_ci /* non-emulated condition variables are provided for those that want
5017db96d56Sopenharmony_cidiff --git a/Include/iscygpty.h b/Include/iscygpty.h
5027db96d56Sopenharmony_cinew file mode 100755
5037db96d56Sopenharmony_ciindex 0000000..82fd0af
5047db96d56Sopenharmony_ci--- /dev/null
5057db96d56Sopenharmony_ci+++ b/Include/iscygpty.h
5067db96d56Sopenharmony_ci@@ -0,0 +1,41 @@
5077db96d56Sopenharmony_ci+/*
5087db96d56Sopenharmony_ci+ * iscygpty.h -- part of ptycheck
5097db96d56Sopenharmony_ci+ * https://github.com/k-takata/ptycheck
5107db96d56Sopenharmony_ci+ *
5117db96d56Sopenharmony_ci+ * Copyright (c) 2015-2017 K.Takata
5127db96d56Sopenharmony_ci+ *
5137db96d56Sopenharmony_ci+ * You can redistribute it and/or modify it under the terms of either
5147db96d56Sopenharmony_ci+ * the MIT license (as described below) or the Vim license.
5157db96d56Sopenharmony_ci+ *
5167db96d56Sopenharmony_ci+ * Permission is hereby granted, free of charge, to any person obtaining
5177db96d56Sopenharmony_ci+ * a copy of this software and associated documentation files (the
5187db96d56Sopenharmony_ci+ * "Software"), to deal in the Software without restriction, including
5197db96d56Sopenharmony_ci+ * without limitation the rights to use, copy, modify, merge, publish,
5207db96d56Sopenharmony_ci+ * distribute, sublicense, and/or sell copies of the Software, and to
5217db96d56Sopenharmony_ci+ * permit persons to whom the Software is furnished to do so, subject to
5227db96d56Sopenharmony_ci+ * the following conditions:
5237db96d56Sopenharmony_ci+ *
5247db96d56Sopenharmony_ci+ * The above copyright notice and this permission notice shall be
5257db96d56Sopenharmony_ci+ * included in all copies or substantial portions of the Software.
5267db96d56Sopenharmony_ci+ *
5277db96d56Sopenharmony_ci+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
5287db96d56Sopenharmony_ci+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
5297db96d56Sopenharmony_ci+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
5307db96d56Sopenharmony_ci+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
5317db96d56Sopenharmony_ci+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
5327db96d56Sopenharmony_ci+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
5337db96d56Sopenharmony_ci+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
5347db96d56Sopenharmony_ci+ */
5357db96d56Sopenharmony_ci+
5367db96d56Sopenharmony_ci+#ifndef _ISCYGPTY_H
5377db96d56Sopenharmony_ci+#define _ISCYGPTY_H
5387db96d56Sopenharmony_ci+
5397db96d56Sopenharmony_ci+#ifdef _WIN32
5407db96d56Sopenharmony_ci+int is_cygpty(int fd);
5417db96d56Sopenharmony_ci+int is_cygpty_used(void);
5427db96d56Sopenharmony_ci+#else
5437db96d56Sopenharmony_ci+#define is_cygpty(fd)		0
5447db96d56Sopenharmony_ci+#define is_cygpty_used()	0
5457db96d56Sopenharmony_ci+#endif
5467db96d56Sopenharmony_ci+
5477db96d56Sopenharmony_ci+#endif /* _ISCYGPTY_H */
5487db96d56Sopenharmony_cidiff --git a/Include/osdefs.h b/Include/osdefs.h
5497db96d56Sopenharmony_ciindex 3243944..99d4977 100644
5507db96d56Sopenharmony_ci--- a/Include/osdefs.h
5517db96d56Sopenharmony_ci+++ b/Include/osdefs.h
5527db96d56Sopenharmony_ci@@ -10,7 +10,6 @@ extern "C" {
5537db96d56Sopenharmony_ci #ifdef MS_WINDOWS
5547db96d56Sopenharmony_ci #define SEP L'\\'
5557db96d56Sopenharmony_ci #define ALTSEP L'/'
5567db96d56Sopenharmony_ci-#define MAXPATHLEN 256
5577db96d56Sopenharmony_ci #define DELIM L';'
5587db96d56Sopenharmony_ci #endif
5597db96d56Sopenharmony_ci 
5607db96d56Sopenharmony_cidiff --git a/Include/py_curses.h b/Include/py_curses.h
5617db96d56Sopenharmony_ciindex b2c7f1b..e6fc813 100644
5627db96d56Sopenharmony_ci--- a/Include/py_curses.h
5637db96d56Sopenharmony_ci+++ b/Include/py_curses.h
5647db96d56Sopenharmony_ci@@ -36,6 +36,13 @@
5657db96d56Sopenharmony_ci #include <curses.h>
5667db96d56Sopenharmony_ci #endif
5677db96d56Sopenharmony_ci 
5687db96d56Sopenharmony_ci+#if defined(__MINGW32__)
5697db96d56Sopenharmony_ci+#include <windows.h>
5707db96d56Sopenharmony_ci+#if !defined(_ISPAD)
5717db96d56Sopenharmony_ci+#define _ISPAD 0x10
5727db96d56Sopenharmony_ci+#endif
5737db96d56Sopenharmony_ci+#endif
5747db96d56Sopenharmony_ci+
5757db96d56Sopenharmony_ci #ifdef HAVE_NCURSES_H
5767db96d56Sopenharmony_ci /* configure was checking <curses.h>, but we will
5777db96d56Sopenharmony_ci    use <ncurses.h>, which has some or all these features. */
5787db96d56Sopenharmony_cidiff --git a/Include/pyerrors.h b/Include/pyerrors.h
5797db96d56Sopenharmony_ciindex 34e3de3..fb71fde 100644
5807db96d56Sopenharmony_ci--- a/Include/pyerrors.h
5817db96d56Sopenharmony_ci+++ b/Include/pyerrors.h
5827db96d56Sopenharmony_ci@@ -315,9 +315,9 @@ PyAPI_FUNC(int) PyUnicodeTranslateError_SetReason(
5837db96d56Sopenharmony_ci     );
5847db96d56Sopenharmony_ci 
5857db96d56Sopenharmony_ci PyAPI_FUNC(int) PyOS_snprintf(char *str, size_t size, const char  *format, ...)
5867db96d56Sopenharmony_ci-                        Py_GCC_ATTRIBUTE((format(printf, 3, 4)));
5877db96d56Sopenharmony_ci+                        Py_PRINTF(3, 4);
5887db96d56Sopenharmony_ci PyAPI_FUNC(int) PyOS_vsnprintf(char *str, size_t size, const char  *format, va_list va)
5897db96d56Sopenharmony_ci-                        Py_GCC_ATTRIBUTE((format(printf, 3, 0)));
5907db96d56Sopenharmony_ci+                        Py_PRINTF(3, 0);
5917db96d56Sopenharmony_ci 
5927db96d56Sopenharmony_ci #ifndef Py_LIMITED_API
5937db96d56Sopenharmony_ci #  define Py_CPYTHON_ERRORS_H
5947db96d56Sopenharmony_cidiff --git a/Include/pylifecycle.h b/Include/pylifecycle.h
5957db96d56Sopenharmony_ciindex e4c3b09..21346ba 100644
5967db96d56Sopenharmony_ci--- a/Include/pylifecycle.h
5977db96d56Sopenharmony_ci+++ b/Include/pylifecycle.h
5987db96d56Sopenharmony_ci@@ -21,6 +21,15 @@ PyAPI_FUNC(int) Py_IsInitialized(void);
5997db96d56Sopenharmony_ci PyAPI_FUNC(PyThreadState *) Py_NewInterpreter(void);
6007db96d56Sopenharmony_ci PyAPI_FUNC(void) Py_EndInterpreter(PyThreadState *);
6017db96d56Sopenharmony_ci 
6027db96d56Sopenharmony_ci+PyAPI_FUNC(wchar_t) Py_GetAltSepW(const wchar_t *);
6037db96d56Sopenharmony_ci+PyAPI_FUNC(wchar_t) Py_GetSepW(const wchar_t *);
6047db96d56Sopenharmony_ci+PyAPI_FUNC(char) Py_GetSepA(const char *);
6057db96d56Sopenharmony_ci+
6067db96d56Sopenharmony_ci+PyAPI_FUNC(void) Py_NormalizeSepsW(wchar_t *);
6077db96d56Sopenharmony_ci+PyAPI_FUNC(void) Py_NormalizeSepsA(char *);
6087db96d56Sopenharmony_ci+
6097db96d56Sopenharmony_ci+PyAPI_FUNC(void) Py_NormalizeSepsPathcchW(wchar_t *);
6107db96d56Sopenharmony_ci+
6117db96d56Sopenharmony_ci 
6127db96d56Sopenharmony_ci /* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level
6137db96d56Sopenharmony_ci  * exit functions.
6147db96d56Sopenharmony_cidiff --git a/Include/pyport.h b/Include/pyport.h
6157db96d56Sopenharmony_ciindex 93250f4..b816c90 100644
6167db96d56Sopenharmony_ci--- a/Include/pyport.h
6177db96d56Sopenharmony_ci+++ b/Include/pyport.h
6187db96d56Sopenharmony_ci@@ -53,6 +53,21 @@
6197db96d56Sopenharmony_ci #endif
6207db96d56Sopenharmony_ci 
6217db96d56Sopenharmony_ci 
6227db96d56Sopenharmony_ci+#ifdef __MINGW32__
6237db96d56Sopenharmony_ci+/* Translate GCC[mingw*] platform specific defines to those
6247db96d56Sopenharmony_ci+ * used in python code.
6257db96d56Sopenharmony_ci+ */
6267db96d56Sopenharmony_ci+#if !defined(MS_WIN64) && defined(_WIN64)
6277db96d56Sopenharmony_ci+#  define MS_WIN64
6287db96d56Sopenharmony_ci+#endif
6297db96d56Sopenharmony_ci+#if !defined(MS_WIN32) && defined(_WIN32)
6307db96d56Sopenharmony_ci+#  define MS_WIN32
6317db96d56Sopenharmony_ci+#endif
6327db96d56Sopenharmony_ci+#if !defined(MS_WINDOWS) && defined(MS_WIN32)
6337db96d56Sopenharmony_ci+#  define MS_WINDOWS
6347db96d56Sopenharmony_ci+#endif
6357db96d56Sopenharmony_ci+#endif /* __MINGW32__*/
6367db96d56Sopenharmony_ci+
6377db96d56Sopenharmony_ci /**************************************************************************
6387db96d56Sopenharmony_ci Symbols and macros to supply platform-independent interfaces to basic
6397db96d56Sopenharmony_ci C language & library operations whose spellings vary across platforms.
6407db96d56Sopenharmony_ci@@ -509,12 +524,12 @@ extern char * _getpty(int *, int, mode_t, int);
6417db96d56Sopenharmony_ci */
6427db96d56Sopenharmony_ci 
6437db96d56Sopenharmony_ci /*
6447db96d56Sopenharmony_ci-  All windows ports, except cygwin, are handled in PC/pyconfig.h.
6457db96d56Sopenharmony_ci+  Only MSVC windows ports is handled in PC/pyconfig.h.
6467db96d56Sopenharmony_ci 
6477db96d56Sopenharmony_ci-  Cygwin is the only other autoconf platform requiring special
6487db96d56Sopenharmony_ci+  Cygwin and Mingw is the only other autoconf platform requiring special
6497db96d56Sopenharmony_ci   linkage handling and it uses __declspec().
6507db96d56Sopenharmony_ci */
6517db96d56Sopenharmony_ci-#if defined(__CYGWIN__)
6527db96d56Sopenharmony_ci+#if defined(__CYGWIN__) || defined(__MINGW32__)
6537db96d56Sopenharmony_ci #       define HAVE_DECLSPEC_DLL
6547db96d56Sopenharmony_ci #endif
6557db96d56Sopenharmony_ci 
6567db96d56Sopenharmony_ci@@ -527,21 +542,23 @@ extern char * _getpty(int *, int, mode_t, int);
6577db96d56Sopenharmony_ci #                       define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE
6587db96d56Sopenharmony_ci #                       define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE
6597db96d56Sopenharmony_ci         /* module init functions inside the core need no external linkage */
6607db96d56Sopenharmony_ci-        /* except for Cygwin to handle embedding */
6617db96d56Sopenharmony_ci-#                       if defined(__CYGWIN__)
6627db96d56Sopenharmony_ci+        /* except for Cygwin/Mingw to handle embedding */
6637db96d56Sopenharmony_ci+#                       if defined(__CYGWIN__) || defined(__MINGW32__)
6647db96d56Sopenharmony_ci #                               define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject*
6657db96d56Sopenharmony_ci-#                       else /* __CYGWIN__ */
6667db96d56Sopenharmony_ci+#                       else /* __CYGWIN__ || __MINGW32__*/
6677db96d56Sopenharmony_ci #                               define PyMODINIT_FUNC PyObject*
6687db96d56Sopenharmony_ci-#                       endif /* __CYGWIN__ */
6697db96d56Sopenharmony_ci+#                       endif /* __CYGWIN__ || __MINGW32__*/
6707db96d56Sopenharmony_ci #               else /* Py_BUILD_CORE */
6717db96d56Sopenharmony_ci         /* Building an extension module, or an embedded situation */
6727db96d56Sopenharmony_ci         /* public Python functions and data are imported */
6737db96d56Sopenharmony_ci         /* Under Cygwin, auto-import functions to prevent compilation */
6747db96d56Sopenharmony_ci         /* failures similar to those described at the bottom of 4.1: */
6757db96d56Sopenharmony_ci         /* http://docs.python.org/extending/windows.html#a-cookbook-approach */
6767db96d56Sopenharmony_ci-#                       if !defined(__CYGWIN__)
6777db96d56Sopenharmony_ci+#                       if defined(__CYGWIN__) || defined(__MINGW32__)
6787db96d56Sopenharmony_ci+#                               define PyAPI_FUNC(RTYPE) RTYPE
6797db96d56Sopenharmony_ci+#                       else
6807db96d56Sopenharmony_ci #                               define PyAPI_FUNC(RTYPE) Py_IMPORTED_SYMBOL RTYPE
6817db96d56Sopenharmony_ci-#                       endif /* !__CYGWIN__ */
6827db96d56Sopenharmony_ci+#                       endif /* __CYGWIN__ || __MINGW32__*/
6837db96d56Sopenharmony_ci #                       define PyAPI_DATA(RTYPE) extern Py_IMPORTED_SYMBOL RTYPE
6847db96d56Sopenharmony_ci         /* module init functions outside the core must be exported */
6857db96d56Sopenharmony_ci #                       if defined(__cplusplus)
6867db96d56Sopenharmony_ci@@ -641,6 +658,12 @@ extern char * _getpty(int *, int, mode_t, int);
6877db96d56Sopenharmony_ci 
6887db96d56Sopenharmony_ci #define Py_VA_COPY va_copy
6897db96d56Sopenharmony_ci 
6907db96d56Sopenharmony_ci+#if defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__>= 4) || __GNUC__ > 4)
6917db96d56Sopenharmony_ci+#  define Py_PRINTF(X,Y) Py_GCC_ATTRIBUTE((format(gnu_printf,X,Y)))
6927db96d56Sopenharmony_ci+#else
6937db96d56Sopenharmony_ci+#  define Py_PRINTF(X,Y) Py_GCC_ATTRIBUTE((format(printf,X,Y))) 
6947db96d56Sopenharmony_ci+#endif
6957db96d56Sopenharmony_ci+
6967db96d56Sopenharmony_ci /*
6977db96d56Sopenharmony_ci  * Convenient macros to deal with endianness of the platform. WORDS_BIGENDIAN is
6987db96d56Sopenharmony_ci  * detected by configure and defined in pyconfig.h. The code in pyconfig.h
6997db96d56Sopenharmony_cidiff --git a/Include/pythread.h b/Include/pythread.h
7007db96d56Sopenharmony_ciindex a483290..9bf8bd6 100644
7017db96d56Sopenharmony_ci--- a/Include/pythread.h
7027db96d56Sopenharmony_ci+++ b/Include/pythread.h
7037db96d56Sopenharmony_ci@@ -7,6 +7,12 @@ typedef void *PyThread_type_lock;
7047db96d56Sopenharmony_ci extern "C" {
7057db96d56Sopenharmony_ci #endif
7067db96d56Sopenharmony_ci 
7077db96d56Sopenharmony_ci+#ifdef __MINGW32__
7087db96d56Sopenharmony_ci+# if !defined(HAVE_PTHREAD_H) || defined(NT_THREADS)
7097db96d56Sopenharmony_ci+#  undef _POSIX_THREADS
7107db96d56Sopenharmony_ci+# endif
7117db96d56Sopenharmony_ci+#endif
7127db96d56Sopenharmony_ci+
7137db96d56Sopenharmony_ci /* Return status codes for Python lock acquisition.  Chosen for maximum
7147db96d56Sopenharmony_ci  * backwards compatibility, ie failure -> 0, success -> 1.  */
7157db96d56Sopenharmony_ci typedef enum PyLockStatus {
7167db96d56Sopenharmony_cidiff --git a/Include/sysmodule.h b/Include/sysmodule.h
7177db96d56Sopenharmony_ciindex b508711..d6767dc 100644
7187db96d56Sopenharmony_ci--- a/Include/sysmodule.h
7197db96d56Sopenharmony_ci+++ b/Include/sysmodule.h
7207db96d56Sopenharmony_ci@@ -15,9 +15,9 @@ Py_DEPRECATED(3.11) PyAPI_FUNC(void) PySys_SetArgvEx(int, wchar_t **, int);
7217db96d56Sopenharmony_ci Py_DEPRECATED(3.11) PyAPI_FUNC(void) PySys_SetPath(const wchar_t *);
7227db96d56Sopenharmony_ci 
7237db96d56Sopenharmony_ci PyAPI_FUNC(void) PySys_WriteStdout(const char *format, ...)
7247db96d56Sopenharmony_ci-                 Py_GCC_ATTRIBUTE((format(printf, 1, 2)));
7257db96d56Sopenharmony_ci+                 Py_PRINTF(1, 2);
7267db96d56Sopenharmony_ci PyAPI_FUNC(void) PySys_WriteStderr(const char *format, ...)
7277db96d56Sopenharmony_ci-                 Py_GCC_ATTRIBUTE((format(printf, 1, 2)));
7287db96d56Sopenharmony_ci+                 Py_PRINTF(1, 2);
7297db96d56Sopenharmony_ci PyAPI_FUNC(void) PySys_FormatStdout(const char *format, ...);
7307db96d56Sopenharmony_ci PyAPI_FUNC(void) PySys_FormatStderr(const char *format, ...);
7317db96d56Sopenharmony_ci 
7327db96d56Sopenharmony_cidiff --git a/Lib/compileall.py b/Lib/compileall.py
7337db96d56Sopenharmony_ciindex a388931..069ea2b 100644
7347db96d56Sopenharmony_ci--- a/Lib/compileall.py
7357db96d56Sopenharmony_ci+++ b/Lib/compileall.py
7367db96d56Sopenharmony_ci@@ -38,6 +38,8 @@ def _walk_dir(dir, maxlevels, quiet=0):
7377db96d56Sopenharmony_ci         if name == '__pycache__':
7387db96d56Sopenharmony_ci             continue
7397db96d56Sopenharmony_ci         fullname = os.path.join(dir, name)
7407db96d56Sopenharmony_ci+        if sys.platform == "win32" and sys.version.find("GCC") >= 0:
7417db96d56Sopenharmony_ci+            fullname = fullname.replace('\\','/')
7427db96d56Sopenharmony_ci         if not os.path.isdir(fullname):
7437db96d56Sopenharmony_ci             yield fullname
7447db96d56Sopenharmony_ci         elif (maxlevels > 0 and name != os.curdir and name != os.pardir and
7457db96d56Sopenharmony_cidiff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py
7467db96d56Sopenharmony_ciindex 26135ad..76d583b 100644
7477db96d56Sopenharmony_ci--- a/Lib/ctypes/__init__.py
7487db96d56Sopenharmony_ci+++ b/Lib/ctypes/__init__.py
7497db96d56Sopenharmony_ci@@ -458,7 +458,9 @@ def LoadLibrary(self, name):
7507db96d56Sopenharmony_ci cdll = LibraryLoader(CDLL)
7517db96d56Sopenharmony_ci pydll = LibraryLoader(PyDLL)
7527db96d56Sopenharmony_ci 
7537db96d56Sopenharmony_ci-if _os.name == "nt":
7547db96d56Sopenharmony_ci+if _os.name == "nt" and _sys.version.find('GCC') >= 0:
7557db96d56Sopenharmony_ci+    pythonapi = PyDLL("libpython%d.%d%s.dll" % (_sys.version_info[:2] + (_sys.abiflags,)), None)
7567db96d56Sopenharmony_ci+elif _os.name == "nt":
7577db96d56Sopenharmony_ci     pythonapi = PyDLL("python dll", None, _sys.dllhandle)
7587db96d56Sopenharmony_ci elif _sys.platform == "cygwin":
7597db96d56Sopenharmony_ci     pythonapi = PyDLL("libpython%d.%d.dll" % _sys.version_info[:2])
7607db96d56Sopenharmony_cidiff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py
7617db96d56Sopenharmony_ciindex 0c2510e..48ddb3b 100644
7627db96d56Sopenharmony_ci--- a/Lib/ctypes/util.py
7637db96d56Sopenharmony_ci+++ b/Lib/ctypes/util.py
7647db96d56Sopenharmony_ci@@ -31,6 +31,12 @@ def _get_build_version():
7657db96d56Sopenharmony_ci         # else we don't know what version of the compiler this is
7667db96d56Sopenharmony_ci         return None
7677db96d56Sopenharmony_ci 
7687db96d56Sopenharmony_ci+    def find_msvcrt_mingw():
7697db96d56Sopenharmony_ci+        is_ucrt = 'clang' in sys.version.lower() or 'ucrt' in sys.version.lower()
7707db96d56Sopenharmony_ci+        if is_ucrt:
7717db96d56Sopenharmony_ci+            return None
7727db96d56Sopenharmony_ci+        return 'msvcrt.dll'
7737db96d56Sopenharmony_ci+
7747db96d56Sopenharmony_ci     def find_msvcrt():
7757db96d56Sopenharmony_ci         """Return the name of the VC runtime dll"""
7767db96d56Sopenharmony_ci         version = _get_build_version()
7777db96d56Sopenharmony_ci@@ -54,6 +60,9 @@ def find_msvcrt():
7787db96d56Sopenharmony_ci 
7797db96d56Sopenharmony_ci     def find_library(name):
7807db96d56Sopenharmony_ci         if name in ('c', 'm'):
7817db96d56Sopenharmony_ci+            import sysconfig
7827db96d56Sopenharmony_ci+            if sysconfig.get_platform().startswith('mingw'):
7837db96d56Sopenharmony_ci+                return find_msvcrt_mingw()
7847db96d56Sopenharmony_ci             return find_msvcrt()
7857db96d56Sopenharmony_ci         # See MSDN for the REAL search order.
7867db96d56Sopenharmony_ci         for directory in os.environ['PATH'].split(os.pathsep):
7877db96d56Sopenharmony_cidiff --git a/Lib/distutils/ccompiler.py b/Lib/distutils/ccompiler.py
7887db96d56Sopenharmony_ciindex 4c47f2e..ab61a86 100644
7897db96d56Sopenharmony_ci--- a/Lib/distutils/ccompiler.py
7907db96d56Sopenharmony_ci+++ b/Lib/distutils/ccompiler.py
7917db96d56Sopenharmony_ci@@ -9,7 +9,7 @@
7927db96d56Sopenharmony_ci from distutils.file_util import move_file
7937db96d56Sopenharmony_ci from distutils.dir_util import mkpath
7947db96d56Sopenharmony_ci from distutils.dep_util import newer_group
7957db96d56Sopenharmony_ci-from distutils.util import split_quoted, execute
7967db96d56Sopenharmony_ci+from distutils.util import split_quoted, execute, get_platform
7977db96d56Sopenharmony_ci from distutils import log
7987db96d56Sopenharmony_ci 
7997db96d56Sopenharmony_ci class CCompiler:
8007db96d56Sopenharmony_ci@@ -948,6 +948,8 @@ def get_default_compiler(osname=None, platform=None):
8017db96d56Sopenharmony_ci         osname = os.name
8027db96d56Sopenharmony_ci     if platform is None:
8037db96d56Sopenharmony_ci         platform = sys.platform
8047db96d56Sopenharmony_ci+    if get_platform().startswith('mingw'):
8057db96d56Sopenharmony_ci+        return 'mingw32'
8067db96d56Sopenharmony_ci     for pattern, compiler in _default_compilers:
8077db96d56Sopenharmony_ci         if re.match(pattern, platform) is not None or \
8087db96d56Sopenharmony_ci            re.match(pattern, osname) is not None:
8097db96d56Sopenharmony_cidiff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py
8107db96d56Sopenharmony_ciindex f287b34..e87e3ad 100644
8117db96d56Sopenharmony_ci--- a/Lib/distutils/command/build_ext.py
8127db96d56Sopenharmony_ci+++ b/Lib/distutils/command/build_ext.py
8137db96d56Sopenharmony_ci@@ -186,7 +186,7 @@ def finalize_options(self):
8147db96d56Sopenharmony_ci         # for extensions under windows use different directories
8157db96d56Sopenharmony_ci         # for Release and Debug builds.
8167db96d56Sopenharmony_ci         # also Python's library directory must be appended to library_dirs
8177db96d56Sopenharmony_ci-        if os.name == 'nt':
8187db96d56Sopenharmony_ci+        if os.name == 'nt' and not self.plat_name.startswith(('mingw')):
8197db96d56Sopenharmony_ci             # the 'libs' directory is for binary installs - we assume that
8207db96d56Sopenharmony_ci             # must be the *native* platform.  But we don't really support
8217db96d56Sopenharmony_ci             # cross-compiling via a binary install anyway, so we let it go.
8227db96d56Sopenharmony_ci@@ -218,15 +218,16 @@ def finalize_options(self):
8237db96d56Sopenharmony_ci 
8247db96d56Sopenharmony_ci         # For extensions under Cygwin, Python's library directory must be
8257db96d56Sopenharmony_ci         # appended to library_dirs
8267db96d56Sopenharmony_ci-        if sys.platform[:6] == 'cygwin':
8277db96d56Sopenharmony_ci-            if sys.executable.startswith(os.path.join(sys.exec_prefix, "bin")):
8287db96d56Sopenharmony_ci+        if sys.platform[:6] == 'cygwin' or self.plat_name.startswith(('mingw')):
8297db96d56Sopenharmony_ci+            if not sysconfig.python_build:
8307db96d56Sopenharmony_ci                 # building third party extensions
8317db96d56Sopenharmony_ci+                config_dir_name = os.path.basename(sysconfig.get_config_var('LIBPL'))
8327db96d56Sopenharmony_ci                 self.library_dirs.append(os.path.join(sys.prefix, "lib",
8337db96d56Sopenharmony_ci                                                       "python" + get_python_version(),
8347db96d56Sopenharmony_ci-                                                      "config"))
8357db96d56Sopenharmony_ci+                                                      config_dir_name))
8367db96d56Sopenharmony_ci             else:
8377db96d56Sopenharmony_ci                 # building python standard extensions
8387db96d56Sopenharmony_ci-                self.library_dirs.append('.')
8397db96d56Sopenharmony_ci+                self.library_dirs.append(sysconfig.project_base)
8407db96d56Sopenharmony_ci 
8417db96d56Sopenharmony_ci         # For building extensions with a shared Python library,
8427db96d56Sopenharmony_ci         # Python's library directory must be appended to library_dirs
8437db96d56Sopenharmony_ci@@ -237,7 +238,7 @@ def finalize_options(self):
8447db96d56Sopenharmony_ci                 self.library_dirs.append(sysconfig.get_config_var('LIBDIR'))
8457db96d56Sopenharmony_ci             else:
8467db96d56Sopenharmony_ci                 # building python standard extensions
8477db96d56Sopenharmony_ci-                self.library_dirs.append('.')
8487db96d56Sopenharmony_ci+                self.library_dirs.append(sysconfig.project_base)
8497db96d56Sopenharmony_ci 
8507db96d56Sopenharmony_ci         # The argument parsing will result in self.define being a string, but
8517db96d56Sopenharmony_ci         # it has to be a list of 2-tuples.  All the preprocessor symbols
8527db96d56Sopenharmony_ci@@ -712,6 +713,20 @@ def get_libraries(self, ext):
8537db96d56Sopenharmony_ci         # pyconfig.h that MSVC groks.  The other Windows compilers all seem
8547db96d56Sopenharmony_ci         # to need it mentioned explicitly, though, so that's what we do.
8557db96d56Sopenharmony_ci         # Append '_d' to the python import library on debug builds.
8567db96d56Sopenharmony_ci+
8577db96d56Sopenharmony_ci+        # Use self.plat_name as it works even in case of
8587db96d56Sopenharmony_ci+        # cross-compilation (at least for mingw build).
8597db96d56Sopenharmony_ci+        if self.plat_name.startswith('mingw'):
8607db96d56Sopenharmony_ci+            from distutils import sysconfig
8617db96d56Sopenharmony_ci+            extra = []
8627db96d56Sopenharmony_ci+            for lib in (
8637db96d56Sopenharmony_ci+                sysconfig.get_config_var('BLDLIBRARY').split()
8647db96d56Sopenharmony_ci+                + sysconfig.get_config_var('SHLIBS').split()
8657db96d56Sopenharmony_ci+                ):
8667db96d56Sopenharmony_ci+                if lib.startswith('-l'):
8677db96d56Sopenharmony_ci+                    extra.append(lib[2:])
8687db96d56Sopenharmony_ci+            return ext.libraries + extra
8697db96d56Sopenharmony_ci+
8707db96d56Sopenharmony_ci         if sys.platform == "win32":
8717db96d56Sopenharmony_ci             from distutils._msvccompiler import MSVCCompiler
8727db96d56Sopenharmony_ci             if not isinstance(self.compiler, MSVCCompiler):
8737db96d56Sopenharmony_cidiff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
8747db96d56Sopenharmony_ciindex 01d5331..25eb3d8 100644
8757db96d56Sopenharmony_ci--- a/Lib/distutils/command/install.py
8767db96d56Sopenharmony_ci+++ b/Lib/distutils/command/install.py
8777db96d56Sopenharmony_ci@@ -72,8 +72,8 @@
8787db96d56Sopenharmony_ci     INSTALL_SCHEMES['nt_user'] = {
8797db96d56Sopenharmony_ci         'purelib': '$usersite',
8807db96d56Sopenharmony_ci         'platlib': '$usersite',
8817db96d56Sopenharmony_ci-        'headers': '$userbase/Python$py_version_nodot/Include/$dist_name',
8827db96d56Sopenharmony_ci-        'scripts': '$userbase/Python$py_version_nodot/Scripts',
8837db96d56Sopenharmony_ci+        'headers': '$userbase/include/python$py_version_short_plat$abiflags/$dist_name',
8847db96d56Sopenharmony_ci+        'scripts': '$userbase/bin',
8857db96d56Sopenharmony_ci         'data'   : '$userbase',
8867db96d56Sopenharmony_ci         }
8877db96d56Sopenharmony_ci 
8887db96d56Sopenharmony_ci@@ -81,7 +81,7 @@
8897db96d56Sopenharmony_ci         'purelib': '$usersite',
8907db96d56Sopenharmony_ci         'platlib': '$usersite',
8917db96d56Sopenharmony_ci         'headers':
8927db96d56Sopenharmony_ci-            '$userbase/include/python$py_version_short$abiflags/$dist_name',
8937db96d56Sopenharmony_ci+            '$userbase/include/python$py_version_short_plat$abiflags/$dist_name',
8947db96d56Sopenharmony_ci         'scripts': '$userbase/bin',
8957db96d56Sopenharmony_ci         'data'   : '$userbase',
8967db96d56Sopenharmony_ci         }
8977db96d56Sopenharmony_ci@@ -311,6 +311,7 @@ def finalize_options(self):
8987db96d56Sopenharmony_ci                             'py_version': py_version,
8997db96d56Sopenharmony_ci                             'py_version_short': '%d.%d' % sys.version_info[:2],
9007db96d56Sopenharmony_ci                             'py_version_nodot': '%d%d' % sys.version_info[:2],
9017db96d56Sopenharmony_ci+                            'py_version_short_plat': f'{sys.version_info[0]}.{sys.version_info[1]}-{get_platform()}' if os.name == 'nt' and 'gcc' in sys.version.lower() else f'{sys.version_info[0]}.{sys.version_info[1]}',
9027db96d56Sopenharmony_ci                             'sys_prefix': prefix,
9037db96d56Sopenharmony_ci                             'prefix': prefix,
9047db96d56Sopenharmony_ci                             'sys_exec_prefix': exec_prefix,
9057db96d56Sopenharmony_ci@@ -363,7 +364,8 @@ def finalize_options(self):
9067db96d56Sopenharmony_ci 
9077db96d56Sopenharmony_ci         # Convert directories from Unix /-separated syntax to the local
9087db96d56Sopenharmony_ci         # convention.
9097db96d56Sopenharmony_ci-        self.convert_paths('lib', 'purelib', 'platlib',
9107db96d56Sopenharmony_ci+        self.convert_paths('base', 'platbase',
9117db96d56Sopenharmony_ci+                           'lib', 'purelib', 'platlib',
9127db96d56Sopenharmony_ci                            'scripts', 'data', 'headers')
9137db96d56Sopenharmony_ci         if HAS_USER_SITE:
9147db96d56Sopenharmony_ci             self.convert_paths('userbase', 'usersite')
9157db96d56Sopenharmony_cidiff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py
9167db96d56Sopenharmony_ciindex 66c12dd..d8c8428 100644
9177db96d56Sopenharmony_ci--- a/Lib/distutils/cygwinccompiler.py
9187db96d56Sopenharmony_ci+++ b/Lib/distutils/cygwinccompiler.py
9197db96d56Sopenharmony_ci@@ -44,12 +44,13 @@
9207db96d56Sopenharmony_ci #   (ld supports -shared)
9217db96d56Sopenharmony_ci # * mingw gcc 3.2/ld 2.13 works
9227db96d56Sopenharmony_ci #   (ld supports -shared)
9237db96d56Sopenharmony_ci+# * llvm-mingw with Clang 11 works
9247db96d56Sopenharmony_ci+#   (lld supports -shared)
9257db96d56Sopenharmony_ci 
9267db96d56Sopenharmony_ci import os
9277db96d56Sopenharmony_ci import sys
9287db96d56Sopenharmony_ci import copy
9297db96d56Sopenharmony_ci-from subprocess import Popen, PIPE, check_output
9307db96d56Sopenharmony_ci-import re
9317db96d56Sopenharmony_ci+import shlex
9327db96d56Sopenharmony_ci 
9337db96d56Sopenharmony_ci from distutils.unixccompiler import UnixCCompiler
9347db96d56Sopenharmony_ci from distutils.file_util import write_file
9357db96d56Sopenharmony_ci@@ -57,6 +58,7 @@
9367db96d56Sopenharmony_ci         CompileError, UnknownFileError)
9377db96d56Sopenharmony_ci from distutils.version import LooseVersion
9387db96d56Sopenharmony_ci from distutils.spawn import find_executable
9397db96d56Sopenharmony_ci+from subprocess import Popen, check_output
9407db96d56Sopenharmony_ci 
9417db96d56Sopenharmony_ci def get_msvcr():
9427db96d56Sopenharmony_ci     """Include the appropriate MSVC runtime library if Python was built
9437db96d56Sopenharmony_ci@@ -91,6 +93,7 @@ class CygwinCCompiler(UnixCCompiler):
9447db96d56Sopenharmony_ci     obj_extension = ".o"
9457db96d56Sopenharmony_ci     static_lib_extension = ".a"
9467db96d56Sopenharmony_ci     shared_lib_extension = ".dll"
9477db96d56Sopenharmony_ci+    dylib_lib_extension = ".dll.a"
9487db96d56Sopenharmony_ci     static_lib_format = "lib%s%s"
9497db96d56Sopenharmony_ci     shared_lib_format = "%s%s"
9507db96d56Sopenharmony_ci     exe_extension = ".exe"
9517db96d56Sopenharmony_ci@@ -109,50 +112,28 @@ def __init__(self, verbose=0, dry_run=0, force=0):
9527db96d56Sopenharmony_ci                 "Compiling may fail because of undefined preprocessor macros."
9537db96d56Sopenharmony_ci                 % details)
9547db96d56Sopenharmony_ci 
9557db96d56Sopenharmony_ci-        self.gcc_version, self.ld_version, self.dllwrap_version = \
9567db96d56Sopenharmony_ci-            get_versions()
9577db96d56Sopenharmony_ci-        self.debug_print(self.compiler_type + ": gcc %s, ld %s, dllwrap %s\n" %
9587db96d56Sopenharmony_ci-                         (self.gcc_version,
9597db96d56Sopenharmony_ci-                          self.ld_version,
9607db96d56Sopenharmony_ci-                          self.dllwrap_version) )
9617db96d56Sopenharmony_ci-
9627db96d56Sopenharmony_ci-        # ld_version >= "2.10.90" and < "2.13" should also be able to use
9637db96d56Sopenharmony_ci-        # gcc -mdll instead of dllwrap
9647db96d56Sopenharmony_ci-        # Older dllwraps had own version numbers, newer ones use the
9657db96d56Sopenharmony_ci-        # same as the rest of binutils ( also ld )
9667db96d56Sopenharmony_ci-        # dllwrap 2.10.90 is buggy
9677db96d56Sopenharmony_ci-        if self.ld_version >= "2.10.90":
9687db96d56Sopenharmony_ci-            self.linker_dll = "gcc"
9697db96d56Sopenharmony_ci-        else:
9707db96d56Sopenharmony_ci-            self.linker_dll = "dllwrap"
9717db96d56Sopenharmony_ci+        self.cc = os.environ.get('CC', 'gcc')
9727db96d56Sopenharmony_ci+        self.cxx = os.environ.get('CXX', 'g++')
9737db96d56Sopenharmony_ci 
9747db96d56Sopenharmony_ci-        # ld_version >= "2.13" support -shared so use it instead of
9757db96d56Sopenharmony_ci-        # -mdll -static
9767db96d56Sopenharmony_ci-        if self.ld_version >= "2.13":
9777db96d56Sopenharmony_ci-            shared_option = "-shared"
9787db96d56Sopenharmony_ci-        else:
9797db96d56Sopenharmony_ci-            shared_option = "-mdll -static"
9807db96d56Sopenharmony_ci-
9817db96d56Sopenharmony_ci-        # Hard-code GCC because that's what this is all about.
9827db96d56Sopenharmony_ci-        # XXX optimization, warnings etc. should be customizable.
9837db96d56Sopenharmony_ci-        self.set_executables(compiler='gcc -mcygwin -O -Wall',
9847db96d56Sopenharmony_ci-                             compiler_so='gcc -mcygwin -mdll -O -Wall',
9857db96d56Sopenharmony_ci-                             compiler_cxx='g++ -mcygwin -O -Wall',
9867db96d56Sopenharmony_ci-                             linker_exe='gcc -mcygwin',
9877db96d56Sopenharmony_ci+        # Older numpy dependend on this existing to check for ancient
9887db96d56Sopenharmony_ci+        # gcc versions. This doesn't make much sense with clang etc so
9897db96d56Sopenharmony_ci+        # just hardcode to something recent.
9907db96d56Sopenharmony_ci+        # https://github.com/numpy/numpy/pull/20333
9917db96d56Sopenharmony_ci+        self.gcc_version = LooseVersion("11.2.0")
9927db96d56Sopenharmony_ci+
9937db96d56Sopenharmony_ci+        self.linker_dll = self.cc
9947db96d56Sopenharmony_ci+        shared_option = "-shared"
9957db96d56Sopenharmony_ci+
9967db96d56Sopenharmony_ci+        self.set_executables(compiler='%s -mcygwin -O -Wall' % self.cc,
9977db96d56Sopenharmony_ci+                             compiler_so='%s -mcygwin -mdll -O -Wall' % self.cc,
9987db96d56Sopenharmony_ci+                             compiler_cxx='%s -mcygwin -O -Wall' % self.cxx,
9997db96d56Sopenharmony_ci+                             linker_exe='%s -mcygwin' % self.cc,
10007db96d56Sopenharmony_ci                              linker_so=('%s -mcygwin %s' %
10017db96d56Sopenharmony_ci                                         (self.linker_dll, shared_option)))
10027db96d56Sopenharmony_ci 
10037db96d56Sopenharmony_ci-        # cygwin and mingw32 need different sets of libraries
10047db96d56Sopenharmony_ci-        if self.gcc_version == "2.91.57":
10057db96d56Sopenharmony_ci-            # cygwin shouldn't need msvcrt, but without the dlls will crash
10067db96d56Sopenharmony_ci-            # (gcc version 2.91.57) -- perhaps something about initialization
10077db96d56Sopenharmony_ci-            self.dll_libraries=["msvcrt"]
10087db96d56Sopenharmony_ci-            self.warn(
10097db96d56Sopenharmony_ci-                "Consider upgrading to a newer version of gcc")
10107db96d56Sopenharmony_ci-        else:
10117db96d56Sopenharmony_ci-            # Include the appropriate MSVC runtime library if Python was built
10127db96d56Sopenharmony_ci-            # with MSVC 7.0 or later.
10137db96d56Sopenharmony_ci-            self.dll_libraries = get_msvcr()
10147db96d56Sopenharmony_ci+        # Include the appropriate MSVC runtime library if Python was built
10157db96d56Sopenharmony_ci+        # with MSVC 7.0 or later.
10167db96d56Sopenharmony_ci+        self.dll_libraries = get_msvcr()
10177db96d56Sopenharmony_ci 
10187db96d56Sopenharmony_ci     def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
10197db96d56Sopenharmony_ci         """Compiles the source by spawning GCC and windres if needed."""
10207db96d56Sopenharmony_ci@@ -162,6 +143,28 @@ def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
10217db96d56Sopenharmony_ci                 self.spawn(["windres", "-i", src, "-o", obj])
10227db96d56Sopenharmony_ci             except DistutilsExecError as msg:
10237db96d56Sopenharmony_ci                 raise CompileError(msg)
10247db96d56Sopenharmony_ci+        elif ext == '.mc':
10257db96d56Sopenharmony_ci+            # Adapted from msvc9compiler:
10267db96d56Sopenharmony_ci+            #
10277db96d56Sopenharmony_ci+            # Compile .MC to .RC file to .RES file.
10287db96d56Sopenharmony_ci+            #   * '-h dir' specifies the directory for the generated include file
10297db96d56Sopenharmony_ci+            #   * '-r dir' specifies the target directory of the generated RC file and the binary message resource it includes
10307db96d56Sopenharmony_ci+            #
10317db96d56Sopenharmony_ci+            # For now (since there are no options to change this),
10327db96d56Sopenharmony_ci+            # we use the source-directory for the include file and
10337db96d56Sopenharmony_ci+            # the build directory for the RC file and message
10347db96d56Sopenharmony_ci+            # resources. This works at least for win32all.
10357db96d56Sopenharmony_ci+            h_dir = os.path.dirname(src)
10367db96d56Sopenharmony_ci+            rc_dir = os.path.dirname(obj)
10377db96d56Sopenharmony_ci+            try:
10387db96d56Sopenharmony_ci+                # first compile .MC to .RC and .H file
10397db96d56Sopenharmony_ci+                self.spawn(['windmc'] + ['-h', h_dir, '-r', rc_dir] + [src])
10407db96d56Sopenharmony_ci+                base, _ = os.path.splitext(os.path.basename(src))
10417db96d56Sopenharmony_ci+                rc_file = os.path.join(rc_dir, base + '.rc')
10427db96d56Sopenharmony_ci+                # then compile .RC to .RES file
10437db96d56Sopenharmony_ci+                self.spawn(['windres', '-i', rc_file, '-o', obj])
10447db96d56Sopenharmony_ci+            except DistutilsExecError as msg:
10457db96d56Sopenharmony_ci+                raise CompileError(msg)
10467db96d56Sopenharmony_ci         else: # for other files use the C-compiler
10477db96d56Sopenharmony_ci             try:
10487db96d56Sopenharmony_ci                 self.spawn(self.compiler_so + cc_args + [src, '-o', obj] +
10497db96d56Sopenharmony_ci@@ -214,28 +217,21 @@ def link(self, target_desc, objects, output_filename, output_dir=None,
10507db96d56Sopenharmony_ci 
10517db96d56Sopenharmony_ci             # next add options for def-file and to creating import libraries
10527db96d56Sopenharmony_ci 
10537db96d56Sopenharmony_ci-            # dllwrap uses different options than gcc/ld
10547db96d56Sopenharmony_ci-            if self.linker_dll == "dllwrap":
10557db96d56Sopenharmony_ci-                extra_preargs.extend(["--output-lib", lib_file])
10567db96d56Sopenharmony_ci-                # for dllwrap we have to use a special option
10577db96d56Sopenharmony_ci-                extra_preargs.extend(["--def", def_file])
10587db96d56Sopenharmony_ci-            # we use gcc/ld here and can be sure ld is >= 2.9.10
10597db96d56Sopenharmony_ci-            else:
10607db96d56Sopenharmony_ci-                # doesn't work: bfd_close build\...\libfoo.a: Invalid operation
10617db96d56Sopenharmony_ci-                #extra_preargs.extend(["-Wl,--out-implib,%s" % lib_file])
10627db96d56Sopenharmony_ci-                # for gcc/ld the def-file is specified as any object files
10637db96d56Sopenharmony_ci-                objects.append(def_file)
10647db96d56Sopenharmony_ci+            # doesn't work: bfd_close build\...\libfoo.a: Invalid operation
10657db96d56Sopenharmony_ci+            #extra_preargs.extend(["-Wl,--out-implib,%s" % lib_file])
10667db96d56Sopenharmony_ci+            # for gcc/ld the def-file is specified as any object files
10677db96d56Sopenharmony_ci+            objects.append(def_file)
10687db96d56Sopenharmony_ci 
10697db96d56Sopenharmony_ci         #end: if ((export_symbols is not None) and
10707db96d56Sopenharmony_ci         #        (target_desc != self.EXECUTABLE or self.linker_dll == "gcc")):
10717db96d56Sopenharmony_ci 
10727db96d56Sopenharmony_ci         # who wants symbols and a many times larger output file
10737db96d56Sopenharmony_ci         # should explicitly switch the debug mode on
10747db96d56Sopenharmony_ci-        # otherwise we let dllwrap/ld strip the output file
10757db96d56Sopenharmony_ci+        # otherwise we let ld strip the output file
10767db96d56Sopenharmony_ci         # (On my machine: 10KiB < stripped_file < ??100KiB
10777db96d56Sopenharmony_ci         #   unstripped_file = stripped_file + XXX KiB
10787db96d56Sopenharmony_ci         #  ( XXX=254 for a typical python extension))
10797db96d56Sopenharmony_ci-        if not debug:
10807db96d56Sopenharmony_ci+        if not debug and not hasattr(sys, 'gettotalrefcount'):
10817db96d56Sopenharmony_ci             extra_preargs.append("-s")
10827db96d56Sopenharmony_ci 
10837db96d56Sopenharmony_ci         UnixCCompiler.link(self, target_desc, objects, output_filename,
10847db96d56Sopenharmony_ci@@ -253,11 +249,16 @@ def object_filenames(self, source_filenames, strip_dir=0, output_dir=''):
10857db96d56Sopenharmony_ci             output_dir = ''
10867db96d56Sopenharmony_ci         obj_names = []
10877db96d56Sopenharmony_ci         for src_name in source_filenames:
10887db96d56Sopenharmony_ci-            # use normcase to make sure '.rc' is really '.rc' and not '.RC'
10897db96d56Sopenharmony_ci-            base, ext = os.path.splitext(os.path.normcase(src_name))
10907db96d56Sopenharmony_ci-            if ext not in (self.src_extensions + ['.rc','.res']):
10917db96d56Sopenharmony_ci+            base, ext = os.path.splitext(src_name)
10927db96d56Sopenharmony_ci+            # use 'normcase' only for resource suffixes
10937db96d56Sopenharmony_ci+            ext_normcase = os.path.normcase(ext)
10947db96d56Sopenharmony_ci+            if ext_normcase in ['.rc', '.res', '.mc']:
10957db96d56Sopenharmony_ci+                ext = ext_normcase
10967db96d56Sopenharmony_ci+            if ext not in (self.src_extensions + ['.rc', '.res', '.mc']):
10977db96d56Sopenharmony_ci                 raise UnknownFileError("unknown file type '%s' (from '%s')" % \
10987db96d56Sopenharmony_ci                       (ext, src_name))
10997db96d56Sopenharmony_ci+            base = os.path.splitdrive(base)[1] # Chop off the drive
11007db96d56Sopenharmony_ci+            base = base[os.path.isabs(base):]  # If abs, chop off leading /
11017db96d56Sopenharmony_ci             if strip_dir:
11027db96d56Sopenharmony_ci                 base = os.path.basename (base)
11037db96d56Sopenharmony_ci             if ext in ('.res', '.rc'):
11047db96d56Sopenharmony_ci@@ -279,31 +280,18 @@ def __init__(self, verbose=0, dry_run=0, force=0):
11057db96d56Sopenharmony_ci 
11067db96d56Sopenharmony_ci         CygwinCCompiler.__init__ (self, verbose, dry_run, force)
11077db96d56Sopenharmony_ci 
11087db96d56Sopenharmony_ci-        # ld_version >= "2.13" support -shared so use it instead of
11097db96d56Sopenharmony_ci-        # -mdll -static
11107db96d56Sopenharmony_ci-        if self.ld_version >= "2.13":
11117db96d56Sopenharmony_ci-            shared_option = "-shared"
11127db96d56Sopenharmony_ci-        else:
11137db96d56Sopenharmony_ci-            shared_option = "-mdll -static"
11147db96d56Sopenharmony_ci-
11157db96d56Sopenharmony_ci-        # A real mingw32 doesn't need to specify a different entry point,
11167db96d56Sopenharmony_ci-        # but cygwin 2.91.57 in no-cygwin-mode needs it.
11177db96d56Sopenharmony_ci-        if self.gcc_version <= "2.91.57":
11187db96d56Sopenharmony_ci-            entry_point = '--entry _DllMain@12'
11197db96d56Sopenharmony_ci-        else:
11207db96d56Sopenharmony_ci-            entry_point = ''
11217db96d56Sopenharmony_ci+        shared_option = "-shared"
11227db96d56Sopenharmony_ci 
11237db96d56Sopenharmony_ci-        if is_cygwingcc():
11247db96d56Sopenharmony_ci+        if is_cygwincc(self.cc):
11257db96d56Sopenharmony_ci             raise CCompilerError(
11267db96d56Sopenharmony_ci                 'Cygwin gcc cannot be used with --compiler=mingw32')
11277db96d56Sopenharmony_ci 
11287db96d56Sopenharmony_ci-        self.set_executables(compiler='gcc -O -Wall',
11297db96d56Sopenharmony_ci-                             compiler_so='gcc -mdll -O -Wall',
11307db96d56Sopenharmony_ci-                             compiler_cxx='g++ -O -Wall',
11317db96d56Sopenharmony_ci-                             linker_exe='gcc',
11327db96d56Sopenharmony_ci-                             linker_so='%s %s %s'
11337db96d56Sopenharmony_ci-                                        % (self.linker_dll, shared_option,
11347db96d56Sopenharmony_ci-                                           entry_point))
11357db96d56Sopenharmony_ci+        self.set_executables(compiler='%s -O2 -Wall' % self.cc,
11367db96d56Sopenharmony_ci+                             compiler_so='%s -mdll -O2 -Wall' % self.cc,
11377db96d56Sopenharmony_ci+                             compiler_cxx='%s -O2 -Wall' % self.cxx,
11387db96d56Sopenharmony_ci+                             linker_exe='%s' % self.cc,
11397db96d56Sopenharmony_ci+                             linker_so='%s %s'
11407db96d56Sopenharmony_ci+                                        % (self.linker_dll, shared_option))
11417db96d56Sopenharmony_ci         # Maybe we should also append -mthreads, but then the finished
11427db96d56Sopenharmony_ci         # dlls need another dll (mingwm10.dll see Mingw32 docs)
11437db96d56Sopenharmony_ci         # (-mthreads: Support thread-safe exception handling on `Mingw32')
11447db96d56Sopenharmony_ci@@ -313,7 +301,7 @@ def __init__(self, verbose=0, dry_run=0, force=0):
11457db96d56Sopenharmony_ci 
11467db96d56Sopenharmony_ci         # Include the appropriate MSVC runtime library if Python was built
11477db96d56Sopenharmony_ci         # with MSVC 7.0 or later.
11487db96d56Sopenharmony_ci-        self.dll_libraries = get_msvcr()
11497db96d56Sopenharmony_ci+        self.dll_libraries = get_msvcr() or []
11507db96d56Sopenharmony_ci 
11517db96d56Sopenharmony_ci # Because these compilers aren't configured in Python's pyconfig.h file by
11527db96d56Sopenharmony_ci # default, we should at least warn the user if he is using an unmodified
11537db96d56Sopenharmony_ci@@ -351,6 +339,10 @@ def check_config_h():
11547db96d56Sopenharmony_ci     if "GCC" in sys.version:
11557db96d56Sopenharmony_ci         return CONFIG_H_OK, "sys.version mentions 'GCC'"
11567db96d56Sopenharmony_ci 
11577db96d56Sopenharmony_ci+    # Clang would also work
11587db96d56Sopenharmony_ci+    if "Clang" in sys.version:
11597db96d56Sopenharmony_ci+        return CONFIG_H_OK, "sys.version mentions 'Clang'"
11607db96d56Sopenharmony_ci+
11617db96d56Sopenharmony_ci     # let's see if __GNUC__ is mentioned in python.h
11627db96d56Sopenharmony_ci     fn = sysconfig.get_config_h_filename()
11637db96d56Sopenharmony_ci     try:
11647db96d56Sopenharmony_ci@@ -366,38 +358,8 @@ def check_config_h():
11657db96d56Sopenharmony_ci         return (CONFIG_H_UNCERTAIN,
11667db96d56Sopenharmony_ci                 "couldn't read '%s': %s" % (fn, exc.strerror))
11677db96d56Sopenharmony_ci 
11687db96d56Sopenharmony_ci-RE_VERSION = re.compile(br'(\d+\.\d+(\.\d+)*)')
11697db96d56Sopenharmony_ci-
11707db96d56Sopenharmony_ci-def _find_exe_version(cmd):
11717db96d56Sopenharmony_ci-    """Find the version of an executable by running `cmd` in the shell.
11727db96d56Sopenharmony_ci-
11737db96d56Sopenharmony_ci-    If the command is not found, or the output does not match
11747db96d56Sopenharmony_ci-    `RE_VERSION`, returns None.
11757db96d56Sopenharmony_ci-    """
11767db96d56Sopenharmony_ci-    executable = cmd.split()[0]
11777db96d56Sopenharmony_ci-    if find_executable(executable) is None:
11787db96d56Sopenharmony_ci-        return None
11797db96d56Sopenharmony_ci-    out = Popen(cmd, shell=True, stdout=PIPE).stdout
11807db96d56Sopenharmony_ci-    try:
11817db96d56Sopenharmony_ci-        out_string = out.read()
11827db96d56Sopenharmony_ci-    finally:
11837db96d56Sopenharmony_ci-        out.close()
11847db96d56Sopenharmony_ci-    result = RE_VERSION.search(out_string)
11857db96d56Sopenharmony_ci-    if result is None:
11867db96d56Sopenharmony_ci-        return None
11877db96d56Sopenharmony_ci-    # LooseVersion works with strings
11887db96d56Sopenharmony_ci-    # so we need to decode our bytes
11897db96d56Sopenharmony_ci-    return LooseVersion(result.group(1).decode())
11907db96d56Sopenharmony_ci-
11917db96d56Sopenharmony_ci-def get_versions():
11927db96d56Sopenharmony_ci-    """ Try to find out the versions of gcc, ld and dllwrap.
11937db96d56Sopenharmony_ci-
11947db96d56Sopenharmony_ci-    If not possible it returns None for it.
11957db96d56Sopenharmony_ci-    """
11967db96d56Sopenharmony_ci-    commands = ['gcc -dumpversion', 'ld -v', 'dllwrap --version']
11977db96d56Sopenharmony_ci-    return tuple([_find_exe_version(cmd) for cmd in commands])
11987db96d56Sopenharmony_ci 
11997db96d56Sopenharmony_ci-def is_cygwingcc():
12007db96d56Sopenharmony_ci-    '''Try to determine if the gcc that would be used is from cygwin.'''
12017db96d56Sopenharmony_ci-    out_string = check_output(['gcc', '-dumpmachine'])
12027db96d56Sopenharmony_ci+def is_cygwincc(cc):
12037db96d56Sopenharmony_ci+    '''Try to determine if the compiler that would be used is from cygwin.'''
12047db96d56Sopenharmony_ci+    out_string = check_output(shlex.split(cc) + ['-dumpmachine'])
12057db96d56Sopenharmony_ci     return out_string.strip().endswith(b'cygwin')
12067db96d56Sopenharmony_cidiff --git a/Lib/distutils/msvc9compiler.py b/Lib/distutils/msvc9compiler.py
12077db96d56Sopenharmony_ciindex a7976fb..c341679 100644
12087db96d56Sopenharmony_ci--- a/Lib/distutils/msvc9compiler.py
12097db96d56Sopenharmony_ci+++ b/Lib/distutils/msvc9compiler.py
12107db96d56Sopenharmony_ci@@ -291,8 +291,6 @@ def query_vcvarsall(version, arch="x86"):
12117db96d56Sopenharmony_ci 
12127db96d56Sopenharmony_ci # More globals
12137db96d56Sopenharmony_ci VERSION = get_build_version()
12147db96d56Sopenharmony_ci-if VERSION < 8.0:
12157db96d56Sopenharmony_ci-    raise DistutilsPlatformError("VC %0.1f is not supported by this module" % VERSION)
12167db96d56Sopenharmony_ci # MACROS = MacroExpander(VERSION)
12177db96d56Sopenharmony_ci 
12187db96d56Sopenharmony_ci class MSVCCompiler(CCompiler) :
12197db96d56Sopenharmony_ci@@ -327,6 +325,8 @@ class MSVCCompiler(CCompiler) :
12207db96d56Sopenharmony_ci 
12217db96d56Sopenharmony_ci     def __init__(self, verbose=0, dry_run=0, force=0):
12227db96d56Sopenharmony_ci         CCompiler.__init__ (self, verbose, dry_run, force)
12237db96d56Sopenharmony_ci+        if VERSION < 8.0:
12247db96d56Sopenharmony_ci+            raise DistutilsPlatformError("VC %0.1f is not supported by this module" % VERSION)
12257db96d56Sopenharmony_ci         self.__version = VERSION
12267db96d56Sopenharmony_ci         self.__root = r"Software\Microsoft\VisualStudio"
12277db96d56Sopenharmony_ci         # self.__macros = MACROS
12287db96d56Sopenharmony_cidiff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
12297db96d56Sopenharmony_ciindex 03b8558..024c15c 100644
12307db96d56Sopenharmony_ci--- a/Lib/distutils/sysconfig.py
12317db96d56Sopenharmony_ci+++ b/Lib/distutils/sysconfig.py
12327db96d56Sopenharmony_ci@@ -64,8 +64,23 @@ def parse_config_h(fp, g=None):
12337db96d56Sopenharmony_ci 
12347db96d56Sopenharmony_ci _python_build = partial(is_python_build, check_home=True)
12357db96d56Sopenharmony_ci _init_posix = partial(sysconfig_init_posix, _config_vars)
12367db96d56Sopenharmony_ci-_init_nt = partial(_init_non_posix, _config_vars)
12377db96d56Sopenharmony_ci 
12387db96d56Sopenharmony_ci+def _posix_build():
12397db96d56Sopenharmony_ci+    # GCC[mingw*] use posix build system
12407db96d56Sopenharmony_ci+    # Check for cross builds explicitly
12417db96d56Sopenharmony_ci+    host_platform = os.environ.get("_PYTHON_HOST_PLATFORM")
12427db96d56Sopenharmony_ci+    if host_platform:
12437db96d56Sopenharmony_ci+        if host_platform.startswith('mingw'):
12447db96d56Sopenharmony_ci+            return True
12457db96d56Sopenharmony_ci+    return os.name == 'posix' or \
12467db96d56Sopenharmony_ci+        (os.name == "nt" and 'GCC' in sys.version)
12477db96d56Sopenharmony_ci+posix_build = _posix_build()
12487db96d56Sopenharmony_ci+
12497db96d56Sopenharmony_ci+
12507db96d56Sopenharmony_ci+def _init_nt():
12517db96d56Sopenharmony_ci+    if posix_build:
12527db96d56Sopenharmony_ci+        return _init_posix(_config_vars)
12537db96d56Sopenharmony_ci+    return _init_non_posix(_config_vars)
12547db96d56Sopenharmony_ci 
12557db96d56Sopenharmony_ci # Similar function is also implemented in sysconfig as _parse_makefile
12567db96d56Sopenharmony_ci # but without the parsing capabilities of distutils.text_file.TextFile.
12577db96d56Sopenharmony_ci@@ -196,7 +211,23 @@ def customize_compiler(compiler):
12587db96d56Sopenharmony_ci     Mainly needed on Unix, so we can plug in the information that
12597db96d56Sopenharmony_ci     varies across Unices and is stored in Python's Makefile.
12607db96d56Sopenharmony_ci     """
12617db96d56Sopenharmony_ci-    if compiler.compiler_type == "unix":
12627db96d56Sopenharmony_ci+    global _config_vars
12637db96d56Sopenharmony_ci+    if compiler.compiler_type in ["cygwin", "mingw32"]:
12647db96d56Sopenharmony_ci+        # Note that cygwin use posix build and 'unix' compiler.
12657db96d56Sopenharmony_ci+        # If build is not based on posix then we must predefine
12667db96d56Sopenharmony_ci+        # some environment variables corresponding to posix
12677db96d56Sopenharmony_ci+        # build rules and defaults.
12687db96d56Sopenharmony_ci+        if not 'GCC' in sys.version:
12697db96d56Sopenharmony_ci+            _config_vars['CC'] = "gcc"
12707db96d56Sopenharmony_ci+            _config_vars['CXX'] = "g++"
12717db96d56Sopenharmony_ci+            _config_vars['OPT'] = "-fwrapv -O3 -Wall -Wstrict-prototypes"
12727db96d56Sopenharmony_ci+            _config_vars['CFLAGS'] = ""
12737db96d56Sopenharmony_ci+            _config_vars['CCSHARED'] = ""
12747db96d56Sopenharmony_ci+            _config_vars['LDSHARED'] = "gcc -shared -Wl,--enable-auto-image-base"
12757db96d56Sopenharmony_ci+            _config_vars['AR'] = "ar"
12767db96d56Sopenharmony_ci+            _config_vars['ARFLAGS'] = "rc"
12777db96d56Sopenharmony_ci+
12787db96d56Sopenharmony_ci+    if compiler.compiler_type in ["unix", "cygwin", "mingw32"]:
12797db96d56Sopenharmony_ci         if sys.platform == "darwin":
12807db96d56Sopenharmony_ci             # Perform first-time customization of compiler-related
12817db96d56Sopenharmony_ci             # config vars on OS X now that we know we need a compiler.
12827db96d56Sopenharmony_ci@@ -274,7 +305,7 @@ def get_python_inc(plat_specific=0, prefix=None):
12837db96d56Sopenharmony_ci     """
12847db96d56Sopenharmony_ci     if prefix is None:
12857db96d56Sopenharmony_ci         prefix = plat_specific and BASE_EXEC_PREFIX or BASE_PREFIX
12867db96d56Sopenharmony_ci-    if os.name == "posix":
12877db96d56Sopenharmony_ci+    if posix_build:
12887db96d56Sopenharmony_ci         if python_build:
12897db96d56Sopenharmony_ci             # Assume the executable is in the build directory.  The
12907db96d56Sopenharmony_ci             # pyconfig.h file should be in the same directory.  Since
12917db96d56Sopenharmony_ci@@ -321,7 +352,7 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
12927db96d56Sopenharmony_ci         else:
12937db96d56Sopenharmony_ci             prefix = plat_specific and EXEC_PREFIX or PREFIX
12947db96d56Sopenharmony_ci 
12957db96d56Sopenharmony_ci-    if os.name == "posix":
12967db96d56Sopenharmony_ci+    if posix_build:
12977db96d56Sopenharmony_ci         if plat_specific or standard_lib:
12987db96d56Sopenharmony_ci             # Platform-specific modules (any module from a non-pure-Python
12997db96d56Sopenharmony_ci             # module distribution) or standard Python library modules.
13007db96d56Sopenharmony_cidiff --git a/Lib/distutils/tests/test_cygwinccompiler.py b/Lib/distutils/tests/test_cygwinccompiler.py
13017db96d56Sopenharmony_ciindex 0912ffd..a93c174 100644
13027db96d56Sopenharmony_ci--- a/Lib/distutils/tests/test_cygwinccompiler.py
13037db96d56Sopenharmony_ci+++ b/Lib/distutils/tests/test_cygwinccompiler.py
13047db96d56Sopenharmony_ci@@ -8,7 +8,7 @@
13057db96d56Sopenharmony_ci from distutils import cygwinccompiler
13067db96d56Sopenharmony_ci from distutils.cygwinccompiler import (check_config_h,
13077db96d56Sopenharmony_ci                                        CONFIG_H_OK, CONFIG_H_NOTOK,
13087db96d56Sopenharmony_ci-                                       CONFIG_H_UNCERTAIN, get_versions,
13097db96d56Sopenharmony_ci+                                       CONFIG_H_UNCERTAIN,
13107db96d56Sopenharmony_ci                                        get_msvcr)
13117db96d56Sopenharmony_ci from distutils.tests import support
13127db96d56Sopenharmony_ci 
13137db96d56Sopenharmony_ci@@ -81,40 +81,6 @@ def test_check_config_h(self):
13147db96d56Sopenharmony_ci         self.write_file(self.python_h, 'xxx __GNUC__ xxx')
13157db96d56Sopenharmony_ci         self.assertEqual(check_config_h()[0], CONFIG_H_OK)
13167db96d56Sopenharmony_ci 
13177db96d56Sopenharmony_ci-    def test_get_versions(self):
13187db96d56Sopenharmony_ci-
13197db96d56Sopenharmony_ci-        # get_versions calls distutils.spawn.find_executable on
13207db96d56Sopenharmony_ci-        # 'gcc', 'ld' and 'dllwrap'
13217db96d56Sopenharmony_ci-        self.assertEqual(get_versions(), (None, None, None))
13227db96d56Sopenharmony_ci-
13237db96d56Sopenharmony_ci-        # Let's fake we have 'gcc' and it returns '3.4.5'
13247db96d56Sopenharmony_ci-        self._exes['gcc'] = b'gcc (GCC) 3.4.5 (mingw special)\nFSF'
13257db96d56Sopenharmony_ci-        res = get_versions()
13267db96d56Sopenharmony_ci-        self.assertEqual(str(res[0]), '3.4.5')
13277db96d56Sopenharmony_ci-
13287db96d56Sopenharmony_ci-        # and let's see what happens when the version
13297db96d56Sopenharmony_ci-        # doesn't match the regular expression
13307db96d56Sopenharmony_ci-        # (\d+\.\d+(\.\d+)*)
13317db96d56Sopenharmony_ci-        self._exes['gcc'] = b'very strange output'
13327db96d56Sopenharmony_ci-        res = get_versions()
13337db96d56Sopenharmony_ci-        self.assertEqual(res[0], None)
13347db96d56Sopenharmony_ci-
13357db96d56Sopenharmony_ci-        # same thing for ld
13367db96d56Sopenharmony_ci-        self._exes['ld'] = b'GNU ld version 2.17.50 20060824'
13377db96d56Sopenharmony_ci-        res = get_versions()
13387db96d56Sopenharmony_ci-        self.assertEqual(str(res[1]), '2.17.50')
13397db96d56Sopenharmony_ci-        self._exes['ld'] = b'@(#)PROGRAM:ld  PROJECT:ld64-77'
13407db96d56Sopenharmony_ci-        res = get_versions()
13417db96d56Sopenharmony_ci-        self.assertEqual(res[1], None)
13427db96d56Sopenharmony_ci-
13437db96d56Sopenharmony_ci-        # and dllwrap
13447db96d56Sopenharmony_ci-        self._exes['dllwrap'] = b'GNU dllwrap 2.17.50 20060824\nFSF'
13457db96d56Sopenharmony_ci-        res = get_versions()
13467db96d56Sopenharmony_ci-        self.assertEqual(str(res[2]), '2.17.50')
13477db96d56Sopenharmony_ci-        self._exes['dllwrap'] = b'Cheese Wrap'
13487db96d56Sopenharmony_ci-        res = get_versions()
13497db96d56Sopenharmony_ci-        self.assertEqual(res[2], None)
13507db96d56Sopenharmony_ci-
13517db96d56Sopenharmony_ci     def test_get_msvcr(self):
13527db96d56Sopenharmony_ci 
13537db96d56Sopenharmony_ci         # none
13547db96d56Sopenharmony_cidiff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py
13557db96d56Sopenharmony_ciindex d00c489..76a7d82 100644
13567db96d56Sopenharmony_ci--- a/Lib/distutils/unixccompiler.py
13577db96d56Sopenharmony_ci+++ b/Lib/distutils/unixccompiler.py
13587db96d56Sopenharmony_ci@@ -249,9 +249,13 @@ def runtime_library_dir_option(self, dir):
13597db96d56Sopenharmony_ci                 # -Wl whenever gcc was used in the past it is probably
13607db96d56Sopenharmony_ci                 # safest to keep doing so.
13617db96d56Sopenharmony_ci                 if sysconfig.get_config_var("GNULD") == "yes":
13627db96d56Sopenharmony_ci-                    # GNU ld needs an extra option to get a RUNPATH
13637db96d56Sopenharmony_ci+                    # GNU ELF ld needs an extra option to get a RUNPATH
13647db96d56Sopenharmony_ci                     # instead of just an RPATH.
13657db96d56Sopenharmony_ci-                    return "-Wl,--enable-new-dtags,-R" + dir
13667db96d56Sopenharmony_ci+                    if sys.platform in ["win32", "cygwin"] or \
13677db96d56Sopenharmony_ci+                       "mingw" in compiler:
13687db96d56Sopenharmony_ci+                        return []
13697db96d56Sopenharmony_ci+                    else:
13707db96d56Sopenharmony_ci+                        return "-Wl,--enable-new-dtags,-R" + dir
13717db96d56Sopenharmony_ci                 else:
13727db96d56Sopenharmony_ci                     return "-Wl,-R" + dir
13737db96d56Sopenharmony_ci             else:
13747db96d56Sopenharmony_cidiff --git a/Lib/distutils/util.py b/Lib/distutils/util.py
13757db96d56Sopenharmony_ciindex 2ce5c5b..81626b3 100644
13767db96d56Sopenharmony_ci--- a/Lib/distutils/util.py
13777db96d56Sopenharmony_ci+++ b/Lib/distutils/util.py
13787db96d56Sopenharmony_ci@@ -37,6 +37,22 @@ def get_host_platform():
13797db96d56Sopenharmony_ci 
13807db96d56Sopenharmony_ci     """
13817db96d56Sopenharmony_ci     if os.name == 'nt':
13827db96d56Sopenharmony_ci+        if 'gcc' in sys.version.lower():
13837db96d56Sopenharmony_ci+            if 'ucrt' in sys.version.lower():
13847db96d56Sopenharmony_ci+                if 'amd64' in sys.version.lower():
13857db96d56Sopenharmony_ci+                    return 'mingw_x86_64_ucrt'
13867db96d56Sopenharmony_ci+                return 'mingw_i686_ucrt'
13877db96d56Sopenharmony_ci+            if 'clang' in sys.version.lower():
13887db96d56Sopenharmony_ci+                if 'amd64' in sys.version.lower():
13897db96d56Sopenharmony_ci+                    return 'mingw_x86_64_clang'
13907db96d56Sopenharmony_ci+                if 'arm64' in sys.version.lower():
13917db96d56Sopenharmony_ci+                    return 'mingw_aarch64'
13927db96d56Sopenharmony_ci+                if 'arm' in sys.version.lower():
13937db96d56Sopenharmony_ci+                    return 'mingw_armv7'
13947db96d56Sopenharmony_ci+                return 'mingw_i686_clang'
13957db96d56Sopenharmony_ci+            if 'amd64' in sys.version.lower():
13967db96d56Sopenharmony_ci+                return 'mingw_x86_64'
13977db96d56Sopenharmony_ci+            return 'mingw_i686'
13987db96d56Sopenharmony_ci         if 'amd64' in sys.version.lower():
13997db96d56Sopenharmony_ci             return 'win-amd64'
14007db96d56Sopenharmony_ci         if '(arm)' in sys.version.lower():
14017db96d56Sopenharmony_ci@@ -130,6 +146,13 @@ def convert_path (pathname):
14027db96d56Sopenharmony_ci         paths.remove('.')
14037db96d56Sopenharmony_ci     if not paths:
14047db96d56Sopenharmony_ci         return os.curdir
14057db96d56Sopenharmony_ci+    # On Windows, if paths is ['C:','folder','subfolder'] then
14067db96d56Sopenharmony_ci+    # os.path.join(*paths) will return 'C:folder\subfolder' which
14077db96d56Sopenharmony_ci+    # is thus relative to the CWD on that drive. So we work around
14087db96d56Sopenharmony_ci+    # this by adding a \ to path[0]
14097db96d56Sopenharmony_ci+    if (len(paths) > 0 and paths[0].endswith(':') and
14107db96d56Sopenharmony_ci+        sys.platform == "win32" and sys.version.find("GCC") >= 0):
14117db96d56Sopenharmony_ci+        paths[0] += '\\'
14127db96d56Sopenharmony_ci     return os.path.join(*paths)
14137db96d56Sopenharmony_ci 
14147db96d56Sopenharmony_ci # convert_path ()
14157db96d56Sopenharmony_ci@@ -140,6 +163,10 @@ def change_root (new_root, pathname):
14167db96d56Sopenharmony_ci     relative, this is equivalent to "os.path.join(new_root,pathname)".
14177db96d56Sopenharmony_ci     Otherwise, it requires making 'pathname' relative and then joining the
14187db96d56Sopenharmony_ci     two, which is tricky on DOS/Windows and Mac OS.
14197db96d56Sopenharmony_ci+
14207db96d56Sopenharmony_ci+    If on Windows or OS/2 and both new_root and pathname are on different
14217db96d56Sopenharmony_ci+    drives, raises DistutilsChangeRootError as this is nonsensical,
14227db96d56Sopenharmony_ci+    otherwise use drive which can be in either of new_root or pathname.
14237db96d56Sopenharmony_ci     """
14247db96d56Sopenharmony_ci     if os.name == 'posix':
14257db96d56Sopenharmony_ci         if not os.path.isabs(pathname):
14267db96d56Sopenharmony_ci@@ -149,9 +176,20 @@ def change_root (new_root, pathname):
14277db96d56Sopenharmony_ci 
14287db96d56Sopenharmony_ci     elif os.name == 'nt':
14297db96d56Sopenharmony_ci         (drive, path) = os.path.splitdrive(pathname)
14307db96d56Sopenharmony_ci-        if path[0] == '\\':
14317db96d56Sopenharmony_ci+        if path[0] == os.sep:
14327db96d56Sopenharmony_ci             path = path[1:]
14337db96d56Sopenharmony_ci-        return os.path.join(new_root, path)
14347db96d56Sopenharmony_ci+        (drive_r, path_r) = os.path.splitdrive(new_root)
14357db96d56Sopenharmony_ci+        if path_r and path_r[0] == os.sep:
14367db96d56Sopenharmony_ci+            path_r = path_r[1:]
14377db96d56Sopenharmony_ci+        drive_used = ''
14387db96d56Sopenharmony_ci+        if len(drive) == 2 and len(drive_r) == 2 and drive != drive_r:
14397db96d56Sopenharmony_ci+            raise DistutilsChangeRootError("root and pathname not on same drive (%s, %s)"
14407db96d56Sopenharmony_ci+                   % (drive_r,drive))
14417db96d56Sopenharmony_ci+        elif len(drive_r) == 2:
14427db96d56Sopenharmony_ci+            drive_used = drive_r+os.sep
14437db96d56Sopenharmony_ci+        elif len(drive) == 2:
14447db96d56Sopenharmony_ci+            drive_used = drive+os.sep
14457db96d56Sopenharmony_ci+        return os.path.join(drive_used+path_r, path)
14467db96d56Sopenharmony_ci 
14477db96d56Sopenharmony_ci     else:
14487db96d56Sopenharmony_ci         raise DistutilsPlatformError("nothing known about platform '%s'" % os.name)
14497db96d56Sopenharmony_cidiff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py
14507db96d56Sopenharmony_ciindex f603a89..7693d05 100644
14517db96d56Sopenharmony_ci--- a/Lib/importlib/_bootstrap_external.py
14527db96d56Sopenharmony_ci+++ b/Lib/importlib/_bootstrap_external.py
14537db96d56Sopenharmony_ci@@ -42,6 +42,10 @@
14547db96d56Sopenharmony_ci     path_separators = ['\\', '/']
14557db96d56Sopenharmony_ci else:
14567db96d56Sopenharmony_ci     path_separators = ['/']
14577db96d56Sopenharmony_ci+
14587db96d56Sopenharmony_ci+if _os.environ.get('MSYSTEM', ''):
14597db96d56Sopenharmony_ci+    path_separators = path_separators[::-1]
14607db96d56Sopenharmony_ci+
14617db96d56Sopenharmony_ci # Assumption made in _path_join()
14627db96d56Sopenharmony_ci assert all(len(sep) == 1 for sep in path_separators)
14637db96d56Sopenharmony_ci path_sep = path_separators[0]
14647db96d56Sopenharmony_cidiff --git a/Lib/ntpath.py b/Lib/ntpath.py
14657db96d56Sopenharmony_ciindex 0444b0f..0bc5956 100644
14667db96d56Sopenharmony_ci--- a/Lib/ntpath.py
14677db96d56Sopenharmony_ci+++ b/Lib/ntpath.py
14687db96d56Sopenharmony_ci@@ -11,9 +11,7 @@
14697db96d56Sopenharmony_ci curdir = '.'
14707db96d56Sopenharmony_ci pardir = '..'
14717db96d56Sopenharmony_ci extsep = '.'
14727db96d56Sopenharmony_ci-sep = '\\'
14737db96d56Sopenharmony_ci pathsep = ';'
14747db96d56Sopenharmony_ci-altsep = '/'
14757db96d56Sopenharmony_ci defpath = '.;C:\\bin'
14767db96d56Sopenharmony_ci devnull = 'nul'
14777db96d56Sopenharmony_ci 
14787db96d56Sopenharmony_ci@@ -23,6 +21,14 @@
14797db96d56Sopenharmony_ci import genericpath
14807db96d56Sopenharmony_ci from genericpath import *
14817db96d56Sopenharmony_ci 
14827db96d56Sopenharmony_ci+if sys.platform == "win32" and os.environ.get("MSYSTEM", ""):
14837db96d56Sopenharmony_ci+    sep = '/'
14847db96d56Sopenharmony_ci+    altsep = '\\'
14857db96d56Sopenharmony_ci+else:
14867db96d56Sopenharmony_ci+    sep = '\\'
14877db96d56Sopenharmony_ci+    altsep = '/'
14887db96d56Sopenharmony_ci+bsep = str.encode(sep)
14897db96d56Sopenharmony_ci+baltsep = str.encode(altsep)
14907db96d56Sopenharmony_ci 
14917db96d56Sopenharmony_ci __all__ = ["normcase","isabs","join","splitdrive","split","splitext",
14927db96d56Sopenharmony_ci            "basename","dirname","commonprefix","getsize","getmtime",
14937db96d56Sopenharmony_ci@@ -34,9 +40,33 @@
14947db96d56Sopenharmony_ci 
14957db96d56Sopenharmony_ci def _get_bothseps(path):
14967db96d56Sopenharmony_ci     if isinstance(path, bytes):
14977db96d56Sopenharmony_ci-        return b'\\/'
14987db96d56Sopenharmony_ci+        return bsep+baltsep
14997db96d56Sopenharmony_ci+    else:
15007db96d56Sopenharmony_ci+        return sep+altsep
15017db96d56Sopenharmony_ci+
15027db96d56Sopenharmony_ci+def _get_sep(path):
15037db96d56Sopenharmony_ci+    if isinstance(path, bytes):
15047db96d56Sopenharmony_ci+        return bsep
15057db96d56Sopenharmony_ci+    else:
15067db96d56Sopenharmony_ci+        return sep
15077db96d56Sopenharmony_ci+
15087db96d56Sopenharmony_ci+def _get_altsep(path):
15097db96d56Sopenharmony_ci+    if isinstance(path, bytes):
15107db96d56Sopenharmony_ci+        return baltsep
15117db96d56Sopenharmony_ci+    else:
15127db96d56Sopenharmony_ci+        return altsep
15137db96d56Sopenharmony_ci+
15147db96d56Sopenharmony_ci+def _get_colon(path):
15157db96d56Sopenharmony_ci+    if isinstance(path, bytes):
15167db96d56Sopenharmony_ci+        return b':'
15177db96d56Sopenharmony_ci+    else:
15187db96d56Sopenharmony_ci+        return ':'
15197db96d56Sopenharmony_ci+
15207db96d56Sopenharmony_ci+def _get_unc_prefix(path):
15217db96d56Sopenharmony_ci+    if isinstance(path, bytes):
15227db96d56Sopenharmony_ci+        return b'\\\\?\\UNC\\'
15237db96d56Sopenharmony_ci     else:
15247db96d56Sopenharmony_ci-        return '\\/'
15257db96d56Sopenharmony_ci+        return '\\\\?\\UNC\\'
15267db96d56Sopenharmony_ci 
15277db96d56Sopenharmony_ci # Normalize the case of a pathname and map slashes to backslashes.
15287db96d56Sopenharmony_ci # Other normalizations (such as optimizing '../' away) are not done
15297db96d56Sopenharmony_ci@@ -58,14 +88,14 @@ def normcase(s):
15307db96d56Sopenharmony_ci             return s
15317db96d56Sopenharmony_ci         if isinstance(s, bytes):
15327db96d56Sopenharmony_ci             encoding = sys.getfilesystemencoding()
15337db96d56Sopenharmony_ci-            s = s.decode(encoding, 'surrogateescape').replace('/', '\\')
15347db96d56Sopenharmony_ci+            s = s.decode(encoding, 'surrogateescape').replace(altsep, sep)
15357db96d56Sopenharmony_ci             s = _LCMapStringEx(_LOCALE_NAME_INVARIANT,
15367db96d56Sopenharmony_ci                                _LCMAP_LOWERCASE, s)
15377db96d56Sopenharmony_ci             return s.encode(encoding, 'surrogateescape')
15387db96d56Sopenharmony_ci         else:
15397db96d56Sopenharmony_ci             return _LCMapStringEx(_LOCALE_NAME_INVARIANT,
15407db96d56Sopenharmony_ci                                   _LCMAP_LOWERCASE,
15417db96d56Sopenharmony_ci-                                  s.replace('/', '\\'))
15427db96d56Sopenharmony_ci+                                  s.replace(altsep, sep))
15437db96d56Sopenharmony_ci except ImportError:
15447db96d56Sopenharmony_ci     def normcase(s):
15457db96d56Sopenharmony_ci         """Normalize case of pathname.
15467db96d56Sopenharmony_ci@@ -74,8 +104,8 @@ def normcase(s):
15477db96d56Sopenharmony_ci         """
15487db96d56Sopenharmony_ci         s = os.fspath(s)
15497db96d56Sopenharmony_ci         if isinstance(s, bytes):
15507db96d56Sopenharmony_ci-            return os.fsencode(os.fsdecode(s).replace('/', '\\').lower())
15517db96d56Sopenharmony_ci-        return s.replace('/', '\\').lower()
15527db96d56Sopenharmony_ci+            return os.fsencode(os.fsdecode(s).replace(altsep, sep).lower())
15537db96d56Sopenharmony_ci+        return s.replace(altsep, sep).lower()
15547db96d56Sopenharmony_ci 
15557db96d56Sopenharmony_ci 
15567db96d56Sopenharmony_ci # Return whether a path is absolute.
15577db96d56Sopenharmony_ci@@ -87,14 +117,9 @@ def normcase(s):
15587db96d56Sopenharmony_ci def isabs(s):
15597db96d56Sopenharmony_ci     """Test whether a path is absolute"""
15607db96d56Sopenharmony_ci     s = os.fspath(s)
15617db96d56Sopenharmony_ci-    if isinstance(s, bytes):
15627db96d56Sopenharmony_ci-        sep = b'\\'
15637db96d56Sopenharmony_ci-        altsep = b'/'
15647db96d56Sopenharmony_ci-        colon_sep = b':\\'
15657db96d56Sopenharmony_ci-    else:
15667db96d56Sopenharmony_ci-        sep = '\\'
15677db96d56Sopenharmony_ci-        altsep = '/'
15687db96d56Sopenharmony_ci-        colon_sep = ':\\'
15697db96d56Sopenharmony_ci+    sep = _get_sep(s)
15707db96d56Sopenharmony_ci+    altsep = _get_altsep(s)
15717db96d56Sopenharmony_ci+    colon_sep = _get_colon(s) + sep
15727db96d56Sopenharmony_ci     s = s[:3].replace(altsep, sep)
15737db96d56Sopenharmony_ci     # Absolute: UNC, device, and paths with a drive and root.
15747db96d56Sopenharmony_ci     # LEGACY BUG: isabs("/x") should be false since the path has no drive.
15757db96d56Sopenharmony_ci@@ -106,14 +131,9 @@ def isabs(s):
15767db96d56Sopenharmony_ci # Join two (or more) paths.
15777db96d56Sopenharmony_ci def join(path, *paths):
15787db96d56Sopenharmony_ci     path = os.fspath(path)
15797db96d56Sopenharmony_ci-    if isinstance(path, bytes):
15807db96d56Sopenharmony_ci-        sep = b'\\'
15817db96d56Sopenharmony_ci-        seps = b'\\/'
15827db96d56Sopenharmony_ci-        colon = b':'
15837db96d56Sopenharmony_ci-    else:
15847db96d56Sopenharmony_ci-        sep = '\\'
15857db96d56Sopenharmony_ci-        seps = '\\/'
15867db96d56Sopenharmony_ci-        colon = ':'
15877db96d56Sopenharmony_ci+    sep = _get_sep(path)
15887db96d56Sopenharmony_ci+    seps = _get_bothseps(path)
15897db96d56Sopenharmony_ci+    colon = _get_colon(path)
15907db96d56Sopenharmony_ci     try:
15917db96d56Sopenharmony_ci         if not paths:
15927db96d56Sopenharmony_ci             path[:0] + sep  #23780: Ensure compatible data type even if p is null.
15937db96d56Sopenharmony_ci@@ -172,16 +192,10 @@ def splitdrive(p):
15947db96d56Sopenharmony_ci     """
15957db96d56Sopenharmony_ci     p = os.fspath(p)
15967db96d56Sopenharmony_ci     if len(p) >= 2:
15977db96d56Sopenharmony_ci-        if isinstance(p, bytes):
15987db96d56Sopenharmony_ci-            sep = b'\\'
15997db96d56Sopenharmony_ci-            altsep = b'/'
16007db96d56Sopenharmony_ci-            colon = b':'
16017db96d56Sopenharmony_ci-            unc_prefix = b'\\\\?\\UNC\\'
16027db96d56Sopenharmony_ci-        else:
16037db96d56Sopenharmony_ci-            sep = '\\'
16047db96d56Sopenharmony_ci-            altsep = '/'
16057db96d56Sopenharmony_ci-            colon = ':'
16067db96d56Sopenharmony_ci-            unc_prefix = '\\\\?\\UNC\\'
16077db96d56Sopenharmony_ci+        sep = _get_sep(p)
16087db96d56Sopenharmony_ci+        altsep = _get_altsep(p)
16097db96d56Sopenharmony_ci+        colon = _get_colon(p)
16107db96d56Sopenharmony_ci+        unc_prefix = _get_unc_prefix(p)
16117db96d56Sopenharmony_ci         normp = p.replace(altsep, sep)
16127db96d56Sopenharmony_ci         if normp[0:2] == sep * 2:
16137db96d56Sopenharmony_ci             # UNC drives, e.g. \\server\share or \\?\UNC\server\share
16147db96d56Sopenharmony_ci@@ -231,9 +245,9 @@ def split(p):
16157db96d56Sopenharmony_ci def splitext(p):
16167db96d56Sopenharmony_ci     p = os.fspath(p)
16177db96d56Sopenharmony_ci     if isinstance(p, bytes):
16187db96d56Sopenharmony_ci-        return genericpath._splitext(p, b'\\', b'/', b'.')
16197db96d56Sopenharmony_ci+        return genericpath._splitext(p, bsep, baltsep, b'.')
16207db96d56Sopenharmony_ci     else:
16217db96d56Sopenharmony_ci-        return genericpath._splitext(p, '\\', '/', '.')
16227db96d56Sopenharmony_ci+        return genericpath._splitext(p, sep, altsep, '.')
16237db96d56Sopenharmony_ci splitext.__doc__ = genericpath._splitext.__doc__
16247db96d56Sopenharmony_ci 
16257db96d56Sopenharmony_ci 
16267db96d56Sopenharmony_ci@@ -334,7 +348,7 @@ def expanduser(path):
16277db96d56Sopenharmony_ci     if 'USERPROFILE' in os.environ:
16287db96d56Sopenharmony_ci         userhome = os.environ['USERPROFILE']
16297db96d56Sopenharmony_ci     elif not 'HOMEPATH' in os.environ:
16307db96d56Sopenharmony_ci-        return path
16317db96d56Sopenharmony_ci+        return os.path.normpath(path)
16327db96d56Sopenharmony_ci     else:
16337db96d56Sopenharmony_ci         try:
16347db96d56Sopenharmony_ci             drive = os.environ['HOMEDRIVE']
16357db96d56Sopenharmony_ci@@ -361,7 +375,7 @@ def expanduser(path):
16367db96d56Sopenharmony_ci     if isinstance(path, bytes):
16377db96d56Sopenharmony_ci         userhome = os.fsencode(userhome)
16387db96d56Sopenharmony_ci 
16397db96d56Sopenharmony_ci-    return userhome + path[i:]
16407db96d56Sopenharmony_ci+    return os.path.normpath(userhome) + path[i:]
16417db96d56Sopenharmony_ci 
16427db96d56Sopenharmony_ci 
16437db96d56Sopenharmony_ci # Expand paths containing shell variable substitutions.
16447db96d56Sopenharmony_ci@@ -496,14 +510,12 @@ def expandvars(path):
16457db96d56Sopenharmony_ci     def normpath(path):
16467db96d56Sopenharmony_ci         """Normalize path, eliminating double slashes, etc."""
16477db96d56Sopenharmony_ci         path = os.fspath(path)
16487db96d56Sopenharmony_ci+        sep = _get_sep(path)
16497db96d56Sopenharmony_ci+        altsep = _get_altsep(path)
16507db96d56Sopenharmony_ci         if isinstance(path, bytes):
16517db96d56Sopenharmony_ci-            sep = b'\\'
16527db96d56Sopenharmony_ci-            altsep = b'/'
16537db96d56Sopenharmony_ci             curdir = b'.'
16547db96d56Sopenharmony_ci             pardir = b'..'
16557db96d56Sopenharmony_ci         else:
16567db96d56Sopenharmony_ci-            sep = '\\'
16577db96d56Sopenharmony_ci-            altsep = '/'
16587db96d56Sopenharmony_ci             curdir = '.'
16597db96d56Sopenharmony_ci             pardir = '..'
16607db96d56Sopenharmony_ci         path = path.replace(altsep, sep)
16617db96d56Sopenharmony_ci@@ -570,7 +582,7 @@ def _abspath_fallback(path):
16627db96d56Sopenharmony_ci     def abspath(path):
16637db96d56Sopenharmony_ci         """Return the absolute version of a path."""
16647db96d56Sopenharmony_ci         try:
16657db96d56Sopenharmony_ci-            return _getfullpathname(normpath(path))
16667db96d56Sopenharmony_ci+            return normpath(_getfullpathname(normpath(path)))
16677db96d56Sopenharmony_ci         except (OSError, ValueError):
16687db96d56Sopenharmony_ci             return _abspath_fallback(path)
16697db96d56Sopenharmony_ci 
16707db96d56Sopenharmony_ci@@ -719,6 +731,7 @@ def realpath(path, *, strict=False):
16717db96d56Sopenharmony_ci                 # strip the prefix anyway.
16727db96d56Sopenharmony_ci                 if ex.winerror == initial_winerror:
16737db96d56Sopenharmony_ci                     path = spath
16747db96d56Sopenharmony_ci+        path = normpath(path)
16757db96d56Sopenharmony_ci         return path
16767db96d56Sopenharmony_ci 
16777db96d56Sopenharmony_ci 
16787db96d56Sopenharmony_ci@@ -729,12 +742,11 @@ def realpath(path, *, strict=False):
16797db96d56Sopenharmony_ci def relpath(path, start=None):
16807db96d56Sopenharmony_ci     """Return a relative version of a path"""
16817db96d56Sopenharmony_ci     path = os.fspath(path)
16827db96d56Sopenharmony_ci+    sep = _get_sep(path)
16837db96d56Sopenharmony_ci     if isinstance(path, bytes):
16847db96d56Sopenharmony_ci-        sep = b'\\'
16857db96d56Sopenharmony_ci         curdir = b'.'
16867db96d56Sopenharmony_ci         pardir = b'..'
16877db96d56Sopenharmony_ci     else:
16887db96d56Sopenharmony_ci-        sep = '\\'
16897db96d56Sopenharmony_ci         curdir = '.'
16907db96d56Sopenharmony_ci         pardir = '..'
16917db96d56Sopenharmony_ci 
16927db96d56Sopenharmony_ci@@ -789,13 +801,11 @@ def commonpath(paths):
16937db96d56Sopenharmony_ci         raise ValueError('commonpath() arg is an empty sequence')
16947db96d56Sopenharmony_ci 
16957db96d56Sopenharmony_ci     paths = tuple(map(os.fspath, paths))
16967db96d56Sopenharmony_ci+    sep = _get_sep(paths[0])
16977db96d56Sopenharmony_ci+    altsep = _get_altsep(paths[0])
16987db96d56Sopenharmony_ci     if isinstance(paths[0], bytes):
16997db96d56Sopenharmony_ci-        sep = b'\\'
17007db96d56Sopenharmony_ci-        altsep = b'/'
17017db96d56Sopenharmony_ci         curdir = b'.'
17027db96d56Sopenharmony_ci     else:
17037db96d56Sopenharmony_ci-        sep = '\\'
17047db96d56Sopenharmony_ci-        altsep = '/'
17057db96d56Sopenharmony_ci         curdir = '.'
17067db96d56Sopenharmony_ci 
17077db96d56Sopenharmony_ci     try:
17087db96d56Sopenharmony_cidiff --git a/Lib/pathlib.py b/Lib/pathlib.py
17097db96d56Sopenharmony_ciindex ecb1e8a..eec8a9e 100644
17107db96d56Sopenharmony_ci--- a/Lib/pathlib.py
17117db96d56Sopenharmony_ci+++ b/Lib/pathlib.py
17127db96d56Sopenharmony_ci@@ -115,6 +115,8 @@ class _WindowsFlavour(_Flavour):
17137db96d56Sopenharmony_ci 
17147db96d56Sopenharmony_ci     sep = '\\'
17157db96d56Sopenharmony_ci     altsep = '/'
17167db96d56Sopenharmony_ci+    if os.environ.get('MSYSTEM', ''):
17177db96d56Sopenharmony_ci+        sep, altsep = altsep, sep
17187db96d56Sopenharmony_ci     has_drv = True
17197db96d56Sopenharmony_ci     pathmod = ntpath
17207db96d56Sopenharmony_ci 
17217db96d56Sopenharmony_cidiff --git a/Lib/site.py b/Lib/site.py
17227db96d56Sopenharmony_ciindex 69670d9..41b9cf1 100644
17237db96d56Sopenharmony_ci--- a/Lib/site.py
17247db96d56Sopenharmony_ci+++ b/Lib/site.py
17257db96d56Sopenharmony_ci@@ -88,6 +88,12 @@
17267db96d56Sopenharmony_ci USER_BASE = None
17277db96d56Sopenharmony_ci 
17287db96d56Sopenharmony_ci 
17297db96d56Sopenharmony_ci+# Same as defined in Lib/sysconfig.py
17307db96d56Sopenharmony_ci+# redeclared since sysconfig is large for site.
17317db96d56Sopenharmony_ci+# GCC[mingw*] use posix build system
17327db96d56Sopenharmony_ci+_POSIX_BUILD = os.name == 'posix' or \
17337db96d56Sopenharmony_ci+    (os.name == "nt" and 'GCC' in sys.version)
17347db96d56Sopenharmony_ci+
17357db96d56Sopenharmony_ci def _trace(message):
17367db96d56Sopenharmony_ci     if sys.flags.verbose:
17377db96d56Sopenharmony_ci         print(message, file=sys.stderr)
17387db96d56Sopenharmony_ci@@ -273,7 +279,7 @@ def _getuserbase():
17397db96d56Sopenharmony_ci     def joinuser(*args):
17407db96d56Sopenharmony_ci         return os.path.expanduser(os.path.join(*args))
17417db96d56Sopenharmony_ci 
17427db96d56Sopenharmony_ci-    if os.name == "nt":
17437db96d56Sopenharmony_ci+    if os.name == "nt" and not _POSIX_BUILD:
17447db96d56Sopenharmony_ci         base = os.environ.get("APPDATA") or "~"
17457db96d56Sopenharmony_ci         return joinuser(base, "Python")
17467db96d56Sopenharmony_ci 
17477db96d56Sopenharmony_ci@@ -283,14 +289,36 @@ def joinuser(*args):
17487db96d56Sopenharmony_ci 
17497db96d56Sopenharmony_ci     return joinuser("~", ".local")
17507db96d56Sopenharmony_ci 
17517db96d56Sopenharmony_ci+# Copy of sysconfig.get_platform() but only for MinGW
17527db96d56Sopenharmony_ci+def _get_platform():
17537db96d56Sopenharmony_ci+    if os.name == 'nt':
17547db96d56Sopenharmony_ci+        if 'gcc' in sys.version.lower():
17557db96d56Sopenharmony_ci+            if 'ucrt' in sys.version.lower():
17567db96d56Sopenharmony_ci+                if 'amd64' in sys.version.lower():
17577db96d56Sopenharmony_ci+                    return 'mingw_x86_64_ucrt'
17587db96d56Sopenharmony_ci+                return 'mingw_i686_ucrt'
17597db96d56Sopenharmony_ci+            if 'clang' in sys.version.lower():
17607db96d56Sopenharmony_ci+                if 'amd64' in sys.version.lower():
17617db96d56Sopenharmony_ci+                    return 'mingw_x86_64_clang'
17627db96d56Sopenharmony_ci+                if 'arm64' in sys.version.lower():
17637db96d56Sopenharmony_ci+                    return 'mingw_aarch64'
17647db96d56Sopenharmony_ci+                if 'arm' in sys.version.lower():
17657db96d56Sopenharmony_ci+                    return 'mingw_armv7'
17667db96d56Sopenharmony_ci+                return 'mingw_i686_clang'
17677db96d56Sopenharmony_ci+            if 'amd64' in sys.version.lower():
17687db96d56Sopenharmony_ci+                return 'mingw_x86_64'
17697db96d56Sopenharmony_ci+            return 'mingw_i686'
17707db96d56Sopenharmony_ci+    return sys.platform
17717db96d56Sopenharmony_ci 
17727db96d56Sopenharmony_ci # Same to sysconfig.get_path('purelib', os.name+'_user')
17737db96d56Sopenharmony_ci def _get_path(userbase):
17747db96d56Sopenharmony_ci     version = sys.version_info
17757db96d56Sopenharmony_ci 
17767db96d56Sopenharmony_ci     if os.name == 'nt':
17777db96d56Sopenharmony_ci-        ver_nodot = sys.winver.replace('.', '')
17787db96d56Sopenharmony_ci-        return f'{userbase}\\Python{ver_nodot}\\site-packages'
17797db96d56Sopenharmony_ci+        if not _POSIX_BUILD:
17807db96d56Sopenharmony_ci+            ver_nodot = sys.winver.replace('.', '')
17817db96d56Sopenharmony_ci+            return f'{userbase}\\Python{ver_nodot}\\site-packages'
17827db96d56Sopenharmony_ci+        return f'{userbase}/lib/python{version[0]}.{version[1]}-{_get_platform()}/site-packages'
17837db96d56Sopenharmony_ci 
17847db96d56Sopenharmony_ci     if sys.platform == 'darwin' and sys._framework:
17857db96d56Sopenharmony_ci         return f'{userbase}/lib/python/site-packages'
17867db96d56Sopenharmony_ci@@ -361,7 +389,7 @@ def getsitepackages(prefixes=None):
17877db96d56Sopenharmony_ci             continue
17887db96d56Sopenharmony_ci         seen.add(prefix)
17897db96d56Sopenharmony_ci 
17907db96d56Sopenharmony_ci-        if os.sep == '/':
17917db96d56Sopenharmony_ci+        if _POSIX_BUILD:
17927db96d56Sopenharmony_ci             libdirs = [sys.platlibdir]
17937db96d56Sopenharmony_ci             if sys.platlibdir != "lib":
17947db96d56Sopenharmony_ci                 libdirs.append("lib")
17957db96d56Sopenharmony_ci@@ -392,7 +420,7 @@ def setquit():
17967db96d56Sopenharmony_ci     The repr of each object contains a hint at how it works.
17977db96d56Sopenharmony_ci 
17987db96d56Sopenharmony_ci     """
17997db96d56Sopenharmony_ci-    if os.sep == '\\':
18007db96d56Sopenharmony_ci+    if sys.platform == 'win32':
18017db96d56Sopenharmony_ci         eof = 'Ctrl-Z plus Return'
18027db96d56Sopenharmony_ci     else:
18037db96d56Sopenharmony_ci         eof = 'Ctrl-D (i.e. EOF)'
18047db96d56Sopenharmony_cidiff --git a/Lib/ssl.py b/Lib/ssl.py
18057db96d56Sopenharmony_ciindex ebac1d6..cac0c37 100644
18067db96d56Sopenharmony_ci--- a/Lib/ssl.py
18077db96d56Sopenharmony_ci+++ b/Lib/ssl.py
18087db96d56Sopenharmony_ci@@ -254,7 +254,7 @@ class _TLSMessageType:
18097db96d56Sopenharmony_ci     CHANGE_CIPHER_SPEC = 0x0101
18107db96d56Sopenharmony_ci 
18117db96d56Sopenharmony_ci 
18127db96d56Sopenharmony_ci-if sys.platform == "win32":
18137db96d56Sopenharmony_ci+if sys.platform == "win32" and sys.version.find("GCC") == -1:
18147db96d56Sopenharmony_ci     from _ssl import enum_certificates, enum_crls
18157db96d56Sopenharmony_ci 
18167db96d56Sopenharmony_ci from socket import socket, SOCK_STREAM, create_connection
18177db96d56Sopenharmony_ci@@ -591,7 +591,7 @@ def _load_windows_store_certs(self, storename, purpose):
18187db96d56Sopenharmony_ci     def load_default_certs(self, purpose=Purpose.SERVER_AUTH):
18197db96d56Sopenharmony_ci         if not isinstance(purpose, _ASN1Object):
18207db96d56Sopenharmony_ci             raise TypeError(purpose)
18217db96d56Sopenharmony_ci-        if sys.platform == "win32":
18227db96d56Sopenharmony_ci+        if sys.platform == "win32" and sys.version.find("GCC") == -1:
18237db96d56Sopenharmony_ci             for storename in self._windows_cert_stores:
18247db96d56Sopenharmony_ci                 self._load_windows_store_certs(storename, purpose)
18257db96d56Sopenharmony_ci         self.set_default_verify_paths()
18267db96d56Sopenharmony_cidiff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
18277db96d56Sopenharmony_ciindex ebe3711..8035d2e 100644
18287db96d56Sopenharmony_ci--- a/Lib/sysconfig.py
18297db96d56Sopenharmony_ci+++ b/Lib/sysconfig.py
18307db96d56Sopenharmony_ci@@ -2,6 +2,7 @@
18317db96d56Sopenharmony_ci 
18327db96d56Sopenharmony_ci import os
18337db96d56Sopenharmony_ci import sys
18347db96d56Sopenharmony_ci+import textwrap
18357db96d56Sopenharmony_ci from os.path import pardir, realpath
18367db96d56Sopenharmony_ci 
18377db96d56Sopenharmony_ci __all__ = [
18387db96d56Sopenharmony_ci@@ -47,13 +48,13 @@
18397db96d56Sopenharmony_ci         'data': '{base}',
18407db96d56Sopenharmony_ci         },
18417db96d56Sopenharmony_ci     'nt': {
18427db96d56Sopenharmony_ci-        'stdlib': '{installed_base}/Lib',
18437db96d56Sopenharmony_ci-        'platstdlib': '{base}/Lib',
18447db96d56Sopenharmony_ci-        'purelib': '{base}/Lib/site-packages',
18457db96d56Sopenharmony_ci-        'platlib': '{base}/Lib/site-packages',
18467db96d56Sopenharmony_ci-        'include': '{installed_base}/Include',
18477db96d56Sopenharmony_ci-        'platinclude': '{installed_base}/Include',
18487db96d56Sopenharmony_ci-        'scripts': '{base}/Scripts',
18497db96d56Sopenharmony_ci+        'stdlib': '{installed_base}/lib/python{py_version_short}',
18507db96d56Sopenharmony_ci+        'platstdlib': '{base}/lib/python{py_version_short}',
18517db96d56Sopenharmony_ci+        'purelib': '{base}/lib/python{py_version_short}/site-packages',
18527db96d56Sopenharmony_ci+        'platlib': '{base}/lib/python{py_version_short}/site-packages',
18537db96d56Sopenharmony_ci+        'include': '{installed_base}/include/python{py_version_short}',
18547db96d56Sopenharmony_ci+        'platinclude': '{installed_base}/include/python{py_version_short}',
18557db96d56Sopenharmony_ci+        'scripts': '{base}/bin',
18567db96d56Sopenharmony_ci         'data': '{base}',
18577db96d56Sopenharmony_ci         },
18587db96d56Sopenharmony_ci     # Downstream distributors can overwrite the default install scheme.
18597db96d56Sopenharmony_ci@@ -97,13 +98,18 @@
18607db96d56Sopenharmony_ci         },
18617db96d56Sopenharmony_ci     }
18627db96d56Sopenharmony_ci 
18637db96d56Sopenharmony_ci+# GCC[mingw*] use posix build system
18647db96d56Sopenharmony_ci+_POSIX_BUILD = os.name == 'posix' or \
18657db96d56Sopenharmony_ci+    (os.name == "nt" and 'GCC' in sys.version)
18667db96d56Sopenharmony_ci+
18677db96d56Sopenharmony_ci # For the OS-native venv scheme, we essentially provide an alias:
18687db96d56Sopenharmony_ci-if os.name == 'nt':
18697db96d56Sopenharmony_ci+if os.name == 'nt' and not _POSIX_BUILD:
18707db96d56Sopenharmony_ci     _INSTALL_SCHEMES['venv'] = _INSTALL_SCHEMES['nt_venv']
18717db96d56Sopenharmony_ci else:
18727db96d56Sopenharmony_ci     _INSTALL_SCHEMES['venv'] = _INSTALL_SCHEMES['posix_venv']
18737db96d56Sopenharmony_ci 
18747db96d56Sopenharmony_ci 
18757db96d56Sopenharmony_ci+
18767db96d56Sopenharmony_ci # NOTE: site.py has copy of this function.
18777db96d56Sopenharmony_ci # Sync it when modify this function.
18787db96d56Sopenharmony_ci def _getuserbase():
18797db96d56Sopenharmony_ci@@ -118,7 +124,7 @@ def _getuserbase():
18807db96d56Sopenharmony_ci     def joinuser(*args):
18817db96d56Sopenharmony_ci         return os.path.expanduser(os.path.join(*args))
18827db96d56Sopenharmony_ci 
18837db96d56Sopenharmony_ci-    if os.name == "nt":
18847db96d56Sopenharmony_ci+    if os.name == "nt" and not _POSIX_BUILD:
18857db96d56Sopenharmony_ci         base = os.environ.get("APPDATA") or "~"
18867db96d56Sopenharmony_ci         return joinuser(base, "Python")
18877db96d56Sopenharmony_ci 
18887db96d56Sopenharmony_ci@@ -134,20 +140,20 @@ def joinuser(*args):
18897db96d56Sopenharmony_ci     _INSTALL_SCHEMES |= {
18907db96d56Sopenharmony_ci         # NOTE: When modifying "purelib" scheme, update site._get_path() too.
18917db96d56Sopenharmony_ci         'nt_user': {
18927db96d56Sopenharmony_ci-            'stdlib': '{userbase}/Python{py_version_nodot_plat}',
18937db96d56Sopenharmony_ci-            'platstdlib': '{userbase}/Python{py_version_nodot_plat}',
18947db96d56Sopenharmony_ci-            'purelib': '{userbase}/Python{py_version_nodot_plat}/site-packages',
18957db96d56Sopenharmony_ci-            'platlib': '{userbase}/Python{py_version_nodot_plat}/site-packages',
18967db96d56Sopenharmony_ci-            'include': '{userbase}/Python{py_version_nodot_plat}/Include',
18977db96d56Sopenharmony_ci-            'scripts': '{userbase}/Python{py_version_nodot_plat}/Scripts',
18987db96d56Sopenharmony_ci+            'stdlib': '{userbase}/lib/python{py_version_short_plat}',
18997db96d56Sopenharmony_ci+            'platstdlib': '{userbase}/lib/python{py_version_short_plat}',
19007db96d56Sopenharmony_ci+            'purelib': '{userbase}/lib/python{py_version_short_plat}/site-packages',
19017db96d56Sopenharmony_ci+            'platlib': '{userbase}/lib/python{py_version_short_plat}/site-packages',
19027db96d56Sopenharmony_ci+            'include': '{userbase}/include/python{py_version_short_plat}',
19037db96d56Sopenharmony_ci+            'scripts': '{userbase}/bin',
19047db96d56Sopenharmony_ci             'data': '{userbase}',
19057db96d56Sopenharmony_ci             },
19067db96d56Sopenharmony_ci         'posix_user': {
19077db96d56Sopenharmony_ci-            'stdlib': '{userbase}/{platlibdir}/python{py_version_short}',
19087db96d56Sopenharmony_ci-            'platstdlib': '{userbase}/{platlibdir}/python{py_version_short}',
19097db96d56Sopenharmony_ci-            'purelib': '{userbase}/lib/python{py_version_short}/site-packages',
19107db96d56Sopenharmony_ci-            'platlib': '{userbase}/lib/python{py_version_short}/site-packages',
19117db96d56Sopenharmony_ci-            'include': '{userbase}/include/python{py_version_short}',
19127db96d56Sopenharmony_ci+            'stdlib': '{userbase}/{platlibdir}/python{py_version_short_plat}',
19137db96d56Sopenharmony_ci+            'platstdlib': '{userbase}/{platlibdir}/python{py_version_short_plat}',
19147db96d56Sopenharmony_ci+            'purelib': '{userbase}/lib/python{py_version_short_plat}/site-packages',
19157db96d56Sopenharmony_ci+            'platlib': '{userbase}/lib/python{py_version_short_plat}/site-packages',
19167db96d56Sopenharmony_ci+            'include': '{userbase}/include/python{py_version_short_plat}',
19177db96d56Sopenharmony_ci             'scripts': '{userbase}/bin',
19187db96d56Sopenharmony_ci             'data': '{userbase}',
19197db96d56Sopenharmony_ci             },
19207db96d56Sopenharmony_ci@@ -277,7 +283,7 @@ def _expand_vars(scheme, vars):
19217db96d56Sopenharmony_ci 
19227db96d56Sopenharmony_ci 
19237db96d56Sopenharmony_ci def _get_preferred_schemes():
19247db96d56Sopenharmony_ci-    if os.name == 'nt':
19257db96d56Sopenharmony_ci+    if os.name == 'nt' and not _POSIX_BUILD:
19267db96d56Sopenharmony_ci         return {
19277db96d56Sopenharmony_ci             'prefix': 'nt',
19287db96d56Sopenharmony_ci             'home': 'posix_home',
19297db96d56Sopenharmony_ci@@ -435,6 +441,14 @@ def _parse_makefile(filename, vars=None, keep_unresolved=True):
19307db96d56Sopenharmony_ci         if isinstance(v, str):
19317db96d56Sopenharmony_ci             done[k] = v.strip()
19327db96d56Sopenharmony_ci 
19337db96d56Sopenharmony_ci+    # any keys that have one with the same name suffixed with _b2h
19347db96d56Sopenharmony_ci+    # need to be replaced with the value of the _b2h key.
19357db96d56Sopenharmony_ci+    # This converts from MSYS*/Cygwin paths to Windows paths.
19367db96d56Sopenharmony_ci+    for k, v in dict(done).items():
19377db96d56Sopenharmony_ci+        if isinstance(k, str):
19387db96d56Sopenharmony_ci+            if k.endswith("_b2h"):
19397db96d56Sopenharmony_ci+                done[k[:-4]]=v
19407db96d56Sopenharmony_ci+ 
19417db96d56Sopenharmony_ci     # save the results in the global dictionary
19427db96d56Sopenharmony_ci     vars.update(done)
19437db96d56Sopenharmony_ci     return vars
19447db96d56Sopenharmony_ci@@ -514,11 +528,30 @@ def _generate_posix_vars():
19457db96d56Sopenharmony_ci     os.makedirs(pybuilddir, exist_ok=True)
19467db96d56Sopenharmony_ci     destfile = os.path.join(pybuilddir, name + '.py')
19477db96d56Sopenharmony_ci 
19487db96d56Sopenharmony_ci+    replacement = """
19497db96d56Sopenharmony_ci+        keys_to_replace = [
19507db96d56Sopenharmony_ci+            'BINDIR', 'BINLIBDEST', 'CONFINCLUDEDIR',
19517db96d56Sopenharmony_ci+            'CONFINCLUDEPY', 'DESTDIRS', 'DESTLIB', 'DESTSHARED',
19527db96d56Sopenharmony_ci+            'INCLDIRSTOMAKE', 'INCLUDEDIR', 'INCLUDEPY',
19537db96d56Sopenharmony_ci+            'LIBDEST', 'LIBDIR', 'LIBPC', 'LIBPL', 'MACHDESTLIB',
19547db96d56Sopenharmony_ci+            'MANDIR', 'SCRIPTDIR', 'datarootdir', 'exec_prefix',
19557db96d56Sopenharmony_ci+            'TZPATH',
19567db96d56Sopenharmony_ci+        ]
19577db96d56Sopenharmony_ci+
19587db96d56Sopenharmony_ci+        prefix = build_time_vars['BINDIR'][:-4]
19597db96d56Sopenharmony_ci+
19607db96d56Sopenharmony_ci+        for key in keys_to_replace:
19617db96d56Sopenharmony_ci+            value = build_time_vars[key]
19627db96d56Sopenharmony_ci+            build_time_vars[key] = value.replace(prefix, sys.prefix)
19637db96d56Sopenharmony_ci+    """
19647db96d56Sopenharmony_ci+
19657db96d56Sopenharmony_ci     with open(destfile, 'w', encoding='utf8') as f:
19667db96d56Sopenharmony_ci+        f.write('import sys\n')
19677db96d56Sopenharmony_ci         f.write('# system configuration generated and used by'
19687db96d56Sopenharmony_ci                 ' the sysconfig module\n')
19697db96d56Sopenharmony_ci         f.write('build_time_vars = ')
19707db96d56Sopenharmony_ci         pprint.pprint(vars, stream=f)
19717db96d56Sopenharmony_ci+        f.write('\n%s' % textwrap.dedent(replacement))
19727db96d56Sopenharmony_ci 
19737db96d56Sopenharmony_ci     # Create file used for sys.path fixup -- see Modules/getpath.c
19747db96d56Sopenharmony_ci     with open('pybuilddir.txt', 'w', encoding='utf8') as f:
19757db96d56Sopenharmony_ci@@ -541,7 +574,7 @@ def _init_non_posix(vars):
19767db96d56Sopenharmony_ci     vars['INCLUDEPY'] = get_path('include')
19777db96d56Sopenharmony_ci     vars['EXT_SUFFIX'] = _imp.extension_suffixes()[0]
19787db96d56Sopenharmony_ci     vars['EXE'] = '.exe'
19797db96d56Sopenharmony_ci-    vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT
19807db96d56Sopenharmony_ci+    vars['VERSION'] = _PY_VERSION_SHORT
19817db96d56Sopenharmony_ci     vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable))
19827db96d56Sopenharmony_ci     vars['TZPATH'] = ''
19837db96d56Sopenharmony_ci 
19847db96d56Sopenharmony_ci@@ -587,7 +620,7 @@ def parse_config_h(fp, vars=None):
19857db96d56Sopenharmony_ci def get_config_h_filename():
19867db96d56Sopenharmony_ci     """Return the path of pyconfig.h."""
19877db96d56Sopenharmony_ci     if _PYTHON_BUILD:
19887db96d56Sopenharmony_ci-        if os.name == "nt":
19897db96d56Sopenharmony_ci+        if os.name == "nt" and not _POSIX_BUILD:
19907db96d56Sopenharmony_ci             inc_dir = os.path.join(_PROJECT_BASE, "PC")
19917db96d56Sopenharmony_ci         else:
19927db96d56Sopenharmony_ci             inc_dir = _PROJECT_BASE
19937db96d56Sopenharmony_ci@@ -662,11 +695,15 @@ def get_config_vars(*args):
19947db96d56Sopenharmony_ci             _CONFIG_VARS['py_version_nodot_plat'] = sys.winver.replace('.', '')
19957db96d56Sopenharmony_ci         except AttributeError:
19967db96d56Sopenharmony_ci             _CONFIG_VARS['py_version_nodot_plat'] = ''
19977db96d56Sopenharmony_ci+        if os.name == 'nt' and _POSIX_BUILD:
19987db96d56Sopenharmony_ci+            _CONFIG_VARS['py_version_short_plat'] = f'{_PY_VERSION_SHORT}-{get_platform()}'
19997db96d56Sopenharmony_ci+        else:
20007db96d56Sopenharmony_ci+            _CONFIG_VARS['py_version_short_plat'] = _PY_VERSION_SHORT
20017db96d56Sopenharmony_ci 
20027db96d56Sopenharmony_ci-        if os.name == 'nt':
20037db96d56Sopenharmony_ci+        if os.name == 'nt' and not _POSIX_BUILD:
20047db96d56Sopenharmony_ci             _init_non_posix(_CONFIG_VARS)
20057db96d56Sopenharmony_ci             _CONFIG_VARS['VPATH'] = sys._vpath
20067db96d56Sopenharmony_ci-        if os.name == 'posix':
20077db96d56Sopenharmony_ci+        if _POSIX_BUILD:
20087db96d56Sopenharmony_ci             _init_posix(_CONFIG_VARS)
20097db96d56Sopenharmony_ci         if _HAS_USER_BASE:
20107db96d56Sopenharmony_ci             # Setting 'userbase' is done below the call to the
20117db96d56Sopenharmony_ci@@ -676,7 +713,7 @@ def get_config_vars(*args):
20127db96d56Sopenharmony_ci 
20137db96d56Sopenharmony_ci         # Always convert srcdir to an absolute path
20147db96d56Sopenharmony_ci         srcdir = _CONFIG_VARS.get('srcdir', _PROJECT_BASE)
20157db96d56Sopenharmony_ci-        if os.name == 'posix':
20167db96d56Sopenharmony_ci+        if _POSIX_BUILD:
20177db96d56Sopenharmony_ci             if _PYTHON_BUILD:
20187db96d56Sopenharmony_ci                 # If srcdir is a relative path (typically '.' or '..')
20197db96d56Sopenharmony_ci                 # then it should be interpreted relative to the directory
20207db96d56Sopenharmony_ci@@ -714,7 +751,7 @@ def get_config_var(name):
20217db96d56Sopenharmony_ci     """
20227db96d56Sopenharmony_ci     return get_config_vars().get(name)
20237db96d56Sopenharmony_ci 
20247db96d56Sopenharmony_ci-
20257db96d56Sopenharmony_ci+# make sure to change site._get_platform() while changing this function
20267db96d56Sopenharmony_ci def get_platform():
20277db96d56Sopenharmony_ci     """Return a string that identifies the current platform.
20287db96d56Sopenharmony_ci 
20297db96d56Sopenharmony_ci@@ -737,6 +774,22 @@ def get_platform():
20307db96d56Sopenharmony_ci 
20317db96d56Sopenharmony_ci     """
20327db96d56Sopenharmony_ci     if os.name == 'nt':
20337db96d56Sopenharmony_ci+        if 'gcc' in sys.version.lower():
20347db96d56Sopenharmony_ci+            if 'ucrt' in sys.version.lower():
20357db96d56Sopenharmony_ci+                if 'amd64' in sys.version.lower():
20367db96d56Sopenharmony_ci+                    return 'mingw_x86_64_ucrt'
20377db96d56Sopenharmony_ci+                return 'mingw_i686_ucrt'
20387db96d56Sopenharmony_ci+            if 'clang' in sys.version.lower():
20397db96d56Sopenharmony_ci+                if 'amd64' in sys.version.lower():
20407db96d56Sopenharmony_ci+                    return 'mingw_x86_64_clang'
20417db96d56Sopenharmony_ci+                if 'arm64' in sys.version.lower():
20427db96d56Sopenharmony_ci+                    return 'mingw_aarch64'
20437db96d56Sopenharmony_ci+                if 'arm' in sys.version.lower():
20447db96d56Sopenharmony_ci+                    return 'mingw_armv7'
20457db96d56Sopenharmony_ci+                return 'mingw_i686_clang'
20467db96d56Sopenharmony_ci+            if 'amd64' in sys.version.lower():
20477db96d56Sopenharmony_ci+                return 'mingw_x86_64'
20487db96d56Sopenharmony_ci+            return 'mingw_i686'
20497db96d56Sopenharmony_ci         if 'amd64' in sys.version.lower():
20507db96d56Sopenharmony_ci             return 'win-amd64'
20517db96d56Sopenharmony_ci         if '(arm)' in sys.version.lower():
20527db96d56Sopenharmony_cidiff --git a/Lib/test/__main__.py b/Lib/test/__main__.py
20537db96d56Sopenharmony_ciindex 19a6b2b..7641b32 100644
20547db96d56Sopenharmony_ci--- a/Lib/test/__main__.py
20557db96d56Sopenharmony_ci+++ b/Lib/test/__main__.py
20567db96d56Sopenharmony_ci@@ -1,2 +1,10 @@
20577db96d56Sopenharmony_ci+import os
20587db96d56Sopenharmony_ci+import sys
20597db96d56Sopenharmony_ci+
20607db96d56Sopenharmony_ci from test.libregrtest import main
20617db96d56Sopenharmony_ci+
20627db96d56Sopenharmony_ci+if sys.platform == "win32":
20637db96d56Sopenharmony_ci+    # Enable DLL loading from PATH.
20647db96d56Sopenharmony_ci+    os.environ["PYTHONLEGACYWINDOWSDLLLOADING"] = "1"
20657db96d56Sopenharmony_ci+
20667db96d56Sopenharmony_ci main()
20677db96d56Sopenharmony_cidiff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py
20687db96d56Sopenharmony_ciindex 53ba1ad..3b6f4ab 100644
20697db96d56Sopenharmony_ci--- a/Lib/test/test_bytes.py
20707db96d56Sopenharmony_ci+++ b/Lib/test/test_bytes.py
20717db96d56Sopenharmony_ci@@ -1105,7 +1105,7 @@ def test_from_format(self):
20727db96d56Sopenharmony_ci 
20737db96d56Sopenharmony_ci         if os.name == 'nt':
20747db96d56Sopenharmony_ci             # Windows (MSCRT)
20757db96d56Sopenharmony_ci-            ptr_format = '0x%0{}X'.format(2 * sizeof_ptr)
20767db96d56Sopenharmony_ci+            ptr_format = '0x%0{}x'.format(2 * sizeof_ptr)
20777db96d56Sopenharmony_ci             def ptr_formatter(ptr):
20787db96d56Sopenharmony_ci                 return (ptr_format % ptr)
20797db96d56Sopenharmony_ci         else:
20807db96d56Sopenharmony_cidiff --git a/Lib/test/test_getpath.py b/Lib/test/test_getpath.py
20817db96d56Sopenharmony_ciindex 8d5b426..82ad71d 100644
20827db96d56Sopenharmony_ci--- a/Lib/test/test_getpath.py
20837db96d56Sopenharmony_ci+++ b/Lib/test/test_getpath.py
20847db96d56Sopenharmony_ci@@ -838,6 +838,7 @@ def test_symlink_buildpath_macos(self):
20857db96d56Sopenharmony_ci     ENV_PYTHONHOME="",
20867db96d56Sopenharmony_ci     ENV_PYTHONEXECUTABLE="",
20877db96d56Sopenharmony_ci     ENV___PYVENV_LAUNCHER__="",
20887db96d56Sopenharmony_ci+    ENV_MSYSTEM="",
20897db96d56Sopenharmony_ci     argv0="",
20907db96d56Sopenharmony_ci     py_setpath="",
20917db96d56Sopenharmony_ci     real_executable="",
20927db96d56Sopenharmony_ci@@ -877,6 +878,7 @@ def __init__(self, *a, argv0=None, config=None, **kw):
20937db96d56Sopenharmony_ci         self.update(DEFAULT_NAMESPACE)
20947db96d56Sopenharmony_ci         self["config"] = DEFAULT_CONFIG.copy()
20957db96d56Sopenharmony_ci         self["os_name"] = "nt"
20967db96d56Sopenharmony_ci+        self["is_mingw"] = 0
20977db96d56Sopenharmony_ci         self["PLATLIBDIR"] = "DLLs"
20987db96d56Sopenharmony_ci         self["PYWINVER"] = "9.8-XY"
20997db96d56Sopenharmony_ci         self["VPATH"] = r"..\.."
21007db96d56Sopenharmony_ci@@ -912,6 +914,9 @@ def __missing__(self, key):
21017db96d56Sopenharmony_ci         except AttributeError:
21027db96d56Sopenharmony_ci             raise KeyError(key) from None
21037db96d56Sopenharmony_ci 
21047db96d56Sopenharmony_ci+    def normpath(self, path):
21057db96d56Sopenharmony_ci+        return ntpath.normpath(path)
21067db96d56Sopenharmony_ci+
21077db96d56Sopenharmony_ci     def abspath(self, path):
21087db96d56Sopenharmony_ci         if self.isabs(path):
21097db96d56Sopenharmony_ci             return path
21107db96d56Sopenharmony_ci@@ -1053,6 +1058,7 @@ def __init__(self, *a, argv0=None, config=None, **kw):
21117db96d56Sopenharmony_ci         self.update(DEFAULT_NAMESPACE)
21127db96d56Sopenharmony_ci         self["config"] = DEFAULT_CONFIG.copy()
21137db96d56Sopenharmony_ci         self["os_name"] = "posix"
21147db96d56Sopenharmony_ci+        self["is_mingw"] = 0
21157db96d56Sopenharmony_ci         self["PLATLIBDIR"] = "lib"
21167db96d56Sopenharmony_ci         self["WITH_NEXT_FRAMEWORK"] = 0
21177db96d56Sopenharmony_ci         super().__init__(*a, **kw)
21187db96d56Sopenharmony_ci@@ -1089,6 +1095,9 @@ def __missing__(self, key):
21197db96d56Sopenharmony_ci         except AttributeError:
21207db96d56Sopenharmony_ci             raise KeyError(key) from None
21217db96d56Sopenharmony_ci 
21227db96d56Sopenharmony_ci+    def normpath(self, path):
21237db96d56Sopenharmony_ci+        return path
21247db96d56Sopenharmony_ci+
21257db96d56Sopenharmony_ci     def abspath(self, path):
21267db96d56Sopenharmony_ci         if self.isabs(path):
21277db96d56Sopenharmony_ci             return path
21287db96d56Sopenharmony_cidiff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py
21297db96d56Sopenharmony_ciindex cdd1bea..cfd8a10 100644
21307db96d56Sopenharmony_ci--- a/Lib/test/test_httpservers.py
21317db96d56Sopenharmony_ci+++ b/Lib/test/test_httpservers.py
21327db96d56Sopenharmony_ci@@ -442,10 +442,10 @@ def test_undecodable_filename(self):
21337db96d56Sopenharmony_ci     def test_undecodable_parameter(self):
21347db96d56Sopenharmony_ci         # sanity check using a valid parameter
21357db96d56Sopenharmony_ci         response = self.request(self.base_url + '/?x=123').read()
21367db96d56Sopenharmony_ci-        self.assertRegex(response, f'listing for {self.base_url}/\?x=123'.encode('latin1'))
21377db96d56Sopenharmony_ci+        self.assertRegex(response, rf'listing for {self.base_url}/\?x=123'.encode('latin1'))
21387db96d56Sopenharmony_ci         # now the bogus encoding
21397db96d56Sopenharmony_ci         response = self.request(self.base_url + '/?x=%bb').read()
21407db96d56Sopenharmony_ci-        self.assertRegex(response, f'listing for {self.base_url}/\?x=\xef\xbf\xbd'.encode('latin1'))
21417db96d56Sopenharmony_ci+        self.assertRegex(response, rf'listing for {self.base_url}/\?x=\xef\xbf\xbd'.encode('latin1'))
21427db96d56Sopenharmony_ci 
21437db96d56Sopenharmony_ci     def test_get_dir_redirect_location_domain_injection_bug(self):
21447db96d56Sopenharmony_ci         """Ensure //evil.co/..%2f../../X does not put //evil.co/ in Location.
21457db96d56Sopenharmony_cidiff --git a/Lib/test/test_importlib/test_windows.py b/Lib/test/test_importlib/test_windows.py
21467db96d56Sopenharmony_ciindex b7dfe86..58a8f5d 100644
21477db96d56Sopenharmony_ci--- a/Lib/test/test_importlib/test_windows.py
21487db96d56Sopenharmony_ci+++ b/Lib/test/test_importlib/test_windows.py
21497db96d56Sopenharmony_ci@@ -24,6 +24,23 @@ def get_platform():
21507db96d56Sopenharmony_ci             'x64' : 'win-amd64',
21517db96d56Sopenharmony_ci             'arm' : 'win-arm32',
21527db96d56Sopenharmony_ci         }
21537db96d56Sopenharmony_ci+    if os.name == 'nt':
21547db96d56Sopenharmony_ci+        if 'gcc' in sys.version.lower():
21557db96d56Sopenharmony_ci+            if 'ucrt' in sys.version.lower():
21567db96d56Sopenharmony_ci+                if 'amd64' in sys.version.lower():
21577db96d56Sopenharmony_ci+                    return 'mingw_x86_64_ucrt'
21587db96d56Sopenharmony_ci+                return 'mingw_i686_ucrt'
21597db96d56Sopenharmony_ci+            if 'clang' in sys.version.lower():
21607db96d56Sopenharmony_ci+                if 'amd64' in sys.version.lower():
21617db96d56Sopenharmony_ci+                    return 'mingw_x86_64_clang'
21627db96d56Sopenharmony_ci+                if 'arm64' in sys.version.lower():
21637db96d56Sopenharmony_ci+                    return 'mingw_aarch64'
21647db96d56Sopenharmony_ci+                if 'arm' in sys.version.lower():
21657db96d56Sopenharmony_ci+                    return 'mingw_armv7'
21667db96d56Sopenharmony_ci+                return 'mingw_i686_clang'
21677db96d56Sopenharmony_ci+            if 'amd64' in sys.version.lower():
21687db96d56Sopenharmony_ci+                return 'mingw_x86_64'
21697db96d56Sopenharmony_ci+            return 'mingw_i686'
21707db96d56Sopenharmony_ci     if ('VSCMD_ARG_TGT_ARCH' in os.environ and
21717db96d56Sopenharmony_ci         os.environ['VSCMD_ARG_TGT_ARCH'] in TARGET_TO_PLAT):
21727db96d56Sopenharmony_ci         return TARGET_TO_PLAT[os.environ['VSCMD_ARG_TGT_ARCH']]
21737db96d56Sopenharmony_cidiff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py
21747db96d56Sopenharmony_ciindex d96371d..a75a664 100644
21757db96d56Sopenharmony_ci--- a/Lib/test/test_sysconfig.py
21767db96d56Sopenharmony_ci+++ b/Lib/test/test_sysconfig.py
21777db96d56Sopenharmony_ci@@ -17,7 +17,7 @@
21787db96d56Sopenharmony_ci from sysconfig import (get_paths, get_platform, get_config_vars,
21797db96d56Sopenharmony_ci                        get_path, get_path_names, _INSTALL_SCHEMES,
21807db96d56Sopenharmony_ci                        get_default_scheme, get_scheme_names, get_config_var,
21817db96d56Sopenharmony_ci-                       _expand_vars, _get_preferred_schemes, _main)
21827db96d56Sopenharmony_ci+                       _expand_vars, _get_preferred_schemes, _main, _POSIX_BUILD)
21837db96d56Sopenharmony_ci import _osx_support
21847db96d56Sopenharmony_ci 
21857db96d56Sopenharmony_ci 
21867db96d56Sopenharmony_ci@@ -180,7 +180,7 @@ def test_nt_venv_scheme(self):
21877db96d56Sopenharmony_ci         self.assertEqual(libpath, sysconfig.get_path('purelib', scheme='nt_venv'))
21887db96d56Sopenharmony_ci 
21897db96d56Sopenharmony_ci     def test_venv_scheme(self):
21907db96d56Sopenharmony_ci-        if sys.platform == 'win32':
21917db96d56Sopenharmony_ci+        if not _POSIX_BUILD and sys.platform == 'win32':
21927db96d56Sopenharmony_ci             self.assertEqual(
21937db96d56Sopenharmony_ci                 sysconfig.get_path('scripts', scheme='venv'),
21947db96d56Sopenharmony_ci                 sysconfig.get_path('scripts', scheme='nt_venv')
21957db96d56Sopenharmony_ci@@ -371,6 +371,10 @@ def test_user_similar(self):
21967db96d56Sopenharmony_ci             if HAS_USER_BASE:
21977db96d56Sopenharmony_ci                 user_path = get_path(name, 'posix_user')
21987db96d56Sopenharmony_ci                 expected = os.path.normpath(global_path.replace(base, user, 1))
21997db96d56Sopenharmony_ci+                if os.name == 'nt' and _POSIX_BUILD:
22007db96d56Sopenharmony_ci+                    expected = expected.replace(
22017db96d56Sopenharmony_ci+                        f'python{sysconfig.get_python_version()}',
22027db96d56Sopenharmony_ci+                        f'python{sysconfig.get_python_version()}-{get_platform()}')
22037db96d56Sopenharmony_ci                 # bpo-44860: platlib of posix_user doesn't use sys.platlibdir,
22047db96d56Sopenharmony_ci                 # whereas posix_prefix does.
22057db96d56Sopenharmony_ci                 if name == 'platlib':
22067db96d56Sopenharmony_cidiff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py
22077db96d56Sopenharmony_ciindex 6bce308..1cd57d0 100644
22087db96d56Sopenharmony_ci--- a/Lib/venv/__init__.py
22097db96d56Sopenharmony_ci+++ b/Lib/venv/__init__.py
22107db96d56Sopenharmony_ci@@ -11,7 +11,7 @@
22117db96d56Sopenharmony_ci import sys
22127db96d56Sopenharmony_ci import sysconfig
22137db96d56Sopenharmony_ci import types
22147db96d56Sopenharmony_ci-
22157db96d56Sopenharmony_ci+from sysconfig import _POSIX_BUILD
22167db96d56Sopenharmony_ci 
22177db96d56Sopenharmony_ci CORE_VENV_DEPS = ('pip', 'setuptools')
22187db96d56Sopenharmony_ci logger = logging.getLogger(__name__)
22197db96d56Sopenharmony_ci@@ -301,7 +301,7 @@ def setup_python(self, context):
22207db96d56Sopenharmony_ci                     if not os.path.islink(path):
22217db96d56Sopenharmony_ci                         os.chmod(path, 0o755)
22227db96d56Sopenharmony_ci         else:
22237db96d56Sopenharmony_ci-            if self.symlinks:
22247db96d56Sopenharmony_ci+            if self.symlinks and not _POSIX_BUILD:
22257db96d56Sopenharmony_ci                 # For symlinking, we need a complete copy of the root directory
22267db96d56Sopenharmony_ci                 # If symlinks fail, you'll get unnecessary copies of files, but
22277db96d56Sopenharmony_ci                 # we assume that if you've opted into symlinks on Windows then
22287db96d56Sopenharmony_ci@@ -325,6 +325,12 @@ def setup_python(self, context):
22297db96d56Sopenharmony_ci                 if os.path.lexists(src):
22307db96d56Sopenharmony_ci                     copier(src, os.path.join(binpath, suffix))
22317db96d56Sopenharmony_ci 
22327db96d56Sopenharmony_ci+            if _POSIX_BUILD:
22337db96d56Sopenharmony_ci+                # copy from python/pythonw so the venvlauncher magic in symlink_or_copy triggers
22347db96d56Sopenharmony_ci+                copier(os.path.join(dirname, 'python.exe'), os.path.join(binpath, 'python3.exe'))
22357db96d56Sopenharmony_ci+                copier(os.path.join(dirname, 'python.exe'), os.path.join(binpath, 'python%d.%d.exe' % sys.version_info[:2]))
22367db96d56Sopenharmony_ci+                copier(os.path.join(dirname, 'pythonw.exe'), os.path.join(binpath, 'python3w.exe'))
22377db96d56Sopenharmony_ci+
22387db96d56Sopenharmony_ci             if sysconfig.is_python_build():
22397db96d56Sopenharmony_ci                 # copy init.tcl
22407db96d56Sopenharmony_ci                 for root, dirs, files in os.walk(context.python_dir):
22417db96d56Sopenharmony_ci@@ -349,6 +355,7 @@ def _call_new_python(self, context, *py_args, **kwargs):
22427db96d56Sopenharmony_ci         env['VIRTUAL_ENV'] = context.env_dir
22437db96d56Sopenharmony_ci         env.pop('PYTHONHOME', None)
22447db96d56Sopenharmony_ci         env.pop('PYTHONPATH', None)
22457db96d56Sopenharmony_ci+        env.pop("MSYSTEM", None)
22467db96d56Sopenharmony_ci         kwargs['cwd'] = context.env_dir
22477db96d56Sopenharmony_ci         kwargs['executable'] = context.env_exec_cmd
22487db96d56Sopenharmony_ci         subprocess.check_output(args, **kwargs)
22497db96d56Sopenharmony_cidiff --git a/Lib/venv/scripts/common/activate b/Lib/venv/scripts/common/activate
22507db96d56Sopenharmony_ciindex 6fbc2b8..9c3d58d 100644
22517db96d56Sopenharmony_ci--- a/Lib/venv/scripts/common/activate
22527db96d56Sopenharmony_ci+++ b/Lib/venv/scripts/common/activate
22537db96d56Sopenharmony_ci@@ -38,7 +38,7 @@ deactivate () {
22547db96d56Sopenharmony_ci # unset irrelevant variables
22557db96d56Sopenharmony_ci deactivate nondestructive
22567db96d56Sopenharmony_ci 
22577db96d56Sopenharmony_ci-VIRTUAL_ENV="__VENV_DIR__"
22587db96d56Sopenharmony_ci+VIRTUAL_ENV=$(cygpath "__VENV_DIR__")
22597db96d56Sopenharmony_ci export VIRTUAL_ENV
22607db96d56Sopenharmony_ci 
22617db96d56Sopenharmony_ci _OLD_VIRTUAL_PATH="$PATH"
22627db96d56Sopenharmony_cidiff --git a/Makefile.pre.in b/Makefile.pre.in
22637db96d56Sopenharmony_ciindex 3ea8653..2707d04 100644
22647db96d56Sopenharmony_ci--- a/Makefile.pre.in
22657db96d56Sopenharmony_ci+++ b/Makefile.pre.in
22667db96d56Sopenharmony_ci@@ -39,6 +39,7 @@ CXX=		@CXX@
22677db96d56Sopenharmony_ci MAINCC=		@MAINCC@
22687db96d56Sopenharmony_ci LINKCC=		@LINKCC@
22697db96d56Sopenharmony_ci AR=		@AR@
22707db96d56Sopenharmony_ci+WINDRES=	@WINDRES@
22717db96d56Sopenharmony_ci READELF=	@READELF@
22727db96d56Sopenharmony_ci SOABI=		@SOABI@
22737db96d56Sopenharmony_ci LDVERSION=	@LDVERSION@
22747db96d56Sopenharmony_ci@@ -123,6 +124,7 @@ PY_CORE_CFLAGS=	$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE
22757db96d56Sopenharmony_ci PY_CORE_LDFLAGS=$(PY_LDFLAGS) $(PY_LDFLAGS_NODIST)
22767db96d56Sopenharmony_ci # Strict or non-strict aliasing flags used to compile dtoa.c, see above
22777db96d56Sopenharmony_ci CFLAGS_ALIASING=@CFLAGS_ALIASING@
22787db96d56Sopenharmony_ci+RCFLAGS=@RCFLAGS@
22797db96d56Sopenharmony_ci 
22807db96d56Sopenharmony_ci 
22817db96d56Sopenharmony_ci # Machine-dependent subdirectories
22827db96d56Sopenharmony_ci@@ -141,6 +143,12 @@ exec_prefix=	@exec_prefix@
22837db96d56Sopenharmony_ci # Install prefix for data files
22847db96d56Sopenharmony_ci datarootdir=    @datarootdir@
22857db96d56Sopenharmony_ci 
22867db96d56Sopenharmony_ci+# Locations needed for semi-native fixup of sysconfig.
22877db96d56Sopenharmony_ci+srcdir_b2h=		@srcdir_b2h@
22887db96d56Sopenharmony_ci+abs_srcdir_b2h=		@abs_srcdir_b2h@
22897db96d56Sopenharmony_ci+abs_builddir_b2h=	@abs_builddir_b2h@
22907db96d56Sopenharmony_ci+prefix_b2h=		@prefix_b2h@
22917db96d56Sopenharmony_ci+
22927db96d56Sopenharmony_ci # Expanded directories
22937db96d56Sopenharmony_ci BINDIR=		@bindir@
22947db96d56Sopenharmony_ci LIBDIR=		@libdir@
22957db96d56Sopenharmony_ci@@ -158,10 +166,12 @@ BINLIBDEST=	@BINLIBDEST@
22967db96d56Sopenharmony_ci LIBDEST=	$(SCRIPTDIR)/python$(VERSION)
22977db96d56Sopenharmony_ci INCLUDEPY=	$(INCLUDEDIR)/python$(LDVERSION)
22987db96d56Sopenharmony_ci CONFINCLUDEPY=	$(CONFINCLUDEDIR)/python$(LDVERSION)
22997db96d56Sopenharmony_ci+VENVLAUNCHERDIR=	$(BINLIBDEST)/venv/scripts/nt
23007db96d56Sopenharmony_ci 
23017db96d56Sopenharmony_ci # Symbols used for using shared libraries
23027db96d56Sopenharmony_ci SHLIB_SUFFIX=	@SHLIB_SUFFIX@
23037db96d56Sopenharmony_ci EXT_SUFFIX=	@EXT_SUFFIX@
23047db96d56Sopenharmony_ci+PYD_PLATFORM_TAG = @PYD_PLATFORM_TAG@
23057db96d56Sopenharmony_ci LDSHARED=	@LDSHARED@ $(PY_LDFLAGS)
23067db96d56Sopenharmony_ci BLDSHARED=	@BLDSHARED@ $(PY_CORE_LDFLAGS)
23077db96d56Sopenharmony_ci LDCXXSHARED=	@LDCXXSHARED@
23087db96d56Sopenharmony_ci@@ -268,6 +278,8 @@ LIBRARY_DEPS=	@LIBRARY_DEPS@
23097db96d56Sopenharmony_ci LINK_PYTHON_DEPS=@LINK_PYTHON_DEPS@
23107db96d56Sopenharmony_ci PY_ENABLE_SHARED=	@PY_ENABLE_SHARED@
23117db96d56Sopenharmony_ci STATIC_LIBPYTHON=	@STATIC_LIBPYTHON@
23127db96d56Sopenharmony_ci+ABI3DLLLIBRARY= libpython3.dll
23137db96d56Sopenharmony_ci+ABI3LDLIBRARY=  libpython3.dll.a
23147db96d56Sopenharmony_ci 
23157db96d56Sopenharmony_ci 
23167db96d56Sopenharmony_ci LIBS=		@LIBS@
23177db96d56Sopenharmony_ci@@ -284,6 +296,7 @@ LIBOBJS=	@LIBOBJS@
23187db96d56Sopenharmony_ci 
23197db96d56Sopenharmony_ci PYTHON=		python$(EXE)
23207db96d56Sopenharmony_ci BUILDPYTHON=	python$(BUILDEXE)
23217db96d56Sopenharmony_ci+BUILDPYTHONW=	pythonw$(BUILDEXE)
23227db96d56Sopenharmony_ci 
23237db96d56Sopenharmony_ci HOSTRUNNER= @HOSTRUNNER@
23247db96d56Sopenharmony_ci 
23257db96d56Sopenharmony_ci@@ -344,6 +357,7 @@ IO_OBJS=	\
23267db96d56Sopenharmony_ci ##########################################################################
23277db96d56Sopenharmony_ci 
23287db96d56Sopenharmony_ci LIBFFI_INCLUDEDIR=	@LIBFFI_INCLUDEDIR@
23297db96d56Sopenharmony_ci+NCURSESW_INCLUDEDIR=	@NCURSESW_INCLUDEDIR@
23307db96d56Sopenharmony_ci 
23317db96d56Sopenharmony_ci ##########################################################################
23327db96d56Sopenharmony_ci # Parser
23337db96d56Sopenharmony_ci@@ -390,7 +404,7 @@ PYTHON_OBJS=	\
23347db96d56Sopenharmony_ci 		Python/dynamic_annotations.o \
23357db96d56Sopenharmony_ci 		Python/errors.o \
23367db96d56Sopenharmony_ci 		Python/frame.o \
23377db96d56Sopenharmony_ci-		Python/frozenmain.o \
23387db96d56Sopenharmony_ci+		@PYTHON_OBJS_FROZENMAIN@ \
23397db96d56Sopenharmony_ci 		Python/future.o \
23407db96d56Sopenharmony_ci 		Python/getargs.o \
23417db96d56Sopenharmony_ci 		Python/getcompiler.o \
23427db96d56Sopenharmony_ci@@ -402,6 +416,7 @@ PYTHON_OBJS=	\
23437db96d56Sopenharmony_ci 		Python/import.o \
23447db96d56Sopenharmony_ci 		Python/importdl.o \
23457db96d56Sopenharmony_ci 		Python/initconfig.o \
23467db96d56Sopenharmony_ci+		Python/iscygpty.o \
23477db96d56Sopenharmony_ci 		Python/marshal.o \
23487db96d56Sopenharmony_ci 		Python/modsupport.o \
23497db96d56Sopenharmony_ci 		Python/mysnprintf.o \
23507db96d56Sopenharmony_ci@@ -584,8 +599,8 @@ LIBEXPAT_HEADERS= \
23517db96d56Sopenharmony_ci 
23527db96d56Sopenharmony_ci # Default target
23537db96d56Sopenharmony_ci all:		@DEF_MAKE_ALL_RULE@
23547db96d56Sopenharmony_ci-build_all:	check-clean-src $(BUILDPYTHON) platform oldsharedmods sharedmods \
23557db96d56Sopenharmony_ci-		gdbhooks Programs/_testembed python-config
23567db96d56Sopenharmony_ci+build_all:	check-clean-src $(BUILDPYTHON) $(BUILDPYTHONW) platform oldsharedmods sharedmods \
23577db96d56Sopenharmony_ci+		gdbhooks Programs/_testembed python-config $(ABI3DLLLIBRARY) $(ABI3LDLIBRARY)
23587db96d56Sopenharmony_ci build_wasm: check-clean-src $(BUILDPYTHON) platform oldsharedmods python-config
23597db96d56Sopenharmony_ci 
23607db96d56Sopenharmony_ci # Check that the source is clean when building out of source.
23617db96d56Sopenharmony_ci@@ -700,9 +715,30 @@ coverage-report: regen-token regen-frozen
23627db96d56Sopenharmony_ci clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
23637db96d56Sopenharmony_ci 	$(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py --make --srcdir $(srcdir)
23647db96d56Sopenharmony_ci 
23657db96d56Sopenharmony_ci+python_exe.o: $(srcdir)/PC/python_exe.rc
23667db96d56Sopenharmony_ci+	$(WINDRES) $(RCFLAGS) -I$(srcdir)/Include -I$(srcdir)/PC -I. $(srcdir)/PC/python_exe.rc $@
23677db96d56Sopenharmony_ci+
23687db96d56Sopenharmony_ci+pythonw_exe.o: $(srcdir)/PC/pythonw_exe.rc
23697db96d56Sopenharmony_ci+	$(WINDRES) $(RCFLAGS) -I$(srcdir)/Include -I$(srcdir)/PC -I. $(srcdir)/PC/pythonw_exe.rc $@
23707db96d56Sopenharmony_ci+
23717db96d56Sopenharmony_ci+python_nt.o: $(srcdir)/PC/python_nt.rc
23727db96d56Sopenharmony_ci+	$(WINDRES) $(RCFLAGS) -DORIGINAL_FILENAME=\\\"$(DLLLIBRARY)\\\" -I$(srcdir)/Include -I$(srcdir)/PC -I. $(srcdir)/PC/python_nt.rc $@
23737db96d56Sopenharmony_ci+
23747db96d56Sopenharmony_ci+python3dll_nt.o: $(srcdir)/PC/python_nt.rc
23757db96d56Sopenharmony_ci+	$(WINDRES) $(RCFLAGS) -DORIGINAL_FILENAME=\\\"$(ABI3DLLLIBRARY)\\\" -I$(srcdir)/Include -I$(srcdir)/PC -I. $(srcdir)/PC/python_nt.rc $@
23767db96d56Sopenharmony_ci+
23777db96d56Sopenharmony_ci+venvlauncher.o: $(srcdir)/PC/pylauncher.rc
23787db96d56Sopenharmony_ci+	$(WINDRES) $(RCFLAGS) -DPY_ICON -I$(srcdir)/Include -I$(srcdir)/PC -I. $(srcdir)/PC/pylauncher.rc $@
23797db96d56Sopenharmony_ci+
23807db96d56Sopenharmony_ci+venvwlauncher.o: $(srcdir)/PC/pylauncher.rc
23817db96d56Sopenharmony_ci+	$(WINDRES) $(RCFLAGS) -DPYW_ICON -I$(srcdir)/Include -I$(srcdir)/PC -I. $(srcdir)/PC/pylauncher.rc $@
23827db96d56Sopenharmony_ci+
23837db96d56Sopenharmony_ci+$(BUILDPYTHONW): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) pythonw_exe.o
23847db96d56Sopenharmony_ci+	$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -municode -mwindows -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) pythonw_exe.o
23857db96d56Sopenharmony_ci+
23867db96d56Sopenharmony_ci # Build the interpreter
23877db96d56Sopenharmony_ci-$(BUILDPYTHON):	Programs/python.o $(LINK_PYTHON_DEPS)
23887db96d56Sopenharmony_ci-	$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(LINK_PYTHON_OBJS) $(LIBS) $(MODLIBS) $(SYSLIBS)
23897db96d56Sopenharmony_ci+$(BUILDPYTHON):	Programs/python.o $(LINK_PYTHON_DEPS) python_exe.o
23907db96d56Sopenharmony_ci+	$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -municode -o $@ Programs/python.o $(LINK_PYTHON_OBJS) $(LIBS) $(MODLIBS) $(SYSLIBS) python_exe.o
23917db96d56Sopenharmony_ci 
23927db96d56Sopenharmony_ci platform: $(PYTHON_FOR_BUILD_DEPS) pybuilddir.txt
23937db96d56Sopenharmony_ci 	$(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import sys ; from sysconfig import get_platform ; print("%s-%d.%d" % (get_platform(), *sys.version_info[:2]))' >platform
23947db96d56Sopenharmony_ci@@ -806,13 +842,17 @@ $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK): \
23957db96d56Sopenharmony_ci 
23967db96d56Sopenharmony_ci # This rule builds the Cygwin Python DLL and import library if configured
23977db96d56Sopenharmony_ci # for a shared core library; otherwise, this rule is a noop.
23987db96d56Sopenharmony_ci-$(DLLLIBRARY) libpython$(LDVERSION).dll.a: $(LIBRARY_OBJS)
23997db96d56Sopenharmony_ci+$(DLLLIBRARY) libpython$(LDVERSION).dll.a: $(LIBRARY_OBJS) python_nt.o
24007db96d56Sopenharmony_ci 	if test -n "$(DLLLIBRARY)"; then \
24017db96d56Sopenharmony_ci 		$(LDSHARED) -Wl,--out-implib=$@ -o $(DLLLIBRARY) $^ \
24027db96d56Sopenharmony_ci-			$(LIBS) $(MODLIBS) $(SYSLIBS); \
24037db96d56Sopenharmony_ci+			$(LIBS) $(LDFLAGS_NODIST) $(MODLIBS) $(SYSLIBS) python_nt.o; \
24047db96d56Sopenharmony_ci 	else true; \
24057db96d56Sopenharmony_ci 	fi
24067db96d56Sopenharmony_ci 
24077db96d56Sopenharmony_ci+$(ABI3DLLLIBRARY) $(ABI3LDLIBRARY): python3dll_nt.o $(srcdir)/PC/launcher.c
24087db96d56Sopenharmony_ci+	$(LDSHARED) -DPYTHON_DLL_NAME=\"$(DLLLIBRARY)\" $(srcdir)/PC/python3dll.c -Wl,--out-implib=$(ABI3LDLIBRARY) -o $(ABI3DLLLIBRARY) python3dll_nt.o \
24097db96d56Sopenharmony_ci+		$(LDFLAGS_NODIST);
24107db96d56Sopenharmony_ci+
24117db96d56Sopenharmony_ci # wasm32-emscripten browser build
24127db96d56Sopenharmony_ci # wasm assets directory is relative to current build dir, e.g. "./usr/local".
24137db96d56Sopenharmony_ci # --preload-file turns a relative asset path into an absolute path.
24147db96d56Sopenharmony_ci@@ -974,7 +1014,7 @@ BOOTSTRAP_HEADERS = \
24157db96d56Sopenharmony_ci Programs/_bootstrap_python.o: Programs/_bootstrap_python.c $(BOOTSTRAP_HEADERS) $(PYTHON_HEADERS)
24167db96d56Sopenharmony_ci 
24177db96d56Sopenharmony_ci _bootstrap_python: $(LIBRARY_OBJS_OMIT_FROZEN) Programs/_bootstrap_python.o Modules/getpath.o Modules/Setup.local
24187db96d56Sopenharmony_ci-	$(LINKCC) $(PY_LDFLAGS_NOLTO) -o $@ $(LIBRARY_OBJS_OMIT_FROZEN) \
24197db96d56Sopenharmony_ci+	$(LINKCC) $(PY_LDFLAGS_NOLTO) -o $@ -municode -mwindows $(LIBRARY_OBJS_OMIT_FROZEN) \
24207db96d56Sopenharmony_ci 		Programs/_bootstrap_python.o Modules/getpath.o $(LIBS) $(MODLIBS) $(SYSLIBS)
24217db96d56Sopenharmony_ci 
24227db96d56Sopenharmony_ci 
24237db96d56Sopenharmony_ci@@ -1276,9 +1316,15 @@ Python/dynload_hpux.o: $(srcdir)/Python/dynload_hpux.c Makefile
24247db96d56Sopenharmony_ci 		-DSHLIB_EXT='"$(EXT_SUFFIX)"' \
24257db96d56Sopenharmony_ci 		-o $@ $(srcdir)/Python/dynload_hpux.c
24267db96d56Sopenharmony_ci 
24277db96d56Sopenharmony_ci+Python/dynload_win.o: $(srcdir)/Python/dynload_win.c Makefile
24287db96d56Sopenharmony_ci+	$(CC) -c $(PY_CORE_CFLAGS) \
24297db96d56Sopenharmony_ci+		-DPYD_PLATFORM_TAG='"$(PYD_PLATFORM_TAG)"' \
24307db96d56Sopenharmony_ci+		-o $@ $(srcdir)/Python/dynload_win.c
24317db96d56Sopenharmony_ci+
24327db96d56Sopenharmony_ci Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile $(srcdir)/Include/pydtrace.h
24337db96d56Sopenharmony_ci 	$(CC) -c $(PY_CORE_CFLAGS) \
24347db96d56Sopenharmony_ci 		-DABIFLAGS='"$(ABIFLAGS)"' \
24357db96d56Sopenharmony_ci+		-DVPATH='"$(VPATH)"' \
24367db96d56Sopenharmony_ci 		$(MULTIARCH_CPPFLAGS) \
24377db96d56Sopenharmony_ci 		-o $@ $(srcdir)/Python/sysmodule.c
24387db96d56Sopenharmony_ci 
24397db96d56Sopenharmony_ci@@ -1496,6 +1542,7 @@ PYTHON_HEADERS= \
24407db96d56Sopenharmony_ci 		$(srcdir)/Include/frameobject.h \
24417db96d56Sopenharmony_ci 		$(srcdir)/Include/import.h \
24427db96d56Sopenharmony_ci 		$(srcdir)/Include/intrcheck.h \
24437db96d56Sopenharmony_ci+		$(srcdir)/Include/iscygpty.h \
24447db96d56Sopenharmony_ci 		$(srcdir)/Include/iterobject.h \
24457db96d56Sopenharmony_ci 		$(srcdir)/Include/listobject.h \
24467db96d56Sopenharmony_ci 		$(srcdir)/Include/longobject.h \
24477db96d56Sopenharmony_ci@@ -1791,7 +1838,7 @@ $(DESTSHARED):
24487db96d56Sopenharmony_ci # Install the interpreter with $(VERSION) affixed
24497db96d56Sopenharmony_ci # This goes into $(exec_prefix)
24507db96d56Sopenharmony_ci altbininstall: $(BUILDPYTHON) @FRAMEWORKPYTHONW@
24517db96d56Sopenharmony_ci-	@for i in $(BINDIR) $(LIBDIR); \
24527db96d56Sopenharmony_ci+	@for i in $(BINDIR) $(LIBDIR) $(VENVLAUNCHERDIR); \
24537db96d56Sopenharmony_ci 	do \
24547db96d56Sopenharmony_ci 		if test ! -d $(DESTDIR)$$i; then \
24557db96d56Sopenharmony_ci 			echo "Creating directory $$i"; \
24567db96d56Sopenharmony_ci@@ -1801,6 +1848,7 @@ altbininstall: $(BUILDPYTHON) @FRAMEWORKPYTHONW@
24577db96d56Sopenharmony_ci 	done
24587db96d56Sopenharmony_ci 	if test "$(PYTHONFRAMEWORKDIR)" = "no-framework" ; then \
24597db96d56Sopenharmony_ci 		$(INSTALL_PROGRAM) $(BUILDPYTHON) $(DESTDIR)$(BINDIR)/python$(LDVERSION)$(EXE); \
24607db96d56Sopenharmony_ci+		$(INSTALL_PROGRAM) $(BUILDPYTHONW) $(DESTDIR)$(BINDIR)/python3w$(EXE); \
24617db96d56Sopenharmony_ci 	else \
24627db96d56Sopenharmony_ci 		$(INSTALL_PROGRAM) $(STRIPFLAG) Mac/pythonw $(DESTDIR)$(BINDIR)/python$(LDVERSION)$(EXE); \
24637db96d56Sopenharmony_ci 	fi
24647db96d56Sopenharmony_ci@@ -1814,6 +1862,7 @@ altbininstall: $(BUILDPYTHON) @FRAMEWORKPYTHONW@
24657db96d56Sopenharmony_ci 		if test -f $(LDLIBRARY) && test "$(PYTHONFRAMEWORKDIR)" = "no-framework" ; then \
24667db96d56Sopenharmony_ci 			if test -n "$(DLLLIBRARY)" ; then \
24677db96d56Sopenharmony_ci 				$(INSTALL_SHARED) $(DLLLIBRARY) $(DESTDIR)$(BINDIR); \
24687db96d56Sopenharmony_ci+				$(INSTALL_SHARED) $(ABI3DLLLIBRARY) $(DESTDIR)$(BINDIR); \
24697db96d56Sopenharmony_ci 			else \
24707db96d56Sopenharmony_ci 				$(INSTALL_SHARED) $(LDLIBRARY) $(DESTDIR)$(LIBDIR)/$(INSTSONAME); \
24717db96d56Sopenharmony_ci 				if test $(LDLIBRARY) != $(INSTSONAME); then \
24727db96d56Sopenharmony_ci@@ -1924,6 +1973,7 @@ LIBSUBDIRS=	asyncio \
24737db96d56Sopenharmony_ci 		tkinter \
24747db96d56Sopenharmony_ci 		tomllib \
24757db96d56Sopenharmony_ci 		turtledemo \
24767db96d56Sopenharmony_ci+		msilib \
24777db96d56Sopenharmony_ci 		unittest \
24787db96d56Sopenharmony_ci 		urllib \
24797db96d56Sopenharmony_ci 		venv venv/scripts venv/scripts/common venv/scripts/posix \
24807db96d56Sopenharmony_ci@@ -2223,8 +2273,9 @@ libainstall: all python-config
24817db96d56Sopenharmony_ci 	@if test "$(STATIC_LIBPYTHON)" = 1; then \
24827db96d56Sopenharmony_ci 		if test -d $(LIBRARY); then :; else \
24837db96d56Sopenharmony_ci 			if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \
24847db96d56Sopenharmony_ci-				if test "$(SHLIB_SUFFIX)" = .dll; then \
24857db96d56Sopenharmony_ci-					$(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \
24867db96d56Sopenharmony_ci+				if test "$(SHLIB_SUFFIX)" = .dll -o "$(SHLIB_SUFFIX)" = .pyd; then \
24877db96d56Sopenharmony_ci+					$(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBDIR) ; \
24887db96d56Sopenharmony_ci+					$(INSTALL_DATA) $(ABI3LDLIBRARY) $(DESTDIR)$(LIBDIR) ; \
24897db96d56Sopenharmony_ci 				else \
24907db96d56Sopenharmony_ci 					$(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \
24917db96d56Sopenharmony_ci 				fi; \
24927db96d56Sopenharmony_ci@@ -2263,16 +2314,23 @@ libainstall: all python-config
24937db96d56Sopenharmony_ci 	else true; \
24947db96d56Sopenharmony_ci 	fi
24957db96d56Sopenharmony_ci 
24967db96d56Sopenharmony_ci+ifeq ($(shell uname -o),Msys)
24977db96d56Sopenharmony_ci+DESTDIRFINAL=$(DESTDIR)
24987db96d56Sopenharmony_ci+else
24997db96d56Sopenharmony_ci+DESTDIRFINAL=$(DESTDIR)/
25007db96d56Sopenharmony_ci+endif
25017db96d56Sopenharmony_ci+
25027db96d56Sopenharmony_ci # Install the dynamically loadable modules
25037db96d56Sopenharmony_ci # This goes into $(exec_prefix)
25047db96d56Sopenharmony_ci sharedinstall: all
25057db96d56Sopenharmony_ci+	MSYS2_ARG_CONV_EXCL="--prefix=;--install-scripts=;--install-platlib=" \
25067db96d56Sopenharmony_ci 	$(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/setup.py install \
25077db96d56Sopenharmony_ci 	   	--prefix=$(prefix) \
25087db96d56Sopenharmony_ci 		--install-scripts=$(BINDIR) \
25097db96d56Sopenharmony_ci 		--install-platlib=$(DESTSHARED) \
25107db96d56Sopenharmony_ci-		--root=$(DESTDIR)/
25117db96d56Sopenharmony_ci-	-rm $(DESTDIR)$(DESTSHARED)/_sysconfigdata_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH).py
25127db96d56Sopenharmony_ci-	-rm -r $(DESTDIR)$(DESTSHARED)/__pycache__
25137db96d56Sopenharmony_ci+		--root=$(DESTDIRFINAL)
25147db96d56Sopenharmony_ci+	-rm $(DESTDIRFINAL)$(DESTSHARED)/_sysconfigdata_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH).py
25157db96d56Sopenharmony_ci+	-rm -r $(DESTDIRFINAL)$(DESTSHARED)/__pycache__
25167db96d56Sopenharmony_ci 
25177db96d56Sopenharmony_ci # Here are a couple of targets for MacOSX again, to install a full
25187db96d56Sopenharmony_ci # framework-based Python. frameworkinstall installs everything, the
25197db96d56Sopenharmony_ci@@ -2464,7 +2522,7 @@ clean: clean-retain-profile
25207db96d56Sopenharmony_ci 	fi
25217db96d56Sopenharmony_ci 
25227db96d56Sopenharmony_ci clobber: clean
25237db96d56Sopenharmony_ci-	-rm -f $(BUILDPYTHON) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \
25247db96d56Sopenharmony_ci+	-rm -f $(BUILDPYTHON) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY)$(ABI3LDLIBRARY) $(ABI3DLLLIBRARY) \
25257db96d56Sopenharmony_ci 		tags TAGS \
25267db96d56Sopenharmony_ci 		config.cache config.log pyconfig.h Modules/config.c
25277db96d56Sopenharmony_ci 	-rm -rf build platform
25287db96d56Sopenharmony_cidiff --git a/Misc/NEWS.d/3.11.4.rst b/Misc/NEWS.d/3.11.4.rst
25297db96d56Sopenharmony_cinew file mode 100755
25307db96d56Sopenharmony_ciindex 0000000..71ed43d
25317db96d56Sopenharmony_ci--- /dev/null
25327db96d56Sopenharmony_ci+++ b/Misc/NEWS.d/3.11.4.rst
25337db96d56Sopenharmony_ci@@ -0,0 +1,785 @@
25347db96d56Sopenharmony_ci+.. date: 2023-06-01-03-24-58
25357db96d56Sopenharmony_ci+.. gh-issue: 103142
25367db96d56Sopenharmony_ci+.. nonce: GLWDMX
25377db96d56Sopenharmony_ci+.. release date: 2023-06-06
25387db96d56Sopenharmony_ci+.. section: Security
25397db96d56Sopenharmony_ci+
25407db96d56Sopenharmony_ci+The version of OpenSSL used in our binary builds has been upgraded to 1.1.1u
25417db96d56Sopenharmony_ci+to address several CVEs.
25427db96d56Sopenharmony_ci+
25437db96d56Sopenharmony_ci+..
25447db96d56Sopenharmony_ci+
25457db96d56Sopenharmony_ci+.. date: 2023-05-02-17-56-32
25467db96d56Sopenharmony_ci+.. gh-issue: 99889
25477db96d56Sopenharmony_ci+.. nonce: l664SU
25487db96d56Sopenharmony_ci+.. section: Security
25497db96d56Sopenharmony_ci+
25507db96d56Sopenharmony_ci+Fixed a security in flaw in :func:`uu.decode` that could allow for directory
25517db96d56Sopenharmony_ci+traversal based on the input if no ``out_file`` was specified.
25527db96d56Sopenharmony_ci+
25537db96d56Sopenharmony_ci+..
25547db96d56Sopenharmony_ci+
25557db96d56Sopenharmony_ci+.. date: 2023-05-01-15-03-25
25567db96d56Sopenharmony_ci+.. gh-issue: 104049
25577db96d56Sopenharmony_ci+.. nonce: b01Y3g
25587db96d56Sopenharmony_ci+.. section: Security
25597db96d56Sopenharmony_ci+
25607db96d56Sopenharmony_ci+Do not expose the local on-disk location in directory indexes produced by
25617db96d56Sopenharmony_ci+:class:`http.client.SimpleHTTPRequestHandler`.
25627db96d56Sopenharmony_ci+
25637db96d56Sopenharmony_ci+..
25647db96d56Sopenharmony_ci+
25657db96d56Sopenharmony_ci+.. date: 2023-03-07-20-59-17
25667db96d56Sopenharmony_ci+.. gh-issue: 102153
25677db96d56Sopenharmony_ci+.. nonce: 14CLSZ
25687db96d56Sopenharmony_ci+.. section: Security
25697db96d56Sopenharmony_ci+
25707db96d56Sopenharmony_ci+:func:`urllib.parse.urlsplit` now strips leading C0 control and space
25717db96d56Sopenharmony_ci+characters following the specification for URLs defined by WHATWG in
25727db96d56Sopenharmony_ci+response to CVE-2023-24329. Patch by Illia Volochii.
25737db96d56Sopenharmony_ci+
25747db96d56Sopenharmony_ci+..
25757db96d56Sopenharmony_ci+
25767db96d56Sopenharmony_ci+.. date: 2023-05-31-19-35-22
25777db96d56Sopenharmony_ci+.. gh-issue: 105164
25787db96d56Sopenharmony_ci+.. nonce: 6Wajph
25797db96d56Sopenharmony_ci+.. section: Core and Builtins
25807db96d56Sopenharmony_ci+
25817db96d56Sopenharmony_ci+Ensure annotations are set up correctly if the only annotation in a block is
25827db96d56Sopenharmony_ci+within a :keyword:`match` block. Patch by Jelle Zijlstra.
25837db96d56Sopenharmony_ci+
25847db96d56Sopenharmony_ci+..
25857db96d56Sopenharmony_ci+
25867db96d56Sopenharmony_ci+.. date: 2023-05-18-13-00-21
25877db96d56Sopenharmony_ci+.. gh-issue: 104615
25887db96d56Sopenharmony_ci+.. nonce: h_rtw2
25897db96d56Sopenharmony_ci+.. section: Core and Builtins
25907db96d56Sopenharmony_ci+
25917db96d56Sopenharmony_ci+Fix wrong ordering of assignments in code like ``a, a = x, y``. Contributed
25927db96d56Sopenharmony_ci+by Carl Meyer.
25937db96d56Sopenharmony_ci+
25947db96d56Sopenharmony_ci+..
25957db96d56Sopenharmony_ci+
25967db96d56Sopenharmony_ci+.. date: 2023-05-14-18-56-54
25977db96d56Sopenharmony_ci+.. gh-issue: 104482
25987db96d56Sopenharmony_ci+.. nonce: yaQsv8
25997db96d56Sopenharmony_ci+.. section: Core and Builtins
26007db96d56Sopenharmony_ci+
26017db96d56Sopenharmony_ci+Fix three error handling bugs in ast.c's validation of pattern matching
26027db96d56Sopenharmony_ci+statements.
26037db96d56Sopenharmony_ci+
26047db96d56Sopenharmony_ci+..
26057db96d56Sopenharmony_ci+
26067db96d56Sopenharmony_ci+.. date: 2023-05-13-06-22-52
26077db96d56Sopenharmony_ci+.. gh-issue: 102818
26087db96d56Sopenharmony_ci+.. nonce: HIX1Dr
26097db96d56Sopenharmony_ci+.. section: Core and Builtins
26107db96d56Sopenharmony_ci+
26117db96d56Sopenharmony_ci+Do not add a frame to the traceback in the ``sys.setprofile`` and
26127db96d56Sopenharmony_ci+``sys.settrace`` trampoline functions. This ensures that frames are not
26137db96d56Sopenharmony_ci+duplicated if an exception is raised in the callback function, and ensures
26147db96d56Sopenharmony_ci+that frames are not omitted if a C callback is used and that does not add
26157db96d56Sopenharmony_ci+the frame.
26167db96d56Sopenharmony_ci+
26177db96d56Sopenharmony_ci+..
26187db96d56Sopenharmony_ci+
26197db96d56Sopenharmony_ci+.. date: 2023-05-12-00-19-02
26207db96d56Sopenharmony_ci+.. gh-issue: 104405
26217db96d56Sopenharmony_ci+.. nonce: tXV5fn
26227db96d56Sopenharmony_ci+.. section: Core and Builtins
26237db96d56Sopenharmony_ci+
26247db96d56Sopenharmony_ci+Fix an issue where some :term:`bytecode` instructions could ignore
26257db96d56Sopenharmony_ci+:pep:`523` when "inlining" calls.
26267db96d56Sopenharmony_ci+
26277db96d56Sopenharmony_ci+..
26287db96d56Sopenharmony_ci+
26297db96d56Sopenharmony_ci+.. date: 2023-05-01-12-03-52
26307db96d56Sopenharmony_ci+.. gh-issue: 104018
26317db96d56Sopenharmony_ci+.. nonce: PFxGS4
26327db96d56Sopenharmony_ci+.. section: Core and Builtins
26337db96d56Sopenharmony_ci+
26347db96d56Sopenharmony_ci+Disallow the "z" format specifier in %-format of bytes objects.
26357db96d56Sopenharmony_ci+
26367db96d56Sopenharmony_ci+..
26377db96d56Sopenharmony_ci+
26387db96d56Sopenharmony_ci+.. date: 2023-04-28-18-57-13
26397db96d56Sopenharmony_ci+.. gh-issue: 103971
26407db96d56Sopenharmony_ci+.. nonce: Q3U9lv
26417db96d56Sopenharmony_ci+.. section: Core and Builtins
26427db96d56Sopenharmony_ci+
26437db96d56Sopenharmony_ci+Fix an issue where incorrect locations numbers could be assigned to code
26447db96d56Sopenharmony_ci+following ``case`` blocks.
26457db96d56Sopenharmony_ci+
26467db96d56Sopenharmony_ci+..
26477db96d56Sopenharmony_ci+
26487db96d56Sopenharmony_ci+.. date: 2023-04-21-17-03-14
26497db96d56Sopenharmony_ci+.. gh-issue: 102310
26507db96d56Sopenharmony_ci+.. nonce: anLjDx
26517db96d56Sopenharmony_ci+.. section: Core and Builtins
26527db96d56Sopenharmony_ci+
26537db96d56Sopenharmony_ci+Change the error range for invalid bytes literals.
26547db96d56Sopenharmony_ci+
26557db96d56Sopenharmony_ci+..
26567db96d56Sopenharmony_ci+
26577db96d56Sopenharmony_ci+.. date: 2023-04-21-16-12-41
26587db96d56Sopenharmony_ci+.. gh-issue: 103590
26597db96d56Sopenharmony_ci+.. nonce: 7DHDOE
26607db96d56Sopenharmony_ci+.. section: Core and Builtins
26617db96d56Sopenharmony_ci+
26627db96d56Sopenharmony_ci+Do not wrap a single exception raised from a ``try-except*`` construct in an
26637db96d56Sopenharmony_ci+:exc:`ExceptionGroup`.
26647db96d56Sopenharmony_ci+
26657db96d56Sopenharmony_ci+..
26667db96d56Sopenharmony_ci+
26677db96d56Sopenharmony_ci+.. date: 2023-04-14-22-35-23
26687db96d56Sopenharmony_ci+.. gh-issue: 101517
26697db96d56Sopenharmony_ci+.. nonce: 5EqM-S
26707db96d56Sopenharmony_ci+.. section: Core and Builtins
26717db96d56Sopenharmony_ci+
26727db96d56Sopenharmony_ci+Fix bug in line numbers of instructions emitted for :keyword:`except*
26737db96d56Sopenharmony_ci+<except_star>`.
26747db96d56Sopenharmony_ci+
26757db96d56Sopenharmony_ci+..
26767db96d56Sopenharmony_ci+
26777db96d56Sopenharmony_ci+.. date: 2023-04-08-17-13-07
26787db96d56Sopenharmony_ci+.. gh-issue: 103242
26797db96d56Sopenharmony_ci+.. nonce: ysI1b3
26807db96d56Sopenharmony_ci+.. section: Core and Builtins
26817db96d56Sopenharmony_ci+
26827db96d56Sopenharmony_ci+Migrate :meth:`~ssl.SSLContext.set_ecdh_curve` method not to use deprecated
26837db96d56Sopenharmony_ci+OpenSSL APIs. Patch by Dong-hee Na.
26847db96d56Sopenharmony_ci+
26857db96d56Sopenharmony_ci+..
26867db96d56Sopenharmony_ci+
26877db96d56Sopenharmony_ci+.. date: 2023-04-01-00-46-31
26887db96d56Sopenharmony_ci+.. gh-issue: 102700
26897db96d56Sopenharmony_ci+.. nonce: 493NB4
26907db96d56Sopenharmony_ci+.. section: Core and Builtins
26917db96d56Sopenharmony_ci+
26927db96d56Sopenharmony_ci+Allow built-in modules to be submodules. This allows submodules to be
26937db96d56Sopenharmony_ci+statically linked into a CPython binary.
26947db96d56Sopenharmony_ci+
26957db96d56Sopenharmony_ci+..
26967db96d56Sopenharmony_ci+
26977db96d56Sopenharmony_ci+.. date: 2023-02-12-22-40-22
26987db96d56Sopenharmony_ci+.. gh-issue: 101857
26997db96d56Sopenharmony_ci+.. nonce: _bribG
27007db96d56Sopenharmony_ci+.. section: Core and Builtins
27017db96d56Sopenharmony_ci+
27027db96d56Sopenharmony_ci+Fix xattr support detection on Linux systems by widening the check to linux,
27037db96d56Sopenharmony_ci+not just glibc. This fixes support for musl.
27047db96d56Sopenharmony_ci+
27057db96d56Sopenharmony_ci+..
27067db96d56Sopenharmony_ci+
27077db96d56Sopenharmony_ci+.. date: 2022-11-08-12-36-25
27087db96d56Sopenharmony_ci+.. gh-issue: 99184
27097db96d56Sopenharmony_ci+.. nonce: KIaqzz
27107db96d56Sopenharmony_ci+.. section: Core and Builtins
27117db96d56Sopenharmony_ci+
27127db96d56Sopenharmony_ci+Bypass instance attribute access of ``__name__`` in ``repr`` of
27137db96d56Sopenharmony_ci+:class:`weakref.ref`.
27147db96d56Sopenharmony_ci+
27157db96d56Sopenharmony_ci+..
27167db96d56Sopenharmony_ci+
27177db96d56Sopenharmony_ci+.. date: 2022-09-27-11-59-13
27187db96d56Sopenharmony_ci+.. gh-issue: 96670
27197db96d56Sopenharmony_ci+.. nonce: XrBBit
27207db96d56Sopenharmony_ci+.. section: Core and Builtins
27217db96d56Sopenharmony_ci+
27227db96d56Sopenharmony_ci+The parser now raises :exc:`SyntaxError` when parsing source code containing
27237db96d56Sopenharmony_ci+null bytes. Backported from ``aab01e3``. Patch by Pablo Galindo
27247db96d56Sopenharmony_ci+
27257db96d56Sopenharmony_ci+..
27267db96d56Sopenharmony_ci+
27277db96d56Sopenharmony_ci+.. bpo: 31821
27287db96d56Sopenharmony_ci+.. date: 2019-12-01-12-58-31
27297db96d56Sopenharmony_ci+.. nonce: 1FNmwk
27307db96d56Sopenharmony_ci+.. section: Core and Builtins
27317db96d56Sopenharmony_ci+
27327db96d56Sopenharmony_ci+Fix :func:`!pause_reading` to work when called from :func:`!connection_made`
27337db96d56Sopenharmony_ci+in :mod:`asyncio`.
27347db96d56Sopenharmony_ci+
27357db96d56Sopenharmony_ci+..
27367db96d56Sopenharmony_ci+
27377db96d56Sopenharmony_ci+.. date: 2023-06-02-02-38-26
27387db96d56Sopenharmony_ci+.. gh-issue: 105080
27397db96d56Sopenharmony_ci+.. nonce: 2imGMg
27407db96d56Sopenharmony_ci+.. section: Library
27417db96d56Sopenharmony_ci+
27427db96d56Sopenharmony_ci+Fixed inconsistent signature on derived classes for
27437db96d56Sopenharmony_ci+:func:`inspect.signature`
27447db96d56Sopenharmony_ci+
27457db96d56Sopenharmony_ci+..
27467db96d56Sopenharmony_ci+
27477db96d56Sopenharmony_ci+.. date: 2023-05-24-09-34-23
27487db96d56Sopenharmony_ci+.. gh-issue: 104874
27497db96d56Sopenharmony_ci+.. nonce: oqyJSy
27507db96d56Sopenharmony_ci+.. section: Library
27517db96d56Sopenharmony_ci+
27527db96d56Sopenharmony_ci+Document the ``__name__`` and ``__supertype__`` attributes of
27537db96d56Sopenharmony_ci+:class:`typing.NewType`. Patch by Jelle Zijlstra.
27547db96d56Sopenharmony_ci+
27557db96d56Sopenharmony_ci+..
27567db96d56Sopenharmony_ci+
27577db96d56Sopenharmony_ci+.. date: 2023-05-17-20-03-01
27587db96d56Sopenharmony_ci+.. gh-issue: 104340
27597db96d56Sopenharmony_ci+.. nonce: kp_XmX
27607db96d56Sopenharmony_ci+.. section: Library
27617db96d56Sopenharmony_ci+
27627db96d56Sopenharmony_ci+When an ``asyncio`` pipe protocol loses its connection due to an error, and
27637db96d56Sopenharmony_ci+the caller doesn't await ``wait_closed()`` on the corresponding
27647db96d56Sopenharmony_ci+``StreamWriter``, don't log a warning about an exception that was never
27657db96d56Sopenharmony_ci+retrieved. After all, according to the ``StreamWriter.close()`` docs, the
27667db96d56Sopenharmony_ci+``wait_closed()`` call is optional ("not mandatory").
27677db96d56Sopenharmony_ci+
27687db96d56Sopenharmony_ci+..
27697db96d56Sopenharmony_ci+
27707db96d56Sopenharmony_ci+.. date: 2023-05-17-08-01-36
27717db96d56Sopenharmony_ci+.. gh-issue: 104372
27727db96d56Sopenharmony_ci+.. nonce: jpoWs6
27737db96d56Sopenharmony_ci+.. section: Library
27747db96d56Sopenharmony_ci+
27757db96d56Sopenharmony_ci+Refactored the ``_posixsubprocess`` internals to avoid Python C API usage
27767db96d56Sopenharmony_ci+between fork and exec when marking ``pass_fds=`` file descriptors
27777db96d56Sopenharmony_ci+inheritable.
27787db96d56Sopenharmony_ci+
27797db96d56Sopenharmony_ci+..
27807db96d56Sopenharmony_ci+
27817db96d56Sopenharmony_ci+.. date: 2023-05-16-11-02-44
27827db96d56Sopenharmony_ci+.. gh-issue: 75367
27837db96d56Sopenharmony_ci+.. nonce: qLWR35
27847db96d56Sopenharmony_ci+.. section: Library
27857db96d56Sopenharmony_ci+
27867db96d56Sopenharmony_ci+Fix data descriptor detection in  :func:`inspect.getattr_static`.
27877db96d56Sopenharmony_ci+
27887db96d56Sopenharmony_ci+..
27897db96d56Sopenharmony_ci+
27907db96d56Sopenharmony_ci+.. date: 2023-05-16-10-07-16
27917db96d56Sopenharmony_ci+.. gh-issue: 104536
27927db96d56Sopenharmony_ci+.. nonce: hFWD8f
27937db96d56Sopenharmony_ci+.. section: Library
27947db96d56Sopenharmony_ci+
27957db96d56Sopenharmony_ci+Fix a race condition in the internal :mod:`multiprocessing.process` cleanup
27967db96d56Sopenharmony_ci+logic that could manifest as an unintended ``AttributeError`` when calling
27977db96d56Sopenharmony_ci+``process.close()``.
27987db96d56Sopenharmony_ci+
27997db96d56Sopenharmony_ci+..
28007db96d56Sopenharmony_ci+
28017db96d56Sopenharmony_ci+.. date: 2023-05-11-23-03-00
28027db96d56Sopenharmony_ci+.. gh-issue: 104399
28037db96d56Sopenharmony_ci+.. nonce: MMatTP
28047db96d56Sopenharmony_ci+.. section: Library
28057db96d56Sopenharmony_ci+
28067db96d56Sopenharmony_ci+Prepare the ``_tkinter`` module for building with Tcl 9.0 and future
28077db96d56Sopenharmony_ci+libtommath by replacing usage of deprecated functions
28087db96d56Sopenharmony_ci+:c:func:`mp_to_unsigned_bin_n` and :c:func:`mp_unsigned_bin_size` when
28097db96d56Sopenharmony_ci+necessary.
28107db96d56Sopenharmony_ci+
28117db96d56Sopenharmony_ci+..
28127db96d56Sopenharmony_ci+
28137db96d56Sopenharmony_ci+.. date: 2023-05-08-20-57-17
28147db96d56Sopenharmony_ci+.. gh-issue: 104307
28157db96d56Sopenharmony_ci+.. nonce: DSB93G
28167db96d56Sopenharmony_ci+.. section: Library
28177db96d56Sopenharmony_ci+
28187db96d56Sopenharmony_ci+:func:`socket.getnameinfo` now releases the GIL while contacting the DNS
28197db96d56Sopenharmony_ci+server
28207db96d56Sopenharmony_ci+
28217db96d56Sopenharmony_ci+..
28227db96d56Sopenharmony_ci+
28237db96d56Sopenharmony_ci+.. date: 2023-05-08-15-39-00
28247db96d56Sopenharmony_ci+.. gh-issue: 87695
28257db96d56Sopenharmony_ci+.. nonce: f6iO7v
28267db96d56Sopenharmony_ci+.. section: Library
28277db96d56Sopenharmony_ci+
28287db96d56Sopenharmony_ci+Fix issue where :meth:`pathlib.Path.glob` raised :exc:`OSError` when it
28297db96d56Sopenharmony_ci+encountered a symlink to an overly long path.
28307db96d56Sopenharmony_ci+
28317db96d56Sopenharmony_ci+..
28327db96d56Sopenharmony_ci+
28337db96d56Sopenharmony_ci+.. date: 2023-05-07-19-56-45
28347db96d56Sopenharmony_ci+.. gh-issue: 104265
28357db96d56Sopenharmony_ci+.. nonce: fVblry
28367db96d56Sopenharmony_ci+.. section: Library
28377db96d56Sopenharmony_ci+
28387db96d56Sopenharmony_ci+Prevent possible crash by disallowing instantiation of the
28397db96d56Sopenharmony_ci+:class:`!_csv.Reader` and :class:`!_csv.Writer` types. The regression was
28407db96d56Sopenharmony_ci+introduced in 3.10.0a4 with PR 23224 (:issue:`14935`). Patch by Radislav
28417db96d56Sopenharmony_ci+Chugunov.
28427db96d56Sopenharmony_ci+
28437db96d56Sopenharmony_ci+..
28447db96d56Sopenharmony_ci+
28457db96d56Sopenharmony_ci+.. date: 2023-05-01-16-43-28
28467db96d56Sopenharmony_ci+.. gh-issue: 104035
28477db96d56Sopenharmony_ci+.. nonce: MrJBw8
28487db96d56Sopenharmony_ci+.. section: Library
28497db96d56Sopenharmony_ci+
28507db96d56Sopenharmony_ci+Do not ignore user-defined ``__getstate__`` and ``__setstate__`` methods for
28517db96d56Sopenharmony_ci+slotted frozen dataclasses.
28527db96d56Sopenharmony_ci+
28537db96d56Sopenharmony_ci+..
28547db96d56Sopenharmony_ci+
28557db96d56Sopenharmony_ci+.. date: 2023-04-29-18-23-16
28567db96d56Sopenharmony_ci+.. gh-issue: 103987
28577db96d56Sopenharmony_ci+.. nonce: sRgALL
28587db96d56Sopenharmony_ci+.. section: Library
28597db96d56Sopenharmony_ci+
28607db96d56Sopenharmony_ci+In :mod:`mmap`, fix several bugs that could lead to access to memory-mapped
28617db96d56Sopenharmony_ci+files after they have been invalidated.
28627db96d56Sopenharmony_ci+
28637db96d56Sopenharmony_ci+..
28647db96d56Sopenharmony_ci+
28657db96d56Sopenharmony_ci+.. date: 2023-04-27-20-03-08
28667db96d56Sopenharmony_ci+.. gh-issue: 103935
28677db96d56Sopenharmony_ci+.. nonce: Uaf2M0
28687db96d56Sopenharmony_ci+.. section: Library
28697db96d56Sopenharmony_ci+
28707db96d56Sopenharmony_ci+Use :func:`io.open_code` for files to be executed instead of raw
28717db96d56Sopenharmony_ci+:func:`open`
28727db96d56Sopenharmony_ci+
28737db96d56Sopenharmony_ci+..
28747db96d56Sopenharmony_ci+
28757db96d56Sopenharmony_ci+.. date: 2023-04-27-00-45-41
28767db96d56Sopenharmony_ci+.. gh-issue: 100370
28777db96d56Sopenharmony_ci+.. nonce: MgZ3KY
28787db96d56Sopenharmony_ci+.. section: Library
28797db96d56Sopenharmony_ci+
28807db96d56Sopenharmony_ci+Fix potential :exc:`OverflowError` in :meth:`sqlite3.Connection.blobopen`
28817db96d56Sopenharmony_ci+for 32-bit builds. Patch by Erlend E. Aasland.
28827db96d56Sopenharmony_ci+
28837db96d56Sopenharmony_ci+..
28847db96d56Sopenharmony_ci+
28857db96d56Sopenharmony_ci+.. date: 2023-04-26-09-54-25
28867db96d56Sopenharmony_ci+.. gh-issue: 103848
28877db96d56Sopenharmony_ci+.. nonce: aDSnpR
28887db96d56Sopenharmony_ci+.. section: Library
28897db96d56Sopenharmony_ci+
28907db96d56Sopenharmony_ci+Add checks to ensure that ``[`` bracketed ``]`` hosts found by
28917db96d56Sopenharmony_ci+:func:`urllib.parse.urlsplit` are of IPv6 or IPvFuture format.
28927db96d56Sopenharmony_ci+
28937db96d56Sopenharmony_ci+..
28947db96d56Sopenharmony_ci+
28957db96d56Sopenharmony_ci+.. date: 2023-04-26-09-38-47
28967db96d56Sopenharmony_ci+.. gh-issue: 103872
28977db96d56Sopenharmony_ci+.. nonce: 8LBsDz
28987db96d56Sopenharmony_ci+.. section: Library
28997db96d56Sopenharmony_ci+
29007db96d56Sopenharmony_ci+Update the bundled copy of pip to version 23.1.2.
29017db96d56Sopenharmony_ci+
29027db96d56Sopenharmony_ci+..
29037db96d56Sopenharmony_ci+
29047db96d56Sopenharmony_ci+.. date: 2023-04-25-19-58-13
29057db96d56Sopenharmony_ci+.. gh-issue: 103861
29067db96d56Sopenharmony_ci+.. nonce: JeozgD
29077db96d56Sopenharmony_ci+.. section: Library
29087db96d56Sopenharmony_ci+
29097db96d56Sopenharmony_ci+Fix ``zipfile.Zipfile`` creating invalid zip files when ``force_zip64`` was
29107db96d56Sopenharmony_ci+used to add files to them. Patch by Carey Metcalfe.
29117db96d56Sopenharmony_ci+
29127db96d56Sopenharmony_ci+..
29137db96d56Sopenharmony_ci+
29147db96d56Sopenharmony_ci+.. date: 2023-04-24-00-34-23
29157db96d56Sopenharmony_ci+.. gh-issue: 103685
29167db96d56Sopenharmony_ci+.. nonce: U14jBM
29177db96d56Sopenharmony_ci+.. section: Library
29187db96d56Sopenharmony_ci+
29197db96d56Sopenharmony_ci+Prepare :meth:`tkinter.Menu.index` for Tk 8.7 so that it does not raise
29207db96d56Sopenharmony_ci+``TclError: expected integer but got ""`` when it should return ``None``.
29217db96d56Sopenharmony_ci+
29227db96d56Sopenharmony_ci+..
29237db96d56Sopenharmony_ci+
29247db96d56Sopenharmony_ci+.. date: 2023-04-22-22-14-09
29257db96d56Sopenharmony_ci+.. gh-issue: 81403
29267db96d56Sopenharmony_ci+.. nonce: zVz9Td
29277db96d56Sopenharmony_ci+.. section: Library
29287db96d56Sopenharmony_ci+
29297db96d56Sopenharmony_ci+:class:`urllib.request.CacheFTPHandler` no longer raises :class:`URLError`
29307db96d56Sopenharmony_ci+if a cached FTP instance is reused. ftplib's endtransfer method calls
29317db96d56Sopenharmony_ci+voidresp to drain the connection to handle FTP instance reuse properly.
29327db96d56Sopenharmony_ci+
29337db96d56Sopenharmony_ci+..
29347db96d56Sopenharmony_ci+
29357db96d56Sopenharmony_ci+.. date: 2023-04-16-18-29-04
29367db96d56Sopenharmony_ci+.. gh-issue: 103578
29377db96d56Sopenharmony_ci+.. nonce: fly1wc
29387db96d56Sopenharmony_ci+.. section: Library
29397db96d56Sopenharmony_ci+
29407db96d56Sopenharmony_ci+Fixed a bug where :mod:`pdb` crashes when reading source file with different
29417db96d56Sopenharmony_ci+encoding by replacing :func:`io.open` with :func:`io.open_code`. The new
29427db96d56Sopenharmony_ci+method would also call into the hook set by :func:`PyFile_SetOpenCodeHook`.
29437db96d56Sopenharmony_ci+
29447db96d56Sopenharmony_ci+..
29457db96d56Sopenharmony_ci+
29467db96d56Sopenharmony_ci+.. date: 2023-04-15-12-19-14
29477db96d56Sopenharmony_ci+.. gh-issue: 103556
29487db96d56Sopenharmony_ci+.. nonce: TEf-2m
29497db96d56Sopenharmony_ci+.. section: Library
29507db96d56Sopenharmony_ci+
29517db96d56Sopenharmony_ci+Now creating :class:`inspect.Signature` objects with positional-only
29527db96d56Sopenharmony_ci+parameter with a default followed by a positional-or-keyword parameter
29537db96d56Sopenharmony_ci+without one is impossible.
29547db96d56Sopenharmony_ci+
29557db96d56Sopenharmony_ci+..
29567db96d56Sopenharmony_ci+
29577db96d56Sopenharmony_ci+.. date: 2023-04-15-11-21-38
29587db96d56Sopenharmony_ci+.. gh-issue: 103559
29597db96d56Sopenharmony_ci+.. nonce: a9rYHG
29607db96d56Sopenharmony_ci+.. section: Library
29617db96d56Sopenharmony_ci+
29627db96d56Sopenharmony_ci+Update the bundled copy of pip to version 23.1.1.
29637db96d56Sopenharmony_ci+
29647db96d56Sopenharmony_ci+..
29657db96d56Sopenharmony_ci+
29667db96d56Sopenharmony_ci+.. date: 2023-04-12-17-59-55
29677db96d56Sopenharmony_ci+.. gh-issue: 103365
29687db96d56Sopenharmony_ci+.. nonce: UBEE0U
29697db96d56Sopenharmony_ci+.. section: Library
29707db96d56Sopenharmony_ci+
29717db96d56Sopenharmony_ci+Set default Flag boundary to ``STRICT`` and fix bitwise operations.
29727db96d56Sopenharmony_ci+
29737db96d56Sopenharmony_ci+..
29747db96d56Sopenharmony_ci+
29757db96d56Sopenharmony_ci+.. date: 2023-04-12-13-04-16
29767db96d56Sopenharmony_ci+.. gh-issue: 103472
29777db96d56Sopenharmony_ci+.. nonce: C6bOHv
29787db96d56Sopenharmony_ci+.. section: Library
29797db96d56Sopenharmony_ci+
29807db96d56Sopenharmony_ci+Avoid a potential :exc:`ResourceWarning` in
29817db96d56Sopenharmony_ci+:class:`http.client.HTTPConnection` by closing the proxy / tunnel's CONNECT
29827db96d56Sopenharmony_ci+response explicitly.
29837db96d56Sopenharmony_ci+
29847db96d56Sopenharmony_ci+..
29857db96d56Sopenharmony_ci+
29867db96d56Sopenharmony_ci+.. date: 2023-04-11-21-38-39
29877db96d56Sopenharmony_ci+.. gh-issue: 103449
29887db96d56Sopenharmony_ci+.. nonce: -nxmhb
29897db96d56Sopenharmony_ci+.. section: Library
29907db96d56Sopenharmony_ci+
29917db96d56Sopenharmony_ci+Fix a bug in doc string generation in :func:`dataclasses.dataclass`.
29927db96d56Sopenharmony_ci+
29937db96d56Sopenharmony_ci+..
29947db96d56Sopenharmony_ci+
29957db96d56Sopenharmony_ci+.. date: 2023-04-06-17-28-36
29967db96d56Sopenharmony_ci+.. gh-issue: 103256
29977db96d56Sopenharmony_ci+.. nonce: 1syxfs
29987db96d56Sopenharmony_ci+.. section: Library
29997db96d56Sopenharmony_ci+
30007db96d56Sopenharmony_ci+Fixed a bug that caused :mod:`hmac` to raise an exception when the requested
30017db96d56Sopenharmony_ci+hash algorithm was not available in OpenSSL despite being available
30027db96d56Sopenharmony_ci+separately as part of ``hashlib`` itself.  It now falls back properly to the
30037db96d56Sopenharmony_ci+built-in. This could happen when, for example, your OpenSSL does not include
30047db96d56Sopenharmony_ci+SHA3 support and you want to compute ``hmac.digest(b'K', b'M',
30057db96d56Sopenharmony_ci+'sha3_256')``.
30067db96d56Sopenharmony_ci+
30077db96d56Sopenharmony_ci+..
30087db96d56Sopenharmony_ci+
30097db96d56Sopenharmony_ci+.. date: 2023-04-05-01-28-53
30107db96d56Sopenharmony_ci+.. gh-issue: 103225
30117db96d56Sopenharmony_ci+.. nonce: QD3JVU
30127db96d56Sopenharmony_ci+.. section: Library
30137db96d56Sopenharmony_ci+
30147db96d56Sopenharmony_ci+Fix a bug in :mod:`pdb` when displaying line numbers of module-level source
30157db96d56Sopenharmony_ci+code.
30167db96d56Sopenharmony_ci+
30177db96d56Sopenharmony_ci+..
30187db96d56Sopenharmony_ci+
30197db96d56Sopenharmony_ci+.. date: 2023-04-04-12-43-38
30207db96d56Sopenharmony_ci+.. gh-issue: 93910
30217db96d56Sopenharmony_ci+.. nonce: jurMzv
30227db96d56Sopenharmony_ci+.. section: Library
30237db96d56Sopenharmony_ci+
30247db96d56Sopenharmony_ci+Remove deprecation of enum ``memmber.member`` access.
30257db96d56Sopenharmony_ci+
30267db96d56Sopenharmony_ci+..
30277db96d56Sopenharmony_ci+
30287db96d56Sopenharmony_ci+.. date: 2023-04-03-23-44-34
30297db96d56Sopenharmony_ci+.. gh-issue: 102978
30307db96d56Sopenharmony_ci+.. nonce: gy9eVk
30317db96d56Sopenharmony_ci+.. section: Library
30327db96d56Sopenharmony_ci+
30337db96d56Sopenharmony_ci+Fixes :func:`unittest.mock.patch` not enforcing function signatures for
30347db96d56Sopenharmony_ci+methods decorated with ``@classmethod`` or ``@staticmethod`` when patch is
30357db96d56Sopenharmony_ci+called with ``autospec=True``.
30367db96d56Sopenharmony_ci+
30377db96d56Sopenharmony_ci+..
30387db96d56Sopenharmony_ci+
30397db96d56Sopenharmony_ci+.. date: 2023-04-02-23-05-22
30407db96d56Sopenharmony_ci+.. gh-issue: 103204
30417db96d56Sopenharmony_ci+.. nonce: bbDmu0
30427db96d56Sopenharmony_ci+.. section: Library
30437db96d56Sopenharmony_ci+
30447db96d56Sopenharmony_ci+Fixes :mod:`http.server` accepting HTTP requests with HTTP version numbers
30457db96d56Sopenharmony_ci+preceded by '+', or '-', or with digit-separating '_' characters.  The
30467db96d56Sopenharmony_ci+length of the version numbers is also constrained.
30477db96d56Sopenharmony_ci+
30487db96d56Sopenharmony_ci+..
30497db96d56Sopenharmony_ci+
30507db96d56Sopenharmony_ci+.. date: 2023-03-23-15-24-38
30517db96d56Sopenharmony_ci+.. gh-issue: 102953
30527db96d56Sopenharmony_ci+.. nonce: YR4KaK
30537db96d56Sopenharmony_ci+.. section: Library
30547db96d56Sopenharmony_ci+
30557db96d56Sopenharmony_ci+The extraction methods in :mod:`tarfile`, and :func:`shutil.unpack_archive`,
30567db96d56Sopenharmony_ci+have a new a *filter* argument that allows limiting tar features than may be
30577db96d56Sopenharmony_ci+surprising or dangerous, such as creating files outside the destination
30587db96d56Sopenharmony_ci+directory. See :ref:`tarfile-extraction-filter` for details.
30597db96d56Sopenharmony_ci+
30607db96d56Sopenharmony_ci+..
30617db96d56Sopenharmony_ci+
30627db96d56Sopenharmony_ci+.. date: 2023-02-09-22-24-34
30637db96d56Sopenharmony_ci+.. gh-issue: 101640
30647db96d56Sopenharmony_ci+.. nonce: oFuEpB
30657db96d56Sopenharmony_ci+.. section: Library
30667db96d56Sopenharmony_ci+
30677db96d56Sopenharmony_ci+:class:`argparse.ArgumentParser` now catches errors when writing messages,
30687db96d56Sopenharmony_ci+such as when :data:`sys.stderr` is ``None``. Patch by Oleg Iarygin.
30697db96d56Sopenharmony_ci+
30707db96d56Sopenharmony_ci+..
30717db96d56Sopenharmony_ci+
30727db96d56Sopenharmony_ci+.. date: 2022-09-07-09-32-07
30737db96d56Sopenharmony_ci+.. gh-issue: 96522
30747db96d56Sopenharmony_ci+.. nonce: t73oqp
30757db96d56Sopenharmony_ci+.. section: Library
30767db96d56Sopenharmony_ci+
30777db96d56Sopenharmony_ci+Fix potential deadlock in pty.spawn()
30787db96d56Sopenharmony_ci+
30797db96d56Sopenharmony_ci+..
30807db96d56Sopenharmony_ci+
30817db96d56Sopenharmony_ci+.. date: 2022-08-27-21-41-41
30827db96d56Sopenharmony_ci+.. gh-issue: 87474
30837db96d56Sopenharmony_ci+.. nonce: 9X-kxt
30847db96d56Sopenharmony_ci+.. section: Library
30857db96d56Sopenharmony_ci+
30867db96d56Sopenharmony_ci+Fix potential file descriptor leaks in :class:`subprocess.Popen`.
30877db96d56Sopenharmony_ci+
30887db96d56Sopenharmony_ci+..
30897db96d56Sopenharmony_ci+
30907db96d56Sopenharmony_ci+.. date: 2023-05-28-21-01-00
30917db96d56Sopenharmony_ci+.. gh-issue: 89455
30927db96d56Sopenharmony_ci+.. nonce: qAKRrA
30937db96d56Sopenharmony_ci+.. section: Documentation
30947db96d56Sopenharmony_ci+
30957db96d56Sopenharmony_ci+Add missing documentation for the ``max_group_depth`` and
30967db96d56Sopenharmony_ci+``max_group_width`` parameters and the ``exceptions`` attribute of the
30977db96d56Sopenharmony_ci+:class:`traceback.TracebackException` class.
30987db96d56Sopenharmony_ci+
30997db96d56Sopenharmony_ci+..
31007db96d56Sopenharmony_ci+
31017db96d56Sopenharmony_ci+.. date: 2023-05-28-19-08-42
31027db96d56Sopenharmony_ci+.. gh-issue: 89412
31037db96d56Sopenharmony_ci+.. nonce: j4cg7K
31047db96d56Sopenharmony_ci+.. section: Documentation
31057db96d56Sopenharmony_ci+
31067db96d56Sopenharmony_ci+Add missing documentation for the ``end_lineno`` and ``end_offset``
31077db96d56Sopenharmony_ci+attributes of the :class:`traceback.TracebackException` class.
31087db96d56Sopenharmony_ci+
31097db96d56Sopenharmony_ci+..
31107db96d56Sopenharmony_ci+
31117db96d56Sopenharmony_ci+.. date: 2023-05-25-22-34-31
31127db96d56Sopenharmony_ci+.. gh-issue: 104943
31137db96d56Sopenharmony_ci+.. nonce: J2v1Pc
31147db96d56Sopenharmony_ci+.. section: Documentation
31157db96d56Sopenharmony_ci+
31167db96d56Sopenharmony_ci+Remove mentions of old Python versions in :class:`typing.NamedTuple`.
31177db96d56Sopenharmony_ci+
31187db96d56Sopenharmony_ci+..
31197db96d56Sopenharmony_ci+
31207db96d56Sopenharmony_ci+.. date: 2023-05-14-12-11-28
31217db96d56Sopenharmony_ci+.. gh-issue: 67056
31227db96d56Sopenharmony_ci+.. nonce: nVC2Rf
31237db96d56Sopenharmony_ci+.. section: Documentation
31247db96d56Sopenharmony_ci+
31257db96d56Sopenharmony_ci+Document that the effect of registering or unregistering an :mod:`atexit`
31267db96d56Sopenharmony_ci+cleanup function from within a registered cleanup function is undefined.
31277db96d56Sopenharmony_ci+
31287db96d56Sopenharmony_ci+..
31297db96d56Sopenharmony_ci+
31307db96d56Sopenharmony_ci+.. date: 2023-04-25-22-58-08
31317db96d56Sopenharmony_ci+.. gh-issue: 48241
31327db96d56Sopenharmony_ci+.. nonce: l1Gxxh
31337db96d56Sopenharmony_ci+.. section: Documentation
31347db96d56Sopenharmony_ci+
31357db96d56Sopenharmony_ci+Clarifying documentation about the url parameter to urllib.request.urlopen
31367db96d56Sopenharmony_ci+and urllib.request.Requst needing to be encoded properly.
31377db96d56Sopenharmony_ci+
31387db96d56Sopenharmony_ci+..
31397db96d56Sopenharmony_ci+
31407db96d56Sopenharmony_ci+.. date: 2023-05-15-02-22-44
31417db96d56Sopenharmony_ci+.. gh-issue: 104494
31427db96d56Sopenharmony_ci+.. nonce: Bkrbfn
31437db96d56Sopenharmony_ci+.. section: Tests
31447db96d56Sopenharmony_ci+
31457db96d56Sopenharmony_ci+Update ``test_pack_configure_in`` and ``test_place_configure_in`` for
31467db96d56Sopenharmony_ci+changes to error message formatting in Tk 8.7.
31477db96d56Sopenharmony_ci+
31487db96d56Sopenharmony_ci+..
31497db96d56Sopenharmony_ci+
31507db96d56Sopenharmony_ci+.. date: 2023-05-14-03-00-00
31517db96d56Sopenharmony_ci+.. gh-issue: 104461
31527db96d56Sopenharmony_ci+.. nonce: Rmex11
31537db96d56Sopenharmony_ci+.. section: Tests
31547db96d56Sopenharmony_ci+
31557db96d56Sopenharmony_ci+Run test_configure_screen on X11 only, since the ``DISPLAY`` environment
31567db96d56Sopenharmony_ci+variable and ``-screen`` option for toplevels are not useful on Tk for Win32
31577db96d56Sopenharmony_ci+or Aqua.
31587db96d56Sopenharmony_ci+
31597db96d56Sopenharmony_ci+..
31607db96d56Sopenharmony_ci+
31617db96d56Sopenharmony_ci+.. date: 2023-04-08-00-50-23
31627db96d56Sopenharmony_ci+.. gh-issue: 103329
31637db96d56Sopenharmony_ci+.. nonce: M38tqF
31647db96d56Sopenharmony_ci+.. section: Tests
31657db96d56Sopenharmony_ci+
31667db96d56Sopenharmony_ci+Regression tests for the behaviour of ``unittest.mock.PropertyMock`` were
31677db96d56Sopenharmony_ci+added.
31687db96d56Sopenharmony_ci+
31697db96d56Sopenharmony_ci+..
31707db96d56Sopenharmony_ci+
31717db96d56Sopenharmony_ci+.. date: 2023-02-11-22-36-10
31727db96d56Sopenharmony_ci+.. gh-issue: 85984
31737db96d56Sopenharmony_ci+.. nonce: EVXjT9
31747db96d56Sopenharmony_ci+.. section: Tests
31757db96d56Sopenharmony_ci+
31767db96d56Sopenharmony_ci+Utilize new "winsize" functions from termios in pty tests.
31777db96d56Sopenharmony_ci+
31787db96d56Sopenharmony_ci+..
31797db96d56Sopenharmony_ci+
31807db96d56Sopenharmony_ci+.. date: 2022-11-06-18-42-38
31817db96d56Sopenharmony_ci+.. gh-issue: 75729
31827db96d56Sopenharmony_ci+.. nonce: uGYJrv
31837db96d56Sopenharmony_ci+.. section: Tests
31847db96d56Sopenharmony_ci+
31857db96d56Sopenharmony_ci+Fix the :func:`os.spawn* <os.spawnl>` tests failing on Windows when the
31867db96d56Sopenharmony_ci+working directory or interpreter path contains spaces.
31877db96d56Sopenharmony_ci+
31887db96d56Sopenharmony_ci+..
31897db96d56Sopenharmony_ci+
31907db96d56Sopenharmony_ci+.. date: 2023-06-06-09-08-10
31917db96d56Sopenharmony_ci+.. gh-issue: 90005
31927db96d56Sopenharmony_ci+.. nonce: 8mmeJQ
31937db96d56Sopenharmony_ci+.. section: Build
31947db96d56Sopenharmony_ci+
31957db96d56Sopenharmony_ci+Fix a regression in :file:`configure` where we could end up unintentionally
31967db96d56Sopenharmony_ci+linking with ``libbsd``.
31977db96d56Sopenharmony_ci+
31987db96d56Sopenharmony_ci+..
31997db96d56Sopenharmony_ci+
32007db96d56Sopenharmony_ci+.. date: 2023-05-04-10-56-14
32017db96d56Sopenharmony_ci+.. gh-issue: 104106
32027db96d56Sopenharmony_ci+.. nonce: -W9BJS
32037db96d56Sopenharmony_ci+.. section: Build
32047db96d56Sopenharmony_ci+
32057db96d56Sopenharmony_ci+Add gcc fallback of mkfifoat/mknodat for macOS. Patch by Dong-hee Na.
32067db96d56Sopenharmony_ci+
32077db96d56Sopenharmony_ci+..
32087db96d56Sopenharmony_ci+
32097db96d56Sopenharmony_ci+.. date: 2023-02-11-05-31-05
32107db96d56Sopenharmony_ci+.. gh-issue: 99069
32117db96d56Sopenharmony_ci+.. nonce: X4LDvY
32127db96d56Sopenharmony_ci+.. section: Build
32137db96d56Sopenharmony_ci+
32147db96d56Sopenharmony_ci+Extended workaround defining ``static_assert`` when missing from the libc
32157db96d56Sopenharmony_ci+headers to all clang and gcc builds. In particular, this fixes building on
32167db96d56Sopenharmony_ci+macOS <= 10.10.
32177db96d56Sopenharmony_ci+
32187db96d56Sopenharmony_ci+..
32197db96d56Sopenharmony_ci+
32207db96d56Sopenharmony_ci+.. date: 2023-05-31-16-14-31
32217db96d56Sopenharmony_ci+.. gh-issue: 105146
32227db96d56Sopenharmony_ci+.. nonce: gNjqq8
32237db96d56Sopenharmony_ci+.. section: Windows
32247db96d56Sopenharmony_ci+
32257db96d56Sopenharmony_ci+Updated the links at the end of the installer to point to Discourse rather
32267db96d56Sopenharmony_ci+than the mailing lists.
32277db96d56Sopenharmony_ci+
32287db96d56Sopenharmony_ci+..
32297db96d56Sopenharmony_ci+
32307db96d56Sopenharmony_ci+.. date: 2023-05-18-22-46-03
32317db96d56Sopenharmony_ci+.. gh-issue: 104623
32327db96d56Sopenharmony_ci+.. nonce: HJZhm1
32337db96d56Sopenharmony_ci+.. section: Windows
32347db96d56Sopenharmony_ci+
32357db96d56Sopenharmony_ci+Update Windows installer to use SQLite 3.42.0.
32367db96d56Sopenharmony_ci+
32377db96d56Sopenharmony_ci+..
32387db96d56Sopenharmony_ci+
32397db96d56Sopenharmony_ci+.. date: 2023-03-24-11-25-28
32407db96d56Sopenharmony_ci+.. gh-issue: 102997
32417db96d56Sopenharmony_ci+.. nonce: dredy2
32427db96d56Sopenharmony_ci+.. section: Windows
32437db96d56Sopenharmony_ci+
32447db96d56Sopenharmony_ci+Update Windows installer to use SQLite 3.41.2.
32457db96d56Sopenharmony_ci+
32467db96d56Sopenharmony_ci+..
32477db96d56Sopenharmony_ci+
32487db96d56Sopenharmony_ci+.. date: 2023-03-18-21-38-00
32497db96d56Sopenharmony_ci+.. gh-issue: 88013
32507db96d56Sopenharmony_ci+.. nonce: Z3loxC
32517db96d56Sopenharmony_ci+.. section: Windows
32527db96d56Sopenharmony_ci+
32537db96d56Sopenharmony_ci+Fixed a bug where :exc:`TypeError` was raised when calling
32547db96d56Sopenharmony_ci+:func:`ntpath.realpath` with a bytes parameter in some cases.
32557db96d56Sopenharmony_ci+
32567db96d56Sopenharmony_ci+..
32577db96d56Sopenharmony_ci+
32587db96d56Sopenharmony_ci+.. date: 2023-05-30-23-30-46
32597db96d56Sopenharmony_ci+.. gh-issue: 103142
32607db96d56Sopenharmony_ci+.. nonce: 55lMXQ
32617db96d56Sopenharmony_ci+.. section: macOS
32627db96d56Sopenharmony_ci+
32637db96d56Sopenharmony_ci+Update macOS installer to use OpenSSL 1.1.1u.
32647db96d56Sopenharmony_ci+
32657db96d56Sopenharmony_ci+..
32667db96d56Sopenharmony_ci+
32677db96d56Sopenharmony_ci+.. date: 2023-05-18-22-31-49
32687db96d56Sopenharmony_ci+.. gh-issue: 104623
32697db96d56Sopenharmony_ci+.. nonce: 6h7Xfx
32707db96d56Sopenharmony_ci+.. section: macOS
32717db96d56Sopenharmony_ci+
32727db96d56Sopenharmony_ci+Update macOS installer to SQLite 3.42.0.
32737db96d56Sopenharmony_ci+
32747db96d56Sopenharmony_ci+..
32757db96d56Sopenharmony_ci+
32767db96d56Sopenharmony_ci+.. date: 2023-03-24-11-20-47
32777db96d56Sopenharmony_ci+.. gh-issue: 102997
32787db96d56Sopenharmony_ci+.. nonce: ZgQkbq
32797db96d56Sopenharmony_ci+.. section: macOS
32807db96d56Sopenharmony_ci+
32817db96d56Sopenharmony_ci+Update macOS installer to SQLite 3.41.2.
32827db96d56Sopenharmony_ci+
32837db96d56Sopenharmony_ci+..
32847db96d56Sopenharmony_ci+
32857db96d56Sopenharmony_ci+.. date: 2023-05-23-17-19-49
32867db96d56Sopenharmony_ci+.. gh-issue: 104719
32877db96d56Sopenharmony_ci+.. nonce: rvYXH-
32887db96d56Sopenharmony_ci+.. section: IDLE
32897db96d56Sopenharmony_ci+
32907db96d56Sopenharmony_ci+Remove IDLE's modification of tokenize.tabsize and test other uses of
32917db96d56Sopenharmony_ci+tokenize data and methods.
32927db96d56Sopenharmony_ci+
32937db96d56Sopenharmony_ci+..
32947db96d56Sopenharmony_ci+
32957db96d56Sopenharmony_ci+.. date: 2023-05-17-17-32-21
32967db96d56Sopenharmony_ci+.. gh-issue: 104499
32977db96d56Sopenharmony_ci+.. nonce: hNeqV4
32987db96d56Sopenharmony_ci+.. section: IDLE
32997db96d56Sopenharmony_ci+
33007db96d56Sopenharmony_ci+Fix completions for Tk Aqua 8.7 (currently blank).
33017db96d56Sopenharmony_ci+
33027db96d56Sopenharmony_ci+..
33037db96d56Sopenharmony_ci+
33047db96d56Sopenharmony_ci+.. date: 2023-05-17-15-11-11
33057db96d56Sopenharmony_ci+.. gh-issue: 104496
33067db96d56Sopenharmony_ci+.. nonce: wjav-y
33077db96d56Sopenharmony_ci+.. section: IDLE
33087db96d56Sopenharmony_ci+
33097db96d56Sopenharmony_ci+About prints both tcl and tk versions if different (expected someday).
33107db96d56Sopenharmony_ci+
33117db96d56Sopenharmony_ci+..
33127db96d56Sopenharmony_ci+
33137db96d56Sopenharmony_ci+.. date: 2023-04-30-20-01-18
33147db96d56Sopenharmony_ci+.. gh-issue: 88496
33157db96d56Sopenharmony_ci+.. nonce: y65vUb
33167db96d56Sopenharmony_ci+.. section: IDLE
33177db96d56Sopenharmony_ci+
33187db96d56Sopenharmony_ci+Fix IDLE test hang on macOS.
33197db96d56Sopenharmony_cidiff --git a/Misc/config_mingw b/Misc/config_mingw
33207db96d56Sopenharmony_cinew file mode 100755
33217db96d56Sopenharmony_ciindex 0000000..9be43fd
33227db96d56Sopenharmony_ci--- /dev/null
33237db96d56Sopenharmony_ci+++ b/Misc/config_mingw
33247db96d56Sopenharmony_ci@@ -0,0 +1,15 @@
33257db96d56Sopenharmony_ci+# configure defaults for mingw* hosts
33267db96d56Sopenharmony_ci+
33277db96d56Sopenharmony_ci+# mingw functions to ignore
33287db96d56Sopenharmony_ci+ac_cv_func_ftruncate=ignore	# implement it as _chsize
33297db96d56Sopenharmony_ci+
33307db96d56Sopenharmony_ci+# mingw-w64 functions to ignore
33317db96d56Sopenharmony_ci+ac_cv_func_truncate=ignore
33327db96d56Sopenharmony_ci+ac_cv_func_alarm=ignore
33337db96d56Sopenharmony_ci+
33347db96d56Sopenharmony_ci+# files to ignore
33357db96d56Sopenharmony_ci+ac_cv_file__dev_ptmx=ignore #NOTE: under MSYS environment device exist
33367db96d56Sopenharmony_ci+ac_cv_file__dev_ptc=no
33377db96d56Sopenharmony_ci+
33387db96d56Sopenharmony_ci+# force detection of winsock2 functionality - require wxp or newer
33397db96d56Sopenharmony_ci+ac_cv_func_getpeername=yes
33407db96d56Sopenharmony_cidiff --git a/Misc/cross_mingw32 b/Misc/cross_mingw32
33417db96d56Sopenharmony_cinew file mode 100755
33427db96d56Sopenharmony_ciindex 0000000..03fde9e
33437db96d56Sopenharmony_ci--- /dev/null
33447db96d56Sopenharmony_ci+++ b/Misc/cross_mingw32
33457db96d56Sopenharmony_ci@@ -0,0 +1,11 @@
33467db96d56Sopenharmony_ci+# configure defaults for mingw32 host if cross-build
33477db96d56Sopenharmony_ci+
33487db96d56Sopenharmony_ci+ac_cv_little_endian_double=yes
33497db96d56Sopenharmony_ci+ac_cv_big_endian_double=no
33507db96d56Sopenharmony_ci+ac_cv_mixed_endian_double=no
33517db96d56Sopenharmony_ci+
33527db96d56Sopenharmony_ci+ac_cv_tanh_preserves_zero_sign=yes
33537db96d56Sopenharmony_ci+
33547db96d56Sopenharmony_ci+ac_cv_wchar_t_signed=no
33557db96d56Sopenharmony_ci+
33567db96d56Sopenharmony_ci+ac_cv_have_size_t_format=no
33577db96d56Sopenharmony_cidiff --git a/Misc/python-config.sh.in b/Misc/python-config.sh.in
33587db96d56Sopenharmony_ciindex 2602fe2..e0e048a 100644
33597db96d56Sopenharmony_ci--- a/Misc/python-config.sh.in
33607db96d56Sopenharmony_ci+++ b/Misc/python-config.sh.in
33617db96d56Sopenharmony_ci@@ -1,32 +1,44 @@
33627db96d56Sopenharmony_ci #!/bin/sh
33637db96d56Sopenharmony_ci 
33647db96d56Sopenharmony_ci-# Keep this script in sync with python-config.in
33657db96d56Sopenharmony_ci-
33667db96d56Sopenharmony_ci exit_with_usage ()
33677db96d56Sopenharmony_ci {
33687db96d56Sopenharmony_ci     echo "Usage: $0 --prefix|--exec-prefix|--includes|--libs|--cflags|--ldflags|--extension-suffix|--help|--abiflags|--configdir|--embed"
33697db96d56Sopenharmony_ci-    exit $1
33707db96d56Sopenharmony_ci+    exit 1
33717db96d56Sopenharmony_ci }
33727db96d56Sopenharmony_ci 
33737db96d56Sopenharmony_ci+# Really, python-config.py (and thus .sh) should be called directly, but
33747db96d56Sopenharmony_ci+# sometimes software (e.g. GDB) calls python-config.sh as if it were the
33757db96d56Sopenharmony_ci+# Python executable, passing python-config.py as the first argument.
33767db96d56Sopenharmony_ci+# Work around that oddness by ignoring any .py passed as first arg.
33777db96d56Sopenharmony_ci+case "$1" in
33787db96d56Sopenharmony_ci+    *.py)
33797db96d56Sopenharmony_ci+        shift
33807db96d56Sopenharmony_ci+    ;;
33817db96d56Sopenharmony_ci+esac
33827db96d56Sopenharmony_ci+
33837db96d56Sopenharmony_ci if [ "$1" = "" ] ; then
33847db96d56Sopenharmony_ci-    exit_with_usage 1
33857db96d56Sopenharmony_ci+    exit_with_usage
33867db96d56Sopenharmony_ci fi
33877db96d56Sopenharmony_ci 
33887db96d56Sopenharmony_ci # Returns the actual prefix where this script was installed to.
33897db96d56Sopenharmony_ci installed_prefix ()
33907db96d56Sopenharmony_ci {
33917db96d56Sopenharmony_ci-    RESULT=$(dirname $(cd $(dirname "$1") && pwd -P))
33927db96d56Sopenharmony_ci-    if which readlink >/dev/null 2>&1 ; then
33937db96d56Sopenharmony_ci-        if readlink -f "$RESULT" >/dev/null 2>&1; then
33947db96d56Sopenharmony_ci-          RESULT=$(readlink -f "$RESULT")
33957db96d56Sopenharmony_ci-        fi
33967db96d56Sopenharmony_ci+    local RESULT=$(dirname $(cd $(dirname "$1") && pwd -P))
33977db96d56Sopenharmony_ci+    if [ $(which readlink) ] ; then
33987db96d56Sopenharmony_ci+        RESULT=$(readlink -f "$RESULT")
33997db96d56Sopenharmony_ci+    fi
34007db96d56Sopenharmony_ci+    # Since we don't know where the output from this script will end up
34017db96d56Sopenharmony_ci+    # we keep all paths in Windows-land since MSYS2 can handle that
34027db96d56Sopenharmony_ci+    # while native tools can't handle paths in MSYS2-land.
34037db96d56Sopenharmony_ci+    if [ "$OSTYPE" = "msys" ]; then
34047db96d56Sopenharmony_ci+        RESULT=$(cd "$RESULT" && pwd -W)
34057db96d56Sopenharmony_ci     fi
34067db96d56Sopenharmony_ci     echo $RESULT
34077db96d56Sopenharmony_ci }
34087db96d56Sopenharmony_ci 
34097db96d56Sopenharmony_ci prefix_real=$(installed_prefix "$0")
34107db96d56Sopenharmony_ci 
34117db96d56Sopenharmony_ci-# Use sed to fix paths from their built-to locations to their installed-to
34127db96d56Sopenharmony_ci+# Use sed to fix paths from their built-to locations to their installed to
34137db96d56Sopenharmony_ci # locations. Keep prefix & exec_prefix using their original values in case
34147db96d56Sopenharmony_ci # they are referenced in other configure variables, to prevent double
34157db96d56Sopenharmony_ci # substitution, issue #22140.
34167db96d56Sopenharmony_ci@@ -41,13 +53,17 @@ LIBM="@LIBM@"
34177db96d56Sopenharmony_ci LIBC="@LIBC@"
34187db96d56Sopenharmony_ci SYSLIBS="$LIBM $LIBC"
34197db96d56Sopenharmony_ci ABIFLAGS="@ABIFLAGS@"
34207db96d56Sopenharmony_ci+# Protect against lack of substitution.
34217db96d56Sopenharmony_ci+if [ "$ABIFLAGS" = "@""ABIFLAGS""@" ] ; then
34227db96d56Sopenharmony_ci+    ABIFLAGS=
34237db96d56Sopenharmony_ci+fi
34247db96d56Sopenharmony_ci LIBS="@LIBPYTHON@ @LIBS@ $SYSLIBS"
34257db96d56Sopenharmony_ci LIBS_EMBED="-lpython${VERSION}${ABIFLAGS} @LIBS@ $SYSLIBS"
34267db96d56Sopenharmony_ci BASECFLAGS="@BASECFLAGS@"
34277db96d56Sopenharmony_ci-LDLIBRARY="@LDLIBRARY@"
34287db96d56Sopenharmony_ci OPT="@OPT@"
34297db96d56Sopenharmony_ci PY_ENABLE_SHARED="@PY_ENABLE_SHARED@"
34307db96d56Sopenharmony_ci LDVERSION="@LDVERSION@"
34317db96d56Sopenharmony_ci+LDLIBRARY="@LDLIBRARY@"
34327db96d56Sopenharmony_ci LIBDEST=${prefix_real}/lib/python${VERSION}
34337db96d56Sopenharmony_ci LIBPL=$(echo "@LIBPL@" | sed "s#$prefix#$prefix_real#")
34347db96d56Sopenharmony_ci SO="@EXT_SUFFIX@"
34357db96d56Sopenharmony_ci@@ -61,7 +77,7 @@ for ARG in $*
34367db96d56Sopenharmony_ci do
34377db96d56Sopenharmony_ci     case $ARG in
34387db96d56Sopenharmony_ci         --help)
34397db96d56Sopenharmony_ci-            exit_with_usage 0
34407db96d56Sopenharmony_ci+            exit_with_usage
34417db96d56Sopenharmony_ci         ;;
34427db96d56Sopenharmony_ci         --embed)
34437db96d56Sopenharmony_ci             PY_EMBED=1
34447db96d56Sopenharmony_ci@@ -69,7 +85,7 @@ do
34457db96d56Sopenharmony_ci         --prefix|--exec-prefix|--includes|--libs|--cflags|--ldflags|--extension-suffix|--abiflags|--configdir)
34467db96d56Sopenharmony_ci         ;;
34477db96d56Sopenharmony_ci         *)
34487db96d56Sopenharmony_ci-            exit_with_usage 1
34497db96d56Sopenharmony_ci+            exit_with_usage
34507db96d56Sopenharmony_ci         ;;
34517db96d56Sopenharmony_ci     esac
34527db96d56Sopenharmony_ci done
34537db96d56Sopenharmony_ci@@ -80,37 +96,37 @@ fi
34547db96d56Sopenharmony_ci 
34557db96d56Sopenharmony_ci for ARG in "$@"
34567db96d56Sopenharmony_ci do
34577db96d56Sopenharmony_ci-    case "$ARG" in
34587db96d56Sopenharmony_ci+    case $ARG in
34597db96d56Sopenharmony_ci         --prefix)
34607db96d56Sopenharmony_ci-            echo "$prefix_real"
34617db96d56Sopenharmony_ci+            echo -ne "$prefix_real"
34627db96d56Sopenharmony_ci         ;;
34637db96d56Sopenharmony_ci         --exec-prefix)
34647db96d56Sopenharmony_ci-            echo "$exec_prefix_real"
34657db96d56Sopenharmony_ci+            echo -ne "$exec_prefix_real "
34667db96d56Sopenharmony_ci         ;;
34677db96d56Sopenharmony_ci         --includes)
34687db96d56Sopenharmony_ci-            echo "$INCDIR $PLATINCDIR"
34697db96d56Sopenharmony_ci+            echo -ne "$INCDIR $PLATINCDIR"
34707db96d56Sopenharmony_ci         ;;
34717db96d56Sopenharmony_ci         --cflags)
34727db96d56Sopenharmony_ci-            echo "$INCDIR $PLATINCDIR $BASECFLAGS $CFLAGS $OPT"
34737db96d56Sopenharmony_ci+            echo -ne "$INCDIR $PLATINCDIR $BASECFLAGS $CFLAGS $OPT"
34747db96d56Sopenharmony_ci         ;;
34757db96d56Sopenharmony_ci         --libs)
34767db96d56Sopenharmony_ci-            echo "$LIBS"
34777db96d56Sopenharmony_ci+            echo -ne "$LIBS"
34787db96d56Sopenharmony_ci         ;;
34797db96d56Sopenharmony_ci         --ldflags)
34807db96d56Sopenharmony_ci             LIBPLUSED=
34817db96d56Sopenharmony_ci             if [ "$PY_ENABLE_SHARED" = "0" ] ; then
34827db96d56Sopenharmony_ci                 LIBPLUSED="-L$LIBPL"
34837db96d56Sopenharmony_ci             fi
34847db96d56Sopenharmony_ci-            echo "$LIBPLUSED -L$libdir $LIBS"
34857db96d56Sopenharmony_ci+            echo -ne "$LIBPLUSED -L$libdir $LIBS "
34867db96d56Sopenharmony_ci         ;;
34877db96d56Sopenharmony_ci         --extension-suffix)
34887db96d56Sopenharmony_ci-            echo "$SO"
34897db96d56Sopenharmony_ci+            echo -ne "$SO "
34907db96d56Sopenharmony_ci         ;;
34917db96d56Sopenharmony_ci         --abiflags)
34927db96d56Sopenharmony_ci-            echo "$ABIFLAGS"
34937db96d56Sopenharmony_ci+            echo -ne "$ABIFLAGS "
34947db96d56Sopenharmony_ci         ;;
34957db96d56Sopenharmony_ci         --configdir)
34967db96d56Sopenharmony_ci-            echo "$LIBPL"
34977db96d56Sopenharmony_ci+            echo -ne "$LIBPL "
34987db96d56Sopenharmony_ci         ;;
34997db96d56Sopenharmony_ci esac
35007db96d56Sopenharmony_ci done
35017db96d56Sopenharmony_cidiff --git a/Misc/python.pc.in b/Misc/python.pc.in
35027db96d56Sopenharmony_ciindex 87e04de..3900190 100644
35037db96d56Sopenharmony_ci--- a/Misc/python.pc.in
35047db96d56Sopenharmony_ci+++ b/Misc/python.pc.in
35057db96d56Sopenharmony_ci@@ -9,5 +9,5 @@ Description: Build a C extension for Python
35067db96d56Sopenharmony_ci Requires:
35077db96d56Sopenharmony_ci Version: @VERSION@
35087db96d56Sopenharmony_ci Libs.private: @LIBS@
35097db96d56Sopenharmony_ci-Libs:
35107db96d56Sopenharmony_ci+Libs: -L${libdir} -lpython@VERSION@@ABIFLAGS@
35117db96d56Sopenharmony_ci Cflags: -I${includedir}/python@VERSION@@ABIFLAGS@
35127db96d56Sopenharmony_cidiff --git a/Modules/Setup.bootstrap.in b/Modules/Setup.bootstrap.in
35137db96d56Sopenharmony_ciindex e3e9b96..6986290 100644
35147db96d56Sopenharmony_ci--- a/Modules/Setup.bootstrap.in
35157db96d56Sopenharmony_ci+++ b/Modules/Setup.bootstrap.in
35167db96d56Sopenharmony_ci@@ -8,15 +8,15 @@
35177db96d56Sopenharmony_ci # module C APIs are used in core
35187db96d56Sopenharmony_ci atexit atexitmodule.c
35197db96d56Sopenharmony_ci faulthandler faulthandler.c
35207db96d56Sopenharmony_ci-posix posixmodule.c
35217db96d56Sopenharmony_ci-_signal signalmodule.c
35227db96d56Sopenharmony_ci+@INITSYS@ posixmodule.c
35237db96d56Sopenharmony_ci+_signal signalmodule.c -lws2_32
35247db96d56Sopenharmony_ci _tracemalloc _tracemalloc.c
35257db96d56Sopenharmony_ci 
35267db96d56Sopenharmony_ci # modules used by importlib, deepfreeze, freeze, runpy, and sysconfig
35277db96d56Sopenharmony_ci _codecs _codecsmodule.c
35287db96d56Sopenharmony_ci _collections _collectionsmodule.c
35297db96d56Sopenharmony_ci errno errnomodule.c
35307db96d56Sopenharmony_ci-_io _io/_iomodule.c _io/iobase.c _io/fileio.c _io/bytesio.c _io/bufferedio.c _io/textio.c _io/stringio.c
35317db96d56Sopenharmony_ci+_io _io/_iomodule.c _io/iobase.c _io/fileio.c _io/bytesio.c _io/bufferedio.c _io/textio.c _io/stringio.c _io/winconsoleio.c
35327db96d56Sopenharmony_ci itertools itertoolsmodule.c
35337db96d56Sopenharmony_ci _sre _sre/sre.c
35347db96d56Sopenharmony_ci _thread _threadmodule.c
35357db96d56Sopenharmony_ci@@ -33,3 +33,8 @@ _symtable symtablemodule.c
35367db96d56Sopenharmony_ci 
35377db96d56Sopenharmony_ci # for systems without $HOME env, used by site._getuserbase()
35387db96d56Sopenharmony_ci @MODULE_PWD_TRUE@pwd pwdmodule.c
35397db96d56Sopenharmony_ci+
35407db96d56Sopenharmony_ci+# build-in modules for windows platform:
35417db96d56Sopenharmony_ci+@USE_WIN32_MODULE@winreg ../PC/winreg.c
35427db96d56Sopenharmony_ci+@MODULE_MSVCRT_TRUE@msvcrt -DPy_BUILD_CORE ../PC/msvcrtmodule.c
35437db96d56Sopenharmony_ci+@MODULE__WINAPI_TRUE@_winapi _winapi.c
35447db96d56Sopenharmony_cidiff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
35457db96d56Sopenharmony_ciindex fc73264..6ed71fa 100644
35467db96d56Sopenharmony_ci--- a/Modules/_ctypes/_ctypes.c
35477db96d56Sopenharmony_ci+++ b/Modules/_ctypes/_ctypes.c
35487db96d56Sopenharmony_ci@@ -3403,6 +3403,18 @@ static PPROC FindAddress(void *handle, const char *name, PyObject *type)
35497db96d56Sopenharmony_ci     mangled_name = alloca(strlen(name) + 1 + 1 + 1 + 3); /* \0 _ @ %d */
35507db96d56Sopenharmony_ci     if (!mangled_name)
35517db96d56Sopenharmony_ci         return NULL;
35527db96d56Sopenharmony_ci+    /* Issue: for stdcall decorated export functions MSVC compiler adds
35537db96d56Sopenharmony_ci+     * underscore, but GCC compiler create them without. This is
35547db96d56Sopenharmony_ci+     * visible by example for _ctypes_test.pyd module.
35557db96d56Sopenharmony_ci+     * As well functions from system libraries are without underscore.
35567db96d56Sopenharmony_ci+     * Solutions:
35577db96d56Sopenharmony_ci+     * - If a python module is build with gcc option --add-stdcall-alias
35587db96d56Sopenharmony_ci+     * the module will contain XXX as alias for function XXX@ as result
35597db96d56Sopenharmony_ci+     * first search in this method will succeed.
35607db96d56Sopenharmony_ci+     * - Distutil may use compiler to create def-file, to modify it as
35617db96d56Sopenharmony_ci+     * add underscore alias and with new def file to create module.
35627db96d56Sopenharmony_ci+     * - Or may be just to search for function without underscore.
35637db96d56Sopenharmony_ci+     */
35647db96d56Sopenharmony_ci     for (i = 0; i < 32; ++i) {
35657db96d56Sopenharmony_ci         sprintf(mangled_name, "_%s@%d", name, i*4);
35667db96d56Sopenharmony_ci         Py_BEGIN_ALLOW_THREADS
35677db96d56Sopenharmony_ci@@ -3410,6 +3422,13 @@ static PPROC FindAddress(void *handle, const char *name, PyObject *type)
35687db96d56Sopenharmony_ci         Py_END_ALLOW_THREADS
35697db96d56Sopenharmony_ci         if (address)
35707db96d56Sopenharmony_ci             return address;
35717db96d56Sopenharmony_ci+        /* search for function without underscore as weel */
35727db96d56Sopenharmony_ci+        sprintf(mangled_name, "%s@%d", name, i*4);
35737db96d56Sopenharmony_ci+        Py_BEGIN_ALLOW_THREADS
35747db96d56Sopenharmony_ci+        address = (PPROC)GetProcAddress(handle, mangled_name);
35757db96d56Sopenharmony_ci+        Py_END_ALLOW_THREADS
35767db96d56Sopenharmony_ci+        if (address)
35777db96d56Sopenharmony_ci+            return address;
35787db96d56Sopenharmony_ci     }
35797db96d56Sopenharmony_ci     return NULL;
35807db96d56Sopenharmony_ci #endif
35817db96d56Sopenharmony_cidiff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c
35827db96d56Sopenharmony_ciindex e6440fa..f42714a 100644
35837db96d56Sopenharmony_ci--- a/Modules/_gdbmmodule.c
35847db96d56Sopenharmony_ci+++ b/Modules/_gdbmmodule.c
35857db96d56Sopenharmony_ci@@ -12,7 +12,7 @@
35867db96d56Sopenharmony_ci #include <sys/stat.h>
35877db96d56Sopenharmony_ci #include <sys/types.h>
35887db96d56Sopenharmony_ci 
35897db96d56Sopenharmony_ci-#if defined(WIN32) && !defined(__CYGWIN__)
35907db96d56Sopenharmony_ci+#if defined(WIN32) && !defined(__CYGWIN__) && !defined(__MINGW32__)
35917db96d56Sopenharmony_ci #include "gdbmerrno.h"
35927db96d56Sopenharmony_ci extern const char * gdbm_strerror(gdbm_error);
35937db96d56Sopenharmony_ci #endif
35947db96d56Sopenharmony_cidiff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c
35957db96d56Sopenharmony_ciindex 4496609..80cc6f9 100644
35967db96d56Sopenharmony_ci--- a/Modules/_io/fileio.c
35977db96d56Sopenharmony_ci+++ b/Modules/_io/fileio.c
35987db96d56Sopenharmony_ci@@ -20,6 +20,7 @@
35997db96d56Sopenharmony_ci #endif
36007db96d56Sopenharmony_ci #include <stddef.h> /* For offsetof */
36017db96d56Sopenharmony_ci #include "_iomodule.h"
36027db96d56Sopenharmony_ci+#include "iscygpty.h"
36037db96d56Sopenharmony_ci 
36047db96d56Sopenharmony_ci /*
36057db96d56Sopenharmony_ci  * Known likely problems:
36067db96d56Sopenharmony_ci@@ -1129,7 +1130,7 @@ _io_FileIO_isatty_impl(fileio *self)
36077db96d56Sopenharmony_ci         return err_closed();
36087db96d56Sopenharmony_ci     Py_BEGIN_ALLOW_THREADS
36097db96d56Sopenharmony_ci     _Py_BEGIN_SUPPRESS_IPH
36107db96d56Sopenharmony_ci-    res = isatty(self->fd);
36117db96d56Sopenharmony_ci+    res = isatty(self->fd) || is_cygpty(self->fd);
36127db96d56Sopenharmony_ci     _Py_END_SUPPRESS_IPH
36137db96d56Sopenharmony_ci     Py_END_ALLOW_THREADS
36147db96d56Sopenharmony_ci     return PyBool_FromLong(res);
36157db96d56Sopenharmony_cidiff --git a/Modules/_localemodule.c b/Modules/_localemodule.c
36167db96d56Sopenharmony_ciindex 23c38e1..dfb6c7e 100644
36177db96d56Sopenharmony_ci--- a/Modules/_localemodule.c
36187db96d56Sopenharmony_ci+++ b/Modules/_localemodule.c
36197db96d56Sopenharmony_ci@@ -12,6 +12,13 @@ This software comes with no warranty. Use at your own risk.
36207db96d56Sopenharmony_ci #define PY_SSIZE_T_CLEAN
36217db96d56Sopenharmony_ci #include "Python.h"
36227db96d56Sopenharmony_ci #include "pycore_fileutils.h"
36237db96d56Sopenharmony_ci+#ifdef __MINGW32__
36247db96d56Sopenharmony_ci+/* The header libintl.h and library libintl may exist on mingw host.
36257db96d56Sopenharmony_ci+ * To be compatible with MSVC build we has to undef some defines.
36267db96d56Sopenharmony_ci+ */
36277db96d56Sopenharmony_ci+#undef HAVE_LIBINTL_H
36287db96d56Sopenharmony_ci+#undef HAVE_BIND_TEXTDOMAIN_CODESET
36297db96d56Sopenharmony_ci+#endif
36307db96d56Sopenharmony_ci 
36317db96d56Sopenharmony_ci #include <stdio.h>
36327db96d56Sopenharmony_ci #include <locale.h>
36337db96d56Sopenharmony_cidiff --git a/Modules/_multiprocessing/multiprocessing.c b/Modules/_multiprocessing/multiprocessing.c
36347db96d56Sopenharmony_ciindex 0809c24..bbb1b38 100644
36357db96d56Sopenharmony_ci--- a/Modules/_multiprocessing/multiprocessing.c
36367db96d56Sopenharmony_ci+++ b/Modules/_multiprocessing/multiprocessing.c
36377db96d56Sopenharmony_ci@@ -172,7 +172,7 @@ static PyMethodDef module_methods[] = {
36387db96d56Sopenharmony_ci     _MULTIPROCESSING_RECV_METHODDEF
36397db96d56Sopenharmony_ci     _MULTIPROCESSING_SEND_METHODDEF
36407db96d56Sopenharmony_ci #endif
36417db96d56Sopenharmony_ci-#if !defined(POSIX_SEMAPHORES_NOT_ENABLED) && !defined(__ANDROID__)
36427db96d56Sopenharmony_ci+#if defined(MS_WINDOWS) || (!defined(POSIX_SEMAPHORES_NOT_ENABLED) && !defined(__ANDROID__))
36437db96d56Sopenharmony_ci     _MULTIPROCESSING_SEM_UNLINK_METHODDEF
36447db96d56Sopenharmony_ci #endif
36457db96d56Sopenharmony_ci     {NULL}
36467db96d56Sopenharmony_cidiff --git a/Modules/_multiprocessing/multiprocessing.h b/Modules/_multiprocessing/multiprocessing.h
36477db96d56Sopenharmony_ciindex 3a8314b..c07cfe8 100644
36487db96d56Sopenharmony_ci--- a/Modules/_multiprocessing/multiprocessing.h
36497db96d56Sopenharmony_ci+++ b/Modules/_multiprocessing/multiprocessing.h
36507db96d56Sopenharmony_ci@@ -21,7 +21,10 @@
36517db96d56Sopenharmony_ci #  endif
36527db96d56Sopenharmony_ci #  define SEM_HANDLE HANDLE
36537db96d56Sopenharmony_ci #  define SEM_VALUE_MAX LONG_MAX
36547db96d56Sopenharmony_ci-#  define HAVE_MP_SEMAPHORE
36557db96d56Sopenharmony_ci+#    define HAVE_MP_SEMAPHORE
36567db96d56Sopenharmony_ci+#  if defined(HAVE_SEM_OPEN) && defined(_POSIX_THREADS)
36577db96d56Sopenharmony_ci+#    include <semaphore.h>
36587db96d56Sopenharmony_ci+#  endif
36597db96d56Sopenharmony_ci #else
36607db96d56Sopenharmony_ci #  include <fcntl.h>                 /* O_CREAT and O_EXCL */
36617db96d56Sopenharmony_ci #  if defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED)
36627db96d56Sopenharmony_cidiff --git a/Modules/_winapi.c b/Modules/_winapi.c
36637db96d56Sopenharmony_ciindex f6bb07f..56f3306 100644
36647db96d56Sopenharmony_ci--- a/Modules/_winapi.c
36657db96d56Sopenharmony_ci+++ b/Modules/_winapi.c
36667db96d56Sopenharmony_ci@@ -41,7 +41,9 @@
36677db96d56Sopenharmony_ci 
36687db96d56Sopenharmony_ci #define WINDOWS_LEAN_AND_MEAN
36697db96d56Sopenharmony_ci #include "windows.h"
36707db96d56Sopenharmony_ci+#if defined(Py_DEBUG)
36717db96d56Sopenharmony_ci #include <crtdbg.h>
36727db96d56Sopenharmony_ci+#endif
36737db96d56Sopenharmony_ci #include "winreparse.h"
36747db96d56Sopenharmony_ci 
36757db96d56Sopenharmony_ci #if defined(MS_WIN32) && !defined(MS_WIN64)
36767db96d56Sopenharmony_ci@@ -957,7 +959,7 @@ getattributelist(PyObject *obj, const char *name, AttributeList *attribute_list)
36777db96d56Sopenharmony_ci     DWORD err;
36787db96d56Sopenharmony_ci     BOOL result;
36797db96d56Sopenharmony_ci     PyObject *value;
36807db96d56Sopenharmony_ci-    Py_ssize_t handle_list_size;
36817db96d56Sopenharmony_ci+    Py_ssize_t handle_list_size = 0;
36827db96d56Sopenharmony_ci     DWORD attribute_count = 0;
36837db96d56Sopenharmony_ci     SIZE_T attribute_list_size = 0;
36847db96d56Sopenharmony_ci 
36857db96d56Sopenharmony_cidiff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c
36867db96d56Sopenharmony_ciindex e5b96be..0e5ab45 100644
36877db96d56Sopenharmony_ci--- a/Modules/_xxsubinterpretersmodule.c
36887db96d56Sopenharmony_ci+++ b/Modules/_xxsubinterpretersmodule.c
36897db96d56Sopenharmony_ci@@ -1765,7 +1765,7 @@ PyDoc_STRVAR(channelid_doc,
36907db96d56Sopenharmony_ci "A channel ID identifies a channel and may be used as an int.");
36917db96d56Sopenharmony_ci 
36927db96d56Sopenharmony_ci static PyTypeObject ChannelIDtype = {
36937db96d56Sopenharmony_ci-    PyVarObject_HEAD_INIT(&PyType_Type, 0)
36947db96d56Sopenharmony_ci+    PyVarObject_HEAD_INIT(NULL, 0)
36957db96d56Sopenharmony_ci     "_xxsubinterpreters.ChannelID", /* tp_name */
36967db96d56Sopenharmony_ci     sizeof(channelid),              /* tp_basicsize */
36977db96d56Sopenharmony_ci     0,                              /* tp_itemsize */
36987db96d56Sopenharmony_cidiff --git a/Modules/getpath.c b/Modules/getpath.c
36997db96d56Sopenharmony_ciindex bc730fc..0419c2a 100644
37007db96d56Sopenharmony_ci--- a/Modules/getpath.c
37017db96d56Sopenharmony_ci+++ b/Modules/getpath.c
37027db96d56Sopenharmony_ci@@ -54,6 +54,25 @@
37037db96d56Sopenharmony_ci 
37047db96d56Sopenharmony_ci /* HELPER FUNCTIONS for getpath.py */
37057db96d56Sopenharmony_ci 
37067db96d56Sopenharmony_ci+static PyObject *
37077db96d56Sopenharmony_ci+getpath_normpath(PyObject *Py_UNUSED(self), PyObject *args)
37087db96d56Sopenharmony_ci+{
37097db96d56Sopenharmony_ci+    PyObject *r = NULL;
37107db96d56Sopenharmony_ci+    PyObject *pathobj;
37117db96d56Sopenharmony_ci+    wchar_t *path;
37127db96d56Sopenharmony_ci+    if (!PyArg_ParseTuple(args, "U", &pathobj)) {
37137db96d56Sopenharmony_ci+        return NULL;
37147db96d56Sopenharmony_ci+    }
37157db96d56Sopenharmony_ci+    Py_ssize_t len;
37167db96d56Sopenharmony_ci+    wchar_t *buffer = PyUnicode_AsWideCharString(pathobj, &len);
37177db96d56Sopenharmony_ci+    if (!buffer) {
37187db96d56Sopenharmony_ci+        return NULL;
37197db96d56Sopenharmony_ci+    }
37207db96d56Sopenharmony_ci+    r = PyUnicode_FromWideChar(_Py_normpath(buffer, len), -1);
37217db96d56Sopenharmony_ci+    PyMem_Free(buffer);
37227db96d56Sopenharmony_ci+    return r;
37237db96d56Sopenharmony_ci+}
37247db96d56Sopenharmony_ci+
37257db96d56Sopenharmony_ci static PyObject *
37267db96d56Sopenharmony_ci getpath_abspath(PyObject *Py_UNUSED(self), PyObject *args)
37277db96d56Sopenharmony_ci {
37287db96d56Sopenharmony_ci@@ -88,6 +107,12 @@ getpath_basename(PyObject *Py_UNUSED(self), PyObject *args)
37297db96d56Sopenharmony_ci     }
37307db96d56Sopenharmony_ci     Py_ssize_t end = PyUnicode_GET_LENGTH(path);
37317db96d56Sopenharmony_ci     Py_ssize_t pos = PyUnicode_FindChar(path, SEP, 0, end, -1);
37327db96d56Sopenharmony_ci+#ifdef ALTSEP
37337db96d56Sopenharmony_ci+    if (pos < 0) {
37347db96d56Sopenharmony_ci+        // try using altsep
37357db96d56Sopenharmony_ci+        pos = PyUnicode_FindChar(path, ALTSEP, 0, end, -1);
37367db96d56Sopenharmony_ci+    }
37377db96d56Sopenharmony_ci+#endif
37387db96d56Sopenharmony_ci     if (pos < 0) {
37397db96d56Sopenharmony_ci         return Py_NewRef(path);
37407db96d56Sopenharmony_ci     }
37417db96d56Sopenharmony_ci@@ -104,6 +129,12 @@ getpath_dirname(PyObject *Py_UNUSED(self), PyObject *args)
37427db96d56Sopenharmony_ci     }
37437db96d56Sopenharmony_ci     Py_ssize_t end = PyUnicode_GET_LENGTH(path);
37447db96d56Sopenharmony_ci     Py_ssize_t pos = PyUnicode_FindChar(path, SEP, 0, end, -1);
37457db96d56Sopenharmony_ci+#ifdef ALTSEP
37467db96d56Sopenharmony_ci+    if (pos < 0) {
37477db96d56Sopenharmony_ci+        // try using altsep
37487db96d56Sopenharmony_ci+        pos = PyUnicode_FindChar(path, ALTSEP, 0, end, -1);
37497db96d56Sopenharmony_ci+    }
37507db96d56Sopenharmony_ci+#endif
37517db96d56Sopenharmony_ci     if (pos < 0) {
37527db96d56Sopenharmony_ci         return PyUnicode_FromStringAndSize(NULL, 0);
37537db96d56Sopenharmony_ci     }
37547db96d56Sopenharmony_ci@@ -513,6 +544,7 @@ getpath_realpath(PyObject *Py_UNUSED(self) , PyObject *args)
37557db96d56Sopenharmony_ci 
37567db96d56Sopenharmony_ci 
37577db96d56Sopenharmony_ci static PyMethodDef getpath_methods[] = {
37587db96d56Sopenharmony_ci+    {"normpath", getpath_normpath, METH_VARARGS, NULL},
37597db96d56Sopenharmony_ci     {"abspath", getpath_abspath, METH_VARARGS, NULL},
37607db96d56Sopenharmony_ci     {"basename", getpath_basename, METH_VARARGS, NULL},
37617db96d56Sopenharmony_ci     {"dirname", getpath_dirname, METH_VARARGS, NULL},
37627db96d56Sopenharmony_ci@@ -884,6 +916,11 @@ _PyConfig_InitPathConfig(PyConfig *config, int compute_path_config)
37637db96d56Sopenharmony_ci #else
37647db96d56Sopenharmony_ci         !decode_to_dict(dict, "os_name", "posix") ||
37657db96d56Sopenharmony_ci #endif
37667db96d56Sopenharmony_ci+#ifdef __MINGW32__
37677db96d56Sopenharmony_ci+        !int_to_dict(dict, "is_mingw", 1) ||
37687db96d56Sopenharmony_ci+#else
37697db96d56Sopenharmony_ci+        !int_to_dict(dict, "is_mingw", 0) ||
37707db96d56Sopenharmony_ci+#endif
37717db96d56Sopenharmony_ci #ifdef WITH_NEXT_FRAMEWORK
37727db96d56Sopenharmony_ci         !int_to_dict(dict, "WITH_NEXT_FRAMEWORK", 1) ||
37737db96d56Sopenharmony_ci #else
37747db96d56Sopenharmony_ci@@ -910,6 +947,9 @@ _PyConfig_InitPathConfig(PyConfig *config, int compute_path_config)
37757db96d56Sopenharmony_ci         !funcs_to_dict(dict, config->pathconfig_warnings) ||
37767db96d56Sopenharmony_ci #ifndef MS_WINDOWS
37777db96d56Sopenharmony_ci         PyDict_SetItemString(dict, "winreg", Py_None) < 0 ||
37787db96d56Sopenharmony_ci+#endif
37797db96d56Sopenharmony_ci+#ifdef __MINGW32__
37807db96d56Sopenharmony_ci+        !env_to_dict(dict, "ENV_MSYSTEM", 0) ||
37817db96d56Sopenharmony_ci #endif
37827db96d56Sopenharmony_ci         PyDict_SetItemString(dict, "__builtins__", PyEval_GetBuiltins()) < 0
37837db96d56Sopenharmony_ci     ) {
37847db96d56Sopenharmony_cidiff --git a/Modules/getpath.py b/Modules/getpath.py
37857db96d56Sopenharmony_ciindex 74f918c..c98cb1f 100644
37867db96d56Sopenharmony_ci--- a/Modules/getpath.py
37877db96d56Sopenharmony_ci+++ b/Modules/getpath.py
37887db96d56Sopenharmony_ci@@ -30,6 +30,7 @@
37897db96d56Sopenharmony_ci 
37907db96d56Sopenharmony_ci # ** Values known at compile time **
37917db96d56Sopenharmony_ci # os_name           -- [in] one of 'nt', 'posix', 'darwin'
37927db96d56Sopenharmony_ci+# is_mingw          -- [in] True if targeting MinGW
37937db96d56Sopenharmony_ci # PREFIX            -- [in] sysconfig.get_config_var(...)
37947db96d56Sopenharmony_ci # EXEC_PREFIX       -- [in] sysconfig.get_config_var(...)
37957db96d56Sopenharmony_ci # PYTHONPATH        -- [in] sysconfig.get_config_var(...)
37967db96d56Sopenharmony_ci@@ -51,6 +52,7 @@
37977db96d56Sopenharmony_ci # ENV_PYTHONHOME          -- [in] getenv(...)
37987db96d56Sopenharmony_ci # ENV_PYTHONEXECUTABLE    -- [in] getenv(...)
37997db96d56Sopenharmony_ci # ENV___PYVENV_LAUNCHER__ -- [in] getenv(...)
38007db96d56Sopenharmony_ci+# ENV_MSYSTEM             -- [in] getenv(...)
38017db96d56Sopenharmony_ci 
38027db96d56Sopenharmony_ci # ** Values calculated at runtime **
38037db96d56Sopenharmony_ci # config            -- [in/out] dict of the PyConfig structure
38047db96d56Sopenharmony_ci@@ -185,8 +187,27 @@
38057db96d56Sopenharmony_ci     ZIP_LANDMARK = f'{platlibdir}/python{VERSION_MAJOR}{VERSION_MINOR}.zip'
38067db96d56Sopenharmony_ci     DELIM = ':'
38077db96d56Sopenharmony_ci     SEP = '/'
38087db96d56Sopenharmony_ci+    ALTSEP = None
38097db96d56Sopenharmony_ci 
38107db96d56Sopenharmony_ci-elif os_name == 'nt':
38117db96d56Sopenharmony_ci+elif os_name == 'nt' and is_mingw:
38127db96d56Sopenharmony_ci+    BUILDDIR_TXT = 'pybuilddir.txt'
38137db96d56Sopenharmony_ci+    BUILD_LANDMARK = 'Modules/Setup.local'
38147db96d56Sopenharmony_ci+    DEFAULT_PROGRAM_NAME = f'python{VERSION_MAJOR}'
38157db96d56Sopenharmony_ci+    STDLIB_SUBDIR = f'{platlibdir}/python{VERSION_MAJOR}.{VERSION_MINOR}'
38167db96d56Sopenharmony_ci+    STDLIB_LANDMARKS = [f'{STDLIB_SUBDIR}/os.py', f'{STDLIB_SUBDIR}/os.pyc']
38177db96d56Sopenharmony_ci+    PLATSTDLIB_LANDMARK = f'{platlibdir}/python{VERSION_MAJOR}.{VERSION_MINOR}/lib-dynload'
38187db96d56Sopenharmony_ci+    BUILDSTDLIB_LANDMARKS = ['Lib/os.py']
38197db96d56Sopenharmony_ci+    VENV_LANDMARK = 'pyvenv.cfg'
38207db96d56Sopenharmony_ci+    ZIP_LANDMARK = f'{platlibdir}/python{VERSION_MAJOR}{VERSION_MINOR}.zip'
38217db96d56Sopenharmony_ci+    DELIM = ';'
38227db96d56Sopenharmony_ci+    if ENV_MSYSTEM:
38237db96d56Sopenharmony_ci+        SEP = '/'
38247db96d56Sopenharmony_ci+        ALTSEP = '\\'
38257db96d56Sopenharmony_ci+    else:
38267db96d56Sopenharmony_ci+        SEP = '\\'
38277db96d56Sopenharmony_ci+        ALTSEP = '/'
38287db96d56Sopenharmony_ci+
38297db96d56Sopenharmony_ci+elif os_name == 'nt': # MSVC
38307db96d56Sopenharmony_ci     BUILDDIR_TXT = 'pybuilddir.txt'
38317db96d56Sopenharmony_ci     BUILD_LANDMARK = f'{VPATH}\\Modules\\Setup.local'
38327db96d56Sopenharmony_ci     DEFAULT_PROGRAM_NAME = f'python'
38337db96d56Sopenharmony_ci@@ -199,6 +220,7 @@
38347db96d56Sopenharmony_ci     WINREG_KEY = f'SOFTWARE\\Python\\PythonCore\\{PYWINVER}\\PythonPath'
38357db96d56Sopenharmony_ci     DELIM = ';'
38367db96d56Sopenharmony_ci     SEP = '\\'
38377db96d56Sopenharmony_ci+    ALTSEP = '/'
38387db96d56Sopenharmony_ci 
38397db96d56Sopenharmony_ci 
38407db96d56Sopenharmony_ci # ******************************************************************************
38417db96d56Sopenharmony_ci@@ -211,6 +233,8 @@ def search_up(prefix, *landmarks, test=isfile):
38427db96d56Sopenharmony_ci             return prefix
38437db96d56Sopenharmony_ci         prefix = dirname(prefix)
38447db96d56Sopenharmony_ci 
38457db96d56Sopenharmony_ci+def _normpath(p):
38467db96d56Sopenharmony_ci+    return normpath(p) if p is not None else None
38477db96d56Sopenharmony_ci 
38487db96d56Sopenharmony_ci # ******************************************************************************
38497db96d56Sopenharmony_ci # READ VARIABLES FROM config
38507db96d56Sopenharmony_ci@@ -263,10 +287,10 @@ def search_up(prefix, *landmarks, test=isfile):
38517db96d56Sopenharmony_ci     if not executable:
38527db96d56Sopenharmony_ci         executable = real_executable
38537db96d56Sopenharmony_ci 
38547db96d56Sopenharmony_ci-if not executable and SEP in program_name:
38557db96d56Sopenharmony_ci+if not executable and (SEP in program_name or 
38567db96d56Sopenharmony_ci+                       (ALTSEP and ALTSEP in program_name)):
38577db96d56Sopenharmony_ci     # Resolve partial path program_name against current directory
38587db96d56Sopenharmony_ci     executable = abspath(program_name)
38597db96d56Sopenharmony_ci-
38607db96d56Sopenharmony_ci if not executable:
38617db96d56Sopenharmony_ci     # All platforms default to real_executable if known at this
38627db96d56Sopenharmony_ci     # stage. POSIX does not set this value.
38637db96d56Sopenharmony_ci@@ -497,15 +521,15 @@ def search_up(prefix, *landmarks, test=isfile):
38647db96d56Sopenharmony_ci     except (FileNotFoundError, PermissionError):
38657db96d56Sopenharmony_ci         if isfile(joinpath(real_executable_dir, BUILD_LANDMARK)):
38667db96d56Sopenharmony_ci             build_prefix = joinpath(real_executable_dir, VPATH)
38677db96d56Sopenharmony_ci-            if os_name == 'nt':
38687db96d56Sopenharmony_ci+            if os_name == 'nt' and not is_mingw:
38697db96d56Sopenharmony_ci                 # QUIRK: Windows builds need platstdlib_dir to be the executable
38707db96d56Sopenharmony_ci                 # dir. Normally the builddir marker handles this, but in this
38717db96d56Sopenharmony_ci                 # case we need to correct manually.
38727db96d56Sopenharmony_ci                 platstdlib_dir = real_executable_dir
38737db96d56Sopenharmony_ci 
38747db96d56Sopenharmony_ci     if build_prefix:
38757db96d56Sopenharmony_ci-        if os_name == 'nt':
38767db96d56Sopenharmony_ci-            # QUIRK: No searching for more landmarks on Windows
38777db96d56Sopenharmony_ci+        if os_name == 'nt' and not is_mingw:
38787db96d56Sopenharmony_ci+            # QUIRK: No searching for more landmarks on MSVC
38797db96d56Sopenharmony_ci             build_stdlib_prefix = build_prefix
38807db96d56Sopenharmony_ci         else:
38817db96d56Sopenharmony_ci             build_stdlib_prefix = search_up(build_prefix, *BUILDSTDLIB_LANDMARKS)
38827db96d56Sopenharmony_ci@@ -552,6 +576,9 @@ def search_up(prefix, *landmarks, test=isfile):
38837db96d56Sopenharmony_ci     # First try to detect prefix by looking alongside our runtime library, if known
38847db96d56Sopenharmony_ci     if library and not prefix:
38857db96d56Sopenharmony_ci         library_dir = dirname(library)
38867db96d56Sopenharmony_ci+        if os_name == 'nt' and is_mingw:
38877db96d56Sopenharmony_ci+            # QUIRK: On Windows, mingw Python DLLs are in the bin directory
38887db96d56Sopenharmony_ci+            library_dir = joinpath(library_dir, '..')
38897db96d56Sopenharmony_ci         if ZIP_LANDMARK:
38907db96d56Sopenharmony_ci             if os_name == 'nt':
38917db96d56Sopenharmony_ci                 # QUIRK: Windows does not search up for ZIP file
38927db96d56Sopenharmony_ci@@ -597,7 +624,7 @@ def search_up(prefix, *landmarks, test=isfile):
38937db96d56Sopenharmony_ci 
38947db96d56Sopenharmony_ci     # Detect exec_prefix by searching from executable for the platstdlib_dir
38957db96d56Sopenharmony_ci     if PLATSTDLIB_LANDMARK and not exec_prefix:
38967db96d56Sopenharmony_ci-        if os_name == 'nt':
38977db96d56Sopenharmony_ci+        if os_name == 'nt' and (not is_mingw):
38987db96d56Sopenharmony_ci             # QUIRK: Windows always assumed these were the same
38997db96d56Sopenharmony_ci             # gh-100320: Our PYDs are assumed to be relative to the Lib directory
39007db96d56Sopenharmony_ci             # (that is, prefix) rather than the executable (that is, executable_dir)
39017db96d56Sopenharmony_ci@@ -607,7 +634,7 @@ def search_up(prefix, *landmarks, test=isfile):
39027db96d56Sopenharmony_ci         if not exec_prefix and EXEC_PREFIX:
39037db96d56Sopenharmony_ci             exec_prefix = EXEC_PREFIX
39047db96d56Sopenharmony_ci         if not exec_prefix or not isdir(joinpath(exec_prefix, PLATSTDLIB_LANDMARK)):
39057db96d56Sopenharmony_ci-            if os_name == 'nt':
39067db96d56Sopenharmony_ci+            if os_name == 'nt' and (not is_mingw):
39077db96d56Sopenharmony_ci                 # QUIRK: If DLLs is missing on Windows, don't warn, just assume
39087db96d56Sopenharmony_ci                 # that they're in exec_prefix
39097db96d56Sopenharmony_ci                 if not platstdlib_dir:
39107db96d56Sopenharmony_ci@@ -645,7 +672,7 @@ def search_up(prefix, *landmarks, test=isfile):
39117db96d56Sopenharmony_ci 
39127db96d56Sopenharmony_ci if py_setpath:
39137db96d56Sopenharmony_ci     # If Py_SetPath was called then it overrides any existing search path
39147db96d56Sopenharmony_ci-    config['module_search_paths'] = py_setpath.split(DELIM)
39157db96d56Sopenharmony_ci+    config['module_search_paths'] = [_normpath(p) for p in py_setpath.split(DELIM)]
39167db96d56Sopenharmony_ci     config['module_search_paths_set'] = 1
39177db96d56Sopenharmony_ci 
39187db96d56Sopenharmony_ci elif not pythonpath_was_set:
39197db96d56Sopenharmony_ci@@ -660,7 +687,7 @@ def search_up(prefix, *landmarks, test=isfile):
39207db96d56Sopenharmony_ci             pythonpath.append(abspath(p))
39217db96d56Sopenharmony_ci 
39227db96d56Sopenharmony_ci     # Then add the default zip file
39237db96d56Sopenharmony_ci-    if os_name == 'nt':
39247db96d56Sopenharmony_ci+    if os_name == 'nt' and (not is_mingw):
39257db96d56Sopenharmony_ci         # QUIRK: Windows uses the library directory rather than the prefix
39267db96d56Sopenharmony_ci         if library:
39277db96d56Sopenharmony_ci             library_dir = dirname(library)
39287db96d56Sopenharmony_ci@@ -673,7 +700,7 @@ def search_up(prefix, *landmarks, test=isfile):
39297db96d56Sopenharmony_ci     else:
39307db96d56Sopenharmony_ci         pythonpath.append(joinpath(prefix, ZIP_LANDMARK))
39317db96d56Sopenharmony_ci 
39327db96d56Sopenharmony_ci-    if os_name == 'nt' and use_environment and winreg:
39337db96d56Sopenharmony_ci+    if (not is_mingw) and os_name == 'nt' and use_environment and winreg:
39347db96d56Sopenharmony_ci         # QUIRK: Windows also lists paths in the registry. Paths are stored
39357db96d56Sopenharmony_ci         # as the default value of each subkey of
39367db96d56Sopenharmony_ci         # {HKCU,HKLM}\Software\Python\PythonCore\{winver}\PythonPath
39377db96d56Sopenharmony_ci@@ -714,7 +741,7 @@ def search_up(prefix, *landmarks, test=isfile):
39387db96d56Sopenharmony_ci     if not platstdlib_dir and exec_prefix:
39397db96d56Sopenharmony_ci         platstdlib_dir = joinpath(exec_prefix, PLATSTDLIB_LANDMARK)
39407db96d56Sopenharmony_ci 
39417db96d56Sopenharmony_ci-    if os_name == 'nt':
39427db96d56Sopenharmony_ci+    if os_name == 'nt' and (not is_mingw):
39437db96d56Sopenharmony_ci         # QUIRK: Windows generates paths differently
39447db96d56Sopenharmony_ci         if platstdlib_dir:
39457db96d56Sopenharmony_ci             pythonpath.append(platstdlib_dir)
39467db96d56Sopenharmony_ci@@ -732,7 +759,7 @@ def search_up(prefix, *landmarks, test=isfile):
39477db96d56Sopenharmony_ci         if platstdlib_dir:
39487db96d56Sopenharmony_ci             pythonpath.append(platstdlib_dir)
39497db96d56Sopenharmony_ci 
39507db96d56Sopenharmony_ci-    config['module_search_paths'] = pythonpath
39517db96d56Sopenharmony_ci+    config['module_search_paths'] = [_normpath(p) for p in pythonpath]
39527db96d56Sopenharmony_ci     config['module_search_paths_set'] = 1
39537db96d56Sopenharmony_ci 
39547db96d56Sopenharmony_ci 
39557db96d56Sopenharmony_ci@@ -742,8 +769,8 @@ def search_up(prefix, *landmarks, test=isfile):
39567db96d56Sopenharmony_ci 
39577db96d56Sopenharmony_ci # QUIRK: Non-Windows replaces prefix/exec_prefix with defaults when running
39587db96d56Sopenharmony_ci # in build directory. This happens after pythonpath calculation.
39597db96d56Sopenharmony_ci-if os_name != 'nt' and build_prefix:
39607db96d56Sopenharmony_ci-    prefix = config.get('prefix') or PREFIX
39617db96d56Sopenharmony_ci+if (os_name != 'nt' or is_mingw) and build_prefix:
39627db96d56Sopenharmony_ci+    prefix = config.get('prefix') or abspath(PREFIX)
39637db96d56Sopenharmony_ci     exec_prefix = config.get('exec_prefix') or EXEC_PREFIX or prefix
39647db96d56Sopenharmony_ci 
39657db96d56Sopenharmony_ci 
39667db96d56Sopenharmony_ci@@ -767,23 +794,23 @@ def search_up(prefix, *landmarks, test=isfile):
39677db96d56Sopenharmony_ci             warn("unsupported 'import' line in ._pth file")
39687db96d56Sopenharmony_ci         else:
39697db96d56Sopenharmony_ci             pythonpath.append(joinpath(pth_dir, line))
39707db96d56Sopenharmony_ci-    config['module_search_paths'] = pythonpath
39717db96d56Sopenharmony_ci+    config['module_search_paths'] = [_normpath(p) for p in pythonpath]
39727db96d56Sopenharmony_ci     config['module_search_paths_set'] = 1
39737db96d56Sopenharmony_ci 
39747db96d56Sopenharmony_ci # ******************************************************************************
39757db96d56Sopenharmony_ci # UPDATE config FROM CALCULATED VALUES
39767db96d56Sopenharmony_ci # ******************************************************************************
39777db96d56Sopenharmony_ci 
39787db96d56Sopenharmony_ci-config['program_name'] = program_name
39797db96d56Sopenharmony_ci-config['home'] = home
39807db96d56Sopenharmony_ci-config['executable'] = executable
39817db96d56Sopenharmony_ci-config['base_executable'] = base_executable
39827db96d56Sopenharmony_ci-config['prefix'] = prefix
39837db96d56Sopenharmony_ci-config['exec_prefix'] = exec_prefix
39847db96d56Sopenharmony_ci-config['base_prefix'] = base_prefix or prefix
39857db96d56Sopenharmony_ci-config['base_exec_prefix'] = base_exec_prefix or exec_prefix
39867db96d56Sopenharmony_ci+config['program_name'] = _normpath(program_name)
39877db96d56Sopenharmony_ci+config['home'] = _normpath(home)
39887db96d56Sopenharmony_ci+config['executable'] = _normpath(executable)
39897db96d56Sopenharmony_ci+config['base_executable'] = _normpath(base_executable)
39907db96d56Sopenharmony_ci+config['prefix'] = _normpath(prefix)
39917db96d56Sopenharmony_ci+config['exec_prefix'] = _normpath(exec_prefix)
39927db96d56Sopenharmony_ci+config['base_prefix'] = _normpath(base_prefix or prefix)
39937db96d56Sopenharmony_ci+config['base_exec_prefix'] = _normpath(base_exec_prefix or exec_prefix)
39947db96d56Sopenharmony_ci 
39957db96d56Sopenharmony_ci-config['platlibdir'] = platlibdir
39967db96d56Sopenharmony_ci+config['platlibdir'] = _normpath(platlibdir)
39977db96d56Sopenharmony_ci # test_embed expects empty strings, not None
39987db96d56Sopenharmony_ci-config['stdlib_dir'] = stdlib_dir or ''
39997db96d56Sopenharmony_ci-config['platstdlib_dir'] = platstdlib_dir or ''
40007db96d56Sopenharmony_ci+config['stdlib_dir'] = _normpath(stdlib_dir or '')
40017db96d56Sopenharmony_ci+config['platstdlib_dir'] = _normpath(platstdlib_dir or '')
40027db96d56Sopenharmony_cidiff --git a/Modules/main.c b/Modules/main.c
40037db96d56Sopenharmony_ciindex 6904e3f..5c8708e 100644
40047db96d56Sopenharmony_ci--- a/Modules/main.c
40057db96d56Sopenharmony_ci+++ b/Modules/main.c
40067db96d56Sopenharmony_ci@@ -7,6 +7,7 @@
40077db96d56Sopenharmony_ci #include "pycore_pathconfig.h"    // _PyPathConfig_ComputeSysPath0()
40087db96d56Sopenharmony_ci #include "pycore_pylifecycle.h"   // _Py_PreInitializeFromPyArgv()
40097db96d56Sopenharmony_ci #include "pycore_pystate.h"       // _PyInterpreterState_GET()
40107db96d56Sopenharmony_ci+#include "iscygpty.h"
40117db96d56Sopenharmony_ci 
40127db96d56Sopenharmony_ci /* Includes for exit_sigint() */
40137db96d56Sopenharmony_ci #include <stdio.h>                // perror()
40147db96d56Sopenharmony_ci@@ -92,7 +93,7 @@ static inline int config_run_code(const PyConfig *config)
40157db96d56Sopenharmony_ci static int
40167db96d56Sopenharmony_ci stdin_is_interactive(const PyConfig *config)
40177db96d56Sopenharmony_ci {
40187db96d56Sopenharmony_ci-    return (isatty(fileno(stdin)) || config->interactive);
40197db96d56Sopenharmony_ci+    return (isatty(fileno(stdin)) || config->interactive || is_cygpty(fileno(stdin)));
40207db96d56Sopenharmony_ci }
40217db96d56Sopenharmony_ci 
40227db96d56Sopenharmony_ci 
40237db96d56Sopenharmony_cidiff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
40247db96d56Sopenharmony_ciindex a01662d..c2362a6 100644
40257db96d56Sopenharmony_ci--- a/Modules/posixmodule.c
40267db96d56Sopenharmony_ci+++ b/Modules/posixmodule.c
40277db96d56Sopenharmony_ci@@ -50,6 +50,7 @@
40287db96d56Sopenharmony_ci #ifdef __ANDROID__
40297db96d56Sopenharmony_ci #  undef HAVE_FACCESSAT
40307db96d56Sopenharmony_ci #endif
40317db96d56Sopenharmony_ci+#include "iscygpty.h"
40327db96d56Sopenharmony_ci 
40337db96d56Sopenharmony_ci #include <stdio.h>                // ctermid()
40347db96d56Sopenharmony_ci #include <stdlib.h>               // system()
40357db96d56Sopenharmony_ci@@ -350,6 +351,32 @@ corresponding Unix manual entries for more information on calls.");
40367db96d56Sopenharmony_ci #    define HAVE_CWAIT      1
40377db96d56Sopenharmony_ci #    define HAVE_FSYNC      1
40387db96d56Sopenharmony_ci #    define fsync _commit
40397db96d56Sopenharmony_ci+#  elif defined(__MINGW32__)	/* GCC for windows hosts */
40407db96d56Sopenharmony_ci+/* getlogin is detected by configure on mingw-w64 */
40417db96d56Sopenharmony_ci+#    undef HAVE_GETLOGIN
40427db96d56Sopenharmony_ci+/* opendir is detected by configure on mingw-w64, and for some reason
40437db96d56Sopenharmony_ci+things don't work as expected. For example, os.listdir always returns
40447db96d56Sopenharmony_ci+the cwd's directory listing instead of the one specified. By 
40457db96d56Sopenharmony_ci+un-defining, this, os.listdir will use the one which uses native
40467db96d56Sopenharmony_ci+windows API. */
40477db96d56Sopenharmony_ci+#    undef HAVE_OPENDIR
40487db96d56Sopenharmony_ci+/*#    define HAVE_GETCWD     1 - detected by configure*/
40497db96d56Sopenharmony_ci+#    define HAVE_GETPPID    1
40507db96d56Sopenharmony_ci+#    define HAVE_GETLOGIN   1
40517db96d56Sopenharmony_ci+#    define HAVE_SPAWNV     1
40527db96d56Sopenharmony_ci+#    define HAVE_WSPAWNV    1
40537db96d56Sopenharmony_ci+#    define HAVE_WEXECV     1
40547db96d56Sopenharmony_ci+/*#    define HAVE_EXECV	     1 - detected by configure*/
40557db96d56Sopenharmony_ci+#    define HAVE_PIPE	     1
40567db96d56Sopenharmony_ci+#    define HAVE_POPEN	     1
40577db96d56Sopenharmony_ci+#    define HAVE_SYSTEM	   1
40587db96d56Sopenharmony_ci+#    define HAVE_CWAIT      1
40597db96d56Sopenharmony_ci+#    define HAVE_FSYNC      1
40607db96d56Sopenharmony_ci+#    define fsync _commit
40617db96d56Sopenharmony_ci+#    include <winioctl.h>
40627db96d56Sopenharmony_ci+#    ifndef _MAX_ENV
40637db96d56Sopenharmony_ci+#      define _MAX_ENV	32767
40647db96d56Sopenharmony_ci+#    endif
40657db96d56Sopenharmony_ci #  endif  /* _MSC_VER */
40667db96d56Sopenharmony_ci #endif  /* ! __WATCOMC__ || __QNX__ */
40677db96d56Sopenharmony_ci 
40687db96d56Sopenharmony_ci@@ -428,7 +455,7 @@ extern char        *ctermid_r(char *);
40697db96d56Sopenharmony_ci #  endif
40707db96d56Sopenharmony_ci #endif
40717db96d56Sopenharmony_ci 
40727db96d56Sopenharmony_ci-#ifdef _MSC_VER
40737db96d56Sopenharmony_ci+#ifdef MS_WINDOWS
40747db96d56Sopenharmony_ci #  ifdef HAVE_DIRECT_H
40757db96d56Sopenharmony_ci #    include <direct.h>
40767db96d56Sopenharmony_ci #  endif
40777db96d56Sopenharmony_ci@@ -439,7 +466,7 @@ extern char        *ctermid_r(char *);
40787db96d56Sopenharmony_ci #    include <process.h>
40797db96d56Sopenharmony_ci #  endif
40807db96d56Sopenharmony_ci #  include <malloc.h>
40817db96d56Sopenharmony_ci-#endif /* _MSC_VER */
40827db96d56Sopenharmony_ci+#endif /* MS_WINDOWS */
40837db96d56Sopenharmony_ci 
40847db96d56Sopenharmony_ci #ifndef MAXPATHLEN
40857db96d56Sopenharmony_ci #  if defined(PATH_MAX) && PATH_MAX > 1024
40867db96d56Sopenharmony_ci@@ -1593,9 +1620,9 @@ win32_get_reparse_tag(HANDLE reparse_point_handle, ULONG *reparse_tag)
40877db96d56Sopenharmony_ci ** man environ(7).
40887db96d56Sopenharmony_ci */
40897db96d56Sopenharmony_ci #include <crt_externs.h>
40907db96d56Sopenharmony_ci-#elif !defined(_MSC_VER) && (!defined(__WATCOMC__) || defined(__QNX__) || defined(__VXWORKS__))
40917db96d56Sopenharmony_ci+#elif !defined(MS_WINDOWS) && (!defined(__WATCOMC__) || defined(__QNX__) || defined(__VXWORKS__))
40927db96d56Sopenharmony_ci extern char **environ;
40937db96d56Sopenharmony_ci-#endif /* !_MSC_VER */
40947db96d56Sopenharmony_ci+#endif /* !MS_WINDOWS */
40957db96d56Sopenharmony_ci 
40967db96d56Sopenharmony_ci static PyObject *
40977db96d56Sopenharmony_ci convertenviron(void)
40987db96d56Sopenharmony_ci@@ -3815,6 +3842,7 @@ posix_getcwd(int use_bytes)
40997db96d56Sopenharmony_ci         return PyErr_SetFromWindowsErr(0);
41007db96d56Sopenharmony_ci     }
41017db96d56Sopenharmony_ci 
41027db96d56Sopenharmony_ci+    Py_NormalizeSepsW(wbuf2);
41037db96d56Sopenharmony_ci     PyObject *resobj = PyUnicode_FromWideChar(wbuf2, len);
41047db96d56Sopenharmony_ci     if (wbuf2 != wbuf) {
41057db96d56Sopenharmony_ci         PyMem_RawFree(wbuf2);
41067db96d56Sopenharmony_ci@@ -4419,6 +4447,7 @@ os__getfinalpathname_impl(PyObject *module, path_t *path)
41077db96d56Sopenharmony_ci         target_path = tmp;
41087db96d56Sopenharmony_ci     }
41097db96d56Sopenharmony_ci 
41107db96d56Sopenharmony_ci+    Py_NormalizeSepsW(target_path);
41117db96d56Sopenharmony_ci     result = PyUnicode_FromWideChar(target_path, result_length);
41127db96d56Sopenharmony_ci     if (result && path->narrow) {
41137db96d56Sopenharmony_ci         Py_SETREF(result, PyUnicode_EncodeFSDefault(result));
41147db96d56Sopenharmony_ci@@ -5467,7 +5496,7 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns,
41157db96d56Sopenharmony_ci /*[clinic end generated code: output=cfcac69d027b82cf input=2fbd62a2f228f8f4]*/
41167db96d56Sopenharmony_ci {
41177db96d56Sopenharmony_ci #ifdef MS_WINDOWS
41187db96d56Sopenharmony_ci-    HANDLE hFile;
41197db96d56Sopenharmony_ci+    HANDLE hFile = 0;
41207db96d56Sopenharmony_ci     FILETIME atime, mtime;
41217db96d56Sopenharmony_ci #else
41227db96d56Sopenharmony_ci     int result;
41237db96d56Sopenharmony_ci@@ -10194,7 +10223,7 @@ os_isatty_impl(PyObject *module, int fd)
41247db96d56Sopenharmony_ci     int return_value;
41257db96d56Sopenharmony_ci     Py_BEGIN_ALLOW_THREADS
41267db96d56Sopenharmony_ci     _Py_BEGIN_SUPPRESS_IPH
41277db96d56Sopenharmony_ci-    return_value = isatty(fd);
41287db96d56Sopenharmony_ci+    return_value = isatty(fd) || is_cygpty(fd);
41297db96d56Sopenharmony_ci     _Py_END_SUPPRESS_IPH
41307db96d56Sopenharmony_ci     Py_END_ALLOW_THREADS
41317db96d56Sopenharmony_ci     return return_value;
41327db96d56Sopenharmony_ci@@ -14682,7 +14711,7 @@ os__add_dll_directory_impl(PyObject *module, path_t *path)
41337db96d56Sopenharmony_ci        loaded. */
41347db96d56Sopenharmony_ci     Py_BEGIN_ALLOW_THREADS
41357db96d56Sopenharmony_ci     if (!(hKernel32 = GetModuleHandleW(L"kernel32")) ||
41367db96d56Sopenharmony_ci-        !(AddDllDirectory = (PAddDllDirectory)GetProcAddress(
41377db96d56Sopenharmony_ci+        !(AddDllDirectory = (PAddDllDirectory)(void *)GetProcAddress(
41387db96d56Sopenharmony_ci             hKernel32, "AddDllDirectory")) ||
41397db96d56Sopenharmony_ci         !(cookie = (*AddDllDirectory)(path->wide))) {
41407db96d56Sopenharmony_ci         err = GetLastError();
41417db96d56Sopenharmony_ci@@ -14732,7 +14761,7 @@ os__remove_dll_directory_impl(PyObject *module, PyObject *cookie)
41427db96d56Sopenharmony_ci        loaded. */
41437db96d56Sopenharmony_ci     Py_BEGIN_ALLOW_THREADS
41447db96d56Sopenharmony_ci     if (!(hKernel32 = GetModuleHandleW(L"kernel32")) ||
41457db96d56Sopenharmony_ci-        !(RemoveDllDirectory = (PRemoveDllDirectory)GetProcAddress(
41467db96d56Sopenharmony_ci+        !(RemoveDllDirectory = (PRemoveDllDirectory)(void *)GetProcAddress(
41477db96d56Sopenharmony_ci             hKernel32, "RemoveDllDirectory")) ||
41487db96d56Sopenharmony_ci         !(*RemoveDllDirectory)(cookieValue)) {
41497db96d56Sopenharmony_ci         err = GetLastError();
41507db96d56Sopenharmony_cidiff --git a/Modules/selectmodule.c b/Modules/selectmodule.c
41517db96d56Sopenharmony_ciindex 4eea928..6be3582 100644
41527db96d56Sopenharmony_ci--- a/Modules/selectmodule.c
41537db96d56Sopenharmony_ci+++ b/Modules/selectmodule.c
41547db96d56Sopenharmony_ci@@ -146,9 +146,9 @@ seq2set(PyObject *seq, fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
41557db96d56Sopenharmony_ci         v = PyObject_AsFileDescriptor( o );
41567db96d56Sopenharmony_ci         if (v == -1) goto finally;
41577db96d56Sopenharmony_ci 
41587db96d56Sopenharmony_ci-#if defined(_MSC_VER)
41597db96d56Sopenharmony_ci+#if defined(MS_WIN32)
41607db96d56Sopenharmony_ci         max = 0;                             /* not used for Win32 */
41617db96d56Sopenharmony_ci-#else  /* !_MSC_VER */
41627db96d56Sopenharmony_ci+#else  /* !MS_WIN32 */
41637db96d56Sopenharmony_ci         if (!_PyIsSelectable_fd(v)) {
41647db96d56Sopenharmony_ci             PyErr_SetString(PyExc_ValueError,
41657db96d56Sopenharmony_ci                         "filedescriptor out of range in select()");
41667db96d56Sopenharmony_ci@@ -156,7 +156,7 @@ seq2set(PyObject *seq, fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
41677db96d56Sopenharmony_ci         }
41687db96d56Sopenharmony_ci         if (v > max)
41697db96d56Sopenharmony_ci             max = v;
41707db96d56Sopenharmony_ci-#endif /* _MSC_VER */
41717db96d56Sopenharmony_ci+#endif /* MS_WIN32 */
41727db96d56Sopenharmony_ci         FD_SET(v, set);
41737db96d56Sopenharmony_ci 
41747db96d56Sopenharmony_ci         /* add object and its file descriptor to the list */
41757db96d56Sopenharmony_cidiff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
41767db96d56Sopenharmony_ciindex 65d0e10..d1bfe3d 100644
41777db96d56Sopenharmony_ci--- a/Modules/socketmodule.c
41787db96d56Sopenharmony_ci+++ b/Modules/socketmodule.c
41797db96d56Sopenharmony_ci@@ -274,7 +274,7 @@ shutdown(how) -- shut down traffic in one or both directions\n\
41807db96d56Sopenharmony_ci # endif
41817db96d56Sopenharmony_ci 
41827db96d56Sopenharmony_ci /* Macros based on the IPPROTO enum, see: https://bugs.python.org/issue29515 */
41837db96d56Sopenharmony_ci-#ifdef MS_WINDOWS
41847db96d56Sopenharmony_ci+#ifdef _MSC_VER
41857db96d56Sopenharmony_ci #define IPPROTO_ICMP IPPROTO_ICMP
41867db96d56Sopenharmony_ci #define IPPROTO_IGMP IPPROTO_IGMP
41877db96d56Sopenharmony_ci #define IPPROTO_GGP IPPROTO_GGP
41887db96d56Sopenharmony_ci@@ -305,7 +305,7 @@ shutdown(how) -- shut down traffic in one or both directions\n\
41897db96d56Sopenharmony_ci #define IPPROTO_PGM IPPROTO_PGM  // WinSock2 only
41907db96d56Sopenharmony_ci #define IPPROTO_L2TP IPPROTO_L2TP  // WinSock2 only
41917db96d56Sopenharmony_ci #define IPPROTO_SCTP IPPROTO_SCTP  // WinSock2 only
41927db96d56Sopenharmony_ci-#endif /* MS_WINDOWS */
41937db96d56Sopenharmony_ci+#endif /* _MSC_VER */
41947db96d56Sopenharmony_ci 
41957db96d56Sopenharmony_ci /* Provides the IsWindows7SP1OrGreater() function */
41967db96d56Sopenharmony_ci #include <versionhelpers.h>
41977db96d56Sopenharmony_ci@@ -404,6 +404,10 @@ remove_unusable_flags(PyObject *m)
41987db96d56Sopenharmony_ci   /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
41997db96d56Sopenharmony_ci    * EAI_* constants are defined in (the already included) ws2tcpip.h.
42007db96d56Sopenharmony_ci    */
42017db96d56Sopenharmony_ci+#elif defined(__MINGW32__)
42027db96d56Sopenharmony_ci+  /* Do not include addrinfo.h as minimum supported version is
42037db96d56Sopenharmony_ci+   * _WIN32_WINNT >= WindowsXP(0x0501)
42047db96d56Sopenharmony_ci+   */
42057db96d56Sopenharmony_ci #else
42067db96d56Sopenharmony_ci #  include "addrinfo.h"
42077db96d56Sopenharmony_ci #endif
42087db96d56Sopenharmony_cidiff --git a/Modules/socketmodule.h b/Modules/socketmodule.h
42097db96d56Sopenharmony_ciindex 1b35b11..cff1f1d 100644
42107db96d56Sopenharmony_ci--- a/Modules/socketmodule.h
42117db96d56Sopenharmony_ci+++ b/Modules/socketmodule.h
42127db96d56Sopenharmony_ci@@ -68,8 +68,10 @@ struct SOCKADDR_BTH_REDEF {
42137db96d56Sopenharmony_ci  */
42147db96d56Sopenharmony_ci # ifdef SIO_GET_MULTICAST_FILTER
42157db96d56Sopenharmony_ci #  include <mstcpip.h> /* for SIO_RCVALL */
42167db96d56Sopenharmony_ci+#ifndef __MINGW32__ /* resolve by configure */
42177db96d56Sopenharmony_ci #  define HAVE_ADDRINFO
42187db96d56Sopenharmony_ci #  define HAVE_SOCKADDR_STORAGE
42197db96d56Sopenharmony_ci+#endif
42207db96d56Sopenharmony_ci #  define HAVE_GETADDRINFO
42217db96d56Sopenharmony_ci #  define HAVE_GETNAMEINFO
42227db96d56Sopenharmony_ci #  define ENABLE_IPV6
42237db96d56Sopenharmony_cidiff --git a/Modules/timemodule.c b/Modules/timemodule.c
42247db96d56Sopenharmony_ciindex 18f9ddb..4edc2e7 100644
42257db96d56Sopenharmony_ci--- a/Modules/timemodule.c
42267db96d56Sopenharmony_ci+++ b/Modules/timemodule.c
42277db96d56Sopenharmony_ci@@ -783,7 +783,7 @@ time_strftime(PyObject *module, PyObject *args)
42287db96d56Sopenharmony_ci         return NULL;
42297db96d56Sopenharmony_ci     }
42307db96d56Sopenharmony_ci 
42317db96d56Sopenharmony_ci-#if defined(_MSC_VER) || (defined(__sun) && defined(__SVR4)) || defined(_AIX) || defined(__VXWORKS__)
42327db96d56Sopenharmony_ci+#if defined(MS_WINDOWS) || (defined(__sun) && defined(__SVR4)) || defined(_AIX) || defined(__VXWORKS__)
42337db96d56Sopenharmony_ci     if (buf.tm_year + 1900 < 1 || 9999 < buf.tm_year + 1900) {
42347db96d56Sopenharmony_ci         PyErr_SetString(PyExc_ValueError,
42357db96d56Sopenharmony_ci                         "strftime() requires year in [1; 9999]");
42367db96d56Sopenharmony_cidiff --git a/Objects/fileobject.c b/Objects/fileobject.c
42377db96d56Sopenharmony_ciindex ffe55eb..1d73c09 100644
42387db96d56Sopenharmony_ci--- a/Objects/fileobject.c
42397db96d56Sopenharmony_ci+++ b/Objects/fileobject.c
42407db96d56Sopenharmony_ci@@ -3,6 +3,7 @@
42417db96d56Sopenharmony_ci #define PY_SSIZE_T_CLEAN
42427db96d56Sopenharmony_ci #include "Python.h"
42437db96d56Sopenharmony_ci #include "pycore_call.h"          // _PyObject_CallNoArgs()
42447db96d56Sopenharmony_ci+#include "iscygpty.h"
42457db96d56Sopenharmony_ci #include "pycore_runtime.h"       // _PyRuntime
42467db96d56Sopenharmony_ci 
42477db96d56Sopenharmony_ci #if defined(HAVE_GETC_UNLOCKED) && !defined(_Py_MEMORY_SANITIZER)
42487db96d56Sopenharmony_ci@@ -387,7 +388,7 @@ stdprinter_isatty(PyStdPrinter_Object *self, PyObject *Py_UNUSED(ignored))
42497db96d56Sopenharmony_ci     }
42507db96d56Sopenharmony_ci 
42517db96d56Sopenharmony_ci     Py_BEGIN_ALLOW_THREADS
42527db96d56Sopenharmony_ci-    res = isatty(self->fd);
42537db96d56Sopenharmony_ci+    res = isatty(self->fd) || is_cygpty(self->fd);
42547db96d56Sopenharmony_ci     Py_END_ALLOW_THREADS
42557db96d56Sopenharmony_ci 
42567db96d56Sopenharmony_ci     return PyBool_FromLong(res);
42577db96d56Sopenharmony_cidiff --git a/PC/_testconsole.c b/PC/_testconsole.c
42587db96d56Sopenharmony_ciindex a830883..52aca33 100644
42597db96d56Sopenharmony_ci--- a/PC/_testconsole.c
42607db96d56Sopenharmony_ci+++ b/PC/_testconsole.c
42617db96d56Sopenharmony_ci@@ -10,7 +10,7 @@
42627db96d56Sopenharmony_ci #ifdef MS_WINDOWS
42637db96d56Sopenharmony_ci 
42647db96d56Sopenharmony_ci #include "pycore_fileutils.h"     // _Py_get_osfhandle()
42657db96d56Sopenharmony_ci-#include "..\modules\_io\_iomodule.h"
42667db96d56Sopenharmony_ci+#include "../Modules/_io/_iomodule.h"
42677db96d56Sopenharmony_ci 
42687db96d56Sopenharmony_ci #define WIN32_LEAN_AND_MEAN
42697db96d56Sopenharmony_ci #include <windows.h>
42707db96d56Sopenharmony_ci@@ -108,7 +108,7 @@ _testconsole_read_output_impl(PyObject *module, PyObject *file)
42717db96d56Sopenharmony_ci     Py_RETURN_NONE;
42727db96d56Sopenharmony_ci }
42737db96d56Sopenharmony_ci 
42747db96d56Sopenharmony_ci-#include "clinic\_testconsole.c.h"
42757db96d56Sopenharmony_ci+#include "clinic/_testconsole.c.h"
42767db96d56Sopenharmony_ci 
42777db96d56Sopenharmony_ci PyMethodDef testconsole_methods[] = {
42787db96d56Sopenharmony_ci     _TESTCONSOLE_WRITE_INPUT_METHODDEF
42797db96d56Sopenharmony_cidiff --git a/PC/launcher.c b/PC/launcher.c
42807db96d56Sopenharmony_ciindex da566a1..09ac7d9 100644
42817db96d56Sopenharmony_ci--- a/PC/launcher.c
42827db96d56Sopenharmony_ci+++ b/PC/launcher.c
42837db96d56Sopenharmony_ci@@ -155,12 +155,12 @@ static wchar_t * get_env(wchar_t * key)
42847db96d56Sopenharmony_ci #else
42857db96d56Sopenharmony_ci #if defined(_WINDOWS)
42867db96d56Sopenharmony_ci 
42877db96d56Sopenharmony_ci-#define PYTHON_EXECUTABLE L"pythonw.exe"
42887db96d56Sopenharmony_ci+#define PYTHON_EXECUTABLE PYTHON_EXECUTABLE_WITH_VERSION
42897db96d56Sopenharmony_ci #define EXECUTABLEPATH_VALUE L"WindowedExecutablePath"
42907db96d56Sopenharmony_ci 
42917db96d56Sopenharmony_ci #else
42927db96d56Sopenharmony_ci 
42937db96d56Sopenharmony_ci-#define PYTHON_EXECUTABLE L"python.exe"
42947db96d56Sopenharmony_ci+#define PYTHON_EXECUTABLE PYTHON_EXECUTABLE_WITH_VERSION
42957db96d56Sopenharmony_ci #define EXECUTABLEPATH_VALUE L"ExecutablePath"
42967db96d56Sopenharmony_ci 
42977db96d56Sopenharmony_ci #endif
42987db96d56Sopenharmony_ci@@ -925,7 +925,7 @@ static COMMAND path_command;
42997db96d56Sopenharmony_ci static COMMAND * find_on_path(wchar_t * name)
43007db96d56Sopenharmony_ci {
43017db96d56Sopenharmony_ci     wchar_t * pathext;
43027db96d56Sopenharmony_ci-    size_t    varsize;
43037db96d56Sopenharmony_ci+    size_t    requiredSize;
43047db96d56Sopenharmony_ci     wchar_t * context = NULL;
43057db96d56Sopenharmony_ci     wchar_t * extension;
43067db96d56Sopenharmony_ci     COMMAND * result = NULL;
43077db96d56Sopenharmony_ci@@ -942,18 +942,23 @@ static COMMAND * find_on_path(wchar_t * name)
43087db96d56Sopenharmony_ci     }
43097db96d56Sopenharmony_ci     else {
43107db96d56Sopenharmony_ci         /* No extension - search using registered extensions. */
43117db96d56Sopenharmony_ci-        rc = _wdupenv_s(&pathext, &varsize, L"PATHEXT");
43127db96d56Sopenharmony_ci-        if (rc == 0) {
43137db96d56Sopenharmony_ci-            extension = wcstok_s(pathext, L";", &context);
43147db96d56Sopenharmony_ci-            while (extension) {
43157db96d56Sopenharmony_ci-                len = SearchPathW(NULL, name, extension, MSGSIZE, path_command.value, NULL);
43167db96d56Sopenharmony_ci-                if (len) {
43177db96d56Sopenharmony_ci-                    result = &path_command;
43187db96d56Sopenharmony_ci-                    break;
43197db96d56Sopenharmony_ci+        _wgetenv_s(&requiredSize, NULL, 0, L"PATHEXT");
43207db96d56Sopenharmony_ci+        if (requiredSize > 0) {
43217db96d56Sopenharmony_ci+            pathext = (wchar_t *)malloc(requiredSize * sizeof(wchar_t));
43227db96d56Sopenharmony_ci+            /* No extension - search using registered extensions. */
43237db96d56Sopenharmony_ci+            rc = _wgetenv_s(&requiredSize, pathext, requiredSize, L"PATHEXT");
43247db96d56Sopenharmony_ci+            if (rc == 0) {
43257db96d56Sopenharmony_ci+                extension = wcstok_s(pathext, L";", &context);
43267db96d56Sopenharmony_ci+                while (extension) {
43277db96d56Sopenharmony_ci+                    len = SearchPathW(NULL, name, extension, MSGSIZE, path_command.value, NULL);
43287db96d56Sopenharmony_ci+                    if (len) {
43297db96d56Sopenharmony_ci+                        result = &path_command;
43307db96d56Sopenharmony_ci+                        break;
43317db96d56Sopenharmony_ci+                    }
43327db96d56Sopenharmony_ci+                    extension = wcstok_s(NULL, L";", &context);
43337db96d56Sopenharmony_ci                 }
43347db96d56Sopenharmony_ci-                extension = wcstok_s(NULL, L";", &context);
43357db96d56Sopenharmony_ci+                free(pathext);
43367db96d56Sopenharmony_ci             }
43377db96d56Sopenharmony_ci-            free(pathext);
43387db96d56Sopenharmony_ci         }
43397db96d56Sopenharmony_ci     }
43407db96d56Sopenharmony_ci     return result;
43417db96d56Sopenharmony_ci@@ -1913,7 +1918,7 @@ process(int argc, wchar_t ** argv)
43427db96d56Sopenharmony_ci         if (_wfopen_s(&f, venv_cfg_path, L"r")) {
43437db96d56Sopenharmony_ci             error(RC_BAD_VENV_CFG, L"Cannot read '%ls'", venv_cfg_path);
43447db96d56Sopenharmony_ci         }
43457db96d56Sopenharmony_ci-        cb = fread_s(buffer, sizeof(buffer), sizeof(buffer[0]),
43467db96d56Sopenharmony_ci+        cb = fread(buffer, sizeof(buffer[0]),
43477db96d56Sopenharmony_ci                      sizeof(buffer) / sizeof(buffer[0]), f);
43487db96d56Sopenharmony_ci         fclose(f);
43497db96d56Sopenharmony_ci 
43507db96d56Sopenharmony_cidiff --git a/PC/msvcrtmodule.c b/PC/msvcrtmodule.c
43517db96d56Sopenharmony_ciindex 1f78d99..0f2da80 100644
43527db96d56Sopenharmony_ci--- a/PC/msvcrtmodule.c
43537db96d56Sopenharmony_ci+++ b/PC/msvcrtmodule.c
43547db96d56Sopenharmony_ci@@ -22,7 +22,9 @@
43557db96d56Sopenharmony_ci #include <io.h>
43567db96d56Sopenharmony_ci #include <conio.h>
43577db96d56Sopenharmony_ci #include <sys/locking.h>
43587db96d56Sopenharmony_ci+#ifdef _DEBUG
43597db96d56Sopenharmony_ci #include <crtdbg.h>
43607db96d56Sopenharmony_ci+#endif
43617db96d56Sopenharmony_ci #include <windows.h>
43627db96d56Sopenharmony_ci 
43637db96d56Sopenharmony_ci #ifdef _MSC_VER
43647db96d56Sopenharmony_cidiff --git a/PC/pylauncher.rc b/PC/pylauncher.rc
43657db96d56Sopenharmony_ciindex 1186264..84b2917 100644
43667db96d56Sopenharmony_ci--- a/PC/pylauncher.rc
43677db96d56Sopenharmony_ci+++ b/PC/pylauncher.rc
43687db96d56Sopenharmony_ci@@ -12,17 +12,17 @@
43697db96d56Sopenharmony_ci 1 RT_MANIFEST "python.manifest"
43707db96d56Sopenharmony_ci 
43717db96d56Sopenharmony_ci #if defined(PY_ICON)
43727db96d56Sopenharmony_ci-1 ICON DISCARDABLE "icons\python.ico"
43737db96d56Sopenharmony_ci+1 ICON DISCARDABLE "icons/python.ico"
43747db96d56Sopenharmony_ci #elif defined(PYW_ICON)
43757db96d56Sopenharmony_ci-1 ICON DISCARDABLE "icons\pythonw.ico"
43767db96d56Sopenharmony_ci+1 ICON DISCARDABLE "icons/pythonw.ico"
43777db96d56Sopenharmony_ci #else
43787db96d56Sopenharmony_ci-1 ICON DISCARDABLE "icons\launcher.ico" 
43797db96d56Sopenharmony_ci-2 ICON DISCARDABLE "icons\py.ico" 
43807db96d56Sopenharmony_ci-3 ICON DISCARDABLE "icons\pyc.ico" 
43817db96d56Sopenharmony_ci-4 ICON DISCARDABLE "icons\pyd.ico" 
43827db96d56Sopenharmony_ci-5 ICON DISCARDABLE "icons\python.ico"
43837db96d56Sopenharmony_ci-6 ICON DISCARDABLE "icons\pythonw.ico"
43847db96d56Sopenharmony_ci-7 ICON DISCARDABLE "icons\setup.ico" 
43857db96d56Sopenharmony_ci+1 ICON DISCARDABLE "icons/launcher.ico"
43867db96d56Sopenharmony_ci+2 ICON DISCARDABLE "icons/py.ico" 
43877db96d56Sopenharmony_ci+3 ICON DISCARDABLE "icons/pyc.ico" 
43887db96d56Sopenharmony_ci+4 ICON DISCARDABLE "icons/pyd.ico" 
43897db96d56Sopenharmony_ci+5 ICON DISCARDABLE "icons/python.ico"
43907db96d56Sopenharmony_ci+6 ICON DISCARDABLE "icons/pythonw.ico"
43917db96d56Sopenharmony_ci+7 ICON DISCARDABLE "icons/setup.ico" 
43927db96d56Sopenharmony_ci #endif
43937db96d56Sopenharmony_ci 
43947db96d56Sopenharmony_ci 1 USAGE "launcher-usage.txt"
43957db96d56Sopenharmony_ci@@ -64,4 +64,4 @@ BEGIN
43967db96d56Sopenharmony_ci     BEGIN
43977db96d56Sopenharmony_ci         VALUE "Translation", 0x0, 1200
43987db96d56Sopenharmony_ci     END
43997db96d56Sopenharmony_ci-END
44007db96d56Sopenharmony_ci\ No newline at end of file
44017db96d56Sopenharmony_ci+END
44027db96d56Sopenharmony_cidiff --git a/PC/python3dll.c b/PC/python3dll.c
44037db96d56Sopenharmony_ciindex 50e7a96..8b524fd 100755
44047db96d56Sopenharmony_ci--- a/PC/python3dll.c
44057db96d56Sopenharmony_ci+++ b/PC/python3dll.c
44067db96d56Sopenharmony_ci@@ -3,6 +3,7 @@
44077db96d56Sopenharmony_ci 
44087db96d56Sopenharmony_ci /* Generated by Tools/scripts/stable_abi.py */
44097db96d56Sopenharmony_ci 
44107db96d56Sopenharmony_ci+#ifdef _MSC_VER
44117db96d56Sopenharmony_ci #ifdef _M_IX86
44127db96d56Sopenharmony_ci #define DECORATE "_"
44137db96d56Sopenharmony_ci #else
44147db96d56Sopenharmony_ci@@ -13,6 +14,13 @@
44157db96d56Sopenharmony_ci     __pragma(comment(linker, "/EXPORT:" DECORATE #name "=" PYTHON_DLL_NAME "." #name))
44167db96d56Sopenharmony_ci #define EXPORT_DATA(name) \
44177db96d56Sopenharmony_ci     __pragma(comment(linker, "/EXPORT:" DECORATE #name "=" PYTHON_DLL_NAME "." #name ",DATA"))
44187db96d56Sopenharmony_ci+#else
44197db96d56Sopenharmony_ci+// XXX: Why do we need the .dll extension and no DECORATE compared to the MSVC case?
44207db96d56Sopenharmony_ci+#define EXPORT_FUNC(name) \
44217db96d56Sopenharmony_ci+    asm(".section .drectve\n\t.ascii \" -export:" #name "=\\\"" PYTHON_DLL_NAME "." #name "\\\" \"");
44227db96d56Sopenharmony_ci+#define EXPORT_DATA(name) \
44237db96d56Sopenharmony_ci+    asm(".section .drectve\n\t.ascii \" -export:" #name "=\\\"" PYTHON_DLL_NAME "." #name "\\\",DATA \"");
44247db96d56Sopenharmony_ci+#endif
44257db96d56Sopenharmony_ci 
44267db96d56Sopenharmony_ci EXPORT_FUNC(_Py_BuildValue_SizeT)
44277db96d56Sopenharmony_ci EXPORT_FUNC(_Py_CheckRecursiveCall)
44287db96d56Sopenharmony_cidiff --git a/PC/python_exe.rc b/PC/python_exe.rc
44297db96d56Sopenharmony_ciindex c3d3bff..dde0e53 100644
44307db96d56Sopenharmony_ci--- a/PC/python_exe.rc
44317db96d56Sopenharmony_ci+++ b/PC/python_exe.rc
44327db96d56Sopenharmony_ci@@ -12,7 +12,7 @@
44337db96d56Sopenharmony_ci // current versions of Windows.
44347db96d56Sopenharmony_ci 1 RT_MANIFEST "python.manifest"
44357db96d56Sopenharmony_ci 
44367db96d56Sopenharmony_ci-1 ICON DISCARDABLE "icons\python.ico" 
44377db96d56Sopenharmony_ci+1 ICON DISCARDABLE "icons/python.ico"
44387db96d56Sopenharmony_ci 
44397db96d56Sopenharmony_ci 
44407db96d56Sopenharmony_ci /////////////////////////////////////////////////////////////////////////////
44417db96d56Sopenharmony_cidiff --git a/PC/pythonw_exe.rc b/PC/pythonw_exe.rc
44427db96d56Sopenharmony_ciindex 38570b7..7ce1043 100644
44437db96d56Sopenharmony_ci--- a/PC/pythonw_exe.rc
44447db96d56Sopenharmony_ci+++ b/PC/pythonw_exe.rc
44457db96d56Sopenharmony_ci@@ -12,7 +12,7 @@
44467db96d56Sopenharmony_ci // current versions of Windows.
44477db96d56Sopenharmony_ci 1 RT_MANIFEST "python.manifest"
44487db96d56Sopenharmony_ci 
44497db96d56Sopenharmony_ci-1 ICON DISCARDABLE "icons\pythonw.ico" 
44507db96d56Sopenharmony_ci+1 ICON DISCARDABLE "icons/pythonw.ico"
44517db96d56Sopenharmony_ci 
44527db96d56Sopenharmony_ci 
44537db96d56Sopenharmony_ci /////////////////////////////////////////////////////////////////////////////
44547db96d56Sopenharmony_cidiff --git a/PC/winreg.c b/PC/winreg.c
44557db96d56Sopenharmony_ciindex f668cf3..08548a7 100644
44567db96d56Sopenharmony_ci--- a/PC/winreg.c
44577db96d56Sopenharmony_ci+++ b/PC/winreg.c
44587db96d56Sopenharmony_ci@@ -18,6 +18,25 @@
44597db96d56Sopenharmony_ci #include "structmember.h"         // PyMemberDef
44607db96d56Sopenharmony_ci #include <windows.h>
44617db96d56Sopenharmony_ci 
44627db96d56Sopenharmony_ci+#ifndef SIZEOF_HKEY
44637db96d56Sopenharmony_ci+/* used only here */
44647db96d56Sopenharmony_ci+#if defined(MS_WIN64)
44657db96d56Sopenharmony_ci+#  define SIZEOF_HKEY 8
44667db96d56Sopenharmony_ci+#elif defined(MS_WIN32)
44677db96d56Sopenharmony_ci+#  define SIZEOF_HKEY 4
44687db96d56Sopenharmony_ci+#else
44697db96d56Sopenharmony_ci+#  error "SIZEOF_HKEY is not defined"
44707db96d56Sopenharmony_ci+#endif
44717db96d56Sopenharmony_ci+#endif
44727db96d56Sopenharmony_ci+
44737db96d56Sopenharmony_ci+#ifndef REG_LEGAL_CHANGE_FILTER
44747db96d56Sopenharmony_ci+#define REG_LEGAL_CHANGE_FILTER        (\
44757db96d56Sopenharmony_ci+          REG_NOTIFY_CHANGE_NAME       |\
44767db96d56Sopenharmony_ci+          REG_NOTIFY_CHANGE_ATTRIBUTES |\
44777db96d56Sopenharmony_ci+          REG_NOTIFY_CHANGE_LAST_SET   |\
44787db96d56Sopenharmony_ci+          REG_NOTIFY_CHANGE_SECURITY   )
44797db96d56Sopenharmony_ci+#endif
44807db96d56Sopenharmony_ci+
44817db96d56Sopenharmony_ci static BOOL PyHKEY_AsHKEY(PyObject *ob, HKEY *pRes, BOOL bNoneOK);
44827db96d56Sopenharmony_ci static BOOL clinic_HKEY_converter(PyObject *ob, void *p);
44837db96d56Sopenharmony_ci static PyObject *PyHKEY_FromHKEY(HKEY h);
44847db96d56Sopenharmony_ci@@ -806,6 +825,7 @@ Reg2Py(BYTE *retDataBuf, DWORD retDataSize, DWORD typ)
44857db96d56Sopenharmony_ci         case REG_BINARY:
44867db96d56Sopenharmony_ci         /* ALSO handle ALL unknown data types here.  Even if we can't
44877db96d56Sopenharmony_ci            support it natively, we should handle the bits. */
44887db96d56Sopenharmony_ci+           /* fallthrough */
44897db96d56Sopenharmony_ci         default:
44907db96d56Sopenharmony_ci             if (retDataSize == 0) {
44917db96d56Sopenharmony_ci                 Py_INCREF(Py_None);
44927db96d56Sopenharmony_cidiff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
44937db96d56Sopenharmony_ciindex e20bd53..c035b6b 100644
44947db96d56Sopenharmony_ci--- a/Python/bltinmodule.c
44957db96d56Sopenharmony_ci+++ b/Python/bltinmodule.c
44967db96d56Sopenharmony_ci@@ -1,6 +1,7 @@
44977db96d56Sopenharmony_ci /* Built-in functions */
44987db96d56Sopenharmony_ci 
44997db96d56Sopenharmony_ci #include "Python.h"
45007db96d56Sopenharmony_ci+#include "iscygpty.h"
45017db96d56Sopenharmony_ci #include <ctype.h>
45027db96d56Sopenharmony_ci #include "pycore_ast.h"           // _PyAST_Validate()
45037db96d56Sopenharmony_ci #include "pycore_call.h"          // _PyObject_CallNoArgs()
45047db96d56Sopenharmony_ci@@ -2135,7 +2136,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
45057db96d56Sopenharmony_ci         Py_DECREF(tmp);
45067db96d56Sopenharmony_ci         if (fd < 0 && PyErr_Occurred())
45077db96d56Sopenharmony_ci             return NULL;
45087db96d56Sopenharmony_ci-        tty = fd == fileno(stdin) && isatty(fd);
45097db96d56Sopenharmony_ci+        tty = fd == fileno(stdin) && (isatty(fd) || is_cygpty(fd));
45107db96d56Sopenharmony_ci     }
45117db96d56Sopenharmony_ci     if (tty) {
45127db96d56Sopenharmony_ci         tmp = PyObject_CallMethodNoArgs(fout, &_Py_ID(fileno));
45137db96d56Sopenharmony_ci@@ -2148,7 +2149,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
45147db96d56Sopenharmony_ci             Py_DECREF(tmp);
45157db96d56Sopenharmony_ci             if (fd < 0 && PyErr_Occurred())
45167db96d56Sopenharmony_ci                 return NULL;
45177db96d56Sopenharmony_ci-            tty = fd == fileno(stdout) && isatty(fd);
45187db96d56Sopenharmony_ci+            tty = fd == fileno(stdout) && (isatty(fd) || is_cygpty(fd));
45197db96d56Sopenharmony_ci         }
45207db96d56Sopenharmony_ci     }
45217db96d56Sopenharmony_ci 
45227db96d56Sopenharmony_cidiff --git a/Python/dynamic_annotations.c b/Python/dynamic_annotations.c
45237db96d56Sopenharmony_ciindex 7febaa0..70d5b3d 100644
45247db96d56Sopenharmony_ci--- a/Python/dynamic_annotations.c
45257db96d56Sopenharmony_ci+++ b/Python/dynamic_annotations.c
45267db96d56Sopenharmony_ci@@ -27,7 +27,7 @@
45277db96d56Sopenharmony_ci  * Author: Kostya Serebryany
45287db96d56Sopenharmony_ci  */
45297db96d56Sopenharmony_ci 
45307db96d56Sopenharmony_ci-#ifdef _MSC_VER
45317db96d56Sopenharmony_ci+#ifdef MS_WINDOWS
45327db96d56Sopenharmony_ci # include <windows.h>
45337db96d56Sopenharmony_ci #endif
45347db96d56Sopenharmony_ci 
45357db96d56Sopenharmony_cidiff --git a/Python/dynload_win.c b/Python/dynload_win.c
45367db96d56Sopenharmony_ciindex 5dc4095..fcb7321 100644
45377db96d56Sopenharmony_ci--- a/Python/dynload_win.c
45387db96d56Sopenharmony_ci+++ b/Python/dynload_win.c
45397db96d56Sopenharmony_ci@@ -4,6 +4,7 @@
45407db96d56Sopenharmony_ci #include "Python.h"
45417db96d56Sopenharmony_ci #include "pycore_fileutils.h"     // _Py_add_relfile()
45427db96d56Sopenharmony_ci #include "pycore_pystate.h"       // _PyInterpreterState_GET()
45437db96d56Sopenharmony_ci+#include "pycore_initconfig.h"
45447db96d56Sopenharmony_ci 
45457db96d56Sopenharmony_ci #ifdef HAVE_DIRECT_H
45467db96d56Sopenharmony_ci #include <direct.h>
45477db96d56Sopenharmony_ci@@ -170,8 +171,7 @@ static char *GetPythonImport (HINSTANCE hModule)
45487db96d56Sopenharmony_ci    Return whether the DLL was found.
45497db96d56Sopenharmony_ci */
45507db96d56Sopenharmony_ci extern HMODULE PyWin_DLLhModule;
45517db96d56Sopenharmony_ci-static int
45527db96d56Sopenharmony_ci-_Py_CheckPython3(void)
45537db96d56Sopenharmony_ci+int _Py_CheckPython3(void)
45547db96d56Sopenharmony_ci {
45557db96d56Sopenharmony_ci     static int python3_checked = 0;
45567db96d56Sopenharmony_ci     static HANDLE hPython3;
45577db96d56Sopenharmony_ci@@ -224,7 +224,21 @@ dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix,
45587db96d56Sopenharmony_ci     dl_funcptr p;
45597db96d56Sopenharmony_ci     char funcname[258], *import_python;
45607db96d56Sopenharmony_ci 
45617db96d56Sopenharmony_ci-    _Py_CheckPython3();
45627db96d56Sopenharmony_ci+    int use_legacy = 0;
45637db96d56Sopenharmony_ci+    DWORD load_library_flags = 0;
45647db96d56Sopenharmony_ci+
45657db96d56Sopenharmony_ci+    _Py_get_env_flag(1, &use_legacy, "PYTHONLEGACYWINDOWSDLLLOADING");
45667db96d56Sopenharmony_ci+
45677db96d56Sopenharmony_ci+    if (use_legacy) {
45687db96d56Sopenharmony_ci+        load_library_flags = LOAD_WITH_ALTERED_SEARCH_PATH;
45697db96d56Sopenharmony_ci+    } else {
45707db96d56Sopenharmony_ci+        load_library_flags = LOAD_LIBRARY_SEARCH_DEFAULT_DIRS |
45717db96d56Sopenharmony_ci+                              LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR;
45727db96d56Sopenharmony_ci+    }
45737db96d56Sopenharmony_ci+
45747db96d56Sopenharmony_ci+#ifdef _MSC_VER
45757db96d56Sopenharmony_ci+    _Py_CheckPython3(); 
45767db96d56Sopenharmony_ci+#endif
45777db96d56Sopenharmony_ci 
45787db96d56Sopenharmony_ci #if USE_UNICODE_WCHAR_CACHE
45797db96d56Sopenharmony_ci     const wchar_t *wpathname = _PyUnicode_AsUnicode(pathname);
45807db96d56Sopenharmony_ci@@ -248,9 +262,7 @@ dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix,
45817db96d56Sopenharmony_ci            AddDllDirectory function. We add SEARCH_DLL_LOAD_DIR to
45827db96d56Sopenharmony_ci            ensure DLLs adjacent to the PYD are preferred. */
45837db96d56Sopenharmony_ci         Py_BEGIN_ALLOW_THREADS
45847db96d56Sopenharmony_ci-        hDLL = LoadLibraryExW(wpathname, NULL,
45857db96d56Sopenharmony_ci-                              LOAD_LIBRARY_SEARCH_DEFAULT_DIRS |
45867db96d56Sopenharmony_ci-                              LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);
45877db96d56Sopenharmony_ci+        hDLL = LoadLibraryExW(wpathname, NULL, load_library_flags);
45887db96d56Sopenharmony_ci         Py_END_ALLOW_THREADS
45897db96d56Sopenharmony_ci #if !USE_UNICODE_WCHAR_CACHE
45907db96d56Sopenharmony_ci         PyMem_Free(wpathname);
45917db96d56Sopenharmony_cidiff --git a/Python/fileutils.c b/Python/fileutils.c
45927db96d56Sopenharmony_ciindex c86ed40..e459255 100644
45937db96d56Sopenharmony_ci--- a/Python/fileutils.c
45947db96d56Sopenharmony_ci+++ b/Python/fileutils.c
45957db96d56Sopenharmony_ci@@ -1,4 +1,5 @@
45967db96d56Sopenharmony_ci #include "Python.h"
45977db96d56Sopenharmony_ci+#include "iscygpty.h"
45987db96d56Sopenharmony_ci #include "pycore_fileutils.h"     // fileutils definitions
45997db96d56Sopenharmony_ci #include "pycore_runtime.h"       // _PyRuntime
46007db96d56Sopenharmony_ci #include "osdefs.h"               // SEP
46017db96d56Sopenharmony_ci@@ -71,7 +72,7 @@ _Py_device_encoding(int fd)
46027db96d56Sopenharmony_ci     int valid;
46037db96d56Sopenharmony_ci     Py_BEGIN_ALLOW_THREADS
46047db96d56Sopenharmony_ci     _Py_BEGIN_SUPPRESS_IPH
46057db96d56Sopenharmony_ci-    valid = isatty(fd);
46067db96d56Sopenharmony_ci+    valid = isatty(fd) || is_cygpty(fd);
46077db96d56Sopenharmony_ci     _Py_END_SUPPRESS_IPH
46087db96d56Sopenharmony_ci     Py_END_ALLOW_THREADS
46097db96d56Sopenharmony_ci     if (!valid)
46107db96d56Sopenharmony_ci@@ -1809,12 +1810,12 @@ _Py_write_impl(int fd, const void *buf, size_t count, int gil_held)
46117db96d56Sopenharmony_ci            depending on heap usage). */
46127db96d56Sopenharmony_ci         if (gil_held) {
46137db96d56Sopenharmony_ci             Py_BEGIN_ALLOW_THREADS
46147db96d56Sopenharmony_ci-            if (isatty(fd)) {
46157db96d56Sopenharmony_ci+            if (isatty(fd) || is_cygpty(fd)) {
46167db96d56Sopenharmony_ci                 count = 32767;
46177db96d56Sopenharmony_ci             }
46187db96d56Sopenharmony_ci             Py_END_ALLOW_THREADS
46197db96d56Sopenharmony_ci         } else {
46207db96d56Sopenharmony_ci-            if (isatty(fd)) {
46217db96d56Sopenharmony_ci+            if (isatty(fd) || is_cygpty(fd)) {
46227db96d56Sopenharmony_ci                 count = 32767;
46237db96d56Sopenharmony_ci             }
46247db96d56Sopenharmony_ci         }
46257db96d56Sopenharmony_ci@@ -2004,19 +2005,31 @@ int
46267db96d56Sopenharmony_ci _Py_isabs(const wchar_t *path)
46277db96d56Sopenharmony_ci {
46287db96d56Sopenharmony_ci #ifdef MS_WINDOWS
46297db96d56Sopenharmony_ci+    // create a copy of path and replace all forward slashes with backslashes
46307db96d56Sopenharmony_ci+    // pathccskiproot does not handle forward slashes
46317db96d56Sopenharmony_ci+    wchar_t *path_copy = _wcsdup(path);
46327db96d56Sopenharmony_ci+    if (path_copy == NULL) {
46337db96d56Sopenharmony_ci+        return 0;
46347db96d56Sopenharmony_ci+    }
46357db96d56Sopenharmony_ci+    Py_NormalizeSepsPathcchW(path_copy);
46367db96d56Sopenharmony_ci+
46377db96d56Sopenharmony_ci     const wchar_t *tail;
46387db96d56Sopenharmony_ci-    HRESULT hr = PathCchSkipRoot(path, &tail);
46397db96d56Sopenharmony_ci-    if (FAILED(hr) || path == tail) {
46407db96d56Sopenharmony_ci+    HRESULT hr = PathCchSkipRoot(path_copy, &tail);
46417db96d56Sopenharmony_ci+    if (FAILED(hr) || path_copy == tail) {
46427db96d56Sopenharmony_ci+        free(path_copy);
46437db96d56Sopenharmony_ci         return 0;
46447db96d56Sopenharmony_ci     }
46457db96d56Sopenharmony_ci-    if (tail == &path[1] && (path[0] == SEP || path[0] == ALTSEP)) {
46467db96d56Sopenharmony_ci+    if (tail == &path_copy[1] && (path_copy[0] == SEP || path_copy[0] == ALTSEP)) {
46477db96d56Sopenharmony_ci         // Exclude paths with leading SEP
46487db96d56Sopenharmony_ci+        free(path_copy);
46497db96d56Sopenharmony_ci         return 0;
46507db96d56Sopenharmony_ci     }
46517db96d56Sopenharmony_ci-    if (tail == &path[2] && path[1] == L':') {
46527db96d56Sopenharmony_ci+    if (tail == &path_copy[2] && path_copy[1] == L':') {
46537db96d56Sopenharmony_ci         // Exclude drive-relative paths (e.g. C:filename.ext)
46547db96d56Sopenharmony_ci+        free(path_copy);
46557db96d56Sopenharmony_ci         return 0;
46567db96d56Sopenharmony_ci     }
46577db96d56Sopenharmony_ci+    free(path_copy);
46587db96d56Sopenharmony_ci     return 1;
46597db96d56Sopenharmony_ci #else
46607db96d56Sopenharmony_ci     return (path[0] == SEP);
46617db96d56Sopenharmony_ci@@ -2049,7 +2062,11 @@ _Py_abspath(const wchar_t *path, wchar_t **abspath_p)
46627db96d56Sopenharmony_ci     }
46637db96d56Sopenharmony_ci 
46647db96d56Sopenharmony_ci #ifdef MS_WINDOWS
46657db96d56Sopenharmony_ci-    return _PyOS_getfullpathname(path, abspath_p);
46667db96d56Sopenharmony_ci+    if (_PyOS_getfullpathname(path, abspath_p) < 0){
46677db96d56Sopenharmony_ci+        return -1;
46687db96d56Sopenharmony_ci+    }
46697db96d56Sopenharmony_ci+    *abspath_p = _Py_normpath(*abspath_p, -1);
46707db96d56Sopenharmony_ci+    return 0;
46717db96d56Sopenharmony_ci #else
46727db96d56Sopenharmony_ci     wchar_t cwd[MAXPATHLEN + 1];
46737db96d56Sopenharmony_ci     cwd[Py_ARRAY_LENGTH(cwd) - 1] = 0;
46747db96d56Sopenharmony_ci@@ -2093,6 +2110,8 @@ join_relfile(wchar_t *buffer, size_t bufsize,
46757db96d56Sopenharmony_ci              const wchar_t *dirname, const wchar_t *relfile)
46767db96d56Sopenharmony_ci {
46777db96d56Sopenharmony_ci #ifdef MS_WINDOWS
46787db96d56Sopenharmony_ci+    Py_NormalizeSepsPathcchW(dirname);
46797db96d56Sopenharmony_ci+    Py_NormalizeSepsPathcchW(relfile);
46807db96d56Sopenharmony_ci     if (FAILED(PathCchCombineEx(buffer, bufsize, dirname, relfile,
46817db96d56Sopenharmony_ci         PATHCCH_ALLOW_LONG_PATHS))) {
46827db96d56Sopenharmony_ci         return -1;
46837db96d56Sopenharmony_ci@@ -2195,11 +2214,16 @@ _Py_normpath_and_size(wchar_t *path, Py_ssize_t size, Py_ssize_t *normsize)
46847db96d56Sopenharmony_ci     wchar_t *minP2 = path;  // the beginning of the destination range
46857db96d56Sopenharmony_ci     wchar_t lastC = L'\0';  // the last ljusted character, p2[-1] in most cases
46867db96d56Sopenharmony_ci 
46877db96d56Sopenharmony_ci+    const wchar_t sep = Py_GetSepW(NULL);
46887db96d56Sopenharmony_ci+#ifdef ALTSEP
46897db96d56Sopenharmony_ci+    const wchar_t altsep = Py_GetAltSepW(NULL);
46907db96d56Sopenharmony_ci+#endif
46917db96d56Sopenharmony_ci+
46927db96d56Sopenharmony_ci #define IS_END(x) (pEnd ? (x) == pEnd : !*(x))
46937db96d56Sopenharmony_ci #ifdef ALTSEP
46947db96d56Sopenharmony_ci-#define IS_SEP(x) (*(x) == SEP || *(x) == ALTSEP)
46957db96d56Sopenharmony_ci+#define IS_SEP(x) (*(x) == sep || *(x) == altsep)
46967db96d56Sopenharmony_ci #else
46977db96d56Sopenharmony_ci-#define IS_SEP(x) (*(x) == SEP)
46987db96d56Sopenharmony_ci+#define IS_SEP(x) (*(x) == sep)
46997db96d56Sopenharmony_ci #endif
47007db96d56Sopenharmony_ci #define SEP_OR_END(x) (IS_SEP(x) || IS_END(x))
47017db96d56Sopenharmony_ci 
47027db96d56Sopenharmony_ci@@ -2210,7 +2234,7 @@ _Py_normpath_and_size(wchar_t *path, Py_ssize_t size, Py_ssize_t *normsize)
47037db96d56Sopenharmony_ci             path++;
47047db96d56Sopenharmony_ci         }
47057db96d56Sopenharmony_ci         p1 = p2 = minP2 = path;
47067db96d56Sopenharmony_ci-        lastC = SEP;
47077db96d56Sopenharmony_ci+        lastC = sep;
47087db96d56Sopenharmony_ci     }
47097db96d56Sopenharmony_ci #ifdef MS_WINDOWS
47107db96d56Sopenharmony_ci     // Skip past drive segment and update minP2
47117db96d56Sopenharmony_ci@@ -2224,13 +2248,13 @@ _Py_normpath_and_size(wchar_t *path, Py_ssize_t size, Py_ssize_t *normsize)
47127db96d56Sopenharmony_ci     // and network paths, including the first segment.
47137db96d56Sopenharmony_ci     else if (IS_SEP(&p1[0]) && IS_SEP(&p1[1])) {
47147db96d56Sopenharmony_ci         int sepCount = 2;
47157db96d56Sopenharmony_ci-        *p2++ = SEP;
47167db96d56Sopenharmony_ci-        *p2++ = SEP;
47177db96d56Sopenharmony_ci+        *p2++ = sep;
47187db96d56Sopenharmony_ci+        *p2++ = sep;
47197db96d56Sopenharmony_ci         p1 += 2;
47207db96d56Sopenharmony_ci         for (; !IS_END(p1) && sepCount; ++p1) {
47217db96d56Sopenharmony_ci             if (IS_SEP(p1)) {
47227db96d56Sopenharmony_ci                 --sepCount;
47237db96d56Sopenharmony_ci-                *p2++ = lastC = SEP;
47247db96d56Sopenharmony_ci+                *p2++ = lastC = sep;
47257db96d56Sopenharmony_ci             } else {
47267db96d56Sopenharmony_ci                 *p2++ = lastC = *p1;
47277db96d56Sopenharmony_ci             }
47287db96d56Sopenharmony_ci@@ -2243,7 +2267,7 @@ _Py_normpath_and_size(wchar_t *path, Py_ssize_t size, Py_ssize_t *normsize)
47297db96d56Sopenharmony_ci         *p2++ = *p1++;
47307db96d56Sopenharmony_ci         *p2++ = *p1++;
47317db96d56Sopenharmony_ci         minP2 = p2 - 1;  // Absolute path has SEP at minP2
47327db96d56Sopenharmony_ci-        lastC = SEP;
47337db96d56Sopenharmony_ci+        lastC = sep;
47347db96d56Sopenharmony_ci     }
47357db96d56Sopenharmony_ci #endif /* MS_WINDOWS */
47367db96d56Sopenharmony_ci 
47377db96d56Sopenharmony_ci@@ -2251,18 +2275,18 @@ _Py_normpath_and_size(wchar_t *path, Py_ssize_t size, Py_ssize_t *normsize)
47387db96d56Sopenharmony_ci     for (; !IS_END(p1); ++p1) {
47397db96d56Sopenharmony_ci         wchar_t c = *p1;
47407db96d56Sopenharmony_ci #ifdef ALTSEP
47417db96d56Sopenharmony_ci-        if (c == ALTSEP) {
47427db96d56Sopenharmony_ci-            c = SEP;
47437db96d56Sopenharmony_ci+        if (c == altsep) {
47447db96d56Sopenharmony_ci+            c = sep;
47457db96d56Sopenharmony_ci         }
47467db96d56Sopenharmony_ci #endif
47477db96d56Sopenharmony_ci-        if (lastC == SEP) {
47487db96d56Sopenharmony_ci+        if (lastC == sep) {
47497db96d56Sopenharmony_ci             if (c == L'.') {
47507db96d56Sopenharmony_ci                 int sep_at_1 = SEP_OR_END(&p1[1]);
47517db96d56Sopenharmony_ci                 int sep_at_2 = !sep_at_1 && SEP_OR_END(&p1[2]);
47527db96d56Sopenharmony_ci                 if (sep_at_2 && p1[1] == L'.') {
47537db96d56Sopenharmony_ci                     wchar_t *p3 = p2;
47547db96d56Sopenharmony_ci-                    while (p3 != minP2 && *--p3 == SEP) { }
47557db96d56Sopenharmony_ci-                    while (p3 != minP2 && *(p3 - 1) != SEP) { --p3; }
47567db96d56Sopenharmony_ci+                    while (p3 != minP2 && *--p3 == sep) { }
47577db96d56Sopenharmony_ci+                    while (p3 != minP2 && *(p3 - 1) != sep) { --p3; }
47587db96d56Sopenharmony_ci                     if (p2 == minP2
47597db96d56Sopenharmony_ci                         || (p3[0] == L'.' && p3[1] == L'.' && IS_SEP(&p3[2])))
47607db96d56Sopenharmony_ci                     {
47617db96d56Sopenharmony_ci@@ -2271,7 +2295,7 @@ _Py_normpath_and_size(wchar_t *path, Py_ssize_t size, Py_ssize_t *normsize)
47627db96d56Sopenharmony_ci                         *p2++ = L'.';
47637db96d56Sopenharmony_ci                         *p2++ = L'.';
47647db96d56Sopenharmony_ci                         lastC = L'.';
47657db96d56Sopenharmony_ci-                    } else if (p3[0] == SEP) {
47667db96d56Sopenharmony_ci+                    } else if (p3[0] == sep) {
47677db96d56Sopenharmony_ci                         // Absolute path, so absorb segment
47687db96d56Sopenharmony_ci                         p2 = p3 + 1;
47697db96d56Sopenharmony_ci                     } else {
47707db96d56Sopenharmony_ci@@ -2282,7 +2306,7 @@ _Py_normpath_and_size(wchar_t *path, Py_ssize_t size, Py_ssize_t *normsize)
47717db96d56Sopenharmony_ci                 } else {
47727db96d56Sopenharmony_ci                     *p2++ = lastC = c;
47737db96d56Sopenharmony_ci                 }
47747db96d56Sopenharmony_ci-            } else if (c == SEP) {
47757db96d56Sopenharmony_ci+            } else if (c == sep) {
47767db96d56Sopenharmony_ci             } else {
47777db96d56Sopenharmony_ci                 *p2++ = lastC = c;
47787db96d56Sopenharmony_ci             }
47797db96d56Sopenharmony_ci@@ -2292,7 +2316,7 @@ _Py_normpath_and_size(wchar_t *path, Py_ssize_t size, Py_ssize_t *normsize)
47807db96d56Sopenharmony_ci     }
47817db96d56Sopenharmony_ci     *p2 = L'\0';
47827db96d56Sopenharmony_ci     if (p2 != minP2) {
47837db96d56Sopenharmony_ci-        while (--p2 != minP2 && *p2 == SEP) {
47847db96d56Sopenharmony_ci+        while (--p2 != minP2 && *p2 == sep) {
47857db96d56Sopenharmony_ci             *p2 = L'\0';
47867db96d56Sopenharmony_ci         }
47877db96d56Sopenharmony_ci     } else {
47887db96d56Sopenharmony_cidiff --git a/Python/frozenmain.c b/Python/frozenmain.c
47897db96d56Sopenharmony_ciindex 8743e08..c6f5f19 100644
47907db96d56Sopenharmony_ci--- a/Python/frozenmain.c
47917db96d56Sopenharmony_ci+++ b/Python/frozenmain.c
47927db96d56Sopenharmony_ci@@ -3,6 +3,7 @@
47937db96d56Sopenharmony_ci #include "Python.h"
47947db96d56Sopenharmony_ci #include "pycore_runtime.h"  // _PyRuntime_Initialize()
47957db96d56Sopenharmony_ci #include <locale.h>
47967db96d56Sopenharmony_ci+#include "iscygpty.h"
47977db96d56Sopenharmony_ci 
47987db96d56Sopenharmony_ci #ifdef MS_WINDOWS
47997db96d56Sopenharmony_ci extern void PyWinFreeze_ExeInit(void);
48007db96d56Sopenharmony_ci@@ -71,7 +72,7 @@ Py_FrozenMain(int argc, char **argv)
48017db96d56Sopenharmony_ci         sts = 0;
48027db96d56Sopenharmony_ci     }
48037db96d56Sopenharmony_ci 
48047db96d56Sopenharmony_ci-    if (inspect && isatty((int)fileno(stdin))) {
48057db96d56Sopenharmony_ci+    if (inspect && (isatty((int)fileno(stdin)) || is_cygpty((int)fileno(stdin))))
48067db96d56Sopenharmony_ci         sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
48077db96d56Sopenharmony_ci     }
48087db96d56Sopenharmony_ci 
48097db96d56Sopenharmony_cidiff --git a/Python/getcompiler.c b/Python/getcompiler.c
48107db96d56Sopenharmony_ciindex a5d2623..4b0b9b3 100644
48117db96d56Sopenharmony_ci--- a/Python/getcompiler.c
48127db96d56Sopenharmony_ci+++ b/Python/getcompiler.c
48137db96d56Sopenharmony_ci@@ -7,10 +7,40 @@
48147db96d56Sopenharmony_ci 
48157db96d56Sopenharmony_ci // Note the __clang__ conditional has to come before the __GNUC__ one because
48167db96d56Sopenharmony_ci // clang pretends to be GCC.
48177db96d56Sopenharmony_ci-#if defined(__clang__)
48187db96d56Sopenharmony_ci+#if defined(__clang__) && !defined(_WIN32)
48197db96d56Sopenharmony_ci #define COMPILER "[Clang " __clang_version__ "]"
48207db96d56Sopenharmony_ci #elif defined(__GNUC__)
48217db96d56Sopenharmony_ci-#define COMPILER "[GCC " __VERSION__ "]"
48227db96d56Sopenharmony_ci+/* To not break compatibility with things that determine
48237db96d56Sopenharmony_ci+   CPU arch by calling get_build_version in msvccompiler.py
48247db96d56Sopenharmony_ci+   (such as NumPy) add "32 bit" or "64 bit (AMD64)" on Windows
48257db96d56Sopenharmony_ci+   and also use a space as a separator rather than a newline. */
48267db96d56Sopenharmony_ci+#if defined(_WIN32)
48277db96d56Sopenharmony_ci+#define COMP_SEP " "
48287db96d56Sopenharmony_ci+#if defined(__x86_64__)
48297db96d56Sopenharmony_ci+#define ARCH_SUFFIX " 64 bit (AMD64)"
48307db96d56Sopenharmony_ci+#elif defined(__aarch64__)
48317db96d56Sopenharmony_ci+#define ARCH_SUFFIX " 64 bit (ARM64)"
48327db96d56Sopenharmony_ci+#elif defined(__arm__)
48337db96d56Sopenharmony_ci+#define ARCH_SUFFIX " 32 bit (ARM)"
48347db96d56Sopenharmony_ci+#else
48357db96d56Sopenharmony_ci+#define ARCH_SUFFIX " 32 bit"
48367db96d56Sopenharmony_ci+#endif
48377db96d56Sopenharmony_ci+#else
48387db96d56Sopenharmony_ci+#define COMP_SEP "\n"
48397db96d56Sopenharmony_ci+#define ARCH_SUFFIX ""
48407db96d56Sopenharmony_ci+#endif
48417db96d56Sopenharmony_ci+#if defined(__clang__)
48427db96d56Sopenharmony_ci+#define str(x) #x
48437db96d56Sopenharmony_ci+#define xstr(x) str(x)
48447db96d56Sopenharmony_ci+#define COMPILER COMP_SEP "[GCC Clang " xstr(__clang_major__) "." \
48457db96d56Sopenharmony_ci+        xstr(__clang_minor__) "." xstr(__clang_patchlevel__) ARCH_SUFFIX "]"
48467db96d56Sopenharmony_ci+#else
48477db96d56Sopenharmony_ci+#if defined(_UCRT)
48487db96d56Sopenharmony_ci+#define COMPILER COMP_SEP "[GCC UCRT " __VERSION__ ARCH_SUFFIX "]"
48497db96d56Sopenharmony_ci+#else
48507db96d56Sopenharmony_ci+#define COMPILER COMP_SEP "[GCC " __VERSION__ ARCH_SUFFIX "]"
48517db96d56Sopenharmony_ci+#endif
48527db96d56Sopenharmony_ci+#endif
48537db96d56Sopenharmony_ci // Generic fallbacks.
48547db96d56Sopenharmony_ci #elif defined(__cplusplus)
48557db96d56Sopenharmony_ci #define COMPILER "[C++]"
48567db96d56Sopenharmony_cidiff --git a/Python/initconfig.c b/Python/initconfig.c
48577db96d56Sopenharmony_ciindex d81cbaf..c54d238 100644
48587db96d56Sopenharmony_ci--- a/Python/initconfig.c
48597db96d56Sopenharmony_ci+++ b/Python/initconfig.c
48607db96d56Sopenharmony_ci@@ -176,7 +176,7 @@ static const char usage_envvars[] =
48617db96d56Sopenharmony_ci "PYTHONVERBOSE           : trace import statements (-v)\n"
48627db96d56Sopenharmony_ci "PYTHONWARNINGS=arg      : warning control (-W arg)\n";
48637db96d56Sopenharmony_ci 
48647db96d56Sopenharmony_ci-#if defined(MS_WINDOWS)
48657db96d56Sopenharmony_ci+#if defined(_MSC_VER)
48667db96d56Sopenharmony_ci #  define PYTHONHOMEHELP "<prefix>\\python{major}{minor}"
48677db96d56Sopenharmony_ci #else
48687db96d56Sopenharmony_ci #  define PYTHONHOMEHELP "<prefix>/lib/pythonX.X"
48697db96d56Sopenharmony_cidiff --git a/Python/iscygpty.c b/Python/iscygpty.c
48707db96d56Sopenharmony_cinew file mode 100755
48717db96d56Sopenharmony_ciindex 0000000..722f88f
48727db96d56Sopenharmony_ci--- /dev/null
48737db96d56Sopenharmony_ci+++ b/Python/iscygpty.c
48747db96d56Sopenharmony_ci@@ -0,0 +1,185 @@
48757db96d56Sopenharmony_ci+/*
48767db96d56Sopenharmony_ci+ * iscygpty.c -- part of ptycheck
48777db96d56Sopenharmony_ci+ * https://github.com/k-takata/ptycheck
48787db96d56Sopenharmony_ci+ *
48797db96d56Sopenharmony_ci+ * Copyright (c) 2015-2017 K.Takata
48807db96d56Sopenharmony_ci+ *
48817db96d56Sopenharmony_ci+ * You can redistribute it and/or modify it under the terms of either
48827db96d56Sopenharmony_ci+ * the MIT license (as described below) or the Vim license.
48837db96d56Sopenharmony_ci+ *
48847db96d56Sopenharmony_ci+ * Permission is hereby granted, free of charge, to any person obtaining
48857db96d56Sopenharmony_ci+ * a copy of this software and associated documentation files (the
48867db96d56Sopenharmony_ci+ * "Software"), to deal in the Software without restriction, including
48877db96d56Sopenharmony_ci+ * without limitation the rights to use, copy, modify, merge, publish,
48887db96d56Sopenharmony_ci+ * distribute, sublicense, and/or sell copies of the Software, and to
48897db96d56Sopenharmony_ci+ * permit persons to whom the Software is furnished to do so, subject to
48907db96d56Sopenharmony_ci+ * the following conditions:
48917db96d56Sopenharmony_ci+ *
48927db96d56Sopenharmony_ci+ * The above copyright notice and this permission notice shall be
48937db96d56Sopenharmony_ci+ * included in all copies or substantial portions of the Software.
48947db96d56Sopenharmony_ci+ *
48957db96d56Sopenharmony_ci+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
48967db96d56Sopenharmony_ci+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
48977db96d56Sopenharmony_ci+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
48987db96d56Sopenharmony_ci+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
48997db96d56Sopenharmony_ci+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
49007db96d56Sopenharmony_ci+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
49017db96d56Sopenharmony_ci+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
49027db96d56Sopenharmony_ci+ */
49037db96d56Sopenharmony_ci+
49047db96d56Sopenharmony_ci+#ifdef _WIN32
49057db96d56Sopenharmony_ci+
49067db96d56Sopenharmony_ci+#include <ctype.h>
49077db96d56Sopenharmony_ci+#include <io.h>
49087db96d56Sopenharmony_ci+#include <wchar.h>
49097db96d56Sopenharmony_ci+#include <windows.h>
49107db96d56Sopenharmony_ci+
49117db96d56Sopenharmony_ci+#ifdef USE_FILEEXTD
49127db96d56Sopenharmony_ci+/* VC 7.1 or earlier doesn't support SAL. */
49137db96d56Sopenharmony_ci+# if !defined(_MSC_VER) || (_MSC_VER < 1400)
49147db96d56Sopenharmony_ci+#  define __out
49157db96d56Sopenharmony_ci+#  define __in
49167db96d56Sopenharmony_ci+#  define __in_opt
49177db96d56Sopenharmony_ci+# endif
49187db96d56Sopenharmony_ci+/* Win32 FileID API Library:
49197db96d56Sopenharmony_ci+ * http://www.microsoft.com/en-us/download/details.aspx?id=22599
49207db96d56Sopenharmony_ci+ * Needed for WinXP. */
49217db96d56Sopenharmony_ci+# include <fileextd.h>
49227db96d56Sopenharmony_ci+#else /* USE_FILEEXTD */
49237db96d56Sopenharmony_ci+/* VC 8 or earlier. */
49247db96d56Sopenharmony_ci+# if defined(_MSC_VER) && (_MSC_VER < 1500)
49257db96d56Sopenharmony_ci+#  ifdef ENABLE_STUB_IMPL
49267db96d56Sopenharmony_ci+#   define STUB_IMPL
49277db96d56Sopenharmony_ci+#  else
49287db96d56Sopenharmony_ci+#   error "Win32 FileID API Library is required for VC2005 or earlier."
49297db96d56Sopenharmony_ci+#  endif
49307db96d56Sopenharmony_ci+# endif
49317db96d56Sopenharmony_ci+#endif /* USE_FILEEXTD */
49327db96d56Sopenharmony_ci+
49337db96d56Sopenharmony_ci+
49347db96d56Sopenharmony_ci+#include "iscygpty.h"
49357db96d56Sopenharmony_ci+
49367db96d56Sopenharmony_ci+//#define USE_DYNFILEID
49377db96d56Sopenharmony_ci+#ifdef USE_DYNFILEID
49387db96d56Sopenharmony_ci+typedef BOOL (WINAPI *pfnGetFileInformationByHandleEx)(
49397db96d56Sopenharmony_ci+		HANDLE                    hFile,
49407db96d56Sopenharmony_ci+		FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
49417db96d56Sopenharmony_ci+		LPVOID                    lpFileInformation,
49427db96d56Sopenharmony_ci+		DWORD                     dwBufferSize
49437db96d56Sopenharmony_ci+);
49447db96d56Sopenharmony_ci+static pfnGetFileInformationByHandleEx pGetFileInformationByHandleEx = NULL;
49457db96d56Sopenharmony_ci+
49467db96d56Sopenharmony_ci+# ifndef USE_FILEEXTD
49477db96d56Sopenharmony_ci+static BOOL WINAPI stub_GetFileInformationByHandleEx(
49487db96d56Sopenharmony_ci+		HANDLE                    hFile,
49497db96d56Sopenharmony_ci+		FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
49507db96d56Sopenharmony_ci+		LPVOID                    lpFileInformation,
49517db96d56Sopenharmony_ci+		DWORD                     dwBufferSize
49527db96d56Sopenharmony_ci+		)
49537db96d56Sopenharmony_ci+{
49547db96d56Sopenharmony_ci+	return FALSE;
49557db96d56Sopenharmony_ci+}
49567db96d56Sopenharmony_ci+# endif
49577db96d56Sopenharmony_ci+
49587db96d56Sopenharmony_ci+static void setup_fileid_api(void)
49597db96d56Sopenharmony_ci+{
49607db96d56Sopenharmony_ci+	if (pGetFileInformationByHandleEx != NULL) {
49617db96d56Sopenharmony_ci+		return;
49627db96d56Sopenharmony_ci+	}
49637db96d56Sopenharmony_ci+	pGetFileInformationByHandleEx = (pfnGetFileInformationByHandleEx)
49647db96d56Sopenharmony_ci+		GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
49657db96d56Sopenharmony_ci+				"GetFileInformationByHandleEx");
49667db96d56Sopenharmony_ci+	if (pGetFileInformationByHandleEx == NULL) {
49677db96d56Sopenharmony_ci+# ifdef USE_FILEEXTD
49687db96d56Sopenharmony_ci+		pGetFileInformationByHandleEx = GetFileInformationByHandleEx;
49697db96d56Sopenharmony_ci+# else
49707db96d56Sopenharmony_ci+		pGetFileInformationByHandleEx = stub_GetFileInformationByHandleEx;
49717db96d56Sopenharmony_ci+# endif
49727db96d56Sopenharmony_ci+	}
49737db96d56Sopenharmony_ci+}
49747db96d56Sopenharmony_ci+#else
49757db96d56Sopenharmony_ci+# define pGetFileInformationByHandleEx	GetFileInformationByHandleEx
49767db96d56Sopenharmony_ci+# define setup_fileid_api()
49777db96d56Sopenharmony_ci+#endif
49787db96d56Sopenharmony_ci+
49797db96d56Sopenharmony_ci+
49807db96d56Sopenharmony_ci+#define is_wprefix(s, prefix) \
49817db96d56Sopenharmony_ci+	(wcsncmp((s), (prefix), sizeof(prefix) / sizeof(WCHAR) - 1) == 0)
49827db96d56Sopenharmony_ci+
49837db96d56Sopenharmony_ci+/* Check if the fd is a cygwin/msys's pty. */
49847db96d56Sopenharmony_ci+int is_cygpty(int fd)
49857db96d56Sopenharmony_ci+{
49867db96d56Sopenharmony_ci+#ifdef STUB_IMPL
49877db96d56Sopenharmony_ci+	return 0;
49887db96d56Sopenharmony_ci+#else
49897db96d56Sopenharmony_ci+	HANDLE h;
49907db96d56Sopenharmony_ci+	int size = sizeof(FILE_NAME_INFO) + sizeof(WCHAR) * (MAX_PATH - 1);
49917db96d56Sopenharmony_ci+	FILE_NAME_INFO *nameinfo;
49927db96d56Sopenharmony_ci+	WCHAR *p = NULL;
49937db96d56Sopenharmony_ci+
49947db96d56Sopenharmony_ci+	setup_fileid_api();
49957db96d56Sopenharmony_ci+
49967db96d56Sopenharmony_ci+	h = (HANDLE) _get_osfhandle(fd);
49977db96d56Sopenharmony_ci+	if (h == INVALID_HANDLE_VALUE) {
49987db96d56Sopenharmony_ci+		return 0;
49997db96d56Sopenharmony_ci+	}
50007db96d56Sopenharmony_ci+	/* Cygwin/msys's pty is a pipe. */
50017db96d56Sopenharmony_ci+	if (GetFileType(h) != FILE_TYPE_PIPE) {
50027db96d56Sopenharmony_ci+		return 0;
50037db96d56Sopenharmony_ci+	}
50047db96d56Sopenharmony_ci+	nameinfo = malloc(size + sizeof(WCHAR));
50057db96d56Sopenharmony_ci+	if (nameinfo == NULL) {
50067db96d56Sopenharmony_ci+		return 0;
50077db96d56Sopenharmony_ci+	}
50087db96d56Sopenharmony_ci+	/* Check the name of the pipe:
50097db96d56Sopenharmony_ci+	 * '\{cygwin,msys}-XXXXXXXXXXXXXXXX-ptyN-{from,to}-master' */
50107db96d56Sopenharmony_ci+	if (pGetFileInformationByHandleEx(h, FileNameInfo, nameinfo, size)) {
50117db96d56Sopenharmony_ci+		nameinfo->FileName[nameinfo->FileNameLength / sizeof(WCHAR)] = L'\0';
50127db96d56Sopenharmony_ci+		p = nameinfo->FileName;
50137db96d56Sopenharmony_ci+		if (is_wprefix(p, L"\\cygwin-")) {		/* Cygwin */
50147db96d56Sopenharmony_ci+			p += 8;
50157db96d56Sopenharmony_ci+		} else if (is_wprefix(p, L"\\msys-")) {	/* MSYS and MSYS2 */
50167db96d56Sopenharmony_ci+			p += 6;
50177db96d56Sopenharmony_ci+		} else {
50187db96d56Sopenharmony_ci+			p = NULL;
50197db96d56Sopenharmony_ci+		}
50207db96d56Sopenharmony_ci+		if (p != NULL) {
50217db96d56Sopenharmony_ci+			while (*p && isxdigit(*p))	/* Skip 16-digit hexadecimal. */
50227db96d56Sopenharmony_ci+				++p;
50237db96d56Sopenharmony_ci+			if (is_wprefix(p, L"-pty")) {
50247db96d56Sopenharmony_ci+				p += 4;
50257db96d56Sopenharmony_ci+			} else {
50267db96d56Sopenharmony_ci+				p = NULL;
50277db96d56Sopenharmony_ci+			}
50287db96d56Sopenharmony_ci+		}
50297db96d56Sopenharmony_ci+		if (p != NULL) {
50307db96d56Sopenharmony_ci+			while (*p && isdigit(*p))	/* Skip pty number. */
50317db96d56Sopenharmony_ci+				++p;
50327db96d56Sopenharmony_ci+			if (is_wprefix(p, L"-from-master")) {
50337db96d56Sopenharmony_ci+				//p += 12;
50347db96d56Sopenharmony_ci+			} else if (is_wprefix(p, L"-to-master")) {
50357db96d56Sopenharmony_ci+				//p += 10;
50367db96d56Sopenharmony_ci+			} else {
50377db96d56Sopenharmony_ci+				p = NULL;
50387db96d56Sopenharmony_ci+			}
50397db96d56Sopenharmony_ci+		}
50407db96d56Sopenharmony_ci+	}
50417db96d56Sopenharmony_ci+	free(nameinfo);
50427db96d56Sopenharmony_ci+	return (p != NULL);
50437db96d56Sopenharmony_ci+#endif /* STUB_IMPL */
50447db96d56Sopenharmony_ci+}
50457db96d56Sopenharmony_ci+
50467db96d56Sopenharmony_ci+/* Check if at least one cygwin/msys pty is used. */
50477db96d56Sopenharmony_ci+int is_cygpty_used(void)
50487db96d56Sopenharmony_ci+{
50497db96d56Sopenharmony_ci+	int fd, ret = 0;
50507db96d56Sopenharmony_ci+
50517db96d56Sopenharmony_ci+	for (fd = 0; fd < 3; fd++) {
50527db96d56Sopenharmony_ci+		ret |= is_cygpty(fd);
50537db96d56Sopenharmony_ci+	}
50547db96d56Sopenharmony_ci+	return ret;
50557db96d56Sopenharmony_ci+}
50567db96d56Sopenharmony_ci+
50577db96d56Sopenharmony_ci+#endif /* _WIN32 */
50587db96d56Sopenharmony_ci+
50597db96d56Sopenharmony_ci+/* vim: set ts=4 sw=4: */
50607db96d56Sopenharmony_cidiff --git a/Python/pathconfig.c b/Python/pathconfig.c
50617db96d56Sopenharmony_ciindex be0f97c..7eb9006 100644
50627db96d56Sopenharmony_ci--- a/Python/pathconfig.c
50637db96d56Sopenharmony_ci+++ b/Python/pathconfig.c
50647db96d56Sopenharmony_ci@@ -2,7 +2,7 @@
50657db96d56Sopenharmony_ci 
50667db96d56Sopenharmony_ci #include "Python.h"
50677db96d56Sopenharmony_ci #include "marshal.h"              // PyMarshal_ReadObjectFromString
50687db96d56Sopenharmony_ci-#include "osdefs.h"               // DELIM
50697db96d56Sopenharmony_ci+#include "osdefs.h"               // DELIM, SEP
50707db96d56Sopenharmony_ci #include "pycore_initconfig.h"
50717db96d56Sopenharmony_ci #include "pycore_fileutils.h"
50727db96d56Sopenharmony_ci #include "pycore_pathconfig.h"
50737db96d56Sopenharmony_ci@@ -18,6 +18,158 @@
50747db96d56Sopenharmony_ci extern "C" {
50757db96d56Sopenharmony_ci #endif
50767db96d56Sopenharmony_ci 
50777db96d56Sopenharmony_ci+#ifdef __MINGW32__
50787db96d56Sopenharmony_ci+#define wcstok  wcstok_s
50797db96d56Sopenharmony_ci+#include <windows.h>
50807db96d56Sopenharmony_ci+#endif
50817db96d56Sopenharmony_ci+
50827db96d56Sopenharmony_ci+static int
50837db96d56Sopenharmony_ci+Py_StartsWithA(const char * str, const char * prefix)
50847db96d56Sopenharmony_ci+{
50857db96d56Sopenharmony_ci+    while(*prefix)
50867db96d56Sopenharmony_ci+    {
50877db96d56Sopenharmony_ci+        if(*prefix++ != *str++)
50887db96d56Sopenharmony_ci+            return 0;
50897db96d56Sopenharmony_ci+    }
50907db96d56Sopenharmony_ci+
50917db96d56Sopenharmony_ci+    return 1;
50927db96d56Sopenharmony_ci+}
50937db96d56Sopenharmony_ci+
50947db96d56Sopenharmony_ci+static int
50957db96d56Sopenharmony_ci+Py_StartsWithW(const wchar_t * str, const wchar_t * prefix)
50967db96d56Sopenharmony_ci+{
50977db96d56Sopenharmony_ci+    while(*prefix)
50987db96d56Sopenharmony_ci+    {
50997db96d56Sopenharmony_ci+        if(*prefix++ != *str++)
51007db96d56Sopenharmony_ci+            return 0;
51017db96d56Sopenharmony_ci+    }
51027db96d56Sopenharmony_ci+
51037db96d56Sopenharmony_ci+    return 1;
51047db96d56Sopenharmony_ci+}
51057db96d56Sopenharmony_ci+
51067db96d56Sopenharmony_ci+char
51077db96d56Sopenharmony_ci+Py_GetSepA(const char *name)
51087db96d56Sopenharmony_ci+{
51097db96d56Sopenharmony_ci+    static char sep = '\0';
51107db96d56Sopenharmony_ci+#ifdef _WIN32
51117db96d56Sopenharmony_ci+    /* https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365247%28v=vs.85%29.aspx
51127db96d56Sopenharmony_ci+     * The "\\?\" prefix .. indicate that the path should be passed to the system with minimal
51137db96d56Sopenharmony_ci+     * modification, which means that you cannot use forward slashes to represent path separators
51147db96d56Sopenharmony_ci+     */
51157db96d56Sopenharmony_ci+    if (name != NULL && Py_StartsWithA(name, "\\\\?\\") != 0)
51167db96d56Sopenharmony_ci+    {
51177db96d56Sopenharmony_ci+        return '\\';
51187db96d56Sopenharmony_ci+    }
51197db96d56Sopenharmony_ci+#endif
51207db96d56Sopenharmony_ci+    if (sep != '\0')
51217db96d56Sopenharmony_ci+        return sep;
51227db96d56Sopenharmony_ci+#if defined(__MINGW32__)
51237db96d56Sopenharmony_ci+    char* msystem = getenv("MSYSTEM");
51247db96d56Sopenharmony_ci+    if (msystem != NULL && strcmp(msystem, "") != 0)
51257db96d56Sopenharmony_ci+        sep = '/';
51267db96d56Sopenharmony_ci+    else
51277db96d56Sopenharmony_ci+        sep = '\\';
51287db96d56Sopenharmony_ci+#else
51297db96d56Sopenharmony_ci+    sep = SEP;
51307db96d56Sopenharmony_ci+#endif
51317db96d56Sopenharmony_ci+    return sep;
51327db96d56Sopenharmony_ci+}
51337db96d56Sopenharmony_ci+
51347db96d56Sopenharmony_ci+static char
51357db96d56Sopenharmony_ci+Py_GetAltSepA(const char *name)
51367db96d56Sopenharmony_ci+{
51377db96d56Sopenharmony_ci+    char sep = Py_GetSepA(name);
51387db96d56Sopenharmony_ci+    if (sep == '/')
51397db96d56Sopenharmony_ci+        return '\\';
51407db96d56Sopenharmony_ci+    return '/';
51417db96d56Sopenharmony_ci+}
51427db96d56Sopenharmony_ci+
51437db96d56Sopenharmony_ci+void
51447db96d56Sopenharmony_ci+Py_NormalizeSepsA(char *name)
51457db96d56Sopenharmony_ci+{
51467db96d56Sopenharmony_ci+    assert(name != NULL);
51477db96d56Sopenharmony_ci+    char sep = Py_GetSepA(name);
51487db96d56Sopenharmony_ci+    char altsep = Py_GetAltSepA(name);
51497db96d56Sopenharmony_ci+    char* seps;
51507db96d56Sopenharmony_ci+    if (name[0] != '\0' && name[1] == ':') {
51517db96d56Sopenharmony_ci+        name[0] = toupper(name[0]);
51527db96d56Sopenharmony_ci+    }
51537db96d56Sopenharmony_ci+    seps = strchr(name, altsep);
51547db96d56Sopenharmony_ci+    while(seps) {
51557db96d56Sopenharmony_ci+        *seps = sep;
51567db96d56Sopenharmony_ci+        seps = strchr(seps, altsep);
51577db96d56Sopenharmony_ci+    }
51587db96d56Sopenharmony_ci+}
51597db96d56Sopenharmony_ci+
51607db96d56Sopenharmony_ci+wchar_t
51617db96d56Sopenharmony_ci+Py_GetSepW(const wchar_t *name)
51627db96d56Sopenharmony_ci+{
51637db96d56Sopenharmony_ci+    static wchar_t sep = L'\0';
51647db96d56Sopenharmony_ci+#ifdef _WIN32
51657db96d56Sopenharmony_ci+    /* https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365247%28v=vs.85%29.aspx
51667db96d56Sopenharmony_ci+     * The "\\?\" prefix .. indicate that the path should be passed to the system with minimal
51677db96d56Sopenharmony_ci+     * modification, which means that you cannot use forward slashes to represent path separators
51687db96d56Sopenharmony_ci+     */
51697db96d56Sopenharmony_ci+    if (name != NULL && Py_StartsWithW(name, L"\\\\?\\") != 0)
51707db96d56Sopenharmony_ci+    {
51717db96d56Sopenharmony_ci+        return L'\\';
51727db96d56Sopenharmony_ci+    }
51737db96d56Sopenharmony_ci+#endif
51747db96d56Sopenharmony_ci+    if (sep != L'\0')
51757db96d56Sopenharmony_ci+        return sep;
51767db96d56Sopenharmony_ci+#if defined(__MINGW32__)
51777db96d56Sopenharmony_ci+    char* msystem = getenv("MSYSTEM");
51787db96d56Sopenharmony_ci+    if (msystem != NULL && strcmp(msystem, "") != 0)
51797db96d56Sopenharmony_ci+        sep = L'/';
51807db96d56Sopenharmony_ci+    else
51817db96d56Sopenharmony_ci+        sep = L'\\';
51827db96d56Sopenharmony_ci+#else
51837db96d56Sopenharmony_ci+    sep = SEP;
51847db96d56Sopenharmony_ci+#endif
51857db96d56Sopenharmony_ci+    return sep;
51867db96d56Sopenharmony_ci+}
51877db96d56Sopenharmony_ci+
51887db96d56Sopenharmony_ci+wchar_t
51897db96d56Sopenharmony_ci+Py_GetAltSepW(const wchar_t *name)
51907db96d56Sopenharmony_ci+{
51917db96d56Sopenharmony_ci+    char sep = Py_GetSepW(name);
51927db96d56Sopenharmony_ci+    if (sep == L'/')
51937db96d56Sopenharmony_ci+        return L'\\';
51947db96d56Sopenharmony_ci+    return L'/';
51957db96d56Sopenharmony_ci+}
51967db96d56Sopenharmony_ci+
51977db96d56Sopenharmony_ci+void
51987db96d56Sopenharmony_ci+Py_NormalizeSepsW(wchar_t *name)
51997db96d56Sopenharmony_ci+{
52007db96d56Sopenharmony_ci+    assert(name != NULL);
52017db96d56Sopenharmony_ci+    wchar_t sep = Py_GetSepW(name);
52027db96d56Sopenharmony_ci+    wchar_t altsep = Py_GetAltSepW(name);
52037db96d56Sopenharmony_ci+    wchar_t* seps;
52047db96d56Sopenharmony_ci+    if (name[0] != L'\0' && name[1] == L':') {
52057db96d56Sopenharmony_ci+        name[0] = towupper(name[0]);
52067db96d56Sopenharmony_ci+    }
52077db96d56Sopenharmony_ci+    seps = wcschr(name, altsep);
52087db96d56Sopenharmony_ci+    while(seps) {
52097db96d56Sopenharmony_ci+        *seps = sep;
52107db96d56Sopenharmony_ci+        seps = wcschr(seps, altsep);
52117db96d56Sopenharmony_ci+    }
52127db96d56Sopenharmony_ci+}
52137db96d56Sopenharmony_ci+
52147db96d56Sopenharmony_ci+void
52157db96d56Sopenharmony_ci+Py_NormalizeSepsPathcchW(wchar_t *name)
52167db96d56Sopenharmony_ci+{
52177db96d56Sopenharmony_ci+#ifdef MS_WINDOWS
52187db96d56Sopenharmony_ci+    assert(name != NULL);
52197db96d56Sopenharmony_ci+    wchar_t sep = '\\';
52207db96d56Sopenharmony_ci+    wchar_t altsep = '/';
52217db96d56Sopenharmony_ci+    wchar_t* seps;
52227db96d56Sopenharmony_ci+    seps = wcschr(name, altsep);
52237db96d56Sopenharmony_ci+    while(seps) {
52247db96d56Sopenharmony_ci+        *seps = sep;
52257db96d56Sopenharmony_ci+        seps = wcschr(seps, altsep);
52267db96d56Sopenharmony_ci+    }
52277db96d56Sopenharmony_ci+#endif
52287db96d56Sopenharmony_ci+}
52297db96d56Sopenharmony_ci 
52307db96d56Sopenharmony_ci /* External interface */
52317db96d56Sopenharmony_ci 
52327db96d56Sopenharmony_ci@@ -317,6 +469,7 @@ _Py_SetProgramFullPath(const wchar_t *program_full_path)
52337db96d56Sopenharmony_ci     if (has_value && _Py_path_config.program_full_path == NULL) {
52347db96d56Sopenharmony_ci         path_out_of_memory(__func__);
52357db96d56Sopenharmony_ci     }
52367db96d56Sopenharmony_ci+    Py_NormalizeSepsW(_Py_path_config.program_name);
52377db96d56Sopenharmony_ci }
52387db96d56Sopenharmony_ci 
52397db96d56Sopenharmony_ci 
52407db96d56Sopenharmony_ci@@ -509,7 +662,7 @@ _PyPathConfig_ComputeSysPath0(const PyWideStringList *argv, PyObject **path0_p)
52417db96d56Sopenharmony_ci     }
52427db96d56Sopenharmony_ci #endif /* All others */
52437db96d56Sopenharmony_ci 
52447db96d56Sopenharmony_ci-    PyObject *path0_obj = PyUnicode_FromWideChar(path0, n);
52457db96d56Sopenharmony_ci+    PyObject *path0_obj = PyUnicode_FromWideChar(_Py_normpath(path0, -1), n);
52467db96d56Sopenharmony_ci     if (path0_obj == NULL) {
52477db96d56Sopenharmony_ci         return -1;
52487db96d56Sopenharmony_ci     }
52497db96d56Sopenharmony_cidiff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
52507db96d56Sopenharmony_ciindex 9248e97..1d53e12 100644
52517db96d56Sopenharmony_ci--- a/Python/pylifecycle.c
52527db96d56Sopenharmony_ci+++ b/Python/pylifecycle.c
52537db96d56Sopenharmony_ci@@ -31,6 +31,7 @@
52547db96d56Sopenharmony_ci 
52557db96d56Sopenharmony_ci extern void _PyIO_Fini(void);
52567db96d56Sopenharmony_ci 
52577db96d56Sopenharmony_ci+#include "iscygpty.h"
52587db96d56Sopenharmony_ci #include <locale.h>               // setlocale()
52597db96d56Sopenharmony_ci #include <stdlib.h>               // getenv()
52607db96d56Sopenharmony_ci 
52617db96d56Sopenharmony_ci@@ -2954,7 +2955,7 @@ Py_Exit(int sts)
52627db96d56Sopenharmony_ci int
52637db96d56Sopenharmony_ci Py_FdIsInteractive(FILE *fp, const char *filename)
52647db96d56Sopenharmony_ci {
52657db96d56Sopenharmony_ci-    if (isatty((int)fileno(fp)))
52667db96d56Sopenharmony_ci+    if (isatty((int)fileno(fp)) || is_cygpty((int)fileno(fp)))
52677db96d56Sopenharmony_ci         return 1;
52687db96d56Sopenharmony_ci     if (!Py_InteractiveFlag)
52697db96d56Sopenharmony_ci         return 0;
52707db96d56Sopenharmony_ci@@ -2967,7 +2968,7 @@ Py_FdIsInteractive(FILE *fp, const char *filename)
52717db96d56Sopenharmony_ci int
52727db96d56Sopenharmony_ci _Py_FdIsInteractive(FILE *fp, PyObject *filename)
52737db96d56Sopenharmony_ci {
52747db96d56Sopenharmony_ci-    if (isatty((int)fileno(fp))) {
52757db96d56Sopenharmony_ci+    if (isatty((int)fileno(fp)) || is_cygpty((int)fileno(fp))) {
52767db96d56Sopenharmony_ci         return 1;
52777db96d56Sopenharmony_ci     }
52787db96d56Sopenharmony_ci     if (!Py_InteractiveFlag) {
52797db96d56Sopenharmony_cidiff --git a/Python/sysmodule.c b/Python/sysmodule.c
52807db96d56Sopenharmony_ciindex 8bab703..fed0adb 100644
52817db96d56Sopenharmony_ci--- a/Python/sysmodule.c
52827db96d56Sopenharmony_ci+++ b/Python/sysmodule.c
52837db96d56Sopenharmony_ci@@ -43,7 +43,7 @@ Data members:
52847db96d56Sopenharmony_ci #include <windows.h>
52857db96d56Sopenharmony_ci #endif /* MS_WINDOWS */
52867db96d56Sopenharmony_ci 
52877db96d56Sopenharmony_ci-#ifdef MS_COREDLL
52887db96d56Sopenharmony_ci+#if defined(MS_WINDOWS) && defined(Py_ENABLE_SHARED)
52897db96d56Sopenharmony_ci extern void *PyWin_DLLhModule;
52907db96d56Sopenharmony_ci /* A string loaded from the DLL at startup: */
52917db96d56Sopenharmony_ci extern const char *PyWin_DLLVersionString;
52927db96d56Sopenharmony_ci@@ -2923,7 +2923,7 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict)
52937db96d56Sopenharmony_ci     SET_SYS_FROM_STRING("byteorder", "little");
52947db96d56Sopenharmony_ci #endif
52957db96d56Sopenharmony_ci 
52967db96d56Sopenharmony_ci-#ifdef MS_COREDLL
52977db96d56Sopenharmony_ci+#if defined(MS_WINDOWS) && defined(Py_ENABLE_SHARED)
52987db96d56Sopenharmony_ci     SET_SYS("dllhandle", PyLong_FromVoidPtr(PyWin_DLLhModule));
52997db96d56Sopenharmony_ci     SET_SYS_FROM_STRING("winver", PyWin_DLLVersionString);
53007db96d56Sopenharmony_ci #endif
53017db96d56Sopenharmony_cidiff --git a/Python/thread_nt.h b/Python/thread_nt.h
53027db96d56Sopenharmony_ciindex 084bd58..f8a6765 100644
53037db96d56Sopenharmony_ci--- a/Python/thread_nt.h
53047db96d56Sopenharmony_ci+++ b/Python/thread_nt.h
53057db96d56Sopenharmony_ci@@ -360,8 +360,9 @@ PyThread_release_lock(PyThread_type_lock aLock)
53067db96d56Sopenharmony_ci {
53077db96d56Sopenharmony_ci     dprintf(("%lu: PyThread_release_lock(%p) called\n", PyThread_get_thread_ident(),aLock));
53087db96d56Sopenharmony_ci 
53097db96d56Sopenharmony_ci-    if (!(aLock && LeaveNonRecursiveMutex((PNRMUTEX) aLock)))
53107db96d56Sopenharmony_ci+    if (!(aLock && LeaveNonRecursiveMutex((PNRMUTEX) aLock))) {
53117db96d56Sopenharmony_ci         dprintf(("%lu: Could not PyThread_release_lock(%p) error: %ld\n", PyThread_get_thread_ident(), aLock, GetLastError()));
53127db96d56Sopenharmony_ci+    }
53137db96d56Sopenharmony_ci }
53147db96d56Sopenharmony_ci 
53157db96d56Sopenharmony_ci /* minimum/maximum thread stack sizes supported */
53167db96d56Sopenharmony_cidiff --git a/Python/traceback.c b/Python/traceback.c
53177db96d56Sopenharmony_ciindex 7f47349..23fda62 100644
53187db96d56Sopenharmony_ci--- a/Python/traceback.c
53197db96d56Sopenharmony_ci+++ b/Python/traceback.c
53207db96d56Sopenharmony_ci@@ -323,7 +323,7 @@ _Py_FindSourceFile(PyObject *filename, char* namebuf, size_t namelen, PyObject *
53217db96d56Sopenharmony_ci     filepath = PyBytes_AS_STRING(filebytes);
53227db96d56Sopenharmony_ci 
53237db96d56Sopenharmony_ci     /* Search tail of filename in sys.path before giving up */
53247db96d56Sopenharmony_ci-    tail = strrchr(filepath, SEP);
53257db96d56Sopenharmony_ci+    tail = strrchr(filepath, Py_GetSepA(filepath));
53267db96d56Sopenharmony_ci     if (tail == NULL)
53277db96d56Sopenharmony_ci         tail = filepath;
53287db96d56Sopenharmony_ci     else
53297db96d56Sopenharmony_cidiff --git a/configure.ac b/configure.ac
53307db96d56Sopenharmony_ciindex 1c25abd..5cf7085 100644
53317db96d56Sopenharmony_ci--- a/configure.ac
53327db96d56Sopenharmony_ci+++ b/configure.ac
53337db96d56Sopenharmony_ci@@ -202,9 +202,11 @@ AC_SUBST([FREEZE_MODULE])
53347db96d56Sopenharmony_ci AC_SUBST([FREEZE_MODULE_DEPS])
53357db96d56Sopenharmony_ci AC_SUBST([PYTHON_FOR_BUILD_DEPS])
53367db96d56Sopenharmony_ci 
53377db96d56Sopenharmony_ci+NATIVE_PYTHON_SEARCH_PATH_MINGW=`echo $host | grep -Eq 'mingw*' && echo "$MINGW_PREFIX/bin" || echo $PATH`
53387db96d56Sopenharmony_ci AC_CHECK_PROGS([PYTHON_FOR_REGEN],
53397db96d56Sopenharmony_ci   [python$PACKAGE_VERSION python3.10 python3.9 python3.8 python3.7 python3.6 python3 python],
53407db96d56Sopenharmony_ci-  [python3])
53417db96d56Sopenharmony_ci+  [python3],
53427db96d56Sopenharmony_ci+  [$NATIVE_PYTHON_SEARCH_PATH_MINGW])
53437db96d56Sopenharmony_ci AC_SUBST(PYTHON_FOR_REGEN)
53447db96d56Sopenharmony_ci 
53457db96d56Sopenharmony_ci AC_MSG_CHECKING([Python for regen version])
53467db96d56Sopenharmony_ci@@ -545,6 +547,9 @@ then
53477db96d56Sopenharmony_ci 	*-*-cygwin*)
53487db96d56Sopenharmony_ci 		ac_sys_system=Cygwin
53497db96d56Sopenharmony_ci 		;;
53507db96d56Sopenharmony_ci+	*-*-mingw*)
53517db96d56Sopenharmony_ci+		ac_sys_system=MINGW
53527db96d56Sopenharmony_ci+		;;
53537db96d56Sopenharmony_ci 	*-*-vxworks*)
53547db96d56Sopenharmony_ci 	    ac_sys_system=VxWorks
53557db96d56Sopenharmony_ci 	    ;;
53567db96d56Sopenharmony_ci@@ -580,6 +585,7 @@ then
53577db96d56Sopenharmony_ci 	linux*) MACHDEP="linux";;
53587db96d56Sopenharmony_ci 	cygwin*) MACHDEP="cygwin";;
53597db96d56Sopenharmony_ci 	darwin*) MACHDEP="darwin";;
53607db96d56Sopenharmony_ci+	mingw*) MACHDEP="win32";;
53617db96d56Sopenharmony_ci 	'')	MACHDEP="unknown";;
53627db96d56Sopenharmony_ci     esac
53637db96d56Sopenharmony_ci fi
53647db96d56Sopenharmony_ci@@ -605,6 +611,9 @@ if test "$cross_compiling" = yes; then
53657db96d56Sopenharmony_ci 		;;
53667db96d56Sopenharmony_ci 	wasm32-*-* | wasm64-*-*)
53677db96d56Sopenharmony_ci 		_host_cpu=$host_cpu
53687db96d56Sopenharmony_ci+    ;;
53697db96d56Sopenharmony_ci+	*-*-mingw*)
53707db96d56Sopenharmony_ci+		_host_cpu=
53717db96d56Sopenharmony_ci 		;;
53727db96d56Sopenharmony_ci 	*)
53737db96d56Sopenharmony_ci 		# for now, limit cross builds to known configurations
53747db96d56Sopenharmony_ci@@ -612,6 +621,14 @@ if test "$cross_compiling" = yes; then
53757db96d56Sopenharmony_ci 		AC_MSG_ERROR([cross build not supported for $host])
53767db96d56Sopenharmony_ci 	esac
53777db96d56Sopenharmony_ci 	_PYTHON_HOST_PLATFORM="$MACHDEP${_host_cpu:+-$_host_cpu}"
53787db96d56Sopenharmony_ci+
53797db96d56Sopenharmony_ci+	case "$host_os" in
53807db96d56Sopenharmony_ci+	mingw*)
53817db96d56Sopenharmony_ci+	# As sys.platform() return 'win32' to build python and extantions
53827db96d56Sopenharmony_ci+	# we will use 'mingw' (in setup.py and etc.)
53837db96d56Sopenharmony_ci+	_PYTHON_HOST_PLATFORM=mingw
53847db96d56Sopenharmony_ci+	;;
53857db96d56Sopenharmony_ci+	esac
53867db96d56Sopenharmony_ci fi
53877db96d56Sopenharmony_ci 
53887db96d56Sopenharmony_ci # Some systems cannot stand _XOPEN_SOURCE being defined at all; they
53897db96d56Sopenharmony_ci@@ -723,6 +740,65 @@ then
53907db96d56Sopenharmony_ci   AC_DEFINE(_INCLUDE__STDC_A1_SOURCE, 1, Define to include mbstate_t for mbrtowc)
53917db96d56Sopenharmony_ci fi
53927db96d56Sopenharmony_ci 
53937db96d56Sopenharmony_ci+# On 'semi-native' build systems (MSYS*/Cygwin targeting MinGW-w64)
53947db96d56Sopenharmony_ci+# _sysconfigdata.py will contain paths that are correct only in the
53957db96d56Sopenharmony_ci+# build environment. This means external modules will fail to build
53967db96d56Sopenharmony_ci+# without setting up the same env and also that the build of Python
53977db96d56Sopenharmony_ci+# itself will fail as the paths are not correct for the host tools.
53987db96d56Sopenharmony_ci+#
53997db96d56Sopenharmony_ci+# To work around these issues a set of _b2h variables are created:
54007db96d56Sopenharmony_ci+# prefix_b2h, srcdir_b2h, abs_srcdir_b2h
54017db96d56Sopenharmony_ci+# and abs_builddir_b2h
54027db96d56Sopenharmony_ci+# .. where b2h stands for build to host. sysconfig.py replaces path
54037db96d56Sopenharmony_ci+# prefixes matching the non-b2h versions with the b2h equivalents.
54047db96d56Sopenharmony_ci+#
54057db96d56Sopenharmony_ci+# (note this assumes the host compilers are native and *not* cross
54067db96d56Sopenharmony_ci+#  - in the 'semi-native' scenario only that is.)
54077db96d56Sopenharmony_ci+
54087db96d56Sopenharmony_ci+AC_DEFUN([ABS_PATH_HOST],
54097db96d56Sopenharmony_ci+[$1=$(cd $$2 && pwd)
54107db96d56Sopenharmony_ci+  case $build_os in
54117db96d56Sopenharmony_ci+    mingw*)
54127db96d56Sopenharmony_ci+      case $host_os in
54137db96d56Sopenharmony_ci+        mingw*) $1=$(cd $$2 && pwd -W) ;;
54147db96d56Sopenharmony_ci+        *) ;;
54157db96d56Sopenharmony_ci+      esac
54167db96d56Sopenharmony_ci+      ;;
54177db96d56Sopenharmony_ci+    cygwin*)
54187db96d56Sopenharmony_ci+      case $host_os in
54197db96d56Sopenharmony_ci+        mingw*) $1=$(cygpath -w -m $$2) ;;
54207db96d56Sopenharmony_ci+        *) ;;
54217db96d56Sopenharmony_ci+      esac
54227db96d56Sopenharmony_ci+      ;;
54237db96d56Sopenharmony_ci+  esac
54247db96d56Sopenharmony_ci+AC_SUBST([$1])
54257db96d56Sopenharmony_ci+])
54267db96d56Sopenharmony_ci+
54277db96d56Sopenharmony_ci+AC_MSG_CHECKING(absolute host location of prefix)
54287db96d56Sopenharmony_ci+ABS_PATH_HOST([prefix_b2h],[prefix])
54297db96d56Sopenharmony_ci+AC_MSG_RESULT([$prefix_b2h])
54307db96d56Sopenharmony_ci+
54317db96d56Sopenharmony_ci+AC_MSG_CHECKING(absolute host location of srcdir)
54327db96d56Sopenharmony_ci+ABS_PATH_HOST([srcdir_b2h],[srcdir])
54337db96d56Sopenharmony_ci+AC_MSG_RESULT([$srcdir_b2h])
54347db96d56Sopenharmony_ci+
54357db96d56Sopenharmony_ci+AC_MSG_CHECKING(absolute host location of abs_srcdir)
54367db96d56Sopenharmony_ci+ABS_PATH_HOST([abs_srcdir_b2h],[srcdir])
54377db96d56Sopenharmony_ci+AC_MSG_RESULT([$abs_srcdir_b2h])
54387db96d56Sopenharmony_ci+
54397db96d56Sopenharmony_ci+my_builddir=.
54407db96d56Sopenharmony_ci+AC_MSG_CHECKING(Absolute host location of abs_builddir)
54417db96d56Sopenharmony_ci+ABS_PATH_HOST([abs_builddir_b2h],[my_builddir])
54427db96d56Sopenharmony_ci+AC_MSG_RESULT([$abs_builddir_b2h])
54437db96d56Sopenharmony_ci+
54447db96d56Sopenharmony_ci+AC_MSG_CHECKING([for init system calls])
54457db96d56Sopenharmony_ci+AC_SUBST(INITSYS)
54467db96d56Sopenharmony_ci+case $host in
54477db96d56Sopenharmony_ci+  *-*-mingw*)	INITSYS=nt;;
54487db96d56Sopenharmony_ci+  *)		INITSYS=posix;;
54497db96d56Sopenharmony_ci+esac
54507db96d56Sopenharmony_ci+AC_MSG_RESULT([$INITSYS])
54517db96d56Sopenharmony_ci+
54527db96d56Sopenharmony_ci # Record the configure-time value of MACOSX_DEPLOYMENT_TARGET,
54537db96d56Sopenharmony_ci # it may influence the way we can build extensions, so distutils
54547db96d56Sopenharmony_ci # needs to check it
54557db96d56Sopenharmony_ci@@ -1163,6 +1239,28 @@ AC_CACHE_CHECK([for -Wl,--no-as-needed], [ac_cv_wl_no_as_needed], [
54567db96d56Sopenharmony_ci ])
54577db96d56Sopenharmony_ci AC_SUBST(NO_AS_NEEDED)
54587db96d56Sopenharmony_ci 
54597db96d56Sopenharmony_ci+# initialize default configuration
54607db96d56Sopenharmony_ci+py_config=
54617db96d56Sopenharmony_ci+case $host in
54627db96d56Sopenharmony_ci+  *-*-mingw*) py_config=mingw ;;
54637db96d56Sopenharmony_ci+esac
54647db96d56Sopenharmony_ci+if test -n "$py_config" ; then
54657db96d56Sopenharmony_ci+  AC_MSG_NOTICE([loading configure defaults from .../Misc/config_$py_config"])
54667db96d56Sopenharmony_ci+  . "$srcdir/Misc/config_$py_config"
54677db96d56Sopenharmony_ci+fi
54687db96d56Sopenharmony_ci+
54697db96d56Sopenharmony_ci+# initialize defaults for cross-builds
54707db96d56Sopenharmony_ci+if test "$cross_compiling" = yes; then
54717db96d56Sopenharmony_ci+  py_config=$host_os
54727db96d56Sopenharmony_ci+  case $py_config in
54737db96d56Sopenharmony_ci+    mingw32*) py_config=mingw32 ;;
54747db96d56Sopenharmony_ci+  esac
54757db96d56Sopenharmony_ci+  if test -f "$srcdir/Misc/cross_$py_config" ; then
54767db96d56Sopenharmony_ci+    AC_MSG_NOTICE([loading cross defaults from .../Misc/cross_$py_config"])
54777db96d56Sopenharmony_ci+    . "$srcdir/Misc/cross_$py_config"
54787db96d56Sopenharmony_ci+  fi
54797db96d56Sopenharmony_ci+fi
54807db96d56Sopenharmony_ci+
54817db96d56Sopenharmony_ci AC_MSG_CHECKING([for the Android API level])
54827db96d56Sopenharmony_ci cat > conftest.c <<EOF
54837db96d56Sopenharmony_ci #ifdef __ANDROID__
54847db96d56Sopenharmony_ci@@ -1275,6 +1373,7 @@ AC_ARG_WITH([suffix],
54857db96d56Sopenharmony_ci     [Emscripten/browser*], [EXEEXT=.js],
54867db96d56Sopenharmony_ci     [Emscripten/node*], [EXEEXT=.js],
54877db96d56Sopenharmony_ci     [WASI/*], [EXEEXT=.wasm],
54887db96d56Sopenharmony_ci+    [MINGW*], [EXEEXT=.exe],
54897db96d56Sopenharmony_ci     [EXEEXT=]
54907db96d56Sopenharmony_ci   )
54917db96d56Sopenharmony_ci ])
54927db96d56Sopenharmony_ci@@ -1298,6 +1397,10 @@ else
54937db96d56Sopenharmony_ci fi
54947db96d56Sopenharmony_ci rmdir CaseSensitiveTestDir
54957db96d56Sopenharmony_ci 
54967db96d56Sopenharmony_ci+AS_CASE([$ac_sys_system],
54977db96d56Sopenharmony_ci+  [MINGW], [BUILDEXEEXT=".exe"]
54987db96d56Sopenharmony_ci+)
54997db96d56Sopenharmony_ci+
55007db96d56Sopenharmony_ci case $ac_sys_system in
55017db96d56Sopenharmony_ci hp*|HP*)
55027db96d56Sopenharmony_ci     case $CC in
55037db96d56Sopenharmony_ci@@ -1475,6 +1578,11 @@ if test $enable_shared = "yes"; then
55047db96d56Sopenharmony_ci           LDLIBRARY='libpython$(LDVERSION).dll.a'
55057db96d56Sopenharmony_ci           DLLLIBRARY='libpython$(LDVERSION).dll'
55067db96d56Sopenharmony_ci           ;;
55077db96d56Sopenharmony_ci+    MINGW*)
55087db96d56Sopenharmony_ci+          LDLIBRARY='libpython$(LDVERSION).dll.a'
55097db96d56Sopenharmony_ci+          DLLLIBRARY='libpython$(LDVERSION).dll'
55107db96d56Sopenharmony_ci+          BLDLIBRARY='-L. -lpython$(LDVERSION)'
55117db96d56Sopenharmony_ci+          ;;
55127db96d56Sopenharmony_ci     SunOS*)
55137db96d56Sopenharmony_ci 	  LDLIBRARY='libpython$(LDVERSION).so'
55147db96d56Sopenharmony_ci 	  BLDLIBRARY='-Wl,-R,$(LIBDIR) -L. -lpython$(LDVERSION)'
55157db96d56Sopenharmony_ci@@ -1525,6 +1633,9 @@ else # shared is disabled
55167db96d56Sopenharmony_ci           BLDLIBRARY='$(LIBRARY)'
55177db96d56Sopenharmony_ci           LDLIBRARY='libpython$(LDVERSION).dll.a'
55187db96d56Sopenharmony_ci           ;;
55197db96d56Sopenharmony_ci+    MINGW*)
55207db96d56Sopenharmony_ci+          LDLIBRARY='libpython$(LDVERSION).a'
55217db96d56Sopenharmony_ci+          ;;
55227db96d56Sopenharmony_ci   esac
55237db96d56Sopenharmony_ci fi
55247db96d56Sopenharmony_ci 
55257db96d56Sopenharmony_ci@@ -1618,6 +1729,10 @@ AC_SUBST(LINK_PYTHON_OBJS)
55267db96d56Sopenharmony_ci AC_SUBST(AR)
55277db96d56Sopenharmony_ci AC_CHECK_TOOLS(AR, ar aal, ar)
55287db96d56Sopenharmony_ci 
55297db96d56Sopenharmony_ci+# windres program
55307db96d56Sopenharmony_ci+AC_SUBST(WINDRES)
55317db96d56Sopenharmony_ci+AC_CHECK_TOOL(WINDRES, windres)
55327db96d56Sopenharmony_ci+
55337db96d56Sopenharmony_ci # tweak ARFLAGS only if the user didn't set it on the command line
55347db96d56Sopenharmony_ci AC_SUBST(ARFLAGS)
55357db96d56Sopenharmony_ci if test -z "$ARFLAGS"
55367db96d56Sopenharmony_ci@@ -2498,6 +2613,53 @@ then
55377db96d56Sopenharmony_ci 	BASECFLAGS="$BASECFLAGS $ac_arch_flags"
55387db96d56Sopenharmony_ci fi
55397db96d56Sopenharmony_ci 
55407db96d56Sopenharmony_ci+dnl NOTE:
55417db96d56Sopenharmony_ci+dnl - GCC 4.4+ for mingw* require and use posix threads(pthreads-w32)
55427db96d56Sopenharmony_ci+dnl - Host may contain installed pthreads-w32.
55437db96d56Sopenharmony_ci+dnl - On windows platform only NT-thread model is supported. 
55447db96d56Sopenharmony_ci+dnl To avoid miss detection scipt first will check for NT-thread model
55457db96d56Sopenharmony_ci+dnl and if is not found will try to detect build options for pthread
55467db96d56Sopenharmony_ci+dnl model. Autodetection could be overiden if variable with_nt_threads
55477db96d56Sopenharmony_ci+dnl is set in "Site Configuration" (see autoconf manual).
55487db96d56Sopenharmony_ci+dnl If NT-thread model is enabled script skips some checks that
55497db96d56Sopenharmony_ci+dnl impact build process. When a new functionality is added, developers
55507db96d56Sopenharmony_ci+dnl are responsible to update configure script to avoid thread models
55517db96d56Sopenharmony_ci+dnl to be mixed.
55527db96d56Sopenharmony_ci+
55537db96d56Sopenharmony_ci+AC_MSG_CHECKING([for --with-nt-threads])
55547db96d56Sopenharmony_ci+AC_ARG_WITH(nt-threads,
55557db96d56Sopenharmony_ci+            AS_HELP_STRING([--with-nt-threads], [build with windows threads (default is system-dependent)]),
55567db96d56Sopenharmony_ci+[
55577db96d56Sopenharmony_ci+	case $withval in
55587db96d56Sopenharmony_ci+	no)	with_nt_threads=no;;
55597db96d56Sopenharmony_ci+	yes)	with_nt_threads=yes;;
55607db96d56Sopenharmony_ci+	*)	with_nt_threads=yes;;
55617db96d56Sopenharmony_ci+	esac
55627db96d56Sopenharmony_ci+], [
55637db96d56Sopenharmony_ci+	case $host in
55647db96d56Sopenharmony_ci+		*-*-mingw*) with_nt_threads=yes;;
55657db96d56Sopenharmony_ci+		*) with_nt_threads=no;;
55667db96d56Sopenharmony_ci+	esac
55677db96d56Sopenharmony_ci+])
55687db96d56Sopenharmony_ci+AC_MSG_RESULT([$with_nt_threads])
55697db96d56Sopenharmony_ci+
55707db96d56Sopenharmony_ci+if test $with_nt_threads = yes ; then
55717db96d56Sopenharmony_ci+AC_MSG_CHECKING([whether linking with nt-threads work])
55727db96d56Sopenharmony_ci+AC_LINK_IFELSE([
55737db96d56Sopenharmony_ci+    AC_LANG_PROGRAM([[#include <process.h>]],[[_beginthread(0, 0, 0);]])
55747db96d56Sopenharmony_ci+  ],
55757db96d56Sopenharmony_ci+  [AC_MSG_RESULT([yes])],
55767db96d56Sopenharmony_ci+  [AC_MSG_ERROR([failed to link with nt-threads])])
55777db96d56Sopenharmony_ci+fi
55787db96d56Sopenharmony_ci+
55797db96d56Sopenharmony_ci+if test $with_nt_threads = yes ; then
55807db96d56Sopenharmony_ci+  dnl temporary default flag to avoid additional pthread checks
55817db96d56Sopenharmony_ci+  dnl and initilize other ac..thread flags to no
55827db96d56Sopenharmony_ci+  ac_cv_pthread_is_default=no
55837db96d56Sopenharmony_ci+  ac_cv_kthread=no
55847db96d56Sopenharmony_ci+  ac_cv_pthread=no
55857db96d56Sopenharmony_ci+  dnl ac_cv_kpthread is set to no if default is yes (see below)
55867db96d56Sopenharmony_ci+else
55877db96d56Sopenharmony_ci # On some compilers, pthreads are available without further options
55887db96d56Sopenharmony_ci # (e.g. MacOS X). On some of these systems, the compiler will not
55897db96d56Sopenharmony_ci # complain if unaccepted options are passed (e.g. gcc on Mac OS X).
55907db96d56Sopenharmony_ci@@ -2609,6 +2771,8 @@ int main(void){
55917db96d56Sopenharmony_ci CC="$ac_save_cc"])
55927db96d56Sopenharmony_ci fi
55937db96d56Sopenharmony_ci 
55947db96d56Sopenharmony_ci+fi
55957db96d56Sopenharmony_ci+
55967db96d56Sopenharmony_ci # If we have set a CC compiler flag for thread support then
55977db96d56Sopenharmony_ci # check if it works for CXX, too.
55987db96d56Sopenharmony_ci ac_cv_cxx_thread=no
55997db96d56Sopenharmony_ci@@ -2629,6 +2793,10 @@ elif test "$ac_cv_pthread" = "yes"
56007db96d56Sopenharmony_ci then
56017db96d56Sopenharmony_ci   CXX="$CXX -pthread"
56027db96d56Sopenharmony_ci   ac_cv_cxx_thread=yes
56037db96d56Sopenharmony_ci+elif test $with_nt_threads = yes
56047db96d56Sopenharmony_ci+then
56057db96d56Sopenharmony_ci+  dnl set to always to skip extra pthread check below
56067db96d56Sopenharmony_ci+  ac_cv_cxx_thread=always
56077db96d56Sopenharmony_ci fi
56087db96d56Sopenharmony_ci 
56097db96d56Sopenharmony_ci if test $ac_cv_cxx_thread = yes
56107db96d56Sopenharmony_ci@@ -2663,11 +2831,11 @@ AC_DEFINE(STDC_HEADERS, 1, [Define to 1 if you have the ANSI C header files.])
56117db96d56Sopenharmony_ci 
56127db96d56Sopenharmony_ci # checks for header files
56137db96d56Sopenharmony_ci AC_CHECK_HEADERS([ \
56147db96d56Sopenharmony_ci-  alloca.h asm/types.h bluetooth.h conio.h crypt.h direct.h dlfcn.h endian.h errno.h fcntl.h grp.h \
56157db96d56Sopenharmony_ci+  alloca.h asm/types.h bluetooth.h conio.h crypt.h direct.h endian.h errno.h fcntl.h grp.h \
56167db96d56Sopenharmony_ci   ieeefp.h io.h langinfo.h libintl.h libutil.h linux/auxvec.h sys/auxv.h linux/memfd.h \
56177db96d56Sopenharmony_ci   linux/random.h linux/soundcard.h \
56187db96d56Sopenharmony_ci-  linux/tipc.h linux/wait.h netdb.h netinet/in.h netpacket/packet.h poll.h process.h pthread.h pty.h \
56197db96d56Sopenharmony_ci-  sched.h setjmp.h shadow.h signal.h spawn.h stropts.h sys/audioio.h sys/bsdtty.h sys/devpoll.h \
56207db96d56Sopenharmony_ci+  linux/tipc.h linux/wait.h netdb.h netinet/in.h netpacket/packet.h poll.h process.h pty.h \
56217db96d56Sopenharmony_ci+  setjmp.h shadow.h signal.h spawn.h stropts.h sys/audioio.h sys/bsdtty.h sys/devpoll.h \
56227db96d56Sopenharmony_ci   sys/endian.h sys/epoll.h sys/event.h sys/eventfd.h sys/file.h sys/ioctl.h sys/kern_control.h \
56237db96d56Sopenharmony_ci   sys/loadavg.h sys/lock.h sys/memfd.h sys/mkdev.h sys/mman.h sys/modem.h sys/param.h sys/poll.h \
56247db96d56Sopenharmony_ci   sys/random.h sys/resource.h sys/select.h sys/sendfile.h sys/socket.h sys/soundcard.h sys/stat.h \
56257db96d56Sopenharmony_ci@@ -2675,9 +2843,24 @@ AC_CHECK_HEADERS([ \
56267db96d56Sopenharmony_ci   sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h sys/xattr.h sysexits.h syslog.h \
56277db96d56Sopenharmony_ci   termios.h util.h utime.h utmp.h \
56287db96d56Sopenharmony_ci ])
56297db96d56Sopenharmony_ci+
56307db96d56Sopenharmony_ci+case $host in
56317db96d56Sopenharmony_ci+  *-*-mingw*) ;;
56327db96d56Sopenharmony_ci+  *) AC_CHECK_HEADERS([dlfcn.h]);;
56337db96d56Sopenharmony_ci+esac
56347db96d56Sopenharmony_ci+
56357db96d56Sopenharmony_ci+
56367db96d56Sopenharmony_ci AC_HEADER_DIRENT
56377db96d56Sopenharmony_ci AC_HEADER_MAJOR
56387db96d56Sopenharmony_ci 
56397db96d56Sopenharmony_ci+# If using nt threads, don't look for pthread.h or thread.h
56407db96d56Sopenharmony_ci+if test "x$with_nt_threads" = xno ; then
56417db96d56Sopenharmony_ci+AC_HEADER_STDC
56427db96d56Sopenharmony_ci+AC_CHECK_HEADERS(pthread.h sched.h thread.h)
56437db96d56Sopenharmony_ci+AC_HEADER_DIRENT
56447db96d56Sopenharmony_ci+AC_HEADER_MAJOR
56457db96d56Sopenharmony_ci+fi
56467db96d56Sopenharmony_ci+
56477db96d56Sopenharmony_ci # bluetooth/bluetooth.h has been known to not compile with -std=c99.
56487db96d56Sopenharmony_ci # http://permalink.gmane.org/gmane.linux.bluez.kernel/22294
56497db96d56Sopenharmony_ci SAVE_CFLAGS=$CFLAGS
56507db96d56Sopenharmony_ci@@ -2852,6 +3035,10 @@ dnl LFS does not work with Emscripten 3.1
56517db96d56Sopenharmony_ci AS_CASE([$ac_sys_system],
56527db96d56Sopenharmony_ci   [Emscripten], [have_largefile_support="no"]
56537db96d56Sopenharmony_ci )
56547db96d56Sopenharmony_ci+dnl Activate on windows platforms (32&64-bit) where off_t(4) < fpos_t(8)
56557db96d56Sopenharmony_ci+AS_CASE([$ac_sys_system],
56567db96d56Sopenharmony_ci+  [MINGW], [have_largefile_support="yes"]
56577db96d56Sopenharmony_ci+)
56587db96d56Sopenharmony_ci AS_VAR_IF([have_largefile_support], [yes], [
56597db96d56Sopenharmony_ci   AC_DEFINE(HAVE_LARGEFILE_SUPPORT, 1,
56607db96d56Sopenharmony_ci   [Defined to enable large file support when an off_t is bigger than a long
56617db96d56Sopenharmony_ci@@ -2882,6 +3069,10 @@ elif test "$ac_cv_pthread" = "yes"
56627db96d56Sopenharmony_ci then CC="$CC -pthread"
56637db96d56Sopenharmony_ci fi
56647db96d56Sopenharmony_ci 
56657db96d56Sopenharmony_ci+if test $with_nt_threads = yes ; then
56667db96d56Sopenharmony_ci+  dnl skip check for pthread_t if NT-thread model is enabled
56677db96d56Sopenharmony_ci+  ac_cv_have_pthread_t=skip
56687db96d56Sopenharmony_ci+else
56697db96d56Sopenharmony_ci AC_CACHE_CHECK([for pthread_t], [ac_cv_have_pthread_t], [
56707db96d56Sopenharmony_ci AC_COMPILE_IFELSE([
56717db96d56Sopenharmony_ci   AC_LANG_PROGRAM([[#include <pthread.h>]], [[pthread_t x; x = *(pthread_t*)0;]])
56727db96d56Sopenharmony_ci@@ -2913,7 +3104,7 @@ AS_VAR_IF([ac_cv_pthread_key_t_is_arithmetic_type], [yes], [
56737db96d56Sopenharmony_ci     AC_DEFINE(PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT, 1,
56747db96d56Sopenharmony_ci               [Define if pthread_key_t is compatible with int.])
56757db96d56Sopenharmony_ci ])
56767db96d56Sopenharmony_ci-
56777db96d56Sopenharmony_ci+fi
56787db96d56Sopenharmony_ci CC="$ac_save_cc"
56797db96d56Sopenharmony_ci 
56807db96d56Sopenharmony_ci AC_SUBST(OTHER_LIBTOOL_OPT)
56817db96d56Sopenharmony_ci@@ -3089,6 +3280,9 @@ if test -z "$SHLIB_SUFFIX"; then
56827db96d56Sopenharmony_ci 	CYGWIN*)   SHLIB_SUFFIX=.dll;;
56837db96d56Sopenharmony_ci 	*)	   SHLIB_SUFFIX=.so;;
56847db96d56Sopenharmony_ci 	esac
56857db96d56Sopenharmony_ci+	case $host_os in
56867db96d56Sopenharmony_ci+	mingw*)    SHLIB_SUFFIX=.pyd;;
56877db96d56Sopenharmony_ci+	esac
56887db96d56Sopenharmony_ci fi
56897db96d56Sopenharmony_ci AC_MSG_RESULT($SHLIB_SUFFIX)
56907db96d56Sopenharmony_ci 
56917db96d56Sopenharmony_ci@@ -3218,6 +3412,10 @@ then
56927db96d56Sopenharmony_ci 	CYGWIN*)
56937db96d56Sopenharmony_ci 		LDSHARED="gcc -shared -Wl,--enable-auto-image-base"
56947db96d56Sopenharmony_ci 		LDCXXSHARED="g++ -shared -Wl,--enable-auto-image-base";;
56957db96d56Sopenharmony_ci+  MINGW*)
56967db96d56Sopenharmony_ci+    LDSHARED='$(CC) -shared -Wl,--enable-auto-image-base'
56977db96d56Sopenharmony_ci+    LDCXXSHARED='$(CXX) -shared -Wl,--enable-auto-image-base'
56987db96d56Sopenharmony_ci+    ;;
56997db96d56Sopenharmony_ci 	*)	LDSHARED="ld";;
57007db96d56Sopenharmony_ci 	esac
57017db96d56Sopenharmony_ci fi
57027db96d56Sopenharmony_ci@@ -3341,6 +3539,11 @@ then
57037db96d56Sopenharmony_ci 	VxWorks*)
57047db96d56Sopenharmony_ci 		LINKFORSHARED='-Wl,-export-dynamic';;
57057db96d56Sopenharmony_ci 	esac
57067db96d56Sopenharmony_ci+	case $host in
57077db96d56Sopenharmony_ci+	*-*-mingw*)
57087db96d56Sopenharmony_ci+		# for https://bugs.python.org/issue40458 on MINGW
57097db96d56Sopenharmony_ci+		LINKFORSHARED="-Wl,--stack,2000000";;
57107db96d56Sopenharmony_ci+	esac
57117db96d56Sopenharmony_ci fi
57127db96d56Sopenharmony_ci AC_MSG_RESULT($LINKFORSHARED)
57137db96d56Sopenharmony_ci 
57147db96d56Sopenharmony_ci@@ -3385,7 +3588,12 @@ AC_MSG_RESULT($SHLIBS)
57157db96d56Sopenharmony_ci 
57167db96d56Sopenharmony_ci # checks for libraries
57177db96d56Sopenharmony_ci AC_CHECK_LIB(sendfile, sendfile)
57187db96d56Sopenharmony_ci-AC_CHECK_LIB(dl, dlopen)	# Dynamic linking for SunOS/Solaris and SYSV
57197db96d56Sopenharmony_ci+
57207db96d56Sopenharmony_ci+case $host in
57217db96d56Sopenharmony_ci+  *-*-mingw*) ;;
57227db96d56Sopenharmony_ci+  *) AC_CHECK_LIB(dl, dlopen) ;;	# Dynamic linking for SunOS/Solaris and SYSV
57237db96d56Sopenharmony_ci+esac
57247db96d56Sopenharmony_ci+
57257db96d56Sopenharmony_ci AC_CHECK_LIB(dld, shl_load)	# Dynamic linking for HP-UX
57267db96d56Sopenharmony_ci 
57277db96d56Sopenharmony_ci 
57287db96d56Sopenharmony_ci@@ -3448,16 +3656,30 @@ AS_VAR_IF([have_uuid], [missing], [
57297db96d56Sopenharmony_ci 
57307db96d56Sopenharmony_ci AS_VAR_IF([have_uuid], [missing], [have_uuid=no])
57317db96d56Sopenharmony_ci 
57327db96d56Sopenharmony_ci+if test $with_nt_threads = yes ; then
57337db96d56Sopenharmony_ci+  dnl do not search for sem_init if NT-thread model is enabled
57347db96d56Sopenharmony_ci+  :
57357db96d56Sopenharmony_ci+else
57367db96d56Sopenharmony_ci # 'Real Time' functions on Solaris
57377db96d56Sopenharmony_ci # posix4 on Solaris 2.6
57387db96d56Sopenharmony_ci # pthread (first!) on Linux
57397db96d56Sopenharmony_ci AC_SEARCH_LIBS(sem_init, pthread rt posix4)
57407db96d56Sopenharmony_ci+fi
57417db96d56Sopenharmony_ci 
57427db96d56Sopenharmony_ci # check if we need libintl for locale functions
57437db96d56Sopenharmony_ci+case $host in
57447db96d56Sopenharmony_ci+  *-*-mingw*)
57457db96d56Sopenharmony_ci+  dnl Native windows build don't use libintl (see _localemodule.c).
57467db96d56Sopenharmony_ci+  dnl Also we don't like setup.py to add "intl" library to the list
57477db96d56Sopenharmony_ci+  dnl when build _locale module.
57487db96d56Sopenharmony_ci+  ;;
57497db96d56Sopenharmony_ci+  *)
57507db96d56Sopenharmony_ci AC_CHECK_LIB(intl, textdomain,
57517db96d56Sopenharmony_ci 	[AC_DEFINE(WITH_LIBINTL, 1,
57527db96d56Sopenharmony_ci 	[Define to 1 if libintl is needed for locale functions.])
57537db96d56Sopenharmony_ci         LIBS="-lintl $LIBS"])
57547db96d56Sopenharmony_ci+  ;;
57557db96d56Sopenharmony_ci+esac
57567db96d56Sopenharmony_ci 
57577db96d56Sopenharmony_ci # checks for system dependent C++ extensions support
57587db96d56Sopenharmony_ci case "$ac_sys_system" in
57597db96d56Sopenharmony_ci@@ -3645,7 +3867,7 @@ else
57607db96d56Sopenharmony_ci fi
57617db96d56Sopenharmony_ci 
57627db96d56Sopenharmony_ci if test "$with_system_ffi" = "yes" && test -n "$PKG_CONFIG"; then
57637db96d56Sopenharmony_ci-    LIBFFI_INCLUDEDIR="`"$PKG_CONFIG" libffi --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ *$//'`"
57647db96d56Sopenharmony_ci+    LIBFFI_INCLUDEDIR="`"$PKG_CONFIG" libffi --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ .*$//'`"
57657db96d56Sopenharmony_ci else
57667db96d56Sopenharmony_ci     LIBFFI_INCLUDEDIR=""
57677db96d56Sopenharmony_ci fi
57687db96d56Sopenharmony_ci@@ -3780,6 +4002,12 @@ AS_CASE([$ac_sys_system],
57697db96d56Sopenharmony_ci   [OSSAUDIODEV_LIBS=""]
57707db96d56Sopenharmony_ci )
57717db96d56Sopenharmony_ci 
57727db96d56Sopenharmony_ci+dnl On MINGW, you need to link against ws2_32 and iphlpapi for sockets to work
57737db96d56Sopenharmony_ci+AS_CASE([$ac_sys_system],
57747db96d56Sopenharmony_ci+  [MINGW], [SOCKET_LIBS="-lws2_32 -liphlpapi"],
57757db96d56Sopenharmony_ci+  [SOCKET_LIBS=""]
57767db96d56Sopenharmony_ci+)
57777db96d56Sopenharmony_ci+
57787db96d56Sopenharmony_ci dnl detect sqlite3 from Emscripten emport
57797db96d56Sopenharmony_ci PY_CHECK_EMSCRIPTEN_PORT([LIBSQLITE3], [-sUSE_SQLITE3])
57807db96d56Sopenharmony_ci 
57817db96d56Sopenharmony_ci@@ -4042,6 +4270,18 @@ AS_VAR_IF([with_dbmliborder], [error], [
57827db96d56Sopenharmony_ci ])
57837db96d56Sopenharmony_ci AC_MSG_RESULT($with_dbmliborder)
57847db96d56Sopenharmony_ci 
57857db96d56Sopenharmony_ci+case $host in
57867db96d56Sopenharmony_ci+  *-*-mingw*)
57877db96d56Sopenharmony_ci+    CFLAGS_NODIST="$CFLAGS_NODIST -D_WIN32_WINNT=0x0602";;
57887db96d56Sopenharmony_ci+esac
57897db96d56Sopenharmony_ci+
57907db96d56Sopenharmony_ci+# Determine if windows modules should be used.
57917db96d56Sopenharmony_ci+AC_SUBST(USE_WIN32_MODULE)
57927db96d56Sopenharmony_ci+USE_WIN32_MODULE='#'
57937db96d56Sopenharmony_ci+case $host in
57947db96d56Sopenharmony_ci+  *-*-mingw*) USE_WIN32_MODULE=;;
57957db96d56Sopenharmony_ci+esac
57967db96d56Sopenharmony_ci+
57977db96d56Sopenharmony_ci # Templates for things AC_DEFINEd more than once.
57987db96d56Sopenharmony_ci # For a single AC_DEFINE, no template is needed.
57997db96d56Sopenharmony_ci AH_TEMPLATE(_REENTRANT,
58007db96d56Sopenharmony_ci@@ -4076,6 +4316,11 @@ then
58017db96d56Sopenharmony_ci         CXX="$CXX -pthread"
58027db96d56Sopenharmony_ci     fi
58037db96d56Sopenharmony_ci     posix_threads=yes
58047db96d56Sopenharmony_ci+elif test $with_nt_threads = yes
58057db96d56Sopenharmony_ci+then
58067db96d56Sopenharmony_ci+    posix_threads=no
58077db96d56Sopenharmony_ci+    AC_DEFINE(NT_THREADS, 1,
58087db96d56Sopenharmony_ci+        [Define to 1 if you want to use native NT threads])
58097db96d56Sopenharmony_ci else
58107db96d56Sopenharmony_ci     if test ! -z "$withval" -a -d "$withval"
58117db96d56Sopenharmony_ci     then LDFLAGS="$LDFLAGS -L$withval"
58127db96d56Sopenharmony_ci@@ -4450,11 +4695,14 @@ AC_MSG_RESULT($with_freelists)
58137db96d56Sopenharmony_ci AC_MSG_CHECKING(for --with-c-locale-coercion)
58147db96d56Sopenharmony_ci AC_ARG_WITH(c-locale-coercion,
58157db96d56Sopenharmony_ci             AS_HELP_STRING([--with-c-locale-coercion],
58167db96d56Sopenharmony_ci-              [enable C locale coercion to a UTF-8 based locale (default is yes)]))
58177db96d56Sopenharmony_ci+              [enable C locale coercion to a UTF-8 based locale (default is yes on Unix, no on Windows)]))
58187db96d56Sopenharmony_ci 
58197db96d56Sopenharmony_ci if test -z "$with_c_locale_coercion"
58207db96d56Sopenharmony_ci then
58217db96d56Sopenharmony_ci-    with_c_locale_coercion="yes"
58227db96d56Sopenharmony_ci+    case $host in
58237db96d56Sopenharmony_ci+      *-*-mingw*) with_c_locale_coercion="no";;
58247db96d56Sopenharmony_ci+      *) with_c_locale_coercion="yes";;
58257db96d56Sopenharmony_ci+    esac
58267db96d56Sopenharmony_ci fi
58277db96d56Sopenharmony_ci if test "$with_c_locale_coercion" != "no"
58287db96d56Sopenharmony_ci then
58297db96d56Sopenharmony_ci@@ -4555,12 +4803,36 @@ then
58307db96d56Sopenharmony_ci 	fi
58317db96d56Sopenharmony_ci 	;;
58327db96d56Sopenharmony_ci 	esac
58337db96d56Sopenharmony_ci+	case $host in
58347db96d56Sopenharmony_ci+	*-*-mingw*)
58357db96d56Sopenharmony_ci+    DYNLOADFILE="dynload_win.o"
58367db96d56Sopenharmony_ci+    extra_machdep_objs="$extra_machdep_objs PC/dl_nt.o"
58377db96d56Sopenharmony_ci+    CFLAGS_NODIST="$CFLAGS_NODIST -DPY3_DLLNAME='L\"$DLLLIBRARY\"'"
58387db96d56Sopenharmony_ci+    case $host in
58397db96d56Sopenharmony_ci+        i686*)
58407db96d56Sopenharmony_ci+                CFLAGS_NODIST="$CFLAGS_NODIST -DMS_DLL_ID='\"${VERSION}-32\"'"
58417db96d56Sopenharmony_ci+            ;;
58427db96d56Sopenharmony_ci+        armv7*)
58437db96d56Sopenharmony_ci+                CFLAGS_NODIST="$CFLAGS_NODIST -DMS_DLL_ID='\"${VERSION}-arm32\"'"
58447db96d56Sopenharmony_ci+            ;;
58457db96d56Sopenharmony_ci+        aarch64*)
58467db96d56Sopenharmony_ci+                CFLAGS_NODIST="$CFLAGS_NODIST -DMS_DLL_ID='\"${VERSION}-arm64\"'"
58477db96d56Sopenharmony_ci+            ;;
58487db96d56Sopenharmony_ci+            *)
58497db96d56Sopenharmony_ci+                CFLAGS_NODIST="$CFLAGS_NODIST -DMS_DLL_ID='\"$VERSION\"'"
58507db96d56Sopenharmony_ci+            ;;
58517db96d56Sopenharmony_ci+      esac
58527db96d56Sopenharmony_ci+    ;;
58537db96d56Sopenharmony_ci+	esac
58547db96d56Sopenharmony_ci fi
58557db96d56Sopenharmony_ci AC_MSG_RESULT($DYNLOADFILE)
58567db96d56Sopenharmony_ci if test "$DYNLOADFILE" != "dynload_stub.o"
58577db96d56Sopenharmony_ci then
58587db96d56Sopenharmony_ci+  have_dynamic_loading=yes
58597db96d56Sopenharmony_ci 	AC_DEFINE(HAVE_DYNAMIC_LOADING, 1,
58607db96d56Sopenharmony_ci         [Defined when any dynamic module loading is enabled.])
58617db96d56Sopenharmony_ci+else
58627db96d56Sopenharmony_ci+  have_dynamic_loading=no
58637db96d56Sopenharmony_ci fi
58647db96d56Sopenharmony_ci 
58657db96d56Sopenharmony_ci # MACHDEP_OBJS can be set to platform-specific object files needed by Python
58667db96d56Sopenharmony_ci@@ -4580,13 +4852,22 @@ else
58677db96d56Sopenharmony_ci fi
58687db96d56Sopenharmony_ci 
58697db96d56Sopenharmony_ci # checks for library functions
58707db96d56Sopenharmony_ci+if test $with_nt_threads = yes ; then
58717db96d56Sopenharmony_ci+  dnl GCC(mingw) 4.4+ require and use posix threads(pthreads-w32)
58727db96d56Sopenharmony_ci+  dnl and host may contain installed pthreads-w32.
58737db96d56Sopenharmony_ci+  dnl Skip checks for some functions declared in pthreads-w32 if
58747db96d56Sopenharmony_ci+  dnl NT-thread model is enabled.
58757db96d56Sopenharmony_ci+  ac_cv_func_pthread_kill=skip
58767db96d56Sopenharmony_ci+  ac_cv_func_sem_open=skip
58777db96d56Sopenharmony_ci+  ac_cv_func_sched_setscheduler=skip
58787db96d56Sopenharmony_ci+fi
58797db96d56Sopenharmony_ci AC_CHECK_FUNCS([ \
58807db96d56Sopenharmony_ci   accept4 alarm bind_textdomain_codeset chmod chown clock close_range confstr \
58817db96d56Sopenharmony_ci   copy_file_range ctermid dup dup3 execv explicit_bzero explicit_memset \
58827db96d56Sopenharmony_ci   faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \
58837db96d56Sopenharmony_ci   fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \
58847db96d56Sopenharmony_ci   gai_strerror getegid getentropy geteuid getgid getgrgid getgrgid_r \
58857db96d56Sopenharmony_ci-  getgrnam_r getgrouplist getgroups gethostname getitimer getloadavg getlogin \
58867db96d56Sopenharmony_ci+  getgrnam_r getgrouplist getgroups getitimer getloadavg getlogin \
58877db96d56Sopenharmony_ci   getpeername getpgid getpid getppid getpriority _getpty \
58887db96d56Sopenharmony_ci   getpwent getpwnam_r getpwuid getpwuid_r getresgid getresuid getrusage getsid getspent \
58897db96d56Sopenharmony_ci   getspnam getuid getwd if_nameindex initgroups kill killpg lchown linkat \
58907db96d56Sopenharmony_ci@@ -4599,7 +4880,7 @@ AC_CHECK_FUNCS([ \
58917db96d56Sopenharmony_ci   sched_setparam sched_setscheduler sem_clockwait sem_getvalue sem_open \
58927db96d56Sopenharmony_ci   sem_timedwait sem_unlink sendfile setegid seteuid setgid sethostname \
58937db96d56Sopenharmony_ci   setitimer setlocale setpgid setpgrp setpriority setregid setresgid \
58947db96d56Sopenharmony_ci-  setresuid setreuid setsid setuid setvbuf shutdown sigaction sigaltstack \
58957db96d56Sopenharmony_ci+  setresuid setreuid setsid setuid setvbuf sigaction sigaltstack \
58967db96d56Sopenharmony_ci   sigfillset siginterrupt sigpending sigrelse sigtimedwait sigwait \
58977db96d56Sopenharmony_ci   sigwaitinfo snprintf splice strftime strlcpy strsignal symlinkat sync \
58987db96d56Sopenharmony_ci   sysconf system tcgetpgrp tcsetpgrp tempnam timegm times tmpfile \
58997db96d56Sopenharmony_ci@@ -4829,7 +5110,13 @@ PKG_CHECK_MODULES([LIBLZMA], [liblzma], [have_liblzma=yes], [
59007db96d56Sopenharmony_ci ])
59017db96d56Sopenharmony_ci 
59027db96d56Sopenharmony_ci dnl PY_CHECK_NETDB_FUNC(FUNCTION)
59037db96d56Sopenharmony_ci-AC_DEFUN([PY_CHECK_NETDB_FUNC], [PY_CHECK_FUNC([$1], [#include <netdb.h>])])
59047db96d56Sopenharmony_ci+AC_DEFUN([PY_CHECK_NETDB_FUNC], [PY_CHECK_FUNC([$1], [
59057db96d56Sopenharmony_ci+#ifdef _WIN32
59067db96d56Sopenharmony_ci+  #include <winsock.h>
59077db96d56Sopenharmony_ci+#else
59087db96d56Sopenharmony_ci+  #include <netdb.h>
59097db96d56Sopenharmony_ci+#endif
59107db96d56Sopenharmony_ci+])])
59117db96d56Sopenharmony_ci 
59127db96d56Sopenharmony_ci PY_CHECK_NETDB_FUNC([hstrerror])
59137db96d56Sopenharmony_ci dnl not available in WASI yet
59147db96d56Sopenharmony_ci@@ -4838,13 +5125,19 @@ PY_CHECK_NETDB_FUNC([getservbyport])
59157db96d56Sopenharmony_ci PY_CHECK_NETDB_FUNC([gethostbyname])
59167db96d56Sopenharmony_ci PY_CHECK_NETDB_FUNC([gethostbyaddr])
59177db96d56Sopenharmony_ci PY_CHECK_NETDB_FUNC([getprotobyname])
59187db96d56Sopenharmony_ci+PY_CHECK_NETDB_FUNC([gethostname])
59197db96d56Sopenharmony_ci+PY_CHECK_NETDB_FUNC([shutdown])
59207db96d56Sopenharmony_ci 
59217db96d56Sopenharmony_ci dnl PY_CHECK_SOCKET_FUNC(FUNCTION)
59227db96d56Sopenharmony_ci AC_DEFUN([PY_CHECK_SOCKET_FUNC], [PY_CHECK_FUNC([$1], [
59237db96d56Sopenharmony_ci+#ifdef _WIN32
59247db96d56Sopenharmony_ci+#include <ws2tcpip.h>
59257db96d56Sopenharmony_ci+#else
59267db96d56Sopenharmony_ci #include <sys/types.h>
59277db96d56Sopenharmony_ci #include <sys/socket.h>
59287db96d56Sopenharmony_ci #include <netinet/in.h>
59297db96d56Sopenharmony_ci #include <arpa/inet.h>
59307db96d56Sopenharmony_ci+#endif
59317db96d56Sopenharmony_ci ])])
59327db96d56Sopenharmony_ci 
59337db96d56Sopenharmony_ci PY_CHECK_SOCKET_FUNC([inet_aton])
59347db96d56Sopenharmony_ci@@ -4945,6 +5238,9 @@ WITH_SAVE_ENV([
59357db96d56Sopenharmony_ci   ])
59367db96d56Sopenharmony_ci ])
59377db96d56Sopenharmony_ci 
59387db96d56Sopenharmony_ci+case $host in
59397db96d56Sopenharmony_ci+  *-*-mingw*) ;;
59407db96d56Sopenharmony_ci+  *)
59417db96d56Sopenharmony_ci AC_CHECK_FUNCS(clock_gettime, [], [
59427db96d56Sopenharmony_ci     AC_CHECK_LIB(rt, clock_gettime, [
59437db96d56Sopenharmony_ci         LIBS="$LIBS -lrt"
59447db96d56Sopenharmony_ci@@ -4965,6 +5261,8 @@ AC_CHECK_FUNCS(clock_settime, [], [
59457db96d56Sopenharmony_ci         AC_DEFINE(HAVE_CLOCK_SETTIME, 1)
59467db96d56Sopenharmony_ci     ])
59477db96d56Sopenharmony_ci ])
59487db96d56Sopenharmony_ci+  ;;
59497db96d56Sopenharmony_ci+esac
59507db96d56Sopenharmony_ci 
59517db96d56Sopenharmony_ci AC_CHECK_FUNCS(clock_nanosleep, [], [
59527db96d56Sopenharmony_ci     AC_CHECK_LIB(rt, clock_nanosleep, [
59537db96d56Sopenharmony_ci@@ -5163,18 +5461,33 @@ if test $ac_cv_header_time_altzone = yes; then
59547db96d56Sopenharmony_ci   AC_DEFINE(HAVE_ALTZONE, 1, [Define this if your time.h defines altzone.])
59557db96d56Sopenharmony_ci fi
59567db96d56Sopenharmony_ci 
59577db96d56Sopenharmony_ci+AC_CHECK_HEADERS([ws2tcpip.h])
59587db96d56Sopenharmony_ci AC_CACHE_CHECK([for addrinfo], [ac_cv_struct_addrinfo],
59597db96d56Sopenharmony_ci-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <netdb.h>]], [[struct addrinfo a]])],
59607db96d56Sopenharmony_ci+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
59617db96d56Sopenharmony_ci+#ifdef HAVE_WS2TCPIP_H
59627db96d56Sopenharmony_ci+#  include <ws2tcpip.h>
59637db96d56Sopenharmony_ci+#else
59647db96d56Sopenharmony_ci+#  include <netdb.h>
59657db96d56Sopenharmony_ci+#endif]],
59667db96d56Sopenharmony_ci+    [[struct addrinfo a]])],
59677db96d56Sopenharmony_ci   [ac_cv_struct_addrinfo=yes],
59687db96d56Sopenharmony_ci   [ac_cv_struct_addrinfo=no]))
59697db96d56Sopenharmony_ci if test $ac_cv_struct_addrinfo = yes; then
59707db96d56Sopenharmony_ci-	AC_DEFINE(HAVE_ADDRINFO, 1, [struct addrinfo (netdb.h)])
59717db96d56Sopenharmony_ci+	AC_DEFINE(HAVE_ADDRINFO, 1, [struct addrinfo])
59727db96d56Sopenharmony_ci fi
59737db96d56Sopenharmony_ci 
59747db96d56Sopenharmony_ci AC_CACHE_CHECK([for sockaddr_storage], [ac_cv_struct_sockaddr_storage],
59757db96d56Sopenharmony_ci AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
59767db96d56Sopenharmony_ci-#		include <sys/types.h>
59777db96d56Sopenharmony_ci-#		include <sys/socket.h>]], [[struct sockaddr_storage s]])],
59787db96d56Sopenharmony_ci+#ifdef HAVE_WS2TCPIP_H
59797db96d56Sopenharmony_ci+#include <ws2tcpip.h>
59807db96d56Sopenharmony_ci+#endif
59817db96d56Sopenharmony_ci+#ifdef HAVE_SYS_TYPES_H
59827db96d56Sopenharmony_ci+#include <sys/types.h>
59837db96d56Sopenharmony_ci+#endif
59847db96d56Sopenharmony_ci+#ifdef HAVE_SYS_SOCKET_H
59857db96d56Sopenharmony_ci+#include <sys/socket.h>
59867db96d56Sopenharmony_ci+#endif]],
59877db96d56Sopenharmony_ci+    [[struct sockaddr_storage s]])],
59887db96d56Sopenharmony_ci   [ac_cv_struct_sockaddr_storage=yes],
59897db96d56Sopenharmony_ci   [ac_cv_struct_sockaddr_storage=no]))
59907db96d56Sopenharmony_ci if test $ac_cv_struct_sockaddr_storage = yes; then
59917db96d56Sopenharmony_ci@@ -5508,6 +5821,10 @@ dnl actually works.  For FreeBSD versions <= 7.2,
59927db96d56Sopenharmony_ci dnl the kernel module that provides POSIX semaphores
59937db96d56Sopenharmony_ci dnl isn't loaded by default, so an attempt to call
59947db96d56Sopenharmony_ci dnl sem_open results in a 'Signal 12' error.
59957db96d56Sopenharmony_ci+if test $with_nt_threads = yes ; then
59967db96d56Sopenharmony_ci+  dnl skip posix semaphores test if NT-thread model is enabled
59977db96d56Sopenharmony_ci+  ac_cv_posix_semaphores_enabled=no
59987db96d56Sopenharmony_ci+fi
59997db96d56Sopenharmony_ci AC_CACHE_CHECK([whether POSIX semaphores are enabled], [ac_cv_posix_semaphores_enabled],
60007db96d56Sopenharmony_ci   AC_RUN_IFELSE([
60017db96d56Sopenharmony_ci     AC_LANG_SOURCE([
60027db96d56Sopenharmony_ci@@ -5541,6 +5858,14 @@ AS_VAR_IF([ac_cv_posix_semaphores_enabled], [no], [
60037db96d56Sopenharmony_ci ])
60047db96d56Sopenharmony_ci 
60057db96d56Sopenharmony_ci dnl Multiprocessing check for broken sem_getvalue
60067db96d56Sopenharmony_ci+if test $with_nt_threads = yes ; then
60077db96d56Sopenharmony_ci+  dnl Skip test if NT-thread model is enabled.
60087db96d56Sopenharmony_ci+  dnl NOTE the test case below fail for pthreads-w32 as:
60097db96d56Sopenharmony_ci+  dnl - SEM_FAILED is not defined;
60107db96d56Sopenharmony_ci+  dnl - sem_open is a stub;
60117db96d56Sopenharmony_ci+  dnl - sem_getvalue work(!).
60127db96d56Sopenharmony_ci+  ac_cv_broken_sem_getvalue=skip
60137db96d56Sopenharmony_ci+fi
60147db96d56Sopenharmony_ci AC_CACHE_CHECK([for broken sem_getvalue], [ac_cv_broken_sem_getvalue],
60157db96d56Sopenharmony_ci   AC_RUN_IFELSE([
60167db96d56Sopenharmony_ci     AC_LANG_SOURCE([
60177db96d56Sopenharmony_ci@@ -5577,7 +5902,10 @@ AS_VAR_IF([ac_cv_broken_sem_getvalue], [yes], [
60187db96d56Sopenharmony_ci   )
60197db96d56Sopenharmony_ci ])
60207db96d56Sopenharmony_ci 
60217db96d56Sopenharmony_ci-AC_CHECK_DECLS([RTLD_LAZY, RTLD_NOW, RTLD_GLOBAL, RTLD_LOCAL, RTLD_NODELETE, RTLD_NOLOAD, RTLD_DEEPBIND, RTLD_MEMBER], [], [], [[#include <dlfcn.h>]])
60227db96d56Sopenharmony_ci+case $host in
60237db96d56Sopenharmony_ci+  *-*-mingw*) ;;
60247db96d56Sopenharmony_ci+  *) AC_CHECK_DECLS([RTLD_LAZY, RTLD_NOW, RTLD_GLOBAL, RTLD_LOCAL, RTLD_NODELETE, RTLD_NOLOAD, RTLD_DEEPBIND, RTLD_MEMBER], [], [], [[#include <dlfcn.h>]]);;
60257db96d56Sopenharmony_ci+esac
60267db96d56Sopenharmony_ci 
60277db96d56Sopenharmony_ci # determine what size digit to use for Python's longs
60287db96d56Sopenharmony_ci AC_MSG_CHECKING([digit size for Python's longs])
60297db96d56Sopenharmony_ci@@ -5664,6 +5992,71 @@ esac
60307db96d56Sopenharmony_ci # check for endianness
60317db96d56Sopenharmony_ci AC_C_BIGENDIAN
60327db96d56Sopenharmony_ci 
60337db96d56Sopenharmony_ci+AC_SUBST(PYD_PLATFORM_TAG)
60347db96d56Sopenharmony_ci+# Special case of PYD_PLATFORM_TAG with python build with mingw. 
60357db96d56Sopenharmony_ci+# Python can with compiled with clang or gcc and linked
60367db96d56Sopenharmony_ci+# to msvcrt or ucrt. To avoid conflicts between them
60377db96d56Sopenharmony_ci+# we are selecting the extension as based on the compiler
60387db96d56Sopenharmony_ci+# and the runtime they link to
60397db96d56Sopenharmony_ci+#   gcc + x86_64 + msvcrt = cp{version number}-x86_64
60407db96d56Sopenharmony_ci+#   gcc + i686 + msvcrt = cp{version number}-i686
60417db96d56Sopenharmony_ci+#   gcc + x86_64 + ucrt = cp{version number}-x86_64-ucrt
60427db96d56Sopenharmony_ci+#   clang + x86_64 + ucrt = cp{version number}-x86_64-clang
60437db96d56Sopenharmony_ci+#   clang + i686 + ucrt = cp{version number}-i686-clang
60447db96d56Sopenharmony_ci+
60457db96d56Sopenharmony_ci+PYD_PLATFORM_TAG=""
60467db96d56Sopenharmony_ci+case $host in
60477db96d56Sopenharmony_ci+  *-*-mingw*)
60487db96d56Sopenharmony_ci+    # check if we are linking to ucrt
60497db96d56Sopenharmony_ci+    AC_MSG_CHECKING(whether linking to ucrt)
60507db96d56Sopenharmony_ci+    AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
60517db96d56Sopenharmony_ci+    #include <stdio.h>
60527db96d56Sopenharmony_ci+    #ifndef _UCRT
60537db96d56Sopenharmony_ci+        #error no ucrt
60547db96d56Sopenharmony_ci+    #endif
60557db96d56Sopenharmony_ci+    int main(){ return 0; }
60567db96d56Sopenharmony_ci+    ]])],[linking_to_ucrt=yes],[linking_to_ucrt=no])
60577db96d56Sopenharmony_ci+    AC_MSG_RESULT($linking_to_ucrt)
60587db96d56Sopenharmony_ci+    ;;
60597db96d56Sopenharmony_ci+esac
60607db96d56Sopenharmony_ci+case $host_os in
60617db96d56Sopenharmony_ci+    mingw*)
60627db96d56Sopenharmony_ci+  AC_MSG_CHECKING(PYD_PLATFORM_TAG)
60637db96d56Sopenharmony_ci+  case $host in
60647db96d56Sopenharmony_ci+  i686-*-mingw*)
60657db96d56Sopenharmony_ci+    if test -n "${cc_is_clang}"; then
60667db96d56Sopenharmony_ci+      # it is CLANG32
60677db96d56Sopenharmony_ci+      PYD_PLATFORM_TAG="mingw_i686_clang"
60687db96d56Sopenharmony_ci+    else
60697db96d56Sopenharmony_ci+      if test $linking_to_ucrt = no; then
60707db96d56Sopenharmony_ci+        PYD_PLATFORM_TAG="mingw_i686"
60717db96d56Sopenharmony_ci+      else
60727db96d56Sopenharmony_ci+        PYD_PLATFORM_TAG="mingw_i686_ucrt"
60737db96d56Sopenharmony_ci+      fi
60747db96d56Sopenharmony_ci+    fi
60757db96d56Sopenharmony_ci+    ;;
60767db96d56Sopenharmony_ci+  x86_64-*-mingw*)
60777db96d56Sopenharmony_ci+    if test -n "${cc_is_clang}"; then
60787db96d56Sopenharmony_ci+      # it is CLANG64
60797db96d56Sopenharmony_ci+      PYD_PLATFORM_TAG="mingw_x86_64_clang"
60807db96d56Sopenharmony_ci+    else
60817db96d56Sopenharmony_ci+      if test $linking_to_ucrt = no; then
60827db96d56Sopenharmony_ci+        PYD_PLATFORM_TAG="mingw_x86_64"
60837db96d56Sopenharmony_ci+      else
60847db96d56Sopenharmony_ci+        PYD_PLATFORM_TAG="mingw_x86_64_ucrt"
60857db96d56Sopenharmony_ci+      fi
60867db96d56Sopenharmony_ci+    fi
60877db96d56Sopenharmony_ci+    ;;
60887db96d56Sopenharmony_ci+  aarch64-*-mingw*)
60897db96d56Sopenharmony_ci+    PYD_PLATFORM_TAG+="mingw_aarch64"
60907db96d56Sopenharmony_ci+    ;;
60917db96d56Sopenharmony_ci+  armv7-*-mingw*)
60927db96d56Sopenharmony_ci+    PYD_PLATFORM_TAG+="mingw_armv7"
60937db96d56Sopenharmony_ci+    ;;
60947db96d56Sopenharmony_ci+  esac
60957db96d56Sopenharmony_ci+  AC_MSG_RESULT($PYD_PLATFORM_TAG)
60967db96d56Sopenharmony_ci+esac
60977db96d56Sopenharmony_ci+
60987db96d56Sopenharmony_ci # ABI version string for Python extension modules.  This appears between the
60997db96d56Sopenharmony_ci # periods in shared library file names, e.g. foo.<SOABI>.so.  It is calculated
61007db96d56Sopenharmony_ci # from the following attributes which affect the ABI of this Python build (in
61017db96d56Sopenharmony_ci@@ -5696,7 +6089,12 @@ if test "$Py_DEBUG" = 'true' -a "$with_trace_refs" != "yes"; then
61027db96d56Sopenharmony_ci fi
61037db96d56Sopenharmony_ci 
61047db96d56Sopenharmony_ci AC_SUBST(EXT_SUFFIX)
61057db96d56Sopenharmony_ci-EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX}
61067db96d56Sopenharmony_ci+VERSION_NO_DOTS=$(echo $LDVERSION | tr -d .)
61077db96d56Sopenharmony_ci+if test -n "${PYD_PLATFORM_TAG}"; then
61087db96d56Sopenharmony_ci+  EXT_SUFFIX=".cp${VERSION_NO_DOTS}-${PYD_PLATFORM_TAG}${SHLIB_SUFFIX}"
61097db96d56Sopenharmony_ci+else
61107db96d56Sopenharmony_ci+  EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX}
61117db96d56Sopenharmony_ci+fi
61127db96d56Sopenharmony_ci 
61137db96d56Sopenharmony_ci AC_MSG_CHECKING(LDVERSION)
61147db96d56Sopenharmony_ci LDVERSION='$(VERSION)$(ABIFLAGS)'
61157db96d56Sopenharmony_ci@@ -5704,7 +6102,7 @@ AC_MSG_RESULT($LDVERSION)
61167db96d56Sopenharmony_ci 
61177db96d56Sopenharmony_ci # On Android and Cygwin the shared libraries must be linked with libpython.
61187db96d56Sopenharmony_ci AC_SUBST(LIBPYTHON)
61197db96d56Sopenharmony_ci-if test -n "$ANDROID_API_LEVEL" -o "$MACHDEP" = "cygwin"; then
61207db96d56Sopenharmony_ci+if test -n "$ANDROID_API_LEVEL" -o "$MACHDEP" = "cygwin" -o "$MACHDEP" = "win32"; then
61217db96d56Sopenharmony_ci   LIBPYTHON="-lpython${VERSION}${ABIFLAGS}"
61227db96d56Sopenharmony_ci else
61237db96d56Sopenharmony_ci   LIBPYTHON=''
61247db96d56Sopenharmony_ci@@ -6073,11 +6471,16 @@ then
61257db96d56Sopenharmony_ci   [Define if you have struct stat.st_mtimensec])
61267db96d56Sopenharmony_ci fi
61277db96d56Sopenharmony_ci 
61287db96d56Sopenharmony_ci+if test -n "$PKG_CONFIG"; then
61297db96d56Sopenharmony_ci+    NCURSESW_INCLUDEDIR="`"$PKG_CONFIG" ncursesw --cflags-only-I 2>/dev/null | sed -e 's/^-I//;s/ .*$//'`"
61307db96d56Sopenharmony_ci+else
61317db96d56Sopenharmony_ci+    NCURSESW_INCLUDEDIR=""
61327db96d56Sopenharmony_ci+fi
61337db96d56Sopenharmony_ci+AC_SUBST(NCURSESW_INCLUDEDIR)
61347db96d56Sopenharmony_ci+
61357db96d56Sopenharmony_ci # first curses header check
61367db96d56Sopenharmony_ci ac_save_cppflags="$CPPFLAGS"
61377db96d56Sopenharmony_ci-if test "$cross_compiling" = no; then
61387db96d56Sopenharmony_ci-  CPPFLAGS="$CPPFLAGS -I/usr/include/ncursesw"
61397db96d56Sopenharmony_ci-fi
61407db96d56Sopenharmony_ci+CPPFLAGS="$CPPFLAGS -I$NCURSESW_INCLUDEDIR"
61417db96d56Sopenharmony_ci 
61427db96d56Sopenharmony_ci AC_CHECK_HEADERS(curses.h ncurses.h)
61437db96d56Sopenharmony_ci 
61447db96d56Sopenharmony_ci@@ -6243,7 +6646,10 @@ fi
61457db96d56Sopenharmony_ci 
61467db96d56Sopenharmony_ci AC_CHECK_TYPE(socklen_t,,
61477db96d56Sopenharmony_ci   AC_DEFINE(socklen_t,int,
61487db96d56Sopenharmony_ci-            [Define to `int' if <sys/socket.h> does not define.]),[
61497db96d56Sopenharmony_ci+            [Define to `int' if <sys/socket.h> or <ws2tcpip.h> does not define.]),[
61507db96d56Sopenharmony_ci+#ifdef HAVE_WS2TCPIP_H
61517db96d56Sopenharmony_ci+#include <ws2tcpip.h>
61527db96d56Sopenharmony_ci+#endif
61537db96d56Sopenharmony_ci #ifdef HAVE_SYS_TYPES_H
61547db96d56Sopenharmony_ci #include <sys/types.h>
61557db96d56Sopenharmony_ci #endif
61567db96d56Sopenharmony_ci@@ -6333,6 +6739,27 @@ do
61577db96d56Sopenharmony_ci   THREADHEADERS="$THREADHEADERS \$(srcdir)/$h"
61587db96d56Sopenharmony_ci done
61597db96d56Sopenharmony_ci 
61607db96d56Sopenharmony_ci+case $host in
61617db96d56Sopenharmony_ci+  *-*-mingw*)
61627db96d56Sopenharmony_ci+    dnl Required for windows builds as Objects/exceptions.c require
61637db96d56Sopenharmony_ci+    dnl "errmap.h" from $srcdir/PC.
61647db96d56Sopenharmony_ci+    dnl Note we cannot use BASECPPFLAGS as autogenerated pyconfig.h
61657db96d56Sopenharmony_ci+    dnl has to be before customized located in ../PC.
61667db96d56Sopenharmony_ci+    dnl (-I. at end is workaround for setup.py logic)
61677db96d56Sopenharmony_ci+    CPPFLAGS="-I\$(srcdir)/PC $CPPFLAGS -I."
61687db96d56Sopenharmony_ci+    ;;
61697db96d56Sopenharmony_ci+esac
61707db96d56Sopenharmony_ci+
61717db96d56Sopenharmony_ci+dnl Python interpreter main program for frozen scripts
61727db96d56Sopenharmony_ci+AC_SUBST(PYTHON_OBJS_FROZENMAIN)
61737db96d56Sopenharmony_ci+PYTHON_OBJS_FROZENMAIN="Python/frozenmain.o"
61747db96d56Sopenharmony_ci+case $host in
61757db96d56Sopenharmony_ci+  *-*-mingw*)
61767db96d56Sopenharmony_ci+    dnl 'PC/frozen_dllmain.c' - not yet
61777db96d56Sopenharmony_ci+    PYTHON_OBJS_FROZENMAIN=
61787db96d56Sopenharmony_ci+    ;;
61797db96d56Sopenharmony_ci+esac
61807db96d56Sopenharmony_ci+
61817db96d56Sopenharmony_ci AC_SUBST(SRCDIRS)
61827db96d56Sopenharmony_ci SRCDIRS="\
61837db96d56Sopenharmony_ci   Modules \
61847db96d56Sopenharmony_ci@@ -6354,6 +6781,10 @@ SRCDIRS="\
61857db96d56Sopenharmony_ci   Python \
61867db96d56Sopenharmony_ci   Python/frozen_modules \
61877db96d56Sopenharmony_ci   Python/deepfreeze"
61887db96d56Sopenharmony_ci+case $host in
61897db96d56Sopenharmony_ci+  *-*-mingw*) SRCDIRS="$SRCDIRS PC";;
61907db96d56Sopenharmony_ci+esac
61917db96d56Sopenharmony_ci+
61927db96d56Sopenharmony_ci AC_MSG_CHECKING(for build directories)
61937db96d56Sopenharmony_ci for dir in $SRCDIRS; do
61947db96d56Sopenharmony_ci     if test ! -d $dir; then
61957db96d56Sopenharmony_ci@@ -6362,6 +6793,38 @@ for dir in $SRCDIRS; do
61967db96d56Sopenharmony_ci done
61977db96d56Sopenharmony_ci AC_MSG_RESULT(done)
61987db96d56Sopenharmony_ci 
61997db96d56Sopenharmony_ci+# For mingw build need additional library for linking
62007db96d56Sopenharmony_ci+case $host in
62017db96d56Sopenharmony_ci+  *-*-mingw*)
62027db96d56Sopenharmony_ci+    LIBS="$LIBS -lversion -lshlwapi -lpathcch -lbcrypt"
62037db96d56Sopenharmony_ci+    AC_PROG_AWK
62047db96d56Sopenharmony_ci+    if test "$AWK" = "gawk"; then
62057db96d56Sopenharmony_ci+      awk_extra_flag="--non-decimal-data"
62067db96d56Sopenharmony_ci+    fi
62077db96d56Sopenharmony_ci+    AC_MSG_CHECKING([FIELD3])
62087db96d56Sopenharmony_ci+    FIELD3=$($AWK $awk_extra_flag '\
62097db96d56Sopenharmony_ci+      /^#define PY_RELEASE_LEVEL_/             {levels[$2]=$3}    \
62107db96d56Sopenharmony_ci+      /^#define PY_MICRO_VERSION[[:space:]]+/  {micro=$3}         \
62117db96d56Sopenharmony_ci+      /^#define PY_RELEASE_LEVEL[[:space:]]+/  {level=levels[$3]} \
62127db96d56Sopenharmony_ci+      /^#define PY_RELEASE_SERIAL[[:space:]]+/ {serial=$3}        \
62137db96d56Sopenharmony_ci+      END {print micro * 1000 + level * 10 + serial}' \
62147db96d56Sopenharmony_ci+      $srcdir/Include/patchlevel.h
62157db96d56Sopenharmony_ci+    )
62167db96d56Sopenharmony_ci+    
62177db96d56Sopenharmony_ci+    AC_MSG_RESULT([${FIELD3}])
62187db96d56Sopenharmony_ci+    RCFLAGS="$RCFLAGS -DFIELD3=$FIELD3 -O COFF"
62197db96d56Sopenharmony_ci+
62207db96d56Sopenharmony_ci+    case $host in
62217db96d56Sopenharmony_ci+      i686*)  RCFLAGS="$RCFLAGS --target=pe-i386" ;;
62227db96d56Sopenharmony_ci+      x86_64*)  RCFLAGS="$RCFLAGS --target=pe-x86-64" ;;
62237db96d56Sopenharmony_ci+      *) ;;
62247db96d56Sopenharmony_ci+    esac
62257db96d56Sopenharmony_ci+  ;;
62267db96d56Sopenharmony_ci+  *)
62277db96d56Sopenharmony_ci+  ;;
62287db96d56Sopenharmony_ci+esac
62297db96d56Sopenharmony_ci+AC_SUBST(RCFLAGS)
62307db96d56Sopenharmony_ci+
62317db96d56Sopenharmony_ci # Availability of -O2:
62327db96d56Sopenharmony_ci AC_CACHE_CHECK([for -O2], [ac_cv_compile_o2], [
62337db96d56Sopenharmony_ci saved_cflags="$CFLAGS"
62347db96d56Sopenharmony_ci@@ -6971,7 +7434,6 @@ PY_STDLIB_MOD_SIMPLE([_json])
62357db96d56Sopenharmony_ci PY_STDLIB_MOD_SIMPLE([_lsprof])
62367db96d56Sopenharmony_ci PY_STDLIB_MOD_SIMPLE([_opcode])
62377db96d56Sopenharmony_ci PY_STDLIB_MOD_SIMPLE([_pickle])
62387db96d56Sopenharmony_ci-PY_STDLIB_MOD_SIMPLE([_posixsubprocess])
62397db96d56Sopenharmony_ci PY_STDLIB_MOD_SIMPLE([_queue])
62407db96d56Sopenharmony_ci PY_STDLIB_MOD_SIMPLE([_random])
62417db96d56Sopenharmony_ci PY_STDLIB_MOD_SIMPLE([select])
62427db96d56Sopenharmony_ci@@ -6982,7 +7444,7 @@ PY_STDLIB_MOD_SIMPLE([_zoneinfo])
62437db96d56Sopenharmony_ci 
62447db96d56Sopenharmony_ci dnl multiprocessing modules
62457db96d56Sopenharmony_ci PY_STDLIB_MOD([_multiprocessing],
62467db96d56Sopenharmony_ci-  [], [test "$ac_cv_func_sem_unlink" = "yes"],
62477db96d56Sopenharmony_ci+  [], [test "$ac_cv_func_sem_unlink" = "yes" -o "$MACHDEP" = "win32"],
62487db96d56Sopenharmony_ci   [-I\$(srcdir)/Modules/_multiprocessing])
62497db96d56Sopenharmony_ci PY_STDLIB_MOD([_posixshmem],
62507db96d56Sopenharmony_ci   [], [test "$have_posix_shmem" = "yes"],
62517db96d56Sopenharmony_ci@@ -7002,11 +7464,15 @@ PY_STDLIB_MOD([fcntl],
62527db96d56Sopenharmony_ci   [], [test "$ac_cv_header_sys_ioctl_h" = "yes" -a "$ac_cv_header_fcntl_h" = "yes"],
62537db96d56Sopenharmony_ci   [], [$FCNTL_LIBS])
62547db96d56Sopenharmony_ci PY_STDLIB_MOD([mmap],
62557db96d56Sopenharmony_ci-  [], [test "$ac_cv_header_sys_mman_h" = "yes" -a "$ac_cv_header_sys_stat_h" = "yes"])
62567db96d56Sopenharmony_ci+  [], m4_flatten([test "$ac_cv_header_sys_mman_h" = "yes"
62577db96d56Sopenharmony_ci+                    -a "$ac_cv_header_sys_stat_h" = "yes"
62587db96d56Sopenharmony_ci+                    -o "$MACHDEP" = "win32"]))
62597db96d56Sopenharmony_ci PY_STDLIB_MOD([_socket],
62607db96d56Sopenharmony_ci   [], m4_flatten([test "$ac_cv_header_sys_socket_h" = "yes"
62617db96d56Sopenharmony_ci                     -a "$ac_cv_header_sys_types_h" = "yes"
62627db96d56Sopenharmony_ci-                    -a "$ac_cv_header_netinet_in_h" = "yes"]))
62637db96d56Sopenharmony_ci+                    -a "$ac_cv_header_netinet_in_h" = "yes"
62647db96d56Sopenharmony_ci+                    -o "$MACHDEP" = "win32"]),
62657db96d56Sopenharmony_ci+  [], [$SOCKET_LIBS])
62667db96d56Sopenharmony_ci 
62677db96d56Sopenharmony_ci dnl platform specific extensions
62687db96d56Sopenharmony_ci PY_STDLIB_MOD([grp], [], [test "$ac_cv_func_getgrgid" = yes -o "$ac_cv_func_getgrgid_r" = yes])
62697db96d56Sopenharmony_ci@@ -7021,6 +7487,7 @@ PY_STDLIB_MOD([_scproxy],
62707db96d56Sopenharmony_ci PY_STDLIB_MOD([spwd], [], [test "$ac_cv_func_getspent" = yes -o "$ac_cv_func_getspnam" = yes])
62717db96d56Sopenharmony_ci PY_STDLIB_MOD([syslog], [], [test "$ac_cv_header_syslog_h" = yes])
62727db96d56Sopenharmony_ci PY_STDLIB_MOD([termios], [], [test "$ac_cv_header_termios_h" = yes])
62737db96d56Sopenharmony_ci+PY_STDLIB_MOD([_posixsubprocess], [], [test "$MACHDEP" != "win32"])
62747db96d56Sopenharmony_ci 
62757db96d56Sopenharmony_ci dnl _elementtree loads libexpat via CAPI hook in pyexpat
62767db96d56Sopenharmony_ci PY_STDLIB_MOD([pyexpat], [], [], [$LIBEXPAT_CFLAGS], [$LIBEXPAT_LDFLAGS])
62777db96d56Sopenharmony_ci@@ -7083,25 +7550,35 @@ PY_STDLIB_MOD([_lzma], [], [test "$have_liblzma" = yes],
62787db96d56Sopenharmony_ci 
62797db96d56Sopenharmony_ci dnl OpenSSL bindings
62807db96d56Sopenharmony_ci PY_STDLIB_MOD([_ssl], [], [test "$ac_cv_working_openssl_ssl" = yes],
62817db96d56Sopenharmony_ci-  [$OPENSSL_INCLUDES], [$OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH $OPENSSL_LIBS])
62827db96d56Sopenharmony_ci+  [$OPENSSL_INCLUDES], [$OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH $OPENSSL_LIBS -lws2_32])
62837db96d56Sopenharmony_ci PY_STDLIB_MOD([_hashlib], [], [test "$ac_cv_working_openssl_hashlib" = yes],
62847db96d56Sopenharmony_ci   [$OPENSSL_INCLUDES], [$OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH $LIBCRYPTO_LIBS])
62857db96d56Sopenharmony_ci 
62867db96d56Sopenharmony_ci+dnl windows specific modules
62877db96d56Sopenharmony_ci+PY_STDLIB_MOD([msvcrt], [test "$MACHDEP" = "win32"])
62887db96d56Sopenharmony_ci+PY_STDLIB_MOD([_winapi], [test "$MACHDEP" = "win32"])
62897db96d56Sopenharmony_ci+PY_STDLIB_MOD([_msi], [test "$MACHDEP" = "win32"], [], [],
62907db96d56Sopenharmony_ci+  [-lmsi -lcabinet -lrpcrt4])
62917db96d56Sopenharmony_ci+PY_STDLIB_MOD([winsound], [test "$MACHDEP" = "win32"], [], [],
62927db96d56Sopenharmony_ci+  [-lwinmm])
62937db96d56Sopenharmony_ci+PY_STDLIB_MOD([_overlapped], [test "$MACHDEP" = "win32"], [], [],
62947db96d56Sopenharmony_ci+  [-lws2_32])
62957db96d56Sopenharmony_ci+
62967db96d56Sopenharmony_ci dnl test modules
62977db96d56Sopenharmony_ci PY_STDLIB_MOD([_testcapi], [test "$TEST_MODULES" = yes])
62987db96d56Sopenharmony_ci PY_STDLIB_MOD([_testclinic], [test "$TEST_MODULES" = yes])
62997db96d56Sopenharmony_ci-PY_STDLIB_MOD([_testinternalcapi], [test "$TEST_MODULES" = yes])
63007db96d56Sopenharmony_ci+PY_STDLIB_MOD([_testinternalcapi], [test "$TEST_MODULES" = yes], [], [-DPY3_DLLNAME="\"$DLLLIBRARY\""], [])
63017db96d56Sopenharmony_ci PY_STDLIB_MOD([_testbuffer], [test "$TEST_MODULES" = yes])
63027db96d56Sopenharmony_ci-PY_STDLIB_MOD([_testimportmultiple], [test "$TEST_MODULES" = yes], [test "$ac_cv_func_dlopen" = yes])
63037db96d56Sopenharmony_ci-PY_STDLIB_MOD([_testmultiphase], [test "$TEST_MODULES" = yes], [test "$ac_cv_func_dlopen" = yes])
63047db96d56Sopenharmony_ci+PY_STDLIB_MOD([_testimportmultiple], [test "$TEST_MODULES" = yes], [test "$have_dynamic_loading" = yes])
63057db96d56Sopenharmony_ci+PY_STDLIB_MOD([_testmultiphase], [test "$TEST_MODULES" = yes], [test "$have_dynamic_loading" = yes])
63067db96d56Sopenharmony_ci PY_STDLIB_MOD([_xxtestfuzz], [test "$TEST_MODULES" = yes])
63077db96d56Sopenharmony_ci-PY_STDLIB_MOD([_ctypes_test], [test "$TEST_MODULES" = yes], [test "$ac_cv_func_dlopen" = yes], [], [-lm])
63087db96d56Sopenharmony_ci+PY_STDLIB_MOD([_ctypes_test], [test "$TEST_MODULES" = yes], [test "$have_dynamic_loading" = yes], [], [-lm])
63097db96d56Sopenharmony_ci 
63107db96d56Sopenharmony_ci dnl Limited API template modules.
63117db96d56Sopenharmony_ci dnl The limited C API is not compatible with the Py_TRACE_REFS macro.
63127db96d56Sopenharmony_ci dnl Emscripten does not support shared libraries yet.
63137db96d56Sopenharmony_ci-PY_STDLIB_MOD([xxlimited], [test "$with_trace_refs" = "no"], [test "$ac_cv_func_dlopen" = yes])
63147db96d56Sopenharmony_ci-PY_STDLIB_MOD([xxlimited_35], [test "$with_trace_refs" = "no"], [test "$ac_cv_func_dlopen" = yes])
63157db96d56Sopenharmony_ci+PY_STDLIB_MOD([xxlimited], [test "$with_trace_refs" = "no"], [test "$have_dynamic_loading" = yes])
63167db96d56Sopenharmony_ci+PY_STDLIB_MOD([xxlimited_35], [test "$with_trace_refs" = "no"], [test "$have_dynamic_loading" = yes])
63177db96d56Sopenharmony_ci 
63187db96d56Sopenharmony_ci # substitute multiline block, must come after last PY_STDLIB_MOD()
63197db96d56Sopenharmony_ci AC_SUBST([MODULE_BLOCK])
63207db96d56Sopenharmony_cidiff --git a/mingw_ignorefile.txt b/mingw_ignorefile.txt
63217db96d56Sopenharmony_cinew file mode 100755
63227db96d56Sopenharmony_ciindex 0000000..54093f1
63237db96d56Sopenharmony_ci--- /dev/null
63247db96d56Sopenharmony_ci+++ b/mingw_ignorefile.txt
63257db96d56Sopenharmony_ci@@ -0,0 +1,42 @@
63267db96d56Sopenharmony_ci+ctypes.test.test_loading.LoaderTest.test_load_dll_with_flags
63277db96d56Sopenharmony_ci+distutils.tests.test_bdist_dumb.BuildDumbTestCase.test_simple_built
63287db96d56Sopenharmony_ci+distutils.tests.test_cygwinccompiler.CygwinCCompilerTestCase.test_get_versions
63297db96d56Sopenharmony_ci+distutils.tests.test_util.UtilTestCase.test_change_root
63307db96d56Sopenharmony_ci+test.datetimetester.TestLocalTimeDisambiguation_Fast.*
63317db96d56Sopenharmony_ci+test.datetimetester.TestLocalTimeDisambiguation_Pure.*
63327db96d56Sopenharmony_ci+test.test_cmath.CMathTests.test_specific_values
63337db96d56Sopenharmony_ci+test.test_cmd_line_script.CmdLineTest.test_consistent_sys_path_for_direct_execution
63347db96d56Sopenharmony_ci+test.test_compileall.CommandLineTestsNoSourceEpoch.*
63357db96d56Sopenharmony_ci+test.test_compileall.CommandLineTestsWithSourceEpoch.*
63367db96d56Sopenharmony_ci+test.test_compileall.CompileallTestsWithoutSourceEpoch.*
63377db96d56Sopenharmony_ci+test.test_compileall.CompileallTestsWithSourceEpoch.*
63387db96d56Sopenharmony_ci+test.test_import.ImportTests.test_dll_dependency_import
63397db96d56Sopenharmony_ci+test.test_math.MathTests.*
63407db96d56Sopenharmony_ci+test.test_ntpath.NtCommonTest.test_import
63417db96d56Sopenharmony_ci+test.test_os.StatAttributeTests.test_stat_block_device
63427db96d56Sopenharmony_ci+test.test_os.TestScandir.test_attributes
63437db96d56Sopenharmony_ci+test.test_os.UtimeTests.test_large_time
63447db96d56Sopenharmony_ci+test.test_platform.PlatformTest.test_architecture_via_symlink
63457db96d56Sopenharmony_ci+test.test_regrtest.ProgramsTestCase.test_pcbuild_rt
63467db96d56Sopenharmony_ci+test.test_regrtest.ProgramsTestCase.test_tools_buildbot_test
63477db96d56Sopenharmony_ci+test.test_site._pthFileTests.*
63487db96d56Sopenharmony_ci+test.test_site.HelperFunctionsTests.*
63497db96d56Sopenharmony_ci+test.test_site.StartupImportTests.*
63507db96d56Sopenharmony_ci+test.test_ssl.*
63517db96d56Sopenharmony_ci+test.test_strptime.CalculationTests.*
63527db96d56Sopenharmony_ci+test.test_strptime.StrptimeTests.test_weekday
63537db96d56Sopenharmony_ci+test.test_strptime.TimeRETests.test_compile
63547db96d56Sopenharmony_ci+test.test_tools.test_i18n.Test_pygettext.test_POT_Creation_Date
63557db96d56Sopenharmony_ci+test.test_venv.BasicTest.*
63567db96d56Sopenharmony_ci+test.test_venv.EnsurePipTest.*
63577db96d56Sopenharmony_ci+test.test_sysconfig.TestSysConfig.test_user_similar
63587db96d56Sopenharmony_ci+test.test_tcl.TclTest.testLoadWithUNC
63597db96d56Sopenharmony_ci+# flaky
63607db96d56Sopenharmony_ci+test.test__xxsubinterpreters.*
63617db96d56Sopenharmony_ci+test.test_asyncio.test_subprocess.SubprocessProactorTests.test_stdin_broken_pipe
63627db96d56Sopenharmony_ci+test.test_asynchat.TestAsynchat.test_line_terminator2
63637db96d56Sopenharmony_ci+test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_gc_aclose_09
63647db96d56Sopenharmony_ci+test.test_concurrent_futures.ThreadPoolShutdownTest.test_interpreter_shutdown
63657db96d56Sopenharmony_ci+test.test_asynchat.TestNotConnected.test_disallow_negative_terminator
63667db96d56Sopenharmony_ci+test.test_logging.SysLogHandlerTest.*
63677db96d56Sopenharmony_ci+test.test_logging.IPv6SysLogHandlerTest.*
63687db96d56Sopenharmony_cidiff --git a/mingw_smoketests.py b/mingw_smoketests.py
63697db96d56Sopenharmony_cinew file mode 100755
63707db96d56Sopenharmony_ciindex 0000000..ca1f652
63717db96d56Sopenharmony_ci--- /dev/null
63727db96d56Sopenharmony_ci+++ b/mingw_smoketests.py
63737db96d56Sopenharmony_ci@@ -0,0 +1,358 @@
63747db96d56Sopenharmony_ci+#!/usr/bin/env python3
63757db96d56Sopenharmony_ci+# Copyright 2017 Christoph Reiter
63767db96d56Sopenharmony_ci+#
63777db96d56Sopenharmony_ci+# Permission is hereby granted, free of charge, to any person obtaining
63787db96d56Sopenharmony_ci+# a copy of this software and associated documentation files (the
63797db96d56Sopenharmony_ci+# "Software"), to deal in the Software without restriction, including
63807db96d56Sopenharmony_ci+# without limitation the rights to use, copy, modify, merge, publish,
63817db96d56Sopenharmony_ci+# distribute, sublicense, and/or sell copies of the Software, and to
63827db96d56Sopenharmony_ci+# permit persons to whom the Software is furnished to do so, subject to
63837db96d56Sopenharmony_ci+# the following conditions:
63847db96d56Sopenharmony_ci+#
63857db96d56Sopenharmony_ci+# The above copyright notice and this permission notice shall be included
63867db96d56Sopenharmony_ci+# in all copies or substantial portions of the Software.
63877db96d56Sopenharmony_ci+#
63887db96d56Sopenharmony_ci+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
63897db96d56Sopenharmony_ci+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
63907db96d56Sopenharmony_ci+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
63917db96d56Sopenharmony_ci+# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
63927db96d56Sopenharmony_ci+# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
63937db96d56Sopenharmony_ci+# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
63947db96d56Sopenharmony_ci+# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
63957db96d56Sopenharmony_ci+
63967db96d56Sopenharmony_ci+"""The goal of this test suite is collect tests for update regressions
63977db96d56Sopenharmony_ci+and to test msys2 related modifications like for path handling.
63987db96d56Sopenharmony_ci+Feel free to extend.
63997db96d56Sopenharmony_ci+"""
64007db96d56Sopenharmony_ci+
64017db96d56Sopenharmony_ci+import os
64027db96d56Sopenharmony_ci+import unittest
64037db96d56Sopenharmony_ci+import sysconfig
64047db96d56Sopenharmony_ci+
64057db96d56Sopenharmony_ci+if os.environ.get("MSYSTEM", ""):
64067db96d56Sopenharmony_ci+    SEP = "/"
64077db96d56Sopenharmony_ci+else:
64087db96d56Sopenharmony_ci+    SEP = "\\"
64097db96d56Sopenharmony_ci+
64107db96d56Sopenharmony_ci+if sysconfig.is_python_build():
64117db96d56Sopenharmony_ci+    os.environ["PYTHONLEGACYWINDOWSDLLLOADING"] = "1"
64127db96d56Sopenharmony_ci+
64137db96d56Sopenharmony_ci+_UCRT = sysconfig.get_platform() not in ('mingw_x86_64', 'mingw_i686')
64147db96d56Sopenharmony_ci+
64157db96d56Sopenharmony_ci+
64167db96d56Sopenharmony_ci+class Tests(unittest.TestCase):
64177db96d56Sopenharmony_ci+
64187db96d56Sopenharmony_ci+    def test_zoneinfo(self):
64197db96d56Sopenharmony_ci+        # https://github.com/msys2-contrib/cpython-mingw/issues/32
64207db96d56Sopenharmony_ci+        import zoneinfo
64217db96d56Sopenharmony_ci+        self.assertTrue(any(os.path.exists(p) for p in zoneinfo.TZPATH))
64227db96d56Sopenharmony_ci+        zoneinfo.ZoneInfo("America/Sao_Paulo")
64237db96d56Sopenharmony_ci+
64247db96d56Sopenharmony_ci+    def test_userdir_path_sep(self):
64257db96d56Sopenharmony_ci+        # Make sure os.path and pathlib use the same path separators
64267db96d56Sopenharmony_ci+        from unittest import mock
64277db96d56Sopenharmony_ci+        from os.path import expanduser
64287db96d56Sopenharmony_ci+        from pathlib import Path
64297db96d56Sopenharmony_ci+
64307db96d56Sopenharmony_ci+        profiles = ["C:\\foo", "C:/foo"]
64317db96d56Sopenharmony_ci+        for profile in profiles:
64327db96d56Sopenharmony_ci+            with mock.patch.dict(os.environ, {"USERPROFILE": profile}):
64337db96d56Sopenharmony_ci+                self.assertEqual(expanduser("~"), os.path.normpath(expanduser("~")))
64347db96d56Sopenharmony_ci+                self.assertEqual(str(Path("~").expanduser()), expanduser("~"))
64357db96d56Sopenharmony_ci+                self.assertEqual(str(Path.home()), expanduser("~"))
64367db96d56Sopenharmony_ci+
64377db96d56Sopenharmony_ci+    def test_sysconfig_schemes(self):
64387db96d56Sopenharmony_ci+        # https://github.com/msys2/MINGW-packages/issues/9319
64397db96d56Sopenharmony_ci+        import sysconfig
64407db96d56Sopenharmony_ci+        from distutils.dist import Distribution
64417db96d56Sopenharmony_ci+        from distutils.command.install import install
64427db96d56Sopenharmony_ci+
64437db96d56Sopenharmony_ci+        names = ['scripts', 'purelib', 'platlib', 'data', 'include']
64447db96d56Sopenharmony_ci+        for scheme in ["nt", "nt_user"]:
64457db96d56Sopenharmony_ci+            for name in names:
64467db96d56Sopenharmony_ci+                c = install(Distribution({"name": "foobar"}))
64477db96d56Sopenharmony_ci+                c.user = (scheme == "nt_user")
64487db96d56Sopenharmony_ci+                c.finalize_options()
64497db96d56Sopenharmony_ci+                if name == "include":
64507db96d56Sopenharmony_ci+                    dist_path = os.path.dirname(getattr(c, "install_" + "headers"))
64517db96d56Sopenharmony_ci+                else:
64527db96d56Sopenharmony_ci+                    dist_path = getattr(c, "install_" + name)
64537db96d56Sopenharmony_ci+                sys_path = sysconfig.get_path(name, scheme)
64547db96d56Sopenharmony_ci+                self.assertEqual(dist_path, sys_path, (scheme, name))
64557db96d56Sopenharmony_ci+
64567db96d56Sopenharmony_ci+    def test_ctypes_find_library(self):
64577db96d56Sopenharmony_ci+        from ctypes.util import find_library
64587db96d56Sopenharmony_ci+        from ctypes import cdll
64597db96d56Sopenharmony_ci+        self.assertTrue(cdll.msvcrt)
64607db96d56Sopenharmony_ci+        if _UCRT:
64617db96d56Sopenharmony_ci+            self.assertIsNone(find_library('c'))
64627db96d56Sopenharmony_ci+        else:
64637db96d56Sopenharmony_ci+            self.assertEqual(find_library('c'), 'msvcrt.dll')
64647db96d56Sopenharmony_ci+
64657db96d56Sopenharmony_ci+    def test_ctypes_dlopen(self):
64667db96d56Sopenharmony_ci+        import ctypes
64677db96d56Sopenharmony_ci+        import sys
64687db96d56Sopenharmony_ci+        self.assertEqual(ctypes.RTLD_GLOBAL, 0)
64697db96d56Sopenharmony_ci+        self.assertEqual(ctypes.RTLD_GLOBAL,  ctypes.RTLD_LOCAL)
64707db96d56Sopenharmony_ci+        self.assertFalse(hasattr(sys, 'setdlopenflags'))
64717db96d56Sopenharmony_ci+        self.assertFalse(hasattr(sys, 'getdlopenflags'))
64727db96d56Sopenharmony_ci+        self.assertFalse([n for n in dir(os) if n.startswith("RTLD_")])
64737db96d56Sopenharmony_ci+
64747db96d56Sopenharmony_ci+    def test_time_no_unix_stuff(self):
64757db96d56Sopenharmony_ci+        import time
64767db96d56Sopenharmony_ci+        self.assertFalse([n for n in dir(time) if n.startswith("clock_")])
64777db96d56Sopenharmony_ci+        self.assertFalse([n for n in dir(time) if n.startswith("CLOCK_")])
64787db96d56Sopenharmony_ci+        self.assertFalse([n for n in dir(time) if n.startswith("pthread_")])
64797db96d56Sopenharmony_ci+        self.assertFalse(hasattr(time, 'tzset'))
64807db96d56Sopenharmony_ci+
64817db96d56Sopenharmony_ci+    def test_strftime(self):
64827db96d56Sopenharmony_ci+        import time
64837db96d56Sopenharmony_ci+        with self.assertRaises(ValueError):
64847db96d56Sopenharmony_ci+            time.strftime('%Y', (12345,) + (0,) * 8)
64857db96d56Sopenharmony_ci+
64867db96d56Sopenharmony_ci+    def test_sep(self):
64877db96d56Sopenharmony_ci+        self.assertEqual(os.sep, SEP)
64887db96d56Sopenharmony_ci+
64897db96d56Sopenharmony_ci+    def test_module_file_path(self):
64907db96d56Sopenharmony_ci+        import asyncio
64917db96d56Sopenharmony_ci+        import zlib
64927db96d56Sopenharmony_ci+        self.assertEqual(zlib.__file__, os.path.normpath(zlib.__file__))
64937db96d56Sopenharmony_ci+        self.assertEqual(asyncio.__file__, os.path.normpath(asyncio.__file__))
64947db96d56Sopenharmony_ci+
64957db96d56Sopenharmony_ci+    def test_importlib_frozen_path_sep(self):
64967db96d56Sopenharmony_ci+        import importlib._bootstrap_external
64977db96d56Sopenharmony_ci+        self.assertEqual(importlib._bootstrap_external.path_sep, SEP)
64987db96d56Sopenharmony_ci+
64997db96d56Sopenharmony_ci+    def test_os_commonpath(self):
65007db96d56Sopenharmony_ci+        self.assertEqual(
65017db96d56Sopenharmony_ci+            os.path.commonpath(
65027db96d56Sopenharmony_ci+                [os.path.join("C:", os.sep, "foo", "bar"),
65037db96d56Sopenharmony_ci+                 os.path.join("C:", os.sep, "foo")]),
65047db96d56Sopenharmony_ci+                 os.path.join("C:", os.sep, "foo"))
65057db96d56Sopenharmony_ci+
65067db96d56Sopenharmony_ci+    def test_pathlib(self):
65077db96d56Sopenharmony_ci+        import pathlib
65087db96d56Sopenharmony_ci+
65097db96d56Sopenharmony_ci+        p = pathlib.Path("foo") / pathlib.Path("foo")
65107db96d56Sopenharmony_ci+        self.assertEqual(str(p), os.path.normpath(p))
65117db96d56Sopenharmony_ci+
65127db96d56Sopenharmony_ci+    def test_modules_import(self):
65137db96d56Sopenharmony_ci+        import sqlite3
65147db96d56Sopenharmony_ci+        import ssl
65157db96d56Sopenharmony_ci+        import ctypes
65167db96d56Sopenharmony_ci+        import curses
65177db96d56Sopenharmony_ci+
65187db96d56Sopenharmony_ci+    def test_c_modules_import(self):
65197db96d56Sopenharmony_ci+        import _decimal
65207db96d56Sopenharmony_ci+
65217db96d56Sopenharmony_ci+    def test_socket_inet_ntop(self):
65227db96d56Sopenharmony_ci+        import socket
65237db96d56Sopenharmony_ci+        self.assertTrue(hasattr(socket, "inet_ntop"))
65247db96d56Sopenharmony_ci+
65257db96d56Sopenharmony_ci+    def test_socket_inet_pton(self):
65267db96d56Sopenharmony_ci+        import socket
65277db96d56Sopenharmony_ci+        self.assertTrue(hasattr(socket, "inet_pton"))
65287db96d56Sopenharmony_ci+
65297db96d56Sopenharmony_ci+    def test_multiprocessing_queue(self):
65307db96d56Sopenharmony_ci+        from multiprocessing import Queue
65317db96d56Sopenharmony_ci+        Queue(0)
65327db96d56Sopenharmony_ci+
65337db96d56Sopenharmony_ci+    #def test_socket_timout_normal_error(self):
65347db96d56Sopenharmony_ci+    #    import urllib.request
65357db96d56Sopenharmony_ci+    #    from urllib.error import URLError
65367db96d56Sopenharmony_ci+
65377db96d56Sopenharmony_ci+    #    try:
65387db96d56Sopenharmony_ci+    #        urllib.request.urlopen(
65397db96d56Sopenharmony_ci+    #            'http://localhost', timeout=0.0001).close()
65407db96d56Sopenharmony_ci+    #    except URLError:
65417db96d56Sopenharmony_ci+    #        pass
65427db96d56Sopenharmony_ci+
65437db96d56Sopenharmony_ci+    def test_threads(self):
65447db96d56Sopenharmony_ci+        from concurrent.futures import ThreadPoolExecutor
65457db96d56Sopenharmony_ci+
65467db96d56Sopenharmony_ci+        with ThreadPoolExecutor(1) as pool:
65477db96d56Sopenharmony_ci+            for res in pool.map(lambda *x: None, range(10000)):
65487db96d56Sopenharmony_ci+                pass
65497db96d56Sopenharmony_ci+
65507db96d56Sopenharmony_ci+    def test_sysconfig(self):
65517db96d56Sopenharmony_ci+        import sysconfig
65527db96d56Sopenharmony_ci+        # This should be able to execute without exceptions
65537db96d56Sopenharmony_ci+        sysconfig.get_config_vars()
65547db96d56Sopenharmony_ci+
65557db96d56Sopenharmony_ci+    def test_sqlite_enable_load_extension(self):
65567db96d56Sopenharmony_ci+        # Make sure --enable-loadable-sqlite-extensions is used
65577db96d56Sopenharmony_ci+        import sqlite3
65587db96d56Sopenharmony_ci+        self.assertTrue(sqlite3.Connection.enable_load_extension)
65597db96d56Sopenharmony_ci+
65607db96d56Sopenharmony_ci+    def test_venv_creation(self):
65617db96d56Sopenharmony_ci+        import tempfile
65627db96d56Sopenharmony_ci+        import venv
65637db96d56Sopenharmony_ci+        import subprocess
65647db96d56Sopenharmony_ci+        import shutil
65657db96d56Sopenharmony_ci+        with tempfile.TemporaryDirectory() as tmp:
65667db96d56Sopenharmony_ci+            builder = venv.EnvBuilder()
65677db96d56Sopenharmony_ci+            builder.create(tmp)
65687db96d56Sopenharmony_ci+            assert os.path.exists(os.path.join(tmp, "bin", "activate"))
65697db96d56Sopenharmony_ci+            assert os.path.exists(os.path.join(tmp, "bin", "python.exe"))
65707db96d56Sopenharmony_ci+            assert os.path.exists(os.path.join(tmp, "bin", "python3.exe"))
65717db96d56Sopenharmony_ci+            subprocess.check_call([shutil.which("bash.exe"), os.path.join(tmp, "bin", "activate")])
65727db96d56Sopenharmony_ci+
65737db96d56Sopenharmony_ci+            # This will not work in in-tree build
65747db96d56Sopenharmony_ci+            if not sysconfig.is_python_build():
65757db96d56Sopenharmony_ci+                op = subprocess.check_output(
65767db96d56Sopenharmony_ci+                    [
65777db96d56Sopenharmony_ci+                        os.path.join(tmp, "bin", "python.exe"),
65787db96d56Sopenharmony_ci+                        "-c",
65797db96d56Sopenharmony_ci+                        "print('Hello World')"
65807db96d56Sopenharmony_ci+                    ],
65817db96d56Sopenharmony_ci+                    cwd=tmp,
65827db96d56Sopenharmony_ci+                )
65837db96d56Sopenharmony_ci+                assert op.decode().strip() == "Hello World"
65847db96d56Sopenharmony_ci+
65857db96d56Sopenharmony_ci+    def test_has_mktime(self):
65867db96d56Sopenharmony_ci+        from time import mktime, gmtime
65877db96d56Sopenharmony_ci+        mktime(gmtime())
65887db96d56Sopenharmony_ci+
65897db96d56Sopenharmony_ci+    def test_platform_things(self):
65907db96d56Sopenharmony_ci+        import sys
65917db96d56Sopenharmony_ci+        import sysconfig
65927db96d56Sopenharmony_ci+        import platform
65937db96d56Sopenharmony_ci+        import importlib.machinery
65947db96d56Sopenharmony_ci+        self.assertEqual(sys.implementation.name, "cpython")
65957db96d56Sopenharmony_ci+        self.assertEqual(sys.platform, "win32")
65967db96d56Sopenharmony_ci+        self.assertTrue(sysconfig.get_platform().startswith("mingw"))
65977db96d56Sopenharmony_ci+        self.assertTrue(sysconfig.get_config_var('SOABI').startswith("cpython-"))
65987db96d56Sopenharmony_ci+        ext_suffix = sysconfig.get_config_var('EXT_SUFFIX')
65997db96d56Sopenharmony_ci+        self.assertTrue(ext_suffix.endswith(".pyd"))
66007db96d56Sopenharmony_ci+        self.assertTrue("mingw" in ext_suffix)
66017db96d56Sopenharmony_ci+        self.assertEqual(sysconfig.get_config_var('SHLIB_SUFFIX'), ".pyd")
66027db96d56Sopenharmony_ci+        ext_suffixes = importlib.machinery.EXTENSION_SUFFIXES
66037db96d56Sopenharmony_ci+        self.assertTrue(ext_suffix in ext_suffixes)
66047db96d56Sopenharmony_ci+        self.assertTrue(".pyd" in ext_suffixes)
66057db96d56Sopenharmony_ci+        if sysconfig.get_platform().startswith('mingw_i686'):
66067db96d56Sopenharmony_ci+             self.assertEqual(sys.winver, ".".join(map(str, sys.version_info[:2])) + '-32')
66077db96d56Sopenharmony_ci+        elif sysconfig.get_platform().startswith('mingw_aarch64'):
66087db96d56Sopenharmony_ci+            self.assertEqual(sys.winver, ".".join(map(str, sys.version_info[:2])) + '-arm64')
66097db96d56Sopenharmony_ci+        elif sysconfig.get_platform().startswith('mingw_armv7'):
66107db96d56Sopenharmony_ci+            self.assertEqual(sys.winver, ".".join(map(str, sys.version_info[:2])) + '-arm32')
66117db96d56Sopenharmony_ci+        else:
66127db96d56Sopenharmony_ci+            self.assertEqual(sys.winver, ".".join(map(str, sys.version_info[:2])))
66137db96d56Sopenharmony_ci+        self.assertEqual(platform.python_implementation(), "CPython")
66147db96d56Sopenharmony_ci+        self.assertEqual(platform.system(), "Windows")
66157db96d56Sopenharmony_ci+        self.assertTrue(isinstance(sys.api_version, int) and sys.api_version > 0)
66167db96d56Sopenharmony_ci+
66177db96d56Sopenharmony_ci+    def test_sys_getpath(self):
66187db96d56Sopenharmony_ci+        # everything sourced from getpath.py
66197db96d56Sopenharmony_ci+        import sys
66207db96d56Sopenharmony_ci+
66217db96d56Sopenharmony_ci+        def assertNormpath(path):
66227db96d56Sopenharmony_ci+            self.assertEqual(path, os.path.normpath(path))
66237db96d56Sopenharmony_ci+
66247db96d56Sopenharmony_ci+        assertNormpath(sys.executable)
66257db96d56Sopenharmony_ci+        assertNormpath(sys._base_executable)
66267db96d56Sopenharmony_ci+        assertNormpath(sys.prefix)
66277db96d56Sopenharmony_ci+        assertNormpath(sys.base_prefix)
66287db96d56Sopenharmony_ci+        assertNormpath(sys.exec_prefix)
66297db96d56Sopenharmony_ci+        assertNormpath(sys.base_exec_prefix)
66307db96d56Sopenharmony_ci+        assertNormpath(sys.platlibdir)
66317db96d56Sopenharmony_ci+        assertNormpath(sys._stdlib_dir)
66327db96d56Sopenharmony_ci+        for p in sys.path:
66337db96d56Sopenharmony_ci+            assertNormpath(p)
66347db96d56Sopenharmony_ci+
66357db96d56Sopenharmony_ci+    def test_site(self):
66367db96d56Sopenharmony_ci+        import site
66377db96d56Sopenharmony_ci+
66387db96d56Sopenharmony_ci+        self.assertEqual(len(site.getsitepackages()), 1)
66397db96d56Sopenharmony_ci+
66407db96d56Sopenharmony_ci+    def test_c_ext_build(self):
66417db96d56Sopenharmony_ci+        import tempfile
66427db96d56Sopenharmony_ci+        import sys
66437db96d56Sopenharmony_ci+        import subprocess
66447db96d56Sopenharmony_ci+        import textwrap
66457db96d56Sopenharmony_ci+        from pathlib import Path
66467db96d56Sopenharmony_ci+
66477db96d56Sopenharmony_ci+        with tempfile.TemporaryDirectory() as tmppro:
66487db96d56Sopenharmony_ci+            subprocess.check_call([sys.executable, "-m", "ensurepip", "--user"])
66497db96d56Sopenharmony_ci+            with Path(tmppro, "setup.py").open("w") as f:
66507db96d56Sopenharmony_ci+                f.write(
66517db96d56Sopenharmony_ci+                    textwrap.dedent(
66527db96d56Sopenharmony_ci+                        """\
66537db96d56Sopenharmony_ci+                                    from setuptools import setup, Extension
66547db96d56Sopenharmony_ci+
66557db96d56Sopenharmony_ci+                                    setup(
66567db96d56Sopenharmony_ci+                                        name='cwrapper',
66577db96d56Sopenharmony_ci+                                        version='1.0',
66587db96d56Sopenharmony_ci+                                        ext_modules=[
66597db96d56Sopenharmony_ci+                                            Extension(
66607db96d56Sopenharmony_ci+                                                'cwrapper',
66617db96d56Sopenharmony_ci+                                                sources=['cwrapper.c']),
66627db96d56Sopenharmony_ci+                                        ],
66637db96d56Sopenharmony_ci+                                    )
66647db96d56Sopenharmony_ci+                                """
66657db96d56Sopenharmony_ci+                    )
66667db96d56Sopenharmony_ci+                )
66677db96d56Sopenharmony_ci+            with Path(tmppro, "cwrapper.c").open("w") as f:
66687db96d56Sopenharmony_ci+                f.write(
66697db96d56Sopenharmony_ci+                    textwrap.dedent(
66707db96d56Sopenharmony_ci+                        """\
66717db96d56Sopenharmony_ci+                                    #include <Python.h>
66727db96d56Sopenharmony_ci+                                    static PyObject *
66737db96d56Sopenharmony_ci+                                    helloworld(PyObject *self, PyObject *args)
66747db96d56Sopenharmony_ci+                                    {
66757db96d56Sopenharmony_ci+                                        printf("Hello World\\n");
66767db96d56Sopenharmony_ci+                                        Py_RETURN_NONE;
66777db96d56Sopenharmony_ci+                                    }
66787db96d56Sopenharmony_ci+                                    static PyMethodDef
66797db96d56Sopenharmony_ci+                                    myMethods[] = {
66807db96d56Sopenharmony_ci+                                        { "helloworld", helloworld, METH_NOARGS, "Prints Hello World" },
66817db96d56Sopenharmony_ci+                                        { NULL, NULL, 0, NULL }
66827db96d56Sopenharmony_ci+                                    };
66837db96d56Sopenharmony_ci+                                    static struct PyModuleDef cwrapper = {
66847db96d56Sopenharmony_ci+                                        PyModuleDef_HEAD_INIT,
66857db96d56Sopenharmony_ci+                                        "cwrapper",
66867db96d56Sopenharmony_ci+                                        "Test Module",
66877db96d56Sopenharmony_ci+                                        -1,
66887db96d56Sopenharmony_ci+                                        myMethods
66897db96d56Sopenharmony_ci+                                    };
66907db96d56Sopenharmony_ci+
66917db96d56Sopenharmony_ci+                                    PyMODINIT_FUNC
66927db96d56Sopenharmony_ci+                                    PyInit_cwrapper(void)
66937db96d56Sopenharmony_ci+                                    {
66947db96d56Sopenharmony_ci+                                        return PyModule_Create(&cwrapper);
66957db96d56Sopenharmony_ci+                                    }
66967db96d56Sopenharmony_ci+                                """
66977db96d56Sopenharmony_ci+                    )
66987db96d56Sopenharmony_ci+                )
66997db96d56Sopenharmony_ci+            subprocess.check_call(
67007db96d56Sopenharmony_ci+                [sys.executable, "-c", "import struct"],
67017db96d56Sopenharmony_ci+            )
67027db96d56Sopenharmony_ci+            subprocess.check_call(
67037db96d56Sopenharmony_ci+                [
67047db96d56Sopenharmony_ci+                    sys.executable,
67057db96d56Sopenharmony_ci+                    "-m",
67067db96d56Sopenharmony_ci+                    "pip",
67077db96d56Sopenharmony_ci+                    "install",
67087db96d56Sopenharmony_ci+                    "wheel",
67097db96d56Sopenharmony_ci+                ],
67107db96d56Sopenharmony_ci+            )
67117db96d56Sopenharmony_ci+            subprocess.check_call(
67127db96d56Sopenharmony_ci+                [
67137db96d56Sopenharmony_ci+                    sys.executable,
67147db96d56Sopenharmony_ci+                    "-m",
67157db96d56Sopenharmony_ci+                    "pip",
67167db96d56Sopenharmony_ci+                    "install",
67177db96d56Sopenharmony_ci+                    tmppro,
67187db96d56Sopenharmony_ci+                ],
67197db96d56Sopenharmony_ci+            )
67207db96d56Sopenharmony_ci+            subprocess.check_call(
67217db96d56Sopenharmony_ci+                [sys.executable, "-c", "import cwrapper"],
67227db96d56Sopenharmony_ci+            )
67237db96d56Sopenharmony_ci+
67247db96d56Sopenharmony_ci+
67257db96d56Sopenharmony_ci+
67267db96d56Sopenharmony_ci+def suite():
67277db96d56Sopenharmony_ci+    return unittest.TestLoader().loadTestsFromName(__name__)
67287db96d56Sopenharmony_ci+
67297db96d56Sopenharmony_ci+
67307db96d56Sopenharmony_ci+if __name__ == '__main__':
67317db96d56Sopenharmony_ci+    unittest.main(defaultTest='suite')
67327db96d56Sopenharmony_cidiff --git a/pyconfig.h.in b/pyconfig.h.in
67337db96d56Sopenharmony_ciindex 75f1d90..3b89b9e 100644
67347db96d56Sopenharmony_ci--- a/pyconfig.h.in
67357db96d56Sopenharmony_ci+++ b/pyconfig.h.in
67367db96d56Sopenharmony_ci@@ -60,7 +60,7 @@
67377db96d56Sopenharmony_ci /* Define to 1 if you have the `acosh' function. */
67387db96d56Sopenharmony_ci #undef HAVE_ACOSH
67397db96d56Sopenharmony_ci 
67407db96d56Sopenharmony_ci-/* struct addrinfo (netdb.h) */
67417db96d56Sopenharmony_ci+/* struct addrinfo */
67427db96d56Sopenharmony_ci #undef HAVE_ADDRINFO
67437db96d56Sopenharmony_ci 
67447db96d56Sopenharmony_ci /* Define to 1 if you have the `alarm' function. */
67457db96d56Sopenharmony_ci@@ -1521,6 +1521,9 @@
67467db96d56Sopenharmony_ci /* Define if mvwdelch in curses.h is an expression. */
67477db96d56Sopenharmony_ci #undef MVWDELCH_IS_EXPRESSION
67487db96d56Sopenharmony_ci 
67497db96d56Sopenharmony_ci+/* Define to 1 if you want to use native NT threads */
67507db96d56Sopenharmony_ci+#undef NT_THREADS
67517db96d56Sopenharmony_ci+
67527db96d56Sopenharmony_ci /* Define to the address where bug reports for this package should be sent. */
67537db96d56Sopenharmony_ci #undef PACKAGE_BUGREPORT
67547db96d56Sopenharmony_ci 
67557db96d56Sopenharmony_ci@@ -1836,7 +1839,7 @@
67567db96d56Sopenharmony_ci /* Define to `unsigned int' if <sys/types.h> does not define. */
67577db96d56Sopenharmony_ci #undef size_t
67587db96d56Sopenharmony_ci 
67597db96d56Sopenharmony_ci-/* Define to `int' if <sys/socket.h> does not define. */
67607db96d56Sopenharmony_ci+/* Define to `int' if <sys/socket.h> or <ws2tcpip.h> does not define. */
67617db96d56Sopenharmony_ci #undef socklen_t
67627db96d56Sopenharmony_ci 
67637db96d56Sopenharmony_ci /* Define to `int' if <sys/types.h> doesn't define. */
67647db96d56Sopenharmony_cidiff --git a/setup.py b/setup.py
67657db96d56Sopenharmony_ciindex 4f122b6..e4f15d8 100644
67667db96d56Sopenharmony_ci--- a/setup.py
67677db96d56Sopenharmony_ci+++ b/setup.py
67687db96d56Sopenharmony_ci@@ -77,9 +77,24 @@ def get_platform():
67697db96d56Sopenharmony_ci     return sys.platform
67707db96d56Sopenharmony_ci 
67717db96d56Sopenharmony_ci 
67727db96d56Sopenharmony_ci+# On MSYS, os.system needs to be wrapped with sh.exe
67737db96d56Sopenharmony_ci+# as otherwise all the io redirection will fail.
67747db96d56Sopenharmony_ci+# Arguably, this could happen inside the real os.system
67757db96d56Sopenharmony_ci+# rather than this monkey patch.
67767db96d56Sopenharmony_ci+if sys.platform == "win32" and os.environ.get("MSYSTEM", ""):
67777db96d56Sopenharmony_ci+    os_system = os.system
67787db96d56Sopenharmony_ci+    def msys_system(command):
67797db96d56Sopenharmony_ci+        command_in_sh = 'sh.exe -c "%s"' % command.replace("\\", "\\\\")
67807db96d56Sopenharmony_ci+        return os_system(command_in_sh)
67817db96d56Sopenharmony_ci+    os.system = msys_system
67827db96d56Sopenharmony_ci+
67837db96d56Sopenharmony_ci+    # set PYTHONLEGACYWINDOWSDLLLOADING to 1 to load DLLs from PATH
67847db96d56Sopenharmony_ci+    # This is needed while building core extensions of Python
67857db96d56Sopenharmony_ci+    os.environ["PYTHONLEGACYWINDOWSDLLLOADING"] = "1"
67867db96d56Sopenharmony_ci+
67877db96d56Sopenharmony_ci CROSS_COMPILING = ("_PYTHON_HOST_PLATFORM" in os.environ)
67887db96d56Sopenharmony_ci HOST_PLATFORM = get_platform()
67897db96d56Sopenharmony_ci-MS_WINDOWS = (HOST_PLATFORM == 'win32')
67907db96d56Sopenharmony_ci+MS_WINDOWS = (HOST_PLATFORM == 'win32' or HOST_PLATFORM == 'mingw')
67917db96d56Sopenharmony_ci CYGWIN = (HOST_PLATFORM == 'cygwin')
67927db96d56Sopenharmony_ci MACOS = (HOST_PLATFORM == 'darwin')
67937db96d56Sopenharmony_ci AIX = (HOST_PLATFORM.startswith('aix'))
67947db96d56Sopenharmony_ci@@ -687,7 +702,7 @@ def check_extension_import(self, ext):
67957db96d56Sopenharmony_ci     def add_multiarch_paths(self):
67967db96d56Sopenharmony_ci         # Debian/Ubuntu multiarch support.
67977db96d56Sopenharmony_ci         # https://wiki.ubuntu.com/MultiarchSpec
67987db96d56Sopenharmony_ci-        tmpfile = os.path.join(self.build_temp, 'multiarch')
67997db96d56Sopenharmony_ci+        tmpfile = os.path.join(self.build_temp, 'multiarch').replace('\\','/')
68007db96d56Sopenharmony_ci         if not os.path.exists(self.build_temp):
68017db96d56Sopenharmony_ci             os.makedirs(self.build_temp)
68027db96d56Sopenharmony_ci         ret = run_command(
68037db96d56Sopenharmony_ci@@ -712,7 +727,7 @@ def add_multiarch_paths(self):
68047db96d56Sopenharmony_ci         opt = ''
68057db96d56Sopenharmony_ci         if CROSS_COMPILING:
68067db96d56Sopenharmony_ci             opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE')
68077db96d56Sopenharmony_ci-        tmpfile = os.path.join(self.build_temp, 'multiarch')
68087db96d56Sopenharmony_ci+        tmpfile = os.path.join(self.build_temp, 'multiarch').replace('\\','/')
68097db96d56Sopenharmony_ci         if not os.path.exists(self.build_temp):
68107db96d56Sopenharmony_ci             os.makedirs(self.build_temp)
68117db96d56Sopenharmony_ci         ret = run_command(
68127db96d56Sopenharmony_ci@@ -774,7 +789,7 @@ def add_search_path(line):
68137db96d56Sopenharmony_ci                 pass
68147db96d56Sopenharmony_ci 
68157db96d56Sopenharmony_ci     def add_cross_compiling_paths(self):
68167db96d56Sopenharmony_ci-        tmpfile = os.path.join(self.build_temp, 'ccpaths')
68177db96d56Sopenharmony_ci+        tmpfile = os.path.join(self.build_temp, 'ccpaths').replace('\\','/')
68187db96d56Sopenharmony_ci         if not os.path.exists(self.build_temp):
68197db96d56Sopenharmony_ci             os.makedirs(self.build_temp)
68207db96d56Sopenharmony_ci         # bpo-38472: With a German locale, GCC returns "gcc-Version 9.1.0
68217db96d56Sopenharmony_ci@@ -796,14 +811,25 @@ def add_cross_compiling_paths(self):
68227db96d56Sopenharmony_ci                         elif line.startswith("End of search list"):
68237db96d56Sopenharmony_ci                             in_incdirs = False
68247db96d56Sopenharmony_ci                         elif (is_gcc or is_clang) and line.startswith("LIBRARY_PATH"):
68257db96d56Sopenharmony_ci-                            for d in line.strip().split("=")[1].split(":"):
68267db96d56Sopenharmony_ci+                            for d in line.strip().split("=")[1].split(os.pathsep):
68277db96d56Sopenharmony_ci                                 d = os.path.normpath(d)
68287db96d56Sopenharmony_ci-                                if '/gcc/' not in d:
68297db96d56Sopenharmony_ci+                                if '/gcc/' not in d and '/clang/' not in d:
68307db96d56Sopenharmony_ci                                     add_dir_to_list(self.compiler.library_dirs,
68317db96d56Sopenharmony_ci                                                     d)
68327db96d56Sopenharmony_ci                         elif (is_gcc or is_clang) and in_incdirs and '/gcc/' not in line and '/clang/' not in line:
68337db96d56Sopenharmony_ci                             add_dir_to_list(self.compiler.include_dirs,
68347db96d56Sopenharmony_ci                                             line.strip())
68357db96d56Sopenharmony_ci+            if is_clang:
68367db96d56Sopenharmony_ci+                ret = run_command('%s -print-search-dirs >%s' % (CC, tmpfile))
68377db96d56Sopenharmony_ci+                if ret == 0:
68387db96d56Sopenharmony_ci+                    with open(tmpfile) as fp:
68397db96d56Sopenharmony_ci+                        for line in fp.readlines():
68407db96d56Sopenharmony_ci+                            if line.startswith("libraries:"):
68417db96d56Sopenharmony_ci+                                for d in line.strip().split("=")[1].split(os.pathsep):
68427db96d56Sopenharmony_ci+                                    d = os.path.normpath(d)
68437db96d56Sopenharmony_ci+                                    if '/gcc/' not in d and '/clang/' not in d:
68447db96d56Sopenharmony_ci+                                        add_dir_to_list(self.compiler.library_dirs,
68457db96d56Sopenharmony_ci+                                                        d)
68467db96d56Sopenharmony_ci         finally:
68477db96d56Sopenharmony_ci             os.unlink(tmpfile)
68487db96d56Sopenharmony_ci 
68497db96d56Sopenharmony_ci@@ -849,10 +875,10 @@ def configure_compiler(self):
68507db96d56Sopenharmony_ci         if not CROSS_COMPILING:
68517db96d56Sopenharmony_ci             add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
68527db96d56Sopenharmony_ci             add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
68537db96d56Sopenharmony_ci+            self.add_multiarch_paths()
68547db96d56Sopenharmony_ci         # only change this for cross builds for 3.3, issues on Mageia
68557db96d56Sopenharmony_ci         if CROSS_COMPILING:
68567db96d56Sopenharmony_ci             self.add_cross_compiling_paths()
68577db96d56Sopenharmony_ci-        self.add_multiarch_paths()
68587db96d56Sopenharmony_ci         self.add_ldflags_cppflags()
68597db96d56Sopenharmony_ci 
68607db96d56Sopenharmony_ci     def init_inc_lib_dirs(self):
68617db96d56Sopenharmony_ci@@ -898,7 +924,7 @@ def init_inc_lib_dirs(self):
68627db96d56Sopenharmony_ci         if HOST_PLATFORM == 'hp-ux11':
68637db96d56Sopenharmony_ci             self.lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
68647db96d56Sopenharmony_ci 
68657db96d56Sopenharmony_ci-        if MACOS:
68667db96d56Sopenharmony_ci+        if MACOS or MS_WINDOWS:
68677db96d56Sopenharmony_ci             # This should work on any unixy platform ;-)
68687db96d56Sopenharmony_ci             # If the user has bothered specifying additional -I and -L flags
68697db96d56Sopenharmony_ci             # in OPT and LDFLAGS we might as well use them here.
68707db96d56Sopenharmony_ci@@ -970,11 +996,15 @@ def detect_simple_extensions(self):
68717db96d56Sopenharmony_ci         # grp(3)
68727db96d56Sopenharmony_ci         self.addext(Extension('grp', ['grpmodule.c']))
68737db96d56Sopenharmony_ci 
68747db96d56Sopenharmony_ci-        self.addext(Extension('_socket', ['socketmodule.c']))
68757db96d56Sopenharmony_ci+        self.addext(Extension(
68767db96d56Sopenharmony_ci+            '_socket', ['socketmodule.c'],
68777db96d56Sopenharmony_ci+            libraries=(['ws2_32', 'iphlpapi'] if MS_WINDOWS else None)))
68787db96d56Sopenharmony_ci         self.addext(Extension('spwd', ['spwdmodule.c']))
68797db96d56Sopenharmony_ci 
68807db96d56Sopenharmony_ci         # select(2); not on ancient System V
68817db96d56Sopenharmony_ci-        self.addext(Extension('select', ['selectmodule.c']))
68827db96d56Sopenharmony_ci+        self.addext(Extension(
68837db96d56Sopenharmony_ci+            'select', ['selectmodule.c'],
68847db96d56Sopenharmony_ci+            libraries=(['ws2_32'] if MS_WINDOWS else None)))
68857db96d56Sopenharmony_ci 
68867db96d56Sopenharmony_ci         # Memory-mapped files (also works on Win32).
68877db96d56Sopenharmony_ci         self.addext(Extension('mmap', ['mmapmodule.c']))
68887db96d56Sopenharmony_ci@@ -1033,12 +1063,15 @@ def detect_test_extensions(self):
68897db96d56Sopenharmony_ci             ['_xxtestfuzz/_xxtestfuzz.c', '_xxtestfuzz/fuzzer.c']
68907db96d56Sopenharmony_ci         ))
68917db96d56Sopenharmony_ci 
68927db96d56Sopenharmony_ci+        if MS_WINDOWS:
68937db96d56Sopenharmony_ci+            self.add(Extension('_testconsole', ['../PC/_testconsole.c']))
68947db96d56Sopenharmony_ci+
68957db96d56Sopenharmony_ci     def detect_readline_curses(self):
68967db96d56Sopenharmony_ci         # readline
68977db96d56Sopenharmony_ci         readline_termcap_library = ""
68987db96d56Sopenharmony_ci         curses_library = ""
68997db96d56Sopenharmony_ci         # Cannot use os.popen here in py3k.
69007db96d56Sopenharmony_ci-        tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
69017db96d56Sopenharmony_ci+        tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib').replace('\\','/')
69027db96d56Sopenharmony_ci         if not os.path.exists(self.build_temp):
69037db96d56Sopenharmony_ci             os.makedirs(self.build_temp)
69047db96d56Sopenharmony_ci         # Determine if readline is already linked against curses or tinfo.
69057db96d56Sopenharmony_ci@@ -1101,6 +1134,8 @@ def detect_readline_curses(self):
69067db96d56Sopenharmony_ci                 # readline package
69077db96d56Sopenharmony_ci                 if find_file('readline/rlconf.h', self.inc_dirs, []) is None:
69087db96d56Sopenharmony_ci                     do_readline = False
69097db96d56Sopenharmony_ci+        if MS_WINDOWS:
69107db96d56Sopenharmony_ci+            do_readline = False
69117db96d56Sopenharmony_ci         if do_readline:
69127db96d56Sopenharmony_ci             readline_libs = [readline_lib]
69137db96d56Sopenharmony_ci             if readline_termcap_library:
69147db96d56Sopenharmony_ci@@ -1124,8 +1159,7 @@ def detect_readline_curses(self):
69157db96d56Sopenharmony_ci         panel_library = 'panel'
69167db96d56Sopenharmony_ci         if curses_library == 'ncursesw':
69177db96d56Sopenharmony_ci             curses_defines.append(('HAVE_NCURSESW', '1'))
69187db96d56Sopenharmony_ci-            if not CROSS_COMPILING:
69197db96d56Sopenharmony_ci-                curses_includes.append('/usr/include/ncursesw')
69207db96d56Sopenharmony_ci+            curses_includes.append(sysconfig.get_config_var("NCURSESW_INCLUDEDIR"))
69217db96d56Sopenharmony_ci             # Bug 1464056: If _curses.so links with ncursesw,
69227db96d56Sopenharmony_ci             # _curses_panel.so must link with panelw.
69237db96d56Sopenharmony_ci             panel_library = 'panelw'
69247db96d56Sopenharmony_ci@@ -1209,7 +1243,7 @@ def detect_dbm_gdbm(self):
69257db96d56Sopenharmony_ci             if dbm_args:
69267db96d56Sopenharmony_ci                 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
69277db96d56Sopenharmony_ci             else:
69287db96d56Sopenharmony_ci-                dbm_order = "gdbm:ndbm:bdb".split(":")
69297db96d56Sopenharmony_ci+                dbm_order = []
69307db96d56Sopenharmony_ci             dbmext = None
69317db96d56Sopenharmony_ci             for cand in dbm_order:
69327db96d56Sopenharmony_ci                 if cand == "ndbm":
69337db96d56Sopenharmony_ci@@ -1282,6 +1316,19 @@ def detect_platform_specific_exts(self):
69347db96d56Sopenharmony_ci         # macOS-only, needs SystemConfiguration and CoreFoundation framework
69357db96d56Sopenharmony_ci         self.addext(Extension('_scproxy', ['_scproxy.c']))
69367db96d56Sopenharmony_ci 
69377db96d56Sopenharmony_ci+        # Windows-only modules
69387db96d56Sopenharmony_ci+        if MS_WINDOWS:
69397db96d56Sopenharmony_ci+            srcdir = sysconfig.get_config_var('srcdir')
69407db96d56Sopenharmony_ci+            pc_srcdir = os.path.abspath(os.path.join(srcdir, 'PC'))
69417db96d56Sopenharmony_ci+
69427db96d56Sopenharmony_ci+            self.addext(Extension('_msi', 
69437db96d56Sopenharmony_ci+                                [os.path.join(pc_srcdir, '_msi.c')]))
69447db96d56Sopenharmony_ci+
69457db96d56Sopenharmony_ci+            self.addext(Extension('winsound', 
69467db96d56Sopenharmony_ci+                                [os.path.join(pc_srcdir, 'winsound.c')]))
69477db96d56Sopenharmony_ci+
69487db96d56Sopenharmony_ci+            self.addext(Extension('_overlapped', ['overlapped.c']))
69497db96d56Sopenharmony_ci+
69507db96d56Sopenharmony_ci     def detect_compress_exts(self):
69517db96d56Sopenharmony_ci         # Andrew Kuchling's zlib module.
69527db96d56Sopenharmony_ci         self.addext(Extension('zlib', ['zlibmodule.c']))
69537db96d56Sopenharmony_ci@@ -1329,9 +1376,10 @@ def detect_multiprocessing(self):
69547db96d56Sopenharmony_ci         if (
69557db96d56Sopenharmony_ci             sysconfig.get_config_var('HAVE_SEM_OPEN') and not
69567db96d56Sopenharmony_ci             sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')
69577db96d56Sopenharmony_ci-        ):
69587db96d56Sopenharmony_ci+        ) or MS_WINDOWS:
69597db96d56Sopenharmony_ci             multiprocessing_srcs.append('_multiprocessing/semaphore.c')
69607db96d56Sopenharmony_ci-        self.addext(Extension('_multiprocessing', multiprocessing_srcs))
69617db96d56Sopenharmony_ci+        self.addext(Extension('_multiprocessing', multiprocessing_srcs,
69627db96d56Sopenharmony_ci+                              libraries=(['ws2_32'] if MS_WINDOWS else None), include_dirs=["Modules/_multiprocessing"]))
69637db96d56Sopenharmony_ci         self.addext(Extension('_posixshmem', ['_multiprocessing/posixshmem.c']))
69647db96d56Sopenharmony_ci 
69657db96d56Sopenharmony_ci     def detect_uuid(self):
69667db96d56Sopenharmony_ci@@ -1414,11 +1462,16 @@ def detect_ctypes(self):
69677db96d56Sopenharmony_ci                         include_dirs=include_dirs,
69687db96d56Sopenharmony_ci                         extra_compile_args=extra_compile_args,
69697db96d56Sopenharmony_ci                         extra_link_args=extra_link_args,
69707db96d56Sopenharmony_ci-                        libraries=[],
69717db96d56Sopenharmony_ci+                        libraries=(['ole32', 'oleaut32', 'uuid'] if MS_WINDOWS else []),
69727db96d56Sopenharmony_ci+                        export_symbols=(
69737db96d56Sopenharmony_ci+                            ['DllGetClassObject PRIVATE', 'DllCanUnloadNow PRIVATE']
69747db96d56Sopenharmony_ci+                            if MS_WINDOWS else None
69757db96d56Sopenharmony_ci+                        ),
69767db96d56Sopenharmony_ci                         sources=sources)
69777db96d56Sopenharmony_ci         self.add(ext)
69787db96d56Sopenharmony_ci         # function my_sqrt() needs libm for sqrt()
69797db96d56Sopenharmony_ci-        self.addext(Extension('_ctypes_test', ['_ctypes/_ctypes_test.c']))
69807db96d56Sopenharmony_ci+        self.addext(Extension('_ctypes_test', ['_ctypes/_ctypes_test.c'],
69817db96d56Sopenharmony_ci+                              libraries=(['oleaut32'] if MS_WINDOWS else [])))
69827db96d56Sopenharmony_ci 
69837db96d56Sopenharmony_ci         ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR")
69847db96d56Sopenharmony_ci         ffi_lib = None
69857db96d56Sopenharmony_ci@@ -1568,7 +1621,7 @@ def copy_scripts(self):
69867db96d56Sopenharmony_ci             else:
69877db96d56Sopenharmony_ci                 newfilename = filename + minoronly
69887db96d56Sopenharmony_ci             log.info(f'renaming {filename} to {newfilename}')
69897db96d56Sopenharmony_ci-            os.rename(filename, newfilename)
69907db96d56Sopenharmony_ci+            os.replace(filename, newfilename)
69917db96d56Sopenharmony_ci             newoutfiles.append(newfilename)
69927db96d56Sopenharmony_ci             if filename in updated_files:
69937db96d56Sopenharmony_ci                 newupdated_files.append(newfilename)
6994