应用一条兼容性补丁 #30
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: 构建 | |
| on: | |
| push: | |
| branches: | |
| - main | |
| schedule: | |
| - cron: '0 0 */7 * *' | |
| jobs: | |
| build: | |
| runs-on: ${{ matrix.runner }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| msystem: ['MINGW64','MINGW32','CLANGARM64'] | |
| build_type: # 新增构建类型矩阵 | |
| - { optimization: "O3", cflag: "-O3" } | |
| - { optimization: "O2", cflag: "-O2" } | |
| - { optimization: "Os", cflag: "-Os" } | |
| include: | |
| - msystem: MINGW64 | |
| prefix: mingw-w64-x86_64 | |
| runner: windows-2022 | |
| - msystem: MINGW32 | |
| prefix: mingw-w64-i686 | |
| runner: windows-2022 | |
| - msystem: CLANGARM64 | |
| prefix: mingw-w64-clang-aarch64 | |
| runner: windows-11-arm | |
| steps: | |
| - name: 设置git | |
| run: | | |
| git config --global core.autocrlf false | |
| git config --global core.eol lf | |
| - name: 获取本仓库文件 | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 1 | |
| - name: 克隆python存储库 | |
| run: | | |
| git clone https://github.com/msys2-contrib/cpython-mingw.git --depth 1 | |
| - name: 恢复MSYS2包缓存 | |
| uses: actions/cache@v4 | |
| id: restore-msys2 | |
| with: | |
| path: | | |
| C:/msys64/var/cache/pacman/pkg/ | |
| key: ${{ runner.os }}-msys2-pkg-${{ hashFiles('**/install-pacman-packages.sh') }} | |
| - name: 安装MSYS2 | |
| uses: msys2/setup-msys2@v2 | |
| with: | |
| msystem: ${{ matrix.msystem }} | |
| release: ${{ matrix.msystem == 'CLANGARM64' }} | |
| update: true | |
| install: >- | |
| make | |
| git | |
| dos2unix | |
| binutils | |
| autoconf | |
| autoconf-archive | |
| automake-wrapper | |
| ${{ matrix.prefix }}-7zip | |
| ${{ matrix.prefix }}-toolchain | |
| ${{ matrix.prefix }}-expat | |
| ${{ matrix.prefix }}-bzip2 | |
| ${{ matrix.prefix }}-libffi | |
| ${{ matrix.prefix }}-mpdecimal | |
| ${{ matrix.prefix }}-ncurses | |
| ${{ matrix.prefix }}-openssl | |
| ${{ matrix.prefix }}-sqlite3 | |
| ${{ matrix.prefix }}-tcl | |
| ${{ matrix.prefix }}-tk | |
| ${{ matrix.prefix }}-zlib | |
| ${{ matrix.prefix }}-xz | |
| ${{ matrix.prefix }}-tzdata | |
| - name: 保存MSYS2包缓存 | |
| if: steps.restore-msys2.outputs.cache-hit != 'true' | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| C:/msys64/var/cache/pacman/pkg/ | |
| key: ${{ runner.os }}-msys2-pkg-${{ hashFiles('**/install-pacman-packages.sh') }} | |
| - name: 应用补丁 | |
| shell: msys2 {0} | |
| run: | | |
| cd cpython-mingw | |
| # # 应用Windows 7兼容性补丁 | |
| git apply ../thirdparty/restore-win7-handling-1.patch || echo 补丁应用失败,这个版本将不会支持Win7 | |
| - name: 编译 | |
| shell: msys2 {0} | |
| run: | | |
| mkdir build | |
| set -ex | |
| export PKG_CONFIG_LIBDIR=/dev/null | |
| unset PKG_CONFIG_PATH | |
| cd cpython-mingw | |
| autoreconf -vfi | |
| cd ../build | |
| ../cpython-mingw/configure \ | |
| --prefix=/ \ | |
| --bindir=/ \ | |
| --sbindir=/ \ | |
| --docdir=/doc \ | |
| --mandir=/doc/man \ | |
| --host=${MINGW_CHOST} \ | |
| --build=${MINGW_CHOST} \ | |
| --enable-shared \ | |
| --with-lto=yes \ | |
| --without-ensurepip \ | |
| --with-system-expat \ | |
| --with-system-libmpdec \ | |
| --enable-optimizations \ | |
| --disable-test-modules \ | |
| --with-nt-threads \ | |
| --enable-loadable-sqlite-extensions \ | |
| CFLAGS="${{ matrix.build_type.cflag }} -pipe -D__USE_MINGW_ANSI_STDIO=1" \ | |
| LDFLAGS="-Wl,--strip-all,--gc-sections,-s" | |
| make -j8 | |
| - name: 安装+压缩 | |
| shell: msys2 {0} | |
| run: | | |
| set -ex | |
| cd build | |
| # 创建专用打包目录 | |
| _build_root="${PWD}" | |
| mkdir -p pkgdir | |
| # 获取分支名称 (示例:mingw-v3.12.10) | |
| cd ../cpython-mingw | |
| _branch_name=$(git rev-parse --abbrev-ref HEAD) | |
| cd ../build | |
| # 构建目录名称 | |
| _pkg_suffix="${{ matrix.msystem }}-${{ matrix.build_type.optimization }}" | |
| pkgdir="pkgdir/python-${_branch_name}-${_pkg_suffix}" # ← 修改路径 | |
| make -j8 install DESTDIR="${_build_root}/${pkgdir}" # ← 修改安装路径 | |
| # Fix shebangs | |
| _pybasever=$(./python.exe -c "import sys; print(f'{sys.version_info[0]}.{sys.version_info[1]}');") | |
| for fscripts in 2to3 2to3-${_pybasever} idle3 idle${_pybasever} pydoc3 pydoc${_pybasever}; do | |
| sed -i "s|$(cygpath -w / | sed 's|\\|\\\\|g')/python${_pybasever}.exe|/usr/bin/env python${_pybasever}.exe|g" "${pkgdir}/"/${fscripts} | |
| done | |
| sed -i "s|#!//python${_pybasever}.exe|#!/usr/bin/env python${_pybasever}.exe|" "${pkgdir}/"/lib/python${_pybasever}/config-${_pybasever}/python-config.py | |
| # Create version-less aliases | |
| cp "${pkgdir}/"/python3.exe "${pkgdir}/"/python.exe | |
| cp "${pkgdir}/"/python3w.exe "${pkgdir}/"/pythonw.exe | |
| cp "${pkgdir}/"/python3-config "${pkgdir}/"/python-config | |
| cp "${pkgdir}/"/idle3 "${pkgdir}/"/idle | |
| cp "${pkgdir}/"/pydoc3 "${pkgdir}/"/pydoc | |
| # 压缩 | |
| 7z a -t7z -mx=9 "python-${_branch_name}-${{ matrix.msystem }}-${{ matrix.build_type.optimization }}.7z" "${pkgdir}" | |
| - name: 上传 | |
| uses: actions/upload-artifact@v4 | |
| if: always() | |
| with: | |
| name: build-${{ matrix.msystem }}-${{ matrix.build_type.optimization }} | |
| path: | | |
| build/python-*-${{ matrix.msystem }}-${{ matrix.build_type.optimization }}.7z | |
| - name: 加入依赖 | |
| if: always() | |
| shell: msys2 {0} | |
| run: | | |
| _pkgdir_pattern="python-*-${{ matrix.msystem }}-${{ matrix.build_type.optimization }}" | |
| cd build/pkgdir || (echo "build/pkgdir 目录不存在" && exit 1) | |
| _actual_dir=$(find . -maxdepth 1 -type d -name "${_pkgdir_pattern}" | head -1) | |
| if [ -z "${_actual_dir}" ]; then | |
| echo "无法找到匹配的目录: ${_pkgdir_pattern}" | |
| exit 1 | |
| fi | |
| cd "${_actual_dir}" | |
| # 一般的第三方库 | |
| cp -f ${MINGW_PREFIX}/bin/libsqlite3*.dll ./ | |
| cp -f ${MINGW_PREFIX}/bin/tcl*.dll ./ | |
| cp -f ${MINGW_PREFIX}/bin/tk*.dll ./ | |
| cp -f ${MINGW_PREFIX}/bin/libncursesw*.dll ./ | |
| cp -f ${MINGW_PREFIX}/bin/liblzma*.dll ./ | |
| cp -f ${MINGW_PREFIX}/bin/libmpdec*.dll ./ | |
| cp -f ${MINGW_PREFIX}/bin/libexpat*.dll ./ | |
| cp -f ${MINGW_PREFIX}/bin/libintl*.dll ./ | |
| cp -f ${MINGW_PREFIX}/bin/libssl*.dll ./ | |
| cp -f ${MINGW_PREFIX}/bin/libcrypto*.dll ./ | |
| cp -f ${MINGW_PREFIX}/bin/libbz2*.dll ./ | |
| cp -f ${MINGW_PREFIX}/bin/libffi*.dll ./ | |
| cp -f ${MINGW_PREFIX}/bin/zlib*.dll ./ | |
| # 已被破解的系统库 | |
| if [[ "${{ matrix.msystem }}" == "MINGW32" ]]; then | |
| cp -vf ../../../thirdparty/x86/api-ms-win-core-path-l1-1-0.dll ./ | |
| elif [[ "${{ matrix.msystem }}" == "MINGW64" ]]; then | |
| cp -vf ../../../thirdparty/x64/api-ms-win-core-path-l1-1-0.dll ./ | |
| fi | |
| # MinGW的运行时库 | |
| if [[ "${{ matrix.msystem }}" == "MINGW64" ]]; then | |
| cp -f ${MINGW_PREFIX}/bin/libgcc_s_seh*.dll ./ | |
| elif [[ "${{ matrix.msystem }}" == "MINGW32" ]]; then | |
| cp -f ${MINGW_PREFIX}/bin/libgcc_s_dw2*.dll ./ | |
| fi | |
| cp -f ${MINGW_PREFIX}/bin/libwinpthread*.dll ./ | |
| # 打包 | |
| cd .. | |
| 7z a -t7z -mx=9 python-${_branch_name}-${{ matrix.msystem }}-${{ matrix.build_type.optimization }}-deps.7z "${_pkgdir_pattern}" | |
| - name: 上传带依赖的Python | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: build-${{ matrix.msystem }}-${{ matrix.build_type.optimization }}-deps | |
| path: | | |
| build/pkgdir/python-*-${{ matrix.msystem }}-${{ matrix.build_type.optimization }}-deps.7z | |