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