pax_global_header00006660000000000000000000000064152706470570014527gustar00rootroot0000000000000052 comment=3bec0a32ae2b67ad4fac0194f762f44141e51473 maturin-1.16.0/000077500000000000000000000000001527064705700132735ustar00rootroot00000000000000maturin-1.16.0/.codespellrc000066400000000000000000000001551527064705700155740ustar00rootroot00000000000000[codespell] ignore-words-list = crate,socio-economic skip = ./.git,./target,./test-crates/venvs,./guide/book maturin-1.16.0/.config/000077500000000000000000000000001527064705700146165ustar00rootroot00000000000000maturin-1.16.0/.config/nextest.toml000066400000000000000000000020311527064705700172010ustar00rootroot00000000000000[profile.default] # Terminate slow tests after 30 minutes slow-timeout = { period = "60s", terminate-after = 30 } [[profile.default.overrides]] # Schedule the slowest tests first so they don't serialize at the tail of the # run: pgo tests build everything twice, conda tests create conda environments, # uniffi tests build a large dependency tree and uv_multi_python tests build # for two interpreters. filter = 'test(/pgo_|_conda|_uniffi_|uv_multi_python/)' priority = 100 [[profile.default.overrides]] # uniffi builds are heavy, but claiming the whole machine serialized all uniffi # tests; two threads keeps them from crowding out other tests while still # allowing overlap. See https://nexte.st/book/threads-required.html filter = 'test(/_uniffi_/)' threads-required = 2 [test-groups] conda = { max-threads = 1 } [[profile.default.overrides]] # conda tests share the conda package cache, and concurrent `conda create` runs # race on renaming the same `.conda.partial` downloads. filter = 'binary(run) & test(/_conda$/)' test-group = 'conda' maturin-1.16.0/.devcontainer/000077500000000000000000000000001527064705700160325ustar00rootroot00000000000000maturin-1.16.0/.devcontainer/devcontainer.json000066400000000000000000000007511527064705700214110ustar00rootroot00000000000000{ "name": "maturin", "image": "mcr.microsoft.com/devcontainers/rust:bullseye", "postCreateCommand": "bash .devcontainer/post_create.sh", "customizations": { "vscode": { "extensions": [ "ms-python.black-formatter", "rust-lang.rust-analyzer", "charliermarsh.ruff" ], "settings": { "editor.formatOnSave": true } } }, "features": { "ghcr.io/devcontainers/features/sshd:1": { "version": "latest" } } } maturin-1.16.0/.devcontainer/post_create.sh000077500000000000000000000005651527064705700207070ustar00rootroot00000000000000#!/usr/bin/env bash set -euxo pipefail sudo apt-get update sudo apt-get install -y python3-dev python3-pip python3-venv libclang-dev sudo python3 -m pip install cffi virtualenv pipx pipx ensurepath pipx install uniffi-bindgen pipx install cargo-deny rustup target add wasm32-wasip1 curl -LsSf https://get.nexte.st/latest/linux | tar zxf - -C ${CARGO_HOME:-~/.cargo}/bin maturin-1.16.0/.dockerignore000066400000000000000000000002631527064705700157500ustar00rootroot00000000000000**/.pytest_cache **/.tox **/__pycache__ **/venv* .dockerignore .git .idea .travis.yml .venv /target Dockerfile* appveyor.yml ci sysconfig test-crates test-data test-dockerfile.sh maturin-1.16.0/.gitattributes000066400000000000000000000000401527064705700161600ustar00rootroot00000000000000maturin.schema.json text eol=lf maturin-1.16.0/.github/000077500000000000000000000000001527064705700146335ustar00rootroot00000000000000maturin-1.16.0/.github/FUNDING.yml000066400000000000000000000000211527064705700164410ustar00rootroot00000000000000github: messense maturin-1.16.0/.github/ISSUE_TEMPLATE/000077500000000000000000000000001527064705700170165ustar00rootroot00000000000000maturin-1.16.0/.github/ISSUE_TEMPLATE/bug_report.yml000066400000000000000000000041211527064705700217070ustar00rootroot00000000000000name: ðŸ�› Bug Report description: Create a bug report type: Bug body: - type: markdown attributes: value: | Thank you for taking the time to fill out this bug report! Please fill out the form below... - type: textarea id: description attributes: label: Bug Description description: Please provide a clear and concise description of what the bug is. placeholder: The bug is... validations: required: true - type: input id: maturin_version attributes: label: Your maturin version (`maturin --version`) placeholder: ex. 0.14.1 validations: required: true - type: input id: py_version attributes: label: Your Python version (`python -V`) placeholder: ex. Python 3.10.0 validations: required: true - type: input id: pip_version attributes: label: Your pip version (`pip -V`) placeholder: ex. pip 21.1.3 validations: required: true - type: dropdown id: bindings attributes: label: What bindings you're using options: - "pyo3" - "cffi" - "uniffi" - "bin" validations: required: false - type: checkboxes id: cargo-build attributes: label: Does `cargo build` work? options: - label: Yes, it works required: false - type: checkboxes id: windows-unix-path attributes: label: If on windows, have you checked that you aren't accidentally using unix path (those with the forward slash `/`)? options: - label: "Yes" required: false - type: textarea id: reproduce attributes: label: Steps to Reproduce description: Please list the exact steps required to reproduce your error with all command output and if possible with a repository. Please run maturin with `RUST_LOG=maturin=debug` being set, e.g. `RUST_LOG=maturin=debug maturin build` and share the output, either in a codeblock or as a [gist](https://gist.github.com/) placeholder: | 1. 2. 3. validations: required: true maturin-1.16.0/.github/ISSUE_TEMPLATE/config.yml000066400000000000000000000005041527064705700210050ustar00rootroot00000000000000blank_issues_enabled: true contact_links: - name: â�“ Question url: https://github.com/PyO3/maturin/discussions about: Ask and answer questions about maturin on Discussions - name: 🔧 Troubleshooting url: https://github.com/PyO3/maturin/discussions about: For troubleshooting help, see the Discussions maturin-1.16.0/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000006711527064705700225470ustar00rootroot00000000000000--- name: 💡 Feature request about: Suggest an idea for this project type: Feature --- maturin-1.16.0/.github/bors.toml000066400000000000000000000003641527064705700165000ustar00rootroot00000000000000delete_merged_branches = true required_approvals = 0 use_codeowners = false status = [ # GitHub Actions "conclusion", # Cirrus CI "Test (x86_64 FreeBSD)", "Test (arm64 macOS)", "Test (arm64 Linux)" ] timeout_sec = 21600 maturin-1.16.0/.github/renovate.json5000066400000000000000000000005371527064705700174430ustar00rootroot00000000000000{ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ "config:recommended", "helpers:pinGitHubActionDigests" ], "schedule": ["before 4am on the first day of the month"], "packageRules": [ { "matchManagers": ["cargo"], "groupName": "crates-io", "matchPackagePatterns": ["*"] } ] } maturin-1.16.0/.github/workflows/000077500000000000000000000000001527064705700166705ustar00rootroot00000000000000maturin-1.16.0/.github/workflows/clear-cache.yml000066400000000000000000000005261527064705700215450ustar00rootroot00000000000000name: Clear Actions Cache on: workflow_dispatch: permissions: actions: write jobs: clear-cache: name: Clean Cache runs-on: ubuntu-latest env: GH_TOKEN: ${{ github.token }} steps: - name: Clear cache run: | gh cache delete --all --repo "$GITHUB_REPOSITORY" echo "cache cleared" maturin-1.16.0/.github/workflows/copilot-setup-steps.yml000066400000000000000000000031171527064705700233600ustar00rootroot00000000000000name: "Copilot Setup Steps" # Automatically run the setup steps when they are changed to allow for easy validation, and # allow manual testing through the repository's "Actions" tab on: workflow_dispatch: push: paths: - .github/workflows/copilot-setup-steps.yml pull_request: paths: - .github/workflows/copilot-setup-steps.yml jobs: # The job MUST be called `copilot-setup-steps` or it will not be picked up by Copilot. copilot-setup-steps: runs-on: ubuntu-latest # Set the permissions to the lowest permissions possible needed for your steps. # Copilot will be given its own token for its operations. permissions: # If you want to clone the repository as part of your setup steps, for example to install dependencies, you'll need the `contents: read` permission. If you don't clone the repository in your setup steps, Copilot will do this for you automatically after the steps complete. contents: read # You can define any steps you want, and they will run before the agent starts. # If you do not check out your code, Copilot will do this for you. steps: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7 - run: uv tool install pre-commit - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5 with: path: ~/.cache/pre-commit key: pre-commit-3|${{ env.pythonLocation }}|${{ hashFiles('.pre-commit-config.yaml') }} - run: pre-commit install-hooks maturin-1.16.0/.github/workflows/docker.yml000066400000000000000000000057561527064705700206770ustar00rootroot00000000000000name: Docker Publish on: push: branches: - main tags: ["v*"] jobs: publish-docker: name: Publish Docker Images runs-on: ubuntu-latest strategy: fail-fast: false matrix: compatibility: - name: manylinux tag-suffix: '' manylinux: manylinux2014 - name: musllinux tag-suffix: '-musllinux' manylinux: musllinux_1_2 environment: name: Docker Hub url: https://ghcr.io/pyo3/maturin steps: - name: Get image name from repository id: image run: python -c 'print("image=ghcr.io/${{ github.repository }}".lower())' >> $GITHUB_OUTPUT - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3 id: changes with: filters: | changed: - 'Cargo.toml' - 'Cargo.lock' - 'src/**' - 'Dockerfile' - '.github/workflows/docker.yml' - '.dockerignore' - name: Setup QEMU if: ${{ steps.changes.outputs.changed == 'true' || startsWith(github.ref, 'refs/tags/') }} uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3 - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3 if: ${{ steps.changes.outputs.changed == 'true' || startsWith(github.ref, 'refs/tags/') }} - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5 if: ${{ steps.changes.outputs.changed == 'true' || startsWith(github.ref, 'refs/tags/') }} id: meta with: images: ${{ steps.image.outputs.image }} flavor: | suffix=${{ matrix.compatibility.tag-suffix }},onlatest=true - name: Login to GitHub Container Registry if: ${{ steps.changes.outputs.changed == 'true' || startsWith(github.ref, 'refs/tags/') }} uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push if: ${{ steps.changes.outputs.changed == 'true' || startsWith(github.ref, 'refs/tags/') }} uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6 with: context: . platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} build-args: MANYLINUX=${{ matrix.compatibility.manylinux }} # https://github.com/docker/build-push-action/blob/master/docs/advanced/cache.md#registry-cache cache-from: type=registry,ref=${{ steps.image.outputs.image }}:buildcache${{ matrix.compatibility.tag-suffix }} cache-to: type=registry,ref=${{ steps.image.outputs.image }}:buildcache${{ matrix.compatibility.tag-suffix }},mode=max maturin-1.16.0/.github/workflows/downstream.yml000066400000000000000000000025231527064705700216000ustar00rootroot00000000000000name: Test Downstream on: workflow_call: inputs: repository: required: true type: string manifest-dir: required: true type: string jobs: sdist: runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Sccache Setup uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 with: version: "v0.14.0" - name: Build maturin env: RUST_BACKTRACE: "1" SCCACHE_GHA_ENABLED: "true" RUSTC_WRAPPER: "sccache" run: cargo build - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: repository: ${{ inputs.repository }} submodules: "recursive" path: downstream - name: maturin sdist working-directory: downstream run: | ../target/debug/maturin sdist --manifest-path ${{ inputs.manifest-dir }}/Cargo.toml -o target/sdist - name: Build from sdist working-directory: downstream run: | mkdir -p target/sdist-extract tar -xzf target/sdist/*.tar.gz -C target/sdist-extract --strip-components=1 ../target/debug/maturin build --manifest-path target/sdist-extract/${{ inputs.manifest-dir }}/Cargo.toml maturin-1.16.0/.github/workflows/release.yml000066400000000000000000000321441527064705700210370ustar00rootroot00000000000000name: Release on: push: tags: ["v*"] workflow_dispatch: pull_request: paths: # Dry run the release pipeline when changing the version of maturin or of its dependencies - pyproject.toml - Cargo.toml # Dry run the release pipeline when it's changed - .github/workflows/release.yml permissions: contents: read jobs: sdist: name: Build sdist runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Install uv uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7 with: # No need to take cache size for maturin in the release pipeline enable-cache: "false" - name: Build sdist run: uvx maturin sdist -o dist - name: Upload sdist uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: wheels-sdist path: dist/*.tar.gz build: name: Build ${{ matrix.target }} strategy: fail-fast: false matrix: target: - x86_64-unknown-linux-musl - x86_64-apple-darwin - x86_64-pc-windows-msvc - i686-pc-windows-msvc - aarch64-pc-windows-msvc include: - target: x86_64-unknown-linux-musl os: ubuntu-latest name: maturin-x86_64-unknown-linux-musl.tar.gz - target: x86_64-apple-darwin os: macos-latest name: maturin-x86_64-apple-darwin.tar.gz - target: x86_64-pc-windows-msvc os: windows-latest name: maturin-x86_64-pc-windows-msvc.zip - target: i686-pc-windows-msvc os: windows-latest name: maturin-i686-pc-windows-msvc.zip - target: aarch64-pc-windows-msvc os: windows-latest name: maturin-aarch64-pc-windows-msvc.zip runs-on: ${{ matrix.os }} env: CARGO_PROFILE_RELEASE_LTO: "fat" steps: # Largely inspired by https://github.com/starship/starship/blob/35a0a20f5c4fea6a08e1b91ff631b089eef8fc50/.github/workflows/deploy.yml - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - run: rustup target add ${{ matrix.target }} - name: Install musl tools if: matrix.os == 'ubuntu-latest' run: sudo apt-get install -y musl-tools # Install gnu-tar because BSD tar is buggy # https://github.com/actions/cache/issues/403 - name: Install GNU tar (macOS) if: matrix.os == 'macos-latest' run: | brew install gnu-tar echo "/usr/local/opt/gnu-tar/libexec/gnubin" >> $GITHUB_PATH - name: Build wheel (linux x86_64) if: matrix.target == 'x86_64-unknown-linux-musl' run: | cargo run -- build --release -b bin -o dist --target ${{ matrix.target }} --features password-storage --compatibility manylinux2010 musllinux_1_1 --compatibility pypi # ring doesn't support aarch64 windows yet - name: Build wheel (windows aarch64) if: matrix.target == 'aarch64-pc-windows-msvc' run: cargo run -- build --release -b bin -o dist --target ${{ matrix.target }} --no-default-features --features full,native-tls --compatibility pypi - name: Build wheel if: ${{ matrix.target != 'x86_64-unknown-linux-musl' && matrix.target != 'aarch64-pc-windows-msvc' }} run: cargo run -- build --release -b bin -o dist --target ${{ matrix.target }} --features password-storage,static --compatibility pypi - name: Build wheel (macOS universal2) if: matrix.target == 'x86_64-apple-darwin' env: DEVELOPER_DIR: /Applications/Xcode.app/Contents/Developer MACOSX_DEPLOYMENT_TARGET: "10.12" run: | set -euo pipefail # set SDKROOT for C dependencies like ring and bzip2 SDKROOT="$(xcrun --sdk macosx --show-sdk-path)" export SDKROOT rustup target add aarch64-apple-darwin cargo run -- build --release -b bin -o dist --target universal2-apple-darwin --features password-storage,static --compatibility pypi - name: Archive binary (windows) if: matrix.os == 'windows-latest' run: | cd target/${{ matrix.target }}/release 7z a ../../../${{ matrix.name }} ${{ github.event.repository.name }}.exe cd - - name: Archive binary (linux) if: matrix.os == 'ubuntu-latest' run: | cd target/${{ matrix.target }}/release tar czvf ../../../${{ matrix.name }} ${{ github.event.repository.name }} cd - - name: Archive binary (macOS x86_64) if: matrix.os == 'macos-latest' run: | cd target/${{ matrix.target }}/release tar czvf ../../../${{ matrix.name }} ${{ github.event.repository.name }} cd - - name: Archive binary (macOS aarch64) if: matrix.os == 'macos-latest' run: | cd target/aarch64-apple-darwin/release tar czvf ../../../maturin-aarch64-apple-darwin.tar.gz ${{ github.event.repository.name }} cd - - name: Upload wheel artifacts uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: wheels-${{ matrix.target }} path: dist - name: Upload binary artifacts uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: binaries-${{ matrix.target }} path: | *.tar.gz *.zip build-musl: name: Build ${{ matrix.platform.target }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: platform: - target: "aarch64-unknown-linux-musl" image: "rust-musl-cross:aarch64-musl" compatibility: "manylinux2014 musllinux_1_1" - target: "armv7-unknown-linux-musleabihf" image: "rust-musl-cross:armv7-musleabihf" compatibility: "manylinux2014 musllinux_1_1" - target: "i686-unknown-linux-musl" image: "rust-musl-cross:i686-musl" compatibility: "manylinux2010 musllinux_1_1" - target: "arm-unknown-linux-musleabihf" image: "rust-musl-cross:arm-musleabihf" compatibility: "linux" - target: "powerpc64le-unknown-linux-musl" image: "rust-musl-cross:powerpc64le-musl" compatibility: "manylinux2014 musllinux_1_1" lto: "off" - target: "s390x-unknown-linux-gnu" image: "manylinux2014-cross:s390x" compatibility: "manylinux2014" - target: "loongarch64-unknown-linux-musl" image: "rust-musl-cross:loongarch64-musl" compatibility: "manylinux_2_36 musllinux_1_2" rustflags: "-C target-feature=+crt-static" - target: "riscv64gc-unknown-linux-musl" image: "rust-musl-cross:riscv64gc-musl" compatibility: "manylinux_2_31 musllinux_1_1" rustflags: "-C target-feature=+crt-static" container: image: docker://ghcr.io/rust-cross/${{ matrix.platform.image }} env: RUSTUP_HOME: /root/.rustup CARGO_HOME: /root/.cargo CARGO_PROFILE_RELEASE_LTO: "${{ matrix.platform.lto || 'fat' }}" steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - run: rustup target add --toolchain stable ${{ matrix.platform.target }} if: ${{ !contains(fromJson('["s390x-unknown-linux-gnu"]'), matrix.platform.target) }} - uses: dtolnay/rust-toolchain@efa25f7f19611383d5b0ccf2d1c8914531636bf9 # stable if: contains(fromJson('["s390x-unknown-linux-gnu"]'), matrix.platform.target) with: toolchain: stable targets: ${{ matrix.platform.target }} - name: Install uv uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7 with: # No need to take cache size for maturin in the release pipeline enable-cache: "false" - name: Install patchelf if: contains(fromJson('["loongarch64-unknown-linux-musl", "riscv64gc-unknown-linux-musl"]'), matrix.platform.target) run: | pip install patchelf - name: Build wheel env: # Make psm compile, see https://github.com/rust-lang/stacker/issues/79 CFLAGS_s390x_unknown_linux_gnu: "-march=z10" RUSTFLAGS: ${{ matrix.platform.rustflags || '' }} run: | uvx maturin build --release -b bin -o dist \ --target ${{ matrix.platform.target }} \ ${{ !contains(fromJson('["loongarch64-unknown-linux-musl", "riscv64gc-unknown-linux-musl"]'), matrix.platform.target) && '--compatibility pypi' || '' }} \ --compatibility ${{ matrix.platform.compatibility }} \ --features password-storage - name: Archive binary run: tar czvf target/release/maturin-${{ matrix.platform.target }}.tar.gz -C target/${{ matrix.platform.target }}/release maturin - name: Upload wheel artifacts # loongarch64 is not allowed to publish to pypi currently, see https://github.com/pypi/warehouse/blob/348117529910181cb8c14e9b5fb00fcf4dbaf07c/warehouse/forklift/legacy.py#L114-L185 if: ${{ !contains(fromJson('["loongarch64-unknown-linux-musl"]'), matrix.platform.target) }} uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: wheels-${{ matrix.platform.target }} path: dist - name: Upload binary artifacts uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: binaries-${{ matrix.platform.target }} path: target/release/maturin-${{ matrix.platform.target }}.tar.gz release-pypi: permissions: # Used to sign the release's artifacts # and upload to PyPI using trusted publisher. id-token: write name: Publish to PyPI runs-on: ubuntu-latest environment: name: PyPI url: ${{ steps.set_url.outputs.env_url }} needs: [sdist, build, build-musl] steps: - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: pattern: wheels-* merge-multiple: true - uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7 - name: Generate PyPI publish attestations uses: astral-sh/attest-action@f589a42a7efb6fe400b4f400de60b4bc90390027 # v0.0.6 if: ${{ startsWith(github.ref, 'refs/tags/') }} with: paths: | ./*.tar.gz ./*.whl - name: Publish (dry run) if: ${{ !startsWith(github.ref, 'refs/tags/') }} run: uv publish --dry-run '*' - name: Publish if: startsWith(github.ref, 'refs/tags/') run: uv publish '*' - name: Set environment url id: set_url run: | VERSION=$(echo $GITHUB_REF | sed -e "s#refs/tags/v##g") echo "env_url=https://pypi.org/project/maturin/$VERSION" >> $GITHUB_OUTPUT release-github: permissions: # Used to sign the release's artifacts. id-token: write # Used to upload release artifacts. contents: write # Use to generate artifact attestation. attestations: write name: Publish to GitHub releases runs-on: ubuntu-latest needs: [build, build-musl] steps: - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: pattern: binaries-* merge-multiple: true - name: Generate artifact attestation uses: actions/attest@59d89421af93a897026c735860bf21b6eb4f7b26 # v4 if: ${{ startsWith(github.ref, 'refs/tags/') }} with: subject-path: | ./*.tar.gz ./*.zip ./*.deb - name: Release if: startsWith(github.ref, 'refs/tags/') uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2 with: files: | *.tar.gz *.zip *.deb prerelease: ${{ contains(github.ref, 'alpha') || contains(github.ref, 'beta') }} generate_release_notes: true release-crates-io: name: Release crates.io runs-on: ubuntu-latest needs: [build, build-musl] permissions: id-token: write environment: name: crates.io url: ${{ steps.set_url.outputs.env_url }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: cargo publish (dry run) if: ${{ !startsWith(github.ref, 'refs/tags/') }} run: cargo publish --dry-run - name: Authenticate with crates.io if: startsWith(github.ref, 'refs/tags/') uses: rust-lang/crates-io-auth-action@b7e9a28eded4986ec6b1fa40eeee8f8f165559ec # v1.0.3 id: auth - name: cargo publish if: startsWith(github.ref, 'refs/tags/') run: cargo publish env: CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }} - name: Set environment url id: set_url run: | VERSION=$(echo $GITHUB_REF | sed -e "s#refs/tags/v##g") echo "env_url=https://crates.io/crates/maturin/$VERSION" >> $GITHUB_OUTPUT maturin-1.16.0/.github/workflows/test.yml000066400000000000000000000560041527064705700203770ustar00rootroot00000000000000name: Test on: pull_request: paths-ignore: - "guide/**" - "sysconfig/**" - "**.md" - ".cirrus.yml" - ".github/ISSUE_TEMPLATE/**" - "renovate.json" workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number }} cancel-in-progress: true jobs: lint: name: Lint runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - run: | rustup component add rustfmt rustup component add clippy - name: cargo fmt run: cargo fmt --all -- --check - uses: EmbarkStudios/cargo-deny-action@3fd3802e88374d3fe9159b834c7714ec57d6c979 # v2 with: arguments: --all-features - name: cargo clippy run: cargo clippy --tests --all-features -- -D warnings test: name: Test strategy: fail-fast: false matrix: os: - ubuntu-latest - ubuntu-22.04-arm - macos-15-intel - macos-latest - windows-latest - windows-11-arm python-version: - "3.9" - "3.15-dev" - "3.15t-dev" - "pypy3.11" exclude: # TODO: Tests are getting stuck - os: ubuntu-latest python-version: pypy3.11 # macOS and windows arm only have Python 3.11+ - os: macos-latest python-version: 3.9 - os: windows-11-arm python-version: 3.9 # PyPy does not have ARM builds for linux or windows - os: ubuntu-22.04-arm python-version: pypy3.11 - os: windows-11-arm python-version: pypy3.11 runs-on: ${{ matrix.os }} env: RUST_BACKTRACE: "1" PIP_NO_CACHE_DIR: "1" SCCACHE_GHA_ENABLED: "true" RUSTC_WRAPPER: "sccache" steps: - name: Enable long paths if: startsWith(matrix.os, 'windows') run: | reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem /v LongPathsEnabled /t REG_DWORD /d 1 /f - name: Cleanup Disk if: ${{ !startsWith(matrix.os, 'windows') }} run: | sudo rm -rf /usr/share/dotnet sudo rm -rf /opt/ghc - name: sccache setup uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7 - name: Install python packages run: | uv tool install virtualenv uv tool install twine uv tool install uniffi-bindgen==0.28.0 # The conda tests create their own conda environments independent of the # matrix python, so exercising them once per OS (on the non-dev cells) is # enough. micromamba installs in seconds where miniconda took up to two # minutes; the test harness falls back to micromamba when conda is absent. - uses: mamba-org/setup-micromamba@add3a49764cedee8ee24e82dfde87f5bc2914462 # v2 if: ${{ matrix.os != 'windows-11-arm' && !contains(matrix.python-version, '-dev') }} - id: setup-python uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 with: python-version: ${{ matrix.python-version }} - name: Set PYTHON_VERSION env var shell: bash run: | set -ex # remove -dev suffix python_version=$(echo ${{ matrix.python-version }} | sed -e s/-dev//) echo "PYTHON_VERSION=$python_version" >> "${GITHUB_ENV}" - uses: mlugg/setup-zig@d1434d08867e3ee9daa34448df10607b98908d29 # v2 with: version: 0.15.2 - run: rustup target add wasm32-wasip1 # Used by the test suite - name: Install cargo-nextest uses: taiki-e/install-action@7410117eef9b9bd416593a4ae34d1bda0b4a2766 # nextest with: tool: nextest - name: Install additional Rust target if: startsWith(matrix.os, 'macos') run: rustup target add aarch64-apple-darwin x86_64-apple-darwin - name: Setup Xcode env if: startsWith(matrix.os, 'macos') shell: bash run: | set -ex sudo xcode-select -s /Applications/Xcode.app bindir="$(xcode-select --print-path)/Toolchains/XcodeDefault.xctoolchain/usr/bin" echo "CC=${bindir}/clang" >> "${GITHUB_ENV}" echo "CXX=${bindir}/clang++" >> "${GITHUB_ENV}" echo "SDKROOT=$(xcrun --sdk macosx --show-sdk-path)" >> "${GITHUB_ENV}" - name: Set MATURIN_TEST_PYTHON shell: bash run: echo "MATURIN_TEST_PYTHON=${{ steps.setup-python.outputs.python-path }}" >> "${GITHUB_ENV}" # Saves cache disk space and speeds up linking and packing/installing the # test wheels; the test suite doesn't need debuginfo in the artifacts. - name: Disable debuginfo shell: bash run: echo "RUSTFLAGS=-C debuginfo=0" >> "${GITHUB_ENV}" - name: Install llvm-tools run: rustup component add llvm-tools-preview - name: cargo test run: cargo nextest run --features password-storage,faster-tests,schemars # Zig cross compilation mainly exercises host-OS-specific plumbing, so one # python per OS is enough; macos-latest and windows-11-arm have no 3.9 # cell, so macos-latest falls back to pypy to keep coverage on arm macs. - name: test cross compiling with zig if: ${{ matrix.python-version == '3.9' || (matrix.os == 'macos-latest' && matrix.python-version == 'pypy3.11') }} shell: bash run: | set -ex rustup target add aarch64-unknown-linux-gnu rustup target add aarch64-unknown-linux-musl rustup target add aarch64-apple-darwin # Use the maturin binary the `cargo test` step already built; `cargo run` # would rebuild it with default features because the feature sets differ. # abi3 target/debug/maturin build -i $PYTHON_VERSION -m test-crates/pyo3-pure/Cargo.toml --target aarch64-unknown-linux-gnu --zig target/debug/maturin build -i $PYTHON_VERSION -m test-crates/pyo3-pure/Cargo.toml --target aarch64-unknown-linux-musl --zig if [[ "$PYTHON_VERSION" != "pypy"* ]]; then target/debug/maturin build -i $PYTHON_VERSION -m test-crates/pyo3-pure/Cargo.toml --target aarch64-apple-darwin --zig fi if [[ "$PYTHON_VERSION" == "3.1"* ]]; then # Check abi3 wheels with abi3audit on CPython only pip install abi3audit abi3audit test-crates/pyo3-pure/target/wheels/*.whl fi # Check wheels with twine twine check --strict test-crates/pyo3-pure/target/wheels/*.whl # non-abi3 target/debug/maturin build -i $PYTHON_VERSION -m test-crates/pyo3-mixed/Cargo.toml --target aarch64-unknown-linux-gnu --zig if [[ "$PYTHON_VERSION" != "pypy"* ]]; then target/debug/maturin build -i $PYTHON_VERSION -m test-crates/pyo3-mixed/Cargo.toml --target aarch64-apple-darwin --zig fi # Check wheels with twine twine check --strict test-crates/pyo3-mixed/target/wheels/*.whl - name: test compiling with PYO3_CONFIG_FILE if: ${{ matrix.os != 'windows-11-arm' }} shell: bash run: | set -ex rustup target add x86_64-unknown-linux-gnu PYO3_CONFIG_FILE="$(pwd)/test-crates/pyo3-mixed/pyo3-config.txt" export PYO3_CONFIG_FILE target/debug/maturin build -m test-crates/pyo3-mixed/Cargo.toml --target x86_64-unknown-linux-gnu --zig - name: test maturin new shell: bash run: | set -ex target/debug/maturin new -b pyo3 test-crates/pyo3-new target/debug/maturin build -m test-crates/pyo3-new/Cargo.toml --target-dir test-crates/targets/ target/debug/maturin new --mixed -b pyo3 test-crates/pyo3-new-mixed target/debug/maturin build -m test-crates/pyo3-new-mixed/Cargo.toml --target-dir test-crates/targets/ build-maturin: name: Build maturin runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - run: rustup show - run: rustup target add x86_64-unknown-linux-musl - run: sudo apt-get install musl-tools - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 - run: cargo build --target x86_64-unknown-linux-musl --release - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: maturin-build path: target/x86_64-unknown-linux-musl/release/maturin test-windows-cross: name: Test windows cross needs: build-maturin runs-on: ubuntu-latest env: RUST_BACKTRACE: "1" SCCACHE_GHA_ENABLED: "true" RUSTC_WRAPPER: "sccache" steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Sccache Setup uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 with: version: "v0.10.0" - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 with: python-version: 3.12 - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: name: maturin-build path: bin - run: chmod +x bin/maturin - name: test cross compiling windows wheel run: | set -ex sudo apt-get install -y mingw-w64 rustup component add llvm-tools-preview rustup target add x86_64-pc-windows-gnu rustup target add x86_64-pc-windows-msvc # abi3 bin/maturin build -m test-crates/pyo3-pure/Cargo.toml --target x86_64-pc-windows-gnu bin/maturin build -m test-crates/pyo3-pure/Cargo.toml --target x86_64-pc-windows-msvc # no-abi3 bin/maturin build -i python3.12 -m test-crates/pyo3-mixed/Cargo.toml --target x86_64-pc-windows-msvc test-emscripten: name: Test Emscripten (Pyodide ${{ matrix.pyodide-version }}) runs-on: ubuntu-latest strategy: fail-fast: false matrix: # Cover the PEP 783 Emscripten platform tags exposed by current # Pyodide releases. Pyodide 0.29 still stores the version in the # historical `info.abi_version` field, but maturin should emit the # PyPI-accepted `pyemscripten_*` tag for it. # - Pyodide 0.29 (Python 3.13) → `pyemscripten_2025_0_wasm32`. # - Pyodide 314.0.0-alpha.1 (Python 3.14) → `pyemscripten_2026_0_wasm32` # (see https://peps.python.org/pep-0783/). # The legacy `emscripten__wasm32` family (Pyodide # <= 0.27) is no longer exercised end-to-end because no maintained # Pyodide release uses it; it remains covered by the cascade unit # tests in `src/target/platform_tag.rs`. include: - pyodide-version: "0.29.0" python-version: "3.13" - pyodide-version: "314.0.0-alpha.1" python-version: "3.14" env: PYODIDE_VERSION: ${{ matrix.pyodide-version }} PYTHON_VERSION: ${{ matrix.python-version }} NODE_VERSION: 18 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 id: setup-python with: python-version: ${{ env.PYTHON_VERSION }} - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6 with: node-version: ${{ env.NODE_VERSION }} - run: | rustup default nightly rustup component add rust-src rustup target add wasm32-unknown-emscripten - uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 with: shared-key: maturin-build - uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7 - run: uv tool install nox - name: Setup Pyodide run: nox -s setup-pyodide - uses: mymindstorm/setup-emsdk@6ab9eb1bda2574c4ddb79809fc9247783eaf9021 # v14 with: version: ${{ env.EMSCRIPTEN_VERSION }} actions-cache-folder: emsdk-cache - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6 with: node-version: ${{ env.NODE_VERSION }} - name: Run tests run: nox -s test-emscripten test-alpine: name: Test Alpine Linux runs-on: ubuntu-latest env: RUST_BACKTRACE: "1" CARGO_INCREMENTAL: "0" CARGO_TERM_COLOR: always # no rustup, makes it awkward to install PGO tooling MATURIN_TEST_SKIP_PGO: "1" container: alpine:latest steps: - name: Install build requirements run: | set -ex apk add cargo python3-dev libffi-dev py3-pip curl \ bash tar zstd git patchelf py3-virtualenv - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Fix git permissions run: git config --global --add safe.directory $GITHUB_WORKSPACE - name: Cache cargo build uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 with: shared-key: maturin-build - name: Install cargo-nextest uses: taiki-e/install-action@7410117eef9b9bd416593a4ae34d1bda0b4a2766 # nextest with: tool: nextest - name: cargo test run: | # unset GITHUB_ACTIONS env var to disable zig related tests env -u GITHUB_ACTIONS cargo nextest run --features password-storage,faster-tests,schemars test-auditwheel: name: Test Auditwheel needs: build-maturin runs-on: ubuntu-latest strategy: fail-fast: false matrix: manylinux: ["manylinux_2_28"] container: quay.io/pypa/${{ matrix.manylinux }}_x86_64 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: dtolnay/rust-toolchain@efa25f7f19611383d5b0ccf2d1c8914531636bf9 # stable with: toolchain: stable - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: name: maturin-build path: bin - run: chmod +x bin/maturin - name: Compliant Build run: tests/manylinux_compliant.sh bin/maturin ${{ matrix.manylinux }} - name: Incompliant Build if: matrix.manylinux == 'manylinux_2_28' run: tests/manylinux_incompliant.sh bin/maturin test-docker: name: Test Docker runs-on: ubuntu-latest env: CARGO_INCREMENTAL: "0" CARGO_TERM_COLOR: always steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 with: python-version: "3.11" - name: Login to GitHub Container Registry uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3 - name: Build uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6 with: context: . push: false tags: maturin load: true cache-from: type=registry,ref=ghcr.io/pyo3/maturin:buildcache - name: Test the Docker container run: ./test-dockerfile.sh test-cross-compile: name: Test Cross Compile needs: build-maturin runs-on: ubuntu-latest container: ${{ matrix.platform.container }} strategy: fail-fast: false matrix: platform: # CPython - target: aarch64-unknown-linux-gnu abi: cp39-cp39 python: python3.9 container: ghcr.io/rust-cross/manylinux2014-cross:aarch64 - target: armv7-unknown-linux-gnueabihf abi: cp39-cp39 python: python3.9 container: ghcr.io/rust-cross/manylinux2014-cross:armv7 - target: s390x-unknown-linux-gnu abi: cp310-cp310 python: python3.10 container: ghcr.io/rust-cross/manylinux2014-cross:s390x - target: loongarch64-unknown-linux-gnu abi: cp310-cp310 python: python3.10 container: ghcr.io/rust-cross/manylinux_2_36-cross:loongarch64 - target: riscv64gc-unknown-linux-gnu abi: cp310-cp310 python: python3.10 container: ghcr.io/rust-cross/manylinux_2_31-cross:riscv64 extra-args: --manylinux 2_31 # PyPy - target: aarch64-unknown-linux-gnu abi: pp311-pypy311_pp73 python: pypy3.11 container: ghcr.io/rust-cross/manylinux2014-cross:aarch64 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: name: maturin-build path: bin - run: chmod +x bin/maturin - uses: dtolnay/rust-toolchain@efa25f7f19611383d5b0ccf2d1c8914531636bf9 # stable with: toolchain: stable targets: ${{ matrix.platform.target }} - name: Build wheels run: | set -ex # Use bundled sysconfig bin/maturin build -i ${{ matrix.platform.python }} --release --out dist --target ${{ matrix.platform.target }} -m test-crates/pyo3-mixed/Cargo.toml ${{ matrix.platform.extra-args }} # Use PYO3_CROSS_LIB_DIR export PYO3_CROSS_LIB_DIR=/opt/python/${{ matrix.platform.abi }} bin/maturin build -i python3.9 --release --out dist --target ${{ matrix.platform.target }} -m test-crates/pyo3-mixed/Cargo.toml ${{ matrix.platform.extra-args }} unset PYO3_CROSS_LIB_DIR # Test abi3 bin/maturin build -i ${{ matrix.platform.python }} --release --out dist --target ${{ matrix.platform.target }} -m test-crates/pyo3-pure/Cargo.toml ${{ matrix.platform.extra-args }} # --find-interpreter bin/maturin build --find-interpreter --release --out dist --target ${{ matrix.platform.target }} -m test-crates/pyo3-mixed/Cargo.toml ${{ matrix.platform.extra-args }} test-bootstrap: name: Test Bootstrap runs-on: ${{ matrix.os }} env: SCCACHE_GHA_ENABLED: "true" RUSTC_WRAPPER: "sccache" strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3 id: changes with: filters: | changed: - 'maturin/**' - 'pyproject.toml' - 'setup.py' - 'MANIFEST.in' - 'Cargo.toml' - '.github/workflows/test.yml' - uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7 # Caching - name: Sccache Setup if: ${{ steps.changes.outputs.changed == 'true' || contains(github.event.pull_request.labels.*.name, 'release') }} uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 with: version: "v0.10.0" - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 if: ${{ steps.changes.outputs.changed == 'true' || contains(github.event.pull_request.labels.*.name, 'release') }} with: python-version: "3.10" - name: Build and install shell: bash run: | set -ex cargo run sdist -o dist uv pip install --system -v dist/maturin-*.tar.gz if: ${{ steps.changes.outputs.changed == 'true' || contains(github.event.pull_request.labels.*.name, 'release') }} - run: maturin --version if: ${{ steps.changes.outputs.changed == 'true' || contains(github.event.pull_request.labels.*.name, 'release') }} - run: python3 -m maturin --version if: ${{ steps.changes.outputs.changed == 'true' || contains(github.event.pull_request.labels.*.name, 'release') }} - name: Upload wheel artifacts if: ${{ steps.changes.outputs.changed == 'true' || contains(github.event.pull_request.labels.*.name, 'release') }} uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: wheels-${{ runner.os }} path: dist test-msrv: name: Test MSRV runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - run: rustup default 1.89.0 # Caching - name: Cache cargo build uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 - run: cargo build --no-default-features - name: cargo build run: cargo build --all test-downstream: name: Test downstream - ${{ matrix.downstream.repository }} if: ${{ contains(github.event.pull_request.labels.*.name, 'sdist') && github.event_name == 'pull_request' }} uses: ./.github/workflows/downstream.yml with: repository: ${{ matrix.downstream.repository }} manifest-dir: ${{ matrix.downstream.manifest-dir }} strategy: fail-fast: false matrix: downstream: - repository: "pola-rs/polars" manifest-dir: "py-polars" - repository: "astral-sh/ruff" manifest-dir: "crates/ruff_cli" - repository: "crate-ci/typos" manifest-dir: "crates/typos-cli" - repository: "ast-grep/ast-grep" manifest-dir: "crates/pyo3" - repository: "oxigraph/oxigraph" manifest-dir: "python" check: name: Check ${{ matrix.platform.target }} strategy: fail-fast: false matrix: platform: - target: armv5te-unknown-linux-gnueabi apt-packages: gcc-arm-linux-gnueabi runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Install packages run: | sudo apt-get update sudo apt-get install -y ${{ matrix.platform.apt-packages }} - run: rustup target add ${{ matrix.platform.target }} - name: Cache cargo build uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2 - name: cargo check run: cargo check --target ${{ matrix.platform.target }} conclusion: needs: - test - test-emscripten - test-alpine - test-auditwheel - test-docker - test-cross-compile - test-bootstrap - test-msrv - test-downstream - check runs-on: ubuntu-latest if: always() steps: - name: Result run: | jq -C <<< "${needs}" # Check if all needs were successful or skipped. "$(jq -r 'all(.result as $result | (["success", "skipped"] | contains([$result])))' <<< "${needs}")" env: needs: ${{ toJson(needs) }} maturin-1.16.0/.github/workflows/update-auditwheel.yml000066400000000000000000000023741527064705700230340ustar00rootroot00000000000000name: Update auditwheel policies on: workflow_dispatch: schedule: # Run every week - cron: '0 0 * * 0' permissions: # added using https://github.com/step-security/secure-workflows contents: read jobs: update: permissions: contents: write # for peter-evans/create-pull-request to create branch pull-requests: write # for peter-evans/create-pull-request to create a PR name: Update auditwheel policies runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Fetch latest policy files run: | curl https://raw.githubusercontent.com/pypa/auditwheel/main/src/auditwheel/policy/manylinux-policy.json > src/auditwheel/manylinux-policy.json curl https://raw.githubusercontent.com/pypa/auditwheel/main/src/auditwheel/policy/musllinux-policy.json > src/auditwheel/musllinux-policy.json - name: Create Pull Request uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8 with: delete-branch: true add-paths: | src/auditwheel/*.json title: 'Update manylinux/musllinux policies to the latest main' commit-message: 'Update manylinux/musllinux policies to the latest main' maturin-1.16.0/.gitignore000066400000000000000000000004041527064705700152610ustar00rootroot00000000000000*.egg *.egg-info/ *.dwp *.dSYM *.o *.pdb *.py[cdo] *.so .pytest_cache/ .tox/ .venv/ /target/ /test-crates/*/target __pycache__/ dist/ node_modules tags test-crates/targets/ test-crates/venvs/ test-crates/wheels/ test-crates/case-packages/ test-targets/ venv*/ maturin-1.16.0/.pre-commit-config.yaml000066400000000000000000000035431527064705700175610ustar00rootroot00000000000000# run all hooks with: # pre-commit run --hook-stage manual --all ci: skip: # pre-commit.ci doesn't have Rust installed - cargo-fmt - cargo-deny repos: - repo: local hooks: - id: cargo-fmt # rustup component add rustfmt name: cargo fmt entry: cargo fmt --all -- language: system types: [rust] pass_filenames: false - id: cargo-deny # cargo install --locked cargo-deny name: cargo deny entry: cargo deny --all-features check -- language: system pass_filenames: false - id: cargo-check name: cargo check entry: cargo check --all-features --all-targets -- language: system pass_filenames: false types: [rust] stages: [manual] # because it's slow - id: cargo-clippy # rustup component add clippy name: cargo clippy entry: cargo clippy --tests --all-features -- -D warnings language: system pass_filenames: false types: [rust] stages: [manual] # because it's slow - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: - id: check-yaml - id: check-toml - id: end-of-file-fixer exclude: | (?x)( (^sysconfig/)| (.*\.stdout) ) - id: trailing-whitespace exclude: | (?x)( (^sysconfig/)| (.*\.stdout) ) - id: mixed-line-ending - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.17.1 hooks: - id: ruff-format - id: ruff - repo: https://github.com/pre-commit/mirrors-mypy rev: v2.4.0 hooks: - id: mypy entry: mypy maturin/ pass_filenames: false - repo: https://github.com/codespell-project/codespell rev: v2.4.3 hooks: - id: codespell maturin-1.16.0/AGENTS.md000066400000000000000000000055621527064705700146060ustar00rootroot00000000000000# AGENTS.md ## Project overview maturin builds and publishes Rust crates with pyo3, cffi, and uniffi bindings (and standalone Rust binaries) as Python packages. The core is written in Rust (`src/`) and exposed both as a CLI (`maturin`) and as a PEP 517 build backend through a small Python shim (`maturin/`). - `src/` — Rust source for the CLI, build backend, and library crate. - `maturin/` — Python package: PEP 517 bootstrap backend, `__main__` shim, and the import hook. - `tests/` — Rust integration tests (`cli.rs`, `run.rs`, helpers in `common/`, `cmd/`). - `test-crates/` — Fixture crates exercised by integration tests; do not commit changes here unless updating fixtures intentionally. - `guide/` — mdBook user documentation published at https://maturin.rs. - `sysconfig/` — Captured Python sysconfigs used for cross-compilation; treat as data. - `src/templates/` — `cargo-generate` templates for `maturin new`/`init`. Excluded from formatters/linters. - `noxfile.py` — Maintenance automation (e.g. `update-pyo3`, pyodide setup). ## Build & run - Build the CLI: `cargo build` (or `cargo build --release`). - Run the CLI from source: `cargo run -- `. ## Tests - Rust unit + integration tests: `cargo test --all-features`. - A single integration test: `cargo test --test run -- `. - Python tests: `pytest tests/` (some require a built `maturin` on `PATH`). - Long-running cross-compile / manylinux tests live in `tests/manylinux_*.sh` and `tests/run.rs`; many require Docker, zig, or specific Python interpreters and are skipped by default. Always run the relevant tests for code you touched and report failures faithfully. ## Lint & format Before finishing a change, run: - `cargo fmt --all` - `cargo clippy --tests --all-features -- -D warnings` - `cargo deny --all-features check` (when touching dependencies) - `pre-commit run --all-files` for Python / general hooks; `pre-commit run --hook-stage manual --all-files` to also run cargo-check and clippy. Python code uses `ruff` and `black` (line length 120, target py37) and `mypy` with strict untyped-def checks; see `pyproject.toml`. ## Conventions - Rust edition and MSRV are pinned in `Cargo.toml` (`rust-version`); do not bump casually. - Keep public CLI flags and `pyproject.toml` `[tool.maturin]` keys backward compatible. - When adding a CLI option, regenerate the JSON schema via `cargo run --bin generate_json_schema` (see `src/generate_json_schema.rs`) so `maturin.schema.json` stays in sync. - Do not edit files under `src/templates/` to satisfy formatters; they are intentionally excluded. - Do not modify `sysconfig/` snapshots by hand. - Document what & why in git commit message instead of just a list of changes, use backtick for code snippets in commit message. - Do not edit `Changelog.md` by hand; it is generated from git history by [git-cliff](https://github.com/orhun/git-cliff) (see `cliff.toml`). maturin-1.16.0/Cargo.lock000066400000000000000000003425061527064705700152120ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "adler2" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] [[package]] name = "allocator-api2" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "anstream" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", "windows-sys 0.61.2", ] [[package]] name = "anyhow" version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" [[package]] name = "ar_archive_writer" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7eb93bbb63b9c227414f6eb3a0adfddca591a8ce1e9b60661bb08969b87e340b" dependencies = [ "object 0.37.3", ] [[package]] name = "arwen" version = "0.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d44cbd9bd79165abe331ebabb9dd4d59a5dc93791be33ff15ebd71baaadc85ba" dependencies = [ "clap", "goblin", "object 0.38.1", "scroll", "thiserror 2.0.18", ] [[package]] name = "arwen-codesign" version = "0.0.1-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35d7a19757bfe3658d5a95bf25a0492f29ebb21933549bdbfa4075c895510124" dependencies = [ "goblin", "scroll", "sha2 0.10.9", "tempfile", ] [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "automod" version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8b5778837666541195063243828c5b6139221b47dc4ec3ba81738e532469ab1" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bitflags" version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" [[package]] name = "block-buffer" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] name = "block-buffer" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be" dependencies = [ "hybrid-array", ] [[package]] name = "borrow-or-share" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c" [[package]] name = "boxcar" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36f64beae40a84da1b4b26ff2761a5b895c12adc41dc25aaee1c4f2bbfe97a6e" [[package]] name = "bstr" version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" dependencies = [ "memchr", "serde", ] [[package]] name = "bumpalo" version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "byteorder" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "bytesize" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bd91ee7b2422bcb158d90ef4d14f75ef67f340943fc4149891dcce8f8b972a3" [[package]] name = "bzip2" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3a53fac24f34a81bc9954b5d6cfce0c21e18ec6959f44f56e8e90e4bb7c346c" dependencies = [ "libbz2-rs-sys", ] [[package]] name = "cab" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "171228650e6721d5acc0868a462cd864f49ac5f64e4a42cde270406e64e404d2" dependencies = [ "byteorder", "flate2", "lzxd", "time", ] [[package]] name = "camino" version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" dependencies = [ "serde_core", ] [[package]] name = "cargo-config2" version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25ada53f7339c78084fb37d7e17f34e76537541c4fbb02fa3a2baa14b8faad37" dependencies = [ "serde", "serde_derive", "toml 1.1.2+spec-1.1.0", ] [[package]] name = "cargo-cyclonedx" version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d162f67705f0f5038759d73bf546a083bf30e8677c2e944b416bca48d9d69a8" dependencies = [ "anyhow", "cargo-lock", "cargo_metadata 0.18.1", "clap", "cyclonedx-bom", "env_logger", "log", "once_cell", "pathdiff", "percent-encoding", "purl", "regex", "serde", "thiserror 2.0.18", "time", "validator", ] [[package]] name = "cargo-lock" version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06acb4f71407ba205a07cb453211e0e6a67b21904e47f6ba1f9589e38f2e454" dependencies = [ "semver", "serde", "toml 0.8.23", "url", ] [[package]] name = "cargo-options" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b916a16b2a4b0ce91d46e42c51b7fc42e754220a4cc8bbfd1947efaafea99af7" dependencies = [ "anstyle", "clap", ] [[package]] name = "cargo-platform" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" dependencies = [ "serde", ] [[package]] name = "cargo-platform" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87a0c0e6148f11f01f32650a2ea02d532b2ad4e81d8bd41e6e565b5adc5e6082" dependencies = [ "serde", "serde_core", ] [[package]] name = "cargo-xwin" version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08fe6fef95319ecc03c40127b2af811522b7918b05502ebb35b2972208993a57" dependencies = [ "anyhow", "cargo-config2", "cargo-options", "clap", "dirs", "fs-err", "humantime", "indicatif", "paste", "path-slash", "serde", "serde_json", "tar", "tracing-subscriber", "ureq", "which", "xwin", "xz2", ] [[package]] name = "cargo-zigbuild" version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfd0dbe23ae1b71e74014ba62e3262d6b2fdf76251828644823bdfd21ce5d84e" dependencies = [ "anyhow", "cargo-config2", "cargo-options", "cargo_metadata 0.23.1", "clap", "crc", "dirs", "fs-err", "goblin", "libc", "path-slash", "rustc_version", "rustflags", "scroll", "semver", "serde", "serde_json", "shell-words", "target-lexicon", "toml 1.1.2+spec-1.1.0", "which", ] [[package]] name = "cargo_metadata" version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform 0.1.9", "semver", "serde", "serde_json", "thiserror 1.0.69", ] [[package]] name = "cargo_metadata" version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef987d17b0a113becdd19d3d0022d04d7ef41f9efe4f3fb63ac44ba61df3ade9" dependencies = [ "camino", "cargo-platform 0.3.2", "semver", "serde", "serde_json", "thiserror 2.0.18", ] [[package]] name = "cbindgen" version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "befbfd072a8e81c02f8c507aefce431fe5e7d051f83d48a23ffc9b9fe5a11799" dependencies = [ "heck", "indexmap", "log", "proc-macro2", "quote", "serde", "serde_json", "syn", "tempfile", "toml 0.9.12+spec-1.1.0", ] [[package]] name = "cc" version = "1.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" dependencies = [ "find-msvc-tools", "jobserver", "libc", "shlex", ] [[package]] name = "cesu8" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] name = "cfb" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a347dcabdae9c31b0825fd6a8bed285ec9c2acb89c47827126d52fa4f59cece3" dependencies = [ "fnv", "uuid", "web-time", ] [[package]] name = "cfg-if" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "charset" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1f927b07c74ba84c7e5fe4db2baeb3e996ab2688992e39ac68ce3220a677c7e" dependencies = [ "base64", "encoding_rs", ] [[package]] name = "chumsky" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ba4a05c9ce83b07de31b31c874e87c069881ac4355db9e752e3a55c11ec75a6" dependencies = [ "hashbrown 0.15.5", "regex-automata 0.3.9", "serde", "stacker", "unicode-ident", "unicode-segmentation", ] [[package]] name = "clap" version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", ] [[package]] name = "clap_builder" version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim", "terminal_size", ] [[package]] name = "clap_complete" version = "4.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ff7a1dccbdd8b078c2bdebff47e404615151534d5043da397ec50286816f9cb" dependencies = [ "clap", ] [[package]] name = "clap_complete_command" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da8e198c052315686d36371e8a3c5778b7852fc75cc313e4e11eeb7a644a1b62" dependencies = [ "clap", "clap_complete", "clap_complete_nushell", ] [[package]] name = "clap_complete_nushell" version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbb9e9715d29a754b468591be588f6b926f5b0a1eb6a8b62acabeb66ff84d897" dependencies = [ "clap", "clap_complete", ] [[package]] name = "clap_derive" version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "clap_lex" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "cli-table" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14da8d951cef7cc4f13ccc9b744d736963d57863c7e6fc33c070ea274546082c" dependencies = [ "termcolor", "unicode-width", ] [[package]] name = "colorchoice" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "combine" version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ "bytes", "memchr", ] [[package]] name = "configparser" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e57e3272f0190c3f1584272d613719ba5fc7df7f4942fe542e63d949cf3a649b" [[package]] name = "console" version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" dependencies = [ "encode_unicode", "libc", "unicode-width", "windows-sys 0.61.2", ] [[package]] name = "const-oid" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" [[package]] name = "content_inspector" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7bda66e858c683005a53a9a60c69a4aca7eeaa45d124526e389f7aec8e62f38" dependencies = [ "memchr", ] [[package]] name = "cookie" version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" dependencies = [ "percent-encoding", "time", "version_check", ] [[package]] name = "cookie_store" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15b2c103cf610ec6cae3da84a766285b42fd16aad564758459e6ecf128c75206" dependencies = [ "cookie", "document-features", "idna", "indexmap", "log", "serde", "serde_derive", "serde_json", "time", "url", ] [[package]] name = "core-foundation" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", ] [[package]] name = "core-foundation" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ "core-foundation-sys", "libc", ] [[package]] name = "core-foundation-sys" version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "cpufeatures" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" dependencies = [ "libc", ] [[package]] name = "crc" version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" dependencies = [ "crc-catalog", ] [[package]] name = "crc-catalog" version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto-common" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", ] [[package]] name = "crypto-common" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710" dependencies = [ "hybrid-array", ] [[package]] name = "cyclonedx-bom" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3132b69ba8c13808bd2fa5748ac5b9816eb4f4e1f0bff6b7f9254a5940dcdeef" dependencies = [ "base64", "cyclonedx-bom-macros", "fluent-uri", "indexmap", "once_cell", "ordered-float", "purl", "regex", "serde", "serde_json", "spdx", "strum", "thiserror 2.0.18", "time", "uuid", "xml-rs", ] [[package]] name = "cyclonedx-bom-macros" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c50341f21df64b412b4f917e34b7aa786c092d64f3f905f478cb76950c7e980c" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "data-encoding" version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" [[package]] name = "der" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a996a108feb8b427a6e12fcf6af4aa83409b79d72c15337d7741368131ee004" dependencies = [ "pem-rfc7468", "zeroize", ] [[package]] name = "deranged" version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ "powerfmt", ] [[package]] name = "dialoguer" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25f104b501bf2364e78d0d3974cbc774f738f5865306ed128e1e0d7499c0ad96" dependencies = [ "console", "shell-words", "zeroize", ] [[package]] name = "diff" version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", "crypto-common 0.1.7", ] [[package]] name = "digest" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4850db49bf08e663084f7fb5c87d202ef91a3907271aff24a94eb97ff039153c" dependencies = [ "block-buffer 0.12.0", "const-oid", "crypto-common 0.2.1", ] [[package]] name = "dirs" version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" dependencies = [ "dirs-sys", ] [[package]] name = "dirs-sys" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ "libc", "option-ext", "redox_users", "windows-sys 0.61.2", ] [[package]] name = "displaydoc" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "dissimilar" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aeda16ab4059c5fd2a83f2b9c9e9c981327b18aa8e3b313f7e6563799d4f093e" [[package]] name = "document-features" version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" dependencies = [ "litrs", ] [[package]] name = "dunce" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dyn-clone" version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "encode_unicode" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] [[package]] name = "env_logger" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ "humantime", "is-terminal", "log", "regex", "termcolor", ] [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", "windows-sys 0.61.2", ] [[package]] name = "expect-test" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63af43ff4431e848fb47472a920f14fa71c24de13255a5692e93d4e90302acb0" dependencies = [ "dissimilar", "once_cell", ] [[package]] name = "fastrand" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "fat-macho" version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a64465b99fa411ca36a47048e9b1deec20f609b072711e3949e6d135403ea16d" dependencies = [ "goblin", ] [[package]] name = "filetime" version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" dependencies = [ "cfg-if", "libc", "libredox", ] [[package]] name = "find-msvc-tools" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "flate2" version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", "zlib-rs", ] [[package]] name = "fluent-uri" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc74ac4d8359ae70623506d512209619e5cf8f347124910440dbc221714b328e" dependencies = [ "borrow-or-share", "ref-cast", "serde", ] [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "foldhash" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "foreign-types" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ "foreign-types-shared", ] [[package]] name = "foreign-types-shared" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] [[package]] name = "fs-err" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73fde052dbfc920003cfd2c8e2c6e6d4cc7c1091538c3a24226cec0665ab08c0" dependencies = [ "autocfg", ] [[package]] name = "fs4" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8640e34b88f7652208ce9e88b1a37a2ae95227d84abec377ccd3c5cfeb141ed4" dependencies = [ "fs-err", "rustix", "windows-sys 0.59.0", ] [[package]] name = "futures-core" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-macro" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "futures-task" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-timer" version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-core", "futures-macro", "futures-task", "pin-project-lite", "slab", ] [[package]] name = "generic-array" version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", ] [[package]] name = "getrandom" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "libc", "wasi", ] [[package]] name = "getrandom" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", "r-efi 5.3.0", "wasip2", ] [[package]] name = "getrandom" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi 6.0.0", "wasip2", "wasip3", "wasm-bindgen", ] [[package]] name = "glob" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "globset" version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" dependencies = [ "aho-corasick", "bstr", "log", "regex-automata 0.4.14", "regex-syntax 0.8.10", ] [[package]] name = "goblin" version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "983a6aafb3b12d4c41ea78d39e189af4298ce747353945ff5105b54a056e5cd9" dependencies = [ "log", "plain", "scroll", ] [[package]] name = "hashbrown" version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", "foldhash 0.1.5", ] [[package]] name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ "foldhash 0.2.0", ] [[package]] name = "hashbrown" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "http" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", "itoa", ] [[package]] name = "httparse" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "humantime" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "humantime-serde" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c" dependencies = [ "humantime", "serde", ] [[package]] name = "hybrid-array" version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3944cf8cf766b40e2a1a333ee5e9b563f854d5fa49d6a8ca2764e97c6eddb214" dependencies = [ "typenum", ] [[package]] name = "icu_collections" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", "utf8_iter", "yoke", "zerofrom", "zerovec", ] [[package]] name = "icu_locale_core" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", "tinystr", "writeable", "zerovec", ] [[package]] name = "icu_normalizer" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", "icu_properties", "icu_provider", "smallvec", "zerovec", ] [[package]] name = "icu_normalizer_data" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", "writeable", "yoke", "zerofrom", "zerotrie", "zerovec", ] [[package]] name = "id-arena" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" [[package]] name = "idna" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", "utf8_iter", ] [[package]] name = "idna_adapter" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", ] [[package]] name = "ignore" version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a" dependencies = [ "crossbeam-deque", "globset", "log", "memchr", "regex-automata 0.4.14", "same-file", "walkdir", "winapi-util", ] [[package]] name = "indexmap" version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", "hashbrown 0.17.0", "serde", "serde_core", ] [[package]] name = "indicatif" version = "0.18.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" dependencies = [ "console", "portable-atomic", "unicode-width", "unit-prefix", "web-time", ] [[package]] name = "indoc" version = "2.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" dependencies = [ "rustversion", ] [[package]] name = "insta" version = "1.47.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b4a6248eb93a4401ed2f37dfe8ea592d3cf05b7cf4f8efa867b6895af7e094e" dependencies = [ "console", "once_cell", "similar", "tempfile", ] [[package]] name = "is-terminal" version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", "windows-sys 0.61.2", ] [[package]] name = "is_terminal_polyfill" version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] [[package]] name = "itertools" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] [[package]] name = "itoa" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jni" version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ "cesu8", "cfg-if", "combine", "jni-sys 0.3.1", "log", "thiserror 1.0.69", "walkdir", "windows-sys 0.45.0", ] [[package]] name = "jni-sys" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" dependencies = [ "jni-sys 0.4.1", ] [[package]] name = "jni-sys" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" dependencies = [ "jni-sys-macros", ] [[package]] name = "jni-sys-macros" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" dependencies = [ "quote", "syn", ] [[package]] name = "jobserver" version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ "getrandom 0.3.4", "libc", ] [[package]] name = "js-sys" version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" dependencies = [ "once_cell", "wasm-bindgen", ] [[package]] name = "keyring" version = "3.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eebcc3aff044e5944a8fbaf69eb277d11986064cba30c468730e8b9909fb551c" dependencies = [ "byteorder", "linux-keyutils", "log", "security-framework 2.11.1", "security-framework 3.7.0", "windows-sys 0.60.2", "zeroize", ] [[package]] name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lddtree" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39f71c5bd42adf4ee8e6b24da58c1f00a2817d27f618b169399f5adbf9e74492" dependencies = [ "fs-err", "glob", "goblin", "memmap2", ] [[package]] name = "leb128fmt" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libbz2-rs-sys" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3a6a8c165077efc8f3a971534c50ea6a1a18b329ef4a66e897a7e3a1494565f" [[package]] name = "libc" version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libmimalloc-sys" version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc89deee4af0429081d2a518c0431ae068222a5a262a3bc6ff4d8535ec2e02fe" dependencies = [ "cc", ] [[package]] name = "libredox" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" dependencies = [ "bitflags", "libc", "plain", "redox_syscall 0.7.4", ] [[package]] name = "linux-keyutils" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83270a18e9f90d0707c41e9f35efada77b64c0e6f3f1810e71c8368a864d5590" dependencies = [ "bitflags", "libc", ] [[package]] name = "linux-raw-sys" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "litrs" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] name = "lock_api" version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ "scopeguard", ] [[package]] name = "log" version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "lzma-rust2" version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1c46f3fcd2e888afdb01a07efc071cb21300e07c68d32c3e8b01b5c8cb1fcaa" dependencies = [ "sha2 0.11.0", ] [[package]] name = "lzma-sys" version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" dependencies = [ "cc", "libc", "pkg-config", ] [[package]] name = "lzxd" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b29dffab797218e12e4df08ef5d15ab9efca2504038b1b32b9b32fc844b39c9" [[package]] name = "mailparse" version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "068d4f5d1083883b9e626051dc5bdaa321f5be01093e61ade3ee3ab44dafeadd" dependencies = [ "charset", "data-encoding", "quoted_printable", ] [[package]] name = "matchers" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ "regex-automata 0.4.14", ] [[package]] name = "maturin" version = "1.16.0" dependencies = [ "anyhow", "arwen", "arwen-codesign", "base64", "bytesize", "cargo-config2", "cargo-cyclonedx", "cargo-options", "cargo-xwin", "cargo-zigbuild", "cargo_metadata 0.23.1", "cbindgen", "cc", "clap", "clap_complete_command", "configparser", "console", "dialoguer", "dirs", "dunce", "expect-test", "fat-macho", "flate2", "fs-err", "fs4", "glob", "goblin", "ignore", "indexmap", "indoc", "insta", "itertools 0.14.0", "keyring", "lddtree", "memmap2", "minijinja", "native-tls", "nix", "normpath", "once_cell", "path-slash", "pep440_rs", "pep508_rs", "platform-info", "pretty_assertions", "pyo3-introspection", "pyproject-toml", "python-pkginfo", "reflink-copy", "regex", "rstest", "rustc_version", "rustflags", "rustls", "rustls-pki-types", "rustversion", "same-file", "schemars", "semver", "serde", "serde_json", "serial_test", "sha2 0.11.0", "tar", "target-lexicon", "tempfile", "textwrap", "thiserror 2.0.18", "time", "toml 1.1.2+spec-1.1.0", "toml_edit 0.25.11+spec-1.1.0", "tracing", "tracing-subscriber", "trycmd", "unicode-xid", "ureq", "url", "walkdir", "which", "wild", "xz2", "zip 9.1.3", ] [[package]] name = "memchr" version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "memmap2" version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" dependencies = [ "libc", ] [[package]] name = "memo-map" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38d1115007560874e373613744c6fba374c17688327a71c1476d1a5954cc857b" [[package]] name = "mimalloc" version = "0.1.49" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aca3c01a711f395b4257b81674c0e90e8dd1f1e62c4b7db45f684cc7a4fcb18a" dependencies = [ "libmimalloc-sys", ] [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" dependencies = [ "mime", "unicase", ] [[package]] name = "minijinja" version = "2.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "805bfd7352166bae857ee569628b52bcd85a1cecf7810861ebceb1686b72b75d" dependencies = [ "memo-map", "serde", ] [[package]] name = "miniz_oxide" version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", "simd-adler32", ] [[package]] name = "msi" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0325f8473ef1f5c38ee42345e2cd1678299cbbfa169d1776654a2a682867420" dependencies = [ "byteorder", "cfb", "encoding_rs", "uuid", ] [[package]] name = "native-tls" version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" dependencies = [ "libc", "log", "openssl", "openssl-probe", "openssl-sys", "schannel", "security-framework 3.7.0", "security-framework-sys", "tempfile", ] [[package]] name = "nix" version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" dependencies = [ "bitflags", "cfg-if", "cfg_aliases", "libc", ] [[package]] name = "nom" version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" dependencies = [ "memchr", ] [[package]] name = "normalize-line-endings" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" [[package]] name = "normpath" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf23ab2b905654b4cb177e30b629937b3868311d4e1cba859f899c041046e69b" dependencies = [ "windows-sys 0.61.2", ] [[package]] name = "nu-ansi-term" version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ "windows-sys 0.61.2", ] [[package]] name = "num-conv" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] name = "num-traits" version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "object" version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] [[package]] name = "object" version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271638cd5fa9cca89c4c304675ca658efc4e64a66c716b7cfe1afb4b9611dbbc" dependencies = [ "crc32fast", "flate2", "hashbrown 0.16.1", "indexmap", "memchr", "ruzstd", ] [[package]] name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "openssl" version = "0.10.80" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a45fa2aa886c42762255da344f0a0d313e254066c46aad76f300c3d3da62d967" dependencies = [ "bitflags", "cfg-if", "foreign-types", "libc", "openssl-macros", "openssl-sys", ] [[package]] name = "openssl-macros" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "openssl-probe" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" version = "0.9.116" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f28a22dc7140cda5f096e5e7724a6962ca81a7f8bfd2979f9b18c11af56318c4" dependencies = [ "cc", "libc", "pkg-config", "vcpkg", ] [[package]] name = "option-ext" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ordered-float" version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" dependencies = [ "num-traits", ] [[package]] name = "os_pipe" version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" dependencies = [ "libc", "windows-sys 0.61.2", ] [[package]] name = "parking_lot" version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall 0.5.18", "smallvec", "windows-link", ] [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "path-slash" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" [[package]] name = "pathdiff" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" dependencies = [ "camino", ] [[package]] name = "pem-rfc7468" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6305423e0e7738146434843d1694d621cce767262b2a86910beab705e4493d9" dependencies = [ "base64ct", ] [[package]] name = "pep440_rs" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31095ca1f396e3de32745f42b20deef7bc09077f918b085307e8eab6ddd8fb9c" dependencies = [ "once_cell", "serde", "tracing", "unicode-width", "unscanny", "version-ranges", ] [[package]] name = "pep508_rs" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faee7227064121fcadcd2ff788ea26f0d8f2bd23a0574da11eca23bc935bcc05" dependencies = [ "boxcar", "indexmap", "itertools 0.13.0", "once_cell", "pep440_rs", "regex", "rustc-hash", "serde", "smallvec", "thiserror 1.0.69", "tracing", "unicode-width", "url", "urlencoding", "version-ranges", ] [[package]] name = "percent-encoding" version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "phf" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ "phf_macros", "phf_shared", ] [[package]] name = "phf_generator" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared", "rand", ] [[package]] name = "phf_macros" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" dependencies = [ "phf_generator", "phf_shared", "proc-macro2", "quote", "syn", "unicase", ] [[package]] name = "phf_shared" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ "siphasher", "unicase", ] [[package]] name = "pin-project-lite" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pkg-config" version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] name = "plain" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "platform-info" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9368d62437c8cbb7c31ee37fd8c08a7d390e09a3ff75698a674953f46705ffcb" dependencies = [ "libc", "windows-sys 0.59.0", ] [[package]] name = "portable-atomic" version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "potential_utf" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] [[package]] name = "powerfmt" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "pretty_assertions" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" dependencies = [ "diff", "yansi", ] [[package]] name = "prettyplease" version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", "syn", ] [[package]] name = "proc-macro-crate" version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ "toml_edit 0.25.11+spec-1.1.0", ] [[package]] name = "proc-macro2" version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "psm" version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3852766467df634d74f0b2d7819bf8dc483a0eb2e3b0f50f756f9cfe8b0d18d8" dependencies = [ "ar_archive_writer", "cc", ] [[package]] name = "purl" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60ebe4262ae91ddd28c8721111a0a6e9e58860e211fc92116c4bb85c98fd96ad" dependencies = [ "hex", "percent-encoding", "phf", "thiserror 2.0.18", "unicase", ] [[package]] name = "pyo3-introspection" version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b2ac30f128e6ab4ca1c464d6eabd30c84c7adc5955c3bb2eb7d203ea24ebd18" dependencies = [ "anyhow", "goblin", "serde", "serde_json", ] [[package]] name = "pyproject-toml" version = "0.13.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6d755483ad14b49e76713b52285235461a5b4f73f17612353e11a5de36a5fd2" dependencies = [ "glob", "indexmap", "pep440_rs", "pep508_rs", "serde", "thiserror 2.0.18", "toml 0.9.12+spec-1.1.0", ] [[package]] name = "python-pkginfo" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f01c29e3af9f28f5cfee9bcd599d8031b8cba40eced8a9ae7aa2d2e5b735c" dependencies = [ "flate2", "fs-err", "mailparse", "rfc2047-decoder", "tar", "thiserror 2.0.18", "zip 9.1.3", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "quoted_printable" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "478e0585659a122aa407eb7e3c0e1fa51b1d8a870038bd29f0cf4a8551eea972" [[package]] name = "r-efi" version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "r-efi" version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "rand_core", ] [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" [[package]] name = "rayon" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", ] [[package]] name = "rayon-core" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", ] [[package]] name = "redox_syscall" version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags", ] [[package]] name = "redox_syscall" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" dependencies = [ "bitflags", ] [[package]] name = "redox_users" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.17", "libredox", "thiserror 2.0.18", ] [[package]] name = "ref-cast" version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "reflink-copy" version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13362233b147e57674c37b802d216b7c5e3dcccbed8967c84f0d8d223868ae27" dependencies = [ "cfg-if", "libc", "rustix", "windows", ] [[package]] name = "regex" version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", "regex-automata 0.4.14", "regex-syntax 0.8.10", ] [[package]] name = "regex-automata" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" dependencies = [ "aho-corasick", "memchr", "regex-syntax 0.7.5", ] [[package]] name = "regex-automata" version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", "regex-syntax 0.8.10", ] [[package]] name = "regex-syntax" version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "regex-syntax" version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "relative-path" version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "rfc2047-decoder" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "504ea008279c473dfeafce327fa26bf8825463cfcc06ef82f866187e81334d16" dependencies = [ "base64", "charset", "chumsky", "memchr", "quoted_printable", "thiserror 2.0.18", ] [[package]] name = "ring" version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", ] [[package]] name = "rstest" version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5a3193c063baaa2a95a33f03035c8a72b83d97a54916055ba22d35ed3839d49" dependencies = [ "futures-timer", "futures-util", "rstest_macros", ] [[package]] name = "rstest_macros" version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c845311f0ff7951c5506121a9ad75aec44d083c31583b2ea5a30bcb0b0abba0" dependencies = [ "cfg-if", "glob", "proc-macro-crate", "proc-macro2", "quote", "regex", "relative-path", "rustc_version", "syn", "unicode-ident", ] [[package]] name = "rustc-hash" version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustc_version" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "rustflags" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a39e0e9135d7a7208ee80aa4e3e4b88f0f5ad7be92153ed70686c38a03db2e63" [[package]] name = "rustix" version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", "windows-sys 0.61.2", ] [[package]] name = "rustls" version = "0.23.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48e13bd8c0e9365c43cfa5c9e8f9ad49d3c8444926c9aac819e0e4dc503c8fdf" dependencies = [ "log", "once_cell", "ring", "rustls-pki-types", "rustls-webpki", "subtle", "zeroize", ] [[package]] name = "rustls-native-certs" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", "security-framework 3.7.0", ] [[package]] name = "rustls-pki-types" version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" dependencies = [ "zeroize", ] [[package]] name = "rustls-platform-verifier" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" dependencies = [ "core-foundation 0.10.1", "core-foundation-sys", "jni", "log", "once_cell", "rustls", "rustls-native-certs", "rustls-platform-verifier-android", "rustls-webpki", "security-framework 3.7.0", "security-framework-sys", "webpki-root-certs", "windows-sys 0.61.2", ] [[package]] name = "rustls-platform-verifier-android" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" version = "0.103.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4443b1b6d39d7c663139942cc4558262562d2c84123bb6282ef177009ca8b281" dependencies = [ "ring", "rustls-pki-types", "untrusted", ] [[package]] name = "rustversion" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ruzstd" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ff0cc5e135c8870a775d3320910cd9b564ec036b4dc0b8741629020be63f01" dependencies = [ "twox-hash", ] [[package]] name = "same-file" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ "winapi-util", ] [[package]] name = "scc" version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc" dependencies = [ "sdd", ] [[package]] name = "schannel" version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ "windows-sys 0.61.2", ] [[package]] name = "schemars" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" dependencies = [ "dyn-clone", "ref-cast", "schemars_derive", "serde", "serde_json", ] [[package]] name = "schemars_derive" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", "syn", ] [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scroll" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1257cd4248b4132760d6524d6dda4e053bc648c9070b960929bf50cfb1e7add" dependencies = [ "scroll_derive", ] [[package]] name = "scroll_derive" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed76efe62313ab6610570951494bdaa81568026e0318eaa55f167de70eeea67d" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "sdd" version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" [[package]] name = "security-framework" version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags", "core-foundation 0.9.4", "core-foundation-sys", "libc", "security-framework-sys", ] [[package]] name = "security-framework" version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ "bitflags", "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", ] [[package]] name = "security-framework-sys" version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", ] [[package]] name = "semver" version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" dependencies = [ "serde", "serde_core", ] [[package]] name = "serde" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", ] [[package]] name = "serde_core" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_derive_internals" version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_json" version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "itoa", "memchr", "serde", "serde_core", "zmij", ] [[package]] name = "serde_spanned" version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] [[package]] name = "serde_spanned" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ "serde_core", ] [[package]] name = "serial_test" version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "911bd979bf1070a3f3aa7b691a3b3e9968f339ceeec89e08c280a8a22207a32f" dependencies = [ "once_cell", "parking_lot", "scc", "serial_test_derive", ] [[package]] name = "serial_test_derive" version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a7d91949b85b0d2fb687445e448b40d322b6b3e4af6b44a29b21d9a5f33e6d9" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "sha2" version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures 0.2.17", "digest 0.10.7", ] [[package]] name = "sha2" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", "cpufeatures 0.3.0", "digest 0.11.2", ] [[package]] name = "sharded-slab" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] [[package]] name = "shell-words" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "simd-adler32" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "similar" version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" [[package]] name = "siphasher" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" [[package]] name = "slab" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "smawk" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" [[package]] name = "snapbox" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f92ac911648d788a6435401d9b4803959039d4de9919fdabdb415a8bebd027be" dependencies = [ "anstream", "anstyle", "content_inspector", "dunce", "filetime", "libc", "normalize-line-endings", "os_pipe", "similar", "snapbox-macros", "tempfile", "wait-timeout", "walkdir", "windows-sys 0.61.2", ] [[package]] name = "snapbox-macros" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed4a172e483585ebbc7c7f7d1705ca7e3f94f606ed78caa14805673189fd5455" dependencies = [ "anstream", ] [[package]] name = "socks" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0c3dbbd9ae980613c6dd8e28a9407b50509d3803b57624d5dfe8315218cd58b" dependencies = [ "byteorder", "libc", "winapi", ] [[package]] name = "spdx" version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8da593e30beb790fc9424502eb898320b44e5eb30367dbda1c1edde8e2f32d7" dependencies = [ "smallvec", ] [[package]] name = "stable_deref_trait" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "stacker" version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d74a23609d509411d10e2176dc2a4346e3b4aea2e7b1869f19fdedbc71c013" dependencies = [ "cc", "cfg-if", "libc", "psm", "windows-sys 0.59.0", ] [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "subtle" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "synstructure" version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "tar" version = "0.4.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840" dependencies = [ "filetime", "libc", "xattr", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "tempfile" version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", "getrandom 0.4.2", "once_cell", "rustix", "windows-sys 0.61.2", ] [[package]] name = "termcolor" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "terminal_size" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874" dependencies = [ "rustix", "windows-sys 0.61.2", ] [[package]] name = "textwrap" version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" dependencies = [ "smawk", "unicode-linebreak", "unicode-width", ] [[package]] name = "thiserror" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl 1.0.69", ] [[package]] name = "thiserror" version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ "thiserror-impl 2.0.18", ] [[package]] name = "thiserror-impl" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "thiserror-impl" version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "thread_local" version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", ] [[package]] name = "time" version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", "js-sys", "num-conv", "powerfmt", "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", ] [[package]] name = "tinystr" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", ] [[package]] name = "toml" version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", "toml_edit 0.22.27", ] [[package]] name = "toml" version = "0.9.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" dependencies = [ "indexmap", "serde_core", "serde_spanned 1.1.1", "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "toml_writer", "winnow 0.7.15", ] [[package]] name = "toml" version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" dependencies = [ "indexmap", "serde_core", "serde_spanned 1.1.1", "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", "toml_writer", "winnow 1.0.1", ] [[package]] name = "toml_datetime" version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] [[package]] name = "toml_datetime" version = "0.7.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" dependencies = [ "serde_core", ] [[package]] name = "toml_datetime" version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", "toml_write", "winnow 0.7.15", ] [[package]] name = "toml_edit" version = "0.25.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" dependencies = [ "indexmap", "serde_core", "serde_spanned 1.1.1", "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", "toml_writer", "winnow 1.0.1", ] [[package]] name = "toml_parser" version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ "winnow 1.0.1", ] [[package]] name = "toml_write" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "toml_writer" version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" [[package]] name = "tracing" version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "pin-project-lite", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "tracing-core" version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", ] [[package]] name = "tracing-log" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ "log", "once_cell", "tracing-core", ] [[package]] name = "tracing-serde" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" dependencies = [ "serde", "tracing-core", ] [[package]] name = "tracing-subscriber" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "matchers", "nu-ansi-term", "once_cell", "regex-automata 0.4.14", "serde", "serde_json", "sharded-slab", "smallvec", "thread_local", "tracing", "tracing-core", "tracing-log", "tracing-serde", ] [[package]] name = "trycmd" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "218889993f76bda9b2ef57c12c3cab0eef4fd54ec7b36d1704849867f69e7bb4" dependencies = [ "anstream", "automod", "glob", "humantime", "humantime-serde", "rayon", "serde", "shlex", "snapbox", "toml_edit 0.25.11+spec-1.1.0", ] [[package]] name = "twox-hash" version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" [[package]] name = "typed-path" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" [[package]] name = "typed-path" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce898823d8cd0f028662d2f349694b1af0a5cc9be83f1d213a00d3147445e1e" [[package]] name = "typenum" version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "unicase" version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-linebreak" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" [[package]] name = "unicode-segmentation" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" [[package]] name = "unicode-width" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "unicode-xid" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "unit-prefix" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" [[package]] name = "unscanny" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9df2af067a7953e9c3831320f35c1cc0600c30d44d9f7a12b01db1cd88d6b47" [[package]] name = "untrusted" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" dependencies = [ "base64", "cookie_store", "der", "flate2", "getrandom 0.4.2", "log", "mime_guess", "native-tls", "percent-encoding", "rustls", "rustls-pki-types", "rustls-platform-verifier", "serde", "serde_json", "socks", "ureq-proto", "utf8-zero", "webpki-root-certs", "webpki-roots", ] [[package]] name = "ureq-proto" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" dependencies = [ "base64", "http", "httparse", "log", ] [[package]] name = "url" version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", "percent-encoding", "serde", "serde_derive", ] [[package]] name = "urlencoding" version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "utf8-zero" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" [[package]] name = "utf8_iter" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "utf8parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" dependencies = [ "getrandom 0.4.2", "js-sys", "wasm-bindgen", ] [[package]] name = "validator" version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0b4a29d8709210980a09379f27ee31549b73292c87ab9899beee1c0d3be6303" dependencies = [ "idna", "once_cell", "regex", "serde", "serde_derive", "serde_json", "url", ] [[package]] name = "valuable" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "vcpkg" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version-ranges" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31e9bd4e9c9ff6a2a9b5969462ba26216af3e010df0377dad8320ab515262ef8" dependencies = [ "smallvec", ] [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "versions" version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80a7e511ce1795821207a837b7b1c8d8aca0c648810966ad200446ae58f6667f" dependencies = [ "itertools 0.14.0", "nom", ] [[package]] name = "wait-timeout" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" dependencies = [ "libc", ] [[package]] name = "walkdir" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", ] [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ "wit-bindgen 0.57.1", ] [[package]] name = "wasip3" version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ "wit-bindgen 0.51.0", ] [[package]] name = "wasm-bindgen" version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" dependencies = [ "bumpalo", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-encoder" version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" dependencies = [ "leb128fmt", "wasmparser", ] [[package]] name = "wasm-metadata" version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" dependencies = [ "anyhow", "indexmap", "wasm-encoder", "wasmparser", ] [[package]] name = "wasmparser" version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ "bitflags", "hashbrown 0.15.5", "indexmap", "semver", ] [[package]] name = "web-time" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] name = "webpki-root-certs" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58ec80e73fd8baf57bf0d9615554c75348bda990d6d5bbeab964dd068319fecb" dependencies = [ "rustls-pki-types", ] [[package]] name = "webpki-roots" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c1c8e20c8a38fc7d65abfe74eb7280e4aa667e8eec8bc84996d2874810748d9" dependencies = [ "rustls-pki-types", ] [[package]] name = "which" version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81995fafaaaf6ae47a7d0cc83c67caf92aeb7e5331650ae6ff856f7c0c60c459" dependencies = [ "libc", ] [[package]] name = "wild" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3131afc8c575281e1e80f36ed6a092aa502c08b18ed7524e86fbbb12bb410e1" dependencies = [ "glob", ] [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ "windows-sys 0.61.2", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" dependencies = [ "windows-collections", "windows-core", "windows-future", "windows-numerics", ] [[package]] name = "windows-collections" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" dependencies = [ "windows-core", ] [[package]] name = "windows-core" version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", "windows-link", "windows-result", "windows-strings", ] [[package]] name = "windows-future" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" dependencies = [ "windows-core", "windows-link", "windows-threading", ] [[package]] name = "windows-implement" version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "windows-interface" version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-numerics" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" dependencies = [ "windows-core", "windows-link", ] [[package]] name = "windows-result" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ "windows-link", ] [[package]] name = "windows-strings" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ "windows-link", ] [[package]] name = "windows-sys" version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ "windows-targets 0.42.2", ] [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets 0.52.6", ] [[package]] name = "windows-sys" version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ "windows-targets 0.52.6", ] [[package]] name = "windows-sys" version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ "windows-targets 0.53.5", ] [[package]] name = "windows-sys" version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ "windows-link", ] [[package]] name = "windows-targets" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" dependencies = [ "windows_aarch64_gnullvm 0.42.2", "windows_aarch64_msvc 0.42.2", "windows_i686_gnu 0.42.2", "windows_i686_msvc 0.42.2", "windows_x86_64_gnu 0.42.2", "windows_x86_64_gnullvm 0.42.2", "windows_x86_64_msvc 0.42.2", ] [[package]] name = "windows-targets" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] [[package]] name = "windows-targets" version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ "windows-link", "windows_aarch64_gnullvm 0.53.1", "windows_aarch64_msvc 0.53.1", "windows_i686_gnu 0.53.1", "windows_i686_gnullvm 0.53.1", "windows_i686_msvc 0.53.1", "windows_x86_64_gnu 0.53.1", "windows_x86_64_gnullvm 0.53.1", "windows_x86_64_msvc 0.53.1", ] [[package]] name = "windows-threading" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" dependencies = [ "windows-link", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" dependencies = [ "memchr", ] [[package]] name = "winnow" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen" version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" dependencies = [ "wit-bindgen-rust-macro", ] [[package]] name = "wit-bindgen" version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] name = "wit-bindgen-core" version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" dependencies = [ "anyhow", "heck", "wit-parser", ] [[package]] name = "wit-bindgen-rust" version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" dependencies = [ "anyhow", "heck", "indexmap", "prettyplease", "syn", "wasm-metadata", "wit-bindgen-core", "wit-component", ] [[package]] name = "wit-bindgen-rust-macro" version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" dependencies = [ "anyhow", "prettyplease", "proc-macro2", "quote", "syn", "wit-bindgen-core", "wit-bindgen-rust", ] [[package]] name = "wit-component" version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", "bitflags", "indexmap", "log", "serde", "serde_derive", "serde_json", "wasm-encoder", "wasm-metadata", "wasmparser", "wit-parser", ] [[package]] name = "wit-parser" version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" dependencies = [ "anyhow", "id-arena", "indexmap", "log", "semver", "serde", "serde_derive", "serde_json", "unicode-xid", "wasmparser", ] [[package]] name = "writeable" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "xattr" version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", "rustix", ] [[package]] name = "xml-rs" version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" [[package]] name = "xwin" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3ae2ef8d627ac8d97b3aeb67e4b711520154edca5cc80fbec551415c7b671ef" dependencies = [ "anyhow", "bytes", "cab", "camino", "clap", "cli-table", "crossbeam-channel", "indicatif", "memchr", "mimalloc", "msi", "parking_lot", "rayon", "regex", "serde", "serde_json", "sha2 0.11.0", "tempfile", "toml 1.1.2+spec-1.1.0", "tracing", "tracing-subscriber", "twox-hash", "ureq", "versions", "walkdir", "zip 8.6.0", ] [[package]] name = "xz2" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" dependencies = [ "lzma-sys", ] [[package]] name = "yansi" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yoke" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", "zerofrom", ] [[package]] name = "yoke-derive" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", "syn", "synstructure", ] [[package]] name = "zerofrom" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", "syn", "synstructure", ] [[package]] name = "zeroize" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zerotrie" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", "zerofrom", ] [[package]] name = "zerovec" version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", "zerovec-derive", ] [[package]] name = "zerovec-derive" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "zip" version = "8.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d04a6b5381502aa6087c94c669499eb1602eb9c5e8198e534de571f7154809b" dependencies = [ "crc32fast", "flate2", "indexmap", "memchr", "typed-path 0.12.3", ] [[package]] name = "zip" version = "9.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1156b39d142a34b999c2310a50455e0cb3760bf7efad0122f796d813bee26ccb" dependencies = [ "bzip2", "crc32fast", "flate2", "getrandom 0.4.2", "indexmap", "lzma-rust2", "memchr", "nix", "time", "typed-path 0.13.0", "windows-sys 0.61.2", "zopfli", "zstd", ] [[package]] name = "zlib-rs" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" [[package]] name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" [[package]] name = "zopfli" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" dependencies = [ "bumpalo", "crc32fast", "log", "simd-adler32", ] [[package]] name = "zstd" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db3ae9bf90af6e40197bef767eeefc46ad6397420fe873830bd85e5fbbfb3c70" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded520f16b29e1a9b771c722221b2b0a0398c2316d9bb3c42b458a5414d7434b" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" version = "2.1.2+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "481ada9c543b2323cbb7bbdbb5249177fbf0188ed959ed2c15e4b22421c84ed3" dependencies = [ "cc", "pkg-config", ] maturin-1.16.0/Cargo.toml000066400000000000000000000141551527064705700152310ustar00rootroot00000000000000[package] authors = ["konstin ", "messense "] name = "maturin" version = "1.16.0" description = "Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages" exclude = [ "test-crates/**/*", "sysconfig/*", "test-data/*", "ci/*", "tests/*", "guide/*", ".github/*", ".devcontainer/*", "Dockerfile", ".dockerignore", "deny.toml", "noxfile.py", "test-dockerfile.sh", "Code-of-Conduct.md", ] homepage = "https://github.com/pyo3/maturin" readme = "README.md" repository = "https://github.com/pyo3/maturin" license = "MIT OR Apache-2.0" keywords = ["python", "cffi", "packaging", "pypi", "pyo3"] categories = [ "api-bindings", "development-tools::ffi", "command-line-utilities", ] edition = "2024" rust-version = "1.89" [[bin]] name = "maturin" [lib] name = "maturin" [dependencies] anyhow = "1.0.80" base64 = "0.22.0" glob = "0.3.0" cargo-config2 = "0.1.24" cargo_metadata = "0.23.1" cargo-options = "0.8.1" cbindgen = { version = "0.29.0", default-features = false } flate2 = "1.0.18" goblin = "0.10.0" platform-info = "2.0.2" regex = "1.7.0" rustflags = "0.1.6" serde = { version = "1.0.197", features = ["derive"] } serde_json = "1.0.114" sha2 = "0.11.0" tar = "0.4.46" tempfile = "3.2.0" toml = "1.1.2" toml_edit = "0.25.0" zip = { version = "9.1.3", default-features = false, features = [ "bzip2", "deflate", "time", "zstd", "lzma", ] } thiserror = "2.0.3" fs-err = "3.0.0" fat-macho = { version = "0.4.10", default-features = false } once_cell = "1.7.2" rustc_version = "0.4.0" semver = "1.0.22" target-lexicon = "0.13.3" indexmap = "2.2.3" pyproject-toml = { version = "0.13.5", features = ["pep639-glob"] } pyo3-introspection = "0.30" python-pkginfo = "0.7.0" textwrap = "0.16.1" ignore = "0.4.20" itertools = "0.14.0" lddtree = "0.5.0" cc = "1.0.88" dunce = "1.0.2" normpath = "1.1.1" path-slash = "0.2.1" pep440_rs = { version = "0.7.3", features = ["tracing"] } pep508_rs = { version = "0.9.2", features = ["tracing"] } same-file = "1.0.6" time = "0.3.17" url = "2.5.0" unicode-xid = { version = "0.2.4", optional = true } # cli clap = { version = "4.0.0", features = [ "derive", "env", "wrap_help", "unstable-styles", ] } clap_complete_command = { version = "0.6.1", optional = true } # cross compile cargo-zigbuild = { version = "0.24.0", default-features = false, optional = true } cargo-xwin = { version = "0.23.1", default-features = false, optional = true } xz2 = { version = "0.1", optional = true } # log tracing = "0.1.36" tracing-subscriber = { version = "0.3.20", features = ["env-filter"] } walkdir = "2.5.0" # project scaffolding, maturin new/init/generate-ci dialoguer = { version = "0.12.0", default-features = false, optional = true } console = { version = "0.16.0", optional = true } minijinja = { version = "2.5.0", optional = true } # upload bytesize = { version = "2.2.0", optional = true } configparser = { version = "3.0.3", optional = true } dirs = { version = "6.0.0", optional = true } ureq = { version = "3.2.0", features = [ "gzip", "json", "socks-proxy", "multipart", ], default-features = false, optional = true } native-tls = { version = "0.2.8", optional = true } rustls = { version = "0.23", default-features = false, features = [ "logging", "std", "tls12", ], optional = true } rustls-pki-types = { version = "1.14.0", optional = true } keyring = { version = "3.6.3", default-features = false, features = [ "apple-native", "windows-native", "linux-native", ], optional = true } wild = { version = "2.1.0", optional = true } # JSON schema schemars = { version = "1.0.4", optional = true } # SBOM cargo-cyclonedx = { version = "=0.5.9", optional = true } pretty_assertions = { version = "1.3.0", optional = true } which = { version = "8.0.0", optional = true } memmap2 = "0.9.9" reflink-copy = "0.1.29" # auditwheel repair (macOS delocate) arwen = { version = "0.0.5", optional = true } [dev-dependencies] expect-test = "1.4.1" fs4 = { version = "0.13.1", features = ["fs-err3"] } indoc = "2.0.3" nix = { version = "0.31.1", default-features = false, features = ["user"] } insta = "1.34.0" pretty_assertions = "1.3.0" rstest = "0.26.1" rustversion = "1.0.9" serial_test = { version = "3.2.0", default-features = false } time = { version = "0.3.34", features = ["macros"] } trycmd = "1.2.0" which = "8.0.0" [features] default = ["full", "rustls"] full = ["cli-completion", "cross-compile", "scaffolding", "upload", "sbom", "auditwheel"] auditwheel = ["dep:arwen", "dep:arwen-codesign"] cli-completion = ["dep:clap_complete_command"] upload = [ "ureq", "configparser", "bytesize", "dialoguer/password", "wild", "dep:dirs", ] schemars = ["dep:schemars", "dep:pretty_assertions"] sbom = ["dep:cargo-cyclonedx", "dep:which"] # we only enable keyring's native macOS/Windows/Linux backends (no BSD backend), # so it's not enabled in `full` by default password-storage = ["upload", "keyring"] rustls = [ "dep:rustls", "ureq?/rustls", "cargo-xwin?/rustls-tls", "dep:rustls-pki-types", ] native-tls = [ "dep:native-tls", "ureq?/native-tls", "cargo-xwin?/native-tls", "dep:rustls-pki-types", ] # cross compile using zig or xwin cross-compile = ["zig", "xwin"] zig = ["cargo-zigbuild"] xwin = ["cargo-xwin", "xz2"] # project scaffolding scaffolding = ["dialoguer", "console", "minijinja", "unicode-xid"] # static linking dependencies static = ["xz2/static"] # Internal feature to speed up the tests significantly faster-tests = [] # Deprecated features, keep them now for compatibility human-panic = [] log = [] [target.'cfg(not(target_os = "macos"))'.dependencies] # Pure-Rust ad-hoc codesigning, only needed for cross-compilation from non-macOS arwen-codesign = { version = "0.0.1-alpha.1", optional = true } [profile.profiling] inherits = "release" debug = true # Without this, compressing the .gz archive becomes notably slow for debug builds [profile.dev.package.miniz_oxide] opt-level = 3 # Speedup cargo-xwin for debug builds [profile.dev.package.cab] opt-level = 3 [profile.dev.package.msi] opt-level = 3 maturin-1.16.0/Changelog.md000066400000000000000000003027751527064705700155220ustar00rootroot00000000000000# Changelog ## 1.16.0 * Update version mapping for GraalPy 3.13 ([#3297](https://github.com/pyo3/maturin/pull/3297)) * Properly normalize / validate abiflags and include in environment signature ([#3299](https://github.com/pyo3/maturin/pull/3299)) * Fix MinGW stable ABI library names in generated PyO3 config ([#3298](https://github.com/pyo3/maturin/pull/3298)) * Fix: lossy-decode external command output in interpreter discovery ([#3302](https://github.com/pyo3/maturin/pull/3302)) * Build(deps): update rustls for RUSTSEC-2026-0285 ([#3308](https://github.com/pyo3/maturin/pull/3308)) * Ci: run conda tests one at a time ([#3311](https://github.com/pyo3/maturin/pull/3311)) * Include SOABI_PLATFORM in Python 3.15 stable ABI extension filenames ([#3305](https://github.com/pyo3/maturin/pull/3305)) * Sort compressed tag sets ([#3315](https://github.com/pyo3/maturin/pull/3315)) * Update manylinux/musllinux policies to the latest main ([#3322](https://github.com/pyo3/maturin/pull/3322)) * Docs: recommend declaring the Rust MSRV ([#3317](https://github.com/pyo3/maturin/pull/3317)) * Emit a WASI platform tag for non-bin extension wheels ([#3321](https://github.com/pyo3/maturin/pull/3321)) * Don't include the cargo target directory or cache directories in wheels built from sdists ([#3320](https://github.com/pyo3/maturin/pull/3320)) * Fix: avoid global uv fallback in pixi environments ([#3306](https://github.com/pyo3/maturin/pull/3306)) * Fix the cargo-deny advisories that fail Lint ([#3328](https://github.com/pyo3/maturin/pull/3328)) * Find versioned interpreter names like `pypy3.11` on Windows ([#3325](https://github.com/pyo3/maturin/pull/3325)) * Update pyo3-introspection to 0.30 ([#3329](https://github.com/pyo3/maturin/pull/3329)) * Ignore unreachable `zip` extract advisories in `cargo deny` ([#3334](https://github.com/pyo3/maturin/pull/3334)) * Normalize `Provides-Extra` names from `project.optional-dependencies` ([#3333](https://github.com/pyo3/maturin/pull/3333)) * Join a multi-line description into a single-line `Summary` ([#3332](https://github.com/pyo3/maturin/pull/3332)) * Update https cert bundle for the eMudhra CA compromise ([#3337](https://github.com/pyo3/maturin/pull/3337)) * Fix: use the toolchain pyodide-build expects ([#3338](https://github.com/pyo3/maturin/pull/3338)) * Feat: upload emscripten wheels to pypi ([#3340](https://github.com/pyo3/maturin/pull/3340)) * Use system ca certificates instead of ureq's WebPki when building with native-tls ([#3341](https://github.com/pyo3/maturin/pull/3341)) * Put all `License-File` entries at the sdist root ([#3331](https://github.com/pyo3/maturin/pull/3331)) * Pass `macosx_deployment_target` to zigbuild ([#3313](https://github.com/pyo3/maturin/pull/3313)) * Use the `pp80` ABI tag for PyPy 3.12 in the bundled sysconfig ([#3343](https://github.com/pyo3/maturin/pull/3343)) * Fix: normalize Git Bash virtualenv paths on Windows ([#3307](https://github.com/pyo3/maturin/pull/3307)) * Feat: add configurable PGO dependency group (#3278) ([#3310](https://github.com/pyo3/maturin/pull/3310)) * Fix: update rustix to 1.1.5 ([#3344](https://github.com/pyo3/maturin/pull/3344)) ## 1.15.0 * Set `UV_PYTHON` when running `maturin develop` with uv ([#3236](https://github.com/pyo3/maturin/pull/3236)) * Set UID and GID headers in pax ([#3241](https://github.com/pyo3/maturin/pull/3241)) * Replace unguarded panics with explicit errors on fallible input ([#3242](https://github.com/pyo3/maturin/pull/3242)) * Harden PEP 517 build-wheel and fix unreachable OIDC 404 fallback ([#3244](https://github.com/pyo3/maturin/pull/3244)) * Fix abi3t PyModExport entrypoint check ([#3246](https://github.com/pyo3/maturin/pull/3246)) * Fix `maturin build --pgo -i ` with `uv` install ([#3237](https://github.com/pyo3/maturin/pull/3237)) * Refactor: apply some mechanical cleanups ([#3250](https://github.com/pyo3/maturin/pull/3250)) * Refactor: BuildOrchestrator pipeline deduplication ([#3251](https://github.com/pyo3/maturin/pull/3251)) * Refactor: improve context and environment hygiene ([#3252](https://github.com/pyo3/maturin/pull/3252)) * Fix(ci): honor ~= and ==X.* in requires-python for generate-ci ([#3249](https://github.com/pyo3/maturin/pull/3249)) * Refactor: type cleanup for options, tags, and wheel metadata ([#3253](https://github.com/pyo3/maturin/pull/3253)) * Refactor: InstallDest, single BridgeModel, and ui output facade ([#3254](https://github.com/pyo3/maturin/pull/3254)) * Don’t specify generate-import-lib for PyO3 0.29 ([#3258](https://github.com/pyo3/maturin/pull/3258)) * Refactor build so that pgo is part of normal pathway ([#3257](https://github.com/pyo3/maturin/pull/3257)) * Fix: verify bindings detection with cargo tree in workspaces ([#3264](https://github.com/pyo3/maturin/pull/3264)) * Fix: harden cargo tree verification of bindings detection ([#3266](https://github.com/pyo3/maturin/pull/3266)) * Feat: support --pgo for maturin develop ([#3270](https://github.com/pyo3/maturin/pull/3270)) * Feat: support `MATURIN_PGO` env var to activate --pgo ([#3271](https://github.com/pyo3/maturin/pull/3271)) * Docs: correct crate feature documentation; remove stale clippy allow * Fix: deduplicate SBOM includes across full merged list, preserving first-seen order * Feat: type the bindings input with a single-source-of-truth enum ([#3273](https://github.com/pyo3/maturin/pull/3273)) * Don't force export of the `PyInit_{module_name}` in UniFfi mode ([#3275](https://github.com/pyo3/maturin/pull/3275)) * Switch musllinux images to `musllinux_1_2` as `musllinux_1_1` is EOL ([#3280](https://github.com/pyo3/maturin/pull/3280)) * Fix(generate-stubs): write stubs into the module's package directory ([#3282](https://github.com/pyo3/maturin/pull/3282)) * Fix group not cwd ([#3284](https://github.com/pyo3/maturin/pull/3284)) * Docs: document missing [tool.maturin] config fields ([#3287](https://github.com/pyo3/maturin/pull/3287)) * Update cargo-zigbuild & cargo-xwin to 0.23.1 ## 1.14.1 * Bump uraimo/run-on-arch-action to v3 to fix pytest job ([#3221](https://github.com/pyo3/maturin/pull/3221)) * Fix platform tag logic to generate the same as cpython on AIX ([#3220](https://github.com/pyo3/maturin/pull/3220)) * Bump pyo3-introspection ([#3227](https://github.com/pyo3/maturin/pull/3227)) * Upgrade cargo-zigbuild & cargo-xwin ([#3228](https://github.com/pyo3/maturin/pull/3228)) * Fix issues around crates enabling abi3 and abi3t features ([#3226](https://github.com/pyo3/maturin/pull/3226)) * Add PEP 740 publish attestations to PyPI releases ([#3230](https://github.com/pyo3/maturin/pull/3230)) * Set PYO3_PYTHON to run scripts for stable ABI builds ([#3233](https://github.com/pyo3/maturin/pull/3233)) * Fix shell quoting in CI scripts ([#3231](https://github.com/pyo3/maturin/pull/3231)) ## 1.14.0 * Support parent-relative pyproject metadata in sdists ([#3182](https://github.com/pyo3/maturin/pull/3182)) * Update PyPI platform tag validation ([#3187](https://github.com/pyo3/maturin/pull/3187)) * Maint: update setup emsdk action in generate-ci ([#3194](https://github.com/pyo3/maturin/pull/3194)) * Fix: only shim bin wheels during auditwheel repair ([#3197](https://github.com/pyo3/maturin/pull/3197)) * Fix: avoid editable ELF truncation from stale hardlinks ([#3199](https://github.com/pyo3/maturin/pull/3199)) * Fix Pyodide Emscripten platform tags ([#3191](https://github.com/pyo3/maturin/pull/3191)) * Use pax instead of GNU headers for tar ([#3203](https://github.com/pyo3/maturin/pull/3203)) * Feat: add default exclude `__pycache__` and `*.pyc` files ([#3202](https://github.com/pyo3/maturin/pull/3202)) * Add support for finding free-threaded interpreters for `--find-interpreters` ([#3206](https://github.com/pyo3/maturin/pull/3206)) * Stubs: also generate them for mixed PyO3 projects ([#3211](https://github.com/pyo3/maturin/pull/3211)) * Don't depend on CFFI on PyPy ([#3213](https://github.com/pyo3/maturin/pull/3213)) * Support pyo3 abi3t features on Python3.15 and PyO3 0.29 ([#3113](https://github.com/pyo3/maturin/pull/3113)) ## 1.13.3 * Fix: disable abi3 in pyo3 config for version-specific fallback builds ([#3180](https://github.com/pyo3/maturin/pull/3180)) ## 1.13.2 * Fix: resolve test failures in distro packaging environments ([#3129](https://github.com/pyo3/maturin/pull/3129)) * Fix: redirect tracing output to stderr to avoid breaking PEP 517 ([#3131](https://github.com/pyo3/maturin/pull/3131)) * Fix: skip interpreters with empty output for WSL2 cross-compile ([#3137](https://github.com/pyo3/maturin/pull/3137)) * Fix: set explicit lib_name in pyo3 config for Android abi3 cross-compilation ([#3130](https://github.com/pyo3/maturin/pull/3130)) * Chore: add sysconfig/cpython-freebsd-15.0-amd64.txt ([#3140](https://github.com/pyo3/maturin/pull/3140)) * Quote python-version in generated GitHub Actions workflow * Update rustls-webpki * Fix: two-phase bridge detection for conditional abi3 features ([#3144](https://github.com/pyo3/maturin/pull/3144)) * Update cargo-zigbuild to 0.22.2 * Update pyo3 to 0.28.3 * Treat pyo3 0.29.0+ as having Windows import lib support (raw-dylib) ([#3145](https://github.com/pyo3/maturin/pull/3145)) * Fix bin bindings with external shared library dependencies ([#3147](https://github.com/pyo3/maturin/pull/3147)) * Upgrade MSRV to 1.89.0 ([#3149](https://github.com/pyo3/maturin/pull/3149)) * Musllinux oci image ([#3152](https://github.com/pyo3/maturin/pull/3152)) * Remove Cirrus CI for FreeBSD ([#3156](https://github.com/pyo3/maturin/pull/3156)) * Perf: defer stage_artifact copy-back, finalize via rename when unpatched ([#3155](https://github.com/pyo3/maturin/pull/3155)) * Perf: eliminate stage_artifact double-copy, drop was_patched flag ([#3157](https://github.com/pyo3/maturin/pull/3157)) * Fix release pipeline ([#3158](https://github.com/pyo3/maturin/pull/3158)) * Auditwheel: copy unpatched cargo output back before in-place patching ([#3159](https://github.com/pyo3/maturin/pull/3159)) * Develop: fail loudly when pip leaves a stale `~` install behind (#1922) ([#3161](https://github.com/pyo3/maturin/pull/3161)) * Provide a link for the `lib.name` in Cargo.toml ([#3167](https://github.com/pyo3/maturin/pull/3167)) * Fix duplicated version in changelog ([#3171](https://github.com/pyo3/maturin/pull/3171)) * Switch to actions/attest from attest-build-provenance ([#3169](https://github.com/pyo3/maturin/pull/3169)) * Switch generation to actions/attest action, upgrade to v4 ([#3170](https://github.com/pyo3/maturin/pull/3170)) * Fix: avoid duplicate `--interpreter` panic in PEP 517 backend ([#3175](https://github.com/pyo3/maturin/pull/3175)) * Add trusted publishing options to `generate-ci` ([#3176](https://github.com/pyo3/maturin/pull/3176)) * Fix(sdist): handle symlinked `Cargo.toml` pointing outside project root ([#3178](https://github.com/pyo3/maturin/pull/3178)) * Stop install cffi for Python 3.8 in Dockerfile * Fix: support pixi-managed virtualenvs in maturin develop ([#3165](https://github.com/pyo3/maturin/pull/3165)) * Support PEP 783 `pyemscripten_*_wasm32` wheel platform tag ([#3163](https://github.com/pyo3/maturin/pull/3163)) ## 1.13.1 * Fix: fall back to placeholder for abi3 when found interpreters are too old ([#3126](https://github.com/pyo3/maturin/pull/3126)) ## 1.13.0 * Refactor: unified interpreter resolution pipeline ([#3032](https://github.com/pyo3/maturin/pull/3032)) * Refactor: decompose large modules into focused submodules ([#3052](https://github.com/pyo3/maturin/pull/3052)) * Keep cargo build artifact at original path after staging ([#3054](https://github.com/pyo3/maturin/pull/3054)) * Fix `--strip` conflicting with `--include-debuginfo` in develop ([#3057](https://github.com/pyo3/maturin/pull/3057)) * Fix abi3 wheel producing version-specific tags for CPython below minimum ([#3061](https://github.com/pyo3/maturin/pull/3061)) * Generate-ci: use uv pip for pytest steps to fix local wheel preference ([#3063](https://github.com/pyo3/maturin/pull/3063)) * Update reflink-copy to 0.1.29 to fix sparc Linux builds * Add `[tool.maturin.generate-ci.github]` config support ([#3066](https://github.com/pyo3/maturin/pull/3066)) * Fix(sdist): handle parent workspaces and refactor sdist generation ([#3055](https://github.com/pyo3/maturin/pull/3055)) * Test: refactor integration suite and switch mixed fixtures to cffi ([#3068](https://github.com/pyo3/maturin/pull/3068)) * Fix `data` symlink permission handling ([#3069](https://github.com/pyo3/maturin/pull/3069)) * Fix: correct bugs in audit.rs typo and module_writer ([#3070](https://github.com/pyo3/maturin/pull/3070)) * Perf: use lazy-initialized regexes instead of per-call compilation ([#3071](https://github.com/pyo3/maturin/pull/3071)) * Refactor: extract duplicated helpers and reduce code repetition ([#3072](https://github.com/pyo3/maturin/pull/3072)) * Refactor: split monster functions into focused methods ([#3073](https://github.com/pyo3/maturin/pull/3073)) * Refactor: improve type safety and API clarity ([#3074](https://github.com/pyo3/maturin/pull/3074)) * Refactor: cleanup anti-patterns ([#3075](https://github.com/pyo3/maturin/pull/3075)) * Refactor: decompose `build_context` into focused submodules ([#3076](https://github.com/pyo3/maturin/pull/3076)) * Fix: skip legacy manylinux aliases not in PyPI allow-list ([#3078](https://github.com/pyo3/maturin/pull/3078)) * Fix: auto-generate `.def` file for zig + windows-gnu to export `PyInit` symbol ([#3079](https://github.com/pyo3/maturin/pull/3079)) * Ci: upgrade run-on-arch-action to ubuntu24.04, add deadsnakes PPA for newer Python ([#3081](https://github.com/pyo3/maturin/pull/3081)) * Fix: pass `-undefined dynamic_lookup` via `CARGO_ENCODED_RUSTFLAGS` on macOS ([#3083](https://github.com/pyo3/maturin/pull/3083)) * Feat: add Profile-Guided Optimization (PGO) support ([#3085](https://github.com/pyo3/maturin/pull/3085)) * Respect `metadata_directory` in `build_wheel` per PEP 517 ([#3086](https://github.com/pyo3/maturin/pull/3086)) * Update lddtree to 0.5.0 * Fix cargo path with puccinialin for Windows ([#3093](https://github.com/pyo3/maturin/pull/3093)) * Update and pin cargo-cyclonedx to 0.5.9 * Ci: improve GitHub Actions generation logic ([#3097](https://github.com/pyo3/maturin/pull/3097)) * Refactor: split BuildOptions and BuildContext into logical sub-groups ([#3098](https://github.com/pyo3/maturin/pull/3098)) * Refactor: move subcommands to separate modules ([#3099](https://github.com/pyo3/maturin/pull/3099)) * Refactor: decouple build orchestration from BuildContext ([#3100](https://github.com/pyo3/maturin/pull/3100)) * Upgrade pyo3 to 0.28 ([#3101](https://github.com/pyo3/maturin/pull/3101)) * Fix: only enable include_debuginfo by default on Windows in develop command * PyO3: Adds `--generate_stubs` build options ([#3105](https://github.com/pyo3/maturin/pull/3105)) * Fix: prevent panic when no interpreters match abi3 minimum version ([#3108](https://github.com/pyo3/maturin/pull/3108)) * Refactor to store CPython ABI metadata in a struct combining two enums ([#3110](https://github.com/pyo3/maturin/pull/3110)) * Refactor: introduce `WheelRepairer` trait ([#3112](https://github.com/pyo3/maturin/pull/3112)) * Feat: re-implement delocate for repairing macOS wheels ([#3114](https://github.com/pyo3/maturin/pull/3114)) * PyO3: Adds generate-stubs command ([#3115](https://github.com/pyo3/maturin/pull/3115)) * Feat: re-implement delvewheel for repairing Windows wheels ([#3116](https://github.com/pyo3/maturin/pull/3116)) * Add auditwheel Warn mode, default to Warn on macOS/Windows ([#3121](https://github.com/pyo3/maturin/pull/3121)) * Feat: Support large zip files ([#3118](https://github.com/pyo3/maturin/pull/3118)) ## 1.12.6 * Sync legacy_py.rs with upstream PyPI warehouse legacy.py ([#3053](https://github.com/PyO3/maturin/pull/3053)) * Keep cargo build artifact at original path after staging ([#3054](https://github.com/PyO3/maturin/pull/3054)) ## 1.12.5 * Feat: include debug info files (.pdb, .dSYM, .dwp) in wheels ([#3024](https://github.com/pyo3/maturin/pull/3024)) * Fix wrong abi3 tag for conditional cargo features enabled pyo3 abi3 feature ([#3029](https://github.com/pyo3/maturin/pull/3029)) * Fix: `maturin build --sdist` wheel name/layout for excluded workspace crates ([#3031](https://github.com/pyo3/maturin/pull/3031)) * Fix: preserve wheel output dir when building from unpacked sdist ([#3036](https://github.com/pyo3/maturin/pull/3036)) * Feat: add python-implementation condition to conditional features ([#3038](https://github.com/pyo3/maturin/pull/3038)) * Update zip to 8.1 ([#3039](https://github.com/pyo3/maturin/pull/3039)) * Use the latest version of github actions ([#3040](https://github.com/pyo3/maturin/pull/3040)) * Use renovate and pinned hashes for GitHub Actions ([#3043](https://github.com/pyo3/maturin/pull/3043)) * Chore(deps): update taiki-e/install-action digest to 7410117 ([#3046](https://github.com/pyo3/maturin/pull/3046)) * Chore(deps): update dtolnay/rust-toolchain digest to efa25f7 ([#3045](https://github.com/pyo3/maturin/pull/3045)) * Chore(deps): update actions/attest-build-provenance action to v4 ([#3047](https://github.com/pyo3/maturin/pull/3047)) * Use mmap for faster warn_missing_py_init ([#2950](https://github.com/pyo3/maturin/pull/2950)) ## 1.12.4 * Upgrade memmap2 version ([#3021](https://github.com/pyo3/maturin/pull/3021)) * Fix: platform tag detection for Android targets ([#3023](https://github.com/pyo3/maturin/pull/3023)) * Fix: only ignore maturin-generated native libraries on all platforms ([#3025](https://github.com/pyo3/maturin/pull/3025)) * Fix: ignore develop artifacts for all binding types during build ([#3026](https://github.com/pyo3/maturin/pull/3026)) * Feat: support conditional cargo features based on Python version ([#3027](https://github.com/pyo3/maturin/pull/3027)) ## 1.12.3 * Ci: set crt-static for riscv64 and loongarch64 musl targets ([#3009](https://github.com/pyo3/maturin/pull/3009)) * Fix: support `maturin develop` on Windows ARM with x86 Python ([#3011](https://github.com/pyo3/maturin/pull/3011)) * Fix: exclude `external_packages` bindings from uniffi wheels ([#3013](https://github.com/pyo3/maturin/pull/3013)) * Update cargo-zigbuild to 0.22.1 ([#3015](https://github.com/pyo3/maturin/pull/3015)) * Feat: build wheels from sdist with `--sdist` flag ([#3014](https://github.com/pyo3/maturin/pull/3014)) * Feat: add `include-import-lib` option to bundle Windows import libraries in wheels ([#3017](https://github.com/pyo3/maturin/pull/3017)) * Fix: auditwheel external lib check respects musllinux and reports symbol versions ([#3019](https://github.com/pyo3/maturin/pull/3019)) ## 1.12.2 * Fix: allow absolute paths for `--sbom-include` ([#3004](https://github.com/pyo3/maturin/pull/3004)) ## 1.12.1 * Fix crates.io trusted publishing * Replace addnab/docker-run-action with direct docker run command * Document SBOM support in user guide * Add `--sbom-include` CLI argument for additional SBOM files ([#2999](https://github.com/pyo3/maturin/pull/2999)) * Fix: resolve include patterns relative to python-source for sdist and wheel ([#3000](https://github.com/pyo3/maturin/pull/3000)) * Feat: log external shared libraries and their dependents before patchelf * Feat: support including `OUT_DIR` assets in wheel builds ([#3001](https://github.com/pyo3/maturin/pull/3001)) * Add test case for uniffi with multiple crates ([#2839](https://github.com/pyo3/maturin/pull/2839)) ## 1.12.0 * Use pypi compatibility validation for own CI ([#2929](https://github.com/pyo3/maturin/pull/2929)) * Update toml crates for toml 1.1 support ([#2934](https://github.com/pyo3/maturin/pull/2934)) * Fix editable install for binary projects with Python modules ([#2938](https://github.com/pyo3/maturin/pull/2938)) * Release to crates.io only after the builds passed ([#2939](https://github.com/pyo3/maturin/pull/2939)) * Use `mymindstorm/setup-emsdk@v14` in generated GitHub Actions workflow ([#2941](https://github.com/pyo3/maturin/pull/2941)) * Filter linked_paths by KIND and linked_libs ([#2949](https://github.com/pyo3/maturin/pull/2949)) * Update bytes to 1.11.1 ([#2960](https://github.com/pyo3/maturin/pull/2960)) * Normalize wheel distribution names to match the PyPA spec ([#2954](https://github.com/pyo3/maturin/pull/2954)) * Allow build loongarch64 and riscv64 for musllinux ([#2963](https://github.com/pyo3/maturin/pull/2963)) * Strip excluded cargo targets in sdist ([#2964](https://github.com/pyo3/maturin/pull/2964)) * Normalize wheel `RECORD` paths (on Windows) ([#2965](https://github.com/pyo3/maturin/pull/2965)) * Bump MSRV to 1.88.0 ([#2966](https://github.com/pyo3/maturin/pull/2966)) * Support MATURIN_STRIP env var and --strip true/false to override pyproject.toml ([#2968](https://github.com/pyo3/maturin/pull/2968)) * Fix: copy bin artifacts before auditwheel repair to avoid rerun failures ([#2969](https://github.com/pyo3/maturin/pull/2969)) * Fix: rewrite python-source in pyproject.toml when building sdist ([#2972](https://github.com/pyo3/maturin/pull/2972)) * Fix: resolve wheel include patterns relative to project root ([#2973](https://github.com/pyo3/maturin/pull/2973)) * Fix: always include workspace Cargo.toml in sdist ([#2974](https://github.com/pyo3/maturin/pull/2974)) * Refactor: simplify source_distribution.rs ([#2976](https://github.com/pyo3/maturin/pull/2976)) * Feat: support PEP 735 dependency groups in develop command ([#2978](https://github.com/pyo3/maturin/pull/2978)) * Fix license file handling for workspace-level license files ([#2970](https://github.com/pyo3/maturin/pull/2970)) * Support PEP 739 build-details.json when cross compiling ([#2979](https://github.com/pyo3/maturin/pull/2979)) * Fix .libs directory name for namespace packages ([#2981](https://github.com/pyo3/maturin/pull/2981)) * Fix: exclude duplicate python source files from sdist for workspace members ([#2982](https://github.com/pyo3/maturin/pull/2982)) * Fix: remove default-members from workspace Cargo.toml in sdist ([#2983](https://github.com/pyo3/maturin/pull/2983)) * Fix: correctly filter workspace members in sdist by directory path ([#2984](https://github.com/pyo3/maturin/pull/2984)) * Feat: Add PEP 770 SBOM support ([#2980](https://github.com/pyo3/maturin/pull/2980)) * Error when python-source is set but Python module is missing ([#2986](https://github.com/pyo3/maturin/pull/2986)) * Feat: add auditwheel SBOM for grafted shared libraries ([#2985](https://github.com/pyo3/maturin/pull/2985)) * Fix sdist duplicate README error when readme is in both Cargo.toml and pyproject.toml ([#2987](https://github.com/pyo3/maturin/pull/2987)) * Fix: support python-source pointing outside Rust source directory ([#2988](https://github.com/pyo3/maturin/pull/2988)) * Relax ziglang dependency version requirement ([#2990](https://github.com/pyo3/maturin/pull/2990)) * Stop adding link-native-libraries flag by default in Emscripten platform in latest Rust ([#2991](https://github.com/pyo3/maturin/pull/2991)) * Fix: platform.system() on Android for Python 3.13+ ([#2992](https://github.com/pyo3/maturin/pull/2992)) * Document more environment variables in user guide * Fix: check external libs for glibc version when determining platform tag ([#2993](https://github.com/pyo3/maturin/pull/2993)) * Update cargo-zigbuild to 0.22.0 ([#2994](https://github.com/pyo3/maturin/pull/2994)) * Sbom: filter to bindings crate only and upgrade to CycloneDX v1.5 ([#2995](https://github.com/pyo3/maturin/pull/2995)) * Upgrade ureq to 3.2.0 and migrate to built-in multipart ([#2997](https://github.com/pyo3/maturin/pull/2997)) ## 1.11.5 * Allow combining `--compatibility pypi` with other `--compatibility` values ([#2928](https://github.com/pyo3/maturin/pull/2928)) ## 1.11.4 * Support armv6l and armv7l in pypi compatibility ([#2926](https://github.com/pyo3/maturin/pull/2926)) * Improve the reliability of maturin's own CI ## 1.11.3 * Fix manylinux2014 compliance check ([#2922](https://github.com/pyo3/maturin/pull/2922)) ## 1.11.2 * Fix failed release ## 1.11.1 * Fix compiled artifacts being excluded by source path matching ([#2910](https://github.com/pyo3/maturin/pull/2910)) * Better error reporting for missing interpreters ([#2918](https://github.com/pyo3/maturin/pull/2918)) * Ignore unreadable excluded directories ([#2916](https://github.com/pyo3/maturin/pull/2916)) ## [1.11.0] - Yanked Note: This release was yanked to a regression: https://github.com/PyO3/maturin/issues/2909 * Refactor `ModuleWriter` to be easier to implement and use * Add Android cross compilation support, fix wheel tags for Android * Update generate-ci to macos-15-intel and add windows arm support * Deprecate 'upload' and 'publish' CLI commands ## [1.10.2] * Fix tagging for iOS x86_64 simulator wheels. * Set entry type when adding to the tar file. ## [1.10.1] * Fix wrong dependency on Homebrew liblzma on macOS by static linking liblama ## [1.10.0] * Add `tool.maturin.editable-profile` option to override profile for editable package installations. * Add support for Cygwin. * When building `abi3` wheels on non-Windows platforms that aren't cross-compiling, the `sysconfigdata` of the interpreter used to run maturin will now be used, rather than a dummy interpreter. * Allow iOS cross-platform virtual environments, such as those used by cibuildwheel, to imply an iOS target. * Fix iOS wheel naming to be compliant with PEP 730. * Fix generated WHEEL Tag metadata to be spec compliant. * Fix incorrect warning about missing `extension-module` feature on PyO3 0.26+. * Remove `add_directory()` from ModuleWriter and make it an implementation detail for the specific impl. * Clear out uid/gid and set deterministic mtime for files in sdist. * Always use "library" mode to build uniffi bindings. ## [1.9.6] * Fix regressions to interpreter platform detection on Windows from 1.9.5 * Further fixes to interpreter detection for Windows ARM64 ## [1.9.5] * Add builtin sysconfig for FreeBSD 14.2 amd64 * Fix issue searching lib dir containing Python 3.14 `build-details.json` * Fix detection of compatible interpreters on Windows ARM64 ## [1.9.4] * Add a `use-base-python` option to `pyproject.toml` with the same behaviour as `MATURIN_PEP517_USE_BASE_PYTHON`. * Add builtin sysconfigs for GraalPy * Fix calculation of platform tag for FreeBSD ## [1.9.3] * Fix adding `project.license-files` to source distributions. * Fix relative Readme rewrite of the root crate in source distributions. ## [1.9.2] * Fix PEP 639 implementation, use `License-Expression` over `License`. ## [1.9.1] * Fix absolute license file path from `Cargo.toml` in [#2667](https://github.com/PyO3/maturin/pull/2667) ## [1.9.0] * Add full PEP 639 support for `project.license` and `project.license-files` in [#2647](https://github.com/PyO3/maturin/pull/2647). * Add `--compatibility pypi` to only build wheels with platform tags that can also be uploaded to PyPI. This blocks e.g. building for riscv64, which is supported by manylinux, but not by PyPI. ## [1.8.7] * Allow specifying compression method and level, in both `build` and `develop` modes, in [#2625](https://github.com/PyO3/maturin/pull/2625). * Fix Windows free-threaded builds on Python 3.14 in [#2632](https://github.com/PyO3/maturin/pull/2632) ## [1.8.6] * Print a message when overriding platform tag from `_PYTHON_HOST_PLATFORM` in [#2594](https://github.com/PyO3/maturin/pull/2594) * Use the current python interpreter's version when the abi3 feature is set with no explicit version in [#2597](https://github.com/PyO3/maturin/pull/2597) ## [1.8.5] * Fix release CI build ## [1.8.4] * Install a Rust toolchain into a temporary directory when building maturin itself or a package and a Rust toolchain is missing. Set `MATURIN_NO_INSTALL_RUST` to disable this behavior. [#2421](https://github.com/PyO3/maturin/pull/2421) * Fix broken `maturin develop` with latest uv in [#2584](https://github.com/PyO3/maturin/pull/2584) * Add `PYO3_PYTHON` env var support in [#2534](https://github.com/PyO3/maturin/pull/2534) * Sort RECORD file in wheel archives to make them deterministic in [#2550](https://github.com/PyO3/maturin/pull/2550) * Publish wheel for loongarch64 in [#2548](https://github.com/PyO3/maturin/pull/2548) * Add --compression-level option to build command in [#2572](https://github.com/PyO3/maturin/pull/2572) ## [1.8.3] * Fix relocating shared library for namespace modules in [#2513](https://github.com/PyO3/maturin/pull/2513) * Don't install dependencies when running `maturin develop --skip-install` in [#2504](https://github.com/PyO3/maturin/pull/2504) * Use emcc.bat to query version on Windows in [#2478](https://github.com/PyO3/maturin/pull/2478) * Bump the attest-build-provenance version in the generated ci file in [#2484](https://github.com/PyO3/maturin/pull/2478) * Fix platform tag on Solaris/Illumos in [#2483](https://github.com/PyO3/maturin/pull/2483) * Fix cargo run uniffi-bindgen when cross compiling in [#2476](https://github.com/PyO3/maturin/pull/2476) ## [1.8.2] * Exclude packages not in the dependency tree when finding bindings in [#2426](https://github.com/PyO3/maturin/pull/2426) * Use uv automatically when running maturin develop inside uv-created virtualenv in [#2433](https://github.com/PyO3/maturin/pull/2433) * Consider abi3 minor version when resolving Python interpreters in [#2437](https://github.com/PyO3/maturin/pull/2437) * Handle archived dylibs on AIX in [#2442](https://github.com/PyO3/maturin/pull/2442) * Fix unnecessary rebuilds due to pyo3 config file modified time change in [#2446](https://github.com/PyO3/maturin/pull/2446) * Fix the name of the .data directory in the generated wheel in [#2449](https://github.com/PyO3/maturin/pull/2449) * Update minimal manylinux version for loongarch64 in [#2451](https://github.com/PyO3/maturin/pull/2451) ## [1.8.1] * Downgrade invalid version info in `pyproject.toml` error to warning in [#2417](https://github.com/PyO3/maturin/pull/2417) * Make `maturin develop` fail if version info is invalid in pyproject.toml in [#2418](https://github.com/PyO3/maturin/pull/2418) ## [1.8.0] * Don't add wheel data to sdist in [#2367](https://github.com/PyO3/maturin/pull/2367) * Add sparcv9 architecture support in [#2380](https://github.com/PyO3/maturin/pull/2380) * Properly handle dynamic version in pyproject.toml in [#2391](https://github.com/PyO3/maturin/pull/2391) * Fix xwin cross compile on non-Windows system in [#2391](https://github.com/PyO3/maturin/pull/2391) * Fix interpreter selection for abi3 bindings in [#2392](https://github.com/PyO3/maturin/pull/2392) * Use the official recommended naming pattern for cffi module file in [#2406](https://github.com/PyO3/maturin/pull/2406) * Add Linux armv5te architecture support in [#2409](https://github.com/PyO3/maturin/pull/2409) * Only build Python 3.13t wheels by default for `pyo3` 0.23+ in [#2413](https://github.com/PyO3/maturin/pull/2413) ## [1.7.8] * Fix aarch64 Windows cross compilation in [#2359](https://github.com/PyO3/maturin/pull/2359) ## [1.7.7] * Fix abi3 interpreter discovery on Windows in [#2333](https://github.com/PyO3/maturin/pull/2333) * Normalize python source directory path in [#2343](https://github.com/PyO3/maturin/pull/2343) * Use different binding dirs for different uniffi modules in [#2348](https://github.com/PyO3/maturin/pull/2348) * Limit minimal PyPy version based on bindings crate version in [#2351](https://github.com/PyO3/maturin/pull/2351) * Do not use `xwin` to compile on Windows when MSVC compiler can build for the target in [#2353](https://github.com/PyO3/maturin/pull/2353) ## [1.7.6] * Set core metadata version to 2.4 to fix `project.license.files` handling in [#2332](https://github.com/PyO3/maturin/pull/2332) ## [1.7.5] * Improve wheel reproducibility by sorting external libraries [#2261](https://github.com/PyO3/maturin/pull/2261) * Fix Readme and pyproject.toml inclusions for workspace where the bindings crate is not in the root in [#2262](https://github.com/PyO3/maturin/pull/2262) * Add support for GNU/Hurd target in [#2306](https://github.com/PyO3/maturin/pull/2306) * Add preliminary free-threaded Python wheel building support in [#2310](https://github.com/PyO3/maturin/pull/2310) ## [1.7.4] * Fix musllinux rpath for non-cffi bindings in [#2233](https://github.com/PyO3/maturin/pull/2233) * Add GitHub Actions attestation support to generate-ci in [#2234](https://github.com/PyO3/maturin/pull/2234) ## [1.7.3] * Fix upload regression to pypi/testpypi in [#2229](https://github.com/PyO3/maturin/pull/2229) ## [1.7.2] * Fix cross compilation issues for armv7l, mips64 and ppc in [#2204](https://github.com/PyO3/maturin/pull/2204) * UniFFI: supports bindings generated from multiple crates in [#2208](https://github.com/PyO3/maturin/pull/2208) * Enable `--all-features` when building source distribution in [#2215](https://github.com/PyO3/maturin/pull/2215) * Fix rpath when module-name contains `.` in [#2219](https://github.com/PyO3/maturin/pull/2219) ## [1.7.1] * Forward `cargo package --list` warnings in [#2186](https://github.com/PyO3/maturin/pull/2186) * In source distributions, we move the readmes of path dependencies into the respective crate to avoid collision between different readmes in [#2184](https://github.com/PyO3/maturin/pull/2184) ## [1.7.0] - 2024-07-07 * Initial iOS support in [#2101](https://github.com/PyO3/maturin/pull/2102) * Remove old import hook in [#2105](https://github.com/PyO3/maturin/pull/2105), use [maturin-import-hook](https://github.com/PyO3/maturin-import-hook) instead * Bump MSRV to 1.74.0 in [#2108](https://github.com/PyO3/maturin/pull/2108) * Add support for overriding wheel tag with `_PYTHON_HOST_PLATFORM` in [#2122](https://github.com/PyO3/maturin/pull/2122) * Don't add files to an archive more than once [#2125](https://github.com/PyO3/maturin/issues/2125) * Only use base python executable when `MATURIN_PEP517_USE_BASE_PYTHON` is set in [#2134](https://github.com/PyO3/maturin/pull/2134) ## [1.6.0] - 2024-06-04 * Detect compiling from Linux gnu to Linux musl as cross compiling in [#2010](https://github.com/PyO3/maturin/pull/2010) * Add musllinux support to `generate-ci` in [#2011](https://github.com/PyO3/maturin/pull/2011) * Add uv support to `develop` command in [#2015](https://github.com/PyO3/maturin/pull/2015) * Add support for AIX target in [#2030](https://github.com/PyO3/maturin/pull/2030) * Remove rust-cpython support in [#2044](https://github.com/PyO3/maturin/pull/2044) * Add a global `-v` option in [#2080](https://github.com/PyO3/maturin/pull/2080) * Detect target based on interpreter for pep517 build-wheel in [#2088](https://github.com/PyO3/maturin/pull/2088) * Use base executable when possible in PEP 517 build in [#2094](https://github.com/PyO3/maturin/pull/2094) ## [1.5.1] - 2024-03-21 * Fix usage of `--compatibility` when run as a PEP517 backend in [#1992](https://github.com/PyO3/maturin/pull/1992) * Fix upload returning malformed summary error in [#2002](https://github.com/PyO3/maturin/pull/2002) ## [1.5.0] - 2024-03-05 * Bump metadata version from 2.1 to 2.3 in [#1965](https://github.com/PyO3/maturin/pull/1965). Source distributions created by maturin now have reliable metadata, meaning tool such as pip, uv and poetry could skip building them for version resolution. * Allow identical `VIRTUAL_ENV` and `CONDA_PREFIX` env vars in [#1879](https://github.com/PyO3/maturin/pull/1879) * Reject `-i python` when cross compiling in [#1891](https://github.com/PyO3/maturin/pull/1891) * Support uniffi-bindgen in cargo workspaces in [#1909](https://github.com/PyO3/maturin/pull/1909) * Add support for configuring `xwin` using env vars in [#1961](https://github.com/PyO3/maturin/pull/1961) * Add validation for crate/package name in new/init in [#1943](https://github.com/PyO3/maturin/pull/1943) * Add 32-bit RISC-V support in [#1969](https://github.com/PyO3/maturin/pull/1969) * Improve import hook changes in [#1958](https://github.com/PyO3/maturin/pull/1958) * Adjust cbindgen Overrides for CFFI in [#1957](https://github.com/PyO3/maturin/pull/1957) ## [1.4.0] - 2023-12-02 * Bump MSRV to 1.67.0 in [#1847](https://github.com/PyO3/maturin/pull/1847) * Add support for cross compiling with `cross` in [#1865](https://github.com/PyO3/maturin/pull/1865) ## [1.3.2] - 2023-11-14 * Add support for uniffi library mode in [#1729](https://github.com/PyO3/maturin/pull/1729) * Un-deprecate `MATURIN_PEP517_ARGS` env var in [#1820](https://github.com/PyO3/maturin/pull/1820) * Fix missing member in Cargo.toml for sdist of nested workspace layout in [#1828](https://github.com/PyO3/maturin/pull/1828) * Escape display name in email addresses of wheel metadata in [#1832](https://github.com/PyO3/maturin/pull/1832) * Fix rewriting workspace Cargo.toml in sdist in [#1841](https://github.com/PyO3/maturin/pull/1841) * Fix glob workspace members matching in sdist in [#1846](https://github.com/PyO3/maturin/pull/1846) ## [1.3.1] - 2023-10-24 * Use external `uniffi-bindgen` if no root package is configured in [#1797](https://github.com/PyO3/maturin/pull/1797) * Fix wheel filename for GraalPy in [#1802](https://github.com/PyO3/maturin/pull/1802) * Add unittest skeleton to mixed Python/Rust projects in [#1807](https://github.com/PyO3/maturin/pull/1807) * Preserve trailing whitespace in new project files in [#1808](https://github.com/PyO3/maturin/pull/1808) * Fix missing `workspace.members` in sdist in [#1811](https://github.com/PyO3/maturin/pull/1811) * Don't set `MACOSX_DEPLOYMENT_TARGET` for editable builds by default in [#1815](https://github.com/PyO3/maturin/pull/1815) ## [1.3.0] - 2023-10-02 * Refactor Cargo sdist generator to avoid rewriting local dependencies in [#1741](https://github.com/PyO3/maturin/pull/1741) * Added `--pip-path` argument to `develop` command in [#1753](https://github.com/PyO3/maturin/pull/1753) * Ignore sdist output files when building sdist in [#1756](https://github.com/PyO3/maturin/pull/1756) * Use `python.exe` by default in `build` command on Windows in [#1757](https://github.com/PyO3/maturin/pull/1757) * Don't require `uniffi-bindgen` to be installed for uniffi bindings in [#1762](https://github.com/PyO3/maturin/pull/1762) * Fix platform tag for graalpy in [#1773](https://github.com/PyO3/maturin/pull/1773) * Always set minor version to 0 when major version >= 11 for macOS in [#1778](https://github.com/PyO3/maturin/pull/1778) * Warning about incorrect maturin version pyproject.toml `[build-system] requires` in [#1793](https://github.com/PyO3/maturin/pull/1793) ## [1.2.3] - 2023-08-17 * Fix sdist build failure with workspace path dependencies by HerringtonDarkholme in [#1739](https://github.com/PyO3/maturin/pull/1739) ## [1.2.2] - 2023-08-14 * Fix non interactive mode check when username/password was supplied from cli in #[1737](https://github.com/PyO3/maturin/pull/1737) ## [1.2.1] - 2023-08-14 * Add non-interactive mode to `upload` command in [#1722](https://github.com/PyO3/maturin/pull/1722) * Fix `link-native-libraries` check for emscripten target in [#1724](https://github.com/PyO3/maturin/pull/1724) * Add support for `ALL_PROXY` to `upload` command in [#1727](https://github.com/PyO3/maturin/pull/1727) * Handle renamed Rust dependency in sdist in [#1728](https://github.com/PyO3/maturin/pull/1728) * Fix invalid TOML when rewriting workspace inherited dependencies in [#1733](https://github.com/PyO3/maturin/pull/1733) ## [1.2.0] - 2023-08-06 * Add basic support for implicit namespaces [#1645](https://github.com/PyO3/maturin/pull/1696) * Add Linux mips64 and mips architecture support in [#1712](https://github.com/PyO3/maturin/pull/1712) * Add `x86_64h-apple-darwin` target support in [#1717](https://github.com/PyO3/maturin/pull/1717) ## [1.1.0] - 2023-06-10 * Add basic support for GraalPy in [#1645](https://github.com/PyO3/maturin/pull/1645) * Refactor abi tag to use `EXT_SUFFIX` in [#1648](https://github.com/PyO3/maturin/pull/1648) * Add Linux loongarch64 architecture support in [#1653](https://github.com/PyO3/maturin/pull/1653) * Add `--skip-install` option to `maturin develop` in [#1654](https://github.com/PyO3/maturin/pull/1654) ## [1.0.1] - 2023-05-28 * Add more Python 3.12 sysconfigs in [#1629](https://github.com/PyO3/maturin/pull/1629) * Fix panicking when no cargo build targets are selected in [#1635](https://github.com/PyO3/maturin/pull/1635) ## [1.0.0] - 2023-05-23 * Add support for multiple `--config-settings` in PEP517 backend in [#1624](https://github.com/PyO3/maturin/pull/1624) * Remove deprecated `--universal2` cli option in [#1620](https://github.com/PyO3/maturin/pull/1620), use `--target universal2-apple-darwin` instead. ## [0.15.3] - 2023-05-20 * Fix cross compile Apple universal2 wheels on non-macOS platforms by MisLink in [#1613](https://github.com/PyO3/maturin/pull/1613) * Add PEP 517 `config_settings` support in [#1619](https://github.com/PyO3/maturin/pull/1619), deprecate `MATURIN_PEP517_ARGS` in favor of the new `build-args` config setting. ## [0.15.2] - 2023-05-16 * When determining the python module name, use pyproject.toml `project.name` over Cargo.toml `package.name` in [#1608](https://github.com/PyO3/maturin/pull/1608) * Fix rewriting `dev-dependencies` in sdist in [#1610](https://github.com/PyO3/maturin/pull/1610) ## [0.15.1] - 2023-05-07 * Fix finding interpreters from bundled sysconfigs in [#1598](https://github.com/PyO3/maturin/pull/1598) ## [0.15.0] - 2023-05-07 * **Breaking Change**: Build with `--no-default-features` by default when bootstrapping from sdist in [#1333](https://github.com/PyO3/maturin/pull/1333) * **Breaking Change**: Remove deprecated `sdist-include` option in `pyproject.toml` in [#1335](https://github.com/PyO3/maturin/pull/1335) * **Breaking Change**: Remove deprecated `python-source` option in `Cargo.toml` in [#1335](https://github.com/PyO3/maturin/pull/1335) * **Breaking Change**: Turn `patchelf` version warning into a hard error in [#1335](https://github.com/PyO3/maturin/pull/1335) * **Breaking Change**: [`uniffi_bindgen` CLI](https://mozilla.github.io/uniffi-rs/tutorial/Prerequisites.html#the-uniffi-bindgen-cli-tool) is required for building `uniffi` bindings wheels in [#1352](https://github.com/PyO3/maturin/pull/1352) * Add Cargo compile targets configuration for filtering multiple bin targets in [#1339](https://github.com/PyO3/maturin/pull/1339) * Respect `rustflags` settings in cargo configuration file in [#1405](https://github.com/PyO3/maturin/pull/1405) * Add support for uniffi 0.23 in [#1481](https://github.com/PyO3/maturin/pull/1481) * Add support for custom TLS certificate authority bundle in [#1483](https://github.com/PyO3/maturin/pull/1483) * Bump MSRV to 1.64.0 in [#1528](https://github.com/PyO3/maturin/pull/1528) * Add wildcards support to publish/upload commands on Windows in [#1534](https://github.com/PyO3/maturin/pull/1534) * Add support for configuring macOS deployment target version in `pyproject.toml` in [#1536](https://github.com/PyO3/maturin/pull/1536) * Rewrite platform specific dependencies in `Cargo.toml` by viccie30 in [#1572](https://github.com/PyO3/maturin/pull/1572) * Add trusted publisher support in [#1578](https://github.com/PyO3/maturin/pull/1578) * Add new `git` source distribution generator in [#1587](https://github.com/PyO3/maturin/pull/1587) ## [0.14.17] - 2023-04-06 * Fix wrong `EXT_SUFFIX` when cross compiling musllinux wheels for Python 3.11 in [#1560](https://github.com/PyO3/maturin/pull/1560) ## [0.14.16] - 2023-03-26 * Deprecate `package.metadata.maturin.name` in favor of `tool.maturin.module-name` in `pyproject.toml` in [#1531](https://github.com/PyO3/maturin/pull/1531) ## [0.14.15] - 2023-03-03 * Add sdist and sccache support to `generate-ci` command ## [0.14.14] - 2023-02-24 * Add support for Emscripten in `generate-ci` command in [#1484](https://github.com/PyO3/maturin/pull/1484) * Add support for linking with pyo3 in abi3 debug mode on Windows in [#1487](https://github.com/PyO3/maturin/pull/1487) * Use default `ext_suffix` for Emscripten target if not provided in `PYO3_CONFIG_FILE` in [#1491](https://github.com/PyO3/maturin/pull/1491) * Deprecate `package.metadata.maturin.data` in favor of `tool.maturin.data` in `pyproject.toml` in [#1492](https://github.com/PyO3/maturin/pull/1492) ## [0.14.13] - 2023-02-12 * `maturin develop` now looks for a virtualenv `.venv` in the current or any parent directory if no virtual environment is active. * Add a new `generate-ci` command to generate CI configuration in [#1456](https://github.com/PyO3/maturin/pull/1456) * Deprecate `--universal2` in favor of `universal2-apple-darwin` target in [#1457](https://github.com/PyO3/maturin/pull/1457) * Raise an error when `Cargo.toml` contains removed python package metadata in [#1471](https://github.com/PyO3/maturin/pull/1471) * Use `extension_name` instead of `module_name` for CFFI extensions in develop mode in [#1476](https://github.com/PyO3/maturin/pull/1476) ## [0.14.12] - 2023-01-31 * Keep `dev-dependencies` in sdist when there are no path dependencies in [#1441](https://github.com/PyO3/maturin/pull/1441) ## [0.14.11] - 2023-01-31 * Don't package dev-only path dependencies in sdist in [#1435](https://github.com/PyO3/maturin/pull/1435) ## [0.14.10] - 2023-01-13 * Use module name specified by `[package.metadata.maturin]` in [#1409](https://github.com/PyO3/maturin/pull/1409) ## [0.14.9] - 2023-01-10 * Don't pass `MACOSX_DEPLOYMENT_TARGET` when query default value from rustc in [#1395](https://github.com/PyO3/maturin/pull/1395) ## [0.14.8] - 2022-12-31 * Add support for packaging multiple pure Python packages in [#1378](https://github.com/PyO3/maturin/pull/1378) * Fallback to sysconfig interpreters for pyo3 bindings in [#1381](https://github.com/PyO3/maturin/pull/1381) ## [0.14.7] - 2022-12-20 * Add workspace lock file to sdist as a fallback in [#1362](https://github.com/PyO3/maturin/pull/1362) ## [0.14.6] - 2022-12-13 * Allow Rust crate to be placed outside of the directory containing `pyproject.toml` in [#1347](https://github.com/PyO3/maturin/pull/1347) * Disallow uniffi bin bindings in [#1353](https://github.com/PyO3/maturin/pull/1353) * Update bundled Python sysconfigs for Linux and macOS ## [0.14.5] - 2022-12-08 * Support `SOURCE_DATE_EPOCH` when building wheels in [#1334](https://github.com/PyO3/maturin/pull/1334) * Fix sdist when all Cargo workspace members are excluded in [#1343](https://github.com/PyO3/maturin/pull/1343) ## [0.14.4] - 2022-12-05 * Expanded architecture support for FreeBSD, NetBSD and OpenBSD in [#1318](https://github.com/PyO3/maturin/pull/1318) * Better error message when upload failed with status code 403 in [#1323](https://github.com/PyO3/maturin/pull/1323) ## [0.14.3] - 2022-12-01 * Bump MSRV to 1.62.0 in [#1297](https://github.com/PyO3/maturin/pull/1297) * Fix build error when required features of bin target isn't enabled in [#1299](https://github.com/PyO3/maturin/pull/1299) * Fix wrong platform tag when building in i386 docker container on x86_64 host in [#1301](https://github.com/PyO3/maturin/pull/1301) * Fix wrong platform tag when building in armv7 docker container on aarch64 host in [#1303](https://github.com/PyO3/maturin/pull/1303) * Add Solaris operating system support in [#1310](https://github.com/PyO3/maturin/pull/1310) * Add armv6 and armv7 target support for FreeBSD in [#1312](https://github.com/PyO3/maturin/pull/1312) * Add riscv64 and powerpc target support for FreeBSD in [#1313](https://github.com/PyO3/maturin/pull/1313) * Fix powerpc64 and powerpc64le Python wheel platform tag for FreeBSD in [#1313](https://github.com/PyO3/maturin/pull/1313) ## [0.14.2] - 2022-11-24 * Tighten src-layout detection logic in [#1281](https://github.com/PyO3/maturin/pull/1282) * Fix generating pep517 sdist for src-layout in [#1288](https://github.com/PyO3/maturin/pull/1288) * Deprecate `python-source` option in `Cargo.toml` in favor of the one in `pyproject.toml` in [#1291](https://github.com/PyO3/maturin/pull/1291) * Fix auditwheel with read-only libraries in [#1292](https://github.com/PyO3/maturin/pull/1292) ## [0.14.1] - 2022-11-20 * Downgrade `cargo_metadata` to 0.15.0 to fix `maturin build` on old Rust versions like 1.48.0 in [#1279](https://github.com/PyO3/maturin/pull/1279) ## [0.14.0] - 2022-11-19 * **Breaking Change**: Remove support for specifying python package metadata in `Cargo.toml` in [#1200](https://github.com/PyO3/maturin/pull/1200). Python package metadata should be specified in the `project` section of `pyproject.toml` instead as [PEP 621](https://peps.python.org/pep-0621/) specifies. * Initial support for shipping bin targets as wasm32-wasi binaries that are run through wasmtime in [#1107](https://github.com/PyO3/maturin/pull/1107). Note that wasmtime currently only support the five most popular platforms and that wasi binaries have restrictions when interacting with the host. Usage is by setting `--target wasm32-wasi`. * Add support for python first [`src` project layout](https://py-pkgs.org/04-package-structure.html#the-source-layout) in [#1185](https://github.com/PyO3/maturin/pull/1185) * Add `--src` option to generate src layout for mixed Python/Rust projects in [#1189](https://github.com/PyO3/maturin/pull/1189) * Add Python metadata support for `license-file` field of `Cargo.toml` in [#1195](https://github.com/PyO3/maturin/pull/1195) * Upgrade to clap 4.0 in [#1197](https://github.com/PyO3/maturin/pull/1197). This bumps MSRV to 1.61.0. * Remove `workspace.members` in `Cargo.toml` from sdist if there isn't any path dependency in #[1227](https://github.com/PyO3/maturin/pull/1227) * Fix auditwheel `libpython` check on Python 3.7 and older versions in [#1229](https://github.com/PyO3/maturin/pull/1229) * Use generic tags when `sys.implementation.name` != `platform.python_implementation()` in [#1232](https://github.com/PyO3/maturin/pull/1232). Fixes the compatibility tags for Pyston. * Set default macOS deployment target version if `MACOSX_DEPLOYMENT_TARGET` isn't specified in [#1251](https://github.com/PyO3/maturin/pull/1251) * Add support for 32-bit x86 FreeBSD target in [#1254](https://github.com/PyO3/maturin/pull/1254) * Add `[tool.maturin.include]` and `[tool.maturin.exclude]` and deprecate `[tool.maturin.sdist-include]` [#1255](https://github.com/PyO3/maturin/pull/1255) * Ignore sdist tar ball instead of error out in [#1259](https://github.com/PyO3/maturin/pull/1259) * Add support for [`uniffi`](https://github.com/mozilla/uniffi-rs) bindings in [#1275](https://github.com/PyO3/maturin/pull/1275) ## [0.13.7] - 2022-10-29 * Fix macOS `LC_ID_DYLIB` for abi3 wheels in [#1208](https://github.com/PyO3/maturin/pull/1208) * Pass `--locked` to Cargo when bootstrap from sdist in [#1212](https://github.com/PyO3/maturin/pull/1212) * Fix build for Python 3.11 on Windows in [#1222](https://github.com/PyO3/maturin/pull/1222) ## [0.13.6] - 2022-10-08 * Fix `maturin develop` in Windows conda virtual environment in [#1146](https://github.com/PyO3/maturin/pull/1146) * Fix build for crate using `pyo3` and `build.rs` without `cdylib` crate type in [#1150](https://github.com/PyO3/maturin/pull/1150) * Fix build on some 32-bit platform by downgrading `indicatif` in [#1163](https://github.com/PyO3/maturin/pull/1163) * Include `Cargo.lock` by default in source distribution in [#1170](https://github.com/PyO3/maturin/pull/1170) ## [0.13.5] - 2022-09-27 * Fix resolving crate name bug in [#1142](https://github.com/PyO3/maturin/pull/1142) ## [0.13.4] - 2022-09-27 * Fix `Cargo.toml` in new project template in [#1109](https://github.com/PyO3/maturin/pull/1109) * Fix `maturin develop` on Windows when using Python installed from msys2 in [#1112](https://github.com/PyO3/maturin/pull/1112) * Fix duplicated `Cargo.toml` of local dependencies in sdist in [#1114](https://github.com/PyO3/maturin/pull/1114) * Add support for Cargo workspace dependencies inheritance in [#1123](https://github.com/PyO3/maturin/pull/1123) * Add support for Cargo workspace metadata inheritance in [#1131](https://github.com/PyO3/maturin/pull/1131) * Use `goblin` instead of shelling out to `patchelf` to get rpath in [#1139](https://github.com/PyO3/maturin/pull/1139) ## [0.13.3] - 2022-09-15 * Allow user to override default Emscripten settings in [#1059](https://github.com/PyO3/maturin/pull/1059) * Enable `--crate-type cdylib` on Rust 1.64.0 in [#1060](https://github.com/PyO3/maturin/pull/1060) * Update MSRV to 1.59.0 in [#1071](https://github.com/PyO3/maturin/pull/1071) * Fix abi3 wheel build when no Python interpreters found in [#1072](https://github.com/PyO3/maturin/pull/1072) * Add `zig ar` support in [#1073](https://github.com/PyO3/maturin/pull/1073) * Fix sdist build for optional path dependencies in [#1084](https://github.com/PyO3/maturin/pull/1084) * auditwheel: find dylibs in Cargo target directory in [#1092](https://github.com/PyO3/maturin/pull/1092) * Add library search paths in Cargo target directory to rpath in editable mode on Linux in [#1094](https://github.com/PyO3/maturin/pull/1094) * Remove default manifest path for `maturin sdist` command in [#1097](https://github.com/PyO3/maturin/pull/1097) * Fix sdist when `pyproject.toml` isn't in the same dir of `Cargo.toml` in [#1099](https://github.com/PyO3/maturin/pull/1099) * Change readme and license paths in `pyproject.toml` to be relative to `pyproject.toml` in [#1100](https://github.com/PyO3/maturin/pull/1100). It's technically a **breaking change**, but previously it doesn't work properly. * Add python source files specified in pyproject.toml to sdist in [#1102](https://github.com/PyO3/maturin/pull/1102) * Change `sdist-include` paths to be relative to `pyproject.toml` in [#1103](https://github.com/PyO3/maturin/pull/1103) ## [0.13.2] - 2022-08-14 * Deprecate manylinux 2010 support in [#858](https://github.com/PyO3/maturin/pull/858). The [manylinux](https://github.com/pypa/manylinux) project already dropped its support and the rustc compiler will [drop glibc 2.12 support in 1.64.0](https://blog.rust-lang.org/2022/08/01/Increasing-glibc-kernel-requirements.html). * Add Linux mips64el architecture support in [#1023](https://github.com/PyO3/maturin/pull/1023) * Add Linux mipsel architecture support in [#1024](https://github.com/PyO3/maturin/pull/1024) * Add Linux 32-bit powerpc architecture support in [#1026](https://github.com/PyO3/maturin/pull/1026) * Add Linux sparc64 architecture support in [#1027](https://github.com/PyO3/maturin/pull/1027) * Add PEP 440 local version identifier support in [#1037](https://github.com/PyO3/maturin/pull/1037) * Fix inconsistent `Cargo.toml` and `pyproject.toml` path handling in [#1043](https://github.com/PyO3/maturin/pull/1043) * Find python module next to `pyproject.toml` if `pyproject.toml` exists in [#1044](https://github.com/PyO3/maturin/pull/1044). It's technically a **breaking change**, but previously it doesn't work properly if the directory containing `pyproject.toml` isn't recognized as project root. * Add `python-source` option to `[tool.maturin]` section of pyproject.toml in [#1046](https://github.com/PyO3/maturin/pull/1046) * Deprecate support for specifying python metadata in `Cargo.toml` in [#1048](https://github.com/PyO3/maturin/pull/1048). Please migrate to [PEP 621](https://peps.python.org/pep-0621/) instead. * Change `python-source` to be relative to the file specifies it in [#1049](https://github.com/PyO3/maturin/pull/1049) * Change `data` to be relative to the file specifies it in [#1051](https://github.com/PyO3/maturin/pull/1051) * Don't reinstall dependencies in `maturin develop` in [#1052](https://github.com/PyO3/maturin/pull/1052) * Find `pyproject.toml` in parent directories of `Cargo.toml` in [#1054](https://github.com/PyO3/maturin/pull/1054) ## [0.13.1] - 2022-07-26 * Add 64-bit RISC-V support by felixonmars in [#1001](https://github.com/PyO3/maturin/pull/1001) * Add support for invoking with `python3 -m maturin` in [#1008](https://github.com/PyO3/maturin/pull/1008) * Fix detection of optional dependencies when declaring `features` in `pyproject.toml` in [#1014](https://github.com/PyO3/maturin/pull/1014) * Respect user specified Rust target in `maturin develop` in [#1016](https://github.com/PyO3/maturin/pull/1016) * Use `cargo rustc --crate-type cdylib` on Rust nightly/dev channel in [#1020](https://github.com/PyO3/maturin/pull/1020) ## [0.13.0] - 2022-07-09 * **Breaking Change**: Drop support for python 3.6, which is end of life in [#945](https://github.com/PyO3/maturin/pull/945) * **Breaking Change**: Don't build source distribution by default in `maturin build` command in [#955](https://github.com/PyO3/maturin/pull/955), `--no-sdist` option is replaced by `--sdist` * **Breaking Change**: maturin no longer search for python interpreters by default and only build for current interpreter in `PATH` in [#964](https://github.com/PyO3/maturin/pull/964) * **Breaking Change**: Removed `--cargo-extra-args` and `--rustc-extra-args` options in [#972](https://github.com/PyO3/maturin/pull/972). You can now pass all common `cargo build` arguments directly to `maturin build` * **Breaking Change**: `--repository-url` option in `upload` command no longer accepts plain repository name, full url required and `-r` short option moved to `--repository` in [#987](https://github.com/PyO3/maturin/pull/987) * Add support for building with multiple binary targets in [#948](https://github.com/PyO3/maturin/pull/948) * Add a `--target` option to `maturin list-python` command in [#957](https://github.com/PyO3/maturin/pull/957) * Add support for using bundled python sysconfigs for PyPy when abi3 feature is enabled in [#958](https://github.com/PyO3/maturin/pull/958) * Add support for cross compiling PyPy wheels when abi3 feature is enabled in [#963](https://github.com/PyO3/maturin/pull/963) * Add `--find-interpreter` option to `build` and `publish` commands to search for python interpreters in [#964](https://github.com/PyO3/maturin/pull/964) * Infer target triple from `ARCHFLAGS` for macOS to be compatible with `cibuildwheel` in [#967](https://github.com/PyO3/maturin/pull/967) * Expose commonly used Cargo CLI options in `maturin build` command in [#972](https://github.com/PyO3/maturin/pull/972) * Add support for `wasm32-unknown-emscripten` target in [#974](https://github.com/PyO3/maturin/pull/974) * Allow overriding platform release version using env var in [#975](https://github.com/PyO3/maturin/pull/975) * Fix `maturin develop` for arm64 Python on M1 Mac when default toolchain is x86_64 in [#980](https://github.com/PyO3/maturin/pull/980) * Add `--repository` option to `maturin upload` command in [#987](https://github.com/PyO3/maturin/pull/987) * Only lookup bundled Python sysconfig when interpreters aren't specified as file path in [#988](https://github.com/PyO3/maturin/pull/988) * Find CPython upper to 3.12 and PyPy upper to 3.10 in [#993](https://github.com/PyO3/maturin/pull/993) * Add short alias `maturin b` for `maturin build` and `maturin dev` for `maturin develop` subcommands in [#994](https://github.com/PyO3/maturin/pull/994) ## [0.12.20] - 2022-06-15 * Fix incompatibility with cibuildwheel for 32-bit Windows in [#951](https://github.com/PyO3/maturin/pull/951) * Don't require `pip` error messages to be utf-8 encoding in [#953](https://github.com/PyO3/maturin/pull/953) * Compare minimum python version requirement between `requires-python` and bindings crate in [#954](https://github.com/PyO3/maturin/pull/954) * Set `PYO3_PYTHON` env var for PyPy when abi3 is enabled in [#960](https://github.com/PyO3/maturin/pull/960) * Add sysconfigs for x64 Windows PyPy in [#962](https://github.com/PyO3/maturin/pull/962) * Add support for Linux armv6l in [#966](https://github.com/PyO3/maturin/pull/966) * Fix auditwheel bundled shared libs directory name in [#969](https://github.com/PyO3/maturin/pull/969) ## [0.12.19] - 2022-06-05 * Fix Windows Store install detection in [#949](https://github.com/PyO3/maturin/pull/949) * Filter Python interpreters by target pointer width on Windows in [#950](https://github.com/PyO3/maturin/pull/950) ## [0.12.18] - 2022-05-29 * Add support for building bin bindings wheels with multiple platform tags in [#928](https://github.com/PyO3/maturin/pull/928) * Skip auditwheel for non-compliant linux environment automatically in [#931](https://github.com/PyO3/maturin/pull/931) * Fix abi3 wheel build issue when no Python interpreters found on host in [#933](https://github.com/PyO3/maturin/pull/933) * Add Python 3.11 sysconfigs for Linux, macOS and Windows in [#934](https://github.com/PyO3/maturin/pull/934) * Add Python 3.11 sysconfig for arm64 Windows in [#936](https://github.com/PyO3/maturin/pull/936) * Add network proxy support to upload command in [#939](https://github.com/PyO3/maturin/pull/939) * Fix python interpreter detection on arm64 Windows in [#940](https://github.com/PyO3/maturin/pull/940) * Fallback to `py -X.Y` when `pythonX.Y` cannot be found on Windows in [#943](https://github.com/PyO3/maturin/pull/943) * Auto-detect Python Installs from Microsoft Store in [#944](https://github.com/PyO3/maturin/pull/944) * Add bindings detection to bin targets in [#938](https://github.com/PyO3/maturin/pull/938) ## [0.12.17] - 2022-05-18 * Don't consider compile to i686 on x86_64 Windows cross compiling in [#923](https://github.com/PyO3/maturin/pull/923) * Accept `-i x.y` and `-i python-x.y` in `maturin build` command in [#925](https://github.com/PyO3/maturin/pull/925) ## [0.12.16] - 2022-05-16 * Add Linux armv7l python sysconfig in [#901](https://github.com/PyO3/maturin/pull/901) * Add NetBSD python sysconfig in [#903](https://github.com/PyO3/maturin/pull/903) * Update 'replace_needed' to reduce total calls to 'patchelf' in [#905](https://github.com/PyO3/maturin/pull/905) * Add wheel data support in [#906](https://github.com/PyO3/maturin/pull/906) * Allow use python interpreters from bundled sysconfig when not cross compiling in [#907](https://github.com/PyO3/maturin/pull/907) * Use setuptools-rust for bootstrapping in [#909](https://github.com/PyO3/maturin/pull/909) * Allow setting the publish repository URL via `MATURIN_REPOSITORY_URL` in [#913](https://github.com/PyO3/maturin/pull/913) * Allow stubs-only mixed project layout in [#914](https://github.com/PyO3/maturin/pull/914) * Allow setting the publish user name via `MATURIN_USERNAME` in [#915](https://github.com/PyO3/maturin/pull/915) * Add Windows python sysconfig in [#917](https://github.com/PyO3/maturin/pull/917) * Add support for `generate-import-lib` feature of pyo3 in [#918](https://github.com/PyO3/maturin/pull/918) * Integrate [`cargo-xwin`](https://github.com/messense/cargo-xwin) for cross compiling to Windows MSVC targets in [#919](https://github.com/PyO3/maturin/pull/919) ## [0.12.15] - 2022-05-07 * Re-export `__all__` for pure Rust projects in [#886](https://github.com/PyO3/maturin/pull/886) * Stop setting `RUSTFLAGS` environment variable to an empty string in [#887](https://github.com/PyO3/maturin/pull/887) * Add hardcoded well-known sysconfigs for effortless cross compiling in [#896](https://github.com/PyO3/maturin/pull/896) * Add support for `PYO3_CONFIG_FILE` in [#899](https://github.com/PyO3/maturin/pull/899) ## [0.12.14] - 2022-04-25 * Fix PyPy pep517 build when abi3 feature is enabled in [#883](https://github.com/PyO3/maturin/pull/883) ## [0.12.13] - 2022-04-25 * Stop setting `PYO3_NO_PYTHON` environment variable for pyo3 0.16.4 and later in [#875](https://github.com/PyO3/maturin/pull/875) * Build Windows abi3 wheels for `pyo3` 0.16.4 and later versions with `generate-abi3-import-lib` feature enabled no longer require a Python interpreter in [#879](https://github.com/PyO3/maturin/pull/879) ## [0.12.12] - 2022-04-07 * Migrate docker image to GitHub container registry in [#845](https://github.com/PyO3/maturin/pull/845) * Change mixed rust/python template project layout for new projects in [#855](https://github.com/PyO3/maturin/pull/855) * Automatically include license files in `.dist-info/license_files` following PEP 639 in [#862](https://github.com/PyO3/maturin/pull/862) * Bring back multiple values support for `--interpreter` option in [#873](https://github.com/PyO3/maturin/pull/873) * Update the default edition to 2021 for new projects by sa- in [#874](https://github.com/PyO3/maturin/pull/874) * Drop `python3.6` from `ghcr.io/pyo3/maturin` docker image. ## [0.12.11] - 2022-03-15 * Package license files in `.dist-info/license_files` following PEP 639 in [#837](https://github.com/PyO3/maturin/pull/837) * Stop testing Python 3.6 on CI since it's already EOL in [#840](https://github.com/PyO3/maturin/pull/840) * Update workspace members for sdist local dependencies in [#844](https://github.com/PyO3/maturin/pull/844) * Migrate docker image to github container registry in [#845](https://github.com/PyO3/maturin/pull/845) * Remove `PYO3_NO_PYTHON` hack for Windows in [#848](https://github.com/PyO3/maturin/pull/848) * Remove Windows abi3 python lib link hack in [#851](https://github.com/PyO3/maturin/pull/851) * Add `-r` option as a short alias for `--release` in [#854](https://github.com/PyO3/maturin/pull/854) ## [0.12.10] - 2022-03-09 * Add support for `pyo3-ffi` by ijl in [#804](https://github.com/PyO3/maturin/pull/804) * Defaults to `musllinux_1_2` for musl target if it's not bin bindings in [#808](https://github.com/PyO3/maturin/pull/808) * Remove support for building only sdist via `maturin build -i` in [#813](https://github.com/PyO3/maturin/pull/813), use `maturin sdist` instead. * Add macOS target support for `--zig` in [#817](https://github.com/PyO3/maturin/pull/817) * Migrate Python dependency `toml` to `tomllib` / `tomli` by Contextualist in [#821](https://github.com/PyO3/maturin/pull/821) * Disable auditwheel for PEP 517 build wheel process in [#823](https://github.com/PyO3/maturin/pull/823) * Lookup existing cffi `header.h` in workspace target directory in [#833](https://github.com/PyO3/maturin/pull/833) * Fix license line ending in wheel metadata for Windows in [#836](https://github.com/PyO3/maturin/pull/836) ## [0.12.9] - 2022-02-09 * Don't require `pyproject.toml` when cargo manifest is not specified in [#806](https://github.com/PyO3/maturin/pull/806) ## [0.12.8] - 2022-02-08 * Add missing `--version` flag from clap 3.0 upgrade ## [0.12.7] - 2022-02-08 * Add support for using [`zig cc`](https://andrewkelley.me/post/zig-cc-powerful-drop-in-replacement-gcc-clang.html) as linker for easier cross compiling and manylinux compliance in [#756](https://github.com/PyO3/maturin/pull/756) * Switch from reqwest to ureq to reduce dependencies in [#767](https://github.com/PyO3/maturin/pull/767) * Fix missing Python submodule in wheel in [#772](https://github.com/PyO3/maturin/pull/772) * Add support for specifying cargo manifest path in pyproject.toml in [#781](https://github.com/PyO3/maturin/pull/781) * Add support for passing arguments to pep517 command via `MATURIN_PEP517_ARGS` env var in [#786](https://github.com/PyO3/maturin/pull/786) * Fix auditwheel `No such file or directory` error when `LD_LIBRARY_PATH` contains non-existent paths in [#794](https://github.com/PyO3/maturin/pull/794) ## [0.12.6] - 2021-12-31 * Add support for repairing cross compiled linux wheels in [#754](https://github.com/PyO3/maturin/pull/754) * Add support for `manylinux_2_28` and `manylinux_2_31` in [#755](https://github.com/PyO3/maturin/pull/755) * Remove existing so file first in `maturin develop` command to avoid triggering SIGSEV in running process in [#760](https://github.com/PyO3/maturin/pull/760) ## [0.12.5] - 2021-12-20 * Fix docs for `new` and `init` commands in `maturin --help` in [#734](https://github.com/PyO3/maturin/pull/734) * Add support for x86_64 Haiku in [#735](https://github.com/PyO3/maturin/pull/735) * Fix undefined auditwheel policy panic in [#740](https://github.com/PyO3/maturin/pull/740) * Fix sdist upload for packages where the pkgname contains multiple underscores in [#741](https://github.com/PyO3/maturin/pull/741) * Implement auditwheel repair with patchelf in [#742](https://github.com/PyO3/maturin/pull/742) * Add `Cargo.lock` to sdist when `--locked` or `--frozen` specified in [#749](https://github.com/PyO3/maturin/pull/749) * Infer readme file if not specified in [#751](https://github.com/PyO3/maturin/pull/751) ## [0.12.4] - 2021-12-06 * Add a `maturin init` command as a companion to `maturin new` in [#719](https://github.com/PyO3/maturin/pull/719) * Don't package non-path-dep crates in sdist for workspaces in [#720](https://github.com/PyO3/maturin/pull/720) * Build release packages with `password-storage` feature in [#725](https://github.com/PyO3/maturin/pull/725) * Add support for x86_64 DargonFly BSD in [#727](https://github.com/PyO3/maturin/pull/727) * Add a Python import hook in [#729](https://github.com/PyO3/maturin/pull/729) * Allow pip warnings in `maturin develop` command in [#732](https://github.com/PyO3/maturin/pull/732) ## [0.12.3] - 2021-11-29 * Use platform tag from `sysconfig.platform` on non-portable Linux in [#709](https://github.com/PyO3/maturin/pull/709) * Consider current machine architecture when generating platform tags for abi3 wheels on linux in [#709](https://github.com/PyO3/maturin/pull/709) * Revert back to Rust 2018 edition in [#710](https://github.com/PyO3/maturin/pull/710) * Warn missing `cffi` package dependency in [#711](https://github.com/PyO3/maturin/pull/711) * Add support for Illumos in [#712](https://github.com/PyO3/maturin/pull/712) * Account for `MACOSX_DEPLOYMENT_TARGET` env var in wheel platform tag in [#716](https://github.com/PyO3/maturin/pull/716) ## [0.12.2] - 2021-11-26 * Add support for excluding files from wheels by `.gitignore` in [#695](https://github.com/PyO3/maturin/pull/695) * Fix `pip install maturin` on OpenBSD 6.8 in [#697](https://github.com/PyO3/maturin/pull/697) * Add support for x86, x86_64 and aarch64 on NetBSD in [#704](https://github.com/PyO3/maturin/pull/704) * Add a `maturin new` command for bootstrapping new projects in [#705](https://github.com/PyO3/maturin/pull/705) ## [0.12.1] - 2021-11-21 * Add support for cross compiling PyPy wheels in [#687](https://github.com/PyO3/maturin/pull/687) * Fix `sysconfig.get_platform` parsing for macOS in [#690](https://github.com/PyO3/maturin/pull/690) ## [0.12.0] - 2021-11-19 * Add support for PEP 660 editable installs in [#648](https://github.com/PyO3/maturin/pull/648) * Publish musllinux_1_1 wheels for maturin in [#651](https://github.com/PyO3/maturin/pull/651) * Refactor `develop` command to act identical to PEP 660 editable wheels in [#653](https://github.com/PyO3/maturin/pull/653) * Upgrade to Rust 2021 edition in [#655](https://github.com/PyO3/maturin/pull/655) * Add support for powerpc64 and powerpc64le on FreeBSD by pkubaj in [#656](https://github.com/PyO3/maturin/pull/656) * Fix false positive missing pyinit warning on arm64 macOS in [#673](https://github.com/PyO3/maturin/pull/673) * Build without rustls on arm64 Windows by nsait-linaro in [#674](https://github.com/PyO3/maturin/pull/674) * Publish Windows arm64 wheels to PyPI by nsait-linaro in [#675](https://github.com/PyO3/maturin/pull/675) * Add support for building on Windows mingw platforms in [#677](https://github.com/PyO3/maturin/pull/677) * Allow building for non-abi3 pypy wheels when the abi3 feature is enabled in [#678](https://github.com/PyO3/maturin/pull/678) * Add support for cross compiling to different operating systems in [#680](https://github.com/PyO3/maturin/pull/680) ## [0.11.5] - 2021-10-13 * Fixed module documentation missing bug of pyo3 bindings in [#639](https://github.com/PyO3/maturin/pull/639) * Fix musllinux auditwheel wrongly detects libc forbidden link in [#643](https://github.com/PyO3/maturin/pull/643) * Fix finding conda Python interpreters on Windows by RobertColton in [#644](https://github.com/PyO3/maturin/pull/644) * Fix Unicode metadata when uploading to PyPI in [#645](https://github.com/PyO3/maturin/pull/645) * Fix incorrectly folded long `Summary` metadata * Fix cross compilation for Python 3.10 in [#646](https://github.com/PyO3/maturin/pull/646) ## [0.11.4] - 2021-09-28 * Autodetect PyPy executables in [#617](https://github.com/PyO3/maturin/pull/617) * auditwheel: add `libz.so.1` to whitelisted libraries in [#625](https://github.com/PyO3/maturin/pull/625) * auditwheel: detect musl libc in [#629](https://github.com/PyO3/maturin/pull/629) * Fixed Python 3.10 and later versions detection on Windows in [#630](https://github.com/PyO3/maturin/pull/630) * Install entrypoint scripts in `maturin develop` command in [#633](https://github.com/PyO3/maturin/pull/633) and [#634](https://github.com/PyO3/maturin/pull/634) * Add support for installing optional dependencies in `maturin develop` command in [#635](https://github.com/PyO3/maturin/pull/635) * Fixed build error when `manylinux`/`compatibility` options is specified in `pyproject.toml` in [#637](https://github.com/PyO3/maturin/pull/637) ## [0.11.3] - 2021-08-25 * Add path option for Python source in [#584](https://github.com/PyO3/maturin/pull/584) * Add auditwheel support for musllinux in [#597](https://github.com/PyO3/maturin/pull/597) * `[tool.maturin]` options from `pyproject.toml` will be used automatically in [#605](https://github.com/PyO3/maturin/pull/605) * Skip unavailable Python interpreters from pyenv in [#609](https://github.com/PyO3/maturin/pull/609) ## [0.11.2] - 2021-07-20 * Use UTF-8 encoding when reading `pyproject.toml` by domdfcoding in [#588](https://github.com/PyO3/maturin/pull/588) * Use Cargo's `repository` field as `Source Code` in project URL in [#590](https://github.com/PyO3/maturin/pull/590) * Fold long header fields in Python metadata in [#594](https://github.com/PyO3/maturin/pull/594) * Fix `maturin develop` for PyPy on Unix in [#596](https://github.com/PyO3/maturin/pull/596) ## [0.11.1] - 2021-07-10 * Fix sdist error when VCS has uncommitted renamed files in [#585](https://github.com/PyO3/maturin/pull/585) * Add `maturin completions ` command to generate shell completions in [#586](https://github.com/PyO3/maturin/pull/586) ## [0.11.0] - 2021-07-04 * Add support for reading metadata from [PEP 621](https://www.python.org/dev/peps/pep-0621/) project table in `pyproject.toml` in [#555](https://github.com/PyO3/maturin/pull/555) * Users should migrate away from the old `[package.metadata.maturin]` table of `Cargo.toml` to this new `[project]` table of `pyproject.toml` * Add PEP 656 musllinux support in [#543](https://github.com/PyO3/maturin/pull/543) * `--manylinux` is now called `--compatibility` and supports musllinux * The pure rust install layout changed from just the shared library to a python module that reexports the shared library. This should have now observable consequences for users of the created wheel expect that `my_project.my_project` is now also importable (and equal to just `my_project`) * Add support for packaging type stubs in pure Rust project layout in [#567](https://github.com/PyO3/maturin/pull/567) * Support i386 on OpenBSD in [#568](https://github.com/PyO3/maturin/pull/568) * Support Aarch64 on OpenBSD in [#570](https://github.com/PyO3/maturin/pull/570) * Support Aarch64 on FreeBSD in [#571](https://github.com/PyO3/maturin/pull/571) * `Cargo.toml`'s `authors` field is now optional per Rust [RFC 3052](https://github.com/rust-lang/rfcs/blob/master/text/3052-optional-authors-field.md) in [#573](https://github.com/PyO3/maturin/pull/573) * Allow dotted keys in `Cargo.toml` by switch from `toml_edit` to `toml` crate in [#577](https://github.com/PyO3/maturin/pull/577) * Fix source distribution with local path dependencies on Windows in [#580](https://github.com/PyO3/maturin/pull/580) ## [0.10.6] - 2021-05-21 * Fix corrupted macOS binary release in [#547](https://github.com/PyO3/maturin/pull/547) * Fix build with the "upload" feature disabled by ravenexp in [#548](https://github.com/PyO3/maturin/pull/548) ## [0.10.5] - 2021-05-21 * Add `manylinux_2_27` support in [#521](https://github.com/PyO3/maturin/pull/521) * Add support for Windows arm64 target in [#524](https://github.com/PyO3/maturin/pull/524) * Always output PEP 600 platform tags in [#525](https://github.com/PyO3/maturin/pull/525) * Fix missing `PyInit_` warning with Rust submodule in [#528](https://github.com/PyO3/maturin/pull/528) * Better cross compiling support for PyO3 binding on Unix in [#454](https://github.com/PyO3/maturin/pull/454) * Fix s390x architecture support in [#530](https://github.com/PyO3/maturin/pull/530) * Fix auditwheel panic with s390x wheels in [#532](https://github.com/PyO3/maturin/pull/532) * Support uploading heterogeneous wheels by ravenexp in [#544](https://github.com/PyO3/maturin/pull/544) * Warn about `pyproject.toml` missing maturin version constraint in [#545](https://github.com/PyO3/maturin/pull/545) ## [0.10.4] - 2021-04-28 * Interpreter search now uses python 3.6 to 3.12 in [#495](https://github.com/PyO3/maturin/pull/495) * Consider requires-python when searching for interpreters in [#495](https://github.com/PyO3/maturin/pull/495) * Support Rust extension as a submodule in mixed Python/Rust projects in [#489](https://github.com/PyO3/maturin/pull/489) ## [0.10.3] - 2021-04-13 * The `upload` command is now implemented, it is mostly similar to `twine upload`. [#484](https://github.com/PyO3/maturin/pull/484) * Interpreter search now uses python 3.6 to 3.12 * Add basic support for OpenBSD in [#496](https://github.com/PyO3/maturin/pull/496) * Fix the PowerPC platform by messense in [#503](https://github.com/PyO3/maturin/pull/503) ## [0.10.2] - 2021-04-03 * Fix `--target` being silently ignored ## [0.10.1] - 2021-04-03 * Fix a regression in 0.10.0 that would incorrectly assume we're building for musl instead of gnu by messense in [#487](https://github.com/PyO3/maturin/pull/487) * Basic s390x support ## [0.10.0] - 2021-04-02 * Change manylinux default version based on target arch by messense in [#424](https://github.com/PyO3/maturin/pull/424) * Support local path dependencies in source distribution (i.e. you can now package a workspace into an sdist) * Set a more reasonable LC_ID_DYLIB entry on macOS by messense [#433](https://github.com/PyO3/maturin/pull/433) * Add `--skip-existing` option to publish by messense [#444](https://github.com/PyO3/maturin/pull/444) * maturn develop install dependencies automatically by messense [#443](https://github.com/PyO3/maturin/pull/443) * Load credential from pypirc using repository name instead of package name by messense [#445](https://github.com/PyO3/maturin/pull/445) * Add `manylinux_2_24` support in [#451](https://github.com/PyO3/maturin/pull/451) * Improve error message when auditwheel failed to find versioned offending symbols in [#452](https://github.com/PyO3/maturin/pull/452) * Add auditwheel test to CI in [#455](https://github.com/PyO3/maturin/pull/455) * Fix sdist transitive path dependencies. * auditwheel choose higher priority tag when possible in [#456](https://github.com/PyO3/maturin/pull/456), dropped `auditwheel` Cargo feature. * develop now writes an [INSTALLER](https://packaging.python.org/specifications/recording-installed-packages/#the-installer-file) file * develop removes an old .dist-info directory if it exists before installing the new one * Fix wheels for PyPy on windows containing extension modules with incorrect names. [#482](https://github.com/PyO3/maturin/pull/482) ## [0.9.4] - 2021-02-18 * Fix building a bin with musl ## [0.9.3] * CI failure ## [0.9.2] - 2021-02-17 * Escape version in wheel metadata by messense in [#420](https://github.com/PyO3/maturin/pull/420) * Set executable bit on shared library by messense in [#421](https://github.com/PyO3/maturin/pull/421) * Rename `classifier` to `classifiers` for pypi compatibility. The old `classifier` is still available and now also works with pypi * Fix building for musl by automatically setting `-C target-feature=-crt-static` ## [0.9.1] - 2021-01-13 * Error when the `abi3` feature is selected but no minimum version * Support building universal2 wheels (x86 and aarch64 in a single file) by messense in [#403](https://github.com/PyO3/maturin/pull/403) * Recognize `PYO3_CROSS_LIB_DIR` for cross compiling with abi3 targeting windows. * `package.metadata.maturin.classifier` is renamed to `classifiers` by kngwyu in [#416](https://github.com/PyO3/maturin/pull/416) * Added more instructions to building complex manylinux setups ## [0.9.0] - 2021-01-10 * Added support for building abi3 wheels with pyo3 0.13.1 * Python 3.9 is supported (it should have worked before, but it is now tested on ci) * There are 64-bit and aarch64 binary builds for linux and 64-bit builds for windows, mac and freebsd-12-1 * The auditwheel options have changed to `--manylinux=[off|2010|2014]` with manylinux2010 as default, and optionally `--skip-auditwheel`. * Removed Python 3.5 since it is unsupported * The default and minimum manylinux version is now manylinux2010 * restructured text (rst) readmes are now supported, by clbarnes in [#360](https://github.com/PyO3/maturin/pull/360) * Allow python 3 interpreter with debuginfo use maturin by inevity in [#370](https://github.com/PyO3/maturin/pull/370) * pypirc is checked for credentials by houqp in [#374](https://github.com/PyO3/maturin/pull/374) * Added support for PowerPC by mzpqnxow and programmerjake in [#366](https://github.com/PyO3/maturin/pull/366) * `project-url` is now a toml dictionary instead of a toml list to conform to the standard * No more retry loop when the password was wrong * When bootstrapping, also search for `cargo.exe` if `cargo` was not found ## [0.8.3] - 2020-08-17 ### Added * tox is now supported due to a bugfix in the latest version of tox * `[tool.maturin]` now supports `sdist-include = ["path/**/*"]` to include arbitrary files in source distributions ([#296](https://github.com/PyO3/maturin/pull/296)). * Add support for PyO3 `0.12`'s `PYO3_PYTHON` environment variable. [#331](https://github.com/PyO3/maturin/pull/331) ### Fixed * Fix incorrectly returning full path (not basename) from PEP 517 `build_sdist` hook. This fixes tox support from maturin's side * Packages installed with `maturin develop` are now visible to pip and can be uninstalled with pip ## [0.8.2] - 2020-06-29 ### Added * Python 3.8 was added to PATH in the docker image by oconnor663 in [#302](https://github.com/PyO3/maturin/pull/302) ## [0.8.1] - 2020-04-30 ### Added * cffi is installed if it's missing and python is running inside a virtualenv. ## [0.8.0] - 2020-04-03 ### Added * There is now a binary wheel for aarch64 * Warn if there are local dependencies ### Fixed * Omit author_email if `@` is not found in authors by evandrocoan in [#290](https://github.com/PyO3/maturin/pull/290) ## [0.7.9] - 2020-03-06 ### Fixed * This release includes binary wheels for mac os ## [0.7.8] - 2020-03-06 ### Added * Added support from arm, specifically arm7l, aarch64 by ijl in [#273](https://github.com/PyO3/maturin/pull/273) * Added support for manylinux2014 by ijl in [#273](https://github.com/PyO3/maturin/pull/273) ### Fixed * Remove python 2 from tags by ijl in [#254](https://github.com/PyO3/maturin/pull/254) * 32-bit wheels didn't work on linux. This has been fixed by dae in [#250](https://github.com/PyO3/maturin/pull/250) * The path of the RECORD file on windows used a backward slash instead of a forward slash ## [0.7.7] - 2019-11-12 ### Added * The setup.py installer for bootstrapping maturin now checks for cargo instead of failing with a complex error message. * Upload errors now show the filesize ### Changed * maturin's metadata now lists a requirement of python3.5 or later to install. ## [0.7.6] - 2019-09-28 ### Changed * Only `--features`, `--no-default-features` and `--all-features` in `--cargo-extra-args` are passed to `cargo metadata` when determining the bindings, fixing problems in the previous release with arguments supported by `cargo build` but by `cargo metadata`. ## [0.7.5] - 2019-09-24 ### Fixed * Fix clippy error to fix publishing from ci ## [0.7.4] - 2019-09-22 ### Fixed * Fix tests ## [0.7.3] - 2019-09-22 ### Fixed * Fix building when the bindings crate is behind a feature flag ## [0.7.3] - 2019-09-22 ## Removed * The manylinux docker container doesn't contain musl anymore. If you're targeting musl, there's no need to use manylinux. ## [0.7.2] - 2019-09-05 ### Added * Allow cross compilation with cffi and a python interpreter with the host target ### Fixed * Renamed a folder to maturin so PEP 517 backend works again. ## [0.7.1] - 2019-08-31 ### Added * `maturin build --interpreter`/`maturin publish --interpreter` builds only a source distribution. ## [0.7.0] - 2019-08-30 With this release, the name of this project changes from _pyo3-pack_ to _maturin_. ### Added * Mixed rust/python layout * Added PEP 517 support * Added a `maturin sdist` command as workaround for [pypa/pip#6041](https://github.com/pypa/pip/issues/6041) * Support settings all applicable fields from the python core metadata specification in Cargo.toml * Support for FreeBSD by kxepal [#173](https://github.com/PyO3/maturin/pull/173) ## [0.6.1] ### Fixed * Downgraded to structopt 0.2.16 to avoid the yanked 0.2.17 ## [0.6.0] ### Added * Basic pypy support by ijl [#105](https://github.com/PyO3/maturin/pull/105) ### Removed * Python 2 support * The custom progress bar was removed and cargo's output is shown instead ## [0.5.0] ### Added * Support for conda environments on windows by paddyhoran [#52](https://github.com/PyO3/maturin/pull/52) * maturin will generate a header for cffi crates using cbinding, which means you don't need a `build.rs` anymore. The option to provide your own header file using a `build.rs` still exists. * The [konstin2/maturin](https://cloud.docker.com/u/konstin2/repository/docker/konstin2/maturin) docker image makes it easy to build fully manylinux compliant wheels. See the readme for usage details. * Support for manylinux2010 by ijl [#70](https://github.com/PyO3/maturin/pull/70) * The `--manxlinux=[1|1-unchecked|2010|2010-unchecked|off]` option allows to build for manylinux1 and manylinux2010, both with audithweel (`1` or `2010`) and without (`1-unchecked` or `2010-unchecked`), but also for the native linux tag with `off`. ### Changed * The `--skip-auditwheel` flag has been deprecated in favor of `--manylinux=[1|1-unchecked|2010|2010-unchecked|off]`. * Switched to rustls. This means the upload feature can be used from the docker container and builds of maturin itself are manylinux compliant when compiled with the musl target. ## [0.4.2] - 2018-12-15 Fixup release because the appveyor failed to release artifacts for windows for 0.4.1. ## [0.4.1] - 2018-12-15 ### Added * You can now specify [trove classifiers](https://pypi.org/classifiers/) in your Cargo.toml with `package.metadata.maturin.classifier`. Implemented by ijl in [#48](https://github.com/PyO3/maturin/pull/48). Example: ```toml [package.metadata.maturin] classifier = ["Programming Language :: Python"] ``` ## [0.4.0] - 2018-11-20 ### Changed * publish defaults to release and strip, unless `--debug` or `--no-strip` are given. ### Added * New ci script based on hyperfine which also builds debian packages. ## [0.3.10] - 2018-11-16 ### Fixed * Fix rust-cpython detection and compilation ## [0.3.9] ### Changed * Update reqwest to 0.9.4 which has [seanmonstar/reqwest#374](https://github.com/seanmonstar/reqwest/issues/374) fixed ## [0.3.8] ### Fixed * Pin reqwest to 0.9.2 to work around [seanmonstar/reqwest#374](https://github.com/seanmonstar/reqwest/issues/374) ## [0.3.7] ### Fixed * Added cargo lock to project [#9](https://github.com/PyO3/maturin/issues/9) ## [0.3.6] With deflate and the strip options, the wheels get about 25x smaller: wheel | baseline | deflate | strip + deflate -|-|-|- get_fourtytwo-2.0.1-cp36-cp36m-manylinux1_x86_64.whl | 2,8M | 771K | 102K hello_world-0.1.0-py2.py3-none-manylinux1_x86_64.whl | 3,9M | 1,1M | 180K points-0.1.0-py2.py3-none-manylinux1_x86_64.whl | 2,8M | 752K | 85K ### Added * `--strip` by ijl [#7](https://github.com/PyO3/maturin/pull/7) ### Changed * Renamed `--bindings-crate` to `--bindings` * Use deflate compression for zips by ijl [#6](https://github.com/PyO3/maturin/pull/6) ### Fixed * `--target` is now actually used for the wheel compatibility tag ## [0.3.5] - 2018-09-20 ### Changed * Upgraded to reqwest 0.9 ### Fixed * "Broken Pipe" with musl builds (through the reqwest upgrade) ## [0.3.4] - 2018-09-18 ### Added * A `--target` option which behaves like cargo option of the same name ### Changed * Musl and auditwheel compliance: Using the new `musl` feature combined with the musl target, you can build completely static binaries. The `password-storage`, which enables keyring integration, is now disabled by default. The Pypi packages are now statically linked with musl so that they are audtiwheel compliant. * Replaced `--debug` with `--release`. All builds are now debug by default ## [0.3.3] - 2018-09-17 ### Added * Builds for i686 linux and mac * Builds for maturin as wheel ## Fixed * Usage with stable * Wrong tags in WHEEL file on non-linux platforms * Uploading on windows ## [0.3.1] - 2017-09-14 ### Fixed * Windows compilation ## [0.3.0] - 2017-09-14 ### Added * Packaging binaries * [Published on pypi](https://pypi.org/project/maturin/). You can now `pip install maturin` * A Dockerfile based on manylinux1 ### Fixed * Travis ci setup builds all types of wheels for linux and mac * `--no-default-features --features auditwheel` creates a manylinux compliant binary for maturin ### Changed * Replaced elfkit with goblin ## [0.2.0] - 2018-09-03 ### Added * Cffi support * A `develop` subcommand * A tox example ### Changed * Show a progress bar for cargo's compile progress ## 0.1.0 - 2018-08-22 * Initial Release [1.11.0]: https://github.com/pyo3/maturin/compare/v1.10.2...v1.11.0 [1.10.2]: https://github.com/pyo3/maturin/compare/v1.10.1...v1.10.2 [1.10.1]: https://github.com/pyo3/maturin/compare/v1.10.0...v1.10.1 [1.10.0]: https://github.com/pyo3/maturin/compare/v1.9.6...v1.10.0 [1.9.6]: https://github.com/pyo3/maturin/compare/v1.9.5...v1.9.6 [1.9.5]: https://github.com/pyo3/maturin/compare/v1.9.4...v1.9.5 [1.9.4]: https://github.com/pyo3/maturin/compare/v1.9.3...v1.9.4 [1.9.3]: https://github.com/pyo3/maturin/compare/v1.9.2...v1.9.3 [1.9.2]: https://github.com/pyo3/maturin/compare/v1.9.1...v1.9.2 [1.9.1]: https://github.com/pyo3/maturin/compare/v1.9.0...v1.9.1 [1.9.0]: https://github.com/pyo3/maturin/compare/v1.8.7...v1.9.0 [1.8.7]: https://github.com/pyo3/maturin/compare/v1.8.6...v1.8.7 [1.8.6]: https://github.com/pyo3/maturin/compare/v1.8.5...v1.8.6 [1.8.5]: https://github.com/pyo3/maturin/compare/v1.8.4...v1.8.5 [1.8.4]: https://github.com/pyo3/maturin/compare/v1.8.3...v1.8.4 [1.8.3]: https://github.com/pyo3/maturin/compare/v1.8.2...v1.8.3 [1.8.2]: https://github.com/pyo3/maturin/compare/v1.8.1...v1.8.2 [1.8.1]: https://github.com/pyo3/maturin/compare/v1.8.0...v1.8.1 [1.8.0]: https://github.com/pyo3/maturin/compare/v1.7.8...v1.8.0 [1.7.8]: https://github.com/pyo3/maturin/compare/v1.7.7...v1.7.8 [1.7.7]: https://github.com/pyo3/maturin/compare/v1.7.6...v1.7.7 [1.7.6]: https://github.com/pyo3/maturin/compare/v1.7.5...v1.7.6 [1.7.5]: https://github.com/pyo3/maturin/compare/v1.7.4...v1.7.5 [1.7.4]: https://github.com/pyo3/maturin/compare/v1.7.3...v1.7.4 [1.7.3]: https://github.com/pyo3/maturin/compare/v1.7.2...v1.7.3 [1.7.2]: https://github.com/pyo3/maturin/compare/v1.7.1...v1.7.2 [1.7.1]: https://github.com/pyo3/maturin/compare/v1.7.0...v1.7.1 [1.7.0]: https://github.com/pyo3/maturin/compare/v1.6.0...v1.7.0 [1.6.0]: https://github.com/pyo3/maturin/compare/v1.5.1...v1.6.0 [1.5.1]: https://github.com/pyo3/maturin/compare/v1.5.0...v1.5.1 [1.5.0]: https://github.com/pyo3/maturin/compare/v1.4.0...v1.5.0 [1.4.0]: https://github.com/pyo3/maturin/compare/v1.3.2...v1.4.0 [1.3.2]: https://github.com/pyo3/maturin/compare/v1.3.1...v1.3.2 [1.3.1]: https://github.com/pyo3/maturin/compare/v1.3.0...v1.3.1 [1.3.0]: https://github.com/pyo3/maturin/compare/v1.2.3...v1.3.0 [1.2.3]: https://github.com/pyo3/maturin/compare/v1.2.2...v1.2.3 [1.2.2]: https://github.com/pyo3/maturin/compare/v1.2.1...v1.2.2 [1.2.1]: https://github.com/pyo3/maturin/compare/v1.2.0...v1.2.1 [1.2.0]: https://github.com/pyo3/maturin/compare/v1.1.0...v1.2.0 [1.1.0]: https://github.com/pyo3/maturin/compare/v1.0.1...v1.1.0 [1.0.1]: https://github.com/pyo3/maturin/compare/v1.0.0...v1.0.1 [1.0.0]: https://github.com/pyo3/maturin/compare/v0.15.3...v1.0.0 [0.15.3]: https://github.com/pyo3/maturin/compare/v0.15.2...v0.15.3 [0.15.2]: https://github.com/pyo3/maturin/compare/v0.15.1...v0.15.2 [0.15.1]: https://github.com/pyo3/maturin/compare/v0.15.0...v0.15.1 [0.15.0]: https://github.com/pyo3/maturin/compare/v0.14.17...v0.15.0 [0.14.17]: https://github.com/pyo3/maturin/compare/v0.14.16...v0.14.17 [0.14.16]: https://github.com/pyo3/maturin/compare/v0.14.15...v0.14.16 [0.14.15]: https://github.com/pyo3/maturin/compare/v0.14.14...v0.14.15 [0.14.14]: https://github.com/pyo3/maturin/compare/v0.14.13...v0.14.14 [0.14.13]: https://github.com/pyo3/maturin/compare/v0.14.12...v0.14.13 [0.14.12]: https://github.com/pyo3/maturin/compare/v0.14.11...v0.14.12 [0.14.11]: https://github.com/pyo3/maturin/compare/v0.14.10...v0.14.11 [0.14.10]: https://github.com/pyo3/maturin/compare/v0.14.9...v0.14.10 [0.14.9]: https://github.com/pyo3/maturin/compare/v0.14.8...v0.14.9 [0.14.8]: https://github.com/pyo3/maturin/compare/v0.14.7...v0.14.8 [0.14.7]: https://github.com/pyo3/maturin/compare/v0.14.6...v0.14.7 [0.14.6]: https://github.com/pyo3/maturin/compare/v0.14.5...v0.14.6 [0.14.5]: https://github.com/pyo3/maturin/compare/v0.14.4...v0.14.5 [0.14.4]: https://github.com/pyo3/maturin/compare/v0.14.3...v0.14.4 [0.14.3]: https://github.com/pyo3/maturin/compare/v0.14.2...v0.14.3 [0.14.2]: https://github.com/pyo3/maturin/compare/v0.14.1...v0.14.2 [0.14.1]: https://github.com/pyo3/maturin/compare/v0.14.0...v0.14.1 [0.14.0]: https://github.com/pyo3/maturin/compare/v0.13.7...v0.14.0 [0.13.7]: https://github.com/pyo3/maturin/compare/v0.13.6...v0.13.7 [0.13.6]: https://github.com/pyo3/maturin/compare/v0.13.5...v0.13.6 [0.13.5]: https://github.com/pyo3/maturin/compare/v0.13.4...v0.13.5 [0.13.4]: https://github.com/pyo3/maturin/compare/v0.13.3...v0.13.4 [0.13.3]: https://github.com/pyo3/maturin/compare/v0.13.2...v0.13.3 [0.13.2]: https://github.com/pyo3/maturin/compare/v0.13.1...v0.13.2 [0.13.1]: https://github.com/pyo3/maturin/compare/v0.13.0...v0.13.1 [0.13.0]: https://github.com/pyo3/maturin/compare/v0.12.20...v0.13.0 [0.12.20]: https://github.com/pyo3/maturin/compare/v0.12.19...v0.12.20 [0.12.19]: https://github.com/pyo3/maturin/compare/v0.12.18...v0.12.19 [0.12.18]: https://github.com/pyo3/maturin/compare/v0.12.17...v0.12.18 [0.12.17]: https://github.com/pyo3/maturin/compare/v0.12.16...v0.12.17 [0.12.16]: https://github.com/pyo3/maturin/compare/v0.12.15...v0.12.16 [0.12.15]: https://github.com/pyo3/maturin/compare/v0.12.14...v0.12.15 [0.12.14]: https://github.com/pyo3/maturin/compare/v0.12.13...v0.12.14 [0.12.13]: https://github.com/pyo3/maturin/compare/v0.12.12...v0.12.13 [0.12.12]: https://github.com/pyo3/maturin/compare/v0.12.11...v0.12.12 [0.12.11]: https://github.com/pyo3/maturin/compare/v0.12.10...v0.12.11 [0.12.10]: https://github.com/pyo3/maturin/compare/v0.12.9...v0.12.10 [0.12.9]: https://github.com/pyo3/maturin/compare/v0.12.8...v0.12.9 [0.12.8]: https://github.com/pyo3/maturin/compare/v0.12.7...v0.12.8 [0.12.7]: https://github.com/pyo3/maturin/compare/v0.12.6...v0.12.7 [0.12.6]: https://github.com/pyo3/maturin/compare/v0.12.5...v0.12.6 [0.12.5]: https://github.com/pyo3/maturin/compare/v0.12.4...v0.12.5 [0.12.4]: https://github.com/pyo3/maturin/compare/v0.12.3...v0.12.4 [0.12.3]: https://github.com/pyo3/maturin/compare/v0.12.2...v0.12.3 [0.12.2]: https://github.com/pyo3/maturin/compare/v0.12.1...v0.12.2 [0.12.1]: https://github.com/pyo3/maturin/compare/v0.12.0...v0.12.1 [0.12.0]: https://github.com/pyo3/maturin/compare/v0.11.5...v0.12.0 [0.11.5]: https://github.com/pyo3/maturin/compare/v0.11.4...v0.11.5 [0.11.4]: https://github.com/pyo3/maturin/compare/v0.11.3...v0.11.4 [0.11.3]: https://github.com/pyo3/maturin/compare/v0.11.2...v0.11.3 [0.11.2]: https://github.com/pyo3/maturin/compare/v0.11.1...v0.11.2 [0.11.1]: https://github.com/pyo3/maturin/compare/v0.11.0...v0.11.1 [0.11.0]: https://github.com/pyo3/maturin/compare/v0.10.6...v0.11.0 [0.10.6]: https://github.com/pyo3/maturin/compare/v0.10.5...v0.10.6 [0.10.5]: https://github.com/pyo3/maturin/compare/v0.10.4...v0.10.5 [0.10.4]: https://github.com/pyo3/maturin/compare/v0.10.3...v0.10.4 [0.10.3]: https://github.com/pyo3/maturin/compare/v0.10.2...v0.10.3 [0.10.2]: https://github.com/pyo3/maturin/compare/v0.10.1...v0.10.2 [0.10.1]: https://github.com/pyo3/maturin/compare/v0.10.0...v0.10.1 [0.10.0]: https://github.com/pyo3/maturin/compare/v0.9.4...v0.10.0 [0.9.4]: https://github.com/pyo3/maturin/compare/v0.9.3...v0.9.4 [0.9.3]: https://github.com/pyo3/maturin/compare/v0.9.2...v0.9.3 [0.9.2]: https://github.com/pyo3/maturin/compare/v0.9.1...v0.9.2 [0.9.1]: https://github.com/pyo3/maturin/compare/v0.9.0...v0.9.1 [0.9.0]: https://github.com/pyo3/maturin/compare/v0.8.3...v0.9.0 [0.8.3]: https://github.com/pyo3/maturin/compare/v0.8.2...v0.8.3 [0.8.2]: https://github.com/pyo3/maturin/compare/v0.8.1...v0.8.2 [0.8.1]: https://github.com/pyo3/maturin/compare/v0.8.0...v0.8.1 [0.8.0]: https://github.com/pyo3/maturin/compare/v0.7.9...v0.8.0 [0.7.9]: https://github.com/pyo3/maturin/compare/v0.7.8...v0.7.9 [0.7.8]: https://github.com/pyo3/maturin/compare/v0.7.7...v0.7.8 [0.7.7]: https://github.com/pyo3/maturin/compare/v0.7.6...v0.7.7 [0.7.6]: https://github.com/pyo3/maturin/compare/v0.7.5...v0.7.6 [0.7.5]: https://github.com/pyo3/maturin/compare/v0.7.4...v0.7.5 [0.7.4]: https://github.com/pyo3/maturin/compare/v0.7.3...v0.7.4 [0.7.3]: https://github.com/pyo3/maturin/compare/v0.7.2...v0.7.3 [0.7.2]: https://github.com/pyo3/maturin/compare/v0.7.1...v0.7.2 [0.7.1]: https://github.com/pyo3/maturin/compare/v0.7.0...v0.7.1 [0.7.0]: https://github.com/pyo3/maturin/compare/v0.6.1...v0.7.0 [0.6.1]: https://github.com/pyo3/maturin/compare/v0.6.0...v0.6.1 [0.6.0]: https://github.com/pyo3/maturin/compare/v0.5.0...v0.6.0 [0.5.0]: https://github.com/pyo3/maturin/compare/v0.4.2...v0.5.0 [0.4.2]: https://github.com/pyo3/maturin/compare/v0.4.1...v0.4.2 [0.4.1]: https://github.com/pyo3/maturin/compare/v0.4.0...v0.4.1 [0.4.0]: https://github.com/pyo3/maturin/compare/v0.3.10...v0.4.0 [0.3.10]: https://github.com/pyo3/maturin/compare/v0.3.9...v0.3.10 [0.3.9]: https://github.com/pyo3/maturin/compare/v0.3.8...v0.3.9 [0.3.8]: https://github.com/pyo3/maturin/compare/v0.3.7...v0.3.8 [0.3.7]: https://github.com/pyo3/maturin/compare/v0.3.6...v0.3.7 [0.3.6]: https://github.com/pyo3/maturin/compare/v0.3.5...v0.3.5 [0.3.5]: https://github.com/pyo3/maturin/compare/v0.3.4...v0.3.5 [0.3.4]: https://github.com/pyo3/maturin/compare/v0.3.3...v0.3.4 [0.3.3]: https://github.com/pyo3/maturin/compare/v0.3.1...v0.3.3 [0.3.1]: https://github.com/pyo3/maturin/compare/v0.3.0...v0.3.1 [0.3.0]: https://github.com/pyo3/maturin/compare/v0.2.0...v0.3.0 [0.2.0]: https://github.com/pyo3/maturin/compare/v0.1.0...v0.2.0 maturin-1.16.0/Code-of-Conduct.md000066400000000000000000000062331527064705700164720ustar00rootroot00000000000000# Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at konstin@mailbox.org. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html [homepage]: https://www.contributor-covenant.org maturin-1.16.0/Dockerfile000066400000000000000000000047461527064705700153000ustar00rootroot00000000000000ARG MANYLINUX=manylinux2014 # x86_64 base FROM quay.io/pypa/${MANYLINUX}_x86_64 AS base-amd64 # x86_64 builder FROM --platform=$BUILDPLATFORM ghcr.io/rust-cross/rust-musl-cross:x86_64-musl AS builder-amd64 # aarch64 base FROM quay.io/pypa/${MANYLINUX}_aarch64 AS base-arm64 # aarch64 cross compile builder FROM --platform=$BUILDPLATFORM ghcr.io/rust-cross/rust-musl-cross:aarch64-musl AS builder-arm64 ARG TARGETARCH FROM builder-$TARGETARCH AS builder ENV PATH=/root/.cargo/bin:$PATH # Compile dependencies only for build caching ADD Cargo.toml /maturin/Cargo.toml ADD Cargo.lock /maturin/Cargo.lock RUN --mount=type=cache,target=/root/.cargo/git \ --mount=type=cache,target=/root/.cargo/registry \ --mount=type=cache,target=/maturin/target,sharing=locked \ mkdir /maturin/src && \ touch /maturin/src/lib.rs && \ echo 'fn main() { println!("Dummy") }' > /maturin/src/main.rs && \ cargo rustc --target $CARGO_BUILD_TARGET --bin maturin --manifest-path /maturin/Cargo.toml --release --features password-storage -- -C link-arg=-s ADD . /maturin/ # Manually update the timestamps as ADD keeps the local timestamps and cargo would then believe the cache is fresh RUN touch /maturin/src/lib.rs /maturin/src/main.rs RUN --mount=type=cache,target=/root/.cargo/git \ --mount=type=cache,target=/root/.cargo/registry \ --mount=type=cache,target=/maturin/target,sharing=locked \ cargo rustc --target $CARGO_BUILD_TARGET --bin maturin --manifest-path /maturin/Cargo.toml --release --features password-storage -- -C link-arg=-s \ && mv /maturin/target/$CARGO_BUILD_TARGET/release/maturin /usr/bin/maturin FROM base-$TARGETARCH ENV PATH=/root/.cargo/bin:$PATH # Add all supported python versions ENV PATH=/opt/python/cp39-cp39/bin:/opt/python/cp310-cp310/bin:/opt/python/cp311-cp311/bin:/opt/python/cp312-cp312/bin:/opt/python/cp313-cp313/bin/:/opt/python/cp313-cp313t/bin/:$PATH # Otherwise `cargo new` errors ENV USER=root ARG MANYLINUX RUN < [!NOTE] > > `pip install maturin` should also work if you don't want to use pipx. There are three main commands: - `maturin new` creates a new cargo project with maturin configured. - `maturin build` builds the wheels and stores them in a folder (`target/wheels` by default), but doesn't upload them. It's recommended to publish packages with [uv](https://github.com/astral-sh/uv) using `uv publish`. - `maturin develop` builds the crate and installs it as a python module directly in the current virtualenv. Note that while `maturin develop` is faster, it doesn't support all the feature that running `pip install` after `maturin build` supports. maturin doesn't need extra configuration files and doesn't clash with an existing setuptools-rust configuration. You can even integrate it with testing tools such as [tox](https://tox.readthedocs.io/en/latest/). There are examples for the different bindings in the `test-crates` folder. The name of the package will be the name of the cargo project, i.e. the name field in the `[package]` section of `Cargo.toml`. The name of the module, which you are using when importing, will be the `name` value in the `[lib]` section (which defaults to the name of the package). For binaries, it's simply the name of the binary generated by cargo. When using `maturin build` and `maturin develop` commands, you can compile a performance-optimized program by adding the `-r` or `--release` flag. ## Python packaging basics Python packages come in two formats: A built form called wheel and source distributions (sdist), both of which are archives. A wheel can be compatible with any python version, interpreter (cpython and pypy, mainly), operating system and hardware architecture (for pure python wheels), can be limited to a specific platform and architecture (e.g. when using ctypes or cffi) or to a specific python interpreter and version on a specific architecture and operating system (e.g. with pyo3). When using `pip install` on a package, pip tries to find a matching wheel and install that. If it doesn't find one, it downloads the source distribution and builds a wheel for the current platform, which requires the right compilers to be installed. Installing a wheel is much faster than installing a source distribution as building wheels is generally slow. When you publish a package to be installable with `pip install`, you upload it to [pypi](https://pypi.org/), the official package repository. For testing, you can use [test pypi](https://test.pypi.org/) instead, which you can use with `pip install --index-url https://test.pypi.org/simple/`. Note that for [publishing for linux](#manylinux-and-auditwheel), you need to use the manylinux docker container or zig, while for publishing from your repository you can use the [PyO3/maturin-action](https://github.com/PyO3/maturin-action) github action. ## Mixed rust/python projects To create a mixed rust/python project, create a folder with your module name (i.e. [`lib.name` in Cargo.toml](https://doc.rust-lang.org/cargo/reference/cargo-targets.html#the-name-field)) next to your Cargo.toml and add your python sources there: ``` my-project ├── Cargo.toml ├── my_project │   ├── __init__.py │   └── bar.py ├── pyproject.toml ├── README.md └── src    └── lib.rs ``` You can specify a different python source directory in `pyproject.toml` by setting `tool.maturin.python-source`, for example **pyproject.toml** ```toml [tool.maturin] python-source = "python" module-name = "my_project._lib_name" ``` then the project structure would look like this: ``` my-project ├── Cargo.toml ├── python │ └── my_project │ ├── __init__.py │ └── bar.py ├── pyproject.toml ├── README.md └── src    └── lib.rs ``` > [!NOTE] > > This structure is recommended to avoid [a common `ImportError` pitfall](https://github.com/PyO3/maturin/issues/490) maturin will add the native extension as a module in your python folder. When using develop, maturin will copy the native library and for cffi also the glue code to your python folder. You should add those files to your gitignore. With cffi you can do `from .my_project import lib` and then use `lib.my_native_function`, with pyo3 you can directly `from .my_project import my_native_function`. Example layout with pyo3 after `maturin develop`: ``` my-project ├── Cargo.toml ├── my_project │   ├── __init__.py │   ├── bar.py │   └── _lib_name.cpython-36m-x86_64-linux-gnu.so ├── README.md └── src    └── lib.rs ``` When doing this also be sure to set the module name in your code to match the last part of `module-name` (don't include the package path): ```rust #[pymodule] #[pyo3(name="_lib_name")] fn my_lib_name(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_class::()?; Ok(()) } ``` ## Python metadata maturin supports [PEP 621](https://www.python.org/dev/peps/pep-0621/), you can specify python package metadata in `pyproject.toml`. maturin merges metadata from `Cargo.toml` and `pyproject.toml`, `pyproject.toml` takes precedence over `Cargo.toml`. To specify python dependencies, add a list `dependencies` in a `[project]` section in the `pyproject.toml`. This list is equivalent to `install_requires` in setuptools: ```toml [project] name = "my-project" dependencies = ["flask~=1.1.0", "toml>=0.10.2,<0.11.0"] ``` You can add so called console scripts, which are shell commands that execute some function in your program in the `[project.scripts]` section. The keys are the script names while the values are the path to the function in the format `some.module.path:class.function`, where the `class` part is optional. The function is called with no arguments. Example: ```toml [project.scripts] get_42 = "my_project:DummyClass.get_42" ``` You can also specify [trove classifiers](https://pypi.org/classifiers/) in your `pyproject.toml` under `project.classifiers`: ```toml [project] name = "my-project" classifiers = ["Programming Language :: Python"] ``` ## Source distribution maturin supports building through `pyproject.toml`. To use it, create a `pyproject.toml` next to your `Cargo.toml` with the following content: ```toml [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" ``` If a `pyproject.toml` with a `[build-system]` entry is present, maturin can build a source distribution of your package when `--sdist` is specified. The source distribution will contain the same files as `cargo package`. To only build a source distribution, pass `--interpreter` without any values. You can then e.g. install your package with `pip install .`. With `pip install . -v` you can see the output of cargo and maturin. You can use the options `compatibility`, `skip-auditwheel`, `bindings`, `strip` and common Cargo build options such as `features` under `[tool.maturin]` the same way you would when running maturin directly. The `bindings` key is required for cffi and bin projects as those can't be automatically detected. Currently, all builds are in release mode (see [this thread](https://discuss.python.org/t/pep-517-debug-vs-release-builds/1924) for details). For a non-manylinux build with cffi bindings you could use the following: ```toml [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [tool.maturin] bindings = "cffi" compatibility = "linux" ``` `manylinux` option is also accepted as an alias of `compatibility` for backward compatibility with old version of maturin. To include arbitrary files in the sdist for use during compilation specify `include` as an array of `path` globs with `format` set to `sdist`: ```toml [tool.maturin] include = [{ path = "path/**/*", format = "sdist" }] ``` There's a `maturin sdist` command for only building a source distribution as workaround for [pypa/pip#6041](https://github.com/pypa/pip/issues/6041). ## Manylinux and auditwheel For portability reasons, native python modules on linux must only dynamically link a set of very few libraries which are installed basically everywhere, hence the name manylinux. The pypa offers special docker images and a tool called [auditwheel](https://github.com/pypa/auditwheel/) to ensure compliance with the [manylinux rules](https://peps.python.org/pep-0599/#the-manylinux2014-policy). If you want to publish widely usable wheels for linux pypi, **you need to use a manylinux docker image or build with zig**. The Rust compiler since version 1.64 [requires at least glibc 2.17](https://blog.rust-lang.org/2022/08/01/Increasing-glibc-kernel-requirements.html), so you need to use at least manylinux2014. For publishing, we recommend enforcing the same manylinux version as the image with the manylinux flag, e.g. use `--manylinux 2014` if you are building in `quay.io/pypa/manylinux2014_x86_64`. The [PyO3/maturin-action](https://github.com/PyO3/maturin-action) github action already takes care of this if you set e.g. `manylinux: 2014`. maturin contains a reimplementation of auditwheel automatically checks the generated library and gives the wheel the proper platform tag. If your system's glibc is too new or you link other shared libraries, it will assign the `linux` tag. You can also manually disable those checks and directly use native linux target with `--manylinux off`. For full manylinux compliance you need to compile in a CentOS docker container. The [pyo3/maturin](https://ghcr.io/pyo3/maturin) image is based on the manylinux2014 image, and passes arguments to the `maturin` binary. You can use it like this: ``` docker run --rm -v $(pwd):/io ghcr.io/pyo3/maturin build --release # or other maturin arguments ``` Note that this image is very basic and only contains python, maturin and stable rust. If you need additional tools, you can run commands inside the manylinux container. See [konstin/complex-manylinux-maturin-docker](https://github.com/konstin/complex-manylinux-maturin-docker) for a small educational example or [nanoporetech/fast-ctc-decode](https://github.com/nanoporetech/fast-ctc-decode/blob/b226ea0f2b2f4f474eff47349703d57d2ea4801b/.github/workflows/publish.yml) for a real world setup. maturin itself is manylinux compliant when compiled for the musl target. ## Examples - [agg-python-bindings](https://pypi.org/project/agg-python-bindings) - A Python Library that binds to Asciinema Agg terminal record renderer and Avt terminal emulator - [ballista-python](https://github.com/apache/arrow-ballista-python) - A Python library that binds to Apache Arrow distributed query engine Ballista - [bleuscore](https://github.com/shenxiangzhuang/bleuscore) - A BLEU score calculation library, written in pure Rust - [chardetng-py](https://github.com/john-parton/chardetng-py) - Python binding for the chardetng character encoding detector. - [connector-x](https://github.com/sfu-db/connector-x/tree/main/connectorx-python) - ConnectorX enables you to load data from databases into Python in the fastest and most memory efficient way - [datafusion-python](https://github.com/apache/arrow-datafusion-python) - a Python library that binds to Apache Arrow in-memory query engine DataFusion - [deltalake-python](https://github.com/delta-io/delta-rs/tree/main/python) - Native Delta Lake Python binding based on delta-rs with Pandas integration - [opendal](https://github.com/apache/incubator-opendal/tree/main/bindings/python) - OpenDAL Python Binding to access data freely - [orjson](https://github.com/ijl/orjson) - A fast, correct JSON library for Python - [pdfcrate](https://github.com/ratazzi/pdfcrate) - An ergonomic, high-level PDF generation library for Rust and Python — a Prawn-style layout API for composing documents, not low-level PDF plumbing - [polars](https://github.com/pola-rs/polars/tree/master/py-polars) - Fast multi-threaded DataFrame library in Rust | Python | Node.js - [pydantic-core](https://github.com/pydantic/pydantic-core) - Core validation logic for pydantic written in Rust - [pyrus-cramjam](https://github.com/milesgranger/pyrus-cramjam) - Thin Python wrapper to de/compression algorithms in Rust - [pyxel](https://github.com/kitao/pyxel) - A retro game engine for Python - [quebec](https://github.com/ratazzi/quebec) - A database-backed background job queue for Python, inspired by Rails' Solid Queue - [roapi](https://github.com/roapi/roapi) - ROAPI automatically spins up read-only APIs for static datasets without requiring you to write a single line of code - [robyn](https://github.com/sansyrox/robyn) - A fast and extensible async python web server with a Rust runtime - [ruff](https://github.com/charliermarsh/ruff) - An extremely fast Python linter, written in Rust - [rnet](https://github.com/0x676e67/rnet) - Asynchronous Python HTTP Client with Black Magic - [rustpy-xlsxwriter](https://github.com/rahmadafandi/rustpy-xlsxwriter): A high-performance Python library for generating Excel files, utilizing the [rust_xlsxwriter](https://github.com/jmcnamara/rust_xlsxwriter) crate for efficient data handling. - [tantivy-py](https://github.com/quickwit-oss/tantivy-py) - Python bindings for Tantivy - [tpchgen-cli](https://github.com/clflushopt/tpchgen-rs/tree/main/tpchgen-cli) - Python CLI binding for `tpchgen`, a blazing fast TPC-H benchmark data generator built in pure Rust with zero dependencies. - [watchfiles](https://github.com/samuelcolvin/watchfiles) - Simple, modern and high performance file watching and code reload in python - [wonnx](https://github.com/webonnx/wonnx/tree/master/wonnx-py) - Wonnx is a GPU-accelerated ONNX inference run-time written 100% in Rust ## Contributing Everyone is welcomed to contribute to maturin! There are many ways to support the project, such as: - help maturin users with issues on GitHub and Gitter - improve documentation - write features and bugfixes - publish blogs and examples of how to use maturin Our [contributing notes](https://github.com/PyO3/maturin/blob/main/guide/src/contributing.md) have more resources if you wish to volunteer time for maturin and are searching where to start. If you don't have time to contribute yourself but still wish to support the project's future success, some of our maintainers have GitHub sponsorship pages: - [messense](https://github.com/sponsors/messense) ## License Licensed under either of: - Apache License, Version 2.0, ([LICENSE-APACHE](https://github.com/PyO3/maturin/blob/main/license-apache) or http://www.apache.org/licenses/LICENSE-2.0) - MIT license ([LICENSE-MIT](https://github.com/PyO3/maturin/blob/main/license-mit) or http://opensource.org/licenses/MIT) at your option. maturin-1.16.0/cliff.toml000066400000000000000000000016701527064705700152570ustar00rootroot00000000000000[changelog] header = """ # Changelog """ body = """ {% if version %}\ ## {{ version | trim_start_matches(pat="v") }} {% else %}\ ## Unreleased {% endif %}\ {% for commit in commits %} * {% if commit.remote.pr_title %}\ {{ commit.remote.pr_title | upper_first }}\ {% else %}\ {{ commit.message | split(pat="\n") | first | upper_first }}\ {% endif %}\ {% if commit.remote.pr_number %} ([#{{ commit.remote.pr_number }}](https://github.com/pyo3/maturin/pull/{{ commit.remote.pr_number }})){%- endif %}\ {% endfor %}\n """ [git] conventional_commits = false filter_unconventional = false commit_parsers = [ { field = "github.pr_labels", pattern = "internal", skip = true }, { field = "github.pr_labels", pattern = "dependencies", skip = true }, { message = ".*pre-commit autoupdate.*", skip = true }, { message = ".*", group = "Other" }, ] [remote.github] owner = "pyo3" repo = "maturin" maturin-1.16.0/clippy.toml000066400000000000000000000011701527064705700154670ustar00rootroot00000000000000 disallowed-types = [ "std::fs::DirEntry", "std::fs::File", "std::fs::OpenOptions", "std::fs::ReadDir", ] disallowed-methods = [ "std::fs::canonicalize", "std::fs::copy", "std::fs::create_dir", "std::fs::create_dir_all", "std::fs::hard_link", "std::fs::metadata", "std::fs::read", "std::fs::read_dir", "std::fs::read_link", "std::fs::read_to_string", "std::fs::remove_dir", "std::fs::remove_dir_all", "std::fs::remove_file", "std::fs::rename", "std::fs::set_permissions", "std::fs::soft_link", "std::fs::symlink_metadata", "std::fs::write", ] maturin-1.16.0/deny.toml000066400000000000000000000312311527064705700151270ustar00rootroot00000000000000# This template contains all of the possible sections and their default values # Note that all fields that take a lint level have these possible values: # * deny - An error will be produced and the check will fail # * warn - A warning will be produced, but the check will not fail # * allow - No warning or error will be produced, though in some cases a note # will be # The values provided in this template are the default values that will be used # when any section or field is not specified in your own configuration # Root options # The graph table configures how the dependency graph is constructed and thus # which crates the checks are performed against [graph] # If 1 or more target triples (and optionally, target_features) are specified, # only the specified targets will be checked when running `cargo deny check`. # This means, if a particular package is only ever used as a target specific # dependency, such as, for example, the `nix` crate only being used via the # `target_family = "unix"` configuration, that only having windows targets in # this list would mean the nix crate, as well as any of its exclusive # dependencies not shared by any other crates, would be ignored, as the target # list here is effectively saying which targets you are building for. targets = [ # The triple can be any string, but only the target triples built in to # rustc (as of 1.40) can be checked against actual config expressions "x86_64-unknown-linux-musl", "x86_64-unknown-linux-gnu", "aarch64-unknown-linux-gnu", "x86_64-pc-windows-msvc", "x86_64-apple-darwin", "aarch64-apple-darwin", # You can also specify which target_features you promise are enabled for a # particular target. target_features are currently not validated against # the actual valid features supported by the target architecture. #{ triple = "wasm32-unknown-unknown", features = ["atomics"] }, ] # When creating the dependency graph used as the source of truth when checks are # executed, this field can be used to prune crates from the graph, removing them # from the view of cargo-deny. This is an extremely heavy hammer, as if a crate # is pruned from the graph, all of its dependencies will also be pruned unless # they are connected to another crate in the graph that hasn't been pruned, # so it should be used with care. The identifiers are [Package ID Specifications] # (https://doc.rust-lang.org/cargo/reference/pkgid-spec.html) #exclude = [] # If true, metadata will be collected with `--all-features`. Note that this can't # be toggled off if true, if you want to conditionally enable `--all-features` it # is recommended to pass `--all-features` on the cmd line instead all-features = true # If true, metadata will be collected with `--no-default-features`. The same # caveat with `all-features` applies no-default-features = false # If set, these feature will be enabled when collecting metadata. If `--features` # is specified on the cmd line they will take precedence over this option. #features = [] # The output table provides options for how/if diagnostics are outputted [output] # When outputting inclusion graphs in diagnostics that include features, this # option can be used to specify the depth at which feature edges will be added. # This option is included since the graphs can be quite large and the addition # of features from the crate(s) to all of the graph roots can be far too verbose. # This option can be overridden via `--feature-depth` on the cmd line feature-depth = 1 # This section is considered when running `cargo deny check advisories` # More documentation for the advisories section can be found here: # https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html [advisories] # The path where the advisory databases are cloned/fetched into #db-path = "$CARGO_HOME/advisory-dbs" # The url(s) of the advisory databases to use #db-urls = ["https://github.com/rustsec/advisory-db"] # A list of advisory IDs to ignore. Note that ignored advisories will still # output a note when they are encountered. ignore = [ # paste unmaintained "RUSTSEC-2024-0436", { id = "RUSTSEC-2026-0344", reason = "ruzstd 0.8 comes in through object 0.38, which arwen pins, so the fixed 0.9.1 is out of reach until arwen updates object. maturin only uses arwen to rewrite the Mach-O load commands of libraries it is repairing, not to decompress untrusted zstd data" }, # zip >=9 fixes these, but xwin 0.10.0 still requires zip ^8. # xwin copies VSIX members with ZipArchive::by_index and does not call # the affected ZipArchive::extract / ZipStreamReader::extract APIs. { id = "RUSTSEC-2026-0367", reason = "xwin 0.10.0 requires zip ^8. It copies VSIX members with ZipArchive::by_index, not the affected ZipArchive::extract or ZipStreamReader::extract APIs" }, { id = "RUSTSEC-2026-0368", reason = "xwin 0.10.0 requires zip ^8. It copies VSIX members with ZipArchive::by_index, not the affected ZipArchive::extract or ZipStreamReader::extract APIs" }, { id = "RUSTSEC-2026-0369", reason = "xwin 0.10.0 requires zip ^8. It copies VSIX members with ZipArchive::by_index, not the affected ZipArchive::extract or ZipStreamReader::extract APIs" }, #{ id = "RUSTSEC-0000-0000", reason = "you can specify a reason the advisory is ignored" }, #"a-crate-that-is-yanked@0.1.1", # you can also ignore yanked crate versions if you wish #{ crate = "a-crate-that-is-yanked@0.1.1", reason = "you can specify why you are ignoring the yanked crate" }, ] # If this is true, then cargo deny will use the git executable to fetch advisory database. # If this is false, then it uses a built-in git library. # Setting this to true can be helpful if you have special authentication requirements that cargo-deny does not support. # See Git Authentication for more information about setting up git authentication. #git-fetch-with-cli = true # This section is considered when running `cargo deny check licenses` # More documentation for the licenses section can be found here: # https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html [licenses] # List of explicitly allowed licenses # See https://spdx.org/licenses/ for list of possible licenses # [possible values: any SPDX 3.11 short identifier (+ optional exception)]. allow = [ "MIT", "MIT-0", "Apache-2.0", "Apache-2.0 WITH LLVM-exception", "bzip2-1.0.6", "CDLA-Permissive-2.0", "ISC", "0BSD", "BSD-3-Clause", "CC0-1.0", "Unicode-3.0", "BSL-1.0", "MPL-2.0", "Zlib", ] # The confidence threshold for detecting a license from license text. # The higher the value, the more closely the license text must be to the # canonical license text of a valid SPDX license file. # [possible values: any between 0.0 and 1.0]. confidence-threshold = 0.8 # Allow 1 or more licenses on a per-crate basis, so that particular licenses # aren't accepted for every possible crate as with the normal allow list exceptions = [ # Each entry is the crate and version constraint, and its specific allow # list #{ allow = ["Zlib"], crate = "adler32" }, { allow = ["ISC", "MIT", "OpenSSL"], name = "ring" }, { allow = ["MPL-2.0"], name = "webpki-roots" }, { allow = ["MPL-2.0"], name = "cbindgen" }, { allow = ["MPL-2.0"], name = "option-ext" }, { allow = ["Unicode-DFS-2016"], name = "unicode-ident" }, { allow = ["MIT", "LGPL-3.0"], name = "configparser" }, ] # Some crates don't have (easily) machine readable licensing information, # adding a clarification entry for it allows you to manually specify the # licensing information #[[licenses.clarify]] # The package spec the clarification applies to #crate = "ring" # The SPDX expression for the license requirements of the crate #expression = "MIT AND ISC AND OpenSSL" # One or more files in the crate's source used as the "source of truth" for # the license expression. If the contents match, the clarification will be used # when running the license check, otherwise the clarification will be ignored # and the crate will be checked normally, which may produce warnings or errors # depending on the rest of your configuration #license-files = [ # Each entry is a crate relative path, and the (opaque) hash of its contents #{ path = "LICENSE", hash = 0xbd0eed23 } #] [[licenses.clarify]] name = "ring" expression = "MIT AND ISC AND OpenSSL" license-files = [{ path = "LICENSE", hash = 0xbd0eed23 }] [licenses.private] # If true, ignores workspace crates that aren't published, or are only # published to private registries. # To see how to mark a crate as unpublished (to the official registry), # visit https://doc.rust-lang.org/cargo/reference/manifest.html#the-publish-field. ignore = false # One or more private registries that you might publish crates to, if a crate # is only published to private registries, and ignore is true, the crate will # not have its license(s) checked registries = [ #"https://sekretz.com/registry ] # This section is considered when running `cargo deny check bans`. # More documentation about the 'bans' section can be found here: # https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html [bans] # Lint level for when multiple versions of the same crate are detected multiple-versions = "warn" # Lint level for when a crate version requirement is `*` wildcards = "allow" # The graph highlighting used when creating dotgraphs for crates # with multiple versions # * lowest-version - The path to the lowest versioned duplicate is highlighted # * simplest-path - The path to the version with the fewest edges is highlighted # * all - Both lowest-version and simplest-path are used highlight = "all" # The default lint level for `default` features for crates that are members of # the workspace that is being checked. This can be overridden by allowing/denying # `default` on a crate-by-crate basis if desired. workspace-default-features = "allow" # The default lint level for `default` features for external crates that are not # members of the workspace. This can be overridden by allowing/denying `default` # on a crate-by-crate basis if desired. external-default-features = "allow" # List of crates that are allowed. Use with care! allow = [ #"ansi_term@0.11.0", #{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is allowed" }, ] # List of crates to deny deny = [ #"ansi_term@0.11.0", #{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is banned" }, # Wrapper crates can optionally be specified to allow the crate when it # is a direct dependency of the otherwise banned crate #{ crate = "ansi_term@0.11.0", wrappers = ["this-crate-directly-depends-on-ansi_term"] }, ] # List of features to allow/deny # Each entry the name of a crate and a version range. If version is # not specified, all versions will be matched. #[[bans.features]] #crate = "reqwest" # Features to not allow #deny = ["json"] # Features to allow #allow = [ # "rustls", # "__rustls", # "__tls", # "hyper-rustls", # "rustls", # "rustls-pemfile", # "rustls-tls-webpki-roots", # "tokio-rustls", # "webpki-roots", #] # If true, the allowed features must exactly match the enabled feature set. If # this is set there is no point setting `deny` #exact = true # Certain crates/versions that will be skipped when doing duplicate detection. skip = [ #"ansi_term@0.11.0", #{ crate = "ansi_term@0.11.0", reason = "you can specify a reason why it can't be updated/removed" }, ] # Similarly to `skip` allows you to skip certain crates during duplicate # detection. Unlike skip, it also includes the entire tree of transitive # dependencies starting at the specified crate, up to a certain depth, which is # by default infinite. skip-tree = [ #"ansi_term@0.11.0", # will be skipped along with _all_ of its direct and transitive dependencies #{ crate = "ansi_term@0.11.0", depth = 20 }, ] # This section is considered when running `cargo deny check sources`. # More documentation about the 'sources' section can be found here: # https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html [sources] # Lint level for what to happen when a crate from a crate registry that is not # in the allow list is encountered unknown-registry = "warn" # Lint level for what to happen when a crate from a git repository that is not # in the allow list is encountered unknown-git = "warn" # List of URLs for allowed crate registries. Defaults to the crates.io index # if not specified. If it is specified but empty, no registries are allowed. allow-registry = ["https://github.com/rust-lang/crates.io-index"] # List of URLs for allowed Git repositories allow-git = [] [sources.allow-org] # github.com organizations to allow git sources for github = [] # gitlab.com organizations to allow git sources for gitlab = [] # bitbucket.org organizations to allow git sources for bitbucket = [] maturin-1.16.0/guide/000077500000000000000000000000001527064705700143705ustar00rootroot00000000000000maturin-1.16.0/guide/.gitignore000066400000000000000000000000051527064705700163530ustar00rootroot00000000000000book maturin-1.16.0/guide/book.toml000066400000000000000000000004561527064705700162240ustar00rootroot00000000000000[book] authors = ["PyO3 Project and Contributors"] language = "en" src = "src" title = "Maturin User Guide" [output.html] additional-css = ["tweak.css"] git-repository-url = "https://github.com/PyO3/maturin/tree/main/guide" edit-url-template = "https://github.com/PyO3/maturin/edit/main/guide/{path}" maturin-1.16.0/guide/src/000077500000000000000000000000001527064705700151575ustar00rootroot00000000000000maturin-1.16.0/guide/src/SUMMARY.md000066400000000000000000000011641527064705700166400ustar00rootroot00000000000000# Summary [Introduction](index.md) --- - [Installation](./installation.md) - [Tutorial](./tutorial.md) - [Project Layout](./project_layout.md) - [Bindings](./bindings.md) - [Python Metadata](./metadata.md) - [Configuration](./config.md) - [Environment Variables](./environment-variables.md) - [Local Development](./local_development.md) - [Import Hook](./import_hook.md) - [Distribution](./distribution.md) - [SBOM](./sbom.md) - [Sphinx Integration](./sphinx.md) --- - [Migration Guide](./migration.md) - [Changelog](./changelog.md) --- - [Contributing](./contributing.md) - [Platform Support](./platform_support.md) maturin-1.16.0/guide/src/assets/000077500000000000000000000000001527064705700164615ustar00rootroot00000000000000maturin-1.16.0/guide/src/assets/sponsors/000077500000000000000000000000001527064705700203475ustar00rootroot00000000000000maturin-1.16.0/guide/src/assets/sponsors/astral.png000066400000000000000000000017721527064705700223520ustar00rootroot00000000000000‰PNG  IHDRÈÈ":9ÉÁIDATxœìÝ?¨•õÀqýý”Â&û3DN¹8FBÐÖÐØÐÜä`8ZCSCË]$¢†Zš�ЖC¸dAá"j‚^ïÕÐÛ½Ö½WïmŒ â¼ýïy½ÖÏ÷3¼Ïó=<žïžKÛÇvÁ´ýoôìLÂ"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,{Fð7‹W6ΟY½pvíÆå�»K¶Žhæ=uðÿ‡Žì{ñåý¯¾yààó{G�ó—Ý3r€ÀòõÍÉÂís“1ýg/½þä[<=#yÍDXç&÷>;¹´¾¶5z�ÇÞÞ'v?õì+o=È üÆš,Üþø�EUMÅæúöGÇoNn�dtXß}¹rzáÎØvžÓ w¾™¬Œ�adXË×7?=±8p€ìó“·–¯o`dX_¼¿´¹¾=p€l}mkì†8,¬¥_6ΟYµú<87YY¼²1jõaa}{ú·QKω­‡»~u‡…õÓ÷G-=?.œ]µô°°®]\µôü¸qyþ¶Â{˱çî.=µôø¤tþ?&,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"!,Â"1[‡4=zÏÚ{øèþ©_öçï¿uuäkÖ‡›÷°Ýÿö©ç¦~ÙONÜœó°l…$„EBX$„EBX$„EBX$„EbÞ�žÿjõÝ‹W§~Ù_o;ÄfFÌ{X÷W¶®ýè²é³’ a‘ a‘ a‘ a‘ a‘ a‘ a‘ a‘ a‘ a‘ a‘ a‘ a‘˜÷w7ü»¿~áБ}ÿøÑÕ‹¼÷ÚµG>ÑcË„°H‹„°H‹„°H‹„°H‹„°H‹„°H‹„°H‹„°H‹„°H‹„°H‹„°H‹„°H‹„°H‹„°H‹„°H‹„°H‹„°H‹ÄîKÛÇFÏÀäŽEBX$„EBX$„EBX$„EBX$„EBX$„EBX$„EBX$„EBX$„EBX$„EBX$„EBX$„EBX$„EBX$„EBX$„EBX$„EBX$„EBX$„EBX$„EBX$„EâÏÿÿJOœ² EäIEND®B`‚maturin-1.16.0/guide/src/assets/sponsors/bytewax.png000066400000000000000000000173521527064705700225500ustar00rootroot00000000000000‰PNG  IHDRÈÈ­X®ž±IDATxœì�y\T×ùÿïÜf ’pƒªCŒZ¨ÄÄXS ‰Øü05nýa,˜¨P ”"¸Ä!ÌâBPPâ‚5¡Ú·(ùFjªÑ4…˜Æ€È"ð�`Ö;Ûý¾FÌ+éÌ™ë 3sxÞž‡¹~ä·sϹÏyÀ)`  €A€0P À @(ƒ`  €A€0P À @(ƒ`  €A€0P À @(ƒ`  €A€0P À @(ƒ`  €A€ÓÑJþx¹»�i6Z;¬7[;Èo˜ÖÁuxL ((‡á#>)‘!ódLk±Ñô­å“ K4�2­ƒëð™0Pøp“¬bÄø¦uüH�?>¬­‹üª¾ÙÒÀ´.k/0sŠ !j4ÿ÷Lë°G•$ÊfZ×�ÄC¤"LzâuÙI…”È´{RÞ$†iê-˜ÖÂU`ñ�WŠ_„‡3­Ã¹Éâܰ`ÞH¦upX¤{@€ ó¿YáM!å…ÚÇJ«�oŸ£�C§–�Ävfˆ7§Îp|οÕi½5i™æÁÛ½¤†N=ÇàÑïT|ŒÚ¾f�öÉS—ÌgèÔ3€G¬~Éeªý†et›ÃÆåëÖú“MQ±·ÒÄytë€AúIi–tj¼¶Á|ª¼Æô>ýŠú(¬"ÞD�G ç?žï7ƒ~EÜ ÒR„Éá!¸ÃK8��ÔæìÑ/fFUu�–Ï÷ž$ŠP±üE⹓ӝл€Aú�*I´5^ùOÓîË×­ßѯè¿Y·Ï°º[C¶Û� ÂGîÏ–nbF7ƒ¸Éú$Qzh�™ ß#63 É�-fÈÚ¥{vª_Z´’ÿ ýª¸ Ä ”Ãð‘™sE¯¡byå†ìæï¬ô«BS^c:Zßl9�Šå½€žGÀ nP²B’¯�òöã·:­×¶U»™Q圢ÃÄVÔøôI~s&ŽÁE¿"îq‘˜HþÔØ(ÁBT,£X¿H£Çôô«¢¦òŸ¦£µ æSˆ�ô�Jö’8ÄE2犲Pãµ æ�_0_¤_‘käWlk«ýxx�>K¸„UÜ’] 1N0mõsâ×Q±Å[tüúIÆw®œÑÚAþ —`ø”q‚8ûØoÆ ýËÆwtûf?¶3È=�aÅéÒ}¨Ø±ó¦�ç®ZþM¿*÷x½’ØØÖi½n?®�òBò‰×1£Š€Aî�*I¼"Pî˜ Û­!»WíÖ¿ÊŒ*÷èÑbæÂ*b *–ç—jû#@¿*n¡`ì|LÆt¾ÕëïrZ;ÈïéWÕ?öœ0¸Õi½f?®�òï½"+aFûƒPðFŠ8ÃS3ê›-·6îeFUÿБQ¬‹�,HŽ÷›I¿*öqBä(|ôŒÇü’Q±Òj#2!�í¿`þøØyt¶oÁ2É[ô+b?`'ìΔ”¢Æ/5™ÿUZmÀ wIŒLvª2yoe‰þO¶ÇúUù–ºFË�ÊÓFänÝk‹ï¼ôÀ¤oa.ýp“¼F,äùÛÇjÌ{sß!¶3£Ì÷|Þbýtù³¢?Û—€ �óBH ë­k´°6S™`é[´êº5d‹“°’f9´Ä vV­ñ†Å!5e°¹Kb¾6Ã0�ýxl” n}’h3ª|ON"zKûÜgæÓÇ/˜? _»ƒÜåòuëå¢Ãè¢ ³E¡CxЯʷ$Çûýnú$¿gQ± e†Õô+b´”�1Yðt´’?™Žë^´tXo–טÊQ±&oÜ«ø24jË/7¼œ_A Mq‘†R¢hÁGÙÇjÌ‹ÏÑ&¢>—ç7#b8>‰‘÷ ¥ÃÚ\^còéî¢Ï 2„w_ý.ùî Àï÷õ¿å"æÉËÕ“/_·Ö£‚kæ‹^Ê[$.¶×ÈîGÒ4cš¿³vÒ¢ÒÇlJåfÎ;œgQëÈÛã—¨#Û»È6ûXÈÞõ»äWYt/�“—«§8»—ÞÀç�Xåk¤›Xô µ!8¤’�KÐ;x;Ž;º5¤ÃâT*æ–¬�p*ÅÝÑJþ˜Ìyb*¶á€a-ÊXß½|‹e÷RxH%Û+—øî½O É<6JÀh)Ná!ø„ùO‘�=†¥lÕ­DÅb£³gNüÖç}LJ‚0U¾­Óz¥ø(ú½HL$?&6JðGZºAxíì^zŸD*ÂÄek¤¬}°f¾h½\‚Ž¿`þðÄEÓ!Tìõñ.©úXžÏ˜80%Aˆ,_´¶Ô°5.a’²5Rd½_6`»—¾º¶Ï ò§g„/ £}u}OŒ?´r®h­³ø¢Íº¥¶GrûñˆáüqY-õ¹@±çÏÒw0 Û�7ܰœ­ü§© õ™?=#\24�¢E`?Œ�_Ÿ$Zå‹kûìÙ­µRq=4í«ë{ ƒraïHggËKVH6¦$_¶oë´~™ªÙ£u¬7Åf’ãý÷­’"ONzQ=¡ñ¦õsT¬µRñU(‹ÛÌÝE«\ØÖÚAzuÅ'3ȦTÑj˜Ã†¸4KzÀY0w¿a›ZçhžÐ |غܪo;òžÿ¶4 ²§ÉÞ“Ä&gæØ™!VqÀ6d¥YR¯g!{=+rþàþÙ®´w Á•MßZÏ}ÞbýÊ>¦#0�ž oÿîÇ—iSÆ ~[Ûh>ÚÚAþ/mb=à�Iþ”q‚xûqµŽl™©ÒÎ$§\b"ù¿Ú¾\ú7š$zLxQßl9Óü�÷µy})X&ÙÆsüHæa,¢È·*RHy¡>è{üŠÓ%N7_\ÅcƒD+ùc£Ï{z¶%˜ÉëÑbdÊV²nTl”`v´’Ïš·Íé³EëR^"Ô»­Š(@}&ZÉ86Jðÿ}¯Žb£‰1‘ü_{r � ²u©óçv®R²B²ÇY†èñ æSç>3ˆŠå½ zÅçâ\`â<"7YŒ<ð”³[¿ª­‹tH¡Áúþ߬ÐïM<�Ù=zQ8sŠà©U‰â7<¹ òÇC f®k´ ±Ÿ}e½š’ \f?>z(ÿ¡–ëG�7­7iê„÷7ÊÞâxªá†åK¶ê‘™Ê3§VÌq¢ß‰;ùãCI Ó×5¢;þÞ �^è5P|‚�óä,†{®wX[:·§f³¬•þÝÒn½ñHš:‚©<­“Ó�äÉ�3ܤÕãoZ¿@Åš(®…‡àµº.ì¹Þ¡m]d�»ì÷#ÖÎ ñºl"U²Øé"/ùM]¶ZçXž3<½n�È!Á‘ä’;=MòP±ÊÓÆýÎ̱3CüÊ6‡ ©*Ùñô¤+ôË Êaø¨Ôè†ú‰”áâ˜Hþ/Q±ö.²mòómæj|wéï…™Ãv½›RÅ¥u�æ³ôÈì#}¶( 5^t˜(ªo¶ ;ñ®œ+,÷R^š%ÝŸ£u«¤ªÛk�‰cpå™ùe©˜'s÷³\%ù í�5¿‡Š-xÒoÖ;«¥GèWå·:­Í–¨£5zLc›8w¦@þïAv/ç:kvù~¹m�¦Šsá!øT·•q˜n Ù•ªël‘÷I‰üèÑ|‡– l`Z¶æ·u�–s¨XÓÅÇá!ø£ô«bŽn ù]Tªz\[—c—-n­AÒg “›9°¾Üž�”aгø’­º z¹F}³ågæHŸ%\4ØÌ�õÝËa¶õˆ«?ïò rŸ?ïŸî’_ )%n£3�ß�]¤Ýîä%Û¦TQ~æ¦Êvj6ËÄF �u±MßZ>}4MóˆŽpþ3÷|Äš9Eð;0ÇOD çÿzÁSBÖU‹t…™S `ŽŸˆΟ´à)!ek‹{d}’xÀexzÊʹBNŽÛºL2à’=…jwsÅ »O {f f*jÐeIÙΦƒ¸—v=gú;UÜ¥5HÍfÙ‰Ø(Á ¯©â0ÝòÛQI½¿Ôè13ÓZúCÍfÙ\¬<ã º5äÍQI½J�ÞyæµKÛ¼Y»ôéÆÍ/„·ÉÚ¥_ÎUs`}ú‘çA#)[uéTæÀÜyQøNŽä­O ‘ÇM µ æãñ9ZdË2×ËçFãÈì_ºÙ{’xwy‘!{'G²}ÁSBV¾ý§‹Úó‘ø­ÓZh?â²AB‡ðBZÿêÿ%†a­’ :åÂÞ­d*¸>I”�›,fÕ3þ´lÍøºF‹C‘‰Ð!¼ÐÖ¿ú7a&gFãhîÞËî{ý ËGn5zL ãñ'?$xÒcy¤´ÚX\yÚt  æUm�Ùb~ô+sN�?ÏÿÐY“CæêÝ{)œü� ŽeÌRZmÜ^yÚô¾+?ëV6¯\‚‰j6ËÎ=!`EGºPëÈîŸW+o÷’·QñšÍ²÷c£l,Aê´£\‚I.Ëÿ1]Áe ¢Ö‘·|^ý�³{i�[Ù¼=F¬Þk@ÊÈV¹Î~¡3& âXjìn?Æý2ǃq=¦O+Ò¯`Fsl8`xÙUs`ý-ÚP³Yvh ÕO¢¢¥Ýúé#iêÉΊ0\Ü!?­ä;K´.PÎn?Þ­!¿Ë¯@w‹¥ƒü b j<%A˜Ì»ËÚ¥_‡a˜Û5£¸Ä¶*c¿Ú9ôÛ =ZL½¶TÿB?Ïvöž$ ë›-_¢bcGàc3æˆ�/MÓ‹u­ä>è„ÒjcYÓ·–O!‘³~Œ=Z¬çÅmº›±½÷$±¥¾Ùr½?Ÿõ¨6ï¾Lï×7[PíÉ8M·†üzÝ>ô[hìNƒIªdR}³å졳æÃ>xÒ¶ë‘ sb£ Éñ~Ȳ7û>0UÕ7÷¯<'›éÖ�××í3¬éïç=.^]øá´]WIÙªKëÑ¢ó­b"ù¿Ž�üË/7°"�¼®ÑråØyr]Q°Lò¶\‚‰P±Â÷Îv•rFÊV]†'e`=6È¡³¦ÿ©m0õô:l¡¾ÙR{ü‚ù$*&—8¯^Û`®>ù1½…â¨X´E·úv�µÝ~3Ÿ>~Áü�'×ðJ�”‚;eoÄ"/¿Üù£Õʹ¢5Ãù¨,CJ�ŽUë1�Ó¼}½0ÍNe‡ó~�ŠÍߨ[Ža²r רPf@¶€p¯¤µƒü¦è0Áù6µ æc'?6ÿ  ÌMç¢by冼Öò{Ÿ t“Òjã¾n éPrT!åݯJB·Kní ¿.:ŒÞ ãµ æ¿Õ5Z.yz¯õ3—K0áGEò+cG¢{ü±µŽì¿D=ÁYk²’’í) Ž)â_wX¿øõRõ8�C“hv�'˜]¾V†Ú80OËÖ<†úÉ%˜øÊnEýÈ`œ«÷òöø%êHg÷Ò¼ÖåV£ÇŒEGŒœ­ø¾á€AåìÌ™’€.ÔðæAb#[Í�ÝYW˜�8Y# J³¤ädž–á̓Ü�E60¬õ†90o÷I/­6¾ÛÒnmôæ5é ­Ózµ¬Æˆl—l£4Kºuv¢¥Ýzõàãß|.ÐCR t+lß{ûñð|üü'„ÈÖÏ÷wkHÚ³<¥­Óz¥ø¨±Ô[×óªA°¾›AY%‚�¬-5ä÷hÑu®ãsb£¨d>³maÎ…ã·¶uEiµñ/¨Øšù¢ur‰ã¸mVœ÷ª–så�Ö–z7‹Á£…(Z;È[aÁ¸Ôhþo_Û4ܰœÏØ�n„:„ç|£ü¤XèX…°ì”q{ñQã;´ˆôõÍ–‹™óD+í_pÈy÷&ÌT×èøÂ·µƒü6,5Ù”‡u4ܰœÍØáùÎÕÏñú ‚ÝÍÓRëÜïÇY»ôNÏ·¤$—ÊyõˆÕ:òûü ²9[ië"»óÊ Èöl¹ÉbUX0ïT,k—^¥Ö¹Ö*€i–lÕ½äíkúÄ =ZL³óÁú¶^{Ou�äšI.ÁäY!ÿm9Dla2ߪ¿l«"Þp’§%¦ÈÓêÝyŒ@‹Mì=I¼ÙxÓú¹·¯ëµm^{l_°›þŸÊÝï Gj]_}+g)%Ï•îzvªŸCÅn ùý¨¤Þ‘½cah.ÉŸø�-rdÚwòºi‡ÎšNÛ�ß½—×å¼a´ˆtµŽl•Ô;ÊÙ:Ò|2ƒ`wßäæ—Vùêúž’_aØJ‘o5e¬ïM{WÍ�õåi]®m@·“Ëœ‡næy÷^2Ò¹×ò+ ¾0æKƒ`}M.ÿ~⢉uyZ·:­­5&dN•TD™oõ?ÅG�È/—X½×�‹*­ä?ž'˜‹úLñQã�KMf—*�ÐÉ­Në�='Ð;tÞÀ§±‘Yr§*#«r{Tû ‹o÷’:TlÁSÂEˆ®µ6ˆ”Ýó¾Wç{ê›-_”�2"OC§Kw„ó† bó7ÞYß³+�¤ëë y/½�ÏÖ ?§l�D5ÿ á=«ØÑAmƒù£øírgñÖJÅ¡AøXûñÒjãδíz¯ï’0EX0(®¢véÊN·§ K”–­‘äÍBø{ZDÞƒÚóÙø­O«}Òb®°>I´:7YìpÌV­#{ï=è`F™oHŒÌ)_+«B„¬�½¤™`›i�Å*|þˆÅ"Gáá¹Éè&œ…UDÞ@3Ö—§uØÉ‰P|Sª˜óÙÙÞ r—‚e’Nò­þS|„pÚ¼“뾇~_%x6&rpU]DéÛ¹òSÇ'¢bW[,ÿêÑbFúUÑÃ…ÿ˜Š[ÿHL¤àzÕ°0†a:3©ö�ÇPŸyÌoiL$À6Ü߸XŒ,hÐÖi½¾±‚ØE¿"v¹Ky�©êÊuËT¬4Kºƒ~E¾',˜7lÆd?dËÂ*îžñ&`�Ÿ±´P÷‚Î@jíÇÃCðGR„Ę́ò…i’"…”çPË·éË¥='ŒÈܬÁäg\¾nýºòŸ¦}¨˜*I„Üáâ*鳄³žyÌùn*­HŸ¡#0Šîáƒ0ˆ…ïÝy´p¨£„G¬OB—Ëár &S%‹‘ÕÞkÌ{ê-ѯŠ�xýÀ×éR“½r ¦�2N0Ý>­ä?~äœéÝ.57κ8ãÏóD/þ¿É~Gmo÷X¿z�vŽF�±ø”=½À ‚`õ^¢ ¥ÝêÐ@!å)*_–rºz€ “f'Š� ß>n,hï";éWÅ^À NXµK�Ì׊ÍŸÉw« ›(X&ÉUHy�ˆPwa±“I¬ â„ãÌç�ž3!+–lX(æÔqÛ‰‰ä?¼pºyJòÅmº%=»2uÙ¬A(¸Ñfý2%A¸Ì>©sd0þËn ùÙ¿¯q+™¯f³üd œj?^Û`®Î|Û€¬´8Ø�„‚úfËgµ fäÛdU²ø­wzƧ$ç…‡ Ói¬Y»ôbw΀AîAò›ºõ·:­·ìÇå¼°×— ³Ù†\‚ñ3f ‘…*O‹oZoЯŠ€AîA{Ù¥Úo@”J�!ÊŽVòÇÓ¯Ê=VÎe8©™¬^[jp=A¼ ÄÊkLGê›-Ȫïª$Q6ýŠ\',˜74c6:  è0±©­‹tè!üÄEÞü+ºbߌÇüžgó¹‰Â4Éö@¹ãóKMæO7” ˜QÅÀ .rô¼ùì¥&3²ã¦T1+3_§?,ˆ~æ1¿y¨X~ñ2—ËÑÄ –ê“QårŽ<±>Iô"3ªœ“·H¼5^ßl©ªþØ|Š~EÜ â�7­­E‡ d”ŒÙ¢×åÇ#»LÉŸ­ä?�ŠåìÑ#�8q“ e†Í·{¬_Û�Êy�›ÿ$AV‰§¹–¬� ßßœ¸h:X×h¹H¿*noÒÝÄhÆL+Öÿ°ß³ö1å0<úÐYcY�–ÙBy%+$yONôs¨�Ø­!xj•fa‚³®3H?(­6V¶´[[ìÇRž¿* Ýè“.”Ãð�…Ó…kQ±¢#DN�ãD+¶é=F¬,ѧ¢b § —&Æ béWÕÇ˽‚*xíkËå�„×Z“ À ý¤úcó?Ž�7!ÓËÓï4ǔѭ)&’?~ÁSBd ¼×Þ%8‘Ã6À °j·~ƒZG:¬7å¼°ùOéÖ£JÛ·X³q庥öÐYS5ÝzP›×C¶.çgÌauAÍäåêß^¾n½Â´.3ˆ‡l(3¼Þ­!»˜ÖጢÃÄ`ŽþÛ¼b4cf‘û>6Jà°íË4m�Ö[Ͻ¦[@˜Øßªš­À â6Vû/5™k™ÖaOÁ߉�=Z¨Pâ °ñ‘£ðŸ¾­¸‰Z$3A·†üü�¹½˜ÖÁuÀ ^$1Î﹈áxÓ:lÔ6š«ë-Ÿ0­€ ¬A€0P À @(ƒ`  €A€0P À @(ƒ`  €A€0P À @(ƒ`  €A€0P À @(ƒ`  €A€0Pðÿÿ’òyj c°IEND®B`‚maturin-1.16.0/guide/src/assets/sponsors/frontend-masters.png000066400000000000000000000244711527064705700243600ustar00rootroot00000000000000‰PNG  IHDRÈÈ":9É)IDATxœì�xåºÇ§loé½ih‚R¤Qð TéEªRÅ#Š¢ˆ "*(Š ¢ U�~AD¤!�ô¾-Ûwgæ>Ɇ$„ÍîÌ;3IðÎOŸ�læ+IþûÕ·ˆ(ŠB¸kêü;„%À ‚°xA–/ÂàAX¼ K€a ð‚ ,^„%À ‚°xA–/ÂàAX¼ K€a ð‚ ,^„%À ‚°xA–/ÂàAX¼ K€a ð‚ ,^5uø„ œeZBot•”¹tÒl&M¤ÍJŠpÖ<…Š$(Š¡b¦Pb*®V‰‚E¡Á¢ L.kÒàæß&,ÊåªøñœñØiû�4KêEÒfdS›4ªµ2¥‹¼ãƒ~ƒz‰ÃB¸ëæ¿ôß»Á¥ÕëvÐ{Àšq…rÙ8¯ÅÄŠ6)ª]Ç=-‰‰ä¼þ÷¤°(—Ëššf¿™éÈÎ0_¼d½tÅ¥/n¤¶Q\Ú"AÚ:AÕ¹³ºGYR"©é{Š{LXd…YwðxéºuöÜ´¦îK%¸< bÙ² ±O7uGš÷Œ°(‚(ùpcɺ÷I§µ©ûRU§>¡ÏOS÷éÖÔiF4wa9ròõ‡ŽOü`½z•åJœom 9ZÕ³«´UlS÷¥éi¾Â²\þ;wæ"[ö•¦îcT{·Ø²VèßÔiJš£°H«­ü«ÝE«W’VCS÷ˆ²S·¸[þ?ƒ5'a‘¤å¯ëåÛwè÷î%æ¦î [p…¿æ‰AaÏϑƵhê¾4ÍEX¶Òo�™j/NoêŽpŒÈ/4áÐ~iÜÿ»UW³¸+´^þ;sÔØŸªqJÒú 2;ÝÔilšxÄ"-Ö¼ÅËuû·!Ù„Ýà‹ß¾[Õ£KS÷£ñh2a¹´:ãáJ6m°§ÿÓ$hdD�¡/¿0|*7UœeZRg ÊåBE"Ç1µJˆJ%œ·Õ4Â2�û=sÌ(Êeoü¦›yâà Çva2i£µh8ö£~ßÛ•«öÂô†nQ1©ZÑ®³ºwùƒmT�väDúM ,{Zfú°Q.mA#·ÛLˆ\º"dƾ[qää¯ÙPqâ¸Ó�Ϩ 8$&`èÓª^]Õ=R ¾o÷ï ixbÒ™C˜JÉ´ i¶äÌXl8µŸó.ÑD–Ô6þ»]"MCð(¬’�¿,|÷õF:ùD±ÀaãÂÍ–Äòb7LÚìå[vé¾ÙcͼÄmÍO�‹ýäFEˆ Sú€á¶ì«Üö„)"uxì§kÕ½õø]^„E9�ù¯¾U¾�ߥ:&ÓÈÛ$«{÷V?ÖCÖ:SÈymÎ�ùüEý÷û+NÿÂáÔâÓ�þCÑ|˜0TÜš<ÝôÛO\µÎ4tÎüˆ—xøçÂ" ™ÏL¶üý+·ÕÖEµb¹¦ow6-,)\ñaÉúÕœT%KjÛúÇ£tžtiõéý‡Ù orÒ.W?;#jÕ«õ^Ä—-[Æa„Ù’>`¸5ýOë¬ Š‹�lùÅÇòv÷#(ÊS+tPwOÁ•!æß~«ë¢ÃU^¢êÜUÒ"ÚÇs$™9|ª5ý"Ëæ8ÇrõL ìÜ¡î‹\ŽX„±"{ÚœŠŸOrUa-(&oÓ>p̨€aCq5ã¥.¸´ºÂ7Wj÷lcY�HÒrëåÃzy¦dýÆÂo°lˆ/P´Õ¦-š�}j_àJXŽ¼ÂŒÁ#eYœÔVYRÛV_}ÁÓªœÊ6mÏ_ö_–Û‘2$ùÚyTâù>˜4™¯·ïÜœMjå<”tü`͗ܬQ³%㉑|¨JÑæÑø][›³ª*SÇ´\¿ ÅX¹•»Ì¥æó n9óþ»¢9« AëõK¶›™5_r ,ÊéÌ™5ßQšÉ¾ªZP4`èð¤c?$žØ- æ²f~ðÒ?ê�•Êê÷©Ýµëî)§+wþÝw_³©¹1 ¨[“§† ÷Wl…EDæðiÆsѵj¤a ûÆ®ÿ@Þ–ñÝg4vdÔ[¬ö‰úCß“–ú7džCÿÓînöªªÂž•Z²v“ûs¶ÂÊ�õ_Óï?pÑ«jäm;¶þåx½-ƽBðÄ!瀋SNkù–Ýõ^Ô:Àº_�‡á»êÞ²VÉ'Ÿëíà¨Kˆ461|Ñ’ø][ÑF´ƒãœÈå‹#—®@0 ­\ñïÙÓj—ªe_l7œ8Æ]ï—ˆüÃÄá-Ä!1¸2�ó#{qº=3›Õ®Ðz55íñǹ²¬Rwë·ó«¦=šâ�[SfŽ‚•U?20îÛÊ ¥lËîüW<jÃÀÁQo/x扺¿d—Vo:uÎô놣\†Nj¹áK¿'ú…åÒêÓzv”ssó/ö‹L8q@ÁIm I—¡‚¬ZW¢1ª�‹4*^OíußÊ™;XÅHý›ÐnôìC:LœôÇÐÈè÷—á~ê† å_îÔíÚk˹Ʋ­è«ƒ&Ž‚Ë‘�—ñÌhG‡ ¢ °ðù/ú�‚+ìksï¡,^¶\üËYZ`û'Ý‘“Gèt„IWï|IE~Ax` 41Nž|¿´e‚4)^~Wj#mö¬1“MçÏÀŠG¼üfÙ�%¹ðàbG�dpªòO4@ÓµÍ‚æ —ôßï7�=oK*,⥗C_˜ VÎÜ…ºo=lŒÄïþNEûgöŽ=+§è­�§Ž€ßåêGúÄ~ö�(8�“þ�kêCÝ\ À](Æò¸Õ Z$Ù¦�ĤH„BP õÓ4h=ì�Š“@[Bqd³Ëpx0S&U·Ú¾•¥ªì·ræÌåQUu(Ý´‘e òöpÔZ8:wB«ÁP Ä@û\Gn�³$ÖqLaiw0þÈÊÐJštëÓ?°¹«±§ßº5eÆ�^½Í‹Úxâhá[k— \ƒ4.VÕ©7§�j"1™x¼†Ué AP����UUøúJXAQ`„,1Ž®°L¿ü‘»p6B¿‚ļ·Z.NšÌ™cÆŽ¢›n0„*ùtMáòÙTþò|îúÓ DPKûkK0•Ã0C1 Óh4þþ�–íF†þø^X7‚'LqG¦ !,’Ì_´ÖL A#§z7�ô޳´<­ÿ3Ž|N-shSºå3B�««ìÜ^ìǯ=… ÎÅÏ£ 9‚Ví¹«æÁ  à�œn'Ô« ÅF?åþÔ—°âÖsóÙx¡bYÔ[«£W¿®Áxò§]{5¡·å²iwì�—GÑÀ üF!ú ÆZÇݪ*U…‹ðˆÈQa*ÿæ+X7‚ÇÏ”D…»?÷!,Ó¹ß G�£¢›ÀÑ£ƒ'�_•8KÊsfÌ"ÌZ6}`�îÀA6ѧ=Ë]_êCa82~t¥ 0»�Z¥ƒ¢Y.üûm£¸$âÕy5_úÖÏ€6ê8b$¸,i4e}–°èYö�=–Ôë.ÜŸ[è/Ò„rÚ£ZȱӰ?÷6°j¸ª\¶Ëå@/K[0å‡4>©®k§7af‹öÛoa͸JcÞÿXѸ߶ÝȼÑ{ ûËvN@]¶Ì÷>aSƒ4¹5wÝ©†BQjütÑÈ'«)ôöÿ•Ÿ«Õ 2xÇ|x,¬îqGboÂ*~{­³§åæÍ�£ž/\±ÂQx \œsŒ_}eª¨—ß—Àiw*A;v�}áîIÇk¦B,,Ó/çaU�Ò–Ko,ß¾ÖFåï±MõcðX®Ö+©Æ¹´xf�ØZ^üÛàâ¢`î§B¼ûc·§¿º+?H¥+\Û� ¢¢ ÖY›;†ä„E’9Óç³¹l›÷¸¬~ÿÑŒá#’n);pŒ$�v’˜–ÜvëÞW2°×íAʽ¬ÖVPP0ìÀ½dõzXgÔ�ô«g§éù®Ðr퟊Ÿ�ÃÚ@DÓ}°ßãý`eíY¹Ù³§�›æ—ßþ0™LÐí›$Ö—=°Ž½”+^£Š"+ÿCQ”¢( E¥(24’ ÖYR®;Zß•ƒ&aKê›P{Öµåwx°T$‹zïupqNŒ½xBR”n5s±ˆ‚¹‰×UU—L±t~å² ­>¹rTîÅ»L&ƒÍƒÆ£'��º8 FùPÛz/z–ñä @U‡â–7�“ۺʴe_Ãv|ƒQ„¹h¢#ŽåÊUD>~‚$<¤æÜ ¯\µãU×ÎXÕ<R0A–nÞ¸‡-œw÷‹„EM¦³@“ Uךþ B Ö#gú‹lö¡�€­¸¶Åä2±?³!ª UM‡»Áܪµ…‹p‘H¼Ì̶g§ bUЄá^¿û%íÞÃ`§.Õ£]a+7º?_¨ø ¾°kì,ŽIÅËÿ­7D EõR½æçö„(•HQиhOºÆH<{ Ô_¼†Š’µÁÚÀdš€aC`e]:CöL¸1Wˆ¢â¤)áí:�±Ñ.‰Øát:õ¢\ﺕEh‹��ᨠž‚PߊU<:‘4hÅJEŸ®•;S²rL@ÉÊÿÜî0•)D kh¹ »¥LyØsgë}]¾y'ØÂ+lîBñí;H¦�hò\š'Ÿ Yý–Óá°;v›�r¹0›  b�Îäx‡Ãár:'ÜhGÇêÄA5x°fHÿÊÍ_Õõ�{��¡•Êrï  ‘É€º·ü Ü®):x¶°­/,ýঠ“ªƒ'�‚•EÄü×ïಜ ö‹ _¶ÄçÑ™Ó ·\ÅÙrÖ zðêñ A+u„P$EaîW*õEÁ.žÝv¹°‚Ò¤8�¯ß!,{VŽ5 x¸ýö»4ÖQa2ÿ¬,{0±"dú¬�ÙS™”pø�~l+ƒ/!U†7A“g©ût§P¤ö¸ªJOUÿR(‚RX帖õÚ g1dš‡ÆÊïKôø­;„eùý/@í• GŒ +‹ Hé'[])¸8PL·{—Û`Ú§ªÜ¸'#@[âÛ.YL yn^ø«óÉ*Ü­£·?©”Yu@JR2¹ Ö±òÍ;`IC‚ÆŒCÅžÏØïxÕ‘å¶�DªþPº;áÅÙ¡î7 ÑB&Á¢§ŠüÃ"^ž‹VM‚ŠQhÕ@… d•SkÕx…"Iáì\´r?~ö,¬ f`ƒGKwN…· Âj ÷E1�ûÝQÖdV �ÃáæbLAÅ�|“þC»GÇk÷€(…V]ZV X¤ûÄA$‚ĪtäÙ n Šý"åmïoè»wtÅz rDV›º¬ BQE+¸‰–·Í}Ñ�IF+–à~L‹ˆƒ£CfÖF­q_-»g@²Ê¢Ï=Œ(!m *®OÊ6}+4i’—ïÖ ‹"{:D¹¸Ü_Ù 8›8ròÍW~�•eIÄ’7BfŒgZ 5Â->˜N…˜D¿ÏÝ÷c5òª^caJ¢b¨°t߀b‰£XÈôq^¾_{fjKMƒyV©{ôCp I;øÀ—%’ˆ–Þ/ ¾îsWY#àG¼òº´UƒŽ�5æí¶K×òÆÎ†5á*)s™!Û&qP$¦ñ–ý«V†c?‚ú†=ù ¹±\îCYº`ã+aŠ’ï?!-Ìï�€‰"_'xêOa˜aïáìQc$QÀ –ËÀÈòõÍêQ;š~€��F$©º<(èÆzøƒ±Aq_JÐè§™–ýqÍÿp•€“•ã.4}û‡Ðx»Ú3²sçϪü‰úlÚR¯Ã *lçý�ÚËž Iý£HI”ªÁ‘Ã,6{P\³~ãአU[9 ãëÿ'h ÖØ®IZ´€5ä( ”Dû¸žª–=+6×úêX$éÈjTçfLªhõõvYëx¦Åç΋�…l›§Ï-ðé±þC|=³gç•nÙŒ¸ AC�XÁS¡¯«§BàºÅÔ½»A VaϸÕÈ>ƒþÃþ£î IÃ,9Á�g‡ËäÛú4àÉ11kßõùi±fã*+ªœ4’»ˆC�·�¶ L"U¨,±•÷gªG,Gä툫:ѧƒíŸ pY~J‘y…xä †)˜Ü/z­X…o¼_“cFÝÂΞq‹t@,­•�=gU­Ëí©0 ò7‡³  m¾Àq\ï?;UÓ›±"YT*y{ZÇ…Fõ¤¬6ï„Í{ÁûÞ�ñäÙ²mª;ƒ‹ÇƒõG»˜ó"`ì3>Ÿ©oY�Køº¾ [jãe õ<:jãÀE¡¯¯Æï¼ùÇ ‰3îΓSiXBèŒ)tê)ùð£š;cåC=ÀÁ¡ {¿”©Bé\WT�X„¦‡¾wÝ¸ŠŠØ§&QF­¬Ÿ[–Tf^Pþ©É†×X(†Çl\‹Ð¸ì³^þÛ|éBÍ—ª@[pW™Ö^ ÉËOg¬–K q>Áý�~Ün%�ä7ïÂý!­”i 9RMcñç*Óf�K¹j½9$‘-$QÀe®á DX˜Då÷8­È—Õ#VÝîÒ…UÎ f ¸,#Bg/Àý!¾Ë¶�¿D)'O˜hWÞÐTè÷$½ãÐï�×û3IZÆÂz‚P”åoHBxEÛÎ(ŽÓy’U¶Y6�ü_Œ 2yv؂錋Q”yýêÜQÇó(æ%Õ‘w\õ-#P\¾p‰ê‘޾Ëê %ŸZïEEÛdXOì™9¤9Çÿiº3o“ £'|6È’ÚF.PÐy3ÓùÍ&�—>(\`UέÚú§Á‘¯­ðyÓŒ¸³âŽ~ΑSÿ–B––ídÙŽ HÀ°Çi>É*ÙÅÂeS+QŒ_mù fƒqüÜ ÷*‚ ‹4Ý1ûK"[OM§`Ù;ÌWÏÝýº8xÐà*íÕÔÁôýeª……+ v <–p宕ï}qHLÐHäOÂd¶|×`ØUT_VÖ;Ó i�»pó— ÞôtV‚áò6I°žØr çáÒ$Ï9©–8ÆÃUÌʵÆoä‚…(.ŠÛñµ8ë¬ü•wÉÂïü1¨G¨{[Wó¹¦ç�€gh­ÙKÖ­óh€©¸?¼?…yÊïg.,Qp0 %4B†›€@|Ÿ„Lœ-cò[¨ÁòÇÛ)o(Ô#´rå`«¾Ò©BcÖ® SÄYTZqÚ³�œêHB7.PÌq÷µjaÉhÐÝ öÌt‚Æ�}CHb#5ýžoy›öáK!É œÅ¥%s|"dsÂâ,,ªJ*h¯((Àçó¶¿of I¹<Þ0¢#¡oKвgC,Â%± Ì�ª…ó† íæò/Y¥Z�Zñ:®à."Y!ÓgÂl. »ö:·Lln±\e•ãDȤi>mNÜyó2þ3Êžíù:UÛF– \`Ù3³I ä<¼!oz�T KÞ˜‘K»u;, œITDÒÿ+’!6RÁ$*MÿÇ`eM?ú¶úg3bf}åÊò?´éüEo¸L ¦•W<ìûè«!¬—�N~’æS¡4¾%,¨=ÿÝVéæP…ÜÙðb™)a ãjß–'wcÏ̱^ö·lÚP9VÍz!nû·Ò–¾3rÙÒ²ô'¼EØWtjîÌ{+èLßµÏßþÓôÎÙy/¿d¹´pµüy9­ß`§Ž›ÛèÐ BgO´gåfŽ™@'3¦‚§â [ðÍåÅï{Í7†‰üïîFÅ��p�ʇ»3Ê[SûhÐø€öªRúó¼˜�ÅY§9˸Q•<¹CÄÒ€¤=”Ë•5r²#—VªŒ�¥*NÿªÿÞ[þ"Ix 8Õ>i±ZÓ ·„êÞÌœÝkÿ ÊG:¢"à!�5õrÖØÙ^ì�îÆøÃÙ›½qlÍÿñA°‚e¶ÙóéÎl¦B:�kîó ½?#†Z4TN²73akby;fçµÂBq\Ù ~4b<}ðï]ŠV¯uäzÓŠ«\g8r2kâsYF{Yœ2Ewà—nwa½öOáªåôŸÇ”–º Q°t•þc7L9$óIÑ»ëJ>û€æÃR÷q•Ð9R¹UwÆ�êoÎ¥­bGL´Ý$h{RþäÎÀUZ®Ý¹ P“q?ºJÊJ6ÐM”/ö�Æ¡B¹ÉAÅ sÛn§>‘ËË!wÒ�LÀÐQ±߇•-ùäsØ ;Ö÷NÑS]“I6¹?œ0£†PÈé†aarYè¬çu5&Oމ]¿öÞué å[¾„µ‹iXy¼Ý�==K»�A^*ewxzQW9$dœ8’Âó9µfp_‘†•û<¯àÊ€èÕðÌu…¯­"�@!°‹Žg(*gæbŠdàW"cqˆEš 0'Ï•ŠÄ4}�gÙ|¶xðj…¢ ßZ£Ý÷¸iŒ»©�´Ù³ÆMc”]“ªíá‘Ï]Fˆa¦t”ÓàÍš$&²ÕW•�à3:O(è2œÒüÇ•’O×°i§´ƒ&ú½‡Œ?cTD޺ػrñ®‡ø(ˆC!ÖÅ>®lÞo^‹-‘*´Å—k7ÍnŒ'ئ­Ã¡éµîÆpüÓ"’¾Mn¼@ú wãLy/ùø ©ût‹ßñ­ºweå(Æ âÈØ„cÀ‰Cl72Ê¿Æ4wƒ+Ø u)Û¼�¦_Öh�é†4‚ÖX*îÖXuQõè·usüŽ=˜„w‹ï„/xÑKxjï�FSÆS£C9›H"ØæzA»ë`þÒiúa‡v5À05d#LwRuO i  ®�·ò:\<ÿ•w\¬ƒˆŠ`é–ï„0[ ^¥¶ïn$±ÀdÛn(ÄÁ¥&`0Á…̘�°ï`È´¸†�‰*'>3&ñä º¾1þp†ÍN°I08q]J?ùœ°ÝæØXb¹“�@J�üÝ™­œ”)E.{5ñèy¢ç„­| îÑ'æ£U`›IAJÖ®ã¤'àÛß\zcégŸÁÊ¢¸„¥™!E/o^= Ço2€±¤-c’Nïoµy›8Œƒw°O‚'±º»4_¼j¾x�“ž°·›üÅËI;0›x$l0ýt`t ßëiô xú)pq:H¢ãc?ú ìÎUu¾p&«nQ§ô¤LÜ;ºï9î¡5ýOë5H&Êf7>Á¾ÞU|"…Ø)¸©ø‰Á�&\X”ÃY¾}+¬¬wÄa‘->Þ·g#›¸.„Ù’·àU뵋œv ©:[êÈgEœt8Í\N6Š°èØ·ncãÌl>ÁÄò„ï¿—·eu¾Œ Hæ&U\øG�ªЉGLŠxm�·`¤$i¾xÕtú×ò­_:Ë8Ëp&ŒM¾Ê"!-A¤vìU“+…)ܼIßhÞn½Î}nY‹v-6¯•Ý·7rc¾p‰?UU-u\å;7Vœ=I™uxÁñ¨Õ+²&> [zRf B[XÀ+wÞkÚ=›=ô@$•?ð`ÐØ1�#‡�Íj ÎŒácÌ0[°I)ÂÉíF¡!d m�|ÇÆoV»}î‹s“ÿ¼$§›ä8b:ÒÁአÀ±ã#^šƒrç·ž=ma#« %†-ýºö›½ÁÐtÉ?þ’¿äEXY”Iæo °`—�Ã&ú=ÙÏ¥Õãþ~ò6IwçggIé§_~ØÇm�Í�²­_MC3�]¬×þÉš0†"€ö “@a‰Ay¿L¿œ‰^ó:›ížô‡Ž¬€dbºç°g¦ÞèÖ7pô¨  £q?߯R”ÝaþóŠé§³åÛ¾«JËȸ¦�Yœ9вŒ'à±!¼@Z¬ù/½Ò8«œæ€='­påò´�CÍç½æ|¤¨Ò�ß\OnŸ1ü©âuï»tð(×êž}=±¤ÌÓ*»Ñï;ì74Ì#AÜš8×¥o¤$uÍ{NZú°'¥á‰A“'hö”DG¢R ew8Ë´æ_ÿ48j¾ð W!}4½˜y?w…”Ãñw‡GK—ÄïùV™ò Q�8r nM�I'HËÿ P”MH؆�Å?�tò{FkàTˆJ$~ ×ÃáÈ�½ˆÃ>ï¿KUÕƒªª‚[¿Áte ?7Ruc(Â�½ð¦õ:7I{µ;öWœfvÕp7šO4¦Ýâ=‡È?Œƒ  ôñÜSÍ0J7l·ëÆüÛÅÌqSr=_“†¢}§_~è›Ð™óŒ—íê½NÐÈ™\X¨T¢h¼[ÐíÛYqÊC:+šŽý˜þô�ŠSÇYª A�ˆ—_ÆdR\¥ŒxuQèÔ,kû÷�Ë4!3¦ ²ºB‘ÝLŽ€ HöôY°TA.­¾`)ÐË¥Êö�©ºvªù2tîLi8$Ï¿˜¨wVœ¿Y KÝÝwšü† ,åiŸ0c°B²ÝÈÈ™·0µÓ£ŽH*˜z=;¹Õ®Ïë&vÃý5IçŽÅ®^'‰aa‚ÌL¬›÷bøÂWQ¿ñ˜™‚«ý[}¹-`0™9ð¸Á åt]OîHXàf�(& _ôjÈœIÞ/((‡³lË®¢·ßG‰©‡êÑÇâ÷4èí*-Ï1ÕrówNÚj 6!bÙBwX^ã‰3Y“Çò´­µìÝàicÁÅY�X¨X4xê†"]…«–ÝHégùëzCÏŽžJmß­à�ÿr¥ªÊáj”·ØÝ¢� ÄSû¢ß[‡É ÞåtÀ$ª˜ÕëbÖ.¯ ö¬éÿÓÓmþ�µh8n8›X�Xn¯íŒ§FZSÿbS R•ÆCÚ2Q-Ž ¯œÔ Ò¥Õ;2³9¹ʹ§žÐçç‡Í{¡q‰ë((28b¹úWÅé3,ÝóQ\"�o-Mh¥|¸“òÑ.òûî>rääç.\lúå ›†X‚«Âý7pì3,}Ù Ëí “úÈ#“èaM†Çïü¶î‚�&¤Í®Û{Øx䇊ŸO4�@Ð3¸"@Õ¥§²{JÀ°Çiº%–³/ï¥yMuï·m—šáí�G8‚ iƒž²\ñ�:«Éñ0¸åæ ljp•”é�œ²^¾nýó¢-;õn‘árQ`¸,9Y™ò°ìþDeJ€¯QÞK¯—oƒ{ÁÀÁ1ï¯òÌÐ^n„¥Û{0ç…Y\ô‡Gäm:´üb·F`”ÃIZ¬¤Ã�ŠÅ(Žã*{#Ø* ‡~÷AÝÁýæ_ÏQ$$t#0©:xʔй3Ù¤ù¬7ÂB$}Ðh󕳜TÅþ†·øb �¬ñÍ Ç­¼Œ‘Ï:ò é$耊¤!Sç„-˜ÎyŽ Î„eϸu³ï@Ò LÀ+’èøû~90¹lسr²'½`Mã~¥�ËbÖ}ä7¨7ç5³=n¨‹4¾eÔ;+¹ª�[ÂæÎ»GUU•Ò!6éôþV[¶K¢à¹™ê!ò ‹zó½ä«¿ó¤*.G,79/¼¨Û �{Á9Ò–­CgÏ 5”“¥OÓBZm¦Ÿ/ØoÞ0]8oùý’ËXBÿ4Å%â°(E‡vŠeIIŠ.�Ó[Ðm‘[afË�.}}fÜkäÉí�¸wÇ*ï�f‹þÀñŠÓ¿8srmé×ë~S¨X!�ˆGÇ(íä7 §ì¾„F~kq,,÷�^úOƒƒÖqHü®}ªnðÔž÷”ÍNØìdUÀmÌ_È~Ã-Ü AgIYöÔéæ?!9ÙƒŠe�£F�/KLš ^„å6nIïû”½˜{7sŸD¿ûaÐ8¶‘jXÂ×¼+ ôO8uPÕ‘¯M‡G0‰*êÍ÷U5ø±ª¡¨ÒM_¿·†0CòNÑ“ªƒ'M }a–·0�Ϫ‚²;Š×l(Yÿ>£4W4A1QÈssÃÎëàƒÆ–íŽýy‹çr›"“(c>\ë?t‡u pBã Ë�}ÊôÛŸÖË 'NÚþ¹«ÅÄÊÎ]4½{ËÛµStjÏÒlH€'UXuqäý¯|Û6{v*Í"ªN½CfLV÷|„ðG<Ñdª†¢¬×oXþºn>û›ízªK[â¬(qÛ bRµÈ?L-k×FÝ««¢Sû&?ô OS Kà_Ê=5+Ð<„%À ‚°xA–/ÂàAX¼ K€a ð‚ ,^„%À ‚°xA–/ÂàAX¼ K€a ð‚ ,^„%À ‚°xA–/ÂàAX¼ K€þ/ÿÿü/óÑØn8…IEND®B`‚maturin-1.16.0/guide/src/assets/sponsors/prefect.png000066400000000000000000000070561527064705700225150ustar00rootroot00000000000000‰PNG  IHDRÈÈ­X®ž õIDATxœìÝkT•eÞÇñ›“€ 0¢¥>‘ŽNŽÖ´R”CžPIGÓP�CèãYHÓ´ž1-ͦԞ€F#d4ÔÂÒ]xâñ*S £©ÉIÎÏÚ׌“ƒv%¸÷¾nØ¿ÏZû¹sÿ_ø]×}íû¾¹­ð­[·±íÞí·î�(­(ý¯ÚÚZ›½�¨y³¨w°w¸ZUyçèÙó§>»tùüåûÞqïmœ\žïí]]_7óüÅ3î?ܼnÒq‰T°±±ÅS»Ô´sm·/ÿBÞ ÿwüîŸý;�vî�;ýîyŸÔ¬Ã/TTV(–H¥žÝzW¶²¶ ÉÌÞŸ¤ÿÙbåpnÛ¿_ÀWr¾|®²ºRõŒDÊ\¹Vlegï8ºS‡Î'‹Š Ïèôÿñùç|þ�šµ·guMµêùˆ”;ñŒe[W÷MmÛ¸8ZþÊå1×¶.nqß])´U=‘V\ùG±ƒ÷ þÐ=×Ë;(ïü GÕiIeÕXÙØNÔÙÚ¶ê[^Q®z"Í)üþ¢›®´¼Ä]õ DZTZ^]Ãs!Dô�ꈴŒ�I0" B$Á@ˆ$‘!’` D „H‚�I0" B$Á@ˆ$‘!’` D „H‚�I0" B$Á@ˆ$‘!’` D „H‚�I0" B$Á@ˆ$‘!’` D „H‚�h€N§Càð@ìNÞ…/RöaôïGÁÊÊJõXÄ@Ô{yx 2Ò`]ÌZôèÞ^^^XùþJdÌ«c_……Ÿ�§QÀÆÆAcƒ�öeÖÆ¬EÇ':Þ÷www,[òGLÏ@hÈ8Ø;(™ÕÜY>ù¤Wøß‹ ;«ÄXZZbBp>Úø‡ ‡‹³ó/þ?mÚ´�¯�/BÆ£¾¾'Nž@]]�Iæ5wmœÚ2Splíˆ !°~Í:±×°·³oôßakk ï¾Þû*ll¬‘Ÿ_€Š;F™—þIˆ…¿_àÁœ£Ù¾ª‡i‰ôÿ¨'OúoLŠœÃ"UVVbóÖ-øpã‡(//7èßMÿÔ±Cgð«#puu‡D!ãCàââb”ÏÐÇ7uò��íŸî@|B<ŠŠ‹ŒòYæŒ+ˆ9::"jf”ØT›úkZý¾dû§Û³v nÞ¼iÒÏn©ô+¿Å2kkkDFDНf_ �PrC§Ó!x\0²221sú ØÛ7~ŸC÷c �ÀÙÙQ3fá›ìCx{Á[prrR=’Øë¼õ:eåà�ÙsÄá5iý¡Ôœ×g#'ókDÍŠ2Ú>ãQèc�6eš˜qáÛ1Sãq“ÞíÚ!<,ã‚Æ¡µ�¿•2ýá_xX¸8+Ÿ˜”ˆ­Û¶âra¡ê±š ® ÁÍÍ KÞ]‚ÌŒLLŠœØl⸗��Â&„á@êĬŠA{Õ#5 \A$<ŸòDDx„¸xÐÖÖVõ8¡ßÌ�|y† Åî”ÝØ· yyyªÇÒ,® Щc'|°þ¤}™ŠñAãZL÷Òz½2êìÙ•‚Ø�cÑų‹ê‘4‰+È=z>Ûá¡a6t˜¸nÊ\øùøÂ§_ìOÛ�ø„>rX\÷E DèÖµÞš¿}^ì£zeô‡^ƒÄëè±cXºl)r�çªK9³ Dÿ¢ï‹}_?Þwq�Þ½z!ù³�øúPââãp𫃨­­U=–fÈ ¿{A¬=º÷P=Цy÷é+^gΞÅòË‘•�¥z$“3»Mz‡öŠ®ÏtU=J³ñŒ—¶ÆngèÍ�Ùò}Ñ÷˜>k:†�DfV&o>j-\JcjfÈ]çΟCÄÄ×0bÔH$%ï÷W5d¶�Üu:ï4æÍŸ‡�ƒ°k÷.³ÝŒÒƒ™} w}÷Ýw˜=wŽe[|JËJU�DÀ@¸té¿·þ_öñÐ˼1�Ÿqýúu¼»ô=ø¾ä‡ ›6ð.=3Å@~ÁÕ\Ū˜ÕðyÉkׯÃíÛ·U�D&Ä@Rii)Ö°¾ü°rõJ\¹rEõHd ¤‘nݺ…�m¡¼³x®]»¦z$2"ÒDUUUˆÿ$^læ½»ùªG"#` �¨¬¼ q ñ½‰®^½ªz“3»@B‚Cp`:BC& U«VªÇѼÊÊJ$~–ˆá#±é7©ÇäÌ.½Î�;cÑÂEø:3[„bii©z$Í©¯¯GRrúûû`þÛ �——§z$%Ì2�»\œ]D(‡²r0uò8::ªI¹Ò²RÄnÙ ¿þ˜7ÿM³þ‰Yr—››æÎ™+B™5cìííU�drUUUؼu úö÷ÆÒeKù‡a ÷ppp@ô¬(ʳçÀÕÕUõHFwãÆ ¬ûÓ:xûöÃ’?.AII‰ê‘4…�<€““¦M™&BYø? áìì¬z$ƒ+++CÌÚ5èëã�uZ/žêK÷³R=€–YYY!<4 ¯Ž‹Ä¤Dl�ۆ˗/«ë‘có¶-ø4ñSñ`R’ã òììì6!L|=¼fU Ú{x¨©Ñ®ÿð.~G|+»9–q<$® � Óé0âå0»Sv#.>^ü^]-Ë/ÈGìæÍHÞ•,6âÔ8\AšÀÚÚ¯ŒzŸÿe7b?ŽEÏ.ªGºÏ¥Ë—5;‡ ÂŽÄŒ£‰¸‚<"?_øôë�Ôô4ÄÅÇáð‘Ãâ$›*'Nžç1öîÛË_„m Äô‡^C ¯£Çމó¹ÇsM:Ãé¼ÓxÅûøúPŽI?·¥c Ö»W/$¶S<´s[\2¾ÊÏ)4ý ñíáoÅ ¾ŒƒFù sÇ@Œ¤Ï‹}ÄëÌÙ³X¾b¹xâ­!éÃXöþr>�ÝȈ‘=ãå…­±[püÄq$|’€”½{š¼a®©©Á�Œâ|Œ~¯CÆÇ@LäÙß<+^3gÌÄê˜ÕØûž‡ÞDë7ýiéiX±j .^4ú¬ô~ÍkbŸèˆukÖaÿ¾/Å¥öö?ûÞŠŠ $íLˆQ#1eúTÆ¡QÄó)Oq©}FÚ�†��Í¿ÿL¿©OJNÂKƒ`Þ‚752²%ã!–bnnnxoÑ»˜6y*þœ€øO°}Çv\¼ÄÕB ˆFxxxˆ{Rºvï†ÊªJÕãпð‹H‚�I0" B$Á@ˆ$‘!’` D „H‚�I0" B$Á@ˆ$‘!’` D „H‚�I˜Ý-·7mDQÑ÷ ÅÓO?­zÒ8³[AÊÊËðçÛ8³¢gñY|$ev�ÜU__�=ûöbPÀ`DÏŽ¿tš¨!³ 䮪ª*|¾'c‚Æ <2gΞQ=iˆÙr¯¬ì, ˆÈI‘ÈÊÎV=ii ®®3¿Bxd8F��¿þí¯ªG"…ˆDîñ\�Ø ±øbÿ|b“b ¿@¿™?zì(¦Ïœ�!Ã�–ž®z$2!Òò/`ò´É"”¤ä$TWW«‰ŒŒ�4Á¹óç0oþ›ðà‡Ä¤Dzµ` äcþ[ ÄŠ’™•©z2búC¯ˆ‰¯áÙÞ=ñqìÇ|&y Â@ ¨¤¤Dá‰sgO¼#6é……ùoüúéßðñªDlllÑ©}§-¹'��œ<ý·l·¶.a^Ou­U=‘Jv­ì0zhз9ߤÏÔÿü»ó_wýíàÇŸðüðè©#ž%¥·• Idj:�]»t¯iÿ˜Ç†Ôô]óªª*+Ñ0½V¶vVÞ}LlÓÖujñµ¢7ný`Q[[£dh"c²€ì[£½{‡Û­ll�ËY~©ðBþ½ïùÿÿÿPË@dÊ3‡æIEND®B`‚maturin-1.16.0/guide/src/assets/sponsors/pydantic.png000066400000000000000000000121241527064705700226700ustar00rootroot00000000000000‰PNG  IHDRÈÈ":9ÉIDATxœì�yTSÇþÀH” [Ëb‹U­ „ÔZ-ÚÚÖÁ¥Ë³ÕªU[j±¯Z•ºWKiû<-*‹´Úº€‚"«�о>EeÑÚs”=’ A“�ß‘ôð{¯µ�Ì�¹so˜Ïßwf¾2¿÷fîÜïð† �8lÌp@0MˆX$±H b�@Ä" �ˆE@‹€" D,ˆX$±H b�@Ä" �ˆE@‹€" <Ü0GGG7Wgg''G{¡Phkcmii),63{üŸ°»»»ëáÃÎÎÎŽŽŽ¶{÷•J¥\~·¹¹¥¾¡áN]]K‹÷?‚) \±žzÊiÂx/¯qãßYR*ÅìËÓst–O#ÂÃpBEÅñ7]»^…;ã`“XB¡mü†¸eKbxX`…;†þár¹KÇ=’"ð׿³P˜™™M|~Â’Øèööö_ÿsw8Á‚Œ5â¹á_îßcÚ�S†#“•¿·f]í�›¸éFg,33³5«Vúþ_ÃÝÝqÇÂÜÜ\ÇFkµÚòŠKL~óÈÜŒåâì|àÛÄ @1î@ŠD*{kùʺºzÜ�<&f,�@ðÁº5ßH9bîX˜Ë07·Å1‹ ôï_ÿ£V«q‡óg—±zð3ÖÏÑ¥ÅyýVã5©®¾îЄÿfìOYia¿—i´ÚÀàˆëUÕpG‡¿˜‘°us¿V)•Jbjªªk4M¿—ñÌÍ·mÙ}tÈbŠýÃÃúÿ䆹ERLÃîE„‡öûûÝX ‹¿!Î�ËDB¡«‹ Ü¡ bŒçhÃKn4lâ ¦Xá¡!†‹¿tI Ä¡ eéb#þÂb±hH0ÄÑaŠ÷áZÃ/~oÅòÉ“&B�ðߊ—-�5ªÉGÆL_¿@ËoН¿ßï·°°øùè/¯q° ôâëã�‘~ÈØÀþ~S|ûYž0hb­\±ÜØ&"‘0ëıñÄ-¨øúxÿ)ÃzèP€¶+W@û"Î:Ö°an—)3:qD¡P¾ôòk••W©‡A b•¾î÷„I~·ï@8ÏNÆZ¶$Ì*’· BÑ*‡cnnnì“Ùß!c âó«®ýê`oO¥…BõòkWHÞ…ºUzäò»£ÇM¤^ÔBÆzá…i­Òç­L’·@ñõ™ Å*‡ãà`?cúTêý@kÑÂùÔ;!nÓ“«~€b•žhJõVhg'ª½~âY¦äžh=¹ ¦Uús_Gzާ¸—†jÆš5 î ¹$oô\¥‡ÏçÏ¡\ƒ™ªX³Tø nÄ窿B½¸7¥[¡Phû[ÍUD‡¼‘õ­>€õðïÐh4ÃG�mk»Ü¥Œ552ÝÑ�d}ëï@š«ôðx¼Èˆp*=PkÚÔH*ÍûEOôò‹tv�è¹ê¯LŸA¥9¸X\.7 êF‹'Ò“·~"yK ¹ª—°Ð*5§ÀÅ;ÖÓÁ�꺨!�¼¥‡¶\¥ÇÑÑa …êÃàb·5’·èÌU½ˆÅà§Ú‚‹àoÄî+ê ä¼Es®ê…ʃ‹åãMwåã�™·°äª?†öß÷(ÖSO9¹¸8� Ì@Ë[¸r•WW''G°¶€ba,ÿ?pòÆ\Õ ðDŠå5gÎy o®êx¢ÅÂ~ Žiç-&ä*=ž£=ÀŠÅ„c›M5o¡Ø Œ‡Ç(°†€b wwkÓË[Œ²ŠÊDƒˆåèè€å@©'bJy‹iVq8œ¡C­Àö�ƒˆåæê Ð ¦‘·h•77�éËÅà Vß°=o1ÖªÇÓ ´` "ð¢RØ›·||&?ÆP«O·#ÈtƒˆEϦؘ·|}¼OûÁÚš¡VO7ˆX"¡ =°+oõäª &[Õ³dºAIJÆt~µ�ôä­£xß ós•[ é‹9k ‡H$Ê:yŒÉ5’X‘«ôX…"=ÞQä±['Ž2Ó-ŸÉ¬ÈUz�Ck@ÄÌï§,=C‰D™Ìsë±U?±ÆªÇÓÝß)OD,3ЊEôc'åd�xyNî@þ`á‚yY'Ž1veቀ¨¢ãè^¼X[MÜ·› n-\0oï®Ï‡ ‚;:«›mÇtY[[N>°ò]£‹YBdCÜúo“ö³Ñ*°SÙ@Äz¨~Ð ; [7J…†¸õâÖcš:�L7ˆX�:Z1�„-ÜbµUÀÓ "–ª£ CxìÖ»ÿ m8¶[<Ý bÝ»w sHغ™ž¼eVõL7Hͱ”Jøç&Ò yË4¬Ò– Ð D,¹ü.@+¦‘°uó[o,EÔùÚ5U=Ó-h"VSs3@+25’R ¨>˜F­£hn¡K¬††F€V–RWWÐ D¬;uu­,…>±ZZä*‹W†ÓÞ®’ßy¤|Wxë÷ßÁØðDŠUS[ Ö�À.ªk'P¬ªª°†vQU 8Ñ€bU^½Ö�À.*+'P¬Ë—+ÁØÅ•JÀ‰«©¹¹®¾¬-�-Ü©«knnk ¾ƒôâÅKÀm ¬àâÅ_€Û‚‹%-+nK`T¦\,‰DÜ–À ¨L1¸X×®W�½÷&°‚–ùõªjàæàbétºÂ¢ ÀÍ § ¨X§Ó7§ôù×¹Ü<*Í L&—ÚäR+/¿P­ÑPé�ÀLÔM^A!•(‰¥lk+-•Pé�ÀLJJ$TŽW…ð%ô©Ì3{ 0�S™§)ö@]¬Ójµšb'Fñè‘¿X­ Å›1�iä((ˆ¡(Hú‘©wB`P&‚X9gsÁv¯ˆ\.Ï9wžz?ÄR«Õ©iG¨÷C`©é?@yh†S+ùP*X±£ÐjµÉS tG¬Û·ïœÉ> ¥+FNŸÉ¹}ç”® UôKLúVW\$&} «+hb•W\’ÊÈ-#‘Ê*àmÞ„YƒtÇ®={#ÐÌŽ]{!öS¬Â¢ ¥R²û�•”JdEÅ%;„\5yk¸èúÄAK*-+((‚Û'5yù…RYÜ>á×yß°ñS Ù¤Å4Mü'› w _¬ªêšƒ‡S¡wK@Dò¡àïèûÉÉÛ>ß©l)\I ¥²-aû.=#K¡PnÚ¼ Eϸlúl›B�¤T1ª³t¥¤•’™M©Dz(% Qç¨ÄÒét«Þ_ßÕÕ…¨EºººV­YO対Axú×Í›¿!º¨óùŽÝ7»…®´ÇÊ}ùÕ7%¥R¤C()•ìOüéhÅêîî~{ùJ•J…t‚Q´·«þñΪîîn¤£ ?³¾¡á˯Ȏ‘˜ôM]=H…m£ ã„Õý‰_“b¸ ¡¶öÆþÄ$¢C¬ÎÎÎ…1ËÈ ;ííªèØe��tüT§éLè7n._±Ý�[B¿ètºwV®®©½AÏpô6ž™ufË¶í´ Gø[¶íÈÌ¢¯­§ØïÞ»ÿpj:�#ô¤¦eìÞ»�Îi‹ÃἿ.® �lØ¢•‚¢Õk? yPºÅÒh4ѱo@Ü´O+++Ü! §¼âÒ¢Ø7èß!G·X§££cîë /_Á�׸±|>w¹r¥òÕy ±�A,ýqås^™‡b™QØØXÏŸ÷*ÞÐQU]3{î|\'ÃãK_ÿèÅY/cÏ[[6ÿsäˆçðÆ€‚+•Wg¾ôJkk+®°‰¥wkVÔÜò œÏ["¡ð\væÔT‡Cc¡ââ/3£æÞÅgf±ßïߟ3÷õ‚ÂbŒ1ØÛÛýt4}÷Î�@€1 XÏ~åõ{÷(U¥f±zžå¼:/:%g!$.—ûö›ËJŠÎO|~Æ0¨“–žñÚ¼èOëÂ|°ÿOîîîîì³çÔjupP —Ëņ��hÑÂù:�®¼¼‚âÛ§EÑóÝÜ\á…Ö?:�.aû®�7nB½Æ@ðg¬^vïݳäÍöövŒ1ðùüOâ?Ê9sòÙg†a ÃXT*Uì’·à_ ƒÄÒ¿O �|øbXøMñ•–ÄD/À†�ÔÞ¸9ãTÕ:Çpa–X=û ~ Ÿž°}ÞÔeee•”øEÎé“þ~S0†Ñ7*UGÂö]ÁaÓhÛ³`8ŒK¿kûÎ=>þÁÅJñF"ð;—}êëÄ/øò§T"óõÞ¾sσ�¸cyLKOCCãìW^ÿäÓ-��˜ÿp‹¢HŠó<== o‚ô'HWW×?7o�5{. ;Œ�a®Xú_‹û“‚#°ûêîþlNÖÉ¥‹c ¼ÞÁÞQ$¥©8$rßþ¯òëïï`ÄrCß(•Ê#?mhlô÷›"°°À†@ ˜ñÂ4;‘¨D"é{³€«‹süÇqГ–RÙ÷ñÆ?ÚØÚª€Û3 �±zÑét‡SÒŸŸìwà»d¼5’Þ~kYIQ^ßë¨ë×®13ƒù‡Õhµß%šäpèp[¶w³ cõÒÕÕ•{>?ëtö³Ï>3|¸;®0þµâ 먋c¢ã7|q¸ü‚¢è˜¥éG~Äþ¬iÜ¡B'Ü1€ ð‹ÿ8.0Àc —~ù÷¦ÏJ%RýãŽÇ¨‘k×¼·`þë°ú/•ȶ&ì€^k�Ø*–ž°�àõëVŠ1ÆpïþýƆF¡Pèää«O©¬|ûÎÝp«ÍÒ »ÅÒãí=iÕÊwf½ø"�gŽ;JhµÚ3Ùg“¾-¯¸ˆ;ª˜‚Xz† s[½86ÚÑÁw,FÓÚªHIKÿþ`ÊíÛpNÁŽéˆ¥‡ÏçOŸ¹háü©‘áÌßÏþH­.((:’ñcöÙÜG�á&¦&V/B¡pNÔ¬¨—f‰™f˜F£‘HeÇOff�ξ{ç>Ot˜¬X½ØÚÚFF„MŸääíù€ÖVE~AáÙÜóyù…ψg>¦/V/\.wÌOq€Ÿÿ_oïIÏ £cÇUccSYy…DZ&‘Ê®WU³ey“:H¬?áää8a¼—׸±ž£=<èìèèh»w_©TÊåw›[ZêëîÔÕÉåälì? b�ÀŽ—ÐÖAÄ" �ˆE@‹€" D,ˆX$±H b�@Ä" �ˆE@‹€" D,ˆX$±Hø¿ÿÿÿ à@A}D)IEND®B`‚maturin-1.16.0/guide/src/assets/sponsors/quansightlabs.jpeg000066400000000000000000000106621527064705700240700ustar00rootroot00000000000000ÿØÿÛ„    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222ÿÀÈÈ"ÿÄ¢ }!1AQa"q2�‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùú w!1AQaq"2�B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?÷j(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (®3↧q¦ø9ÖÙÚ9.çKbëÕU²Oæ�]89ÉEuWv'Ô>$x_Nºki56D8"6�/â?*ÜÒ5Í7^´ûV™yÌ@áŠðTúy�|ëiE ÓðÞ¸|1âk]@¼„Åsc;ÔŽ¸îA滥ƒ‹�¹{�µpNæ¹ô=Äо&=@úõ4Èþ-xffÛÛ�ºámÉ?ι>­WùYÅfwTWÿ G@ÿž—þ?áhèóÃRÿÀCGÕêÿ+ 3µ¢¸¯øZ:üðÔ¿ðÑÿ G@ÿž—þ>¯WùXY�­ÅÂÑÐ?熥ÿ€†‘¾)øy³Å¨ªŽ¤Ú�W«ü¬,ÎÚ¡ºº·²¶{‹©ã‚i$`ª>¤×Ÿ|5/ú±|ÿîÛýkÍþ%xÈx›P··²iÓO�7yr©BÒä‘ôÀ�­kKRså’²‹g±ÙøßÃ:…ص¶Ömšf8U$®ãè ·ëä:ú'á~±s¬x.&»v’[iZßÌc’ÀFð­qx%F<ÑzQ±ÙÑEç�QEQEQEQE‹â¿ÇâoÜi¬þ\�‡ŠL}ǃôíô&¶¨§8µ$Ηš½¦Nm¯4kÓ 8&DpÊì¼à�Dëëz½³ZÅo“mo'ÎF70ì¡ç?¯¬Ñ]sÆJQ²V:'Š©8ò°®â„4VÞ-°�`¿²¸O5£ó£c‚­Ž½zúf»úã>*)o‡º�;Z"~žbÖ8wûØ®îÆ s³Š)�ºÉn„eÜbœÌK1’OjÄBÑ\Ì¿ü' ßÙŸ[·ó3Œ¨f_ûè ¿­tPO Ì <¤±8ÜŽŒXz‚:ÕJ޲V Wã�úω¼?áfvK;Çy!séÁüqé]åpšÇÏñ‹Ãм”³™˜À«€:פ›ìŸä4v¶¶–ö6ÉmkpBƒ jÀWñ+ÀW$1jz^Ó yo¾jd‘‚xÈÉë×>Õè”TR«*sçŽà��›,¾øªöì[ÿeK8i'!Q}óßðÍ{ß…ü?†t }2ó `´’cÜòOùìlQ[WÅβ³ØnM…Q\¤…Q@Q@Q@Q@Q@Q@TÕ4ë}_K¹Ón#1¶:Œ÷ã­[¢šm; <÷OÖµßÛ®•­iš•œeµý„~ad®x q×óêrüWã8üGog¢ÙÛjVQÝÎáî!ò·Æ%Ï~+Õ«žÿ„“HE0‚ò ö³ÂH:gØô?ýjÛÚFM»ZO¯gÞùÅÇek °¶ŽÞ%‡òÂŒ~UWþ#‹ÁºÍþ–ö÷·:|¨·Cm˜abHaŒð Hmü[ }žO É-ÀàIéå7¾Ià{ë¼á‹�n¯õ)R]Rôƒ/—÷"Q÷Q~�Ïøf¼¬» ˆÃÎr¯³[^÷w߯ßò2§E»”Ÿâí“�øUŸ èˆÕn¼K¯”­ÒyIoÊÛE�vûžù&ºê+ÔuRMAZæ· (¢±QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW'sâkíS]¸Ñ|7%¯—×1Bºå›¯p8®‡U¹{=öê1—†ÞIê‘ü«ŽøG§‚þÓ�Ó\ÜÉ$Žy$çŸÃõ­éÅ(:�¦ƒ[\ѽ“ź%³^ùöZÌ�ÒÛ­¹‚]£®Â�>ÄVÎ…®Xø‹J‹QÓä- äà Œ:©�iW˜x&9ì¼_âíNœAÊ%„²oXÛ'·ˆ…8¥R ½ ÏO¢¹_ë:—‰<"º…ÔÑ%Ô®ê­_*p8Ï=?ZƒÂÞ!Õuo ë7w"o,î'†dØ€Ž2z“PéI_Ë@±ØÑ\F¯uâ¯øqõ«�RÎy-Õ^{?²íB ª¸9ÈÏ_Ò¥ñoˆõ#ÃÖšö�$M­m¥‹%•ùá³ÁéMQm¤š×@±ÙQ\»ªxÃúq×®çÓe´‰×íDADf òÈNXò;Zž%ñ–3h¶¶×PY®§#y:îX”.G,H›w§Úà È‚HŒ�6 ûÍü9ì?ZÖî±âíé7ÖR˜%k…’2ü¨ ìçŽT‘œõêP´�šµíè �½Ì7p‰­äFI—¡Á þ Ö7‰|S…­EÝí…ì¶¹ f€F@'  ¸=½1X áÖLJ4Éf¼´m0ÂÛ!XH”rq–Î9íIñwþDIëâ?çJ4¢«ªoU{µ±ÙXÝ=í¢Nö“ÚïÏ·v=~V#õ«5¿ü{EþàþU‘« nãWµµÓ.b´µ1<“Îðy‡ €ª¼�““×Ò±K™Ûa‰LL!dY1ò—÷Šç¼1â Ý_RÖ¬¯`‚7Ó§†„œ>sÏ=: ‡HÖu(|auáÍNxnÊÚ‹¸.c‹Ë%wm*Ë’3ŸJç4õË�x¶ &âÚÒ?¶†–æh̬S zä“[Æ—»%+l�þc±é´W¥x«R¶›]Òõ¸¡—QÒ­Íʽ¸*·mÈ8=AøûS,¯|G¬xeu�3\±žåáó~ȶ  lgËÎíÀŽœ÷¨t$·Ó ÅÔ$¢’0HêÄC%�&‰â‘C#©V¸=kÏ|!7ü ú…߆5y6ÒLfÓ®ä8ITõ]Ý =IöÏ¢Ö&·§ßë1½Š}’ 2>yg„NÌÙCò�©ÏÓ½kJJÎÙ�ÖüO¥èv q5ÌrHF!‚6 $ÍÙTNMaü<ðýö›m«êÊSSÕ%ódŒõ�rHÐä“ùzVzxCUðz‹ïǧêL™/ ö‰ÄwÙ"ãŸcúô­¿øûG×3¯ýŸ¨!Û%¥ÙØÀûŒÿ?jÙÆÔÚ¥ª{¿øÓCŸðˆt¯øe´�Zñ-/ìç‘$·�ä–ÈÚ:¶sÚ©ø_YŸMð7Šf²Qý§ üó-´ƒ÷ˆÁ¸§^9ü�wº–­¤YÏm>£! omidcÐàzž€u­e�ß±ž¤ Rªµn;»Žç“øˆè—¾šê]r}[S–ÝdD{¢Û‚ÄB§j�Îr8ÇZ³ãNÆO…zLqÞ@î~ʬ€Ÿ•Fî=»×¦Eims¼QïûÛ ß_ZwÙàÿž1ÿß"…ˆI­6wþ´ œ‡Ä›˜'øm¨Ë ÑÉ‚-ŽŒoÞ§B:ô4ËýOÃWšf�¦ëfÒ]>öÛ1Ü<Ÿ"È�xÜ>éÃr:]Ÿ•@›hþqHÖð¼f6†6ŒõR ƒøVqª”R¶Í±\ó¿C…ãHtÝ Z{ýKy%¹�¦¥¦>é 8åd<¶qÉì1U4 OPÐ4è´�S”÷0e~Óg Ì“rNâÄŽNy­¯ è³G«jÚÅÖŸ‚ê!ŸÊÅB768ÜsÐt­êµ«š×õ#ðݳü;°+B Î}+ÀÇuðškH$YnV•h�å�%°ëÎEz"Å‚5õu¡"Ž<ìE\ú W;¬Ÿ6›»þæ+œ�íRÁü¤Ù-äkTd0yƒÌ1$mëÓš¥ñ~XÓÁ :‡{ˆö©<¶:àWv°Ä’4‹+·Þ` õ4¯I�è­Ž™¡UJ¯´·[…õ¹Ï/�¼1’;ë–?$c!e Ý=&¹dñ=Ƶ®XÛêZœºF•uh÷P¼n!3)¦CÓ ŽýEzGÙàÿž1ÿß"’[[yÐ$ÐE"/EtΈԄz_p\óM]ËâË •û4ºaA<“³‰¥Þ3‡bwœÄô#µ\ðž±§XøËÅÖ÷w°[É%àtód  Ààž¸¯A0ÄBƒax_”qô¦Kimp¡f·ŠE�üj�u$Ó[¤¾à¹ÀZ^ ¼]â?[Dn4Ë=<ÛÆë÷n áŸiîÒ3Ò³5» [éòx‡ÂšâiÚŽÝñÃi8ÄÍÙ ]rzcõêꊈ*�€À ØÚ$ÞrÚÀ²ÿ|F~t,E�ÿ«y…İyåÓ­¤ºM— 4¨?…È�X¢Šæb (¢€ Â×|¡x�„š•‚<À`L„£ãê:þ5»ETe(»ÅØ  Áº‡¥ÓlV9˜`Ìì]ñè éøVõQ)JNòw¢Š*@(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÙmaturin-1.16.0/guide/src/assets/sponsors/rerun.png000066400000000000000000000106121527064705700222100ustar00rootroot00000000000000‰PNG  IHDRÈÈ":9ÉQIDATxœìÝiPSWpŒ„„EQß*ˆVª(­Ö µq)V§j[G­—q«U+jÔI‘E(TD‰ 2L-Ul«´uß*ŠŽKcE-"J‰Š²È¾„@�w¦w†aXÎ=@NÖç÷QOνùs¹÷žsÏev€ ‚ˆ€`" X€ ‚ˆ€`" X€ ‚ˆ€`" X€ ‚ˆ€`" X€ ‚ˆ€`" X€ ‚ˆ€`" X€ ‚ˆ€`" X€ ‚ˆ€`" X€ ‚ˆ€`" X€ ‚ˆ€`" X€ ‚ˆ€`" X]õÉ'ŸÌŸ?ßнfÄÍÍíܹs�ÿINN~ï½÷ Ý#`âìííÅb±Z­nlF£ÑÈd2GGGC÷˜ &“¹zõê‚‚‚Ævy{{[YYº§ÖÝÐ0%<O&“yxx ›1™pæ ð8;;9r¤½£TÓŸÂèèè^½zº³À°ÙìÀÀ@¥R‰NUrròˆ# ÝY`",X P(БÊÎÎ†Û ×È‘#¯\¹‚ŽTUU•¿¿?›Í¦­ÆårÝÜÜôÒq`¬¿ÿþ{�Fƒˆ”V«=|ø°““m5ƒ±|ùòׯ_óù|½t++«M›6•”” TwîÜáñx8=<=tèPœ‚sæÌyúôi›EÚ •Z±XlggG`�~5�S£#õøñãÙ³gã>|ø… ¥Á¢¬Y³çï,0RÍÏ©ÛSZZ*X,m5‡ýû÷·�îD°(‰„ÌF’ZŸS·V__ß·o_ÚjL&síÚµoÞ¼AGªCÁJHH ³éúf)ƒÐ,K :88 šÝ¸qcË–-iii´§L™"•JÇŽ«Ón“‚8§nòòåËÅ‹ãTsqqùõ×_qŽR–|Ä2ó Ô9õ™3g—u555aaaîîîÇŽCW³±±Ù±cGffæ’%KÍþüóÏÌÌÌ.ôº¥ñãÇ�9R‡AçažS;vlàÀ�8½¼¼^¼x�®–••5wîÜnݺ]½zU‡G¬U«Vi4š˜˜˜Þ½{ëb߀NÁ<§þçŸ<==q Ž5ªuPZ¨¬¬ôóóëÑ£õ�‹úßââb>ŸÓS `Ê”)÷îÝC‡ °°pýúõ8ó<ûôé[__�¨¦Õjúõë×üƒ„‚EÉÈȘ>}z×öÀ†sN]WW'•J{öìI[­{÷î›7o.--E”Ëå'Nlýq¢ÁjllLOOïì~Òs¸Ý`ccãëëëççÇårÍ.]º$pN«?þøc‰D‚~œ+??ûö퉉‰����êµ™3ù`yyy‰ÅâAƒ!Ú<{öÌ××÷Ô©S´Õ\]]÷íÛ‡žªV«%Ixx¸R©ìT—-‚ kÔ¨QQQQÓ¦MC´©ªªÚµk×þýûëêêÐÕlmm…B¡µµ5¢ÙÉ“'·mÛ¦P(:ÛkKa’ÁêÓ§OXXØ×_�¸>jhhHLLô÷÷ÏÏÏGWc0+V¬Ø½{7zvÔ£G�|||.]ºDÛ=ww÷·ß~›¶0"]<§nmâĉr¹]­´´tóæÍÝ»ÓÿöìÙS*•ÖÕÕµ.bi'ï¦dæÌ™èäåå­\¹s’gBBí€tlllŸ>}h«1™Loo¢öJA°Œ‘««ë‰'Бª­­�ˆˆ°µµ¥­Ö£G??¿ÊÊJtÁ«W¯Ž5 §{žžžiiièj,ãbkkQ[[‹þÚNž<ùÎ;ïàœ;wnVVºÚ‹/¼¼¼pª 80)) ] ‚etx<^^^ú {ôèÑÌ™3qª¹»»_¼x]M©TÛØØÐVãp8¡¡¡*• 'U,£¾*7nâJ­¬¬ìÛo¿¥†\ÐuzöìºaÃôŒÐcÇŽ‰D¢W¯^ÑvlñâÅ‘‘‘˜£×–ɨƒÕ­V\\\ŒnÉd2×­[÷Ýwß¡g„Þ¿ëÖ­7oÞ¤ýÑ£G�ŽŽŽž2e ¢�R©¬­­Å9å7c¦7ëÚµkãÆ�Û¸q#mª<==ïÝ»‡HUaaáºuëÆ�O›ª¾}ûÆÇÇß½{‘ª†††Ÿ~úiذa›bÎLìˆ%—Ë?úè#Úf‹Å‹-B´©««‹‰‰ ­¨¨@Wc±X|>?88=z-—ËÁ�;wh»g L,XjµÝ€Ãá|óÍ7"‘ˆÃá š]¼xQ(þûï¿´?qÖ¬Y‰ÄÝÝÑ&777 ¤›3±`¡-Z´(22= �••åããsöìYÚjC† ‘H$sæÌA´Q«Õûö틈ˆ€éÌ$X£G�–ÉdS§NE´©¨¨§†\ÐÕìííAÓŒÐ6�8qÂ×פÛdÁòðð¸}û6z@úСCèRL&sÕªU»víj1#´…G� ‚Ë—/w¡×f΂Åår©’Ëå[¶l¹{÷.m�'•JÇ��hSVVràÀÚ›gÎôn7àËÍÍ]±bÅäÉ“iSåì윘˜ø×_!R¥Õj8àææ ©¢eG¬Ö´Zíž={víÚU]]�nÉf³}||üýýÑ£×ׯ_ß²e˃tÝS³ežÁR©T���´Í>ÿüó½{÷ººº"ÚäääˆD¢¤¤$�vÐü™g°h�1"**jÆŒˆ6555‘ÿQ©Tzìš™°¸`9::†††z{{£g„þöÛo¾¾¾999zìšY± `1Œ 6„……¡Tðà�@ ¸víš»f†,(X\.7&&Ñ ¸¸8$$$..®¡¡A�ý2O,„úúú¸¸¸ààಲ2C÷ÅL@°º]¹rE(>|øÐÐ1+–¬µk×55�*ÚÌ «óX,–P(|úôéºuë� Ý¿êÔ©G�Õoï þvΣ÷……… 8Á ‚Õa8�Þã¯8b® X€ùèý… |||pVÁY1ÕDA°°0 êÑ{ôZðYYYB¡ðܹs´‡*‘H>ûì3�vÓˆXz°Ð«Qx<^TTÔ„ m¨G¢¢¢4 ºš½½}PPÐÖ­[ч=SgéW…)))ˆ·Õ;99>|øæÍ›ˆT544üøã�Ç‹ÅèT1™ÌÕ«W?yòD$™wªŒŸÏo±ZðÕ«W[7óôôlѬ²²²u3[[Ûö–4~üøñ¬Y³š7f³ÙþþþUUUèµ�oݺåáá�³-<ïÎ�;èjÅÅÅ_|ñEëÏšâªÉFMoÁ¢œ>}šzuôüùó³³³Ñ�_¿~½lÙ2œ­ VAWÓh4ÑÑÑŽŽŽmV€`阞ƒE½Þ‚ö­*•jçÎ�èw#RØlv@@€R©D¼|ù2ú]â¦,K?yoÁÚÚzìØ±ˆÇ�÷õõ}þü9m© ˆÅbôŠ# …B$?~¼S�5j,\>)))´-GŽ)‘HÐ+ŽTWWGDDìÛ·¯¶¶]�Ãáà, :@ÿ ÛTRR²iÓ&œwÇ;::FGGk4tÁÄÄDgggœ=°lÙ²W¯^µ®`ü -ývÃÂ… iB,ËÎν:�••ÕÆ�Ÿ>}Êçó-SSS'Mš´bÅŠÜÜ\ôõðð¸uëÖ‘#G @· ƒôpÄrss£Î‡ ú0“��=oÞ¼6û9}úôôôtôÇóóóW¯^ÍdÒÿ&¿õÖ[¬¯¯GT3þ#–QÓ[°¨Óö   Ú—&''7»ýàÁƒÿýwôGÔjudd¤½½=íö²X¬mÛ¶•——£ Þ¸qc̘1]Ûµ–MŸÁ¢8;;9rýÚU�F#“É\\\vîÜIûZ¹³gÏR÷Æh}úé§Ožþ©gϞ͟?_» ÐY¼xq‹ï�ôX!ú•ÏÍ�;öúõëèjåååAAA)))èf•••þþþÖÖÖºØgÏĉÿþûo½‹:ØüüóÏ8ƒÄ céÒ¥9998eÛûY‡rrrÒÑÞA=!“——§ÏÙ J¥rÇŽ8G‡ZSSÓÑTݾ}ûƒ>ÐÑN�egg·{÷î .´þ/rÓf E›“Ð[4hPRRfÙ¼¼¼U«VáœÏ=qpphý�] Vll,íÀsJJÊûï¿�Ó½iÓ¦¥¥¥ÑK(BªL@o�:99:tˆvà966ýv'Š••Õúõ닊ŠÐÙJMM�g*i¯^½¤R)z*)þU0 ] é0Œ•+WRW èùìMÞ}÷Ýäädtµªªª   ¸×`Œú÷ïíÚµ®«©ÙîÝ»i¯òNœ81xð`œîÍ›7�ö)E…B±`Áí ; cÑ¢E/_¾ìz°(C† 9uê: 555ááá8+ÆX[[oß¾�ö*áÊ•+è �aØØØ„„„¨T*]Ín˜9sæãÇ�ÑixõêÕòåËq®ò0¯bbbp®€¾¹¸¸üðíÿ½sÓfºwï¾uëÖÒÒRt¼är9æ"-ÆÚT\\Œy• ¯Í`mÛ¶ çûëÝ»w\\íU^BBB¿~ýh«5K@HOOŸ>}ºŽ¶ÓÞ�÷{÷î}øá‡8F�Ýâ*¡µŠŠ ‘H„s•G�%Ð^%?~ó*zHçèÑ£...8u¼¼¼^¼x�NÓ'OЋ”6Á¼Jعs§¯+iÚ¸\n-RYYÙöíÛq6l6;$$¤¼¼]ðÔ©SC† ÁéÛ¬Y³222ÐÕ²³³½¼¼t±'0Y0WÁD@°,@ ÁD@°,@ ÁD@°,@ ÁD@°,@ ÁD@°,@ ÁD@°,@ ÁD@°,@ ÁD@°,@ ÁD@°,@ ÁD@°,@ ÁD@°,@ ÁD@°,@ ÁD@°,@Äÿÿÿ…þßï¬'GIEND®B`‚maturin-1.16.0/guide/src/assets/sponsors/sentry.png000066400000000000000000000533121527064705700224050ustar00rootroot00000000000000‰PNG  IHDRÈÈ":9ÉV‘IDATxœ¼½|^Çu'zæ Ø V€½wŠU,’¨jITYqw,·8±Ç/ëd_ö½”Ýß:åíîK²^¿µ“g?o²‰½.²ì•Õ%[•”D±ˆU$Ø{HI$Îûá»÷Μ6¬�xl÷»÷ÎÌ9gÎüÏ™3åV?ºî�sP¦på]'ï‡?�f'o¦^ Ï0¯I—Ðs‘AÈpœL§²sŒ_Å”%Húç¬8ÿÔ¸ïYwâ¾SÔHúË×0ÿëtÞ 7C2eá./@3å,d :•Ý”¡ÊÞCžË  ²HäQÝ’ôcþ"ˆ¤Z¥‡Mµ`ι•=/UÖä4�.¿DÅVt™TDÿÒ.dðÙé ^²IiÏÿ¬´4°J ¯ *²Â0rÂd‹Ð¿²¢žNi’SÊÑ¥89 ­pÀDM ¨üÊ *P¶:+‹l(²Ó:×eeÈÀjq¾”šáÙÉK@ÌßQ¯¡–2UÑæ¤—Ñ´¡¤T‘üƒfëR6+¤DäW¼N_²E?{yY1Ë^VŒBç˜"HÍ!åj,�D„—¤Vd’³M5¨zË.t™WÁïsTáœÿÍ`É™}žè›Óº€´8Œ”,$ŽºìP3jÝuqÝÒÚº‰„UÇ BP�åìÞÕóÓUêr"jý6aOÇK°”‘¤Œð€Â×1x@ÚQÒá,()¦©qƒ‚…|Ñx“Z4];2"¢R` n҅‡ÂJ™a‰°Vârå¶©’/Zô3ÌPô#SIòȱbÐwI ¼5/¹–äÚˆ¥Š@ô­ˆtxTc±Æ@Æ¥C¿EŠ,Š!VÕ' Ϭ¶©Ü¤½F(¢ÈÅš_÷¸²(‹öf¼ø¿h,V‘áîô]·œ„=¥¨FÓJbn•žõt ù¢Ây�Ý™eîo¡ÒaU*ÍáÊÕN ^É.TQú|¦A‰¦XWâv²Gp‹öZiE"õÓÎsî¥r�lªñ�Öèq‰™ÓèF‹à¨¯×Bn‹LàDK·ŠrT˜�T‘A<)ȱîP6–ÓcáoY:-5&@¹sàœòÀ ˆ%¯²nÚ%•)S R—*ÜÐMÆï� ö)D€†YsœXê·S�:›<ܵ~h†ª§Ó¾…\V }1™DD\B·òå9”EF=^£“J�ƒ›jC¬0-*!“–’±+ú€ñÈêŽVw�éV%9PŠ«º3J,`cjaAÁ:Fy7±Í*J69˜túÔöj A1¤r‹¡Z‘2rí¨TÑRP3ØTÃhé�8Á­ej,ÇtÏIAQô’8À0Q5š¸%{­ÎyÕ@�’?ߥf”έRYò’5ìfUràŒÌåéâ��ãž¡!X�q7‰…¿L™ÈÊlÝò×NQvgGE¡à×£¡ËJlàQ¸åÿ¡ƒ \éS`´)W:ÿez•ŸULPÂwœC"Ó‹�¡¦ºG²;Y RµÙÑ@¼nâVYfVPä@Cx_ÞWñ¨TÞ2»Vn£ñ ÃÑ¢p"VçµTi†�oÙ"—¶ÒˆË;S·”p«ä"À) @¢ÙD3Ø$€9v’%ÄtKhˆ$À�S–¯‘f�¼å’ÉL—ÁÅú¢­ß(åDð©ÌT²©ßŒy¹ÂFA²àÎÀC¥[ùkNvª˜2*IÆÄL\YK5KÇ‚>r<„‘Ð-›eÅä%ƒV…Ðè£_ùÏLÕj(#rèr䊀¨ÉÍ[Ÿ; i�4c\Aø¦È§ÇE05˰*5‹(ÇHOv\f½¢ì°>Ȧ£]cøÞK˜TA˜Š(€G*‡dÅ'–Å[“ÔcÜ�ÌvËñ¼�›y{óÞ±l§òÈB}žd&(Ê0•<¢ AÙÈg�C{öbA–AÅ£ä ²«Ðl‡Ø\%ùQΣGCÊ�‹ž£­L U5Ã&Æ(#ˆ¢m" JûW2YV¨VY0Æ ÓñD¢tƒ¬0ð Fk�@¦ó°*SLúšXA'[|ºú`Yù:¡Ï6Óù <<»ÐŒ ®RyÃ8[`�€? LÙB(ˆ*phF̨*GXQk�'ru§òÙÌXLø˜#!ˆèÆWî”0ö\#Jå4 ÿWÍë ¡\cv’LA3yÅY&)è·‚šR2Ê>éì&p2¬¡�guÈP»+ƒj•³„íbý õ ;d!díŠ$§`”Œ‚&Ax·ø s`OdPš”0€gw»w–% e4òFƒ€˜QCAƒÔ扳ÖêòËÆ•Jmlùdéì’$ÖÄG²³Ê�Ð�Y9HGzĪ?sŸITh"3áÌY±¼Pl°Cð#"#PٹĥtúœÈ.›\s¨qòÍ€ì˜Yg¶Þ¡a-Ö0„$ÜÆßD²ü�ÜŒ1£oذ+'ÿ˜óŽZÐXô;çDX²|•�beÇM’зÊ2Ãk¹M4·Îæ³µ2veÀ�-‡|RÍ1:¤øÐf�oä ©8vœ� ÑFuK =@fÊaïV¦´”¬›÷e´Q‚L ( 4¢0–éø¤5ÓæäMÉ6³,tì©q"ß|¦è+½Q+R‡at®ˆ×‡–=*ù&]Â�8Ù¯ØFQ €Cd¥°’Qo‹„{‡©äRÓæì|ÔŒ° ™Ò�·5TºÑñ†™Ôý(‘:Ìø-_–\+©‹ÒÉÇî�ýŽÓ£8@aªÀª™hviR9�¦ãMú•#² D–hgÓô£!FmÑÊw{�AD[AU$.%dè¶q”;Z,’�Ð%©Ê'äÕ[ÊëÝå÷ .Â3ÒKŠ£"X*»Â­H?*uU¬¤(€G �¸Æ¬‚e @‹ýœo«KžRXD·lè%:F²“_Ž¿&êOß’ Fa�¯YBÙ3"JM¢‚ìÔ„±ed'–L¨7ã£ä³¼•˜lEJobæÑ\Zˆ¼ÿZ‹`êŒç÷õ>™˜‹lL¹DtK'ûžYB˜¬Œ¬a´¶ ï1Š[¡ÓÊbTXÈÄÔ˜X*u\ŒùQìT‰LTÓBTÓYUG6˜ÈÑ*ª·Hƒ U˜ÃLKª‚|F¦R8I} ®÷¸¼ß‚fé–@OÎP9�ìEŒ–c-N®µÕô�b™KÅeÀbk«²œ ‘gÿ±qyû­ê¤�ìÀ@$$U‡×RUµø!)Ù…³ÛŠÂ+wE‘t@‘½b¡+�ܸɣ筘1yVÃБƒ³,»Òzõô‘³ïn>xp×1ìF&7%‚¼¿9õC;ã.Ô jhwF%€>bCi(BE¥sƒBªŽ–jÍy&ô»H£Ð hH¸sºíK¢•Yl¡QœÆ¬ƒ9ÊrÚŽù“¦�¸ ¾iåsŒ›è)âŽÇóQâœf™ì´™<«á¿óà¤Y `¥Kç/ÿÏo¾°íÕݾÿzzG’ñRqgûV‚Ïž)?µÕ !:ë¾3ë[Ø×3ÀÝoûWT“X†`ä‰ìvÛ÷A)… 8 âeº%—²8ü¡ªÚåCí²×–GŒú™?úÀ”¹ ·ÔÚÜöùûŽé¶qZNA4ÅM”¯Ùb—B6[Fhgò„zóˆùR8R·œ&O¨/ïUÍ›´ °âÔñøÖ9ú}Ò-Å^ùe¿pN²ãåÓÎ>B)×DÍ2 6èwþü×c@%Rÿ�µóo�yp×±K.3R]Tc„n):{ï– SÀ”›ãV¯ %²Ç:FJpÅ1Fùµå¬÷SxwiÞçUó¼ bExÙr]#&^)/^D~x´, üСuC~ç/>Þ8ml’?– ø[_þȤÙDKvRsÕÖ0“±cÄ£Ø/½£å…q"†�ªÎŽ>ºîå Jš‘qb‘Ýù]:tp"ø¡“̦�Ç D;µÊz`øOÅXRë ÃÖsTc©¼œGÿõÃgŒ3«J¤�ƒ|öß~ˆ0Yð‹š;É¡hZ{Lʵ³O\n…àBSZ…H¼©T,°—3Q§˜¬�å[™ë(é&àÙ‚à¢Lé&˜J`IuE‚Ï5vBýœ¥ÓáçJCF ¾õþ[zkjÅ)¨n9“h H’!,àXêëotȪ5Cb‘™\„·<ò®ÔÄIZèiP.Ì?Š@½©"V8Åkq`…¢gû·�øV8±™gO@Uæ>óÇ„_ ýÚçÞ3rìpN7r �AR zé]1äò?ˆXv,}lÍnˆ”W¤6-‡¬‘(e™¶Ô4¨²D(T.ÃÒ¤9Í-%Zæ0˜,§òyòMäÇqPüå=šà+綇–7L!§O©¦¶æW?{oì)å=61`A/ŠCš%é~›‰1¾›ßõ‰E3ôžGú+€4áFX6ãÕjE /SÍ º@²¹ BÛD]8è�|„{¡4(™‚€ßÊt¢dƒs~Y7føC�Þ©Hc©íâ• §/¦ßY´fÎü[gržË \›¨cu´’©¸;j¬Kž#Ê*µ F�+ÌP؃ùoå“e ´É«ôþ„ ¨$©/ȱ±�:UÑqú-Î1ÌNÓ†Æ[Æ”‰Y UÙž?·?´|ÐÐ�±Œ°õ•Ýô±¿ù·ŸøÊëOmN¼÷|p�Q©–yìéH{q㽜G�¨S¾ •»�ËíËÈ»)ç:{ùŸÌqBƒâÆ[JýµáÝc^$£Ø� €�‰�Uá•ÔɇÔÍ+dès4ð êÆ »ë‘[¼¶_¾úݯ>yóÆMxüÿ}¾å\kâå)s',Y7_ô ‚Hlœ$Þ¥›È{±:ˆ@öþÉÎÀ»A}g»Q‘–¹3 jP¨ÆÅÄlkp!ÑÛ�„¥I³õÒ“é—¥$À \!›—-…õÙ?þPM¿³º<½øØÆ+—¯æy:®w>öõg/À‡¾¸~hÝ`E6z�û̈•‹^!Šèsºl ú:J¤ªDÓŠpàÔËnJñ¢¹¯P7™VD風n-6ˆuc¥—\†`>ˆ„ÐŒ¾•?-7‰•/¬¼gÑ”Ù�ÆÛeºx¾õ¥½I1gÇÆ½ûwIdé?°öW>uwä! þu»Ò¶S°gê\B±®Ó1R¼cúòZÖ !)Ù“î\Ãö*wÉ0wÉv*º‘;(¢‡Ò«¢åq�ÆîçÓùÚ@6>­Ü®ªªzä3÷¥«üîWŸììèbY¾÷Õ§®µ_Oä[yÏ¢ºÑìShJé²±‘Ù;%d�“Ÿ&1Š[ÒÎsRx­ 8­®Z¾VÓÚRFYižô^%ÞV.63ê—ÆTíÄ’® °nLºHl2I�²e�sœ* u!Üõ¾[‡�ñôÖ϶ïx³Ia'ž>zîÉøY"#8øàï>( ‡Ð-Õ0¼=#S¥ú áIJh©xŽáGD±_oËè�„\F™(žBˆÔ]Õ”Ô©1¯Ø`ÒD_t-·¹*.¼³Iæ‹ byì”*îЃ×ÿú:H¦ó0¶ðõ¤WžxûÚ•hÍ]>cÞÊ™:¼ÄÆÈ¤?I CB»²¿qjHüβdJôÈ#2ÂcCzùºg>Á�j*ƒÒŸºYW' Ïlç�«ˆõ ìAlä¡ãzYùB�ãà™‚n[tY3Ÿù?Þ?`PõrH?}ü�K.°¯|ÉîîîÿþW?Nd€�ýÁ¯:@5_ �5mZ¤‹µ­ñAcõ�;Y#ÍÒ[ÊA=jpЙ•-ö*pÕÌ/D€T×Ä¿s‰ ¬*z�ò¡Ø¸—#•Ó ÿúhË.%.)ÑC€¹ËfÌY2Í §Lm—ÚŸúÇ— b’òëÞÝýöþD!ƒ‡¼32,KôižÄ„‰H"äÂg�”¥±Fšhs'/Ù»T;#ª‰ö”Ž2ÚöО³Ð\U‚ZK@¾"ì©Y�>‚›K%1y9çîûàZ³ Ÿ¾ÿµ§¯^¹&̬V€ü×gÚÛ®&ÊYõž%CëGòhj�; Мec�&V‰ó1,#"€D~"˜ñno�– ×$”©6$ò¶Ô8Aºë!ú»pòÚèÊ{å]ÛØy (Yå]šÄÐÖ>¸tn®öl9ðöK;Y eüQ€Á¹SÍ/þ`c¢¨¡uƒù­û!�5@iól2)à<á&Iv�*ÎÓ+OlÒAZ¯‚¤�Ïn½Úv-QÚ’;æM[8Éô‚E�W]\Á¯aÈ_ss²°hÖœšêjC ÊÉ.oßøØ8U5µ®<ù¥ Z9S“ÜÊɳa0ìþ™ãçOþÁ#C†RÙCÚðÌ–w6¾+¨æ<³êÛ.µÿco^ü'þð`! ÈàÈ8¿—fÓ6‘^S•C#SU4&Ëtû–Ðî+H�AÕã¸þ¾Á$‚Æ€çC\²Ø˜äãIàdY¡êáõÖ¬�›(êZûõ}ë¥éŠCþhûƽi/~xýÐEkæPàÑ'Pâ{2 "�A>‘I/y d)A‘wøÈâ>¡Üø‹4„­9®DHïÆ F x WLÀ“`�Ƈ-�Á ŠúÐ9øè2ùðé‡ßxîòÅvZ)ˆ£‹À{Åc_&­ÿïûÍû# (œ°à õ¿È†i¦è >MÌ ez"8%ô9&å2 Ç- ŸîM­€AAv º•”‡'gÒGq†?Xää‚w‰î+f$§aùº…i¸ºÔÜöê“o{\lÝ­qÌ)œ=Ñüæ Û…×�þÞOßMú�¡†Ô?ÕW�4Ð1qÖ´hº"Òp|I“l5>°aWù}ï#«ëF ³äW¤Í¯ì|ã…w¨ *ç°À#¯� ²']n¹òí¿y"QE–e}êNF³Ž‰ƒ~@L�ä<ÚŸåOÑb‡WšèqN¬KóÙ¡vyäÝ¡zn¸> ýëÎßH 8tbÇ38>aì¨É7”’ò9®¼9xØÀ÷$#¢�]?ø»çôΔ\·€!¹odë«»›¶NT4géôÙKuMÏI3Þ£ÉÏùæL7)ÈŸÅl•eÑŒ|*X ž�ID [‘Ç, (÷z©»_iJ·e$>\à_`Þ“”—éÉô‘ß^?hHjåñ+?ÙÔ|îHÑå[gÉ´�” c�ƒî³ßy5Q¼ÿó÷÷T+[C~¦P&sƆv*¿Åç?Ò/ ˆ�oHªNå[Z}‰A–áÍ5@ô#{e4"bK¼ dKhÀØ‹:_å¾XcŽcEZtëìU÷Þ’xáÊå«O~ûeïp.x×p‰©îâ…w·ÚòÊ®Duc&Ô?øñuŸ°ÆedL&‡•r'ìðº+Pâño<ßq½3Qãí¿²¼_ÿF§7jÊ•¦zŒLâ¶x-cÓ»QsÔ›1J(þ S€´ÞEªfOX)šÇ•MHæ�ÍGOTqô6=QÉ™ù%%+<#¯#qÊ“¯± ,ô‰µ÷/½ýÁåJR’™™ &ß¾~Ù™cΞlî©:v>Šo€pŽã¯õ¤kW;Z›Û­ž«0˲ºÑÃÞÙ°WI>CÞw¡=œEÐãbÔ0ÒIÑ€8�È/kŽ�R Õg�8`©\f€ÚrèÿüÑ{Y Ñ)£÷‹D¬ºlV|ó…w®´¦V=,¿{áÔ¹‘µö¦Ç²°8ÇYëu ÆQX G!£ÖªP¨œpCĪfMXa*c¾¯�Â�ìä4 ?ÑC…Jzé�Od+€?\^UêïaªÒ QcêÇ4Œ?i´”p,9˜¿bæä™ãO>{ùR»™V(U’È˯,^-˜0cü¦wtßìæ$ˆ�}P–8ûJôUÀªSð†é†Qú@*ú&)¼—ó·ªæLX1:œuÌšºÅƒü™Ô˸AÅõ£äAÜã'ʼn¿ejkmßôòÎ};7L3¢~(ô-�i¬_rÛÜ£ûN^8s‘Vlt•ˆd󫓇ÏN™Ý8ºad¬¢¡uƒ;®wòCÛ”8h5‹÷â7Ñ}Lb¢„ä¹�•û¬ ¥·€=ˆÞF¥JTo+ L�u‚`> xOŸHÎŒ×k…ã¨*ú™‹¯>½¹µ¥mö¢)Õ5ÕЇÔ@íÊ»]»zýð»ÇÁ8ÛÍY„²³Ýræ�6�ZûಬJW¦Huc†oxzKww·qº_ä¼NJCâ\;ÑOU÷ЪÓN©[vk)Ъší ÔYq„ÁH/2d-Ïæc*dâ–î„!4*õ¤;ÍÓ‘¦“Ï|ïÕë×:ç.™f�+S–e VÌÕ0rצ¦îî0P¦¢pòxJÙ´í—{ܬY‹§Æj4dÀ !voÚ/8J ‡`s$l‹li 35)‹!8»FÃUk9iÈr¿c,ƒ ¥ ² ­sê=M½GLÚ·t4¡Kâ—”B)YD<°ûè®Mû§ÎnV—ÚõåÓ„©cg/žº}ã^ºµPø[ ÍØ�ó§ZÖ®_–@Ê 3Æíظ·íR;c‚1hô*Q[Lhd kt&ó|ayvÜ„QÐ[ªíßoå] ßzi‡Xc 0?E<ÿsâÐÙÛÖ/K”ß8}ÜÆg¶vsÞ2ê+„SŽ( p ÚÙ-í”fQŽÇÔk¤ +Še�¨GZ®ùФ¸z ^°Jð޷Ƨ‰±’(¸qÓÏvìßutÁò™µúÉ yªéW}ûƒK÷ï:Ö|ö¢ªº,æÿ´¶´M˜>vl\ƒ‡Ž\ݯjß¶C$«Ò­0vˆˆÙÄ€=œt±‰†n ä {-¿+PùQ –åÆ1a%t9;5‘S±'z½Óá*…=\:z„¦GÑìÆ…Ó-;75ݲf΀�©�ÑP]S½ìŽyûwm>wI¹›2ÇšNÝöP*ô0ifÖ—wµ·]‹5-·‚Zi8×.R†²hy±ïb6ÑB>V›ËMaã N�ƒ­ q(Íܤ²˜�2›ŒD5VÁžðkÕÝ‹g-œrþtKeç”[ �n»ÔþÖÏvŒm¬O€Jžªkªg/žº÷�Cå8NÖaáVÏ�ö¶k€8ë–hè!«ÊøÎkï–äEÈŽ.Ñ´4¦hÁ›lÄÞ¿¹"`Â*!clÊyáŠY�~ñWiÞá#‡®[¿búœ‰ûwio»žÐ-Å ìÙzàô±óËo_ “§ƒú/\9ëÍŸnÏÏ&5Èæò.râÐÙY‹§Œ“= »y³ûÀΣ ‘Q^\·L‹¦ét&"ö!<¦Ù$×A±ÂÅD�óHÉg”##[êÄÆT$îÛšÒ��¸`ÿûù©¡Ã û2¦±~ÝC+N>{æøy[@jÊ(¿òÈÙK-m WÎJOþ «2aÚØ·_Þ‰ˆ†ó@EJ?xfíƒK%OžÝðâ6`w7øÅlQpb8-·¤nAÂO Hë½á˜ÍÐ� ˜Å²z‰ÙÂökJÈ}eÕAÄ ˜èùµpå¬>p;DRuuÕª»�?òÔ±óWZÛ£õ‚DÙ£M'Ïžh^²vnZ·Æ4Ö×ô«Ù³å@ì㉺¦¶‹íýÖN›71As÷Íîý;Ž‚ÇkÞ£dÓZ12‚¬•Hé°")K ¨lB±‚îa�ùí˜nÙ1Ò 6Ìt±…¤zJ©­í÷oþïÏLžŸ§�[±nÁñƒ§Ï�j1j ̳Àö7÷Mš1~lc}¢Ø©s&œ9qáäá³`|¯:ðᱡùì¥Qãëú:´nȵk‡ö—Ú™X7irÑvÊ�§ïôfUãÙ飪¥)ô¯Ù¢ñ˜Õ§õ¼—q€ SjùS -²vªªÊþð?þƈ>¬x‰¥�ƒ¬¾÷––s—Žñô÷_mÚudéšyýjSŸõÊÓ¢•³ÏŸ¾èm¢âŠÝ9ªyÐàþÓæFÛû5iã Û:®v@0 Qʶé¾Ñ}ñüåeë$ 7¹˜@”1—vÔÝŽ’ ’1Ër9º\T½9ÖÅZ&±Ç™ºcʆÝó*®º3ï8¶ M°tBF “Æüöÿù‘ÄÞ„–ó­_ÿ‹ï"ÂùÓ-›^Þ1¦¡¾/ Dç-›~¤éä¹SÍÞä ˜§Ýú–Õs‹ž�[Ó¯fÜ„Qoýl;ÍîgÙ5wgŽŸ_qçBv�$Ou£‡_jn;¾ÿ4‘Ñ-AúZdi^ÐiQ·‰±'läóÅåŠ%áÇ«¤3Ñ1ݬgÆ›:ÉÉ)Ÿ7oçÜ—¾ü‰´¢|ã?ýàø¡3ùu{Ûõ7~ºmÔØºIÓÇ'²ä�¨•w.:°ûèùÓ-�N­@t\ïÜ»ýÐm,M˜ã1�õÛßÜÛÚÜFøWüIœ<|.z˜¹hòÏoë¸ÖÉKÁ4å¾°�ÊaÚ"Ëô%ں矪Å²â°æÒu3†¿Ué ü„¬�ÓZù›·Ü:ç}�Þ#y&éÝw~çëOŠ›[^ßÝÕucÞ’éPj�/¿vÞK?ÙÔÕÙd@É#ùÛ.µwvܘ¿|F¢À†)c^fKbe"mÊ–s—ÆO�8  º¦Ú�{wËAž�üC4Ä@kàÎ Ob'ÉnɶÌá­P,]¢×tʼn<ÝŰͪ2QªbKHÁ°‰UUÙïýûG‡×EC ×;¿ü¿ýíµö­ûM;�ØsìÖ»¥Ýùš~ÕËn›¿á…m]�7$µªÓØslź…‰#ãëFïèè:°ûÃxÓ¨\¾»åÀêû—Ôö�.½Ÿ8cüÖ×vç›` �›>¼ê¶á’�™ß7‹cŠ+Ô…–P9Ž»8þ͉³uÃÑOìH°Ža—T'ú±RÁ<9ÆßCý‰M¼sýŠÉÓ£Ãrxýù--ç/ù8Á¸}Ó¾¯üéï꺑(¡gÖXÿÛò¿á†�Ó‰þ8ÃâÆû«ÇM.|ZÿÑ;H�ÃPðÃvðꕎ翿!QZuMÕû?w?òãø¨˜ÄÉlæA[‘3Àå¡üò 5ÇÚÕ±×Báôô²ªé K©í±ìZ2¾Õ7ì±g¢Ø`5µnÔðõï?‘èÍW._ýú_~÷Šß‰ D¨øÈM»Ž®º{qU<Õã5ÔwßìÞ·ã0©éjì(ôT;}Þ¤XQ5ýjºov¿[Ù{Ã2kÿ²rÿ܉ Ëï\˜øØÝ膑gO\8uø,µÂ;@háVd{™0’µäÙÍ5ÍŽ�±³˜ ½cý]ô ‚]Ⱦq¡‚> 2#û,?�7œáT¹úä6—òùôƒÿöÜÙ“Íìl(âTܳõÀWÿÝ?Ýàk>uzøÑ»§Í�XJNqîüùÐ�}ã¹³'.$Šºcýò�ƒû[‡�qP­üik½úý¯=�¦íÃ_Xï2ùá¿ `˜³„ì?E€?ðŒ®Ý*�D]2ùÂ@ÕŒ†e"LeƒVøíì>ú� �*Îç»ø]Ö7z²ÕÕûü¿ù0ÄÓñÃgþî?|Ÿ#ìÐzúØù g/._;_;€>eY6wÉôWŸÙÜÕyÓ9Å)‘Dw7Þ躹xUô¬~ýûuuÞØW¥,¡@Ü?}ìÂŒ“êÇÕE ¬­i>ÛzâÐM>m¸˜¿ÅÌŠÁ`Ù&žŠ[ìÄåtûS“Õù¸Ìz Û-z ±ùêÃ$à‹GÓÙBzUù= üÝ?ù$Ó¡}Çóí¤ÒòŸÒ9 Õ¿öÜ–oýõÓeŽW÷{ö :[ƒæWžz» ®ÚiýGïÐËcâãÿ÷=–¦íÿ»¾ò%óÔéÃôp=²›#�³M“:E7b’\p@õñØ9bIì yÉ#â—}WÀœy”e¯“E–‡·rÝ¢‡?v·ÍX™&OoX´|æŽMûz†„ ˆEÓÞu¸éĸ £&L—(vÔ¸º�›÷7ŸouæÌ¯OˆÍçZWݳ8VNenwo9 i3q«ãZW:ô�ÏHn}uw¤-˜ÏCî›)"þ*u‘@C‹€ X¾<¡†$� ó -?È)·ÉùDª^C†üý/jpòˆö<Õ�¾x圃{�]¼pY1éx±wæhØÙÖû)â³\ælGx]Ͱé×dÉÅBµÄÓˆ¸G€§Os>Ša§×•:�Ý9hm¹²ñ§Û6¼¸u\cýØÆÞ§“�ƒ;XÞÙycßNùM6M_ª×ѧªkªf/Œ©F޾áù­Jx.œ¹˜ð´êF;°çØùr›�š�VV ±ùì¥[ãV¾Å?}ã³[;¯w%í¦BˆëÔ\uò°íÈ’«¦�_jo\V¦,m×ø‹|b)vÌš9)=F—ãÁ«Ïo9¦eñŠY}9†oÁ²™çN·=pÊ  �ðÕìÛydÙÚyÃFD±aÌø‘{ýzÀÈê68wò²Ûç'Žf¨­­yû•�€’͘8wªeæÂÉõcGÄ ¬éW=pèÀíoìuVö²p±ˆË <èŽ}šƒ¡[–A$o–‘÷¨~¸çŒj5zY»ÿmžiÊM6gÒ9¶ð+ëpdÿÉ7_Þ>rÔ°†>XÆùKgÜsììéf¡–ìîî>ºeí}K¥Mœ>þ•§7cå”ÛDß½ÖÞ±ìö¨aÝ0rÃs[ÍÙL�&þçѦ“«îYœð§Žyãùm×Ú;b%9Æ)å‰kµs†51•�pÓ£X‚1›g3☿î,GŒ–eizÒ^†8W¯¶Öö ?Ý–UesMK;õ55Õ+×-Ú¹yÿÅ ­F�ÜÙ:{²eLCýÄiÑèÃðº!Íç/i:‘öZN9»æ¾%±å Y–]»Ú±ï�ÃÀ:/ˆ7y~ Íœ%úKt>‹«_·ù¥�¢Ë-&ýÛYæŒþVÛØb6Ñ0ˆ2¦:ôä¨1‡*¦gÊ{Æ·šÈL‘H¢zŠ{!Ü ,|÷OÿÕëúµ£\’jû÷ûý?ÿdUuþyb‹Eö¹£ÊŸï|ýÉkWS¾÷cwš™pIœ°_{vK¢ª»†tЗÒ �m g6ë´hÕì¹Ë¦##G&;Õª´±c ÅL³ Ÿ†!/ˆ¥ÑX¹\´Ù.‚6ˆ¬+ÄÆ˜þpsl\:ct&øÄѳo¿¶sÕ�·ôOñ8``ÿi³'nxq«áëÉׯu´œo]~{t‰ð Áöî8|áôEqßË%‡îŽk�wþÊÊX!cG¾öì–ÂrQ+À"NeÑ®ÇRã•Ö«éÐÃÜeÓ6<³¥«“ÄÛò+ùµ‡ X~Ú3?Ô„ø!’Y¥&ÒK*q·jzÃúÀ–¢…jÛEõC9W}:‹�ixÅêåKí[6ìZ¾vþÀÁÑ�ùJ˜Žë]ûvV�AÊèøá3÷ÿÚm‰eòC‡ Úðâ6!OlÖ³µ¹mémóbaç\ËÙKß=Òw² ËÇœ^´zN"ôPÛ¿ß�7›ÔŒdteŸÿ£ ;s�–áKè½9o14¦M�¥Y,ð8~àôª{'vž�_·é¥=î�{¼ +Ž‘•\,Ü(é/R¦­*bØG­fŽËoÒëyT:‘©¾WÉÖ÷™_é-¡d2¾qO³Ÿ9yáϾô·i÷¨¦¦ú£Ÿ{íoL2âŸyì5\Õiý‡ï@î‹¢œ¯w_x'±¢pÚ܉£ÆÕ2Öt¨)ÿüïá½'^þɦaÃ뇾ÿ7ßSšVŽZ’„´l*rg�aº]¥“êÌ»P‰cI˱ÿP,]wòüVË®Åæ|FÑŒUUÙ¿þóÏ Ôÿøá3Ý7»AÙoÖí8൶´ÙrÍ=KÛýêÇŒh9wéðþÆà•tAìÆ›7»o¹5º fì„úŸþÏ7;;ºäo2¦ëêìš6gbbÓǹS-•�ŒÁ�^YÉ𥠗ohy‚dž©c÷l9��Yæ³§nT#ŠUz\8N6�ÙðØÿS5müRÛ®©S†ŠXºåL¢ÂCtÒ0öü~ô·ß{ï{W/_»à×½wò´ñ»¶îïd_¿U»i¹¡>}âBkKÛÒ5©#�.Ÿµá…­ím×bÂäׇ÷�¸í¾¥±�“WUU]¿Ö±W{3y •œuutÝz×¢%Ö¾úì_©²ÐµRüå‹WnÞèN„ò¯ä¿øøFÚ"T5�b-7Äö·T ‚j�Žíeùž4ûœ´Zïé¸u£#göòK1ôuàúÕÖ<ôÁâûÛY–­ºsñ×¾ÿ§ïýÈ]Ä¥@ òFÁ/þä�][÷C<õ«­ùèç*X²¿¡ •x)¾ôTÊèÐÍdä{÷LF»ÞNQ2uîZ)–œ·ð¿ØÓ“^xlCeóc4Õ�¶˜2˜š½Øg¤˜ ¥-ˆæb«òºüþ®ñ!ô̪Y¡N=€rM=™ªg_®3*BÚµÒÈýìú\8¨ÿ'¿ðð¿ûÊïLžÞ â.@{…øê—¿�ö�Vݵ¸ø"¦cq7¡ú;77% Y¸b– �"ÿ:::õXÁ§ªªªú±#¨oƒd½²õsŒ¶®®ßþÊO´Àû?wn%w¨œâ *8 ZQh©L"¾U5mü0gƒK«ÜŒ‚auÃ=kY…£¯MŸ3ñ‹ôqÓs=näÝÝz©ùòÁ¦rÔ®!®kW¯i:qçƒÑ0ôX»uÞ’!Ë耻xáò‚e3êÇØ“tÕÕUçNµi:©ò2Ï`LCýÔÙÑã»N=—— ½4gG|þTËâÕs†�Œ† 0`P펷šbîštX!v¾LÄz:+ŠáD air©¦<€®Ç+†5r´ƒñG~ŒYÞAQŽƒßüÒ“3Õ5Õ£Æêµxbä„®¼¹û�ƒ‡›ND‹X÷Àòáy«8(÷DhòðµçSt}>e@«ÒKKFEš9’â1‡r) nŽü�¯=•(Ö>¸¬qÚXÛo(Úõm`LsCÈô±×3N½–Â6kÞ®1ÀU¯Úq¸÷½«gÍŸ’ þàÞãÿã›OY6•TÊ6äÀ_ÿéß߈�ö«kª?ôP‚éŸ^}fóµ«×c…,\1sð°�~¯#¨,vÇÛûÛ�æ-›an &ºdþßþGžýÞ«±’s?õ}Ÿ¾�fÁ+Ù„Ú­Òöt±¼ö·<¹ª˜{ó›¹WÓD´”é;Š9¥r#Cx„ÿæVUg¿úỢâ©ÔöÍ¿y,_S`1ÁÚ§Ó'.¼ðÄÆD±kîY2xè@Z‹Ú« ]�]ÛÞx7VB–eó—L×üß°óz—0—4 «2²\cÀ„¿EÎw¢/=õíWÂÁVš¿bÆìÅSÑ{×"q·˜è×o¥“Òläof\%Cð3xü¦…c—(|ÃBôÆNد}üÞ “S{n|iÛÞ�å—Ö*á4ĉ¶ûýý m­òC7>ÕöïwÇärç}y–ÞzyG‚¶…+gó®O©ð•švÈņ4M%¨’’îûs­ýú“ß~9Q8|è ëýÞW$pƒ\•Ì$:ÛÐCo«<È)‚ÒÎ ÿQx!Qj�v9§…)ŒÆIc?üéã…Á�7¿ó�§�æ5@±T%Þ½.µ\~îÇ©íêsMEIœäeÛ›QĪDÅfR"¬-S¸oç‘D Sg7bt�i8'ÍAþÚkO¿�Þ+;~Òè>v‡õ„Õ£ì1zÈΦ.4ne6Ct�¼±ì¹'d %ÛA¬¦±«ð#j´‹ëÏüÞ#Õɵ ?ùÞK'ŽžáÅ#fH��Kçz\œDá‹VÌî? õˆõp¼³£ëò¥+±†�š0ýùÿÓÈÆ)c-`l8¯^À+yºÑuó{ûL¢|¸û}«üœ:±‰Î:sù‰¥Á"ÛÒ�£=J^5 è –Ü Ý*_ÔâõS2Áí§ÛDÄYó&/½5%?rðÔ?þíNuS ´Ó©>èv¿s`Ï;cå÷«­Y{ïÒÀ;2N}m[7îI9yF ÆIr•SàѬÉ3(Å”9Û©Ö�°ã�½¯<™ŠåV×T}äwâ$*¿)/ŒœÀ&¼%:ù¢ÚšÅïg¶^YŒ9AŒ’ˆyM$ý­ßÿ ªŽ¥oþçÇnÞì MçAHò¯&½üLJèKVÏ ¥Q҉߻ãP¢„)3…Æëf;ß$=dØ Š_,’L­X.æ�¾õbÊ;X}ß’É=6·°ªbñwÔÖÖÛ˜`'4Ž” (hËJÀ…^LŒ‚)Í*­ÒI° õ]¹ruóë»cõPKw}¡¿§Ž�OŒ.'ϰO ¤ô�ÏBiLc½@ã‘p¸k)ôﱿ{¶ü‚�¦Î�0kÑdeƒøôdÀ%!´&� =Æ”736“x ÙtÌAϲå�$Ά”ª�€§Œkœ” 1<óøëGžâ]„A´G"ôNywË)'i–úLc»ÒÂt™H~a ’:ƒõÈ%y³;A@½ú"&’ ëÁ›$<ïèèúþßõâÅ/X9K£2¹¦I*�A;ÊpCpd€bi.£’d�_Ò!œµ g?yìì·¾úC†Ò ¾Å0NtC[6îJT7wñt>ª‘]05²8x@Ýèá`¶P¹JöRK*Œ™¯6N¬d´cLízþn~e׆çRsP•ÝŽN[ å¿&6TÃæü¥ ³3‘�”nœß¶ö jL£uû¼Y–X?{ú­]7�‚ÔªýŽÎW¯\OÌ«Lš6ì1¦bÙd¬hTØMªP½ÒˆÍçSFÊOæ�#2ƒF¹E³i?ýQÊÓ1j(w&I­[±’4I2åÝíÌÇ6€sd¬‡QùjÎö¬tôÐieLßö…³žïN“ŠÕ/ò+ hÏœL)Vý˜©‰ N¿©º¦ŠfL¨3V¯?ºÿ䥸$O¿Úâ®["V‘ñ»Vó‰ ÞÌ4Ó v5ÀÀÂᢵ7Öêñ´ö®[ŒÆ*j±AŸ ¾ÏÑD�CG ò~€ô;w:å}×Õ³ VyÝÖÚÞÝu³„j‚Žü@Ñ© ÷£ô&Íl_K“ï p¬p€HW·š8À{h°œ§jš+l>)P̳áØô Š£Iôèó“强ôùŸëî_1yFC¢-ã -£v|òƒ£ÆÔ•.Ô©§ª‹Í)ȹíþ¥ù× 4ÝÝ;<‡L¹;ƒEpõ}K[´ó*kjj–®�›x%?-9…d»=mT2õ]àF˜‰#ŠäÈ'¢H†P%˧�©|¶ÚA˜ÉBÿ"Êž�Ä“À[S3-=cøi “§¥ŽÝþçMõcGØ{LLÇ‘3i ³£³ýʵA‘­‹�“Ç6&çÑÓÉïˆ$“¨!"”ߘ·dúš÷,ù¹«È] Q6Z¹ÿ,ܺŶæ¡Ä¹zØ�Ì%&¡5ž#µ $QÀ­^Ðw6|={ª¹)i›~É)?Œ™ŒÂ�wµíÚ¿Píµds,w9�½�Mß—´ÕÇó¸‹.@ exvdý–rï3Š×*$=+ž8ÖI7P Hà{ßˉӿÌ4¸\½tK ›®õvHÄÏ�jz‹´*oˆ\¨‰E‹}L{¶8ÒtJDÈ—±ÕW!95Ù…ºdBsì—P3B jÃ˨¡+¥ŠôÆ+Ûßz=µÔé—™jô³¤Ãš¹üºÎ?ªªÊB« hÞJÝÉk¯©«³ë;ÿÏ“:î-FŽFàÉs¦zñ0؃°æ]ÏÊÈ,"˞ȣ¼Q÷µ¯ú¿üÅ·{ýúÈ/'UUWY}‰Ýëõƒ¿HíD‘uݘßõ‹TñØ7ž;}¬rœ¤ïáf#ò9rO¼HNjw”Ba!@ZÔFÔË)ùªžíksªË3� =£äêbsë—>ý.·FW;ýòÊ_tŒ–ÿLu‘DÑ Õó£º:zêZ¯é埼õâãofLjìˈ]A$þDÖ'–*TQê¼£5Q…´Z$�ˆºdä·8�”“E›ŽÿÁgÿÓÑCÑ™¸_Nêñ`z 4ÿ"M›N�„çN[8«úyÔº»»ûño½ð�ÿù Zn‘JèbUÌ�:Æ-;ÿ¡ZûFH¶â‡¡iNR”Gã|\ña£r®'ŽžýÃÏýõ#»ç¶»—ŽëÃÁµÿéz¾‘_¹‡HÑ}ùþïÏ—Êï×ñJËë\œ‰s"í„°ksÓ‹?zcÇ[EdGF‚øx‹¼P€Ç-CðÅÇ r[)ãSy#WŠ©ÆJ14³v;p$L ¬+שòh%b/Ï(T-æñ—[¯üý×~ü_âÖÛÞ²böÔFŽ^]SežNñ/‘Šžår Ù*��]þ¼É¾¥^7̇Ú+òõ ×+[?úRe{ÛµSGÏíßuä•'ß>wª%D¡:xöh[ñÙÕ:YªfnÁœ o`Ñtënù¤}tG8oÔ!‰‚�>P­xH¹*[‹¿ilª|¤Nç5Šç•Êz�ŒŠÙÐýGÕY©NS#�¨Eöã,¦uê° ÏIÞP¿çè™}†Lb'Çö^‚£¢qVWq¼q?ÀPÞx–®„1**oÎ\Hè³ ›èMu1ôÉ}.½ˆƒ—¡hz4î¡És„:Ûk@�[ò™Z Ü£ðÅŠ » c(µx¼WϦ´fbû@ü\±àGaX¨§‡_òû3t"äÉ@ƒ®½gÄãˆýµ¹3bS¨Ür� Cí8ÚK7¿xÇ‘ÆÔ3ÙÈò1D§ø¯L!@‰I&=‹ÌËc�]å7–žÈq˜ªT.ç4ÈòÝPE‰¨naÙM=#F½NÜ!k™TSQ™;ÙÉm8ÑÒËP…Ç%*Ȩš*7¥ÌZ %·¬(fÔPj³Ï(ǧln‰O¬RÇ{¡å[¡Ï±ø Êw‘Ý‘’djp)èX3У˰ƒLy¸FÒÿCiPRÃZ Í|~®Ð¹Xh5 �99…è'9ÕVcTšbT,Õ]åpN•ZNb:OCùL/çæò½hx�ìc„”œÚ*B„æ4I Wb‘¼Zr‘é<épE ‚‰1TN—k‹…¾æ¤ øÅ2r¥5­ Ík¬Á åIEâ]E/¤Ë 5Á�ZU¯hfËÑ÷ô𳿅F§q`�7G ëå•”@,20ìºöúüµ¶Ñsy�–N“—P2ƒ7°%ÙUÀ=áç€,º‘—ó†*r)‰ÂhGG¤�obcަò€«(¤Š`ÿàJë¤LÉÐG7eá$îF’™WQ®¦�-sL;?Å~ú�¶OdDüÔ“Ñ£›â”[N(ó ÃþBKPEY*^6JZ„Çüƈ§ %%E–æ„²Ê ”ºèK±§Pú’¢±òsJLø§tª¥ |%б§Jfu·CE (Ú¢�†E�3£ë¬ƒ´e}ܬèþƒu€¡“nd3£ýU|d,a¼ÓJì1¹Vû}‰ÏB ¦x)Îg34ɤA×&›7«Àš  j_þuZ X&–Q+çE¡p‚+×®èÅd¡©Å•ä�…~j å–mê•[¶,ɤÜÃèðD 7�ÿšÇúäÂ/¾¾‘á”ç9šÄN" 2`i+´D®"˜ŠeùS®14›¸g€¨^R¢æÛ2\­�X«Š.d²#øRœ²¥eÒó-HÚ7>A�£±Ø´` N'ãdO?Q¡H•HyWÆ©ìöf˜1åÏ û‹ £6„ˆì¡·°%¨VøÐÊKSìPxd3‘,‹<ÊßTf��c–Ã=!Ì^#«O€µBBÌ$È6à5øŒNî›’‚Ò—=]JGúPY¡˜È�G~E3X–+ZTöÊ·9v"‹Q¸¡®ô7Šˆ +�W΂…(*âþªÿWÌCP:²2`C^g”•¡¥¼Žêš#Ê)Y”n[á.K,-±ƒw#¥¥›ä¨D@²­¼Ki¼­¡ Z†"œ&…@J¶ºr¯÷ (õ…ÅCˆ‘ûT·¸–H4‰eC=|ª[¢ƒ ñ4˜XÔÞš2›§Pd©[º©Œq)c™4�ã‚@¢² ¸ÓÎŽ6 Ý(Š=Ì�å—–ÐyŽÔ�@�,/È&ObÓ?gMà_,;dä»EáÎ8j6HÒ2¦²•’ çÒ”íÁBdðQXx/A:˜36¼c=tRV- ÑëR©ôè  Êsb'�~ËPQ  T(•PÌEŠ ãCµ£ÌšH |))ÀþV‰j»-X2A“��"ªõ’—ð2•$kÑ 4ª·±rQPE#ïñÁ:ÊŽ¨˘TA\€hBI%ä%ë\Æ96ôµ°DE2N†¬)u£!‰±ó2d½â gòÀÊ1*��¬'§Â§”x>zH ƒ9Éþ3K´@ã+b¾Uù›%½ÑG[tüÂN"}"z[Vj¬òµŠR*A  œH@°TUõŽLÖ�^žñø–¢ ãQd”zÊY•ñ^#F¸á½A-•#‰@ãFV‰}Pìx¥‚V)%O;ªY6K©1ºôoóñ)à¡ ž™¬× &KЉÃ#¥¿WȜ̈bbóaÔ#s&t‹©†Ìë¬�Æ£Ê_¹þB‘�1…0î AkdMsÝm4ÇzBÞÆb¡,Ü@±l)™˜nY‹ L 5'Ȳ–ޥΠ á+¥¤Äã»iÈ(¶SÄ ‡T*Ö?¨Nî b"F›R¢ù(”nuÜ&E}á@Y8<@Ĩm‡ôåÀЉé’êrÔrò[SKäÎ\·0𼄠(91hË$·²�œáKØ¿yjQ,º\(”¶}y�H¦äÔòªÃô“A†zű‡ ÆB!Ç%úÄTÄYœ ø«-G­¦þÆã[�BG5ÑÅÞ5Ë�š†Ž«è¤_X�¦�;–r—ÁÙ  áäñC”K—mu�AO…’·0Ñ@“±Gù•ž· ÍlŒYHqöú-4+ÕõZ¿B� ÏYYÑõîåª"ÒÍDoˆLb’ÆOLƒVžŠã¸yã)>�2@€ÛèZh3ë›H‘$–g› mG¼$Ó1ž%Ž1X¦%Rjé8#ZW�¦öà¶×˜/ÀuB`©™?ë4—qó(³‘9 Š®êÿλ@9ä 8�”®úP„� ê0¦¥"2ÒsxQK€•` wýàÃ�k…¾½¬YÇ PTQ‚ üs‚ô†’ûiÚ+SE¤!¶$ƒžºÈˆ<ÄNQòåX'GYQ^P–<úAWÆ‚¶Ü¿r´>GþÕ˜ è!© Z£ÕzE¦"qÀsd78Þ¬²‚³+«Nl!”Rhi”ŠQ�ñ® fC™3±büå×ÉÐÆ ��tˆÖÚWMº’�sñ|ù\¡1KåùW1y\‡pMé²(K @2ÁX6©Ö*4£Í«–rjíÙº¸Nda1PÃ�x²U„ÏrJ™‡¬‘•ÄJ€¿ÔèYÖn¯ÝóÄDöR%�:ïöpÝàS¿G#çr4ãWbs‚Ⱥä]Û×mL4¡¹lƒŒÒ-(Õ CQõrÑ¿i¥J@º³£|¨hœÒ-ôÐf!cÎÌÛ‡ü�’{‚[‚cTG£µ†f –Çqç�ÓÈzµVj{¥}³„2Ú]èŠBm)PY%Îó†µi³.Ñ* ¨Ú£QeœÌz=0$6_’ÃÓs““§N…�Ìd "aHtñ¦É)“/˜âPðI‰MÌ�×Læ¶q{Å­HH”½a¢/Ò5XA·Bßqr!ô•á2ª[Ú<ˆ7‘ˆ€¶æHµÏ>x M8ì(©å8Öe@GLdPÉB;i9P´�°ãR[¡¨Çå’‹K�a±ZÓ¡tK‡xQWƒ]c=–0OÓðp%^\æðÅ”RùÕB·äà–¼¨‡¼aI›rjY¨ÖÞžèILE(ª©£3h2 SBÃ$rkŸ½N),„G]$ÉÁ)£LJ*—©\[(ñ‘/ü³P©Þµ"“v–�k£©t¤šêÐlš�¤×Š6m1‰Ë*l¯ø$^y×iÑÄ›ºª¥È”¬¢õ}|�Uj௱òÿÌ”:RƒªSÉ4¡u´&Km’T™Ÿ"Õ£ Ÿ¹œ� t…ˆžú)]ò˜H ïÈÚçiÏ“œ•÷ÕS{lÔ‚t¹ *½AQ#õ^£�±’‚¸ò€€.NnÅÏË()¬€Ê ‹ŠaFÙ6¾VI´ 5ièñÚÞ y“V`a'óô€ÕË^�œ+‰!LV·)Ã̺Iüƒ€[qÔG@é—Y¥n9›b¾å ìa¡¬ ]|¡–¶éÁâÓ\ÜœÈq3¡+E Q‚EêE·HlÌÈ`XθТ á ÐÚ"³þšàüYf´–óœÊzD|+‚…dÅhÐÁ`N ÎØ%¢4^f UÐýþtŠ4¼ŒvD ‰~èÖâqµ¸B£d6TOH¡‘LʆՓ˷”Ö!+�‰—»Á2ŽÀƒwñZþÁG³gB"ÚFp�bøŠ qžƒ,’1G½è–¤À×àP¢Š ¤… ×òé$n ÌD:¼=†€Ø9ž`  “�¶4](¢(Ž KyE:C©oLÚ´ëZø© +IBÖ7�íÍ#kl2 ¾eÉ,JŠi�´ˆ¡*g4µÓ2ðÌòÒ˜Ä0xÚ¡"Ê` %©J,×�꣄ue0à”ìT¥ xòO«uÆÊ¥sÊÛVÊzé]ÑR„#TDƹy¦é {!e3õ:ýBÔ9š@*”1Æä¢³{d49ã%ä@iø[ñÍEA\†ƒDs­fòoIÏAvù‘.šç(K¢±�¡|$õ õ¶Âzöi-BŒ£è¢ÉVúÿÿÿX­®çEI>IEND®B`‚maturin-1.16.0/guide/src/assets/sponsors/tsy-capital.png000066400000000000000000000161141527064705700233120ustar00rootroot00000000000000‰PNG  IHDRÈÈ­X®žIDATxœì� ¸VU¹Çÿç9 G”@AeASQ +s±ëˆš†™f Þ¼¥eŽeY×›™iÚ ÙdŽId* †iŽˆ’$„¦à” Ò‘Yæß}ö}þûºÜío{xßµöw¾õ{žõœáÛ{íµö·Þ5¾C3<OU¶r]KŒÐO(¯{¬ÊË6Ý'”×�ååqÌ4¡4Àue 0Pð=Lu]4Ê«C0¯.‚yÙF²ì’ï´´4Š€¬Ì«M0/ÛH–½^§™™hY+˜×¶‚yÙF²ìkó*-�" +óÚN0/ÛH–]ò�––F�å‚yí ˜—m$Ë.ùNKK£È¿ó(˜—m$Ë.ùNKK£ÈbÁ¼†æe›¡‚yI¾ÓÒÒ(òº`^ïÌË6» æ%ùN=ŽÙ^ð€lM�v,-ÜÍ“zõ¼Yá‰a¹`ãØÃuer0L°þË\WÆõØæåEÁ¼öÌËÌKò]–šF�y‚y$˜—-F æ%ù.KM# ÈÁ¼ÌË£ózV0/OI-8R×Ê€¤o�F¹®�-iù«°êÑ‚yi#YÖMf æWjI@Ö˜+˜ßñ‚yi#YÖgEQ & � æud�hööp¸`~ eEØhò�`^]ŒÌO‹q,«’�Œ§dôâZj±*)pZ<,Xß ¶q]!�.�6˜-%×ÍÚ�e”ªï®+d›F›b�^I¤hðEÁü¤™È2J1E0/OIÙMøL`EI§A™V ×UR]ÞSbf 7œ \W(† …ëø´ë yìqŽpãi°µëJeyK¸Žg»®”Ç;ñT]²�ïºRç ×-xW;º®”Ç.’Þ+´7)ƒÑö¶/•Fñ¢èy7c…Q�~êºR~¦P¯zR«ñÑà5ᆴ Àp‡uÚGø ´ÂwÔâ°N‡\¤ÐÛÎtÔ ‚g>¥PŸ‹ÔÅSzX­Ð¨ÎuP—s걊ïÈÓÀ\©Ð°ÖØÓbööX¦X¬ƒ§¤ô§§réÆ5@w åïÎgI—=·Ã=üX¡�éz eÿ¹RÙl¡ìž:¡ŸÒZ$HË=A©Ì«CÖy: —*5¶ ÂEBF+M +|Ï»ØÀ›J ®À®‚eJïêe]  §`Y=�ˆÓ”]�^ äñ²b9?%PFO'¥IØâ0šžз@ù¶ð¼bù|—žNÊp᜜š±;Òm‘V¹68V“ñÔ—(6Ä Í08Cyvæ=šeºDñ}z:]è M³A¾`ßeÙ‡×j–å™:�ÿîqÀpÅmÔ0­¦Ú}5Æ*žÏ„i½ŸZUGÒãE÷2²êFê ­¢“ƒ·¸¥ºÀ?¹+³D¹,y8 À5ÊÏØÂéÍeüô6s!€o[ð—vƒ2¹@Y8ÎQ,û! ’”·l^@™¨Ø¨ÖØÅB)«¯k…‡ ä•Ò ˆ2š½ï-”_3†â•ÊüAO�^@,ðsÅF¦yV0Z±Ü“ä­ ïÚ ˆ‚EîCJ m–ÒÎOÏ]4ÊüW…°vmt.]V/ –èCÇ î$…òŽW*k;½+JÒ­àBÜ HI©t–0OX_©‰[ÉÒåÜL.ÒLR/ ÐZ´KŽ"'(•QC+ùlEáP¯…ùïHø¸�c•`^‚y™lRÈs½BžGœ¨ÔËÍT(«FÜŽÍŒm.Íoëuñ¼Ã®Šjâ&¨Ç+•u €�„ËÚJç ^@ê”m#¶>¨Xî4Žçò¤§…ÂÓ™töOìÄ-ж"Á”僊eß_Ñrð…ó›ú&öR'4ÑÎ@£�UHS›[˯ek?^0P�E®Tl\Ëô³P‡•½¸\¤TîÜ$0zQâRÅFU¡œ-´Ï¾¬Xö` :Õ H¹ø¾rƒzÜòS³¢^–öH2‚ŠŒYw½€,¯WnHë„¢åfeå4ëv¹…z´ø8×ViB×y¢'½Âk6  }Õa¿n¡~·YtÚÐDÇÛŸp ÏRæG ļ€0ØR,¾éœ$ÑÄà£Úõtíö Ù·} ÊQ÷o)ö·Æ t(EÕ�&ï8®ÎiUÞÆ5S€Ã\WØàHKqSB×£1M<Šì§d/Q-]èºÂ1|Ãbýg2¦¤§äôàNË&‹�ãwŽ×ÕhR6TЦ0üA«ëŠ{þ� 1œê ’ÒÌÇw;ŒY–ßÉã\WÜóG9ˆ,6ª$EÙ À+ÞÏ>›;šh;=ÃÁ_a|Â]]¿„ ¼×ÒÎV5AñA<-±5C¬ÍsôeiY�ÆøÞÏa¤Û ;³S|hyZ àW%‚¿T)ü³-°¿1.ý‹§â.<àwzò€ïzNg\~¡¦pt†/õ@A·ŸEÓ|žU�.kðϲlObãÛÀÁœ”é…-0Àß]Dˆ¸�ªe!˜<Ê4À3휢- C¸ Ú�ë‡ÞúèOý¨`¡»gÉc�¿È�²W]D˜ÝÜ¯èæ¨(ÁóOú X@¯— ¹Ù°” ‹ë™–º.l^^*Á0^$=Q²^Všþì©]¿ç"É;ŽsÄo©Œ×îº Š,â”v²ë‚4*õ8‚lð5×/Î2M ªq«.GmêM@2$X£2Æá�¢�’§²íê¸b€‡Kð}x)IZ àÌmy—�çY°q÷R‚˜”áV´'ž½”œd{!e�¥>ïG�Ttá¦EYNß½€(¦ª¯lçúÅÔ!ýéÑÄõwèD)Ý `×/¤0ªd‹x/ ÓãÔöÈòsKðýzÉ™¦{·4êk¸ãØ yÉ�mYÇ�š19<ñ�Ñ�–fxI™þA·›}\WØó6ð—RÏË H 4äMF+Úßu%=±4sí÷ eS_/ FzŽ¡ Fyo~uE72½–v5^@HQY@[ôϔذǓ�á 04YÀ¤ZU@´O’_J©Êñ6…áynΦŠCg¶Åð¼Ã®4¹Þ—áöd‡˜f–ð2€¡ZÓ�Ÿqá¼ÀZ*.§·õ çxƒ¦”K”Ëá©?ºRHvæ)~?j@ô¦S�¼¦�î„<�m¼É­Ç“€�'/ O^@<ž¼€x< xñxðâñ$àÄãIÀ ˆÇ“€�'/ O�$ ¡¥ÛlÃ,?û(cY†z£À tn=Àua Ρ§š¹.Hg¡ÆUüÙò³CóÓ-?·×xÀwh›‘ÄXö…%‹ #Ë5Kó![e¸¶'à k²œúý¬p€ÐôXö@.Y+ÔèNpSÊkßà0Ž¢û¸À¿dL”ƵÁˆñ=þþ]ý¤¡£Ú¾˜±uÍáŠvÅaºC¹Ac\Ìg=¥ü,“j#ÈZ¡÷ö©e „ã Úä„ù¬¢Áø®ž,P¦g”§ð¥AÊHÏuø €ó(ô/d¸w=] I1BÈhmqŽ{‚Qã\Gÿ»¨´]øìO+ÏŸ÷³ˆ÷1Výs‘<‡8›�xΰ¥`½œ“¥q=`�”×î ` ÿ,ïMÃê å x¨`h毿œÂ%E¦ ›8rßÁuÚ`“è[ìuÇD˜þ�A†æG§ §aWqô©{²ÈÚ ½­iKüzÆ^Ú㎡œrÍ '’�Ð$:d"G›€“¸î …âJŽÈ38*e¡‰Â™…Vþláº* k8ZÖ¤Þ§X´e¼ç/´eFƒ?f¼÷�Œ×§å”œŽµ¯åú&/­ôˆx<]ˆ¤ã„ÿbÛèàuÁïßpGœo3ÀΟø¿«9²Î¤Ë×M˱C�wLS—e¼'˦† ÃŒÅÚá. C¸0>]ñwgtWsGÎ…pžéåìX~Ï@ýa^[Øû›gD­ÞçxÍrN¹@A }\ÍåD^_e;ZØÊµ©¡5‚˜ùv(=£32ƒ±“èÍ…p®à›¹»,Öogz…Ó•ÓŒ­ð0–J°hÿ ƒûƒ®#¸m>�B¾ˆ?ïãäí”åZ àˆ×}—óïC¸©ð&;âGy\‹y)Ë¥Æ~†´äº0lŒ ï㦷øÌK�ÿ�4®G�«Sä=¤Àrïû§Iqm†Ã¿åtºo�|G°¦ãê?»•ÚÅÈÿXã�=Já ~ß@Abh� ¦éJψòé”ÄÂ:ŸRuâï9Îgž�ü½�?ƒ©Èó’äÏ\ëÌåßã8ZDy•¾Êf°QžÄ”Ä˦`:v0; Š`Ù/äw÷G¨OŸ=ÀçãZè,©‡¦�`89C¾»¿ÿgŽíÛ<[©§f\ïËT‹I0m2×ø}L�‘ôÀŒy/çðÚœe«Æ0ºŸÕc¢‚WáôëVgø±ÔÎiZÙÀ—r>ãÌ÷9kh7æÉqìË9økœúTchŽ­Ç¢ ¡Rcýž;À îÿ<€Ÿ –'ÊUl«ó'1ŽßQmfÇH<8­€´ÓWnZ†ûÔ0BuÙàNö"ÕõŸ.ðó„ëîæÖ§MŽsðLð»Éº5k²Y°,Q‚™Á‘üý« §ó[øùTjOOðë¢O+ w2¥¡_ÌÞüYÆÎƒ§:Ïñ,!‰žÆ ?÷à‚:MZQƒAû»¿ÆõÓÜÅQø*.à)€Æ"}¬±þ_Þ—½€¤b:·R“¢ ›¸~ÈKÁ²„mèfnø,Ë0ÅÖ¼£¹]=‰ëçÜús2‘?ÿÅÙÛ)4ï‹ÙÝñ”ƒ'¹«——Ó^’«ØÐÁFŸö¤}…én?߯õU.ÅIiuä±,h_0‰Ú Ás~(ü¬zeÎ�¬²Åê‚nÜòΛ²êBÕâ+ÆVíuìd³p«!°cù»sëÙ6î…W¸­î¶Œ3�&(>:ŸQ«'K{Px· �Jh2;bn‡Ú:(Œr½° GV�¨8&²·ò{,²ÙcbÆÑÊϲݔgÆ$9Åú O;þÛŠs'ïÜ~›Á“ÜÎNç¿§‹Øpt]Ê/,*̇¦ðž e�Q]ÏÊÁ¬gQ¾IÛ÷&néžB5ú.1׆ëÜæ…ÕS¸pÆò‹þ�súo•ó I}2Fðv6ãæè«P†²Œ }9�|-Ò»nfO¦6±‰MeE“p¹»`>§AzEÞÁó‘‘²H:�@ø÷)Κþ‰äë†Ýò›”Ш‚âk4œšDcªéÜÛ.sèµ°×ʺ¸[Çs˜pgg‘Þ˜pò–ŒçL! sÜÇ@ã¤:YOÜ£|ß0G~šÃik±„‹ý;8‹Ù‘}_š³Ÿ"Ò•Þ1ž8T…®vŠ=™¶—Qè �¨>¸bG¹�ˆfÃ6;k ÑÕœV¶Q0îKq�v“+FHªà,.Ïg粎ßÁ1 ÷\À©Ý<šWc1ó;À7|˜ëâ"£5 ^èߌak!·qÓðmã¾5<#‘Øa(2ÅúZ•á¹=§!“vpT)qš¦C((gEþMgrZ6!òÿ´m ެg)µéÕÈÔÖ²Ž }¨ïò%ãÞÇ9­J»O} ¯½†/åjjf^œÂ"‰ßs®™ÇúwlÔÔ¼]Åiᬜ‡LIj5½�Í )6æ‰ÿI“èPõ“\|‚�?n{uOvrÛQ-f¯»-ƉCÖ¸7 *Ž$úqjdZ ­£ r^+²–jašÃEÓƒŸ {�$>%¼µZÉavÛ“�û§†U`…Óä+SØTtg§xOÄdGJžyGqºòÜüB& oïʹäŠHþä]�F�ÔõÚ¹ÿIÎý·ÎQŸ¾Ô¾~ÅÈo-§ºÛçÈ/-¥ÐÒJNcÞ¯�/n/ #M\ ˆk.eýgsѺ›P¾ÍÜ>}œÛ½EvÅÒP*�ÒUŠo&�°ï`[åç”m'ÚyF¢¬ áÆÀîžåñxâp®Àåñ”/ O^@<ž¼€x< xñxðâñ$àÄãI ¯•ÛÐÒk•×8,‹Í´uÙ�‡ªËk(-z: ¿æ—�%%yÿûýuÄ(*~.aT;‘* ˨èX�Ã�ëö+X÷4lGoE계&¤ÝRæ3Þ(wõ‰_÷…é-*!>@ƒ¶>5ò¸-å÷ú?U±}¼’¢^ÍtÖiT†wòe>G+žË»Ècºc•¼Žbœ¿Ša¢Ù¹÷¡*jø-´e¯e"ú ¯ÑÖéݘšA0;hUi:fx"¥YÁ¤È{H« šæûYRÃC{šx&•§ÏØ>Ҙ掎ÜsMÊ÷ÃÜŠ }_Ú/˜ég,ÀŠ˜Ïv©2uk5¼{Ì�"mO·‘Ë óÝ8N1^Xܾ¿ñùuOb'6¼ð‹øª¡ßÕJoèo¤Œåу&¦i›Rá—œ†P@3´QWi"ßi…vÞÕ ¹úE¾¿Ð†ûÞÈÿ{W¹¿L¸—y<óÙÎ)êu ï¿…?f0D³* q|/CO2Êh¼GW¹¦��ƒf£·šóù]Æ«ÍÍÆ¨qd•kÒú‹o4ò�ó÷§SÞ[K«õdã½§�rÎâõE\Ѷm2:ÓáÆôudÊûÅÄæ.–éߨڔcQ ‹¯-t Ú³ïm|¶7ƒNV8÷×d6dÐ}Oµé\Zwž¡+ÑéŒá±™Qf ”õ/ÆïCò³ÁHŽÐ‹8Ûx�ÿ—v¹Z›2›ëÐ?VÒB;‰É´‡o¦-yÈùüß]9=„daŒáõ¤¨³ƒîFœ’©ô™õÿ–hæ&A½„à =œLãÏÐûÛöþ6d¹ÑûïB˶GiÿœÅ6¾B»vpú0€=ãIa.Q({”áü¹9ÃT¨ch?±Äð°6 9Ñø½|#7±J©òT~·ƒ t¬¹°}Px9¯äߣ¸Åø]·¤5ʺ› ³•£Èy²Ðqƒ6á6öÊ"žÃI(÷ÓË)üù!6Š4„ÛxÆ´7£1}—ŸO+ À²ÓÛÀ)'"�‡õiVò,ÒMz±aG½.ʰc,ÄÖsú°gÎòdåV>{iÁ|ºŽ0ÆE>[Èÿ×ÚK³Íû7®›Òâr‘~ï›ùÿ%üÿË)ò[¤kñ¬Å †¾šÃéÙܖ݉½ç^)y¦ñŒ!Œ¢{3·2m†nÛ–süõ9ó9н=èÍܺ^Å]½ñl4µØlŒfáü\F›½‰[ÈeÇœ^u�„t7váF‘€?êAâ8Çèñ¾‘òžO÷Øœ›ža<7íˆÇoSôþ›k¸áÑp^àj9 åAcÒY:ÃÇyض+¤áí*¿kzql¢ŸÇsäÑjÄ#¼µÊÚé[¡NPˆ[F …`MzCÌçÇð„}|Á@¯êäAš)Õ\Õ·Ð-}%CcøˆÑ«ÄÅ×d*Ÿ»1Áyso*0Æq¬Qö�U®¹�Ÿ'…¯ë,#H“±&½´Ê5ãjhR„ÔåAáå\wÌad%Ó½OOƧ�ýÁb¹òr¿€.–Ó"#r 4�p´‰s³ó1þœM÷Ÿq„Ûœ#3.²ësÇîž*×Lçîʾ›•gù‘a°ž®GçE¯Ë�§Ë$|þ£ +¹côºñ¿—cNÄ»p¬bœ Å1ØÈ§Z¼y‰¤¨²¢D¹®0v2“ïçu/$\s^ÊúÔ!mŽ 7PAñ&ö¼]¹-;Œ¿/¦Wñ‰ËT”)Ôo Ï0¶¡‡ópÿ—üüÕÈ}‡ŠSò•ÊÞc Ö/Tr¬Fø¾Þ›Óó~&òÛwcª‡~YèÎ9ä6¬—yÊ›5 }ËßJ-ÏÝ)éG·¬½ u‘U®íjL1kékµqA¿¥Ê»?ï`l’<´U seC†ƒÑ0ÏŽ(M†ÃëµÆ4*Ž­Œå5U¶¯»²�ÕbS'0ÔóxÜñ¿ÿÿúÇõ½M"M9IEND®B`‚maturin-1.16.0/guide/src/bindings.md000066400000000000000000000132761527064705700173070ustar00rootroot00000000000000# Bindings Maturin supports several kinds of bindings, some of which are automatically detected. You can also pass `-b` / `--bindings` command line option to manually specify which bindings to use. ## `pyo3` [pyo3](https://github.com/PyO3/pyo3) is Rust bindings for Python, including tools for creating native Python extension modules. It supports CPython, PyPy, and GraalPy. maturin automatically detects pyo3 bindings when it's added as a dependency in `Cargo.toml`. ### `Py_LIMITED_API`/abi3 The pyo3 bindings support the Python stable ABI (`Py_LIMITED_API`/abi3/abi3t). You can use it by enabling both `abi3` and `abi3t` features with a minimum supported Python version for each: ```toml pyo3 = { version = "0.29.0", features = ["abi3-py310", "abi3t-py315"] } ``` A single maturin build selects one stable ABI family. If you want to publish both a GIL-enabled `abi3` wheel and an `abi3t` wheel, run separate wheel builds explicitly, with compatible interpreters: ```console maturin build --interpreter python3.10 maturin build --interpreter python3.15t ``` A GIL-enabled CPython 3.15 or newer interpreter can also build the `abi3t` wheel when using PyO3 0.29 or newer. An `abi3-py310` wheel supports all GIL-enabled CPython versions from Python 3.10 and newer, while the `abi3.abi3t` wheel supports Python 3.15 and all newer versions of CPython. Free-threaded CPython 3.14 does not support the `abi3t` stable ABI, so maturin builds a version-specific `cp314-cp314t` wheel for it instead. Do not rely on a single build with both `abi3` and `abi3t` Cargo features to produce both stable ABI wheels. maturin will choose at most one stable ABI family for the build and emit version-specific fallback wheels for interpreters that cannot use that family. > **Note**: Read more about stable ABI support in [pyo3's > documentation](https://pyo3.rs/latest/building-and-distribution#py_limited_apiabi3abi3t). You > can read more about using abi3 and abi3t wheels simultaneously in the > HOWTO guide on migrating to abi3t: https://docs.python.org/3.16/howto/abi3t-migration.html#why-do-this. ### Cross Compiling pyo3 bindings has decent cross compilation support. For manylinux support the [manylinux-cross](https://github.com/rust-cross/manylinux-cross) docker images can be used. > **Note**: Read more about cross compiling in [pyo3's > documentation](https://pyo3.rs/latest/building-and-distribution#cross-compiling). ## `cffi` Cffi wheels are compatible with all python versions including pypy. If `cffi` isn't installed and python is running inside a virtualenv, maturin will install it, otherwise you have to install it yourself (`pip install cffi`). Maturin uses cbindgen to generate a header file for [supported Rust types](https://github.com/eqrion/cbindgen/blob/master/docs.md#supported-types). The header file can be customized by configuring cbindgen through a `cbindgen.toml` file inside your project root. Aternatively you can use a build script that writes a header file to `$PROJECT_ROOT/target/header.h`, like so: ```rust use cbindgen; use std::env; use std::path::Path; fn main() { let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); let bindings = cbindgen::Builder::new() .with_no_includes() .with_language(cbindgen::Language::C) .with_crate(crate_dir) .generate() .unwrap(); bindings.write_to_file(Path::new("target").join("header.h")); } ``` Maturin uses the cbindgen-generated header to create a module that exposes `ffi` and `lib` objects as attributes. See the [cffi docs](https://cffi.readthedocs.io/en/latest/using.html) for more information on using these `ffi`/`lib` objects to call the Rust code from Python. > **Note**: Maturin _does not_ automatically detect `cffi` bindings. You _must_ > specify them via either command line with `-b cffi` or in `pyproject.toml`. Maturin automatically detect `cffi` bindings, but only if there is no pyo3 dependency. You can specify `cffi` explicitly via either command line with `-b cffi` or in `pyproject.toml`. ## `bin` Maturin also supports distributing binary applications written in Rust as Python packages using the `bin` bindings. Binaries are packaged into the wheel as "scripts" and are available on the user's `PATH` (e.g. in the `bin` directory of a virtual environment) once installed. Maturin automatically detect `bin` bindings, but only if there is only a binary target and no pyo3 dependency or cdylib target. You can specify `bin` explicitly via either command line with `-b bin` or in `pyproject.toml`. ### Both binary and library? Shipping both a binary and library would double the size of your wheel. Consider instead exposing a CLI function in the library and using a Python entrypoint: ```rust #[pyfunction] fn print_cli_args(py: Python) -> PyResult<()> { // This one includes python and the name of the wrapper script itself, e.g. // `["/home/ferris/.venv/bin/python", "/home/ferris/.venv/bin/print_cli_args", "a", "b", "c"]` println!("{:?}", env::args().collect::>()); // This one includes only the name of the wrapper script itself, e.g. // `["/home/ferris/.venv/bin/print_cli_args", "a", "b", "c"])` println!( "{:?}", py.import("sys")? .getattr("argv")? .extract::>()? ); Ok(()) } #[pymodule] fn my_module(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(print_cli_args))?; Ok(()) } ``` In pyproject.toml: ```toml [project.scripts] print_cli_args = "my_module:print_cli_args" ``` ## `uniffi` uniffi bindings use [uniffi-rs](https://mozilla.github.io/uniffi-rs/) to generate Python `ctypes` bindings from an interface definition file. uniffi wheels are compatible with all python versions including pypy. maturin-1.16.0/guide/src/changelog.md000066400000000000000000000000401527064705700174220ustar00rootroot00000000000000{{#include ../../Changelog.md}} maturin-1.16.0/guide/src/config.md000066400000000000000000000256771527064705700167670ustar00rootroot00000000000000# Configuration ## Configuration format You can configure maturin in `tool.maturin` section of [`pyproject.toml`](https://packaging.python.org/en/latest/specifications/pyproject-toml/#arbitrary-tool-configuration-the-tool-table). ## Configuration keys ### Cargo options ```toml [tool.maturin] # Build artifacts with the specified Cargo profile profile = "release" # For "editable" builds, use the specified Cargo profile, # e.g. to use "dev" builds for local development # (uses `profile` if this key is not set) editable-profile = "release" # List of features to activate features = ["foo", "bar"] # Features can also be conditional on the target Python version # using PEP 440 version specifiers: # features = [ # "always-on-feature", # { feature = "pyo3/abi3-py311", python-version = ">=3.11" }, # { feature = "pyo3/abi3-py38", python-version = "<3.11" }, # ] # Activate all available features all-features = false # Do not activate the `default` feature no-default-features = false # Cargo manifest path manifest-path = "Cargo.toml" # Require Cargo.lock and cache are up to date frozen = false # Require Cargo.lock is up to date locked = false # Override a configuration value (unstable) config = [] # Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details unstable-flags = [] # Extra arguments that will be passed to rustc as `cargo rustc [...] -- [...] [arg1] [arg2]` rustc-args = [] ``` These are `cargo` build options, refer Cargo documentation [here](https://doc.rust-lang.org/cargo/commands/cargo-rustc.html). ### maturin options ```toml [tool.maturin] # Python import name of the built extension module. # Accepts dotted names like "my_package._native" so the Rust extension is # installed as a submodule (useful for mixed Python/Rust projects). # See the project layout docs for a full example. module-name = "my_package._native" # Include additional files include = [] # Exclude files exclude = [] # Bindings type bindings = "pyo3" # Control the platform tag and PyPI compatibility compatibility = "pypi" # auditwheel mode, possible values are repair, check and skip auditwheel = "repair" # Don't check for manylinux compliance, deprecated in favor of auditwheel = "skip" skip-auditwheel = false # Python source directory python-source = "src" # Python packages to include python-packages = ["foo", "bar"] # Path to the wheel data directory (see the Data section of the project layout # docs). Defaults to looking for `.data` next to the project root # when that directory exists. Relative paths are resolved from the project root. data = "my_package.data" # Strip the library for minimum file size strip = true # Source distribution generator, # supports cargo (default) and git. sdist-generator = "cargo" # Include the Windows import library (.dll.lib or .dll.a) in the wheel. # This is useful when distributing shared libraries that other programs # need to link against at compile time. include-import-lib = false # Use base Python executable instead of venv Python executable in PEP 517 build. # # This can help avoid unnecessary rebuilds, as the Python executable does not change # every time. It should not be set when the sdist build requires packages installed # in venv. This can also be set with the `MATURIN_PEP517_USE_BASE_PYTHON` environment # variable. use-base-python = false # Shell command run during Profile-Guided Optimization (PGO) profile generation. # Required when building with `--pgo` / `MATURIN_PGO`. Executed in a temporary # virtualenv with the instrumented wheel installed. # Example: "python -m pytest tests/benchmarks" pgo-command = "python -m pytest tests/benchmarks" # Dependency group installed before the PGO training command (defaults to "dev") pgo-dependency-group = "testing-extra" # Select which Cargo compile targets to build when the crate defines more than # one matching target. Each entry is an object with a required `name` (as in # Cargo.toml) and an optional `kind` (`bin`, `cdylib`, `dylib`, `lib`, `rlib`, # or `staticlib`). This is unrelated to `[tool.maturin.target.]` below. # targets = [ # { name = "my_extension", kind = "cdylib" }, # ] ``` #### `module-name` By default maturin derives the extension module name from the Cargo package name. Set `module-name` to override that, including with a dotted import path such as `my_package._native`. That places the compiled extension inside a Python package, which is the usual layout for mixed Python/Rust projects. See [Import Rust as a submodule of your project](./project_layout.md#import-rust-as-a-submodule-of-your-project) for a complete example (including matching `#[pymodule]` / `#[pyo3(name = ...)]` changes). #### `data` Path to a wheel [data directory](https://packaging.python.org/en/latest/specifications/binary-distribution-format/#the-data-directory) whose contents are installed into the corresponding wheel install schemes (`data`, `scripts`, `headers`, `purelib`, `platlib`). If unset, maturin uses `.data` at the project root when that directory exists. Relative paths are resolved from the project root. See [Data](./project_layout.md#data) for the expected subdirectory layout. #### `targets` `targets` filters which Cargo compile targets maturin builds when a crate exposes several candidates (for example multiple `cdylib` or `bin` targets). It is **not** the same as `[tool.maturin.target.]`, which configures per-architecture options such as the macOS deployment target. ```toml [tool.maturin] # Only build these Cargo targets (name must match Cargo.toml) targets = [ { name = "my_extension", kind = "cdylib" }, { name = "my_cli", kind = "bin" }, ] ``` `name` is required. `kind` is optional; when set it must match one of `bin`, `cdylib`, `dylib`, `lib`, `rlib`, or `staticlib`. #### `pgo-command` Command used for the profile-training step of Profile-Guided Optimization. Required when you pass `--pgo` (or set `MATURIN_PGO`). Maturin runs the command in a temporary virtualenv after installing the instrumented wheel. ```toml [tool.maturin] pgo-command = "python -m pytest tests/benchmarks" ``` See the `--pgo` option under [Build](./distribution.md) for the overall three-phase flow. #### `pgo-dependency-group` Dependency group installed into the temporary PGO virtualenv before running `pgo-command`. It defaults to `dev`. Set it when the training workload uses a different PEP 735 dependency group: ```toml [dependency-groups] testing-extra = ["pytest", "pytest-benchmark"] [tool.maturin] pgo-dependency-group = "testing-extra" ``` When uv is available, maturin exports the selected group before installing it so versions from the uv lockfile are respected without replacing the temporary PGO environment. Otherwise maturin installs the group with pip's `--group` support. #### `generate-ci` Defaults for `maturin generate-ci` (currently GitHub Actions). CLI flags that overlap with this table are deprecated in favor of pyproject configuration. ```toml [tool.maturin.generate-ci.github] # Enable a pytest job in the generated workflow pytest = true # Use zig for manylinux cross compilation zig = true # Skip artifact attestation steps skip-attestation = false # Publish with PyPI trusted publishing (OIDC) instead of an API token trusted-publishing = true # Optional GitHub Actions environment name for the release job publishing-environment = "release" # Extra arguments passed to maturin on every platform args = "--find-interpreter" # Per-platform overrides. Each platform may set a simple `targets` list # (architecture names such as "x86_64" / "aarch64") or a detailed # `[[tool.maturin.generate-ci.github..target]]` array, plus shared # keys: runner, manylinux, container, docker-options, rust-toolchain, # rustup-components, before-script-linux, args. [tool.maturin.generate-ci.github.linux] runner = "ubuntu-22.04" manylinux = "2_28" targets = ["x86_64", "aarch64"] [tool.maturin.generate-ci.github.macos] targets = ["aarch64"] # Detailed per-target form (mutually exclusive with `targets` on the same platform): # [[tool.maturin.generate-ci.github.linux.target]] # arch = "x86_64" # manylinux = "2_28" # # [[tool.maturin.generate-ci.github.linux.target]] # arch = "aarch64" # runner = "self-hosted-arm64" # before-script-linux = "yum install -y openssl-devel" ``` Supported platform tables under `[tool.maturin.generate-ci.github]` are `linux`, `musllinux`, `windows`, `macos`, `emscripten`, and `android`. See [GitHub Actions](./distribution.md#github-actions) for usage of `maturin generate-ci` and trusted publishing details. The `[tool.maturin.include]` and `[tool.maturin.exclude]` configuration are inspired by [Poetry](https://python-poetry.org/docs/pyproject/#exclude-and-include). Glob patterns are resolved relative to the directory containing `pyproject.toml`. When using `python-source` (e.g. `python-source = "src/python"`), patterns are also tried relative to the `python-source` directory if they don't match relative to `pyproject.toml`. This means you can use a single pattern like `include = ["mypackage/data.txt"]` and it will work for both sdist and wheel targets: the sdist will include the file at its original location (`src/python/mypackage/data.txt`), and the wheel will include it at the package-relative path (`mypackage/data.txt`). To specify files or globs directly: ```toml include = ["path/**/*", "some/other/file"] ``` To specify a specific target format (`sdist` or `wheel`): ```toml include = [ { path = "path/**/*", format = "sdist" }, { path = "all", format = ["sdist", "wheel"] }, { path = "for/wheel/**/*", format = "wheel" } ] ``` The default behavior applies these configurations to both `sdist` and `wheel` targets. To include files generated by a Cargo build script (`build.rs`) from the crate's `OUT_DIR`: ```toml include = [ { path = "cpu_features.json", from = "out-dir", to = "my_package/" }, ] ``` The `path` is a glob pattern relative to `OUT_DIR`, and `to` specifies the target directory inside the wheel. This only applies to wheel builds (not sdist), since `OUT_DIR` does not exist until `cargo build` runs. To include files from a different workspace member's `OUT_DIR`, specify the crate name: ```toml include = [ { path = "generated/*.py", from = "out-dir", to = "my_package/", crate-name = "my-other-crate" }, ] ``` #### SBOM options ```toml [tool.maturin.sbom] # Generate a CycloneDX SBOM for the Rust dependency tree. # Defaults to true when the sbom feature is enabled. rust = true # Generate a CycloneDX SBOM for external shared libraries grafted during # auditwheel repair. Defaults to true when repair copies libraries. auditwheel = true # Additional SBOM files to include in the wheel. # Paths are relative to the project root. include = ["sboms/vendor.cdx.json"] ``` See the [SBOM](./sbom.md) page for more details. #### target specific maturin options Currently only macOS deployment target SDK version can be configured for `x86_64-apple-darwin` and `aarch64-apple-darwin` targets, other targets have no options yet. ```toml [tool.maturin.target.] # macOS deployment target SDK version macos-deployment-target = "11.0" ``` maturin-1.16.0/guide/src/contributing.md000066400000000000000000000110751527064705700202140ustar00rootroot00000000000000# Contributing Contributions are welcome, and they are greatly appreciated! You can contribute in many ways: ## Types of Contributions ### Report Bugs Report bugs at [https://github.com/PyO3/maturin/issues](https://github.com/PyO3/maturin/issues). ### Fix Bugs Look through the GitHub issues for bugs. Anything tagged with `bug` and `help wanted` is open to whoever wants to implement it. ### Implement Features Look through the GitHub issues for features. ### Write Documentation Maturin could always use more documentation, whether as part of the official guide, in docstrings or even on the web in blog posts, articles and such. ### Submit Feedback The best way to send feedback is to start a new discussion at [https://github.com/PyO3/maturin/discussions](https://github.com/PyO3/maturin/discussions). ## Get Started! Ready to contribute? Here's how to setup maturin for local development. 1. Fork the maturin repository on GitHub. 2. Clone your fork locally: ```bash $ git clone git@github.com:your_name_here/maturin.git ``` 3. [Install a stable Rust toolchain](https://www.rust-lang.org/tools/install) and of course [Python 3.6 or later is also required](https://realpython.com/installing-python/). 4. Create a branch for local development: ```bash $ cd maturin $ git checkout -b branch-name ``` Now you can make your changes locally. 5. When you're done making changes, ensure the tests pass by running ```bash $ cargo test ``` Note that in order to run tests you need to install `virtualenv` (`pip install virtualenv`) and add WebAssembly compilation target (`rustup target add wasm32-wasip1`). 6. make sure your changes are well formatted and pass the linting checks by installing [pre-commit](https://pre-commit.com/) and running ```bash $ pre-commit run --hook-stage manual --all ``` running `pre-commit install` will enable running the checks automatically before every commit (except for the slow checks: `cargo check` and `cargo clippy` which are only run manually). You can also look at `.pre-commit-config.yaml` and run the individual checks yourself if you prefer. 7. Commit your changes and push your branch to GitHub: ```bash $ git add . $ git commit $ git push origin branch-name ``` 8. Submit a pull request through the [GitHub website](https://github.com/PyO3/maturin/pulls). We provide a pre-configured [dev container](https://containers.dev/) that could be used in [Github Codespaces](https://github.com/features/codespaces), [VSCode](https://code.visualstudio.com/), [JetBrains](https://www.jetbrains.com/remote-development/gateway/), [JupyterLab](https://jupyterlab.readthedocs.io/en/stable/). [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/pyo3/maturin?quickstart=1&machine=standardLinux32gb) ## Pull Request Guidelines Before you submit a pull request, check that it meets these guidelines: 1. The pull request should include tests if it adds or changes functionalities. 2. Add a [changelog](https://github.com/PyO3/maturin/blob/main/Changelog.md) entry. 3. When command line interface changes, run `python3 test-crates/update_readme.py` to update related documentation. ## Guide To build the guide for local viewing, install [mdBook](https://rust-lang.github.io/mdBook/guide/installation.html) and run `mdbook watch guide` from the repository root. The output can then be found at `guide/book/index.html`. ## Code The main part is the maturin library, which is completely documented and should be well integrable. The accompanying `main.rs` takes care username and password for the pypi upload and otherwise calls into the library. The `sysconfig` folder contains the output of `python -m sysconfig` for different python versions and platform, which is helpful during development. You need to install `cffi` and `virtualenv` (`pip install cffi virtualenv`) to run the tests. You can set the `MATURIN_TEST_PYTHON` environment variable to run the tests against a specific Python version, for example `MATURIN_TEST_PYTHON=python3.11 cargo test` will run the tests against Python 3.11. There is one optional hack that can speed up the tests. 1. By running the tests with the `faster-tests` feature, binaries are stripped and wheels are only stored and not compressed. ## Releasing _These instructions are a work in progress_ Update the changelog: ``` git cliff -u --prepend Changelog.md --github-token ``` Update the version in `Cargo.toml` and run: ``` cargo check ``` Create a PR a release PR. After the release PR merged, update main, create a git tag and push the tag. maturin-1.16.0/guide/src/distribution.md000066400000000000000000000372401527064705700202260ustar00rootroot00000000000000# Distribution ## Build Wheels When building Rust binary or library, it's possible to depend on libraries and symbols only available on the build machine. To ensure the wheels are portable, native python modules on linux must only dynamically link a set of libraries and symbols called manylinux and musllinux. The pypa offers special docker images to ensure compliance with the [manylinux rules](https://peps.python.org/pep-0599/#the-manylinux2014-policy). If you want to publish linux wheels on pypi, **you need to use a manylinux docker image or [build with zig](#use-zig)**. The Rust compiler since version 1.64 [requires at least glibc 2.17](https://blog.rust-lang.org/2022/08/01/Increasing-glibc-kernel-requirements.html), so you need to use at least manylinux2014. For publishing, we recommend enforcing the same manylinux version as the image with the manylinux flag, e.g. use `--manylinux 2014` if you are building in `quay.io/pypa/manylinux2014_x86_64`. The [PyO3/maturin-action](https://github.com/PyO3/maturin-action) github action already takes care of this if you set e.g. `manylinux: 2014`. If you are publishing to PyPI, you can use `--compatibility pypi` to allow only builds for targets that are accepted by PyPI, and reject builds for unsupported operating systems and architectures. maturin can check the generated library for manylinux compliance (an auditwheel reimplementation) and gives the wheel the proper platform tag. - If your system's glibc is too new, it will assign the `linux` tag. - If you link other shared libraries, maturin will try to bundle them within the wheel, note that this requires [patchelf](https://github.com/NixOS/patchelf), which can be installed along with maturin from PyPI: `pip install maturin[patchelf]`. You can also manually disable those checks and directly use native linux target with `--manylinux off`. The [pyo3/maturin](https://ghcr.io/pyo3/maturin) image is based on the manylinux2014 image, and passes arguments to the `maturin` binary. You can use it like this: ``` docker run --rm -v $(pwd):/io ghcr.io/pyo3/maturin build --release # or other maturin arguments ``` Note that this image is very basic and only contains python, maturin and stable Rust. If you need additional tools, you can run commands inside the manylinux container. See [konstin/complex-manylinux-maturin-docker](https://github.com/konstin/complex-manylinux-maturin-docker) for a small educational example or [nanoporetech/fast-ctc-decode](https://github.com/nanoporetech/fast-ctc-decode/blob/b226ea0f2b2f4f474eff47349703d57d2ea4801b/.github/workflows/publish.yml) for a real world setup. ``` Usage: maturin build [OPTIONS] [ARGS]... Arguments: [ARGS]... Rustc flags Options: --strip [] Strip the library for minimum file size. Can be set to `true` or `false`, or used as a flag (`--strip` implies `true`) [env: MATURIN_STRIP=] [possible values: true, false] --sdist Build a source distribution and build wheels from it. This verifies that the source distribution is complete and can be used to build the project from source. --pgo Build with Profile-Guided Optimization (PGO). Requires `pgo-command` to be set in `[tool.maturin]` in pyproject.toml. This performs a three-phase build: instrumented build, profile training, and optimized rebuild. Can also be enabled via the MATURIN_PGO environment variable. [env: MATURIN_PGO=] -i, --interpreter [...] The python versions to build wheels for, given as the executables of interpreters such as `python3.9` or `/usr/bin/python3.8` -f, --find-interpreter Find interpreters from the host machine -b, --bindings Which kind of bindings to use [possible values: pyo3, pyo3-ffi, cffi, uniffi, bin] --compatibility [...] Control the platform tag and PyPI compatibility. This options offers both fine-grained control over the linux libc tag and a more automatic PyPI-compatibility option. The `pypi` option applies on all platforms and ensure that only tags that can be uploaded to PyPI are used. The linux-specific options are `manylinux` tags (for example `manylinux2014`/`manylinux_2_24`) or `musllinux` tags (for example `musllinux_1_2`), and `linux` for the native linux tag. They are ignored on non-linux platforms. Note that `manylinux1` and `manylinux2010` are unsupported by the rust compiler. Wheels with the native `linux` tag will be rejected by pypi, unless they are separately validated by `auditwheel`. The default is the lowest compatible `manylinux` tag, or plain `linux` if nothing matched. --auditwheel Audit wheel for manylinux compliance Possible values: - repair: Audit and repair wheel for manylinux compliance - check: Check wheel for manylinux compliance, but do not repair - warn: Audit wheel and warn about external libraries, but do not fail or repair - skip: Don't check for manylinux compliance --zig For manylinux targets, use zig to ensure compliance for the chosen manylinux version Default to manylinux2014/manylinux_2_17 if you do not specify an `--compatibility` Make sure you installed zig with `pip install maturin[zig]` -o, --out The directory to store the built wheels in. Defaults to a new "wheels" directory in the project's target directory --include-debuginfo Include debug info files (.pdb on Windows, .dSYM on macOS, .dwp on Linux) in the wheel. When enabled, maturin automatically configures split-debuginfo=packed so that separate debug info files are produced --sbom-include ... Additional SBOM files to include in the `.dist-info/sboms` directory. Can be specified multiple times -q, --quiet Do not print cargo log messages --ignore-rust-version Ignore `rust-version` specification in packages -v, --verbose... Use verbose output (-vv very verbose/build.rs output) --color Coloring: auto, always, never --config Override a configuration value (unstable) -Z Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details --future-incompat-report Outputs a future incompatibility report at the end of the build (unstable) --compression-method Zip compression method. Only Stored and Deflated are currently compatible with all package managers Possible values: - deflated: Deflate compression (levels 0-9, default 6) - stored: No compression - bzip2: BZIP2 compression (levels 0-9, default 6) - zstd: Zstandard compression (supported from Python 3.14; levels -7-22, default 3) [default: deflated] --compression-level Zip compression level. Defaults to method default --compression-enable-large-file-support Whether to use large file support for ZIP files. Defaults to false --generate-stubs Auto generate Python type stubs by introspecting the binary. Requires PyO3 and its "experimental-inspect" feature -h, --help Print help (see a summary with '-h') Compilation Options: -r, --release Build artifacts in release mode, with optimizations -j, --jobs Number of parallel jobs, defaults to # of CPUs --profile Build artifacts with the specified Cargo profile --target Build for the target triple [env: CARGO_BUILD_TARGET=] --target-dir Directory for all generated artifacts --timings= Timing output formats (unstable) (comma separated): html, json Feature Selection: -F, --features Space or comma separated list of features to activate --all-features Activate all available features --no-default-features Do not activate the `default` feature Manifest Options: -m, --manifest-path Path to Cargo.toml --frozen Require Cargo.lock and cache are up to date --locked Require Cargo.lock is up to date --offline Run without accessing the network ``` ## Source Distribution Maturin supports building through `pyproject.toml`. To use it, create a `pyproject.toml` next to your `Cargo.toml` with the following content: ```toml [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" ``` If a `pyproject.toml` with a `[build-system]` entry is present, maturin can build a source distribution of your package when `--sdist` is specified. The source distribution will contain the same files as `cargo package`. To only build a source distribution, use the `maturin sdist` command. You can then e.g. install your package with `pip install .`. With `pip install . -v` you can see the output of cargo and maturin. You can use the options `compatibility`, `skip-auditwheel`, `bindings`, `strip` and common Cargo build options such as `features` under `[tool.maturin]` the same way you would when running maturin directly. The `bindings` key is required for cffi and bin projects as those can't be automatically detected. Currently, all builds are in release mode (see [this thread](https://discuss.python.org/t/pep-517-debug-vs-release-builds/1924) for details). For a non-manylinux build with cffi bindings you could use the following: ```toml [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [tool.maturin] bindings = "cffi" compatibility = "linux" ``` `manylinux` option is also accepted as an alias of `compatibility` for backward compatibility with old version of maturin. To include arbitrary files in the sdist for use during compilation specify `include` as an array of `path` globs with `format` set to `sdist`: ```toml [tool.maturin] include = [{ path = "path/**/*", format = "sdist" }] ``` ## Cross Compiling Maturin has decent cross compilation support for `pyo3` and `bin` bindings, other kind of bindings may work but aren't tested regularly. ### Cross-compile to Linux/macOS #### Use Docker For manylinux support the [manylinux-cross](https://github.com/rust-cross/manylinux-cross) docker images can be used. And [maturin-action](https://github.com/PyO3/maturin-action) makes it easy to do cross compilation on GitHub Actions. #### Use Zig Since v0.12.7 maturin added support for linking with [`zig cc`](https://andrewkelley.me/post/zig-cc-powerful-drop-in-replacement-gcc-clang.html), compile for Linux works and is regularly tested on CI, other platforms may also work but aren't tested regularly. You can install zig following the [official documentation](https://ziglang.org/download), or install it from PyPI via `pip install ziglang`. Then pass `--zig` to maturin `build` or `publish` commands to use it, for example ```bash maturin build --release --target aarch64-unknown-linux-gnu --zig ``` For macOS targets, maturin passes the deployment target to zig. It uses the same version as the wheel tag: `MACOSX_DEPLOYMENT_TARGET`, or `macos-deployment-target` from `pyproject.toml`, or rustc's default. ### Cross-compile to Windows Pyo3 0.16.5 added an experimental feature `generate-import-lib` enables the user to cross compile extension modules for Windows targets without setting the `PYO3_CROSS_LIB_DIR` environment variable or providing any Windows Python library files. ```toml [dependencies] pyo3 = { version = "0.29.0", features = ["generate-import-lib"] } ``` It uses an external [`python3-dll-a`](https://docs.rs/python3-dll-a/latest/python3_dll_a/) crate to generate import libraries for the Python DLL for MinGW-w64 and MSVC compile targets. Note: MSVC targets require LLVM binutils or MSVC build tools to be available on the host system. More specifically, `python3-dll-a` requires `llvm-dlltool` or `lib.exe` executable to be present in `PATH` when targeting `*-pc-windows-msvc`. maturin integrates [`cargo-xwin`](https://github.com/messense/cargo-xwin) to enable MSVC targets cross compilation support, it will download and unpack the Microsoft CRT headers and import libraries, and Windows SDK headers and import libraries needed for compiling and linking automatically. **By using this to cross compiling to Windows MSVC targets you are consented to accept the license at [https://go.microsoft.com/fwlink/?LinkId=2086102](https://go.microsoft.com/fwlink/?LinkId=2086102)**. (Building on Windows natively does not apply.) ## GitHub Actions If your project uses GitHub Actions, you can use the `maturin generate-ci` command to generate a GitHub Actions workflow file. ```bash mkdir -p .github/workflows maturin generate-ci github > .github/workflows/CI.yml ``` There are some options to customize the generated workflow file: ``` Generate CI configuration Usage: maturin generate-ci [OPTIONS] Arguments: CI provider Possible values: - github: GitHub Options: -m, --manifest-path Path to Cargo.toml -v, --verbose... Use verbose output. * Default: Show build information and `cargo build` output. * `-v`: Use `cargo build -v`. * `-vv`: Show debug logging and use `cargo build -vv`. * `-vvv`: Show trace logging. You can configure fine-grained logging using the `RUST_LOG` environment variable. () -o, --output Output path [default: -] --platform ... Platform support [deprecated: use [tool.maturin.generate-ci.github."PLATFORM NAME"] in pyproject.toml] Possible values: - all: All - manylinux: Manylinux - musllinux: Musllinux - windows: Windows - macos: macOS - emscripten: Emscripten - android: Android --pytest Enable pytest [deprecated: use [tool.maturin.generate-ci.github] in pyproject.toml] --zig Use zig to do cross compilation [deprecated: use [tool.maturin.generate-ci.github] in pyproject.toml] --skip-attestation Skip artifact attestation [deprecated: use [tool.maturin.generate-ci.github] in pyproject.toml] -h, --help Print help (see a summary with '-h') ``` ### Using PyPI's trusted publishing By default, the workflow provided by `generate-ci` will publish the release artifacts to PyPI using API token authentication. However, maturin also supports [trusted publishing (OpenID Connect)](https://docs.pypi.org/trusted-publishers/). You can enable it by adding the following to your `pyproject.toml`: ```toml [tool.maturin.generate-ci.github] trusted-publishing = true # Optional: name of the GitHub Actions environment to use for the release job publishing-environment = "release" ``` When `trusted-publishing = true`, the generated workflow will run `uv publish --trusted-publishing always` and omit the `UV_PUBLISH_TOKEN` environment variable. Setting `publishing-environment` adds an `environment:` key to the release job; this is optional but recommended when you have configured a [GitHub Actions environment](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment) matching the environment name configured in PyPI's trusted publisher settings. Make sure to follow the steps listed in [PyPI's documentation](https://docs.pypi.org/trusted-publishers/adding-a-publisher/) to set up your GitHub repository as a trusted publisher in the PyPI project settings before attempting to run the workflow. maturin-1.16.0/guide/src/environment-variables.md000066400000000000000000000120231527064705700220110ustar00rootroot00000000000000# Environment Variables Maturin reads a number of environment variables which you can use to configure the build process. Here is a list of all environment variables that are read by maturin: ## Cargo environment variables See [environment variables Cargo reads](https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-reads) ## Python environment variables * `VIRTUAL_ENV`: Path to a Python virtual environment * `CONDA_PREFIX`: Path to a conda environment * `_PYTHON_SYSCONFIGDATA_NAME`: Name of a `sysconfigdata*.py` file * `MATURIN_PEP517_USE_BASE_PYTHON`: Use base Python executable instead of venv Python executable in PEP 517 build to avoid unnecessary rebuilds, should not be set when the sdist build requires packages installed in venv. ## PEP 517 build environment variables * `MATURIN_PEP517_ARGS`: Extra arguments passed to `maturin` during PEP 517 builds (e.g. `pip install .`). The value is parsed using shell-style splitting. For example: `MATURIN_PEP517_ARGS="--features foo --profile release"` * `MATURIN_NO_INSTALL_RUST`: If set, do not attempt to auto-install Rust via `puccinialin` when `cargo` is not found during PEP 517 builds. ### pip config-settings You can also pass extra maturin arguments via pip's `--config-settings` flag: ```bash pip install . --config-settings="build-args=--features foo" # or with the namespaced key pip install . --config-settings="maturin.build-args=--features foo" ``` Config-settings take priority over `MATURIN_PEP517_ARGS`; the environment variable is only used when no `build-args` config-setting is provided. ## Upload environment variables * `MATURIN_PYPI_TOKEN`: PyPI token for uploading wheels (token-based authentication) * `MATURIN_REPOSITORY`: The repository (package index) to upload the package to, defaults to `pypi` * `MATURIN_REPOSITORY_URL`: The URL of the registry where the wheels are uploaded to, overrides `MATURIN_REPOSITORY` * `MATURIN_USERNAME`: Username for pypi or your custom registry * `MATURIN_PASSWORD`: Password for pypi or your custom registry * `MATURIN_NON_INTERACTIVE`: Do not interactively prompt for username/password if the required credentials are missing ## `pyo3` environment variables * `PYO3_CROSS_PYTHON_VERSION`: Python version to use for cross compilation * `PYO3_CROSS_LIB_DIR`: This variable can be set to the directory containing the target's libpython DSO and the associated `_sysconfigdata*.py` file for Unix-like targets, or the Python DLL import libraries for the Windows target. * `PYO3_CONFIG_FILE`: Path to a [pyo3 config file](https://pyo3.rs/latest/building-and-distribution.html#advanced-config-files) ## Networking environment variables * `HTTP_PROXY` / `HTTPS_PROXY`: Proxy to use for HTTP/HTTPS requests * `MATURIN_CA_BUNDLE` / `REQUESTS_CA_BUNDLE` / `CURL_CA_BUNDLE`: Path to a CA bundle to use for HTTPS requests ## Other environment variables * `MACOSX_DEPLOYMENT_TARGET`: The minimum macOS version to target * `IPHONEOS_DEPLOYMENT_TARGET`: The minimum iOS version to target * `SOURCE_DATE_EPOCH`: The time to use for the timestamp in the wheel metadata * `MATURIN_PYEMSCRIPTEN_PLATFORM_VERSION` / `PYEMSCRIPTEN_PLATFORM_VERSION`: The [PEP 783](https://peps.python.org/pep-0783/) PyEmscripten platform version (e.g. `2025_0`) used to derive the `pyemscripten___wasm32` wheel platform tag. Pyodide exposes this via `sysconfig.get_config_var("PYEMSCRIPTEN_PLATFORM_VERSION")`; maturin also checks `pyodide config get pyemscripten_platform_version` when available. * `MATURIN_PYODIDE_ABI_VERSION` / `PYODIDE_ABI_VERSION`: Historical Pyodide ABI version variable name (e.g. `2025_0`) used to derive the PEP 783 `pyemscripten___wasm32` tag. Available via `pyodide config get pyodide_abi_version`. Pyodide previously referred to the same platform as `pyodide__`, but PyPI accepts the PEP 783 `pyemscripten_*` tag. * `MATURIN_EMSCRIPTEN_VERSION`: The version of emscripten to use for emscripten builds (legacy `emscripten__wasm32` tag, used for Pyodide ≤ 0.27 only). Prefer `MATURIN_PYEMSCRIPTEN_PLATFORM_VERSION` / `MATURIN_PYODIDE_ABI_VERSION` when possible — wheels built with the legacy tag are not installable on PEP 783-compliant runtimes. * `MATURIN_STRIP`: Strip the library for minimum file size * `MATURIN_PGO`: Build with Profile-Guided Optimization (same as `--pgo`), works with `maturin build`, `maturin develop` and PEP 517 builds (e.g. `pip install .`). Set to `0`, `false`, `no` or `off` to disable, any other value enables it * `MATURIN_NO_MISSING_BUILD_BACKEND_WARNING`: Suppress missing build backend warning * `MATURIN_USE_XWIN`: Set to `1` to force to use `xwin` for cross compiling even on Windows that supports native compilation * `ANDROID_API_LEVEL`: The Android API level to target when cross compiling for Android * `TARGET_SYSROOT`: The sysroot to use for auditwheel wheel when cross compiling * `ARCHFLAGS`: Flags to control the architecture of the build on macOS, for example you can use `ARCHFLAGS="-arch x86_64 -arch arm64"` to build universal2 wheels maturin-1.16.0/guide/src/import_hook.md000066400000000000000000000333751527064705700200460ustar00rootroot00000000000000# Import Hook [maturin_import_hook](https://pypi.org/project/maturin-import-hook/) provides a mechanism to automatically rebuild Maturin projects when they are imported by Python scripts. This reduces friction when developing mixed Python/Rust codebases because edits made to Rust components take effect automatically like edits to Python components do. Automatic rebuilding eliminates the possibility of Python code using outdated rust components, which often leads to confusing behaviour. The import hook can be configured to activate automatically as the interpreter starts or manually in individual scripts. Only Maturin packages installed editable mode (`maturin develop` or `pip install -e`) are considered by the import hook. When the build is up to date the overhead of the import hook is minimal. The hook has some additional features such as importing stand-alone `.rs` files. See [Features](#features) for a complete list. ## Installation Install the package with: ```shell $ pip install maturin_import_hook ``` Then install it into the current virtual environment with: ```shell $ python -m maturin_import_hook site install ``` This will activate the hook automatically as the interpreter starts. This command only has to be run once per virtual environment. To use `site install`, ensure you have write access to `site-packages`. Using a [virtual environment](https://docs.python.org/3/library/venv.html) is recommended rather than installing into the system interpreter. The managed site installation can be removed with: ```shell $ python -m maturin_import_hook site uninstall ``` To manually activate the import hook only for specific scripts instead of installing into the virtual environment see [Manual Activation](#manual-activation). ## Basic Configuration The site installation can be customized. For example, to build in release mode: ```shell $ python -m maturin_import_hook site install --args="--release" ``` The `--args` option accepts `maturin develop` arguments. For more options see `--help`. The site installation can also be edited manually. Use `python -m maturin_import_hook site info` to locate the `sitecustomize.py` file. See [Install Arguments](#install-arguments) for a list of arguments to `install()`. To avoid unnecessary rebuilds caused by irrelevant file modifications, create empty `.maturin_hook_ignore` files to manually ignore directories. Several directories and file types such as `target/` and `*.py` are ignored by default. If more customization is needed, see [Custom File Searching](#custom-file-searching). ## CLI The package provides a CLI for managing the build cache and site installation. For details, run: ```shell python -m maturin_import_hook --help ``` * `site (info | install | uninstall)` * Manage import hook installation in [`sitecustomize.py`](#sitecustomize) of the active environment. * `install` options: * `--force`: Whether to overwrite any existing managed import hook installation. * `--(no-)-project-importer`: Whether to enable the project importer. * `--(no-)-rs-file-importer`: Whether to enable the rs file importer. * `--(no-)-detect-uv`: Whether to automatically detect and use the `--uv` flag. * `--args`: The arguments to pass to `maturin`. * `--user`: whether to install into `usercustomize.py` instead of `sitecustomize.py`. * `cache (info | clear)` * Get info about the size and location of the build cache. * Manage the build cache of the active environment. * `version` * Show version info of the import hook and associated tools. Useful for providing information to bug reports. ## Features The import hook supports: * All the binding types and project layouts supported by Maturin. * All [CPython](https://www.python.org/) and [PyPy](https://pypy.org/) versions supported by Maturin. * Windows, Linux and MacOS. * Interactive environments such as [IPython](https://ipython.org/), [Jupyter](https://jupyter.org/) and [Python REPL](https://docs.python.org/3/tutorial/interpreter.html#interactive-mode). * Importing multiple Maturin projects in the same script. * Importing stand-alone `.rs` files that use `PyO3` bindings (see [Import Rust File](#import-rust-file)). * `importlib.reload()` (currently unsupported on Windows). * Detecting edits to path dependencies at any depth. * Multiple environments with different interpreters using isolated build caches. * Concurrent imports/builds from multiple scripts (useful for tools like [`pytest-xdist`](https://pypi.org/project/pytest-xdist/)) * Extensibility (see [Advanced Usage](#advanced-usage)). ## Manual Activation To activate the import hook in a single Python script, call `install()` at the top of the script: ```python import maturin_import_hook maturin_import_hook.install() # Must come first. Not active for imports above. import my_rust_package # An editable-installed Maturin project. import foo.my_rust_script # `foo/my_rust_script.rs` defines a pyo3 module. ``` The Maturin project importer and the Rust file importer can be used separately: ```python from maturin_import_hook import project_importer project_importer.install() from maturin_import_hook import rust_file_importer rust_file_importer.install() ``` The import hook can be configured to control its behaviour (see [Install Arguments](#install-arguments)). The import hook is intended for use in development environments and not for production environments, so any calls to `install()` should ideally be removed (or disabled, see [Environment Variables](#environment-variables)) before reaching production. This is another reason why the site installation is convenient. The hook remains active across multiple Python modules so a single `install()` at the top of the main module is sometimes sufficient. This can cause problems however, when the main module is not imported or not imported first, such as in tests. `install()` can be called in each module but be aware that each call replaces the previous settings. Tip: If you want to use non-defaults across multiple modules you can create a function like: ```python import maturin_import_hook _HOOK_INSTALLED = False def install_maturin_hook() -> None: global _HOOK_INSTALLED if not _HOOK_INSTALLED: maturin_import_hook.install( ... # your custom configuration here ) _HOOK_INSTALLED = True ``` Then call `install_maturin_hook()` at the top of each module. This will ensure the custom options are used everywhere without any code duplication. ## Import Rust File When a `.rs` file is imported, a Maturin project with [pyo3](https://pyo3.rs/) bindings will be created for it in the Maturin build cache and the resulting library will be built and loaded. For example, `my_extension.rs`: ```rust use pyo3::prelude::*; #[pyfunction] fn double(x: usize) -> usize { x * 2 } #[pymodule] fn my_extension(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_function(wrap_pyfunction!(double, m)?) } ``` The `#[pymodule]` must have the same name as the filename. The version of `pyo3` is determined by `maturin new --bindings pyo3`. ## Environment Variables The import hook can be disabled by setting `MATURIN_IMPORT_HOOK_ENABLED=0`. This can be used to disable the import hook in production while leaving calls to `install()` in place. Build files will be stored in an appropriate place for the current system but can be overridden by setting `MATURIN_BUILD_DIR`. These files can be deleted without causing any issues (unless a build is in progress). The precedence for storing build files is: * `MATURIN_BUILD_DIR` * (Each environment will store its cache in a subdirectory of the given path). * `/maturin_build_cache` * `/maturin_build_cache` * e.g. `~/.cache/maturin_build_cache` on POSIX. See the location being used with the CLI: `python -m maturin_import_hook cache info` ## Logging By default, the `maturin_import_hook` logger does not propagate to the root logger. This is so that `INFO` level messages are shown without having to configure logging (`INFO` level is normally not visible). The import hook also has extensive `DEBUG` level logging that would clutter application logs. So by not propagating, `DEBUG` messages from the import hook are not shown even if the root logger has `DEBUG` level visible. If you prefer, `maturin_import_hook.reset_logger()` can be called to undo the default configuration and propagate the messages as normal. When debugging issues with the import hook, you should first call `reset_logger()` then configure the root logger to show `DEBUG` messages. You can also run with the environment variable `RUST_LOG=maturin=debug` to get more information from Maturin. ```python import logging logging.basicConfig(format="%(asctime)s %(name)s [%(levelname)s] %(message)s", level=logging.DEBUG) import maturin_import_hook maturin_import_hook.reset_logger() maturin_import_hook.install() ``` ## Background ### Import Hook An [import hook](https://docs.python.org/3/reference/import.html#import-hooks) is a class added to [sys.meta_path](https://docs.python.org/3/library/sys.html#sys.meta_path) that is invoked by the Python interpreter whenever it encounters an `import` statement (or import via other means). `find_spec()` is called for each hook until one returns a `ModuleSpec` indicating that it found the module. If a hook cannot handle a particular import it returns `None`. Import hooks can be used to create modules on demand (e.g. the `.rs` importer) or trigger side-effects with imports (e.g. the project importer). [MaturinProjectImporter](https://github.com/PyO3/maturin-import-hook/blob/main/src/maturin_import_hook/project_importer.py): 1. Detects when an import corresponds to an editable installed Maturin project. 2. Determines if the current build of the project is up to date. 3. Rebuilds the project if necessary. [MaturinRustFileImporter](https://github.com/PyO3/maturin-import-hook/blob/main/src/maturin_import_hook/rust_file_importer.py): 1. Searches `sys.path` for an `.rs` file matching the import (e.g. for `import foo.bar`, the hook will look for `foo/bar.rs` at each search path). 2. Creates a temporary Maturin project for the `.rs` file or reuses the project if it already exists. 3. Rebuilds the project if necessary. The above steps are a simplification as supporting `importlib.reload()` requires more complex logic. See [reloading.md](https://github.com/PyO3/maturin-import-hook/blob/main/docs/reloading.md) for more details. ### Sitecustomize If a [sitecustomize.py](https://docs.python.org/3/library/site.html) file exists in the `site-packages` directory of a Python installation it is loaded automatically by the Python interpreter as it starts unless the `-S` flag is passed to it. This makes `sitecustomize.py` a convenient place to activate the import hook. ## Advanced Usage ### Install Arguments The arguments to `install()` are ([source](https://github.com/PyO3/maturin-import-hook/blob/main/src/maturin_import_hook/__init__.py)): ```python """ enable_project_importer: enable the hook for automatically rebuilding editable installed maturin projects enable_rs_file_importer: enable the hook for importing .rs files as though they were regular python modules enable_reloading: enable workarounds to allow the extension modules to be reloaded with `importlib.reload()` settings: settings corresponding to flags passed to maturin. build_dir: where to put the compiled artifacts. defaults to `$MATURIN_BUILD_DIR`, `sys.exec_prefix / 'maturin_build_cache'` or `$HOME/.cache/maturin_build_cache/` in order of preference force_rebuild: whether to always rebuild and skip checking whether anything has changed lock_timeout_seconds: a lock is required to prevent projects from being built concurrently. If the lock is not released before this timeout is reached the import hook stops waiting and aborts. A value of None means that the import hook will wait for the lock indefinitely. show_warnings: whether to show compilation warnings file_searcher: an object used to find source and installed project files that are used to determine whether a project has changed and needs to be rebuilt enable_automatic_install: whether to install detected packages using the import hook even if they are not already installed into the virtual environment or are installed in non-editable mode. """ ``` ### Subclassing The import hook classes can be subclassed to further customize to specific use cases. For example settings can be configured per-project or loaded from configuration files. ```python import sys from pathlib import Path from maturin_import_hook.settings import MaturinSettings from maturin_import_hook.project_importer import MaturinProjectImporter class CustomImporter(MaturinProjectImporter): def get_settings(self, module_path: str, source_path: Path) -> MaturinSettings: return MaturinSettings( release=True, strip=True, # ... ) sys.meta_path.insert(0, CustomImporter()) ``` ### Custom File Searching The `file_searcher` argument to `install()` can be used to customize which files should be included/excluded when deciding whether a package needs to be rebuilt: ```python from collections.abc import Iterator from pathlib import Path from maturin_import_hook.project_importer import ProjectFileSearcher, install class CustomFileSearcher(ProjectFileSearcher): def get_source_paths( self, project_dir: Path, all_path_dependencies: list[Path], installed_package_root: Path, ) -> Iterator[Path]: ... def get_installation_paths(self, installed_package_root: Path) -> Iterator[Path]: ... install(file_searcher=CustomFileSearcher()) ``` See `maturin_import_hook.project.DefaultProjectFileSearcher` for the default list of include/exclude criteria. The class variables of `DefaultProjectFileSearcher` can be edited **before** calling `install()` to make simple customizations. maturin-1.16.0/guide/src/index.md000066400000000000000000000046301527064705700166130ustar00rootroot00000000000000# Maturin User Guide Welcome to the maturin user guide! It contains examples and documentation to explain all of maturin's use cases in detail. Please choose from the chapters on the left to jump to individual topics, or continue below to start with maturin's README. ## Sponsors Development of maturin is made possible by the following sponsors: And many more who kindly sponsor @messense on [GitHub Sponsors](https://github.com/sponsors/messense#sponsors). {{#include ../../README.md}} maturin-1.16.0/guide/src/installation.md000066400000000000000000000051031527064705700202010ustar00rootroot00000000000000# Installation ## Install from package managers [![Packaging status](https://repology.org/badge/vertical-allrepos/maturin.svg?columns=4)](https://repology.org/project/maturin/versions) ### PyPI maturin is published as Python binary wheel to PyPI, you can install it using [pipx](https://pypa.github.io/pipx/): ```bash pipx install maturin ``` There are some extra dependencies for certain scenarios: * `zig`: use zig as linker for easier cross compiling and manylinux compliance. * `patchelf`: repair wheels that links other shared libraries. For example, to install patchelf dependencies: `pipx install maturin[patchelf]`. > **Note** > > `pip install maturin` should also work if you don't want to use pipx. ### Homebrew On macOS [maturin is in Homebrew](https://formulae.brew.sh/formula/maturin#default) and you can install maturin from Homebrew: ```bash brew install maturin ``` **Note**: Installing maturin with Homebrew will also install Rust as a dependency, even if you already have Rust installed via [rustup](https://www.rust-lang.org/tools/install). This results in two separate Rust installations, which can cause conflicts. If you've already installed Rust with `rustup`, consider installing maturin with a method other than Homebrew (such as from source with cargo). ### conda Installing from the `conda-forge` channel can be achieved by adding `conda-forge` to your conda channels with: ``` conda config --add channels conda-forge conda config --set channel_priority strict ``` Once the `conda-forge` channel has been enabled, `maturin` can be installed with: ``` conda install maturin ``` ### Alpine Linux On Alpine Linux, [maturin is in community repository](https://pkgs.alpinelinux.org/packages?name=maturin&branch=edge&repo=community) and can be installed with `apk` after [enabling the community repository](https://wiki.alpinelinux.org/wiki/Enable_Community_Repository): ```bash apk add maturin ``` ## Download from GitHub Releases You can download precompiled maturin binaries from the latest [GitHub Releases](https://github.com/PyO3/maturin/releases/latest). You can also use [cargo-binstall](https://github.com/cargo-bins/cargo-binstall) to install maturin from GitHub Releases: ```bash # Run `cargo install cargo-binstall` first if you don't have cargo-binstall installed. cargo binstall maturin ``` ## Build from source ### crates.io You can install maturin from [crates.io](https://crates.io/crates/maturin) using cargo: ```bash cargo install --locked maturin ``` ### Git repository ```bash cargo install --locked --git https://github.com/PyO3/maturin.git maturin ``` maturin-1.16.0/guide/src/local_development.md000066400000000000000000000121331527064705700211750ustar00rootroot00000000000000# Local Development ## `maturin develop` command For local development, the `maturin develop` command can be used to quickly build a package in debug mode by default and install it to virtualenv. Debug info files (.pdb, .dSYM, .dwp) are automatically included alongside the built artifact unless `--strip` is used. ``` Usage: maturin develop [OPTIONS] [ARGS]... Arguments: [ARGS]... Rustc flags Options: -b, --bindings Which kind of bindings to use [possible values: pyo3, pyo3-ffi, cffi, uniffi, bin] --pgo Build with Profile-Guided Optimization (PGO). Requires `pgo-command` to be set in `[tool.maturin]` in pyproject.toml. This performs a three-phase build: instrumented build, profile training, and optimized rebuild. Implies `--release` unless `--profile` is specified. Can also be enabled via the MATURIN_PGO environment variable. [env: MATURIN_PGO=] --strip Strip the library for minimum file size -E, --extras Install extra requires aka. optional dependencies Use as `--extras=extra1,extra2` -G, --group Install dependency groups defined in pyproject.toml (PEP 735) Use as `--group=test,docs` --skip-install Skip installation, only build the extension module inplace Only works with mixed Rust/Python project layout --pip-path Use a specific pip installation instead of the default one. This can be used to supply the path to a pip executable when the current virtualenv does not provide one. -q, --quiet Do not print cargo log messages --ignore-rust-version Ignore `rust-version` specification in packages -v, --verbose... Use verbose output (-vv very verbose/build.rs output) --color Coloring: auto, always, never --config Override a configuration value (unstable) -Z Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details --future-incompat-report Outputs a future incompatibility report at the end of the build (unstable) --uv Use `uv` to install packages instead of `pip` --compression-method Zip compression method. Only Stored and Deflated are currently compatible with all package managers Possible values: - deflated: Deflate compression (levels 0-9, default 6) - stored: No compression - bzip2: BZIP2 compression (levels 0-9, default 6) - zstd: Zstandard compression (supported from Python 3.14; levels -7-22, default 3) [default: deflated] --compression-level Zip compression level. Defaults to method default --compression-enable-large-file-support Whether to use large file support for ZIP files. Defaults to false --generate-stubs Auto generate Python type stubs by introspecting the binary. Requires PyO3 and its "experimental-inspect" feature -h, --help Print help (see a summary with '-h') Compilation Options: -r, --release Pass --release to cargo -j, --jobs Number of parallel jobs, defaults to # of CPUs --profile Build artifacts with the specified Cargo profile --target Build for the target triple [env: CARGO_BUILD_TARGET=] --target-dir Directory for all generated artifacts --timings= Timing output formats (unstable) (comma separated): html, json Feature Selection: -F, --features Space or comma separated list of features to activate --all-features Activate all available features --no-default-features Do not activate the `default` feature Manifest Options: -m, --manifest-path Path to Cargo.toml --frozen Require Cargo.lock and cache are up to date --locked Require Cargo.lock is up to date --offline Run without accessing the network ``` ## PEP 660 Editable Installs Maturin supports [PEP 660](https://www.python.org/dev/peps/pep-0660/) editable installs since v0.12.0. You need to add `maturin` to `build-system` section of `pyproject.toml` to use it: ```toml [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" ``` Editable installs can be used with mixed Rust/Python projects so you don't have to recompile and reinstall when only Python source code changes. They can also be used with mixed and pure projects together with the [import hook](./import_hook.md) so that recompilation/re-installation occurs automatically when Python or Rust source code changes. To install a package in editable mode with pip: ```bash cd my-project pip install -e . ``` or ```bash cd my-project maturin develop ``` Then Python source code changes will take effect immediately because the interpreter looks for the modules directly in the project source tree. maturin-1.16.0/guide/src/metadata.md000066400000000000000000000103041527064705700172570ustar00rootroot00000000000000# Python Project Metadata maturin supports [PEP 621](https://www.python.org/dev/peps/pep-0621/), you can specify python package metadata in `pyproject.toml`. maturin merges metadata from `Cargo.toml` and `pyproject.toml`, `pyproject.toml` takes precedence over `Cargo.toml`. Here is a `pyproject.toml` example from PEP 621 for reference purpose: ```toml [project] name = "spam" version = "2020.0.0" description = "Lovely Spam! Wonderful Spam!" readme = "README.rst" requires-python = ">=3.8" license = {file = "LICENSE.txt"} keywords = ["egg", "bacon", "sausage", "tomatoes", "Lobster Thermidor"] authors = [ {email = "hi@pradyunsg.me"}, {name = "Tzu-Ping Chung"} ] maintainers = [ {name = "Brett Cannon", email = "brett@python.org"} ] classifiers = [ "Development Status :: 4 - Beta", "Programming Language :: Python" ] dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'" ] [project.optional-dependencies] test = [ "pytest < 5.0.0", "pytest-cov[all]" ] [project.urls] homepage = "example.com" documentation = "readthedocs.org" repository = "github.com" changelog = "github.com/me/spam/blob/master/CHANGELOG.md" [project.scripts] spam-cli = "spam:main_cli" [project.gui-scripts] spam-gui = "spam:main_gui" [project.entry-points."spam.magical"] tomatoes = "spam:main_tomatoes" ``` ## Dynamic metadata Maturin has limited support for [dynamic metadata](https://packaging.python.org/en/latest/specifications/pyproject-toml/#dynamic) in `pyproject.toml`. When the `[project]` section is not present, maturin will populate metadata from `Cargo.toml` with the following fields: * `name` - From `package.name` in Cargo.toml * `version` - From `package.version` in Cargo.toml (converted from SemVer to PEP 440 format) * `summary` - From `package.description` in Cargo.toml, with line breaks joined into one line * `description` - From the contents of the README file specified in Cargo.toml's `package.readme` * `description_content_type` - Set based on the README file extension (e.g. `text/markdown` for `.md` files) * `keywords` - From `package.keywords` in Cargo.toml, joined with commas * `home_page` - From `package.homepage` in Cargo.toml * `author` - From `package.authors` in Cargo.toml, joined with commas * `author_email` - From `package.authors` in Cargo.toml if it contains email addresses * `license` - From `package.license` in Cargo.toml * `project_url` - From various URLs in Cargo.toml (like repository, homepage, etc.) When the `[project]` section is present in `pyproject.toml`, it must contain at least the `name` field. Maturin will then merge metadata from `Cargo.toml` and `pyproject.toml`, `pyproject.toml` takes precedence over `Cargo.toml`. Per specification, maturin is not allowed to populate fields that are not present in `project.dynamic` list when the `[project]` section is present. For example, to use the Rust crate version as the Python package version, you need to add `version` to the `project.dynamic` list. To use `package.homepage` from `Cargo.toml`, add `urls` to `project.dynamic` and so forth: ```toml [project] name = "my-awesome-project" dynamic = [ "version", "description", "readme", "urls", "authors", "license", "keywords", ] ``` ## Add Python dependencies To specify python dependencies, add a list `dependencies` in a `[project]` section in the `pyproject.toml`. This list is equivalent to `install_requires` in setuptools: ```toml [project] name = "my-project" dependencies = ["flask~=1.1.0", "toml==0.10.0"] ``` ## Add console scripts Pip allows adding so called console scripts, which are shell commands that execute some function in your program. You can add console scripts in a section `[project.scripts]`. The keys are the script names while the values are the path to the function in the format `some.module.path:class.function`, where the `class` part is optional. The function is called with no arguments. Example: ```toml [project.scripts] get_42 = "my_project:DummyClass.get_42" ``` ## Add trove classifiers You can also specify [trove classifiers](https://pypi.org/classifiers/) under `project.classifiers`: ```toml [project] name = "my-project" classifiers = ["Programming Language :: Python"] ``` maturin-1.16.0/guide/src/migration.md000066400000000000000000000072121527064705700174740ustar00rootroot00000000000000# Migrating from older maturin versions This guide can help you upgrade code through breaking changes from one maturin version to the next. For a detailed list of all changes, see the [CHANGELOG](changelog.md). ## From 0.14.* to 0.15 ### Build with `--no-default-features` by default when bootstrapping from sdist When bootstrapping maturin from sdist, maturin 0.15 will build with `--no-default-features` by default, which means that for distro packaging, you might want to set the environment variable `MATURIN_SETUP_ARGS="--features full,rustls"` to enable full features. ### Remove `[tool.maturin.sdist-include]` Use `[tool.maturin.include]` option instead. ### Remove `[package.metadata.maturin]` from `Cargo.toml` Package metadata is now specified in `[tool.maturin]` section of `pyproject.toml` instead of `Cargo.toml`. Note that the replacement for `package.metadata.maturin.name` is `tool.maturin.module-name`. ### Require `uniffi-bindgen` CLI to building `uniffi` bindings maturin 0.15 requires `uniffi-bindgen` CLI to build `uniffi` bindings, you can install it with `pip install uniffi-bindgen`. ## From 0.13.* to 0.14 ### Remove support for specifying python package metadata in `Cargo.toml` maturin 0.14 removed support for specifying python package metadata in `Cargo.toml`, Python package metadata should be specified in the `project` section of `pyproject.toml` instead as [PEP 621](https://peps.python.org/pep-0621/) specifies. ### Deprecate `[tool.maturin.sdist-include]` maturin 0.14 added `[tool.maturin.include]` and `[tool.maturin.exclude]` to replace `[tool.maturin.sdist-include]` which was sdist only, the new options can be configured to apply to sdist and/or wheel. ### macOS deployment target version defaults what `rustc` supports If you don't set the `MACOSX_DEPLOYMENT_TARGET` environment variable, maturin 0.14 will use the default target version acquired from `rustc`, this may cause build issue for projects that depend on C/C++ code, usually you can fix it by setting a correct `MACOSX_DEPLOYMENT_TARGET`, for example ```bash export MACOSX_DEPLOYMENT_TARGET=10.9 ``` ### Deprecate `python-source` option in `Cargo.toml` maturin 0.14 deprecated the `python-source` option in `Cargo.toml`, use `[tool.maturin.python-source]` option in `pyproject.toml` instead. ## From 0.12.* to 0.13 ### Drop support for Python 3.6 maturin 0.13 has dropped support for Python 3.6, to support Python 3.6 you can use the old 0.12 versions. ### Removed `--cargo-extra-args` and `--rustc-extra-args` maturin 0.13 added most of the `cargo rustc` options so you can just use them directly, for example `--cargo-extra-args="--no-default-features"` becomes `--no-default-features`. To pass extra arguments to rustc, add them after `--`, for example use `maturin build -- -Clink-arg=-s` instead of `--rustc-extra-args="-Clink-arg=-s"`. ### Source distributions are not built by default maturin 0.13 replaced `--no-sdist` with the new `--sdist` option in `maturin build` command, source distributions are now only built when `--sdist` is specified. ### Only build wheels for current Python interpreter in `PATH` by default maturin 0.13 no longer searches for Python interpreters by default and only build wheels for the current Python interpreter (i.e. `python3`) in `PATH`. To enable the old behavior, use the new `--find-interpreter` option. ### `--repository-url` only accepts full URL now Previously `--repository-url` option in `maturin upload` and `maturin publish` commands accepts both repository name and URL. maturin 0.13 changed `--repository-url` to only accept full URL and added a new `--repository` for the repository name. This new behavior matches `twine upload`. maturin-1.16.0/guide/src/platform_support.md000066400000000000000000000040041527064705700211170ustar00rootroot00000000000000# Platform Support Being built on cargo and rustc, maturin is limited by [rust's platform support](https://doc.rust-lang.org/nightly/rustc/platform-support.html). ## Automated tests On GitHub actions, windows, macOS and linux are tested, all on 64-bit x86. FreeBSD is also tested though Cirrus CI, but might get removed at some point. Since CI is very time intensive to maintain, I'd like to stick to GitHub action and these three platforms. ## Releases The following targets are built into wheels and downloadable binaries: * Windows: 32-bit and 64-bit x86 as well as arm64 * Linux: x86, x86_64, armv7, aarch64 and ppc64le (musl), as well as s390x (gnu) * macOS: x86_64 and aarch64 ## Other Operating Systems It should be possible to build maturin and for maturin to build wheels on other platforms supported by rust. To add a new os, add it in target.rs and, if it doesn't behave like the other unixes, in `PythonInterpreter::get_tag`. Please also submit the output of `python -m sysconfig` as a file in the `sysconfig` folder. It's ok to edit setup.py to deactivate default features so `pip install` works, but new platforms should not require complex workaround in `compile.rs`. ## Architectures All architectures included in manylinux (aarch64, armv7l, ppc64le, ppc64, i686, x86_64, s390x) are supported. I'm not sure whether it makes sense to allow architectures that aren't even supported by [manylinux](https://github.com/pypa/manylinux). ## Python Support CPython 3.8 to 3.14 are supported and tested on CI, though the entire 3.x series should work. This will be changed as new python versions are released and others have their end of life. PyPy 3.8 and later also works, as does GraalPy 23.0 and later. ## Manylinux/Musllinux `manylinux2014` and its newer versions as well as `musllinux_1_1` and its newer versions are supported. Since Rust and the manylinux project drop support for old manylinux/musllinux versions sometimes, after maturin 1.0 manylinux version bumps will be minor versions rather than major versions. maturin-1.16.0/guide/src/project_layout.md000066400000000000000000000164701527064705700205540ustar00rootroot00000000000000# Project Layout Maturin expects a particular project layout depending on the contents of the package. ## Declare a minimum supported Rust version For packages intended for distribution, declare the minimum supported Rust version (MSRV) with `package.rust-version` in `Cargo.toml`: ```toml [package] name = "my-project" version = "0.1.0" edition = "2021" rust-version = "1.74" ``` Set `rust-version` to the oldest Rust toolchain your project supports. Cargo uses this value both to give users a clear error on unsupported toolchains and to choose a compatible `Cargo.lock` format. This matters for source distributions: Cargo 1.83 and later default to lockfile format v4, which Rust versions before 1.78 cannot read. See Cargo's [`rust-version` documentation](https://doc.rust-lang.org/cargo/reference/rust-version.html) for details. ## Pure Rust project For a pure Rust project, the structure is as expected and what you get from `cargo new`: ``` my-rust-project/ ├── Cargo.toml ├── pyproject.toml # required for maturin configuration └── src ├── lib.rs # default for library crates └── main.rs # default for binary crates ``` Maturin will add a necessary `__init__.py` to the package when building the wheel. For convenience, this file includes the following: ```python from .my_project import * __doc__ = my_project.__doc__ if hasattr(my_project, "__all__"): __all__ = my_project.__all__ ``` such that the module functions may be called directly with: ```python import my_project my_project.foo() ``` rather than: ```python from my_project import my_project ``` > **Note**: there is currently no way to tell maturin to include extra data (e.g. `package_data` in setuptools) for a pure Rust project. Instead, consider using the layout described below for the mixed Rust/Python project. ## Mixed Rust/Python project To create a mixed Rust/Python project, add a directory with your package name (i.e. matching `lib.name` in your `Cargo.toml`) to contain the Python source: ``` my-rust-and-python-project ├── Cargo.toml ├── my_project # <<< add this directory and put Python code in here │ ├── __init__.py │ └── bar.py ├── pyproject.toml ├── README.md └── src └── lib.rs ``` Note that in a mixed Rust/Python project, maturin _does not_ modify the existing `__init__.py` in the root package, so now to import the rust module in Python you must use: ```python from my_project import my_project ``` You can modify `__init__.py` yourself (see above) if you would like to import Rust functions from a higher-level namespace. You can specify a different python source directory in `pyproject.toml` by setting `tool.maturin.python-source`, for example **pyproject.toml** ```toml [tool.maturin] python-source = "python" ``` then the project structure would look like this: ``` my-rust-and-python-project ├── Cargo.toml ├── python │ └── my_project │ ├── __init__.py │ └── bar.py ├── pyproject.toml ├── README.md └── src    └── lib.rs ``` > **Note** > > This structure is recommended to avoid [a common `ImportError` pitfall](https://github.com/PyO3/maturin/issues/490) ### Alternate Python source directory (src layout) Having a directory with `package_name` in the root of the project can occasionally cause confusion as Python allows importing local packages and modules. A popular way to avoid this is with the `src`-layout, where the Python package is nested within a `src` directory. Unfortunately this interferes with the structure of a typical Rust project. Fortunately, Python is not particular about the name of the parent source directory. maturin will detect the following src layout automatically: ``` my-rust-and-python-project ├── src # put python code in src folder │ └── my_project │ ├── __init__.py │ └── bar.py ├── pyproject.toml ├── README.md └── rust # put rust code in rust folder |── Cargo.toml └── src └── lib.rs ``` #### Import Rust as a submodule of your project If the Python module created by Rust has the same name as the Python package in a mixed Rust/Python project, IDEs might get confused. You might also want to discourage end users from using the Rust functions directly by giving it a different name, say '\_my_project'. This can be done by adding `module-name = .` to the `[tool.maturin]` in your `pyproject.toml`. For example: ```toml [tool.maturin] module-name = "my_project._my_project" ``` Update the module name in `lib.rs` to match the expected module name: ```diff #[pymodule] - fn my_project(...) + fn _my_project(...) ``` If you are using the `pyo3` bindings, you can alternatively add `#[pyo3(name = ...)]` to the `#[pymodule]` declaration: ```diff #[pymodule] + #[pyo3(name = "_my_project")] fn my_project(...) ``` You can then import your Rust module inside your Python source as follows: ```python from my_project import _my_project ``` IDEs can then recognize the `_my_project` module as separate from your main Python source module. This allows for code completion of the types inside your Rust Python module for certain IDEs. ## Adding Python type information To distribute typing information, you need to add: * an empty marker file called `py.typed` in the root of the Python package * inline types in Python files and/or `.pyi` "stub" files In a pure Rust project, add type stubs in a `.pyi` file in the project root. Maturin will automatically include this file along with the required `py.typed` file for you. ``` my-rust-project/ ├── Cargo.toml ├── my_project.pyi # <<< add type stubs for Rust functions in the my_project module here ├── pyproject.toml └── src └── lib.rs ``` In a mixed Rust/Python project, additional files in the Python source dir (but not in `.gitignore`) will be automatically included in the build outputs (source distribution and/or wheel). Type information can be therefore added to the root Python package directory as you might do in a pure Python package. This requires you to add the `py.typed` marker file yourself. ``` my-project ├── Cargo.toml ├── python │ └── my_project │ ├── __init__.py │ ├── py.typed # <<< add this empty file │ ├── my_project.pyi # <<< add type stubs for Rust functions in the my_project module here │ ├── bar.pyi # <<< add type stubs for bar.py here OR type bar.py inline │ └── bar.py ├── pyproject.toml ├── README.md └── src └── lib.rs ``` ## Data You can add wheel data by creating a `.data` folder or setting its location as `data` in pyproject.toml under `[tool.maturin]` or in Cargo.toml under `[project.metadata.maturin]`. The data folder may have the following subfolder: * `data`: The contents of this folder will simply be unpacked into the virtualenv * `scripts`: Treated similar to entry points, files in there are installed as standalone executable * `headers`: For `.h` C header files * `purelib`: This also exists, but seems to be barely used * `platlib`: This also exists, but seems to be barely used If you add a symlink in the data directory, we'll include the actual file so you have more flexibility. maturin-1.16.0/guide/src/sbom.md000066400000000000000000000104031527064705700164370ustar00rootroot00000000000000# SBOM (Software Bill of Materials) Maturin can automatically generate [CycloneDX](https://cyclonedx.org/) SBOMs and include them in the built wheel under the `.dist-info/sboms/` directory, following the convention described in [PEP 770](https://peps.python.org/pep-0770/). ## Overview Three kinds of SBOMs can be included in a wheel: | Kind | File in wheel | Description | |---|---|---| | **Rust** | `/sboms/.cyclonedx.json` | CycloneDX 1.5 SBOM of the Rust dependency tree, generated via `cargo-cyclonedx`. | | **Auditwheel** | `/sboms/auditwheel.cdx.json` | CycloneDX 1.4 SBOM listing the OS packages (deb/rpm/apk) that provided shared libraries grafted during `auditwheel` repair. | | **Custom** | `/sboms/` | Any additional SBOM files you provide. | ## Requirements The **Rust** and **Auditwheel** SBOMs require the `sbom` Cargo feature, which is included in the `full` feature set and enabled by default. If you installed maturin from PyPI or a pre-built binary, SBOM support is already available. If you build maturin from source without default features, enable it with: ```bash cargo install maturin --features sbom ``` **Custom** SBOM includes work regardless of the `sbom` feature. ## Configuration SBOM generation is configured in the `[tool.maturin.sbom]` section of `pyproject.toml`: ```toml [tool.maturin.sbom] # Generate a CycloneDX SBOM for the Rust dependency tree. # Defaults to true when the sbom feature is enabled. rust = true # Generate a CycloneDX SBOM for external shared libraries grafted during # auditwheel repair. Defaults to true when repair copies libraries. auditwheel = true # Additional SBOM files to include in the wheel. # Paths are relative to the project root. include = ["sboms/vendor.cdx.json", "sboms/license-report.spdx.json"] ``` All three keys are optional. When the section is omitted entirely, the defaults apply (Rust and auditwheel SBOMs are generated automatically). ### Disabling SBOM generation To disable Rust SBOM generation: ```toml [tool.maturin.sbom] rust = false ``` To disable the auditwheel SBOM: ```toml [tool.maturin.sbom] auditwheel = false ``` ## Rust SBOM When enabled, maturin uses [`cargo-cyclonedx`](https://github.com/CycloneDX/cyclonedx-rust-cargo) to produce a CycloneDX 1.5 SBOM that captures the full transitive dependency graph of the crate being built. The SBOM is generated once per build and reused across all wheels (the Rust dependency graph does not change per Python interpreter). The output file is named `.cyclonedx.json` and placed in the `.dist-info/sboms/` directory. ## Auditwheel SBOM On Linux, when maturin repairs a wheel by copying external shared libraries into it (the `auditwheel = "repair"` mode), it can also generate a CycloneDX 1.4 SBOM that records which OS packages provided those libraries. It queries the system package manager (`dpkg`, `rpm`, or `apk`) to determine the package name, version, and PURL for each grafted library. The output file is named `auditwheel.cdx.json` and placed in the `.dist-info/sboms/` directory. ## Custom SBOM includes You can bundle arbitrary SBOM files (any format) into the wheel using the `include` option. Paths are resolved relative to the project root and must not escape it. Each included file must have a unique filename. ```toml [tool.maturin.sbom] include = [ "sboms/third-party.cdx.json", "sboms/licenses.spdx.json", ] ``` ### CLI argument Additional SBOM files can also be included via the `--sbom-include` CLI argument, which is useful when you only want to include SBOMs in certain environments (e.g. CI) without modifying `pyproject.toml`: ```bash maturin build --sbom-include sboms/ci-report.cdx.json # Multiple files at once maturin build --sbom-include sboms/a.cdx.json sboms/b.cdx.json # Or repeated flags maturin build --sbom-include sboms/a.cdx.json --sbom-include sboms/b.cdx.json ``` Paths from `--sbom-include` are merged with any `include` paths in `pyproject.toml` and deduplicated. ## Inspecting SBOMs in a wheel After building a wheel, you can inspect the included SBOMs by unzipping it: ```bash maturin build --release unzip -l target/wheels/*.whl | grep sboms/ ``` Or extract a specific SBOM: ```bash unzip -p target/wheels/*.whl '*.dist-info/sboms/*.json' | python -m json.tool ``` maturin-1.16.0/guide/src/sphinx.md000066400000000000000000000062061527064705700170160ustar00rootroot00000000000000# Sphinx Documentation Integration Sphinx is a popular documentation generator in Python community. It's commonly used together with services like [Read The Docs](https://readthedocs.org/) which automates documentation building, versioning, and hosting for you. Usually in a pure Python project setting up Sphinx is easy, just follow the [quick start](https://www.sphinx-doc.org/en/master/usage/quickstart.html) of Sphinx documentation is enough. But it can get complicated when Rust based Python extension modules are involved. With maturin, first you need to make sure you have added a `pyproject.toml` and properly configured it to build source distributions, for example a minimal configuration below: ```toml [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" ``` With this `pip install .` should work when invoked in the project directory. ## Read The Docs Integration To build documentation on [Read The Docs](https://readthedocs.org/), you need to tell it to install the Rust compiler and Python interpreter in its build environment, you can do it by adding a `.readthedocs.yaml` in your project root: ```yaml # https://docs.readthedocs.io/en/stable/config-file/v2.html#supported-settings version: 2 sphinx: builder: html build: os: "ubuntu-20.04" tools: python: "3.9" rust: "1.55" python: install: - method: pip path: . ``` If you're using a mixed Rust/Python project layout, make sure you didn't add the Python project path to `sys.path` in `conf.py` of Sphinx. Read The Docs doesn't install your project in editable mode, adding it to `sys.path` will make your project fail to import which breaks documentation generation. If you need to install a specific version of Sphinx or adding Sphinx themes/extensions, you can change the `python.install` section a bit to add an extra installation step, for example: ```yaml python: install: - requirements: docs/requirements.txt - method: pip path: . ``` In `docs/requirements.txt` you can add some Python package requirements you needs build the documentation. ## Netlify Integration [Netlify](https://www.netlify.com/) is another popular automated site hosting service that can be used with Sphinx and other documentation tools. Netlify configuration can be specified in a `.netlify.toml` file. Assuming your Sphinx documentation files are placed in `docs/` directory, a minimal configurationfor maturin based project can be: ```toml [build] base = "docs" publish = "_build/html" command = "maturin develop -m ../Cargo.toml && make html" ``` You also need to add a `rust-toolchain` file at `docs/rust-toolchain` which netlify will use to install the specified Rust toolchain that maturin needs to compile your project. For Sphinx which is written in Python to run you need to add a `runtime.txt` at `docs/runtime.txt`, its content should be a Python interpreter version for example `3.8`. Then a `requirements.txt` file at `docs/requirements.txt` is needed to install Sphinx and its dependencies, you can generate one by: ```bash python3 -m venv venv source venv/bin/activate python3 -m pip install sphinx python3 -m pip freeze > docs/requirements.txt ``` maturin-1.16.0/guide/src/tutorial.md000066400000000000000000000236701527064705700173540ustar00rootroot00000000000000# Tutorial In this tutorial we will wrap a version of [the guessing game from The Rust Book](https://doc.rust-lang.org/book/ch02-00-guessing-game-tutorial.html) to run in Python using pyo3. ## Create a new Rust project First, create a new Rust library project using `cargo new --lib --edition 2021 guessing-game`. This will create a directory with the following structure. ```ignore guessing-game/ ├── Cargo.toml └── src └── lib.rs ``` Edit `Cargo.toml` to configure the project and module name, and add the dependencies (`rand` and `pyo3`). Configure `pyo3` with additional features to make an extension module compatible with multiple Python versions using the stable ABI (`abi3`). ```toml [package] name = "guessing-game" version = "0.1.0" edition = "2021" [lib] name = "guessing_game" # "cdylib" is necessary to produce a shared library for Python to import from. crate-type = ["cdylib"] [dependencies] rand = "0.9.0" [dependencies.pyo3] version = "0.29.0" # "abi3-py38" tells pyo3 (and maturin) to build using the stable ABI with minimum Python version 3.8 features = ["abi3-py38"] ``` Add a `pyproject.toml` to configure [PEP 518](https://peps.python.org/pep-0518/) build system requirements. ```toml [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" ``` If you are using pyo3 0.26 or earlier you need to enable the `extension-module` feature of pyo3 to skip linking against libpython.so (this is automatically done in pyo3 0.27): ```toml [tool.maturin] features = ["pyo3/extension-module"] ``` ### Use `maturin new` New projects can also be quickly created using the `maturin new` command: ```bash maturin new --help Create a new cargo project Usage: maturin new [OPTIONS] Arguments: Project path Options: --name Set the resulting package name, defaults to the directory name -v, --verbose... Use verbose output. * Default: Show build information and `cargo build` output. * `-v`: Use `cargo build -v`. * `-vv`: Show debug logging and use `cargo build -vv`. * `-vvv`: Show trace logging. You can configure fine-grained logging using the `RUST_LOG` environment variable. () --mixed Use mixed Rust/Python project layout --src Use Python first src layout for mixed Rust/Python project -b, --bindings Which kind of bindings to use [possible values: pyo3, cffi, uniffi, bin] -h, --help Print help (see a summary with '-h') ``` The above process can be achieved by running `maturin new -b pyo3 guessing_game` then edit `Cargo.toml` to add `abi3-py38` feature. ## Install and configure maturin (in a virtual environment) Create a virtual environment and install maturin. Note maturin has minimal dependencies! ```shell ferris@rustbox [~/src/rust/guessing-game] % python3 -m venv .venv ferris@rustbox [~/src/rust/guessing-game] % source .venv/bin/activate (.venv) ferris@rustbox [~/src/rust/guessing-game] % pip install -U pip maturin (.venv) ferris@rustbox [~/src/rust/guessing-game] % pip freeze maturin==1.3.0 tomli==2.0.1 ``` maturin is configured in `pyproject.toml` as introduced by [PEP 518](https://www.python.org/dev/peps/pep-0518/). This file lives in the root of your project tree: ```ignore guessing-game/ ├── Cargo.toml ├── pyproject.toml # <<< add this file └── src └── lib.rs ``` Configuration in this file is quite simple for most projects. You just need to indicate maturin as a requirement (and restrict the version) and as the build-backend (Python supports a number of build-backends since [PEP 517](https://www.python.org/dev/peps/pep-0517/)). ```toml [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" ``` Various other tools may also be configured in `pyproject.toml` and the Python community seems to be consolidating declarative configuration in this file. ## Program the guessing game in Rust When you create a `lib` project with `cargo new` it creates a file `src/lib.rs` with some default code. Edit that file and replace the default code with the code below. As mentioned, we will implement a slightly modified version of [the guessing game from The Rust Book](https://doc.rust-lang.org/book/ch02-00-guessing-game-tutorial.html). Instead of implementing as a `bin` crate, we're using a `lib` and will expose the main logic as a Python function. ```rust,no_run use pyo3::prelude::*; use rand::Rng; use std::cmp::Ordering; use std::io; #[pyfunction] fn guess_the_number() { println!("Guess the number!"); let secret_number = rand::rng().random_range(1..101); loop { println!("Please input your guess."); let mut guess = String::new(); io::stdin() .read_line(&mut guess) .expect("Failed to read line"); let guess: u32 = match guess.trim().parse() { Ok(num) => num, Err(_) => continue, }; println!("You guessed: {}", guess); match guess.cmp(&secret_number) { Ordering::Less => println!("Too small!"), Ordering::Greater => println!("Too big!"), Ordering::Equal => { println!("You win!"); break; } } } } /// A Python module implemented in Rust. The name of this function must match /// the `lib.name` setting in the `Cargo.toml`, else Python will not be able to /// import the module. #[pymodule] fn guessing_game(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_function(wrap_pyfunction!(guess_the_number, m)?)?; Ok(()) } ``` Thanks to pyo3, there's very little difference between this and the example in The Rust Book. All we had to do was: 1. Include the pyo3 prelude 2. Add `#[pyfunction]` to our function 3. Add the `#[pymodule]` block to expose the function as part of a Python module Refer to the [pyo3 User Guide](https://pyo3.rs/) for more information on using pyo3. It can do a lot more! ## Build and install the module with `maturin develop` Note that _this is just a Rust project_ at this point, and with few exceptions you can build it as you'd expect using `cargo build`. maturin helps with this, however, adding some platform-specific build configuration and ultimately packaging the binary results as a wheel (a `.whl` file, which is an archive of compiled components suitable for installation with `pip`, the Python package manager). So let's use maturin to build and install in our current environment. You can also compile a performance-optimized program by adding the `-r` or `--release` flag for speed testing. ```shell (.venv) ferris@rustbox [~/src/rust/guessing-game] % maturin develop 🔗 Found pyo3 bindings with abi3 support for Python ≥ 3.8 ðŸ�� Not using a specific python interpreter (With abi3, an interpreter is only required on windows) Compiling pyo3-build-config v0.23.1 Compiling libc v0.2.119 Compiling once_cell v1.10.0 Compiling cfg-if v1.0.0 Compiling proc-macro2 v1.0.36 Compiling unicode-xid v0.2.2 Compiling syn v1.0.86 Compiling parking_lot_core v0.8.5 Compiling smallvec v1.8.0 Compiling scopeguard v1.1.0 Compiling unindent v0.1.8 Compiling ppv-lite86 v0.2.16 Compiling instant v0.1.12 Compiling lock_api v0.4.6 Compiling indoc v1.0.4 Compiling getrandom v0.2.5 Compiling rand_core v0.6.3 Compiling parking_lot v0.11.2 Compiling rand_chacha v0.3.1 Compiling rand v0.8.5 Compiling quote v1.0.15 Compiling pyo3-ffi v0.23.1 Compiling pyo3 v0.23.1 Compiling pyo3-macros-backend v0.23.1 Compiling pyo3-macros v0.23.1 Compiling guessing-game v0.1.0 (/Users/ferris/src/rust/guessing-game) Finished dev [unoptimized + debuginfo] target(s) in 13.31s ``` Your `guessing_game` module should now be available in your current virtual environment. Go ahead and play a few games! ```shell (.venv) ferris@rustbox [~/src/rust/guessing-game] % python Python 3.9.6 (default, Aug 25 2021, 16:04:27) [Clang 12.0.5 (clang-1205.0.22.9)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import guessing_game >>> guessing_game.guess_the_number() Guess the number! Please input your guess. 42 You guessed: 42 Too small! Please input your guess. 80 You guessed: 80 Too big! Please input your guess. 50 You guessed: 50 Too small! Please input your guess. 60 You guessed: 60 Too big! Please input your guess. 55 You guessed: 55 You win! ``` ## Create a wheel for distribution `maturin develop` actually skips the wheel generation part and installs directly in the current environment. `maturin build` on the other hand will produce a wheel you can distribute. Note the wheel contains "tags" in its filename that correspond to supported Python versions, platforms, and/or architectures, so yours might look a little different. If you want to distribute broadly, you may need to build on multiple platforms and use a [`manylinux`](https://github.com/pypa/manylinux) Docker container to build wheels compatible with a wide range of Linux distros. ```shell (.venv) ferris@rustbox [~/src/rust/guessing-game] % maturin build 🔗 Found pyo3 bindings with abi3 support for Python ≥ 3.8 ðŸ�� Not using a specific python interpreter (With abi3, an interpreter is only required on windows) Finished dev [unoptimized + debuginfo] target(s) in 7.32s 📦 Built wheel for abi3 Python ≥ 3.8 to /Users/ferris/src/rust/guessing-game/target/wheels/guessing_game-0.1.0-cp37-abi3-macosx_10_7_x86_64.whl ``` To make your package available to others on [PyPI](https://pypi.org), use [`uv publish`](https://docs.astral.sh/uv/guides/package/#publishing-your-package) or [`twine upload`](https://twine.readthedocs.io/en/stable/). ## Summary Congratulations! You successfully created a Python module implemented entirely in Rust thanks to pyo3 and maturin. This demonstrates how easy it is to get started with maturin, but keep reading to learn more about all the additional features. maturin-1.16.0/guide/tweak.css000066400000000000000000000003751527064705700162220ustar00rootroot00000000000000.sponsors { display: flex; justify-content: left; flex-wrap: wrap; align-items: center; margin: 1rem 0; } .sponsors > div { text-align: center; width: 25%; padding-bottom: 20px; } .sponsors span { display: block; } maturin-1.16.0/license-apache000066400000000000000000000251371527064705700160670ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. maturin-1.16.0/license-mit000066400000000000000000000020331527064705700154250ustar00rootroot00000000000000Copyright (c) 2018 konstin Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. maturin-1.16.0/maturin.schema.json000066400000000000000000000540741527064705700171160ustar00rootroot00000000000000{ "$schema": "https://json-schema.org/draft/2020-12/schema", "title": "ToolMaturin", "description": "The `[tool.maturin]` section of a pyproject.toml", "type": "object", "properties": { "all-features": { "description": "Activate all available features", "type": [ "boolean", "null" ] }, "auditwheel": { "description": "Audit wheel mode", "anyOf": [ { "$ref": "#/$defs/AuditWheelMode" }, { "type": "null" } ] }, "bindings": { "description": "Bindings type", "anyOf": [ { "$ref": "#/$defs/Bindings" }, { "type": "null" } ] }, "compatibility": { "description": "Platform compatibility", "anyOf": [ { "$ref": "#/$defs/CompatibilityTag" }, { "type": "null" } ] }, "config": { "description": "Override a configuration value (unstable)", "type": [ "array", "null" ], "items": { "type": "string" } }, "data": { "description": "Path to the wheel directory, defaults to `.data`", "type": [ "string", "null" ] }, "editable-profile": { "description": "Same as `profile` but for \"editable\" builds", "type": [ "string", "null" ] }, "exclude": { "description": "Exclude files matching the given glob pattern(s).\nPatterns are resolved relative to the directory containing `pyproject.toml`.", "type": [ "array", "null" ], "items": { "$ref": "#/$defs/GlobPattern" } }, "features": { "description": "List of features to activate.\nEach entry can be a plain feature name string, or a conditional object\nwith `feature` and `python-version` keys.", "type": [ "array", "null" ], "items": { "$ref": "#/$defs/FeatureSpec" } }, "frozen": { "description": "Require Cargo.lock and cache are up to date", "type": [ "boolean", "null" ] }, "generate-ci": { "description": "CI generation configuration", "anyOf": [ { "$ref": "#/$defs/GenerateCIConfig" }, { "type": "null" } ] }, "include": { "description": "Include files matching the given glob pattern(s).\nPatterns are resolved relative to the directory containing `pyproject.toml`.\nWhen `python-source` is configured, patterns are also tried relative to\nthat directory if no matches are found.", "type": [ "array", "null" ], "items": { "$ref": "#/$defs/GlobPattern" } }, "include-import-lib": { "description": "Include the import library (.dll.lib) in the wheel on Windows", "type": "boolean", "default": false }, "locked": { "description": "Require Cargo.lock is up to date", "type": [ "boolean", "null" ] }, "manifest-path": { "description": "Path to Cargo.toml", "type": [ "string", "null" ] }, "module-name": { "description": "Module name, accepts setuptools style import name like `foo.bar`", "type": [ "string", "null" ] }, "no-default-features": { "description": "Do not activate the `default` feature", "type": [ "boolean", "null" ] }, "pgo-command": { "description": "Command to run for PGO profile generation.\nExecuted in a temporary virtualenv with the instrumented wheel installed.\nExample: `python -m pytest tests/benchmarks`", "type": [ "string", "null" ] }, "pgo-dependency-group": { "description": "Dependency group to install before PGO profile generation.\nDefaults to `dev`.", "type": [ "string", "null" ] }, "profile": { "description": "Build artifacts with the specified Cargo profile", "type": [ "string", "null" ] }, "python-packages": { "description": "Python packages to include", "type": [ "array", "null" ], "items": { "type": "string" } }, "python-source": { "description": "The directory with python module, contains `/__init__.py`", "type": [ "string", "null" ] }, "rustc-args": { "description": "Additional rustc arguments", "type": [ "array", "null" ], "items": { "type": "string" } }, "sbom": { "description": "SBOM configuration", "anyOf": [ { "$ref": "#/$defs/SbomConfig" }, { "type": "null" } ] }, "sdist-generator": { "description": "Source distribution generator", "$ref": "#/$defs/SdistGenerator", "default": "cargo" }, "skip-auditwheel": { "description": "Skip audit wheel", "type": "boolean", "default": false }, "strip": { "description": "Strip the final binary", "type": "boolean", "default": false }, "target": { "description": "Target configuration", "type": "object", "additionalProperties": { "$ref": "#/$defs/TargetConfig" }, "default": {} }, "targets": { "description": "Cargo compile targets", "type": [ "array", "null" ], "items": { "$ref": "#/$defs/CargoTarget" } }, "unstable-flags": { "description": "Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details", "type": [ "array", "null" ], "items": { "type": "string" } }, "use-base-python": { "description": "Use base Python executable instead of venv Python executable in PEP 517 build.", "type": "boolean", "default": false } }, "$defs": { "AuditWheelMode": { "description": "Auditwheel mode", "oneOf": [ { "description": "Audit and repair wheel for manylinux compliance", "type": "string", "const": "repair" }, { "description": "Check wheel for manylinux compliance, but do not repair", "type": "string", "const": "check" }, { "description": "Audit wheel and warn about external libraries, but do not fail or repair", "type": "string", "const": "warn" }, { "description": "Don't check for manylinux compliance", "type": "string", "const": "skip" } ] }, "Bindings": { "description": "The kind of bindings to use.", "oneOf": [ { "description": "PyO3 bindings", "type": "string", "const": "pyo3" }, { "description": "pyo3-ffi (raw FFI) bindings", "type": "string", "const": "pyo3-ffi" }, { "description": "CFFI bindings", "type": "string", "const": "cffi" }, { "description": "UniFFI bindings", "type": "string", "const": "uniffi" }, { "description": "Rust binary", "type": "string", "const": "bin" } ] }, "CargoCrateType": { "description": "Supported cargo crate types", "oneOf": [ { "description": "Binary executable target", "type": "string", "const": "bin" }, { "description": "Dynamic system library target", "type": "string", "const": "cdylib" }, { "description": "Dynamic Rust library target", "type": "string", "const": "dylib" }, { "description": "Rust library", "type": "string", "const": "lib" }, { "description": "Rust library for use as an intermediate target", "type": "string", "const": "rlib" }, { "description": "Static library", "type": "string", "const": "staticlib" } ] }, "CargoTarget": { "description": "Cargo compile target", "type": "object", "properties": { "kind": { "description": "Kind of target (\"bin\", \"cdylib\")", "anyOf": [ { "$ref": "#/$defs/CargoCrateType" }, { "type": "null" } ] }, "name": { "description": "Name as given in the `Cargo.toml` or generated from the file name", "type": "string" } }, "required": [ "name" ] }, "CompatibilityTag": { "description": "Parsed `--compatibility` / `[tool.maturin] compatibility` value.\n\nAccepts platform tags such as `linux`, `manylinux2014`, `manylinux_2_17`, `musllinux_1_2`, or the `pypi` pseudo-option (PyPI filename validation; not a real platform tag).", "type": "string" }, "FeatureSpec": { "description": "A cargo feature specification that can be either a plain feature name\nor a conditional feature that is only enabled for certain Python versions.\n\n# Examples\n\n```toml\n[tool.maturin]\nfeatures = [\n \"some-feature\",\n { feature = \"pyo3/abi3-py311\", python-version = \">=3.11\" },\n { feature = \"pyo3/abi3-py38\", python-version = \"<3.11\" },\n { feature = \"pyo3/abi3-py311\", python-version = \">=3.11\", python-implementation = \"cpython\" },\n { feature = \"pypy-compat\", python-implementation = \"pypy\" },\n]\n```", "anyOf": [ { "description": "A plain feature name, always enabled", "type": "string" }, { "description": "A feature enabled only when the conditions match", "type": "object", "properties": { "feature": { "description": "The cargo feature to enable", "type": "string" }, "python-implementation": { "description": "Python implementation name, e.g. \"cpython\", \"pypy\", \"graalpy\"", "type": [ "string", "null" ] }, "python-version": { "description": "PEP 440 version specifier for the target Python version, e.g. \">=3.11\"", "type": [ "string", "null" ] } }, "required": [ "feature" ] } ] }, "Format": { "description": "The target format for the include or exclude [GlobPattern].\n\nSee [Formats].", "oneOf": [ { "description": "Source distribution", "type": "string", "const": "sdist" }, { "description": "Wheel", "type": "string", "const": "wheel" } ] }, "Formats": { "description": "A single [Format] or multiple [Format] values for a [GlobPattern].", "anyOf": [ { "description": "A single [Format] value", "$ref": "#/$defs/Format" }, { "description": "Multiple [Format] values", "type": "array", "items": { "$ref": "#/$defs/Format" } } ] }, "GenerateCIConfig": { "description": "The `[tool.maturin.generate-ci]` section", "type": "object", "properties": { "github": { "description": "GitHub Actions configuration", "anyOf": [ { "$ref": "#/$defs/GitHubCIConfig" }, { "type": "null" } ] } } }, "GitHubCIConfig": { "description": "The `[tool.maturin.generate-ci.github]` section", "type": "object", "properties": { "android": { "description": "Android platform configuration", "anyOf": [ { "$ref": "#/$defs/PlatformCIConfig" }, { "type": "null" } ] }, "args": { "description": "Extra arguments to pass to maturin (applies to all platforms)", "type": [ "string", "null" ] }, "emscripten": { "description": "Emscripten platform configuration", "anyOf": [ { "$ref": "#/$defs/PlatformCIConfig" }, { "type": "null" } ] }, "linux": { "description": "Linux (manylinux) platform configuration", "anyOf": [ { "$ref": "#/$defs/PlatformCIConfig" }, { "type": "null" } ] }, "macos": { "description": "macOS platform configuration", "anyOf": [ { "$ref": "#/$defs/PlatformCIConfig" }, { "type": "null" } ] }, "musllinux": { "description": "Musllinux platform configuration", "anyOf": [ { "$ref": "#/$defs/PlatformCIConfig" }, { "type": "null" } ] }, "publishing-environment": { "description": "Name of the GitHub Actions environment to use for the release job\n(typically used together with `trusted-publishing = true`)", "type": [ "string", "null" ] }, "pytest": { "description": "Enable pytest", "type": [ "boolean", "null" ] }, "skip-attestation": { "description": "Skip artifact attestation", "type": [ "boolean", "null" ] }, "trusted-publishing": { "description": "Use PyPI trusted publishing (OpenID Connect) instead of an API token", "type": [ "boolean", "null" ] }, "windows": { "description": "Windows platform configuration", "anyOf": [ { "$ref": "#/$defs/PlatformCIConfig" }, { "type": "null" } ] }, "zig": { "description": "Use zig for cross compilation", "type": [ "boolean", "null" ] } } }, "GlobPattern": { "description": "A glob pattern for the include and exclude configuration.\n\nSee [PyProjectToml::include] and [PyProject::exclude].\n\nBased on .", "anyOf": [ { "description": "A glob", "type": "string" }, { "description": "A glob `path` with a `format` key to specify one or more [Format] values", "type": "object", "properties": { "format": { "description": "One or more [Format] values", "$ref": "#/$defs/Formats" }, "path": { "description": "A glob", "type": "string" } }, "required": [ "path", "format" ] }, { "description": "A glob `path` relative to a crate's OUT_DIR", "type": "object", "properties": { "crate_name": { "description": "Optional crate name (defaults to the root crate)", "type": [ "string", "null" ], "default": null }, "from": { "description": "Source: must be \"out-dir\"", "$ref": "#/$defs/IncludeFrom" }, "path": { "description": "A glob pattern relative to OUT_DIR", "type": "string" }, "to": { "description": "Target path in wheel (e.g. \"my_package/\")", "type": "string" } }, "required": [ "path", "from", "to" ] } ] }, "IncludeFrom": { "description": "Supported values for the `from` field in include patterns.", "oneOf": [ { "description": "Include files from the crate's OUT_DIR", "type": "string", "const": "out-dir" } ] }, "PlatformCIConfig": { "description": "Per-platform CI configuration", "type": "object", "properties": { "args": { "description": "Extra arguments to pass to maturin", "type": [ "string", "null" ] }, "before-script-linux": { "description": "Script to run before build on Linux", "type": [ "string", "null" ] }, "container": { "description": "Container image to use", "type": [ "string", "null" ] }, "docker-options": { "description": "Docker options", "type": [ "string", "null" ] }, "manylinux": { "description": "Manylinux version (e.g. \"auto\", \"2_28\", \"musllinux_1_2\")", "type": [ "string", "null" ] }, "runner": { "description": "Runner override", "type": [ "string", "null" ] }, "rust-toolchain": { "description": "Rust toolchain (e.g. \"nightly\", \"stable\")", "type": [ "string", "null" ] }, "rustup-components": { "description": "Rustup components to install", "type": [ "string", "null" ] }, "target": { "description": "Detailed per-target configuration (mutually exclusive with `targets`)", "type": [ "array", "null" ], "items": { "$ref": "#/$defs/TargetCIConfig" } }, "targets": { "description": "Simple list of target architectures (mutually exclusive with `target`)", "type": [ "array", "null" ], "items": { "type": "string" } } } }, "SbomConfig": { "description": "SBOM configuration", "type": "object", "properties": { "auditwheel": { "description": "Generate a CycloneDX SBOM for external shared libraries grafted during\nauditwheel repair. Defaults to `true` when repair copies libraries.\n\nThe SBOM is written to `/sboms/auditwheel.cdx.json` and\nrecords which OS packages (deb, rpm, apk) provided the grafted\nlibraries, following the same convention as Python's auditwheel.", "type": [ "boolean", "null" ] }, "include": { "description": "Additional SBOM files to include in the `.dist-info/sboms` directory.", "type": [ "array", "null" ], "items": { "type": "string" } }, "rust": { "description": "Generate an SBOM for Rust crates. Defaults to `true`.", "type": [ "boolean", "null" ] } } }, "SdistGenerator": { "description": "Source distribution generator", "oneOf": [ { "description": "Use `cargo package --list`", "type": "string", "const": "cargo" }, { "description": "Use `git ls-files`", "type": "string", "const": "git" } ] }, "TargetCIConfig": { "description": "Per-target CI configuration within a platform", "type": "object", "properties": { "arch": { "description": "Target architecture (e.g. \"x86_64\", \"aarch64\")", "type": "string" }, "args": { "description": "Extra arguments to pass to maturin", "type": [ "string", "null" ] }, "before-script-linux": { "description": "Script to run before build on Linux", "type": [ "string", "null" ] }, "container": { "description": "Container image to use", "type": [ "string", "null" ] }, "docker-options": { "description": "Docker options", "type": [ "string", "null" ] }, "manylinux": { "description": "Manylinux version (e.g. \"auto\", \"2_28\", \"musllinux_1_2\")", "type": [ "string", "null" ] }, "runner": { "description": "Runner override", "type": [ "string", "null" ] }, "rust-toolchain": { "description": "Rust toolchain (e.g. \"nightly\", \"stable\")", "type": [ "string", "null" ] }, "rustup-components": { "description": "Rustup components to install", "type": [ "string", "null" ] } }, "required": [ "arch" ] }, "TargetConfig": { "description": "Target configuration", "type": "object", "properties": { "macos-deployment-target": { "description": "macOS deployment target version", "type": [ "string", "null" ] } } } } } maturin-1.16.0/maturin/000077500000000000000000000000001527064705700147525ustar00rootroot00000000000000maturin-1.16.0/maturin/__init__.py000066400000000000000000000220361527064705700170660ustar00rootroot00000000000000""" maturin's implementation of the PEP 517 interface. Calls maturin through subprocess Currently, the "return value" of the rust implementation is the last line of stdout On windows, apparently pip's subprocess handling sets stdout to some windows encoding (e.g. cp1252 on my machine), even though the terminal supports utf8. Writing directly to the binary stdout buffer avoids encoding errors due to maturin's emojis. """ from __future__ import annotations import os import platform import shlex import shutil import struct import subprocess import sys from subprocess import SubprocessError from typing import Any, Mapping def get_config() -> dict[str, str]: try: import tomllib except ModuleNotFoundError: import tomli as tomllib # type: ignore with open("pyproject.toml", "rb") as fp: pyproject_toml = tomllib.load(fp) return pyproject_toml.get("tool", {}).get("maturin", {}) def get_maturin_pep517_args(config_settings: Mapping[str, Any] | None = None) -> list[str]: build_args = None if config_settings: # TODO: Deprecate and remove build-args in favor of maturin.build-args in maturin 2.0 build_args = config_settings.get("maturin.build-args", config_settings.get("build-args")) if build_args is None: env_args = os.getenv("MATURIN_PEP517_ARGS", "") args = shlex.split(env_args) elif isinstance(build_args, str): args = shlex.split(build_args) else: args = build_args return args def _get_sys_executable() -> str: executable = sys.executable if os.getenv("MATURIN_PEP517_USE_BASE_PYTHON") in {"1", "true"} or get_config().get("use-base-python"): # Use the base interpreter path when running inside a venv to avoid recompilation # when switching between venvs base_executable = sys._base_executable # type: ignore[attr-defined] if base_executable and os.path.exists(base_executable): executable = os.path.realpath(base_executable) return executable def _additional_pep517_args() -> list[str]: # Support building for 32-bit Python on x64 Windows if platform.system().lower() == "windows" and platform.machine().lower() == "amd64": pointer_width = struct.calcsize("P") * 8 if pointer_width == 32: return ["--target", "i686-pc-windows-msvc"] return [] def _has_interpreter_arg(args: list[str]) -> bool: """Return True if `args` already contains a `--interpreter`/`-i` flag.""" for arg in args: if arg in ("--interpreter", "-i") or arg.startswith("--interpreter="): return True return False def _get_env() -> dict[str, str] | None: if not os.environ.get("MATURIN_NO_INSTALL_RUST") and not shutil.which("cargo"): from puccinialin import setup_rust print("Rust not found, installing into a temporary directory") extra_env = setup_rust() return {**os.environ, **extra_env} else: return None # noinspection PyUnusedLocal def _build_wheel( wheel_directory: str, config_settings: Mapping[str, Any] | None = None, metadata_directory: str | None = None, editable: bool = False, ) -> str: # PEP 517 specifies that only `sys.executable` points to the correct # python interpreter base_command = ["maturin", "pep517", "build-wheel"] options = _additional_pep517_args() if editable: options.append("--editable") pep517_args = get_maturin_pep517_args(config_settings) if pep517_args: options.extend(pep517_args) # Only auto-inject the interpreter if the user has not already supplied one # via MATURIN_PEP517_ARGS / config_settings. if not _has_interpreter_arg(options): base_command.extend(["-i", _get_sys_executable()]) if "--compatibility" not in options and "--manylinux" not in options: # default to off if not otherwise specified options = ["--compatibility", "off", *options] command = [*base_command, *options] env = _get_env() if metadata_directory is not None: if env is None: env = os.environ.copy() env["MATURIN_PEP517_METADATA_DIR"] = metadata_directory print("Running `{}`".format(" ".join(command))) sys.stdout.flush() result = subprocess.run(command, stdout=subprocess.PIPE, env=env, check=False) sys.stdout.buffer.write(result.stdout) sys.stdout.flush() if result.returncode != 0: sys.stderr.write(f"Error: command {command} returned non-zero exit status {result.returncode}\n") sys.exit(1) output = result.stdout.decode(errors="replace") wheel_path = output.strip().splitlines()[-1] filename = os.path.basename(wheel_path) shutil.copy2(wheel_path, os.path.join(wheel_directory, filename)) return filename # noinspection PyUnusedLocal def build_wheel( wheel_directory: str, config_settings: Mapping[str, Any] | None = None, metadata_directory: str | None = None, ) -> str: return _build_wheel(wheel_directory, config_settings, metadata_directory) # noinspection PyUnusedLocal def build_sdist(sdist_directory: str, config_settings: Mapping[str, Any] | None = None) -> str: command = ["maturin", "pep517", "write-sdist", "--sdist-directory", sdist_directory] print("Running `{}`".format(" ".join(command))) sys.stdout.flush() result = subprocess.run(command, stdout=subprocess.PIPE, env=_get_env(), check=False) sys.stdout.buffer.write(result.stdout) sys.stdout.flush() if result.returncode != 0: sys.stderr.write(f"Error: command {command} returned non-zero exit status {result.returncode}\n") sys.exit(1) output = result.stdout.decode(errors="replace") return output.strip().splitlines()[-1] # noinspection PyUnusedLocal def get_requires_for_build_wheel(config_settings: Mapping[str, Any] | None = None) -> list[str]: if get_config().get("bindings") == "cffi" and platform.python_implementation() != "PyPy": requirements = ["cffi"] else: requirements = [] if not os.environ.get("MATURIN_NO_INSTALL_RUST") and not shutil.which("cargo"): requirements += ["puccinialin"] return requirements # noinspection PyUnusedLocal def build_editable( wheel_directory: str, config_settings: Mapping[str, Any] | None = None, metadata_directory: str | None = None, ) -> str: return _build_wheel(wheel_directory, config_settings, metadata_directory, editable=True) # Requirements to build an editable are the same as for a wheel get_requires_for_build_editable = get_requires_for_build_wheel # noinspection PyUnusedLocal def get_requires_for_build_sdist(config_settings: Mapping[str, Any] | None = None) -> list[str]: requirements = [] if not os.environ.get("MATURIN_NO_INSTALL_RUST") and not shutil.which("cargo"): requirements += ["puccinialin"] return requirements # noinspection PyUnusedLocal def prepare_metadata_for_build_wheel(metadata_directory: str, config_settings: Mapping[str, Any] | None = None) -> str: print("Checking for Rust toolchain....") is_cargo_installed = False env = _get_env() # On Windows, the `PATH` in `env` doesn't influence PATH resolution for the spawned # process, so we resolve manually. cargo = shutil.which("cargo", path=env.get("PATH") if env else None) if cargo is not None: try: output = subprocess.check_output([cargo, "--version"], env=env).decode("utf-8", "ignore") if "cargo" in output: is_cargo_installed = True except (FileNotFoundError, SubprocessError): pass if not is_cargo_installed: sys.stderr.write( "\nCargo, the Rust package manager, is not installed or is not on PATH.\n" "This package requires Rust and Cargo to compile extensions. Install it through\n" "the system's package manager or via https://rustup.rs/\n\n" ) sys.exit(1) command = [ "maturin", "pep517", "write-dist-info", "--metadata-directory", metadata_directory, ] command.extend(_additional_pep517_args()) pep517_args = get_maturin_pep517_args(config_settings) if pep517_args: command.extend(pep517_args) # PEP 517 specifies that only `sys.executable` points to the correct python # interpreter. Only auto-inject it if the user has not already supplied one # via MATURIN_PEP517_ARGS / config_settings, otherwise we'd pass # `--interpreter` twice and trip the strict arity check in maturin. if not _has_interpreter_arg(command): command.extend(["--interpreter", _get_sys_executable()]) print("Running `{}`".format(" ".join(command))) try: _output = subprocess.check_output(command, env=env) except subprocess.CalledProcessError as e: sys.stderr.write(f"Error running maturin: {e}\n") sys.exit(1) sys.stdout.buffer.write(_output) sys.stdout.flush() output = _output.decode(errors="replace") return output.strip().splitlines()[-1] # Metadata for editable are the same as for a wheel prepare_metadata_for_build_editable = prepare_metadata_for_build_wheel maturin-1.16.0/maturin/__main__.py000066400000000000000000000021361527064705700170460ustar00rootroot00000000000000from __future__ import annotations import os import sys import sysconfig from pathlib import Path def get_maturin_path() -> Path | None: SCRIPT_NAME = "maturin" def script_dir(scheme: str) -> str: return sysconfig.get_path("scripts", scheme) def script_exists(dir: str) -> bool: for _, _, files in os.walk(dir): for f in files: name, *_ = os.path.splitext(f) if name == SCRIPT_NAME: return True return False paths = list( filter( script_exists, filter(os.path.exists, map(script_dir, sysconfig.get_scheme_names())), ) ) if paths: return Path(paths[0]) / SCRIPT_NAME return None if __name__ == "__main__": maturin = get_maturin_path() if maturin is None: print("Unable to find `maturin` script") sys.exit(1) if sys.platform == "win32": import subprocess code = subprocess.call([str(maturin)] + sys.argv[1:]) sys.exit(code) else: os.execv(maturin, [str(maturin)] + sys.argv[1:]) maturin-1.16.0/maturin/bootstrap.py000066400000000000000000000022071527064705700173420ustar00rootroot00000000000000"""Support installing rust before compiling (bootstrapping) maturin. Installing a package that uses maturin as build backend on a platform without maturin binaries, we install rust in a cache directory if the user doesn't have a rust installation already. Since this bootstrapping requires more dependencies but is only required if rust is missing, we check if cargo is present before requesting those dependencies. https://setuptools.pypa.io/en/stable/build_meta.html#dynamic-build-dependencies-and-other-build-meta-tweaks """ from __future__ import annotations import os import shutil from typing import Any # noinspection PyUnresolvedReferences from setuptools.build_meta import * def get_requires_for_build_wheel(config_settings: dict[str, Any] | None = None) -> list[str]: if not os.environ.get("MATURIN_NO_INSTALL_RUST") and not shutil.which("cargo"): return ["puccinialin>=0.1,<0.2"] return [] def get_requires_for_build_sdist(config_settings: dict[str, Any] | None = None) -> list[str]: if not os.environ.get("MATURIN_NO_INSTALL_RUST") and not shutil.which("cargo"): return ["puccinialin>=0.1,<0.2"] return [] maturin-1.16.0/netlify.toml000066400000000000000000000003021527064705700156350ustar00rootroot00000000000000[build] publish = "guide/book/" command = "curl -L https://github.com/rust-lang/mdBook/releases/download/v0.5.2/mdbook-v0.5.2-x86_64-unknown-linux-musl.tar.gz | tar xvz && ./mdbook build guide" maturin-1.16.0/noxfile.py000066400000000000000000000174331527064705700153210ustar00rootroot00000000000000# /// script # requires-python = ">=3.11" # dependencies = [ # "nox", # ] # /// import json import os import re import sys import urllib.request from pathlib import Path import nox import tomllib PYODIDE_VERSION = os.getenv("PYODIDE_VERSION", "0.29.0") GITHUB_ACTIONS = os.getenv("GITHUB_ACTIONS") GITHUB_ENV = os.getenv("GITHUB_ENV") MSRV = tomllib.loads(Path("Cargo.toml").read_text())["package"]["rust-version"] def append_to_github_env(name: str, value: str): if not GITHUB_ACTIONS or not GITHUB_ENV: return with open(GITHUB_ENV, "a") as f: f.write(f"{name}={value}\n") def get_latest_pyo3_version(): url = "https://crates.io/api/v1/crates/pyo3" with urllib.request.urlopen(urllib.request.Request(url, headers={"User-Agent": "maturin-nox-update"})) as response: data = json.loads(response.read().decode()) return data["crate"]["max_stable_version"] @nox.session(name="update-pyo3", python=False) def update_pyo3(session: nox.Session): latest_version = get_latest_pyo3_version() session.log(f"Latest pyo3 version: {latest_version}") crates = ["pyo3", "pyo3-ffi", "pyo3-build-config"] # Update test crates and root Cargo.toml cargo_tomls = [p for p in Path(".").glob("**/Cargo.toml") if "pyo3-no-extension-module" not in str(p)] # Update templates templates = list(Path("src/templates").glob("*.j2")) for path in cargo_tomls + templates: content = path.read_text() changed = False for crate in crates: # Replace crate = "version" new_content = re.sub( rf'^(\s*{crate}\s*=\s*)"[0-9.]+"', rf'\1"{latest_version}"', content, flags=re.MULTILINE, ) if new_content != content: content = new_content changed = True # Replace crate = { version = "version" new_content = re.sub( rf'^(\s*{crate}\s*=\s*\{{.*?version\s*=\s*)"[0-9.]+"', rf'\1"{latest_version}"', content, flags=re.MULTILINE, ) if new_content != content: content = new_content changed = True if changed: session.log(f"Updating {path}") path.write_text(content) test_crate_dir = Path("./test-crates").resolve() crates_to_update = ["pyo3", "pyo3-ffi", "python3-dll-a"] for root, _, files in os.walk(test_crate_dir): if "pyo3-no-extension-module" in root: continue if "Cargo.lock" in files: cargo_lock_path = Path(root) / "Cargo.lock" with open(cargo_lock_path, "r") as lock_file: content = lock_file.read() for crate in crates_to_update: if f'name = "{crate}"' in content: with session.chdir(root): session.run("cargo", f"+{MSRV}", "update", "-p", crate, external=True) def _resolve_pyodide_platform_inputs(info: dict) -> dict: """Map a `pyodide-lock.json` `info` block to the env vars and expected wheel platform tag that maturin should produce when targeting that Pyodide release. Mirrors the cascade in `src/target/platform_tag.rs::emscripten_platform_tag`; keep the two in sync. Pyodide encodes platform metadata across (overlapping) fields: * `info.platform` is `emscripten___` and contains the emcc version that built the runtime (used by `setup-emsdk`). * `info.abi_version` (Pyodide >= 0.28) is `_` and drives the PEP 783 `pyemscripten___wasm32` tag through maturin's historical `PYODIDE_ABI_VERSION` env var. * A future `info.pyemscripten_platform_version` drives the PEP 783 `pyemscripten___wasm32` wheel tag. See https://peps.python.org/pep-0783/. """ platform = info.get("platform", "") if platform.startswith("emscripten_"): emscripten_version = platform.removeprefix("emscripten_").replace("_", ".") else: emscripten_version = info.get("emscripten_version", "") pyemscripten = info.get("pyemscripten_platform_version", "") abi_version = info.get("abi_version", "") # Only export `EMSCRIPTEN_VERSION` when we actually resolved one — an # empty value would clobber a previously-set `EMSCRIPTEN_VERSION` in # `$GITHUB_ENV` and break `setup-emsdk`. env: dict[str, str] = {} if emscripten_version: env["EMSCRIPTEN_VERSION"] = emscripten_version if pyemscripten: env["PYEMSCRIPTEN_PLATFORM_VERSION"] = pyemscripten env["EXPECTED_PLATFORM_TAG"] = f"pyemscripten_{pyemscripten}_wasm32" elif abi_version: env["PYODIDE_ABI_VERSION"] = abi_version env["EXPECTED_PLATFORM_TAG"] = f"pyemscripten_{abi_version}_wasm32" elif emscripten_version: legacy = emscripten_version.replace(".", "_").replace("-", "_") env["EXPECTED_PLATFORM_TAG"] = f"emscripten_{legacy}_wasm32" return env @nox.session(name="setup-pyodide", python=False) def setup_pyodide(session: nox.Session): tests_dir = Path("./tests").resolve() with session.chdir(tests_dir): session.run( "npm", "i", "--no-save", f"pyodide@{PYODIDE_VERSION}", "prettier", external=True, ) with session.chdir(tests_dir / "node_modules" / "pyodide"): # Pyodide ships its Emscripten output as a single very long line # named `pyodide.asm.js` (Pyodide <= 0.29) or `pyodide.asm.mjs` # (Pyodide >= 314.0.0a1). Prettifying it makes Node-side errors # readable. Run prettier on whichever of the two exists. asm_file = next(Path(".").glob("pyodide.asm.*js"), None) if asm_file is not None: session.run( "node", "../prettier/bin/prettier.cjs", "-w", asm_file.name, external=True, ) with open("pyodide-lock.json") as f: info = json.load(f)["info"] for name, value in _resolve_pyodide_platform_inputs(info).items(): session.log(f"Pyodide {PYODIDE_VERSION}: {name}={value}") append_to_github_env(name, value) @nox.session(name="test-emscripten", python=False) def test_emscripten(session: nox.Session): tests_dir = Path("./tests").resolve() expected_tag = os.getenv("EXPECTED_PLATFORM_TAG") test_crates = [ "test-crates/pyo3-pure", "test-crates/pyo3-mixed", ] for crate in test_crates: crate = Path(crate).resolve() ver = sys.version_info session.run("cargo", "build", external=True) session.run( tests_dir.parent / "target" / "debug" / "maturin", "build", "-m", str(crate / "Cargo.toml"), "--target", "wasm32-unknown-emscripten", "-i", f"python{ver.major}.{ver.minor}", env={"RUSTUP_TOOLCHAIN": "nightly"}, external=True, ) if expected_tag: wheels_dir = crate / "target" / "wheels" wheels = sorted(wheels_dir.glob("*.whl")) if not wheels: session.error(f"No wheel produced in {wheels_dir}") mismatched = [w for w in wheels if expected_tag not in w.name] if mismatched: names = ", ".join(w.name for w in mismatched) session.error(f"Expected platform tag {expected_tag} in wheel name(s): {names}") session.log(f"Verified {len(wheels)} wheel(s) carry platform tag {expected_tag}") with session.chdir(tests_dir): session.run("node", "emscripten_runner.js", str(crate), external=True) maturin-1.16.0/pyproject.toml000066400000000000000000000032161527064705700162110ustar00rootroot00000000000000# Workaround to bootstrap maturin on non-manylinux platforms [build-system] requires = [ "setuptools>=77.0.0", "tomli>=1.1.0 ; python_version<'3.11'", "setuptools-rust>=1.11.0", ] backend-path = ["maturin"] build-backend = "bootstrap" [project] name = "maturin" description = "Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages" authors = [{ name = "konstin", email = "konstin@mailbox.org" }] readme = { file = "README.md", content-type = "text/markdown" } requires-python = ">=3.7" license = "MIT OR Apache-2.0" license-files = [ "license-mit", "license-apache", ] classifiers = [ "Topic :: Software Development :: Build Tools", "Programming Language :: Rust", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Programming Language :: Python :: Implementation :: GraalPy", ] dependencies = ["tomli>=1.1.0 ; python_version<'3.11'"] dynamic = ["version"] [project.optional-dependencies] zig = ["ziglang>=0.10.0"] patchelf = ["patchelf"] [project.urls] "Source Code" = "https://github.com/PyO3/maturin" Issues = "https://github.com/PyO3/maturin/issues" Documentation = "https://maturin.rs" Changelog = "https://maturin.rs/changelog.html" [tool.setuptools] packages = ["maturin"] [tool.maturin] bindings = "bin" [tool.black] target-version = ['py37'] extend-exclude = ''' # Ignore cargo-generate templates ^/src/templates ''' [tool.ruff] line-length = 120 target-version = "py37" [tool.mypy] disallow_untyped_defs = true disallow_incomplete_defs = true warn_no_return = true ignore_missing_imports = true maturin-1.16.0/setup.py000066400000000000000000000043311527064705700150060ustar00rootroot00000000000000# maturin is self bootstrapping, however on platforms like FreeBSD that aren't # manylinux/musllinux, pip will try installing maturin from the source distribution. # That source distribution obviously can't depend on maturin, so we're using # the always available setuptools. # # Note that this is really only a workaround for bootstrapping and not suited # for general purpose packaging, i.e. only building a wheel (as in # `python setup.py bdist_wheel`) and installing (as in # `pip install `) are supported. For creating a source distribution # for maturin itself use `maturin sdist`. import os import shlex import shutil try: import tomllib except ModuleNotFoundError: import tomli as tomllib from setuptools import setup from setuptools_rust import RustBin # Force the wheel to be platform specific # https://stackoverflow.com/a/45150383/3549270 # There's also the much more concise solution in # https://stackoverflow.com/a/53463910/3549270, # but that would require python-dev try: # noinspection PyPackageRequirements,PyUnresolvedReferences from wheel.bdist_wheel import bdist_wheel as _bdist_wheel # noinspection PyPep8Naming,PyAttributeOutsideInit class bdist_wheel(_bdist_wheel): def finalize_options(self): _bdist_wheel.finalize_options(self) self.root_is_pure = False except ImportError: bdist_wheel = None with open("Cargo.toml", "rb") as fp: version = tomllib.load(fp)["package"]["version"] # Use `--no-default-features` by default for a minimal build to support PEP 517. # `MATURIN_SETUP_ARGS` env var can be used to pass customized arguments to cargo. cargo_args = ["--no-default-features"] if os.getenv("MATURIN_SETUP_ARGS"): cargo_args = shlex.split(os.getenv("MATURIN_SETUP_ARGS", "")) if not os.environ.get("MATURIN_NO_INSTALL_RUST") and not shutil.which("cargo"): from puccinialin import setup_rust print("Rust not found, installing into a temporary directory") extra_env = setup_rust() env = {**os.environ, **extra_env} else: env = None setup( version=version, cmdclass={"bdist_wheel": bdist_wheel}, rust_extensions=[RustBin("maturin", args=cargo_args, cargo_manifest_args=["--locked"], env=env)], zip_safe=False, ) maturin-1.16.0/src/000077500000000000000000000000001527064705700140625ustar00rootroot00000000000000maturin-1.16.0/src/archive_source.rs000066400000000000000000000015171527064705700174350ustar00rootroot00000000000000use std::path::{Path, PathBuf}; #[derive(Debug, Clone)] pub enum ArchiveSource { Generated(GeneratedSourceData), File(FileSourceData), } impl ArchiveSource { pub(crate) fn executable(&self) -> bool { match self { Self::Generated(source) => source.executable, Self::File(source) => source.executable, } } pub(crate) fn path(&self) -> Option<&Path> { match self { Self::Generated(source) => source.path.as_deref(), Self::File(source) => Some(&source.path), } } } #[derive(Debug, Clone)] pub struct GeneratedSourceData { pub(crate) data: Vec, pub(crate) path: Option, pub(crate) executable: bool, } #[derive(Debug, Clone)] pub struct FileSourceData { pub(crate) path: PathBuf, pub(crate) executable: bool, } maturin-1.16.0/src/auditwheel/000077500000000000000000000000001527064705700162155ustar00rootroot00000000000000maturin-1.16.0/src/auditwheel/audit.rs000066400000000000000000000112741527064705700176760ustar00rootroot00000000000000use crate::target::Target; use anyhow::{Context, Result, bail}; use serde::{Deserialize, Serialize}; use std::fmt; use std::path::{Path, PathBuf}; /// Auditwheel mode #[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize, clap::ValueEnum)] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[serde(rename_all = "lowercase")] pub enum AuditWheelMode { /// Audit and repair wheel for manylinux compliance #[default] Repair, /// Check wheel for manylinux compliance, but do not repair Check, /// Audit wheel and warn about external libraries, but do not fail or repair Warn, /// Don't check for manylinux compliance Skip, } impl fmt::Display for AuditWheelMode { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { AuditWheelMode::Repair => write!(f, "repair"), AuditWheelMode::Check => write!(f, "check"), AuditWheelMode::Warn => write!(f, "warn"), AuditWheelMode::Skip => write!(f, "skip"), } } } /// Get sysroot path from target C compiler /// /// Currently only gcc is supported, clang doesn't have a `--print-sysroot` option pub fn get_sysroot_path(target: &Target) -> Result { use std::process::{Command, Stdio}; if let Some(sysroot) = std::env::var_os("TARGET_SYSROOT") { return Ok(PathBuf::from(sysroot)); } let host_triple = target.host_triple(); let target_triple = target.target_triple(); if host_triple != target_triple { let mut build = cc::Build::new(); build // Suppress cargo metadata for example env vars printing .cargo_metadata(false) // opt_level, host and target are required .opt_level(0) .host(host_triple) .target(target_triple); let compiler = build .try_get_compiler() .with_context(|| format!("Failed to get compiler for {target_triple}"))?; // Only GNU like compilers support `--print-sysroot` if !compiler.is_like_gnu() { return Ok(PathBuf::from("/")); } let path = compiler.path(); let out = Command::new(path) .arg("--print-sysroot") .stdout(Stdio::piped()) .stderr(Stdio::null()) .output() .with_context(|| format!("Failed to run `{} --print-sysroot`", path.display()))?; if out.status.success() { let sysroot = String::from_utf8(out.stdout) .context("Failed to read the sysroot path")? .trim() .to_owned(); if sysroot.is_empty() { return Ok(PathBuf::from("/")); } else { return Ok(PathBuf::from(sysroot)); } } else { bail!( "Failed to get the sysroot path: {}", String::from_utf8(out.stderr)? ); } } Ok(PathBuf::from("/")) } /// Compute the relative path from `from` to `to`. /// /// Both inputs must be either absolute or relative — mixing them (e.g. /// one absolute and one relative) would otherwise produce nonsense `..` /// chains, since their components would never match and the entire `from` /// tail would be turned into `..` segments. That feeds the RPATH math with /// garbage, so reject it up front with a clear error. pub fn relpath(to: &Path, from: &Path) -> Result { let to_is_absolute = to.is_absolute(); let from_is_absolute = from.is_absolute(); if to_is_absolute != from_is_absolute { bail!( "cannot compute relative path between an absolute and a relative path: `{}` and `{}`", from.display(), to.display() ); } let mut suffix_pos = 0; for (f, t) in from.components().zip(to.components()) { if f == t { suffix_pos += 1; } else { break; } } let mut result = PathBuf::new(); from.components() .skip(suffix_pos) .map(|_| result.push("..")) .last(); to.components() .skip(suffix_pos) .map(|x| result.push(x.as_os_str())) .last(); Ok(result) } #[cfg(test)] mod tests { use crate::auditwheel::audit::relpath; use pretty_assertions::assert_eq; use std::path::Path; #[test] fn test_relpath() { let cases = [ ("", "", ""), ("/", "/usr", ".."), ("/", "/usr/lib", "../.."), ]; for (from, to, expected) in cases { let from = Path::new(from); let to = Path::new(to); let result = relpath(from, to).unwrap(); assert_eq!(result, Path::new(expected)); } } } maturin-1.16.0/src/auditwheel/linux.rs000066400000000000000000001032271527064705700177270ustar00rootroot00000000000000//! Linux/ELF wheel audit and repair. //! //! This module implements [`WheelRepairer`] for Linux ELF binaries, //! providing the Rust equivalent of [auditwheel](https://github.com/pypa/auditwheel). //! //! It contains all ELF-specific logic: manylinux/musllinux compliance //! auditing, external dependency discovery via lddtree, versioned symbol //! checking, and binary patching via `patchelf` (SONAME, DT_NEEDED, RPATH). use super::audit::{get_sysroot_path, relpath}; use super::musllinux::{find_musl_libc, get_musl_version}; use super::policy::{MANYLINUX_POLICIES, MUSLLINUX_POLICIES, Policy}; use super::repair::{AuditResult, AuditedArtifact, GraftedLib, PatchKind, WheelRepairer}; use super::{PlatformTag, patchelf}; use crate::compile::BuildArtifact; use crate::target::{Arch, Target}; use anyhow::{Context, Result, bail}; use fs_err::File; use goblin::elf::{Elf, sym::STB_WEAK, sym::STT_FUNC}; use lddtree::Library; use once_cell::sync::Lazy; use regex::Regex; use std::collections::{BTreeMap, HashMap, HashSet}; use std::io; use std::io::Read; use std::path::{Path, PathBuf}; use thiserror::Error; use tracing::debug; pub(crate) static IS_LIBPYTHON: Lazy = Lazy::new(|| Regex::new(r"^libpython3\.\d+m?u?t?\.so\.\d+\.\d+$").unwrap()); /// Returns `true` if the given shared-library name is a dynamic linker /// (e.g. `ld-linux-x86-64.so.2`, `ld64.so.2`, `ld-musl-*.so.1`). fn is_dynamic_linker(name: &str) -> bool { name.starts_with("ld-linux") || name == "ld64.so.2" || name == "ld64.so.1" || name.starts_with("ld-musl") } /// Error raised during auditing an elf file for manylinux/musllinux compatibility #[derive(Error, Debug)] #[error("Ensuring manylinux/musllinux compliance failed")] pub enum AuditWheelError { /// The wheel couldn't be read #[error("Failed to read the wheel")] IoError(#[source] io::Error), /// Reexports goblin parsing errors #[error("Goblin failed to parse the elf file")] GoblinError(#[source] goblin::error::Error), /// The elf file isn't manylinux/musllinux compatible. Contains the list of offending /// libraries. #[error( "Your library links libpython ({0}), which libraries must not do. Have you forgotten to activate the extension-module feature?" )] LinksLibPythonError(String), /// The elf file isn't manylinux/musllinux compatible. Contains the list of offending /// libraries. #[error( "Your library is not {0} compliant because it links the following forbidden libraries: {1:?}" )] LinksForbiddenLibrariesError(Policy, Vec), /// The elf file isn't manylinux/musllinux compatible. Contains the list of offending /// libraries. #[error( "Your library is not {0} compliant because of the presence of too-recent versioned symbols: {1:?}. Consider building in a manylinux docker container" )] VersionedSymbolTooNewError(Policy, Vec), /// The elf file isn't manylinux/musllinux compatible. Contains the list of offending /// libraries with blacked-list symbols. #[error("Your library is not {0} compliant because it depends on black-listed symbols: {1:?}")] BlackListedSymbolsError(Policy, Vec), /// The elf file isn't manylinux/musllinux compatible. Contains unsupported architecture #[error("Your library is not {0} compliant because it has unsupported architecture: {1}")] UnsupportedArchitecture(Policy, String), /// This platform tag isn't defined by auditwheel yet #[error( "{0} compatibility policy is not defined by auditwheel yet, pass `--auditwheel=skip` to proceed anyway" )] UndefinedPolicy(PlatformTag), /// Failed to analyze external shared library dependencies of the wheel #[error("Failed to analyze external shared library dependencies of the wheel")] DependencyAnalysisError(#[source] lddtree::Error), } #[derive(Clone, Debug)] struct VersionedLibrary { /// library name name: String, /// versions needed versions: HashSet, } impl VersionedLibrary { /// Parse version strings (e.g. "GLIBC_2.17") into a map of name -> set of versions. /// e.g. {"GLIBC" -> {"2.17", "2.5"}, "GCC" -> {"3.0"}} /// fn parsed_versions(&self) -> HashMap> { let mut result: HashMap> = HashMap::new(); for v in &self.versions { if let Some((name, version)) = v.split_once('_') { result .entry(name.to_string()) .or_default() .insert(version.to_string()); } } result } } /// Find required dynamic linked libraries with version information fn find_versioned_libraries(elf: &Elf) -> Vec { let mut symbols = Vec::new(); if let Some(verneed) = &elf.verneed { for need_file in verneed.iter() { if let Some(name) = elf.dynstrtab.get_at(need_file.vn_file) { // Skip dynamic linker/loader if is_dynamic_linker(name) { continue; } let mut versions = HashSet::new(); for need_ver in need_file.iter() { if let Some(aux_name) = elf.dynstrtab.get_at(need_ver.vna_name) { versions.insert(aux_name.to_string()); } } symbols.push(VersionedLibrary { name: name.to_string(), versions, }); } } } symbols } /// Find incompliant symbols from symbol versions #[allow(clippy::result_large_err)] fn find_incompliant_symbols( elf: &Elf, symbol_versions: &[String], ) -> Result, AuditWheelError> { let mut symbols = Vec::new(); let strtab = &elf.strtab; for sym in &elf.syms { if sym.st_type() == STT_FUNC { let name = strtab.get_at(sym.st_name).unwrap_or("BAD NAME"); for symbol_version in symbol_versions { if name.ends_with(&format!("@{symbol_version}")) { symbols.push(name.to_string()); } } } } Ok(symbols) } #[allow(clippy::result_large_err)] fn policy_is_satisfied( policy: &Policy, elf: &Elf, arch: &str, deps: &[String], versioned_libraries: &[VersionedLibrary], allow_linking_libpython: bool, ) -> Result<(), AuditWheelError> { let arch_versions = &policy.symbol_versions.get(arch).ok_or_else(|| { AuditWheelError::UnsupportedArchitecture(policy.clone(), arch.to_string()) })?; let mut offending_libs = HashSet::new(); let mut offending_versioned_syms = HashSet::new(); let mut offending_blacklist_syms = HashMap::new(); let undef_symbols: HashSet = elf .dynsyms .iter() .filter_map(|sym| { // Do not consider weak symbols as undefined, they are optional at runtime. if sym.st_shndx == goblin::elf::section_header::SHN_UNDEF as usize && sym.st_bind() != STB_WEAK { elf.dynstrtab.get_at(sym.st_name).map(ToString::to_string) } else { None } }) .collect(); for dep in deps { if is_dynamic_linker(dep) { continue; } if !policy.lib_whitelist.contains(dep) { if allow_linking_libpython && IS_LIBPYTHON.is_match(dep) { continue; } offending_libs.insert(dep.clone()); } if let Some(sym_list) = policy.blacklist.get(dep) { let mut intersection: Vec<_> = sym_list.intersection(&undef_symbols).cloned().collect(); if !intersection.is_empty() { intersection.sort(); offending_blacklist_syms.insert(dep, intersection); } } } for library in versioned_libraries { if !policy.lib_whitelist.contains(&library.name) { offending_libs.insert(library.name.clone()); continue; } for (name, versions_needed) in library.parsed_versions() { let Some(versions_allowed) = arch_versions.get(&name) else { offending_versioned_syms.insert(format!( "{} offending versions: unknown symbol namespace {name}", library.name, )); continue; }; if !versions_needed.is_subset(versions_allowed) { let offending_versions: Vec<&str> = versions_needed .difference(versions_allowed) .map(|v| v.as_ref()) .collect(); let offending_symbol_versions: Vec = offending_versions .iter() .map(|v| format!("{name}_{v}")) .collect(); let offending_symbols = find_incompliant_symbols(elf, &offending_symbol_versions)?; let offender = if offending_symbols.is_empty() { format!( "{} offending versions: {}", library.name, offending_symbol_versions.join(", ") ) } else { format!( "{} offending symbols: {}", library.name, offending_symbols.join(", ") ) }; offending_versioned_syms.insert(offender); } } } // Check for black-listed symbols if !offending_blacklist_syms.is_empty() { let offenders = offending_blacklist_syms .into_iter() .map(|(lib, syms)| format!("{}: {}", lib, syms.join(", "))) .collect(); return Err(AuditWheelError::BlackListedSymbolsError( policy.clone(), offenders, )); } // Check for too-recent versioned symbols if !offending_versioned_syms.is_empty() { return Err(AuditWheelError::VersionedSymbolTooNewError( policy.clone(), offending_versioned_syms.into_iter().collect(), )); } // Check for libpython and forbidden libraries let offenders: Vec = offending_libs.into_iter().collect(); match offenders.as_slice() { [] => Ok(()), [lib] if IS_LIBPYTHON.is_match(lib) => { Err(AuditWheelError::LinksLibPythonError(lib.clone())) } offenders => Err(AuditWheelError::LinksForbiddenLibrariesError( policy.clone(), offenders.to_vec(), )), } } fn get_default_platform_policies() -> Vec { if let Ok(Some(musl_libc)) = find_musl_libc() && let Ok(Some((major, minor))) = get_musl_version(musl_libc) { return MUSLLINUX_POLICIES .iter() .filter(|policy| { policy.name == "linux" || policy.name == format!("musllinux_{major}_{minor}") }) .cloned() .collect(); } MANYLINUX_POLICIES.clone() } /// An reimplementation of auditwheel, which checks elf files for /// manylinux/musllinux compliance. /// /// If `platform_tag`, is None, it returns the the highest matching manylinux/musllinux policy /// and whether we need to repair with patchelf,, or `linux` if nothing else matches. /// It will error for bogus cases, e.g. if libpython is linked. /// /// If a specific manylinux/musllinux version is given, compliance is checked and a warning printed if /// a higher version would be possible. /// /// Does nothing for `platform_tag` set to `Off`/`Linux` or non-linux platforms. #[allow(clippy::result_large_err)] fn auditwheel_rs( artifact: &BuildArtifact, target: &Target, platform_tag: Option, allow_linking_libpython: bool, ) -> Result<(Policy, bool), AuditWheelError> { if !target.is_linux() || platform_tag == Some(PlatformTag::Linux) { return Ok((Policy::default(), false)); } let path = &artifact.path; let arch = target.target_arch().to_string(); let mut file = File::open(path).map_err(AuditWheelError::IoError)?; let mut buffer = Vec::new(); file.read_to_end(&mut buffer) .map_err(AuditWheelError::IoError)?; let elf = Elf::parse(&buffer).map_err(AuditWheelError::GoblinError)?; // This returns essentially the same as ldd let deps: Vec = elf.libraries.iter().map(ToString::to_string).collect(); let versioned_libraries = find_versioned_libraries(&elf); // Find the highest possible policy, if any let platform_policies = match platform_tag { Some(PlatformTag::Manylinux { .. }) => MANYLINUX_POLICIES.clone(), Some(PlatformTag::Musllinux { major, minor }) => MUSLLINUX_POLICIES .clone() .into_iter() .filter(|policy| { policy.name == "linux" || policy.name == format!("musllinux_{major}_{minor}") }) .map(|mut policy| { policy.fixup_musl_libc_so_name(target.target_arch()); policy }) .collect(), None => { let mut policies = get_default_platform_policies(); for policy in &mut policies { policy.fixup_musl_libc_so_name(target.target_arch()); } policies } Some(PlatformTag::Linux) => unreachable!(), }; let mut highest_policy = None; let mut should_repair = false; for policy in platform_policies.iter() { let result = policy_is_satisfied( policy, &elf, &arch, &deps, &versioned_libraries, allow_linking_libpython, ); match result { Ok(_) => { highest_policy = Some(policy.clone()); should_repair = false; break; } Err(AuditWheelError::LinksForbiddenLibrariesError(..)) => { highest_policy = Some(policy.clone()); should_repair = true; break; } Err(AuditWheelError::VersionedSymbolTooNewError(..)) | Err(AuditWheelError::BlackListedSymbolsError(..)) // UnsupportedArchitecture happens when trying 2010 with aarch64 | Err(AuditWheelError::UnsupportedArchitecture(..)) => continue, // If there was an error parsing the symbols or libpython was linked, // we error no matter what the requested policy was Err(err) => return Err(err), } } let policy = if let Some(platform_tag) = platform_tag { let mut policy = Policy::from_tag(&platform_tag) .ok_or(AuditWheelError::UndefinedPolicy(platform_tag))?; policy.fixup_musl_libc_so_name(target.target_arch()); if let Some(highest_policy) = highest_policy { // Don't recommend manylinux1 because rust doesn't support it anymore if policy.priority < highest_policy.priority && highest_policy.name != "manylinux_2_5" { eprintln!( "📦 Wheel is eligible for a higher priority tag. \ You requested {policy} but this wheel is eligible for {highest_policy}", ); } } match policy_is_satisfied( &policy, &elf, &arch, &deps, &versioned_libraries, allow_linking_libpython, ) { Ok(_) => { should_repair = false; Ok(policy) } Err(AuditWheelError::LinksForbiddenLibrariesError(..)) => { should_repair = true; Ok(policy) } Err(err) => Err(err), } } else if let Some(policy) = highest_policy { Ok(policy) } else if target.target_arch() == Arch::Armv6L || target.target_arch() == Arch::Armv7L { // Old arm versions // https://github.com/pypi/warehouse/blob/556e1e3390999381c382873b003a779a1363cb4d/warehouse/forklift/legacy.py#L122-L123 Ok(Policy::default()) } else { eprintln!( "âš ï¸� Warning: No compatible platform tag found, using the linux tag instead. \ You won't be able to upload those wheels to PyPI." ); // Fallback to linux Ok(Policy::default()) }?; Ok((policy, should_repair)) } /// Linux/ELF wheel repairer (auditwheel equivalent). /// /// Bundles external `.so` files and rewrites ELF metadata (SONAME, DT_NEEDED, /// RPATH) using `patchelf` so that `$ORIGIN`-relative references resolve to /// the bundled copies in the `.libs/` directory. /// /// Unlike the macOS repairer, `audit()` performs full /// manylinux/musllinux compliance checking — the returned [`Policy`] /// determines which `manylinux_X_Y` / `musllinux_X_Y` platform tag the wheel /// qualifies for. pub struct ElfRepairer { /// The requested platform tag (e.g., manylinux_2_17), if any. pub platform_tag: Option, /// The build target (architecture + OS). pub target: Target, /// Path to the project's Cargo.toml (used to extract RUSTFLAGS library paths). pub manifest_path: PathBuf, /// Whether the artifact is allowed to link libpython (bin bindings only). pub allow_linking_libpython: bool, } impl WheelRepairer for ElfRepairer { fn audit(&self, artifact: &BuildArtifact, mut ld_paths: Vec) -> Result { // Extend caller-provided paths with RUSTFLAGS library search paths if let Some(rustflags_paths) = extract_rustflags_library_paths(&self.manifest_path, &self.target) { ld_paths.extend(rustflags_paths); } let (policy, external_libs) = get_policy_and_libs( artifact, self.platform_tag, &self.target, ld_paths, self.allow_linking_libpython, )?; Ok(AuditResult::new(policy, external_libs)) } fn patch_required(&self, audited: &[AuditedArtifact], kind: &PatchKind<'_>) -> Vec { match kind { // Inherit the default rule for `Repair` (only artifacts with // non-empty `external_libs`). The Repair arm is duplicated // here rather than delegated because Rust traits can't // override a single match arm of a default method. PatchKind::Repair { .. } => audited .iter() .map(|aa| !aa.external_libs.is_empty()) .collect(), // Editable installs only patch artifacts that actually carry // cargo-target search paths. PatchKind::Editable => audited .iter() .map(|aa| !aa.artifact.linked_paths.is_empty()) .collect(), } } fn patch(&self, audited: &[AuditedArtifact], kind: &PatchKind<'_>) -> Result<()> { match kind { PatchKind::Repair { grafted, libs_dir, artifact_dir, } => self.patch_repair(audited, grafted, libs_dir, artifact_dir), PatchKind::Editable => self.patch_editable(audited), } } } impl ElfRepairer { fn patch_repair( &self, audited: &[AuditedArtifact], grafted: &[GraftedLib], libs_dir: &Path, artifact_dir: &Path, ) -> Result<()> { patchelf::verify_patchelf()?; // Build a lookup from original name → new soname for rewriting references. let mut name_map: BTreeMap<&str, &str> = BTreeMap::new(); for l in grafted { name_map.insert(l.original_name.as_str(), l.new_name.as_str()); for alias in &l.aliases { name_map.insert(alias.as_str(), l.new_name.as_str()); } } // Set soname and rpath on each grafted library. for lib in grafted { patchelf::set_soname(&lib.dest_path, &lib.new_name)?; if !lib.rpath.is_empty() { patchelf::set_rpath(&lib.dest_path, &"$ORIGIN".to_string())?; } } // Rewrite DT_NEEDED in each artifact to reference new sonames. // Only replace entries that the artifact actually depends on to avoid // unnecessary patchelf invocations and errors when an old name is // absent from a given binary. for aa in audited { let artifact_deps: HashSet<&str> = aa .external_libs .iter() .map(|lib| lib.name.as_str()) .collect(); let replacements: Vec<_> = name_map .iter() .filter(|(old, _)| artifact_deps.contains(**old)) .map(|(k, v)| (*k, v.to_string())) .collect(); if !replacements.is_empty() { patchelf::replace_needed(&aa.artifact.path, &replacements)?; } } // Update cross-references between grafted libraries for lib in grafted { let lib_replacements: Vec<_> = lib .needed .iter() .filter_map(|n| { name_map .get(n.as_str()) .map(|new| (n.as_str(), new.to_string())) }) .collect(); if !lib_replacements.is_empty() { patchelf::replace_needed(&lib.dest_path, &lib_replacements)?; } } // Set RPATH on artifacts to find the libs directory. // // Skip artifacts that don't depend on any grafted library: the // RPATH would be dead code, and rewriting bytes for them would // pollute cargo's incremental cache (#2969). The skip mirrors // the corresponding `patch_required` prediction so // `copy_back_cargo_outputs` doesn't pay an unnecessary // reflink/copy for them either. for aa in audited { if aa.external_libs.is_empty() { continue; } let mut new_rpaths = patchelf::get_rpath(&aa.artifact.path)?; let new_rpath = Path::new("$ORIGIN").join(relpath(libs_dir, artifact_dir)?); let new_rpath = new_rpath.to_str().with_context(|| { format!("computed rpath is not valid UTF-8: {}", new_rpath.display()) })?; new_rpaths.push(new_rpath.to_string()); let new_rpath = new_rpaths.join(":"); patchelf::set_rpath(&aa.artifact.path, &new_rpath)?; } Ok(()) } fn patch_editable(&self, audited: &[AuditedArtifact]) -> Result<()> { for aa in audited { if aa.artifact.linked_paths.is_empty() { continue; } let old_rpaths = patchelf::get_rpath(&aa.artifact.path)?; let mut new_rpaths = old_rpaths.clone(); for path in &aa.artifact.linked_paths { if !old_rpaths.contains(path) { new_rpaths.push(path.to_string()); } } let new_rpath = new_rpaths.join(":"); if let Err(err) = patchelf::set_rpath(&aa.artifact.path, &new_rpath) { eprintln!( "âš ï¸� Warning: Failed to set rpath for {}: {}", aa.artifact.path.display(), err ); } } Ok(()) } } /// Find external shared library dependencies (Linux/ELF specific). /// /// Uses lddtree to resolve dependencies, then filters out the dynamic linker, /// musl libc, and libraries on the policy whitelist. #[allow(clippy::result_large_err)] fn find_external_libs( artifact: impl AsRef, policy: &Policy, sysroot: PathBuf, ld_paths: Vec, ) -> Result, AuditWheelError> { let dep_analyzer = lddtree::DependencyAnalyzer::new(sysroot).library_paths(ld_paths); let deps = dep_analyzer .analyze(artifact) .map_err(AuditWheelError::DependencyAnalysisError)?; let mut ext_libs = Vec::new(); for (_, lib) in deps.libraries { let name = &lib.name; // Skip dynamic linker/loader, musl libc, and white-listed libs if is_dynamic_linker(name) || name.starts_with("libc.") || policy.lib_whitelist.contains(name) { continue; } ext_libs.push(lib); } Ok(ext_libs) } /// For the given compilation result, return the manylinux/musllinux policy and /// the external libs we need to add to repair it. fn get_policy_and_libs( artifact: &BuildArtifact, platform_tag: Option, target: &Target, ld_paths: Vec, allow_linking_libpython: bool, ) -> Result<(Policy, Vec)> { let (policy, should_repair) = auditwheel_rs(artifact, target, platform_tag, allow_linking_libpython).with_context( || { if let Some(platform_tag) = platform_tag { format!("Error ensuring {platform_tag} compliance") } else { "Error checking for manylinux/musllinux compliance".to_string() } }, )?; let external_libs = if should_repair { let sysroot = get_sysroot_path(target).unwrap_or_else(|_| PathBuf::from("/")); let external_libs = find_external_libs(&artifact.path, &policy, sysroot, ld_paths) .with_context(|| { if let Some(platform_tag) = platform_tag { format!("Error repairing wheel for {platform_tag} compliance") } else { "Error repairing wheel for manylinux/musllinux compliance".to_string() } })?; if allow_linking_libpython { external_libs .into_iter() .filter(|lib| !IS_LIBPYTHON.is_match(&lib.name)) .collect() } else { external_libs } } else { Vec::new() }; // Check external libraries for versioned symbol requirements that may // require a stricter (less compatible, e.g. newer manylinux) policy than what // the main artifact alone would need. See https://github.com/PyO3/maturin/issues/1490 let policy = if !external_libs.is_empty() { let (adjusted, offenders) = check_external_libs_policy(&policy, &external_libs, target)?; if platform_tag.is_some() && !offenders.is_empty() { let tag_kind = if policy.name.starts_with("musllinux") { "musllinux" } else { "manylinux" }; bail!( "External libraries {offenders:?} require newer symbol versions than {policy} allows. \ Consider using --compatibility {adjusted} or a newer {tag_kind} tag" ); } adjusted } else { policy }; Ok((policy, external_libs)) } /// Return the symbol versions required by external libraries that are not /// allowed by the given policy. fn unsatisfied_symbol_versions( policy: &Policy, arch: &str, versioned_libraries: &[VersionedLibrary], ) -> Vec { let arch_versions = match policy.symbol_versions.get(arch) { Some(v) => v, None => return vec!["(unsupported arch)".to_string()], }; let mut unsatisfied = Vec::new(); for library in versioned_libraries { if !policy.lib_whitelist.contains(&library.name) { continue; } for (name, versions_needed) in library.parsed_versions() { match arch_versions.get(&name) { Some(versions_allowed) => { for v in versions_needed.difference(versions_allowed) { unsatisfied.push(format!("{name}_{v}")); } } None => { for v in &versions_needed { unsatisfied.push(format!("{name}_{v}")); } } } } } unsatisfied.sort(); unsatisfied } /// Check if external libraries require a newer glibc than the current policy allows. /// Returns the adjusted policy and a list of descriptions for libraries that caused /// a downgrade. fn check_external_libs_policy( policy: &Policy, external_libs: &[Library], target: &Target, ) -> Result<(Policy, Vec)> { let arch = target.target_arch().to_string(); let mut platform_policies = if policy.name.starts_with("musllinux") { MUSLLINUX_POLICIES.clone() } else if policy.name.starts_with("manylinux") { MANYLINUX_POLICIES.clone() } else { get_default_platform_policies() }; for p in &mut platform_policies { p.fixup_musl_libc_so_name(target.target_arch()); } // Policies must be sorted from highest to lowest priority so we find the // best (most compatible) match first when iterating. debug_assert!( platform_policies .windows(2) .all(|w| w[0].priority >= w[1].priority) ); let mut result = policy.clone(); let mut offenders = Vec::new(); for lib in external_libs { let lib_path = match lib.realpath.as_ref() { Some(path) => path, None => continue, }; let buffer = fs_err::read(lib_path) .with_context(|| format!("Failed to read external library {}", lib_path.display()))?; let elf = match Elf::parse(&buffer) { Ok(elf) => elf, Err(_) => continue, }; let versioned_libraries = find_versioned_libraries(&elf); if versioned_libraries.is_empty() { continue; } // Find the highest policy that this external library satisfies let unsatisfied = unsatisfied_symbol_versions(&result, &arch, &versioned_libraries); if unsatisfied.is_empty() { continue; } for candidate in platform_policies.iter() { if candidate.priority > result.priority { continue; } if unsatisfied_symbol_versions(candidate, &arch, &versioned_libraries).is_empty() { if candidate.priority < result.priority { debug!( "Downgrading tag to {candidate} because external library {} requires {}", lib.name, unsatisfied.join(", "), ); offenders.push(format!("{} ({})", lib.name, unsatisfied.join(", "))); result = candidate.clone(); } break; } } } Ok((result, offenders)) } /// Extract library search paths from RUSTFLAGS configuration. #[cfg_attr(test, allow(dead_code))] fn extract_rustflags_library_paths(manifest_path: &Path, target: &Target) -> Option> { let manifest_dir = manifest_path.parent()?; let config = cargo_config2::Config::load_with_cwd(manifest_dir).ok()?; let rustflags = config.rustflags(target.target_triple()).ok()??; // Encode the rustflags for parsing with the rustflags crate let encoded = rustflags.encode().ok()?; let mut library_paths = Vec::new(); for flag in rustflags::from_encoded(encoded.as_ref()) { if let rustflags::Flag::LibrarySearchPath { kind: _, path } = flag { library_paths.push(path); } } if library_paths.is_empty() { None } else { Some(library_paths) } } #[cfg(test)] mod tests { use crate::Target; #[test] fn test_extract_rustflags_library_paths() { // Create a temporary directory with a Cargo.toml and .cargo/config.toml let temp_dir = tempfile::tempdir().unwrap(); let manifest_path = temp_dir.path().join("Cargo.toml"); let cargo_dir = temp_dir.path().join(".cargo"); let config_path = cargo_dir.join("config.toml"); // Create the directories fs_err::create_dir_all(&cargo_dir).unwrap(); // Create a minimal Cargo.toml fs_err::write( &manifest_path, r#" [package] name = "test-package" version = "0.1.0" edition = "2021" "#, ) .unwrap(); // Create a config.toml with rustflags containing -L options fs_err::write( &config_path, r#" [build] rustflags = ["-L", "dependency=/usr/local/lib", "-L", "/some/other/path", "-C", "opt-level=3"] "#, ) .unwrap(); // Test the function let target = Target::from_target_triple(None).unwrap(); let paths = super::extract_rustflags_library_paths(&manifest_path, &target); if let Some(paths) = paths { assert_eq!(paths.len(), 2); assert!( paths .iter() .any(|p| p.to_string_lossy() == "/usr/local/lib") ); assert!( paths .iter() .any(|p| p.to_string_lossy() == "/some/other/path") ); } else { // It's possible that rustflags parsing fails in some environments, // so we just verify the function doesn't panic println!("No rustflags library paths found, which is acceptable"); } } #[test] fn test_extract_rustflags_library_paths_no_config() { // Test with a directory that has no cargo config let temp_dir = tempfile::tempdir().unwrap(); let manifest_path = temp_dir.path().join("Cargo.toml"); // Create a minimal Cargo.toml fs_err::write( &manifest_path, r#" [package] name = "test-package" version = "0.1.0" edition = "2021" "#, ) .unwrap(); let target = Target::from_target_triple(None).unwrap(); let paths = super::extract_rustflags_library_paths(&manifest_path, &target); // Should return None when there's no cargo config with rustflags assert!(paths.is_none()); } } maturin-1.16.0/src/auditwheel/macos.rs000066400000000000000000001025541527064705700176740ustar00rootroot00000000000000//! macOS/Mach-O wheel audit and repair (delocate equivalent). //! //! This module implements [`WheelRepairer`] for macOS Mach-O binaries, //! providing the Rust equivalent of [delocate](https://github.com/matthew-brett/delocate). //! //! Uses `arwen` for Mach-O install name / rpath manipulation and //! pure-Rust signing helpers from `macos_sign` for both thin and fat binaries. use super::Policy; use super::audit::{get_sysroot_path, relpath}; use super::macos_sign::ad_hoc_sign; use super::repair::{AuditResult, AuditedArtifact, PatchKind, WheelRepairer, leaf_filename}; use crate::compile::BuildArtifact; use crate::target::Target; use anyhow::{Context, Result, bail}; use arwen::macho::MachoContainer; use fat_macho::{Error as FatMachoError, FatReader}; use lddtree::Library; use std::collections::{BTreeMap, HashMap, HashSet, VecDeque}; use std::path::{Path, PathBuf}; /// macOS/Mach-O wheel repairer (delocate equivalent). /// /// Bundles external `.dylib` files and rewrites Mach-O install names /// and rpaths so that `@loader_path`-relative references resolve to /// the bundled copies in the `.dylibs/` directory. pub struct MacOSRepairer { /// The build target, used to determine the sysroot for cross-compilation. pub target: Target, } impl WheelRepairer for MacOSRepairer { fn audit(&self, artifact: &BuildArtifact, _ld_paths: Vec) -> Result { let sysroot = get_sysroot_path(&self.target).unwrap_or_else(|_| PathBuf::from("/")); // For universal2 builds, analyze each thin binary separately with its // own linked_paths. This ensures we discover dependencies that may // only exist in one architecture (e.g., arch-specific native libs). // lddtree can only analyze one arch at a time from a fat binary. if !artifact.thin_artifacts.is_empty() { let mut all_libs: Vec = Vec::new(); let mut seen_realpaths: HashMap = HashMap::new(); let mut arch_requirements: HashMap> = HashMap::new(); for thin in &artifact.thin_artifacts { let ld_paths: Vec = thin.linked_paths.iter().map(PathBuf::from).collect(); let libs = find_external_libs(&thin.path, ld_paths, &sysroot)?; for lib in libs { if let Some(ref realpath) = lib.realpath { // Track which architectures require this library. arch_requirements .entry(realpath.clone()) .or_default() .insert(thin.arch.clone()); // Deduplicate by realpath — the same dylib may be needed // by both arches but should only be bundled once. if !seen_realpaths.contains_key(realpath) { seen_realpaths.insert(realpath.clone(), all_libs.len()); all_libs.push(lib); } } else { // Library not found on disk; include it so the error // propagates later in prepare_grafted_libs. all_libs.push(lib); } } } Ok(AuditResult { policy: Policy::default(), external_libs: all_libs, arch_requirements, }) } else { // Single-arch build: analyze the artifact directly. let ld_paths: Vec = artifact.linked_paths.iter().map(PathBuf::from).collect(); let ext_libs = find_external_libs(&artifact.path, ld_paths, &sysroot)?; Ok(AuditResult::new(Policy::default(), ext_libs)) } } fn patch(&self, artifacts: &[AuditedArtifact], kind: &PatchKind<'_>) -> Result<()> { let (grafted, libs_dir, artifact_dir) = match kind { PatchKind::Repair { grafted, libs_dir, artifact_dir, } => (*grafted, *libs_dir, *artifact_dir), // macOS has no editable-mode patching today; the default // `patch_required` returns all-false for `Editable` so this // arm is unreachable in practice, but we still degrade // gracefully if a future caller invokes it. PatchKind::Editable => return Ok(()), }; // Verify universal2 architecture requirements before patching. // Each grafted library must contain all CPU architectures that depend on it. for lib in grafted { if !lib.required_archs.is_empty() { verify_universal_archs(&lib.dest_path, &lib.required_archs, &lib.original_name)?; } } // Build a lookup from all known install names → new leaf name. let mut name_map: BTreeMap<&str, &str> = BTreeMap::new(); for lib in grafted { name_map.insert(lib.original_name.as_str(), lib.new_name.as_str()); for alias in &lib.aliases { name_map.insert(alias.as_str(), lib.new_name.as_str()); } } // 1. Patch each grafted library: set install id, rewrite cross-references, // remove absolute rpaths, then ad-hoc codesign. for lib in grafted { // Use a synthetic `/DLC/` (DeLoCated) install ID. This is a // non-existent absolute path used intentionally — matching the // convention from Python's `delocate` tool — so that any // un-patched reference will fail loudly at load time rather than // silently loading a different version of the library from the // system. All actual consumers are rewritten to use // `@loader_path`-relative references. let new_install_id = format!("/DLC/{}/{}", libs_dir.display(), lib.new_name); // Collect rpaths to remove (absolute rpaths only). let rpaths_to_remove: Vec<&str> = lib .rpath .iter() .filter(|r| r.starts_with('/')) .map(String::as_str) .collect(); // Collect install name changes for cross-references between grafted libs. let install_name_changes: Vec<(&str, String)> = lib .needed .iter() .filter_map(|n| { name_map .get(n.as_str()) .map(|new| (n.as_str(), format!("@loader_path/{new}"))) }) .collect(); patch_macho( &lib.dest_path, &install_name_changes, Some(&new_install_id), &rpaths_to_remove, )?; ad_hoc_sign(&lib.dest_path)?; } // 2. Patch each artifact: rewrite references to grafted libs using // @loader_path-relative names. // // Skip artifacts whose load commands don't reference any grafted // install name. `patch_macho` + `ad_hoc_sign` would otherwise // rewrite bytes (signature at minimum) for an artifact that // doesn't actually need any rewrite, polluting cargo's // incremental cache (#2969). The skip mirrors the corresponding // `patch_required` prediction so `copy_back_cargo_outputs` // doesn't pay an unnecessary reflink/copy for them either. // // The per-artifact filter relies on a `lddtree` invariant: the // `Library::name` it stores in `external_libs` is the exact // install-name string read from the binary's `LC_LOAD_DYLIB` // (see `lddtree::find_macho_library` -> `try_single_candidate`, // which sets `name: lib_name.to_string()` from the unmodified // load-command bytes). The grafted `name_map` is keyed by the // same field via `prepare_grafted_libs`, so equality is // byte-exact. If `lddtree` ever normalizes leaf-vs-`@rpath/` // forms, this filter would start being narrower than // `patch_macho`'s `change_install_name` lookup (which itself // searches `LC_LOAD_DYLIB` for the exact `old` string and // silently no-ops on `DylibNameMissing`); add a regression // fixture before bumping `lddtree` past 0.5.x if so. let rel = relpath(libs_dir, artifact_dir)?; for audited in artifacts { let artifact_deps: HashSet<&str> = audited .external_libs .iter() .map(|lib| lib.name.as_str()) .collect(); let install_name_changes: Vec<(&str, String)> = name_map .iter() .filter(|(old, _)| artifact_deps.contains(**old)) .map(|(old, new)| { let relative = Path::new("@loader_path").join(&rel).join(new); (*old, relative.to_string_lossy().into_owned()) }) .collect(); if !install_name_changes.is_empty() { patch_macho(&audited.artifact.path, &install_name_changes, None, &[])?; ad_hoc_sign(&audited.artifact.path)?; } } Ok(()) } fn libs_dir(&self, dist_name: &str) -> PathBuf { PathBuf::from(format!("{dist_name}.dylibs")) } } /// **Universal2 only**: Verify that a dylib contains all required CPU architectures. /// /// For universal2 macOS wheels, each bundled dylib must contain the architecture /// slices that depend on it. For example, if both arm64 and x86_64 binaries link /// against libfoo.dylib, then libfoo.dylib must be a fat binary containing both /// arm64 and x86_64 slices. /// /// This mirrors Python delocate's `check_archs` behavior — it assumes that /// external dylibs on the build system are already fat/universal. If a dylib /// is thin (single-architecture), the wheel repair will fail with an error /// explaining which architecture is missing. /// /// Note: Universal2 support may be removed when Apple drops x86_64 support fn verify_universal_archs( path: &Path, required_archs: &HashSet, lib_name: &str, ) -> Result<()> { let data = fs_err::read(path).with_context(|| { format!( "Failed to read library for arch verification: {}", path.display() ) })?; match FatReader::new(&data) { Ok(reader) => { // Fat binary: check each required arch is present for arch in required_archs { if reader.extract(arch).is_none() { bail!( "Library '{}' is missing architecture '{}'. \ Universal2 wheels require fat/universal dylibs containing all \ required architectures. The wheel's arm64 and/or x86_64 binaries \ depend on this library, but it doesn't contain a '{}' slice.", lib_name, arch, arch ); } } } Err(FatMachoError::NotFatBinary) => { // Thin binary: fails if more than one arch is required if required_archs.len() > 1 { let archs: Vec<&str> = required_archs.iter().map(|s| s.as_str()).collect(); bail!( "Library '{}' is a thin (single-architecture) binary, but the universal2 \ wheel requires architectures: {}. Universal2 wheels need fat/universal \ dylibs. Install a universal version of this library or build separate \ wheels for each architecture instead of universal2.", lib_name, archs.join(", ") ); } // Single arch required and it's a thin binary — we assume it matches. // (If it didn't match, the build would have failed earlier.) } Err(e) => { return Err(e).with_context(|| { format!("Failed to parse Mach-O for arch verification: {lib_name}") }); } } Ok(()) } /// Check if a library path is a macOS system library that should not be bundled. /// /// System libraries live under `/usr/lib/` and `/System/`. Notably, /// `/usr/local/lib/` (Homebrew) is NOT considered system — those libs /// get bundled, matching Python delocate behaviour. /// /// When cross-compiling, resolved library paths may be prefixed with the SDK /// sysroot (e.g., `/opt/osxcross/SDK/MacOSX.sdk/usr/lib/…`). The `sysroot` /// parameter is stripped before checking. fn is_system_library(path: &Path, sysroot: &Path) -> bool { let effective = path .strip_prefix(sysroot) .map(|p| Path::new("/").join(p)) .unwrap_or_else(|_| path.to_path_buf()); let s = effective.to_string_lossy(); s.starts_with("/usr/lib/") || s.starts_with("/System/") } /// Check if a library name refers to libpython or Python.framework, which should never be bundled. /// /// This catches both: /// - Traditional libpython: `/usr/local/lib/libpython3.12.dylib`, `@rpath/libpython3.10.dylib` /// - Python framework: `/Library/Frameworks/Python.framework/Versions/3.14/Python` /// - Free-threaded Python framework: `/Library/Frameworks/PythonT.framework/Versions/3.14/PythonT` fn is_libpython(name: &str) -> bool { // Check for Python.framework or PythonT.framework (macOS framework-style Python) // PythonT.framework is used by free-threaded Python builds (e.g., Python 3.13t, 3.14t) // Use path-component matching to avoid false positives on paths that merely // contain the substring (e.g., `/tmp/not-Python.framework-related/libfoo.dylib`). if Path::new(name).components().any(|c| { matches!( c.as_os_str().to_str(), Some("Python.framework" | "PythonT.framework") ) }) { return true; } // Check for traditional libpython dylib let leaf = leaf_filename(name); leaf.starts_with("libpython3") } /// Decide whether a dependency should be bundled or ignored. /// /// Unlike Linux, unresolved non-system Mach-O dependencies must fail the repair /// because the resulting wheel would still be broken on another machine. fn should_bundle_library(lib: &Library, sysroot: &Path) -> Result { if is_system_library(&lib.path, sysroot) || is_libpython(&lib.name) { return Ok(false); } if lib.realpath.is_none() { bail!( "Cannot repair wheel, because required library {} could not be located.", lib.path.display() ); } Ok(true) } /// Find external shared library dependencies for a macOS artifact. /// /// Uses a reachability analysis to avoid bundling libraries that are only /// transitive dependencies of skipped libraries (e.g., `libintl` is a /// dependency of `Python.framework` which we skip — so `libintl` should /// not be bundled either unless something else we *are* bundling also /// needs it). fn find_external_libs( artifact: impl AsRef, ld_paths: Vec, sysroot: &Path, ) -> Result> { let analyzer = if ld_paths.is_empty() { lddtree::DependencyAnalyzer::default() } else { lddtree::DependencyAnalyzer::default().library_paths(ld_paths) }; let deps = analyzer .analyze(artifact.as_ref()) .context("Failed to analyze Mach-O dependencies")?; // Determine which libraries should be skipped. let skipped: HashSet<&str> = deps .libraries .iter() .filter(|(_, lib)| is_system_library(&lib.path, sysroot) || is_libpython(&lib.name)) .map(|(name, _)| name.as_str()) .collect(); let reachable = reachable_libs(&deps.needed, &deps.libraries, &skipped); let mut ext_libs = Vec::new(); for (name, lib) in &deps.libraries { if reachable.contains(name.as_str()) && should_bundle_library(lib, sysroot)? { ext_libs.push(lib.clone()); } } Ok(ext_libs) } /// BFS walk from `roots`, following `needed` edges in `libraries`, skipping /// any node in `skipped`. Returns the set of reachable library names. fn reachable_libs<'a>( roots: &'a [String], libraries: &'a HashMap, skipped: &HashSet<&str>, ) -> HashSet<&'a str> { let mut reachable = HashSet::new(); let mut queue: VecDeque<&str> = roots .iter() .filter(|n| !skipped.contains(n.as_str())) .map(String::as_str) .collect(); while let Some(name) = queue.pop_front() { if !reachable.insert(name) { continue; } if let Some(lib) = libraries.get(name) { for needed in &lib.needed { if !skipped.contains(needed.as_str()) && !reachable.contains(needed.as_str()) { queue.push_back(needed); } } } } reachable } /// Batch Mach-O patching: apply changes in-memory, re-parsing between operations /// to handle offset shifts from install name changes, then write once at the end. fn patch_macho( file: &Path, install_name_changes: &[(&str, String)], new_install_id: Option<&str>, rpaths_to_remove: &[&str], ) -> Result<()> { let mut data = fs_err::read(file)?; let mut modified = false; // Change install ID first (this can shift load command offsets) if let Some(id) = new_install_id { let mut container = MachoContainer::parse(&data).context("Failed to parse Mach-O for install_id change")?; match container.change_install_id(id) { Ok(()) => { data = container.data; modified = true; } Err(arwen::macho::MachoError::DylibIdMissing) => {} Err(e) => return Err(e).context("Failed to change install id"), } } // Change install names (each can shift offsets, so re-parse between each) for (old, new) in install_name_changes { let mut container = MachoContainer::parse(&data) .context("Failed to parse Mach-O for install_name change")?; match container.change_install_name(old, new) { Ok(()) => { data = container.data; modified = true; } Err(arwen::macho::MachoError::DylibNameMissing(_)) => {} Err(e) => { return Err(e) .with_context(|| format!("Failed to change install name {old} -> {new}")); } } } // Remove rpaths for rpath in rpaths_to_remove { let mut container = MachoContainer::parse(&data).context("Failed to parse Mach-O for rpath removal")?; match container.remove_rpath(rpath) { Ok(()) => { data = container.data; modified = true; } Err(arwen::macho::MachoError::RpathMissing(_)) => {} Err(e) => return Err(e).with_context(|| format!("Failed to remove rpath {rpath}")), } } // Write once at the end if any modifications were made if modified { fs_err::write(file, &data)?; } Ok(()) } #[cfg(test)] mod tests { use super::*; fn library(name: &str, path: &str, realpath: Option<&str>) -> Library { Library { name: name.to_string(), path: PathBuf::from(path), realpath: realpath.map(PathBuf::from), needed: Vec::new(), rpath: Vec::new(), } } #[test] fn test_is_system_library() { let root = Path::new("/"); assert!(is_system_library( Path::new("/usr/lib/libSystem.B.dylib"), root )); assert!(is_system_library( Path::new("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation"), root, )); assert!(!is_system_library( Path::new("/usr/local/lib/libfoo.dylib"), root )); assert!(!is_system_library( Path::new("/opt/homebrew/lib/libbar.dylib"), root, )); } #[test] fn test_is_system_library_with_sysroot() { let sysroot = Path::new("/opt/osxcross/SDK/MacOSX.sdk"); assert!(is_system_library( Path::new("/opt/osxcross/SDK/MacOSX.sdk/usr/lib/libSystem.B.dylib"), sysroot, )); assert!(is_system_library( Path::new( "/opt/osxcross/SDK/MacOSX.sdk/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation" ), sysroot, )); assert!(!is_system_library( Path::new("/opt/osxcross/SDK/MacOSX.sdk/usr/local/lib/libfoo.dylib"), sysroot, )); } #[test] fn test_is_libpython() { // Traditional libpython dylibs assert!(is_libpython("libpython3.12.dylib")); assert!(is_libpython("/usr/local/lib/libpython3.11.dylib")); assert!(is_libpython("@rpath/libpython3.10.dylib")); // Python.framework (macOS framework-style Python) assert!(is_libpython( "/Library/Frameworks/Python.framework/Versions/3.14/Python" )); assert!(is_libpython( "/opt/homebrew/Frameworks/Python.framework/Versions/3.12/Python" )); // PythonT.framework (free-threaded Python builds, e.g., 3.13t, 3.14t) assert!(is_libpython( "/Library/Frameworks/PythonT.framework/Versions/3.14/PythonT" )); assert!(is_libpython( "/opt/homebrew/Frameworks/PythonT.framework/Versions/3.13/PythonT" )); // Non-Python libraries assert!(!is_libpython("libfoo.dylib")); assert!(!is_libpython("libpython2.7.dylib")); // Paths that contain the substring but are not actual framework paths assert!(!is_libpython( "/tmp/not-Python.framework-related/libfoo.dylib" )); } #[test] fn test_missing_non_system_dependency_errors() { let root = Path::new("/"); let err = should_bundle_library( &library("@rpath/libfoo.dylib", "@rpath/libfoo.dylib", None), root, ) .unwrap_err(); assert_eq!( err.to_string(), "Cannot repair wheel, because required library @rpath/libfoo.dylib could not be located." ); } #[test] fn test_missing_system_dependency_is_ignored() { let root = Path::new("/"); assert!( !should_bundle_library( &library( "/usr/lib/libSystem.B.dylib", "/usr/lib/libSystem.B.dylib", None, ), root, ) .unwrap() ); } fn lib_with_needed(name: &str, path: &str, needed: &[&str]) -> Library { Library { name: name.to_string(), path: PathBuf::from(path), realpath: Some(PathBuf::from(path)), needed: needed.iter().map(|s| s.to_string()).collect(), rpath: Vec::new(), } } fn make_graph(libs: Vec) -> HashMap { libs.into_iter().map(|l| (l.name.clone(), l)).collect() } #[test] fn skips_transitive_deps_of_skipped_libs() { // Graph: binary -> [libfoo, Python.framework] // Python.framework -> [libintl] // libintl should NOT be reachable because it's only via a skipped lib. let libraries = make_graph(vec![ lib_with_needed("libfoo.dylib", "/usr/local/lib/libfoo.dylib", &[]), lib_with_needed( "/Library/Frameworks/Python.framework/Versions/3.14/Python", "/Library/Frameworks/Python.framework/Versions/3.14/Python", &["libintl.8.dylib"], ), lib_with_needed("libintl.8.dylib", "/usr/local/lib/libintl.8.dylib", &[]), ]); let roots = vec![ "libfoo.dylib".to_string(), "/Library/Frameworks/Python.framework/Versions/3.14/Python".to_string(), ]; let skipped: HashSet<&str> = ["/Library/Frameworks/Python.framework/Versions/3.14/Python"].into(); let reachable = reachable_libs(&roots, &libraries, &skipped); assert!(reachable.contains("libfoo.dylib")); assert!(!reachable.contains("libintl.8.dylib")); assert!(!reachable.contains("/Library/Frameworks/Python.framework/Versions/3.14/Python")); } #[test] fn keeps_shared_dep_via_non_skipped_path() { // Graph: binary -> [libfoo, Python.framework] // Python.framework -> [libintl] // libfoo -> [libintl] // libintl IS reachable because libfoo (non-skipped) also needs it. let libraries = make_graph(vec![ lib_with_needed( "libfoo.dylib", "/usr/local/lib/libfoo.dylib", &["libintl.8.dylib"], ), lib_with_needed( "/Library/Frameworks/Python.framework/Versions/3.14/Python", "/Library/Frameworks/Python.framework/Versions/3.14/Python", &["libintl.8.dylib"], ), lib_with_needed("libintl.8.dylib", "/usr/local/lib/libintl.8.dylib", &[]), ]); let roots = vec![ "libfoo.dylib".to_string(), "/Library/Frameworks/Python.framework/Versions/3.14/Python".to_string(), ]; let skipped: HashSet<&str> = ["/Library/Frameworks/Python.framework/Versions/3.14/Python"].into(); let reachable = reachable_libs(&roots, &libraries, &skipped); assert!(reachable.contains("libfoo.dylib")); assert!(reachable.contains("libintl.8.dylib")); } #[test] fn follows_transitive_chain() { // Graph: binary -> [libA] // libA -> [libB] // libB -> [libC] // All should be reachable. let libraries = make_graph(vec![ lib_with_needed("libA.dylib", "/usr/local/lib/libA.dylib", &["libB.dylib"]), lib_with_needed("libB.dylib", "/usr/local/lib/libB.dylib", &["libC.dylib"]), lib_with_needed("libC.dylib", "/usr/local/lib/libC.dylib", &[]), ]); let roots = vec!["libA.dylib".to_string()]; let skipped = HashSet::new(); let reachable = reachable_libs(&roots, &libraries, &skipped); assert!(reachable.contains("libA.dylib")); assert!(reachable.contains("libB.dylib")); assert!(reachable.contains("libC.dylib")); } #[test] fn skipped_mid_chain_blocks_descendants() { // Graph: binary -> [libA] // libA -> [libSkip] // libSkip -> [libC] // libC should NOT be reachable because libSkip blocks the path. let libraries = make_graph(vec![ lib_with_needed( "libA.dylib", "/usr/local/lib/libA.dylib", &["/usr/lib/libSkip.dylib"], ), lib_with_needed( "/usr/lib/libSkip.dylib", "/usr/lib/libSkip.dylib", &["libC.dylib"], ), lib_with_needed("libC.dylib", "/usr/local/lib/libC.dylib", &[]), ]); let roots = vec!["libA.dylib".to_string()]; let skipped: HashSet<&str> = ["/usr/lib/libSkip.dylib"].into(); let reachable = reachable_libs(&roots, &libraries, &skipped); assert!(reachable.contains("libA.dylib")); assert!(!reachable.contains("/usr/lib/libSkip.dylib")); assert!(!reachable.contains("libC.dylib")); } // Tests for verify_universal_archs mod verify_universal_archs_tests { use super::*; use fat_macho::FatWriter; use std::io::Write; /// Minimal Mach-O header for arm64 (enough to be recognized as valid thin Mach-O) fn minimal_arm64_macho() -> Vec { // MH_MAGIC_64 + CPU_TYPE_ARM64 + minimal header let mut data = Vec::new(); // MH_MAGIC_64 = 0xfeedfacf (little-endian) data.extend_from_slice(&[0xcf, 0xfa, 0xed, 0xfe]); // CPU_TYPE_ARM64 = 0x0100000c (little-endian) data.extend_from_slice(&[0x0c, 0x00, 0x00, 0x01]); // CPU_SUBTYPE_ARM64_ALL = 0 data.extend_from_slice(&[0x00, 0x00, 0x00, 0x00]); // MH_EXECUTE = 2 data.extend_from_slice(&[0x02, 0x00, 0x00, 0x00]); // ncmds = 0 data.extend_from_slice(&[0x00, 0x00, 0x00, 0x00]); // sizeofcmds = 0 data.extend_from_slice(&[0x00, 0x00, 0x00, 0x00]); // flags = 0 data.extend_from_slice(&[0x00, 0x00, 0x00, 0x00]); // reserved = 0 data.extend_from_slice(&[0x00, 0x00, 0x00, 0x00]); data } /// Minimal Mach-O header for x86_64 fn minimal_x86_64_macho() -> Vec { let mut data = Vec::new(); // MH_MAGIC_64 = 0xfeedfacf (little-endian) data.extend_from_slice(&[0xcf, 0xfa, 0xed, 0xfe]); // CPU_TYPE_X86_64 = 0x01000007 (little-endian) data.extend_from_slice(&[0x07, 0x00, 0x00, 0x01]); // CPU_SUBTYPE_X86_64_ALL = 3 data.extend_from_slice(&[0x03, 0x00, 0x00, 0x00]); // MH_EXECUTE = 2 data.extend_from_slice(&[0x02, 0x00, 0x00, 0x00]); // ncmds = 0 data.extend_from_slice(&[0x00, 0x00, 0x00, 0x00]); // sizeofcmds = 0 data.extend_from_slice(&[0x00, 0x00, 0x00, 0x00]); // flags = 0 data.extend_from_slice(&[0x00, 0x00, 0x00, 0x00]); // reserved = 0 data.extend_from_slice(&[0x00, 0x00, 0x00, 0x00]); data } /// Create a fat binary from arm64 and x86_64 slices fn create_fat_binary(arm64: Vec, x86_64: Vec) -> Vec { let mut writer = FatWriter::new(); writer.add(arm64).unwrap(); writer.add(x86_64).unwrap(); let mut output = Vec::new(); writer.write_to(&mut output).unwrap(); output } #[test] fn fat_binary_with_both_archs_passes() { let tmp_dir = tempfile::tempdir().unwrap(); let lib_path = tmp_dir.path().join("libfoo.dylib"); let fat_binary = create_fat_binary(minimal_arm64_macho(), minimal_x86_64_macho()); fs_err::write(&lib_path, fat_binary).unwrap(); let required: HashSet = ["arm64", "x86_64"].iter().map(|s| s.to_string()).collect(); let result = verify_universal_archs(&lib_path, &required, "libfoo.dylib"); assert!(result.is_ok()); } #[test] fn fat_binary_missing_arch_fails() { let tmp_dir = tempfile::tempdir().unwrap(); let lib_path = tmp_dir.path().join("libfoo.dylib"); // Create fat binary with only arm64 (not a real fat, just arm64 thin) // For this test, we use a fat binary with only arm64 let mut writer = FatWriter::new(); writer.add(minimal_arm64_macho()).unwrap(); let mut output = Vec::new(); writer.write_to(&mut output).unwrap(); fs_err::write(&lib_path, output).unwrap(); let required: HashSet = ["arm64", "x86_64"].iter().map(|s| s.to_string()).collect(); let result = verify_universal_archs(&lib_path, &required, "libfoo.dylib"); assert!(result.is_err()); let err_msg = result.unwrap_err().to_string(); assert!(err_msg.contains("missing architecture")); assert!(err_msg.contains("x86_64")); } #[test] fn thin_binary_with_multiple_required_archs_fails() { let tmp_dir = tempfile::tempdir().unwrap(); let lib_path = tmp_dir.path().join("libfoo.dylib"); // Write a thin arm64 binary fs_err::write(&lib_path, minimal_arm64_macho()).unwrap(); let required: HashSet = ["arm64", "x86_64"].iter().map(|s| s.to_string()).collect(); let result = verify_universal_archs(&lib_path, &required, "libfoo.dylib"); assert!(result.is_err()); let err_msg = result.unwrap_err().to_string(); assert!(err_msg.contains("thin (single-architecture)")); } #[test] fn thin_binary_with_single_required_arch_passes() { let tmp_dir = tempfile::tempdir().unwrap(); let lib_path = tmp_dir.path().join("libfoo.dylib"); // Write a thin arm64 binary fs_err::write(&lib_path, minimal_arm64_macho()).unwrap(); // Only arm64 required - should pass (we assume it matches) let required: HashSet = ["arm64"].iter().map(|s| s.to_string()).collect(); let result = verify_universal_archs(&lib_path, &required, "libfoo.dylib"); assert!(result.is_ok()); } #[test] fn invalid_macho_fails_with_parse_error() { let tmp_dir = tempfile::tempdir().unwrap(); let lib_path = tmp_dir.path().join("libfoo.dylib"); // Write invalid data (not a Mach-O) let mut f = fs_err::File::create(&lib_path).unwrap(); f.write_all(b"not a macho file").unwrap(); let required: HashSet = ["arm64"].iter().map(|s| s.to_string()).collect(); let result = verify_universal_archs(&lib_path, &required, "libfoo.dylib"); assert!(result.is_err()); let err_msg = result.unwrap_err().to_string(); assert!(err_msg.contains("Failed to parse Mach-O")); } } } maturin-1.16.0/src/auditwheel/macos_sign.rs000066400000000000000000000211201527064705700207010ustar00rootroot00000000000000//! Pure-Rust ad-hoc code signing for Mach-O binaries. //! //! This module provides ad-hoc code signing for both thin and fat (universal) Mach-O //! binaries. On macOS, it uses Apple's `codesign` CLI tool directly. For cross-compilation //! from other platforms, it uses `arwen-codesign` as a pure-Rust fallback. //! //! The signatures produced are functionally equivalent to those created by Apple's //! `codesign -s -` command and pass all verification checks. use anyhow::{Context, Result}; #[cfg(not(target_os = "macos"))] use arwen_codesign::{AdhocSignOptions, adhoc_sign}; #[cfg(not(target_os = "macos"))] use fat_macho::{Error as FatMachoError, FatReader, FatWriter}; use std::path::Path; #[cfg(target_os = "macos")] use std::process::Command; #[cfg(not(target_os = "macos"))] use tempfile::NamedTempFile; /// Ad-hoc codesign Mach-O bytes, handling both thin and fat (universal) binaries. /// /// For fat binaries, each architecture slice is signed individually and then /// the slices are reassembled into a new fat binary. This approach requires that /// each thin slice has an existing `LC_CODE_SIGNATURE` load command (which is the /// case for binaries produced by modern Apple toolchains with `-Wl,-adhoc_codesign`). #[cfg(not(target_os = "macos"))] fn ad_hoc_sign_macho_bytes(data: Vec, identifier: &str) -> Result> { match FatReader::new(&data) { Ok(reader) => { let mut writer = FatWriter::new(); for arch in reader.iter_arches() { let arch = arch.with_context(|| { format!("Failed to iterate fat Mach-O slices for {identifier}") })?; let signed = sign_thin_macho_slice(arch.slice(&data).to_vec(), identifier)?; writer.add(signed).with_context(|| { format!("Failed to rebuild fat Mach-O slices for {identifier}") })?; } let mut rebuilt = Vec::new(); writer .write_to(&mut rebuilt) .with_context(|| format!("Failed to write fat Mach-O for {identifier}"))?; Ok(rebuilt) } Err(FatMachoError::NotFatBinary) => sign_thin_macho_slice(data, identifier), Err(err) => { Err(err).with_context(|| format!("Failed to parse fat Mach-O for {identifier}")) } } } #[cfg(not(target_os = "macos"))] fn sign_thin_macho_slice(data: Vec, identifier: &str) -> Result> { adhoc_sign(data, &AdhocSignOptions::new(identifier)) .with_context(|| format!("Failed to ad-hoc codesign Mach-O slice {identifier}")) } /// Ad-hoc codesign a Mach-O file at the given path. /// /// On macOS, uses Apple's `codesign` CLI tool directly. For cross-compilation /// from other platforms, uses the pure-Rust `arwen-codesign` library. #[cfg(target_os = "macos")] pub(crate) fn ad_hoc_sign(path: &Path) -> Result<()> { let output = Command::new("codesign") .args(["-s", "-", "-f"]) .arg(path) .output() .context("Failed to run codesign command")?; if !output.status.success() { anyhow::bail!( "codesign failed for {}: {}", path.display(), String::from_utf8_lossy(&output.stderr) ); } Ok(()) } /// Ad-hoc codesign a Mach-O file at the given path. /// /// Uses the pure-Rust `arwen-codesign` library for cross-compilation scenarios /// where Apple's `codesign` tool is not available. #[cfg(not(target_os = "macos"))] pub(crate) fn ad_hoc_sign(path: &Path) -> Result<()> { let data = fs_err::read(path)?; let identifier = path .file_name() .and_then(|name| name.to_str()) .unwrap_or("unknown"); let signed = ad_hoc_sign_macho_bytes(data, identifier)?; let metadata = fs_err::metadata(path)?; let parent = path.parent().unwrap_or_else(|| Path::new(".")); let mut temp = NamedTempFile::new_in(parent)?; use std::io::Write; temp.write_all(&signed)?; temp.as_file().sync_all()?; fs_err::set_permissions(temp.path(), metadata.permissions())?; temp.persist(path) .map_err(|err| err.error) .with_context(|| format!("Failed to persist signed Mach-O {}", path.display()))?; Ok(()) } #[cfg(target_os = "macos")] #[cfg(test)] mod tests { use super::*; use std::process::Command; /// Check if the given bytes represent a fat (universal) Mach-O binary. /// /// Fat binaries use magic `0xcafebabe` (big-endian) or `0xbebafeca` (little-endian). fn is_fat_macho(data: &[u8]) -> bool { matches!( data.get(..4), Some([0xca, 0xfe, 0xba, 0xbe] | [0xbe, 0xba, 0xfe, 0xca]) ) } /// Compile a minimal Mach-O binary for the given architecture. /// Returns the path to the compiled binary. fn compile_thin_macho(dir: &Path, arch: &str) -> std::path::PathBuf { /// Minimal C source that compiles to a tiny Mach-O executable. const MINIMAL_C_SOURCE: &str = "int main(){return 0;}"; let src = dir.join("main.c"); let out = dir.join(format!("main_{arch}")); fs_err::write(&src, MINIMAL_C_SOURCE).unwrap(); let status = Command::new("clang") .args([ "-arch", arch, // Ensure LC_CODE_SIGNATURE is present even when cross-compiling "-Wl,-adhoc_codesign", "-o", ]) .arg(&out) .arg(&src) .status() .expect("Failed to run clang"); assert!(status.success(), "clang failed for {arch}"); out } #[test] fn signs_thin_binary_and_verifies() { let temp_dir = tempfile::tempdir().unwrap(); let thin = compile_thin_macho(temp_dir.path(), "arm64"); ad_hoc_sign(&thin).unwrap(); let output = Command::new("codesign") .args(["--verify", "--verbose"]) .arg(&thin) .output() .unwrap(); assert!( output.status.success(), "codesign --verify failed for thin binary: {}", String::from_utf8_lossy(&output.stderr) ); } #[test] fn signs_thin_x86_64_binary_and_verifies() { let temp_dir = tempfile::tempdir().unwrap(); let thin = compile_thin_macho(temp_dir.path(), "x86_64"); ad_hoc_sign(&thin).unwrap(); let output = Command::new("codesign") .args(["--verify", "--verbose"]) .arg(&thin) .output() .unwrap(); assert!( output.status.success(), "codesign --verify failed for thin x86_64 binary: {}", String::from_utf8_lossy(&output.stderr) ); } #[test] fn signs_fat_binary_from_thin_slices() { use fat_macho::{FatReader, FatWriter}; // Test the fat binary signing flow by building thin binaries, // manually creating a fat binary with FatWriter, and signing it. // This simulates what happens when bundling dylibs from different // architectures into a universal binary. let temp_dir = tempfile::tempdir().unwrap(); let arm64 = compile_thin_macho(temp_dir.path(), "arm64"); let x86_64 = compile_thin_macho(temp_dir.path(), "x86_64"); // Read the thin binaries (each has its own LC_CODE_SIGNATURE) let arm64_data = fs_err::read(&arm64).unwrap(); let x86_64_data = fs_err::read(&x86_64).unwrap(); // Build fat binary from self-contained thin slices let mut writer = FatWriter::new(); writer.add(arm64_data).unwrap(); writer.add(x86_64_data).unwrap(); let mut fat = Vec::new(); writer.write_to(&mut fat).unwrap(); // Verify it's a fat binary assert!(is_fat_macho(&fat), "Expected fat binary"); // Write to file and sign with codesign CLI let fat_path = temp_dir.path().join("universal"); fs_err::write(&fat_path, &fat).unwrap(); ad_hoc_sign(&fat_path).unwrap(); // Verify both slices are present after signing let signed = fs_err::read(&fat_path).unwrap(); let reader = FatReader::new(&signed).unwrap(); assert!(reader.extract("arm64").is_some(), "arm64 slice missing"); assert!(reader.extract("x86_64").is_some(), "x86_64 slice missing"); // Verify with codesign let output = Command::new("codesign") .args(["--verify", "--verbose"]) .arg(&fat_path) .output() .unwrap(); assert!( output.status.success(), "codesign --verify failed for fat binary: {}", String::from_utf8_lossy(&output.stderr) ); } } maturin-1.16.0/src/auditwheel/manylinux-policy.json000066400000000000000000004151321527064705700224370ustar00rootroot00000000000000[ { "name": "linux", "aliases": [], "priority": 0, "symbol_versions": {}, "lib_whitelist": [], "blacklist": {} }, { "name": "manylinux_2_5", "aliases": ["manylinux1"], "priority": 100, "symbol_versions": { "i686": { "CXXABI": ["1.3", "1.3.1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "4.0.0", "4.2.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8"], "LIBATOMIC": [], "ZLIB": [] }, "x86_64": { "CXXABI": ["1.3", "1.3.1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0"], "GLIBC": ["2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8"], "LIBATOMIC": [], "ZLIB": [] } }, "lib_whitelist": ["libatomic.so.1", "libgcc_s.so.1", "libstdc++.so.6", "libm.so.6", "libanl.so.1", "libdl.so.2", "librt.so.1", "libc.so.6", "libnsl.so.1", "libutil.so.1", "libpthread.so.0", "libX11.so.6", "libXext.so.6", "libXrender.so.1", "libICE.so.6", "libSM.so.6", "libGL.so.1", "libgobject-2.0.so.0", "libgthread-2.0.so.0", "libglib-2.0.so.0", "libresolv.so.2", "libz.so.1"], "blacklist": { "libc.so.6": ["__cxa_thread_atexit_impl", "__issignaling", "__issignalingf", "__issignalingl", "pthread_getattr_default_np", "pthread_setattr_default_np"], "libm.so.6": ["__issignaling", "__issignalingf", "__issignalingl"], "libpthread.so.0": ["pthread_getattr_default_np", "pthread_setattr_default_np"], "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "adler32_default", "bi_windup", "crc32_acle", "crc32_combine_gen", "crc32_combine_gen64", "crc32_combine_op", "crc32_le_vgfm_16", "crc32_neon", "crc32_vpmsum", "crc32_z_default", "crc_fold_512to32", "crc_fold_copy", "crc_fold_init", "deflate_copyright", "deflate_medium", "fill_window", "flush_pending", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "longest_match", "slide_hash_sse", "static_ltree", "uncompress2", "x86_check_features", "x86_cpu_has_pclmul", "x86_cpu_has_sse2", "x86_cpu_has_sse42", "sse2_slide_hash", "z_errmsg", "z_vstring", "zcalloc", "zcfree"] } }, { "name": "manylinux_2_12", "aliases": ["manylinux2010"], "priority": 90, "symbol_versions": { "i686": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13"], "LIBATOMIC": [], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4"] }, "x86_64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0"], "GLIBC": ["2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13"], "LIBATOMIC": [], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4"] } }, "lib_whitelist": ["libatomic.so.1", "libgcc_s.so.1", "libstdc++.so.6", "libm.so.6", "libanl.so.1", "libdl.so.2", "librt.so.1", "libc.so.6", "libnsl.so.1", "libutil.so.1", "libpthread.so.0", "libX11.so.6", "libXext.so.6", "libXrender.so.1", "libICE.so.6", "libSM.so.6", "libGL.so.1", "libgobject-2.0.so.0", "libgthread-2.0.so.0", "libglib-2.0.so.0", "libresolv.so.2", "libexpat.so.1", "libz.so.1"], "blacklist": { "libc.so.6": ["__cxa_thread_atexit_impl", "__issignaling", "__issignalingf", "__issignalingl", "pthread_getattr_default_np", "pthread_setattr_default_np"], "libm.so.6": ["__issignaling", "__issignalingf", "__issignalingl"], "libpthread.so.0": ["pthread_getattr_default_np", "pthread_setattr_default_np"], "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "adler32_default", "bi_windup", "crc32_acle", "crc32_combine_gen", "crc32_combine_gen64", "crc32_combine_op", "crc32_le_vgfm_16", "crc32_neon", "crc32_vpmsum", "crc32_z_default", "crc_fold_512to32", "crc_fold_copy", "crc_fold_init", "deflate_copyright", "deflate_medium", "fill_window", "flush_pending", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "longest_match", "slide_hash_sse", "static_ltree", "uncompress2", "x86_check_features", "x86_cpu_has_pclmul", "x86_cpu_has_sse2", "x86_cpu_has_sse42", "sse2_slide_hash", "z_errmsg", "z_vstring", "zcalloc", "zcfree"] } }, { "name": "manylinux_2_17", "aliases": ["manylinux2014"], "priority": 80, "symbol_versions": { "i686": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "4.8.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19"], "LIBATOMIC": ["1.0"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2"] }, "x86_64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "4.8.0"], "GLIBC": ["2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19"], "LIBATOMIC": [], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2"] }, "aarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.5.0", "4.7.0"], "GLIBC": ["2.0", "2.17", "2.18"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19"], "LIBATOMIC": ["1.0"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2"] }, "ppc64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "4.8.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19"], "LIBATOMIC": ["1.0"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2"] }, "ppc64le": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0"], "GLIBC": ["2.0", "2.17"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.7"], "LIBATOMIC": ["1.0"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2"] }, "s390x": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.1.0", "4.2.0", "4.3.0", "4.7.0"], "GLIBC": ["2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.7"], "LIBATOMIC": [], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2"] }, "armv7l": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "ARM_1.3.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.3.4", "3.4", "3.4.2", "3.5", "4.0.0", "4.2.0", "4.3.0", "4.7.0"], "GLIBC": ["2.0", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19"], "LIBATOMIC": ["1.0"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2"] } }, "lib_whitelist": ["libatomic.so.1", "libgcc_s.so.1", "libstdc++.so.6", "libm.so.6", "libanl.so.1", "libdl.so.2", "librt.so.1", "libc.so.6", "libnsl.so.1", "libutil.so.1", "libpthread.so.0", "libX11.so.6", "libXext.so.6", "libXrender.so.1", "libICE.so.6", "libSM.so.6", "libGL.so.1", "libgobject-2.0.so.0", "libgthread-2.0.so.0", "libglib-2.0.so.0", "libresolv.so.2", "libexpat.so.1", "libz.so.1"], "blacklist": { "libc.so.6": ["__cxa_thread_atexit_impl", "__issignaling", "__issignalingf", "__issignalingl", "pthread_getattr_default_np", "pthread_setattr_default_np"], "libm.so.6": ["__issignaling", "__issignalingf", "__issignalingl"], "libpthread.so.0": ["pthread_getattr_default_np", "pthread_setattr_default_np"], "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "adler32_default", "bi_windup", "crc32_acle", "crc32_combine_gen", "crc32_combine_gen64", "crc32_combine_op", "crc32_le_vgfm_16", "crc32_neon", "crc32_vpmsum", "crc32_z_default", "crc_fold_512to32", "crc_fold_copy", "crc_fold_init", "deflate_copyright", "deflate_medium", "fill_window", "flush_pending", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "longest_match", "slide_hash_sse", "static_ltree", "uncompress2", "x86_check_features", "x86_cpu_has_pclmul", "x86_cpu_has_sse2", "x86_cpu_has_sse42", "sse2_slide_hash", "z_errmsg", "z_vstring", "zcalloc", "zcfree"] } }, { "name": "manylinux_2_24", "aliases": [], "priority": 70, "symbol_versions": { "i686": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "4.8.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2"] }, "x86_64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "4.8.0"], "GLIBC": ["2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2"] }, "aarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.5.0", "4.7.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2"] }, "ppc64le": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2"] }, "s390x": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.1.0", "4.2.0", "4.3.0", "4.7.0"], "GLIBC": ["2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.19", "2.22", "2.23", "2.24"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2"] }, "armv7l": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "ARM_1.3.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.3.4", "3.4", "3.4.2", "3.5", "4.0.0", "4.2.0", "4.3.0", "4.7.0"], "GLIBC": ["2.0", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2"] } }, "lib_whitelist": ["libatomic.so.1", "libgcc_s.so.1", "libstdc++.so.6", "libm.so.6", "libmvec.so.1", "libanl.so.1", "libdl.so.2", "librt.so.1", "libc.so.6", "libnsl.so.1", "libutil.so.1", "libpthread.so.0", "libX11.so.6", "libXext.so.6", "libXrender.so.1", "libICE.so.6", "libSM.so.6", "libGL.so.1", "libgobject-2.0.so.0", "libgthread-2.0.so.0", "libglib-2.0.so.0", "libresolv.so.2", "libexpat.so.1", "libz.so.1"], "blacklist": { "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "adler32_default", "bi_windup", "crc32_acle", "crc32_combine_gen", "crc32_combine_gen64", "crc32_combine_op", "crc32_le_vgfm_16", "crc32_neon", "crc32_vpmsum", "crc32_z_default", "crc_fold_512to32", "crc_fold_copy", "crc_fold_init", "deflate_copyright", "deflate_medium", "fill_window", "flush_pending", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "longest_match", "slide_hash_sse", "static_ltree", "uncompress2", "x86_check_features", "x86_cpu_has_pclmul", "x86_cpu_has_sse2", "x86_cpu_has_sse42", "sse2_slide_hash", "z_errmsg", "z_vstring", "zcalloc", "zcfree"] } }, { "name": "manylinux_2_26", "aliases": [], "priority": 68, "symbol_versions": { "i686": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "4.8.0", "7.0.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "x86_64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "4.8.0"], "GLIBC": ["2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2"] }, "aarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.5.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2"] }, "ppc64le": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "s390x": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.1.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.19", "2.22", "2.23", "2.24", "2.25", "2.26"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "armv7l": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "ARM_1.3.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.3.4", "3.4", "3.4.2", "3.5", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] } }, "lib_whitelist": ["libatomic.so.1", "libgcc_s.so.1", "libstdc++.so.6", "libm.so.6", "libmvec.so.1", "libanl.so.1", "libdl.so.2", "librt.so.1", "libc.so.6", "libnsl.so.1", "libutil.so.1", "libpthread.so.0", "libX11.so.6", "libXext.so.6", "libXrender.so.1", "libICE.so.6", "libSM.so.6", "libGL.so.1", "libgobject-2.0.so.0", "libgthread-2.0.so.0", "libglib-2.0.so.0", "libresolv.so.2", "libexpat.so.1", "libz.so.1"], "blacklist": { "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "adler32_default", "bi_windup", "crc32_acle", "crc32_combine_gen", "crc32_combine_gen64", "crc32_combine_op", "crc32_le_vgfm_16", "crc32_neon", "crc32_vpmsum", "crc32_z_default", "crc_fold_512to32", "crc_fold_copy", "crc_fold_init", "deflate_copyright", "deflate_medium", "fill_window", "flush_pending", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "longest_match", "slide_hash_sse", "static_ltree", "uncompress2", "x86_check_features", "x86_cpu_has_pclmul", "x86_cpu_has_sse2", "x86_cpu_has_sse42", "sse2_slide_hash", "z_errmsg", "z_vstring", "zcalloc", "zcfree"] } }, { "name": "manylinux_2_27", "aliases": [], "priority": 65, "symbol_versions": { "i686": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "4.8.0", "7.0.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "x86_64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "4.8.0", "7.0.0"], "GLIBC": ["2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "aarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.5.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "ppc64le": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "s390x": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.1.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.19", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "armv7l": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "ARM_1.3.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.3.4", "3.4", "3.4.2", "3.5", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] } }, "lib_whitelist": ["libatomic.so.1", "libgcc_s.so.1", "libstdc++.so.6", "libm.so.6", "libmvec.so.1", "libanl.so.1", "libdl.so.2", "librt.so.1", "libc.so.6", "libnsl.so.1", "libutil.so.1", "libpthread.so.0", "libX11.so.6", "libXext.so.6", "libXrender.so.1", "libICE.so.6", "libSM.so.6", "libGL.so.1", "libgobject-2.0.so.0", "libgthread-2.0.so.0", "libglib-2.0.so.0", "libresolv.so.2", "libexpat.so.1", "libz.so.1"], "blacklist": { "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "adler32_default", "bi_windup", "crc32_acle", "crc32_combine_gen", "crc32_combine_gen64", "crc32_combine_op", "crc32_le_vgfm_16", "crc32_neon", "crc32_vpmsum", "crc32_z_default", "crc_fold_512to32", "crc_fold_copy", "crc_fold_init", "deflate_copyright", "deflate_medium", "fill_window", "flush_pending", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "longest_match", "slide_hash_sse", "static_ltree", "uncompress2", "x86_check_features", "x86_cpu_has_pclmul", "x86_cpu_has_sse2", "x86_cpu_has_sse42", "sse2_slide_hash", "z_errmsg", "z_vstring", "zcalloc", "zcfree"] } }, { "name": "manylinux_2_28", "aliases": [], "priority": 64, "symbol_versions": { "i686": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "4.8.0", "7.0.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "x86_64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "4.8.0", "7.0.0"], "GLIBC": ["2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "aarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.5.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "ppc64le": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "s390x": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.1.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.19", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "armv7l": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "ARM_1.3.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.3.4", "3.4", "3.4.2", "3.5", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] } }, "lib_whitelist": ["libatomic.so.1", "libgcc_s.so.1", "libstdc++.so.6", "libm.so.6", "libmvec.so.1", "libanl.so.1", "libdl.so.2", "librt.so.1", "libc.so.6", "libnsl.so.1", "libutil.so.1", "libpthread.so.0", "libX11.so.6", "libXext.so.6", "libXrender.so.1", "libICE.so.6", "libSM.so.6", "libGL.so.1", "libgobject-2.0.so.0", "libgthread-2.0.so.0", "libglib-2.0.so.0", "libresolv.so.2", "libexpat.so.1", "libz.so.1"], "blacklist": { "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "adler32_default", "bi_windup", "crc32_acle", "crc32_combine_gen", "crc32_combine_gen64", "crc32_combine_op", "crc32_le_vgfm_16", "crc32_neon", "crc32_vpmsum", "crc32_z_default", "crc_fold_512to32", "crc_fold_copy", "crc_fold_init", "deflate_copyright", "deflate_medium", "fill_window", "flush_pending", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "longest_match", "slide_hash_sse", "static_ltree", "uncompress2", "x86_check_features", "x86_cpu_has_pclmul", "x86_cpu_has_sse2", "x86_cpu_has_sse42", "sse2_slide_hash", "z_errmsg", "z_vstring", "zcalloc", "zcfree"] } }, { "name": "manylinux_2_31", "aliases": [], "priority": 61, "symbol_versions": { "i686": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "4.8.0", "7.0.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "x86_64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "4.8.0", "7.0.0"], "GLIBC": ["2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "aarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.5.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "ppc64le": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "s390x": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.1.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.19", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "armv7l": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "ARM_1.3.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.3.4", "3.4", "3.4.2", "3.5", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "riscv64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.27", "2.28", "2.29", "2.30", "2.31"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] } }, "lib_whitelist": ["libatomic.so.1", "libgcc_s.so.1", "libstdc++.so.6", "libm.so.6", "libmvec.so.1", "libanl.so.1", "libdl.so.2", "librt.so.1", "libc.so.6", "libnsl.so.1", "libutil.so.1", "libpthread.so.0", "libX11.so.6", "libXext.so.6", "libXrender.so.1", "libICE.so.6", "libSM.so.6", "libGL.so.1", "libgobject-2.0.so.0", "libgthread-2.0.so.0", "libglib-2.0.so.0", "libresolv.so.2", "libexpat.so.1", "libz.so.1"], "blacklist": { "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "adler32_default", "bi_windup", "crc32_acle", "crc32_combine_gen", "crc32_combine_gen64", "crc32_combine_op", "crc32_le_vgfm_16", "crc32_neon", "crc32_vpmsum", "crc32_z_default", "crc_fold_512to32", "crc_fold_copy", "crc_fold_init", "deflate_copyright", "deflate_medium", "fill_window", "flush_pending", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "longest_match", "slide_hash_sse", "static_ltree", "uncompress2", "x86_check_features", "x86_cpu_has_pclmul", "x86_cpu_has_sse2", "x86_cpu_has_sse42", "sse2_slide_hash", "z_errmsg", "z_vstring", "zcalloc", "zcfree"] } }, { "name": "manylinux_2_34", "aliases": [], "priority": 58, "symbol_versions": { "i686": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "4.8.0", "7.0.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "x86_64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "4.8.0", "7.0.0"], "GLIBC": ["2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "aarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.5.0", "4.7.0", "7.0.0", "11.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "ppc64le": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "IEEE128_1.3.13", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "IEEE128_3.4.29", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "s390x": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.1.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.19", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "armv7l": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "ARM_1.3.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.3.4", "3.4", "3.4.2", "3.5", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "riscv64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] } }, "lib_whitelist": ["libatomic.so.1", "libgcc_s.so.1", "libstdc++.so.6", "libm.so.6", "libmvec.so.1", "libanl.so.1", "libdl.so.2", "librt.so.1", "libc.so.6", "libnsl.so.1", "libutil.so.1", "libpthread.so.0", "libX11.so.6", "libXext.so.6", "libXrender.so.1", "libICE.so.6", "libSM.so.6", "libGL.so.1", "libgobject-2.0.so.0", "libgthread-2.0.so.0", "libglib-2.0.so.0", "libresolv.so.2", "libexpat.so.1", "libz.so.1"], "blacklist": { "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "adler32_default", "bi_windup", "crc32_acle", "crc32_combine_gen", "crc32_combine_gen64", "crc32_combine_op", "crc32_le_vgfm_16", "crc32_neon", "crc32_vpmsum", "crc32_z_default", "crc_fold_512to32", "crc_fold_copy", "crc_fold_init", "deflate_copyright", "deflate_medium", "fill_window", "flush_pending", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "longest_match", "slide_hash_sse", "static_ltree", "x86_check_features", "x86_cpu_has_pclmul", "x86_cpu_has_sse2", "x86_cpu_has_sse42", "sse2_slide_hash", "z_errmsg", "z_vstring", "zcalloc", "zcfree"] } }, { "name": "manylinux_2_35", "aliases": [], "priority": 57, "symbol_versions": { "i686": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "4.8.0", "7.0.0", "12.0.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "x86_64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "4.8.0", "7.0.0", "12.0.0"], "GLIBC": ["2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "aarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.5.0", "4.7.0", "7.0.0", "11.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "ppc64le": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "IEEE128_1.3.13", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "IEEE128_3.4.29", "IEEE128_3.4.30", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "s390x": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.1.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.19", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "armv7l": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "ARM_1.3.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.3.4", "3.4", "3.4.2", "3.5", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "riscv64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] } }, "lib_whitelist": ["libatomic.so.1", "libgcc_s.so.1", "libstdc++.so.6", "libm.so.6", "libmvec.so.1", "libanl.so.1", "libdl.so.2", "librt.so.1", "libc.so.6", "libnsl.so.1", "libutil.so.1", "libpthread.so.0", "libX11.so.6", "libXext.so.6", "libXrender.so.1", "libICE.so.6", "libSM.so.6", "libGL.so.1", "libgobject-2.0.so.0", "libgthread-2.0.so.0", "libglib-2.0.so.0", "libresolv.so.2", "libexpat.so.1", "libz.so.1"], "blacklist": { "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "adler32_default", "bi_windup", "crc32_acle", "crc32_combine_gen", "crc32_combine_gen64", "crc32_combine_op", "crc32_le_vgfm_16", "crc32_neon", "crc32_vpmsum", "crc32_z_default", "crc_fold_512to32", "crc_fold_copy", "crc_fold_init", "deflate_copyright", "deflate_medium", "fill_window", "flush_pending", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "longest_match", "slide_hash_sse", "static_ltree", "x86_check_features", "x86_cpu_has_pclmul", "x86_cpu_has_sse2", "x86_cpu_has_sse42", "sse2_slide_hash", "z_errmsg", "z_vstring", "zcalloc", "zcfree"] } }, { "name": "manylinux_2_36", "aliases": [], "priority": 56, "symbol_versions": { "i686": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "4.8.0", "7.0.0", "12.0.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "x86_64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "4.8.0", "7.0.0", "12.0.0"], "GLIBC": ["2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "aarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.5.0", "4.7.0", "7.0.0", "11.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "ppc64le": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "IEEE128_1.3.13", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "IEEE128_3.4.29", "IEEE128_3.4.30", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "s390x": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.1.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.19", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "armv7l": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "ARM_1.3.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.3.4", "3.4", "3.4.2", "3.5", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "riscv64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] }, "loongarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.36", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9"] } }, "lib_whitelist": ["libatomic.so.1", "libgcc_s.so.1", "libstdc++.so.6", "libm.so.6", "libmvec.so.1", "libanl.so.1", "libdl.so.2", "librt.so.1", "libc.so.6", "libnsl.so.1", "libutil.so.1", "libpthread.so.0", "libX11.so.6", "libXext.so.6", "libXrender.so.1", "libICE.so.6", "libSM.so.6", "libGL.so.1", "libgobject-2.0.so.0", "libgthread-2.0.so.0", "libglib-2.0.so.0", "libresolv.so.2", "libexpat.so.1", "libz.so.1"], "blacklist": { "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "adler32_default", "crc32_acle", "crc32_combine_gen", "crc32_combine_gen64", "crc32_combine_op", "crc32_le_vgfm_16", "crc32_neon", "crc32_vpmsum", "crc32_z_default", "deflate_copyright", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "sse2_slide_hash", "z_errmsg", "z_vstring", "zcalloc", "zcfree"] } }, { "name": "manylinux_2_37", "aliases": [], "priority": 55, "symbol_versions": { "i686": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "4.8.0", "7.0.0", "12.0.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "x86_64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "4.8.0", "7.0.0", "12.0.0"], "GLIBC": ["2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "aarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.5.0", "4.7.0", "7.0.0", "11.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "ppc64le": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "IEEE128_1.3.13", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "IEEE128_3.4.29", "IEEE128_3.4.30", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "s390x": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.1.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.19", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "armv7l": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "ARM_1.3.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.3.4", "3.4", "3.4.2", "3.5", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "riscv64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "loongarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.36", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] } }, "lib_whitelist": ["libatomic.so.1", "libgcc_s.so.1", "libstdc++.so.6", "libm.so.6", "libmvec.so.1", "libanl.so.1", "libdl.so.2", "librt.so.1", "libc.so.6", "libnsl.so.1", "libutil.so.1", "libpthread.so.0", "libX11.so.6", "libXext.so.6", "libXrender.so.1", "libICE.so.6", "libSM.so.6", "libGL.so.1", "libgobject-2.0.so.0", "libgthread-2.0.so.0", "libglib-2.0.so.0", "libresolv.so.2", "libexpat.so.1", "libz.so.1"], "blacklist": { "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "adler32_default", "crc32_acle", "crc32_le_vgfm_16", "crc32_neon", "crc32_vpmsum", "crc32_z_default", "deflate_copyright", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "sse2_slide_hash", "z_errmsg", "z_vstring", "zcalloc", "zcfree"] } }, { "name": "manylinux_2_38", "aliases": [], "priority": 54, "symbol_versions": { "i686": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "4.8.0", "7.0.0", "12.0.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37", "2.38", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "x86_64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "4.8.0", "7.0.0", "12.0.0"], "GLIBC": ["2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "aarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.5.0", "4.7.0", "7.0.0", "11.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "ppc64le": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "IEEE128_1.3.13", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "IEEE128_3.4.29", "IEEE128_3.4.30", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "s390x": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.1.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.19", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "armv7l": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "ARM_1.3.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.3.4", "3.4", "3.4.2", "3.5", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37", "2.38", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "riscv64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37", "2.38", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "loongarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "7.0.0"], "GLIBC": ["2.0", "2.36", "2.38", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] } }, "lib_whitelist": ["libatomic.so.1", "libgcc_s.so.1", "libstdc++.so.6", "libm.so.6", "libmvec.so.1", "libanl.so.1", "libdl.so.2", "librt.so.1", "libc.so.6", "libnsl.so.1", "libutil.so.1", "libpthread.so.0", "libX11.so.6", "libXext.so.6", "libXrender.so.1", "libICE.so.6", "libSM.so.6", "libGL.so.1", "libgobject-2.0.so.0", "libgthread-2.0.so.0", "libglib-2.0.so.0", "libresolv.so.2", "libexpat.so.1", "libz.so.1"], "blacklist": { "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "adler32_default", "crc32_acle", "crc32_le_vgfm_16", "crc32_neon", "crc32_vpmsum", "crc32_z_default", "deflate_copyright", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "sse2_slide_hash", "z_errmsg", "z_vstring", "zcalloc", "zcfree"] } }, { "name": "manylinux_2_39", "aliases": [], "priority": 53, "symbol_versions": { "i686": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "4.8.0", "7.0.0", "12.0.0", "13.0.0", "14.0.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37", "2.38", "2.39", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "x86_64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "4.8.0", "7.0.0", "12.0.0", "13.0.0", "14.0.0"], "GLIBC": ["2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "2.39", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "aarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.5.0", "4.7.0", "7.0.0", "11.0", "13.0.0", "14.0", "14.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "2.39", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "ppc64le": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "IEEE128_1.3.13", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "2.39", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33", "IEEE128_3.4.29", "IEEE128_3.4.30", "IEEE128_3.4.31", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.31", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "s390x": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.1.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.19", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "2.39", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.31", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "armv7l": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "ARM_1.3.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.3.4", "3.4", "3.4.2", "3.5", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.0", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37", "2.38", "2.39", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "riscv64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.0", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37", "2.38", "2.39", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "loongarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.0", "2.36", "2.38", "2.39", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] } }, "lib_whitelist": ["libatomic.so.1", "libgcc_s.so.1", "libstdc++.so.6", "libm.so.6", "libmvec.so.1", "libanl.so.1", "libdl.so.2", "librt.so.1", "libc.so.6", "libnsl.so.1", "libutil.so.1", "libpthread.so.0", "libX11.so.6", "libXext.so.6", "libXrender.so.1", "libICE.so.6", "libSM.so.6", "libGL.so.1", "libgobject-2.0.so.0", "libgthread-2.0.so.0", "libglib-2.0.so.0", "libresolv.so.2", "libexpat.so.1", "libz.so.1"], "blacklist": { "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "adler32_default", "crc32_acle", "crc32_le_vgfm_16", "crc32_neon", "crc32_vpmsum", "crc32_z_default", "deflate_copyright", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "sse2_slide_hash", "z_errmsg", "z_vstring", "zcalloc", "zcfree"] } }, { "name": "manylinux_2_40", "aliases": [], "priority": 52, "symbol_versions": { "i686": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "4.8.0", "7.0.0", "12.0.0", "13.0.0", "14.0.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37", "2.38", "2.39", "2.40", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "x86_64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "4.8.0", "7.0.0", "12.0.0", "13.0.0", "14.0.0"], "GLIBC": ["2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "2.39", "2.40", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "aarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.5.0", "4.7.0", "7.0.0", "11.0", "13.0.0", "14.0", "14.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "2.39", "2.40", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "ppc64le": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "IEEE128_1.3.13", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "2.39", "2.40", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33", "IEEE128_3.4.29", "IEEE128_3.4.30", "IEEE128_3.4.31", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.31", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "s390x": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.1.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.19", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "2.39", "2.40", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.31", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "armv7l": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "ARM_1.3.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.3.4", "3.4", "3.4.2", "3.5", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.0", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37", "2.38", "2.39", "2.40", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "riscv64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.0", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37", "2.38", "2.39", "2.40", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "loongarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.0", "2.36", "2.38", "2.39", "2.40", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] } }, "lib_whitelist": ["libatomic.so.1", "libgcc_s.so.1", "libstdc++.so.6", "libm.so.6", "libmvec.so.1", "libanl.so.1", "libdl.so.2", "librt.so.1", "libc.so.6", "libnsl.so.1", "libutil.so.1", "libpthread.so.0", "libX11.so.6", "libXext.so.6", "libXrender.so.1", "libICE.so.6", "libSM.so.6", "libGL.so.1", "libgobject-2.0.so.0", "libgthread-2.0.so.0", "libglib-2.0.so.0", "libresolv.so.2", "libexpat.so.1", "libz.so.1"], "blacklist": { "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "adler32_default", "crc32_acle", "crc32_le_vgfm_16", "crc32_neon", "crc32_vpmsum", "crc32_z_default", "deflate_copyright", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "sse2_slide_hash", "z_errmsg", "z_vstring", "zcalloc", "zcfree"] } }, { "name": "manylinux_2_41", "aliases": [], "priority": 51, "symbol_versions": { "i686": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "4.8.0", "7.0.0", "12.0.0", "13.0.0", "14.0.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37", "2.38", "2.39", "2.40", "2.41", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "x86_64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "4.8.0", "7.0.0", "12.0.0", "13.0.0", "14.0.0"], "GLIBC": ["2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "2.39", "2.40", "2.41", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "aarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.5.0", "4.7.0", "7.0.0", "11.0", "13.0.0", "14.0", "14.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "2.39", "2.40", "2.41", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "ppc64le": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "IEEE128_1.3.13", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "2.39", "2.40", "2.41", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33", "IEEE128_3.4.29", "IEEE128_3.4.30", "IEEE128_3.4.31", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.31", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "s390x": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.1.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.19", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "2.39", "2.40", "2.41", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.31", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "armv7l": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "ARM_1.3.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.3.4", "3.4", "3.4.2", "3.5", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.0", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37", "2.38", "2.39", "2.40", "2.41", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "riscv64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.0", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37", "2.38", "2.39", "2.40", "2.41", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "loongarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.0", "2.36", "2.38", "2.39", "2.40", "2.41", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] } }, "lib_whitelist": ["libatomic.so.1", "libgcc_s.so.1", "libstdc++.so.6", "libm.so.6", "libmvec.so.1", "libanl.so.1", "libdl.so.2", "librt.so.1", "libc.so.6", "libnsl.so.1", "libutil.so.1", "libpthread.so.0", "libX11.so.6", "libXext.so.6", "libXrender.so.1", "libICE.so.6", "libSM.so.6", "libGL.so.1", "libgobject-2.0.so.0", "libgthread-2.0.so.0", "libglib-2.0.so.0", "libresolv.so.2", "libexpat.so.1", "libz.so.1"], "blacklist": { "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "adler32_default", "crc32_acle", "crc32_le_vgfm_16", "crc32_neon", "crc32_vpmsum", "crc32_z_default", "deflate_copyright", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "sse2_slide_hash", "z_errmsg", "z_vstring", "zcalloc", "zcfree"] } }, { "name": "manylinux_2_42", "aliases": [], "priority": 50, "symbol_versions": { "i686": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "4.8.0", "7.0.0", "12.0.0", "13.0.0", "14.0.0"], "GLIBC": ["2.0", "2.1", "2.1.1", "2.1.2", "2.1.3", "2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37", "2.38", "2.39", "2.40", "2.41", "2.42", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33", "3.4.34"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "x86_64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "FLOAT128", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "4.8.0", "7.0.0", "12.0.0", "13.0.0", "14.0.0"], "GLIBC": ["2.2.5", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "2.39", "2.40", "2.41", "2.42", "ABI_DT_RELR", "ABI_DT_X86_64_PLT", "ABI_GNU2_TLS"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33", "3.4.34"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "aarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.5.0", "4.7.0", "7.0.0", "11.0", "13.0.0", "14.0", "14.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "2.39", "2.40", "2.41", "2.42", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33", "3.4.34"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "ppc64le": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "IEEE128_1.3.13", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.0", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "2.39", "2.40", "2.41", "2.42", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33", "3.4.34", "IEEE128_3.4.29", "IEEE128_3.4.30", "IEEE128_3.4.31", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.31", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "s390x": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "LDBL_1.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.1.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.2", "2.2.1", "2.2.2", "2.2.3", "2.2.4", "2.2.6", "2.3", "2.3.2", "2.3.3", "2.3.4", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.19", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.38", "2.39", "2.40", "2.41", "2.42", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33", "3.4.34", "LDBL_3.4", "LDBL_3.4.10", "LDBL_3.4.21", "LDBL_3.4.29", "LDBL_3.4.31", "LDBL_3.4.7"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "armv7l": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "ARM_1.3.3", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.3.4", "3.4", "3.4.2", "3.5", "4.0.0", "4.2.0", "4.3.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.0", "2.4", "2.5", "2.6", "2.7", "2.8", "2.9", "2.10", "2.11", "2.12", "2.13", "2.14", "2.15", "2.16", "2.17", "2.18", "2.22", "2.23", "2.24", "2.25", "2.26", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37", "2.38", "2.39", "2.40", "2.41", "2.42", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33", "3.4.34"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "riscv64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "1.3.16", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.0", "2.27", "2.28", "2.29", "2.30", "2.31", "2.32", "2.33", "2.34", "2.35", "2.36", "2.37", "2.38", "2.39", "2.40", "2.41", "2.42", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33", "3.4.34"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] }, "loongarch64": { "CXXABI": ["1.3", "1.3.1", "1.3.2", "1.3.3", "1.3.4", "1.3.5", "1.3.6", "1.3.7", "1.3.8", "1.3.9", "1.3.10", "1.3.11", "1.3.12", "1.3.13", "1.3.14", "1.3.15", "TM_1"], "GCC": ["3.0", "3.3", "3.3.1", "3.4", "3.4.2", "3.4.4", "4.0.0", "4.2.0", "4.3.0", "4.4.0", "4.5.0", "4.7.0", "7.0.0", "14.0.0"], "GLIBC": ["2.0", "2.36", "2.38", "2.39", "2.40", "2.41", "2.42", "ABI_DT_RELR"], "GLIBCXX": ["3.4", "3.4.1", "3.4.2", "3.4.3", "3.4.4", "3.4.5", "3.4.6", "3.4.7", "3.4.8", "3.4.9", "3.4.10", "3.4.11", "3.4.12", "3.4.13", "3.4.14", "3.4.15", "3.4.16", "3.4.17", "3.4.18", "3.4.19", "3.4.20", "3.4.21", "3.4.22", "3.4.23", "3.4.24", "3.4.25", "3.4.26", "3.4.27", "3.4.28", "3.4.29", "3.4.30", "3.4.31", "3.4.32", "3.4.33", "3.4.34"], "LIBATOMIC": ["1.0", "1.1", "1.2"], "ZLIB": ["1.2.0", "1.2.0.2", "1.2.0.8", "1.2.2", "1.2.2.3", "1.2.2.4", "1.2.3.3", "1.2.3.4", "1.2.3.5", "1.2.5.1", "1.2.5.2", "1.2.7.1", "1.2.9", "1.2.12"] } }, "lib_whitelist": ["libatomic.so.1", "libgcc_s.so.1", "libstdc++.so.6", "libm.so.6", "libmvec.so.1", "libanl.so.1", "libdl.so.2", "librt.so.1", "libc.so.6", "libnsl.so.1", "libutil.so.1", "libpthread.so.0", "libX11.so.6", "libXext.so.6", "libXrender.so.1", "libICE.so.6", "libSM.so.6", "libGL.so.1", "libgobject-2.0.so.0", "libgthread-2.0.so.0", "libglib-2.0.so.0", "libresolv.so.2", "libexpat.so.1", "libz.so.1"], "blacklist": { "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "adler32_default", "crc32_acle", "crc32_le_vgfm_16", "crc32_neon", "crc32_vpmsum", "crc32_z_default", "deflate_copyright", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "sse2_slide_hash", "z_errmsg", "z_vstring", "zcalloc", "zcfree"] } } ] maturin-1.16.0/src/auditwheel/mod.rs000066400000000000000000000013461527064705700173460ustar00rootroot00000000000000mod audit; mod linux; #[cfg(feature = "auditwheel")] mod macos; #[cfg(feature = "auditwheel")] mod macos_sign; mod musllinux; pub mod patchelf; #[cfg(feature = "auditwheel")] pub(crate) mod pe_patch; mod platform_tag; mod policy; mod repair; #[cfg(feature = "sbom")] pub mod sbom; #[cfg(feature = "sbom")] mod whichprovides; #[cfg(feature = "auditwheel")] mod windows; pub use audit::*; pub use linux::ElfRepairer; #[cfg(feature = "auditwheel")] pub use macos::MacOSRepairer; pub use platform_tag::{CompatibilityTag, PlatformTag}; pub use policy::Policy; pub use repair::{ AuditResult, AuditedArtifact, PatchKind, WheelRepairer, log_grafted_libs, prepare_grafted_libs, }; #[cfg(feature = "auditwheel")] pub use windows::WindowsRepairer; maturin-1.16.0/src/auditwheel/musllinux-policy.json000066400000000000000000000036361527064705700224550ustar00rootroot00000000000000[ {"name": "linux", "aliases": [], "priority": 0, "symbol_versions": {}, "lib_whitelist": [], "blacklist": {} }, {"name": "musllinux_1_1", "aliases": [], "priority": 100, "symbol_versions": { "i686": { }, "x86_64": { }, "aarch64": { }, "ppc64le": { }, "s390x": { }, "armv7l": { }, "riscv64": { } }, "lib_whitelist": ["libc.so", "libz.so.1"], "blacklist": { "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "bi_windup", "crc32_vpmsum", "crc_fold_512to32", "crc_fold_copy", "crc_fold_init", "deflate_copyright", "deflate_medium", "fill_window", "flush_pending", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "longest_match", "slide_hash_sse", "static_ltree", "uncompress2", "x86_check_features", "x86_cpu_has_pclmul", "x86_cpu_has_sse2", "x86_cpu_has_sse42", "z_errmsg", "zcalloc", "zcfree"] }}, {"name": "musllinux_1_2", "aliases": [], "priority": 90, "symbol_versions": { "i686": { }, "x86_64": { }, "aarch64": { }, "ppc64le": { }, "s390x": { }, "armv7l": { }, "riscv64": { }, "loongarch64": { } }, "lib_whitelist": ["libc.so", "libz.so.1"], "blacklist": { "libz.so.1": ["_dist_code", "_length_code", "_tr_align", "_tr_flush_block", "_tr_init", "_tr_stored_block", "_tr_tally", "bi_windup", "crc32_vpmsum", "crc_fold_512to32", "crc_fold_copy", "crc_fold_init", "deflate_copyright", "deflate_medium", "fill_window", "flush_pending", "gzflags", "inflate_copyright", "inflate_fast", "inflate_table", "longest_match", "slide_hash_sse", "static_ltree", "uncompress2", "x86_check_features", "x86_cpu_has_pclmul", "x86_cpu_has_sse2", "x86_cpu_has_sse42", "z_errmsg", "zcalloc", "zcfree"] }} ] maturin-1.16.0/src/auditwheel/musllinux.rs000066400000000000000000000032521527064705700206250ustar00rootroot00000000000000use anyhow::{Context, Result}; use fs_err as fs; use goblin::elf::Elf; use once_cell::sync::Lazy; use regex::Regex; use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; /// Find musl libc path from executable's ELF header pub fn find_musl_libc() -> Result> { // Try /bin/ls first; fall back to /usr/bin/ls for distros that don't // symlink /bin -> /usr/bin. let ls_path = if Path::new("/bin/ls").exists() { Path::new("/bin/ls") } else { Path::new("/usr/bin/ls") }; let buffer = fs::read(ls_path)?; let elf = Elf::parse(&buffer)?; Ok(elf.interpreter.map(PathBuf::from)) } /// Read the musl version from libc library's output /// /// The libc library should output something like this to stderr:: /// /// musl libc (x86_64) /// Version 1.2.2 /// Dynamic Program Loader pub fn get_musl_version(ld_path: impl AsRef) -> Result> { let ld_path = ld_path.as_ref(); let output = Command::new(ld_path) .stdout(Stdio::null()) .stderr(Stdio::piped()) .output()?; let stderr = std::str::from_utf8(&output.stderr)?; static VERSION_RE: Lazy = Lazy::new(|| Regex::new(r"Version (\d+)\.(\d+)").unwrap()); if let Some(capture) = VERSION_RE.captures(stderr) { let context = "Expected a digit"; let major = capture .get(1) .unwrap() .as_str() .parse::() .context(context)?; let minor = capture .get(2) .unwrap() .as_str() .parse::() .context(context)?; return Ok(Some((major, minor))); } Ok(None) } maturin-1.16.0/src/auditwheel/patchelf.rs000066400000000000000000000065431527064705700203610ustar00rootroot00000000000000use anyhow::{Context, Result, bail}; use std::ffi::OsStr; use std::path::Path; use std::process::Command; static MISSING_PATCHELF_ERROR: &str = "Failed to execute 'patchelf', did you install it? Hint: Try `pip install maturin[patchelf]` (or just `pip install patchelf`)"; /// Run a patchelf command with the given arguments. /// /// Returns `Ok(stdout)` on success, or an error with the stderr message. fn run_patchelf(args: &[&OsStr]) -> Result> { let output = Command::new("patchelf") .args(args) .output() .context(MISSING_PATCHELF_ERROR)?; if !output.status.success() { bail!( "patchelf failed: {}", String::from_utf8_lossy(&output.stderr) ); } Ok(output.stdout) } /// Verify patchelf version pub fn verify_patchelf() -> Result<()> { let stdout = run_patchelf(&[OsStr::new("--version")])?; let version = String::from_utf8(stdout) .context("Failed to parse patchelf version")? .trim() .to_string(); let version = version.strip_prefix("patchelf").unwrap_or(&version).trim(); let semver = version.parse::().context( "Failed to parse patchelf version, auditwheel repair requires patchelf >= 0.14.0.", )?; if semver < semver::Version::new(0, 14, 0) { bail!( "patchelf {} found. auditwheel repair requires patchelf >= 0.14.0.", version ); } Ok(()) } /// Replace a declared dependency on a dynamic library with another one (`DT_NEEDED`) pub fn replace_needed, N: AsRef>( file: impl AsRef, old_new_pairs: &[(O, N)], ) -> Result<()> { let mut args: Vec<&OsStr> = Vec::new(); for (old, new) in old_new_pairs { args.push(OsStr::new("--replace-needed")); args.push(old.as_ref()); args.push(new.as_ref()); } args.push(file.as_ref().as_os_str()); run_patchelf(&args)?; Ok(()) } /// Change `SONAME` of a dynamic library pub fn set_soname>(file: impl AsRef, soname: &S) -> Result<()> { run_patchelf(&[ OsStr::new("--set-soname"), soname.as_ref(), file.as_ref().as_os_str(), ])?; Ok(()) } /// Remove a `RPATH` from executables and libraries pub fn remove_rpath(file: impl AsRef) -> Result<()> { run_patchelf(&[OsStr::new("--remove-rpath"), file.as_ref().as_os_str()])?; Ok(()) } /// Change the `RPATH` of executables and libraries pub fn set_rpath>(file: impl AsRef, rpath: &S) -> Result<()> { remove_rpath(&file)?; run_patchelf(&[ OsStr::new("--force-rpath"), OsStr::new("--set-rpath"), rpath.as_ref(), file.as_ref().as_os_str(), ])?; Ok(()) } /// Get the `RPATH` of executables and libraries pub fn get_rpath(file: impl AsRef) -> Result> { let file = file.as_ref(); let contents = fs_err::read(file)?; match goblin::Object::parse(&contents) { Ok(goblin::Object::Elf(elf)) => { let rpaths = if !elf.runpaths.is_empty() { elf.runpaths } else { elf.rpaths }; Ok(rpaths.iter().map(|r| r.to_string()).collect()) } Ok(_) => bail!("'{}' is not an ELF file", file.display()), Err(e) => bail!("Failed to parse ELF file at '{}': {}", file.display(), e), } } maturin-1.16.0/src/auditwheel/pe_patch.rs000066400000000000000000001003611527064705700203470ustar00rootroot00000000000000//! PE binary patching utilities for Windows wheel repair. //! //! Provides functions to modify PE (Portable Executable) files: //! - Replace imported DLL names in the import directory table //! - Clear DependentLoadFlags to ensure AddDllDirectory works //! - Query PE architecture and linker version //! //! # PE Import Table Patching //! //! When DLLs are bundled with hash-suffixed names (e.g., `foo-ab12cd34.dll`), //! the importing binary must be updated to reference the new name. Unlike //! ELF (patchelf) and Mach-O (install_name_tool), there's no standard tool //! for this on Windows. We implement it directly: //! //! 1. Parse the PE import directory table to find DLL name references //! 2. Find space for new (longer) names in section padding //! 3. Write new names and update import table RVAs //! 4. Fix PE checksum (if non-zero) and remove Authenticode signatures //! //! This matches [delvewheel](https://github.com/adang1345/delvewheel)'s //! approach using the `pefile` Python library. use anyhow::{Context, Result, bail}; use goblin::pe::header::{SIZEOF_COFF_HEADER, SIZEOF_PE_MAGIC}; use goblin::pe::import::SIZEOF_IMPORT_DIRECTORY_ENTRY; use goblin::pe::section_table::{ self, IMAGE_SCN_CNT_CODE, IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_CNT_UNINITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ, SectionTable, }; use std::path::Path; use fs_err as fs; // -- Byte reading/writing helpers -- fn read_u16_le(data: &[u8], offset: usize) -> Result { let bytes = data .get(offset..offset + 2) .ok_or_else(|| anyhow::anyhow!("PE read out of bounds at offset {offset}"))?; Ok(u16::from_le_bytes(bytes.try_into().unwrap())) } fn read_u32_le(data: &[u8], offset: usize) -> Result { let bytes = data .get(offset..offset + 4) .ok_or_else(|| anyhow::anyhow!("PE read out of bounds at offset {offset}"))?; Ok(u32::from_le_bytes(bytes.try_into().unwrap())) } fn write_u16_le(data: &mut [u8], offset: usize, value: u16) { data[offset..offset + 2].copy_from_slice(&value.to_le_bytes()); } fn write_u32_le(data: &mut [u8], offset: usize, value: u32) { data[offset..offset + 4].copy_from_slice(&value.to_le_bytes()); } fn read_cstring(data: &[u8], offset: usize) -> Option { let tail = data.get(offset..)?; let end = tail.iter().position(|&b| b == 0)?; String::from_utf8(data[offset..offset + end].to_vec()).ok() } // -- PE format constants -- const SECTION_HEADER_SIZE: usize = section_table::SIZEOF_SECTION_TABLE; // Data directory indices const DD_IMPORT: usize = 1; const DD_SECURITY: usize = 4; const DD_LOAD_CONFIG: usize = 10; const DD_DELAY_IMPORT: usize = 13; // Import descriptor name RVA field offset within IMAGE_IMPORT_DESCRIPTOR const IMPORT_DESC_NAME_OFFSET: usize = 12; // Delay import descriptor size (8 × u32) const DELAY_IMPORT_DESC_SIZE: usize = 32; // DllNameRVA field offset within IMAGE_DELAYLOAD_DESCRIPTOR const DELAY_IMPORT_NAME_OFFSET: usize = 4; // New section characteristics: readable initialized data const NEW_SECTION_CHARS: u32 = IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA; // -- Parsed PE structures -- struct SectionEntry { table: SectionTable, /// File offset of this section's header entry header_offset: usize, } struct PeLayout { is_64bit: bool, /// Offset to the CheckSum field within the file checksum_offset: usize, /// Offset to the SizeOfInitializedData field size_of_init_data_offset: usize, /// Offset to the SizeOfImage field size_of_image_offset: usize, /// Offset to the SizeOfHeaders field size_of_headers_offset: usize, /// Offset to the NumberOfSections field in COFF header num_sections_offset: usize, /// Offset to the Data Directories array data_dirs_offset: usize, /// Number of data directories num_data_dirs: u32, /// Offset to the section table section_table_offset: usize, file_alignment: u32, section_alignment: u32, sections: Vec, } impl PeLayout { fn section_tables(&self) -> impl Iterator { self.sections.iter().map(|s| &s.table) } } struct ImportRef { /// The DLL name as found in the PE dll_name: String, /// File offset of the Name/DllNameRVA field in the import descriptor name_field_offset: usize, } // -- PE parsing -- fn parse_pe_layout(data: &[u8]) -> Result { let pe = goblin::pe::PE::parse(data).context("Failed to parse PE file")?; let header = &pe.header; let opt = header .optional_header .ok_or_else(|| anyhow::anyhow!("PE file has no optional header"))?; let is_64bit = pe.is_64; let pe_offset = header.dos_header.pe_pointer as usize; let coff_offset = pe_offset + SIZEOF_PE_MAGIC; let num_sections_offset = coff_offset + 2; let opt_hdr_offset = coff_offset + SIZEOF_COFF_HEADER; let opt_hdr_size = header.coff_header.size_of_optional_header as usize; // Compute raw byte offsets for fields we need to patch. // The standard fields start at opt_hdr_offset, followed by windows fields, // then data directories. // SizeOfInitializedData is at offset 8 in the optional header (both PE32 and PE32+) let size_of_init_data_offset = opt_hdr_offset + 8; // SizeOfImage is at windows_fields_offset + 24 (PE32) or windows_fields_offset + 28 (PE32+) // In the raw optional header: offset 56 for both PE32 and PE32+ let size_of_image_offset = opt_hdr_offset + 56; // SizeOfHeaders: offset 60 let size_of_headers_offset = opt_hdr_offset + 60; // CheckSum: offset 64 let checksum_offset = opt_hdr_offset + 64; let data_dirs_offset = if is_64bit { opt_hdr_offset + 112 } else { opt_hdr_offset + 96 }; let num_data_dirs = opt.windows_fields.number_of_rva_and_sizes; let section_table_offset = opt_hdr_offset + opt_hdr_size; let sections = pe .sections .iter() .enumerate() .map(|(i, s)| SectionEntry { table: s.clone(), header_offset: section_table_offset + i * SECTION_HEADER_SIZE, }) .collect(); Ok(PeLayout { is_64bit, checksum_offset, size_of_init_data_offset, size_of_image_offset, size_of_headers_offset, num_sections_offset, data_dirs_offset, num_data_dirs, section_table_offset, file_alignment: opt.windows_fields.file_alignment, section_alignment: opt.windows_fields.section_alignment, sections, }) } fn rva_to_offset(rva: u32, sections: &[SectionTable]) -> Option { for s in sections { // Use max of virtual_size and size_of_raw_data for section ownership. // This handles BSS sections where virtual_size > size_of_raw_data. let span = s.virtual_size.max(s.size_of_raw_data); if rva >= s.virtual_address && rva < s.virtual_address.saturating_add(span) { let delta = rva - s.virtual_address; // Only return a file offset if within the raw data on disk. // RVAs in the zero-fill/BSS tail have no file backing. if delta < s.size_of_raw_data { return Some((s.pointer_to_raw_data + delta) as usize); } else { return None; } } } None } fn get_data_dir(data: &[u8], layout: &PeLayout, index: usize) -> Result> { if index as u32 >= layout.num_data_dirs { return Ok(None); } let off = layout.data_dirs_offset + index * 8; if off + 8 > data.len() { return Ok(None); } let rva = read_u32_le(data, off)?; let size = read_u32_le(data, off + 4)?; if rva == 0 && size == 0 { Ok(None) } else { Ok(Some((rva, size))) } } fn parse_import_descriptors( data: &[u8], sections: &[SectionTable], table_rva: u32, desc_size: usize, name_field_offset: usize, imports: &mut Vec, ) -> Result<()> { let Some(table_offset) = rva_to_offset(table_rva, sections) else { return Ok(()); }; let mut off = table_offset; loop { if off + desc_size > data.len() { break; } let name_rva = read_u32_le(data, off + name_field_offset)?; if name_rva == 0 { break; } if let Some(name_offset) = rva_to_offset(name_rva, sections) && let Some(name) = read_cstring(data, name_offset) { imports.push(ImportRef { dll_name: name, name_field_offset: off + name_field_offset, }); } off += desc_size; } Ok(()) } fn parse_imports(data: &[u8], layout: &PeLayout) -> Result> { let mut imports = Vec::new(); let sections: Vec<_> = layout.section_tables().cloned().collect(); // Regular imports (DataDir[1]) if let Some((rva, _size)) = get_data_dir(data, layout, DD_IMPORT)? { parse_import_descriptors( data, §ions, rva, SIZEOF_IMPORT_DIRECTORY_ENTRY, IMPORT_DESC_NAME_OFFSET, &mut imports, )?; } // Delay-load imports (DataDir[13]) if let Some((rva, _size)) = get_data_dir(data, layout, DD_DELAY_IMPORT)? { parse_import_descriptors( data, §ions, rva, DELAY_IMPORT_DESC_SIZE, DELAY_IMPORT_NAME_OFFSET, &mut imports, )?; } Ok(imports) } // -- Section padding utilities -- /// Check if a section is suitable for writing new DLL name strings. fn is_section_writable(s: &SectionTable) -> bool { s.characteristics & IMAGE_SCN_CNT_CODE == 0 && s.characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA != 0 && s.characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA == 0 && s.characteristics & IMAGE_SCN_MEM_DISCARDABLE == 0 && s.characteristics & IMAGE_SCN_MEM_EXECUTE == 0 && s.characteristics & IMAGE_SCN_MEM_READ != 0 } /// Find padding slots in existing sections for new DLL name strings. /// /// Uses the Next Fit bin packing algorithm (same as delvewheel). /// Returns a mapping from new name index → (file_offset, rva) if all names fit. fn find_padding_slots(sections: &[SectionEntry], new_names: &[&[u8]]) -> Option> { let mut slots = Vec::with_capacity(new_names.len()); let mut name_idx = 0; let mut sorted_sections: Vec<(usize, &SectionEntry)> = sections.iter().enumerate().collect(); sorted_sections.sort_by_key(|(_, s)| s.table.virtual_address); for (si, (_, entry)) in sorted_sections.iter().enumerate() { if name_idx >= new_names.len() { break; } let section = &entry.table; if !is_section_writable(section) || section.virtual_size >= section.size_of_raw_data { continue; } let mut padding_start = section.virtual_size; let padding_end = section.size_of_raw_data; let next_va_limit = sorted_sections .get(si + 1) .map(|(_, s)| s.table.virtual_address - section.virtual_address) .unwrap_or(u32::MAX); while name_idx < new_names.len() { let name_with_null = new_names[name_idx].len() + 1; let space_by_raw = padding_end.saturating_sub(padding_start) as usize; let space_by_va = next_va_limit.saturating_sub(padding_start) as usize; let available = space_by_raw.min(space_by_va); if name_with_null > available { break; } let file_off = section.pointer_to_raw_data as usize + padding_start as usize; let rva = section.virtual_address + padding_start; slots.push((file_off, rva)); padding_start += name_with_null as u32; name_idx += 1; } } if name_idx == new_names.len() { Some(slots) } else { None } } // -- PE checksum -- /// Calculate the PE checksum. /// /// Algorithm: zero the checksum field, sum all u16 words with carry folding, /// then add the file length. fn pe_checksum(data: &[u8], checksum_offset: usize) -> u32 { let mut sum: u64 = 0; let len = data.len(); let mut i = 0; while i + 1 < len { if i == checksum_offset || i == checksum_offset + 2 { i += 2; continue; } let word = u16::from_le_bytes([data[i], data[i + 1]]) as u64; sum += word; sum = (sum & 0xFFFF) + (sum >> 16); i += 2; } if i < len { sum += data[i] as u64; sum = (sum & 0xFFFF) + (sum >> 16); } sum = (sum & 0xFFFF) + (sum >> 16); (sum as u32) + (len as u32) } fn round_up(size: u32, alignment: u32) -> u32 { if alignment == 0 { size } else { size.next_multiple_of(alignment) } } // -- Public API -- /// Replace imported DLL name references in a PE file. /// /// For each `(old_name, new_name)` pair, finds the import directory entry /// that references `old_name` (case-insensitive) and rewrites it to point /// to `new_name`. /// /// Strategy: /// 1. Try to fit new names into existing section padding /// 2. If not enough padding, append a new PE section named "dlvwhl" /// 3. Update import table RVAs, fix headers and checksum /// /// Also clears DependentLoadFlags and removes Authenticode signatures. pub fn replace_needed(file_path: &Path, replacements: &[(&str, &str)]) -> Result<()> { if replacements.is_empty() { clear_dependent_load_flags(file_path)?; return Ok(()); } let mut data = fs::read(file_path)?; // Remove Authenticode signature if it's an appended overlay let layout = parse_pe_layout(&data)?; remove_authenticode(&mut data, &layout)?; let imports = parse_imports(&data, &layout)?; // Build case-insensitive mapping: lowercase old name → (new_name bytes, import ref index) let mut to_replace: Vec<(usize, &[u8])> = Vec::new(); for (old_name, new_name) in replacements { let old_lower = old_name.to_lowercase(); for (i, imp) in imports.iter().enumerate() { if imp.dll_name.to_lowercase() == old_lower { to_replace.push((i, new_name.as_bytes())); } } } if to_replace.is_empty() { clear_dependent_load_flags_in_data(&mut data, &layout)?; fix_and_write(&mut data, &layout, file_path)?; return Ok(()); } let new_name_bytes: Vec<&[u8]> = to_replace.iter().map(|(_, b)| *b).collect(); if let Some(slots) = find_padding_slots(&layout.sections, &new_name_bytes) { for ((imp_idx, new_bytes), (file_off, rva)) in to_replace.iter().zip(slots.iter()) { let end = file_off + new_bytes.len(); data[*file_off..end].copy_from_slice(new_bytes); data[end] = 0; write_u32_le(&mut data, imports[*imp_idx].name_field_offset, *rva); } update_section_virtual_sizes(&mut data, &layout, &new_name_bytes, &slots)?; } else { add_new_section_with_names(&mut data, &layout, &imports, &to_replace)?; } // Re-parse since we may have modified the file let layout = parse_pe_layout(&data)?; clear_dependent_load_flags_in_data(&mut data, &layout)?; clear_certificate_table(&mut data, &layout); fix_and_write(&mut data, &layout, file_path) } /// Clear the DependentLoadFlags field in a PE file's Load Config Directory. /// /// When DependentLoadFlags is non-zero (e.g., LOAD_LIBRARY_SEARCH_SYSTEM32), /// it restricts which directories Windows searches for dependent DLLs. /// This can prevent `AddDllDirectory()` from working, breaking the /// `os.add_dll_directory()` approach. Clearing it restores the default /// search behavior. pub fn clear_dependent_load_flags(file_path: &Path) -> Result { let mut data = fs::read(file_path)?; let layout = parse_pe_layout(&data)?; let cleared = clear_dependent_load_flags_in_data(&mut data, &layout)?; if cleared { fix_and_write(&mut data, &layout, file_path)?; } Ok(cleared) } // -- Internal helpers -- fn clear_dependent_load_flags_in_data(data: &mut [u8], layout: &PeLayout) -> Result { let Some((lc_rva, lc_size)) = get_data_dir(data, layout, DD_LOAD_CONFIG)? else { return Ok(false); }; let sections: Vec<_> = layout.section_tables().cloned().collect(); let Some(lc_offset) = rva_to_offset(lc_rva, §ions) else { return Ok(false); }; // DependentLoadFlags offset within Load Config: // PE32+: 78, PE32: 54 let dlf_offset_in_struct: usize = if layout.is_64bit { 78 } else { 54 }; if (lc_size as usize) < dlf_offset_in_struct + 2 { return Ok(false); } let dlf_file_offset = lc_offset + dlf_offset_in_struct; if dlf_file_offset + 2 > data.len() { return Ok(false); } let flags = read_u16_le(data, dlf_file_offset)?; if flags != 0 { tracing::debug!("Clearing DependentLoadFlags={:#x}", flags); write_u16_le(data, dlf_file_offset, 0); Ok(true) } else { Ok(false) } } fn clear_certificate_table(data: &mut [u8], layout: &PeLayout) { if DD_SECURITY < layout.num_data_dirs as usize { let off = layout.data_dirs_offset + DD_SECURITY * 8; if off + 8 <= data.len() { write_u32_le(data, off, 0); write_u32_le(data, off + 4, 0); } } } fn remove_authenticode(data: &mut Vec, layout: &PeLayout) -> Result<()> { // The security directory is special: it uses raw file offsets, not RVAs let Some((cert_file_offset, cert_size)) = get_data_dir(data, layout, DD_SECURITY)? else { return Ok(()); }; let pe_size = layout .section_tables() .map(|s| s.pointer_to_raw_data.saturating_add(s.size_of_raw_data) as usize) .max() .unwrap_or(0); let cert_start = round_up(pe_size as u32, 8) as usize; if cert_file_offset as usize == cert_start && cert_file_offset.saturating_add(cert_size) as usize == data.len() { data.truncate(pe_size); } Ok(()) } fn update_section_virtual_sizes( data: &mut [u8], layout: &PeLayout, new_names: &[&[u8]], slots: &[(usize, u32)], ) -> Result<()> { // Update each section's VirtualSize if we wrote past it for (name_bytes, &(_file_off, rva)) in new_names.iter().zip(slots) { let name_len = name_bytes.len() as u32 + 1; for entry in &layout.sections { if rva >= entry.table.virtual_address && rva < entry.table.virtual_address + entry.table.size_of_raw_data { let new_end = (rva - entry.table.virtual_address) + name_len; let current_vs = read_u32_le(data, entry.header_offset + 8)?; if new_end > current_vs { write_u32_le(data, entry.header_offset + 8, new_end); } break; } } } // Recalculate SizeOfInitializedData as sum of SizeOfRawData for all // sections with IMAGE_SCN_CNT_INITIALIZED_DATA. This matches delvewheel's // approach which recalculates after modifying virtual sizes. let mut size_of_init_data = 0u32; for entry in &layout.sections { if entry.table.characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA != 0 { // Use max of SizeOfRawData and aligned VirtualSize let vs = read_u32_le(data, entry.header_offset + 8)?; let aligned_vs = round_up(vs, layout.file_alignment); size_of_init_data += entry.table.size_of_raw_data.max(aligned_vs); } } write_u32_le(data, layout.size_of_init_data_offset, size_of_init_data); // Update SizeOfImage based on new virtual sizes let mut max_va_end = 0u32; for entry in &layout.sections { let vs = read_u32_le(data, entry.header_offset + 8)?; let va_end = entry.table.virtual_address.saturating_add(vs); max_va_end = max_va_end.max(va_end); } let new_size_of_image = round_up(max_va_end, layout.section_alignment); write_u32_le(data, layout.size_of_image_offset, new_size_of_image); Ok(()) } fn add_new_section_with_names( data: &mut Vec, layout: &PeLayout, imports: &[ImportRef], to_replace: &[(usize, &[u8])], ) -> Result<()> { let mut section_data = Vec::new(); let mut name_offsets = Vec::new(); for (_, new_bytes) in to_replace { name_offsets.push(section_data.len()); section_data.extend_from_slice(new_bytes); section_data.push(0); } let section_data_size = section_data.len() as u32; let section_data_padded = round_up(section_data_size, layout.file_alignment); let new_section_rva = layout .section_tables() .map(|s| round_up(s.virtual_address + s.virtual_size, layout.section_alignment)) .max() .unwrap_or(0); let section_table_end = layout.section_table_offset + layout.sections.len() * SECTION_HEADER_SIZE; let size_of_headers = read_u32_le(data, layout.size_of_headers_offset)?; // Determine how much extra header space is needed for the new section header. // If there's a gap between the last section header and SizeOfHeaders, use it. // Otherwise, expand headers by FileAlignment bytes and shift all section data. let header_space_needed = if (size_of_headers as usize).saturating_sub(section_table_end) >= SECTION_HEADER_SIZE { 0u32 } else { round_up(SECTION_HEADER_SIZE as u32, layout.file_alignment) }; let pe_data_end = layout .section_tables() .map(|s| s.pointer_to_raw_data + s.size_of_raw_data) .max() .unwrap_or(size_of_headers); // Check for non-Authenticode overlay (Authenticode was already removed // by remove_authenticode before we get here). Overlays contain data like // debug symbols that we cannot safely remove. if data.len() > pe_data_end as usize { bail!( "PE file contains a {}-byte overlay beyond section data that cannot be \ safely removed. This is usually debug symbols or other appended data. \ Strip the DLL with `strip -s` before building.", data.len() - pe_data_end as usize ); } if header_space_needed > 0 { // Insert zero bytes at the section table end to make room for the new // section header. This shifts all section data forward, so we must // update every section's PointerToRawData. let extra = header_space_needed as usize; data.splice(section_table_end..section_table_end, vec![0u8; extra]); for entry in &layout.sections { let old_ptr = read_u32_le(data, entry.header_offset + 20)?; write_u32_le( data, entry.header_offset + 20, old_ptr + header_space_needed, ); } write_u32_le( data, layout.size_of_headers_offset, size_of_headers + header_space_needed, ); } // PointerToRawData for the new section accounts for any header expansion let new_section_file_offset = pe_data_end + header_space_needed; // Build the section header (40 bytes) let mut header = [0u8; SECTION_HEADER_SIZE]; header[..6].copy_from_slice(b"dlvwhl"); write_u32_le(&mut header, 8, section_data_size); // VirtualSize write_u32_le(&mut header, 12, new_section_rva); // VirtualAddress write_u32_le(&mut header, 16, section_data_padded); // SizeOfRawData write_u32_le(&mut header, 20, new_section_file_offset); // PointerToRawData write_u32_le(&mut header, 36, NEW_SECTION_CHARS); // Characteristics data[section_table_end..section_table_end + SECTION_HEADER_SIZE].copy_from_slice(&header); // Append section data + padding at the end of file data.resize(new_section_file_offset as usize, 0); data.extend_from_slice(§ion_data); data.resize( new_section_file_offset as usize + section_data_padded as usize, 0, ); // Update PE headers let new_num_sections = layout.sections.len() as u16 + 1; write_u16_le(data, layout.num_sections_offset, new_num_sections); let new_size_of_image = round_up( new_section_rva + section_data_size, layout.section_alignment, ); write_u32_le(data, layout.size_of_image_offset, new_size_of_image); let current_init_data = read_u32_le(data, layout.size_of_init_data_offset)?; write_u32_le( data, layout.size_of_init_data_offset, current_init_data + section_data_padded, ); // Update import table RVAs. If we shifted headers, the import descriptor // file offsets moved too, so we must account for that. for ((imp_idx, _), name_off) in to_replace.iter().zip(name_offsets.iter()) { let new_rva = new_section_rva + *name_off as u32; let adjusted_offset = imports[*imp_idx].name_field_offset + header_space_needed as usize; write_u32_le(data, adjusted_offset, new_rva); } Ok(()) } fn fix_and_write(data: &mut Vec, layout: &PeLayout, file_path: &Path) -> Result<()> { let old_checksum = read_u32_le(data, layout.checksum_offset)?; let new_checksum = pe_checksum(data, layout.checksum_offset); if old_checksum != 0 { write_u32_le(data, layout.checksum_offset, new_checksum); } fs::write(file_path, data.as_slice()) .with_context(|| format!("Failed to write patched PE file: {}", file_path.display())) } #[cfg(test)] mod tests { use super::*; /// Build a minimal valid PE32+ file with an import table. fn make_test_pe(dll_names: &[&str]) -> Vec { let pe_offset: u32 = 0x80; let coff_offset = pe_offset as usize + 4; let opt_hdr_offset = coff_offset + 20; let opt_hdr_fixed_size = 112; let num_data_dirs: u32 = 16; let data_dirs_size = (num_data_dirs * 8) as usize; let opt_hdr_size = opt_hdr_fixed_size + data_dirs_size; let section_table_offset = opt_hdr_offset + opt_hdr_size; let num_sections = 1; let headers_end = section_table_offset + num_sections * SECTION_HEADER_SIZE; let headers_size = round_up(headers_end as u32, 0x200); let section_rva: u32 = 0x1000; let section_file_offset = headers_size; let section_alignment: u32 = 0x1000; let file_alignment: u32 = 0x200; let import_dir_rva = section_rva; let import_dir_size = (dll_names.len() + 1) * SIZEOF_IMPORT_DIRECTORY_ENTRY; let names_start = import_dir_size; let mut name_offsets = Vec::new(); let mut current_offset = names_start; for name in dll_names { name_offsets.push(current_offset); current_offset += name.len() + 1; } let section_virtual_size = current_offset as u32; let section_raw_size = round_up(section_virtual_size + 64, file_alignment); let file_size = section_file_offset + section_raw_size; let mut data = vec![0u8; file_size as usize]; // DOS header data[0] = b'M'; data[1] = b'Z'; write_u32_le(&mut data, 0x3C, pe_offset); // PE signature data[pe_offset as usize..pe_offset as usize + 4].copy_from_slice(b"PE\0\0"); // COFF header write_u16_le(&mut data, coff_offset, 0x8664); // Machine: AMD64 write_u16_le(&mut data, coff_offset + 2, num_sections as u16); write_u16_le(&mut data, coff_offset + 16, opt_hdr_size as u16); // Optional header write_u16_le(&mut data, opt_hdr_offset, 0x20B); // PE32+ magic data[opt_hdr_offset + 2] = 14; // MajorLinkerVersion data[opt_hdr_offset + 3] = 30; // MinorLinkerVersion let size_of_image = round_up(section_rva + section_virtual_size, section_alignment); write_u32_le(&mut data, opt_hdr_offset + 56, size_of_image); write_u32_le(&mut data, opt_hdr_offset + 60, headers_size); write_u32_le(&mut data, opt_hdr_offset + 64, 0); // CheckSum write_u32_le(&mut data, opt_hdr_offset + 32, section_alignment); write_u32_le(&mut data, opt_hdr_offset + 36, file_alignment); let data_dirs_offset = opt_hdr_offset + opt_hdr_fixed_size; write_u32_le(&mut data, data_dirs_offset - 4, num_data_dirs); // Data directory[1] = Import Table write_u32_le(&mut data, data_dirs_offset + DD_IMPORT * 8, import_dir_rva); write_u32_le( &mut data, data_dirs_offset + DD_IMPORT * 8 + 4, import_dir_size as u32, ); // Section header (.rdata) let sh_off = section_table_offset; data[sh_off..sh_off + 6].copy_from_slice(b".rdata"); write_u32_le(&mut data, sh_off + 8, section_virtual_size); write_u32_le(&mut data, sh_off + 12, section_rva); write_u32_le(&mut data, sh_off + 16, section_raw_size); write_u32_le(&mut data, sh_off + 20, section_file_offset); write_u32_le( &mut data, sh_off + 36, IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ, ); // Write import directory entries let section_data_offset = section_file_offset as usize; for (i, _name) in dll_names.iter().enumerate() { let entry_offset = section_data_offset + i * SIZEOF_IMPORT_DIRECTORY_ENTRY; let name_rva = section_rva + name_offsets[i] as u32; write_u32_le(&mut data, entry_offset + IMPORT_DESC_NAME_OFFSET, name_rva); } // Write DLL name strings for (i, name) in dll_names.iter().enumerate() { let str_offset = section_data_offset + name_offsets[i]; data[str_offset..str_offset + name.len()].copy_from_slice(name.as_bytes()); data[str_offset + name.len()] = 0; } data } #[test] fn test_pe_checksum() { let data = vec![0u8; 512]; let cs = pe_checksum(&data, 200); assert_eq!(cs, 512); } #[test] fn test_rva_to_offset() { let section = SectionTable { virtual_size: 100, virtual_address: 0x1000, size_of_raw_data: 200, pointer_to_raw_data: 0x400, ..Default::default() }; let sections = vec![section]; assert_eq!(rva_to_offset(0x1000, §ions), Some(0x400)); assert_eq!(rva_to_offset(0x1050, §ions), Some(0x450)); assert_eq!(rva_to_offset(0x2000, §ions), None); } #[test] fn test_rva_to_offset_bss_section() { // BSS section where virtual_size > size_of_raw_data let section = SectionTable { virtual_size: 0x1000, virtual_address: 0x2000, size_of_raw_data: 0x200, pointer_to_raw_data: 0x600, ..Default::default() }; let sections = vec![section]; // Within raw data — should resolve assert_eq!(rva_to_offset(0x2000, §ions), Some(0x600)); assert_eq!(rva_to_offset(0x2100, §ions), Some(0x700)); // Within virtual range but beyond raw data (BSS zero-fill) — no file backing assert_eq!(rva_to_offset(0x2500, §ions), None); // Beyond the section entirely assert_eq!(rva_to_offset(0x4000, §ions), None); } #[test] fn test_parse_pe() { let data = make_test_pe(&["kernel32.dll", "foo.dll"]); let layout = parse_pe_layout(&data).unwrap(); assert!(layout.is_64bit); assert_eq!(layout.sections.len(), 1); assert!(layout.file_alignment > 0); assert!(layout.section_alignment > 0); } #[test] fn test_parse_imports() { let data = make_test_pe(&["kernel32.dll", "foo.dll"]); let layout = parse_pe_layout(&data).unwrap(); let imports = parse_imports(&data, &layout).unwrap(); assert_eq!(imports.len(), 2); assert_eq!(imports[0].dll_name, "kernel32.dll"); assert_eq!(imports[1].dll_name, "foo.dll"); } #[test] fn test_replace_needed_with_padding() { let data = make_test_pe(&["kernel32.dll", "foo.dll"]); let tmp = tempfile::NamedTempFile::new().unwrap(); fs::write(tmp.path(), &data).unwrap(); replace_needed(tmp.path(), &[("foo.dll", "foo-ab12cd34.dll")]).unwrap(); let patched = fs::read(tmp.path()).unwrap(); let layout = parse_pe_layout(&patched).unwrap(); let imports = parse_imports(&patched, &layout).unwrap(); assert_eq!(imports[0].dll_name, "kernel32.dll"); assert_eq!(imports[1].dll_name, "foo-ab12cd34.dll"); } } maturin-1.16.0/src/auditwheel/platform_tag.rs000066400000000000000000000220571527064705700212500ustar00rootroot00000000000000use crate::auditwheel::Policy; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::fmt; use std::str::FromStr; /// Decides how to handle manylinux and musllinux compliance #[derive(Serialize, Debug, Clone, Eq, PartialEq, Copy, Ord, PartialOrd)] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] pub enum PlatformTag { /// Use the `manylinux__` tag Manylinux { /// GLIBC version major major: u16, /// GLIBC version minor minor: u16, }, /// Use the `musllinux__` tag Musllinux { /// musl libc version major major: u16, /// musl libc version minor minor: u16, }, /// Use the native linux tag Linux, } impl PlatformTag { /// `manylinux1` aka `manylinux_2_5` pub fn manylinux1() -> Self { Self::Manylinux { major: 2, minor: 5 } } /// `manylinux2010` aka `manylinux_2_12` pub fn manylinux2010() -> Self { Self::Manylinux { major: 2, minor: 12, } } /// `manylinux2014` aka `manylinux_2_17` pub fn manylinux2014() -> Self { Self::Manylinux { major: 2, minor: 17, } } /// manylinux aliases, namely `manylinux1`, `manylinux2010` and `manylinux2014`. pub fn aliases(&self) -> Vec { Policy::from_tag(self) .map(|policy| policy.aliases) .unwrap_or_default() } /// Is this a portable linux platform tag /// /// Only manylinux and musllinux are portable pub fn is_portable(&self) -> bool { !matches!(self, PlatformTag::Linux) } /// Is this a manylinux platform tag pub fn is_manylinux(&self) -> bool { matches!(self, PlatformTag::Manylinux { .. }) } /// Is this a musllinux platform tag pub fn is_musllinux(&self) -> bool { matches!(self, PlatformTag::Musllinux { .. }) } /// Is it supported by Rust compiler and manylinux project pub fn is_supported(&self) -> bool { match self { PlatformTag::Manylinux { major, minor } => (*major, *minor) >= (2, 17), PlatformTag::Musllinux { .. } => true, PlatformTag::Linux => true, } } } impl fmt::Display for PlatformTag { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { PlatformTag::Manylinux { major, minor } => write!(f, "manylinux_{major}_{minor}"), PlatformTag::Musllinux { major, minor } => write!(f, "musllinux_{major}_{minor}"), PlatformTag::Linux => write!(f, "linux"), } } } impl FromStr for PlatformTag { type Err = &'static str; fn from_str(value: &str) -> Result { let value = value.to_ascii_lowercase(); match value.as_str() { "off" | "linux" => Ok(PlatformTag::Linux), "1" | "manylinux1" => Ok(PlatformTag::manylinux1()), "2010" | "manylinux2010" => Ok(PlatformTag::manylinux2010()), "2014" | "manylinux2014" => Ok(PlatformTag::manylinux2014()), _ => { if let Some(value) = value.strip_prefix("musllinux_") { let mut parts = value.split('_'); let major = parts .next() .and_then(|major| major.parse::().ok()) .ok_or("invalid musllinux option")?; let minor = parts .next() .and_then(|minor| minor.parse::().ok()) .ok_or("invalid musllinux option")?; Ok(PlatformTag::Musllinux { major, minor }) } else { let value = value.strip_prefix("manylinux_").unwrap_or(&value); let mut parts = value.split('_'); let major = parts .next() .and_then(|major| major.parse::().ok()) .ok_or("invalid manylinux option")?; let minor = parts .next() .and_then(|minor| minor.parse::().ok()) .ok_or("invalid manylinux option")?; Ok(PlatformTag::Manylinux { major, minor }) } } } } } impl<'de> Deserialize<'de> for PlatformTag { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { let s = String::deserialize(deserializer)?; FromStr::from_str(&s).map_err(serde::de::Error::custom) } } /// Parsed `--compatibility` / `[tool.maturin] compatibility` value. /// /// `pypi` is not a real platform tag. It is normalized by `BuildContextBuilder` /// into a PyPI-validation flag and never stored on `PythonContext.platform_tag`. /// /// Real platform tags are stored as [`CompatibilityTag::Platform`] so new /// [`PlatformTag`] variants only need to be added in one place. #[derive(Debug, Clone, Eq, PartialEq, Copy, Ord, PartialOrd)] pub enum CompatibilityTag { /// A real platform tag (manylinux, musllinux, or linux). Platform(PlatformTag), /// Ensure that a PyPI-compatible tag is used, error if the target is not supported by PyPI. Pypi, } impl CompatibilityTag { /// Returns `None` for the `pypi` pseudo-option. pub fn into_platform_tag(self) -> Option { match self { CompatibilityTag::Platform(tag) => Some(tag), CompatibilityTag::Pypi => None, } } /// Is this the PyPI compatibility option pub fn is_pypi(&self) -> bool { matches!(self, CompatibilityTag::Pypi) } } impl From for CompatibilityTag { fn from(value: PlatformTag) -> Self { CompatibilityTag::Platform(value) } } impl fmt::Display for CompatibilityTag { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { CompatibilityTag::Platform(tag) => write!(f, "{tag}"), CompatibilityTag::Pypi => write!(f, "pypi"), } } } impl FromStr for CompatibilityTag { type Err = &'static str; fn from_str(value: &str) -> Result { if value.eq_ignore_ascii_case("pypi") { Ok(CompatibilityTag::Pypi) } else { PlatformTag::from_str(value).map(CompatibilityTag::Platform) } } } /// Serialize as the same string form used by CLI / TOML parsing. impl Serialize for CompatibilityTag { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(&self.to_string()) } } impl<'de> Deserialize<'de> for CompatibilityTag { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { let s = String::deserialize(deserializer)?; FromStr::from_str(&s).map_err(serde::de::Error::custom) } } #[cfg(feature = "schemars")] impl schemars::JsonSchema for CompatibilityTag { fn schema_name() -> std::borrow::Cow<'static, str> { "CompatibilityTag".into() } fn schema_id() -> std::borrow::Cow<'static, str> { "maturin::CompatibilityTag".into() } fn json_schema(_generator: &mut schemars::SchemaGenerator) -> schemars::Schema { // TOML / CLI accept string values (e.g. "manylinux_2_17", "pypi"), not // externally-tagged objects. Document the string form so the schema matches // serde Deserialize and Serialize. schemars::json_schema!({ "description": "Parsed `--compatibility` / `[tool.maturin] compatibility` value.\n\nAccepts platform tags such as `linux`, `manylinux2014`, `manylinux_2_17`, `musllinux_1_2`, or the `pypi` pseudo-option (PyPI filename validation; not a real platform tag).", "type": "string" }) } } #[cfg(test)] mod tests { use super::{CompatibilityTag, PlatformTag}; use std::str::FromStr; #[test] fn compatibility_tag_serde_round_trips_as_string() { for value in [ CompatibilityTag::Pypi, CompatibilityTag::from(PlatformTag::Linux), CompatibilityTag::from(PlatformTag::manylinux2014()), CompatibilityTag::from(PlatformTag::Musllinux { major: 1, minor: 2 }), ] { let json = serde_json::to_string(&value).unwrap(); // String form, not an externally-tagged object. assert!( json.starts_with('"') && json.ends_with('"'), "expected string JSON, got {json}" ); let parsed: CompatibilityTag = serde_json::from_str(&json).unwrap(); assert_eq!(parsed, value); assert_eq!( CompatibilityTag::from_str(value.to_string().as_str()), Ok(value) ); } } #[test] fn into_platform_tag_strips_pypi() { assert_eq!(CompatibilityTag::Pypi.into_platform_tag(), None); assert_eq!( CompatibilityTag::from(PlatformTag::Linux).into_platform_tag(), Some(PlatformTag::Linux) ); } } maturin-1.16.0/src/auditwheel/policy.rs000066400000000000000000000135351527064705700200710ustar00rootroot00000000000000use crate::auditwheel::PlatformTag; use crate::target::Arch; use once_cell::sync::Lazy; use serde::Deserialize; use std::cmp::{Ordering, PartialOrd}; use std::collections::{HashMap, HashSet}; use std::fmt; use std::fmt::{Display, Formatter}; /// The policies (allowed symbols) for the different manylinux tags, sorted from highest /// priority to lowest pub static MANYLINUX_POLICIES: Lazy> = Lazy::new(|| { // https://github.com/pypa/auditwheel/blob/master/auditwheel/policy/manylinux-policy.json let mut policies: Vec = serde_json::from_slice(include_bytes!("manylinux-policy.json")) .expect("invalid manylinux policy.json file"); policies.sort_by_key(|policy| -policy.priority); policies }); /// The policies (allowed symbols) for the different musllinux tags, sorted from highest /// priority to lowest pub static MUSLLINUX_POLICIES: Lazy> = Lazy::new(|| { // https://github.com/pypa/auditwheel/blob/master/auditwheel/policy/musllinux-policy.json let mut policies: Vec = serde_json::from_slice(include_bytes!("musllinux-policy.json")) .expect("invalid musllinux policy.json file"); policies.sort_by_key(|policy| -policy.priority); policies }); /// Manylinux policy #[derive(Debug, Clone, PartialEq, Eq, Deserialize)] pub struct Policy { /// platform tag name pub name: String, /// platform tag aliases pub aliases: Vec, /// policy priority. Tags supporting more platforms have higher priority pub priority: i64, /// platform architecture to symbol versions map #[serde(rename = "symbol_versions")] pub symbol_versions: HashMap>>, /// whitelisted libraries #[serde(rename = "lib_whitelist")] pub lib_whitelist: HashSet, /// blacklisted symbols of whitelisted libraries pub blacklist: HashMap>, } impl Default for Policy { fn default() -> Self { // defaults to linux Policy::from_tag(&PlatformTag::Linux).unwrap() } } impl Display for Policy { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { if self.aliases.is_empty() { f.write_str(&self.name) } else { f.write_fmt(format_args!( "{} (aka {})", self.name, self.aliases.join(",") )) } } } impl PartialOrd for Policy { fn partial_cmp(&self, other: &Self) -> Option { self.priority.partial_cmp(&other.priority) } } impl Policy { /// Get platform tag from this policy pub fn platform_tag(&self) -> PlatformTag { self.name.parse().expect("unknown platform tag") } /// Get policy by its platform tag pub fn from_tag(tag: &PlatformTag) -> Option { match tag { PlatformTag::Manylinux { major, minor } => { let name = format!("manylinux_{major}_{minor}"); MANYLINUX_POLICIES.iter().find(|p| p.name == name).cloned() } PlatformTag::Musllinux { major, minor } => { let name = format!("musllinux_{major}_{minor}"); MUSLLINUX_POLICIES.iter().find(|p| p.name == name).cloned() } PlatformTag::Linux => MANYLINUX_POLICIES .iter() .find(|p| p.name == "linux") .cloned(), } } pub(crate) fn fixup_musl_libc_so_name(&mut self, target_arch: Arch) { // Fixup musl libc lib_whitelist if self.name.starts_with("musllinux") && self.lib_whitelist.remove("libc.so") { let new_soname = match target_arch { Arch::Aarch64 => "libc.musl-aarch64.so.1", Arch::Armv6L => "libc.musl-armhf.so.1", Arch::Armv7L => "libc.musl-armv7.so.1", Arch::Powerpc64Le => "libc.musl-ppc64le.so.1", Arch::Powerpc64 => "", // musllinux doesn't support ppc64 Arch::X86 => "libc.musl-x86.so.1", Arch::X86_64 => "libc.musl-x86_64.so.1", Arch::S390X => "libc.musl-s390x.so.1", Arch::LoongArch64 => "libc.musl-loongarch64.so.1", Arch::Riscv64 => "libc.musl-riscv64.so.1", _ => "", }; if !new_soname.is_empty() { self.lib_whitelist.insert(new_soname.to_string()); } } } } #[cfg(test)] mod tests { use super::{Arch, MANYLINUX_POLICIES, MUSLLINUX_POLICIES, Policy}; use crate::PlatformTag; use pretty_assertions::assert_eq; #[test] fn test_load_policy() { let linux = Policy::from_tag(&PlatformTag::Linux).unwrap(); assert!(linux.symbol_versions.is_empty()); assert!(linux.lib_whitelist.is_empty()); let manylinux2010 = Policy::from_tag(&PlatformTag::Manylinux { major: 2, minor: 12, }) .unwrap(); assert!(manylinux2010.lib_whitelist.contains("libc.so.6")); let symbol_version = &manylinux2010.symbol_versions["x86_64"]; assert_eq!(symbol_version["CXXABI"].len(), 4); let cxxabi = &symbol_version["CXXABI"]; for version in &["1.3", "1.3.1", "1.3.2", "1.3.3"] { assert!(cxxabi.contains(*version)); } } #[test] fn test_policy_manylinux_tag() { for policy in MANYLINUX_POLICIES.iter() { let _tag = policy.platform_tag(); } } #[test] fn test_policy_musllinux_tag() { for policy in MUSLLINUX_POLICIES.iter() { let _tag = policy.platform_tag(); } } #[test] fn test_policy_musllinux_fixup_libc_so_name() { let mut policy = Policy::from_tag(&PlatformTag::Musllinux { major: 1, minor: 1 }).unwrap(); policy.fixup_musl_libc_so_name(Arch::Aarch64); assert!(policy.lib_whitelist.contains("libc.musl-aarch64.so.1")); } } maturin-1.16.0/src/auditwheel/repair.rs000066400000000000000000000407731527064705700200600ustar00rootroot00000000000000//! Shared wheel repair infrastructure. //! //! This module contains the [`WheelRepairer`] trait and the shared utilities //! for preparing external libraries for grafting into wheels. //! //! Platform-specific implementations live in: //! - [`super::linux::ElfRepairer`] //! - [`super::macos::MacOSRepairer`] use crate::compile::BuildArtifact; use crate::util::hash_file; use anyhow::{Context, Result}; use std::borrow::Borrow; use std::collections::{HashMap, HashSet}; use std::path::{Path, PathBuf}; use fs_err as fs; /// A build artifact bundled with the external shared libraries it depends on. /// /// Keeps the artifact and its per-artifact dependency list together so they /// cannot accidentally get out of sync when passed through the wheel-writing /// pipeline. #[derive(Debug)] pub struct AuditedArtifact { /// The build artifact. pub artifact: BuildArtifact, /// External shared libraries this artifact depends on that must be /// bundled into the wheel. pub external_libs: Vec, /// **Universal2 only**: CPU architectures that require each library. /// /// Maps library realpath to the set of architectures (e.g., "arm64", "x86_64") /// that depend on it. Used during wheel repair to verify grafted dylibs /// contain all necessary architecture slices. /// /// Empty for single-arch builds and Linux builds. /// /// Note: Universal2 support may be removed when Apple drops x86_64 support pub arch_requirements: HashMap>, } impl Borrow for AuditedArtifact { fn borrow(&self) -> &BuildArtifact { &self.artifact } } /// A library prepared for grafting into a wheel. /// /// Created by [`prepare_grafted_libs`] with a hash-suffixed filename and a /// writable temporary copy ready for platform-specific patching. #[derive(Debug)] pub struct GraftedLib { /// Original library name as it appears in dependency records. /// For ELF this is a leaf name like `libfoo.so.1`. /// For Mach-O this can be a full install name like `/usr/local/lib/libfoo.dylib` /// or `@rpath/libfoo.dylib`. pub original_name: String, /// Additional install names that resolve to the same file on disk. /// These need the same rewriting as `original_name` → `new_name`. pub aliases: Vec, /// New filename with hash suffix (e.g., `libfoo-ab12cd34.so.1`) pub new_name: String, /// Path to the writable temporary copy (ready for patching). pub dest_path: PathBuf, /// Libraries this one depends on (from lddtree's `needed` field). pub needed: Vec, /// Runtime library search paths from the original library. pub rpath: Vec, /// **Universal2 only**: CPU architectures that require this library. /// /// For universal2 macOS wheels, each architecture (arm64, x86_64) may have /// different dependencies. This field tracks which architectures actually /// need this library, so we can verify the grafted dylib contains (at least) /// those architectures. /// /// Empty for single-arch builds and Linux builds. /// /// Note: Universal2 support may be removed when Apple drops x86_64 support /// (expected ~2025-2026). pub required_archs: HashSet, } /// Result of auditing a build artifact for external dependencies. /// /// Contains the platform policy, discovered external libraries, and /// (for universal2 macOS builds) architecture requirements. #[derive(Debug)] pub struct AuditResult { /// The determined platform policy (e.g., manylinux tag). pub policy: super::Policy, /// External shared libraries that need to be bundled. pub external_libs: Vec, /// **Universal2 only**: CPU architectures that require each library. /// /// Maps library realpath to the set of architectures (e.g., "arm64", "x86_64") /// that depend on it. Empty for single-arch builds and Linux builds. /// /// Note: Universal2 support may be removed when Apple drops x86_64 support pub arch_requirements: HashMap>, } impl AuditResult { /// Create a new AuditResult with no arch requirements (for single-arch/Linux). pub fn new(policy: super::Policy, external_libs: Vec) -> Self { Self { policy, external_libs, arch_requirements: HashMap::new(), } } } /// What kind of in-place patching `WheelRepairer::patch` is being asked to /// perform. /// /// `Repair` is the wheel-build path: external libraries have been grafted /// and the artifact's references / RPATH must be rewritten to point at the /// bundled copies. `Editable` is the editable-install path: only the /// runtime library search path is extended with the cargo target dirs so /// the still-on-disk dependencies resolve at load time. /// /// The discriminant is also used by `WheelRepairer::patch_required` to /// predict, *before* any bytes are rewritten, which audited artifacts the /// upcoming `patch` call will modify in place. The build pipeline uses /// that prediction to keep a clean, unpatched copy at every artifact's /// cargo output path (see `copy_back_cargo_outputs` in /// `build_context/repair.rs` and #2969 / #3111). #[derive(Debug)] pub enum PatchKind<'a> { /// Wheel-build patching after `prepare_grafted_libs` has staged the /// external libraries. Repair { /// Libraries staged into a temporary directory ready to be added /// to the wheel and referenced from the patched artifacts. grafted: &'a [GraftedLib], /// Wheel-internal directory where the grafted libraries will live /// (e.g. `mypkg.libs/` on Linux/Windows, `mypkg.dylibs/` on macOS). libs_dir: &'a Path, /// Wheel-internal directory the artifact resides in. Used to /// compute a relative RPATH / `@loader_path` from the artifact to /// `libs_dir`. artifact_dir: &'a Path, }, /// Editable-install patching: extend the artifact's RPATH with the /// cargo target directories captured in `BuildArtifact::linked_paths`. Editable, } /// Platform-specific wheel repair operations. /// /// Each platform (Linux/ELF, macOS/Mach-O) implements this trait to provide /// its own dependency discovery and binary patching logic. pub trait WheelRepairer { /// Audit an artifact for platform compliance and find external libraries /// that need to be bundled. /// /// Returns an [`AuditResult`] containing the platform policy, external /// library dependencies, and (for universal2) architecture requirements. fn audit(&self, artifact: &BuildArtifact, ld_paths: Vec) -> Result; /// Predict, per audited artifact, whether the next [`Self::patch`] call /// with the same `kind` will rewrite that artifact's bytes in place. /// /// Used by `add_external_libs` to reflink/copy the staged artifact back /// to its cargo output path *before* any in-place patching occurs, so /// cargo's incremental cache always sees the unpatched bytes (see /// #2969 / #3111). /// /// The default implementation is `!external_libs.is_empty()` for /// `Repair` and `false` for `Editable`. The `Repair` rule relies on /// the invariant that [`prepare_grafted_libs`] builds `grafted` from /// `audited.iter().flat_map(|a| &a.external_libs)`, so an artifact /// with empty `external_libs` is guaranteed to share no install /// names with the grafted set and is therefore left untouched by /// every current `patch` implementation. Repairers that touch /// artifacts beyond what their own `external_libs` would predict /// (e.g. an editable build with non-empty `linked_paths`) should /// override this. fn patch_required(&self, audited: &[AuditedArtifact], kind: &PatchKind<'_>) -> Vec { match kind { PatchKind::Repair { .. } => audited .iter() .map(|aa| !aa.external_libs.is_empty()) .collect(), PatchKind::Editable => vec![false; audited.len()], } } /// Patch binary references in place. /// /// For [`PatchKind::Repair`], this runs after [`prepare_grafted_libs`] /// has copied and hash-renamed all external libraries. Implementations /// should: /// /// 1. Rewrite references in each artifact to point to the new names /// 2. Set appropriate metadata on grafted libraries (soname, install ID, etc.) /// 3. Update cross-references between grafted libraries /// 4. Perform any final steps (e.g., code signing on macOS) /// /// For [`PatchKind::Editable`], implementations should append the /// per-artifact `linked_paths` to the runtime library search path so /// that out-of-tree dependencies still resolve at load time. The /// default trait implementation is a no-op so non-Linux platforms get /// editable builds for free. /// /// Implementations must not modify the [`AuditedArtifact`] structs /// themselves — the per-artifact `staging` state is transitioned to /// `Patched` by the caller via `copy_back_cargo_outputs` *before* /// this method runs. fn patch(&self, audited: &[AuditedArtifact], kind: &PatchKind<'_>) -> Result<()>; /// Return a Python code snippet to prepend to `__init__.py` for runtime /// shared library discovery. /// /// `libs_dir_name` is the leaf directory name for bundled libraries (e.g. /// `"mypackage.libs"`). `depth` is the number of parent directories from /// the package's `__init__.py` to the site-packages root where `.libs/` /// lives. /// /// Returns `None` on platforms that don't need runtime patching: /// - Linux/ELF uses RPATH (`$ORIGIN`) /// - macOS/Mach-O uses `@loader_path` /// - Windows/PE needs `os.add_dll_directory()` injected into `__init__.py` fn init_py_patch(&self, _libs_dir_name: &str, _depth: usize) -> Option { None } /// Return the wheel-internal directory name for grafted libraries. /// /// macOS uses `.dylibs` (matching delocate convention), /// Linux and Windows use `.libs` (matching auditwheel/delvewheel convention). fn libs_dir(&self, dist_name: &str) -> PathBuf { PathBuf::from(format!("{dist_name}.libs")) } } /// Prepare external libraries for grafting into a wheel. /// /// For each library: /// 1. Resolves the real path on disk (fails if not found) /// 2. Generates a hash-suffixed filename to avoid DLL hell /// 3. Copies to `temp_dir` and makes the copy writable /// /// Returns the prepared libraries and the set of original paths that were copied. /// /// Deduplication is by `realpath` (the actual file on disk). When the same /// file is referenced via multiple install names (common on macOS), only one /// copy is made, but all original names are recorded as aliases. /// /// The optional `arch_requirements` parameter is used for universal2 macOS builds /// to track which CPU architectures require each library (by realpath). This /// enables verification that grafted dylibs contain all necessary architecture /// slices. For single-arch builds or Linux, pass `None`. pub fn prepare_grafted_libs( audited: &[AuditedArtifact], temp_dir: &Path, arch_requirements: Option<&HashMap>>, ) -> Result<(Vec, HashSet)> { let mut grafted = Vec::new(); let mut libs_copied = HashSet::new(); let mut realpath_to_idx: HashMap = HashMap::new(); for lib in audited.iter().flat_map(|a| &a.external_libs) { let source_path = lib.realpath.clone().with_context(|| { format!( "Cannot repair wheel, because required library {} could not be located.", lib.path.display() ) })?; // Check if we've already copied this exact file (by realpath). if let Some(&idx) = realpath_to_idx.get(&source_path) { let existing: &mut GraftedLib = &mut grafted[idx]; if lib.name != existing.original_name && !existing.aliases.contains(&lib.name) { existing.aliases.push(lib.name.clone()); } continue; } let new_name = hashed_lib_name(&lib.name, &source_path)?; let dest_path = temp_dir.join(&new_name); fs::copy(&source_path, &dest_path)?; // Make the copy writable so platform-specific tools can modify it let mut perms = fs::metadata(&dest_path)?.permissions(); #[allow(clippy::permissions_set_readonly_false)] perms.set_readonly(false); fs::set_permissions(&dest_path, perms)?; let idx = grafted.len(); realpath_to_idx.insert(source_path.clone(), idx); libs_copied.insert(source_path.clone()); // Get required architectures for this library (universal2 only). let required_archs = arch_requirements .and_then(|reqs| reqs.get(&source_path)) .cloned() .unwrap_or_default(); grafted.push(GraftedLib { original_name: lib.name.clone(), aliases: Vec::new(), new_name, dest_path, needed: lib.needed.clone(), rpath: lib.rpath.clone(), required_archs, }); } Ok((grafted, libs_copied)) } /// Extract the leaf filename from a library name. /// /// Library names can be full paths on macOS (e.g., `/usr/local/lib/libfoo.dylib` /// or `@rpath/libfoo.dylib`). This returns just the filename component. pub(crate) fn leaf_filename(lib_name: &str) -> &str { Path::new(lib_name) .file_name() .and_then(|n| n.to_str()) .unwrap_or(lib_name) } /// Generate a hash-suffixed filename for a library to avoid collisions. /// /// Takes the leaf filename from `lib_name` (which may be a full path on macOS), /// computes a short hash of the file content, and inserts it before the first /// extension dot. /// /// Examples: /// - `libfoo.so.1` + hash `ab12cd34` → `libfoo-ab12cd34.so.1` /// - `/usr/local/lib/libbar.dylib` + hash `ef56gh78` → `libbar-ef56gh78.dylib` pub(crate) fn hashed_lib_name(lib_name: &str, lib_path: &Path) -> Result { let short_hash = &hash_file(lib_path) .with_context(|| format!("Failed to hash library {}", lib_path.display()))?[..8]; let leaf = leaf_filename(lib_name); Ok(if let Some(pos) = leaf.find('.') { let (stem, ext) = leaf.split_at(pos); if stem.ends_with(&format!("-{short_hash}")) { leaf.to_string() } else { format!("{stem}-{short_hash}{ext}") } } else { format!("{leaf}-{short_hash}") }) } /// Log which libraries were grafted into the wheel. pub fn log_grafted_libs(libs_copied: &HashSet, libs_dir: &Path) { let mut grafted_paths: Vec<&PathBuf> = libs_copied.iter().collect(); grafted_paths.sort(); eprintln!( "🖨 Copied external shared libraries to package {} directory:", libs_dir.display() ); for lib_path in &grafted_paths { eprintln!(" {}", lib_path.display()); } } #[cfg(test)] mod tests { use super::*; use std::io::Write; #[test] fn test_leaf_filename() { assert_eq!(leaf_filename("libfoo.so.1"), "libfoo.so.1"); assert_eq!(leaf_filename("/usr/local/lib/libfoo.dylib"), "libfoo.dylib"); assert_eq!(leaf_filename("@rpath/libfoo.dylib"), "libfoo.dylib"); } #[test] fn test_hashed_lib_name() { let tmp_dir = tempfile::tempdir().unwrap(); let lib_path = tmp_dir.path().join("libfoo.so.1"); { let mut f = fs_err::File::create(&lib_path).unwrap(); f.write_all(b"fake library content").unwrap(); } let name = hashed_lib_name("libfoo.so.1", &lib_path).unwrap(); // Should have format: libfoo-XXXXXXXX.so.1 assert!(name.starts_with("libfoo-")); assert!(name.ends_with(".so.1")); assert_eq!(name.len(), "libfoo-".len() + 8 + ".so.1".len()); // Idempotent: calling with already-hashed name should not double-hash let name2 = hashed_lib_name(&name, &lib_path).unwrap(); assert_eq!(name, name2); } #[test] fn test_hashed_lib_name_macos_path() { let tmp_dir = tempfile::tempdir().unwrap(); let lib_path = tmp_dir.path().join("libbar.dylib"); { let mut f = fs_err::File::create(&lib_path).unwrap(); f.write_all(b"fake dylib content").unwrap(); } let name = hashed_lib_name("/usr/local/lib/libbar.dylib", &lib_path).unwrap(); assert!(name.starts_with("libbar-")); assert!(name.ends_with(".dylib")); } } maturin-1.16.0/src/auditwheel/sbom.rs000066400000000000000000000106511527064705700175260ustar00rootroot00000000000000//! Generate a CycloneDX SBOM for shared libraries grafted by auditwheel repair. //! //! When maturin copies external shared libraries into the wheel (the "repair" //! step), this module records which OS packages provided those libraries and //! produces a [CycloneDX 1.4](https://cyclonedx.org/) SBOM that is stored at //! `/sboms/auditwheel.cdx.json` inside the wheel. //! //! # Differences from Python auditwheel //! //! * **Tool identity** – Python auditwheel records `"auditwheel"` in //! `metadata.tools`. We record `"maturin"` instead. //! //! * **PURL `file_name` qualifier omitted** – Python auditwheel includes //! `?file_name=` in the wheel's PURL. In maturin the SBOM //! is generated *during* wheel writing before the final filename is known, so //! we omit it. The PURL is still valid (`pkg:pypi/@`). //! //! * **Cross-compilation sysroot support** – The sysroot is forwarded to //! [`whichprovides`](super::whichprovides) so it can strip sysroot prefixes //! and read the target's `/etc/os-release` when available. use once_cell::sync::Lazy; use regex::Regex; use sha2::{Digest, Sha256}; use std::path::{Path, PathBuf}; use super::whichprovides::{self, purl_encode}; static NAME_NORMALIZE_RE: Lazy = Lazy::new(|| Regex::new(r"[-_.]+").unwrap()); /// Create a CycloneDX SBOM for shared libraries grafted during auditwheel repair. /// /// Returns `None` if `grafted_lib_paths` is empty or no package-manager /// information could be determined for any of them. pub fn create_auditwheel_sbom( wheel_name: &str, wheel_version: &str, grafted_lib_paths: &[PathBuf], sysroot: &Path, ) -> Option> { if grafted_lib_paths.is_empty() { return None; } let packages = whichprovides::whichprovides(grafted_lib_paths, sysroot); if packages.is_empty() { return None; } // PEP 503 name normalisation: lowercase, collapse [-_.]+ to `-`. let name = NAME_NORMALIZE_RE .replace_all(wheel_name, "-") .to_lowercase(); let wheel_purl = format!( "pkg:pypi/{}@{}", purl_encode(&name), purl_encode(wheel_version), ); let root = serde_json::json!({ "type": "library", "bom-ref": &wheel_purl, "name": &name, "version": wheel_version, "purl": &wheel_purl, }); let mut components = vec![root.clone()]; let mut depends_on = Vec::new(); let mut dep_refs = Vec::new(); // Sort by filepath for deterministic SBOM output (HashMap iteration // order is non-deterministic). let mut sorted_packages: Vec<_> = packages.iter().collect(); sorted_packages.sort_by_key(|(a, _)| *a); for (filepath, provided_by) in sorted_packages { // Use a hash of the filepath to disambiguate components from the same // package (matching Python auditwheel's approach). let hash = crate::util::sha256_hex( Sha256::digest(filepath.to_string_lossy().as_bytes()).as_slice(), ); let bom_ref = format!("{}#{hash}", provided_by.purl()); components.push(serde_json::json!({ "type": "library", "bom-ref": &bom_ref, "name": &provided_by.package_name, "version": &provided_by.package_version, "purl": provided_by.purl(), })); depends_on.push(bom_ref.clone()); dep_refs.push(serde_json::json!({"ref": bom_ref})); } let mut dependencies = vec![serde_json::json!({ "ref": &wheel_purl, "dependsOn": depends_on, })]; dependencies.extend(dep_refs); let sbom = serde_json::json!({ "bomFormat": "CycloneDX", "specVersion": "1.4", "version": 1, "metadata": { "component": root, "tools": [{"name": "maturin", "version": env!("CARGO_PKG_VERSION")}], }, "components": components, "dependencies": dependencies, }); serde_json::to_vec_pretty(&sbom).ok() } #[cfg(test)] mod tests { use super::*; #[test] fn test_name_normalisation() { let norm = |s| NAME_NORMALIZE_RE.replace_all(s, "-").to_lowercase(); assert_eq!(norm("My_Package"), "my-package"); assert_eq!(norm("foo.bar__baz"), "foo-bar-baz"); assert_eq!(norm("simple"), "simple"); } #[test] fn test_returns_none_for_empty_paths() { assert!(create_auditwheel_sbom("pkg", "1.0", &[], Path::new("/")).is_none()); } } maturin-1.16.0/src/auditwheel/whichprovides.rs000066400000000000000000000227041527064705700214460ustar00rootroot00000000000000//! Identify which OS package provides a shared library file. //! //! This is a Rust port of Python auditwheel's `_vendor/whichprovides` module. //! It queries the system package manager (dpkg, rpm, apk) to discover which //! OS-level package "owns" a given file path, then returns a typed record //! containing the package name, version, distro, and a Package URL (PURL). //! //! # Differences from Python auditwheel //! //! * **No `apt-file` provider** – Python auditwheel includes an `AptFileProvider` //! as a slow fallback for Debian-family systems. We omit it because `dpkg -S` //! already covers all *installed* packages (which is the relevant set during //! `auditwheel repair` — the library must be present on disk to be grafted). //! //! * **Cross-compilation sysroot awareness** – Python auditwheel always runs //! natively inside a manylinux/musllinux container. Maturin can cross-compile //! from a host machine using a foreign sysroot. When a sysroot is provided: //! //! - Library paths are first queried as-is (they may live in a dpkg multiarch //! directory like `/usr/aarch64-linux-gnu/lib/` which dpkg tracks natively). //! - If that fails and the path starts with the sysroot prefix, the prefix is //! stripped and the host-relative path (e.g. `/usr/lib/...`) is tried instead. //! - The distro ID is read from `/etc/os-release` when the sysroot //! differs from `/`, falling back to the host's `/etc/os-release`. use std::collections::HashMap; use std::path::{Path, PathBuf}; use std::process::Command; use once_cell::sync::Lazy; use regex::Regex; static OS_RELEASE_ID_RE: Lazy = Lazy::new(|| Regex::new(r#"(?m)^ID=(?:"([^"]*)"|(.*))\s*$"#).unwrap()); static DPKG_SEARCH_RE: Lazy = Lazy::new(|| Regex::new(r"^([^:]+):").unwrap()); static DPKG_VERSION_RE: Lazy = Lazy::new(|| Regex::new(r"(?m)^Version:\s*(\S+)").unwrap()); static APK_WHO_OWNS_RE: Lazy = Lazy::new(|| Regex::new(r" is owned by (.+)-(\d[^\s]*)$").unwrap()); /// Information about the OS package that provides a file. #[derive(Debug, Clone, PartialEq, Eq)] pub struct ProvidedBy { /// Package type identifier (e.g. "deb", "rpm", "apk"). pub package_type: String, /// Package name as reported by the package manager. pub package_name: String, /// Package version string. pub package_version: String, /// Distro identifier from `/etc/os-release` `ID=` (e.g. "ubuntu", "alpine"). pub distro: Option, } impl ProvidedBy { /// Returns a [Package URL (PURL)](https://github.com/package-url/purl-spec) /// for this package: `pkg:[/]/@`. pub fn purl(&self) -> String { let mut s = format!("pkg:{}/", self.package_type); if let Some(distro) = &self.distro { s.push_str(&purl_encode(distro)); s.push('/'); } s.push_str(&purl_encode(&self.package_name)); s.push('@'); s.push_str(&purl_encode(&self.package_version)); s } } /// Percent-encode a value for use in a PURL component. pub(super) fn purl_encode(value: &str) -> String { let mut out = String::with_capacity(value.len()); for byte in value.bytes() { if byte.is_ascii_alphanumeric() || matches!(byte, b'-' | b'.' | b'_') { out.push(byte as char); } else { out.push_str(&format!("%{byte:02X}")); } } out } // --------------------------------------------------------------------------- // Provider implementations // --------------------------------------------------------------------------- /// Try `dpkg -S ` then `dpkg -s ` (Debian/Ubuntu). fn dpkg_provides(filepath: &str, distro: &str) -> Option { let out = Command::new("dpkg").args(["-S", filepath]).output().ok()?; if !out.status.success() { return None; } let stdout = String::from_utf8_lossy(&out.stdout); let package_name = DPKG_SEARCH_RE.captures(&stdout)?.get(1)?.as_str(); let out = Command::new("dpkg") .args(["-s", package_name]) .output() .ok()?; if !out.status.success() { return None; } let stdout = String::from_utf8_lossy(&out.stdout); let version = DPKG_VERSION_RE.captures(&stdout)?.get(1)?.as_str(); Some(ProvidedBy { package_type: "deb".into(), package_name: package_name.into(), package_version: version.into(), distro: Some(distro.into()), }) } /// Try `rpm -qf` (RHEL/CentOS/Fedora/SUSE). fn rpm_provides(filepath: &str, distro: &str) -> Option { let out = Command::new("rpm") .args([ "-qf", "--queryformat", "%{NAME} %{VERSION} %{RELEASE}", filepath, ]) .output() .ok()?; if !out.status.success() { return None; } let stdout = String::from_utf8_lossy(&out.stdout); let mut parts = stdout.trim().splitn(3, ' '); let name = parts.next()?; let version = parts.next()?; let release = parts.next()?; Some(ProvidedBy { package_type: "rpm".into(), package_name: name.into(), package_version: format!("{version}-{release}"), distro: Some(distro.into()), }) } /// Try `apk info --who-owns` (Alpine). fn apk_provides(filepath: &str, distro: &str) -> Option { let out = Command::new("apk") .args(["info", "--who-owns", filepath]) .output() .ok()?; if !out.status.success() { return None; } let stdout = String::from_utf8_lossy(&out.stdout); let caps = APK_WHO_OWNS_RE.captures(stdout.trim())?; Some(ProvidedBy { package_type: "apk".into(), package_name: caps[1].into(), package_version: caps[2].into(), distro: Some(distro.into()), }) } // --------------------------------------------------------------------------- // Public API // --------------------------------------------------------------------------- /// Identify which OS package provides each of the given file paths. /// /// `sysroot` is the root directory used by `lddtree` for library resolution /// (typically `/` for native builds or a cross-compiler sysroot path). When /// the sysroot is not `/`, library paths that start with the sysroot prefix are /// also tried with the prefix stripped. /// /// Paths whose owning package cannot be determined are silently omitted. pub fn whichprovides(filepaths: &[PathBuf], sysroot: &Path) -> HashMap { let mut results = HashMap::new(); // Detect provider: exactly one of dpkg/rpm/apk is the native manager. let distro = read_distro_id(sysroot); let distro = match distro.as_deref() { Some(d) => d, None => return results, }; let provider: fn(&str, &str) -> Option = if which::which("dpkg").is_ok() { dpkg_provides } else if which::which("rpm").is_ok() { rpm_provides } else if which::which("apk").is_ok() { apk_provides } else { return results; }; let canon_sysroot = sysroot.canonicalize().unwrap_or_else(|_| sysroot.into()); for filepath in filepaths { let resolved = filepath.canonicalize().unwrap_or_else(|_| filepath.clone()); let resolved_str = resolved.to_string_lossy(); // Try the path as-is first. if let Some(provided_by) = provider(&resolved_str, distro) { results.insert(filepath.clone(), provided_by); continue; } // For non-root sysroots, strip the prefix and retry with the // host-relative path. if canon_sysroot != Path::new("/") && let Ok(rel) = resolved.strip_prefix(&canon_sysroot) { let host_path = Path::new("/").join(rel); if let Some(provided_by) = provider(&host_path.to_string_lossy(), distro) { results.insert(filepath.clone(), provided_by); } } } results } /// Read the distro `ID`, trying the sysroot first then falling back to host. fn read_distro_id(sysroot: &Path) -> Option { if sysroot != Path::new("/") && let Some(id) = read_os_release_id(&sysroot.join("etc/os-release")) { return Some(id); } read_os_release_id(Path::new("/etc/os-release")) } fn read_os_release_id(path: &Path) -> Option { let content = fs_err::read_to_string(path).ok()?; let caps = OS_RELEASE_ID_RE.captures(&content)?; caps.get(1) .or_else(|| caps.get(2)) .map(|m| m.as_str().to_string()) } #[cfg(test)] mod tests { use super::*; #[test] fn test_purl_encode() { assert_eq!(purl_encode("zlib1g"), "zlib1g"); assert_eq!(purl_encode("foo bar"), "foo%20bar"); assert_eq!(purl_encode("a/b"), "a%2Fb"); } #[test] fn test_purl_with_distro() { let p = ProvidedBy { package_type: "deb".into(), package_name: "zlib1g".into(), package_version: "1:1.2.11".into(), distro: Some("ubuntu".into()), }; assert_eq!(p.purl(), "pkg:deb/ubuntu/zlib1g@1%3A1.2.11"); } #[test] fn test_purl_without_distro() { let p = ProvidedBy { package_type: "rpm".into(), package_name: "zlib".into(), package_version: "1.2.11-31.el9".into(), distro: None, }; assert_eq!(p.purl(), "pkg:rpm/zlib@1.2.11-31.el9"); } #[test] fn test_whichprovides_empty_input() { assert!(whichprovides(&[], Path::new("/")).is_empty()); } } maturin-1.16.0/src/auditwheel/windows.rs000066400000000000000000000470551527064705700202700ustar00rootroot00000000000000//! Windows wheel repair (delvewheel). //! //! Finds external (non-system) DLLs that a wheel's native extensions depend on, //! and copies them into the wheel so the extension finds them at runtime. //! //! This is the Rust equivalent of [delvewheel](https://github.com/adang1345/delvewheel). //! The key operations are: //! 1. Analyze the extension's dependency tree using lddtree //! 2. Filter out system DLLs (by name patterns AND by resolved path) //! 3. Copy external DLLs into `.libs/` inside the wheel //! 4. Rename DLLs with hash-suffixed names and patch PE import tables //! (see [`pe_patch`](super::pe_patch)) to reference the new names //! 5. Patch `__init__.py` with `os.add_dll_directory()` for runtime DLL //! discovery use super::repair::{AuditResult, AuditedArtifact, GraftedLib, PatchKind, WheelRepairer}; use crate::compile::BuildArtifact; use anyhow::{Context, Result, bail}; use std::collections::{HashMap, HashSet}; use std::path::{Path, PathBuf}; /// Windows wheel repairer (delvewheel equivalent). /// /// Bundles external DLLs and rewrites PE import tables so that /// hash-suffixed copies are loaded from the `.libs/` directory. /// /// Like [delvewheel](https://github.com/adang1345/delvewheel), this does not /// modify the wheel's platform tag — Windows tags (`win_amd64`, `win32`, /// `win_arm64`) have no version component. pub struct WindowsRepairer { /// Whether the target interpreter is PyPy. /// /// When true, `libffi*.dll` is excluded from bundling because PyPy /// ships it as part of its distribution (it's a runtime prerequisite /// for PyPy's ctypes/cffi support). pub is_pypy: bool, } impl WheelRepairer for WindowsRepairer { fn audit(&self, artifact: &BuildArtifact, ld_paths: Vec) -> Result { let external_libs = find_external_libs(&artifact.path, ld_paths, self.is_pypy) .context("Failed to find external libraries for Windows wheel")?; Ok(AuditResult::new(super::Policy::default(), external_libs)) } fn patch(&self, audited: &[AuditedArtifact], kind: &PatchKind<'_>) -> Result<()> { let grafted: &[GraftedLib] = match kind { PatchKind::Repair { grafted, .. } => grafted, // Windows has no editable-mode patching today; matches the // default `patch_required` returning all-false for Editable. PatchKind::Editable => return Ok(()), }; // Build a lookup from original name → new name. // Include aliases so all names pointing to the same file are rewritten. let mut replacements: Vec<(&str, &str)> = Vec::new(); for l in grafted { if l.original_name != l.new_name { replacements.push((l.original_name.as_str(), l.new_name.as_str())); } for alias in &l.aliases { replacements.push((alias.as_str(), l.new_name.as_str())); } } // Patch each artifact's import table to reference the new names. // // Skip artifacts whose import table doesn't reference any grafted // DLL — `pe_patch::replace_needed` would otherwise rewrite the // file even when no entries match, polluting cargo's incremental // cache (#2969). DLL names are case-insensitive on Windows. for aa in audited { let artifact_deps: HashSet = aa .external_libs .iter() .map(|lib| lib.name.to_ascii_lowercase()) .collect(); let artifact_replacements: Vec<(&str, &str)> = replacements .iter() .filter(|(old, _)| artifact_deps.contains(&old.to_ascii_lowercase())) .copied() .collect(); if !artifact_replacements.is_empty() { super::pe_patch::replace_needed(&aa.artifact.path, &artifact_replacements) .with_context(|| { format!( "Failed to patch PE imports in {}", aa.artifact.path.display() ) })?; } } // Patch cross-references between grafted DLLs and clear DependentLoadFlags for lib in grafted { let lib_replacements: Vec<(&str, &str)> = lib .needed .iter() .filter_map(|n| { replacements .iter() .find(|(old, _)| old.eq_ignore_ascii_case(n)) .map(|(old, new)| (*old, *new)) }) .collect(); if !lib_replacements.is_empty() { super::pe_patch::replace_needed(&lib.dest_path, &lib_replacements).with_context( || format!("Failed to patch PE imports in {}", lib.dest_path.display()), )?; } else { super::pe_patch::clear_dependent_load_flags(&lib.dest_path)?; } } Ok(()) } fn init_py_patch(&self, libs_dir_name: &str, depth: usize) -> Option { let pardir_chain = "os.pardir, ".repeat(depth); // Note: Conda CPython 3.8-3.9 has a bug where os.add_dll_directory() doesn't // work correctly. Delvewheel detects Conda via `Anaconda_GetVersion` or // "packaged by conda-forge" in sys.version and falls back to LoadLibraryExW. // For simplicity, we only use os.add_dll_directory() which works on: // - CPython 3.10+ (including Conda) // - Non-Conda CPython 3.8-3.9 // Conda users on Python 3.8-3.9 should upgrade to 3.10+ or use delvewheel. Some(format!( "# start maturin patch\n\ def _maturin_dll_patch():\n\ \x20 import os\n\ \x20 import sys\n\ \x20 libs_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), {pardir_chain}\"{libs_dir_name}\"))\n\ \x20 if os.path.isdir(libs_dir):\n\ \x20 if sys.version_info >= (3, 8) and hasattr(os, 'add_dll_directory'):\n\ \x20 os.add_dll_directory(libs_dir)\n\ _maturin_dll_patch()\n\ del _maturin_dll_patch\n\ # end maturin patch\n" )) } } /// Check if a DLL name is a Windows API set (virtual DLL). /// /// API sets like `api-ms-win-crt-runtime-l1-1-0.dll` are virtual DLLs that /// Windows maps to real host DLLs at runtime. They never exist as files on disk. fn is_api_set_dll(name: &str) -> bool { name.starts_with("api-") || name.starts_with("ext-ms-") } /// Check if a DLL name matches the Python runtime DLL pattern. /// /// Matches CPython (`python311.dll`, `python313t.dll`, `python312_d.dll`) /// and PyPy (`libpypy39-c.dll`) interpreter DLLs that should never be bundled. fn is_python_dll(name: &str) -> bool { // CPython: python followed by digits, optional 't' (free-threaded), // optional '_d' (debug), then '.dll' if let Some(rest) = name.strip_prefix("python") { let rest = rest.as_bytes(); let mut i = 0; while i < rest.len() && rest[i].is_ascii_digit() { i += 1; } if i == 0 { return false; } if i < rest.len() && rest[i] == b't' { i += 1; } if i + 1 < rest.len() && rest[i] == b'_' && rest[i + 1] == b'd' { i += 2; } return rest[i..] == *b".dll"; } // PyPy: libpypy followed by version, then '-c.dll' if let Some(rest) = name.strip_prefix("libpypy") { return rest.ends_with("-c.dll"); } false } /// Check if a DLL is a PyPy runtime dependency that ships with the PyPy distribution. /// /// PyPy bundles `libffi-8.dll` (used by ctypes/cffi) alongside /// `libpypy3.x-c.dll` in its Windows distribution, so it is always /// available wherever PyPy is installed and should not be vendored. fn is_pypy_runtime_dll(name: &str) -> bool { name.starts_with("libffi") } /// Check if a DLL name matches the Visual C++ runtime redistributable pattern. fn is_vc_runtime_dll(name: &str) -> bool { name.starts_with("vcruntime") || name.starts_with("msvcp") || name.starts_with("msvcr") || name.starts_with("vccorlib") || name.starts_with("concrt") || name.starts_with("vcamp") || name.starts_with("vcomp") || name.starts_with("ucrtbase") || name.starts_with("mfc") } /// Well-known Windows system DLLs that should never be bundled. /// /// This is a curated fallback list for when path-based detection isn't /// possible (e.g., cross-compilation, or a DLL found via `PATH` outside /// the Windows directory). /// /// In practice, most system DLLs are caught by earlier checks: /// - API set DLLs (`api-*`, `ext-ms-*`) by prefix match /// - Python and VC runtime DLLs by prefix match /// - DLLs resolved to `%WINDIR%` by path check /// - Unfound DLLs during cross-compilation (lddtree skips them) /// /// This list catches the remaining edge case: a system DLL found on /// `PATH` in a non-standard location when building on Windows. /// /// Delvewheel maintains exhaustive per-architecture lists (~1200–2700 DLLs) /// derived from Windows installation media. We take a curated approach /// covering the DLLs most likely to appear as dependencies of native /// extensions via common C/C++ libraries (OpenSSL, libcurl, Qt, etc.). const KNOWN_SYSTEM_DLLS: &[&str] = &[ // Core OS "kernel32.dll", "kernelbase.dll", "ntdll.dll", "advapi32.dll", "user32.dll", "win32u.dll", "gdi32.dll", "gdi32full.dll", "shell32.dll", "ole32.dll", "oleaut32.dll", "rpcrt4.dll", "msvcrt.dll", "nsi.dll", // Networking "ws2_32.dll", "wsock32.dll", "mswsock.dll", "winhttp.dll", "wininet.dll", "iphlpapi.dll", "dnsapi.dll", "netapi32.dll", "wldap32.dll", "sechost.dll", "sspicli.dll", // Security/Crypto "secur32.dll", "crypt32.dll", "bcrypt.dll", "bcryptprimitives.dll", "ncrypt.dll", "wintrust.dll", "rsaenh.dll", "dpapi.dll", "cryptsp.dll", "cryptbase.dll", // Shell/UI "shlwapi.dll", "comctl32.dll", "comdlg32.dll", "imm32.dll", "uxtheme.dll", "shcore.dll", "dwmapi.dll", "msimg32.dll", // System services "userenv.dll", "dbghelp.dll", "psapi.dll", "setupapi.dll", "cfgmgr32.dll", "version.dll", "winmm.dll", "powrprof.dll", "cabinet.dll", "msi.dll", "imagehlp.dll", "normaliz.dll", "profapi.dll", "wevtapi.dll", "pdh.dll", "avrt.dll", "synchronization.dll", // COM/OLE "combase.dll", "propsys.dll", // IO / Storage "devobj.dll", "wtsapi32.dll", "credui.dll", "netutils.dll", "samcli.dll", // Graphics/DirectX "d3d9.dll", "d3d10.dll", "d3d11.dll", "d3d12.dll", "dxgi.dll", "d2d1.dll", "d3dcompiler_47.dll", "dwrite.dll", "opengl32.dll", "glu32.dll", "dxcore.dll", // Audio/Media "windowscodecs.dll", "mfplat.dll", "mf.dll", "mfreadwrite.dll", "mmdevapi.dll", // Misc frequently linked by native extensions "hid.dll", "winspool.drv", "cldapi.dll", "authz.dll", ]; /// Check if a resolved library path is inside a Windows system directory. /// /// Only checks specific system directories (System32, SysWOW64, WinSxS, /// SysArm32) rather than all of `%WINDIR%`, to avoid incorrectly excluding /// DLLs that happen to be under `C:\Windows\Temp` or similar. fn is_in_windows_system_dir(realpath: &Path) -> bool { let path_str = realpath.to_string_lossy().to_lowercase(); let path_normalized = path_str.replace('\\', "/"); let windir = std::env::var("WINDIR") .or_else(|_| std::env::var("SystemRoot")) .unwrap_or_default() .to_lowercase() .replace('\\', "/"); // Check specific system directories under %WINDIR% if !windir.is_empty() { let system_subdirs = ["system32", "syswow64", "winsxs", "sysarm32"]; for subdir in system_subdirs { if path_normalized.starts_with(&format!("{windir}/{subdir}/")) { return true; } } } // Fallback heuristic for cross-compilation or unusual environments path_normalized.contains("/windows/system32/") || path_normalized.contains("/windows/syswow64/") || path_normalized.contains("/windows/winsxs/") || path_normalized.contains("/windows/sysarm32/") } /// Check if a DLL should be excluded from bundling. /// /// Uses a layered approach: /// 1. API set DLLs (virtual, never real files) — by name prefix /// 2. Python DLLs — by name pattern /// 3. PyPy runtime DLLs (only when `is_pypy` is true) — by name prefix /// 4. VC runtime redistributables — by name pattern /// 5. Path-based check — if resolved to a Windows system directory /// 6. Name-based fallback — curated list for cross-compilation fn is_system_dll(name: &str, realpath: Option<&Path>, is_pypy: bool) -> bool { let lower = name.to_lowercase(); if is_api_set_dll(&lower) { return true; } if is_python_dll(&lower) { return true; } if is_pypy && is_pypy_runtime_dll(&lower) { return true; } if is_vc_runtime_dll(&lower) { return true; } if let Some(path) = realpath && is_in_windows_system_dir(path) { return true; } KNOWN_SYSTEM_DLLS.contains(&lower.as_str()) } /// Find external DLL dependencies for a Windows artifact. /// /// Returns DLLs that are NOT system/known DLLs and need to be bundled /// into the wheel for it to work on other machines. /// /// When `is_pypy` is true, PyPy runtime dependencies like `libffi` are /// also excluded since they ship with the PyPy distribution. /// /// # Errors /// /// Returns an error if two different DLLs share the same basename (case-insensitive), /// as this would cause ambiguous patching. This can happen when dependencies pull /// in different versions of the same library from different paths. pub fn find_external_libs( artifact: impl AsRef, ld_paths: Vec, is_pypy: bool, ) -> Result> { let dep_analyzer = lddtree::DependencyAnalyzer::default().library_paths(ld_paths); let deps = dep_analyzer.analyze(&artifact).with_context(|| { format!( "Failed to analyze dependencies for {}", artifact.as_ref().display() ) })?; let mut ext_libs = Vec::new(); // Track (lowercase_name -> realpath) to detect collisions let mut seen: HashMap = HashMap::new(); for (_name, lib) in deps.libraries { if is_system_dll(&lib.name, lib.realpath.as_deref(), is_pypy) { continue; } if !lib.found() { continue; } let lower_name = lib.name.to_lowercase(); let realpath = lib.realpath.as_ref().expect("lib.found() was true"); if let Some(existing_path) = seen.get(&lower_name) { // Check if they're actually different files if existing_path != realpath { bail!( "DLL basename collision: found two different DLLs named '{}'\n\ - {}\n\ - {}\n\ This is unsupported because PE import tables reference DLLs by \ basename only. Consider renaming one of the libraries or \ restructuring your dependencies.", lib.name, existing_path.display(), realpath.display() ); } // Same file via different paths/aliases, skip duplicate continue; } seen.insert(lower_name, realpath.clone()); ext_libs.push(lib); } Ok(ext_libs) } #[cfg(test)] mod tests { use super::*; use std::path::PathBuf; #[test] fn test_api_set_dlls() { assert!(is_api_set_dll("api-ms-win-crt-runtime-l1-1-0.dll")); assert!(is_api_set_dll("ext-ms-win-ntuser-uicontext-ext-l1-1-0.dll")); assert!(!is_api_set_dll("kernel32.dll")); } #[test] fn test_python_dlls() { assert!(is_python_dll("python3.dll")); assert!(is_python_dll("python311.dll")); assert!(is_python_dll("python312.dll")); assert!(is_python_dll("python313t.dll")); assert!(is_python_dll("python312_d.dll")); assert!(is_python_dll("python313t_d.dll")); assert!(is_python_dll("libpypy39-c.dll")); assert!(!is_python_dll("pythoncom.dll")); assert!(!is_python_dll("python3_bindings.dll")); } #[test] fn test_vc_runtime_dlls() { assert!(is_vc_runtime_dll("vcruntime140.dll")); assert!(is_vc_runtime_dll("vcruntime140_1.dll")); assert!(is_vc_runtime_dll("vcruntime140d.dll")); assert!(is_vc_runtime_dll("msvcp140.dll")); assert!(is_vc_runtime_dll("msvcp140_1.dll")); assert!(is_vc_runtime_dll("concrt140.dll")); assert!(is_vc_runtime_dll("vcomp140.dll")); assert!(is_vc_runtime_dll("ucrtbase.dll")); assert!(!is_vc_runtime_dll("mylib.dll")); } #[test] fn test_pypy_runtime_dlls() { assert!(is_pypy_runtime_dll("libffi-8.dll")); assert!(is_pypy_runtime_dll("libffi.dll")); assert!(!is_pypy_runtime_dll("libcrypto-3-x64.dll")); } #[test] fn test_system_dll_by_name() { assert!(is_system_dll("kernel32.dll", None, false)); assert!(is_system_dll("KERNEL32.DLL", None, false)); assert!(is_system_dll( "api-ms-win-crt-runtime-l1-1-0.dll", None, false )); assert!(is_system_dll("python311.dll", None, false)); assert!(is_system_dll("vcruntime140.dll", None, false)); assert!(!is_system_dll("libcrypto-3-x64.dll", None, false)); } #[test] fn test_system_dll_pypy_libffi() { // libffi should only be excluded for PyPy assert!(!is_system_dll("libffi-8.dll", None, false)); assert!(is_system_dll("libffi-8.dll", None, true)); } #[test] fn test_system_dll_by_path() { let system32_path = PathBuf::from(r"C:\Windows\System32\obscure_system.dll"); assert!(is_system_dll( "obscure_system.dll", Some(&system32_path), false )); let syswow64_path = PathBuf::from(r"C:\Windows\SysWOW64\another.dll"); assert!(is_system_dll("another.dll", Some(&syswow64_path), false)); let user_path = PathBuf::from(r"C:\Users\me\libs\mylib.dll"); assert!(!is_system_dll("mylib.dll", Some(&user_path), false)); // Temp directory under Windows should NOT be treated as system let temp_path = PathBuf::from(r"C:\Windows\Temp\mylib.dll"); assert!(!is_system_dll("mylib.dll", Some(&temp_path), false)); } #[test] fn test_init_py_patch_depth_1() { let repairer = WindowsRepairer { is_pypy: false }; let patch = repairer.init_py_patch("mypackage.libs", 1).unwrap(); assert!(patch.contains("# start maturin patch")); assert!(patch.contains("# end maturin patch")); assert!(patch.contains("os.add_dll_directory(libs_dir)")); assert!(patch.contains("hasattr(os, 'add_dll_directory')")); assert!(patch.contains("sys.version_info >= (3, 8)")); assert!(patch.contains(r#"os.pardir, "mypackage.libs""#)); } #[test] fn test_init_py_patch_depth_2() { let repairer = WindowsRepairer { is_pypy: false }; let patch = repairer.init_py_patch("mypackage.libs", 2).unwrap(); assert!(patch.contains(r#"os.pardir, os.pardir, "mypackage.libs""#)); } } maturin-1.16.0/src/binding_generator/000077500000000000000000000000001527064705700175425ustar00rootroot00000000000000maturin-1.16.0/src/binding_generator/bin_binding.rs000066400000000000000000000217051527064705700223570ustar00rootroot00000000000000use std::borrow::Borrow; use std::collections::HashMap; use std::path::Path; use std::str::FromStr as _; use anyhow::Context; use anyhow::Result; use path_slash::PathBufExt as _; use pep508_rs::Requirement; use crate::BuildArtifact; use crate::BuildContext; use crate::Metadata24; use crate::archive_source::ArchiveSource; use crate::archive_source::GeneratedSourceData; use crate::binding_generator::ArtifactTarget; use super::BindingGenerator; use super::GeneratorOutput; /// A generator for producing bin (and wasm) bindings. pub struct BinBindingGenerator<'m> { metadata: &'m Metadata24, /// When `true`, the real binary is placed in `{dist_name}.scripts/` in /// platlib and a Python shim is placed in `.data/scripts/` instead. /// This is needed when the binary has external shared library /// dependencies that are bundled into the wheel's `.libs/` directory, /// because the relative path from the installed `bin/` to /// `site-packages/{dist}.libs/` is unpredictable across installations. use_shim: bool, } impl<'m> BinBindingGenerator<'m> { pub fn new(metadata: &'m Metadata24, use_shim: bool) -> Self { Self { metadata, use_shim } } pub fn prepare_metadata( metadata: &mut Metadata24, context: &BuildContext, artifacts: &[A], ) -> Result<()> where A: Borrow, { if context.project.target.is_wasi() { for artifact in artifacts { let bin_name = artifact_bin_name(artifact.borrow())?; update_entry_points(metadata, &bin_name)?; } } Ok(()) } } impl<'m> BindingGenerator for BinBindingGenerator<'m> { fn generate_bindings( &mut self, context: &BuildContext, artifact: &BuildArtifact, _module: &Path, ) -> Result { let bin_name = artifact_bin_name(artifact)?; let scripts_dir = self.metadata.get_data_dir().join("scripts"); let mut additional_files = HashMap::new(); let artifact_target = if self.use_shim { // The real binary goes into platlib at {dist}.scripts/{bin_name} // so it has a predictable relative path to {dist}.libs/. // A Python shim in .data/scripts/ execs the real binary at runtime. let real_bin_dir = self.metadata.get_scripts_platlib_dir(); let shim_path = real_bin_dir.join(&bin_name); let shim_path_str = shim_path.to_slash_lossy(); let libs_dir_name = self.metadata.get_distribution_escaped() + ".libs"; // On Windows, bin_name includes `.exe`. The shim script must NOT // have an `.exe` extension — otherwise Windows treats it as a PE // binary and pip skips wrapper generation. Strip the extension for // the shim entry in .data/scripts/. let shim_name = bin_name.strip_suffix(".exe").unwrap_or(&bin_name); additional_files.insert( scripts_dir.join(shim_name), ArchiveSource::Generated(GeneratedSourceData { data: generate_script_shim(&shim_path_str, &libs_dir_name).into(), path: None, executable: true, }), ); ArtifactTarget::Binary(real_bin_dir.join(&bin_name)) } else { ArtifactTarget::Binary(scripts_dir.join(&bin_name)) }; if context.project.target.is_wasi() { let dist_name = self.metadata.get_distribution_escaped(); additional_files.insert( Path::new(&dist_name) .join(bin_name.replace('-', "_")) .with_extension("py"), ArchiveSource::Generated(GeneratedSourceData { data: generate_wasm_launcher(&bin_name).into(), path: None, executable: false, }), ); } Ok(GeneratorOutput { artifact_target, artifact_source_override: None, additional_files, }) } } fn artifact_bin_name(artifact: &BuildArtifact) -> Result { // I wouldn't know of any case where this would be the wrong (and neither do // I know a better alternative) let bin_name = artifact .path .file_name() .context("Couldn't get the filename from the binary produced by cargo")? .to_str() .context("binary produced by cargo has non-utf8 filename")? .to_string(); Ok(bin_name) } /// Generate a Python shim script that execs the real binary from platlib. /// /// This is used when a bin-type wheel has external shared library dependencies /// that are bundled into `{dist}.libs/` in platlib. The real binary is placed /// in `{dist}.scripts/` (also in platlib) so it has a predictable RPATH to /// the libs directory. The shim replaces the original script entry and uses /// `sysconfig.get_path("platlib")` to locate the real binary at runtime. /// /// On Windows, `os.add_dll_directory()` is called to register the `.libs/` /// directory for DLL search before exec'ing the binary, since Windows does /// not use RPATH/`@loader_path` for DLL resolution. /// /// This approach matches [auditwheel's handling](https://github.com/pypa/auditwheel/pull/443). fn generate_script_shim(binary_path: &str, libs_dir_name: &str) -> String { format!( "#!python\n\ import os\n\ import sys\n\ import sysconfig\n\ \n\ \n\ if __name__ == \"__main__\":\n\ \x20 platlib = sysconfig.get_path(\"platlib\")\n\ \x20 exe = os.path.join(platlib, \"{binary_path}\")\n\ \x20 libs_dir = os.path.join(platlib, \"{libs_dir_name}\")\n\ \x20 if sys.platform == \"win32\" and os.path.isdir(libs_dir):\n\ \x20 os.add_dll_directory(libs_dir)\n\ \x20 os.environ[\"PATH\"] = libs_dir + os.pathsep + os.environ.get(\"PATH\", \"\")\n\ \x20 os.execv(exe, [exe] + sys.argv[1:])\n" ) } /// Adds a wrapper script that starts the wasm binary through wasmtime. pub fn generate_wasm_launcher(bin_name: &str) -> String { format!( r#"from pathlib import Path from wasmtime import Store, Module, Engine, WasiConfig, Linker import sysconfig def main(): # The actual executable program_location = Path(sysconfig.get_path("scripts")).joinpath("{bin_name}") # wasmtime-py boilerplate engine = Engine() store = Store(engine) # TODO: is there an option to just get the default of the wasmtime cli here? wasi = WasiConfig() wasi.inherit_argv() wasi.inherit_env() wasi.inherit_stdout() wasi.inherit_stderr() wasi.inherit_stdin() # TODO: Find a real solution here. Maybe there's an always allow callback? # Even fancier would be something configurable in pyproject.toml wasi.preopen_dir(".", ".") store.set_wasi(wasi) linker = Linker(engine) linker.define_wasi() module = Module.from_file(store.engine, str(program_location)) linking1 = linker.instantiate(store, module) # TODO: this is taken from https://docs.wasmtime.dev/api/wasmtime/struct.Linker.html#method.get_default # is this always correct? start = linking1.exports(store).get("") or linking1.exports(store)["_start"] start(store) if __name__ == '__main__': main() "# ) } /// Insert wasm launcher scripts as entrypoints and the wasmtime dependency fn update_entry_points(metadata24: &mut Metadata24, bin_name: &str) -> Result<()> { let distribution_name = metadata24.get_distribution_escaped(); let console_scripts = metadata24 .entry_points .entry("console_scripts".to_string()) .or_default(); // From https://packaging.python.org/en/latest/specifications/entry-points/ // > The name may contain any characters except =, but it cannot start or end with any // > whitespace character, or start with [. For new entry points, it is recommended to // > use only letters, numbers, underscores, dots and dashes (regex [\w.-]+). // All of these rules are already enforced by cargo: // https://github.com/rust-lang/cargo/blob/58a961314437258065e23cb6316dfc121d96fb71/src/cargo/util/restricted_names.rs#L39-L84 // i.e. we don't need to do any bin name validation here anymore let base_name = bin_name .strip_suffix(".wasm") .context("No .wasm suffix in wasi binary")?; console_scripts.insert( base_name.to_string(), format!("{distribution_name}.{}:main", base_name.replace('-', "_")), ); // Add our wasmtime default version if the user didn't provide one if !metadata24 .requires_dist .iter() .any(|requirement| requirement.name.as_ref() == "wasmtime") { // Having the wasmtime version hardcoded is not ideal, it's easy enough to overwrite metadata24 .requires_dist .push(Requirement::from_str("wasmtime>=11.0.0,<12.0.0").unwrap()); } Ok(()) } maturin-1.16.0/src/binding_generator/cffi_binding.rs000066400000000000000000000224751527064705700225230ustar00rootroot00000000000000use std::collections::HashMap; use std::ffi::OsStr; use std::io; use std::io::Write as _; use std::path::Path; use std::path::PathBuf; use std::process::Command; use std::process::Output; use std::rc::Rc; use std::str; use anyhow::Context as _; use anyhow::Result; use anyhow::bail; use fs_err as fs; use tempfile::TempDir; use tracing::debug; use crate::BuildArtifact; use crate::BuildContext; use crate::PythonInterpreter; use crate::archive_source::ArchiveSource; use crate::archive_source::GeneratedSourceData; use crate::binding_generator::ArtifactTarget; use super::BindingGenerator; use super::GeneratorOutput; /// A generator for producing Cffi bindings. pub struct CffiBindingGenerator<'a> { interpreter: &'a PythonInterpreter, tempdir: Rc, } impl<'a> CffiBindingGenerator<'a> { pub fn new(interpreter: &'a PythonInterpreter, tempdir: Rc) -> Result { Ok(Self { interpreter, tempdir, }) } } impl<'a> BindingGenerator for CffiBindingGenerator<'a> { fn generate_bindings( &mut self, context: &BuildContext, _artifact: &BuildArtifact, module: &Path, ) -> Result { let cffi_module_file_name = { let extension_name = &context.project.project_layout.extension_name; // https://cffi.readthedocs.io/en/stable/embedding.html#issues-about-using-the-so super::cdylib_filename(extension_name, context.project.target.target_os()) }; let base_path = if context.project.project_layout.python_module.is_some() { module.join(&context.project.project_layout.extension_name) } else { module.to_path_buf() }; let artifact_target = ArtifactTarget::ExtensionModule(base_path.join(&cffi_module_file_name)); let mut additional_files = HashMap::new(); additional_files.insert( base_path.join("__init__.py"), ArchiveSource::Generated(GeneratedSourceData { data: cffi_init_file(&cffi_module_file_name).into(), path: None, executable: false, }), ); let declarations = generate_cffi_declarations( context.project.manifest_path.parent().unwrap(), &context.project.target_dir, &self.interpreter.executable, &self.tempdir, )?; additional_files.insert( base_path.join("ffi.py"), ArchiveSource::Generated(GeneratedSourceData { data: declarations.into(), path: None, executable: false, }), ); Ok(GeneratorOutput { artifact_target, artifact_source_override: None, additional_files, }) } } /// Glue code that exposes `lib`. fn cffi_init_file(cffi_module_file_name: &str) -> String { format!( r#"__all__ = ["lib", "ffi"] import os from .ffi import ffi lib = ffi.dlopen(os.path.join(os.path.dirname(__file__), '{cffi_module_file_name}')) del os "# ) } /// Wraps some boilerplate around error handling when calling python fn call_python(python: &Path, args: I) -> Result where I: IntoIterator, S: AsRef, { Command::new(python) .args(args) .output() .context(format!("Failed to run python at {python:?}")) } /// Checks if user has provided their own header at `target/header.h`, otherwise /// we run cbindgen to generate one. fn cffi_header(crate_dir: &Path, target_dir: &Path, tempdir: &TempDir) -> Result { let maybe_header = target_dir.join("header.h"); if maybe_header.is_file() { eprintln!("💼 Using the existing header at {}", maybe_header.display()); Ok(maybe_header) } else { if crate_dir.join("cbindgen.toml").is_file() { eprintln!( "💼 Using the existing cbindgen.toml configuration.\n\ 💼 Enforcing the following settings:\n \ - language = \"C\" \n \ - no_includes = true, sys_includes = []\n \ (#include is not yet supported by CFFI)\n \ - defines = [], include_guard = None, pragma_once = false, cpp_compat = false\n \ (#define, #ifdef, etc. is not yet supported by CFFI)\n" ); } let mut config = cbindgen::Config::from_root_or_default(crate_dir); config.language = cbindgen::Language::C; config.no_includes = true; config.sys_includes = Vec::new(); config.defines = HashMap::new(); config.include_guard = None; config.pragma_once = false; config.cpp_compat = false; let bindings = cbindgen::Builder::new() .with_config(config) .with_crate(crate_dir) .with_language(cbindgen::Language::C) .with_no_includes() .generate() .context("Failed to run cbindgen")?; let header = tempdir.as_ref().join("header.h"); bindings.write_to_file(&header); debug!("Generated header.h at {}", header.display()); Ok(header) } } /// Returns the content of what will become ffi.py by invoking cbindgen and cffi /// /// Checks if user has provided their own header at `target/header.h`, otherwise /// we run cbindgen to generate one. Installs cffi if it's missing and we're inside a virtualenv /// /// We're using the cffi recompiler, which reads the header, translates them into instructions /// how to load the shared library without the header and then writes those instructions to a /// file called `ffi.py`. This `ffi.py` will expose an object called `ffi`. This object is used /// in `__init__.py` to load the shared library into a module called `lib`. fn generate_cffi_declarations( crate_dir: &Path, target_dir: &Path, python: &Path, tempdir: &TempDir, ) -> Result { let header = cffi_header(crate_dir, target_dir, tempdir)?; let ffi_py = tempdir.as_ref().join("ffi.py"); // Using raw strings is important because on windows there are path like // `C:\Users\JohnDoe\AppData\Local\TEmpl\pip-wheel-asdf1234` where the \U // would otherwise be a broken unicode escape sequence let cffi_invocation = format!( r#" import cffi from cffi import recompiler ffi = cffi.FFI() with open(r"{header}") as header: ffi.cdef(header.read()) recompiler.make_py_source(ffi, "ffi", r"{ffi_py}") "#, ffi_py = ffi_py.display(), header = header.display(), ); let output = call_python(python, ["-c", &cffi_invocation])?; let install_cffi = if !output.status.success() { // First, check whether the error was cffi not being installed let last_line = str::from_utf8(&output.stderr)?.lines().last().unwrap_or(""); if last_line == "ModuleNotFoundError: No module named 'cffi'" { // Then check whether we're running in a virtualenv. // We don't want to modify any global environment // https://stackoverflow.com/a/42580137/3549270 let output = call_python( python, ["-c", "import sys\nprint(sys.base_prefix != sys.prefix)"], )?; match str::from_utf8(&output.stdout)?.trim() { "True" => true, "False" => false, _ => { eprintln!( "âš ï¸� Failed to determine whether python at {python:?} is running inside a virtualenv", ); false } } } else { false } } else { false }; // If there was success or an error that was not missing cffi, return here if !install_cffi { return handle_cffi_call_result(python, &ffi_py, &output); } eprintln!("âš ï¸� cffi not found. Trying to install it"); // Call pip through python to don't do the wrong thing when python and pip // are coming from different environments let output = call_python( python, [ "-m", "pip", "install", "--disable-pip-version-check", "cffi", ], )?; if !output.status.success() { bail!( "Installing cffi with `{python:?} -m pip install cffi` failed: {}\n--- Stdout:\n{}\n--- Stderr:\n{}\n---\nPlease install cffi yourself.", output.status, str::from_utf8(&output.stdout)?, str::from_utf8(&output.stderr)? ); } eprintln!("ðŸŽ� Installed cffi"); // Try again let output = call_python(python, ["-c", &cffi_invocation])?; handle_cffi_call_result(python, &ffi_py, &output) } /// Extracted into a function because this is needed twice fn handle_cffi_call_result(python: &Path, ffi_py: &Path, output: &Output) -> Result { if !output.status.success() { bail!( "Failed to generate cffi declarations using {}: {}\n--- Stdout:\n{}\n--- Stderr:\n{}", python.display(), output.status, str::from_utf8(&output.stdout)?, str::from_utf8(&output.stderr)?, ); } else { // Don't swallow warnings io::stderr().write_all(&output.stderr)?; let ffi_py_content = fs::read_to_string(ffi_py)?; Ok(ffi_py_content) } } maturin-1.16.0/src/binding_generator/mod.rs000066400000000000000000000447221527064705700207000ustar00rootroot00000000000000use std::borrow::Borrow; use std::collections::HashMap; use std::io; use std::io::Write as _; use std::path::Path; use std::path::PathBuf; use anyhow::Context as _; use anyhow::Result; use fs_err as fs; use fs_err::File; #[cfg(unix)] use fs_err::os::unix::fs::OpenOptionsExt as _; use tracing::{debug, warn}; use crate::BuildArtifact; use crate::BuildContext; use crate::ModuleWriter; use crate::VirtualWriter; use crate::WheelWriter; use crate::archive_source::ArchiveSource; #[cfg(unix)] use crate::module_writer::default_permission; use crate::module_writer::file_permission_mode; use crate::module_writer::permission_is_executable; use crate::module_writer::write_python_part; use walkdir::WalkDir; mod bin_binding; mod cffi_binding; mod pyo3_binding; mod uniffi_binding; pub use bin_binding::BinBindingGenerator; pub use cffi_binding::CffiBindingGenerator; pub use pyo3_binding::Pyo3BindingGenerator; pub use uniffi_binding::UniFfiBindingGenerator; use crate::target::Os; /// Returns the platform-specific cdylib filename for the given library name. /// /// For example, `cdylib_filename("foo", Os::Macos)` returns `"libfoo.dylib"`. pub(crate) fn cdylib_filename(name: &str, os: Os) -> String { match os { Os::Macos => format!("lib{name}.dylib"), Os::Windows => format!("{name}.dll"), _ => format!("lib{name}.so"), } } /// A trait to generate the binding files to be included in the built module /// /// This trait is used to generate the support files necessary to build a python /// module for any [crate::BridgeModel] pub(crate) trait BindingGenerator { fn generate_bindings( &mut self, context: &BuildContext, artifact: &BuildArtifact, module: &Path, ) -> Result; } #[derive(Debug)] pub(crate) enum ArtifactTarget { /// A binary executable that should be installed in scripts Binary(PathBuf), /// An extension module ExtensionModule(PathBuf), } impl ArtifactTarget { pub(crate) fn path(&self) -> &Path { match self { ArtifactTarget::Binary(path) | ArtifactTarget::ExtensionModule(path) => path, } } } #[derive(Debug)] pub(crate) struct GeneratorOutput { /// The path, relative to the archive root, where the built artifact/module /// should be installed artifact_target: ArtifactTarget, /// In some cases, the source path of the artifact is altered /// (e.g. when the build output is an archive which needs to be unpacked) artifact_source_override: Option, /// Additional files to be installed (e.g. __init__.py) /// The provided PathBuf should be relative to the archive root additional_files: HashMap, } enum InstallDest<'writer, 'base> { Editable { writer: &'writer mut VirtualWriter, base_path: &'base Path, }, Archive { writer: &'writer mut VirtualWriter, }, } impl<'writer, 'base> InstallDest<'writer, 'base> { fn new( writer: &'writer mut VirtualWriter, editable: bool, base_path: Option<&'base Path>, ) -> Self { match (editable, base_path) { (true, Some(base_path)) => Self::Editable { writer, base_path }, _ => Self::Archive { writer }, } } fn add_artifact(&mut self, artifact_target: &ArtifactTarget, source: &Path) -> Result<()> { match self { Self::Editable { writer, base_path } => match artifact_target { ArtifactTarget::Binary(path) => { // Use add_file_force to bypass exclusion checks for the compiled artifact writer.add_file_force(path, source, true)?; } ArtifactTarget::ExtensionModule(path) => { let target = base_path.join(path); debug!("Removing previously built module {}", target.display()); fs::create_dir_all(target.parent().unwrap())?; // Remove existing so file to avoid triggering SIGSEV in running process // See https://github.com/PyO3/maturin/issues/758 let _ = fs::remove_file(&target); debug!("Installing {} from {}", target.display(), source.display()); fs::copy(source, &target).with_context(|| { format!( "Failed to copy {} to {}", source.display(), target.display(), ) })?; } }, Self::Archive { writer } => { debug!( "Adding to archive {} from {}", artifact_target.path().display(), source.display() ); // Use add_file_force to bypass exclusion checks for the compiled artifact writer.add_file_force(artifact_target.path(), source, true)?; } } Ok(()) } fn add_generated_files( &mut self, additional_files: HashMap, ) -> Result<()> { for (target, source) in additional_files { self.add_generated_file(target, source)?; } Ok(()) } fn add_generated_file(&mut self, target: PathBuf, source: ArchiveSource) -> Result<()> { match self { Self::Editable { base_path, .. } => { let target = base_path.join(target); fs::create_dir_all(target.parent().unwrap())?; debug!("Generating file {}", target.display()); let mut options = File::options(); options.write(true).create(true).truncate(true); #[cfg(unix)] { options.mode(default_permission(source.executable())); } let mut file = options.open(&target)?; match source { ArchiveSource::Generated(source) => file.write_all(&source.data)?, ArchiveSource::File(source) => { let mut source = File::options().read(true).open(source.path)?; io::copy(&mut source, &mut file)?; } } } Self::Archive { writer } => { debug!("Generating archive entry {}", target.display()); // Use add_entry_force to bypass exclusion checks for generated binding files writer.add_entry_force(target, source)?; } } Ok(()) } fn add_import_lib(&mut self, import_lib: &Path, module: &Path) -> Result<()> { match self { Self::Editable { base_path, .. } => { let target = base_path.join(import_lib.file_name().unwrap()); fs::create_dir_all(target.parent().unwrap())?; debug!("Installing import library {}", target.display()); fs::copy(import_lib, &target)?; } Self::Archive { writer } => { let dest = module.join(import_lib.file_name().unwrap()); debug!("Adding import library to archive {}", dest.display()); writer.add_file_force(dest, import_lib, false)?; } } Ok(()) } fn add_debuginfo( &mut self, debuginfo: &Path, artifact_target: &ArtifactTarget, module: &Path, ) -> Result<()> { match self { Self::Editable { base_path, .. } => { let debuginfo_base = match artifact_target { ArtifactTarget::Binary(_) => base_path.to_path_buf(), ArtifactTarget::ExtensionModule(path) => base_path .join(path) .parent() .map(|p| p.to_path_buf()) .unwrap_or_else(|| base_path.to_path_buf()), }; let debuginfo_name = debuginfo .file_name() .context("Failed to get debug info file name")?; let target = debuginfo_base.join(debuginfo_name); // Remove stale debuginfo to avoid mixed contents (mirrors the // "remove existing .so" logic for the extension module itself) if target.is_dir() { let _ = fs::remove_dir_all(&target); } else if target.exists() { let _ = fs::remove_file(&target); } if debuginfo.is_dir() { // .dSYM is a directory bundle on macOS debug!( "Copying debug info directory {} to {}", debuginfo.display(), target.display() ); copy_dir_all(debuginfo, &target)?; } else if debuginfo.is_file() { debug!( "Installing debug info {} to {}", debuginfo.display(), target.display() ); fs::create_dir_all(target.parent().unwrap())?; fs::copy(debuginfo, &target)?; } else { warn!( "Debug info path {} is neither a file nor a directory, skipping", debuginfo.display() ); } } Self::Archive { writer } => { // Binary artifacts go into the `.data/scripts/` directory. // The wheel spec only permits regular files in `scripts/`, so // a `.dSYM` directory bundle (macOS debug info) cannot be // placed there. Skip debug-info installation for binaries to // avoid producing an invalid wheel that tools like uv reject. if matches!(artifact_target, ArtifactTarget::Binary(_)) { warn!( "Skipping debug info for binary artifact in wheel: {} \ (directory bundles such as .dSYM are not permitted in \ the wheel `scripts` directory)", debuginfo.display() ); return Ok(()); } // Place debug info next to the artifact inside the wheel, // not at the top-level module (the artifact may be nested // in a subdirectory for CFFI/UniFFI mixed projects). let debuginfo_dir = artifact_target .path() .parent() .map(|p| p.to_path_buf()) .unwrap_or_else(|| module.to_path_buf()); let debuginfo_name = debuginfo .file_name() .context("Failed to get debug info file name")?; if debuginfo.is_dir() { // .dSYM is a directory bundle on macOS - add all files recursively for entry in WalkDir::new(debuginfo).follow_links(true) { let entry = entry?; if entry.file_type().is_file() { let relative = entry .path() .strip_prefix(debuginfo) .context("Failed to compute relative path in debug info bundle")?; let dest = debuginfo_dir.join(debuginfo_name).join(relative); debug!( "Adding debug info {} to archive at {}", entry.path().display(), dest.display() ); writer.add_file_force(dest, entry.path(), false)?; } } } else if debuginfo.is_file() { let dest = debuginfo_dir.join(debuginfo_name); debug!( "Adding debug info {} to archive at {}", debuginfo.display(), dest.display() ); writer.add_file_force(dest, debuginfo, false)?; } else { warn!( "Debug info path {} is neither a file nor a directory, skipping", debuginfo.display() ); } } } Ok(()) } fn add_out_dir_include(&mut self, target: &Path, source: &Path) -> Result<()> { match self { Self::Editable { base_path, .. } => { let target = base_path.join(target); if let Some(parent) = target.parent() { fs::create_dir_all(parent)?; } debug!( "Installing OUT_DIR file {} from {}", target.display(), source.display() ); fs::copy(source, &target)?; } Self::Archive { writer } => { let mode = file_permission_mode(source)?; writer.add_file(target, source, permission_is_executable(mode))?; } } Ok(()) } } /// Every binding generator ultimately has to install the following: /// 1. The python files (if any) /// 2. The artifact /// 3. Additional files /// 4. Type stubs (if any/pure rust only) /// /// Additionally, the above are installed to 2 potential locations: /// 1. The archive /// 2. The filesystem /// /// For editable installs: /// If the project is pure rust, the wheel is built as normal and installed /// If the project has python, the artifact is installed into the project and a pth is written to the archive /// /// So the full matrix comes down to: /// 1. editable, has python => install to fs, write pth to archive /// 2. everything else => install to archive/build as normal /// /// Note: Writing the pth to the archive is handled by [BuildContext], not here pub fn generate_binding( writer: &mut VirtualWriter, generator: &mut (impl BindingGenerator + ?Sized), context: &BuildContext, artifacts: &[A], out_dirs: &HashMap, ) -> Result<()> where A: Borrow, { // 1. Install the python files if !context.project.editable { write_python_part( writer, &context.project.project_layout, context.project.pyproject_toml.as_ref(), &context.project.target_dir, ) .context("Failed to add the python module to the package")?; } let base_path = context.project.project_layout.base_path(); let module = context.project.project_layout.module_dir(); { let mut dest = InstallDest::new(writer, context.project.editable, base_path.as_deref()); for artifact in artifacts { let artifact = artifact.borrow(); let GeneratorOutput { artifact_target, artifact_source_override, additional_files, } = generator.generate_bindings(context, artifact, &module)?; let source = artifact_source_override.unwrap_or_else(|| artifact.path.clone()); dest.add_artifact(&artifact_target, &source)?; dest.add_generated_files(additional_files)?; if let Some(import_lib) = &artifact.import_lib_path && context.artifact.include_import_lib { dest.add_import_lib(import_lib, &module)?; } if let Some(debuginfo) = &artifact.debuginfo_path && context.artifact.include_debuginfo { dest.add_debuginfo(debuginfo, &artifact_target, &module)?; } } } // 4. Install type stubs if context.project.project_layout.python_module.is_none() { let ext_name = &context.project.project_layout.extension_name; let type_stub = context .project .project_layout .rust_module .join(format!("{ext_name}.pyi")); if type_stub.exists() { if context.artifact.generate_stubs { eprintln!( "âš ï¸� Warning: Ignoring the type stub file at {ext_name}.pyi, stubs are automatically generated instead" ); } else { eprintln!("📖 Found type stub file at {ext_name}.pyi"); writer.add_file(module.join("__init__.pyi"), type_stub, false)?; writer.add_empty_file(module.join("py.typed"))?; } } } // 5. Include files from OUT_DIR if let Some(pyproject) = context.project.pyproject_toml.as_ref() && let Some(glob_patterns) = pyproject.include() { let mut dest = InstallDest::new(writer, context.project.editable, base_path.as_deref()); for inc in glob_patterns.iter().filter_map(|p| p.as_out_dir_include()) { let pkg_name = inc.crate_name.unwrap_or(&context.project.crate_name); let out_dir = out_dirs.get(pkg_name).with_context(|| { format!( "No OUT_DIR found for crate \"{pkg_name}\". \ Make sure the crate has a build script (build.rs)." ) })?; eprintln!( "📦 Including files matching \"{}\" from OUT_DIR of \"{pkg_name}\"", inc.path ); let matches = crate::module_writer::glob::resolve_out_dir_includes(inc.path, out_dir, inc.to)?; if matches.is_empty() { eprintln!( "âš ï¸� Warning: No files matched \"{}\" in OUT_DIR ({})", inc.path, out_dir.display() ); } for m in matches { dest.add_out_dir_include(&m.target, &m.source)?; } } } Ok(()) } /// Recursively copy a directory and its contents. pub(crate) fn copy_dir_all(src: &Path, dst: &Path) -> Result<()> { fs::create_dir_all(dst)?; for entry in WalkDir::new(src).follow_links(true) { let entry = entry?; let relative = entry .path() .strip_prefix(src) .context("Failed to compute relative path")?; let target = dst.join(relative); if entry.file_type().is_dir() { fs::create_dir_all(&target)?; } else { fs::copy(entry.path(), &target)?; } } Ok(()) } maturin-1.16.0/src/binding_generator/pyo3_binding.rs000066400000000000000000000160501527064705700224760ustar00rootroot00000000000000use std::collections::HashMap; use std::path::Path; use std::path::PathBuf; use std::process::Command; use std::rc::Rc; use anyhow::Context; use anyhow::Result; use anyhow::bail; use pyo3_introspection::{introspect_cdylib, module_stub_files}; use tempfile::TempDir; use tracing::debug; use crate::BuildArtifact; use crate::BuildContext; use crate::PythonInterpreter; use crate::StableAbiKind; use crate::Target; use crate::archive_source::ArchiveSource; use crate::archive_source::GeneratedSourceData; use crate::binding_generator::ArtifactTarget; use super::BindingGenerator; use super::GeneratorOutput; /// A generator for producing PyO3 bindings. /// /// This struct is responsible for generating Python bindings for modules using PyO3. /// The `binding_type` field determines whether the generated bindings use the stable PyO3 "abi3" interface, /// which allows compatibility with multiple Python versions and allows targeting a specific python /// interpreter. pub struct Pyo3BindingGenerator<'a> { binding_type: BindingType<'a>, tempdir: Rc, } enum BindingType<'a> { StableAbi { kind: StableAbiKind, interpreter: Option<&'a PythonInterpreter>, min_version: (u8, u8), }, VersionSpecific(&'a PythonInterpreter), } impl<'a> Pyo3BindingGenerator<'a> { pub fn new_stable_abi( kind: StableAbiKind, min_version: (u8, u8), interpreter: Option<&'a PythonInterpreter>, tempdir: Rc, ) -> Self { Self { binding_type: BindingType::StableAbi { kind, interpreter, min_version, }, tempdir, } } pub fn new_version_specific(interpreter: &'a PythonInterpreter, tempdir: Rc) -> Self { Self { binding_type: BindingType::VersionSpecific(interpreter), tempdir, } } } fn ext_suffix( target: &Target, interpreter: Option<&PythonInterpreter>, ext_name: &str, kind: StableAbiKind, min_version: (u8, u8), ) -> String { if !target.is_unix() { match interpreter { Some(interpreter) if interpreter.is_windows_debug() => { format!("{ext_name}_d.pyd") } // Apparently there is no tag for abi3 on windows _ => format!("{ext_name}.pyd"), } } else { let suffix = target.stable_abi_extension_suffix(kind, min_version, interpreter); format!("{ext_name}{suffix}") } } impl<'a> BindingGenerator for Pyo3BindingGenerator<'a> { fn generate_bindings( &mut self, context: &BuildContext, artifact: &BuildArtifact, module: &Path, ) -> Result { let ext_name = &context.project.project_layout.extension_name; let target = &context.project.target; let so_filename = match self.binding_type { BindingType::StableAbi { kind, interpreter, min_version, } => ext_suffix(target, interpreter, ext_name, kind, min_version), BindingType::VersionSpecific(interpreter) => interpreter.get_library_name(ext_name), }; let artifact_target = ArtifactTarget::ExtensionModule(module.join(so_filename)); let artifact_is_big_ar = target.is_aix() && artifact.path.extension() == Some("a".as_ref()); let artifact_source_override = if artifact_is_big_ar { Some(unpack_big_archive( target, &artifact.path, self.tempdir.path(), )?) } else { None }; let stubs_files = if context.artifact.generate_stubs { let module_introspection = introspect_cdylib(&artifact.path, ext_name).context("Failed to introspect the built libraries to generate type stubs, have you enabled the \"experimental-inspect\" PyO3 Cargo feature?")?; eprintln!("📖 Type stub extracted from the built binary"); Some(module_stub_files(&module_introspection)) } else { None }; let mut additional_files = HashMap::new(); if context.project.project_layout.python_module.is_some() { if let Some(mut stubs_files) = stubs_files { if stubs_files.len() == 1 && let Some(init_stub_content) = stubs_files.remove(Path::new("__init__.pyi")) { // Single file, we inline it add_file( module.join(format!("{ext_name}.pyi")), init_stub_content, &mut additional_files, ); } else { // Multiple files, we put them in a directory {ext_name} (the name of the module) let output_dir = module.join(ext_name); for (path, stub_content) in stubs_files { add_file(output_dir.join(path), stub_content, &mut additional_files); } } } } else { add_file( module.join("__init__.py"), format!( r#"from .{ext_name} import * __doc__ = {ext_name}.__doc__ if hasattr({ext_name}, "__all__"): __all__ = {ext_name}.__all__"# ), &mut additional_files, ); if let Some(stubs_files) = stubs_files { for (path, stub_content) in stubs_files { add_file(module.join(path), stub_content, &mut additional_files); } add_file( module.join("py.typed"), String::new(), &mut additional_files, ); } } Ok(GeneratorOutput { artifact_target, artifact_source_override, additional_files, }) } } // Extract the shared object from a AIX big library archive fn unpack_big_archive(target: &Target, artifact: &Path, temp_dir_path: &Path) -> Result { // Newer rust generates archived dylibs on AIX, as shared // libraries are typically archived on the platform. if target.cross_compiling() { bail!("can't unpack big archive format while cross_compiling") } debug!("Unpacking archive {}", artifact.display()); let mut ar_command = Command::new("ar"); ar_command .current_dir(temp_dir_path) .arg("-X64") .arg("x") .arg(artifact); let status = ar_command.status().context("Failed to run ar")?; if !status.success() { bail!(r#"ar finished with "{}": `{:?}`"#, status, ar_command,) } let unpacked_artifact = temp_dir_path.join(artifact.with_extension("so").file_name().unwrap()); Ok(unpacked_artifact) } fn add_file(name: PathBuf, data: String, files: &mut HashMap) { files.insert( name, ArchiveSource::Generated(GeneratedSourceData { data: data.into(), path: None, executable: false, }), ); } maturin-1.16.0/src/binding_generator/uniffi_binding.rs000066400000000000000000000203321527064705700230620ustar00rootroot00000000000000use std::collections::HashMap; use std::path::Path; use std::path::PathBuf; use std::process::Command; use anyhow::Context as _; use anyhow::Result; use anyhow::bail; use fs_err as fs; use normpath::PathExt as _; use tracing::debug; use crate::BuildArtifact; use crate::BuildContext; use crate::archive_source::ArchiveSource; use crate::archive_source::FileSourceData; use crate::archive_source::GeneratedSourceData; use crate::binding_generator::ArtifactTarget; use crate::target::Os; use super::BindingGenerator; use super::GeneratorOutput; /// A generator for producing UniFFI bindings. #[derive(Default)] pub struct UniFfiBindingGenerator {} impl BindingGenerator for UniFfiBindingGenerator { fn generate_bindings( &mut self, context: &BuildContext, artifact: &BuildArtifact, module: &Path, ) -> Result { let base_path = if context.project.project_layout.python_module.is_some() { module.join(&context.project.project_layout.extension_name) } else { module.to_path_buf() }; let UniFfiBindings { names: binding_names, cdylib, path: binding_dir, } = generate_uniffi_bindings( context.project.manifest_path.parent().unwrap(), &context.project.target_dir, &context.project.module_name, context.project.target.target_os(), &artifact.path, )?; let artifact_target = ArtifactTarget::ExtensionModule(base_path.join(cdylib)); let mut additional_files = HashMap::new(); let py_init = binding_names .iter() .map(|name| format!("from .{name} import * # NOQA\n")) .collect::>() .join(""); additional_files.insert( base_path.join("__init__.py"), ArchiveSource::Generated(GeneratedSourceData { data: py_init.into(), path: None, executable: false, }), ); for binding in binding_names { let filename = format!("{binding}.py"); let source = FileSourceData { path: binding_dir.join(&filename), executable: false, }; additional_files.insert(base_path.join(filename), ArchiveSource::File(source)); } Ok(GeneratorOutput { artifact_target, artifact_source_override: None, additional_files, }) } } /// uniffi.toml #[derive(Debug, serde::Deserialize)] struct UniFfiToml { #[serde(default)] bindings: HashMap, } /// `bindings` section of uniffi.toml #[derive(Debug, serde::Deserialize)] struct UniFfiBindingsConfig { cdylib_name: Option, /// Maps external crate names to their Python package names. /// Bindings for these crates are provided by external packages /// and should not be included in the wheel. #[serde(default)] external_packages: HashMap, } #[derive(Debug, Clone)] struct UniFfiBindings { names: Vec, cdylib: String, path: PathBuf, } fn uniffi_bindgen_command(crate_dir: &Path) -> Result { let manifest_path = crate_dir.join("Cargo.toml"); let cargo_metadata = cargo_metadata::MetadataCommand::new() .manifest_path(&manifest_path) // We don't need to resolve the dependency graph .no_deps() .verbose(true) .exec()?; let root_pkg = match cargo_metadata.root_package() { Some(pkg) => Some(pkg), None => cargo_metadata .packages .iter() .find(|&p| p.manifest_path == manifest_path), }; let uniffi_bindgen_target = root_pkg.and_then(|pkg| { pkg.targets .iter() .find(|&target| target.name == "uniffi-bindgen" && target.is_bin()) }); let uniffi_bindgen_workspace_target = cargo_metadata .packages .iter() .flat_map(|pkg| pkg.targets.iter()) .find(|&target| target.name == "uniffi-bindgen" && target.is_bin()); let command = if let Some(target) = uniffi_bindgen_target { let mut command = Command::new("cargo"); command .args(["run", "--bin", "uniffi-bindgen", "--manifest-path"]) .arg(manifest_path) .current_dir(crate_dir) .env_remove("CARGO_BUILD_TARGET"); if !target.required_features.is_empty() { let features = target.required_features.join(","); command.arg("--features").arg(features); } command } else if let Some(target) = uniffi_bindgen_workspace_target { let mut command = Command::new("cargo"); command .args(["run", "--bin", "uniffi-bindgen"]) .current_dir(cargo_metadata.workspace_root) .env_remove("CARGO_BUILD_TARGET"); if !target.required_features.is_empty() { let features = target.required_features.join(","); command.arg("--features").arg(features); } command } else { let mut command = Command::new("uniffi-bindgen"); command.current_dir(crate_dir); command }; Ok(command) } fn generate_uniffi_bindings( crate_dir: &Path, target_dir: &Path, module_name: &str, target_os: Os, artifact: &Path, ) -> Result { // `binding_dir` must use absolute path because we chdir to `crate_dir` // when running uniffi-bindgen let binding_dir = target_dir .normalize()? .join(env!("CARGO_PKG_NAME")) .join("uniffi") .join(module_name) .into_path_buf(); fs::create_dir_all(&binding_dir)?; let mut cmd = uniffi_bindgen_command(crate_dir)?; cmd.args([ "generate", "--no-format", "--language", "python", "--out-dir", ]); cmd.arg(&binding_dir); let config_file = crate_dir.join("uniffi.toml"); let mut cdylib_name = None; let mut external_package_names = Vec::new(); if config_file.is_file() { let uniffi_toml: UniFfiToml = toml::from_str(&fs::read_to_string(&config_file)?)?; if let Some(py_config) = uniffi_toml.bindings.get("python") { cdylib_name = py_config.cdylib_name.clone(); external_package_names = py_config.external_packages.keys().cloned().collect(); } // TODO: is this needed? `uniffi-bindgen` uses `uniffi.toml` by default, // `uniffi_bindgen_command` sets cwd to the crate (workspace) root, so maybe // we don't need to pass the config file explicitly? cmd.arg("--config"); cmd.arg(config_file); } cmd.arg("--library"); cmd.arg(artifact); debug!("Running {:?}", cmd); let mut child = cmd.spawn().context( "Failed to run uniffi-bindgen, did you install it? Try `pip install uniffi-bindgen`", )?; let exit_status = child.wait().context("Failed to run uniffi-bindgen")?; if !exit_status.success() { bail!("Command {:?} failed", cmd); } // Name of the cdylib is either from uniffi.toml or derived from the library let cdylib = match cdylib_name { // this logic should match with uniffi's expected names, e.g. // https://github.com/mozilla/uniffi-rs/blob/86a34083dd18bdd33f420c602b4fad624cc1e404/uniffi_bindgen/src/bindings/python/templates/NamespaceLibraryTemplate.py#L14-L37 Some(cdylib_name) => super::cdylib_filename(&cdylib_name, target_os), None => artifact.file_name().unwrap().to_str().unwrap().to_string(), }; let py_bindings: Vec<_> = fs::read_dir(&binding_dir)? .flatten() .filter(|file| file.path().extension().and_then(std::ffi::OsStr::to_str) == Some("py")) .map(|file| { file.path() .file_stem() .unwrap() .to_string_lossy() .to_string() }) .filter(|name| !external_package_names.contains(name)) .collect(); if !external_package_names.is_empty() { debug!( "Excluding external UniFFI bindings: {:?}", external_package_names ); } Ok(UniFfiBindings { names: py_bindings, cdylib, path: binding_dir, }) } maturin-1.16.0/src/bridge/000077500000000000000000000000001527064705700153165ustar00rootroot00000000000000maturin-1.16.0/src/bridge/detection.rs000066400000000000000000000676201527064705700176550ustar00rootroot00000000000000//! Bridge model detection from cargo metadata. //! //! This module inspects the dependency graph and feature flags of a crate //! to determine which binding model (pyo3, cffi, uniffi, bin) to use, //! whether abi3 is enabled, and whether `generate-import-lib` is active. use super::{ ABI3T_MINIMUM_PYTHON_MINOR, Bindings, BridgeModel, PyO3, PyO3Crate, PyO3MetadataRaw, StableAbi, StableAbiKind, StableAbiVersion, }; use crate::pyproject_toml::{FeatureConditionEnv, FeatureSpec}; use crate::{CargoOptions, PyProjectToml}; use anyhow::{Context, Result, bail}; use cargo_metadata::{CrateType, Metadata, Node, PackageId, TargetKind}; use std::collections::{HashMap, HashSet}; use std::process::Command; // pyo3-ffi is ordered first because it is newer and more restrictive. const PYO3_BINDING_CRATES: [PyO3Crate; 2] = [PyO3Crate::PyO3Ffi, PyO3Crate::PyO3]; /// Tries to determine the [`BridgeModel`] for the target crate. /// /// Inspects cargo metadata to detect pyo3/cffi/uniffi bindings, abi3 support, /// and extension-module feature usage. If `bridge` is `Some`, the binding type /// is forced; otherwise it's auto-detected from dependencies and target types. /// /// Conditional pyo3/pyo3-ffi features from pyproject.toml are excluded from /// abi3 inference here. Use [`upgrade_bridge_stable_abi`] after interpreter resolution /// to evaluate them. pub fn find_bridge( cargo_metadata: &Metadata, bridge: Option, cargo_options: &CargoOptions, ) -> Result { let deps = CrateDependencies::resolve(cargo_metadata, cargo_options)?; find_bridge_with_deps(cargo_metadata, bridge, &deps) } /// [`find_bridge`] with an already-resolved dependency graph, so callers that /// also need [`CrateDependencies`] elsewhere resolve it only once. pub fn find_bridge_with_deps( cargo_metadata: &Metadata, bridge: Option, deps: &CrateDependencies, ) -> Result { let no_extra_features = HashMap::new(); let root_package = cargo_metadata .root_package() .context("Expected cargo to return metadata with root_package")?; let targets: Vec<_> = root_package .targets .iter() .filter(|target| { target.kind.iter().any(|kind| { !matches!( kind, TargetKind::Bench | TargetKind::CustomBuild | TargetKind::Example | TargetKind::ProcMacro | TargetKind::Test ) }) }) .flat_map(|target| target.crate_types.iter().cloned()) .collect(); let bridge = if let Some(bindings) = bridge { match bindings { Bindings::Cffi => BridgeModel::Cffi, Bindings::UniFfi => BridgeModel::UniFfi, Bindings::Bin => { let bindings = find_pyo3_bindings(cargo_metadata, deps)?; BridgeModel::Bin(bindings) } Bindings::PyO3 | Bindings::PyO3Ffi => { let bindings = find_pyo3_bindings(cargo_metadata, deps)?.context("unknown binding type")?; BridgeModel::PyO3(bindings) } } } else { match find_pyo3_bindings(cargo_metadata, deps)? { Some(bindings) => { if !targets.contains(&CrateType::CDyLib) && targets.contains(&CrateType::Bin) { BridgeModel::Bin(Some(bindings)) } else { BridgeModel::PyO3(bindings) } } _ => { if deps.contains("uniffi") { BridgeModel::UniFfi } else if targets.contains(&CrateType::CDyLib) { BridgeModel::Cffi } else if targets.contains(&CrateType::Bin) { BridgeModel::Bin(find_pyo3_bindings(cargo_metadata, deps)?) } else { bail!( "Couldn't detect the binding type; Please specify them with --bindings/-b" ) } } } }; if !bridge.is_pyo3() { return Ok(bridge); } for &lib in PYO3_BINDING_CRATES.iter() { if !bridge.is_bin() && bridge.is_pyo3_crate(lib) { let lib_name = lib.as_str(); let pyo3 = bridge.pyo3().expect("should be pyo3 bindings"); if !deps.features(lib_name).contains(&"extension-module") { let version = &pyo3.version; if (version.major, version.minor) < (0, 26) { // pyo3 0.26+ will use the `PYO3_BUILD_EXTENSION_MODULE` env var instead eprintln!( "âš ï¸� Warning: You're building a library without activating {lib}'s \ `extension-module` feature. \ See https://pyo3.rs/v{version}/building-and-distribution.html#the-extension-module-feature" ); } } return if let Some(stable_abi) = has_stable_abi(deps, &no_extra_features, &[])? { let bindings = PyO3 { crate_name: lib, version: pyo3.version.clone(), stable_abi: Some(stable_abi), metadata: pyo3.metadata.clone(), }; Ok(BridgeModel::PyO3(bindings)) } else { Ok(bridge) }; } } Ok(bridge) } /// Select the stable ABI for a bridge model after interpreter resolution. /// /// This is the second phase of bridge detection: [`find_bridge`] excludes /// conditional features and picks a conservative default, then after /// interpreter resolution this function re-checks plain and conditional /// stable ABI features and chooses the single stable ABI family this build /// should attempt. pub fn upgrade_bridge_stable_abi( bridge: BridgeModel, deps: &CrateDependencies, pyproject: Option<&PyProjectToml>, interpreters: &[crate::PythonInterpreter], ) -> Result { // Only relevant for pyo3 bridges let Some(pyo3) = bridge.pyo3() else { return Ok(bridge); }; let extra_pyo3_features = pyo3_features_from_conditional(pyproject, interpreters); if let Some(stable_abi) = has_stable_abi(deps, &extra_pyo3_features, interpreters)? { let upgraded = PyO3 { stable_abi: Some(stable_abi), ..pyo3.clone() }; return Ok(match bridge { BridgeModel::PyO3(_) => BridgeModel::PyO3(upgraded), BridgeModel::Bin(Some(_)) => BridgeModel::Bin(Some(upgraded)), _ => return Ok(bridge), }); } Ok(bridge) } /// Check whether `generate-import-lib` feature is enabled in pyo3. /// /// pyo3 0.16.4+ supports building abi3 wheels without a working Python interpreter /// for Windows when `generate-import-lib` feature is enabled. /// pyo3 0.29.0+ uses raw-dylib linking on Windows, so import library generation /// is no longer needed and this effectively always returns true. pub fn has_windows_import_lib_support( cargo_metadata: &Metadata, deps: &CrateDependencies, ) -> Result { // Prefer pyo3 over pyo3-ffi. If pyo3 is present but multi-version, do not // fall through to a modern pyo3-ffi and claim support the old pyo3 build // script may still lack. if deps.contains("pyo3") { let Some(pyo3_crate) = deps.get_unambiguous("pyo3") else { return Ok(false); }; return Ok(import_lib_support_for( cargo_metadata, deps, "pyo3", pyo3_crate, )); } if let Some(pyo3_crate) = deps.get_unambiguous("pyo3-ffi") { return Ok(import_lib_support_for( cargo_metadata, deps, "pyo3-ffi", pyo3_crate, )); } Ok(false) } fn import_lib_support_for( cargo_metadata: &Metadata, deps: &CrateDependencies, lib: &str, pyo3_crate: &Node, ) -> bool { let pyo3_version = &cargo_metadata[&pyo3_crate.id].version; if pyo3_version >= &semver::Version::new(0, 29, 0) { return true; } deps.features(lib) .iter() .any(|&x| x == "generate-import-lib" || x == "generate-abi3-import-lib") } fn has_stable_abi( deps: &CrateDependencies, extra_features: &HashMap<&str, Vec>, interpreters: &[crate::PythonInterpreter], ) -> Result> { let abi3t = has_stable_abi_from_kind(deps, extra_features, StableAbiKind::Abi3t)?; let abi3 = has_stable_abi_from_kind(deps, extra_features, StableAbiKind::Abi3)?; let selected = [abi3t, abi3].into_iter().flatten().find(|stable_abi| { interpreters.iter().any(|interpreter| { interpreter.has_stable_api(stable_abi.kind) && stable_abi .version .min_version() .is_none_or(|(major, minor)| { (interpreter.major as u8, interpreter.minor as u8) >= (major, minor) }) }) }); // If no resolved interpreter can use either stable ABI, keep abi3 as the // conservative project marker when available; the build will fall back to // version-specific wheels for the non-matching interpreters. Ok(selected.or(abi3).or(abi3t)) } /// pyo3 supports building stable abi wheels if the unstable-api feature is not selected fn has_stable_abi_from_kind( deps: &CrateDependencies, extra_features: &HashMap<&str, Vec>, abi_kind: StableAbiKind, ) -> Result> { for &lib in PYO3_BINDING_CRATES.iter() { let lib = lib.as_str(); if deps.contains(lib) { let extra = extra_features.get(lib); // Find the minimal stable abi python version. If there is none, stable abi hasn't been selected // This parses abi3-py{major}{minor} and returns the minimal (major, minor) tuple let all_features: Vec<&str> = deps .features(lib) .into_iter() .chain(extra.into_iter().flatten().map(String::as_str)) .collect(); let abi_str = format!("{abi_kind}"); let search_str = format!("{abi_kind}-py"); let stable_abi_selected = all_features.contains(&abi_str.as_str()); let offset = search_str.len(); let filter_len = offset + 2; let min_stable_abi_version = all_features .iter() .filter(|&&x| x.starts_with(search_str.as_str()) && x.len() >= filter_len) .map(|x| { Ok(( (x.as_bytes()[offset] as char).to_string().parse::()?, x[offset + 1..].parse::()?, )) }) .collect::>>() .context(format!("Bogus {lib} cargo features"))? .into_iter() .min(); match min_stable_abi_version { Some((major, minor)) => { let (major, minor) = if abi_kind == StableAbiKind::Abi3t { (major, minor).max((3, ABI3T_MINIMUM_PYTHON_MINOR)) } else { (major, minor) }; return Ok(Some(StableAbi { kind: abi_kind, version: StableAbiVersion::Version(major, minor), })); } None if stable_abi_selected => { return Ok(Some(StableAbi { kind: abi_kind, version: StableAbiVersion::CurrentPython, })); } None => {} } } } Ok(None) } /// Tries to determine the bindings type from dependency. /// /// Version and package metadata are taken from a single unambiguous dependency /// node. Multiple remaining versions of `pyo3`/`pyo3-ffi` are an error: a /// [`PyO3`] value can only represent one package identity. fn find_pyo3_bindings( cargo_metadata: &Metadata, deps: &CrateDependencies, ) -> anyhow::Result> { if deps.contains("pyo3") { let node = deps .get_unambiguous("pyo3") .with_context(|| ambiguous_bindings_crate_msg("pyo3"))?; let package = &cargo_metadata[&node.id]; let pyo3_metadata = if deps.contains("pyo3-ffi") { let pyo3_ffi = deps .get_unambiguous("pyo3-ffi") .with_context(|| ambiguous_bindings_crate_msg("pyo3-ffi"))?; cargo_metadata[&pyo3_ffi.id].metadata.clone() } else { // Old versions of pyo3 does not depend on pyo3-ffi, // thus does not have the metadata serde_json::Value::Null }; let metadata = match serde_json::from_value::>(pyo3_metadata) { Ok(Some(metadata)) => Some(metadata.try_into()?), Ok(None) | Err(_) => None, }; Ok(Some(PyO3 { crate_name: PyO3Crate::PyO3, version: package.version.clone(), stable_abi: None, metadata, })) } else if deps.contains("pyo3-ffi") { let node = deps .get_unambiguous("pyo3-ffi") .with_context(|| ambiguous_bindings_crate_msg("pyo3-ffi"))?; let package = &cargo_metadata[&node.id]; let metadata = match serde_json::from_value::>(package.metadata.clone()) { Ok(Some(metadata)) => Some(metadata.try_into()?), Ok(None) | Err(_) => None, }; Ok(Some(PyO3 { crate_name: PyO3Crate::PyO3Ffi, version: package.version.clone(), stable_abi: None, metadata, })) } else { Ok(None) } } fn ambiguous_bindings_crate_msg(name: &str) -> String { format!( "multiple versions of `{name}` remain in the dependency graph after feature resolution; \ maturin cannot determine a single bindings version. Ensure the package depends on only \ one version of `{name}`" ) } /// Return all (transitive) dependency nodes of the *current* crate, keyed by /// package name. A name maps to several nodes when multiple versions (or /// source-distinct packages at the same version) are reachable. /// /// This is different from `metadata.resolve`, which also includes packages /// that are used in the same workspace, but on which the current crate does not depend. fn current_crate_dependencies(cargo_metadata: &Metadata) -> Result>> { let resolve = cargo_metadata .resolve .as_ref() .context("Expected to get a dependency graph from cargo")?; let root = resolve .root .as_ref() .context("expected to get a root package")?; let nodes: HashMap<&PackageId, &Node> = resolve.nodes.iter().map(|node| (&node.id, node)).collect(); // Walk the dependency tree to get all (in)direct children. let mut dep_ids = HashSet::with_capacity(nodes.len()); let mut todo = Vec::from([root]); while let Some(id) = todo.pop() { for dep in nodes[id].deps.iter() { if dep_ids.contains(&dep.pkg) { continue; } dep_ids.insert(&dep.pkg); todo.push(&dep.pkg); } } let mut deps: HashMap<&str, Vec<&Node>> = HashMap::with_capacity(dep_ids.len()); for (&id, node) in &nodes { if !dep_ids.contains(&id) { continue; } let name = cargo_metadata[id].name.as_ref(); deps.entry(name).or_default().push(node); } Ok(deps) } /// Names of the crates whose presence in the dependency graph drives bindings /// auto-detection. const BINDINGS_CRATES: [&str; 3] = ["pyo3", "pyo3-ffi", "uniffi"]; /// The (transitive) dependencies of the current crate, with features resolved /// for the current crate only. /// /// `cargo metadata` unifies features across all workspace members /// (rust-lang/cargo#7754), while `cargo build -p ` resolves features for /// the selected package only. In a multi-member workspace this makes the /// unified resolve graph over-report: an optional pyo3 dependency that only a /// sibling member enables shows up in the root package's graph (#3256), and a /// pyo3 feature like `abi3` that only a sibling enables shows up on the pyo3 /// node (#876), even though a scoped build never enables either. /// /// When that discrepancy is possible (multi-member workspace with a bindings /// crate in the unified graph), the resolver verifies against `cargo tree`, /// which resolves features the same way a scoped build does: bindings crates /// that aren't really in the graph are dropped, and [`Self::features`] prefers /// the scoped feature resolution over the unified one. /// /// Multi-version ambiguity is represented directly: each name maps to every /// matching resolve node, so callers never need a parallel "is this name /// ambiguous?" set. pub struct CrateDependencies<'a> { /// Package name -> all root-reachable resolve nodes with that name. nodes: HashMap<&'a str, Vec<&'a Node>>, /// (Bindings crate name, version) -> features resolved for the current /// crate only via `cargo tree`. Empty when verification didn't run. scoped_features: HashMap<(String, semver::Version), Vec>, cargo_metadata: &'a Metadata, } impl<'a> CrateDependencies<'a> { pub fn resolve(cargo_metadata: &'a Metadata, cargo_options: &CargoOptions) -> Result { let mut nodes = current_crate_dependencies(cargo_metadata)?; let mut scoped_features = HashMap::new(); if cargo_metadata.workspace_members.len() > 1 && BINDINGS_CRATES.iter().any(|name| nodes.contains_key(name)) { match scoped_dependency_features(cargo_metadata, cargo_options) { Ok(scoped) => { for name in BINDINGS_CRATES { let mut scoped_versions = scoped.keys().filter_map(|(scoped_name, version)| { (scoped_name == name).then_some(version) }); match (scoped_versions.next(), scoped_versions.next()) { (None, _) => { // Not actually in the root package's graph. nodes.remove(name); } (Some(version), None) => { // A single scoped version is authoritative only // when exactly one already-retained package id // matches (same name+version from two sources // stays multi-node / ambiguous). if let Some(node) = unique_node_by_version( cargo_metadata, nodes.get(name).map(Vec::as_slice).unwrap_or(&[]), version, ) { nodes.insert(name, vec![node]); } // else: leave the multi-node entry as-is. } (Some(_), Some(_)) => { // Still several versions after scoping: keep // every metadata node so ambiguity stays visible. } } } scoped_features = scoped; } Err(err) => { eprintln!( "âš ï¸� Warning: Failed to verify the dependency graph with `cargo tree`, \ bindings detection may mistake feature-gated dependencies of other \ workspace members as enabled: {err:#}" ); } } } Ok(Self { nodes, scoped_features, cargo_metadata, }) } fn contains(&self, name: &str) -> bool { self.nodes.get(name).is_some_and(|nodes| !nodes.is_empty()) } /// The single resolve node for `name`, or `None` when absent or when /// several packages share that name. fn get_unambiguous(&self, name: &str) -> Option<&'a Node> { match self.nodes.get(name).map(Vec::as_slice)? { [node] => Some(*node), _ => None, } } /// Features of `name` as resolved for the current crate: the scoped /// `cargo tree` resolution when verification ran, the workspace-unified /// `cargo metadata` resolution otherwise. /// /// With several packages of `name`, only features common to every scoped /// version are returned (and none if verification didn't run), so abi3 / /// extension-module / import-lib checks never trust an arbitrary winner. fn features(&self, name: &str) -> Vec<&str> { match self.nodes.get(name).map(Vec::as_slice) { Some([node]) => { if let Some(features) = self.scoped_for(name, node) { features.iter().map(String::as_str).collect() } else { node.features.iter().map(AsRef::as_ref).collect() } } Some(nodes) if nodes.len() > 1 => self.common_scoped_features(name), _ => Vec::new(), } } /// Intersection of scoped feature sets across every version of `name`. fn common_scoped_features(&self, name: &str) -> Vec<&str> { let mut versions = self .scoped_features .iter() .filter(|((scoped_name, _), _)| scoped_name == name) .map(|(_, features)| features); let Some(first) = versions.next() else { return Vec::new(); }; let mut common: Vec<&str> = first.iter().map(String::as_str).collect(); for features in versions { common.retain(|feature| features.iter().any(|existing| existing == feature)); } common } /// Scoped features of a specific resolve node, keyed by its package /// version so features of another version are never trusted. fn scoped_for(&self, name: &str, node: &Node) -> Option<&Vec> { let version = &self.cargo_metadata[&node.id].version; self.scoped_features .get(&(name.to_string(), version.clone())) } } /// Among `candidates`, return the unique node whose package version equals /// `version`. `None` when zero or several match. fn unique_node_by_version<'a>( cargo_metadata: &Metadata, candidates: &[&'a Node], version: &semver::Version, ) -> Option<&'a Node> { let mut matches = candidates .iter() .copied() .filter(|node| &cargo_metadata[&node.id].version == version); match (matches.next(), matches.next()) { (Some(node), None) => Some(node), _ => None, } } /// Collect the bindings crates in the root package's dependency graph and /// their active features as resolved by `cargo tree`, i.e. with features /// resolved for the root package only instead of unified across the workspace. fn scoped_dependency_features( cargo_metadata: &Metadata, cargo_options: &CargoOptions, ) -> Result>> { let root_package = cargo_metadata .root_package() .context("Expected cargo to return metadata with root_package")?; let mut cmd = Command::new("cargo"); cmd.arg("tree") .arg("--manifest-path") .arg(root_package.manifest_path.as_std_path()) .args([ "--edges", "normal,build,dev", "--prefix", "none", "--format", "{p}|{f}", "--color", "never", ]); cmd.args(cargo_options.cargo_tree_args()); let output = cmd .output() .context("Failed to run `cargo tree`. Do you have cargo in your PATH?")?; if !output.status.success() { bail!( "`cargo tree` exited with {}:\n{}", output.status, String::from_utf8_lossy(&output.stderr), ); } // With multiple `--target` flags (universal2) cargo tree prints one graph // per target, so union the features per package across all of them, like // `cargo metadata` does with multiple `--filter-platform` flags. let mut scoped: HashMap<(String, semver::Version), Vec> = HashMap::new(); for line in String::from_utf8_lossy(&output.stdout).lines() { // A line looks like `pyo3 v0.29.0|abi3,default,macros` (path/git // dependencies append their source in parentheses), with ` (*)` // appended to de-duplicated repeats of a subtree. let line = line.trim_end().trim_end_matches(" (*)"); let Some((package, features)) = line.split_once('|') else { continue; }; let mut package_parts = package.split_whitespace(); let Some(name) = package_parts.next() else { continue; }; if !BINDINGS_CRATES.contains(&name) { continue; } // Key by version so that two versions of the same crate don't get // their feature sets unioned into one. A bindings crate line whose // version doesn't parse means the `{p}` format changed; erroring makes // the caller fall back to the unified resolution instead of treating // the crate as absent. let version = package_parts .next() .and_then(|v| v.strip_prefix('v')) .and_then(|v| semver::Version::parse(v).ok()) .with_context(|| format!("unexpected `cargo tree` output line: {line}"))?; let entry = scoped.entry((name.to_string(), version)).or_default(); for feature in features.split(',').filter(|feature| !feature.is_empty()) { if !entry.iter().any(|existing| existing == feature) { entry.push(feature.to_string()); } } } Ok(scoped) } /// Extract pyo3/pyo3-ffi feature names from conditional features in pyproject.toml. /// /// For a conditional feature like `pyo3/abi3-py311`, this extracts `abi3-py311` /// for the corresponding binding crate. fn pyo3_features_from_conditional( pyproject: Option<&PyProjectToml>, interpreters: &[crate::PythonInterpreter], ) -> HashMap<&'static str, Vec> { let mut extra: HashMap<&'static str, Vec> = HashMap::new(); let features = match pyproject .and_then(|p| p.maturin()) .and_then(|m| m.features.clone()) { Some(f) => f, None => return extra, }; let (_plain, conditional) = FeatureSpec::split(features); let crate_names: &[&str] = &["pyo3", "pyo3-ffi"]; // Collect the union of conditional features across all interpreters. // A feature is included if ANY interpreter satisfies its condition. // This is safe because build_stable_abi_wheels splits interpreters // into abi3-capable vs version-specific groups based on min_version, // so interpreters that don't qualify get version-specific wheels. let mut seen = HashSet::new(); for interp in interpreters { let env = FeatureConditionEnv { major: interp.major, minor: interp.minor, implementation_name: &interp.implementation_name, }; for feature in FeatureSpec::resolve_conditional(&conditional, &env) { if seen.insert(feature.clone()) { for &crate_name in crate_names { let prefix = format!("{crate_name}/"); if let Some(feat_name) = feature.strip_prefix(&prefix) { extra .entry(crate_name) .or_default() .push(feat_name.to_string()); } } } } } extra } maturin-1.16.0/src/bridge/mod.rs000066400000000000000000000504631527064705700164530ustar00rootroot00000000000000mod detection; pub use detection::{ CrateDependencies, find_bridge, find_bridge_with_deps, has_windows_import_lib_support, upgrade_bridge_stable_abi, }; use std::collections::BTreeSet; use std::fmt; use std::str::FromStr; use anyhow::Context; use serde::{Deserialize, Serialize}; use crate::python_interpreter::{ MAXIMUM_PYPY_MINOR, MAXIMUM_PYTHON_MINOR, MINIMUM_PYPY_MINOR, MINIMUM_PYTHON_MINOR, PythonInterpreter, }; /// First CPython minor version that supports PEP 803 stable ABI wheels. pub const ABI3T_MINIMUM_PYTHON_MINOR: u8 = 15; /// pyo3 binding crate #[derive(Clone, Copy, PartialEq, Eq)] pub enum PyO3Crate { /// pyo3 PyO3, /// pyo3-ffi PyO3Ffi, } impl PyO3Crate { /// Returns the name of the crate as a string pub fn as_str(&self) -> &str { match self { PyO3Crate::PyO3 => "pyo3", PyO3Crate::PyO3Ffi => "pyo3-ffi", } } } impl fmt::Debug for PyO3Crate { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.as_str()) } } impl fmt::Display for PyO3Crate { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.as_str()) } } impl FromStr for PyO3Crate { type Err = anyhow::Error; fn from_str(s: &str) -> Result { match s { "pyo3" => Ok(PyO3Crate::PyO3), "pyo3-ffi" => Ok(PyO3Crate::PyO3Ffi), _ => anyhow::bail!("unknown binding crate: {}", s), } } } /// The `bindings` input spelling accepted on the CLI (`--bindings`) and in /// `[tool.maturin] bindings`. /// /// This is the raw, user-facing choice of binding model, kept deliberately /// distinct from the resolved [`BridgeModel`]: auto-detection and resolved PyO3 /// metadata are semantic build states, whereas this enum only names the /// accepted input spellings. [`find_bridge`] converts it into a [`BridgeModel`]. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Bindings { /// pyo3 PyO3, /// pyo3-ffi PyO3Ffi, /// cffi Cffi, /// uniffi UniFfi, /// bin Bin, } impl Bindings { /// All accepted bindings, in declaration order. pub const ALL: [Bindings; 5] = [ Bindings::PyO3, Bindings::PyO3Ffi, Bindings::Cffi, Bindings::UniFfi, Bindings::Bin, ]; /// The accepted spellings as strings, derived from [`Bindings::as_str`]. /// /// This is the single list handed to serde, clap and schemars when they /// need to enumerate or reject variants. pub const VARIANTS: [&'static str; 5] = [ Bindings::PyO3.as_str(), Bindings::PyO3Ffi.as_str(), Bindings::Cffi.as_str(), Bindings::UniFfi.as_str(), Bindings::Bin.as_str(), ]; /// Returns the canonical spelling of this bindings type. /// /// This is the one place each spelling is written; `FromStr`, `Display`, /// serde, clap and schemars all derive from it. pub const fn as_str(self) -> &'static str { match self { Bindings::PyO3 => "pyo3", Bindings::PyO3Ffi => "pyo3-ffi", Bindings::Cffi => "cffi", Bindings::UniFfi => "uniffi", Bindings::Bin => "bin", } } /// A one-line human description of this bindings type, used as the /// per-variant documentation in the generated JSON schema. pub const fn description(self) -> &'static str { match self { Bindings::PyO3 => "PyO3 bindings", Bindings::PyO3Ffi => "pyo3-ffi (raw FFI) bindings", Bindings::Cffi => "CFFI bindings", Bindings::UniFfi => "UniFFI bindings", Bindings::Bin => "Rust binary", } } } impl fmt::Display for Bindings { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str(self.as_str()) } } impl FromStr for Bindings { type Err = anyhow::Error; fn from_str(s: &str) -> Result { Bindings::ALL .into_iter() .find(|binding| binding.as_str() == s) .with_context(|| { format!( "unknown bindings type `{s}`, expected one of {}", Bindings::VARIANTS.join(", ") ) }) } } impl Serialize for Bindings { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { serializer.serialize_str(self.as_str()) } } impl<'de> Deserialize<'de> for Bindings { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { struct BindingsVisitor; impl serde::de::Visitor<'_> for BindingsVisitor { type Value = Bindings; fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str("a bindings type") } fn visit_str(self, value: &str) -> Result where E: serde::de::Error, { Bindings::ALL .into_iter() .find(|binding| binding.as_str() == value) .ok_or_else(|| E::unknown_variant(value, &Bindings::VARIANTS)) } } deserializer.deserialize_str(BindingsVisitor) } } impl clap::ValueEnum for Bindings { fn value_variants<'a>() -> &'a [Self] { &Bindings::ALL } fn to_possible_value(&self) -> Option { Some(clap::builder::PossibleValue::new(self.as_str())) } } #[cfg(feature = "schemars")] impl schemars::JsonSchema for Bindings { fn schema_name() -> std::borrow::Cow<'static, str> { "Bindings".into() } fn schema_id() -> std::borrow::Cow<'static, str> { "maturin::Bindings".into() } fn json_schema(_generator: &mut schemars::SchemaGenerator) -> schemars::Schema { // Document the string form (e.g. "pyo3", "cffi") so the schema matches // serde Deserialize/Serialize rather than an externally-tagged object. // Emit one `const` per variant with a description, mirroring the house // style of the other documented string enums (e.g. `CargoCrateType`). let one_of: Vec = Bindings::ALL .iter() .map(|binding| { serde_json::json!({ "description": binding.description(), "type": "string", "const": binding.as_str(), }) }) .collect(); schemars::json_schema!({ "description": "The kind of bindings to use.", "oneOf": one_of, }) } } #[derive(Debug, Clone, Deserialize)] pub struct PyO3VersionMetadataRaw { #[serde(rename = "min-version")] pub min_version: String, #[serde(rename = "max-version")] pub max_version: String, } #[derive(Debug, Clone, Deserialize)] pub struct PyO3MetadataRaw { pub cpython: PyO3VersionMetadataRaw, pub pypy: PyO3VersionMetadataRaw, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct PyO3VersionMetadata { pub min_minor: usize, pub max_minor: usize, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct PyO3Metadata { pub cpython: PyO3VersionMetadata, pub pypy: PyO3VersionMetadata, } impl TryFrom for PyO3VersionMetadata { type Error = anyhow::Error; fn try_from(raw: PyO3VersionMetadataRaw) -> Result { let min_version = raw .min_version .rsplit('.') .next() .context("invalid min-version in pyo3-ffi metadata")? .parse()?; let max_version = raw .max_version .rsplit('.') .next() .context("invalid max-version in pyo3-ffi metadata")? .parse()?; Ok(Self { min_minor: min_version, max_minor: max_version, }) } } impl TryFrom for PyO3Metadata { type Error = anyhow::Error; fn try_from(raw: PyO3MetadataRaw) -> Result { Ok(Self { cpython: PyO3VersionMetadata::try_from(raw.cpython)?, pypy: PyO3VersionMetadata::try_from(raw.pypy)?, }) } } /// struct describing ABI layout to use for build #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct StableAbi { /// The "kind" of stable ABI. Either abi3 or abi3t currently. pub kind: StableAbiKind, /// The minimum Python version to build for. pub version: StableAbiVersion, } impl StableAbi { /// Create a StableAbi instance from a known abi3 version pub fn from_abi3_version(major: u8, minor: u8) -> StableAbi { StableAbi { kind: StableAbiKind::Abi3, version: StableAbiVersion::Version(major, minor), } } /// Create a StableAbi instance from a known abi3t version pub fn from_abi3t_version(major: u8, minor: u8) -> StableAbi { StableAbi { kind: StableAbiKind::Abi3t, version: StableAbiVersion::Version(major, minor), } } } /// Python version to use as the abi3/abi3t target. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum StableAbiVersion { /// Stable ABI wheels will have a minimum Python version matching the /// version of the current Python interpreter CurrentPython, /// Stable ABI wheels will have a fixed user-specified minimum Python /// version Version(u8, u8), } impl StableAbiVersion { /// Convert `StableAbiVersion` into an Option, where CurrentPython maps to None pub fn min_version(&self) -> Option<(u8, u8)> { match self { StableAbiVersion::CurrentPython => None, StableAbiVersion::Version(major, minor) => Some((*major, *minor)), } } } /// The "kind" of stable ABI. Either abi3 or abi3t currently. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum StableAbiKind { /// The original stable ABI, supporting Python 3.2 and up Abi3, /// The free-threaded stable ABI, supporting Python 3.15 and up Abi3t, } impl fmt::Display for StableAbiKind { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { StableAbiKind::Abi3 => write!(f, "abi3"), StableAbiKind::Abi3t => write!(f, "abi3t"), } } } impl StableAbiKind { /// The ABI tags to use for wheel building pub fn wheel_tag(&self) -> BTreeSet { match self { StableAbiKind::Abi3 => BTreeSet::from(["abi3".to_string()]), StableAbiKind::Abi3t => BTreeSet::from(["abi3".to_string(), "abi3t".to_string()]), } } } /// The name and version of the pyo3 bindings crate #[derive(Clone, Debug, PartialEq, Eq)] pub struct PyO3 { /// The name of the bindings crate, `pyo3` or `pyo3-ffi` pub crate_name: PyO3Crate, /// pyo3 bindings crate version pub version: semver::Version, /// Stable ABI support. pub stable_abi: Option, /// pyo3 metadata pub metadata: Option, } impl PyO3 { /// Returns the minimum python minor version supported fn minimal_python_minor_version(&self) -> usize { let major_version = self.version.major; let minor_version = self.version.minor; // N.B. must check large minor versions first let min_minor = if let Some(metadata) = self.metadata.as_ref() { metadata.cpython.min_minor } else if (major_version, minor_version) >= (0, 16) { 7 } else { MINIMUM_PYTHON_MINOR }; if let Some(stable_abi) = self.stable_abi.as_ref() { if let StableAbiVersion::Version(_, abi3_minor) = stable_abi.version { min_minor.max(abi3_minor as usize) } else { min_minor } } else { min_minor } } /// Returns the maximum python minor version supported fn maximum_python_minor_version(&self) -> usize { // N.B. must check large minor versions first if let Some(metadata) = self.metadata.as_ref() { metadata.cpython.max_minor } else { MAXIMUM_PYTHON_MINOR } } /// Returns the minimum PyPy minor version supported fn minimal_pypy_minor_version(&self) -> usize { let major_version = self.version.major; let minor_version = self.version.minor; // N.B. must check large minor versions first if let Some(metadata) = self.metadata.as_ref() { metadata.pypy.min_minor } else if (major_version, minor_version) >= (0, 23) { 9 } else if (major_version, minor_version) >= (0, 14) { 7 } else { MINIMUM_PYPY_MINOR } } /// Returns the maximum PyPy minor version supported fn maximum_pypy_minor_version(&self) -> usize { // N.B. must check large minor versions first if let Some(metadata) = self.metadata.as_ref() { metadata.pypy.max_minor } else { MAXIMUM_PYPY_MINOR } } /// free-threaded Python support fn supports_free_threaded(&self) -> bool { let major_version = self.version.major; let minor_version = self.version.minor; (major_version, minor_version) >= (0, 23) } } /// The way the rust code is used in the wheel #[derive(Clone, Debug, PartialEq, Eq)] pub enum BridgeModel { /// A rust binary to be shipped a python package Bin(Option), /// A native module with pyo3 bindings. PyO3(PyO3), /// A native module with c bindings, i.e. `#[no_mangle] extern "C" ` Cffi, /// A native module generated from uniffi UniFfi, } impl BridgeModel { /// Returns the pyo3 bindings pub fn pyo3(&self) -> Option<&PyO3> { match self { BridgeModel::Bin(Some(bindings)) => Some(bindings), BridgeModel::PyO3(bindings) => Some(bindings), _ => None, } } /// Test whether this is using pyo3/pyo3-ffi pub fn is_pyo3(&self) -> bool { matches!(self, BridgeModel::PyO3(_) | BridgeModel::Bin(Some(_))) } /// Test whether this is using a specific pyo3 crate pub fn is_pyo3_crate(&self, name: PyO3Crate) -> bool { match self { BridgeModel::Bin(Some(bindings)) => bindings.crate_name == name, BridgeModel::PyO3(bindings) => bindings.crate_name == name, _ => false, } } /// Test whether this is bin bindings pub fn is_bin(&self) -> bool { matches!(self, BridgeModel::Bin(_)) } /// Returns the minimum python minor version supported pub fn minimal_python_minor_version(&self) -> usize { match self.pyo3() { Some(bindings) => bindings.minimal_python_minor_version(), None => MINIMUM_PYTHON_MINOR, } } /// Returns the maximum python minor version supported pub fn maximum_python_minor_version(&self) -> usize { match self.pyo3() { Some(bindings) => bindings.maximum_python_minor_version(), None => MAXIMUM_PYTHON_MINOR, } } /// Returns the minimum PyPy minor version supported pub fn minimal_pypy_minor_version(&self) -> usize { match self.pyo3() { Some(bindings) => bindings.minimal_pypy_minor_version(), None => MINIMUM_PYPY_MINOR, } } /// Returns the maximum PyPy minor version supported pub fn maximum_pypy_minor_version(&self) -> usize { match self.pyo3() { Some(bindings) => bindings.maximum_pypy_minor_version(), None => MAXIMUM_PYPY_MINOR, } } /// Returns `true` if the bridge model carries stable-ABI metadata (e.g. abi3). /// /// This is a project-level check — it does not consider whether a particular /// interpreter meets the abi3 minimum version. For per‑interpreter checks /// use [`is_stable_abi_for_interpreter`](Self::is_stable_abi_for_interpreter). pub fn has_stable_abi(&self) -> bool { self.pyo3() .and_then(|pyo3| pyo3.stable_abi.as_ref()) .is_some() } /// Check whether an abi3 or abi3t build should be enabled for a specific interpreter. /// /// Returns `true` only when the bridge model has stable abi support **and** /// the given interpreter supports the stable ABI **and** meets the abi3 /// minimum version. Version‑specific fallback builds (e.g. Python 3.10 when /// abi3 targets ≥ 3.11) return `false` so that `Py_LIMITED_API` is not /// defined and interpreter‑specific linker names are used. pub fn is_stable_abi_for_interpreter(&self, interpreter: &PythonInterpreter) -> bool { self.stable_abi_for_interpreter(interpreter).is_some() } /// Return the stable ABI kind this bridge can use for a specific interpreter. pub fn stable_abi_for_interpreter(&self, interpreter: &PythonInterpreter) -> Option { self.pyo3()?.stable_abi.filter(|stable_abi| { interpreter.has_stable_api(stable_abi.kind) && stable_abi .version .min_version() .is_none_or(|(major, minor)| { (interpreter.major as u8, interpreter.minor as u8) >= (major, minor) }) }) } /// free-threaded Python support pub fn supports_free_threaded(&self) -> bool { match self { BridgeModel::Bin(Some(bindings)) | BridgeModel::PyO3(bindings) => { bindings.supports_free_threaded() } BridgeModel::Bin(None) => true, BridgeModel::Cffi | BridgeModel::UniFfi => false, } } } impl fmt::Display for BridgeModel { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { BridgeModel::Bin(Some(bindings)) => write!(f, "{} bin", bindings.crate_name), BridgeModel::Bin(None) => write!(f, "bin"), BridgeModel::PyO3(bindings) => write!(f, "{}", bindings.crate_name), BridgeModel::Cffi => write!(f, "cffi"), BridgeModel::UniFfi => write!(f, "uniffi"), } } } #[cfg(test)] mod tests { use super::*; #[test] fn stable_abi_kind_display() { assert_eq!(StableAbiKind::Abi3.to_string(), "abi3"); assert_eq!(StableAbiKind::Abi3t.to_string(), "abi3t"); } #[test] fn stable_abi_kind_wheel_tag() { assert_eq!( StableAbiKind::Abi3.wheel_tag(), BTreeSet::from(["abi3".to_string()]) ); // abi3t wheels are also importable on abi3-capable interpreters, so the // wheel declares both ABI tags. assert_eq!( StableAbiKind::Abi3t.wheel_tag(), BTreeSet::from(["abi3".to_string(), "abi3t".to_string()]) ); } #[test] fn stable_abi_constructors() { let abi3 = StableAbi::from_abi3_version(3, 9); assert_eq!(abi3.kind, StableAbiKind::Abi3); assert_eq!(abi3.version, StableAbiVersion::Version(3, 9)); let abi3t = StableAbi::from_abi3t_version(3, 15); assert_eq!(abi3t.kind, StableAbiKind::Abi3t); assert_eq!(abi3t.version, StableAbiVersion::Version(3, 15)); } #[test] fn bindings_spellings_roundtrip() { // The exact accepted spellings, in the historical order. These are a // public contract (CLI values, `[tool.maturin] bindings`, JSON schema) // and are not something the type can guarantee: only pinning the // literals catches an accidental edit to `as_str`. Hardcoded here (not // derived from `as_str`/`VARIANTS`) so the round-trip is meaningful. let spellings = [ (Bindings::PyO3, "pyo3"), (Bindings::PyO3Ffi, "pyo3-ffi"), (Bindings::Cffi, "cffi"), (Bindings::UniFfi, "uniffi"), (Bindings::Bin, "bin"), ]; for (binding, spelling) in spellings { assert_eq!(binding.as_str(), spelling); assert_eq!(spelling.parse::().unwrap(), binding); } assert_eq!(Bindings::VARIANTS, spellings.map(|(_, spelling)| spelling)); } #[test] fn bindings_fromstr_rejects_unknown() { let err = "foo".parse::().unwrap_err().to_string(); assert_eq!( err, "unknown bindings type `foo`, expected one of pyo3, pyo3-ffi, cffi, uniffi, bin" ); } } maturin-1.16.0/src/build_context/000077500000000000000000000000001527064705700167255ustar00rootroot00000000000000maturin-1.16.0/src/build_context/builder.rs000066400000000000000000000644251527064705700207340ustar00rootroot00000000000000use crate::auditwheel::{AuditWheelMode, CompatibilityTag, PlatformTag}; use crate::bridge::{ CrateDependencies, StableAbiVersion, find_bridge_with_deps, has_windows_import_lib_support, upgrade_bridge_stable_abi, }; use crate::build_options::{BuildOptions, TargetTriple}; use crate::compile::filter_cargo_targets; use crate::metadata::Metadata24; use crate::project_layout::ProjectResolver; use crate::pyproject_toml::{FeatureSpec, SbomConfig}; use crate::python_interpreter::{InterpreterResolver, PythonInterpreter}; use crate::target::{ detect_arch_from_python, detect_target_from_cross_python, is_arch_supported_by_pypi, }; use crate::{ ArtifactContext, BridgeModel, BuildContext, ProjectContext, PyProjectToml, PythonContext, Target, }; use anyhow::{Result, bail}; use std::collections::HashSet; use std::env; use std::path::PathBuf; use std::sync::Arc; use tracing::{debug, instrument}; /// Builder for constructing a [`BuildContext`] from [`BuildOptions`]. /// /// Created via [`BuildOptions::into_build_context()`], then configured /// with chained setter methods before calling [`build()`](Self::build). #[derive(Debug)] pub struct BuildContextBuilder { build_options: BuildOptions, strip: Option, editable: bool, sdist_only: bool, pyproject_toml_path: Option, pgo: bool, } impl BuildContextBuilder { pub(crate) fn new(build_options: BuildOptions) -> Self { Self { build_options, strip: None, editable: false, sdist_only: false, pyproject_toml_path: None, pgo: false, } } pub fn strip(mut self, strip: Option) -> Self { self.strip = strip; self } pub fn editable(mut self, editable: bool) -> Self { self.editable = editable; self } pub fn sdist_only(mut self, sdist_only: bool) -> Self { self.sdist_only = sdist_only; self } pub fn pyproject_toml_path(mut self, path: Option) -> Self { self.pyproject_toml_path = path; self } pub fn pgo(mut self, pgo: bool) -> Self { self.pgo = pgo; self } #[instrument(skip_all)] pub fn build(self) -> Result { let Self { build_options, strip, editable, sdist_only, pyproject_toml_path: explicit_pyproject_path, pgo, } = self; build_options.compression.validate(); let ProjectResolver { project_layout, cargo_toml_path, cargo_toml, pyproject_toml_path, pyproject_toml, module_name, metadata24, mut cargo_options, cargo_metadata, mut pyproject_toml_maturin_options, } = ProjectResolver::resolve( build_options.cargo.manifest_path.clone(), build_options.cargo.clone(), editable, explicit_pyproject_path, )?; let pyproject = pyproject_toml.as_ref(); let bindings = build_options.python.bindings.or_else(|| { pyproject.and_then(|x| { if x.bindings().is_some() { pyproject_toml_maturin_options.push("bindings"); } x.bindings() }) }); let cli_overrides_pyproject_features = !cargo_options.features.is_empty() && !pyproject_toml_maturin_options.contains(&"features"); let pyproject_for_stable_abi = if cli_overrides_pyproject_features { None } else { pyproject }; // Detect bridge without conditional pyo3 features — those are // evaluated after interpreter resolution via upgrade_bridge_stable_abi. let crate_deps = CrateDependencies::resolve(&cargo_metadata, &cargo_options)?; let bridge = find_bridge_with_deps(&cargo_metadata, bindings, &crate_deps)?; if !bridge.is_bin() && project_layout.extension_name.contains('-') { bail!( "The module name must not contain a minus `-` \ (Make sure you have set an appropriate [lib] name or \ [tool.maturin] module-name in your pyproject.toml)" ); } let (target, universal2) = resolve_target( build_options.cargo.target.clone(), build_options.python.interpreter.first(), )?; let wheel_dir = match build_options.output.out { Some(ref dir) => dir.clone(), None => PathBuf::from(&cargo_metadata.target_directory).join("wheels"), }; let (interpreter, host_python) = Self::resolve_interpreters( &build_options, sdist_only, &target, &bridge, &metadata24, &cargo_metadata, &crate_deps, )?; // Select the stable ABI after interpreter resolution. This allows // combined abi3/abi3t feature sets to choose the one stable ABI family // this build can actually produce. let bridge = upgrade_bridge_stable_abi(bridge, &crate_deps, pyproject_for_stable_abi, &interpreter)?; debug!("Resolved bridge model: {:?}", bridge); if let Some(stable_abi) = bridge.pyo3().and_then(|p| p.stable_abi.as_ref()) { match stable_abi.version { StableAbiVersion::Version(major, minor) => { eprintln!( "🔗 Found {bridge} bindings with {}-py{}.{} support", stable_abi.kind, major, minor ); } StableAbiVersion::CurrentPython => { eprintln!( "🔗 Found {bridge} bindings with {} support", stable_abi.kind ); } } } else { eprintln!("🔗 Found {bridge} bindings"); } if cargo_options.args.is_empty() { // if not supplied on command line, try pyproject.toml let tool_maturin = pyproject.and_then(|p| p.maturin()); if let Some(args) = tool_maturin.and_then(|x| x.rustc_args.as_ref()) { cargo_options.args.extend(args.iter().cloned()); pyproject_toml_maturin_options.push("rustc-args"); } } let (strip, include_debuginfo, auditwheel) = Self::resolve_build_flags(strip, &build_options, pyproject, &target); let sbom = Self::resolve_sbom_config(&build_options, pyproject); let ResolvedPlatformTags { platform_tags, pypi_validation, } = resolve_platform_tags( build_options.platform.platform_tag, &target, &bridge, pyproject, &mut pyproject_toml_maturin_options, #[cfg(feature = "zig")] build_options.platform.zig, )?; validate_bridge_type(&bridge, &target, &platform_tags)?; // linux tag can not be mixed with manylinux and musllinux tags if platform_tags.len() > 1 && platform_tags.iter().any(|tag| !tag.is_portable()) { bail!("Cannot mix linux and manylinux/musllinux platform tags",); } if !pyproject_toml_maturin_options.is_empty() { eprintln!( "📡 Using build options {} from pyproject.toml", pyproject_toml_maturin_options.join(", ") ); } let target_dir = build_options .cargo .target_dir .clone() .unwrap_or_else(|| cargo_metadata.target_directory.clone().into_std_path_buf()); let config_targets = pyproject.and_then(|x| x.targets()); let compile_targets = filter_cargo_targets(&cargo_metadata, &bridge, config_targets)?; if compile_targets.is_empty() { bail!( "No Cargo targets to build, please check your bindings configuration in pyproject.toml." ); } let crate_name = cargo_toml.package.name; let include_import_lib = pyproject .map(|p| p.include_import_lib()) .unwrap_or_default(); let conditional_features = if pyproject_toml_maturin_options.contains(&"features") { pyproject_toml .as_ref() .and_then(|p| p.maturin()) .and_then(|m| m.features.clone()) .map(|specs| FeatureSpec::split(specs).1) .unwrap_or_default() } else { Vec::new() }; let pgo_command = if pgo { let cmd = pyproject .and_then(|p| p.pgo_command()) .map(|s| s.trim().to_string()) .filter(|s| !s.is_empty()); if cmd.is_none() { bail!( "--pgo requires a non-empty `pgo-command` to be set in `[tool.maturin]` in pyproject.toml" ); } cmd } else { None }; Ok(BuildContext { project: ProjectContext { bridge, target, project_layout, pyproject_toml_path, pyproject_toml, metadata24, crate_name, module_name, manifest_path: cargo_toml_path, target_dir, cargo_metadata: Arc::new(cargo_metadata), universal2, editable, cargo_options, conditional_features, compile_targets, }, artifact: ArtifactContext { out: wheel_dir, strip, compression: build_options.compression, sbom, include_import_lib, include_debuginfo, pgo_phase: None, pgo_command, generate_stubs: build_options.generate_stubs, }, python: PythonContext { auditwheel, #[cfg(feature = "zig")] zig: build_options.platform.zig, platform_tag: platform_tags, interpreter, host_python, pypi_validation, }, }) } /// Resolve Python interpreters for the build. fn resolve_interpreters( build_options: &BuildOptions, sdist_only: bool, target: &Target, bridge: &BridgeModel, metadata24: &Metadata24, cargo_metadata: &cargo_metadata::Metadata, crate_deps: &CrateDependencies, ) -> Result<(Vec, Option)> { let has_import_lib_support = has_windows_import_lib_support(cargo_metadata, crate_deps)?; if sdist_only && env::var_os("MATURIN_TEST_PYTHON").is_none() { return Ok((Vec::new(), None)); } let user_interpreters = build_options.python.interpreter.clone(); #[cfg(test)] let user_interpreters = { let mut user_interpreters = user_interpreters; if user_interpreters.is_empty() && !build_options.python.find_interpreter && let Some(python) = env::var_os("MATURIN_TEST_PYTHON") { user_interpreters = vec![python.into()]; } user_interpreters }; let resolver = InterpreterResolver::new( target, bridge, metadata24.requires_python.as_ref(), &user_interpreters, build_options.python.find_interpreter, has_import_lib_support, ); resolver.resolve() } /// Resolve strip, debuginfo, and auditwheel mode from CLI + pyproject.toml. fn resolve_build_flags( strip: Option, build_options: &BuildOptions, pyproject: Option<&PyProjectToml>, target: &Target, ) -> (bool, bool, AuditWheelMode) { let strip = strip.unwrap_or_else(|| pyproject.map(|x| x.strip()).unwrap_or_default()); let include_debuginfo = if strip && build_options.output.include_debuginfo { tracing::warn!("--strip is enabled, disabling --include-debuginfo"); false } else if strip { false } else { build_options.output.include_debuginfo }; let skip_auditwheel = pyproject.map(|x| x.skip_auditwheel()).unwrap_or_default() || build_options.platform.skip_auditwheel; let default_mode = if skip_auditwheel { AuditWheelMode::Skip } else if target.is_linux() { AuditWheelMode::Repair } else { // macOS and Windows repair support is newer; // default to Warn so we don't break existing workflows. AuditWheelMode::Warn }; let auditwheel = build_options .platform .auditwheel .or_else(|| pyproject.and_then(|x| x.auditwheel())) .unwrap_or(default_mode); (strip, include_debuginfo, auditwheel) } /// Resolve SBOM configuration from CLI + pyproject.toml. fn resolve_sbom_config( build_options: &BuildOptions, pyproject: Option<&PyProjectToml>, ) -> SbomConfig { let mut config = pyproject .and_then(|x| x.maturin()) .and_then(|x| x.sbom.clone()) .unwrap_or_default(); let had_includes = config.include.is_some(); let pyproject_includes = config.include.take().unwrap_or_default(); let merged = merge_and_dedup_sbom_includes(&pyproject_includes, &build_options.output.sbom_include); config.include = if merged.is_empty() && !had_includes { None } else { Some(merged) }; config } } /// Merge SBOM include paths from `pyproject.toml` and the CLI, removing /// duplicates across the full merged list while preserving first-seen /// order (pyproject entries first, then CLI entries). /// /// Equality is based on the configured path spelling as written (i.e. /// plain `PathBuf` equality) — paths are intentionally *not* canonicalized /// here. Canonicalization and duplicate-output-filename validation happen /// later in [`crate::sbom::SbomData::write`], which must still reject /// distinct paths that resolve to the same output filename. fn merge_and_dedup_sbom_includes(pyproject: &[PathBuf], cli: &[PathBuf]) -> Vec { let mut seen = HashSet::new(); let mut merged = Vec::with_capacity(pyproject.len() + cli.len()); for path in pyproject.iter().chain(cli.iter()) { if seen.insert(path.clone()) { merged.push(path.clone()); } } merged } /// Resolve the build target and universal2 flag from the user-specified /// target triple (or `ARCHFLAGS`) and the first interpreter (if any). fn resolve_target( target_triple: Option, first_interpreter: Option<&PathBuf>, ) -> Result<(Target, bool)> { let mut target_triple = target_triple; let mut universal2 = target_triple == Some(TargetTriple::Universal2); // Also try to determine universal2 from ARCHFLAGS environment variable if target_triple.is_none() && let Ok(arch_flags) = env::var("ARCHFLAGS") { let arches: HashSet<&str> = arch_flags .split("-arch") .filter_map(|x| { let x = x.trim(); if x.is_empty() { None } else { Some(x) } }) .collect(); match (arches.contains("x86_64"), arches.contains("arm64")) { (true, true) => universal2 = true, (true, false) => { target_triple = Some(TargetTriple::Regular("x86_64-apple-darwin".to_string())) } (false, true) => { target_triple = Some(TargetTriple::Regular("aarch64-apple-darwin".to_string())) } (false, false) => {} } }; if universal2 { target_triple = Some(TargetTriple::Regular("aarch64-apple-darwin".to_string())); } let mut target = Target::from_target_triple(target_triple.as_ref())?; if !target.user_specified && !universal2 { if let Some(interpreter) = first_interpreter { if let Some(detected_target) = detect_target_from_cross_python(interpreter) { target = Target::from_target_triple(Some(&detected_target))?; } else if let Some(detected_target) = detect_arch_from_python(interpreter, &target) { target = Target::from_target_triple(Some(&detected_target))?; } } else if let Some(detected_target) = detect_target_from_cross_python(&target.get_python()) { target = Target::from_target_triple(Some(&detected_target))?; } } Ok((target, universal2)) } /// Real platform tags plus whether PyPI filename validation was requested via the pypi compatibility option. #[derive(Debug)] struct ResolvedPlatformTags { platform_tags: Vec, pypi_validation: bool, } /// Resolve platform tags from CLI flags, pyproject.toml, and target properties. fn resolve_platform_tags( user_tags: Vec, target: &Target, bridge: &BridgeModel, pyproject: Option<&PyProjectToml>, pyproject_options: &mut Vec<&str>, #[cfg(feature = "zig")] use_zig: bool, ) -> Result { let pypi_validation; let platform_tags = if user_tags.is_empty() { #[cfg(feature = "zig")] let zig = use_zig; #[cfg(not(feature = "zig"))] let zig = false; let compatibility = pyproject .and_then(|x| { if x.compatibility().is_some() { pyproject_options.push("compatibility"); } x.compatibility() }) .or(if zig { if target.is_musl_libc() { Some(PlatformTag::Musllinux { major: 1, minor: 2 }.into()) } else { Some(target.get_minimum_manylinux_tag().into()) } } else if target.is_musl_libc() && !bridge.is_bin() { Some(PlatformTag::Musllinux { major: 1, minor: 2 }.into()) } else { None }); pypi_validation = compatibility .as_ref() .is_some_and(CompatibilityTag::is_pypi); if pypi_validation && !is_arch_supported_by_pypi(target) { bail!("Rust target {target} is not supported by PyPI"); } if let Some(platform_tag) = compatibility.and_then(CompatibilityTag::into_platform_tag) { vec![platform_tag] } else { Vec::new() } } else { pypi_validation = user_tags.iter().any(CompatibilityTag::is_pypi); if pypi_validation && !is_arch_supported_by_pypi(target) { bail!("Rust target {target} is not supported by PyPI"); } user_tags .into_iter() .filter_map(CompatibilityTag::into_platform_tag) .collect() }; for platform_tag in &platform_tags { if !platform_tag.is_supported() { eprintln!("âš ï¸� Warning: {platform_tag} is unsupported by the Rust compiler."); } else if platform_tag.is_musllinux() && !target.is_musl_libc() { eprintln!("âš ï¸� Warning: {target} is not compatible with {platform_tag}."); } } Ok(ResolvedPlatformTags { platform_tags, pypi_validation, }) } /// Checks for bridge/platform type edge cases fn validate_bridge_type( bridge: &BridgeModel, target: &Target, platform_tags: &[PlatformTag], ) -> Result<()> { match bridge { BridgeModel::Bin(None) => { // Only support two different kind of platform tags when compiling to musl target without any binding crates if platform_tags.iter().any(|tag| tag.is_musllinux()) && !target.is_musl_libc() { bail!( "Cannot mix musllinux and manylinux platform tags when compiling to {}", target.target_triple() ); } if platform_tags.len() > 2 { bail!( "Expected only one or two platform tags but found {}", platform_tags.len() ); } else if platform_tags.len() == 2 { // The two platform tags can't be the same kind let tag_types = platform_tags .iter() .map(|tag| tag.is_musllinux()) .collect::>(); if tag_types.len() == 1 { bail!( "Expected only one platform tag but found {}", platform_tags.len() ); } } } _ => { if platform_tags.len() > 1 { bail!( "Expected only one platform tag but found {}", platform_tags.len() ); } } } Ok(()) } #[cfg(test)] mod tests { use super::*; use pretty_assertions::assert_eq; fn pyproject_with_compatibility(compatibility: &str) -> PyProjectToml { toml::from_str(&format!( r#" [build-system] requires = ["maturin"] build-backend = "maturin" [tool.maturin] compatibility = "{compatibility}" "# )) .unwrap() } fn resolve_for_test( user_tags: Vec, target: &Target, pyproject: Option<&PyProjectToml>, pyproject_options: &mut Vec<&str>, ) -> Result { resolve_platform_tags( user_tags, target, &BridgeModel::Bin(None), pyproject, pyproject_options, #[cfg(feature = "zig")] false, ) } #[test] fn resolve_platform_tags_filters_cli_pypi() { let target = Target::from_target_triple(Some(&TargetTriple::Regular( "x86_64-unknown-linux-gnu".to_string(), ))) .unwrap(); let mut pyproject_options = Vec::new(); let resolved = resolve_for_test( vec![CompatibilityTag::Pypi], &target, None, &mut pyproject_options, ) .unwrap(); assert!(resolved.platform_tags.is_empty()); assert!(resolved.pypi_validation); assert!(pyproject_options.is_empty()); } #[test] fn resolve_platform_tags_filters_pyproject_pypi() { let target = Target::from_target_triple(Some(&TargetTriple::Regular( "x86_64-unknown-linux-gnu".to_string(), ))) .unwrap(); let pyproject = pyproject_with_compatibility("pypi"); let mut pyproject_options = Vec::new(); let resolved = resolve_for_test( Vec::new(), &target, Some(&pyproject), &mut pyproject_options, ) .unwrap(); assert!(resolved.platform_tags.is_empty()); assert!(resolved.pypi_validation); assert_eq!(pyproject_options, vec!["compatibility"]); } #[test] fn resolve_platform_tags_rejects_pyproject_pypi_for_unsupported_target() { let target = Target::from_target_triple(Some(&TargetTriple::Regular( "riscv32gc-unknown-linux-gnu".to_string(), ))) .unwrap(); let pyproject = pyproject_with_compatibility("pypi"); let mut pyproject_options = Vec::new(); let err = resolve_for_test( Vec::new(), &target, Some(&pyproject), &mut pyproject_options, ) .unwrap_err(); assert_eq!( err.to_string(), "Rust target riscv32gc-unknown-linux-gnu is not supported by PyPI" ); } #[test] fn merge_and_dedup_sbom_includes_removes_non_adjacent_duplicates() { let pyproject = vec![ PathBuf::from("a.json"), PathBuf::from("b.json"), PathBuf::from("a.json"), ]; let cli: Vec = Vec::new(); let merged = merge_and_dedup_sbom_includes(&pyproject, &cli); assert_eq!( merged, vec![PathBuf::from("a.json"), PathBuf::from("b.json")] ); } #[test] fn merge_and_dedup_sbom_includes_preserves_pyproject_then_cli_order() { let pyproject = vec![PathBuf::from("a.json"), PathBuf::from("b.json")]; let cli = vec![ PathBuf::from("b.json"), PathBuf::from("c.json"), PathBuf::from("a.json"), ]; let merged = merge_and_dedup_sbom_includes(&pyproject, &cli); assert_eq!( merged, vec![ PathBuf::from("a.json"), PathBuf::from("b.json"), PathBuf::from("c.json"), ] ); } #[test] fn merge_and_dedup_sbom_includes_dedups_pyproject_only() { let pyproject = vec![ PathBuf::from("a.json"), PathBuf::from("a.json"), PathBuf::from("c.json"), PathBuf::from("a.json"), ]; let cli: Vec = Vec::new(); let merged = merge_and_dedup_sbom_includes(&pyproject, &cli); assert_eq!( merged, vec![PathBuf::from("a.json"), PathBuf::from("c.json")] ); } #[test] fn resolve_sbom_config_preserves_explicit_empty_include() { // An explicitly configured `include = []` in pyproject.toml must stay // `Some(vec![])` after resolution, not collapse to `None`. `SbomConfig` // is publicly exposed via `BuildContext.artifact.sbom` and derives // `Serialize`, so `Some([])` vs `None` is an observable difference // (`[]` vs `null`) and also changes whether `SbomData::write` enters // its include-handling branch at all. let pyproject: PyProjectToml = toml::from_str( r#" [build-system] requires = ["maturin"] build-backend = "maturin" [tool.maturin.sbom] include = [] "#, ) .unwrap(); let build_options = BuildOptions::default(); let config = BuildContextBuilder::resolve_sbom_config(&build_options, Some(&pyproject)); assert_eq!(config.include, Some(Vec::new())); } } maturin-1.16.0/src/build_context/mod.rs000066400000000000000000000145101527064705700200530ustar00rootroot00000000000000mod builder; mod repair; pub use builder::BuildContextBuilder; pub(crate) use repair::finalize_staged_artifacts; use crate::auditwheel::AuditWheelMode; use crate::auditwheel::PlatformTag; use crate::cargo_options::CargoOptions; use crate::compression::CompressionOptions; use crate::pgo::PgoPhase; use crate::project_layout::ProjectLayout; use crate::pyproject_toml::ConditionalFeature; use crate::{ BridgeModel, Metadata24, PyProjectToml, PythonInterpreter, Target, pyproject_toml::SbomConfig, }; use anyhow::Result; use cargo_metadata::Metadata; use itertools::Itertools; use std::collections::BTreeSet; use std::path::PathBuf; use std::sync::Arc; /// The input part of the build context. /// /// Contains static information about the project being built, such as its /// filesystem layout, manifest paths, and resolved metadata. This information /// is generally independent of the target Python interpreter. #[derive(Clone, Debug)] pub struct ProjectContext { /// The bridge model used by this project pub bridge: BridgeModel, /// The platform, i.e. os and pointer width pub target: Target, /// Whether this project is pure rust or rust mixed with python pub project_layout: ProjectLayout, /// The path to pyproject.toml. Required for the source distribution pub pyproject_toml_path: PathBuf, /// Parsed pyproject.toml if any pub pyproject_toml: Option, /// Python Package Metadata 2.4 pub metadata24: Metadata24, /// The name of the crate pub crate_name: String, /// The name of the module pub module_name: String, /// The path to the Cargo.toml. Required for the cargo invocations pub manifest_path: PathBuf, /// Directory for all generated artifacts pub target_dir: PathBuf, /// Cargo.toml as resolved by [cargo_metadata] pub cargo_metadata: Arc, /// Whether to use universal2 or use the native macOS tag (off) pub universal2: bool, /// Build editable wheels pub editable: bool, /// Cargo build options pub cargo_options: CargoOptions, /// Cargo features conditionally enabled based on the target Python version/implementation pub conditional_features: Vec, /// List of Cargo targets to compile pub compile_targets: Vec, } impl ProjectContext { /// Bridge model pub fn bridge(&self) -> &BridgeModel { &self.bridge } /// Returns the platform tags for the wheel name pub fn get_platform_tag(&self, platform_tags: &[PlatformTag]) -> Result> { crate::target::get_platform_tag( &self.target, platform_tags, self.universal2, self.pyproject_toml.as_ref(), &self.manifest_path, self.bridge.is_bin(), ) } } /// The output part of the build context. /// /// Manages configuration for the final artifacts produced by the build, /// such as output directories, symbol stripping, compression settings, /// and SBOM generation. #[derive(Clone, Debug)] pub struct ArtifactContext { /// The directory to store the built wheels in pub out: PathBuf, /// Strip the library for minimum file size pub strip: bool, /// Compression options pub compression: CompressionOptions, /// SBOM configuration pub sbom: SbomConfig, /// Include the import library in the wheel on Windows pub include_import_lib: bool, /// Include debug info files (.pdb, .dSYM, .dwp) in the wheel pub include_debuginfo: bool, /// Current PGO build phase (if PGO is enabled) pub pgo_phase: Option, /// PGO training command from pyproject.toml (only set when --pgo is passed) pub pgo_command: Option, /// Auto generate Python type stubs by introspecting the binary. Requires PyO3 and its "experimental-inspect" feature pub generate_stubs: bool, } /// The constraint part of the build context. /// /// Defines the target environment where the built artifacts will run, /// including the resolved Python interpreters, platform tags, and /// compatibility requirements (e.g. auditwheel). #[derive(Clone, Debug)] pub struct PythonContext { /// Checking the linked libraries for manylinux compliance pub auditwheel: AuditWheelMode, /// When compiling for manylinux, use zig as linker #[cfg(feature = "zig")] pub zig: bool, /// Whether to use the manylinux/musllinux or use the native linux tag pub platform_tag: Vec, /// The available python interpreters pub interpreter: Vec, /// Host Python to expose to PyO3 when target interpreters are not runnable. pub host_python: Option, /// Whether to validate wheels against PyPI platform tag rules pub pypi_validation: bool, } /// The complete build context, partitioned into modular sub-contexts. /// /// This structure reflects the build lifecycle: /// **Input (Project) → Constraints (Python) → Output (Artifact).** #[derive(Clone, Debug)] pub struct BuildContext { /// Project context pub project: ProjectContext, /// Artifact context pub artifact: ArtifactContext, /// Python context pub python: PythonContext, } /// A built distribution artifact and the high-level tag maturin associates with it. #[derive(Clone, Debug, Eq, PartialEq)] pub struct BuiltWheel { /// Path to the built wheel or source distribution. pub path: PathBuf, /// High-level tag describing the artifact kind or bound interpreter. pub tag: BuiltArtifactTag, } /// High-level tag for a built artifact. #[derive(Clone, Debug, Eq, PartialEq)] pub enum BuiltArtifactTag { /// A Python interpreter tag such as `cp312`. Interpreter(BTreeSet), /// Universal Python 3 artifact tag, rendered as `py3` at string boundaries. Universal, /// Source distribution artifact tag, rendered as `source` at string boundaries. Source, } impl BuiltArtifactTag { pub(crate) fn interpreter(tag: impl Into>) -> Self { Self::Interpreter(tag.into()) } } impl std::fmt::Display for BuiltArtifactTag { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Self::Interpreter(tag) => f.write_str(&tag.iter().join(".")), Self::Universal => f.write_str("py3"), Self::Source => f.write_str("source"), } } } maturin-1.16.0/src/build_context/repair.rs000066400000000000000000000703241527064705700205630ustar00rootroot00000000000000#[cfg(feature = "auditwheel")] use crate::auditwheel::MacOSRepairer; #[cfg(feature = "auditwheel")] use crate::auditwheel::WindowsRepairer; #[cfg(feature = "sbom")] use crate::auditwheel::get_sysroot_path; use crate::auditwheel::{ AuditResult, AuditWheelMode, AuditedArtifact, ElfRepairer, PatchKind, PlatformTag, Policy, WheelRepairer, log_grafted_libs, prepare_grafted_libs, }; use crate::compile::CargoOutputState; #[cfg(feature = "sbom")] use crate::module_writer::ModuleWriter; use crate::module_writer::WheelWriter; use crate::{BridgeModel, BuildArtifact, PythonInterpreter, VirtualWriter}; use anyhow::{Context, Result, bail}; use fs_err as fs; use normpath::PathExt; use std::collections::{HashMap, HashSet}; use std::io; use std::path::{Path, PathBuf}; use super::BuildContext; impl BuildContext { /// Create the appropriate platform-specific wheel repairer. fn make_repairer( &self, platform_tag: &[PlatformTag], python_interpreter: Option<&PythonInterpreter>, ) -> Option> { if self.project.target.is_linux() { let mut musllinux: Vec<_> = platform_tag .iter() .filter(|tag| tag.is_musllinux()) .copied() .collect(); musllinux.sort(); let mut others: Vec<_> = platform_tag .iter() .filter(|tag| !tag.is_musllinux()) .copied() .collect(); others.sort(); let allow_linking_libpython = self.project.bridge().is_bin(); let effective_tag = if self.project.bridge().is_bin() && !musllinux.is_empty() { Some(musllinux[0]) } else { others.first().or_else(|| musllinux.first()).copied() }; Some(Box::new(ElfRepairer { platform_tag: effective_tag, target: self.project.target.clone(), manifest_path: self.project.manifest_path.clone(), allow_linking_libpython, })) } else if self.project.target.is_macos() { #[cfg(feature = "auditwheel")] { Some(Box::new(MacOSRepairer { target: self.project.target.clone(), })) } #[cfg(not(feature = "auditwheel"))] { None } } else if self.project.target.is_windows() { #[cfg(feature = "auditwheel")] { let is_pypy = python_interpreter .map(|p| p.interpreter_kind.is_pypy()) .unwrap_or(false); Some(Box::new(WindowsRepairer { is_pypy })) } #[cfg(not(feature = "auditwheel"))] { None } } else { None } } pub(crate) fn auditwheel( &self, artifact: &BuildArtifact, platform_tag: &[PlatformTag], python_interpreter: Option<&PythonInterpreter>, ) -> Result { if matches!(self.python.auditwheel, AuditWheelMode::Skip) { return Ok(AuditResult::new(Policy::default(), Vec::new())); } if let Some(python_interpreter) = python_interpreter && platform_tag.is_empty() && self.project.target.is_linux() && !python_interpreter.support_portable_wheels() { eprintln!( "ðŸ�� Skipping auditwheel because {python_interpreter} does not support manylinux/musllinux wheels" ); return Ok(AuditResult::new(Policy::default(), Vec::new())); } let repairer = match self.make_repairer(platform_tag, python_interpreter) { Some(r) => r, None => return Ok(AuditResult::new(Policy::default(), Vec::new())), }; let ld_paths: Vec = artifact.linked_paths.iter().map(PathBuf::from).collect(); repairer.audit(artifact, ld_paths) } /// Compute the wheel-internal directory where the artifact resides. fn get_artifact_dir(&self) -> PathBuf { match self.project.bridge() { // cffi bindings that contains '.' in the module name will be split into directories BridgeModel::Cffi => self.project.module_name.split(".").collect::(), // For namespace packages the modules reside at ${module_name}.so // where periods are replaced with slashes so for example my.namespace.module would reside // at my/namespace/module.so _ if self.project.module_name.contains(".") => { let mut path = self.project.module_name.split(".").collect::(); path.pop(); path } // For other bindings artifact .so file usually resides at ${module_name}/${module_name}.so _ => PathBuf::from(&self.project.module_name), } } /// Patch the audited artifacts to bundle their external shared library /// dependencies into the wheel. /// /// Before any in-place patching runs, [`copy_back_cargo_outputs`] /// reflinks/copies a clean copy of every artifact that the upcoming /// [`WheelRepairer::patch`] call will rewrite back to its cargo output /// path and transitions its [`CargoOutputState`] to `Patched`, so /// [`finalize_staged_artifacts`] knows not to overwrite the unpatched /// bytes with the patched ones (see #2969 / #3111). Artifacts that /// will not be patched keep their `Renamed` / `Mirrored` state and /// get the cheap rename-back in finalize as usual. pub(crate) fn add_external_libs( &self, writer: &mut VirtualWriter, audited: &mut [AuditedArtifact], use_shim: bool, ) -> Result<()> { if self.project.editable { if let Some(repairer) = self.make_repairer(&self.python.platform_tag, self.python.interpreter.first()) { let kind = PatchKind::Editable; let will_patch = repairer.patch_required(audited, &kind); copy_back_cargo_outputs(audited, &will_patch)?; return repairer.patch(audited, &kind); } return Ok(()); } if audited.iter().all(|a| a.external_libs.is_empty()) { return Ok(()); } // Log which libraries need to be copied and which artifacts require them // before calling patchelf, so users can see this even if patchelf is missing. eprintln!("🔗 External shared libraries to be copied into the wheel:"); for aa in audited.iter() { if aa.external_libs.is_empty() { continue; } eprintln!(" {} requires:", aa.artifact.path.display()); for lib in &aa.external_libs { if let Some(path) = lib.realpath.as_ref() { eprintln!(" {} => {}", lib.name, path.display()); } else { eprintln!(" {} => not found", lib.name); } } } match self.python.auditwheel { AuditWheelMode::Warn => { eprintln!( "âš ï¸� Warning: Your library requires copying the above external libraries. \ Re-run with `--auditwheel=repair` to copy them into the wheel." ); // Warn mode does not modify the artifact. return Ok(()); } AuditWheelMode::Check => { bail!( "Your library requires copying the above external libraries. \ Re-run with `--auditwheel=repair` to copy them." ); } _ => {} } let repairer = self .make_repairer(&self.python.platform_tag, self.python.interpreter.first()) .context("No wheel repairer available for this platform")?; // Put external libs to ${distribution_name}.libs directory // See https://github.com/pypa/auditwheel/issues/89 // Use the distribution name (matching auditwheel's behavior) to avoid // conflicts with other packages in the same namespace. let dist_name = self.project.metadata24.get_distribution_escaped(); let libs_dir = repairer.libs_dir(&dist_name); // Merge arch_requirements from all audited artifacts (universal2 only). // Each artifact may have analyzed different architecture slices. let merged_arch_requirements: HashMap> = { let mut merged: HashMap> = HashMap::new(); for aa in audited.iter() { for (realpath, archs) in &aa.arch_requirements { merged .entry(realpath.clone()) .or_default() .extend(archs.iter().cloned()); } } merged }; let arch_requirements = if merged_arch_requirements.is_empty() { None } else { Some(&merged_arch_requirements) }; let temp_dir = writer.temp_dir()?; let (grafted, libs_copied) = prepare_grafted_libs(audited, temp_dir.path(), arch_requirements)?; // For bin bindings with external deps (shim mode), the real binary // lives in {dist_name}.scripts/ in platlib rather than .data/scripts/. // This gives us a predictable relative path to the bundled libs directory. let artifact_dir = if use_shim { self.project.metadata24.get_scripts_platlib_dir() } else { self.get_artifact_dir() }; // Reflink/copy a clean unpatched copy of every artifact that the // upcoming `repairer.patch` call will rewrite back to its cargo // output path before any bytes are touched, then transition its // staging state to `Patched` so finalize doesn't try to overwrite // with the patched bytes — see #2969. let kind = PatchKind::Repair { grafted: &grafted, libs_dir: &libs_dir, artifact_dir: &artifact_dir, }; let will_patch = repairer.patch_required(audited, &kind); copy_back_cargo_outputs(audited, &will_patch)?; repairer.patch(audited, &kind)?; // Add grafted libraries to the wheel for lib in &grafted { writer.add_file_force(libs_dir.join(&lib.new_name), &lib.dest_path, true)?; } log_grafted_libs(&libs_copied, &libs_dir); // Apply __init__.py patch for runtime DLL discovery (Windows only). // The patch registers the .libs/ directory via os.add_dll_directory(). // Skip when no libraries were actually grafted (nothing to discover), // for bin bridge wheels (no package __init__.py to patch), and // root-level artifacts. let depth = artifact_dir.components().count(); if !grafted.is_empty() && depth > 0 && !self.project.bridge().is_bin() { let libs_dir_name = libs_dir.to_string_lossy().into_owned(); if let Some(patch) = repairer.init_py_patch(&libs_dir_name, depth) { let init_py_path = artifact_dir.join("__init__.py"); writer.prepend_to(init_py_path, patch.into_bytes())?; } } // Generate auditwheel SBOM for the grafted libraries. // This mirrors Python auditwheel's behaviour of writing a CycloneDX // SBOM to /sboms/auditwheel.cdx.json that records which OS // packages provided the grafted shared libraries. #[cfg(feature = "sbom")] { let auditwheel_sbom_enabled = self.artifact.sbom.auditwheel.unwrap_or(true); if auditwheel_sbom_enabled { // Obtain the sysroot so whichprovides can strip cross-compilation // prefixes when querying the host package manager. let sysroot = get_sysroot_path(&self.project.target).unwrap_or_else(|_| PathBuf::from("/")); let mut grafted_paths: Vec = libs_copied.into_iter().collect(); grafted_paths.sort(); if let Some(sbom_json) = crate::auditwheel::sbom::create_auditwheel_sbom( &self.project.metadata24.name, &self.project.metadata24.version.to_string(), &grafted_paths, &sysroot, ) { let sbom_path = self .project .metadata24 .get_dist_info_dir() .join("sboms/auditwheel.cdx.json"); writer.add_bytes(&sbom_path, None, sbom_json, false)?; } } } Ok(()) } /// Stage an artifact into a private directory so that: /// 1. `warn_missing_py_init` can safely mmap the file without risk of /// concurrent modification by cargo / rust-analyzer. /// 2. Auditwheel repair can modify it in-place without altering the /// original cargo build output (see #2969 / #2680). /// /// On the same filesystem `fs::rename` is atomic and the cargo output /// path becomes empty until [`finalize_staged_artifacts`] renames it /// back. On cross-device the file is reflinked/copied into staging and /// the original is left in place — finalize then just drops the staged /// duplicate, avoiding the second full copy that the previous /// implementation performed. /// /// The post-stage state is recorded on the artifact as a /// [`CargoOutputState`] (`Renamed` / `Mirrored`) so it can be restored /// either by [`finalize_staged_artifacts`] (cheap rename or duplicate /// drop, when no patching happened) or transitioned to `Patched` by /// [`copy_back_cargo_outputs`] (which puts a clean unpatched copy at /// the cargo output path before the repairer rewrites bytes in place /// — see #2969 / #3111). /// /// **Build errors before finalize:** if the build errors after /// `stage_artifact` but before [`finalize_staged_artifacts`] runs, the /// staged artifact stays in `target/maturin/`. The wheel is the /// deliverable so this is not a correctness bug, and on the next /// compile cargo will write a fresh artifact at the cargo output path. pub(crate) fn stage_artifact(&self, artifact: &mut BuildArtifact) -> Result<()> { let maturin_build = crate::compile::ensure_target_maturin_dir(&self.project.target_dir); let cargo_output = artifact.path.clone(); let (staged_path, staging) = stage_file(&cargo_output, &maturin_build)?; artifact.path = staged_path; artifact.staging = staging; Ok(()) } } /// Place a copy of `artifact_path` into `staging_dir` and return the new /// normalized path along with the [`CargoOutputState`] describing how the /// move was performed. /// /// Same-filesystem fast path (returns [`CargoOutputState::Renamed`]): /// `fs::rename` atomically moves the file (and overwrites any stale /// leftover from a previous build on both Unix and Windows); the cargo /// output path is empty until [`finalize_staged_artifacts`] renames it /// back. /// /// Cross-device fallback (returns [`CargoOutputState::Mirrored`]): /// reflink/copy into staging and **leave the original at the cargo output /// path**; finalize will see the typed `Mirrored` state and drop the /// staged duplicate, so the bytes are only copied once. The pre-clean is /// needed here because `reflink_copy::reflink` refuses to overwrite on /// some platforms. /// /// Only `ErrorKind::CrossesDevices` triggers the fallback — every other /// rename error (permission denied, I/O failure, etc.) is surfaced /// instead of being silently masked by the copy path. fn stage_file(artifact_path: &Path, staging_dir: &Path) -> Result<(PathBuf, CargoOutputState)> { let new_path = staging_dir.join(artifact_path.file_name().unwrap()); // Break stale hardlinks before rename. If `new_path` and `artifact_path` // already name the same inode, Unix `rename` succeeds as a no-op and the // later copy-back can end up copying the file onto itself. let _ = fs::remove_file(&new_path); let staging = match fs::rename(artifact_path, &new_path) { Ok(()) => CargoOutputState::Renamed { cargo_output: artifact_path.to_path_buf(), }, Err(err) if err.kind() == io::ErrorKind::CrossesDevices => { // Cross-device: copy into staging and leave the original alone. reflink_or_copy(artifact_path, &new_path)?; CargoOutputState::Mirrored { cargo_output: artifact_path.to_path_buf(), } } Err(err) => { return Err(err).with_context(|| { format!( "Failed to stage {} -> {}", artifact_path.display(), new_path.display(), ) }); } }; Ok((new_path.normalize()?.into_path_buf(), staging)) } /// Copy the clean unpatched bytes back to every artifact's cargo output /// path **before** the platform-specific repairer rewrites bytes in place, /// then transition the artifact's [`CargoOutputState`] to `Patched` so /// [`finalize_staged_artifacts`] doesn't try to overwrite the unpatched /// bytes with the patched ones. /// /// `will_patch[i] == false` artifacts are left alone — they keep their /// `Renamed` / `Mirrored` state and get the cheap rename-back (or /// duplicate drop) in finalize. /// /// For artifacts marked `will_patch[i] == true`: /// /// - **Mirrored** ([`stage_file`] was cross-device): the cargo output /// path already holds the unpatched original, so we only flip the /// state — no I/O needed. /// - **Renamed** ([`stage_file`] used `fs::rename`): the cargo output /// path is empty; reflink/copy the still-clean staged artifact back /// to it before the repairer rewrites bytes in place. This is one /// reflink (O(1) on apfs/btrfs/xfs/refs, a real copy on ext4) per /// patched artifact, scoped only to artifacts that genuinely need /// patching — multi-bin projects where some bins are unpatched still /// pay only the rename-back for those bins. /// - **NotStaged** / **Patched**: no-op. `NotStaged` shouldn't happen on /// an audited artifact (we always stage before auditing) but we /// degrade gracefully; `Patched` means a previous call already did /// the work. fn copy_back_cargo_outputs(audited: &mut [AuditedArtifact], will_patch: &[bool]) -> Result<()> { for (aa, &will_patch) in audited.iter_mut().zip(will_patch) { if !will_patch { continue; } match &aa.artifact.staging { CargoOutputState::Renamed { cargo_output } => { let cargo_output = cargo_output.clone(); if cargo_output.exists() && same_file::is_same_file(&aa.artifact.path, &cargo_output).unwrap_or(false) { fs::remove_file(&cargo_output).with_context(|| { format!( "Failed to unlink hardlinked cargo output {} before restoring it from {}", cargo_output.display(), aa.artifact.path.display(), ) })?; } reflink_or_copy(&aa.artifact.path, &cargo_output).with_context(|| { format!( "Failed to restore unpatched cargo output {} from staged artifact {}", cargo_output.display(), aa.artifact.path.display(), ) })?; tracing::debug!( "copy_back_cargo_outputs: copied unpatched {} -> {}", aa.artifact.path.display(), cargo_output.display() ); aa.artifact.staging = CargoOutputState::Patched; } CargoOutputState::Mirrored { cargo_output } => { tracing::debug!( "copy_back_cargo_outputs: {} already holds unpatched original (cross-device staging), no-op", cargo_output.display() ); aa.artifact.staging = CargoOutputState::Patched; } CargoOutputState::NotStaged | CargoOutputState::Patched => {} } } Ok(()) } /// Restore staged artifacts to their cargo output paths after a successful /// wheel write. /// /// Dispatches on the artifact's [`CargoOutputState`] (set deterministically /// by [`stage_file`] / [`copy_back_cargo_outputs`]) so the staging mode is /// never re-inferred from `cargo_output.exists()`: /// /// - `NotStaged`: no staging happened, nothing to do. /// - `Renamed { cargo_output }`: rename the staged file back to /// `cargo_output`. If rename fails (extremely rare — e.g. `target/` /// was relocated to a different mount point mid-build), fall back to /// reflink+remove. /// - `Mirrored { cargo_output }`: `cargo_output` already holds the /// unpatched original from the cross-device branch of `stage_file`; /// drop the staged duplicate. /// - `Patched`: [`copy_back_cargo_outputs`] already restored unpatched /// bytes at the cargo output path; the staged artifact (which now /// holds patched bytes) must NOT be moved back. Leave the staged /// file in `target/maturin/` (overwritten on the next build) — see /// #2969 for why patched bytes must not flow back to cargo's /// incremental cache. /// /// Per-artifact precision means a multi-bin project where only some /// bins bundle external libraries still gets the cheap rename-back for /// the unpatched bins. /// /// Failures are logged and swallowed: the wheel is the deliverable, the /// cargo-path restore is a UX convenience, and the staged artifact is /// still recoverable from `target/maturin/`. pub(crate) fn finalize_staged_artifacts(audited: &[AuditedArtifact]) { for aa in audited { match &aa.artifact.staging { CargoOutputState::NotStaged | CargoOutputState::Patched => continue, CargoOutputState::Renamed { cargo_output } => { if let Err(err) = restore_renamed(&aa.artifact.path, cargo_output) { tracing::warn!( "Could not restore artifact to cargo output path {}: {err:#}", cargo_output.display() ); } } CargoOutputState::Mirrored { cargo_output } => { let _ = fs::remove_file(&aa.artifact.path); tracing::debug!( "Dropped staged duplicate of cross-device artifact at {}", cargo_output.display() ); } } } } /// Restore a `Renamed` staged artifact back to its cargo output path. /// /// Must only be called when the staged artifact has not been modified by /// auditwheel / patchelf / patch_macho / pe_patch — see #2969. The typed /// `Renamed` state guarantees that: `copy_back_cargo_outputs` transitions /// to `Patched` *before* the repairer rewrites bytes. /// /// 1. Same-filesystem: O(1) `fs::rename` puts the staged file back. /// 2. Fallback (rare — e.g. `target/` straddles a mount point added /// after staging): `reflink_or_copy` + `remove_file`. fn restore_renamed(staged: &Path, cargo_output: &Path) -> Result<()> { if fs::rename(staged, cargo_output).is_ok() { tracing::debug!( "Restored {} to {}", staged.display(), cargo_output.display() ); return Ok(()); } reflink_or_copy(staged, cargo_output).with_context(|| { format!( "Failed to restore staged artifact from {} to {}", staged.display(), cargo_output.display(), ) })?; let _ = fs::remove_file(staged); Ok(()) } /// Reflink (copy-on-write) a file, preserving permissions, and fall back to /// a regular copy if reflink fails for any reason. /// /// On macOS `clonefile` preserves all metadata natively. On Linux /// `ioctl_ficlone` only clones data blocks so we must copy permissions /// ourselves. /// /// Adapted from uv's `reflink_with_permissions` implementation: /// /// See also: fn reflink_or_copy(from: &Path, to: &Path) -> Result<()> { if reflink_with_permissions(from, to).is_err() { fs::copy(from, to)?; } Ok(()) } /// Attempt a reflink while preserving the source file's permissions. /// /// On Linux, `ioctl_ficlone` does not copy metadata, so we reflink first /// then copy permissions from the source to the destination. /// On other platforms we delegate to `reflink_copy::reflink` which preserves /// metadata natively (macOS `clonefile`). /// /// Based on uv's approach which uses `rustix::fs::ioctl_ficlone` directly /// with `fchmod` on the open file descriptor to avoid TOCTOU races. We /// simplify here by calling `reflink_copy::reflink` followed by /// `set_permissions`, since the staged artifact lives in a private /// directory where TOCTOU is not a concern. /// #[cfg(target_os = "linux")] fn reflink_with_permissions(from: &Path, to: &Path) -> std::io::Result<()> { reflink_copy::reflink(from, to)?; let perms = fs::metadata(from)?.permissions(); fs::set_permissions(to, perms)?; Ok(()) } #[cfg(not(target_os = "linux"))] fn reflink_with_permissions(from: &Path, to: &Path) -> std::io::Result<()> { reflink_copy::reflink(from, to) } #[cfg(all(test, unix))] mod tests { use super::*; use crate::compile::BuildArtifact; use std::collections::HashMap; #[test] fn stage_file_unlinks_stale_hardlinked_destination_before_rename() { let temp_dir = tempfile::tempdir().unwrap(); let cargo_dir = temp_dir.path().join("target/release/deps"); let staging_dir = temp_dir.path().join("target/maturin"); fs::create_dir_all(&cargo_dir).unwrap(); fs::create_dir_all(&staging_dir).unwrap(); let cargo_output = cargo_dir.join("libdemo.so"); let staged_output = staging_dir.join("libdemo.so"); fs::write(&cargo_output, b"not empty").unwrap(); fs::hard_link(&cargo_output, &staged_output).unwrap(); let (staged, staging) = stage_file(&cargo_output, &staging_dir).unwrap(); assert_eq!(staged, staged_output.normalize().unwrap().into_path_buf()); assert!(!cargo_output.exists()); assert_eq!(fs::read(&staged).unwrap(), b"not empty"); assert!(matches!( staging, CargoOutputState::Renamed { cargo_output: restored } if restored == cargo_output )); } #[test] fn copy_back_cargo_outputs_breaks_accidental_self_hardlink() { let temp_dir = tempfile::tempdir().unwrap(); let cargo_dir = temp_dir.path().join("target/release/deps"); let staging_dir = temp_dir.path().join("target/maturin"); fs::create_dir_all(&cargo_dir).unwrap(); fs::create_dir_all(&staging_dir).unwrap(); let staged_output = staging_dir.join("libdemo.so"); let cargo_output = cargo_dir.join("libdemo.so"); fs::write(&staged_output, b"not empty").unwrap(); fs::hard_link(&staged_output, &cargo_output).unwrap(); let mut audited = [AuditedArtifact { artifact: BuildArtifact { path: staged_output.clone(), import_lib_path: None, debuginfo_path: None, linked_paths: Vec::new(), thin_artifacts: Vec::new(), staging: CargoOutputState::Renamed { cargo_output: cargo_output.clone(), }, }, external_libs: Vec::new(), arch_requirements: HashMap::new(), }]; copy_back_cargo_outputs(&mut audited, &[true]).unwrap(); assert_eq!(fs::read(&staged_output).unwrap(), b"not empty"); assert_eq!(fs::read(&cargo_output).unwrap(), b"not empty"); assert!(!same_file::is_same_file(&staged_output, &cargo_output).unwrap()); assert!(matches!( audited[0].artifact.staging, CargoOutputState::Patched )); } } maturin-1.16.0/src/build_options.rs000066400000000000000000000654511527064705700173150ustar00rootroot00000000000000use crate::auditwheel::{AuditWheelMode, CompatibilityTag}; use crate::bridge::Bindings; use crate::build_context::BuildContextBuilder; pub use crate::cargo_options::{CargoOptions, TargetTriple}; use crate::compression::CompressionOptions; use serde::{Deserialize, Serialize}; use std::path::PathBuf; use tracing::instrument; /// Options for configuring the target Python environment and bindings. /// /// These options define the 'Constraints' of the build. #[derive(Debug, Default, Serialize, Deserialize, clap::Parser, Clone, Eq, PartialEq)] #[serde(default)] pub struct PythonOptions { /// The python versions to build wheels for, given as the executables of /// interpreters such as `python3.9` or `/usr/bin/python3.8`. #[arg(short, long, num_args = 0.., action = clap::ArgAction::Append)] pub interpreter: Vec, /// Find interpreters from the host machine #[arg(short = 'f', long, conflicts_with = "interpreter")] pub find_interpreter: bool, /// Which kind of bindings to use. #[arg(short, long)] pub bindings: Option, } /// Options for configuring platform tags and binary compatibility. /// /// These options define the 'Constraints' of the build related to the OS and libc. #[derive(Debug, Default, Serialize, Deserialize, clap::Parser, Clone, Eq, PartialEq)] #[serde(default)] pub struct PlatformOptions { /// Control the platform tag and PyPI compatibility. /// /// This options offers both fine-grained control over the linux libc tag and a more automatic /// PyPI-compatibility option. /// /// The `pypi` option applies on all platforms and ensure that only tags that can be uploaded to /// PyPI are used. The linux-specific options are `manylinux` tags (for example /// `manylinux2014`/`manylinux_2_24`) or `musllinux` tags (for example `musllinux_1_2`), /// and `linux` for the native linux tag. They are ignored on non-linux platforms. /// /// Note that `manylinux1` and `manylinux2010` are unsupported by the rust compiler. /// Wheels with the native `linux` tag will be rejected by pypi, /// unless they are separately validated by `auditwheel`. /// /// The default is the lowest compatible `manylinux` tag, or plain `linux` if nothing matched. #[arg( id = "compatibility", long = "compatibility", alias = "manylinux", num_args = 0.., action = clap::ArgAction::Append )] pub platform_tag: Vec, /// Audit wheel for manylinux compliance #[arg(long, conflicts_with = "skip_auditwheel")] pub auditwheel: Option, /// Don't check for manylinux compliance #[arg(long, hide = true)] pub skip_auditwheel: bool, /// For manylinux targets, use zig to ensure compliance for the chosen manylinux version /// /// Default to manylinux2014/manylinux_2_17 if you do not specify an `--compatibility` /// /// Make sure you installed zig with `pip install maturin[zig]` #[cfg(feature = "zig")] #[arg(long)] pub zig: bool, } /// Options for controlling final build artifacts and their metadata. /// /// These options define the 'Output' part of the build. #[derive(Debug, Default, Serialize, Deserialize, clap::Parser, Clone, Eq, PartialEq)] #[serde(default)] pub struct OutputOptions { /// The directory to store the built wheels in. Defaults to a new "wheels" /// directory in the project's target directory #[arg(short, long)] pub out: Option, /// Include debug info files (.pdb on Windows, .dSYM on macOS, .dwp on Linux) /// in the wheel. When enabled, maturin automatically configures /// split-debuginfo=packed so that separate debug info files are produced. #[arg(long)] pub include_debuginfo: bool, /// Additional SBOM files to include in the `.dist-info/sboms` directory. /// Can be specified multiple times. #[arg(long = "sbom-include", num_args = 1.., action = clap::ArgAction::Append)] pub sbom_include: Vec, } /// High level API for building wheels from a crate, also used for the CLI. /// /// This struct is the primary entry point for build configuration and is /// partitioned into modular sub-groups reflecting the build lifecycle. #[derive(Debug, Default, Serialize, Deserialize, clap::Parser, Clone, Eq, PartialEq)] #[serde(default)] pub struct BuildOptions { /// Python and bindings options #[command(flatten)] pub python: PythonOptions, /// Platform tag and auditwheel options #[command(flatten)] pub platform: PlatformOptions, /// Output artifact options #[command(flatten)] pub output: OutputOptions, /// Cargo build options #[command(flatten)] pub cargo: CargoOptions, /// Wheel compression options #[command(flatten)] pub compression: CompressionOptions, /// Auto generate Python type stubs by introspecting the binary. Requires PyO3 and its "experimental-inspect" feature #[arg(long)] pub generate_stubs: bool, } impl BuildOptions { /// Tries to fill the missing metadata for a BuildContext by querying cargo and python #[instrument(skip_all)] pub fn into_build_context(self) -> BuildContextBuilder { BuildContextBuilder::new(self) } } #[cfg(test)] mod tests { use super::*; use crate::bridge::{ Bindings, CrateDependencies, PyO3, PyO3Crate, StableAbi, StableAbiKind, StableAbiVersion, find_bridge, }; use crate::python_interpreter::InterpreterResolver; use crate::test_utils::test_crate_path; use crate::{BridgeModel, Target}; use cargo_metadata::{CargoOpt, MetadataCommand}; use insta::assert_snapshot; use pretty_assertions::assert_eq; #[test] fn test_cli_bindings_parses_every_spelling() { use clap::Parser; // `--bindings ` accepts each valid spelling and maps it to the // matching `Bindings` variant. for binding in Bindings::ALL { let opts = PythonOptions::try_parse_from(["prog", "--bindings", binding.as_str()]).unwrap(); assert_eq!(opts.bindings, Some(binding)); } // Omitting `--bindings` leaves auto-detection untouched (None). let opts = PythonOptions::try_parse_from(["prog"]).unwrap(); assert_eq!(opts.bindings, None); } #[test] fn test_cli_bindings_rejects_unknown() { use clap::Parser; let err = PythonOptions::try_parse_from(["prog", "--bindings", "foo"]).unwrap_err(); let rendered = err.to_string(); // Same diagnostic quality as the previous `value_parser = [...]`: the // invalid value plus the list of accepted spellings. assert!( rendered.contains("invalid value 'foo' for '--bindings '"), "unexpected error: {rendered}" ); assert!( rendered.contains("[possible values: pyo3, pyo3-ffi, cffi, uniffi, bin]"), "unexpected error: {rendered}" ); } #[test] fn test_find_bridge_pyo3() { let pyo3_mixed = MetadataCommand::new() .manifest_path(test_crate_path("pyo3-mixed").join("Cargo.toml")) .exec() .unwrap(); assert!(matches!( find_bridge(&pyo3_mixed, None, &CargoOptions::default()), Ok(BridgeModel::PyO3 { .. }) )); assert!(matches!( find_bridge(&pyo3_mixed, Some(Bindings::PyO3), &CargoOptions::default()), Ok(BridgeModel::PyO3 { .. }) )); } #[test] fn test_find_bridge_pyo3_abi3() { use crate::bridge::{PyO3Metadata, PyO3VersionMetadata}; let pyo3_pure = MetadataCommand::new() .manifest_path(test_crate_path("pyo3-pure").join("Cargo.toml")) .exec() .unwrap(); let bridge = BridgeModel::PyO3(PyO3 { crate_name: PyO3Crate::PyO3, version: semver::Version::new(0, 29, 0), stable_abi: Some(StableAbi::from_abi3_version(3, 9)), metadata: Some(PyO3Metadata { cpython: PyO3VersionMetadata { min_minor: 8, max_minor: 15, }, pypy: PyO3VersionMetadata { min_minor: 11, max_minor: 11, }, }), }); assert_eq!( find_bridge(&pyo3_pure, None, &CargoOptions::default()).unwrap(), bridge ); assert_eq!( find_bridge(&pyo3_pure, Some(Bindings::PyO3), &CargoOptions::default()).unwrap(), bridge ); } #[test] fn test_find_bridge_pyo3_workspace_abi3_feature() { // `pyo3-workspace-abi3-feature` has a sibling workspace member that // enables pyo3's abi3 features; the workspace-unified `cargo metadata` // graph reports them for `extension` too, but a scoped build of // `extension` never enables them, so no stable abi should be detected let metadata = MetadataCommand::new() .manifest_path( test_crate_path("pyo3-workspace-abi3-feature") .join("extension") .join("Cargo.toml"), ) .exec() .unwrap(); let bridge = find_bridge(&metadata, None, &CargoOptions::default()).unwrap(); let BridgeModel::PyO3(pyo3) = bridge else { panic!("expected pyo3 bindings, got {bridge:?}"); }; assert_eq!(pyo3.stable_abi, None); } #[test] fn test_find_bridge_pyo3_abi3t() { let pyo3_abi3t = MetadataCommand::new() .manifest_path(test_crate_path("pyo3-abi3t").join("Cargo.toml")) .exec() .unwrap(); let bridge = find_bridge(&pyo3_abi3t, None, &CargoOptions::default()).unwrap(); let pyo3 = match &bridge { BridgeModel::PyO3(pyo3) => pyo3, other => panic!("expected PyO3 bridge, got {other:?}"), }; assert_eq!( pyo3.stable_abi, Some(StableAbi::from_abi3t_version(3, 15)), "abi3t-py315 should produce a StableAbiKind::Abi3t with min version 3.15" ); assert_eq!(pyo3.crate_name, PyO3Crate::PyO3); let bridge_explicit = find_bridge(&pyo3_abi3t, Some(Bindings::PyO3), &CargoOptions::default()).unwrap(); assert_eq!(bridge_explicit, bridge); } #[test] fn test_find_bridge_pyo3_abi3t_without_version() { let pyo3_abi3t_without_version = MetadataCommand::new() .manifest_path(test_crate_path("pyo3-abi3t-without-version").join("Cargo.toml")) .exec() .unwrap(); let bridge = find_bridge(&pyo3_abi3t_without_version, None, &CargoOptions::default()).unwrap(); let pyo3 = match &bridge { BridgeModel::PyO3(pyo3) => pyo3, other => panic!("expected PyO3 bridge, got {other:?}"), }; // The `abi3t` feature alone (no `abi3t-py3XY`) should map to CurrentPython. let stable_abi = pyo3.stable_abi.expect("expected abi3t stable_abi"); assert!( matches!(stable_abi.kind, StableAbiKind::Abi3t), "expected StableAbiKind::Abi3t, got {:?}", stable_abi.kind ); assert_eq!(stable_abi.version, StableAbiVersion::CurrentPython); } #[test] fn test_find_bridge_pyo3_combined_abi3_and_abi3t() { let cases = [ (None, StableAbi::from_abi3_version(3, 8)), ( Some("abi3-and-current-abi3t"), StableAbi::from_abi3_version(3, 8), ), ]; for (feature, expected) in cases { let mut command = MetadataCommand::new(); command.manifest_path(test_crate_path("pyo3-abi3-and-abi3t").join("Cargo.toml")); if let Some(feature) = feature { command.features(CargoOpt::NoDefaultFeatures); command.features(CargoOpt::SomeFeatures(vec![feature.to_string()])); } let metadata = command.exec().unwrap(); let bridge = find_bridge(&metadata, None, &CargoOptions::default()).unwrap(); let pyo3 = match &bridge { BridgeModel::PyO3(pyo3) => pyo3, other => panic!("expected PyO3 bridge, got {other:?}"), }; assert_eq!( pyo3.stable_abi, Some(expected), "unexpected stable ABI for feature {feature:?}", ); } } #[test] fn test_upgrade_bridge_pyo3_combined_abi3_and_abi3t_selects_single_abi() { use crate::bridge::upgrade_bridge_stable_abi; use crate::python_interpreter::{InterpreterConfig, InterpreterKind}; let metadata = MetadataCommand::new() .manifest_path(test_crate_path("pyo3-abi3-and-abi3t").join("Cargo.toml")) .exec() .unwrap(); let bridge = find_bridge(&metadata, None, &CargoOptions::default()).unwrap(); let target = Target::from_resolved_target_triple("x86_64-unknown-linux-gnu").unwrap(); let cpython = |minor, abiflags| { crate::PythonInterpreter::from_config( InterpreterConfig::lookup_one( &target, InterpreterKind::CPython, (3, minor), abiflags, ) .unwrap(), ) }; let cases = [ ( "only GIL-enabled 3.14", vec![cpython(14, "")], StableAbi::from_abi3_version(3, 8), ), ( "only free-threaded 3.14", vec![cpython(14, "t")], StableAbi::from_abi3_version(3, 8), ), ( "only free-threaded 3.15", vec![cpython(15, "t")], StableAbi::from_abi3t_version(3, 15), ), ( "only GIL-enabled 3.15", vec![cpython(15, "")], StableAbi::from_abi3t_version(3, 15), ), ( "GIL-enabled 3.14 and free-threaded 3.15", vec![cpython(14, ""), cpython(15, "t")], StableAbi::from_abi3t_version(3, 15), ), ]; let deps = CrateDependencies::resolve(&metadata, &CargoOptions::default()).unwrap(); for (name, interpreters, expected) in cases { let bridge = upgrade_bridge_stable_abi(bridge.clone(), &deps, None, &interpreters).unwrap(); let stable_abi = bridge.pyo3().and_then(|pyo3| pyo3.stable_abi); assert_eq!(stable_abi, Some(expected), "{name}"); } } /// Mirrors `test_find_bridge_pyo3_abi3t` for a crate that depends on `pyo3-ffi` /// directly (the FFI-only path, analogous to `pyo3-ffi-pure`). Verifies the /// crate_name is `PyO3Ffi` and version detection works the same as via `pyo3`. #[test] fn test_find_bridge_pyo3_ffi_abi3t_py315() { let pyo3_ffi_abi3t = MetadataCommand::new() .manifest_path(test_crate_path("pyo3-ffi-abi3t-py315").join("Cargo.toml")) .exec() .unwrap(); let bridge = find_bridge(&pyo3_ffi_abi3t, None, &CargoOptions::default()).unwrap(); let pyo3 = match &bridge { BridgeModel::PyO3(pyo3) => pyo3, other => panic!("expected PyO3 bridge, got {other:?}"), }; assert_eq!( pyo3.stable_abi, Some(StableAbi::from_abi3t_version(3, 15)), "abi3t-py315 on pyo3-ffi must produce a Version(3, 15) abi3t bridge" ); assert_eq!(pyo3.crate_name, PyO3Crate::PyO3Ffi); } /// `is_abi3_for_interpreter` must distinguish between the abi3 and abi3t kinds: /// only abi3 kinds may emit the `cp{ver}-abi3-{platform}` linker name. abi3t /// builds need to fall through to `is_stable_abi_for_interpreter`, which is the /// kind-agnostic check used to decide whether to define `Py_LIMITED_API`. #[test] fn test_stable_abi_for_interpreter_distinguishes_kinds() { use crate::bridge::{PyO3Metadata, PyO3VersionMetadata}; use crate::python_interpreter::{InterpreterConfig, InterpreterKind}; use crate::{PythonInterpreter, Target}; let target = Target::from_resolved_target_triple("x86_64-unknown-linux-gnu").unwrap(); // GIL-enabled CPython 3.15 - supports abi3 and abi3t let py315 = PythonInterpreter::from_config( InterpreterConfig::lookup_one(&target, InterpreterKind::CPython, (3, 15), "").unwrap(), ); // Free-threaded CPython 3.15 - supports abi3t and does NOT support abi3 let py315t = PythonInterpreter::from_config( InterpreterConfig::lookup_one(&target, InterpreterKind::CPython, (3, 15), "t").unwrap(), ); // Free-threaded CPython 3.14 — does NOT support abi3 or abi3t let py314t = PythonInterpreter::from_config( InterpreterConfig::lookup_one(&target, InterpreterKind::CPython, (3, 14), "t").unwrap(), ); // GIL-enabled CPython 3.14 - supports abi3 and does NOT support abi3t let py314 = PythonInterpreter::from_config( InterpreterConfig::lookup_one(&target, InterpreterKind::CPython, (3, 14), "").unwrap(), ); let metadata = PyO3Metadata { cpython: PyO3VersionMetadata { min_minor: 7, max_minor: 15, }, pypy: PyO3VersionMetadata { min_minor: 11, max_minor: 11, }, }; let abi3_bridge = BridgeModel::PyO3(PyO3 { crate_name: PyO3Crate::PyO3, version: semver::Version::new(0, 28, 3), stable_abi: Some(StableAbi::from_abi3_version(3, 9)), metadata: Some(metadata.clone()), }); let abi3t_bridge = BridgeModel::PyO3(PyO3 { crate_name: PyO3Crate::PyO3, version: semver::Version::new(0, 28, 3), stable_abi: Some(StableAbi::from_abi3t_version(3, 15)), metadata: Some(metadata), }); assert_eq!( abi3t_bridge.pyo3().unwrap().stable_abi.unwrap().kind, StableAbiKind::Abi3t ); assert_eq!( abi3_bridge.pyo3().unwrap().stable_abi.unwrap().kind, StableAbiKind::Abi3 ); assert!(abi3_bridge.is_stable_abi_for_interpreter(&py315)); assert!(abi3t_bridge.is_stable_abi_for_interpreter(&py315)); assert!(abi3t_bridge.is_stable_abi_for_interpreter(&py315t)); // abi3 isn't supported for free-threaded interpreters, should fail assert!(!abi3_bridge.is_stable_abi_for_interpreter(&py315t)); // Free-threaded 3.14: no stable api support assert!(!abi3t_bridge.is_stable_abi_for_interpreter(&py314t)); assert!(!abi3_bridge.is_stable_abi_for_interpreter(&py314t)); // GIL-enabled 3.14 supports abi3 but not abi3t assert!(!abi3t_bridge.is_stable_abi_for_interpreter(&py314)); assert!(abi3_bridge.is_stable_abi_for_interpreter(&py314)); } #[test] fn test_find_bridge_pyo3_feature() { let pyo3_pure = MetadataCommand::new() .manifest_path(test_crate_path("pyo3-feature").join("Cargo.toml")) .exec() .unwrap(); assert!(find_bridge(&pyo3_pure, None, &CargoOptions::default()).is_err()); let pyo3_pure = MetadataCommand::new() .manifest_path(test_crate_path("pyo3-feature").join("Cargo.toml")) .other_options(vec!["--features=pyo3".to_string()]) .exec() .unwrap(); assert!(matches!( find_bridge(&pyo3_pure, None, &CargoOptions::default()).unwrap(), BridgeModel::PyO3 { .. } )); } #[test] fn test_find_bridge_cffi() { let cffi_pure = MetadataCommand::new() .manifest_path(test_crate_path("cffi-pure").join("Cargo.toml")) .exec() .unwrap(); assert_eq!( find_bridge(&cffi_pure, Some(Bindings::Cffi), &CargoOptions::default()).unwrap(), BridgeModel::Cffi ); assert_eq!( find_bridge(&cffi_pure, None, &CargoOptions::default()).unwrap(), BridgeModel::Cffi ); assert!(find_bridge(&cffi_pure, Some(Bindings::PyO3), &CargoOptions::default()).is_err()); } #[test] fn test_find_bridge_bin() { let hello_world = MetadataCommand::new() .manifest_path(test_crate_path("hello-world").join("Cargo.toml")) .exec() .unwrap(); assert_eq!( find_bridge(&hello_world, Some(Bindings::Bin), &CargoOptions::default()).unwrap(), BridgeModel::Bin(None) ); assert_eq!( find_bridge(&hello_world, None, &CargoOptions::default()).unwrap(), BridgeModel::Bin(None) ); assert!(find_bridge(&hello_world, Some(Bindings::PyO3), &CargoOptions::default()).is_err()); let pyo3_bin = MetadataCommand::new() .manifest_path(test_crate_path("pyo3-bin").join("Cargo.toml")) .exec() .unwrap(); assert!(matches!( find_bridge(&pyo3_bin, Some(Bindings::Bin), &CargoOptions::default()).unwrap(), BridgeModel::Bin(Some(_)) )); assert!(matches!( find_bridge(&pyo3_bin, None, &CargoOptions::default()).unwrap(), BridgeModel::Bin(Some(_)) )); // `bin-workspace-pyo3-feature` has a pyo3 transitive dependency // gated by a feature, should not select pyo3 bindings let workspace_bin = MetadataCommand::new() .manifest_path( test_crate_path("bin-workspace-pyo3-feature") .join("bin") .join("Cargo.toml"), ) .exec() .unwrap(); assert_eq!( find_bridge( &workspace_bin, Some(Bindings::Bin), &CargoOptions::default() ) .unwrap(), BridgeModel::Bin(None) ); // CLI feature flags must be forwarded to the `cargo tree` // verification: with the `python` feature enabled a scoped build // does compile pyo3, so pyo3 bindings should be selected let workspace_bin_python = MetadataCommand::new() .manifest_path( test_crate_path("bin-workspace-pyo3-feature") .join("bin") .join("Cargo.toml"), ) .features(CargoOpt::SomeFeatures(vec!["python".to_string()])) .exec() .unwrap(); let cargo_options = CargoOptions { features: vec!["python".to_string()], ..Default::default() }; assert!(matches!( find_bridge(&workspace_bin_python, Some(Bindings::Bin), &cargo_options).unwrap(), BridgeModel::Bin(Some(_)) )); } #[test] fn test_find_bridge_conditional_abi3_filtered_by_interpreter() { use crate::bridge::upgrade_bridge_stable_abi; use crate::python_interpreter::InterpreterConfig; // A pyproject.toml with pyo3/abi3-py311 gated on python-version >= 3.11 let pyproject: crate::PyProjectToml = toml::from_str( r#" [build-system] requires = ["maturin"] build-backend = "maturin" [tool.maturin] features = [{ feature = "pyo3/abi3-py311", python-version = ">=3.11" }] "#, ) .unwrap(); // Use pyo3-mixed which has no abi3 in Cargo.toml, so abi3 inference // depends entirely on the conditional pyproject feature. let metadata = MetadataCommand::new() .manifest_path(test_crate_path("pyo3-mixed").join("Cargo.toml")) .exec() .unwrap(); let target = Target::from_resolved_target_triple("x86_64-unknown-linux-gnu").unwrap(); // find_bridge alone never includes conditional features → no abi3 let bridge = find_bridge(&metadata, None, &CargoOptions::default()).unwrap(); assert!( !bridge.has_stable_abi(), "find_bridge should not infer abi3 from conditional features" ); // With a Python 3.10 interpreter, condition doesn't match → no abi3 let py310 = crate::PythonInterpreter::from_config( InterpreterConfig::lookup_one( &target, crate::python_interpreter::InterpreterKind::CPython, (3, 10), "", ) .unwrap(), ); let deps = CrateDependencies::resolve(&metadata, &CargoOptions::default()).unwrap(); let bridge = upgrade_bridge_stable_abi( bridge, &deps, Some(&pyproject), std::slice::from_ref(&py310), ) .unwrap(); assert!( !bridge.has_stable_abi(), "should not infer abi3 for Python 3.10" ); // With a Python 3.11 interpreter, condition matches → abi3 let py311 = crate::PythonInterpreter::from_config( InterpreterConfig::lookup_one( &target, crate::python_interpreter::InterpreterKind::CPython, (3, 11), "", ) .unwrap(), ); let base_bridge = find_bridge(&metadata, None, &CargoOptions::default()).unwrap(); let bridge = upgrade_bridge_stable_abi( base_bridge, &deps, Some(&pyproject), std::slice::from_ref(&py311), ) .unwrap(); assert!(bridge.has_stable_abi(), "should infer abi3 for Python 3.11"); // With mixed interpreters [3.10, 3.11], abi3 IS inferred because // at least one interpreter (3.11) matches the condition. This is safe // because build_stable_abi_wheels splits interpreters by min_version: // 3.10 gets a version-specific wheel, 3.11+ gets the abi3 wheel. let base_bridge = find_bridge(&metadata, None, &CargoOptions::default()).unwrap(); let bridge = upgrade_bridge_stable_abi(base_bridge, &deps, Some(&pyproject), &[py310, py311]) .unwrap(); assert!( bridge.has_stable_abi(), "should infer abi3 for mixed [3.10, 3.11] (build_stable_abi_wheels handles the split)" ); } #[test] fn test_find_single_python_interpreter_not_found() { let target = Target::from_resolved_target_triple("x86_64-unknown-linux-gnu").unwrap(); let bridge = BridgeModel::Cffi; let interpreter = vec![PathBuf::from("nonexistent-python-xyz")]; let resolver = InterpreterResolver::new(&target, &bridge, None, &interpreter, false, false); let result = resolver.resolve(); let err_msg = result.unwrap_err().to_string(); assert_snapshot!(err_msg, @"Failed to find a python interpreter from `nonexistent-python-xyz`"); } } maturin-1.16.0/src/build_orchestrator.rs000066400000000000000000001073061527064705700203350ustar00rootroot00000000000000use crate::auditwheel::{AuditWheelMode, AuditedArtifact, PlatformTag, Policy}; use crate::binding_generator::{ BinBindingGenerator, BindingGenerator, CffiBindingGenerator, Pyo3BindingGenerator, UniFfiBindingGenerator, generate_binding, }; use crate::build_context::finalize_staged_artifacts; use crate::compile::{missing_cdylib_error, missing_cdylib_message, warn_missing_py_init}; use crate::module_writer::{WheelWriter, add_data, write_pth}; use crate::pgo::{PgoContext, PgoPhase}; use crate::sbom::SbomData; use crate::source_distribution::source_distribution; use crate::target::{WheelTag, validate_wheel_filename_for_pypi}; use crate::ui; use crate::util::zip_mtime; use crate::{ BridgeModel, BuildArtifact, BuildContext, BuiltArtifactTag, BuiltWheel, Metadata24, PythonInterpreter, StableAbi, VirtualWriter, compile, pyproject_toml::Format, }; use anyhow::{Context, Result, anyhow, bail}; use cargo_metadata::CrateType; use fs_err as fs; use ignore::overrides::{Override, OverrideBuilder}; use itertools::Itertools; use normpath::PathExt; use pyo3_introspection::{introspect_cdylib, module_stub_files}; use std::collections::{HashMap, HashSet}; use std::path::PathBuf; use std::rc::Rc; use tracing::instrument; /// Orchestrates the build process using the data provided by [BuildContext]. /// /// This struct decouples the high-level build logic (the "verbs") from the /// partitioned data contexts (the "nouns"). pub struct BuildOrchestrator<'a> { context: &'a BuildContext, } impl<'a> BuildOrchestrator<'a> { /// Creates a new orchestrator for the given build context. pub fn new(context: &'a BuildContext) -> Self { Self { context } } /// Returns the underlying build context. pub fn context(&self) -> &BuildContext { self.context } /// Checks which kind of bindings we have (pyo3 or cffi or bin) and calls the /// correct builder. #[instrument(skip_all)] pub fn build_wheels(&self) -> Result> { if self.context.artifact.pgo_command.is_some() { ui::status!("🚀 Starting PGO build..."); PgoContext::find_llvm_profdata()?; } let wheels = self.build_wheels_inner()?; if self.context.artifact.pgo_command.is_some() { ui::status!("🎉 PGO build complete!"); } Ok(wheels) } /// Wrapper around a single wheel build that runs a PGO cycle if needed fn build_single_wheel( &self, instrumentation_python: Option<&PythonInterpreter>, build: F, ) -> Result where F: for<'ctx> Fn(&BuildOrchestrator<'ctx>) -> Result, { let Some(pgo_command) = self.context.artifact.pgo_command.clone() else { return build(self); }; let instrumentation_python = instrumentation_python.context( "PGO builds require a Python interpreter. Please specify one with `--interpreter`.", )?; self.run_pgo_cycle( pgo_command, instrumentation_python, "", |instrumented| Ok(build(instrumented)?.path), |optimized| build(optimized), ) } /// Runs the shared PGO cycle: instrumented build, instrumentation, then optimized build. /// /// `message_prefix` preserves user-visible indentation for per-interpreter PGO output. fn run_pgo_cycle( &self, pgo_command: String, instrumentation_python: &PythonInterpreter, message_prefix: &str, build_instrumented_wheel: BuildInstrumented, build_optimized_wheels: BuildOptimized, ) -> Result where BuildInstrumented: for<'ctx> FnOnce(&BuildOrchestrator<'ctx>) -> Result, BuildOptimized: for<'ctx> FnOnce(&BuildOrchestrator<'ctx>) -> Result, { let pgo_ctx = PgoContext::new(pgo_command)?; ui::status!("{message_prefix}📊 Phase 1/3: Building instrumented wheel..."); let mut instrumented_ctx = self.clone_context_for_pgo(PgoPhase::Generate( pgo_ctx.profdata_dir_path().to_path_buf(), )); let instrumented_out = tempfile::TempDir::new().context("Failed to create temp dir for instrumented wheel")?; instrumented_ctx.artifact.out = instrumented_out.path().to_path_buf(); let instrumented_orchestrator = BuildOrchestrator::new(&instrumented_ctx); let instrumented_wheel_path = build_instrumented_wheel(&instrumented_orchestrator)?; ui::status!("{message_prefix}🔬 Phase 2/3: Running PGO instrumentation..."); pgo_ctx.run_instrumentation( instrumentation_python, &instrumented_wheel_path, self.context, )?; pgo_ctx.merge_profiles()?; ui::status!("{message_prefix}âš¡ Phase 3/3: Building PGO-optimized wheel..."); let optimized_ctx = self.clone_context_for_pgo(PgoPhase::Use(pgo_ctx.merged_profdata_path().to_path_buf())); let optimized_orchestrator = BuildOrchestrator::new(&optimized_ctx); build_optimized_wheels(&optimized_orchestrator) } /// Standard wheel build pipeline (no PGO). #[instrument(skip_all)] pub(crate) fn build_wheels_inner(&self) -> Result> { fs::create_dir_all(&self.context.artifact.out) .context("Failed to create the target directory for the wheels")?; // Generate SBOM data once for all wheels (the Rust dependency graph // is the same regardless of the target Python interpreter). let sbom_data = SbomData::generate(self.context)?; let interpreters: Vec<_> = self.context.python.interpreter.iter().collect(); let wheels = match self.context.project.bridge() { BridgeModel::Bin(None) => vec![ self.build_single_wheel(interpreters.first().copied(), |orchestrator| { orchestrator.build_bin_wheel(None, &sbom_data) })?, ], BridgeModel::Bin(Some(..)) => self.build_bin_wheels(&interpreters, &sbom_data)?, BridgeModel::PyO3(crate::PyO3 { stable_abi, .. }) => match stable_abi { Some(stable_abi) => self.build_stable_abi_wheels(stable_abi, &sbom_data)?, None => self.build_pyo3_wheels(&interpreters, &sbom_data)?, }, BridgeModel::Cffi => vec![self.build_single_wheel( self.context.python.interpreter.first(), |orchestrator| orchestrator.build_cffi_wheel(&sbom_data), )?], BridgeModel::UniFfi => vec![ self.build_single_wheel(interpreters.first().copied(), |orchestrator| { orchestrator.build_uniffi_wheel(&sbom_data) })?, ], }; self.validate_wheels_for_pypi(&wheels)?; Ok(wheels) } /// Validates built wheel filenames against PyPI platform tag rules when /// `--compatibility pypi` validation was requested. fn validate_wheels_for_pypi(&self, wheels: &[BuiltWheel]) -> Result<()> { if self.context.python.pypi_validation { for wheel in wheels { let filename = wheel .path .file_name() .and_then(|name| name.to_str()) .ok_or_else(|| anyhow!("Invalid wheel filename: {:?}", wheel.path))?; if let Err(error) = validate_wheel_filename_for_pypi(filename) { bail!("PyPI validation failed: {}", error); } } } Ok(()) } /// Clone the context with PGO disabled (to prevent recursion) and /// the given PGO phase set. pub(crate) fn clone_context_for_pgo(&self, phase: PgoPhase) -> BuildContext { let mut ctx = self.context.clone(); ctx.artifact.pgo_command = None; ctx.artifact.pgo_phase = Some(phase); ctx } /// Builds a source distribution and returns the same metadata as [BuildOrchestrator::build_wheels] #[instrument(skip_all)] pub fn build_source_distribution(&self) -> Result> { fs::create_dir_all(&self.context.artifact.out) .context("Failed to create the target directory for the source distribution")?; match self.context.project.pyproject_toml.as_ref() { Some(pyproject) => { let sdist_path = source_distribution( &self.context.project, &self.context.artifact, pyproject, self.excludes(Format::Sdist)?, ) .context("Failed to build source distribution")?; Ok(Some(BuiltWheel { path: sdist_path, tag: BuiltArtifactTag::Source, })) } None => Ok(None), } } /// Return the tags of the wheel that this build context builds. pub fn tags_from_bridge(&self) -> Result> { let bridge = self.context.project.bridge(); let tags = match bridge { BridgeModel::PyO3(bindings) | BridgeModel::Bin(Some(bindings)) => { let platform = self .context .project .get_platform_tag(&[PlatformTag::Linux])?; let interp = self .context .python .interpreter .first() .context("no python interpreter resolved for tag computation")?; match bindings.stable_abi { Some(stable_abi) => { let min_version = stable_abi.version.min_version(); let (stable_abi_interps, version_specific_interps): (Vec<_>, Vec<_>) = self .context .python .interpreter .iter() .partition(|interp| bridge.is_stable_abi_for_interpreter(interp)); let abi_tag = stable_abi.kind.wheel_tag(); let stable_abi_tag = stable_abi_interps.first().map(|interp| { let (major, minor) = min_version.unwrap_or((interp.major as u8, interp.minor as u8)); WheelTag::new([format!("cp{major}{minor}")], abi_tag, platform.clone()) }); // Some interpreters in this build may not support the selected stable ABI // family, e.g. 3.14t when abi3t was selected for 3.15. let version_specific_tags = version_specific_interps .iter() .map(|interpreter| { interpreter .get_wheel_tag(&self.context.project, &[PlatformTag::Linux]) }) .collect::>>()?; let tags = stable_abi_tag .into_iter() .chain(version_specific_tags) .collect::>(); if tags.is_empty() { bail!("No compatible Python interpreters found for stable ABI build"); } tags } None => { vec![interp.get_wheel_tag(&self.context.project, &[PlatformTag::Linux])?] } } } BridgeModel::Bin(None) | BridgeModel::Cffi | BridgeModel::UniFfi => { vec![self.get_universal_tag(&[PlatformTag::Linux])?] } }; Ok(tags) } fn add_pth(&self, writer: &mut VirtualWriter) -> Result<()> { if self.context.project.editable { write_pth( writer, &self.context.project.project_layout, &self.context.project.metadata24, )?; } Ok(()) } fn excludes(&self, format: Format) -> Result { let project_dir = match self.context.project.pyproject_toml_path.normalize() { Ok(pyproject_toml_path) => pyproject_toml_path.into_path_buf(), Err(_) => self .context .project .manifest_path .normalize()? .into_path_buf(), }; let mut excludes = OverrideBuilder::new(project_dir.parent().unwrap()); if let Some(pyproject) = self.context.project.pyproject_toml.as_ref() && let Some(glob_patterns) = &pyproject.exclude() { for glob in glob_patterns .iter() .filter_map(|glob_pattern| glob_pattern.targets(format)) { excludes.add(glob)?; } } // Ignore sdist output files so that we don't include them in the sdist if matches!(format, Format::Sdist) { let glob_pattern = format!( "{}{}{}-*.tar.gz", self.context.artifact.out.display(), std::path::MAIN_SEPARATOR, self.context.project.metadata24.get_distribution_escaped(), ); excludes.add(&glob_pattern)?; } Ok(excludes.build()?) } /// Returns the universal Python 3 wheel tag for the given platform tags. fn get_universal_tag(&self, platform_tags: &[PlatformTag]) -> Result { let platform = self.context.project.get_platform_tag(platform_tags)?; Ok(WheelTag::new( ["py3".to_string()], ["none".to_string()], platform, )) } /// Returns user-specified platform tags, or falls back to the auditwheel /// policy tag when no explicit tags were provided. fn resolve_platform_tags(&self, policy: &Policy) -> Vec { if self.context.python.platform_tag.is_empty() { vec![policy.platform_tag()] } else { self.context.python.platform_tag.clone() } } /// Build at most one stable ABI wheel, with non-matching interpreters /// falling back to version-specific wheels. #[instrument(skip_all)] pub(crate) fn build_stable_abi_wheels( &self, stable_abi: &StableAbi, sbom_data: &Option, ) -> Result> { let min_version = stable_abi.version.min_version(); // With mixed abi3 and abi3t features, selecting abi3t for a 3.15+ // interpreter intentionally sends older interpreters to version-specific wheels. let bridge = self.context.project.bridge(); let (stable_abi_interps, version_specific_abi_interps): (Vec<_>, Vec<_>) = self .context .python .interpreter .iter() .partition(|interp| bridge.is_stable_abi_for_interpreter(interp)); if stable_abi_interps.is_empty() && version_specific_abi_interps.is_empty() { let interp_names: Vec<_> = self .context .python .interpreter .iter() .map(|interp| { format!( "{} {}.{}", interp.interpreter_kind, interp.major, interp.minor ) }) .collect(); if let Some((major, minor)) = stable_abi.version.min_version() { bail!( "None of the found Python interpreters ({}) are compatible with the {} \ minimum version (>= {}.{}). Please install a compatible Python interpreter.", interp_names.join(", "), stable_abi.kind, major, minor, ); } else { bail!( "No compatible Python interpreters found for {} build. \ Found: {}", stable_abi.kind, interp_names.join(", "), ); } } let mut built_wheels = Vec::new(); if let Some(first) = stable_abi_interps.first() { let (major, minor) = min_version.unwrap_or((first.major as u8, first.minor as u8)); built_wheels.push(self.build_single_wheel(Some(first), |orchestrator| { orchestrator.build_pyo3_wheel_stable_abi( &stable_abi_interps, *stable_abi, major, minor, sbom_data, ) })?); } if !version_specific_abi_interps.is_empty() { let interp_names: HashSet<_> = version_specific_abi_interps .iter() .map(|interp| interp.to_string()) .collect(); ui::warning!( "âš ï¸� Warning: {} does not yet support {} so the build artifacts will be version-specific.", stable_abi.kind, interp_names.iter().join(", ") ); built_wheels.extend(self.build_pyo3_wheels(&version_specific_abi_interps, sbom_data)?); } Ok(built_wheels) } /// Single shared wheel-writing pipeline used by extension and binary wheels. /// /// `metadata24` is a parameter because binary wheels write a locally mutated metadata copy. #[allow(clippy::too_many_arguments)] fn write_wheel_inner( &self, tag: &WheelTag, metadata24: &Metadata24, audited: &mut [AuditedArtifact], use_external_lib_shim: bool, make_generator: F, sbom_data: &Option, out_dirs: &HashMap, ) -> Result where F: FnOnce(Rc) -> Result, G: BindingGenerator, { let file_options = self .context .artifact .compression .get_file_options() .last_modified_time(zip_mtime()); let tag_string = tag.to_string(); let writer = WheelWriter::new( &tag_string, &self.context.artifact.out, metadata24, file_options, )?; let mut writer = VirtualWriter::new(writer, self.excludes(Format::Wheel)?); self.context .add_external_libs(&mut writer, audited, use_external_lib_shim)?; let temp_dir = writer.temp_dir()?; let mut generator = make_generator(temp_dir)?; generate_binding(&mut writer, &mut generator, self.context, audited, out_dirs) .context("Failed to add the files to the wheel")?; self.add_pth(&mut writer)?; add_data( &mut writer, metadata24, self.context.project.project_layout.data.as_deref(), )?; SbomData::write( sbom_data.as_ref(), self.context, &mut writer, &metadata24.get_dist_info_dir(), )?; let wheel_path = writer.finish( metadata24, &self.context.project.project_layout.project_root, std::slice::from_ref(tag), )?; finalize_staged_artifacts(audited); Ok(wheel_path) } /// The extension-wheel writing loop. Handles metadata generation, file compression, /// and writing the final .whl archive to the output directory. fn write_wheel( &self, tag: &WheelTag, audited: &mut [AuditedArtifact], make_generator: F, sbom_data: &Option, out_dirs: &HashMap, ) -> Result where F: FnOnce(Rc) -> Result, G: BindingGenerator, { self.write_wheel_inner( tag, &self.context.project.metadata24, audited, false, make_generator, sbom_data, out_dirs, ) } /// For abi3 and abi3t we only need to build a single wheel and we don't /// even need a python interpreter for it #[instrument(skip_all)] pub(crate) fn build_pyo3_wheel_stable_abi( &self, interpreters: &[&PythonInterpreter], stable_abi: StableAbi, major: u8, min_minor: u8, sbom_data: &Option, ) -> Result { let python_interpreter = interpreters.first().copied(); let (audited_artifact, policy, out_dirs) = self.compile_and_audit( python_interpreter, Some(&self.context.project.project_layout.extension_name), )?; let platform_tags = self.resolve_platform_tags(&policy); let platform = self.context.project.get_platform_tag(&platform_tags)?; let abi_tag = stable_abi.kind.wheel_tag(); let tag = WheelTag::new([format!("cp{major}{min_minor}")], abi_tag, platform); let mut audited = [audited_artifact]; let wheel_path = self.write_wheel( &tag, &mut audited, |temp_dir| { Ok(Pyo3BindingGenerator::new_stable_abi( stable_abi.kind, (major, min_minor), python_interpreter, temp_dir, )) }, sbom_data, &out_dirs, )?; ui::status!( "📦 Built wheel for {} Python ≥ {}.{} to {}", stable_abi.kind, major, min_minor, wheel_path.display() ); Ok(BuiltWheel { path: wheel_path, tag: BuiltArtifactTag::interpreter(tag.python().clone()), }) } /// Writes a PyO3 wheel for a specific Python interpreter. fn write_pyo3_wheel( &self, python_interpreter: &PythonInterpreter, audited: &mut [AuditedArtifact], platform_tags: &[PlatformTag], sbom_data: &Option, out_dirs: &HashMap, ) -> Result<(PathBuf, WheelTag)> { let tag = python_interpreter.get_wheel_tag(&self.context.project, platform_tags)?; let path = self.write_wheel( &tag, audited, |temp_dir| { Ok(Pyo3BindingGenerator::new_version_specific( python_interpreter, temp_dir, )) }, sbom_data, out_dirs, )?; Ok((path, tag)) } /// Compile, audit, and write a single PyO3 wheel for one interpreter. #[instrument(skip_all)] pub(crate) fn build_single_pyo3_wheel( &self, python_interpreter: &PythonInterpreter, sbom_data: &Option, ) -> Result { let (audited_artifact, policy, out_dirs) = self.compile_and_audit( Some(python_interpreter), Some(&self.context.project.project_layout.extension_name), )?; let platform_tags = self.resolve_platform_tags(&policy); let mut audited = [audited_artifact]; let (wheel_path, tag) = self.write_pyo3_wheel( python_interpreter, &mut audited, &platform_tags, sbom_data, &out_dirs, )?; Ok(BuiltWheel { path: wheel_path, tag: BuiltArtifactTag::interpreter(tag.python().clone()), }) } /// Builds wheels for a pyo3 extension for all given python versions. #[instrument(skip_all)] pub(crate) fn build_pyo3_wheels( &self, interpreters: &[&PythonInterpreter], sbom_data: &Option, ) -> Result> { let mut wheels = Vec::new(); for &python_interpreter in interpreters { let wheel = self.build_single_wheel(Some(python_interpreter), |orchestrator| { orchestrator.build_single_pyo3_wheel(python_interpreter, sbom_data) })?; ui::status!( "📦 Built wheel for {} {}.{}{} to {}", python_interpreter.interpreter_kind, python_interpreter.major, python_interpreter.minor, python_interpreter.abiflags, wheel.path.display() ); wheels.push(wheel); } Ok(wheels) } /// Runs cargo build, extracts the cdylib from the output and returns the path to it #[instrument(skip_all)] pub(crate) fn compile_cdylib( &self, python_interpreter: Option<&PythonInterpreter>, extension_name: Option<&str>, ) -> Result<(BuildArtifact, HashMap)> { let result = compile( self.context, python_interpreter, &self.context.project.compile_targets, ) .context("Failed to build a native library through cargo")?; let artifacts = result .artifacts .first() .with_context(|| missing_cdylib_message(None))?; let mut artifact = artifacts .get(&CrateType::CDyLib) .cloned() .ok_or_else(|| missing_cdylib_error(None))?; self.context.stage_artifact(&mut artifact)?; if let Some(extension_name) = extension_name { let _ = warn_missing_py_init(&artifact.path, extension_name); } Ok((artifact, result.out_dirs)) } /// Compiles the cdylib, runs auditwheel, and bundles the audited artifact, /// selected policy, and OUT_DIR map for wheel writing. fn compile_and_audit( &self, python_interpreter: Option<&PythonInterpreter>, extension_name: Option<&str>, ) -> Result<(AuditedArtifact, Policy, HashMap)> { let (artifact, out_dirs) = self.compile_cdylib(python_interpreter, extension_name)?; let audit_result = self.context.auditwheel( &artifact, &self.context.python.platform_tag, python_interpreter, )?; Ok(( AuditedArtifact { artifact, external_libs: audit_result.external_libs, arch_requirements: audit_result.arch_requirements, }, audit_result.policy, out_dirs, )) } /// Compiles a cdylib and builds a wheel for it. fn build_cdylib_wheel( &self, make_generator: F, sbom_data: &Option, ) -> Result<(PathBuf, HashMap)> where F: FnOnce(Rc) -> Result, G: BindingGenerator, { let (audited_artifact, policy, out_dirs) = self.compile_and_audit(None, None)?; let platform_tags = self.resolve_platform_tags(&policy); let tag = self.get_universal_tag(&platform_tags)?; let mut audited = [audited_artifact]; let wheel_path = self.write_wheel(&tag, &mut audited, make_generator, sbom_data, &out_dirs)?; Ok((wheel_path, out_dirs)) } /// Builds a wheel with cffi bindings #[instrument(skip_all)] fn build_cffi_wheel(&self, sbom_data: &Option) -> Result { let interpreter = self.context.python.interpreter.first().ok_or_else(|| { anyhow!("A python interpreter is required for cffi builds but one was not provided") })?; let (wheel_path, _) = self.build_cdylib_wheel( |temp_dir| { CffiBindingGenerator::new(interpreter, temp_dir) .context("Failed to initialize Cffi binding generator") }, sbom_data, )?; if !self .context .project .metadata24 .requires_dist .iter() .any(|requirement| requirement.name.as_ref() == "cffi") { ui::warning!( "âš ï¸� Warning: missing cffi package dependency, please add it to pyproject.toml. \ e.g: `dependencies = [\"cffi\"]`. This will become an error." ); } ui::status!("📦 Built wheel to {}", wheel_path.display()); Ok(BuiltWheel { path: wheel_path, tag: BuiltArtifactTag::Universal, }) } /// Builds a wheel with uniffi bindings #[instrument(skip_all)] fn build_uniffi_wheel(&self, sbom_data: &Option) -> Result { let (wheel_path, _) = self.build_cdylib_wheel(|_temp_dir| Ok(UniFfiBindingGenerator::default()), sbom_data)?; ui::status!("📦 Built wheel to {}", wheel_path.display()); Ok(BuiltWheel { path: wheel_path, tag: BuiltArtifactTag::Universal, }) } /// Internal implementation for writing a binary wheel. fn write_bin_wheel( &self, python_interpreter: Option<&PythonInterpreter>, audited: &mut [AuditedArtifact], platform_tags: &[PlatformTag], sbom_data: &Option, out_dirs: &HashMap, ) -> Result<(PathBuf, WheelTag)> { if !self.context.project.metadata24.scripts.is_empty() { bail!("Defining scripts and working with a binary doesn't mix well"); } if self.context.project.target.is_wasi() { ui::warning!("âš ï¸� Warning: wasi support is experimental"); if !self.context.project.metadata24.entry_points.is_empty() { bail!("You can't define entrypoints yourself for a binary project"); } if self.context.project.project_layout.python_module.is_some() { bail!("Sorry, adding python code to a wasm binary is currently not supported") } } let tag = match (self.context.project.bridge(), python_interpreter) { (BridgeModel::Bin(None), _) => self.get_universal_tag(platform_tags)?, (BridgeModel::Bin(Some(..)), Some(python_interpreter)) => { python_interpreter.get_wheel_tag(&self.context.project, platform_tags)? } _ => unreachable!(), }; let mut metadata24 = self.context.project.metadata24.clone(); // When repair mode bundles external shared library dependencies, use // the shim approach: move the real binary to {dist}.scripts/ in // platlib (where it has a predictable relative path to the bundled // libs directory) and place a Python shim in .data/scripts/ that execs // the real binary. // WASI targets use their own launcher mechanism and cannot be shimmed. let has_external_libs = audited.iter().any(|a| !a.external_libs.is_empty()); let use_shim = should_use_bin_shim( self.context.python.auditwheel, self.context.project.target.is_wasi(), has_external_libs, ); BinBindingGenerator::prepare_metadata(&mut metadata24, self.context, audited) .context("Failed to add the files to the wheel")?; let path = self.write_wheel_inner( &tag, &metadata24, audited, use_shim, |_temp_dir| Ok(BinBindingGenerator::new(&metadata24, use_shim)), sbom_data, out_dirs, )?; Ok((path, tag)) } /// Builds a wheel that contains a binary #[instrument(skip_all)] fn build_bin_wheel( &self, python_interpreter: Option<&PythonInterpreter>, sbom_data: &Option, ) -> Result { let result = compile( self.context, python_interpreter, &self.context.project.compile_targets, ) .context("Failed to build a native library through cargo")?; if result.artifacts.is_empty() { bail!("Cargo didn't build a binary") } let mut policies = Vec::with_capacity(result.artifacts.len()); let mut audited_artifacts = Vec::new(); for artifact in result.artifacts { let mut artifact = artifact .get(&CrateType::Bin) .cloned() .ok_or_else(|| anyhow!("Cargo didn't build a binary"))?; let audit_result = self.context .auditwheel(&artifact, &self.context.python.platform_tag, None)?; policies.push(audit_result.policy); self.context.stage_artifact(&mut artifact)?; audited_artifacts.push(AuditedArtifact { artifact, external_libs: audit_result.external_libs, arch_requirements: audit_result.arch_requirements, }); } let policy = policies.iter().min_by_key(|p| p.priority).unwrap(); let platform_tags = self.resolve_platform_tags(policy); let (wheel_path, tag) = self.write_bin_wheel( python_interpreter, &mut audited_artifacts, &platform_tags, sbom_data, &result.out_dirs, )?; ui::status!("📦 Built wheel to {}", wheel_path.display()); // Interpreter-bound binary wheels (pyo3-bin) carry a real python tag; pure // standalone bins remain universal (`py3`). let artifact_tag = if python_interpreter.is_some() { BuiltArtifactTag::interpreter(tag.python().clone()) } else { BuiltArtifactTag::Universal }; Ok(BuiltWheel { path: wheel_path, tag: artifact_tag, }) } /// Builds wheels for a binary project for all given python versions. #[instrument(skip_all)] pub(crate) fn build_bin_wheels( &self, interpreters: &[&PythonInterpreter], sbom_data: &Option, ) -> Result> { let mut wheels = Vec::new(); for &python_interpreter in interpreters { wheels.push( self.build_single_wheel(Some(python_interpreter), |orchestrator| { orchestrator.build_bin_wheel(Some(python_interpreter), sbom_data) })?, ); } Ok(wheels) } /// Generate stub files by building the project then extracting the stubs from the build output #[instrument(skip_all)] pub fn generate_stubs(&self) -> Result> { match self.context.project.bridge() { BridgeModel::PyO3(_) => { let python_interpreter = self.context.python.interpreter.first(); let extension_name = &self.context.project.project_layout.extension_name; let (artifact, _) = self.compile_cdylib(python_interpreter, Some(extension_name))?; let module_introspection = introspect_cdylib(&artifact.path, extension_name).context("Failed to introspect the built libraries to generate type stubs, have you enabled the \"experimental-inspect\" PyO3 Cargo feature?")?; Ok(module_stub_files(&module_introspection)) } _ => bail!("Stub generation is only possible in PyO3 projects"), } } } fn should_use_bin_shim(auditwheel: AuditWheelMode, is_wasi: bool, has_external_libs: bool) -> bool { matches!(auditwheel, AuditWheelMode::Repair) && !is_wasi && has_external_libs } #[cfg(test)] mod tests { use super::should_use_bin_shim; use crate::auditwheel::AuditWheelMode; #[test] fn test_should_use_bin_shim_only_for_repair_with_external_libs() { assert!(should_use_bin_shim(AuditWheelMode::Repair, false, true)); assert!(!should_use_bin_shim(AuditWheelMode::Warn, false, true)); assert!(!should_use_bin_shim(AuditWheelMode::Check, false, true)); assert!(!should_use_bin_shim(AuditWheelMode::Skip, false, true)); assert!(!should_use_bin_shim(AuditWheelMode::Repair, true, true)); assert!(!should_use_bin_shim(AuditWheelMode::Repair, false, false)); } } maturin-1.16.0/src/cargo_options.rs000066400000000000000000000307321527064705700173030ustar00rootroot00000000000000use crate::pyproject_toml::{FeatureSpec, ToolMaturin}; use anyhow::Result; use cargo_options::heading; use serde::{Deserialize, Serialize}; use std::path::PathBuf; use std::str::FromStr; /// A Rust target triple or a virtual target triple. #[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)] pub enum TargetTriple { /// The virtual `universal2-apple-darwin` target triple, build a fat binary of /// `aarch64-apple-darwin` and `x86_64-apple-darwin`. Universal2, /// Any target triple supported by Rust. /// /// It's not guaranteed that the value exists, it's passed verbatim to Cargo. Regular(String), } impl FromStr for TargetTriple { // TODO: Use the never type once stabilized type Err = String; fn from_str(triple: &str) -> std::result::Result { match triple { "universal2-apple-darwin" => Ok(TargetTriple::Universal2), triple => Ok(TargetTriple::Regular(triple.to_string())), } } } /// Cargo options for the build process #[derive(Debug, Default, Serialize, Deserialize, clap::Parser, Clone, Eq, PartialEq)] #[serde(default, rename_all = "kebab-case")] pub struct CargoOptions { /// Do not print cargo log messages #[arg(short = 'q', long)] pub quiet: bool, /// Number of parallel jobs, defaults to # of CPUs #[arg(short = 'j', long, value_name = "N", help_heading = heading::COMPILATION_OPTIONS)] pub jobs: Option, /// Build artifacts with the specified Cargo profile #[arg(long, value_name = "PROFILE-NAME", help_heading = heading::COMPILATION_OPTIONS)] pub profile: Option, /// Space or comma separated list of features to activate #[arg( short = 'F', long, action = clap::ArgAction::Append, help_heading = heading::FEATURE_SELECTION, )] pub features: Vec, /// Activate all available features #[arg(long, help_heading = heading::FEATURE_SELECTION)] pub all_features: bool, /// Do not activate the `default` feature #[arg(long, help_heading = heading::FEATURE_SELECTION)] pub no_default_features: bool, /// Build for the target triple #[arg( long, value_name = "TRIPLE", env = "CARGO_BUILD_TARGET", help_heading = heading::COMPILATION_OPTIONS, )] pub target: Option, /// Directory for all generated artifacts #[arg(long, value_name = "DIRECTORY", help_heading = heading::COMPILATION_OPTIONS)] pub target_dir: Option, /// Path to Cargo.toml #[arg(short = 'm', long, value_name = "PATH", help_heading = heading::MANIFEST_OPTIONS)] pub manifest_path: Option, /// Ignore `rust-version` specification in packages #[arg(long)] pub ignore_rust_version: bool, /// Use verbose output (-vv very verbose/build.rs output) // Note that this duplicates the global option, but clap seems to be fine with that. #[arg(short = 'v', long, action = clap::ArgAction::Count)] pub verbose: u8, /// Coloring: auto, always, never #[arg(long, value_name = "WHEN")] pub color: Option, /// Require Cargo.lock and cache are up to date #[arg(long, help_heading = heading::MANIFEST_OPTIONS)] pub frozen: bool, /// Require Cargo.lock is up to date #[arg(long, help_heading = heading::MANIFEST_OPTIONS)] pub locked: bool, /// Run without accessing the network #[arg(long, help_heading = heading::MANIFEST_OPTIONS)] pub offline: bool, /// Override a configuration value (unstable) #[arg(long, value_name = "KEY=VALUE", action = clap::ArgAction::Append)] pub config: Vec, /// Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details #[arg(short = 'Z', value_name = "FLAG", action = clap::ArgAction::Append)] pub unstable_flags: Vec, /// Output a build timing report at the end of the build #[arg(long, help_heading = heading::COMPILATION_OPTIONS)] pub timings: bool, /// Outputs a future incompatibility report at the end of the build (unstable) #[arg(long)] pub future_incompat_report: bool, /// Rustc flags #[arg(num_args = 0.., trailing_var_arg = true)] pub args: Vec, } impl CargoOptions { /// Extract `cargo metadata` extra arguments from the cargo options. pub fn cargo_metadata_args(&self) -> Result> { let platform_args = match &self.target { Some(TargetTriple::Universal2) => vec![ "--filter-platform".to_string(), "aarch64-apple-darwin".to_string(), "--filter-platform".to_string(), "x86_64-apple-darwin".to_string(), ], Some(TargetTriple::Regular(target)) => { vec!["--filter-platform".to_string(), target.clone()] } None => vec![], }; Ok(self.resolve_args(platform_args)) } /// Extract `cargo tree` extra arguments from the cargo options. /// /// Mirrors [`CargoOptions::cargo_metadata_args`], except that platform /// filtering uses `cargo tree`'s `--target` flag; without an explicit /// target, `--target all` matches `cargo metadata`'s unfiltered resolve. pub fn cargo_tree_args(&self) -> Vec { let platform_args = match &self.target { Some(TargetTriple::Universal2) => vec![ "--target".to_string(), "aarch64-apple-darwin".to_string(), "--target".to_string(), "x86_64-apple-darwin".to_string(), ], Some(TargetTriple::Regular(target)) => { vec!["--target".to_string(), target.clone()] } None => vec!["--target".to_string(), "all".to_string()], }; self.resolve_args(platform_args) } /// Dependency resolution arguments shared by `cargo metadata` and /// `cargo tree`, with the command-specific platform arguments in between. fn resolve_args(&self, platform_args: Vec) -> Vec { let mut args = vec![]; if self.frozen { args.push("--frozen".to_string()); } if self.locked { args.push("--locked".to_string()); } if self.offline { args.push("--offline".to_string()); } for feature in &self.features { args.push("--features".to_string()); args.push(feature.clone()); } if self.all_features { args.push("--all-features".to_string()); } if self.no_default_features { args.push("--no-default-features".to_string()); } args.extend(platform_args); for opt in &self.unstable_flags { args.push("-Z".to_string()); args.push(opt.clone()); } args } /// Convert the Cargo options into a Cargo invocation. pub fn into_rustc_options(self, target_triple: Option) -> cargo_options::Rustc { cargo_options::Rustc { common: cargo_options::CommonOptions { quiet: self.quiet, jobs: self.jobs, profile: self.profile, features: self.features, all_features: self.all_features, no_default_features: self.no_default_features, target: if let Some(target) = target_triple { vec![target] } else { Vec::new() }, target_dir: self.target_dir, verbose: self.verbose, color: self.color, frozen: self.frozen, locked: self.locked, offline: self.offline, config: self.config, unstable_flags: self.unstable_flags, timings: self.timings, ..Default::default() }, manifest_path: self.manifest_path, ignore_rust_version: self.ignore_rust_version, future_incompat_report: self.future_incompat_report, args: self.args, ..Default::default() } } /// Merge options from pyproject.toml pub fn merge_with_pyproject_toml( &mut self, tool_maturin: ToolMaturin, editable_install: bool, ) -> Vec<&'static str> { let mut args_from_pyproject = Vec::new(); if self.manifest_path.is_none() && tool_maturin.manifest_path.is_some() { self.manifest_path.clone_from(&tool_maturin.manifest_path); args_from_pyproject.push("manifest-path"); } if self.profile.is_none() { // For `maturin` v1 compatibility, `editable-profile` falls back to `profile` if unset. // TODO: on `maturin` v2, consider defaulting to "dev" profile for editable installs, // and potentially remove this fallback behavior. let (tool_profile, source_variable) = if editable_install && tool_maturin.editable_profile.is_some() { (tool_maturin.editable_profile.as_ref(), "editable-profile") } else { (tool_maturin.profile.as_ref(), "profile") }; if let Some(tool_profile) = tool_profile { self.profile = Some(tool_profile.clone()); args_from_pyproject.push(source_variable); } } if let Some(feature_specs) = tool_maturin.features && self.features.is_empty() { let (plain, _conditional) = FeatureSpec::split(feature_specs); self.features = plain; args_from_pyproject.push("features"); } if let Some(all_features) = tool_maturin.all_features && !self.all_features { self.all_features = all_features; args_from_pyproject.push("all-features"); } if let Some(no_default_features) = tool_maturin.no_default_features && !self.no_default_features { self.no_default_features = no_default_features; args_from_pyproject.push("no-default-features"); } if let Some(frozen) = tool_maturin.frozen && !self.frozen { self.frozen = frozen; args_from_pyproject.push("frozen"); } if let Some(locked) = tool_maturin.locked && !self.locked { self.locked = locked; args_from_pyproject.push("locked"); } if let Some(config) = tool_maturin.config && self.config.is_empty() { self.config = config; args_from_pyproject.push("config"); } if let Some(unstable_flags) = tool_maturin.unstable_flags && self.unstable_flags.is_empty() { self.unstable_flags = unstable_flags; args_from_pyproject.push("unstable-flags"); } args_from_pyproject } } #[cfg(test)] mod tests { use super::*; #[test] fn test_old_extra_feature_args() { let cargo_extra_args = CargoOptions { no_default_features: true, features: vec!["a".to_string(), "c".to_string()], target: Some(TargetTriple::Regular( "x86_64-unknown-linux-musl".to_string(), )), ..Default::default() }; let cargo_metadata_extra_args = cargo_extra_args.cargo_metadata_args().unwrap(); assert_eq!( cargo_metadata_extra_args, vec![ "--features", "a", "--features", "c", "--no-default-features", "--filter-platform", "x86_64-unknown-linux-musl", ] ); } #[test] fn test_extract_cargo_metadata_args() { let args = CargoOptions { locked: true, features: vec!["my-feature".to_string(), "other-feature".to_string()], target: Some(TargetTriple::Regular( "x86_64-unknown-linux-musl".to_string(), )), unstable_flags: vec!["unstable-options".to_string()], ..Default::default() }; let expected = vec![ "--locked", "--features", "my-feature", "--features", "other-feature", "--filter-platform", "x86_64-unknown-linux-musl", "-Z", "unstable-options", ]; assert_eq!(args.cargo_metadata_args().unwrap(), expected); } } maturin-1.16.0/src/cargo_toml.rs000066400000000000000000000124401527064705700165570ustar00rootroot00000000000000use anyhow::{Context, Result, bail}; use fs_err as fs; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::path::Path; /// The `[lib]` section of a Cargo.toml #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(rename_all = "kebab-case")] pub(crate) struct CargoTomlLib { pub(crate) crate_type: Option>, pub(crate) name: Option, } /// The `[package]` section of a Cargo.toml #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(rename_all = "kebab-case")] pub(crate) struct CargoTomlPackage { pub(crate) name: String, metadata: Option, } /// Extract of the Cargo.toml that can be reused for the python metadata /// /// See https://doc.rust-lang.org/cargo/reference/manifest.html for a specification #[derive(Serialize, Deserialize, Debug, Clone)] pub struct CargoToml { pub(crate) lib: Option, pub(crate) package: CargoTomlPackage, } impl CargoToml { /// Reads and parses the Cargo.toml at the given location pub fn from_path(manifest_file: impl AsRef) -> Result { let contents = fs::read_to_string(&manifest_file).context(format!( "Can't read Cargo.toml at {}", manifest_file.as_ref().display(), ))?; let cargo_toml = toml::from_str(&contents).context(format!( "Failed to parse Cargo.toml at {}", manifest_file.as_ref().display() ))?; Ok(cargo_toml) } /// Returns the value of `[project.metadata.maturin]` or an empty stub pub fn remaining_core_metadata(&self) -> RemainingCoreMetadata { match &self.package.metadata { Some(CargoTomlMetadata { maturin: Some(extra_metadata), }) => extra_metadata.clone(), _ => Default::default(), } } /// Check removed python metadata support in `Cargo.toml` pub fn check_removed_python_metadata(&self) -> Result<()> { let mut removed = Vec::new(); if let Some(CargoTomlMetadata { maturin: Some(extra_metadata), }) = &self.package.metadata { let removed_keys = [ "scripts", "classifiers", "classifier", "data", "maintainer", "maintainer-email", "requires-dist", "requires-python", "requires-external", "project-url", "provides-extra", "description-content-type", ]; for key in removed_keys { if extra_metadata.other.contains_key(key) { removed.push(key); } } } if !removed.is_empty() { bail!( "The following metadata fields in `package.metadata.maturin` section \ of Cargo.toml are removed since maturin 0.14.0: {}, \ please set them in pyproject.toml as PEP 621 specifies.", removed.join(", ") ); } Ok(()) } } #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(rename_all = "kebab-case")] struct CargoTomlMetadata { maturin: Option, } /// The `[project.metadata.maturin]` with the maturin specific metadata #[derive(Serialize, Deserialize, Debug, Clone, Default)] #[serde(rename_all = "kebab-case")] pub struct RemainingCoreMetadata { #[serde(flatten)] pub other: HashMap, } #[cfg(test)] mod tests { use super::*; use indoc::indoc; #[test] fn test_metadata_from_cargo_toml() { let cargo_toml = indoc!( r#" [package] authors = ["konstin "] name = "info-project" version = "0.1.0" description = "A test project" homepage = "https://example.org" keywords = ["ffi", "test"] [lib] crate-type = ["cdylib"] name = "pyo3_pure" [package.metadata.maturin.scripts] ph = "maturin:print_hello" [package.metadata.maturin] classifiers = ["Programming Language :: Python"] requires-dist = ["flask~=1.1.0", "toml==0.10.0"] [[package.metadata.maturin.targets]] name = "pyo3_pure" kind = "lib" bindings = "pyo3" "# ); let cargo_toml: Result = toml::from_str(cargo_toml); assert!(cargo_toml.is_ok()); } #[test] fn test_metadata_from_cargo_toml_without_authors() { let cargo_toml = indoc!( r#" [package] name = "info-project" version = "0.1.0" description = "A test project" homepage = "https://example.org" keywords = ["ffi", "test"] [lib] crate-type = ["cdylib"] name = "pyo3_pure" [package.metadata.maturin.scripts] ph = "maturin:print_hello" [package.metadata.maturin] classifiers = ["Programming Language :: Python"] requires-dist = ["flask~=1.1.0", "toml==0.10.0"] "# ); let cargo_toml: Result = toml::from_str(cargo_toml); assert!(cargo_toml.is_ok()); } } maturin-1.16.0/src/ci/000077500000000000000000000000001527064705700144555ustar00rootroot00000000000000maturin-1.16.0/src/ci/github/000077500000000000000000000000001527064705700157375ustar00rootroot00000000000000maturin-1.16.0/src/ci/github/__snapshot__/000077500000000000000000000000001527064705700203725ustar00rootroot00000000000000maturin-1.16.0/src/ci/github/__snapshot__/github_abi3.yml000066400000000000000000000135271527064705700233050ustar00rootroot00000000000000name: CI on: push: branches: - main - master tags: - '*' pull_request: workflow_dispatch: permissions: contents: read jobs: linux: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: ubuntu-22.04 target: x86_64 - runner: ubuntu-22.04 target: x86 - runner: ubuntu-22.04 target: aarch64 - runner: ubuntu-22.04 target: armv7 - runner: ubuntu-22.04 target: s390x - runner: ubuntu-22.04 target: ppc64le steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.x" - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: auto - name: Build free-threaded wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist -i python3.14t sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: auto - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-linux-${{ matrix.platform.target }} path: dist musllinux: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: ubuntu-22.04 target: x86_64 - runner: ubuntu-22.04 target: x86 - runner: ubuntu-22.04 target: aarch64 - runner: ubuntu-22.04 target: armv7 steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.x" - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: musllinux_1_2 - name: Build free-threaded wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist -i python3.14t sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: musllinux_1_2 - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-musllinux-${{ matrix.platform.target }} path: dist windows: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: windows-latest target: x64 python_arch: x64 - runner: windows-latest target: x86 python_arch: x86 - runner: windows-11-arm target: aarch64 python_arch: arm64 steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.13" architecture: ${{ matrix.platform.python_arch }} - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - uses: actions/setup-python@v6 with: python-version: "3.14t" architecture: ${{ matrix.platform.python_arch }} - name: Build free-threaded wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist -i python3.14t sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-windows-${{ matrix.platform.target }} path: dist macos: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: macos-15-intel target: x86_64 - runner: macos-latest target: aarch64 steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.x" - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - uses: actions/setup-python@v6 with: python-version: "3.14t" - name: Build free-threaded wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist -i python3.14t sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-macos-${{ matrix.platform.target }} path: dist release: name: Release runs-on: ubuntu-latest if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }} needs: [linux, musllinux, windows, macos] permissions: # Use to sign the release artifacts id-token: write # Used to upload release artifacts contents: write # Used to generate artifact attestation attestations: write steps: - uses: actions/download-artifact@v7 - name: Generate artifact attestation uses: actions/attest@v4 with: subject-path: 'wheels-*/*' - name: Install uv if: ${{ startsWith(github.ref, 'refs/tags/') }} uses: astral-sh/setup-uv@v7 - name: Publish to PyPI if: ${{ startsWith(github.ref, 'refs/tags/') }} run: uv publish 'wheels-*/*' env: UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }} maturin-1.16.0/src/ci/github/__snapshot__/github_bin_no_binding.yml000066400000000000000000000110051527064705700254120ustar00rootroot00000000000000name: CI on: push: branches: - main - master tags: - '*' pull_request: workflow_dispatch: permissions: contents: read jobs: linux: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: ubuntu-22.04 target: x86_64 - runner: ubuntu-22.04 target: x86 - runner: ubuntu-22.04 target: aarch64 - runner: ubuntu-22.04 target: armv7 - runner: ubuntu-22.04 target: s390x - runner: ubuntu-22.04 target: ppc64le steps: - uses: actions/checkout@v6 - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: auto - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-linux-${{ matrix.platform.target }} path: dist musllinux: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: ubuntu-22.04 target: x86_64 - runner: ubuntu-22.04 target: x86 - runner: ubuntu-22.04 target: aarch64 - runner: ubuntu-22.04 target: armv7 steps: - uses: actions/checkout@v6 - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: musllinux_1_2 - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-musllinux-${{ matrix.platform.target }} path: dist windows: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: windows-latest target: x64 python_arch: x64 - runner: windows-latest target: x86 python_arch: x86 - runner: windows-11-arm target: aarch64 python_arch: arm64 steps: - uses: actions/checkout@v6 - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-windows-${{ matrix.platform.target }} path: dist macos: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: macos-15-intel target: x86_64 - runner: macos-latest target: aarch64 steps: - uses: actions/checkout@v6 - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-macos-${{ matrix.platform.target }} path: dist sdist: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Build sdist uses: PyO3/maturin-action@v1 with: command: sdist args: --out dist - name: Upload sdist uses: actions/upload-artifact@v6 with: name: wheels-sdist path: dist release: name: Release runs-on: ubuntu-latest if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }} needs: [linux, musllinux, windows, macos, sdist] permissions: # Use to sign the release artifacts id-token: write # Used to upload release artifacts contents: write # Used to generate artifact attestation attestations: write steps: - uses: actions/download-artifact@v7 - name: Generate artifact attestation uses: actions/attest@v4 with: subject-path: 'wheels-*/*' - name: Install uv if: ${{ startsWith(github.ref, 'refs/tags/') }} uses: astral-sh/setup-uv@v7 - name: Publish to PyPI if: ${{ startsWith(github.ref, 'refs/tags/') }} run: uv publish 'wheels-*/*' env: UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }} maturin-1.16.0/src/ci/github/__snapshot__/github_default.yml000066400000000000000000000117351527064705700241120ustar00rootroot00000000000000name: CI on: push: branches: - main - master tags: - '*' pull_request: workflow_dispatch: permissions: contents: read jobs: linux: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: ubuntu-22.04 target: x86_64 - runner: ubuntu-22.04 target: x86 - runner: ubuntu-22.04 target: aarch64 - runner: ubuntu-22.04 target: armv7 - runner: ubuntu-22.04 target: s390x - runner: ubuntu-22.04 target: ppc64le steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.x" - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist --find-interpreter sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: auto - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-linux-${{ matrix.platform.target }} path: dist musllinux: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: ubuntu-22.04 target: x86_64 - runner: ubuntu-22.04 target: x86 - runner: ubuntu-22.04 target: aarch64 - runner: ubuntu-22.04 target: armv7 steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.x" - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist --find-interpreter sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: musllinux_1_2 - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-musllinux-${{ matrix.platform.target }} path: dist windows: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: windows-latest target: x64 python_arch: x64 - runner: windows-latest target: x86 python_arch: x86 - runner: windows-11-arm target: aarch64 python_arch: arm64 steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.13" architecture: ${{ matrix.platform.python_arch }} - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist --find-interpreter sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-windows-${{ matrix.platform.target }} path: dist macos: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: macos-15-intel target: x86_64 - runner: macos-latest target: aarch64 steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.x" - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist --find-interpreter sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-macos-${{ matrix.platform.target }} path: dist sdist: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Build sdist uses: PyO3/maturin-action@v1 with: command: sdist args: --out dist - name: Upload sdist uses: actions/upload-artifact@v6 with: name: wheels-sdist path: dist release: name: Release runs-on: ubuntu-latest if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }} needs: [linux, musllinux, windows, macos, sdist] permissions: # Use to sign the release artifacts id-token: write # Used to upload release artifacts contents: write # Used to generate artifact attestation attestations: write steps: - uses: actions/download-artifact@v7 - name: Generate artifact attestation uses: actions/attest@v4 with: subject-path: 'wheels-*/*' - name: Install uv if: ${{ startsWith(github.ref, 'refs/tags/') }} uses: astral-sh/setup-uv@v7 - name: Publish to PyPI if: ${{ startsWith(github.ref, 'refs/tags/') }} run: uv publish 'wheels-*/*' env: UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }} maturin-1.16.0/src/ci/github/__snapshot__/github_emscripten.yml000066400000000000000000000060001527064705700246240ustar00rootroot00000000000000name: CI on: push: branches: - main - master tags: - '*' pull_request: workflow_dispatch: permissions: contents: read jobs: emscripten: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: ubuntu-22.04 target: wasm32-unknown-emscripten steps: - uses: actions/checkout@v6 - run: pip install pyodide-build - name: Get Emscripten and Python version info shell: bash run: | echo EMSCRIPTEN_VERSION=$(pyodide config get emscripten_version) >> $GITHUB_ENV echo PYTHON_VERSION=$(pyodide config get python_version | cut -d '.' -f 1-2) >> $GITHUB_ENV echo RUST_TOOLCHAIN=$(pyodide config get rust_toolchain) >> $GITHUB_ENV if v=$(pyodide config get pyemscripten_platform_version 2>/dev/null); then echo PYEMSCRIPTEN_PLATFORM_VERSION=$v >> $GITHUB_ENV; elif v=$(pyodide config get pyodide_abi_version 2>/dev/null); then echo PYODIDE_ABI_VERSION=$v >> $GITHUB_ENV; fi pip uninstall -y pyodide-build - uses: emscripten-core/setup-emsdk@v16 with: version: ${{ env.EMSCRIPTEN_VERSION }} actions-cache-folder: emsdk-cache - uses: actions/setup-python@v6 with: python-version: ${{ env.PYTHON_VERSION }} - run: pip install pyodide-build - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist -i ${{ env.PYTHON_VERSION }} sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} rust-toolchain: ${{ env.RUST_TOOLCHAIN }} - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-emscripten-${{ matrix.platform.target }} path: dist sdist: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Build sdist uses: PyO3/maturin-action@v1 with: command: sdist args: --out dist - name: Upload sdist uses: actions/upload-artifact@v6 with: name: wheels-sdist path: dist release: name: Release runs-on: ubuntu-latest if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }} needs: [emscripten, sdist] environment: release permissions: # Use to sign the release artifacts id-token: write # Used to upload release artifacts contents: write # Used to generate artifact attestation attestations: write steps: - uses: actions/download-artifact@v7 - name: Generate artifact attestation uses: actions/attest@v4 with: subject-path: 'wheels-*/*' - name: Install uv if: ${{ startsWith(github.ref, 'refs/tags/') }} uses: astral-sh/setup-uv@v7 - name: Publish to PyPI if: ${{ startsWith(github.ref, 'refs/tags/') }} run: uv publish --trusted-publishing always 'wheels-*/*' maturin-1.16.0/src/ci/github/__snapshot__/github_no_attestations.yml000066400000000000000000000132201527064705700256730ustar00rootroot00000000000000name: CI on: push: branches: - main - master tags: - '*' pull_request: workflow_dispatch: permissions: contents: read jobs: linux: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: ubuntu-22.04 target: x86_64 - runner: ubuntu-22.04 target: x86 - runner: ubuntu-22.04 target: aarch64 - runner: ubuntu-22.04 target: armv7 - runner: ubuntu-22.04 target: s390x - runner: ubuntu-22.04 target: ppc64le steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.x" - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: auto - name: Build free-threaded wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist -i python3.14t sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: auto - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-linux-${{ matrix.platform.target }} path: dist musllinux: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: ubuntu-22.04 target: x86_64 - runner: ubuntu-22.04 target: x86 - runner: ubuntu-22.04 target: aarch64 - runner: ubuntu-22.04 target: armv7 steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.x" - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: musllinux_1_2 - name: Build free-threaded wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist -i python3.14t sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: musllinux_1_2 - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-musllinux-${{ matrix.platform.target }} path: dist windows: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: windows-latest target: x64 python_arch: x64 - runner: windows-latest target: x86 python_arch: x86 - runner: windows-11-arm target: aarch64 python_arch: arm64 steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.13" architecture: ${{ matrix.platform.python_arch }} - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - uses: actions/setup-python@v6 with: python-version: "3.14t" architecture: ${{ matrix.platform.python_arch }} - name: Build free-threaded wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist -i python3.14t sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-windows-${{ matrix.platform.target }} path: dist macos: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: macos-15-intel target: x86_64 - runner: macos-latest target: aarch64 steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.x" - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - uses: actions/setup-python@v6 with: python-version: "3.14t" - name: Build free-threaded wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist -i python3.14t sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-macos-${{ matrix.platform.target }} path: dist release: name: Release runs-on: ubuntu-latest if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }} needs: [linux, musllinux, windows, macos] permissions: # Use to sign the release artifacts id-token: write # Used to upload release artifacts contents: write steps: - uses: actions/download-artifact@v7 - name: Install uv if: ${{ startsWith(github.ref, 'refs/tags/') }} uses: astral-sh/setup-uv@v7 - name: Publish to PyPI if: ${{ startsWith(github.ref, 'refs/tags/') }} run: uv publish 'wheels-*/*' env: UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }} maturin-1.16.0/src/ci/github/__snapshot__/github_pyproject_detailed_targets.yml000066400000000000000000000040011527064705700300550ustar00rootroot00000000000000name: CI on: push: branches: - main - master tags: - '*' pull_request: workflow_dispatch: permissions: contents: read jobs: linux: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: ubuntu-22.04 target: x86_64 manylinux: 2_28 - runner: self-hosted-arm64 target: aarch64 manylinux: 2_17 before_script_linux: yum install -y openssl-devel steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.x" - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist --find-interpreter sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: ${{ matrix.platform.manylinux }} before-script-linux: ${{ matrix.platform.before_script_linux }} - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-linux-${{ matrix.platform.target }} path: dist release: name: Release runs-on: ubuntu-latest if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }} needs: [linux] permissions: # Use to sign the release artifacts id-token: write # Used to upload release artifacts contents: write # Used to generate artifact attestation attestations: write steps: - uses: actions/download-artifact@v7 - name: Generate artifact attestation uses: actions/attest@v4 with: subject-path: 'wheels-*/*' - name: Install uv if: ${{ startsWith(github.ref, 'refs/tags/') }} uses: astral-sh/setup-uv@v7 - name: Publish to PyPI if: ${{ startsWith(github.ref, 'refs/tags/') }} run: uv publish 'wheels-*/*' env: UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }} maturin-1.16.0/src/ci/github/__snapshot__/github_pyproject_simple_targets.yml000066400000000000000000000054551527064705700276110ustar00rootroot00000000000000name: CI on: push: branches: - main - master tags: - '*' pull_request: workflow_dispatch: permissions: contents: read jobs: linux: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: ubuntu-22.04 target: x86_64 - runner: ubuntu-22.04 target: aarch64 steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.x" - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist --find-interpreter sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: auto - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-linux-${{ matrix.platform.target }} path: dist macos: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: macos-latest target: aarch64 steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.x" - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist --find-interpreter sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-macos-${{ matrix.platform.target }} path: dist sdist: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Build sdist uses: PyO3/maturin-action@v1 with: command: sdist args: --out dist - name: Upload sdist uses: actions/upload-artifact@v6 with: name: wheels-sdist path: dist release: name: Release runs-on: ubuntu-latest if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }} needs: [linux, macos, sdist] environment: release permissions: # Use to sign the release artifacts id-token: write # Used to upload release artifacts contents: write # Used to generate artifact attestation attestations: write steps: - uses: actions/download-artifact@v7 - name: Generate artifact attestation uses: actions/attest@v4 with: subject-path: 'wheels-*/*' - name: Install uv if: ${{ startsWith(github.ref, 'refs/tags/') }} uses: astral-sh/setup-uv@v7 - name: Publish to PyPI if: ${{ startsWith(github.ref, 'refs/tags/') }} run: uv publish --trusted-publishing always 'wheels-*/*' maturin-1.16.0/src/ci/github/__snapshot__/github_zig_pytest.yml000066400000000000000000000173251527064705700246700ustar00rootroot00000000000000name: CI on: push: branches: - main - master tags: - '*' pull_request: workflow_dispatch: permissions: contents: read jobs: linux: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: ubuntu-22.04 target: x86_64 - runner: ubuntu-22.04 target: x86 - runner: ubuntu-22.04 target: aarch64 - runner: ubuntu-22.04 target: armv7 - runner: ubuntu-22.04 target: s390x - runner: ubuntu-22.04 target: ppc64le steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.x" - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist --find-interpreter --zig sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: auto - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-linux-${{ matrix.platform.target }} path: dist - uses: astral-sh/setup-uv@v7 if: ${{ startsWith(matrix.platform.target, 'x86_64') }} - name: pytest if: ${{ startsWith(matrix.platform.target, 'x86_64') }} shell: bash run: | set -e uv venv .venv source .venv/bin/activate uv pip install example --no-index --no-deps --find-links dist --reinstall uv pip install example pytest pytest - name: pytest if: ${{ !startsWith(matrix.platform.target, 'x86') && matrix.platform.target != 'ppc64' }} uses: uraimo/run-on-arch-action@v3 with: arch: ${{ matrix.platform.target }} distro: ubuntu24.04 githubToken: ${{ github.token }} install: | apt-get update apt-get install -y --no-install-recommends python3 python3-venv run: | set -e python3 -m venv .venv source .venv/bin/activate pip install pytest pip install example --no-index --no-deps --find-links dist --force-reinstall pip install example pytest musllinux: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: ubuntu-22.04 target: x86_64 - runner: ubuntu-22.04 target: x86 - runner: ubuntu-22.04 target: aarch64 - runner: ubuntu-22.04 target: armv7 steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.x" - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist --find-interpreter sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: musllinux_1_2 - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-musllinux-${{ matrix.platform.target }} path: dist - name: pytest if: ${{ startsWith(matrix.platform.target, 'x86_64') }} run: | set -e docker run --rm -v ${{ github.workspace }}:/io -w /io alpine:latest sh -c ' apk add py3-pip py3-virtualenv python3 -m virtualenv .venv source .venv/bin/activate pip install example --no-index --no-deps --find-links dist --force-reinstall pip install example pytest pytest ' - name: pytest if: ${{ !startsWith(matrix.platform.target, 'x86') }} uses: uraimo/run-on-arch-action@v3 with: arch: ${{ matrix.platform.target }} distro: alpine_latest githubToken: ${{ github.token }} install: | apk add py3-virtualenv run: | set -e python3 -m virtualenv .venv source .venv/bin/activate pip install example --no-index --no-deps --find-links dist --force-reinstall pip install example pytest pytest windows: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: windows-latest target: x64 python_arch: x64 - runner: windows-latest target: x86 python_arch: x86 - runner: windows-11-arm target: aarch64 python_arch: arm64 steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.13" architecture: ${{ matrix.platform.python_arch }} - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist --find-interpreter sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-windows-${{ matrix.platform.target }} path: dist - uses: astral-sh/setup-uv@v7 - name: pytest shell: bash run: | set -e uv venv .venv source .venv/Scripts/activate uv pip install example --no-index --no-deps --find-links dist --reinstall uv pip install example pytest pytest macos: runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: macos-15-intel target: x86_64 - runner: macos-latest target: aarch64 steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: "3.x" - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.platform.target }} args: --release --out dist --find-interpreter sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - name: Upload wheels uses: actions/upload-artifact@v6 with: name: wheels-macos-${{ matrix.platform.target }} path: dist - uses: astral-sh/setup-uv@v7 - name: pytest run: | set -e uv venv .venv source .venv/bin/activate uv pip install example --no-index --no-deps --find-links dist --reinstall uv pip install example pytest pytest sdist: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Build sdist uses: PyO3/maturin-action@v1 with: command: sdist args: --out dist - name: Upload sdist uses: actions/upload-artifact@v6 with: name: wheels-sdist path: dist release: name: Release runs-on: ubuntu-latest if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }} needs: [linux, musllinux, windows, macos, sdist] permissions: # Use to sign the release artifacts id-token: write # Used to upload release artifacts contents: write # Used to generate artifact attestation attestations: write steps: - uses: actions/download-artifact@v7 - name: Generate artifact attestation uses: actions/attest@v4 with: subject-path: 'wheels-*/*' - name: Install uv if: ${{ startsWith(github.ref, 'refs/tags/') }} uses: astral-sh/setup-uv@v7 - name: Publish to PyPI if: ${{ startsWith(github.ref, 'refs/tags/') }} run: uv publish 'wheels-*/*' env: UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }} maturin-1.16.0/src/ci/github/mod.rs000066400000000000000000000002511527064705700170620ustar00rootroot00000000000000mod render; mod resolve; mod yaml; pub(crate) use render::{generate_github, generate_github_from_cli}; pub(crate) use resolve::resolve_config; #[cfg(test)] mod tests; maturin-1.16.0/src/ci/github/render.rs000066400000000000000000000611231527064705700175670ustar00rootroot00000000000000use std::path::Path; use anyhow::Result; use super::super::{GenerateCI, Platform, ResolvedCIConfig, ResolvedTarget}; use super::resolve::resolve_config; use super::yaml::Yaml; use crate::BridgeModel; /// Check if a given maturin-action field is uniform across all targets in the resolved list. /// Returns Some(value) if all targets have the same value (or all None), None if they vary. fn uniform_field Option<&str>>( targets: &[ResolvedTarget], accessor: F, ) -> Option> { if targets.is_empty() { return Some(None); } let first = accessor(&targets[0]); for target in &targets[1..] { let value = accessor(target); if value != first { return None; } } Some(first.map(ToOwned::to_owned)) } type FieldAccessor = fn(&ResolvedTarget) -> Option<&str>; /// The list of maturin-action fields that can be configured per-target. /// Each entry is (action_field_name with hyphens, matrix_key with underscores, accessor). const MATURIN_ACTION_FIELDS: &[(&str, &str, FieldAccessor)] = &[ ("manylinux", "manylinux", |target| { target.manylinux.as_deref() }), ("container", "container", |target| { target.container.as_deref() }), ("docker-options", "docker_options", |target| { target.docker_options.as_deref() }), ("rust-toolchain", "rust_toolchain", |target| { target.rust_toolchain.as_deref() }), ("rustup-components", "rustup_components", |target| { target.rustup_components.as_deref() }), ("before-script-linux", "before_script_linux", |target| { target.before_script_linux.as_deref() }), ]; // Bare GitHub Actions expression fragments (without `${{ }}`), used to build // larger expressions without double-nesting. const MATRIX_TARGET: &str = "matrix.platform.target"; const GITHUB_TOKEN: &str = "github.token"; const GITHUB_WORKSPACE: &str = "github.workspace"; pub(crate) fn generate_github_from_cli( cli: &GenerateCI, project_name: &str, bridge_model: &BridgeModel, sdist: bool, ) -> Result { let resolved = resolve_config(cli, None, bridge_model)?; generate_github(cli, &resolved, project_name, bridge_model, sdist, None) } struct RenderContext<'a> { cli: &'a GenerateCI, resolved: &'a ResolvedCIConfig, project_name: &'a str, is_abi3: bool, is_bin: bool, setup_python: bool, /// Minimum Python 3 minor version from `requires-python` (e.g. 13 for `>=3.13`). min_python_minor: Option, } /// Generate GitHub Actions CI configuration. pub(crate) fn generate_github( cli: &GenerateCI, resolved: &ResolvedCIConfig, project_name: &str, bridge_model: &BridgeModel, sdist: bool, min_python_minor: Option, ) -> Result { let is_abi3 = bridge_model.has_stable_abi(); let is_bin = bridge_model.is_bin(); let setup_python = resolved.pytest || matches!( bridge_model, BridgeModel::Bin(Some(_)) | BridgeModel::PyO3 { .. } | BridgeModel::Cffi | BridgeModel::UniFfi ); let context = RenderContext { cli, resolved, project_name, is_abi3, is_bin, setup_python, min_python_minor, }; let mut conf = workflow_header(); let mut needs = Vec::new(); for (&platform, targets) in &resolved.platform_targets { needs.push(platform.to_string()); emit_platform_job(&mut conf, platform, targets, &context); conf.push('\n'); } if sdist { needs.push("sdist".to_string()); emit_sdist_job(&mut conf, cli); conf.push('\n'); } emit_release_job(&mut conf, resolved, &needs); Ok(conf) } fn workflow_header() -> String { let mut gen_cmd = std::env::args() .enumerate() .map(|(index, arg)| { if index == 0 { env!("CARGO_PKG_NAME").to_string() } else { arg } }) .collect::>() .join(" "); if gen_cmd.starts_with("maturin new") || gen_cmd.starts_with("maturin init") { gen_cmd = format!("{} generate-ci github", env!("CARGO_PKG_NAME")); } format!( "# This file is autogenerated by maturin v{version} # To update, run # # {gen_cmd} # name: CI on: push: branches: - main - master tags: - '*' pull_request: workflow_dispatch: permissions: contents: read jobs:\n", version = env!("CARGO_PKG_VERSION"), ) } fn emit_platform_job( conf: &mut String, platform: Platform, targets: &[ResolvedTarget], context: &RenderContext<'_>, ) { let platform_name = platform.to_string(); let mut y = Yaml::new(conf, 1); y.line(format!("{platform_name}:")) .indent() .line(format!("runs-on: {}", gha_expr("matrix.platform.runner"))); emit_target_matrix(&mut y, targets); y.line("steps:") .indent() .line("- uses: actions/checkout@v6"); emit_platform_setup( &mut y, platform, context.setup_python, context.min_python_minor, ); let maturin_args = build_maturin_args( context.cli, context.resolved, platform, context.is_abi3, context.is_bin, context.setup_python, ); let extra_args_suffix = build_extra_args_suffix(targets); emit_build_step( &mut y, "Build wheels", &maturin_args, &extra_args_suffix, "", targets, ); if context.is_abi3 { emit_free_threaded_setup(&mut y, platform, context.min_python_minor); emit_build_step( &mut y, "Build free-threaded wheels", &maturin_args, &extra_args_suffix, " -i python3.14t", targets, ); } emit_upload_wheels_step(&mut y, platform); if context.resolved.pytest { let chdir = pytest_chdir_prefix(context.cli); emit_pytest_steps( &mut y, platform, context.project_name, &chdir, context.min_python_minor, ); } } fn emit_target_matrix(y: &mut Yaml, targets: &[ResolvedTarget]) { if targets.is_empty() { return; } y.line("strategy:") .indent() .line("matrix:") .indent() .line("platform:") .indent(); for target in targets { y.line(format!("- runner: {}", target.runner)).indent(); y.line(format!("target: {}", target.target)); if let Some(python_arch) = &target.python_arch { y.line(format!("python_arch: {python_arch}")); } emit_varying_matrix_fields(y, targets, target); y.dedent(); } y.dedent_by(3); } fn emit_platform_setup( y: &mut Yaml, platform: Platform, setup_python: bool, min_python_minor: Option, ) { match platform { Platform::Emscripten => emit_emscripten_setup(y), Platform::Android => {} _ if setup_python => emit_python_setup(y, platform, min_python_minor), _ => {} } } fn emit_emscripten_setup(y: &mut Yaml) { y.line("- run: pip install pyodide-build"); y.line("- name: Get Emscripten and Python version info") .indent() .line("shell: bash") .line("run: |") .indent(); y.line("echo EMSCRIPTEN_VERSION=$(pyodide config get emscripten_version) >> $GITHUB_ENV"); y.line("echo PYTHON_VERSION=$(pyodide config get python_version | cut -d '.' -f 1-2) >> $GITHUB_ENV"); y.line("echo RUST_TOOLCHAIN=$(pyodide config get rust_toolchain) >> $GITHUB_ENV"); // PEP 783 platform-tag input. Current pyodide-build exposes the version // through the historical `pyodide_abi_version` key (e.g. `2025_0` for // Python 3.13 / `pyemscripten_2025_0`). `pyodide config get` exits 1 and // prints an error to stdout for unknown keys, so we only export a value // when a key is recognised. Older Pyodide releases simply leave it unset // and maturin falls back to the legacy `emscripten_*` tag. y.line(concat!( "if v=$(pyodide config get pyemscripten_platform_version 2>/dev/null); then ", "echo PYEMSCRIPTEN_PLATFORM_VERSION=$v >> $GITHUB_ENV; ", "elif v=$(pyodide config get pyodide_abi_version 2>/dev/null); then ", "echo PYODIDE_ABI_VERSION=$v >> $GITHUB_ENV; fi" )); y.line("pip uninstall -y pyodide-build"); y.dedent_by(2) .line("- uses: emscripten-core/setup-emsdk@v16") .indent() .line("with:") .indent() .line(format!("version: {}", gha_expr("env.EMSCRIPTEN_VERSION"))) .line("actions-cache-folder: emsdk-cache") .dedent_by(2) .line("- uses: actions/setup-python@v6") .indent() .line("with:") .indent() .line(format!( "python-version: {}", gha_expr("env.PYTHON_VERSION") )) .dedent_by(2) .line("- run: pip install pyodide-build"); } fn emit_python_setup(y: &mut Yaml, platform: Platform, min_python_minor: Option) { let python_version = match (platform, min_python_minor) { (Platform::Windows, Some(minor)) if minor >= 13 => format!("3.{minor}"), (Platform::Windows, _) => "3.13".to_string(), (_, Some(minor)) => format!("3.{minor}"), _ => "3.x".to_string(), }; y.line("- uses: actions/setup-python@v6") .indent() .line("with:") .indent() .line(format!("python-version: \"{python_version}\"")); if matches!(platform, Platform::Windows) { y.line(format!( "architecture: {}", gha_expr("matrix.platform.python_arch") )); } y.dedent_by(2); } fn emit_free_threaded_setup(y: &mut Yaml, platform: Platform, min_python_minor: Option) { if !matches!(platform, Platform::Windows | Platform::Macos) { return; } let python_version = if matches!(min_python_minor, Some(minor) if minor > 14) { format!("3.{}t", min_python_minor.unwrap()) } else { "3.14t".to_string() }; y.line("- uses: actions/setup-python@v6") .indent() .line("with:") .indent() .line(format!("python-version: \"{python_version}\"")); if matches!(platform, Platform::Windows) { y.line(format!( "architecture: {}", gha_expr("matrix.platform.python_arch") )); } y.dedent_by(2); } fn build_maturin_args( cli: &GenerateCI, resolved: &ResolvedCIConfig, platform: Platform, is_abi3: bool, is_bin: bool, setup_python: bool, ) -> String { let mut maturin_args = if is_abi3 || (is_bin && !setup_python) { Vec::new() } else if matches!(platform, Platform::Emscripten) { vec!["-i".to_string(), "${{ env.PYTHON_VERSION }}".to_string()] } else if matches!(platform, Platform::Android) { Vec::new() } else { vec!["--find-interpreter".to_string()] }; if let Some(manifest_arg) = manifest_arg(cli) { maturin_args.push("--manifest-path".to_string()); maturin_args.push(manifest_arg); } if resolved.zig && matches!(platform, Platform::ManyLinux) { maturin_args.push("--zig".to_string()); } if maturin_args.is_empty() { String::new() } else { format!(" {}", maturin_args.join(" ")) } } fn build_extra_args_suffix(targets: &[ResolvedTarget]) -> String { if let Some(uniform_value) = uniform_field(targets, |target| target.extra_args.as_deref()) { uniform_value .map(|value| format!(" {value}")) .unwrap_or_default() } else { " ${{ matrix.platform.extra_args }}".to_string() } } fn manifest_arg(cli: &GenerateCI) -> Option { cli.manifest_path.as_ref().and_then(|manifest_path| { (manifest_path != Path::new("Cargo.toml")).then(|| manifest_path.display().to_string()) }) } fn pytest_chdir_prefix(cli: &GenerateCI) -> String { cli.manifest_path .as_ref() .and_then(|manifest_path| { (manifest_path != Path::new("Cargo.toml")) .then(|| manifest_path.parent().unwrap().display().to_string()) }) .map(|parent| format!("cd {parent} && ")) .unwrap_or_default() } fn emit_upload_wheels_step(y: &mut Yaml, platform: Platform) { let artifact_name = format!("wheels-{platform}-{}", gha_expr("matrix.platform.target")); y.line("- name: Upload wheels") .indent() .line("uses: actions/upload-artifact@v6") .line("with:") .indent() .line(format!("name: {artifact_name}")) .line("path: dist") .dedent_by(2); } fn emit_sdist_job(conf: &mut String, cli: &GenerateCI) { let manifest_args = manifest_arg(cli) .map(|path| format!(" --manifest-path {path}")) .unwrap_or_default(); let mut y = Yaml::new(conf, 1); y.line("sdist:") .indent() .line("runs-on: ubuntu-latest") .line("steps:") .indent() .line("- uses: actions/checkout@v6") .line("- name: Build sdist") .indent() .line("uses: PyO3/maturin-action@v1") .line("with:") .indent() .line("command: sdist") .line(format!("args: --out dist{manifest_args}")) .dedent_by(2) .line("- name: Upload sdist") .indent() .line("uses: actions/upload-artifact@v6") .line("with:") .indent() .line("name: wheels-sdist") .line("path: dist"); } fn emit_release_job(conf: &mut String, resolved: &ResolvedCIConfig, needs: &[String]) { let mut y = Yaml::new(conf, 1); y.line("release:"); y.indent(); y.line("name: Release"); y.line("runs-on: ubuntu-latest"); y.line(format!( "if: {}", gha_expr( "startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch'" ) )); y.line(format!("needs: [{}]", needs.join(", "))); if let Some(environment) = &resolved.publishing_environment { y.line(format!("environment: {environment}")); } emit_release_permissions(&mut y, resolved); emit_release_steps(&mut y, resolved); } fn emit_release_permissions(y: &mut Yaml, resolved: &ResolvedCIConfig) { y.line("permissions:"); y.indent(); y.line("# Use to sign the release artifacts"); y.line("id-token: write"); y.line("# Used to upload release artifacts"); y.line("contents: write"); if !resolved.skip_attestation { y.line("# Used to generate artifact attestation"); y.line("attestations: write"); } y.dedent(); } fn emit_release_steps(y: &mut Yaml, resolved: &ResolvedCIConfig) { y.line("steps:"); y.indent(); y.line("- uses: actions/download-artifact@v7"); if !resolved.skip_attestation { emit_release_attestation_step(y); } emit_release_publish_steps(y, resolved); } fn emit_release_attestation_step(y: &mut Yaml) { y.line("- name: Generate artifact attestation"); y.indent(); y.line("uses: actions/attest@v4"); y.line("with:"); y.indent(); y.line("subject-path: 'wheels-*/*'"); y.dedent_by(2); } fn emit_release_publish_steps(y: &mut Yaml, resolved: &ResolvedCIConfig) { y.line("- name: Install uv"); y.indent(); y.line(format!( "if: {}", gha_expr("startsWith(github.ref, 'refs/tags/')") )); y.line("uses: astral-sh/setup-uv@v7"); y.dedent(); y.line("- name: Publish to PyPI"); y.indent(); y.line(format!( "if: {}", gha_expr("startsWith(github.ref, 'refs/tags/')") )); if resolved.trusted_publishing { y.line("run: uv publish --trusted-publishing always 'wheels-*/*'"); y.dedent(); } else { y.line("run: uv publish 'wheels-*/*'"); y.line("env:"); y.indent(); y.line(format!( "UV_PUBLISH_TOKEN: {}", gha_expr("secrets.PYPI_API_TOKEN") )); y.dedent_by(2); } } /// Wrap a bare expression in `${{ ... }}` for use as a YAML value. fn gha_expr(expr: &str) -> String { format!("${{{{ {expr} }}}}") } /// Emit pytest steps for a given platform. fn emit_pytest_steps( y: &mut Yaml, platform: Platform, project_name: &str, chdir: &str, min_python_minor: Option, ) { match platform { Platform::All | Platform::Android => {} Platform::ManyLinux => emit_manylinux_pytest(y, project_name, chdir, min_python_minor), Platform::Musllinux => emit_musllinux_pytest(y, project_name, chdir), Platform::Windows => { emit_uv_pytest( y, project_name, chdir, ".venv/Scripts/activate", None, Some("bash"), ); } Platform::Macos => { emit_uv_pytest(y, project_name, chdir, ".venv/bin/activate", None, None); } Platform::Emscripten => emit_emscripten_pytest(y, project_name, chdir), } } /// Ubuntu 24.04 ships Python 3.12; versions above this need the deadsnakes PPA. const UBUNTU_2404_PYTHON_MINOR: u8 = 12; /// Emit pytest steps for manylinux: host test (x86_64) + QEMU cross-arch test. fn emit_manylinux_pytest( y: &mut Yaml, project_name: &str, chdir: &str, min_python_minor: Option, ) { let if_x86_64 = gha_expr(&format!("startsWith({MATRIX_TARGET}, 'x86_64')")); y.line("- uses: astral-sh/setup-uv@v7") .indent() .line(format!("if: {if_x86_64}")) .dedent(); emit_uv_pytest( y, project_name, chdir, ".venv/bin/activate", Some(&if_x86_64), Some("bash"), ); let needs_deadsnakes = matches!(min_python_minor, Some(minor) if minor > UBUNTU_2404_PYTHON_MINOR); y.line("- name: pytest") .indent() .line(format!( "if: {}", gha_expr(&format!( "!startsWith({MATRIX_TARGET}, 'x86') && {MATRIX_TARGET} != 'ppc64'" )) )) .line("uses: uraimo/run-on-arch-action@v3") .line("with:") .indent(); y.line(format!("arch: {}", gha_expr(MATRIX_TARGET))); y.line("distro: ubuntu24.04"); y.line(format!("githubToken: {}", gha_expr(GITHUB_TOKEN))); y.line("install: |"); y.indent(); y.line("apt-get update"); if needs_deadsnakes { let minor = min_python_minor.unwrap(); y.line("apt-get install -y --no-install-recommends software-properties-common"); y.line("add-apt-repository -y ppa:deadsnakes/ppa"); y.line("apt-get update"); y.line(format!( "apt-get install -y --no-install-recommends python3.{minor} python3.{minor}-venv" )); } else { y.line("apt-get install -y --no-install-recommends python3 python3-venv"); } y.dedent(); y.line("run: |"); y.indent(); y.line("set -e"); if needs_deadsnakes { let minor = min_python_minor.unwrap(); y.line(format!("python3.{minor} -m venv .venv")); } else { y.line("python3 -m venv .venv"); } y.line("source .venv/bin/activate"); y.line("pip install pytest"); y.line(format!( "pip install {project_name} --no-index --no-deps --find-links dist --force-reinstall" )); y.line(format!("pip install {project_name}")); y.line(format!("{chdir}pytest")); y.dedent_by(3); } /// Emit pytest steps for musllinux: docker (x86_64) + QEMU cross-arch. fn emit_musllinux_pytest(y: &mut Yaml, project_name: &str, chdir: &str) { let if_x86_64 = gha_expr(&format!("startsWith({MATRIX_TARGET}, 'x86_64')")); let if_not_x86 = gha_expr(&format!("!startsWith({MATRIX_TARGET}, 'x86')")); y.line("- name: pytest") .indent() .line(format!("if: {if_x86_64}")) .line("run: |") .indent(); y.line("set -e"); y.line(format!( "docker run --rm -v {}:/io -w /io alpine:latest sh -c '", gha_expr(GITHUB_WORKSPACE) )); y.line(" apk add py3-pip py3-virtualenv"); y.line(" python3 -m virtualenv .venv"); y.line(" source .venv/bin/activate"); y.line(format!( " pip install {project_name} --no-index --no-deps --find-links dist --force-reinstall" )); y.line(format!(" pip install {project_name} pytest")); y.line(format!(" {chdir}pytest")); y.line("'") .dedent_by(2) .line("- name: pytest") .indent() .line(format!("if: {if_not_x86}")) .line("uses: uraimo/run-on-arch-action@v3") .line("with:") .indent(); y.line(format!("arch: {}", gha_expr(MATRIX_TARGET))); y.line("distro: alpine_latest"); y.line(format!("githubToken: {}", gha_expr(GITHUB_TOKEN))); y.line("install: |"); y.indent(); y.line("apk add py3-virtualenv"); y.dedent(); y.line("run: |"); y.indent(); y.line("set -e"); y.line("python3 -m virtualenv .venv"); y.line("source .venv/bin/activate"); y.line(format!( "pip install {project_name} --no-index --no-deps --find-links dist --force-reinstall" )); y.line(format!("pip install {project_name} pytest")); y.line(format!("{chdir}pytest")); y.dedent_by(3); } /// Emit uv-based pytest steps (shared by manylinux host, windows, macos). fn emit_uv_pytest( y: &mut Yaml, project_name: &str, chdir: &str, activate_path: &str, if_expr: Option<&str>, shell: Option<&str>, ) { if if_expr.is_none() { y.line("- uses: astral-sh/setup-uv@v7"); } y.line("- name: pytest").indent(); if let Some(expr) = if_expr { y.line(format!("if: {expr}")); } if let Some(shell) = shell { y.line(format!("shell: {shell}")); } y.line("run: |").indent(); y.line("set -e"); y.line("uv venv .venv"); y.line(format!("source {activate_path}")); y.line(format!( "uv pip install {project_name} --no-index --no-deps --find-links dist --reinstall" )); y.line(format!("uv pip install {project_name} pytest")); y.line(format!("{chdir}pytest")); y.dedent_by(2); } /// Emit pytest steps for emscripten/pyodide. fn emit_emscripten_pytest(y: &mut Yaml, project_name: &str, chdir: &str) { y.line("- uses: actions/setup-node@v3") .indent() .line("with:") .indent() .line("node-version: '22'") .dedent_by(2) .line("- name: pytest") .indent() .line("run: |") .indent(); y.line("set -e"); y.line("pyodide venv .venv"); y.line("source .venv/bin/activate"); y.line(format!( "pip install {project_name} --no-index --no-deps --find-links dist --force-reinstall" )); y.line(format!("pip install {project_name} pytest")); y.line(format!("{chdir}python -m pytest")); y.dedent_by(2); } /// Emit a maturin-action build step with shared fields. fn emit_build_step( y: &mut Yaml, name: &str, maturin_args: &str, extra_args_suffix: &str, extra_suffix: &str, targets: &[ResolvedTarget], ) { y.line(format!("- name: {name}")) .indent() .line("uses: PyO3/maturin-action@v1") .line("with:") .indent(); y.line(format!("target: {}", gha_expr(MATRIX_TARGET))); y.line(format!( "args: --release --out dist{maturin_args}{extra_args_suffix}{extra_suffix}" )); y.line(format!( "sccache: {}", gha_expr("!startsWith(github.ref, 'refs/tags/')") )); for &(field_name, matrix_key, accessor) in MATURIN_ACTION_FIELDS { emit_maturin_action_field(y, field_name, matrix_key, targets, accessor); } y.dedent_by(2); } /// Emit a maturin-action field either at step level (uniform) or as matrix reference. fn emit_maturin_action_field( y: &mut Yaml, field_name: &str, matrix_key: &str, targets: &[ResolvedTarget], accessor: FieldAccessor, ) { if let Some(uniform_value) = uniform_field(targets, accessor) { if let Some(value) = uniform_value { y.line(format!("{field_name}: {value}")); } } else { y.line(format!( "{field_name}: ${{{{ matrix.platform.{matrix_key} }}}}" )); } } /// Emit varying maturin-action fields into matrix entries for a specific target. fn emit_varying_matrix_fields( y: &mut Yaml, all_targets: &[ResolvedTarget], target: &ResolvedTarget, ) { for &(_field_name, matrix_key, accessor) in MATURIN_ACTION_FIELDS { if uniform_field(all_targets, accessor).is_none() && let Some(value) = accessor(target) { y.line(format!("{matrix_key}: {value}")); } } if uniform_field(all_targets, |target| target.extra_args.as_deref()).is_none() && let Some(value) = &target.extra_args { y.line(format!("extra_args: {value}")); } } maturin-1.16.0/src/ci/github/resolve.rs000066400000000000000000000171611527064705700177720ustar00rootroot00000000000000use std::collections::{BTreeMap, BTreeSet}; use anyhow::{Result, bail}; use super::super::{GenerateCI, Platform, ResolvedCIConfig, ResolvedTarget}; use crate::BridgeModel; use crate::pyproject_toml::{CIConfigOverrides, GitHubCIConfig, PlatformCIConfig, TargetCIConfig}; /// Resolve a field using the chain: per-target → platform-level → default. fn resolve_optional( per_target: Option<&str>, platform_level: Option<&str>, default: Option<&str>, ) -> Option { per_target .or(platform_level) .or(default) .map(ToOwned::to_owned) } fn validate_platform_config(platform_name: &str, config: &PlatformCIConfig) -> Result<()> { if config.targets.is_some() && config.target.is_some() { bail!( "[tool.maturin.generate-ci.github.{}]: `targets` and `[[target]]` are mutually exclusive", platform_name ); } if matches!(config.targets.as_ref(), Some(targets) if targets.is_empty()) { bail!( "[tool.maturin.generate-ci.github.{}]: `targets` must not be empty", platform_name ); } if matches!(config.target.as_ref(), Some(targets) if targets.is_empty()) { bail!( "[tool.maturin.generate-ci.github.{}]: `[[target]]` must not be empty", platform_name ); } Ok(()) } fn configured_platforms( github_config: &GitHubCIConfig, bridge_model: &BridgeModel, ) -> BTreeSet { let mut platforms = BTreeSet::new(); if github_config.linux.is_some() { platforms.insert(Platform::ManyLinux); } if github_config.musllinux.is_some() { platforms.insert(Platform::Musllinux); } if github_config.windows.is_some() { platforms.insert(Platform::Windows); } if github_config.macos.is_some() { platforms.insert(Platform::Macos); } if github_config.emscripten.is_some() && !bridge_model.is_bin() { platforms.insert(Platform::Emscripten); } if github_config.android.is_some() { platforms.insert(Platform::Android); } platforms } fn platform_config_for( github_config: Option<&GitHubCIConfig>, platform: Platform, ) -> Option<&PlatformCIConfig> { github_config.and_then(|gh| match platform { Platform::ManyLinux => gh.linux.as_ref(), Platform::Musllinux => gh.musllinux.as_ref(), Platform::Windows => gh.windows.as_ref(), Platform::Macos => gh.macos.as_ref(), Platform::Emscripten => gh.emscripten.as_ref(), Platform::Android => gh.android.as_ref(), Platform::All => None, }) } fn arch_list(platform: Platform, platform_config: Option<&PlatformCIConfig>) -> Vec { match platform_config { Some(config) if config.target.is_some() => config .target .as_ref() .unwrap() .iter() .map(|t| t.arch.clone()) .collect(), Some(config) if config.targets.is_some() => config.targets.clone().unwrap(), _ => platform .default_targets() .iter() .map(|target| (*target).to_string()) .collect(), } } fn find_target_config<'a>( platform_config: Option<&'a PlatformCIConfig>, arch: &str, ) -> Option<&'a TargetCIConfig> { platform_config.and_then(|config| { config .target .as_ref() .and_then(|targets| targets.iter().find(|target| target.arch == arch)) }) } /// Resolve targets for a given platform from pyproject config + hardcoded defaults. pub(crate) fn resolve_platform_targets( platform: Platform, platform_config: Option<&PlatformCIConfig>, github_config: Option<&GitHubCIConfig>, ) -> Result> { let platform_name = platform.to_string(); if let Some(config) = platform_config { validate_platform_config(&platform_name, config)?; } let mut resolved = Vec::new(); for arch in arch_list(platform, platform_config) { let per_target = find_target_config(platform_config, &arch); let python_arch = platform.default_python_arch(&arch); let pt = |field: fn(&CIConfigOverrides) -> &Option| { per_target.and_then(|target| field(&target.overrides).as_deref()) }; let pl = |field: fn(&CIConfigOverrides) -> &Option| { platform_config.and_then(|config| field(&config.overrides).as_deref()) }; let rf = |field: fn(&CIConfigOverrides) -> &Option, default: Option<&str>| { resolve_optional(pt(field), pl(field), default) }; resolved.push(ResolvedTarget { runner: rf(|o| &o.runner, Some(platform.default_runner(&arch))).unwrap(), target: arch, python_arch, manylinux: rf(|o| &o.manylinux, platform.default_manylinux()), container: rf(|o| &o.container, None), docker_options: rf(|o| &o.docker_options, None), rust_toolchain: rf(|o| &o.rust_toolchain, platform.default_rust_toolchain()), rustup_components: rf(|o| &o.rustup_components, None), before_script_linux: rf(|o| &o.before_script_linux, None), extra_args: resolve_optional( pt(|o| &o.args), pl(|o| &o.args), github_config.and_then(|config| config.args.as_deref()), ), }); } Ok(resolved) } /// Build a ResolvedCIConfig from CLI args + pyproject GitHubCIConfig. pub(crate) fn resolve_config( cli: &GenerateCI, github_config: Option<&GitHubCIConfig>, bridge_model: &BridgeModel, ) -> Result { let pytest = cli.pytest || github_config .and_then(|config| config.pytest) .unwrap_or(false); let zig = cli.zig || github_config.and_then(|config| config.zig).unwrap_or(false); let skip_attestation = cli.skip_attestation || github_config .and_then(|config| config.skip_attestation) .unwrap_or(false); let trusted_publishing = github_config .and_then(|config| config.trusted_publishing) .unwrap_or(false); let publishing_environment = github_config.and_then(|config| config.publishing_environment.clone()); let platforms: BTreeSet = if !cli.platforms.is_empty() { cli.platforms .iter() .flat_map(|platform| { if matches!(platform, Platform::All) { if bridge_model.is_bin() { Platform::defaults() } else { Platform::all() } } else { std::slice::from_ref(platform) } }) .filter(|platform| !bridge_model.is_bin() || !matches!(platform, Platform::Emscripten)) .copied() .collect() } else if let Some(config) = github_config { let platforms = configured_platforms(config, bridge_model); if platforms.is_empty() { Platform::defaults().iter().copied().collect() } else { platforms } } else { Platform::defaults().iter().copied().collect() }; let mut platform_targets = BTreeMap::new(); for &platform in &platforms { let platform_config = platform_config_for(github_config, platform); let targets = resolve_platform_targets(platform, platform_config, github_config)?; platform_targets.insert(platform, targets); } Ok(ResolvedCIConfig { pytest, zig, skip_attestation, trusted_publishing, publishing_environment, platform_targets, }) } maturin-1.16.0/src/ci/github/tests.rs000066400000000000000000000335021527064705700174520ustar00rootroot00000000000000use expect_test::expect_file; use semver::Version; use super::{generate_github, generate_github_from_cli, resolve_config}; use crate::ci::{GenerateCI, Platform}; use crate::pyproject_toml::{CIConfigOverrides, GitHubCIConfig, PlatformCIConfig, TargetCIConfig}; use crate::{BridgeModel, PyO3, StableAbi, bridge::PyO3Crate}; const PROJECT_NAME: &str = "example"; /// Strip the first 5 header lines and return the rest with a trailing newline /// so the snapshot files are compatible with the `fix end of files` pre-commit hook. fn strip_header(output: &str) -> String { let mut stripped = output.lines().skip(5).collect::>().join("\n"); stripped.push('\n'); stripped } fn assert_snapshot(output: &str, snapshot: &str) { let conf = strip_header(output); match snapshot { "github_default.yml" => expect_file!["__snapshot__/github_default.yml"].assert_eq(&conf), "github_abi3.yml" => expect_file!["__snapshot__/github_abi3.yml"].assert_eq(&conf), "github_no_attestations.yml" => { expect_file!["__snapshot__/github_no_attestations.yml"].assert_eq(&conf) } "github_zig_pytest.yml" => { expect_file!["__snapshot__/github_zig_pytest.yml"].assert_eq(&conf) } "github_bin_no_binding.yml" => { expect_file!["__snapshot__/github_bin_no_binding.yml"].assert_eq(&conf) } "github_pyproject_simple_targets.yml" => { expect_file!["__snapshot__/github_pyproject_simple_targets.yml"].assert_eq(&conf) } "github_pyproject_detailed_targets.yml" => { expect_file!["__snapshot__/github_pyproject_detailed_targets.yml"].assert_eq(&conf) } "github_emscripten.yml" => { expect_file!["__snapshot__/github_emscripten.yml"].assert_eq(&conf); } _ => panic!("unknown snapshot: {snapshot}"), } } fn pyo3_bridge(stable_abi: Option) -> BridgeModel { BridgeModel::PyO3(PyO3 { crate_name: PyO3Crate::PyO3, version: Version::new(0, 23, 0), stable_abi, metadata: None, }) } fn target(arch: &str) -> TargetCIConfig { TargetCIConfig { arch: arch.to_string(), overrides: CIConfigOverrides::default(), } } fn render_with_config( cli: &GenerateCI, github_config: Option<&GitHubCIConfig>, bridge: &BridgeModel, sdist: bool, ) -> String { let resolved = resolve_config(cli, github_config, bridge).unwrap(); generate_github(cli, &resolved, PROJECT_NAME, bridge, sdist, None).unwrap() } #[test] fn test_generate_github() { let conf = generate_github_from_cli( &GenerateCI::default(), PROJECT_NAME, &pyo3_bridge(None), true, ) .unwrap(); assert_snapshot(&conf, "github_default.yml"); } #[test] fn test_generate_github_abi3() { let conf = generate_github_from_cli( &GenerateCI::default(), PROJECT_NAME, &pyo3_bridge(Some(StableAbi::from_abi3_version(3, 7))), false, ) .unwrap(); assert_snapshot(&conf, "github_abi3.yml"); } #[test] fn test_generate_github_no_attestations() { let cli = GenerateCI { skip_attestation: true, ..Default::default() }; let conf = generate_github_from_cli( &cli, PROJECT_NAME, &pyo3_bridge(Some(StableAbi::from_abi3_version(3, 7))), false, ) .unwrap(); assert_snapshot(&conf, "github_no_attestations.yml"); } #[test] fn test_generate_github_zig_pytest() { let r#gen = GenerateCI { zig: true, pytest: true, ..Default::default() }; let conf = generate_github_from_cli(&r#gen, PROJECT_NAME, &pyo3_bridge(None), true).unwrap(); assert_snapshot(&conf, "github_zig_pytest.yml"); } #[test] fn test_generate_github_bin_no_binding() { let conf = generate_github_from_cli( &GenerateCI::default(), PROJECT_NAME, &BridgeModel::Bin(None), true, ) .unwrap(); assert_snapshot(&conf, "github_bin_no_binding.yml"); } #[test] fn test_generate_github_bin_skips_cli_emscripten() { let cli = GenerateCI { platforms: vec![Platform::Emscripten], ..Default::default() }; let resolved = resolve_config(&cli, None, &BridgeModel::Bin(None)).unwrap(); assert!( !resolved .platform_targets .contains_key(&Platform::Emscripten) ); } #[test] fn test_generate_emscripten() { let github_config = GitHubCIConfig { pytest: Some(false), zig: Some(false), skip_attestation: None, trusted_publishing: Some(true), publishing_environment: Some("release".to_string()), emscripten: Some(PlatformCIConfig { ..Default::default() }), ..Default::default() }; let conf = render_with_config( &GenerateCI::default(), Some(&github_config), &pyo3_bridge(None), true, ); assert_snapshot(&conf, "github_emscripten.yml"); } #[test] fn test_generate_github_pyproject_simple_targets() { let github_config = GitHubCIConfig { pytest: Some(false), zig: Some(false), skip_attestation: None, trusted_publishing: Some(true), publishing_environment: Some("release".to_string()), linux: Some(PlatformCIConfig { targets: Some(vec!["x86_64".to_string(), "aarch64".to_string()]), ..Default::default() }), macos: Some(PlatformCIConfig { targets: Some(vec!["aarch64".to_string()]), ..Default::default() }), ..Default::default() }; let conf = render_with_config( &GenerateCI::default(), Some(&github_config), &pyo3_bridge(None), true, ); assert_snapshot(&conf, "github_pyproject_simple_targets.yml"); } #[test] fn test_generate_github_pyproject_detailed_targets() { let mut aarch64 = target("aarch64"); aarch64.overrides.runner = Some("self-hosted-arm64".to_string()); aarch64.overrides.manylinux = Some("2_17".to_string()); aarch64.overrides.before_script_linux = Some("yum install -y openssl-devel".to_string()); let github_config = GitHubCIConfig { pytest: None, zig: None, skip_attestation: None, linux: Some(PlatformCIConfig { overrides: CIConfigOverrides { runner: Some("ubuntu-22.04".to_string()), manylinux: Some("2_28".to_string()), ..Default::default() }, target: Some(vec![target("x86_64"), aarch64]), ..Default::default() }), ..Default::default() }; let conf = render_with_config( &GenerateCI::default(), Some(&github_config), &pyo3_bridge(None), false, ); assert_snapshot(&conf, "github_pyproject_detailed_targets.yml"); } #[test] fn test_generate_github_pyproject_cli_override() { let github_config = GitHubCIConfig { pytest: Some(true), zig: Some(true), skip_attestation: Some(true), linux: Some(PlatformCIConfig { targets: Some(vec!["x86_64".to_string()]), ..Default::default() }), macos: Some(PlatformCIConfig { targets: Some(vec!["aarch64".to_string()]), ..Default::default() }), ..Default::default() }; let cli = GenerateCI { platforms: vec![Platform::Windows], ..Default::default() }; let bridge = BridgeModel::Bin(None); let resolved = resolve_config(&cli, Some(&github_config), &bridge).unwrap(); assert!(resolved.platform_targets.contains_key(&Platform::Windows)); assert!(!resolved.platform_targets.contains_key(&Platform::ManyLinux)); assert!(!resolved.platform_targets.contains_key(&Platform::Macos)); assert!(resolved.pytest); assert!(resolved.zig); assert!(resolved.skip_attestation); } #[test] fn test_generate_github_pyproject_booleans_from_config() { let github_config = GitHubCIConfig { pytest: Some(true), zig: Some(true), skip_attestation: Some(true), ..Default::default() }; let cli = GenerateCI::default(); let bridge = BridgeModel::Bin(None); let resolved = resolve_config(&cli, Some(&github_config), &bridge).unwrap(); assert!(resolved.pytest); assert!(resolved.zig); assert!(resolved.skip_attestation); } #[test] fn test_generate_github_pyproject_cli_bool_override() { let github_config = GitHubCIConfig { pytest: Some(false), zig: Some(false), skip_attestation: Some(false), ..Default::default() }; let cli = GenerateCI { pytest: true, zig: true, skip_attestation: true, ..Default::default() }; let bridge = BridgeModel::Bin(None); let resolved = resolve_config(&cli, Some(&github_config), &bridge).unwrap(); assert!(resolved.pytest); assert!(resolved.zig); assert!(resolved.skip_attestation); } #[test] fn test_generate_github_pyproject_mutual_exclusion_error() { let github_config = GitHubCIConfig { linux: Some(PlatformCIConfig { targets: Some(vec!["x86_64".to_string()]), target: Some(vec![target("x86_64")]), ..Default::default() }), ..Default::default() }; let cli = GenerateCI::default(); let bridge = BridgeModel::Bin(None); let result = resolve_config(&cli, Some(&github_config), &bridge); assert!(result.is_err()); let err_msg = result.unwrap_err().to_string(); assert!( err_msg.contains("mutually exclusive"), "Expected mutual exclusion error, got: {err_msg}" ); } #[test] fn test_generate_github_pyproject_platform_level_runner() { let github_config = GitHubCIConfig { linux: Some(PlatformCIConfig { overrides: CIConfigOverrides { runner: Some("self-hosted-linux".to_string()), ..Default::default() }, targets: Some(vec!["x86_64".to_string(), "aarch64".to_string()]), ..Default::default() }), ..Default::default() }; let cli = GenerateCI::default(); let bridge = BridgeModel::Bin(None); let resolved = resolve_config(&cli, Some(&github_config), &bridge).unwrap(); let targets = &resolved.platform_targets[&Platform::ManyLinux]; assert_eq!(targets.len(), 2); assert_eq!(targets[0].runner, "self-hosted-linux"); assert_eq!(targets[1].runner, "self-hosted-linux"); } #[test] fn test_generate_github_pyproject_uniform_manylinux() { let github_config = GitHubCIConfig { linux: Some(PlatformCIConfig { overrides: CIConfigOverrides { manylinux: Some("2_28".to_string()), ..Default::default() }, targets: Some(vec!["x86_64".to_string(), "aarch64".to_string()]), ..Default::default() }), ..Default::default() }; let cli = GenerateCI::default(); let bridge = pyo3_bridge(None); let resolved = resolve_config(&cli, Some(&github_config), &bridge).unwrap(); let conf = generate_github(&cli, &resolved, PROJECT_NAME, &bridge, false, None).unwrap(); assert!(conf.contains(" manylinux: 2_28\n")); assert!(!conf.contains("matrix.platform.manylinux")); } #[test] fn test_generate_github_android() { let github_config = GitHubCIConfig { android: Some(PlatformCIConfig::default()), ..Default::default() }; let conf = render_with_config( &GenerateCI::default(), Some(&github_config), &pyo3_bridge(None), false, ); assert!(conf.contains(" android:\n")); assert!(conf.contains("runner: ubuntu-latest")); assert!(conf.contains("target: aarch64-linux-android")); assert!(conf.contains("target: x86_64-linux-android")); assert!(!conf.contains("actions/setup-python")); assert!(!conf.contains("--find-interpreter")); assert!(!conf.contains("manylinux:")); } #[test] fn test_generate_github_android_bin() { let github_config = GitHubCIConfig { android: Some(PlatformCIConfig::default()), linux: Some(PlatformCIConfig::default()), ..Default::default() }; let conf = render_with_config( &GenerateCI::default(), Some(&github_config), &BridgeModel::Bin(None), false, ); assert!(conf.contains(" android:\n")); assert!(conf.contains(" linux:\n")); } #[test] fn test_generate_github_trusted_publishing_no_environment() { let github_config = GitHubCIConfig { trusted_publishing: Some(true), ..Default::default() }; let cli = GenerateCI::default(); let bridge = pyo3_bridge(None); let resolved = resolve_config(&cli, Some(&github_config), &bridge).unwrap(); assert!(resolved.trusted_publishing); assert!(resolved.publishing_environment.is_none()); let conf = generate_github(&cli, &resolved, PROJECT_NAME, &bridge, true, None).unwrap(); assert!(!conf.contains("environment:")); assert!(conf.contains("uv publish --trusted-publishing always 'wheels-*/*'")); assert!(!conf.contains("UV_PUBLISH_TOKEN")); } #[test] fn test_generate_github_min_python_minor() { let cli = GenerateCI::default(); let bridge = pyo3_bridge(None); let resolved = resolve_config(&cli, None, &bridge).unwrap(); // Test with min_python_minor = 14 let conf = generate_github(&cli, &resolved, PROJECT_NAME, &bridge, false, Some(14)).unwrap(); assert!(conf.contains("python-version: \"3.14\"")); // Since 14 <= 14, free-threaded remains 3.14t if it was abi3 // But this bridge is NOT abi3, so no free-threaded wheels. let abi3_bridge = pyo3_bridge(Some(StableAbi::from_abi3_version(3, 7))); let conf_abi3 = generate_github(&cli, &resolved, PROJECT_NAME, &abi3_bridge, false, Some(15)).unwrap(); assert!(conf_abi3.contains("python-version: \"3.15\"")); assert!(conf_abi3.contains("python-version: \"3.15t\"")); } maturin-1.16.0/src/ci/github/yaml.rs000066400000000000000000000021501527064705700172450ustar00rootroot00000000000000/// A minimal YAML writer that tracks indentation level. /// /// Each `line()` call prepends `level * 2` spaces. Use `indent()`/`dedent()` /// to manage nesting. This removes hardcoded indentation from the YAML /// generation code. pub(super) struct Yaml<'a> { out: &'a mut String, level: usize, } impl<'a> Yaml<'a> { pub(super) fn new(out: &'a mut String, level: usize) -> Self { Self { out, level } } /// Write a single line at the current indentation level. pub(super) fn line(&mut self, s: impl AsRef) -> &mut Self { self.out.push_str(&" ".repeat(self.level)); self.out.push_str(s.as_ref()); self.out.push('\n'); self } pub(super) fn indent_by(&mut self, n: usize) -> &mut Self { self.level += n; self } pub(super) fn indent(&mut self) -> &mut Self { self.indent_by(1) } pub(super) fn dedent_by(&mut self, n: usize) -> &mut Self { debug_assert!(self.level >= n); self.level -= n; self } pub(super) fn dedent(&mut self) -> &mut Self { self.dedent_by(1) } } maturin-1.16.0/src/ci/mod.rs000066400000000000000000000254461527064705700156150ustar00rootroot00000000000000/// GitHub Actions CI generation pub mod github; use std::collections::BTreeMap; use std::fmt; use std::path::{Path, PathBuf}; use anyhow::Result; use clap::{ArgAction, Parser, ValueEnum}; use fs_err as fs; use pep440_rs::{Operator, VersionSpecifiers}; use crate::CargoOptions; use crate::bridge::find_bridge; use crate::project_layout::ProjectResolver; /// CI providers #[derive(Debug, Clone, Copy, ValueEnum)] #[clap(rename_all = "lower")] pub enum Provider { /// GitHub GitHub, } /// Platform #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, ValueEnum)] #[clap(rename_all = "lower")] pub enum Platform { /// All All, /// Manylinux #[clap(alias = "linux")] ManyLinux, /// Musllinux Musllinux, /// Windows Windows, /// macOS Macos, /// Emscripten Emscripten, /// Android Android, } impl Platform { pub(crate) fn defaults() -> &'static [Self] { &[ Platform::ManyLinux, Platform::Musllinux, Platform::Windows, Platform::Macos, ] } pub(crate) fn all() -> &'static [Self] { &[ Platform::ManyLinux, Platform::Musllinux, Platform::Windows, Platform::Macos, Platform::Emscripten, Platform::Android, ] } pub(crate) fn default_runner(self, arch: &str) -> &'static str { match self { Platform::ManyLinux | Platform::Musllinux | Platform::Emscripten => "ubuntu-22.04", Platform::Android => "ubuntu-latest", Platform::Windows => { if arch == "aarch64" { "windows-11-arm" } else { "windows-latest" } } Platform::Macos => { if arch == "x86_64" { "macos-15-intel" } else { "macos-latest" } } Platform::All => "ubuntu-22.04", } } pub(crate) fn default_python_arch(self, arch: &str) -> Option { match self { Platform::Windows => { if arch == "aarch64" { Some("arm64".to_string()) } else { Some(arch.to_string()) } } _ => None, } } pub(crate) fn default_targets(self) -> &'static [&'static str] { match self { Platform::ManyLinux => &["x86_64", "x86", "aarch64", "armv7", "s390x", "ppc64le"], Platform::Musllinux => &["x86_64", "x86", "aarch64", "armv7"], Platform::Windows => &["x64", "x86", "aarch64"], Platform::Macos => &["x86_64", "aarch64"], Platform::Emscripten => &["wasm32-unknown-emscripten"], Platform::Android => &["aarch64-linux-android", "x86_64-linux-android"], Platform::All => &[], } } pub(crate) fn default_manylinux(self) -> Option<&'static str> { match self { Platform::ManyLinux => Some("auto"), Platform::Musllinux => Some("musllinux_1_2"), _ => None, } } pub(crate) fn default_rust_toolchain(self) -> Option<&'static str> { match self { Platform::Emscripten => Some("${{ env.RUST_TOOLCHAIN }}"), _ => None, } } } impl fmt::Display for Platform { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Platform::All => write!(f, "all"), Platform::ManyLinux => write!(f, "linux"), Platform::Musllinux => write!(f, "musllinux"), Platform::Windows => write!(f, "windows"), Platform::Macos => write!(f, "macos"), Platform::Emscripten => write!(f, "emscripten"), Platform::Android => write!(f, "android"), } } } /// A fully-resolved target for CI generation #[derive(Debug, Clone)] pub(crate) struct ResolvedTarget { pub runner: String, pub target: String, pub python_arch: Option, pub manylinux: Option, pub container: Option, pub docker_options: Option, pub rust_toolchain: Option, pub rustup_components: Option, pub before_script_linux: Option, pub extra_args: Option, } /// Resolved CI configuration after merging CLI args with pyproject.toml #[derive(Debug)] pub(crate) struct ResolvedCIConfig { pub pytest: bool, pub zig: bool, pub skip_attestation: bool, pub trusted_publishing: bool, pub publishing_environment: Option, pub platform_targets: BTreeMap>, } /// Generate CI configuration #[derive(Debug, Parser)] pub struct GenerateCI { /// CI provider #[arg(value_enum, value_name = "CI")] pub ci: Provider, /// Path to Cargo.toml #[arg(short = 'm', long, value_name = "PATH")] pub manifest_path: Option, /// Output path #[arg(short = 'o', long, value_name = "PATH", default_value = "-")] pub output: PathBuf, /// Platform support [deprecated: use [tool.maturin.generate-ci.github."PLATFORM NAME"] in pyproject.toml] #[arg( id = "platform", long, action = ArgAction::Append, num_args = 1.., )] pub platforms: Vec, /// Enable pytest [deprecated: use [tool.maturin.generate-ci.github] in pyproject.toml] #[arg(long)] pub pytest: bool, /// Use zig to do cross compilation [deprecated: use [tool.maturin.generate-ci.github] in pyproject.toml] #[arg(long)] pub zig: bool, /// Skip artifact attestation [deprecated: use [tool.maturin.generate-ci.github] in pyproject.toml] #[arg(long)] pub skip_attestation: bool, } impl Default for GenerateCI { fn default() -> Self { Self { ci: Provider::GitHub, manifest_path: None, output: PathBuf::from("-"), platforms: Vec::new(), pytest: false, zig: false, skip_attestation: false, } } } /// Extract the minimum Python 3 minor version from a `requires-python` specifier. /// /// For example, `>=3.13` → `Some(13)`, `>=3.12,<4` → `Some(12)`. /// Returns `None` if there is no lower bound or it is not a Python 3.x specifier. fn min_python3_minor(requires_python: &VersionSpecifiers) -> Option { requires_python .iter() .filter(|spec| { matches!( spec.operator(), Operator::GreaterThanEqual | Operator::GreaterThan | Operator::Equal | Operator::TildeEqual | Operator::EqualStar ) }) .filter(|spec| spec.version().release().first() == Some(&3)) .filter_map(|spec| { let minor = *spec.version().release().get(1)?; let minor = if matches!(spec.operator(), Operator::GreaterThan) { // >3.12 means minimum is 3.13 minor + 1 } else { minor }; u8::try_from(minor).ok() }) .max() } impl GenerateCI { /// Execute this command pub fn execute(&self) -> Result<()> { let conf = self.generate()?; self.print(&conf) } /// Generate CI configuration pub fn generate(&self) -> Result { // Emit deprecation warnings for CLI options self.warn_deprecated_cli_options(); let cargo_options = CargoOptions { manifest_path: self.manifest_path.clone(), ..Default::default() }; let ProjectResolver { cargo_metadata, pyproject_toml, project_layout, cargo_options, .. } = ProjectResolver::resolve(self.manifest_path.clone(), cargo_options, false, None)?; let pyproject = pyproject_toml.as_ref(); let bridge = find_bridge( &cargo_metadata, pyproject.and_then(|x| x.bindings()), &cargo_options, )?; let project_name = pyproject .and_then(|project| project.project_name()) .unwrap_or(&project_layout.extension_name); let sdist = pyproject_toml.is_some(); // Read pyproject CI config let github_config = pyproject .and_then(|p| p.generate_ci()) .and_then(|ci| ci.github.as_ref()); // Extract minimum Python 3 minor version from requires-python let min_python_minor = pyproject .and_then(|p| p.project.as_ref()) .and_then(|proj| proj.requires_python.as_ref()) .and_then(min_python3_minor); match self.ci { Provider::GitHub => { let resolved = github::resolve_config(self, github_config, &bridge)?; github::generate_github( self, &resolved, project_name, &bridge, sdist, min_python_minor, ) } } } fn warn_deprecated_cli_options(&self) { let hint = "Use [tool.maturin.generate-ci.github] in pyproject.toml instead."; if !self.platforms.is_empty() { eprintln!("âš ï¸� Warning: --platform is deprecated for `maturin generate-ci`. {hint}"); } if self.pytest { eprintln!("âš ï¸� Warning: --pytest is deprecated for `maturin generate-ci`. {hint}"); } if self.zig { eprintln!("âš ï¸� Warning: --zig is deprecated for `maturin generate-ci`. {hint}"); } if self.skip_attestation { eprintln!( "âš ï¸� Warning: --skip-attestation is deprecated for `maturin generate-ci`. {hint}" ); } } fn print(&self, conf: &str) -> Result<()> { if self.output == Path::new("-") { print!("{conf}"); } else { fs::write(&self.output, conf)?; } Ok(()) } } #[cfg(test)] mod tests { use super::*; #[test] fn test_min_python3_minor() { let parse = |s: &str| s.parse::().unwrap(); assert_eq!(min_python3_minor(&parse(">=3.12")), Some(12)); assert_eq!(min_python3_minor(&parse(">=3.13")), Some(13)); assert_eq!(min_python3_minor(&parse(">=3.12,<4")), Some(12)); assert_eq!(min_python3_minor(&parse(">3.12")), Some(13)); assert_eq!(min_python3_minor(&parse(">=3.8")), Some(8)); assert_eq!(min_python3_minor(&parse("~=3.13")), Some(13)); assert_eq!(min_python3_minor(&parse("~=3.12.2")), Some(12)); assert_eq!(min_python3_minor(&parse("==3.11.*")), Some(11)); assert_eq!(min_python3_minor(&parse("<4")), None); assert_eq!(min_python3_minor(&parse("!=3.5")), None); } } maturin-1.16.0/src/commands/000077500000000000000000000000001527064705700156635ustar00rootroot00000000000000maturin-1.16.0/src/commands/build.rs000066400000000000000000000024671527064705700173410ustar00rootroot00000000000000use crate::commands::StripOption; use crate::commands::utils::unpack_sdist_for_build; use anyhow::Result; use maturin::{BuildOptions, BuildOrchestrator}; use tracing::instrument; #[instrument(skip_all)] pub fn build( mut build: BuildOptions, release: bool, strip_opt: StripOption, sdist: bool, pgo: bool, ) -> Result<()> { let strip = strip_opt.strip; // set profile to release if specified; `--release` and `--profile` are mutually exclusive if release { build.cargo.profile = Some("release".to_string()); } // Keep tempdir alive for the duration of the build let _sdist_tmp; let sdist_pyproject_path; if sdist { let (_, unpacked) = unpack_sdist_for_build(&mut build, strip)?; sdist_pyproject_path = unpacked.pyproject_toml_path.clone(); _sdist_tmp = Some(unpacked); } else { _sdist_tmp = None; sdist_pyproject_path = None; } let build_context = build .into_build_context() .strip(strip) .editable(false) .pyproject_toml_path(sdist_pyproject_path) .pgo(pgo) .build()?; let orchestrator = BuildOrchestrator::new(&build_context); let wheels = orchestrator.build_wheels()?; if wheels.is_empty() { anyhow::bail!("No wheels were built"); } Ok(()) } maturin-1.16.0/src/commands/develop.rs000066400000000000000000000104161527064705700176710ustar00rootroot00000000000000use anyhow::{Context, Result, bail}; use maturin::{DevelopOptions, Target, develop}; use std::env; #[cfg(any(windows, test))] use std::path::Path; use std::path::PathBuf; use tracing::{debug, instrument}; #[instrument(skip_all)] pub fn develop_cmd(develop_options: DevelopOptions) -> Result<()> { let target = Target::from_target_triple(develop_options.cargo_options.target.as_ref())?; let venv_dir = detect_venv(&target)?; develop(develop_options, &venv_dir)?; Ok(()) } #[cfg(any(windows, test))] fn git_bash_path_to_windows(path: &Path) -> Option { let path = path.to_str()?; let bytes = path.as_bytes(); if bytes.len() < 3 || bytes[0] != b'/' || !bytes[1].is_ascii_alphabetic() || bytes[2] != b'/' { return None; } let drive = (bytes[1] as char).to_ascii_uppercase(); Some(PathBuf::from(format!("{drive}:{}", &path[2..]))) } fn normalize_env_venv_path(path: PathBuf) -> PathBuf { #[cfg(windows)] if !path.exists() && let Some(native_path) = git_bash_path_to_windows(&path) && native_path.exists() { debug!( original = %path.display(), normalized = %native_path.display(), "Normalized Git Bash virtualenv path" ); return native_path; } path } fn detect_venv(target: &Target) -> Result { let virtual_env = env::var_os("VIRTUAL_ENV") .map(PathBuf::from) .map(normalize_env_venv_path); let conda_prefix = env::var_os("CONDA_PREFIX") .map(PathBuf::from) .map(normalize_env_venv_path); match (virtual_env, conda_prefix) { (Some(dir), None) => return Ok(dir), (None, Some(dir)) => return Ok(dir), (Some(venv), Some(conda)) if venv == conda => return Ok(venv), (Some(_), Some(_)) => { bail!("Both VIRTUAL_ENV and CONDA_PREFIX are set. Please unset one of them") } (None, None) => { // No env var, try finding .venv } }; let current_dir = env::current_dir().context("Failed to detect current directory ಠ_ಠ")?; // .venv in the current or any parent directory for dir in current_dir.ancestors() { let dot_venv = dir.join(".venv"); if dot_venv.is_dir() { if !dot_venv.join("pyvenv.cfg").is_file() { bail!( "Expected {} to be a virtual environment, but pyvenv.cfg is missing", dot_venv.display() ); } let python = target.get_venv_python(&dot_venv); if !python.is_file() { bail!( "Your virtualenv at {} is broken. It contains a pyvenv.cfg but no python at {}", dot_venv.display(), python.display() ); } debug!("Found a virtualenv named .venv at {}", dot_venv.display()); return Ok(dot_venv); } } bail!( "Couldn't find a virtualenv or conda environment, but you need one to use this command. \ For maturin to find your virtualenv you need to either set VIRTUAL_ENV (through activate), \ set CONDA_PREFIX (through conda activate) or have a virtualenv called .venv in the current \ or any parent folder. \ See https://virtualenv.pypa.io/en/latest/index.html on how to use virtualenv or \ use `maturin build` and `pip install ` instead." ) } #[cfg(test)] mod tests { use super::git_bash_path_to_windows; use std::path::{Path, PathBuf}; #[test] fn test_git_bash_path_to_windows() { assert_eq!( git_bash_path_to_windows(Path::new("/c/Users/me/project/.venv")), Some(PathBuf::from("C:/Users/me/project/.venv")) ); assert_eq!( git_bash_path_to_windows(Path::new("/D/work/project/.venv")), Some(PathBuf::from("D:/work/project/.venv")) ); } #[test] fn test_git_bash_path_to_windows_rejects_native_and_posix_paths() { assert_eq!( git_bash_path_to_windows(Path::new("C:/Users/me/project/.venv")), None ); assert_eq!(git_bash_path_to_windows(Path::new("/usr/local/venv")), None); assert_eq!(git_bash_path_to_windows(Path::new("relative/.venv")), None); } } maturin-1.16.0/src/commands/generate_stubs.rs000066400000000000000000000053761527064705700212560ustar00rootroot00000000000000use anyhow::Result; use fs_err as fs; use maturin::{BuildOptions, BuildOrchestrator, CargoOptions, OutputOptions, PythonOptions}; use std::collections::HashMap; use std::path::{Path, PathBuf}; use tempfile::TempDir; use tracing::instrument; #[instrument(skip_all)] pub fn generate_stubs( output: PathBuf, python_options: PythonOptions, cargo_options: CargoOptions, ) -> Result<()> { let temporary_wheels_dir = TempDir::new()?; let build_context = BuildOptions { python: python_options, cargo: cargo_options, generate_stubs: true, output: OutputOptions { out: Some(temporary_wheels_dir.path().into()), ..Default::default() }, ..Default::default() } .into_build_context() .build()?; let orchestrator = BuildOrchestrator::new(&build_context); let mut stubs = orchestrator.generate_stubs()?; let project_layout = &build_context.project.project_layout; let extension_name = &project_layout.extension_name; // Lay the files out the way `--generate-stubs` lays them out inside a wheel, so that `--out` // can be copied over the python source tree as-is. Without the module directory, // `module-name = "a.b.c"` writes `c.pyi` to the root of `--out` instead of to `a/b/`, where // neither a type checker nor the package build would find it. let module_dir = output.join(project_layout.module_dir()); if project_layout.python_module.is_some() { if stubs.len() == 1 && let Some(stub) = stubs.remove(Path::new("__init__.pyi")) { // Special case, we generate just a `extension_name.pyi` file instead of a __init__.pyi // file: the extension is one module inside an existing package, not a package itself. write_stub(&module_dir.join(format!("{extension_name}.pyi")), &stub)?; } else { // We copy the files into a `extension_name` directory write_stub_dir(&module_dir.join(extension_name), &stubs)?; } } else { // Pure Rust project: maturin generates the package around the extension, so these stubs are // that package's own and keep their `__init__.pyi` name. write_stub_dir(&module_dir, &stubs)?; } Ok(()) } fn write_stub(path: &Path, content: &str) -> Result<()> { if let Some(parent) = path.parent() { fs::create_dir_all(parent)?; } fs::write(path, content)?; Ok(()) } fn write_stub_dir(dir: &Path, stubs: &HashMap) -> Result<()> { if dir.exists() { // We want to replace the stubs so we remove the directory fs::remove_dir_all(dir)?; } fs::create_dir_all(dir)?; for (path, content) in stubs { write_stub(&dir.join(path), content)?; } Ok(()) } maturin-1.16.0/src/commands/mod.rs000066400000000000000000000066731527064705700170240ustar00rootroot00000000000000#[cfg(feature = "zig")] use anyhow::Context; use anyhow::Result; #[cfg(feature = "schemars")] use maturin::GenerateJsonSchemaOptions; #[cfg(feature = "upload")] use maturin::PublishOpt; use maturin::{BridgeModel, Target, TargetTriple}; #[cfg(feature = "scaffolding")] use maturin::{GenerateProjectOptions, ci::GenerateCI}; #[cfg(feature = "upload")] use std::path::PathBuf; use tracing::instrument; pub(crate) mod build; pub(crate) mod develop; pub(crate) mod generate_stubs; pub(crate) mod pep517; #[cfg(feature = "upload")] pub(crate) mod publish; pub(crate) mod sdist; pub(crate) mod utils; /// Shared `--strip` CLI option used by multiple commands. #[derive(Debug, clap::Args, Clone, Copy)] pub struct StripOption { /// Strip the library for minimum file size. /// Can be set to `true` or `false`, or used as a flag (`--strip` implies `true`). #[arg( long, env = "MATURIN_STRIP", // `--strip` without a value is treated as `--strip true` default_missing_value = "true", num_args = 0..=1, require_equals = false )] pub strip: Option, } /// Generate shell completions #[cfg(feature = "cli-completion")] #[instrument(skip_all)] pub fn completions(shell: clap_complete_command::Shell, cmd: &mut clap::Command) { shell.generate(cmd, &mut std::io::stdout()); } /// Search and list the available python installations #[instrument(skip_all)] pub fn list_python(target: Option) -> Result<()> { let found = if target.is_some() { let target = Target::from_target_triple(target.as_ref())?; maturin::PythonInterpreter::lookup_target(&target, None, None) } else { let target = Target::from_target_triple(None)?; // We don't know the targeted bindings yet, so we use the most lenient maturin::PythonInterpreter::find_all(&target, &BridgeModel::Cffi, None)? }; eprintln!("ðŸ�� {} python interpreter found:", found.len()); for interpreter in found { eprintln!(" - {interpreter}"); } Ok(()) } /// Create a new cargo project in an existing directory #[cfg(feature = "scaffolding")] #[instrument(skip_all)] pub fn init_project(path: Option, options: GenerateProjectOptions) -> Result<()> { maturin::init_project(path, options) } /// Create a new cargo project #[cfg(feature = "scaffolding")] #[instrument(skip_all)] pub fn new_project(path: String, options: GenerateProjectOptions) -> Result<()> { maturin::new_project(path, options) } /// Generate CI configuration #[cfg(feature = "scaffolding")] #[instrument(skip_all)] pub fn generate_ci(generate_ci: GenerateCI) -> Result<()> { generate_ci.execute() } /// Generate the JSON schema for the `pyproject.toml` file. #[cfg(feature = "schemars")] #[instrument(skip_all)] pub fn generate_json_schema(args: GenerateJsonSchemaOptions) -> Result<()> { maturin::generate_json_schema(args) } /// Upload python packages to pypi #[cfg(feature = "upload")] #[instrument(skip_all)] pub fn upload(mut publish: PublishOpt, files: Vec) -> Result<()> { if files.is_empty() { eprintln!("âš ï¸� Warning: No files given, exiting."); return Ok(()); } publish.non_interactive_on_ci(); maturin::upload_ui(&files, &publish)?; Ok(()) } /// Zig linker wrapper #[cfg(feature = "zig")] #[instrument(skip_all)] pub fn zig(subcommand: cargo_zigbuild::Zig) -> Result<()> { subcommand .execute() .context("Failed to run zig linker wrapper") } maturin-1.16.0/src/commands/pep517.rs000066400000000000000000000154121527064705700172550ustar00rootroot00000000000000use anyhow::{Context, Result, bail}; use clap::Subcommand; use ignore::overrides::Override; use maturin::{ BuildContext, BuildOptions, BuildOrchestrator, CargoOptions, OutputOptions, PathWriter, VirtualWriter, write_dist_info, }; use std::path::PathBuf; use tracing::instrument; use crate::commands::StripOption; /// Backend for the PEP 517 integration. Not for human consumption /// /// The commands are meant to be called from the python PEP 517 #[derive(Debug, Subcommand)] #[command(name = "pep517", hide = true)] pub enum Pep517Command { /// The implementation of prepare_metadata_for_build_wheel #[command(name = "write-dist-info")] WriteDistInfo { #[command(flatten)] build_options: BuildOptions, /// The metadata_directory argument to prepare_metadata_for_build_wheel #[arg(long = "metadata-directory")] metadata_directory: PathBuf, #[command(flatten)] strip_opt: StripOption, /// Build with Profile-Guided Optimization (PGO) #[arg(long, env = "MATURIN_PGO", value_parser = clap::builder::FalseyValueParser::new())] pgo: bool, }, #[command(name = "build-wheel")] /// Implementation of build_wheel BuildWheel { #[command(flatten)] build_options: BuildOptions, #[command(flatten)] strip_opt: StripOption, /// Build with Profile-Guided Optimization (PGO) #[arg(long, env = "MATURIN_PGO", value_parser = clap::builder::FalseyValueParser::new())] pgo: bool, /// Build editable wheels #[arg(long)] editable: bool, }, /// The implementation of build_sdist #[command(name = "write-sdist")] WriteSDist { /// The sdist_directory argument to build_sdist #[arg(long = "sdist-directory")] sdist_directory: PathBuf, #[arg(short = 'm', long = "manifest-path", value_name = "PATH")] /// The path to the Cargo.toml manifest_path: Option, }, } /// Ensure a PEP 517 hook is scoped to the single interpreter running pip. /// /// Duplicate interpreter paths can be supplied when user-set /// `MATURIN_PEP517_ARGS=--interpreter ...` combines with the auto-injected /// interpreter, so collapse duplicates first. Only genuinely different /// interpreters should error here, before later hook code can panic. fn require_single_interpreter(opts: &mut BuildOptions, cmd: &str) -> Result<()> { let mut seen = std::collections::HashSet::new(); opts.python.interpreter.retain(|p| seen.insert(p.clone())); if opts.python.interpreter.len() > 1 { bail!( "`maturin pep517 {cmd}` expects exactly one --interpreter, got {}: {:?}", opts.python.interpreter.len(), opts.python.interpreter, ); } Ok(()) } /// Dispatches into the native implementations of the PEP 517 functions /// /// The last line of stdout is used as return value from the python part of the implementation #[instrument(skip_all)] pub fn pep517(subcommand: Pep517Command) -> Result<()> { // PEP 517 builds default to release profile. fn ensure_release_profile(context: &mut BuildContext) { if context.project.cargo_options.profile.is_none() { context.project.cargo_options.profile = Some("release".to_string()); } } match subcommand { Pep517Command::WriteDistInfo { mut build_options, metadata_directory, strip_opt, pgo, } => { require_single_interpreter(&mut build_options, "write-dist-info")?; let mut context = build_options .into_build_context() .strip(strip_opt.strip) .editable(false) .pgo(pgo) .build()?; ensure_release_profile(&mut context); let mut writer = VirtualWriter::new(PathWriter::from_path(metadata_directory), Override::empty()); let orchestrator = BuildOrchestrator::new(&context); let dist_info_dir = write_dist_info( &mut writer, &context.project.project_layout.project_root, &context.project.metadata24, &orchestrator.tags_from_bridge()?, )?; writer.finish()?; println!("{}", dist_info_dir.display()); } Pep517Command::BuildWheel { mut build_options, strip_opt, pgo, editable, } => { require_single_interpreter(&mut build_options, "build-wheel")?; let mut build_context = build_options .into_build_context() .strip(strip_opt.strip) .editable(editable) .pgo(pgo) .build()?; ensure_release_profile(&mut build_context); let orchestrator = BuildOrchestrator::new(&build_context); let wheels = orchestrator.build_wheels()?; if wheels.len() != 1 { bail!( "expected exactly one wheel to be built, got {}: {:?}", wheels.len(), wheels .iter() .map(|wheel| wheel.path.display().to_string()) .collect::>(), ); } let wheel_path = wheels[0].path.to_str().with_context(|| { format!( "wheel path is not valid UTF-8: {}", wheels[0].path.display() ) })?; println!("{wheel_path}"); } Pep517Command::WriteSDist { sdist_directory, manifest_path, } => { let build_options = BuildOptions { output: OutputOptions { out: Some(sdist_directory), ..Default::default() }, cargo: CargoOptions { manifest_path, // Enable all features to ensure all optional path dependencies are packaged // into source distribution all_features: true, ..Default::default() }, ..Default::default() }; let build_context = build_options .into_build_context() .strip(Some(false)) .editable(false) .sdist_only(true) .build()?; let orchestrator = BuildOrchestrator::new(&build_context); let sdist = orchestrator .build_source_distribution()? .context("Failed to build source distribution, pyproject.toml not found")?; println!("{}", sdist.path.file_name().unwrap().to_str().unwrap()); } }; Ok(()) } maturin-1.16.0/src/commands/publish.rs000066400000000000000000000042271527064705700177040ustar00rootroot00000000000000use crate::commands::utils::unpack_sdist_for_build; use anyhow::Result; use maturin::{ BuildOptions, BuildOrchestrator, BuiltArtifactTag, BuiltWheel, PublishOpt, upload_ui, }; use tracing::instrument; #[instrument(skip_all)] pub fn publish( mut build: BuildOptions, mut publish: PublishOpt, debug: bool, no_strip: bool, no_sdist: bool, pgo: bool, ) -> Result<()> { // set profile to dev if specified; `--debug` and `--profile` are mutually exclusive // // do it here to take precedence over pyproject.toml profile setting if debug { build.cargo.profile = Some("dev".to_string()); } // Keep tempdir alive for the duration of the build let _sdist_tmp; let mut sdist_path = None; let sdist_pyproject_path; if !no_sdist { let (path, unpacked) = unpack_sdist_for_build(&mut build, Some(!no_strip))?; sdist_pyproject_path = unpacked.pyproject_toml_path.clone(); _sdist_tmp = Some(unpacked); sdist_path = Some(path); } else { _sdist_tmp = None; sdist_pyproject_path = None; } let mut build_context = build .into_build_context() .strip(Some(!no_strip)) .editable(false) .pyproject_toml_path(sdist_pyproject_path) .pgo(pgo) .build()?; // ensure profile always set when publishing // (respect pyproject.toml if set) // don't need to check `debug` here, set above to take precedence if set let profile = build_context .project .cargo_options .profile .get_or_insert_with(|| "release".to_string()); if profile == "dev" { eprintln!("âš ï¸� Warning: You're publishing debug wheels"); } let orchestrator = BuildOrchestrator::new(&build_context); let mut wheels = orchestrator.build_wheels()?; if let Some(sdist_path) = sdist_path { wheels.push(BuiltWheel { path: sdist_path, tag: BuiltArtifactTag::Source, }); } let items = wheels .into_iter() .map(|wheel| wheel.path) .collect::>(); publish.non_interactive_on_ci(); upload_ui(&items, &publish)?; Ok(()) } maturin-1.16.0/src/commands/sdist.rs000066400000000000000000000032761527064705700173670ustar00rootroot00000000000000use anyhow::{Context, Result}; use maturin::{BuildOptions, BuildOrchestrator, CargoOptions, OutputOptions, find_path_deps}; use std::path::PathBuf; use tracing::instrument; #[instrument(skip_all)] pub fn sdist(manifest_path: Option, out: Option) -> Result<()> { // Get cargo metadata to check for path dependencies let cargo_metadata_result = cargo_metadata::MetadataCommand::new() .cargo_path("cargo") .manifest_path( manifest_path .as_deref() .unwrap_or_else(|| std::path::Path::new("Cargo.toml")), ) .verbose(true) .exec(); let has_path_deps = cargo_metadata_result .ok() .and_then(|metadata| find_path_deps(&metadata).ok()) .map(|path_deps| !path_deps.is_empty()) .unwrap_or(false); // If we can't get metadata, don't force all features let build_options = BuildOptions { output: OutputOptions { out, ..Default::default() }, cargo: CargoOptions { manifest_path, // Only enable all features when we have local path dependencies // to ensure they are packaged into source distribution all_features: has_path_deps, ..Default::default() }, ..Default::default() }; let build_context = build_options .into_build_context() .strip(Some(false)) .editable(false) .sdist_only(true) .build()?; let orchestrator = BuildOrchestrator::new(&build_context); orchestrator .build_source_distribution()? .context("Failed to build source distribution, pyproject.toml not found")?; Ok(()) } maturin-1.16.0/src/commands/utils.rs000066400000000000000000000040331527064705700173710ustar00rootroot00000000000000use anyhow::{Context, Result}; use maturin::{BuildOptions, BuildOrchestrator, UnpackedSdist, unpack_sdist}; use std::path::PathBuf; /// Result of unpacking an sdist for wheel building pub struct UnpackedBuild { /// Must be kept alive for the duration of the build _tmpdir: tempfile::TempDir, pub pyproject_toml_path: Option, } /// Build a source distribution from the given build options, returning the sdist path. pub fn build_sdist(build: &BuildOptions, strip: Option) -> Result { let sdist_context = build .clone() .into_build_context() .strip(strip) .editable(false) .sdist_only(true) .build()?; let orchestrator = BuildOrchestrator::new(&sdist_context); let sdist = orchestrator .build_source_distribution()? .context("Failed to build source distribution, pyproject.toml not found")?; Ok(sdist.path) } /// Build an sdist, unpack it, and point build options at the unpacked source. /// /// Returns the sdist path and the temporary directory holding the unpacked tree. pub fn unpack_sdist_for_build( build: &mut BuildOptions, strip: Option, ) -> Result<(PathBuf, UnpackedBuild)> { let sdist_path = build_sdist(build, strip)?; // Preserve the original output directory so that wheels built // from the unpacked sdist still land in the user-visible // `target/wheels` (or the explicit `--out` directory) instead // of the temporary directory's target. if build.output.out.is_none() { build.output.out = sdist_path.parent().map(PathBuf::from); } let UnpackedSdist { tmpdir, cargo_toml, pyproject_toml, } = unpack_sdist(&sdist_path)?; eprintln!( "📦 Building wheels from source distribution at {}", cargo_toml.parent().unwrap().display() ); build.cargo.manifest_path = Some(cargo_toml); Ok(( sdist_path, UnpackedBuild { _tmpdir: tmpdir, pyproject_toml_path: Some(pyproject_toml), }, )) } maturin-1.16.0/src/compile.rs000066400000000000000000001442561527064705700160740ustar00rootroot00000000000000#[cfg(feature = "zig")] use crate::PlatformTag; use crate::target::{RUST_1_64_0, RUST_1_93_0, rustc_macosx_target_version}; use crate::{BridgeModel, BuildContext, PythonInterpreter, Target}; use anyhow::{Context, Result, anyhow, bail}; use cargo_metadata::CrateType; use fat_macho::FatWriter; use fs_err::{self as fs, File}; use normpath::PathExt; use std::collections::{HashMap, HashSet}; use std::env; use std::io::BufReader; use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; use std::str; use tracing::{debug, instrument, trace}; /// The first version of pyo3 that supports building Windows abi3 wheel /// without `PYO3_NO_PYTHON` environment variable const PYO3_ABI3_NO_PYTHON_VERSION: (u64, u64, u64) = (0, 16, 4); /// The first version of pyo3 that has a target_abi parameter in build /// configuration files const PYO3_TARGET_ABI_PARAMETER_VERSION: (u64, u64, u64) = (0, 29, 0); /// crate types excluding `bin`, `cdylib` and `proc-macro` pub(crate) const LIB_CRATE_TYPES: [CrateType; 4] = [ CrateType::Lib, CrateType::DyLib, CrateType::RLib, CrateType::StaticLib, ]; const MISSING_CDYLIB_HINT: &str = "Did you miss crate-type = [\"cdylib\"] in the lib section of your Cargo.toml?"; pub(crate) fn missing_cdylib_message(arch: Option<&str>) -> String { match arch { Some(arch) => { let article = if arch == "aarch64" { "an" } else { "a" }; format!("Cargo didn't build {article} {arch} cdylib. {MISSING_CDYLIB_HINT}") } None => format!("Cargo didn't build a cdylib. {MISSING_CDYLIB_HINT}"), } } pub(crate) fn missing_cdylib_error(arch: Option<&str>) -> anyhow::Error { anyhow!("{}", missing_cdylib_message(arch)) } /// A single-architecture thin binary artifact for universal2 builds. /// /// Used during macOS wheel repair to analyze dependencies per-architecture, /// since lddtree can only analyze one arch at a time from a fat binary. #[derive(Debug, Clone)] pub struct ThinArtifact { /// Target architecture name (e.g., "arm64", "x86_64") pub arch: String, /// Path to the thin binary pub path: PathBuf, /// Library search paths for this architecture pub linked_paths: Vec, } /// State of the artifact's cargo output path during the wheel build. /// /// `BuildArtifact::path` always points at the file the build pipeline is /// currently working with (initially the cargo output path itself, then /// the staged copy in `target/maturin/`). This enum tracks the state of /// the *original* cargo output path — the one cargo wrote to and that /// cargo's incremental cache, IDEs, and CI scripts will read after the /// build completes — so [`finalize_staged_artifacts`] and /// [`copy_back_cargo_outputs`] can dispatch on a typed state instead of /// stat-ing the filesystem and inferring the staging mode from /// `cargo_output.exists()`. The typed state makes the contract between /// `stage_file`, `copy_back_cargo_outputs`, and `finalize_staged_artifacts` /// impossible to violate silently — see #2969 / #3111. /// /// [`copy_back_cargo_outputs`]: crate::build_context::repair::copy_back_cargo_outputs /// [`finalize_staged_artifacts`]: crate::build_context::repair::finalize_staged_artifacts #[derive(Debug, Clone)] pub enum CargoOutputState { /// The artifact has not been staged: it is still at its original /// cargo output path. Initial state set by every `BuildArtifact` /// constructor. NotStaged, /// `stage_file` renamed the artifact away from cargo's path; the /// cargo output path is currently empty and finalize must rename /// the staged file back to it. Renamed { /// The cargo output path the staged artifact must be returned to. cargo_output: PathBuf, }, /// `stage_file` reflinked/copied to staging because rename hit /// `ErrorKind::CrossesDevices`; the cargo output path still holds /// the unpatched original. Finalize just drops the staged duplicate. Mirrored { /// The cargo output path that already holds the unpatched bytes. cargo_output: PathBuf, }, /// `copy_back_cargo_outputs` has restored unpatched bytes at the /// cargo output path and the staged artifact is about to be (or has /// been) rewritten in place by the platform repairer. Finalize must /// NOT touch the cargo output path on this artifact — see #2969. Patched, } /// A cargo build artifact #[derive(Debug, Clone)] pub struct BuildArtifact { /// Path to the build artifact pub path: PathBuf, /// Path to the Windows import library (.dll.lib or .dll.a), if any pub import_lib_path: Option, /// Path to the debug info file (.pdb on Windows, .dSYM on macOS, .dwp on Linux), if any pub debuginfo_path: Option, /// Array of paths to include in the library search path, as indicated by /// the `cargo:rustc-link-search` instruction. pub linked_paths: Vec, /// For universal2 builds: per-architecture thin binaries used for accurate /// per-arch dependency analysis during macOS wheel repair. pub thin_artifacts: Vec, /// Tracks where the artifact lives relative to its original cargo /// output path. Initially `NotStaged`; transitioned by `stage_file` /// (to `Renamed` or `Mirrored`), `copy_back_cargo_outputs` (to /// `Patched`), and consumed by `finalize_staged_artifacts`. See /// [`CargoOutputState`] for the per-variant meaning. pub staging: CargoOutputState, } /// Result of compiling one or more cargo targets. #[derive(Debug, Clone)] pub struct CompileResult { /// Per-target mapping from crate type to build artifact. pub artifacts: Vec>, /// Map of package name to OUT_DIR path from build script execution. pub out_dirs: HashMap, } /// Builds the rust crate into a native module (i.e. an .so or .dll) for a /// specific python version. Returns a mapping from crate type (e.g. cdylib) /// to artifact location. pub fn compile( context: &BuildContext, python_interpreter: Option<&PythonInterpreter>, targets: &[cargo_metadata::Target], ) -> Result { if context.project.universal2 { compile_universal2(context, python_interpreter, targets) } else { compile_targets(context, python_interpreter, targets) } } /// Filter cargo targets based on bridge model and optional configuration. pub(crate) fn filter_cargo_targets( cargo_metadata: &cargo_metadata::Metadata, bridge: &BridgeModel, config_targets: Option<&[crate::pyproject_toml::CargoTarget]>, ) -> Result> { let root_pkg = cargo_metadata .root_package() .ok_or_else(|| anyhow!("No root package found in cargo metadata"))?; let resolved_features: Vec = cargo_metadata .resolve .as_ref() .and_then(|resolve| resolve.nodes.iter().find(|&node| node.id == root_pkg.id)) .map(|node| node.features.iter().map(|f| f.to_string()).collect()) .unwrap_or_default(); let mut targets: Vec<_> = root_pkg .targets .iter() .filter(|&target| match bridge { BridgeModel::Bin(_) => { let is_bin = target.is_bin(); if target.required_features.is_empty() { is_bin } else { // Check all required features are enabled for this bin target is_bin && target .required_features .iter() .all(|f| resolved_features.contains(f)) } } _ => target.crate_types.contains(&CrateType::CDyLib), }) .cloned() .collect(); if targets.is_empty() && !bridge.is_bin() { // No `crate-type = ["cdylib"]` in `Cargo.toml` // Let's try compile one of the target with `--crate-type cdylib` let lib_target = root_pkg.targets.iter().find(|target| { target .crate_types .iter() .any(|crate_type| LIB_CRATE_TYPES.contains(crate_type)) }); if let Some(target) = lib_target { targets.push(target.clone()); } } // Filter targets by config_targets if let Some(config_targets) = config_targets { targets.retain(|target| { config_targets.iter().any(|config_target| { let name_eq = config_target.name == target.name; match &config_target.kind { Some(kind) => name_eq && target.crate_types.contains(&CrateType::from(*kind)), None => name_eq, } }) }); if targets.is_empty() { bail!( "No Cargo targets matched by `package.metadata.maturin.targets`, please check your `Cargo.toml`" ); } else { let target_names = targets .iter() .map(|target| target.name.as_str()) .collect::>(); eprintln!( "🎯 Found {} Cargo targets in `Cargo.toml`: {}", targets.len(), target_names.join(", ") ); } } Ok(targets) } /// Build an universal2 wheel for macos which contains both an x86 and an aarch64 binary fn compile_universal2( context: &BuildContext, python_interpreter: Option<&PythonInterpreter>, targets: &[cargo_metadata::Target], ) -> Result { let mut aarch64_context = context.clone(); aarch64_context.project.target = Target::from_resolved_target_triple("aarch64-apple-darwin")?; let aarch64_result = compile_targets(&aarch64_context, python_interpreter, targets) .context("Failed to build a aarch64 library through cargo")?; let mut x86_64_context = context.clone(); x86_64_context.project.target = Target::from_resolved_target_triple("x86_64-apple-darwin")?; let x86_64_result = compile_targets(&x86_64_context, python_interpreter, targets) .context("Failed to build a x86_64 library through cargo")?; let mut universal_artifacts = Vec::with_capacity(targets.len()); let build_type = if context.project.bridge().is_bin() { CrateType::Bin } else { CrateType::CDyLib }; for (aarch64_artifact, x86_64_artifact) in aarch64_result .artifacts .iter() .zip(&x86_64_result.artifacts) { let aarch64_artifact = aarch64_artifact.get(&build_type).cloned().ok_or_else(|| { if build_type == CrateType::CDyLib { missing_cdylib_error(Some("aarch64")) } else { anyhow!("Cargo didn't build an aarch64 bin.") } })?; let x86_64_artifact = x86_64_artifact.get(&build_type).cloned().ok_or_else(|| { if build_type == CrateType::CDyLib { missing_cdylib_error(Some("x86_64")) } else { anyhow!("Cargo didn't build a x86_64 bin.") } })?; // Create an universal dylib let output_path = aarch64_artifact .path .display() .to_string() .replace("aarch64-apple-darwin/", ""); let mut writer = FatWriter::new(); let aarch64_file = fs::read(&aarch64_artifact.path)?; let x86_64_file = fs::read(&x86_64_artifact.path)?; writer .add(aarch64_file) .map_err(|e| anyhow!("Failed to add aarch64 cdylib: {:?}", e))?; writer .add(x86_64_file) .map_err(|e| anyhow!("Failed to add x86_64 cdylib: {:?}", e))?; writer .write_to_file(&output_path) .map_err(|e| anyhow!("Failed to create universal cdylib: {:?}", e))?; let mut result = HashMap::new(); // Union linked_paths from both architectures for editable installs // (patch_editable uses these to set RPATH to cargo target dirs). // Use a HashSet to deduplicate in O(n) instead of O(n²). let mut seen_paths: HashSet<&str> = HashSet::new(); let mut linked_paths = Vec::new(); for p in aarch64_artifact .linked_paths .iter() .chain(&x86_64_artifact.linked_paths) { if seen_paths.insert(p.as_str()) { linked_paths.push(p.clone()); } } // Store per-arch thin binaries for accurate dependency analysis. // Each arch may have different dependencies (e.g., arch-specific // native libraries), and lddtree can only analyze one arch at a time. let thin_artifacts = vec![ ThinArtifact { arch: "arm64".to_string(), path: aarch64_artifact.path.clone(), linked_paths: aarch64_artifact.linked_paths.clone(), }, ThinArtifact { arch: "x86_64".to_string(), path: x86_64_artifact.path.clone(), linked_paths: x86_64_artifact.linked_paths.clone(), }, ]; let universal_artifact = BuildArtifact { path: PathBuf::from(output_path), import_lib_path: None, debuginfo_path: None, linked_paths, thin_artifacts, staging: CargoOutputState::NotStaged, }; result.insert(build_type.clone(), universal_artifact); universal_artifacts.push(result); } // Note: we use x86_64 OUT_DIR paths for universal2 builds. // OUT_DIR files are expected to be architecture-independent (e.g. generated // Python code or data); architecture-specific generated files are not // supported in universal2 mode. Ok(CompileResult { artifacts: universal_artifacts, out_dirs: x86_64_result.out_dirs, }) } fn compile_targets( context: &BuildContext, python_interpreter: Option<&PythonInterpreter>, targets: &[cargo_metadata::Target], ) -> Result { let mut artifacts = Vec::with_capacity(targets.len()); let mut out_dirs = HashMap::new(); for cargo_target in targets { let build_command = cargo_build_command(context, python_interpreter, cargo_target)?; let (target_artifacts, target_out_dirs) = compile_target(context, build_command)?; artifacts.push(target_artifacts); out_dirs.extend(target_out_dirs); } Ok(CompileResult { artifacts, out_dirs, }) } fn cargo_build_command( context: &BuildContext, python_interpreter: Option<&PythonInterpreter>, cargo_target: &cargo_metadata::Target, ) -> Result { use crate::pyproject_toml::{FeatureConditionEnv, FeatureSpec}; let target = &context.project.target; let user_specified_target = if target.user_specified { Some(target.target_triple().to_string()) } else { None }; let mut cargo_options = context.project.cargo_options.clone(); // Resolve conditional features based on the target Python version and implementation if let Some(interpreter) = python_interpreter { let env = FeatureConditionEnv { major: interpreter.major, minor: interpreter.minor, implementation_name: &interpreter.implementation_name, }; let extra = FeatureSpec::resolve_conditional(&context.project.conditional_features, &env); if !extra.is_empty() { debug!( "Enabling conditional features for Python {} {}.{}: {}", interpreter.implementation_name, interpreter.major, interpreter.minor, extra.join(", ") ); for feature in extra { if !cargo_options.features.contains(&feature) { cargo_options.features.push(feature); } } } } let mut cargo_rustc = cargo_options.into_rustc_options(user_specified_target); cargo_rustc.message_format = vec!["json-render-diagnostics".to_string()]; // Add `--crate-type cdylib` if available if cargo_target .crate_types .iter() .any(|crate_type| LIB_CRATE_TYPES.contains(crate_type)) { // `--crate-type` is stable since Rust 1.64.0 // See https://github.com/rust-lang/cargo/pull/10838 if target.rustc_version.semver >= RUST_1_64_0 { debug!("Setting crate_type to cdylib for Rust >= 1.64.0"); cargo_rustc.crate_type = vec!["cdylib".to_string()]; } } let target_triple = target.target_triple(); let manifest_dir = context.project.manifest_path.parent().unwrap(); let mut rustflags = cargo_config2::Config::load_with_cwd(manifest_dir)? .rustflags(target_triple)? .unwrap_or_default(); let original_rustflags = rustflags.flags.clone(); // Inject PGO flags if a PGO build phase is active if let Some(ref pgo_phase) = context.artifact.pgo_phase { match pgo_phase { crate::pgo::PgoPhase::Generate(profdata_dir) => { rustflags .flags .push(format!("-Cprofile-generate={}", profdata_dir.display())); } crate::pgo::PgoPhase::Use(profdata_path) => { rustflags .flags .push(format!("-Cprofile-use={}", profdata_path.display())); } } } let bridge_model = context.project.bridge(); configure_bin_lib_flags( &mut cargo_rustc, &mut rustflags, cargo_target, bridge_model, target, ); configure_platform_linker_args( &mut cargo_rustc, &mut rustflags, target, bridge_model, &context.project.module_name, python_interpreter, #[cfg(feature = "zig")] context.python.zig, #[cfg(feature = "zig")] &context.project.target_dir, ); if context.artifact.strip { // https://doc.rust-lang.org/rustc/codegen-options/index.html#strip cargo_rustc .args .extend(["-C".to_string(), "strip=symbols".to_string()]); } configure_debuginfo_flags(&mut rustflags, target, context.artifact.include_debuginfo)?; let mut build_command = create_build_command(context, cargo_rustc, target_triple)?; if !rustflags.flags.is_empty() && rustflags.flags != original_rustflags { build_command.env("CARGO_ENCODED_RUSTFLAGS", rustflags.encode()?); } configure_pyo3_env( &mut build_command, context, python_interpreter, bridge_model, target, target_triple, )?; Ok(build_command) } /// Configure --bin / --lib flags and musl-related rustflags. fn configure_bin_lib_flags( cargo_rustc: &mut cargo_options::Rustc, rustflags: &mut cargo_config2::Flags, cargo_target: &cargo_metadata::Target, bridge_model: &BridgeModel, target: &Target, ) { match bridge_model { BridgeModel::Bin(..) => { cargo_rustc.bin.push(cargo_target.name.clone()); } BridgeModel::Cffi | BridgeModel::UniFfi | BridgeModel::PyO3 { .. } => { cargo_rustc.lib = true; // https://github.com/rust-lang/rust/issues/59302#issue-422994250 // We must only do this for libraries as it breaks binaries // For some reason this value is ignored when passed as rustc argument if target.is_musl_libc() && !rustflags .flags .iter() .any(|f| f == "target-feature=-crt-static") { debug!("Setting `-C target-features=-crt-static` for musl dylib"); rustflags.push("-C"); rustflags.push("target-feature=-crt-static"); } } } } /// Configure platform-specific linker arguments (macOS PyO3, Emscripten, Windows GNU + zig). #[allow(clippy::too_many_arguments)] fn configure_platform_linker_args( cargo_rustc: &mut cargo_options::Rustc, rustflags: &mut cargo_config2::Flags, target: &Target, bridge_model: &BridgeModel, module_name: &str, python_interpreter: Option<&PythonInterpreter>, #[cfg(feature = "zig")] zig: bool, #[cfg(feature = "zig")] target_dir: &Path, ) { if target.is_macos() { if let BridgeModel::PyO3 { .. } = bridge_model { configure_macos_pyo3_linker_args( cargo_rustc, rustflags, target, bridge_model, module_name, python_interpreter, ); } } else if target.is_emscripten() { configure_emscripten_args(cargo_rustc, rustflags, target); } // When using zig as the linker for windows-gnu targets, the PyInit symbol // is not exported. Work around this by generating a .def file that explicitly // exports the symbol. // See https://github.com/PyO3/maturin/issues/922 #[cfg(feature = "zig")] if zig && target.is_windows() && !target.is_msvc() && matches!(bridge_model, BridgeModel::PyO3 { .. } | BridgeModel::Cffi) { let py_init = format!("PyInit_{module_name}"); let maturin_dir = ensure_target_maturin_dir(target_dir); let def_path = maturin_dir.join(format!("{module_name}.def")); let def_contents = format!("LIBRARY {module_name}\nEXPORTS\n {py_init}\n"); if let Err(e) = fs::write(&def_path, def_contents) { eprintln!("âš ï¸� Warning: Failed to write .def file for zig windows-gnu workaround: {e}"); } else { debug!( "Generated .def file at {} for zig windows-gnu export workaround", def_path.display() ); rustflags.push("-C"); rustflags.push(format!("link-arg={}", def_path.display())); } } } /// Configure macOS-specific linker arguments for PyO3 builds. /// /// Changes LC_ID_DYLIB to the final .so name to avoid linking with /// non-existent library. /// See https://github.com/PyO3/pyo3/issues/88#issuecomment-337744403 /// See https://github.com/PyO3/setuptools-rust/issues/106 for detail fn configure_macos_pyo3_linker_args( cargo_rustc: &mut cargo_options::Rustc, rustflags: &mut cargo_config2::Flags, target: &Target, bridge_model: &BridgeModel, module_name: &str, python_interpreter: Option<&PythonInterpreter>, ) { // Pass -undefined dynamic_lookup via CARGO_ENCODED_RUSTFLAGS so they apply // to all crates in the dependency graph, not just the top-level crate. // This fixes link errors when a dependency also uses pyo3 with a cdylib target. // See https://github.com/PyO3/maturin/issues/1080 let has_undefined = rustflags .flags .iter() .any(|f| f == "link-arg=-undefined" || f == "-Clink-arg=-undefined"); let has_dynamic_lookup = rustflags .flags .iter() .any(|f| f == "link-arg=dynamic_lookup" || f == "-Clink-arg=dynamic_lookup"); if !has_undefined { rustflags.push("-C"); rustflags.push("link-arg=-undefined"); } if !has_dynamic_lookup { rustflags.push("-C"); rustflags.push("link-arg=dynamic_lookup"); } // install_name is specific to the top-level output, so keep it in cargo_rustc.args let stable_abi_suffix = python_interpreter.and_then(|i| { bridge_model .stable_abi_for_interpreter(i) .map(|stable_abi| { let min_version = stable_abi .version .min_version() .unwrap_or((i.major as u8, i.minor as u8)); target.stable_abi_extension_suffix(stable_abi.kind, min_version, Some(i)) }) }); let so_filename = if let Some(suffix) = stable_abi_suffix { format!("{module_name}{suffix}") } else { python_interpreter .expect("missing python interpreter for non-abi3 wheel build") .get_library_name(module_name) }; let macos_dylib_install_name = format!("link-args=-Wl,-install_name,@rpath/{so_filename}"); let install_name_args = ["-C".to_string(), macos_dylib_install_name]; debug!( "Setting macOS install_name via cargo rustc args: {:?}", install_name_args ); cargo_rustc.args.extend(install_name_args); } /// Configure Emscripten-specific linker arguments and rustflags. fn configure_emscripten_args( cargo_rustc: &mut cargo_options::Rustc, rustflags: &mut cargo_config2::Flags, target: &Target, ) { // The -Z link-native-libraries=no flag is needed for older Rust versions // where Emscripten builds fail without it due to the behavior that it links // libc automatically. // From Rust 1.93.0, it is possible to build Emscripten with stable toolchain // and this flag can be and should be removed. if target.rustc_version.semver < RUST_1_93_0 && !rustflags .flags .iter() .any(|f| f.contains("link-native-libraries")) { debug!("Setting `-Z link-native-libraries=no` for Emscripten (rust < 1.93.0)"); rustflags.push("-Z"); rustflags.push("link-native-libraries=no"); } let mut emscripten_args = Vec::new(); // Allow user to override these default settings if !cargo_rustc .args .iter() .any(|arg| arg.contains("SIDE_MODULE")) { emscripten_args.push("-C".to_string()); emscripten_args.push("link-arg=-sSIDE_MODULE=2".to_string()); } if !cargo_rustc .args .iter() .any(|arg| arg.contains("WASM_BIGINT")) { emscripten_args.push("-C".to_string()); emscripten_args.push("link-arg=-sWASM_BIGINT".to_string()); } debug!( "Setting additional linker args for Emscripten: {:?}", emscripten_args ); cargo_rustc.args.extend(emscripten_args); } /// Configure split-debuginfo rustflags when --include-debuginfo is enabled. fn configure_debuginfo_flags( rustflags: &mut cargo_config2::Flags, target: &Target, include_debuginfo: bool, ) -> Result<()> { if !include_debuginfo { return Ok(()); } // When including debug info, ensure split-debuginfo is set appropriately. // The only incompatible case is `unpacked` on Linux, where debug info is // scattered into .dwo files that cargo doesn't report in its output. // On macOS `unpacked` still produces .dSYM bundles, and `off` (embedded) // is fine everywhere — the debug info lives in the binary itself. let has_split_debuginfo = rustflags .flags .iter() .any(|f| f.contains("split-debuginfo")); if has_split_debuginfo { let has_unpacked = rustflags .flags .iter() .any(|f| f.contains("split-debuginfo=unpacked")); if has_unpacked && target.is_linux() { bail!( "split-debuginfo=unpacked is incompatible with --include-debuginfo on Linux \ because debug info is scattered into .dwo files that cannot be included. \ Use `-C split-debuginfo=packed` or `-C split-debuginfo=off` instead." ); } } else if target.is_macos() { // On macOS the Cargo default is `unpacked`. Use `packed` to // produce .dSYM bundles that cargo reports in its output. debug!("Setting `-C split-debuginfo=packed` for --include-debuginfo on macOS"); rustflags.push("-C"); rustflags.push("split-debuginfo=packed"); } // On Linux the default is `off` (embedded), on Windows MSVC it is // `packed` (.pdb) — both are fine as-is. Ok(()) } /// Create the build command using the appropriate backend (xwin, zig, or plain cargo). fn create_build_command( context: &BuildContext, cargo_rustc: cargo_options::Rustc, target_triple: &str, ) -> Result { let target = &context.project.target; let mut build_command = if target.is_msvc() && target.cross_compiling() { #[cfg(feature = "xwin")] { // Don't use xwin if the Windows MSVC compiler can compile to the target let native_compile = target.host_triple().contains("windows-msvc") && cc::Build::new() .opt_level(0) .host(target.host_triple()) .target(target_triple) .cargo_metadata(false) .cargo_warnings(false) .cargo_output(false) .try_get_compiler() .is_ok(); let force_xwin = env::var("MATURIN_USE_XWIN").ok().as_deref() == Some("1"); if !native_compile || force_xwin { println!("🛠ï¸� Using xwin for cross-compiling to {target_triple}"); let xwin_options = { use clap::Parser; // This will populate the default values for the options // and then override them with cargo-xwin environment variables. cargo_xwin::XWinOptions::parse_from(Vec::<&str>::new()) }; let mut build = cargo_xwin::Rustc::from(cargo_rustc); build.cargo.target = vec![target_triple.to_string()]; build.xwin = xwin_options; build.build_command()? } else { let mut cargo_rustc = cargo_rustc; if target.user_specified { cargo_rustc.target = vec![target_triple.to_string()]; } cargo_rustc.command() } } #[cfg(not(feature = "xwin"))] { let mut cargo_rustc = cargo_rustc; if target.user_specified { cargo_rustc.target = vec![target_triple.to_string()]; } cargo_rustc.command() } } else { #[cfg(feature = "zig")] { let mut build = cargo_zigbuild::Rustc::from(cargo_rustc); if !context.python.zig { build.disable_zig_linker = true; if target.user_specified { build.cargo.target = vec![target_triple.to_string()]; } } else { println!("🛠ï¸� Using zig for cross-compiling to {target_triple}"); build.enable_zig_ar = true; let zig_triple = if target.is_linux() && !target.is_musl_libc() { match context .python .platform_tag .iter() .find(|tag| tag.is_manylinux()) { Some(PlatformTag::Manylinux { major, minor }) => { format!("{target_triple}.{major}.{minor}") } _ => target_triple.to_string(), } } else { target_triple.to_string() }; build.cargo.target = vec![zig_triple]; if target.is_macos() && !context.project.editable { let (deployment_target, _) = macos_deployment_target(context, target_triple); build.macosx_deployment_target = Some(deployment_target); } } build.build_command()? } #[cfg(not(feature = "zig"))] { let mut cargo_rustc = cargo_rustc; if target.user_specified { cargo_rustc.target = vec![target_triple.to_string()]; } cargo_rustc.command() } }; #[cfg(feature = "zig")] if context.python.zig { // Pass zig command to downstream, eg. python3-dll-a if let Ok((zig_cmd, zig_args)) = cargo_zigbuild::Zig::find_zig() { if zig_args.is_empty() { build_command.env("ZIG_COMMAND", zig_cmd); } else { build_command.env( "ZIG_COMMAND", format!("{} {}", zig_cmd.display(), zig_args.join(" ")), ); }; } } build_command // We need to capture the json messages .stdout(Stdio::piped()) // We can't get colored human and json messages from rustc as they are mutually exclusive, // but forwarding stderr is still useful in case there some non-json error .stderr(Stdio::inherit()); Ok(build_command) } /// Configure PyO3-related environment variables on the build command. fn configure_pyo3_env( build_command: &mut Command, context: &BuildContext, python_interpreter: Option<&PythonInterpreter>, bridge_model: &BridgeModel, target: &Target, target_triple: &str, ) -> Result<()> { let pyo3_ver = bridge_model .pyo3() .map(|pyo3| (pyo3.version.major, pyo3.version.minor, pyo3.version.patch)) .unwrap_or((0, 0, 0)); let stable_abi = python_interpreter.and_then(|i| bridge_model.stable_abi_for_interpreter(i)); let use_target_abi = pyo3_ver >= PYO3_TARGET_ABI_PARAMETER_VERSION; let force_target_abi = stable_abi.is_some() && use_target_abi; // Only set PYO3_NO_PYTHON for stable ABI builds where the interpreter meets // the minimum version supported for stable ABI builds. Version-specific // fallback builds (e.g. Python 3.10 when abi3 targets ≥ 3.11) must not set // PYO3_NO_PYTHON. if stable_abi.is_some() { let is_pypy_or_graalpy = python_interpreter .map(|p| p.interpreter_kind.is_pypy() || p.interpreter_kind.is_graalpy()) .unwrap_or(false); if !is_pypy_or_graalpy && !target.is_windows() && pyo3_ver < PYO3_ABI3_NO_PYTHON_VERSION { // This will make old pyo3's build script only set some predefined linker // arguments without trying to read any python configuration build_command.env("PYO3_NO_PYTHON", "1"); } } // Set PYO3_BUILD_EXTENSION_MODULE when building pyo3 extension modules if bridge_model.is_pyo3() && !bridge_model.is_bin() { build_command.env("PYO3_BUILD_EXTENSION_MODULE", "1"); } // Setup `PYO3_CONFIG_FILE` if we are cross compiling for pyo3 bindings if let Some(interpreter) = python_interpreter { // Target python interpreter isn't runnable when cross compiling if interpreter.runnable { if bridge_model.is_pyo3() { debug!( "Setting PYO3_PYTHON to {}", interpreter.executable.display() ); build_command .env("PYO3_PYTHON", &interpreter.executable) .env( "PYO3_ENVIRONMENT_SIGNATURE", interpreter.environment_signature(), ); } // and legacy pyo3 versions build_command.env("PYTHON_SYS_EXECUTABLE", &interpreter.executable); } else if let Some(host_python) = context.python.host_python.as_ref() { if bridge_model.is_pyo3() { debug!( "Setting PYO3_PYTHON to host interpreter {}", host_python.display() ); build_command.env("PYO3_PYTHON", host_python); } build_command.env("PYTHON_SYS_EXECUTABLE", host_python); } if bridge_model.is_pyo3() && (force_target_abi || !interpreter.runnable) && env::var_os("PYO3_CONFIG_FILE").is_none() { let pyo3_config = interpreter.pyo3_config_file_with_platform(target, stable_abi, use_target_abi); let maturin_target_dir = ensure_target_maturin_dir(&context.project.target_dir); let config_file = maturin_target_dir.join(format!( "pyo3-config-{}-{}.{}{}.txt", target_triple, interpreter.major, interpreter.minor, stable_abi .map(|stable_abi| format!("-{}", stable_abi.kind)) .unwrap_or_default() )); // We don't want to rewrite the file every time as that will make cargo // trigger a rebuild of the project every time let existing_pyo3_config = fs::read_to_string(&config_file).unwrap_or_default(); if pyo3_config != existing_pyo3_config { // Write via a per-process temp file and rename so concurrent maturin builds // sharing a target directory never observe a partially written config. let tmp_file = config_file.with_extension(format!("txt.tmp{}", std::process::id())); fs::write(&tmp_file, pyo3_config).with_context(|| { format!( "Failed to create pyo3 config file at '{}'", tmp_file.display() ) })?; fs::rename(&tmp_file, &config_file).with_context(|| { format!( "Failed to move pyo3 config file to '{}'", config_file.display() ) })?; } let abs_config_file = config_file.normalize()?.into_path_buf(); build_command.env("PYO3_CONFIG_FILE", abs_config_file); } } // Set default macOS deployment target version for non-editable builds if !context.project.editable && target.is_macos() && env::var_os("MACOSX_DEPLOYMENT_TARGET").is_none() { let (deployment_target, source) = macos_deployment_target(context, target_triple); eprintln!( "💻 Using `MACOSX_DEPLOYMENT_TARGET={deployment_target}` for {target_triple} by {source}" ); build_command.env("MACOSX_DEPLOYMENT_TARGET", deployment_target); } Ok(()) } fn macos_deployment_target(context: &BuildContext, target_triple: &str) -> (String, &'static str) { if let Ok(deployment_target) = env::var("MACOSX_DEPLOYMENT_TARGET") { return (deployment_target, "environment"); } let target_config = context .project .pyproject_toml .as_ref() .and_then(|x| x.target_config(target_triple)); if let Some(deployment_target) = target_config .as_ref() .and_then(|config| config.macos_deployment_target.as_ref()) { return (deployment_target.clone(), "configuration"); } let (major, minor) = rustc_macosx_target_version(target_triple); (format!("{major}.{minor}"), "default") } fn compile_target( context: &BuildContext, mut build_command: Command, ) -> Result<(HashMap, HashMap)> { debug!("Running {:?}", build_command); let using_cross = build_command .get_program() .to_string_lossy() .starts_with("cross"); let mut cargo_build = build_command .spawn() .context("Failed to run `cargo rustc`")?; let mut artifacts = HashMap::new(); let mut linked_paths = Vec::new(); let mut out_dirs: HashMap = HashMap::new(); let stream = cargo_build .stdout .take() .expect("Cargo build should have a stdout"); for message in cargo_metadata::Message::parse_stream(BufReader::new(stream)) { let message = message.context("Failed to parse cargo metadata message")?; trace!("cargo message: {:?}", message); match message { cargo_metadata::Message::CompilerArtifact(artifact) => { let package_in_metadata = context .project .cargo_metadata .packages .iter() .find(|package| package.id == artifact.package_id); let crate_name = match package_in_metadata { Some(package) => &package.name, None => { let package_id = &artifact.package_id; // Ignore the package if it's coming from Rust sysroot when compiling with `-Zbuild-std` let should_warn = !package_id.repr.contains("rustup") && !package_id.repr.contains("rustlib") && !artifact.features.contains(&"rustc-dep-of-std".to_string()); if should_warn { // This is a spurious error I don't really understand eprintln!( "âš ï¸� Warning: The package {package_id} wasn't listed in `cargo metadata`" ); } continue; } }; // Extract the location of the .so/.dll/etc. from cargo's json output if crate_name.as_ref() == context.project.crate_name { let num_crate_types = artifact.target.crate_types.len(); let mut filenames_iter = artifact.filenames.into_iter(); for crate_type in artifact.target.crate_types { if let Some(filename) = filenames_iter.next() { let path = if using_cross && filename.starts_with("/target") { // Convert cross target path in docker back to path on host context .project .cargo_metadata .target_directory .join(filename.strip_prefix("/target").unwrap()) .into_std_path_buf() } else { filename.into() }; let artifact = BuildArtifact { path, import_lib_path: None, debuginfo_path: None, linked_paths: Vec::new(), thin_artifacts: Vec::new(), staging: CargoOutputState::NotStaged, }; artifacts.insert(crate_type, artifact); } } // Remaining filenames may include import libraries (.dll.lib, .dll.a) // and debug info files (.pdb, .dSYM, .dwp) if num_crate_types == 1 && let Some((_, artifact)) = artifacts.iter_mut().next() { for extra in filenames_iter { let extra_path: PathBuf = extra.into(); if let Some(ext) = extra_path.extension() { if (ext == "lib" || ext == "a") && artifact.import_lib_path.is_none() { artifact.import_lib_path = Some(extra_path); } else if (ext == "pdb" || ext == "dSYM" || ext == "dwp") && artifact.debuginfo_path.is_none() { artifact.debuginfo_path = Some(extra_path); } } } } } } // See https://doc.rust-lang.org/cargo/reference/external-tools.html#build-script-output cargo_metadata::Message::BuildScriptExecuted(msg) => { // Check if there are any dylib libraries in linked_libs // Syntax: [KIND[:MODIFIERS]=]NAME[:RENAME] // See https://doc.rust-lang.org/cargo/reference/build-scripts.html#rustc-link-lib let has_dylib = msg.linked_libs.iter().map(|l| l.as_str()).any(|lib| { if let Some(index) = lib.find('=') { let kind = &lib[..index]; // KIND could have modifiers like "dylib:+verbatim" kind.starts_with("dylib") } else { // No KIND prefix means it defaults to dylib (on most platforms) true } }); // Only add linked_paths if there are dylib libraries if has_dylib { for path in msg.linked_paths.iter().map(|p| p.as_str()) { // `linked_paths` may include a "KIND=" prefix in the string where KIND is the library kind // We only add paths with KIND of "native" or "all" (default when no KIND specified) if let Some(index) = path.find('=') { let kind = &path[..index]; if kind == "native" || kind == "all" { linked_paths.push(path[index + 1..].to_string()); } } else { // No KIND prefix means default "all" linked_paths.push(path.to_string()); } } } // Capture OUT_DIR for each package if !msg.out_dir.as_os_str().is_empty() { let pkg_name = context .project .cargo_metadata .packages .iter() .find(|p| p.id == msg.package_id) .map(|p| p.name.clone()); if let Some(name) = pkg_name { out_dirs.insert(name.to_string(), msg.out_dir.into_std_path_buf()); } } } cargo_metadata::Message::CompilerMessage(msg) => { println!("{}", msg.message); } _ => (), } } for artifact in artifacts.values_mut() { artifact.linked_paths.clone_from(&linked_paths); } let status = cargo_build .wait() .expect("Failed to wait on cargo child process"); if !status.success() { bail!( r#"Cargo build finished with "{}": `{:?}`"#, status, build_command, ) } Ok((artifacts, out_dirs)) } /// Checks that the native library contains a Python extension entrypoint and warns if it's missing. /// /// `PyInit_` is the traditional entrypoint. Free-threaded stable ABI builds can /// expose `PyModExport_` instead. /// /// Currently the check is only run on linux, macOS and Windows #[instrument(skip_all)] pub fn warn_missing_py_init(artifact: &Path, module_name: &str) -> Result<()> { let py_init = format!("PyInit_{module_name}"); let py_modexport = format!("PyModExport_{module_name}"); let found = native_library_has_python_entrypoint(artifact, module_name)?; if !found { eprintln!( "âš ï¸� Warning: Couldn't find the symbol `{py_init}` or `{py_modexport}` in the native library. \ Python will fail to import this module. \ If you're using pyo3, check that `#[pymodule]` uses `{module_name}` as module name" ) } Ok(()) } fn native_library_has_python_entrypoint(artifact: &Path, module_name: &str) -> Result { let py_init = format!("PyInit_{module_name}"); let py_modexport = format!("PyModExport_{module_name}"); let fd = File::open(artifact)?; // SAFETY: The caller stages (moves or copies) the artifact into a // private directory before invoking this function, so no concurrent // process (e.g. cargo / rust-analyzer) can modify it while we have // it mapped. let mmap = unsafe { memmap2::Mmap::map(&fd).context("mmap failed")? }; let found = match goblin::Object::parse(&mmap)? { goblin::Object::Elf(elf) => elf.dynsyms.iter().any(|dyn_sym| { elf.dynstrtab .get_at(dyn_sym.st_name) .is_some_and(|sym_name| { is_python_entrypoint_symbol(sym_name, &py_init, &py_modexport) }) }), goblin::Object::Mach(mach) => { match mach { goblin::mach::Mach::Binary(macho) => { let mut found = false; for sym in macho.exports()? { let sym_name = sym.name; let sym_name = sym_name.strip_prefix('_').unwrap_or(&sym_name); if is_python_entrypoint_symbol(sym_name, &py_init, &py_modexport) { found = true; break; } } if !found { for sym in macho.symbols() { let (sym_name, _) = sym?; let sym_name = sym_name.strip_prefix('_').unwrap_or(sym_name); if is_python_entrypoint_symbol(sym_name, &py_init, &py_modexport) { found = true; break; } } } found } goblin::mach::Mach::Fat(_) => { // Ignore fat macho, // we only generate them by combining thin binaries which is handled above true } } } goblin::Object::PE(pe) => pe.exports.iter().any(|sym| { sym.name.is_some_and(|sym_name| { is_python_entrypoint_symbol(sym_name, &py_init, &py_modexport) }) }), _ => { // Currently, only linux, macOS and Windows are implemented true } }; Ok(found) } fn is_python_entrypoint_symbol(sym_name: &str, py_init: &str, py_modexport: &str) -> bool { sym_name == py_init || sym_name == py_modexport } /// Ensures the `maturin` subdirectory inside the target directory exists /// and returns its path. This directory is used for maturin-generated artifacts. pub(crate) fn ensure_target_maturin_dir(target_dir: &Path) -> PathBuf { let dir = target_dir.join(env!("CARGO_PKG_NAME")); let _ = fs::create_dir_all(&dir); dir } #[cfg(test)] mod tests { use super::is_python_entrypoint_symbol; #[test] fn python_entrypoint_symbol_accepts_pymodexport() { assert!(is_python_entrypoint_symbol( "PyModExport__core", "PyInit__core", "PyModExport__core" )); } } maturin-1.16.0/src/compression.rs000066400000000000000000000110621527064705700167710ustar00rootroot00000000000000use clap::{CommandFactory, ValueEnum}; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Default, Debug, Copy, Clone, PartialEq, Eq, ValueEnum)] /// Wheel ZIP compression method. May only be compatible with recent package manager versions. // See https://docs.rs/zip/latest/zip/write/struct.FileOptions.html#method.compression_level pub enum CompressionMethod { #[default] /// Deflate compression (levels 0-9, default 6) // NOTE: The levels will change if we enable Zopfli! Deflated, /// No compression Stored, /// BZIP2 compression (levels 0-9, default 6) Bzip2, /// Zstandard compression (supported from Python 3.14; levels -7-22, default 3) Zstd, } impl CompressionMethod { /// Default level for this compression method // NOTE: This should match the default from the `zip` crates. pub fn default_level(self) -> i64 { match self { CompressionMethod::Deflated => 6, CompressionMethod::Stored => 0, CompressionMethod::Bzip2 => 6, CompressionMethod::Zstd => 3, } } /// Allowed levels for the method. pub fn level_range(self) -> std::ops::RangeInclusive { match self { CompressionMethod::Deflated => 0..=9, CompressionMethod::Stored => 0..=0, CompressionMethod::Bzip2 => 0..=9, CompressionMethod::Zstd => -7..=22, } } } impl From for zip::CompressionMethod { fn from(source: CompressionMethod) -> Self { match source { CompressionMethod::Deflated => zip::CompressionMethod::Deflated, CompressionMethod::Stored => zip::CompressionMethod::Stored, CompressionMethod::Bzip2 => zip::CompressionMethod::Bzip2, CompressionMethod::Zstd => zip::CompressionMethod::ZSTD, } } } #[derive(Debug, Default, Serialize, Deserialize, clap::Parser, Clone, Copy, Eq, PartialEq)] /// Wheel ZIP compression options. pub struct CompressionOptions { /// Zip compression method. Only Stored and Deflated are currently compatible with all /// package managers. #[arg(long, value_enum, default_value_t = CompressionMethod::default())] pub compression_method: CompressionMethod, /// Zip compression level. Defaults to method default. #[arg(long, allow_negative_numbers = true)] pub compression_level: Option, /// Whether to use large file support for ZIP files. Defaults to false. #[arg( long = "compression-enable-large-file-support", default_value_t = false )] pub large_file: bool, } impl CompressionOptions { /// Validate arguments, exit on error pub fn validate(&self) { if let Some(level) = self.compression_level { let range = self.compression_method.level_range(); if !range.contains(&level) { let mut cmd = Self::command(); cmd.error( clap::error::ErrorKind::ArgumentConflict, format!( "Invalid level {} for compression method {:?}. Use a level in range {:?}", level, self.compression_method, range ), ) .exit(); } } } /// No compression pub fn none() -> Self { let method = CompressionMethod::Stored; Self { compression_method: method, compression_level: Some(method.default_level()), large_file: Default::default(), } } pub(crate) fn get_file_options(&self) -> zip::write::SimpleFileOptions { let method = if cfg!(feature = "faster-tests") { // Unlike users which can use the develop subcommand, the tests have to go through // packing a zip which pip than has to unpack. This makes this 2-3 times faster CompressionMethod::Stored } else { self.compression_method }; let mut options = zip::write::SimpleFileOptions::default().compression_method(method.into()); // `zip` also has default compression levels, which should match our own, but we pass them // explicitly to ensure consistency. The exception is the `Stored` method, which must have // a `compression_level` of `None`. options = options.compression_level(if method == CompressionMethod::Stored { None } else { Some(self.compression_level.unwrap_or(method.default_level())) }); options = options.large_file(self.large_file); options } } maturin-1.16.0/src/cross_compile.rs000066400000000000000000000442051527064705700172760ustar00rootroot00000000000000use crate::python_interpreter::{InterpreterConfig, InterpreterKind}; use crate::target::Os; use crate::{PythonInterpreter, Target}; use anyhow::{Context, Result, bail}; use fs_err::{self as fs, DirEntry}; use normpath::PathExt as _; use serde::Deserialize; use std::collections::HashMap; use std::env; use std::path::{Path, PathBuf}; use tracing::debug; pub fn is_cross_compiling(target: &Target) -> Result { let target_triple = target.target_triple(); let host = target.host_triple(); if target_triple == host { // Not cross-compiling return Ok(false); } if target_triple == "x86_64-apple-darwin" && host == "aarch64-apple-darwin" { // Not cross-compiling to compile for x86-64 Python from macOS arm64 return Ok(false); } if target_triple == "aarch64-apple-darwin" && host == "x86_64-apple-darwin" { // Not cross-compiling to compile for arm64 Python from macOS x86_64 return Ok(false); } if target_triple.starts_with("i686-pc-windows") && host.starts_with("x86_64-pc-windows") { // Not cross-compiling to compile for 32-bit Python from windows 64-bit return Ok(false); } if target_triple.starts_with("x86_64-pc-windows") && host.starts_with("aarch64-pc-windows") { // Not cross-compiling to compile for x86-64 Python from Windows arm64, // Windows arm64 can run x86-64 binaries natively return Ok(false); } if target_triple.ends_with("windows-gnu") && host.ends_with("windows-msvc") { // Not cross-compiling to compile for Windows GNU from Windows MSVC host return Ok(false); } if target.target_os() == Os::Ios { // Not cross-compiling to compile for iOS. There's no on-device compilation, // so compilation will always be in a "fake" cross-platform venv with a // working python/sysconfig that can interrogated. return Ok(false); } Ok(true) } /// Parse sysconfigdata file /// /// The sysconfigdata is simply a dictionary containing all the build time variables used for the /// python executable and library. Here it is read and added to a script to extract only what is /// necessary. This necessitates a python interpreter for the host machine to work. pub fn parse_sysconfigdata( interpreter: &PythonInterpreter, config_path: impl AsRef, ) -> Result> { let mut script = fs::read_to_string(config_path)?; script += r#" print("version_major", build_time_vars["VERSION"][0]) # 3 print("version_minor", build_time_vars["VERSION"][2:]) # E.g., 8, 10 KEYS = [ "ABIFLAGS", "EXT_SUFFIX", "SOABI", "Py_GIL_DISABLED", "Py_DEBUG", ] for key in KEYS: print(key, build_time_vars.get(key, "")) "#; let output = interpreter.run_script(&script)?; Ok(parse_script_output(&output)) } fn parse_script_output(output: &str) -> HashMap { output .lines() .filter_map(|line| { line.split_once(' ') .map(|(x, y)| (x.to_string(), y.to_string())) }) .collect() } fn starts_with(entry: &DirEntry, pat: &str) -> bool { let name = entry.file_name(); name.to_string_lossy().starts_with(pat) } fn ends_with(entry: &DirEntry, pat: &str) -> bool { let name = entry.file_name(); name.to_string_lossy().ends_with(pat) } /// Finds the `_sysconfigdata*.py` file in the library path. /// /// From the python source for `_sysconfigdata*.py` is always going to be located at /// `build/lib.{PLATFORM}-{PY_MINOR_VERSION}` when built from source. The [exact line][1] is defined as: /// /// ```py /// pybuilddir = 'build/lib.%s-%s' % (get_platform(), sys.version_info[:2]) /// ``` /// /// Where get_platform returns a kebab-case formatted string containing the os, the architecture and /// possibly the os' kernel version (not the case on linux). However, when installed using a package /// manager, the `_sysconfigdata*.py` file is installed in the `${PREFIX}/lib/python3.Y/` directory. /// The `_sysconfigdata*.py` is generally in a sub-directory of the location of `libpython3.Y.so`. /// So we must find the file in the following possible locations: /// /// ```sh /// # distribution from package manager, lib_dir should include lib/ /// ${INSTALL_PREFIX}/lib/python3.Y/_sysconfigdata*.py /// ${INSTALL_PREFIX}/lib/libpython3.Y.so /// ${INSTALL_PREFIX}/lib/python3.Y/config-3.Y-${HOST_TRIPLE}/libpython3.Y.so /// /// # Built from source from host /// ${CROSS_COMPILED_LOCATION}/build/lib.linux-x86_64-Y/_sysconfigdata*.py /// ${CROSS_COMPILED_LOCATION}/libpython3.Y.so /// /// # if cross compiled, kernel release is only present on certain OS targets. /// ${CROSS_COMPILED_LOCATION}/build/lib.{OS}(-{OS-KERNEL-RELEASE})?-{ARCH}-Y/_sysconfigdata*.py /// ${CROSS_COMPILED_LOCATION}/libpython3.Y.so /// ``` /// /// [1]: https://github.com/python/cpython/blob/3.5/Lib/sysconfig.py#L389 pub fn find_sysconfigdata(lib_dir: &Path, target: &Target) -> Result { let sysconfig_paths = search_lib_dir(lib_dir, target)?; let sysconfig_name = env::var_os("_PYTHON_SYSCONFIGDATA_NAME"); let mut sysconfig_paths = sysconfig_paths .iter() .filter_map(|p| { let canonical = p.normalize().ok().map(|p| p.into_path_buf()); match &sysconfig_name { Some(_) => canonical.filter(|p| p.file_stem() == sysconfig_name.as_deref()), None => canonical, } }) .collect::>(); sysconfig_paths.dedup(); if sysconfig_paths.is_empty() { bail!("Could not find _sysconfigdata*.py in {}", lib_dir.display()); } else if sysconfig_paths.len() > 1 { bail!( "Detected multiple possible python versions, please set the PYO3_CROSS_PYTHON_VERSION \ variable to the wanted version on your system or set the _PYTHON_SYSCONFIGDATA_NAME \ variable to the wanted sysconfigdata file name\nsysconfigdata paths = {:?}", sysconfig_paths ) } Ok(sysconfig_paths.remove(0)) } /// recursive search for _sysconfigdata, returns all possibilities of sysconfigdata paths fn search_lib_dir(path: impl AsRef, target: &Target) -> Result> { let mut sysconfig_paths = vec![]; let (cpython_version_pat, pypy_version_pat) = if let Some(v) = env::var_os("PYO3_CROSS_PYTHON_VERSION") .map(|s| s.into_string()) .transpose() .map_err(|_| anyhow::anyhow!("PYO3_CROSS_PYTHON_VERSION is not valid UTF-8"))? { (format!("python{v}"), format!("pypy{v}")) } else { ("python3.".into(), "pypy3.".into()) }; for f in fs::read_dir(path.as_ref())? { let sysc = match &f { Ok(f) if starts_with(f, "_sysconfigdata") && ends_with(f, "py") => vec![f.path()], Ok(f) if starts_with(f, "build") && f.path().is_dir() => { search_lib_dir(f.path(), target)? } Ok(f) if starts_with(f, "lib.") => { let name = f.file_name(); // check if right target os if !name.to_string_lossy().contains(target.get_python_os()) { continue; } // Check if right arch if !name .to_string_lossy() .contains(&target.target_arch().to_string()) { continue; } search_lib_dir(f.path(), target)? } Ok(f) if starts_with(f, &cpython_version_pat) => search_lib_dir(f.path(), target)?, // PyPy 3.7: /opt/python/pp37-pypy37_pp73/lib_pypy/_sysconfigdata__linux_x86_64-linux-gnu.py Ok(f) if starts_with(f, "lib_pypy") => search_lib_dir(f.path(), target)?, // PyPy 3.8: /opt/python/pp38-pypy38_pp73/lib/pypy3.8/_sysconfigdata__linux_x86_64-linux-gnu.py Ok(f) if starts_with(f, &pypy_version_pat) => search_lib_dir(f.path(), target)?, Ok(f) if starts_with(f, "lib") && f.path().is_dir() => { search_lib_dir(f.path(), target)? } _ => continue, }; sysconfig_paths.extend(sysc); } // If we got more than one file, only take those that contain the arch name. // For ubuntu 20.04 with host architecture x86_64 and a foreign architecture of armhf // this reduces the number of candidates to 1: // // $ find /usr/lib/python3.8/ -name '_sysconfigdata*.py' -not -lname '*' // /usr/lib/python3.8/_sysconfigdata__x86_64-linux-gnu.py // /usr/lib/python3.8/_sysconfigdata__arm-linux-gnueabihf.py if sysconfig_paths.len() > 1 { let temp = sysconfig_paths .iter() .filter(|p| { p.to_string_lossy() .contains(&target.target_arch().to_string()) }) .cloned() .collect::>(); if !temp.is_empty() { sysconfig_paths = temp; } } Ok(sysconfig_paths) } /// PEP 739 `build-details.json` schema types #[derive(Deserialize)] struct BuildDetails { language: BuildDetailsLanguage, implementation: BuildDetailsImplementation, abi: Option, } #[derive(Deserialize)] struct BuildDetailsLanguage { version: String, } #[derive(Deserialize)] struct BuildDetailsImplementation { name: String, } #[derive(Deserialize)] struct BuildDetailsAbi { flags: Option>, extension_suffix: String, } /// Search for `build-details.json` in the given lib directory. /// /// Starting from Python 3.14, the file is installed in the platform-independent /// standard library directory, e.g. `/lib/python3.14/build-details.json`. pub fn find_build_details(path: &Path) -> Result> { let candidate = path.join("build-details.json"); if candidate.is_file() { return Ok(Some(candidate)); } let cross_python_version = env::var_os("PYO3_CROSS_PYTHON_VERSION") .map(|s| s.into_string()) .transpose() .map_err(|_| anyhow::anyhow!("PYO3_CROSS_PYTHON_VERSION is not valid UTF-8"))?; let version_pat = cross_python_version .as_deref() .map(|v| format!("python{v}")) .unwrap_or_else(|| "python3.".into()); let entries = fs::read_dir(path) .with_context(|| format!("Failed to read directory {}", path.display()))?; for entry in entries.flatten() { let name = entry.file_name(); let name_str = name.to_string_lossy(); let dominated = name_str.starts_with(&version_pat) || name_str.starts_with("lib") || name_str.ends_with(".framework") || name_str == "Frameworks" || name_str == "Versions" || name_str.starts_with("3."); if dominated && entry.path().is_dir() && let Some(found) = find_build_details(&entry.path())? { return Ok(Some(found)); } } Ok(None) } /// Read and parse a PEP 739 `build-details.json` file into an `InterpreterConfig`. pub fn parse_build_details_json_file(path: &Path) -> Result { let content = fs::read_to_string(path).with_context(|| format!("Failed to read {}", path.display()))?; parse_build_details(&content).with_context(|| format!("Failed to parse {}", path.display())) } /// Parse PEP 739 `build-details.json` content into an `InterpreterConfig`. /// /// This allows cross-compilation without needing a host Python interpreter, /// since the file is static JSON that can be read directly. pub fn parse_build_details(content: &str) -> Result { let details: BuildDetails = serde_json::from_str(content).context("Invalid build-details.json")?; let (major, minor) = details .language .version .split_once('.') .context("Invalid language.version in build-details.json")?; let major = major .parse::() .context("Invalid major version in build-details.json")?; let minor = minor .parse::() .context("Invalid minor version in build-details.json")?; let impl_name = details.implementation.name.to_ascii_lowercase(); let interpreter_kind = match impl_name.as_str() { "cpython" => InterpreterKind::CPython, "pypy" => InterpreterKind::PyPy, "graalpy" => InterpreterKind::GraalPy, other => bail!("Unsupported Python implementation in build-details.json: {other}"), }; let abi = details.abi.context( "build-details.json is missing the 'abi' section, cannot determine extension suffix", )?; let abiflags = abi.flags.as_deref().unwrap_or_default().join(""); let gil_disabled = abiflags.contains('t'); let ext_suffix = abi.extension_suffix.clone(); debug!( "Parsed build-details.json: {interpreter_kind} {major}.{minor}, ext_suffix={ext_suffix}, abiflags={abiflags}" ); Ok(InterpreterConfig { major, minor, interpreter_kind, abiflags, ext_suffix, pointer_width: None, gil_disabled, }) } #[cfg(test)] mod tests { use super::*; use tempfile::TempDir; #[test] fn test_parse_build_details_cpython() { let config = parse_build_details( r#"{ "schema_version": "1.0", "base_prefix": "/usr", "platform": "linux-x86_64", "language": { "version": "3.14" }, "implementation": { "name": "cpython", "version": { "major": 3, "minor": 14, "micro": 0, "releaselevel": "final", "serial": 0 }, "hexversion": 51249312, "cache_tag": "cpython-314" }, "abi": { "flags": [], "extension_suffix": ".cpython-314-x86_64-linux-gnu.so", "stable_abi_suffix": ".abi3.so" } }"#, ) .unwrap(); assert_eq!(config.major, 3); assert_eq!(config.minor, 14); assert_eq!(config.interpreter_kind, InterpreterKind::CPython); assert_eq!(config.abiflags, ""); assert_eq!(config.ext_suffix, ".cpython-314-x86_64-linux-gnu.so"); assert!(!config.gil_disabled); } #[test] fn test_parse_build_details_free_threaded() { let config = parse_build_details( r#"{ "schema_version": "1.0", "base_prefix": "/usr", "platform": "linux-x86_64", "language": { "version": "3.14" }, "implementation": { "name": "cpython", "version": { "major": 3, "minor": 14, "micro": 0, "releaselevel": "final", "serial": 0 }, "hexversion": 51249312, "cache_tag": "cpython-314" }, "abi": { "flags": ["t"], "extension_suffix": ".cpython-314t-x86_64-linux-gnu.so" } }"#, ) .unwrap(); assert_eq!(config.abiflags, "t"); assert_eq!(config.ext_suffix, ".cpython-314t-x86_64-linux-gnu.so"); assert!(config.gil_disabled); } #[test] fn test_parse_build_details_debug_free_threaded() { let config = parse_build_details( r#"{ "schema_version": "1.0", "base_prefix": "/usr", "platform": "linux-x86_64", "language": { "version": "3.14" }, "implementation": { "name": "cpython", "version": { "major": 3, "minor": 14, "micro": 0, "releaselevel": "alpha", "serial": 0 }, "hexversion": 51249312, "cache_tag": "cpython-314" }, "abi": { "flags": ["t", "d"], "extension_suffix": ".cpython-314td-x86_64-linux-gnu.so" } }"#, ) .unwrap(); assert_eq!(config.abiflags, "td"); assert!(config.gil_disabled); } #[test] fn test_parse_build_details_missing_abi() { let result = parse_build_details( r#"{ "schema_version": "1.0", "base_prefix": "/usr", "platform": "linux-x86_64", "language": { "version": "3.14" }, "implementation": { "name": "cpython", "version": { "major": 3, "minor": 14, "micro": 0, "releaselevel": "final", "serial": 0 }, "hexversion": 51249312, "cache_tag": "cpython-314" } }"#, ); assert!(result.is_err()); } #[test] fn test_find_build_details_direct() { let dir = TempDir::new().unwrap(); let path = dir.path().join("build-details.json"); fs::write(&path, r#"{"schema_version":"1.0"}"#).unwrap(); let found = find_build_details(dir.path()).unwrap(); assert_eq!(found, Some(path)); } #[test] fn test_find_build_details_in_python_subdir() { let dir = TempDir::new().unwrap(); let pydir = dir.path().join("lib").join("python3.14"); fs::create_dir_all(&pydir).unwrap(); let path = pydir.join("build-details.json"); fs::write(&path, r#"{"schema_version":"1.0"}"#).unwrap(); let found = find_build_details(dir.path()).unwrap(); assert_eq!(found, Some(path)); } #[test] fn test_find_build_details_in_framework_layout() { let dir = TempDir::new().unwrap(); let pydir = dir .path() .join("Frameworks") .join("Python.framework") .join("Versions") .join("3.14") .join("lib") .join("python3.14"); fs::create_dir_all(&pydir).unwrap(); let path = pydir.join("build-details.json"); fs::write(&path, r#"{"schema_version":"1.0"}"#).unwrap(); let found = find_build_details(dir.path()).unwrap(); assert_eq!(found, Some(path)); } #[test] fn test_find_build_details_not_present() { let dir = TempDir::new().unwrap(); let found = find_build_details(dir.path()).unwrap(); assert!(found.is_none()); } } maturin-1.16.0/src/develop/000077500000000000000000000000001527064705700155205ustar00rootroot00000000000000maturin-1.16.0/src/develop/install_backend.rs000066400000000000000000000250371527064705700212120ustar00rootroot00000000000000use anyhow::{Context, Result, bail, ensure}; use fs_err as fs; use once_cell::sync::Lazy; use regex::Regex; use std::env; use std::path::{Path, PathBuf}; use std::process::Command; use std::str; use tracing::debug; pub(crate) enum InstallBackend { Pip { path: Option, }, Uv { path: PathBuf, args: Vec<&'static str>, }, } impl InstallBackend { pub(crate) fn name(&self) -> &'static str { match self { InstallBackend::Pip { .. } => "pip", InstallBackend::Uv { .. } => "uv pip", } } pub(crate) fn version(&self, python_path: &Path) -> Result { let mut cmd = self.make_command(python_path); // Newer versions of uv no longer support `uv pip --version`, and instead // require that we use `uv --version`. This is a workaround to get the // version of the install backend for both old and new versions of uv. cmd = match self { InstallBackend::Pip { .. } => cmd, InstallBackend::Uv { path, args } => { let mut cmd = Command::new(path); cmd.args(args); cmd } }; let output = cmd .arg("--version") .output() .context("failed to get version of install backend")?; ensure!( output.status.success(), "failed to get version of install backend" ); let stdout = str::from_utf8(&output.stdout)?; static PIP_VERSION_RE: Lazy = Lazy::new(|| Regex::new(r"pip ([\w\.]+).*").unwrap()); static UV_VERSION_RE: Lazy = Lazy::new(|| Regex::new(r"uv ([\w\.]+).*").unwrap()); let re = match self { InstallBackend::Pip { .. } => &*PIP_VERSION_RE, InstallBackend::Uv { .. } => &*UV_VERSION_RE, }; match re.captures(stdout) { Some(captures) => Ok(semver::Version::parse(&captures[1]) .with_context(|| format!("failed to parse semver from {stdout:?}"))?), _ => { bail!("failed to parse version from {:?}", stdout); } } } /// check whether this install backend supports `show --files`. Returns Ok(()) if it does. pub(crate) fn check_supports_show_files(&self, python_path: &Path) -> Result<()> { match self { InstallBackend::Pip { .. } => Ok(()), InstallBackend::Uv { .. } => { // https://github.com/astral-sh/uv/releases/tag/0.4.25 let version = self.version(python_path)?; if version < semver::Version::new(0, 4, 25) { bail!( "uv >= 0.4.25 is required for `show --files`. Version {} was found.", version ); } Ok(()) } } } pub(crate) fn stderr_indicates_problem(&self) -> bool { match self { InstallBackend::Pip { .. } => true, // `uv pip install` sends regular logs to stderr, not just errors InstallBackend::Uv { .. } => false, } } pub(crate) fn make_command(&self, python_path: &Path) -> Command { match self { InstallBackend::Pip { path } => match &path { Some(path) => { let mut cmd = Command::new(path); cmd.arg("--python") .arg(python_path) .arg("--disable-pip-version-check"); cmd } None => { let mut cmd = Command::new(python_path); cmd.arg("-m").arg("pip").arg("--disable-pip-version-check"); cmd } }, InstallBackend::Uv { path, args } => { let mut cmd = Command::new(path); cmd.args(args).arg("pip").env("UV_PYTHON", python_path); cmd } } } } /// Detect the plain uv binary pub(crate) fn find_uv_bin() -> Result<(PathBuf, Vec<&'static str>)> { let output = Command::new("uv").arg("--version").output()?; if output.status.success() { let version_str = str::from_utf8(&output.stdout).context("`uv --version` didn't return utf8 output")?; debug!(version = %version_str, "Found uv binary in PATH"); Ok((PathBuf::from("uv"), Vec::new())) } else { bail!("`uv --version` failed with status: {}", output.status); } } fn venv_search_path(venv_dir: &Path, search_path: &std::ffi::OsStr) -> Result { let paths = env::split_paths(search_path) .filter(|path| path.starts_with(venv_dir)) .collect::>(); ensure!( !paths.is_empty(), "No PATH entries belong to virtual environment {}", venv_dir.display() ); env::join_paths(paths).context("Failed to construct virtual environment PATH") } fn find_executable_in_path(executable: &str, search_path: &std::ffi::OsStr) -> Option { let executable = format!("{}{}", executable, env::consts::EXE_SUFFIX); env::split_paths(search_path) .map(|directory| directory.join(&executable)) .find(|path| path.is_file()) } /// Detect a uv binary that belongs to the active virtual environment. /// /// This intentionally ignores uv executables found elsewhere on PATH so a /// globally installed uv cannot hijack a pixi environment that should use pip. pub(crate) fn find_uv_bin_in_venv(venv_dir: &Path) -> Result<(PathBuf, Vec<&'static str>)> { let path = env::var_os("PATH").context("PATH is not set")?; let search_path = venv_search_path(venv_dir, &path)?; let uv_path = find_executable_in_path("uv", &search_path) .context("uv is not installed in the active virtual environment")?; let output = Command::new(&uv_path).arg("--version").output()?; if output.status.success() { let version_str = str::from_utf8(&output.stdout).context("`uv --version` didn't return utf8 output")?; debug!(path = %uv_path.display(), version = %version_str, "Found uv binary in virtual environment"); Ok((uv_path, Vec::new())) } else { bail!( "`{} --version` failed with status: {}", uv_path.display(), output.status ); } } /// Detect the Python uv package pub(crate) fn find_uv_python(python_path: &Path) -> Result<(PathBuf, Vec<&'static str>)> { let output = Command::new(python_path) .args(["-m", "uv", "--version"]) .output()?; if output.status.success() { let version_str = str::from_utf8(&output.stdout).context("`uv --version` didn't return utf8 output")?; debug!(version = %version_str, "Found Python uv module"); Ok((python_path.to_path_buf(), vec!["-m", "uv"])) } else { bail!( "`{} -m uv --version` failed with status: {}", python_path.display(), output.status ); } } pub(crate) fn check_pip_exists(python_path: &Path, pip_path: Option<&PathBuf>) -> Result<()> { let output = if let Some(pip_path) = pip_path { Command::new(pip_path).args(["--version"]).output()? } else { Command::new(python_path) .args(["-m", "pip", "--version"]) .output()? }; if output.status.success() { let version_str = str::from_utf8(&output.stdout).context("`pip --version` didn't return utf8 output")?; debug!(version = %version_str, "Found pip"); Ok(()) } else { bail!("`pip --version` failed with status: {}", output.status); } } /// Check if a virtualenv is created by uv by reading pyvenv.cfg pub(crate) fn is_uv_venv(venv_dir: &Path) -> bool { let pyvenv_cfg = venv_dir.join("pyvenv.cfg"); if !pyvenv_cfg.exists() { return false; } match fs::read_to_string(&pyvenv_cfg) { Ok(content) => content.contains("\nuv = "), Err(_) => false, } } /// Check if a virtualenv is created by pixi by checking for `conda-meta/pixi_env_prefix` pub(crate) fn is_pixi_venv(venv_dir: &Path) -> bool { venv_dir.join("conda-meta").join("pixi_env_prefix").exists() } #[cfg(test)] mod tests { use super::{find_executable_in_path, is_pixi_venv, venv_search_path}; use fs_err as fs; use std::env; use tempfile::TempDir; #[test] fn test_find_executable_in_path_uses_filtered_path() { let tmp = TempDir::new().unwrap(); let bin_dir = tmp.path().join("bin"); fs::create_dir_all(&bin_dir).unwrap(); let executable = bin_dir.join(format!("uv{}", env::consts::EXE_SUFFIX)); fs::write(&executable, "").unwrap(); let search_path = env::join_paths([&bin_dir]).unwrap(); assert_eq!( find_executable_in_path("uv", &search_path), Some(executable) ); } #[test] fn test_venv_search_path_excludes_global_entries() { let tmp = TempDir::new().unwrap(); let venv_bin = tmp.path().join("bin"); let global_bin = tmp.path().parent().unwrap().join("global-bin"); let search_path = env::join_paths([&venv_bin, &global_bin]).unwrap(); let filtered = venv_search_path(tmp.path(), &search_path).unwrap(); let paths = env::split_paths(&filtered).collect::>(); assert_eq!(paths, vec![venv_bin]); } #[test] fn test_venv_search_path_rejects_only_global_entries() { let tmp = TempDir::new().unwrap(); let global_bin = tmp.path().parent().unwrap().join("global-bin"); let search_path = env::join_paths([&global_bin]).unwrap(); assert!(venv_search_path(tmp.path(), &search_path).is_err()); } #[test] fn test_is_pixi_venv_detects_marker() { let tmp = TempDir::new().unwrap(); let conda_meta = tmp.path().join("conda-meta"); fs::create_dir_all(&conda_meta).unwrap(); fs::write(conda_meta.join("pixi_env_prefix"), "").unwrap(); assert!(is_pixi_venv(tmp.path())); } #[test] fn test_is_pixi_venv_rejects_plain_venv() { let tmp = TempDir::new().unwrap(); fs::write(tmp.path().join("pyvenv.cfg"), "home = /usr/bin\n").unwrap(); assert!(!is_pixi_venv(tmp.path())); } #[test] fn test_is_pixi_venv_rejects_vanilla_conda() { let tmp = TempDir::new().unwrap(); let conda_meta = tmp.path().join("conda-meta"); fs::create_dir_all(&conda_meta).unwrap(); fs::write(conda_meta.join("python-3.12.0-h12345.json"), "{}").unwrap(); assert!(!is_pixi_venv(tmp.path())); } } maturin-1.16.0/src/develop/mod.rs000066400000000000000000000571431527064705700166570ustar00rootroot00000000000000pub(crate) mod install_backend; use crate::PlatformTag; use crate::PythonInterpreter; use crate::Target; use crate::auditwheel::AuditWheelMode; use crate::bridge::Bindings; use crate::build_options::CargoOptions; use crate::compression::CompressionOptions; use crate::target::detect_arch_from_python; use crate::{ BuildContext, BuildOptions, BuildOrchestrator, OutputOptions, PlatformOptions, PythonOptions, }; use anyhow::{Context, Result, anyhow, bail, ensure}; use cargo_options::heading; use fs_err as fs; use install_backend::{ InstallBackend, check_pip_exists, find_uv_bin, find_uv_bin_in_venv, find_uv_python, is_pixi_venv, is_uv_venv, }; use once_cell::sync::Lazy; use regex::Regex; use std::path::Path; use std::path::PathBuf; use std::str; use tempfile::TempDir; use tracing::{debug, instrument}; use url::Url; /// Install the crate as module in the current virtualenv #[derive(Debug, clap::Parser)] pub struct DevelopOptions { /// Which kind of bindings to use #[arg(short = 'b', long = "bindings", alias = "binding-crate")] pub bindings: Option, /// Pass --release to cargo #[arg(short = 'r', long, help_heading = heading::COMPILATION_OPTIONS, conflicts_with = "profile")] pub release: bool, /// Build with Profile-Guided Optimization (PGO). /// /// Requires `pgo-command` to be set in `[tool.maturin]` in pyproject.toml. /// This performs a three-phase build: instrumented build, profile training, /// and optimized rebuild. /// /// Implies `--release` unless `--profile` is specified. /// /// Can also be enabled via the MATURIN_PGO environment variable. #[arg(long, env = "MATURIN_PGO", value_parser = clap::builder::FalseyValueParser::new())] pub pgo: bool, /// Strip the library for minimum file size #[arg(long)] pub strip: bool, /// Install extra requires aka. optional dependencies /// /// Use as `--extras=extra1,extra2` #[arg( short = 'E', long, value_delimiter = ',', action = clap::ArgAction::Append )] pub extras: Vec, /// Install dependency groups defined in pyproject.toml (PEP 735) /// /// Use as `--group=test,docs` #[arg( short = 'G', long, value_delimiter = ',', action = clap::ArgAction::Append )] pub group: Vec, /// Skip installation, only build the extension module inplace /// /// Only works with mixed Rust/Python project layout #[arg(long)] pub skip_install: bool, /// Use a specific pip installation instead of the default one. /// /// This can be used to supply the path to a pip executable when the /// current virtualenv does not provide one. #[arg(long)] pub pip_path: Option, /// `cargo rustc` options #[command(flatten)] pub cargo_options: CargoOptions, /// Use `uv` to install packages instead of `pip` #[arg(long)] pub uv: bool, /// Wheel compression options #[command(flatten)] pub compression: CompressionOptions, /// Auto generate Python type stubs by introspecting the binary. Requires PyO3 and its "experimental-inspect" feature #[arg(long)] pub generate_stubs: bool, } #[derive(Debug, PartialEq, Eq)] enum UvDiscovery { RequiredGlobal, OptionalGlobal, OptionalVenv, Disabled, } fn uv_discovery(explicit_uv: bool, uv_venv: bool, pixi_venv: bool) -> UvDiscovery { if explicit_uv { UvDiscovery::RequiredGlobal } else if pixi_venv { UvDiscovery::OptionalVenv } else if uv_venv { UvDiscovery::OptionalGlobal } else { UvDiscovery::Disabled } } #[instrument(skip_all)] fn install_dependencies( build_context: &BuildContext, extras: &[String], groups: &[String], python: &Path, venv_dir: &Path, install_backend: &InstallBackend, ) -> Result<()> { if !build_context.project.metadata24.requires_dist.is_empty() { let mut extra_names = Vec::with_capacity(extras.len()); for extra in extras { extra_names.push( pep508_rs::ExtraName::new(extra.clone()) .with_context(|| format!("invalid extra name: {extra}"))?, ); } let mut args = vec!["install".to_string()]; args.extend( build_context .project .metadata24 .requires_dist .iter() .map(|x| { let mut pkg = x.clone(); // Remove extra marker to make it installable with pip: // // * ` and extra == 'EXTRA_NAME'` // * `; extra == 'EXTRA_NAME'` // // Keep in sync with `Metadata23::merge_pyproject_toml()` pkg.marker = pkg.marker.simplify_extras(&extra_names); pkg.to_string() }), ); let status = install_backend .make_command(python) .args(&args) .env("VIRTUAL_ENV", venv_dir) .status() .with_context(|| format!("Failed to run {} install", install_backend.name()))?; if !status.success() { bail!( r#"{} install finished with "{}""#, install_backend.name(), status ) } } let effective_groups = if groups.is_empty() { let has_dev_group = build_context .project .pyproject_toml .as_ref() .and_then(|p| p.dependency_groups.as_ref()) .is_some_and(|dg| dg.0.contains_key("dev")); if has_dev_group { vec!["dev".to_string()] } else { Vec::new() } } else { groups.to_vec() }; if !effective_groups.is_empty() { let mut args = vec!["install".to_string()]; // pip and uv resolve a bare `--group` against `pyproject.toml` in the current working // directory, which breaks when `--manifest-path` points into a subdirectory. Pass the // resolved pyproject.toml path explicitly using the `--group :` syntax // supported by both backends. let pyproject_path = dunce::simplified(&build_context.project.pyproject_toml_path) .display() .to_string(); for group in &effective_groups { args.push("--group".to_string()); if group.contains(':') { // The user already supplied a `:` form (e.g. for a pyproject.toml in // another directory); pass it through unchanged instead of prepending our own path. args.push(group.clone()); } else { args.push(format!("{pyproject_path}:{group}")); } } let status = install_backend .make_command(python) .args(&args) .env("VIRTUAL_ENV", venv_dir) .status() .with_context(|| format!("Failed to run {} install --group", install_backend.name()))?; if !status.success() { bail!( r#"{} install --group finished with "{}""#, install_backend.name(), status ) } } Ok(()) } #[instrument(skip_all, fields(wheel_filename = %wheel_filename.display()))] fn install_wheel( build_context: &BuildContext, python: &Path, venv_dir: &Path, wheel_filename: &Path, install_backend: &InstallBackend, ) -> Result<()> { let mut cmd = install_backend.make_command(python); let output = cmd .args(["install", "--no-deps", "--force-reinstall"]) .arg(dunce::simplified(wheel_filename)) .env("VIRTUAL_ENV", venv_dir) .output() .context(format!( "{} install failed (ran {:?} with {:?})", install_backend.name(), cmd.get_program(), cmd.get_args().collect::>(), ))?; if !output.status.success() { bail!( "{} install in {} failed running {:?}: {}\n--- Stdout:\n{}\n--- Stderr:\n{}\n---\n", install_backend.name(), venv_dir.display(), cmd.get_args().collect::>(), output.status, String::from_utf8_lossy(&output.stdout).trim(), String::from_utf8_lossy(&output.stderr).trim(), ); } if !output.stderr.is_empty() { let stderr = String::from_utf8_lossy(&output.stderr); let stderr = stderr.trim(); if let Some(leftover) = detect_pip_in_use_leftover(stderr) { bail!( "{backend} could not overwrite the installed extension module because it is in use \ (most often by a Python process that has already imported the package).\n\ {backend} salvaged the install by renaming the old location to a leftover \ directory, but it could not delete that leftover — and the leftover still holds \ the OLD compiled code. If a Python process imports the package before the \ leftover is removed, the import system can resolve the stale copy and silently \ run pre-build code.\n\n\ To recover:\n \ 1. Stop every Python process that imported this package (this releases the file handle).\n \ 2. Delete the leftover directory: {leftover}\n \ 3. Re-run `maturin develop`.\n\n\ Original {backend} output:\n{stderr}", backend = install_backend.name(), ); } if install_backend.stderr_indicates_problem() { eprintln!( "âš ï¸� Warning: {} raised a warning running {:?}:\n{}", install_backend.name(), cmd.get_args().collect::>(), stderr, ); } } if let Err(err) = configure_as_editable(build_context, python, install_backend) { eprintln!("âš ï¸� Warning: failed to set package as editable: {err}"); } Ok(()) } /// Detect pip's "Failed to remove contents in a temporary directory" warning /// when the leftover path looks like an in-use install rename (a basename /// prefixed with `~`). /// /// pip handles a locked install file by renaming the old directory to a sibling /// whose basename is prefixed with `~`, then writing the new wheel files in /// place. If pip later fails to remove that sibling — typically on Windows when /// a running Python process still holds the `.pyd` open — it logs this warning /// and exits with status 0. The leftover keeps the OLD compiled code, so a /// subsequent import can silently load stale code instead of the freshly /// installed module. /// /// Returns the leftover path so callers can surface it to the user. fn detect_pip_in_use_leftover(stderr: &str) -> Option<&str> { static RE: Lazy = Lazy::new(|| { Regex::new(r"Failed to remove contents in a temporary directory '([^']+)'").unwrap() }); let path = RE.captures(stderr)?.get(1)?.as_str(); let basename = path.rsplit(['/', '\\']).next().unwrap_or(path); basename.starts_with('~').then_some(path) } /// Each editable-installed python package has a `direct_url.json` file that includes a `file://` URL /// indicating the location of the source code of that project. The maturin import hook uses this /// URL to locate and rebuild editable-installed projects. /// /// When a maturin package is installed using `pip install -e`, pip takes care of writing the /// correct URL, however when a maturin package is installed with `maturin develop`, the URL is /// set to the path to the temporary wheel file created during installation. #[instrument(skip_all)] fn configure_as_editable( build_context: &BuildContext, python: &Path, install_backend: &InstallBackend, ) -> Result<()> { println!("âœ�ï¸� Setting installed package as editable"); install_backend.check_supports_show_files(python)?; let mut cmd = install_backend.make_command(python); let cmd = cmd.args(["show", "--files", &build_context.project.metadata24.name]); debug!("running {:?}", cmd); let output = cmd.output()?; ensure!(output.status.success(), "failed to list package files"); if let Some(direct_url_path) = parse_direct_url_path(&String::from_utf8_lossy(&output.stdout))? { let project_dir = build_context .project .pyproject_toml_path .parent() .ok_or_else(|| anyhow!("failed to get project directory"))?; let uri = Url::from_file_path(project_dir) .map_err(|_| anyhow!("failed to convert project directory to file URL"))?; let content = format!("{{\"dir_info\": {{\"editable\": true}}, \"url\": \"{uri}\"}}"); fs::write(direct_url_path, content)?; } Ok(()) } fn parse_direct_url_path(pip_show_output: &str) -> Result> { static LOCATION_RE: Lazy = Lazy::new(|| Regex::new(r"Location: ([^\r\n]*)").unwrap()); static DIRECT_URL_RE: Lazy = Lazy::new(|| Regex::new(r" (.*direct_url.json)").unwrap()); if let Some(Some(location)) = LOCATION_RE.captures(pip_show_output).map(|c| c.get(1)) && let Some(Some(direct_url_path)) = DIRECT_URL_RE.captures(pip_show_output).map(|c| c.get(1)) { return Ok(Some( PathBuf::from(location.as_str()).join(direct_url_path.as_str()), )); } Ok(None) } /// Installs a crate by compiling it and copying the shared library to site-packages. /// Also adds the dist-info directory to make sure pip and other tools detect the library /// /// Works only in a virtualenv. pub fn develop(develop_options: DevelopOptions, venv_dir: &Path) -> Result<()> { let DevelopOptions { bindings, release, pgo, strip, extras, group, skip_install, pip_path, mut cargo_options, uv, compression, generate_stubs, } = develop_options; compression.validate(); // set profile to release if specified; `--release` and `--profile` are mutually exclusive if release { cargo_options.profile = Some("release".to_string()); } // PGO-optimizing a debug build makes no sense, so `--pgo` implies the // release profile unless another profile was requested explicitly if pgo && cargo_options.profile.is_none() { cargo_options.profile = Some("release".to_string()); } let mut target_triple = cargo_options.target.clone(); let target = Target::from_target_triple(cargo_options.target.as_ref())?; let python = target.get_venv_python(venv_dir); // check python platform and architecture if !target.user_specified && let Some(detected_target) = detect_arch_from_python(&python, &target) { target_triple = Some(detected_target); } // Store wheel in a unique location so we don't get name clashes with parallel runs let wheel_dir = TempDir::new().context("Failed to create temporary directory")?; let build_options = BuildOptions { python: PythonOptions { interpreter: vec![python.clone()], find_interpreter: false, bindings, }, platform: PlatformOptions { platform_tag: vec![PlatformTag::Linux.into()], auditwheel: Some(AuditWheelMode::Skip), skip_auditwheel: false, #[cfg(feature = "zig")] zig: false, }, output: OutputOptions { out: Some(wheel_dir.path().to_path_buf()), include_debuginfo: !strip && target.is_windows(), sbom_include: Vec::new(), }, cargo: CargoOptions { target: target_triple, ..cargo_options }, compression, generate_stubs, }; let build_context = build_options .into_build_context() .strip(if strip { Some(true) } else { None }) .editable(true) .pgo(pgo) .build()?; // Ensure that version information is present, https://github.com/PyO3/maturin/issues/2416 if build_context .project .pyproject_toml .as_ref() .is_some_and(|p| !p.warn_invalid_version_info()) { bail!( "Cannot build without valid version information. \ You need to specify either `project.version` or `project.dynamic = [\"version\"]` in pyproject.toml." ); } let interpreter = PythonInterpreter::check_executable(&python, &target, build_context.project.bridge())? .ok_or_else(|| { anyhow!("Expected `python` to be a python interpreter inside a virtualenv ಠ_ಠ") })?; let uv_info = match uv_discovery(uv, is_uv_venv(venv_dir), is_pixi_venv(venv_dir)) { UvDiscovery::RequiredGlobal => { // Explicit --uv keeps the existing behavior: use uv from the // interpreter when possible, otherwise allow a uv binary from PATH. Some(find_uv_python(&interpreter.executable).or_else(|_| find_uv_bin())) } UvDiscovery::OptionalVenv => { // Pixi environments can contain either pip or uv. Only auto-select // uv when it belongs to this environment; a global uv must not // hijack a pixi environment that provides pip instead. find_uv_python(&interpreter.executable) .or_else(|_| find_uv_bin_in_venv(venv_dir)) .ok() .map(Ok) } UvDiscovery::OptionalGlobal => { // Preserve automatic uv selection for uv-created virtual environments. find_uv_python(&interpreter.executable) .or_else(|_| find_uv_bin()) .ok() .map(Ok) } UvDiscovery::Disabled => None, }; let install_backend = if let Some(uv_info) = uv_info { let (uv_path, uv_args) = uv_info?; InstallBackend::Uv { path: uv_path, args: uv_args, } } else { check_pip_exists(&interpreter.executable, pip_path.as_ref()) .context("Failed to find pip (if working with a uv venv try `maturin develop --uv`)")?; InstallBackend::Pip { path: pip_path.clone(), } }; if !skip_install { install_dependencies( &build_context, &extras, &group, &python, venv_dir, &install_backend, )?; } let orchestrator = BuildOrchestrator::new(&build_context); let wheels = orchestrator.build_wheels()?; if !skip_install { for wheel in &wheels { install_wheel( &build_context, &python, venv_dir, &wheel.path, &install_backend, )?; eprintln!( "🛠 Installed {}-{}", build_context.project.metadata24.name, build_context.project.metadata24.version ); } } Ok(()) } #[cfg(test)] mod tests { use std::path::PathBuf; use super::{UvDiscovery, detect_pip_in_use_leftover, parse_direct_url_path, uv_discovery}; #[test] fn test_uv_discovery_explicit_uv_allows_global_fallback() { assert_eq!(uv_discovery(true, false, true), UvDiscovery::RequiredGlobal); } #[test] fn test_uv_discovery_pixi_only_allows_environment_uv() { assert_eq!(uv_discovery(false, false, true), UvDiscovery::OptionalVenv); } #[test] fn test_uv_discovery_uv_venv_preserves_global_fallback() { assert_eq!( uv_discovery(false, true, false), UvDiscovery::OptionalGlobal ); } #[test] fn test_uv_discovery_plain_venv_is_disabled() { assert_eq!(uv_discovery(false, false, false), UvDiscovery::Disabled); } #[test] fn test_detect_pip_in_use_leftover_windows() { let stderr = "WARNING: Failed to remove contents in a temporary directory \ 'C:\\Users\\me\\venv\\Lib\\site-packages\\~ackage'.\r\n \ You can safely remove it manually."; assert_eq!( detect_pip_in_use_leftover(stderr), Some("C:\\Users\\me\\venv\\Lib\\site-packages\\~ackage"), ); } #[test] fn test_detect_pip_in_use_leftover_unix() { let stderr = "WARNING: Failed to remove contents in a temporary directory \ '/home/me/venv/lib/python3.11/site-packages/~ackage'.\n \ You can safely remove it manually."; assert_eq!( detect_pip_in_use_leftover(stderr), Some("/home/me/venv/lib/python3.11/site-packages/~ackage"), ); } #[test] fn test_detect_pip_in_use_leftover_ignores_non_tilde_temp_dir() { // Same warning text, but the leftover basename has no `~` prefix — this is // an unrelated cleanup hiccup, not an in-use install. Keep it as a warning. let stderr = "WARNING: Failed to remove contents in a temporary directory \ '/tmp/pip-build-xyz'.\n You can safely remove it manually."; assert_eq!(detect_pip_in_use_leftover(stderr), None); } #[test] fn test_detect_pip_in_use_leftover_ignores_unrelated_warnings() { let stderr = "WARNING: You are using pip version 20.0.0; \ however, version 24.0 is available."; assert_eq!(detect_pip_in_use_leftover(stderr), None); } #[test] #[cfg(not(target_os = "windows"))] fn test_parse_direct_url() { let example_with_direct_url = "\ Name: my-project Version: 0.1.0 Location: /foo bar/venv/lib/pythonABC/site-packages Editable project location: /tmp/temporary.whl Files: my_project-0.1.0+abc123de.dist-info/INSTALLER my_project-0.1.0+abc123de.dist-info/METADATA my_project-0.1.0+abc123de.dist-info/RECORD my_project-0.1.0+abc123de.dist-info/REQUESTED my_project-0.1.0+abc123de.dist-info/WHEEL my_project-0.1.0+abc123de.dist-info/direct_url.json my_project-0.1.0+abc123de.dist-info/entry_points.txt my_project.pth "; let expected_path = PathBuf::from( "/foo bar/venv/lib/pythonABC/site-packages/my_project-0.1.0+abc123de.dist-info/direct_url.json", ); assert_eq!( parse_direct_url_path(example_with_direct_url).unwrap(), Some(expected_path) ); let example_without_direct_url = "\ Name: my-project Version: 0.1.0 Location: /foo bar/venv/lib/pythonABC/site-packages Files: my_project-0.1.0+abc123de.dist-info/INSTALLER my_project-0.1.0+abc123de.dist-info/METADATA my_project-0.1.0+abc123de.dist-info/RECORD my_project-0.1.0+abc123de.dist-info/REQUESTED my_project-0.1.0+abc123de.dist-info/WHEEL my_project-0.1.0+abc123de.dist-info/entry_points.txt my_project.pth "; assert_eq!( parse_direct_url_path(example_without_direct_url).unwrap(), None ); } #[test] #[cfg(target_os = "windows")] fn test_parse_direct_url_windows() { let example_with_direct_url_windows = "\ Name: my-project\r Version: 0.1.0\r Location: C:\\foo bar\\venv\\Lib\\site-packages\r Files:\r my_project-0.1.0+abc123de.dist-info\\INSTALLER\r my_project-0.1.0+abc123de.dist-info\\METADATA\r my_project-0.1.0+abc123de.dist-info\\RECORD\r my_project-0.1.0+abc123de.dist-info\\REQUESTED\r my_project-0.1.0+abc123de.dist-info\\WHEEL\r my_project-0.1.0+abc123de.dist-info\\direct_url.json\r my_project-0.1.0+abc123de.dist-info\\entry_points.txt\r my_project.pth\r "; let expected_path = PathBuf::from( "C:\\foo bar\\venv\\Lib\\site-packages\\my_project-0.1.0+abc123de.dist-info\\direct_url.json", ); assert_eq!( parse_direct_url_path(example_with_direct_url_windows).unwrap(), Some(expected_path) ); } } maturin-1.16.0/src/generate_json_schema.rs000066400000000000000000000077041527064705700206030ustar00rootroot00000000000000#![cfg(feature = "schemars")] use fs_err as fs; use std::path::PathBuf; use anyhow::{Result, bail}; use pretty_assertions::StrComparison; use schemars::schema_for; use crate::pyproject_toml::ToolMaturin; #[derive(Debug, Copy, Clone, PartialEq, Eq, clap::ValueEnum, Default)] /// The mode to use when generating the JSON schema. pub enum Mode { /// Write the JSON schema to the file. #[default] Write, /// Check if the JSON schema is up-to-date. Check, /// Print the JSON schema to stdout. DryRun, } /// Generate the JSON schema for the `pyproject.toml` file. #[derive(Debug, clap::Parser)] pub struct GenerateJsonSchemaOptions { /// The mode to use when generating the JSON schema. #[arg(long, default_value_t, value_enum)] pub mode: Mode, } /// Generate the JSON schema for the `pyproject.toml` file. pub fn generate_json_schema(args: GenerateJsonSchemaOptions) -> Result<()> { let schema = schema_for!(ToolMaturin); let mut schema_string = serde_json::to_string_pretty(&schema).unwrap(); // `serde_json::to_string_pretty` doesn't emit a trailing newline, but the // checked-in schema file always has one (added by the pre-commit // end-of-file-fixer hook). Normalize here so all three modes agree on // the same string. schema_string.push('\n'); let filename = "maturin.schema.json"; let schema_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join(filename); match args.mode { Mode::DryRun => { print!("{schema_string}"); } Mode::Check => { let current = fs::read_to_string(schema_path)?; if current == schema_string { println!("Up-to-date: {filename}"); } else { let comparison = StrComparison::new(¤t, &schema_string); bail!( "{filename} changed, please run `cargo run --features schemars -- generate-json-schema`:\n{comparison}", ); } } Mode::Write => { let current = fs::read_to_string(&schema_path)?; if current == schema_string { println!("Up-to-date: {filename}"); } else { println!("Updating: {filename}"); fs::write(schema_path, schema_string.as_bytes())?; } } } Ok(()) } #[cfg(test)] mod tests { use super::*; /// `Mode::Check` must succeed on a clean checkout. This exercises the /// actual normalization behavior inside `generate_json_schema` (rather /// than a copy of it), so it will catch a regression where the /// trailing-newline fix is dropped or altered and `check` starts /// failing again. #[test] fn test_check_mode_succeeds_on_clean_checkout() { generate_json_schema(GenerateJsonSchemaOptions { mode: Mode::Check }) .expect("check mode must succeed on a clean checkout"); } /// The generated schema string (including its normalized trailing /// newline) must match the checked-in `maturin.schema.json` byte for /// byte. This additionally pins the schema content itself (e.g. catches /// a stale checked-in file), separate from the check-mode behavior /// asserted above. #[test] fn test_generated_schema_matches_checked_in_file() { let schema = schema_for!(ToolMaturin); let mut schema_string = serde_json::to_string_pretty(&schema).unwrap(); schema_string.push('\n'); let schema_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("maturin.schema.json"); let current = fs::read_to_string(schema_path).unwrap(); assert_eq!( current, schema_string, "maturin.schema.json is out of date, please run `cargo run --features schemars -- generate-json-schema`" ); assert!( schema_string.ends_with('\n') && !schema_string.ends_with("\n\n"), "generated schema should end with exactly one trailing newline" ); } } maturin-1.16.0/src/lib.rs000066400000000000000000000103241527064705700151760ustar00rootroot00000000000000//! Builds wheels from a crate that exposes python bindings through pyo3 //! //! The high-level api is [BuildOptions], which can be converted into the [BuildContext], which //! then uses [compile()] and builds the appropriate wheels. //! //! # Cargo features //! //! Default features: full, rustls //! //! - full: Bundles cli-completion, cross-compile, scaffolding, upload, sbom and auditwheel. //! //! - upload: Uses ureq to add the upload and publish commands. //! //! - rustls: Makes ureq (and cargo-xwin) use the rustls stack so that we can build maturin in //! a CentOS 6 docker container and which maturin itself manylinux compliant. //! //! - native-tls: Makes ureq (and cargo-xwin) use the platform-native tls stack. //! //! - sbom: Generates a CycloneDX software bill of materials for the built wheel. //! //! - auditwheel: Enables dependency auditing and wheel repair for macOS (install-name/rpath //! rewriting) and Windows (PE import patching and DLL bundling); Linux auditing and //! patchelf-based repair work without it. Includes pure-Rust ad-hoc code signing for macOS //! wheels when cross-compiling from a non-macOS host (native builds use Apple's codesign). //! //! - scaffolding: Enables the `maturin new`/`init`/`generate-ci` project scaffolding commands. //! //! - cross-compile: Enables cross compilation support via zig (cargo-zigbuild) and xwin. The //! zig and xwin sub-features can also be enabled individually. //! //! - cli-completion: Enables shell completion generation for the CLI. //! //! - schemars: Enables generating the JSON schema for maturin's configuration. //! //! - static (off by default): Statically links liblzma via xz2/static. //! //! - password-storage (off by default, implies upload): Uses the keyring package to store the //! password. maturin only enables keyring's native macOS/Windows/Linux backends, so there is //! no BSD backend; most builds on the github releases page enable this. //! //! - log, human-panic (deprecated): No longer do anything and are kept only for compatibility. #![deny(missing_docs)] pub use crate::bridge::{ Bindings, BridgeModel, PyO3, PyO3Crate, StableAbi, StableAbiKind, StableAbiVersion, }; pub use crate::build_context::{ ArtifactContext, BuildContext, BuiltArtifactTag, BuiltWheel, ProjectContext, PythonContext, }; pub use crate::build_options::{BuildOptions, OutputOptions, PlatformOptions, PythonOptions}; pub use crate::build_orchestrator::BuildOrchestrator; pub use crate::cargo_options::{CargoOptions, TargetTriple}; pub use crate::cargo_toml::CargoToml; pub use crate::compile::{BuildArtifact, CompileResult, ThinArtifact, compile}; pub use crate::compression::{CompressionMethod, CompressionOptions}; pub use crate::develop::{DevelopOptions, develop}; #[cfg(feature = "schemars")] pub use crate::generate_json_schema::{GenerateJsonSchemaOptions, Mode, generate_json_schema}; pub use crate::metadata::{Metadata24, WheelMetadata}; pub use crate::module_writer::{ ModuleWriter, PathWriter, SDistWriter, VirtualWriter, WheelWriter, write_dist_info, }; #[cfg(feature = "scaffolding")] pub use crate::new_project::{GenerateProjectOptions, init_project, new_project}; pub use crate::pyproject_toml::PyProjectToml; pub use crate::python_interpreter::PythonInterpreter; pub use crate::source_distribution::{UnpackedSdist, find_path_deps, unpack_sdist}; #[cfg(feature = "upload")] pub use crate::upload::{PublishOpt, Registry, UploadError, upload, upload_ui}; pub use auditwheel::{CompatibilityTag, PlatformTag}; pub use target::{Target, WheelTag}; mod archive_source; mod auditwheel; mod binding_generator; mod bridge; mod build_context; mod build_options; mod build_orchestrator; /// Cargo build options pub mod cargo_options; mod cargo_toml; #[cfg(feature = "scaffolding")] /// Generate CI configuration pub mod ci; mod compile; mod compression; mod cross_compile; pub(crate) mod develop; mod generate_json_schema; mod metadata; mod module_writer; #[cfg(feature = "scaffolding")] mod new_project; /// Profile-Guided Optimization (PGO) orchestration pub(crate) mod pgo; mod project_layout; pub mod pyproject_toml; mod python_interpreter; mod sbom; mod source_distribution; mod target; #[cfg(test)] mod test_utils; pub(crate) mod ui; #[cfg(feature = "upload")] mod upload; pub(crate) mod util; maturin-1.16.0/src/main.rs000066400000000000000000000314601527064705700153600ustar00rootroot00000000000000//! Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries //! as python packages. This file contains the CLI and keyring integration. //! //! Run with --help for usage information use anyhow::{Context, Result}; use cargo_options::heading; #[cfg(feature = "zig")] use cargo_zigbuild::Zig; #[cfg(feature = "cli-completion")] use clap::CommandFactory; use clap::Parser; #[cfg(feature = "schemars")] use maturin::GenerateJsonSchemaOptions; #[cfg(feature = "upload")] use maturin::PublishOpt; use maturin::{BuildOptions, CargoOptions, DevelopOptions, PythonOptions, TargetTriple}; #[cfg(feature = "scaffolding")] use maturin::{GenerateProjectOptions, ci::GenerateCI}; use std::env; use std::path::PathBuf; use std::str::FromStr; use tracing::instrument; use tracing_subscriber::filter::Directive; use tracing_subscriber::{EnvFilter, Layer, layer::SubscriberExt, util::SubscriberInitExt}; mod commands; use crate::commands::StripOption; use crate::commands::pep517::Pep517Command; #[derive(Debug, Parser)] #[command( version, name = env!("CARGO_PKG_NAME"), display_order = 1, after_help = "Visit https://maturin.rs to learn more about maturin.", styles = cargo_options::styles(), )] /// Build and publish crates with pyo3, cffi and uniffi bindings as well /// as rust binaries as python packages struct Opt { /// Use verbose output. /// /// * Default: Show build information and `cargo build` output. /// * `-v`: Use `cargo build -v`. /// * `-vv`: Show debug logging and use `cargo build -vv`. /// * `-vvv`: Show trace logging. /// /// You can configure fine-grained logging using the `RUST_LOG` environment variable. /// () #[arg(global = true, action = clap::ArgAction::Count, long, short)] verbose: u8, #[command(subcommand)] command: Command, } #[derive(Debug, Parser)] /// Build and publish crates with pyo3, cffi and uniffi bindings as well /// as rust binaries as python packages enum Command { #[command(name = "build", alias = "b")] /// Build the crate into python packages Build { /// Build artifacts in release mode, with optimizations #[arg(short = 'r', long, help_heading = heading::COMPILATION_OPTIONS, conflicts_with = "profile")] release: bool, #[command(flatten)] strip_opt: StripOption, /// Build a source distribution and build wheels from it. /// /// This verifies that the source distribution is complete and can be /// used to build the project from source. #[arg(long)] sdist: bool, /// Build with Profile-Guided Optimization (PGO). /// /// Requires `pgo-command` to be set in `[tool.maturin]` in pyproject.toml. /// This performs a three-phase build: instrumented build, profile training, /// and optimized rebuild. /// /// Can also be enabled via the MATURIN_PGO environment variable. #[arg(long, env = "MATURIN_PGO", value_parser = clap::builder::FalseyValueParser::new())] pgo: bool, #[command(flatten)] build: BuildOptions, }, #[cfg(feature = "upload")] #[command(name = "publish")] /// Build and publish the crate as python packages to pypi Publish { /// Do not pass --release to cargo #[arg(long, conflicts_with = "profile")] debug: bool, /// Do not strip the library for minimum file size #[arg(long = "no-strip")] no_strip: bool, /// Don't build a source distribution #[arg(long = "no-sdist")] no_sdist: bool, /// Build with Profile-Guided Optimization (PGO). /// /// Requires `pgo-command` to be set in `[tool.maturin]` in pyproject.toml. /// /// Can also be enabled via the MATURIN_PGO environment variable. #[arg(long, env = "MATURIN_PGO", value_parser = clap::builder::FalseyValueParser::new())] pgo: bool, #[command(flatten)] publish: PublishOpt, #[command(flatten)] build: BuildOptions, }, #[command(name = "list-python")] /// Search and list the available python installations ListPython { #[arg(long)] target: Option, }, #[command(name = "develop", alias = "dev")] /// Install the crate as module in the current virtualenv Develop(DevelopOptions), /// Build only a source distribution (sdist) without compiling. /// /// Building a source distribution requires a pyproject.toml with a `[build-system]` table. /// /// This command is a workaround for [pypa/pip#6041](https://github.com/pypa/pip/issues/6041) #[command(name = "sdist")] SDist { #[arg(short = 'm', long = "manifest-path")] /// The path to the Cargo.toml manifest_path: Option, /// The directory to store the built wheels in. Defaults to a new "wheels" /// directory in the project's target directory #[arg(short, long)] out: Option, }, /// Create a new cargo project in an existing directory #[cfg(feature = "scaffolding")] #[command(name = "init")] InitProject { /// Project path path: Option, #[command(flatten)] options: GenerateProjectOptions, }, /// Create a new cargo project #[cfg(feature = "scaffolding")] #[command(name = "new")] NewProject { /// Project path path: String, #[command(flatten)] options: GenerateProjectOptions, }, #[cfg(feature = "scaffolding")] #[command(name = "generate-ci")] GenerateCI(GenerateCI), /// Upload python packages to pypi /// /// It is mostly similar to `twine upload`, but can only upload python wheels /// and source distributions. #[cfg(feature = "upload")] #[command(name = "upload")] Upload { #[command(flatten)] publish: PublishOpt, /// The python packages to upload #[arg(value_name = "FILE")] files: Vec, }, /// Autogenerate type stubs #[command(name = "generate-stubs")] GenerateStub { /// The directory to store the type stubs in #[arg(short, long)] out: PathBuf, /// Python and bindings options #[command(flatten)] python: PythonOptions, /// Cargo build options #[command(flatten)] cargo: CargoOptions, }, /// Backend for the PEP 517 integration. Not for human consumption /// /// The commands are meant to be called from the python PEP 517 #[command(subcommand)] Pep517(Pep517Command), /// Generate shell completions #[cfg(feature = "cli-completion")] #[command(name = "completions", hide = true)] Completions { #[arg(value_name = "SHELL")] shell: clap_complete_command::Shell, }, /// Zig linker wrapper #[cfg(feature = "zig")] #[command(subcommand, hide = true)] Zig(Zig), /// Generate the JSON schema for the `pyproject.toml` file. #[cfg(feature = "schemars")] #[command(name = "generate-json-schema", hide = true)] GenerateJsonSchema(GenerateJsonSchemaOptions), } #[instrument] fn run() -> Result<()> { #[cfg(feature = "zig")] { // Allow symlink `maturin` to various tool names to invoke zig wrappers // See https://github.com/messense/cargo-zigbuild/issues/52 let mut args = env::args(); let program_path = PathBuf::from(args.next().expect("no program path")); let program_name = program_path.file_stem().expect("no program name"); if program_name.eq_ignore_ascii_case("ar") { let zig = Zig::Ar { args: args.collect(), }; zig.execute()?; return Ok(()); } else if program_name.eq_ignore_ascii_case("lib") { let zig = Zig::Lib { args: args.collect(), }; zig.execute()?; return Ok(()); } else if program_name.to_string_lossy().ends_with("dlltool") { let zig = Zig::Dlltool { args: args.collect(), }; zig.execute()?; return Ok(()); } else if program_name.eq_ignore_ascii_case("install_name_tool") { cargo_zigbuild::macos::install_name_tool::execute(args)?; return Ok(()); } } #[cfg(not(feature = "wild"))] let opt = Opt::parse(); #[cfg(feature = "wild")] let opt = Opt::parse_from(wild::args_os()); setup_logging(opt.verbose)?; match opt.command { Command::Build { build, release, strip_opt, sdist, pgo, } => commands::build::build(build, release, strip_opt, sdist, pgo)?, #[cfg(feature = "upload")] Command::Publish { build, publish, debug, no_strip, no_sdist, pgo, } => commands::publish::publish(build, publish, debug, no_strip, no_sdist, pgo)?, Command::ListPython { target } => commands::list_python(target)?, Command::Develop(develop_options) => commands::develop::develop_cmd(develop_options)?, Command::SDist { manifest_path, out } => commands::sdist::sdist(manifest_path, out)?, Command::Pep517(subcommand) => commands::pep517::pep517(subcommand)?, #[cfg(feature = "scaffolding")] Command::InitProject { path, options } => commands::init_project(path, options)?, #[cfg(feature = "scaffolding")] Command::NewProject { path, options } => commands::new_project(path, options)?, #[cfg(feature = "scaffolding")] Command::GenerateCI(generate_ci) => commands::generate_ci(generate_ci)?, #[cfg(feature = "upload")] Command::Upload { publish, files } => commands::upload(publish, files)?, Command::GenerateStub { out, python, cargo } => { commands::generate_stubs::generate_stubs(out, python, cargo)? } #[cfg(feature = "cli-completion")] Command::Completions { shell } => { commands::completions(shell, &mut Opt::command()); } #[cfg(feature = "zig")] Command::Zig(subcommand) => commands::zig(subcommand)?, #[cfg(feature = "schemars")] Command::GenerateJsonSchema(args) => commands::generate_json_schema(args)?, } Ok(()) } #[cfg(not(debug_assertions))] fn setup_panic_hook() { let default_hook = std::panic::take_hook(); std::panic::set_hook(Box::new(move |panic_info| { eprintln!("\n==================================================================="); eprintln!("maturin has panicked. This is a bug in maturin. Please report this"); eprintln!("at https://github.com/PyO3/maturin/issues/new/choose."); eprintln!("If you can reliably reproduce this panic, include the"); eprintln!("reproduction steps and re-run with the RUST_BACKTRACE=1 environment"); eprintln!("variable set and include the backtrace in your report."); eprintln!(); eprintln!("Platform: {} {}", env::consts::OS, env::consts::ARCH); eprintln!("Version: {}", env!("CARGO_PKG_VERSION")); eprintln!("Args: {}", env::args().collect::>().join(" ")); eprintln!(); default_hook(panic_info); // Rust set exit code to 101 when the process panicked, // so here we use the same exit code std::process::exit(101); })); } fn setup_logging(verbose: u8) -> Result<()> { // `RUST_LOG` takes precedence over these let default_directive = match verbose { // `-v` runs `cargo build -v`, but doesn't show maturin debug logging yet. 0..=1 => tracing::level_filters::LevelFilter::OFF.into(), 2 => Directive::from_str("debug").unwrap(), 3.. => Directive::from_str("trace").unwrap(), }; let filter = EnvFilter::builder() .with_default_directive(default_directive) .from_env() .context("Invalid RUST_LOG directives")?; let logger = tracing_subscriber::fmt::layer() // fmt::layer() defaults to stdout; redirect to stderr so that // structured stdout output (e.g. PEP 517 directory names) is not // polluted by tracing spans. .with_writer(std::io::stderr) // Avoid showing all the details from the spans .compact() // Log the timing of each span .with_span_events(tracing_subscriber::fmt::format::FmtSpan::CLOSE); tracing_subscriber::registry() .with(logger.with_filter(filter)) .init(); Ok(()) } fn main() { #[cfg(not(debug_assertions))] setup_panic_hook(); if let Err(e) = run() { eprintln!("💥 maturin failed"); for cause in e.chain() { eprintln!(" Caused by: {cause}"); } std::process::exit(1); } } maturin-1.16.0/src/metadata.rs000066400000000000000000002150571527064705700162220ustar00rootroot00000000000000use crate::PyProjectToml; use anyhow::{Context, Result, bail, format_err}; use fs_err as fs; use indexmap::IndexMap; use normpath::PathExt; use once_cell::sync::Lazy; use pep440_rs::{Version, VersionSpecifiers}; use pep508_rs::{ ExtraName, ExtraOperator, MarkerExpression, MarkerTree, MarkerValueExtra, Requirement, }; use pyproject_toml::{Contact, License, check_pep639_glob}; use regex::Regex; use serde::{Deserialize, Serialize}; use std::collections::{HashMap, HashSet}; use std::fmt::Write as _; use std::path::{Component, Path, PathBuf}; use std::str; use std::str::FromStr; use tracing::debug; /// The metadata required to generate the .dist-info directory #[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)] pub struct WheelMetadata { /// Python Package Metadata 2.4 pub metadata24: Metadata24, /// The `[console_scripts]` for the entry_points.txt pub scripts: HashMap, /// The name of the module can be distinct from the package name, mostly /// because package names normally contain minuses while module names /// have underscores. The package name is part of metadata24 pub module_name: String, } /// Python Package Metadata 2.4 as specified in /// https://packaging.python.org/specifications/core-metadata/ /// Maturin writes static metadata and does not support dynamic fields atm. #[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)] #[serde(rename_all = "kebab-case")] #[allow(missing_docs)] pub struct Metadata24 { // Mandatory fields pub metadata_version: String, pub name: String, pub version: Version, // Optional fields pub platform: Vec, pub supported_platform: Vec, pub summary: Option, pub description: Option, pub description_content_type: Option, pub keywords: Option, pub home_page: Option, pub download_url: Option, pub author: Option, pub author_email: Option, pub maintainer: Option, pub maintainer_email: Option, pub license: Option, pub license_expression: Option, pub license_files: Vec, /// Mapping from relative license path to absolute source path on disk. /// Used for license files that live outside the pyproject directory (e.g. workspace-level). #[serde(skip)] pub license_file_sources: HashMap, pub classifiers: Vec, pub requires_dist: Vec, pub provides_dist: Vec, pub obsoletes_dist: Vec, pub requires_python: Option, pub requires_external: Vec, pub project_url: IndexMap, pub provides_extra: Vec, pub scripts: IndexMap, pub gui_scripts: IndexMap, pub entry_points: IndexMap>, } impl Metadata24 { /// Initializes with name, version and otherwise the defaults pub fn new(name: String, version: Version) -> Self { Self { metadata_version: "2.4".to_string(), name, version, platform: Vec::new(), supported_platform: Vec::new(), summary: None, description: None, description_content_type: None, keywords: None, home_page: None, download_url: None, author: None, author_email: None, maintainer: None, maintainer_email: None, license: None, license_expression: None, license_files: Vec::new(), license_file_sources: HashMap::new(), classifiers: Vec::new(), requires_dist: Vec::new(), provides_dist: Vec::new(), obsoletes_dist: Vec::new(), requires_python: None, requires_external: Vec::new(), project_url: IndexMap::new(), provides_extra: Vec::new(), scripts: IndexMap::new(), gui_scripts: IndexMap::new(), entry_points: IndexMap::new(), } } } const PLAINTEXT_CONTENT_TYPE: &str = "text/plain; charset=UTF-8"; const GFM_CONTENT_TYPE: &str = "text/markdown; charset=UTF-8; variant=GFM"; /// Guess a Description-Content-Type based on the file extension, /// defaulting to plaintext if extension is unknown or empty. /// /// See https://packaging.python.org/specifications/core-metadata/#description-content-type fn path_to_content_type(path: &Path) -> String { path.extension() .map_or(String::from(PLAINTEXT_CONTENT_TYPE), |ext| { let ext = ext.to_string_lossy().to_lowercase(); let type_str = match ext.as_str() { "rst" => "text/x-rst; charset=UTF-8", "md" => GFM_CONTENT_TYPE, "markdown" => GFM_CONTENT_TYPE, _ => PLAINTEXT_CONTENT_TYPE, }; String::from(type_str) }) } fn normalize_license_file_path(base_dir: &Path, absolute_license_path: &Path) -> Result { let file_name = absolute_license_path .file_name() .context("license file path has no filename")?; let Ok(relative) = absolute_license_path.strip_prefix(base_dir) else { return Ok(PathBuf::from(file_name)); }; if relative .components() .any(|c| matches!(c, std::path::Component::ParentDir)) { return Ok(PathBuf::from(file_name)); } Ok(relative.to_path_buf()) } fn resolve_pyproject_metadata_file( pyproject_dir: &Path, allowed_metadata_root: &Path, field: &str, path: &Path, ) -> Result { if path .components() .any(|c| matches!(c, Component::Prefix(_) | Component::RootDir)) { bail!( "`{field}` path `{}` must be relative to pyproject.toml", path.display() ); } let source = pyproject_dir.join(path); if path.components().any(|c| matches!(c, Component::ParentDir)) { let source = source.normalize()?.into_path_buf(); let allowed_metadata_root = allowed_metadata_root.normalize()?.into_path_buf(); if !source.starts_with(&allowed_metadata_root) { bail!( "`{field}` path `{}` resolves outside allowed metadata root `{}`", path.display(), allowed_metadata_root.display() ); } Ok(source) } else { Ok(source) } } impl Metadata24 { /// Merge metadata with pyproject.toml, where pyproject.toml takes precedence /// /// pyproject_dir must be the directory containing pyproject.toml pub fn merge_pyproject_toml( &mut self, pyproject_dir: impl AsRef, pyproject_toml: &PyProjectToml, ) -> Result<()> { self.merge_pyproject_toml_with_metadata_root( pyproject_dir.as_ref(), pyproject_dir.as_ref(), pyproject_toml, ) } /// Merge pyproject metadata while allowing parent-relative metadata files /// under `allowed_metadata_root`. pub(crate) fn merge_pyproject_toml_with_metadata_root( &mut self, pyproject_dir: &Path, allowed_metadata_root: &Path, pyproject_toml: &PyProjectToml, ) -> Result<()> { if let Some(project) = &pyproject_toml.project { let dynamic: HashSet<&str> = project .dynamic .as_ref() .map(|x| x.iter().map(AsRef::as_ref).collect()) .unwrap_or_default(); if dynamic.contains("name") { bail!("`project.dynamic` must not specify `name` in pyproject.toml"); } self.clear_non_dynamic_fields(&dynamic); self.name.clone_from(&project.name); self.merge_version(pyproject_toml, project)?; self.merge_readme(pyproject_dir, allowed_metadata_root, project)?; self.merge_license(pyproject_dir, allowed_metadata_root, project)?; self.merge_people(project); if let Some(description) = &project.description { self.summary = Some(single_line_summary(description)); } if let Some(requires_python) = &project.requires_python { self.requires_python = Some(requires_python.clone()); } if let Some(keywords) = &project.keywords { self.keywords = Some(keywords.join(",")); } if let Some(classifiers) = &project.classifiers { self.classifiers.clone_from(classifiers); } if let Some(urls) = &project.urls { self.project_url.clone_from(urls); } if let Some(dependencies) = &project.dependencies { self.requires_dist.clone_from(dependencies); } self.merge_optional_dependencies(project)?; self.merge_entry_points(project)?; } self.normalize_license_paths(pyproject_dir)?; Ok(()) } /// Clear metadata fields that are not listed in `[project.dynamic]`. fn clear_non_dynamic_fields(&mut self, dynamic: &HashSet<&str>) { if !dynamic.contains("description") { self.summary = None; } if !dynamic.contains("authors") { self.author = None; self.author_email = None; } if !dynamic.contains("maintainers") { self.maintainer = None; self.maintainer_email = None; } if !dynamic.contains("keywords") { self.keywords = None; } if !dynamic.contains("urls") { self.project_url.clear(); } if !dynamic.contains("license") { self.license = None; self.license_expression = None; } if !dynamic.contains("classifiers") { self.classifiers.clear(); } if !dynamic.contains("readme") { self.description = None; self.description_content_type = None; } if !dynamic.contains("requires-python") { self.requires_python = None; } } /// Merge version information from pyproject.toml. fn merge_version( &mut self, pyproject_toml: &PyProjectToml, project: &pyproject_toml::Project, ) -> Result<()> { let version_ok = pyproject_toml.warn_invalid_version_info(); if !version_ok { let current_major = env!("CARGO_PKG_VERSION_MAJOR").parse::().unwrap(); if current_major > 1 { bail!("Invalid version information in pyproject.toml."); } } if let Some(version) = &project.version { self.version = version.clone(); } Ok(()) } /// Merge readme from pyproject.toml. fn merge_readme( &mut self, pyproject_dir: &Path, allowed_metadata_root: &Path, project: &pyproject_toml::Project, ) -> Result<()> { match &project.readme { Some(pyproject_toml::ReadMe::RelativePath(readme_path)) => { let readme_path = resolve_pyproject_metadata_file( pyproject_dir, allowed_metadata_root, "project.readme", Path::new(readme_path), )?; let description = Some(fs::read_to_string(&readme_path).context(format!( "Failed to read readme specified in pyproject.toml, which should be at {}", readme_path.display() ))?); self.description = description; self.description_content_type = Some(path_to_content_type(&readme_path)); } Some(pyproject_toml::ReadMe::Table { file, text, content_type, }) => { if file.is_some() && text.is_some() { bail!( "file and text fields of 'project.readme' are mutually-exclusive, only one of them should be specified" ); } if let Some(readme_path) = file { let readme_path = resolve_pyproject_metadata_file( pyproject_dir, allowed_metadata_root, "project.readme.file", Path::new(readme_path), )?; let description = Some(fs::read_to_string(&readme_path).context(format!( "Failed to read readme specified in pyproject.toml, which should be at {}", readme_path.display() ))?); self.description = description; } if let Some(description) = text { self.description = Some(description.clone()); } self.description_content_type.clone_from(content_type); } None => {} } Ok(()) } /// Merge license and license-files from pyproject.toml. fn merge_license( &mut self, pyproject_dir: &Path, allowed_metadata_root: &Path, project: &pyproject_toml::Project, ) -> Result<()> { if let Some(license) = &project.license { match license { // PEP 639 License::Spdx(license_expr) => self.license_expression = Some(license_expr.clone()), // Deprecated by PEP 639 License::File { file } => { let source = resolve_pyproject_metadata_file( pyproject_dir, allowed_metadata_root, "project.license.file", file, )?; let target = if file.components().any(|c| matches!(c, Component::ParentDir)) { let allowed_metadata_root = allowed_metadata_root.normalize()?.into_path_buf(); source .strip_prefix(&allowed_metadata_root) .with_context(|| { format!( "`project.license.file` path `{}` resolves outside allowed metadata root `{}`", file.display(), allowed_metadata_root.display() ) })? .to_path_buf() } else { normalize_license_file_path(pyproject_dir, &source)? }; self.license_file_sources.remove(&target); if target != *file { self.license_file_sources.insert(target.clone(), source); } if !self.license_files.contains(&target) { self.license_files.push(target); } } License::Text { text } => self.license = Some(text.clone()), } } let pyproject_dir_str = pyproject_dir.to_str().with_context(|| { format!( "project path is not valid UTF-8: {}", pyproject_dir.display() ) })?; if let Some(license_files) = &project.license_files { let escaped_pyproject_dir = PathBuf::from(glob::Pattern::escape(pyproject_dir_str)); for license_glob in license_files { check_pep639_glob(license_glob)?; for license_path in glob::glob(&escaped_pyproject_dir.join(license_glob).to_string_lossy())? { let license_path = license_path?; if !license_path.is_file() { continue; } let license_path = license_path .strip_prefix(pyproject_dir) .expect("matched path starts with glob root") .to_path_buf(); self.license_file_sources.remove(&license_path); if !self.license_files.contains(&license_path) { debug!("Including license file `{}`", license_path.display()); self.license_files.push(license_path); } } } } else { // Auto-discovery of license files for backwards compatibility let license_include_targets = ["LICEN[CS]E*", "COPYING*", "NOTICE*", "AUTHORS*"]; let escaped_manifest_string = glob::Pattern::escape(pyproject_dir_str); let escaped_manifest_path = Path::new(&escaped_manifest_string); for pattern in license_include_targets.iter() { for license_path in glob::glob(&escaped_manifest_path.join(pattern).to_string_lossy())? .filter_map(Result::ok) { if !license_path.is_file() { continue; } let license_path = license_path .strip_prefix(pyproject_dir) .expect("matched path starts with glob root") .to_path_buf(); if !self.license_files.contains(&license_path) { eprintln!("📦 Including license file `{}`", license_path.display()); self.license_files.push(license_path); } } } } Ok(()) } /// Merge author and maintainer contacts from pyproject.toml. fn merge_people(&mut self, project: &pyproject_toml::Project) { if let Some(authors) = &project.authors { let (names, emails) = split_contacts(authors); if names.is_some() { self.author = names; } if emails.is_some() { self.author_email = emails; } } if let Some(maintainers) = &project.maintainers { let (names, emails) = split_contacts(maintainers); if names.is_some() { self.maintainer = names; } if emails.is_some() { self.maintainer_email = emails; } } } /// Merge optional dependencies into requires_dist with extra markers. fn merge_optional_dependencies(&mut self, project: &pyproject_toml::Project) -> Result<()> { if let Some(dependencies) = &project.optional_dependencies { for (extra, deps) in dependencies { let extra_name = ExtraName::new(extra.clone()) .with_context(|| format!("invalid extra name: {extra}"))?; // Metadata 2.3+ only allows normalized names in `Provides-Extra` // (PEP 685), the same form the `extra == ...` markers use. let normalized = extra_name.to_string(); if !self.provides_extra.contains(&normalized) { self.provides_extra.push(normalized); } for dep in deps { let mut dep = dep.clone(); let new_extra = MarkerExpression::Extra { operator: ExtraOperator::Equal, name: MarkerValueExtra::Extra(extra_name.clone()), }; dep.marker.and(MarkerTree::expression(new_extra)); self.requires_dist.push(dep); } } } Ok(()) } /// Merge scripts, gui-scripts, and entry-points from pyproject.toml. fn merge_entry_points(&mut self, project: &pyproject_toml::Project) -> Result<()> { if let Some(scripts) = &project.scripts { self.scripts.clone_from(scripts); } if let Some(gui_scripts) = &project.gui_scripts { self.gui_scripts.clone_from(gui_scripts); } if let Some(entry_points) = &project.entry_points { if entry_points.contains_key("console_scripts") { bail!("console_scripts is not allowed in project.entry-points table"); } if entry_points.contains_key("gui_scripts") { bail!("gui_scripts is not allowed in project.entry-points table"); } self.entry_points.clone_from(entry_points); } Ok(()) } /// Normalize absolute license file paths to be relative to pyproject_dir. fn normalize_license_paths(&mut self, pyproject_dir: &Path) -> Result<()> { let absolute_license_files = self .license_files .iter() .filter(|p| p.is_absolute()) .cloned() .collect::>(); if !absolute_license_files.is_empty() { self.license_files.retain(|p| !p.is_absolute()); for absolute_license_file in absolute_license_files { let wheel_path = normalize_license_file_path(pyproject_dir, &absolute_license_file)?; if !self.license_files.contains(&wheel_path) { self.license_file_sources .insert(wheel_path.clone(), absolute_license_file); self.license_files.push(wheel_path); } } } Ok(()) } /// Uses a Cargo.toml to create the metadata for python packages /// /// manifest_path must be the directory, not the file pub fn from_cargo_toml( manifest_path: impl AsRef, cargo_metadata: &cargo_metadata::Metadata, ) -> Result { let package = cargo_metadata .root_package() .context("Expected cargo to return metadata with root_package")?; let authors = package.authors.join(", "); let author_email = if authors.contains('@') { Some(authors.clone()) } else { None }; let mut description: Option = None; let mut description_content_type: Option = None; // See https://packaging.python.org/specifications/core-metadata/#description // and https://doc.rust-lang.org/cargo/reference/manifest.html#the-readme-field if package.readme == Some("false".into()) { // > You can suppress this behavior by setting this field to false } else if let Some(ref readme) = package.readme { let readme_path = manifest_path.as_ref().join(readme); description = Some(fs::read_to_string(&readme_path).context(format!( "Failed to read Readme specified in Cargo.toml, which should be at {}", readme_path.display() ))?); description_content_type = Some(path_to_content_type(&readme_path)); } else { // > If no value is specified for this field, and a file named // > README.md, README.txt or README exists in the package root // Even though it's not what cargo does, we also search for README.rst // since it's still popular in the python world for readme_guess in ["README.md", "README.txt", "README.rst", "README"] { let guessed_readme = manifest_path.as_ref().join(readme_guess); if guessed_readme.exists() { let context = format!( "Readme at {} exists, but can't be read", guessed_readme.display() ); description = Some(fs::read_to_string(&guessed_readme).context(context)?); description_content_type = Some(path_to_content_type(&guessed_readme)); break; } } }; let name = package.name.clone(); let mut project_url = IndexMap::new(); if let Some(homepage) = package.homepage.as_ref() { project_url.insert("Homepage".to_string(), homepage.clone()); } if let Some(documentation) = package.documentation.as_ref() { project_url.insert("Documentation".to_string(), documentation.clone()); } if let Some(repository) = package.repository.as_ref() { project_url.insert("Source Code".to_string(), repository.clone()); } let mut license_file_sources = HashMap::new(); let license_files = if let Some(license_file) = package.license_file.as_ref() { let absolute_license_path = manifest_path .as_ref() .join(license_file) .normalize()? .into_path_buf(); let workspace_root = cargo_metadata .workspace_root .as_std_path() .normalize()? .into_path_buf(); if !absolute_license_path.starts_with(&workspace_root) { bail!( "license file `{license_file}` specified in `{}` resolves outside Cargo workspace root `{}`", manifest_path.as_ref().display(), workspace_root.display() ); } if !absolute_license_path.is_file() { bail!( "license file `{license_file}` specified in `{}` is not a file", manifest_path.as_ref().display() ); } let manifest_dir = manifest_path.as_ref().normalize()?.into_path_buf(); let wheel_path = normalize_license_file_path(&manifest_dir, &absolute_license_path)?; // Always keep the absolute source path so write_dist_info can copy // correctly even when pyproject.toml lives above Cargo.toml. license_file_sources.insert(wheel_path.clone(), absolute_license_path); vec![wheel_path] } else { Vec::new() }; let version = Version::from_str(&package.version.to_string()).map_err(|err| { format_err!( "Rust version used in Cargo.toml is not a valid python version: {}. \ Note that rust uses [SemVer](https://semver.org/) while python uses \ [PEP 440](https://peps.python.org/pep-0440/), which have e.g. some differences \ when declaring prereleases.", err ) })?; let metadata = Metadata24 { // name, version and metadata_version are added through metadata24::new() // Mapped from cargo metadata summary: package.description.as_deref().map(single_line_summary), description, description_content_type, keywords: if package.keywords.is_empty() { None } else { Some(package.keywords.join(",")) }, home_page: package.homepage.clone(), download_url: None, // Cargo.toml has no distinction between author and author email author: if package.authors.is_empty() { None } else { Some(authors) }, author_email, license: package.license.clone(), license_files, license_file_sources, project_url, ..Metadata24::new(name.to_string(), version) }; Ok(metadata) } /// Formats the metadata into a list where keys with multiple values /// become multiple single-valued key-value pairs. This format is needed for the pypi /// uploader and for the METADATA file inside wheels pub fn to_vec(&self) -> Vec<(String, String)> { let mut fields = vec![ ("Metadata-Version", self.metadata_version.clone()), ("Name", self.name.clone()), ("Version", self.version.to_string()), ]; let mut add_vec = |name, values: &[String]| { for i in values { fields.push((name, i.clone())); } }; add_vec("Platform", &self.platform); add_vec("Supported-Platform", &self.supported_platform); add_vec("Classifier", &self.classifiers); add_vec( "Requires-Dist", &self .requires_dist .iter() .map(ToString::to_string) .collect::>(), ); add_vec("Provides-Dist", &self.provides_dist); add_vec("Obsoletes-Dist", &self.obsoletes_dist); add_vec("Requires-External", &self.requires_external); add_vec("Provides-Extra", &self.provides_extra); let license_files: Vec = self .license_files .iter() // Use a portable path to ensure the metadata is consistent between Unix and Windows. .map(|path| path.display().to_string().replace("\\", "/")) .collect(); add_vec("License-File", &license_files); let mut add_option = |name, value: &Option| { if let Some(some) = value.clone() { fields.push((name, some)); } }; add_option("Summary", &self.summary); add_option("Keywords", &self.keywords); add_option("Home-Page", &self.home_page); add_option("Download-URL", &self.download_url); add_option("Author", &self.author); add_option("Author-email", &self.author_email); add_option("Maintainer", &self.maintainer); add_option("Maintainer-email", &self.maintainer_email); // PEP 639 add_option("License-Expression", &self.license_expression); // Deprecated by PEP 639 add_option("License", &self.license.as_deref().map(fold_header)); add_option( "Requires-Python", &self .requires_python .as_ref() .map(|requires_python| requires_python.to_string()), ); add_option("Description-Content-Type", &self.description_content_type); // Project-URL is special // "A string containing a browsable URL for the project and a label for it, separated by a comma." // `Project-URL: Bug Tracker, http://bitbucket.org/tarek/distribute/issues/` for (key, value) in self.project_url.iter() { fields.push(("Project-URL", format!("{key}, {value}"))) } // Description shall be last, so we can ignore RFC822 and just put the description // in the body // The borrow checker doesn't like us using add_option here if let Some(description) = &self.description { fields.push(("Description", description.clone())); } fields .into_iter() .map(|(k, v)| (k.to_string(), v)) .collect() } /// Writes the format for the metadata file inside wheels pub fn to_file_contents(&self) -> Result { let mut fields = self.to_vec(); let mut out = "".to_string(); let body = match fields.last() { Some((key, description)) if key == "Description" => { let desc = description.clone(); fields.pop().unwrap(); Some(desc) } Some((_, _)) => None, None => None, }; for (key, value) in fields { writeln!(out, "{key}: {value}")?; } if let Some(body) = body { writeln!(out, "\n{body}")?; } Ok(out) } /// Returns the distribution name normalized according to the PyPA Binary /// Distribution Format specification. /// /// This is the name that will be used in the wheel filename and for the /// `.dist-info` directory name. It is also the name that will be used in /// the source distribution (sdist) filename. /// /// See https://packaging.python.org/en/latest/specifications/binary-distribution-format/#escaping-and-unicode pub fn get_distribution_escaped(&self) -> String { static RE: Lazy = Lazy::new(|| Regex::new(r"[-_.]+").unwrap()); RE.replace_all(&self.name, "_").to_lowercase() } /// Returns the version encoded according to PEP 427, Section "Escaping /// and Unicode" pub fn get_version_escaped(&self) -> String { self.version.to_string().replace('-', "_") } /// Returns the name of the .dist-info directory as defined in the wheel specification pub fn get_dist_info_dir(&self) -> PathBuf { PathBuf::from(format!( "{}-{}.dist-info", self.get_distribution_escaped(), self.get_version_escaped() )) } /// Returns the name of the .data directory as defined in the wheel specification pub fn get_data_dir(&self) -> PathBuf { PathBuf::from(format!( "{}-{}.data", self.get_distribution_escaped(), self.get_version_escaped() )) } /// Returns the platlib directory for relocated scripts. /// /// When bin bindings have external shared library dependencies, the real /// binary is moved from `.data/scripts/` into this directory in platlib /// so that it has a predictable relative path to the bundled shared /// libraries directory (`.libs/` on Linux/Windows, `.dylibs/` on macOS). /// A Python shim replaces the original script entry. /// /// See . pub fn get_scripts_platlib_dir(&self) -> PathBuf { PathBuf::from(format!("{}.scripts", self.get_distribution_escaped())) } } /// Split a list of contacts (authors or maintainers) into separate /// name and email strings, following PEP 621 conventions. fn split_contacts(contacts: &[Contact]) -> (Option, Option) { let mut names = Vec::with_capacity(contacts.len()); let mut emails = Vec::with_capacity(contacts.len()); for contact in contacts { match (contact.name(), contact.email()) { (Some(name), Some(email)) => { emails.push(escape_email_with_display_name(name, email)); } (Some(name), None) => { names.push(name.to_string()); } (None, Some(email)) => { emails.push(email.to_string()); } (None, None) => {} } } let names = if names.is_empty() { None } else { Some(names.join(", ")) }; let emails = if emails.is_empty() { None } else { Some(emails.join(", ")) }; (names, emails) } /// Escape email addresses with display name if necessary /// according to RFC 822 Section 3.3. "specials". fn escape_email_with_display_name(display_name: &str, email: &str) -> String { if display_name.chars().any(|c| { matches!( c, '(' | ')' | '<' | '>' | '@' | ',' | ';' | ':' | '\\' | '"' | '.' | '[' | ']' ) }) { return format!( "\"{}\" <{email}>", display_name.replace('\\', "\\\\").replace('\"', "\\\"") ); } format!("{display_name} <{email}>") } /// Join a multi-line description into the single line `Summary` allows. /// /// A line break inside the `Summary` header ends the header block early, so /// every field written after it would be read as part of the description. fn single_line_summary(text: &str) -> String { text.split(['\r', '\n']) .map(str::trim) .filter(|line| !line.is_empty()) .collect::>() .join(" ") } /// Fold long header field according to RFC 5322 section 2.2.3 /// https://datatracker.ietf.org/doc/html/rfc5322#section-2.2.3 fn fold_header(text: &str) -> String { let mut result = String::with_capacity(text.len()); let options = textwrap::Options::new(78) .initial_indent("") .subsequent_indent("\t"); for (i, line) in textwrap::wrap(text, options).iter().enumerate() { if i > 0 { result.push_str("\r\n"); } let line = line.trim_end(); if line.is_empty() { result.push('\t'); } else { result.push_str(line); } } result } #[cfg(test)] mod tests { use super::*; use crate::test_utils::test_crate_path; use cargo_metadata::MetadataCommand; use expect_test::{Expect, expect}; use indoc::indoc; use pretty_assertions::assert_eq; use tempfile::TempDir; fn assert_metadata_from_cargo_toml( readme: &str, cargo_toml: &str, expected: Expect, ) -> Metadata24 { let crate_dir = tempfile::tempdir().unwrap(); let crate_path = crate_dir.path(); let manifest_path = crate_path.join("Cargo.toml"); fs::create_dir(crate_path.join("src")).unwrap(); fs::write(crate_path.join("src/lib.rs"), "").unwrap(); let readme_path = crate_path.join("README.md"); fs::write(&readme_path, readme.as_bytes()).unwrap(); let readme_path = if cfg!(windows) { readme_path.to_str().unwrap().replace('\\', "/") } else { readme_path.to_str().unwrap().to_string() }; let toml_with_path = cargo_toml.replace("REPLACE_README_PATH", &readme_path); fs::write(&manifest_path, toml_with_path).unwrap(); let cargo_metadata = MetadataCommand::new() .manifest_path(manifest_path) .exec() .unwrap(); let metadata = Metadata24::from_cargo_toml(crate_path, &cargo_metadata).unwrap(); let actual = metadata.to_file_contents().unwrap(); expected.assert_eq(&actual); // get_dist_info_dir test checks against hard-coded values - check that they are as expected in the source first assert!( cargo_toml.contains("name = \"info-project\"") && cargo_toml.contains("version = \"0.1.0\""), "cargo_toml name and version string do not match hardcoded values, test will fail", ); metadata } #[test] fn test_metadata_from_cargo_toml() { let readme = indoc!( r#" # Some test package This is the readme for a test package "# ); let cargo_toml = indoc!( r#" [package] authors = ["konstin "] name = "info-project" version = "0.1.0" description = """ A test project """ homepage = "https://example.org" readme = "REPLACE_README_PATH" keywords = ["ffi", "test"] [lib] crate-type = ["cdylib"] name = "pyo3_pure" "# ); let expected = expect![[r#" Metadata-Version: 2.4 Name: info-project Version: 0.1.0 Summary: A test project Keywords: ffi,test Home-Page: https://example.org Author: konstin Author-email: konstin Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM Project-URL: Homepage, https://example.org # Some test package This is the readme for a test package "#]]; assert_metadata_from_cargo_toml(readme, cargo_toml, expected); } #[test] fn test_multiline_description_from_cargo_toml() { let readme = "readme"; // A line break inside `Summary` would end the header block early and // turn every following field into part of the description. let cargo_toml = indoc!( r#" [package] name = "info-project" version = "0.1.0" description = """ A test project written in Rust for Python """ homepage = "https://example.org" readme = "REPLACE_README_PATH" keywords = ["ffi", "test"] [lib] crate-type = ["cdylib"] name = "pyo3_pure" "# ); let expected = expect![[r#" Metadata-Version: 2.4 Name: info-project Version: 0.1.0 Summary: A test project written in Rust for Python Keywords: ffi,test Home-Page: https://example.org Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM Project-URL: Homepage, https://example.org readme "#]]; assert_metadata_from_cargo_toml(readme, cargo_toml, expected); } #[test] fn test_multiline_description_from_pyproject_toml() { let temp_dir = TempDir::new().unwrap(); let crate_path = temp_dir.path(); let manifest_path = crate_path.join("Cargo.toml"); let pyproject_path = crate_path.join("pyproject.toml"); fs::create_dir(crate_path.join("src")).unwrap(); fs::write(crate_path.join("src/lib.rs"), "").unwrap(); let cargo_toml = indoc!( r#" [package] name = "test-package" version = "0.1.0" [lib] crate-type = ["cdylib"] "# ); fs::write(&manifest_path, cargo_toml).unwrap(); let pyproject_toml_content = indoc!( r#" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "test-package" version = "0.1.0" description = """ A test project written in Rust""" requires-python = ">=3.9" "# ); fs::write(&pyproject_path, pyproject_toml_content).unwrap(); let cargo_metadata = MetadataCommand::new() .manifest_path(&manifest_path) .exec() .unwrap(); let mut metadata = Metadata24::from_cargo_toml(crate_path, &cargo_metadata).unwrap(); let pyproject_toml = PyProjectToml::new(&pyproject_path).unwrap(); metadata .merge_pyproject_toml(crate_path, &pyproject_toml) .unwrap(); assert_eq!( metadata.summary.as_deref(), Some("A test project written in Rust") ); let contents = metadata.to_file_contents().unwrap(); assert!( contents.contains("Summary: A test project written in Rust\nRequires-Python: >=3.9\n"), "unexpected METADATA:\n{contents}" ); } #[test] fn test_path_to_content_type() { for (filename, expected) in &[ ("r.md", GFM_CONTENT_TYPE), ("r.markdown", GFM_CONTENT_TYPE), ("r.mArKdOwN", GFM_CONTENT_TYPE), ("r.rst", "text/x-rst; charset=UTF-8"), ("r.somethingelse", PLAINTEXT_CONTENT_TYPE), ("r", PLAINTEXT_CONTENT_TYPE), ] { let result = path_to_content_type(&PathBuf::from(filename)); assert_eq!( &result.as_str(), expected, "Wrong content type for file '{}'. Expected '{}', got '{}'", filename, expected, result ); } } #[test] fn test_merge_metadata_from_pyproject_toml() { let manifest_dir = test_crate_path("pyo3-pure"); let cargo_metadata = MetadataCommand::new() .manifest_path(manifest_dir.join("Cargo.toml")) .exec() .unwrap(); let mut metadata = Metadata24::from_cargo_toml(&manifest_dir, &cargo_metadata).unwrap(); let pyproject_toml = PyProjectToml::new(manifest_dir.join("pyproject.toml")).unwrap(); metadata .merge_pyproject_toml(&manifest_dir, &pyproject_toml) .unwrap(); assert_eq!( metadata.summary, Some("Implements a dummy function in Rust".to_string()) ); assert_eq!( metadata.description, Some(fs_err::read_to_string(manifest_dir.join("README.md")).unwrap()) ); assert_eq!(metadata.classifiers, &["Programming Language :: Rust"]); assert_eq!( metadata.maintainer_email, Some("messense ".to_string()) ); assert_eq!(metadata.scripts["get_42"], "pyo3_pure:DummyClass.get_42"); assert_eq!( metadata.gui_scripts["get_42_gui"], "pyo3_pure:DummyClass.get_42" ); assert_eq!(metadata.provides_extra, &["test"]); assert_eq!( metadata.requires_dist, &[ Requirement::from_str("attrs; extra == 'test'",).unwrap(), Requirement::from_str("boltons; (sys_platform == 'win32') and extra == 'test'") .unwrap(), ] ); assert_eq!(metadata.license.as_ref().unwrap(), "MIT"); let license_file = &metadata.license_files[0]; assert_eq!(license_file.file_name().unwrap(), "LICENSE"); let content = metadata.to_file_contents().unwrap(); let pkginfo: Result = content.parse(); assert!(pkginfo.is_ok()); } #[test] fn test_merge_metadata_from_pyproject_toml_with_customized_python_source_dir() { let manifest_dir = test_crate_path("pyo3-mixed-py-subdir"); let cargo_metadata = MetadataCommand::new() .manifest_path(manifest_dir.join("Cargo.toml")) .exec() .unwrap(); let mut metadata = Metadata24::from_cargo_toml(&manifest_dir, &cargo_metadata).unwrap(); let pyproject_toml = PyProjectToml::new(manifest_dir.join("pyproject.toml")).unwrap(); metadata .merge_pyproject_toml(&manifest_dir, &pyproject_toml) .unwrap(); // defined in Cargo.toml assert_eq!( metadata.summary, Some("Implements a dummy function combining rust and python".to_string()) ); // defined in pyproject.toml assert_eq!(metadata.scripts["get_42"], "pyo3_mixed_py_subdir:get_42"); } #[test] fn test_implicit_readme() { let manifest_dir = test_crate_path("pyo3-mixed"); let cargo_metadata = MetadataCommand::new() .manifest_path(manifest_dir.join("Cargo.toml")) .exec() .unwrap(); let metadata = Metadata24::from_cargo_toml(&manifest_dir, &cargo_metadata).unwrap(); assert!(metadata.description.unwrap().starts_with("# pyo3-mixed")); assert_eq!( metadata.description_content_type.unwrap(), "text/markdown; charset=UTF-8; variant=GFM" ); } #[test] fn test_pep639() { let manifest_dir = test_crate_path("pyo3-mixed"); let cargo_metadata = MetadataCommand::new() .manifest_path(manifest_dir.join("Cargo.toml")) .exec() .unwrap(); let mut metadata = Metadata24::from_cargo_toml(&manifest_dir, &cargo_metadata).unwrap(); let pyproject_toml = PyProjectToml::new(manifest_dir.join("pyproject.toml")).unwrap(); metadata .merge_pyproject_toml(&manifest_dir, &pyproject_toml) .unwrap(); assert_eq!(metadata.license_expression.as_ref().unwrap(), "MIT"); assert_eq!(metadata.license.as_ref(), None); } #[test] fn test_merge_metadata_from_pyproject_dynamic_license_test() { let manifest_dir = test_crate_path("license-test"); let cargo_metadata = MetadataCommand::new() .manifest_path(manifest_dir.join("Cargo.toml")) .exec() .unwrap(); let mut metadata = Metadata24::from_cargo_toml(&manifest_dir, &cargo_metadata).unwrap(); let pyproject_toml = PyProjectToml::new(manifest_dir.join("pyproject.toml")).unwrap(); metadata .merge_pyproject_toml(&manifest_dir, &pyproject_toml) .unwrap(); // verify Cargo.toml value came through assert_eq!(metadata.license.as_ref().unwrap(), "MIT"); // verify we have the total number of expected licenses assert_eq!(4, metadata.license_files.len()); // Verify pyproject.toml license = {file = ...} worked assert_eq!(metadata.license_files[0], PathBuf::from("LICENCE.txt")); // Verify the default licenses were included assert_eq!(metadata.license_files[1], PathBuf::from("LICENSE")); assert_eq!(metadata.license_files[2], PathBuf::from("NOTICE.md")); assert_eq!(metadata.license_files[3], PathBuf::from("AUTHORS.txt")); } #[test] fn test_provides_extra_is_normalized() { let temp_dir = TempDir::new().unwrap(); let crate_path = temp_dir.path(); let manifest_path = crate_path.join("Cargo.toml"); let pyproject_path = crate_path.join("pyproject.toml"); fs::create_dir(crate_path.join("src")).unwrap(); fs::write(crate_path.join("src/lib.rs"), "").unwrap(); let cargo_toml = indoc!( r#" [package] name = "test-package" version = "0.1.0" [lib] crate-type = ["cdylib"] "# ); fs::write(&manifest_path, cargo_toml).unwrap(); let pyproject_toml_content = indoc!( r#" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "test-package" version = "0.1.0" [project.optional-dependencies] Dev_Tools = ["attrs"] "dev.tools" = ["boltons"] "# ); fs::write(&pyproject_path, pyproject_toml_content).unwrap(); let cargo_metadata = MetadataCommand::new() .manifest_path(&manifest_path) .exec() .unwrap(); let mut metadata = Metadata24::from_cargo_toml(crate_path, &cargo_metadata).unwrap(); let pyproject_toml = PyProjectToml::new(&pyproject_path).unwrap(); metadata .merge_pyproject_toml(crate_path, &pyproject_toml) .unwrap(); // Metadata 2.3+ requires normalized extra names (PEP 685), and they // have to match the names used in the `extra == ...` markers. assert_eq!(metadata.provides_extra, &["dev-tools"]); assert_eq!( metadata.requires_dist, &[ Requirement::from_str("attrs; extra == 'dev-tools'").unwrap(), Requirement::from_str("boltons; extra == 'dev-tools'").unwrap(), ] ); } #[test] fn test_escape_email_with_display_name_without_special_characters() { let display_name = "Foo Bar !#$%&'*+-/=?^_`{|}~ 123"; let email = "foobar-123@example.com"; let result = escape_email_with_display_name(display_name, email); assert_eq!( result, "Foo Bar !#$%&'*+-/=?^_`{|}~ 123 " ); } #[test] fn test_escape_email_with_display_name_with_special_characters() { let tests = [ ("Foo ( Bar", "\"Foo ( Bar\""), ("Foo ) Bar", "\"Foo ) Bar\""), ("Foo < Bar", "\"Foo < Bar\""), ("Foo > Bar", "\"Foo > Bar\""), ("Foo @ Bar", "\"Foo @ Bar\""), ("Foo , Bar", "\"Foo , Bar\""), ("Foo ; Bar", "\"Foo ; Bar\""), ("Foo : Bar", "\"Foo : Bar\""), ("Foo \\ Bar", "\"Foo \\\\ Bar\""), ("Foo \" Bar", "\"Foo \\\" Bar\""), ("Foo . Bar", "\"Foo . Bar\""), ("Foo [ Bar", "\"Foo [ Bar\""), ("Foo ] Bar", "\"Foo ] Bar\""), ("Foo ) Bar", "\"Foo ) Bar\""), ("Foo ) Bar", "\"Foo ) Bar\""), ("Foo, Bar", "\"Foo, Bar\""), ]; for (display_name, expected_name) in tests { let email = "foobar-123@example.com"; let result = escape_email_with_display_name(display_name, email); let expected = format!("{expected_name} <{email}>"); assert_eq!(result, expected); } } #[test] fn test_license_file_normalization_outside_pyproject_dir() { // Simulate a workspace-level license file that lives outside pyproject_dir. // merge_pyproject_toml should normalize it to just the filename and record // the absolute source in license_file_sources. let temp_dir = TempDir::new().unwrap(); let workspace_root = temp_dir.path(); let crate_dir = workspace_root.join("crates/my-crate"); fs::create_dir_all(crate_dir.join("src")).unwrap(); fs::write(crate_dir.join("src/lib.rs"), "").unwrap(); // Workspace-level LICENSE fs::write(workspace_root.join("LICENSE"), "MIT License").unwrap(); let cargo_toml = indoc!( r#" [package] name = "my-crate" version = "0.1.0" edition = "2021" [lib] crate-type = ["cdylib"] "# ); fs::write(crate_dir.join("Cargo.toml"), cargo_toml).unwrap(); let pyproject_toml_content = indoc!( r#" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "my-crate" version = "0.1.0" "# ); fs::write(crate_dir.join("pyproject.toml"), pyproject_toml_content).unwrap(); let mut metadata = Metadata24::new("my-crate".to_string(), Version::from_str("0.1.0").unwrap()); // Simulate an absolute license file from Cargo.toml (workspace-level) let abs_license = workspace_root .join("LICENSE") .normalize() .unwrap() .into_path_buf(); metadata.license_files.push(abs_license.clone()); let pyproject_toml = PyProjectToml::new(crate_dir.join("pyproject.toml")).unwrap(); metadata .merge_pyproject_toml(&crate_dir, &pyproject_toml) .unwrap(); // Should be normalized to just the filename assert!( metadata .license_files .iter() .any(|p| p == Path::new("LICENSE")), "expected relative LICENSE in license_files, got: {:?}", metadata.license_files ); // Should have the absolute source recorded assert_eq!( metadata.license_file_sources.get(Path::new("LICENSE")), Some(&abs_license), ); } #[test] fn test_license_normalization_without_project_table() { // When pyproject.toml has no [project] table, license file normalization // should still run (the fix moved it outside the if-let guard). let temp_dir = TempDir::new().unwrap(); let crate_dir = temp_dir.path(); fs::create_dir(crate_dir.join("src")).unwrap(); fs::write(crate_dir.join("src/lib.rs"), "").unwrap(); let cargo_toml = indoc!( r#" [package] name = "no-project" version = "0.1.0" edition = "2021" [lib] crate-type = ["cdylib"] "# ); fs::write(crate_dir.join("Cargo.toml"), cargo_toml).unwrap(); // pyproject.toml with NO [project] table let pyproject_toml_content = indoc!( r#" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" "# ); fs::write(crate_dir.join("pyproject.toml"), pyproject_toml_content).unwrap(); // Create a license file inside the crate fs::write(crate_dir.join("LICENSE"), "MIT").unwrap(); let mut metadata = Metadata24::new( "no-project".to_string(), Version::from_str("0.1.0").unwrap(), ); // Add absolute path (as from_cargo_toml would) let abs_license = crate_dir .join("LICENSE") .normalize() .unwrap() .into_path_buf(); metadata.license_files.push(abs_license); let normalized_crate_dir = crate_dir.normalize().unwrap().into_path_buf(); let pyproject_toml = PyProjectToml::new(crate_dir.join("pyproject.toml")).unwrap(); metadata .merge_pyproject_toml(&normalized_crate_dir, &pyproject_toml) .unwrap(); // Should still be normalized to relative even without [project] assert!( metadata.license_files.contains(&PathBuf::from("LICENSE")), "expected relative LICENSE, got: {:?}", metadata.license_files ); // No absolute paths should remain assert!( metadata.license_files.iter().all(|p| p.is_relative()), "all license_files should be relative: {:?}", metadata.license_files ); } #[test] fn test_pyproject_license_file_overrides_cargo_source_mapping() { let temp_dir = TempDir::new().unwrap(); let workspace_root = temp_dir.path(); let crate_dir = workspace_root.join("crate"); fs::create_dir_all(crate_dir.join("src")).unwrap(); fs::write(crate_dir.join("src/lib.rs"), "").unwrap(); // Different contents so we can tell which source path wins. fs::write(workspace_root.join("LICENSE"), "workspace license").unwrap(); fs::write(crate_dir.join("LICENSE"), "crate license").unwrap(); let pyproject_toml_content = indoc!( r#" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "my-crate" version = "0.1.0" license = { file = "LICENSE" } "# ); fs::write(crate_dir.join("pyproject.toml"), pyproject_toml_content).unwrap(); let mut metadata = Metadata24::new("my-crate".to_string(), Version::from_str("0.1.0").unwrap()); metadata.license_files.push(PathBuf::from("LICENSE")); metadata .license_file_sources .insert(PathBuf::from("LICENSE"), workspace_root.join("LICENSE")); let pyproject_toml = PyProjectToml::new(crate_dir.join("pyproject.toml")).unwrap(); metadata .merge_pyproject_toml(&crate_dir, &pyproject_toml) .unwrap(); assert_eq!( metadata .license_files .iter() .filter(|path| path.as_path() == Path::new("LICENSE")) .count(), 1, "expected exactly one LICENSE entry, got {:?}", metadata.license_files ); assert!( !metadata .license_file_sources .contains_key(Path::new("LICENSE")), "expected pyproject license file to override Cargo source mapping" ); let metadata_text = metadata.to_file_contents().unwrap(); assert_eq!( metadata_text .lines() .filter(|line| *line == "License-File: LICENSE") .count(), 1, "expected a single License-File header, got:\n{metadata_text}" ); } #[test] fn test_pyproject_license_files_override_cargo_source_mapping() { let temp_dir = TempDir::new().unwrap(); let workspace_root = temp_dir.path(); let crate_dir = workspace_root.join("crate"); fs::create_dir_all(crate_dir.join("src")).unwrap(); fs::write(crate_dir.join("src/lib.rs"), "").unwrap(); fs::write(workspace_root.join("LICENSE"), "workspace license").unwrap(); fs::write(crate_dir.join("LICENSE"), "crate license").unwrap(); let pyproject_toml_content = indoc!( r#" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "my-crate" version = "0.1.0" license-files = ["LICENSE"] "# ); fs::write(crate_dir.join("pyproject.toml"), pyproject_toml_content).unwrap(); let mut metadata = Metadata24::new("my-crate".to_string(), Version::from_str("0.1.0").unwrap()); metadata.license_files.push(PathBuf::from("LICENSE")); metadata .license_file_sources .insert(PathBuf::from("LICENSE"), workspace_root.join("LICENSE")); let pyproject_toml = PyProjectToml::new(crate_dir.join("pyproject.toml")).unwrap(); metadata .merge_pyproject_toml(&crate_dir, &pyproject_toml) .unwrap(); assert!( !metadata .license_file_sources .contains_key(Path::new("LICENSE")), "expected pyproject license-files to override Cargo source mapping" ); assert_eq!( metadata .license_files .iter() .filter(|path| path.as_path() == Path::new("LICENSE")) .count(), 1, "expected exactly one LICENSE entry, got {:?}", metadata.license_files ); } #[test] fn test_from_cargo_toml_records_license_source_for_in_tree_license_file() { let temp_dir = TempDir::new().unwrap(); let workspace_root = temp_dir.path(); let crate_dir = workspace_root.join("rust"); fs::create_dir_all(crate_dir.join("src")).unwrap(); fs::write(crate_dir.join("src/lib.rs"), "").unwrap(); fs::write(crate_dir.join("LICENSE"), "crate license").unwrap(); fs::write(workspace_root.join("LICENSE"), "workspace license").unwrap(); let cargo_toml = indoc!( r#" [package] name = "my-crate" version = "0.1.0" edition = "2021" license-file = "LICENSE" [lib] crate-type = ["cdylib"] "# ); fs::write(crate_dir.join("Cargo.toml"), cargo_toml).unwrap(); let cargo_metadata = MetadataCommand::new() .manifest_path(crate_dir.join("Cargo.toml")) .exec() .unwrap(); let mut metadata = Metadata24::from_cargo_toml(&crate_dir, &cargo_metadata).unwrap(); assert_eq!(metadata.license_files, vec![PathBuf::from("LICENSE")]); let expected_source = crate_dir .join("LICENSE") .normalize() .unwrap() .into_path_buf(); assert_eq!( metadata.license_file_sources.get(Path::new("LICENSE")), Some(&expected_source) ); let pyproject_toml_content = indoc!( r#" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "my-crate" version = "0.1.0" "# ); fs::write( workspace_root.join("pyproject.toml"), pyproject_toml_content, ) .unwrap(); let pyproject_toml = PyProjectToml::new(workspace_root.join("pyproject.toml")).unwrap(); metadata .merge_pyproject_toml(workspace_root, &pyproject_toml) .unwrap(); assert_eq!( metadata.license_file_sources.get(Path::new("LICENSE")), Some(&expected_source) ); } #[test] fn test_from_cargo_toml_rejects_license_file_outside_workspace_root() { let temp_dir = TempDir::new().unwrap(); let workspace_root = temp_dir.path().join("workspace"); let crate_dir = workspace_root.join("crate"); let outside_license = temp_dir.path().join("SECRET_LICENSE"); fs::create_dir_all(crate_dir.join("src")).unwrap(); fs::write(crate_dir.join("src/lib.rs"), "").unwrap(); fs::write(&outside_license, "secret").unwrap(); fs::write( workspace_root.join("Cargo.toml"), indoc!( r#" [workspace] resolver = "2" members = ["crate"] "# ), ) .unwrap(); fs::write( crate_dir.join("Cargo.toml"), indoc!( r#" [package] name = "crate" version = "0.1.0" edition = "2021" license-file = "../../SECRET_LICENSE" [lib] crate-type = ["rlib"] "# ), ) .unwrap(); let cargo_metadata = MetadataCommand::new() .manifest_path(crate_dir.join("Cargo.toml")) .exec() .unwrap(); let err = Metadata24::from_cargo_toml(&crate_dir, &cargo_metadata).unwrap_err(); assert!( err.to_string().contains("outside Cargo workspace root"), "unexpected error: {err:#}" ); } #[test] fn test_reject_unsafe_project_license_file_path() { let temp_dir = TempDir::new().unwrap(); let workspace_root = temp_dir.path().join("workspace"); let crate_dir = workspace_root.join("crate"); fs::create_dir_all(&crate_dir).unwrap(); fs::write(temp_dir.path().join("LICENSE"), "secret license").unwrap(); let pyproject_toml_content = indoc!( r#" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "my-crate" version = "0.1.0" license = { file = "../../LICENSE" } "# ); fs::write(crate_dir.join("pyproject.toml"), pyproject_toml_content).unwrap(); let pyproject_toml = PyProjectToml::new(crate_dir.join("pyproject.toml")).unwrap(); let mut metadata = Metadata24::new("my-crate".to_string(), Version::from_str("0.1.0").unwrap()); let err = metadata .merge_pyproject_toml(crate_dir, &pyproject_toml) .unwrap_err(); assert!( err.to_string().contains("outside allowed metadata root"), "unexpected error: {err:#}" ); } #[test] fn test_issue_2544_respect_pyproject_dynamic_without_dynamic_fields() { let temp_dir = TempDir::new().unwrap(); let crate_path = temp_dir.path(); let manifest_path = crate_path.join("Cargo.toml"); let pyproject_path = crate_path.join("pyproject.toml"); // Create basic src structure fs::create_dir(crate_path.join("src")).unwrap(); fs::write(crate_path.join("src/lib.rs"), "").unwrap(); // Write Cargo.toml with metadata that should NOT be included // because pyproject.toml doesn't declare them as dynamic let cargo_toml = indoc!( r#" [package] name = "test-package" version = "0.1.0" description = "Description from Cargo.toml - should not appear" authors = ["author from cargo.toml "] keywords = ["cargo", "toml", "keyword"] repository = "https://github.com/example/repo" [lib] crate-type = ["cdylib"] "# ); fs::write(&manifest_path, cargo_toml).unwrap(); // Write pyproject.toml WITHOUT declaring the fields as dynamic let pyproject_toml_content = indoc!( r#" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "test-package" version = "0.1.0" # Note: no description, authors, keywords, urls in dynamic list # dynamic = [] # Not specified, so defaults to empty "# ); fs::write(&pyproject_path, pyproject_toml_content).unwrap(); // Load metadata as maturin does let cargo_metadata = MetadataCommand::new() .manifest_path(&manifest_path) .exec() .unwrap(); let mut metadata = Metadata24::from_cargo_toml(crate_path, &cargo_metadata).unwrap(); let pyproject_toml = PyProjectToml::new(&pyproject_path).unwrap(); metadata .merge_pyproject_toml(crate_path, &pyproject_toml) .unwrap(); assert_eq!( metadata.summary, None, "summary should be None when not in dynamic list" ); assert_eq!( metadata.author, None, "author should be None when not in dynamic list" ); assert_eq!( metadata.keywords, None, "keywords should be None when not in dynamic list" ); assert!( metadata.project_url.is_empty(), "project_url should be empty when not in dynamic list" ); } #[test] fn test_issue_2544_respect_pyproject_dynamic_with_dynamic_fields() { let temp_dir = TempDir::new().unwrap(); let crate_path = temp_dir.path(); let manifest_path = crate_path.join("Cargo.toml"); let pyproject_path = crate_path.join("pyproject.toml"); // Create basic src structure fs::create_dir(crate_path.join("src")).unwrap(); fs::write(crate_path.join("src/lib.rs"), "").unwrap(); // Write Cargo.toml with metadata let cargo_toml = indoc!( r#" [package] name = "test-package" version = "0.1.0" description = "Description from Cargo.toml - should appear" authors = ["author from cargo.toml "] keywords = ["cargo", "toml", "keyword"] repository = "https://github.com/example/repo" [lib] crate-type = ["cdylib"] "# ); fs::write(&manifest_path, cargo_toml).unwrap(); // Write pyproject.toml WITH fields declared as dynamic let pyproject_toml_content = indoc!( r#" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "test-package" version = "0.1.0" # Fields declared as dynamic - should come from Cargo.toml dynamic = ["description", "authors", "keywords", "urls"] "# ); fs::write(&pyproject_path, pyproject_toml_content).unwrap(); // Load metadata as maturin does let cargo_metadata = MetadataCommand::new() .manifest_path(&manifest_path) .exec() .unwrap(); let mut metadata = Metadata24::from_cargo_toml(crate_path, &cargo_metadata).unwrap(); let pyproject_toml = PyProjectToml::new(&pyproject_path).unwrap(); metadata .merge_pyproject_toml(crate_path, &pyproject_toml) .unwrap(); // These fields SHOULD be set because they are in dynamic list assert_eq!( metadata.summary, Some("Description from Cargo.toml - should appear".to_string()) ); assert_eq!( metadata.author, Some("author from cargo.toml ".to_string()) ); assert_eq!(metadata.keywords, Some("cargo,toml,keyword".to_string())); assert_eq!( metadata.project_url.get("Source Code"), Some(&"https://github.com/example/repo".to_string()) ); } } maturin-1.16.0/src/module_writer/000077500000000000000000000000001527064705700167435ustar00rootroot00000000000000maturin-1.16.0/src/module_writer/glob.rs000066400000000000000000000261621527064705700202430ustar00rootroot00000000000000use crate::pyproject_toml::Format; use anyhow::{Context, Result, bail}; use std::path::{Component, Path, PathBuf}; /// A resolved include match: the source file on disk and the relative path /// it should have inside the archive (wheel or sdist). pub(crate) struct IncludeMatch { /// Absolute path to the file on disk. pub source: PathBuf, /// Relative path inside the archive. pub target: PathBuf, } /// Resolve include glob patterns, trying `project_root` first and falling back /// to `python_dir` when `python-source` is set and the pattern didn't match. /// /// The `format` determines how matched files are mapped to archive paths: /// - **Wheel**: files inside `python_dir` are stripped to `python_dir`-relative /// paths (so `src/python/pkg/data.txt` becomes `pkg/data.txt`); other files /// are stripped to `project_root`-relative paths. /// - **Sdist**: files are always relative to `project_root`. When matched via /// the `python_dir` fallback, they are re-rooted under the `python-source` /// prefix to preserve the source layout. pub(crate) fn resolve_include_matches( pattern: &str, format: Format, project_root: &Path, python_dir: &Path, ) -> Result> { validate_pattern(pattern)?; let mut matches = glob_files(project_root, pattern)?; // When python-source is set and the pattern didn't match any files // relative to project_root, also try relative to python_dir so that a // single pattern like "pyfoo/data.txt" works for both sdist and wheel. if matches.is_empty() && python_dir != project_root { matches = glob_files(python_dir, pattern)?; } // Map source paths to archive-relative target paths. let matches = matches .into_iter() .map(|(source, matched_root)| { let target = map_target(format, &source, matched_root, project_root, python_dir)?; Ok(IncludeMatch { source, target }) }) .collect::>>()?; Ok(matches) } /// Map a matched source file to its archive-relative target path. fn map_target( format: Format, source: &Path, matched_root: &Path, project_root: &Path, python_dir: &Path, ) -> Result { match format { Format::Wheel => { // For wheel: always prefer stripping python_dir for files inside it, // so "src/python/pkg/data.txt" becomes "pkg/data.txt". if python_dir != project_root && source.starts_with(python_dir) { Ok(source.strip_prefix(python_dir)?.to_path_buf()) } else { Ok(source.strip_prefix(matched_root)?.to_path_buf()) } } Format::Sdist => { let relative = source.strip_prefix(matched_root)?; if matched_root == python_dir && python_dir != project_root { // Re-root under the python-source prefix so the sdist // preserves the original directory layout. // // `python_dir` may be outside `project_root` (e.g. when // `python-source = "../../python"`), so we can't assume // it is always a subdirectory. Prefer project-root-relative // prefix when possible, but fall back to the final component. let py_prefix = match python_dir.strip_prefix(project_root) { Ok(rel) => rel.to_path_buf(), Err(_) => { let basename = python_dir.file_name().with_context(|| { format!( "python-source `{}` has no final path component", python_dir.display() ) })?; PathBuf::from(basename) } }; Ok(py_prefix.join(relative)) } else { Ok(relative.to_path_buf()) } } } } /// Glob for files under `root` matching `pattern`, skipping directories. /// Returns `(source_path, matched_root)` pairs. fn glob_files<'a>(root: &'a Path, pattern: &str) -> Result> { let escaped_root = PathBuf::from(glob::Pattern::escape(root.to_string_lossy().as_ref())); let full_pattern = escaped_root.join(pattern); let mut matches = Vec::new(); for source in glob::glob(&full_pattern.to_string_lossy()) .with_context(|| format!("Invalid glob pattern: {pattern}"))? .filter_map(Result::ok) { if source.is_dir() { continue; } matches.push((source, root)); } Ok(matches) } /// Resolve out-dir include patterns: globs files matching `pattern` under /// `out_dir` and maps each match to `{to}/{relative_path}` inside the wheel. pub(crate) fn resolve_out_dir_includes( pattern: &str, out_dir: &Path, to: &str, ) -> Result> { validate_pattern(pattern)?; validate_pattern(to)?; let matches = glob_files(out_dir, pattern)?; matches .into_iter() .map(|(source, matched_root)| { let relative = source.strip_prefix(matched_root)?; let target = PathBuf::from(to).join(relative); Ok(IncludeMatch { source, target }) }) .collect() } /// Reject patterns that are not purely relative (absolute, contain `..`, or /// have a Windows drive/UNC prefix). fn validate_pattern(pattern: &str) -> Result<()> { for component in Path::new(pattern).components() { match component { Component::Normal(_) => {} Component::ParentDir => { bail!( "include/exclude pattern must not contain `..`, got: {pattern}. \ Use a pattern relative to the project root or python-source directory." ); } _ => { // Rejects Component::RootDir, Component::Prefix (Windows drive/UNC), // and Component::CurDir (`.` is harmless but noisy). bail!("include/exclude pattern must be a relative path, got: {pattern}"); } } } Ok(()) } #[cfg(test)] mod tests { use super::*; use fs_err as fs; use tempfile::TempDir; #[test] fn test_validate_pattern() { // Rejected: absolute, parent dir, current dir assert!(validate_pattern("/foo/bar").is_err()); assert!(validate_pattern("../foo/bar").is_err()); assert!(validate_pattern("foo/../bar").is_err()); assert!(validate_pattern("./foo/bar").is_err()); // Allowed: normal relative patterns assert!(validate_pattern("foo/bar").is_ok()); assert!(validate_pattern("**/*.html").is_ok()); assert!(validate_pattern("pyfoo/bar.html").is_ok()); } /// Helper to create a temp dir with files at the given relative paths. fn setup_tree(files: &[&str]) -> TempDir { let dir = TempDir::new().unwrap(); for file in files { let path = dir.path().join(file); fs::create_dir_all(path.parent().unwrap()).unwrap(); fs::write(&path, "content").unwrap(); } dir } #[test] fn test_resolve_matches_from_primary_root() { let dir = setup_tree(&["pkg/data.txt"]); let root = dir.path(); let matches = resolve_include_matches("pkg/data.txt", Format::Wheel, root, root).unwrap(); assert_eq!(matches.len(), 1); assert_eq!(matches[0].target, Path::new("pkg/data.txt")); } #[test] fn test_resolve_python_dir_fallback() { let dir = setup_tree(&["src/python/pkg/data.txt"]); let root = dir.path(); let python_dir = root.join("src/python"); // Wheel: target is python_dir-relative let wheel = resolve_include_matches("pkg/data.txt", Format::Wheel, root, &python_dir).unwrap(); assert_eq!(wheel.len(), 1); assert_eq!(wheel[0].target, Path::new("pkg/data.txt")); assert_eq!(wheel[0].source, python_dir.join("pkg/data.txt")); // Sdist: target preserves the python-source prefix let sdist = resolve_include_matches("pkg/data.txt", Format::Sdist, root, &python_dir).unwrap(); assert_eq!(sdist.len(), 1); assert_eq!(sdist[0].target, Path::new("src/python/pkg/data.txt")); } #[test] fn test_wheel_strips_python_dir_for_explicit_path() { let dir = setup_tree(&["src/python/pkg/data.txt"]); let root = dir.path(); let python_dir = root.join("src/python"); let matches = resolve_include_matches("src/python/pkg/data.txt", Format::Wheel, root, &python_dir) .unwrap(); assert_eq!(matches.len(), 1); assert_eq!(matches[0].target, Path::new("pkg/data.txt")); } #[test] fn test_primary_root_takes_precedence() { let dir = setup_tree(&["pkg/data.txt", "src/python/pkg/data.txt"]); let root = dir.path(); let python_dir = root.join("src/python"); let matches = resolve_include_matches("pkg/data.txt", Format::Wheel, root, &python_dir).unwrap(); assert_eq!(matches.len(), 1); assert_eq!(matches[0].source, root.join("pkg/data.txt")); } #[test] fn test_python_dir_outside_project_root() { // Simulate python-source pointing outside the project root let python_tmp = setup_tree(&["pkg/data.txt"]); let project_tmp = TempDir::new().unwrap(); let python_dir = python_tmp.path(); let project_root = project_tmp.path(); // Sdist: should use the final component of python_dir as prefix let sdist = resolve_include_matches("pkg/data.txt", Format::Sdist, project_root, python_dir) .unwrap(); assert_eq!(sdist.len(), 1); let python_dir_name = python_dir.file_name().unwrap(); assert_eq!( sdist[0].target, Path::new(python_dir_name).join("pkg/data.txt") ); // Wheel: should strip python_dir prefix let wheel = resolve_include_matches("pkg/data.txt", Format::Wheel, project_root, python_dir) .unwrap(); assert_eq!(wheel.len(), 1); assert_eq!(wheel[0].target, Path::new("pkg/data.txt")); } #[test] fn test_out_dir_validates_to_parameter() { let dir = setup_tree(&["gen.txt"]); assert!(resolve_out_dir_includes("gen.txt", dir.path(), "../escape").is_err()); assert!(resolve_out_dir_includes("gen.txt", dir.path(), "/absolute").is_err()); assert!(resolve_out_dir_includes("gen.txt", dir.path(), "pkg/").is_ok()); } #[test] fn test_no_match_and_dir_only() { let dir = TempDir::new().unwrap(); let root = dir.path(); fs::create_dir_all(root.join("pkg/subdir")).unwrap(); // No file matches assert!( resolve_include_matches("nonexistent.txt", Format::Wheel, root, root) .unwrap() .is_empty() ); // Glob matching only a directory returns no results assert!( resolve_include_matches("pkg/*", Format::Wheel, root, root) .unwrap() .is_empty() ); } } maturin-1.16.0/src/module_writer/mock_writer.rs000066400000000000000000000257631527064705700216530ustar00rootroot00000000000000use std::io::Read as _; use std::path::Path; use std::path::PathBuf; use std::str; use anyhow::Result; use anyhow::bail; use fs_err::File; use ignore::overrides::Override; use indexmap::IndexMap; use indexmap::map::Entry; use insta::assert_snapshot; use itertools::Itertools as _; use crate::BuildOptions; use crate::CargoOptions; use crate::Metadata24; use crate::WheelTag; use crate::archive_source::ArchiveSource; use crate::build_orchestrator::BuildOrchestrator; use crate::write_dist_info; use super::ModuleWriterInternal; use super::VirtualWriter; #[derive(Default)] pub(crate) struct MockWriter { files: IndexMap>, } impl super::private::Sealed for MockWriter {} impl ModuleWriterInternal for MockWriter { fn add_entry(&mut self, target: impl AsRef, source: ArchiveSource) -> Result<()> { let target = target.as_ref().to_path_buf(); let Entry::Vacant(entry) = self.files.entry(target.clone()) else { bail!("Duplicate file {target:?} written to mock writer"); }; let buffer = match source { ArchiveSource::Generated(source) => source.data, ArchiveSource::File(source) => { let mut file = File::options().read(true).open(source.path)?; let mut buffer = Vec::new(); file.read_to_end(&mut buffer)?; buffer } }; entry.insert(buffer); Ok(()) } } impl MockWriter { pub fn finish(self) -> IndexMap> { self.files } } #[test] fn metadata_hello_world_pep639() -> Result<()> { let build_options = BuildOptions { cargo: CargoOptions { manifest_path: Some( PathBuf::from("test-crates") .join("hello-world") .join("Cargo.toml"), ), ..CargoOptions::default() }, ..BuildOptions::default() }; let context = build_options.into_build_context().build().unwrap(); let mut writer = VirtualWriter::new(MockWriter::default(), Override::empty()); let orchestrator = BuildOrchestrator::new(&context); write_dist_info( &mut writer, &context.project.project_layout.project_root, &context.project.metadata24, &orchestrator.tags_from_bridge().unwrap(), ) .unwrap(); let files = writer.finish()?; assert_snapshot!(files.keys().map(|p| p.to_string_lossy()).collect_vec().join("\n").replace("\\", "/"), @r" hello_world-0.1.0.dist-info/METADATA hello_world-0.1.0.dist-info/WHEEL hello_world-0.1.0.dist-info/licenses/LICENSE hello_world-0.1.0.dist-info/licenses/licenses/AUTHORS.txt "); let metadata_path = Path::new("hello_world-0.1.0.dist-info").join("METADATA"); // Remove the README in the body of the email let metadata = str::from_utf8(&files[&metadata_path]) .unwrap() .split_once("\n\n") .unwrap() .0; assert_snapshot!(metadata, @r" Metadata-Version: 2.4 Name: hello-world Version: 0.1.0 License-File: LICENSE License-File: licenses/AUTHORS.txt Author: konstin Author-email: konstin Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM "); Ok(()) } #[test] #[serial_test::serial] fn write_dist_info_uses_license_file_sources() -> Result<()> { use pep440_rs::Version; use std::str::FromStr; let temp_dir = tempfile::tempdir()?; let pyproject_dir = temp_dir.path().join("crate"); let workspace_root = temp_dir.path(); fs_err::create_dir_all(&pyproject_dir)?; // Create a workspace-level license file (outside pyproject_dir) let license_content = b"MIT License - workspace level"; fs_err::write(workspace_root.join("LICENSE"), license_content)?; let mut metadata = Metadata24::new("test-pkg".to_string(), Version::from_str("1.0.0").unwrap()); metadata.license_files.push(PathBuf::from("LICENSE")); metadata .license_file_sources .insert(PathBuf::from("LICENSE"), workspace_root.join("LICENSE")); let mut writer = VirtualWriter::new(MockWriter::default(), Override::empty()); write_dist_info( &mut writer, &pyproject_dir, &metadata, &[WheelTag::new( ["py3".to_string()], ["none".to_string()], ["any".to_string()], )], )?; let files = writer.finish()?; let license_key = Path::new("test_pkg-1.0.0.dist-info/licenses/LICENSE"); assert!( files.contains_key(license_key), "expected license file in dist-info, got keys: {:?}", files.keys().collect::>() ); assert_eq!(files[license_key], license_content); Ok(()) } #[test] #[serial_test::serial] fn write_dist_info_rejects_absolute_license_paths() { use pep440_rs::Version; use std::str::FromStr; let temp_dir = tempfile::tempdir().unwrap(); let pyproject_dir = temp_dir.path(); let mut metadata = Metadata24::new("test-pkg".to_string(), Version::from_str("1.0.0").unwrap()); metadata.license_files.push(temp_dir.path().join("LICENSE")); let mut writer = VirtualWriter::new(MockWriter::default(), Override::empty()); let err = write_dist_info( &mut writer, pyproject_dir, &metadata, &[WheelTag::new( ["py3".to_string()], ["none".to_string()], ["any".to_string()], )], ) .unwrap_err(); assert!( err.to_string().contains("unsafe path"), "unexpected error: {err:#}" ); } #[test] #[serial_test::serial] fn write_dist_info_respects_metadata_directory_env_var() -> Result<()> { use pep440_rs::Version; use std::str::FromStr; let temp_dir = tempfile::tempdir()?; let pyproject_dir = temp_dir.path().join("crate"); fs_err::create_dir_all(&pyproject_dir)?; let metadata = Metadata24::new("test-pkg".to_string(), Version::from_str("1.0.0").unwrap()); let dist_info_name = "test_pkg-1.0.0.dist-info"; // Create a pre-generated .dist-info directory with custom METADATA let metadata_dir = temp_dir.path().join("metadata"); let pre_existing_dir = metadata_dir.join(dist_info_name); fs_err::create_dir_all(&pre_existing_dir)?; let custom_metadata = "Metadata-Version: 2.4\nName: test-pkg\nVersion: 1.0.0\nClassifier: Custom :: Classifier\n"; fs_err::write(pre_existing_dir.join("METADATA"), custom_metadata)?; fs_err::write(pre_existing_dir.join("WHEEL"), "should be overwritten")?; fs_err::write(pre_existing_dir.join("RECORD"), "should be skipped")?; fs_err::write( pre_existing_dir.join("entry_points.txt"), "[console_scripts]\nfoo=bar:main\n", )?; // Create a licenses/ subdirectory let licenses_dir = pre_existing_dir.join("licenses"); fs_err::create_dir_all(&licenses_dir)?; fs_err::write(licenses_dir.join("LICENSE"), "MIT License")?; // Per PEP 517, metadata_directory points to the .dist-info directory itself // SAFETY: This test is serialized and the env var is removed before returning. unsafe { std::env::set_var("MATURIN_PEP517_METADATA_DIR", &pre_existing_dir) }; let mut writer = VirtualWriter::new(MockWriter::default(), Override::empty()); let tags = &[WheelTag::new( ["cp310".to_string()], ["cp310".to_string()], ["manylinux_2_17_x86_64".to_string()], )]; let result = write_dist_info(&mut writer, &pyproject_dir, &metadata, tags); unsafe { std::env::remove_var("MATURIN_PEP517_METADATA_DIR") }; result?; let files = writer.finish()?; // METADATA should be the custom one, not regenerated let metadata_key = Path::new(dist_info_name).join("METADATA"); assert_eq!( str::from_utf8(&files[&metadata_key]).unwrap(), custom_metadata ); // WHEEL should be regenerated with correct tags, not the pre-existing content let wheel_key = Path::new(dist_info_name).join("WHEEL"); let wheel_content = str::from_utf8(&files[&wheel_key]).unwrap(); assert!( wheel_content.contains("Tag: cp310-cp310-manylinux_2_17_x86_64"), "WHEEL should contain the correct tag, got: {wheel_content}" ); assert!( !wheel_content.contains("should be overwritten"), "WHEEL should be regenerated, not copied" ); // RECORD should not be present (it's generated later by WheelWriter) let record_key = Path::new(dist_info_name).join("RECORD"); assert!(!files.contains_key(&record_key)); // entry_points.txt should be copied let ep_key = Path::new(dist_info_name).join("entry_points.txt"); assert_eq!( str::from_utf8(&files[&ep_key]).unwrap(), "[console_scripts]\nfoo=bar:main\n" ); // License file from subdirectory should be copied let license_key = Path::new(dist_info_name).join("licenses").join("LICENSE"); assert_eq!(str::from_utf8(&files[&license_key]).unwrap(), "MIT License"); Ok(()) } #[test] #[serial_test::serial] fn write_dist_info_metadata_dir_as_parent_directory() -> Result<()> { use pep440_rs::Version; use std::str::FromStr; let temp_dir = tempfile::tempdir()?; let pyproject_dir = temp_dir.path().join("crate"); fs_err::create_dir_all(&pyproject_dir)?; let metadata = Metadata24::new("test-pkg".to_string(), Version::from_str("1.0.0").unwrap()); let dist_info_name = "test_pkg-1.0.0.dist-info"; // Create a parent directory containing the .dist-info subdirectory let parent_dir = temp_dir.path().join("metadata"); let pre_existing_dir = parent_dir.join(dist_info_name); fs_err::create_dir_all(&pre_existing_dir)?; let custom_metadata = "Metadata-Version: 2.4\nName: test-pkg\nVersion: 1.0.0\nClassifier: Custom :: Classifier\n"; fs_err::write(pre_existing_dir.join("METADATA"), custom_metadata)?; fs_err::write(pre_existing_dir.join("WHEEL"), "should be overwritten")?; // Set env var to the parent directory (PEP 517 spec form) // SAFETY: This test is serialized and the env var is removed before returning. unsafe { std::env::set_var("MATURIN_PEP517_METADATA_DIR", &parent_dir) }; let mut writer = VirtualWriter::new(MockWriter::default(), Override::empty()); let tags = &[WheelTag::new( ["cp310".to_string()], ["cp310".to_string()], ["manylinux_2_17_x86_64".to_string()], )]; let result = write_dist_info(&mut writer, &pyproject_dir, &metadata, tags); unsafe { std::env::remove_var("MATURIN_PEP517_METADATA_DIR") }; result?; let files = writer.finish()?; // METADATA should be the custom one let metadata_key = Path::new(dist_info_name).join("METADATA"); assert_eq!( str::from_utf8(&files[&metadata_key]).unwrap(), custom_metadata ); // WHEEL should be regenerated let wheel_key = Path::new(dist_info_name).join("WHEEL"); let wheel_content = str::from_utf8(&files[&wheel_key]).unwrap(); assert!( wheel_content.contains("Tag: cp310-cp310-manylinux_2_17_x86_64"), "WHEEL should contain the correct tag, got: {wheel_content}" ); Ok(()) } maturin-1.16.0/src/module_writer/mod.rs000066400000000000000000000647241527064705700201050ustar00rootroot00000000000000use std::fmt::Write as _; use std::io::Read as _; use std::path::Path; use std::path::PathBuf; use anyhow::Context as _; use anyhow::Result; use anyhow::bail; use fs_err as fs; use ignore::WalkBuilder; use indexmap::IndexMap; use normpath::PathExt as _; use tracing::{debug, trace}; use crate::Metadata24; use crate::PyProjectToml; use crate::archive_source::ArchiveSource; use crate::archive_source::FileSourceData; use crate::archive_source::GeneratedSourceData; use crate::project_layout::ProjectLayout; use crate::pyproject_toml::Format; use crate::target::WheelTag; pub(crate) mod glob; #[cfg(test)] mod mock_writer; mod path_writer; mod py_preamble; mod sdist_writer; mod util; mod virtual_writer; mod wheel_writer; pub use path_writer::PathWriter; pub use sdist_writer::SDistWriter; pub use virtual_writer::VirtualWriter; pub use wheel_writer::WheelWriter; mod private { pub trait Sealed {} } /// Allows writing the module to a wheel or add it directly to the virtualenv pub trait ModuleWriterInternal: private::Sealed { /// Adds an entry into the archive fn add_entry(&mut self, target: impl AsRef, source: ArchiveSource) -> Result<()>; } /// Extension trait with convenience methods for interacting with a [ModuleWriterInternal] pub trait ModuleWriter: private::Sealed { /// Adds a file with data as content in target relative to the module base path while setting /// the appropriate unix permissions /// /// For generated files, `source` is `None`. fn add_bytes( &mut self, target: impl AsRef, source: Option<&Path>, data: impl Into>, executable: bool, ) -> Result<()>; /// Copies the source file the target path relative to the module base path while setting /// the given unix permissions fn add_file( &mut self, target: impl AsRef, source: impl AsRef, executable: bool, ) -> Result<()>; /// Add an empty file to the target path #[inline] fn add_empty_file(&mut self, target: impl AsRef) -> Result<()> { self.add_bytes(target, None, Vec::new(), false) } } /// This blanket impl makes it impossible to overwrite the methods in [ModuleWriter] impl ModuleWriter for T { fn add_bytes( &mut self, target: impl AsRef, source: Option<&Path>, data: impl Into>, executable: bool, ) -> Result<()> { self.add_entry( target, ArchiveSource::Generated(GeneratedSourceData { data: data.into(), path: source.map(ToOwned::to_owned), executable, }), ) } fn add_file( &mut self, target: impl AsRef, source: impl AsRef, executable: bool, ) -> Result<()> { let target = target.as_ref(); let source = source.as_ref(); debug!("Adding {} from {}", target.display(), source.display()); self.add_entry( target, ArchiveSource::File(FileSourceData { path: source.to_path_buf(), executable, }), ) } } /// Returns a filter for [WalkBuilder::filter_entry] that skips the cargo target directory and /// cache directories tagged with `CACHEDIR.TAG`, unless they contain a python package (#3319) /// /// See https://bford.info/cachedir/ pub(crate) fn skip_build_dirs( target_dir: &Path, python_packages: &[PathBuf], ) -> impl Fn(&ignore::DirEntry) -> bool + Send + Sync + 'static { let target_dir = target_dir.normalize().ok().map(|dir| dir.into_path_buf()); let python_packages = python_packages.to_vec(); move |entry| { let is_build_dir = target_dir.as_deref() == Some(entry.path()) || (entry .file_type() .is_some_and(|file_type| file_type.is_dir()) && has_cachedir_tag(entry.path())); !is_build_dir || python_packages .iter() .any(|package| package.starts_with(entry.path())) } } /// Signature that a `CACHEDIR.TAG` file starts with const CACHEDIR_TAG_SIGNATURE: &[u8] = b"Signature: 8a477f597d28d172789f06886806bc55"; /// Whether the directory has a `CACHEDIR.TAG` file starting with the signature fn has_cachedir_tag(dir: &Path) -> bool { let tag = dir.join("CACHEDIR.TAG"); if !fs::symlink_metadata(&tag).is_ok_and(|metadata| metadata.is_file()) { return false; } let mut signature = [0; CACHEDIR_TAG_SIGNATURE.len()]; fs::File::open(&tag) .and_then(|mut file| file.read_exact(&mut signature)) .is_ok_and(|()| signature == CACHEDIR_TAG_SIGNATURE) } /// Adds the python part of a mixed project to the writer, pub fn write_python_part( writer: &mut VirtualWriter, project_layout: &ProjectLayout, pyproject_toml: Option<&PyProjectToml>, target_dir: &Path, ) -> Result<()> { let python_dir = &project_layout.python_dir; let mut python_packages = Vec::new(); if let Some(python_module) = project_layout.python_module.as_ref() { python_packages.push(python_module.to_path_buf()); } for package in &project_layout.python_packages { let package_path = python_dir.join(package); if python_packages.contains(&package_path) { continue; } python_packages.push(package_path); } for absolute in WalkBuilder::new(&project_layout.project_root) .hidden(false) .parents(false) .git_global(false) .git_exclude(false) .filter_entry(skip_build_dirs(target_dir, &python_packages)) .build() { let absolute = match absolute { Ok(entry) => entry.into_path(), Err(err) => { // Skip errors for paths that don't need to be included, e.g. for directories // that we don't have permissions for. if let ignore::Error::WithPath { path, .. } = &err && !python_packages.iter().any(|pkg| path.starts_with(pkg)) { // Log priority logging, we're only looking at the directory at all due to // a particularity in how we're doing path traversal. trace!( "Skipping inaccessible path {} due to read error: {err}", path.display() ); continue; } return Err(err.into()); } }; if !python_packages .iter() .any(|path| absolute.starts_with(path)) { continue; } let relative = absolute.strip_prefix(python_dir).unwrap(); if !absolute.is_dir() { if is_develop_build_artifact(relative, &project_layout.extension_name) { debug!("Ignoring develop build artifact {}", relative.display()); continue; } let mode = file_permission_mode(&absolute)?; writer .add_file(relative, &absolute, permission_is_executable(mode)) .context(format!("Failed to add file from {}", absolute.display()))?; } } // Include additional files if let Some(pyproject) = pyproject_toml { let project_root = &project_layout.project_root; if let Some(glob_patterns) = pyproject.include() { for pattern in glob_patterns .iter() .filter_map(|glob_pattern| glob_pattern.targets(Format::Wheel)) { eprintln!("📦 Including files matching \"{pattern}\""); let matches = glob::resolve_include_matches( pattern, Format::Wheel, project_root, python_dir, )?; for m in matches { let mode = file_permission_mode(m.source.as_ref())?; writer.add_file(m.target, m.source, permission_is_executable(mode))?; } } } } Ok(()) } /// If any, copies the data files from the data directory, resolving symlinks to their source. /// We resolve symlinks since we require this rather rigid structure while people might need /// to save or generate the data in other places /// /// See https://peps.python.org/pep-0427/#file-contents pub fn add_data( writer: &mut VirtualWriter, metadata24: &Metadata24, data: Option<&Path>, ) -> Result<()> { let possible_data_dir_names = ["data", "scripts", "headers", "purelib", "platlib"]; if let Some(data) = data { for subdir in fs::read_dir(data).context("Failed to read data dir")? { let subdir = subdir?; let dir_name = subdir .file_name() .to_str() .context("Invalid data dir name")? .to_string(); if !subdir.path().is_dir() || !possible_data_dir_names.contains(&dir_name.as_str()) { bail!( "Invalid data dir entry {}. Possible are directories named {}", subdir.path().display(), possible_data_dir_names.join(", ") ); } debug!("Adding data from {}", subdir.path().display()); add_data_subdir(writer, subdir.path().as_path(), data, metadata24) .with_context(|| format!("Failed to include data from {}", data.display()))? } } Ok(()) } /// Walk a single data subdirectory and add its files to the writer. fn add_data_subdir( writer: &mut impl ModuleWriter, subdir_path: &Path, data: &Path, metadata24: &Metadata24, ) -> Result<()> { for file in WalkBuilder::new(subdir_path) .standard_filters(false) .build() { let file = file?; let relative_path = file.path().strip_prefix(data).with_context(|| { format!( "Data file {} is not under data dir {}", file.path().display(), data.display() ) })?; let relative = metadata24.get_data_dir().join(relative_path); if file.path_is_symlink() { // Copy the actual file contents, not the link, so that you can create a // data directory by joining different data sources let link_target = fs::read_link(file.path())?; let source = if link_target.is_absolute() { link_target } else { file.path() .parent() .with_context(|| { format!( "Data symlink {} has no parent directory", file.path().display() ) })? .join(link_target) }; let mode = file_permission_mode(&source)?; writer.add_file(relative, source, permission_is_executable(mode))?; } else if file.path().is_file() { let mode = file_permission_mode(file.path())?; writer.add_file(relative, file.path(), permission_is_executable(mode))?; } else if file.path().is_dir() { // Intentionally ignored } else { bail!("Can't handle data dir entry {}", file.path().display()); } } Ok(()) } /// Creates the .dist-info directory and fills it with all metadata files except RECORD. /// /// If the `MATURIN_PEP517_METADATA_DIR` environment variable is set, copies the /// pre-generated metadata files from that directory instead of regenerating them. /// The WHEEL file is always regenerated to ensure correct tags. This implements /// the PEP 517 requirement that `build_wheel` respects `metadata_directory`. pub fn write_dist_info( writer: &mut VirtualWriter, pyproject_dir: &Path, metadata24: &Metadata24, tags: &[WheelTag], ) -> Result { let dist_info_dir = metadata24.get_dist_info_dir(); if let Ok(metadata_dir) = std::env::var("MATURIN_PEP517_METADATA_DIR") { let metadata_path = Path::new(&metadata_dir); // Support both forms: // 1. Direct .dist-info path (pip's behavior) // 2. Parent directory containing the .dist-info subdirectory (per PEP 517 spec) let pre_existing = if metadata_path.is_dir() && metadata_path .file_name() .is_some_and(|n| n.to_string_lossy().ends_with(".dist-info")) { metadata_path.to_path_buf() } else { let nested = metadata_path.join(&dist_info_dir); if nested.is_dir() { nested } else { bail!( "MATURIN_PEP517_METADATA_DIR is set to '{}' but no .dist-info directory \ was found (tried both '{}' directly and '{}')", metadata_dir, metadata_path.display(), metadata_path.join(&dist_info_dir).display(), ); } }; debug!( "Using pre-generated metadata from {}", pre_existing.display() ); return write_dist_info_from_dir(writer, &dist_info_dir, &pre_existing, tags); } writer.add_bytes( dist_info_dir.join("METADATA"), None, metadata24.to_file_contents()?.as_bytes(), false, )?; writer.add_bytes( dist_info_dir.join("WHEEL"), None, wheel_file(tags)?.as_bytes(), false, )?; let mut entry_points = String::new(); if !metadata24.scripts.is_empty() { entry_points.push_str(&entry_points_txt("console_scripts", &metadata24.scripts)); } if !metadata24.gui_scripts.is_empty() { entry_points.push_str(&entry_points_txt("gui_scripts", &metadata24.gui_scripts)); } for (entry_type, scripts) in &metadata24.entry_points { entry_points.push_str(&entry_points_txt(entry_type, scripts)); } if !entry_points.is_empty() { writer.add_bytes( dist_info_dir.join("entry_points.txt"), None, entry_points.as_bytes(), false, )?; } if !metadata24.license_files.is_empty() { let license_files_dir = dist_info_dir.join("licenses"); for path in &metadata24.license_files { if path.is_absolute() || path.components().any(|c| { matches!( c, std::path::Component::ParentDir | std::path::Component::Prefix(_) | std::path::Component::RootDir ) }) { bail!( "Refusing to write license file with unsafe path `{}` into wheel", path.display() ); } let source = metadata24 .license_file_sources .get(path) .cloned() .unwrap_or_else(|| pyproject_dir.join(path)); writer.add_file(license_files_dir.join(path), source, false)?; } } Ok(dist_info_dir) } /// Copies pre-generated metadata files from a `.dist-info` directory on disk into the wheel, /// but always regenerates the WHEEL file to ensure correct tags. fn write_dist_info_from_dir( writer: &mut VirtualWriter, dist_info_dir: &Path, source_dir: &Path, tags: &[WheelTag], ) -> Result { // Always regenerate WHEEL to ensure correct tags for the built wheel writer.add_bytes( dist_info_dir.join("WHEEL"), None, wheel_file(tags)?.as_bytes(), false, )?; // Copy all other files from the pre-generated .dist-info directory for entry in fs::read_dir(source_dir)? { let entry = entry?; let file_name = entry.file_name(); let file_name_str = file_name.to_string_lossy(); // Skip WHEEL (already regenerated) and RECORD (will be regenerated by WheelWriter) if file_name_str == "WHEEL" || file_name_str == "RECORD" { continue; } let entry_path = entry.path(); if entry_path.is_dir() { // Recursively add subdirectories (e.g. licenses/) for sub_entry in walkdir::WalkDir::new(&entry_path) { let sub_entry = sub_entry?; if sub_entry.file_type().is_file() { let rel = sub_entry.path().strip_prefix(source_dir).with_context(|| { format!( "walkdir entry '{}' is not under source dir '{}'", sub_entry.path().display(), source_dir.display() ) })?; writer.add_file(dist_info_dir.join(rel), sub_entry.path(), false)?; } } } else { writer.add_file(dist_info_dir.join(&file_name), &entry_path, false)?; } } Ok(dist_info_dir.to_owned()) } /// Add a pth file to wheel root for editable installs pub fn write_pth( writer: &mut VirtualWriter, project_layout: &ProjectLayout, metadata24: &Metadata24, ) -> Result<()> { if project_layout.python_module.is_some() || !project_layout.python_packages.is_empty() { let absolute_path = project_layout .python_dir .normalize() .with_context(|| { format!( "python dir path `{}` does not exist or is invalid", project_layout.python_dir.display() ) })? .into_path_buf(); if let Some(python_path) = absolute_path.to_str() { let name = metadata24.get_distribution_escaped(); let target = format!("{name}.pth"); debug!("Adding {} from {}", target, python_path); writer.add_bytes(target, None, python_path, false)?; } else { eprintln!( "âš ï¸� source code path contains non-Unicode sequences, editable installs may not work." ); } } Ok(()) } /// Check if a file is a build artifact left behind by `maturin develop`. /// /// `maturin develop` copies compiled extension modules (`.so`, `.pyd`, `.dll`, `.dylib`) /// and their associated debug info files (`.pdb`, `.dSYM`, `.dwp`) directly into the /// Python source tree for editable installs. When `maturin build` later walks the same /// source tree to collect files for the wheel, these artifacts must be skipped to avoid /// conflicts with the freshly compiled library being added to the wheel. /// /// The native library artifacts follow different naming conventions depending on the /// binding type: /// - **PyO3/pyo3-ffi**: `{ext_name}.cpython-3XX-*.so`, `{ext_name}.abi3.so`, /// `{ext_name}.abi3-{platform}.so` (3.15+), `{ext_name}.pyd` /// - **CFFI**: `lib{ext_name}.so`, `lib{ext_name}.dylib` (Unix), `{ext_name}.dll` (Windows) /// - **UniFFI**: `lib{ext_name}.so`, `lib{ext_name}.dylib` (Unix), `{ext_name}.dll` (Windows) /// /// Debug info files (`.pdb`, `.dwp`, or files inside `.dSYM` bundles) are also excluded /// when their name matches the extension name, since they are re-added from the fresh /// build output when appropriate. fn is_develop_build_artifact(relative_path: &Path, extension_name: &str) -> bool { let Some(file_name) = relative_path.file_name() else { return false; }; let file_name = file_name.to_string_lossy(); // Files inside a .dSYM bundle (macOS debug info directory) — match on the // bundle directory name rather than the leaf filename (which can be // Info.plist, a DWARF data file, etc.) let dsym_bundle = relative_path .components() .map(|c| c.as_os_str().to_string_lossy()) .find(|c| c.ends_with(".dSYM")); if let Some(bundle) = dsym_bundle { let bundle = bundle.trim_end_matches(".dSYM"); return bundle.starts_with(extension_name) || bundle.starts_with(&format!("lib{extension_name}")); } let is_native_ext = file_name.ends_with(".so") || file_name.ends_with(".pyd") || file_name.ends_with(".dll") || file_name.ends_with(".dylib"); let is_debuginfo = file_name.ends_with(".pdb") || file_name.ends_with(".dwp"); let name_matches = file_name.starts_with(extension_name) || file_name.starts_with(&format!("lib{extension_name}")); (is_native_ext || is_debuginfo) && name_matches } fn wheel_file(tags: &[WheelTag]) -> Result { let mut wheel_file = format!( "Wheel-Version: 1.0 Generator: {name} ({version}) Root-Is-Purelib: false ", name = env!("CARGO_PKG_NAME"), version = env!("CARGO_PKG_VERSION"), ); for tag in tags { for expanded_tag in tag.expand() { writeln!(wheel_file, "Tag: {expanded_tag}")?; } } Ok(wheel_file) } /// https://packaging.python.org/specifications/entry-points/ fn entry_points_txt( entry_type: &str, entrypoints: &IndexMap, ) -> String { entrypoints .iter() .fold(format!("[{entry_type}]\n"), |text, (k, v)| { text + k + "=" + v + "\n" }) } #[inline] pub(crate) fn permission_is_executable(mode: u32) -> bool { (0o100 & mode) == 0o100 } /// Returns the Unix permission mode of a file, or 0o644 on non-Unix platforms. #[inline] pub(crate) fn file_permission_mode(path: &std::path::Path) -> std::io::Result { #[cfg(unix)] { use std::os::unix::fs::PermissionsExt; Ok(path.metadata()?.permissions().mode()) } #[cfg(not(unix))] { let _ = path; Ok(0o644) } } #[inline] pub(crate) fn default_permission(executable: bool) -> u32 { match executable { true => 0o755, false => 0o644, } } #[cfg(test)] mod tests { use std::io::Read as _; #[cfg(unix)] use std::os::unix::fs::{PermissionsExt as _, symlink}; use anyhow::Result; use fs_err as fs; use ignore::overrides::Override; use pep440_rs::Version; use tempfile::TempDir; use zip::ZipArchive; use zip::write::SimpleFileOptions; use super::VirtualWriter; use super::WheelWriter; use super::add_data; use super::wheel_file; use crate::Metadata24; use crate::WheelTag; #[test] fn wheel_file_compressed_tags() -> Result<()> { let expected = format!( "Wheel-Version: 1.0 Generator: {name} ({version}) Root-Is-Purelib: false Tag: py2-none-any Tag: py3-none-any Tag: pre-expanded-tag Tag: cp37-abi3-manylinux2014_x86_64 Tag: cp37-abi3-manylinux_2_17_x86_64 ", name = env!("CARGO_PKG_NAME"), version = env!("CARGO_PKG_VERSION"), ); let actual = wheel_file(&[ WheelTag::new( ["py2".to_string(), "py3".to_string()], ["none".to_string()], ["any".to_string()], ), WheelTag::new( ["pre".to_string()], ["expanded".to_string()], ["tag".to_string()], ), WheelTag::new( ["cp37".to_string()], ["abi3".to_string()], [ "manylinux_2_17_x86_64".to_string(), "manylinux2014_x86_64".to_string(), ], ), ])?; assert_eq!(expected, actual); Ok(()) } #[test] fn wheel_file_abi3t_expands_to_abi3_and_abi3t() -> Result<()> { // abi3t wheels declare a compressed `abi3.abi3t` ABI tag because a single // abi3t shared object is importable on both abi3-capable (GIL-enabled // 3.15+) and free-threaded interpreters. The WHEEL file must expand the // compressed tag into one Tag line per ABI. let expected = format!( "Wheel-Version: 1.0 Generator: {name} ({version}) Root-Is-Purelib: false Tag: cp315-abi3-manylinux_2_17_x86_64 Tag: cp315-abi3t-manylinux_2_17_x86_64 ", name = env!("CARGO_PKG_NAME"), version = env!("CARGO_PKG_VERSION"), ); let actual = wheel_file(&[WheelTag::new( ["cp315".to_string()], ["abi3".to_string(), "abi3t".to_string()], ["manylinux_2_17_x86_64".to_string()], )])?; assert_eq!(expected, actual); Ok(()) } #[cfg(unix)] #[test] #[serial_test::serial] fn add_data_resolves_symlink_targets_and_uses_source_permissions() -> Result<()> { let tmp_dir = TempDir::new()?; let source = tmp_dir.path().join("README.md"); fs::write(&source, b"hello from symlink target")?; fs::set_permissions(&source, std::fs::Permissions::from_mode(0o644))?; let data_dir = tmp_dir.path().join("test-pkg.data"); let linked_dir = data_dir.join("data/data"); fs::create_dir_all(&linked_dir)?; symlink("../../../README.md", linked_dir.join("README.md"))?; let metadata = Metadata24::new("test-pkg".to_string(), Version::new([1, 0])); let wheel_dir = tmp_dir.path().join("dist"); fs::create_dir_all(&wheel_dir)?; let wheel_writer = WheelWriter::new( "py3-none-any", &wheel_dir, &metadata, SimpleFileOptions::default(), )?; let mut writer = VirtualWriter::new(wheel_writer, Override::empty()); let wheel_path = { add_data(&mut writer, &metadata, Some(&data_dir))?; writer.finish( &metadata, tmp_dir.path(), &[WheelTag::new( ["py3".to_string()], ["none".to_string()], ["any".to_string()], )], )? }; let mut wheel = ZipArchive::new(fs::File::open(&wheel_path)?)?; let entry_name = metadata .get_data_dir() .join("data/data/README.md") .to_string_lossy() .replace('\\', "/"); { let mut entry = wheel.by_name(&entry_name)?; assert_eq!(entry.unix_mode().map(|mode| mode & 0o777), Some(0o644)); let mut content = String::new(); entry.read_to_string(&mut content)?; assert_eq!(content, "hello from symlink target"); } let record_name = metadata .get_dist_info_dir() .join("RECORD") .to_string_lossy() .replace('\\', "/"); assert!(wheel.by_name(&record_name).is_ok()); tmp_dir.close()?; Ok(()) } } maturin-1.16.0/src/module_writer/path_writer.rs000066400000000000000000000045171527064705700216500ustar00rootroot00000000000000use std::io; use std::path::Path; use std::path::PathBuf; use anyhow::Context as _; use anyhow::Result; use fs_err as fs; use fs_err::File; #[cfg(unix)] use fs_err::OpenOptions; #[cfg(unix)] use fs_err::os::unix::fs::OpenOptionsExt as _; use crate::archive_source::ArchiveSource; use super::ModuleWriterInternal; #[cfg(target_family = "unix")] use super::default_permission; /// A [ModuleWriter] that adds the module somewhere in the filesystem, e.g. in a virtualenv pub struct PathWriter { base_path: PathBuf, } impl super::private::Sealed for PathWriter {} impl ModuleWriterInternal for PathWriter { fn add_entry(&mut self, target: impl AsRef, source: ArchiveSource) -> Result<()> { let target = self.base_path.join(target); if let Some(parent_dir) = target.parent() { fs::create_dir_all(parent_dir) .with_context(|| format!("Failed to create directory {parent_dir:?}"))?; } // We only need to set the executable bit on unix let mut file = { #[cfg(target_family = "unix")] { OpenOptions::new() .create(true) .write(true) .truncate(true) .mode(default_permission(source.executable())) .open(&target) } #[cfg(target_os = "windows")] { File::create(&target) } } .with_context(|| format!("Failed to create a file at {target:?}"))?; match source { ArchiveSource::Generated(source) => io::copy(&mut source.data.as_slice(), &mut file), ArchiveSource::File(source) => { let mut source_file = File::options() .read(true) .open(&source.path) .with_context(|| { format!("Failed to open file at {:?} for reading", source.path) })?; io::copy(&mut source_file, &mut file) } } .context("Failed to copy entry to target")?; Ok(()) } } impl PathWriter { /// Writes the module to the given path pub fn from_path(path: impl AsRef) -> Self { Self { base_path: path.as_ref().to_path_buf(), } } } maturin-1.16.0/src/module_writer/py_preamble.rs000066400000000000000000000250101527064705700216060ustar00rootroot00000000000000/// Find the byte position in a Python file where injected code should be inserted. /// /// Returns the byte offset right after the module preamble, which includes: /// 1. UTF-8 BOM (if present) /// 2. Shebang line (if present) /// 3. Encoding declaration (first or second line, per PEP 263) /// 4. Module docstring (if present) /// 5. All `from __future__` import statements /// /// This ensures injected code (e.g., DLL loader patches) doesn't break: /// - File encoding detection /// - The module's `__doc__` attribute /// - Python's requirement that `from __future__` imports precede other statements /// /// This uses a line-oriented byte heuristic rather than parsing Python syntax. pub(super) fn find_python_insertion_point(content: &[u8]) -> usize { let mut pos = 0; // Skip UTF-8 BOM if present if content.starts_with(b"\xef\xbb\xbf") { pos = 3; } // Helper to find end of current line let find_line_end = |start: usize| -> usize { content[start..] .iter() .position(|&b| b == b'\n') .map(|i| start + i + 1) .unwrap_or(content.len()) }; // Helper to check if a line is a comment or blank let is_comment_or_blank = |line: &[u8]| -> bool { let trimmed = line .iter() .position(|b| !b.is_ascii_whitespace()) .map(|i| &line[i..]) .unwrap_or(&[]); trimmed.is_empty() || trimmed.starts_with(b"#") }; // Helper to check for encoding declaration (PEP 263) // Must be a comment line containing "coding" followed by ":" or "=" let is_encoding_line = |line: &[u8]| -> bool { let trimmed = line .iter() .position(|b| !b.is_ascii_whitespace()) .map(|i| &line[i..]) .unwrap_or(&[]); if !trimmed.starts_with(b"#") { return false; } let comment = &trimmed[1..]; // Match PEP 263 pattern: "coding" followed by ":" or "=" comment .windows(7) .any(|w| &w[..6] == b"coding" && (w[6] == b':' || w[6] == b'=')) }; // Skip shebang (must be first line) let pos_after_bom = pos; if pos < content.len() { let line_end = find_line_end(pos); let line = &content[pos..line_end]; if line.starts_with(b"#!") { pos = line_end; } } // Skip encoding declaration if present in the first two physical lines (PEP 263). // If we consumed a shebang above, we only need to check the next line. // Otherwise check both the current and next line. let lines_to_check: usize = if pos > pos_after_bom { 1 } else { 2 }; for _ in 0..lines_to_check { if pos >= content.len() { break; } let line_end = find_line_end(pos); let line = &content[pos..line_end]; if is_encoding_line(line) { pos = line_end; break; } } // Track minimum insertion point (after BOM/shebang/encoding) let mut insertion_point = pos; // Skip blank lines and comments before docstring while pos < content.len() { let line_end = find_line_end(pos); let line = &content[pos..line_end]; if is_comment_or_blank(line) { pos = line_end; insertion_point = pos; } else { break; } } // Check for module docstring (triple-quoted string as first statement) if pos < content.len() { let trimmed_start = content[pos..] .iter() .position(|b| !b.is_ascii_whitespace()) .map(|i| pos + i) .unwrap_or(pos); let rest = &content[trimmed_start..]; let quote = if rest.starts_with(b"\"\"\"") { Some(b"\"\"\"".as_slice()) } else if rest.starts_with(b"'''") { Some(b"'''".as_slice()) } else if rest.starts_with(b"r\"\"\"") || rest.starts_with(b"R\"\"\"") || rest.starts_with(b"u\"\"\"") || rest.starts_with(b"U\"\"\"") { Some(b"\"\"\"".as_slice()) } else if rest.starts_with(b"r'''") || rest.starts_with(b"R'''") || rest.starts_with(b"u'''") || rest.starts_with(b"U'''") { Some(b"'''".as_slice()) } else { None }; if let Some(q) = quote { // Find the closing triple quote let start_offset = if rest.starts_with(b"r") || rest.starts_with(b"R") || rest.starts_with(b"u") || rest.starts_with(b"U") { 4 } else { 3 }; if let Some(end_idx) = rest[start_offset..] .windows(3) .position(|w| w == q) .map(|i| trimmed_start + start_offset + i + 3) { // Move past the docstring and any trailing newline pos = end_idx; if pos < content.len() && content[pos] == b'\n' { pos += 1; } insertion_point = pos; } } } // Now scan for `from __future__` imports let mut in_future_import = false; let mut paren_depth: usize = 0; while pos < content.len() { let line_end = find_line_end(pos); let line = &content[pos..line_end]; if in_future_import { // Count parentheses in this continuation line for &b in line { match b { b'(' => paren_depth += 1, b')' => paren_depth = paren_depth.saturating_sub(1), _ => {} } } let ends_with_backslash = !line.is_empty() && line .iter() .rposition(|b| !b.is_ascii_whitespace()) .map(|i| line[i] == b'\\') .unwrap_or(false); if paren_depth == 0 && !ends_with_backslash { in_future_import = false; insertion_point = line_end; } } else { let trimmed_start = line .iter() .position(|b| !b.is_ascii_whitespace()) .unwrap_or(0); if line[trimmed_start..].starts_with(b"from __future__") { // Check if this is a multi-line import paren_depth = 0; for &b in line { match b { b'(' => paren_depth += 1, b')' => paren_depth = paren_depth.saturating_sub(1), _ => {} } } let ends_with_backslash = !line.is_empty() && line .iter() .rposition(|b| !b.is_ascii_whitespace()) .map(|i| line[i] == b'\\') .unwrap_or(false); if paren_depth > 0 || ends_with_backslash { in_future_import = true; } else { insertion_point = line_end; } } else if !is_comment_or_blank(line) { // Non-future import statement found, stop scanning break; } } pos = line_end; } insertion_point } #[cfg(test)] mod tests { #[test] fn test_find_python_insertion_point() { use super::find_python_insertion_point; // No __future__ imports, no preamble assert_eq!(find_python_insertion_point(b"import os\n"), 0); // With __future__ import let content = b"from __future__ import annotations\nimport os\n"; assert_eq!(find_python_insertion_point(content), 35); // after the newline // Multiple __future__ imports let content = b"from __future__ import annotations\nfrom __future__ import division\nimport os\n"; assert_eq!(find_python_insertion_point(content), 67); // Docstring then __future__ - insertion after __future__, not after docstring let content = b"\"\"\"Docstring.\"\"\"\nfrom __future__ import annotations\nimport os\n"; assert_eq!(find_python_insertion_point(content), 52); // Docstring only (no __future__) - insertion after docstring let content = b"\"\"\"Module docstring.\"\"\"\nimport os\n"; assert_eq!(find_python_insertion_point(content), 24); // Empty content assert_eq!(find_python_insertion_point(b""), 0); // Multi-line parenthesized __future__ import let content = b"from __future__ import (\n annotations,\n)\nimport os\n"; assert_eq!(find_python_insertion_point(content), 44); // after closing paren line // Backslash-continued __future__ import let content = b"from __future__ import annotations, \\\n division\nimport os\n"; assert_eq!(find_python_insertion_point(content), 51); // after continuation line // UTF-8 BOM should be skipped let content = b"\xef\xbb\xbfimport os\n"; assert_eq!(find_python_insertion_point(content), 3); // after BOM // UTF-8 BOM with __future__ let content = b"\xef\xbb\xbffrom __future__ import annotations\nimport os\n"; assert_eq!(find_python_insertion_point(content), 38); // BOM(3) + future line(35) // Shebang line let content = b"#!/usr/bin/env python\nimport os\n"; assert_eq!(find_python_insertion_point(content), 22); // after shebang // Shebang + encoding let content = b"#!/usr/bin/env python\n# -*- coding: utf-8 -*-\nimport os\n"; assert_eq!(find_python_insertion_point(content), 46); // after encoding line // Shebang + encoding + __future__ let content = b"#!/usr/bin/env python\n# -*- coding: utf-8 -*-\nfrom __future__ import annotations\nimport os\n"; assert_eq!(find_python_insertion_point(content), 81); // Encoding only (no shebang) let content = b"# coding: utf-8\nimport os\n"; assert_eq!(find_python_insertion_point(content), 16); // Raw docstring let content = b"r\"\"\"Raw docstring.\"\"\"\nimport os\n"; assert_eq!(find_python_insertion_point(content), 22); // Single-quoted docstring let content = b"'''Single quoted docstring.'''\nimport os\n"; assert_eq!(find_python_insertion_point(content), 31); // Multi-line docstring let content = b"\"\"\"Multi-line\ndocstring.\"\"\"\nimport os\n"; assert_eq!(find_python_insertion_point(content), 28); } } maturin-1.16.0/src/module_writer/sdist_writer.rs000066400000000000000000000271541527064705700220440ustar00rootroot00000000000000use std::cmp::Ordering; use std::io; use std::io::Read; use std::io::Write as _; use std::path::Component; use std::path::Path; use std::path::PathBuf; use anyhow::Context as _; use anyhow::{Result, bail}; use flate2::Compression; use flate2::write::GzEncoder; use fs_err as fs; use fs_err::File; use normpath::PathExt as _; use crate::Metadata24; use crate::archive_source::ArchiveSource; use super::ModuleWriterInternal; use super::default_permission; /// A deterministic, arbitrary, non-zero timestamp that use used as `mtime` /// of headers when writing sdists. /// /// This value, copied from the tar crate, corresponds to _Jul 23, 2006_, /// which is the date of the first commit for what would become Rust. /// /// This value is used instead of unix epoch 0 because some tools do not handle /// the 0 value properly (See rust-lang/cargo#9512). const SDIST_DETERMINISTIC_TIMESTAMP: u64 = 1153704088; /// Creates a .tar.gz archive containing the source distribution pub struct SDistWriter { tar: tar::Builder>>, path: PathBuf, mtime: u64, pax_header_index: u64, } impl super::private::Sealed for SDistWriter {} impl ModuleWriterInternal for SDistWriter { fn add_entry(&mut self, target: impl AsRef, source: ArchiveSource) -> Result<()> { let target = target.as_ref(); let archive_path = portable_path(target)?; let mut header = tar::Header::new_ustar(); header.set_entry_type(tar::EntryType::Regular); header.set_mode(default_permission(source.executable())); set_sdist_header_metadata(&mut header, self.mtime); let data = match source { ArchiveSource::Generated(source) => source.data, ArchiveSource::File(source) => { let mut file = File::options() .read(true) .open(&source.path) .with_context(|| { format!("Failed to open file {:?} for reading", source.path) })?; let mut buffer = Vec::new(); file.read_to_end(&mut buffer) .context("Failed to read file into buffer")?; buffer } }; header.set_size(data.len() as u64); if set_ustar_path_or_needs_pax(&mut header, &archive_path)? { self.append_pax_path(&archive_path)?; header.set_path(format!("PaxHeaders/{}", self.pax_header_index))?; self.pax_header_index += 1; } header.set_cksum(); self.tar.append(&header, data.as_slice()).with_context(|| { format!( "Failed to add {} bytes to sdist as {}", data.len(), target.display() ) })?; Ok(()) } } impl SDistWriter { /// Create a source distribution .tar.gz which can be subsequently expanded pub fn new( wheel_dir: impl AsRef, metadata24: &Metadata24, mtime_override: Option, ) -> Result { let path = wheel_dir .as_ref() .normalize()? .join(format!( "{}-{}.tar.gz", metadata24.get_distribution_escaped(), metadata24.get_version_escaped() )) .into_path_buf(); let enc = GzEncoder::new(Vec::new(), Compression::default()); let mut tar = tar::Builder::new(enc); tar.mode(tar::HeaderMode::Deterministic); Ok(Self { tar, path, mtime: mtime_override.unwrap_or(SDIST_DETERMINISTIC_TIMESTAMP), pax_header_index: 0, }) } fn append_pax_path(&mut self, archive_path: &str) -> Result<(), io::Error> { let data = pax_record("path", archive_path.as_bytes())?; let mut header = tar::Header::new_ustar(); header.set_path("././@PaxHeader")?; header.set_entry_type(tar::EntryType::XHeader); header.set_mode(0o644); set_sdist_header_metadata(&mut header, self.mtime); header.set_size(data.len() as u64); header.set_cksum(); self.tar.append(&header, data.as_slice()) } /// Tar files do not have a central directory of entries, so the entire file needs to be walked /// to find a specific entry. Most tools are interested in the package metadata, so place that /// at the beginning of the tar for convenience pub(super) fn file_ordering<'a>( &self, pkg_info_path: &'a Path, ) -> impl FnMut(&PathBuf, &PathBuf) -> Ordering + use<'a> { move |p1, p2| { let p1_is_info = p1 == pkg_info_path; let p2_is_info = p2 == pkg_info_path; match (p1_is_info, p2_is_info) { (true, false) => Ordering::Less, (false, true) => Ordering::Greater, _ => p1.cmp(p2), } } } /// Finished the .tar.gz archive pub fn finish(self) -> Result { let archive = self.tar.into_inner()?; fs::write(&self.path, archive.finish()?)?; Ok(self.path) } } fn set_sdist_header_metadata(header: &mut tar::Header, mtime: u64) { header.set_uid(0); header.set_gid(0); header.set_mtime(mtime); } /// Avoid the extra size for the path in the pax extended header if not required. /// /// This matches CPython: /// fn set_ustar_path_or_needs_pax( header: &mut tar::Header, archive_path: &str, ) -> Result { // ustar only allows ASCII, but would accept arbitrary bytes without the check. if !archive_path.is_ascii() { return Ok(true); } let mut probe = tar::Header::new_ustar(); if probe.set_path(archive_path).is_err() { return Ok(true); } header.set_path(archive_path)?; Ok(false) } /// Convert the path to a UTF-8 string with forward slashes and no NUL bytes. fn portable_path(path: &Path) -> Result { let components = path .components() .filter_map(|component| match component { Component::CurDir => None, component => Some(component), }) .map(|component| { let Component::Normal(component) = component else { bail!("sdist archive paths must be relative and must not contain `..`"); }; let component = component.to_str().with_context(|| { format!("sdist archive path `{}` is not valid UTF-8", path.display()) })?; if component.contains('\0') { bail!( "sdist archive path `{}` contains a NUL byte", path.display() ); } Ok(component) }) .collect::>>()?; if components.is_empty() { bail!("sdist archive paths must not be empty"); } Ok(components.join("/")) } /// Format in the pax header `LEN KEY=VALUE\n` format. fn pax_record(key: &str, value: &[u8]) -> Result, io::Error> { // POSIX pax records are `LEN KEY=VALUE\n`, and `LEN` includes its own // decimal digits. Start with a one-digit length and grow at powers of ten. let mut digits_len = 1; let mut max_len = 10; let key_value_len = " ".len() + key.len() + "=".len() + value.len() + "\n".len(); while digits_len + key_value_len >= max_len { // We require space for an additional digit in the length field, which increases the total // possible length ten-fold. digits_len += 1; max_len *= 10; } let len = digits_len + key_value_len; let mut data = Vec::with_capacity(len); write!(&mut data, "{len} {key}=")?; data.extend_from_slice(value); data.push(b'\n'); Ok(data) } #[cfg(test)] mod tests { use std::io::Read as _; use std::path::Path; use expect_test::expect; use flate2::read::GzDecoder; use fs_err as fs; use pep440_rs::Version; use tempfile::TempDir; use crate::Metadata24; use crate::archive_source::ArchiveSource; use crate::archive_source::GeneratedSourceData; use super::ModuleWriterInternal; use super::SDistWriter; #[test] fn sdist_uses_pax_header_for_extended_path() -> anyhow::Result<()> { let temp_dir = TempDir::new()?; let metadata = Metadata24::new("test-pkg".to_string(), Version::new([1, 0])); let mut writer = SDistWriter::new(temp_dir.path(), &metadata, None)?; let long_path = format!("data/{}.txt", "a".repeat(101)); writer.add_entry( &long_path, ArchiveSource::Generated(GeneratedSourceData { data: b"test\n".to_vec(), path: None, executable: false, }), )?; let sdist = writer.finish()?; let [pax_header, pax_data, file_header] = raw_tar_blocks(&sdist)?; expect![[r#" block 0 bytes 0..157: @PaxHeader\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x000000644\x000000000\x000000 000\x0000000000170\x0010461020 230\x000007762\x00x"#]].assert_eq(&pax_header); expect![[r#" block 1 bytes 0..128: 120 path=data/aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa.txt\n \x00\x00\x00\x00\x00\x00\x00\x00"#]] .assert_eq(&pax_data); expect![[r#" block 2 bytes 0..157: PaxHeaders/0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x000000644\x000000000\x000000 000\x0000000000005\x0010461020 230\x000010071\x000"#]].assert_eq(&file_header); Ok(()) } fn raw_tar_blocks(sdist_path: &Path) -> anyhow::Result<[String; 3]> { let tar_gz = fs::File::open(sdist_path)?; let mut decoder = GzDecoder::new(tar_gz); let mut archive = Vec::new(); decoder.read_to_end(&mut archive)?; Ok([ raw_tar_block_slice(&archive, 0, 0..157)?, raw_tar_block_slice(&archive, 1, 0..128)?, raw_tar_block_slice(&archive, 2, 0..157)?, ]) } fn raw_tar_block_slice( archive: &[u8], block: usize, range: std::ops::Range, ) -> anyhow::Result { let start_in_block = range.start; let end_in_block = range.end; let start = block * 512 + start_in_block; let end = block * 512 + end_in_block; let Some(bytes) = archive.get(start..end) else { anyhow::bail!("missing tar block {block} bytes {start_in_block}..{end_in_block}"); }; let mut output = format!("block {block} bytes {start_in_block}..{end_in_block}:"); for chunk in bytes.chunks(24) { output.push('\n'); output.push_str(&chunk.escape_ascii().to_string()); } Ok(output) } } maturin-1.16.0/src/module_writer/util.rs000066400000000000000000000021131527064705700202630ustar00rootroot00000000000000use std::io::Error as IoError; use std::io::Write; use anyhow::Result; use base64::Engine as _; use base64::engine::general_purpose::URL_SAFE_NO_PAD; use sha2::Digest as _; use sha2::Sha256; pub(super) struct StreamSha256<'a, W> { hasher: Sha256, inner: &'a mut W, bytes_written: usize, } impl<'a, W> StreamSha256<'a, W> where W: Write, { pub(super) fn new(inner: &'a mut W) -> Self { Self { hasher: Sha256::new(), inner, bytes_written: 0, } } pub(super) fn finalize(self) -> Result<(String, usize)> { self.inner.flush()?; let hash = URL_SAFE_NO_PAD.encode(self.hasher.finalize()); Ok((hash, self.bytes_written)) } } impl<'a, W> Write for StreamSha256<'a, W> where W: Write, { fn write(&mut self, buf: &[u8]) -> Result { let written = self.inner.write(buf)?; self.hasher.update(&buf[..written]); self.bytes_written += written; Ok(written) } fn flush(&mut self) -> Result<(), IoError> { self.inner.flush() } } maturin-1.16.0/src/module_writer/virtual_writer.rs000066400000000000000000000423351527064705700224020ustar00rootroot00000000000000use std::cmp::Ordering; use std::collections::HashMap; use std::collections::hash_map::Entry; use std::collections::hash_map::VacantEntry; use std::path::Path; use std::path::PathBuf; use std::rc::Rc; use anyhow::Result; use anyhow::bail; use ignore::overrides::Override; #[cfg(test)] use indexmap::IndexMap; use once_cell::unsync::OnceCell; use same_file::is_same_file; use tempfile::TempDir; use tempfile::tempdir; use tracing::debug; use crate::Metadata24; use crate::archive_source::ArchiveSource; use crate::archive_source::FileSourceData; use crate::archive_source::GeneratedSourceData; use super::ModuleWriter; use super::ModuleWriterInternal; use super::PathWriter; use super::SDistWriter; use super::WheelWriter; #[cfg(test)] use super::mock_writer::MockWriter; use super::py_preamble::find_python_insertion_point; use super::write_dist_info; /// A 'virtual' module writer that tracks entries to be added to the archive /// and writes them to the underlying archive at the end. /// This struct provides 2 primary functions: /// 1. Serves as the single point of enforcement to decide which entries are included /// in the archive /// 2. Ensure that the entries are written to the underlying archive in a consistent /// order for build reproducibility pub struct VirtualWriter { inner: W, tracker: HashMap, excludes: Override, target_exclusion_warning_emitted: bool, temp_dir: OnceCell>, pending_prepends: HashMap>, } impl VirtualWriter { /// Construct a new [VirtualWriter] wrapping the provided inner writer and /// using the `excludes` for filtering files pub fn new(inner: W, excludes: Override) -> Self { Self { inner, tracker: HashMap::new(), excludes, target_exclusion_warning_emitted: false, temp_dir: OnceCell::new(), pending_prepends: HashMap::new(), } } /// Provides a temp dir that can contain files that will be added to the archive later pub(crate) fn temp_dir(&self) -> Result> { self.temp_dir .get_or_try_init(|| { let temp_dir = tempdir()?; Ok(Rc::new(temp_dir)) }) .cloned() } /// Returns `true` if the given path should be excluded pub(crate) fn exclude(&self, path: impl AsRef) -> bool { self.excludes.matched(path.as_ref(), false).is_whitelist() } /// Returns `true` if the given target path has already been added to the archive pub(crate) fn contains_target(&self, target: impl AsRef) -> bool { self.tracker.contains_key(target.as_ref()) } /// Returns the source path of the file already added at the given target path, if any pub(crate) fn target_source(&self, target: impl AsRef) -> Option<&Path> { self.tracker.get(target.as_ref())?.path() } /// Checks exclusions and previously tracked sources to determine if the /// current source should be allowed. /// Returns Ok(Some(..)) if the new source should be included, Ok(None) if /// the new source should not be included (excluded or duplicate). fn get_entry( &mut self, target: PathBuf, source: Option<&Path>, ) -> Result>> { if let Some(source) = source && self.exclude(source) { return Ok(None); } if self.exclude(&target) { if !self.target_exclusion_warning_emitted { self.target_exclusion_warning_emitted = true; eprintln!( "âš ï¸� Warning: A file was excluded from the archive by the target path in the archive\n\ âš ï¸� instead of the source path on the filesystem. This behavior is deprecated and\n\ âš ï¸� will be removed in future versions of maturin.", ); } debug!("Excluded file {target:?} from archive by target path"); return Ok(None); } let entry = match self.tracker.entry(target.clone()) { Entry::Vacant(entry) => Some(entry), Entry::Occupied(entry) => { match (entry.get().path(), source) { (None, None) => { bail!( "Generated file {} was already added, can't add it again", target.display() ); } (Some(previous_source), None) => { bail!( "File {} was already added from {}, can't overwrite with generated file", target.display(), previous_source.display() ) } (None, Some(source)) => { bail!( "Generated file {} was already added, can't overwrite it with {}", target.display(), source.display() ); } (Some(previous_source), Some(source)) => { if is_same_file(source, previous_source).unwrap_or(false) { // Ignore identical duplicate files None } else { bail!( "File {} was already added from {}, can't add it from {}", target.display(), previous_source.display(), source.display() ); } } } } }; Ok(entry) } pub(crate) fn add_entry( &mut self, target: impl AsRef, source: ArchiveSource, ) -> Result<()> { let target = target.as_ref(); if let Some(entry) = self.get_entry(target.to_path_buf(), source.path())? { debug!("Tracked entry {target:?}"); entry.insert(source); } Ok(()) } /// Adds a file to the archive, bypassing exclusion checks. /// This is used for build artifacts (compiled shared libraries) which should /// always be included regardless of exclude patterns. pub(crate) fn add_file_force( &mut self, target: impl AsRef, source: impl AsRef, executable: bool, ) -> Result<()> { let target = target.as_ref(); let source = source.as_ref(); debug!("Adding {} from {}", target.display(), source.display()); let source = ArchiveSource::File(FileSourceData { path: source.to_path_buf(), executable, }); self.add_entry_force(target, source) } /// Adds an entry to the archive, bypassing exclusion checks. /// This is used for build artifacts and generated files that should /// always be included regardless of exclude patterns. pub(crate) fn add_entry_force( &mut self, target: impl AsRef, source: ArchiveSource, ) -> Result<()> { let target = target.as_ref(); debug!("Adding {} (forced)", target.display()); // Directly insert into tracker, bypassing exclusion checks but still detecting duplicates if self.tracker.insert(target.to_path_buf(), source).is_some() { bail!( "File {} overwrote an existing tracked file", target.display() ); } Ok(()) } /// Register data to be prepended to a file entry. /// /// The prepend is deferred until `finish_internal()` runs, after all files /// have been tracked. This avoids conflicts when `prepend_to` is called /// before the target file has been added (e.g., `__init__.py` patching /// during wheel repair runs before Python source files are collected). /// /// For Python files, the data is inserted after any `from __future__` /// import lines rather than at byte position 0, to avoid SyntaxErrors. pub(crate) fn prepend_to(&mut self, target: impl AsRef, data: Vec) -> Result<()> { self.pending_prepends .entry(target.as_ref().to_path_buf()) .or_default() .extend_from_slice(&data); Ok(()) } /// Apply all pending prepends to their corresponding tracked entries. /// /// For Python files (`.py`), the prepend data is inserted after any /// `from __future__` import lines to avoid SyntaxErrors. Targets that /// were never tracked (no corresponding `add_file`/`add_bytes`) are /// skipped to avoid unexpectedly creating files like `__init__.py` in /// namespace packages or binary wheels. fn apply_pending_prepends(&mut self) -> Result<()> { for (target, prepend_data) in std::mem::take(&mut self.pending_prepends) { let is_python = target .extension() .is_some_and(|ext| ext.eq_ignore_ascii_case("py")); let Some(existing) = self.tracker.remove(&target) else { tracing::warn!( "Skipping prepend for {} because it was not tracked. \ This avoids creating a new file such as __init__.py unexpectedly.", target.display() ); continue; }; let (file_content, path, executable) = match existing { ArchiveSource::Generated(g) => (g.data, g.path, g.executable), ArchiveSource::File(f) => (fs_err::read(&f.path)?, Some(f.path), f.executable), }; let insert_pos = if is_python { find_python_insertion_point(&file_content) } else { 0 }; let mut new_data = Vec::with_capacity(file_content.len() + prepend_data.len()); new_data.extend_from_slice(&file_content[..insert_pos]); new_data.extend_from_slice(&prepend_data); new_data.extend_from_slice(&file_content[insert_pos..]); self.tracker.insert( target, ArchiveSource::Generated(GeneratedSourceData { data: new_data, path, executable, }), ); } Ok(()) } /// Actually write the entries to the underlying archive using the provided comparator /// to order the entries fn finish_internal( mut self, comparator: &mut impl FnMut(&PathBuf, &PathBuf) -> Ordering, ) -> Result { self.apply_pending_prepends()?; let mut entries: Vec<_> = self.tracker.into_iter().collect(); entries.sort_unstable_by(|(p1, _), (p2, _)| comparator(p1, p2)); for (target, entry) in entries { self.inner.add_entry(target, entry)?; } Ok(self.inner) } } impl super::private::Sealed for VirtualWriter {} impl ModuleWriter for VirtualWriter { fn add_bytes( &mut self, target: impl AsRef, source: Option<&Path>, data: impl Into>, executable: bool, ) -> Result<()> { let source = ArchiveSource::Generated(GeneratedSourceData { data: data.into(), path: source.map(ToOwned::to_owned), executable, }); self.add_entry(target, source) } fn add_file( &mut self, target: impl AsRef, source: impl AsRef, executable: bool, ) -> Result<()> { let source = ArchiveSource::File(FileSourceData { path: source.as_ref().to_path_buf(), executable, }); self.add_entry(target, source) } } impl VirtualWriter { /// Commit the tracked entries to the underlying [PathWriter] pub fn finish(self) -> Result<()> { let mut comparator = PathBuf::cmp; let _inner = self.finish_internal(&mut comparator)?; Ok(()) } } impl VirtualWriter { /// Commit the tracked entries to the underlying [SDistWriter] pub fn finish(self, pkg_info_path: &Path) -> Result { let mut comparator = self.inner.file_ordering(pkg_info_path); let inner = self.finish_internal(&mut comparator)?; let path = inner.finish()?; Ok(path) } } impl VirtualWriter { /// Write the .dist-info for the wheel and commit the tracked entries /// to the underlying [WheelWriter] pub fn finish( mut self, metadata24: &Metadata24, pyproject_dir: &Path, tags: &[crate::WheelTag], ) -> Result { let dist_info_dir = write_dist_info(&mut self, pyproject_dir, metadata24, tags)?; let mut comparator = self.inner.file_ordering(&dist_info_dir); let inner = self.finish_internal(&mut comparator)?; inner.finish(&dist_info_dir) } } #[cfg(test)] impl VirtualWriter { /// Commit the tracked entries to the underlying [MockWriter] pub fn finish(self) -> Result>> { let mut comparator = PathBuf::cmp; let inner = self.finish_internal(&mut comparator)?; Ok(inner.finish()) } } #[cfg(test)] mod tests { use std::path::Path; use anyhow::Result; use ignore::overrides::Override; use ignore::overrides::OverrideBuilder; use insta::assert_snapshot; use itertools::Itertools as _; use tempfile::TempDir; use crate::ModuleWriter; use crate::module_writer::mock_writer::MockWriter; use super::VirtualWriter; #[test] fn virtual_writer_no_excludes() -> Result<()> { let mut writer = VirtualWriter::new(MockWriter::default(), Override::empty()); assert!(writer.tracker.is_empty()); writer.add_empty_file("test")?; assert_eq!(writer.tracker.len(), 1); writer.finish()?; Ok(()) } #[test] fn virtual_writer_excludes() -> Result<()> { const EMPTY: &[u8] = &[]; // A test filter let tmp_dir = TempDir::new()?; let mut excludes = OverrideBuilder::new(&tmp_dir); excludes.add("test*")?; excludes.add("!test2")?; let mut writer = VirtualWriter::new(MockWriter::default(), excludes.build()?); writer.add_bytes("test1", Some(Path::new("test1")), EMPTY, true)?; writer.add_bytes("test3", Some(Path::new("test3")), EMPTY, true)?; assert!(writer.tracker.is_empty()); writer.add_bytes("yes", Some(Path::new("yes")), EMPTY, true)?; assert!(!writer.tracker.is_empty()); writer.add_bytes("test2", Some(Path::new("test2")), EMPTY, true)?; assert_eq!(writer.tracker.len(), 2); let files = writer.finish()?; tmp_dir.close()?; // 'yes' was added before 'test2' above, but the output should be ordered in the end assert_snapshot!(files.keys().map(|p| p.to_string_lossy()).collect_vec().join("\n"), @r" test2 yes "); Ok(()) } #[test] fn virtual_writer_force_bypasses_excludes() -> Result<()> { use std::io::Write as _; // Create a temp file to use as a source let tmp_dir = TempDir::new()?; let source_file = tmp_dir.path().join("artifact.so"); { let mut file = fs_err::File::create(&source_file)?; file.write_all(b"test artifact")?; } // Set up excludes that would match the source file let mut excludes = OverrideBuilder::new(tmp_dir.path()); excludes.add("*.so")?; let mut writer = VirtualWriter::new(MockWriter::default(), excludes.build()?); // Regular add_file should be excluded by the source path writer.add_file("excluded.so", &source_file, true)?; assert!( writer.tracker.is_empty(), "Regular add_file should be excluded" ); // add_file_force should bypass exclusion writer.add_file_force("forced.so", &source_file, true)?; assert_eq!( writer.tracker.len(), 1, "add_file_force should bypass exclusion" ); let files = writer.finish()?; assert!(files.contains_key(Path::new("forced.so"))); assert!(!files.contains_key(Path::new("excluded.so"))); tmp_dir.close()?; Ok(()) } #[test] fn virtual_writer_force_detects_duplicates() -> Result<()> { use std::io::Write as _; let tmp_dir = TempDir::new()?; let source_file = tmp_dir.path().join("artifact.so"); { let mut file = fs_err::File::create(&source_file)?; file.write_all(b"test artifact")?; } let mut writer = VirtualWriter::new(MockWriter::default(), Override::empty()); // First add should succeed writer.add_file_force("target.so", &source_file, true)?; assert_eq!(writer.tracker.len(), 1); // Second add to same target should fail let result = writer.add_file_force("target.so", &source_file, true); assert!(result.is_err(), "Duplicate add_file_force should fail"); tmp_dir.close()?; Ok(()) } } maturin-1.16.0/src/module_writer/wheel_writer.rs000066400000000000000000000114131527064705700220110ustar00rootroot00000000000000use std::cmp::Ordering; use std::collections::BTreeMap; use std::io; use std::io::Write as _; use std::path::Path; use std::path::PathBuf; use anyhow::Context as _; use anyhow::Result; use fs_err::File; use path_slash::PathBufExt as _; use tracing::debug; use zip::ZipWriter; use zip::write::SimpleFileOptions; use crate::Metadata24; use crate::archive_source::ArchiveSource; use super::ModuleWriterInternal; use super::default_permission; use super::util::StreamSha256; /// A glorified zip builder, mostly useful for writing the record file of a wheel pub struct WheelWriter { zip: ZipWriter, record: BTreeMap, file_options: SimpleFileOptions, } impl super::private::Sealed for WheelWriter {} impl ModuleWriterInternal for WheelWriter { fn add_entry(&mut self, target: impl AsRef, source: ArchiveSource) -> Result<()> { let target = target.as_ref(); let options = self .file_options .unix_permissions(default_permission(source.executable())); self.zip.start_file_from_path(target, options)?; let mut writer = StreamSha256::new(&mut self.zip); match source { ArchiveSource::Generated(source) => io::copy(&mut source.data.as_slice(), &mut writer), ArchiveSource::File(source) => { let mut file = File::options() .read(true) .open(&source.path) .with_context(|| format!("Failed to open file {:?}", source.path))?; io::copy(&mut file, &mut writer) } } .with_context(|| format!("Failed to write to zip archive for {target:?}"))?; let (hash, length) = writer.finalize()?; self.record.insert(target.to_path_buf(), (hash, length)); Ok(()) } } impl WheelWriter { /// Create a new wheel file which can be subsequently expanded pub fn new( tag: &str, wheel_dir: &Path, metadata24: &Metadata24, file_options: SimpleFileOptions, ) -> Result { let wheel_path = wheel_dir.join(format!( "{}-{}-{}.whl", metadata24.get_distribution_escaped(), metadata24.get_version_escaped(), tag )); let file = File::create(wheel_path)?; let builder = WheelWriter { zip: ZipWriter::new(file), record: BTreeMap::new(), file_options, }; Ok(builder) } /// PEP 427 recommends that the .dist-info directory be placed physically at the /// end of the zip file, so this custom comparator does exactly that pub(super) fn file_ordering<'p>( &self, dist_info_dir: &'p Path, ) -> impl FnMut(&PathBuf, &PathBuf) -> Ordering + use<'p> { move |p1, p2| { let p1_is_dist_info = p1.starts_with(dist_info_dir); let p2_is_dist_info = p2.starts_with(dist_info_dir); match (p1_is_dist_info, p2_is_dist_info) { (true, false) => Ordering::Greater, (false, true) => Ordering::Less, _ => p1.cmp(p2), } } } /// Creates the record file and finishes the zip pub fn finish(mut self, dist_info_dir: &Path) -> Result { let options = self .file_options .unix_permissions(default_permission(false)); let record_filename = dist_info_dir.join("RECORD"); debug!("Adding {}", record_filename.display()); self.zip.start_file_from_path(&record_filename, options)?; for (filename, (hash, len)) in self.record { let filename = filename.to_slash_lossy(); writeln!(self.zip, "{filename},sha256={hash},{len}")?; } // Write the record for the RECORD file itself writeln!(self.zip, "{},,", record_filename.to_slash_lossy())?; let file = self.zip.finish()?; Ok(file.into_path()) } } #[cfg(test)] mod tests { use pep440_rs::Version; use tempfile::TempDir; use crate::CompressionMethod; use crate::CompressionOptions; use crate::Metadata24; use super::WheelWriter; #[test] fn wheel_writer_no_compression() -> Result<(), Box> { let metadata = Metadata24::new("dummy".to_string(), Version::new([1, 0])); let tmp_dir = TempDir::new()?; let compression_options = CompressionOptions { compression_method: CompressionMethod::Stored, ..Default::default() }; let writer = WheelWriter::new( "no compression", tmp_dir.path(), &metadata, compression_options.get_file_options(), )?; writer.finish(&metadata.get_dist_info_dir())?; tmp_dir.close()?; Ok(()) } } maturin-1.16.0/src/new_project.rs000066400000000000000000000345101527064705700167520ustar00rootroot00000000000000use self::package_name_validations::{cargo_check_name, pypi_check_name}; use crate::ci::GenerateCI; use crate::{BridgeModel, PyO3}; use anyhow::{Context, Result, bail}; use console::style; use dialoguer::{Select, theme::ColorfulTheme}; use fs_err as fs; use minijinja::{Environment, context}; use semver::Version; use std::path::Path; /// Mixed Rust/Python project layout #[derive(Debug, Clone, Copy)] enum ProjectLayout { Mixed { src: bool }, PureRust, } struct ProjectGenerator<'a> { env: Environment<'a>, project_name: String, crate_name: String, bindings: String, layout: ProjectLayout, ci_config: String, overwrite: bool, } impl ProjectGenerator<'_> { fn new( project_name: String, layout: ProjectLayout, bindings: String, overwrite: bool, ) -> Result { let crate_name = project_name.replace('-', "_"); let mut env = Environment::new(); env.set_keep_trailing_newline(true); env.add_template(".gitignore", include_str!("templates/.gitignore.j2"))?; env.add_template("Cargo.toml", include_str!("templates/Cargo.toml.j2"))?; env.add_template( "pyproject.toml", include_str!("templates/pyproject.toml.j2"), )?; env.add_template("lib.rs", include_str!("templates/lib.rs.j2"))?; env.add_template("main.rs", include_str!("templates/main.rs.j2"))?; env.add_template("build.rs", include_str!("templates/build.rs.j2"))?; env.add_template("__init__.py", include_str!("templates/__init__.py.j2"))?; env.add_template("test_all.py", include_str!("templates/test_all.py.j2"))?; env.add_template("example.udl", include_str!("templates/example.udl.j2"))?; let bridge_model = match bindings.as_str() { "bin" => BridgeModel::Bin(None), "cffi" => BridgeModel::Cffi, "uniffi" => BridgeModel::UniFfi, _ => BridgeModel::PyO3(PyO3 { crate_name: bindings.parse()?, version: Version::new(0, 23, 1), stable_abi: None, metadata: None, }), }; let ci_config = crate::ci::github::generate_github_from_cli( &GenerateCI::default(), &project_name, &bridge_model, true, )?; Ok(Self { env, project_name, crate_name, bindings, layout, ci_config, overwrite, }) } fn generate(&self, project_path: &Path) -> Result<()> { fs::create_dir_all(project_path)?; self.write_project_file(project_path, ".gitignore")?; self.write_project_file(project_path, "pyproject.toml")?; // CI configuration let gh_action_path = project_path.join(".github").join("workflows"); fs::create_dir_all(&gh_action_path)?; self.write_content(&gh_action_path, "CI.yml", self.ci_config.as_bytes())?; let rust_project = match self.layout { ProjectLayout::Mixed { src } => { let python_dir = if src { project_path.join("src") } else { project_path.join("python") }; let python_project = python_dir.join(&self.crate_name); fs::create_dir_all(&python_project)?; self.write_project_file(&python_project, "__init__.py")?; let test_dir = python_dir.join("tests"); fs::create_dir_all(&test_dir)?; self.write_project_file(&test_dir, "test_all.py")?; if src { project_path.join("rust") } else { project_path.to_path_buf() } } ProjectLayout::PureRust => project_path.to_path_buf(), }; let rust_src = rust_project.join("src"); fs::create_dir_all(&rust_src)?; self.write_project_file(&rust_project, "Cargo.toml")?; if self.bindings == "bin" { self.write_project_file(&rust_src, "main.rs")?; } else { self.write_project_file(&rust_src, "lib.rs")?; if self.bindings == "uniffi" { self.write_project_file(&rust_project, "build.rs")?; self.write_project_file(&rust_src, "example.udl")?; } } Ok(()) } fn render_template(&self, tmpl_name: &str) -> Result { let version_major: usize = env!("CARGO_PKG_VERSION_MAJOR").parse().unwrap(); let version_minor: usize = env!("CARGO_PKG_VERSION_MINOR").parse().unwrap(); let tmpl = self.env.get_template(tmpl_name)?; let out = tmpl.render(context!( name => self.project_name, crate_name => self.crate_name, bindings => self.bindings, mixed_non_src => matches!(self.layout, ProjectLayout::Mixed { src: false }), version_major => version_major, version_minor => version_minor ))?; Ok(out) } fn write_project_file(&self, directory: &Path, file: &str) -> Result<()> { let content = self.render_template(file)?; self.write_content(directory, file, content.as_bytes()) } fn write_content(&self, directory: &Path, file: &str, content: &[u8]) -> Result<()> { let path = directory.join(file); if self.overwrite || !path.exists() { fs::write(path, content)?; } Ok(()) } } fn validate_name(name: &str) -> anyhow::Result { cargo_check_name(name).context("Invalid Cargo package name")?; pypi_check_name(name).context("Invalid PyPI package name")?; Ok(name.to_string()) } /// Options common to `maturin new` and `maturin init`. #[derive(Debug, clap::Parser)] pub struct GenerateProjectOptions { /// Set the resulting package name, defaults to the directory name #[arg( long, value_parser=validate_name, )] name: Option, /// Use mixed Rust/Python project layout #[arg(long)] mixed: bool, /// Use Python first src layout for mixed Rust/Python project #[arg(long)] src: bool, /// Which kind of bindings to use #[arg( short, long, value_parser = ["pyo3", "cffi", "uniffi", "bin"] )] bindings: Option, } /// Generate a new cargo project pub fn new_project(path: String, options: GenerateProjectOptions) -> Result<()> { let project_path = Path::new(&path); if project_path.exists() { bail!("destination `{}` already exists", project_path.display()); } generate_project(project_path, options, true)?; eprintln!( " ✨ {} {} {}", style("Done!").bold().green(), style("New project created").bold(), style(&project_path.display()).underlined() ); Ok(()) } /// Generate a new cargo project in an existing directory pub fn init_project(path: Option, options: GenerateProjectOptions) -> Result<()> { let project_path = path .map(Into::into) .map_or_else(std::env::current_dir, Ok)?; if project_path.join("pyproject.toml").exists() || project_path.join("Cargo.toml").exists() { bail!("`maturin init` cannot be run on existing projects"); } generate_project(&project_path, options, false)?; eprintln!( " ✨ {} {} {}", style("Done!").bold().green(), style("Initialized project").bold(), style(&project_path.display()).underlined() ); Ok(()) } fn generate_project( project_path: &Path, options: GenerateProjectOptions, overwrite: bool, ) -> Result<()> { let name = if let Some(name) = options.name { name } else { let file_name = project_path.file_name().with_context(|| { format!("Failed to get name from path '{}'", project_path.display()) })?; let temp = file_name .to_str() .context("Filename isn't valid Unicode")? .to_string(); validate_name(temp.as_str()).map_err(|e| anyhow::anyhow!(e))? }; let bindings_items = if options.mixed { vec!["pyo3", "cffi", "uniffi"] } else { vec!["pyo3", "cffi", "uniffi", "bin"] }; let bindings = if let Some(bindings) = options.bindings { bindings } else { let selection = Select::with_theme(&ColorfulTheme::default()) .with_prompt(format!( "🤷 {}\n 📖 {}", style("Which kind of bindings to use?").bold(), style("Documentation: https://maturin.rs/bindings.html").dim() )) .items(&bindings_items) .default(0) .interact()?; bindings_items[selection].to_string() }; let layout = if options.mixed { ProjectLayout::Mixed { src: options.src } } else { ProjectLayout::PureRust }; let generator = ProjectGenerator::new(name, layout, bindings, overwrite)?; generator.generate(project_path) } mod package_name_validations { use once_cell::sync::Lazy; use regex::Regex; // based on: https://github.com/pypi/warehouse/blob/8f79d90a310f0243ab15f52c41de093708a61dfd/warehouse/packaging/models.py#L211C9-L214C10 pub fn pypi_check_name(name: &str) -> anyhow::Result<()> { // The `(?i)` flag was added to make the regex case-insensitive static PATTERN: Lazy = Lazy::new(|| Regex::new(r"^((?i)[A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$").unwrap()); if !PATTERN.is_match(name) { anyhow::bail!("The name `{}` is not a valid package name", name) } Ok(()) } // Based on: https://github.com/rust-lang/cargo/blob/e975158c1b542aa3833fd8584746538c17a6ae55/src/cargo/ops/cargo_new.rs#L169 pub fn cargo_check_name(name: &str) -> anyhow::Result<()> { // Instead of `PackageName::new` which performs these checks in the original cargo code validate_package_name(name)?; if is_keyword(name) { anyhow::bail!( "the name `{}` cannot be used as a package name, it is a Rust keyword", name, ); } if is_conflicting_artifact_name(name) { anyhow::bail!( "the name `{}` cannot be used as a package name, \ it conflicts with cargo's build directory names", name, ); } if name == "test" { anyhow::bail!( "the name `test` cannot be used as a package name, \ it conflicts with Rust's built-in test library", ); } if ["core", "std", "alloc", "proc_macro", "proc-macro"].contains(&name) { eprintln!( "âš ï¸� Warning: the name `{name}` is part of Rust's standard library\n\ It is recommended to use a different name to avoid problems.", ); } if is_windows_reserved(name) { eprintln!( "âš ï¸� Warning: the name `{name}` is a reserved Windows filename\n\ This package will not work on Windows platforms.", ); } if is_non_ascii_name(name) { eprintln!( "âš ï¸� Warning: the name `{name}` contains non-ASCII characters\n\ Non-ASCII crate names are not supported by Rust.", ); } let name_in_lowercase = name.to_lowercase(); if name != name_in_lowercase { eprintln!( "âš ï¸� Warning: the name `{name}` is not snake_case or kebab-case which is recommended for package names, consider `{name_in_lowercase}`" ); } Ok(()) } // Based on: https://github.com/rust-lang/cargo/blob/7b7af3077bff8d60b7f124189bc9de227d3063a9/crates/cargo-util-schemas/src/restricted_names.rs#L42 fn validate_package_name(name: &str) -> anyhow::Result<()> { if name.is_empty() { anyhow::bail!("Package names cannot be empty"); } let mut chars = name.chars(); if let Some(ch) = chars.next() { if ch.is_ascii_digit() { // A specific error for a potentially common case. anyhow::bail!("Package names cannot start with a digit"); } if !(unicode_xid::UnicodeXID::is_xid_start(ch) || ch == '_') { anyhow::bail!( "the first character must be a Unicode XID start character (most letters or `_`)" ); } } for ch in chars { if !(unicode_xid::UnicodeXID::is_xid_continue(ch) || ch == '-') { anyhow::bail!( "characters must be Unicode XID characters (numbers, `-`, `_`, or most letters)" ); } } Ok(()) } // The following functions are based on https://github.com/rust-lang/cargo/blob/e975158c1b542aa3833fd8584746538c17a6ae55/src/cargo/util/restricted_names.rs /// Returns `true` if the name contains non-ASCII characters. pub fn is_non_ascii_name(name: &str) -> bool { name.chars().any(|ch| ch > '\x7f') } /// A Rust keyword. pub fn is_keyword(name: &str) -> bool { // See https://doc.rust-lang.org/reference/keywords.html [ "Self", "abstract", "as", "async", "await", "become", "box", "break", "const", "continue", "crate", "do", "dyn", "else", "enum", "extern", "false", "final", "fn", "for", "if", "impl", "in", "let", "loop", "macro", "match", "mod", "move", "mut", "override", "priv", "pub", "ref", "return", "self", "static", "struct", "super", "trait", "true", "try", "type", "typeof", "unsafe", "unsized", "use", "virtual", "where", "while", "yield", ] .contains(&name) } /// These names cannot be used on Windows, even with an extension. pub fn is_windows_reserved(name: &str) -> bool { [ "con", "prn", "aux", "nul", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9", ] .contains(&name.to_ascii_lowercase().as_str()) } /// An artifact with this name will conflict with one of Cargo's build directories. pub fn is_conflicting_artifact_name(name: &str) -> bool { ["deps", "examples", "build", "incremental"].contains(&name) } } maturin-1.16.0/src/pgo.rs000066400000000000000000000357101527064705700152230ustar00rootroot00000000000000use crate::develop::install_backend::{find_uv_bin, find_uv_python}; use crate::{PythonInterpreter, Target}; use anyhow::{Context, Result, bail}; use fs_err as fs; use std::path::{Path, PathBuf}; use std::process::Command; use tempfile::TempDir; use tracing::debug; /// The current phase of a PGO build #[derive(Debug, Clone)] pub enum PgoPhase { /// Instrumented build: `-Cprofile-generate=` Generate(PathBuf), /// Optimized build: `-Cprofile-use=` Use(PathBuf), } /// Manages the PGO profiling environment: profdata directory, llvm-profdata /// resolution, instrumentation execution, and profile merging. /// /// Build orchestration (the three-phase PGO loop) lives in /// [`BuildOrchestrator`](crate::BuildOrchestrator); this struct is only /// responsible for the profiling toolchain mechanics. pub struct PgoContext { /// Temporary directory for .profraw files profdata_dir: TempDir, /// Path to the merged .profdata file merged_profdata: PathBuf, /// The instrumentation command to run pgo_command: String, } impl PgoContext { /// Create a new PGO context with a temporary directory for profile data pub(crate) fn new(pgo_command: String) -> Result { let profdata_dir = TempDir::new().context("Failed to create temporary directory for PGO profdata")?; let merged_profdata = profdata_dir.path().join("merged.profdata"); Ok(Self { profdata_dir, merged_profdata, pgo_command, }) } /// Returns the path to the profdata directory pub(crate) fn profdata_dir_path(&self) -> &Path { self.profdata_dir.path() } /// Returns the path to the merged profdata file pub(crate) fn merged_profdata_path(&self) -> &Path { &self.merged_profdata } /// Find the `llvm-profdata` binary. /// /// Strategy: /// 1. Look in the rustup toolchain sysroot /// 2. Fall back to PATH pub(crate) fn find_llvm_profdata() -> Result { // Try rustup toolchain first if let Ok(path) = Self::find_llvm_profdata_from_rustup() { return Ok(path); } // Fall back to PATH let profdata_name = format!("llvm-profdata{}", std::env::consts::EXE_SUFFIX); if let Ok(output) = Command::new(&profdata_name).arg("--version").output() && output.status.success() { debug!("Found llvm-profdata in PATH"); return Ok(PathBuf::from(profdata_name)); } bail!( "Could not find `llvm-profdata`. Install it with:\n\ \n rustup component add llvm-tools\n" ) } fn find_llvm_profdata_from_rustup() -> Result { let sysroot_output = Command::new("rustc") .arg("--print") .arg("sysroot") .output() .context("Failed to run `rustc --print sysroot`")?; if !sysroot_output.status.success() { bail!("rustc --print sysroot failed"); } let sysroot = std::str::from_utf8(&sysroot_output.stdout) .context("Invalid UTF-8 from rustc --print sysroot")? .trim(); let verbose_output = Command::new("rustc") .arg("-vV") .output() .context("Failed to run `rustc -vV`")?; if !verbose_output.status.success() { bail!("rustc -vV failed"); } let verbose = std::str::from_utf8(&verbose_output.stdout).context("Invalid UTF-8 from rustc -vV")?; let host = verbose .lines() .find_map(|line| line.strip_prefix("host: ")) .context("Could not determine host triple from `rustc -vV`")?; let profdata_name = format!("llvm-profdata{}", std::env::consts::EXE_SUFFIX); let profdata_path = PathBuf::from(sysroot) .join("lib") .join("rustlib") .join(host) .join("bin") .join(profdata_name); if profdata_path.exists() { debug!("Found llvm-profdata at {}", profdata_path.display()); return Ok(profdata_path); } bail!("llvm-profdata not found at {}", profdata_path.display()) } /// Run the PGO instrumentation workload. /// /// 1. Create a temporary venv (using `uv` when available, otherwise `python -m venv`) /// 2. Install the instrumented wheel /// 3. Install dependencies /// 4. Run the instrumentation command pub(crate) fn run_instrumentation( &self, python: &PythonInterpreter, wheel_path: &Path, build_context: &crate::BuildContext, ) -> Result<()> { let venv_dir = TempDir::new().context("Failed to create temporary venv directory")?; let venv_path = venv_dir.path(); // Detect uv: try the binary first, then the Python module let uv = find_uv_python(&python.executable) .or_else(|_| find_uv_bin()) .ok(); // Create venv if let Some((uv_path, uv_args)) = &uv { debug!("Creating venv with uv"); let status = Command::new(uv_path) .args(uv_args.iter().copied()) .args(["venv", "--python"]) .arg(python.as_uv_python_arg()) .arg(venv_path) .status() .context("Failed to create virtual environment with uv")?; if !status.success() { bail!("Failed to create virtual environment with uv (exit status: {status})"); } } else if python.runnable { let status = Command::new(&python.executable) .args(["-m", "venv"]) .arg(venv_path) .status() .context("Failed to create virtual environment")?; if !status.success() { bail!("Failed to create virtual environment (exit status: {status})"); } } else { bail!( "Python interpreter {} is not runnable, cannot create virtual environment for PGO instrumentation", python.executable.display() ); } debug!("Created temporary venv at {}", venv_path.display()); let host_target = Target::from_target_triple(None)?; let venv_python = host_target.get_venv_python(venv_path); let venv_bin_dir = host_target.get_venv_bin_dir(venv_path); let project_dir = build_context.project.project_layout.project_root.as_path(); // Install the instrumented wheel eprintln!("📦 Installing instrumented wheel into temporary venv..."); let status = self.pip_install( &uv, &venv_python, &["--force-reinstall", "--no-deps"], &[wheel_path], )?; if !status.success() { bail!("Failed to install instrumented wheel (exit status: {status})"); } // Install requires_dist dependencies if !build_context.project.metadata24.requires_dist.is_empty() { debug!("Installing requires_dist dependencies"); let deps: Vec = build_context .project .metadata24 .requires_dist .iter() .map(|x| x.to_string()) .collect(); let dep_refs: Vec<&Path> = deps.iter().map(|s| Path::new(s.as_str())).collect(); let status = self.pip_install(&uv, &venv_python, &[], &dep_refs)?; if !status.success() { bail!("Failed to install dependencies (exit status: {status})"); } } // Install the configured PGO dependency group, defaulting to `dev`. // With uv, export the group first so the project's lockfile is respected // without syncing away the already-installed instrumented wheel. let dependency_group = build_context .project .pyproject_toml .as_ref() .and_then(|p| p.pgo_dependency_group()) .unwrap_or("dev"); let has_dependency_group = build_context .project .pyproject_toml .as_ref() .and_then(|p| p.dependency_groups.as_ref()) .is_some_and(|dg| dg.0.contains_key(dependency_group)); if has_dependency_group { if let Some((uv_path, uv_args)) = &uv { let requirements_path = venv_path.join("pgo-requirements.txt"); debug!("Exporting {dependency_group} dependency group with uv"); let status = Command::new(uv_path) .args(uv_args.iter().copied()) .args(["export", "--group", dependency_group, "--no-emit-workspace"]) .args(["--no-hashes", "--no-header", "--no-annotate", "-o"]) .arg(&requirements_path) .current_dir(project_dir) .status() .context("Failed to export PGO dependency group with uv")?; if !status.success() { eprintln!( "âš ï¸� Warning: failed to export {dependency_group} dependency group with uv" ); } else { debug!("Installing {dependency_group} dependency group from uv export"); let status = self.pip_install( &uv, &venv_python, &["-r"], &[requirements_path.as_path()], )?; if !status.success() { eprintln!( "âš ï¸� Warning: failed to install {dependency_group} dependency group" ); } } } else { let pyproject_group = format!( "{}:{dependency_group}", dunce::simplified(&build_context.project.pyproject_toml_path).display() ); debug!("Installing {dependency_group} dependency group"); let status = Command::new(&venv_python) .args(["-m", "pip", "install", "--group", &pyproject_group]) .status() .context("Failed to install PGO dependency group")?; if !status.success() { eprintln!( "âš ï¸� Warning: failed to install {dependency_group} dependency group \ (pip >= 25.1 required for --group support)" ); } } } eprintln!("ðŸ�ƒ Running instrumentation command: {}", self.pgo_command); let profraw_pattern = self .profdata_dir .path() .join("%m_%p.profraw") .to_string_lossy() .to_string(); let current_path = std::env::var("PATH").unwrap_or_default(); let sep = if host_target.is_windows() { ";" } else { ":" }; let path_env = format!("{}{sep}{current_path}", venv_bin_dir.display()); // Run through the system shell with the venv's bin dir prepended to PATH, // so that `python`, `pytest`, etc. resolve to the venv's copies. let mut cmd = if cfg!(windows) { let mut cmd = Command::new("cmd"); cmd.args(["/C", &self.pgo_command]); cmd } else { let mut cmd = Command::new("sh"); cmd.args(["-c", &self.pgo_command]); cmd }; cmd.current_dir(project_dir) .env("LLVM_PROFILE_FILE", &profraw_pattern) .env("PATH", &path_env) .env("VIRTUAL_ENV", venv_path) .env("UV_PYTHON", &venv_python); let status = cmd.status().with_context(|| { format!( "Failed to run PGO instrumentation command: {}", self.pgo_command ) })?; if !status.success() { bail!( "PGO instrumentation command failed (exit status: {}): {}", status, self.pgo_command ); } eprintln!("✅ PGO instrumentation completed successfully"); Ok(()) } /// Run `pip install` or `uv pip install` depending on what's available. fn pip_install( &self, uv: &Option<(PathBuf, Vec<&'static str>)>, venv_python: &Path, extra_args: &[&str], packages: &[&Path], ) -> Result { let status = if let Some((uv_path, uv_args)) = uv { Command::new(uv_path) .args(uv_args.iter().copied()) .args(["pip", "install", "--python"]) .arg(venv_python) .args(extra_args) .args(packages) .status() .context("Failed to run uv pip install")? } else { Command::new(venv_python) .args(["-m", "pip", "install"]) .args(extra_args) .args(packages) .status() .context("Failed to run pip install")? }; Ok(status) } /// Merge .profraw files into a single .profdata file pub(crate) fn merge_profiles(&self) -> Result<()> { eprintln!("🔗 Merging PGO profiles..."); let llvm_profdata = Self::find_llvm_profdata()?; // Collect .profraw files, propagating any IO errors let profraws: Vec = fs::read_dir(self.profdata_dir.path()) .context("Failed to read profdata directory")? .collect::, _>>() .context("Failed to read entry in profdata directory")? .into_iter() .map(|e| e.path()) .filter(|path| path.extension().is_some_and(|ext| ext == "profraw")) .collect(); if profraws.is_empty() { bail!( "PGO instrumentation completed but no .profraw files were generated.\n\ Make sure the instrumentation command exercises the compiled code." ); } debug!("Found {} .profraw file(s) to merge", profraws.len()); let status = Command::new(&llvm_profdata) .arg("merge") .arg("-o") .arg(&self.merged_profdata) .args(&profraws) .status() .with_context(|| format!("Failed to run `{} merge`", llvm_profdata.display()))?; if !status.success() { bail!("llvm-profdata merge failed (exit status: {})", status); } if !self.merged_profdata.exists() { bail!( "Merged profdata file not found at {}", self.merged_profdata.display() ); } let metadata = fs::metadata(&self.merged_profdata) .context("Failed to read merged profdata metadata")?; debug!( "Merged profdata: {} ({} bytes)", self.merged_profdata.display(), metadata.len() ); eprintln!("✅ Merged PGO profiles successfully"); Ok(()) } } maturin-1.16.0/src/project_layout.rs000066400000000000000000000515251527064705700175030ustar00rootroot00000000000000use crate::cargo_options::CargoOptions; use crate::{CargoToml, Metadata24, PyProjectToml}; use anyhow::{Context, Result, bail, format_err}; use cargo_metadata::{Metadata, MetadataCommand}; use normpath::PathExt as _; use std::collections::HashSet; use std::env; use std::io; use std::path::{Path, PathBuf}; use tracing::{debug, instrument, warn}; const PYPROJECT_TOML: &str = "pyproject.toml"; /// Whether this project is pure rust or rust mixed with python and whether it has wheel data #[derive(Clone, Debug, PartialEq, Eq)] pub struct ProjectLayout { /// Contains the absolute path to the project root directory pub project_root: PathBuf, /// Contains the absolute path to the python source directory pub python_dir: PathBuf, /// Contains the canonicalized (i.e. absolute) path to the python part of the project /// If none, we have a rust crate compiled into a shared library with only some glue python for cffi /// If some, we have a python package that is extended by a native rust module. pub python_module: Option, /// Python packages to include pub python_packages: Vec, /// Contains the canonicalized (i.e. absolute) path to the rust part of the project pub rust_module: PathBuf, /// Rust extension name pub extension_name: String, /// The location of the wheel data, if any pub data: Option, } /// Project resolver #[derive(Clone, Debug)] pub struct ProjectResolver { /// Project layout pub project_layout: ProjectLayout, /// Cargo.toml path pub cargo_toml_path: PathBuf, /// Parsed Cargo.toml pub cargo_toml: CargoToml, /// pyproject.toml path pub pyproject_toml_path: PathBuf, /// Parsed pyproject.toml pub pyproject_toml: Option, /// Rust module name pub module_name: String, /// Python Package Metadata 2.3 pub metadata24: Metadata24, /// Cargo options pub cargo_options: CargoOptions, /// Cargo.toml as resolved by [cargo_metadata] pub cargo_metadata: Metadata, /// maturin options specified in pyproject.toml pub pyproject_toml_maturin_options: Vec<&'static str>, } impl ProjectResolver { /// Resolve project layout pub fn resolve( cargo_manifest_path: Option, mut cargo_options: CargoOptions, editable_install: bool, pyproject_toml_path: Option, ) -> Result { let (manifest_file, pyproject_file) = if let Some(pyproject_path) = pyproject_toml_path { // When an explicit pyproject.toml path is provided (e.g. from an // unpacked sdist), use it directly instead of discovering it by // walking up from the manifest. This is needed when the Cargo // crate is excluded from the workspace and the pyproject.toml // lives outside the cargo workspace boundary. let cargo_toml = cargo_manifest_path .expect("manifest_path must be set when pyproject_toml_path is provided"); let cargo_toml = cargo_toml .normalize() .with_context(|| { format!( "manifest path `{}` does not exist or is invalid", cargo_toml.display() ) })? .into_path_buf(); (cargo_toml, pyproject_path) } else { Self::resolve_manifest_paths(cargo_manifest_path, &cargo_options)? }; if !manifest_file.is_file() { bail!( "{} is not the path to a Cargo.toml", manifest_file.display() ); } // Sanity checks in debug build debug_assert!( manifest_file.is_absolute(), "manifest_file {} is not absolute", manifest_file.display() ); debug_assert!( pyproject_file.is_absolute(), "pyproject_file {} is not absolute", pyproject_file.display() ); // Set Cargo manifest path cargo_options.manifest_path = Some(manifest_file.clone()); let cargo_toml = CargoToml::from_path(&manifest_file)?; cargo_toml.check_removed_python_metadata()?; let manifest_dir = manifest_file.parent().unwrap(); let pyproject_toml: Option = if pyproject_file.is_file() { let pyproject = PyProjectToml::new(&pyproject_file)?; pyproject.warn_bad_maturin_version(); pyproject.warn_missing_build_backend(); Some(pyproject) } else { None }; let pyproject = pyproject_toml.as_ref(); let tool_maturin = pyproject.and_then(|p| p.maturin()); let pyproject_toml_maturin_options = if let Some(tool_maturin) = tool_maturin { cargo_options.merge_with_pyproject_toml(tool_maturin.clone(), editable_install) } else { Vec::new() }; let cargo_metadata = Self::resolve_cargo_metadata(&manifest_file, &cargo_options)?; let mut metadata24 = Metadata24::from_cargo_toml(manifest_dir, &cargo_metadata) .context("Failed to parse Cargo.toml into python metadata")?; if let Some(pyproject) = pyproject { let pyproject_dir = pyproject_file.parent().unwrap(); let workspace_root = cargo_metadata.workspace_root.as_std_path(); let allowed_metadata_root = if pyproject_dir.starts_with(workspace_root) { workspace_root } else { pyproject_dir }; metadata24.merge_pyproject_toml_with_metadata_root( pyproject_dir, allowed_metadata_root, pyproject, )?; } let crate_name = &cargo_toml.package.name; // If the package name contains minuses, you must declare a module with // underscores as lib name // Precedence: // * Explicitly declared pyproject.toml `tool.maturin.module-name` // * Cargo.toml `lib.name` // * pyproject.toml `project.name` // * Cargo.toml `package.name` let module_name = pyproject .and_then(|x| x.module_name()) .or(cargo_toml.lib.as_ref().and_then(|lib| lib.name.as_deref())) .or(pyproject .and_then(|pyproject| pyproject.project.as_ref()) .map(|project| project.name.as_str())) .unwrap_or(crate_name) .to_owned(); let project_root = if pyproject_file.is_file() { pyproject_file.parent().unwrap_or(manifest_dir) } else { manifest_dir }; let python_packages = pyproject .and_then(|x| x.python_packages()) .unwrap_or_default() .to_vec(); let py_root = match pyproject.and_then(|x| x.python_source()) { Some(py_src) => project_root .join(py_src) .normalize() .with_context(|| { format!( "python-source is set to `{}` but the directory does not exist. \ Either create the directory or remove the `python-source` setting \ from pyproject.toml.", py_src.display() ) })? .into_path_buf(), None => match pyproject.and_then(|x| x.project_name()) { Some(project_name) => { // Detect src layout let rust_cargo_toml_found = project_root.join("rust").join("Cargo.toml").is_file(); let import_name = project_name.replace('-', "_"); let mut package_init = HashSet::new(); package_init.insert( project_root .join("src") .join(import_name) .join("__init__.py"), ); for package in &python_packages { package_init .insert(project_root.join("src").join(package).join("__init__.py")); } let python_src_found = package_init.iter().any(|x| x.is_file()); if rust_cargo_toml_found && python_src_found { project_root.join("src") } else { project_root.to_path_buf() } } None => project_root.to_path_buf(), }, }; let data = pyproject.and_then(|x| x.data()).map(|data| { if data.is_absolute() { data.to_path_buf() } else { project_root.join(data) } }); let custom_python_source = pyproject.and_then(|x| x.python_source()).is_some(); let project_layout = ProjectLayout::determine( project_root, &module_name, py_root, python_packages, data, custom_python_source, )?; Ok(Self { project_layout, cargo_toml_path: manifest_file, cargo_toml, pyproject_toml_path: pyproject_file, pyproject_toml, module_name, metadata24, cargo_options, cargo_metadata, pyproject_toml_maturin_options, }) } /// Get cargo manifest file path and pyproject.toml path fn resolve_manifest_paths( cargo_manifest_path: Option, cargo_options: &CargoOptions, ) -> Result<(PathBuf, PathBuf)> { // use command line argument if specified if let Some(path) = cargo_manifest_path { let path = path .normalize() .with_context(|| { format!( "manifest path `{}` does not exist or is invalid", path.display() ) })? .into_path_buf(); debug!( "Using cargo manifest path from command line argument: {:?}", path ); let workspace_root = Self::resolve_cargo_metadata(&path, cargo_options)?.workspace_root; let workspace_parent = workspace_root.parent().unwrap_or(&workspace_root); for parent in path.ancestors().skip(1) { // Allow looking outside to the parent directory of Cargo workspace root if !dunce::simplified(parent).starts_with(workspace_parent) { break; } let pyproject_file = parent.join(PYPROJECT_TOML); if pyproject_file.is_file() { debug!("Found pyproject.toml at {:?}", pyproject_file); return Ok((path, pyproject_file)); } } let pyproject_file = path.parent().unwrap().join(PYPROJECT_TOML); debug!("Trying pyproject.toml at {:?}", pyproject_file); return Ok((path, pyproject_file)); } // check `manifest-path` option in pyproject.toml let current_dir = env::current_dir() .context("Failed to detect current directory ಠ_ಠ")? .normalize()? .into_path_buf(); let pyproject_file = current_dir.join(PYPROJECT_TOML); if pyproject_file.is_file() { debug!( "Found pyproject.toml in working directory at {:?}", pyproject_file ); let pyproject = PyProjectToml::new(&pyproject_file)?; if let Some(path) = pyproject.manifest_path() { debug!("Using cargo manifest path from pyproject.toml {:?}", path); return Ok(( path.normalize() .with_context(|| { format!( "manifest path `{}` does not exist or is invalid", path.display() ) })? .into_path_buf(), pyproject_file, )); } else { // Detect src layout: // // my-project // ├── README.md // ├── pyproject.toml // ├── src // │ └── my_project // │ ├── __init__.py // │ └── bar.py // └── rust // ├── Cargo.toml // └── src // └── lib.rs let path = current_dir.join("rust").join("Cargo.toml"); if path.is_file() { debug!("Python first src-layout detected"); if pyproject.python_source().is_some() { // python source directory is specified in pyproject.toml return Ok((path, pyproject_file)); } else if let Some(project_name) = pyproject.project_name() { // Check if python source directory in `src/` let import_name = project_name.replace('-', "_"); let mut package_init = HashSet::new(); package_init.insert( current_dir .join("src") .join(import_name) .join("__init__.py"), ); for package in pyproject.python_packages().unwrap_or_default() { package_init .insert(current_dir.join("src").join(package).join("__init__.py")); } if package_init.iter().any(|x| x.is_file()) { return Ok((path, pyproject_file)); } } } } } // check Cargo.toml in current directory let path = current_dir.join("Cargo.toml"); if path.exists() { debug!( "Using cargo manifest path from working directory: {:?}", path ); Ok((path, current_dir.join(PYPROJECT_TOML))) } else { Err(format_err!( "Can't find {} (in {})", path.display(), current_dir.display() )) } } #[instrument(skip_all)] fn resolve_cargo_metadata( manifest_path: &Path, cargo_options: &CargoOptions, ) -> Result { debug!("Resolving cargo metadata from {:?}", manifest_path); let cargo_metadata_extra_args = cargo_options.cargo_metadata_args()?; let result = MetadataCommand::new() // Force resolving metadata using cargo instead of instead of $CARGO env var // to avoid getting wrong file path like target directory, for example `cross` would // output paths in docker while we want paths on host. .cargo_path("cargo") .manifest_path(manifest_path) .verbose(true) .other_options(cargo_metadata_extra_args) .exec(); let cargo_metadata = match result { Ok(cargo_metadata) => cargo_metadata, Err(cargo_metadata::Error::Io(inner)) if inner.kind() == io::ErrorKind::NotFound => { // NotFound is the specific error when cargo is not in PATH return Err(inner) .context("Cargo metadata failed. Do you have cargo in your PATH?"); } Err(err) => { return Err(err) .context("Cargo metadata failed. Does your crate compile with `cargo build`?"); } }; Ok(cargo_metadata) } } impl ProjectLayout { /// Directory the wheel's contents are resolved against, for a mixed python/rust project. /// /// `None` for a pure Rust project, where there is no python source tree to be relative to. pub fn base_path(&self) -> Option { self.python_module .as_ref() .map(|python_module| python_module.parent().unwrap().to_path_buf()) } /// Directory holding the extension module, relative to the root of the wheel. /// /// For `module-name = "a.b.c"` in a mixed project this is `a/b`, so that anything placed /// alongside the extension — the `.so`, its type stubs — lands in the same package the /// extension is imported from. For a pure Rust project it is the extension name, which is the /// package maturin generates around it. pub fn module_dir(&self) -> PathBuf { match self.base_path() { Some(base_path) => self .rust_module .strip_prefix(base_path) .unwrap() .to_path_buf(), None => PathBuf::from(&self.extension_name), } } /// Checks whether a python module exists besides Cargo.toml with the right name fn determine( project_root: &Path, module_name: &str, python_root: PathBuf, python_packages: Vec, data: Option, custom_python_source: bool, ) -> Result { // A dot in the module name means the extension module goes into the module folder specified by the path let parts: Vec<&str> = module_name.split('.').collect(); let (python_module, rust_module, extension_name) = if parts.len() > 1 { let mut rust_module = python_root.clone(); rust_module.extend(&parts[0..parts.len() - 1]); ( python_root.join(parts[0]), rust_module, parts[parts.len() - 1].to_string(), ) } else { ( python_root.join(module_name), python_root.join(module_name), module_name.to_string(), ) }; // If no __init__.py exists, we can't treat it as python source module, // it could be a Rust crate with the same name as the module. let python_module = if !python_module.join("__init__.py").is_file() && python_module.join("Cargo.toml").is_file() { debug!("No __init__.py file found in {}", python_module.display()); None } else { Some(python_module) }; debug!( project_root = %project_root.display(), python_dir = %python_root.display(), rust_module = %rust_module.display(), python_module = ?python_module, extension_name = %extension_name, module_name = %module_name, "Project layout resolved" ); let data = if let Some(data) = data { if !data.is_dir() { bail!("No such data directory {}", data.display()); } Some(data) } else if project_root.join(format!("{module_name}.data")).is_dir() { Some(project_root.join(format!("{module_name}.data"))) } else { None }; if let Some(python_module) = python_module { if python_module.is_dir() { eprintln!("ðŸ�¹ Building a mixed python/rust project"); Ok(ProjectLayout { project_root: project_root.to_path_buf(), python_dir: python_root, python_packages, python_module: Some(python_module), rust_module, extension_name, data, }) } else { if custom_python_source { bail!( "python-source is set to `{}`, but the python module at `{}` \ does not exist. Either create the Python module or remove the \ `python-source` setting from pyproject.toml.", python_root.display(), python_module.display() ); } Ok(ProjectLayout { project_root: project_root.to_path_buf(), python_dir: python_root, python_packages, python_module: None, rust_module: project_root.to_path_buf(), extension_name, data, }) } } else { Ok(ProjectLayout { project_root: project_root.to_path_buf(), python_dir: python_root, python_packages, python_module: None, rust_module: project_root.to_path_buf(), extension_name, data, }) } } } maturin-1.16.0/src/pyproject_toml.rs000066400000000000000000001372521527064705700175140ustar00rootroot00000000000000//! A pyproject.toml as specified in PEP 517 use crate::CompatibilityTag; use crate::auditwheel::AuditWheelMode; use crate::bridge::Bindings; use anyhow::{Context, Result}; use fs_err as fs; use pep440_rs::{Version, VersionSpecifiers}; use pep508_rs::VersionOrUrl; use pyproject_toml::{BuildSystem, Project}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::path::{Path, PathBuf}; use std::str::FromStr; /// The `[tool]` section of a pyproject.toml #[derive(Serialize, Deserialize, Debug, Clone, Default)] #[serde(rename_all = "kebab-case")] pub struct Tool { /// maturin options pub maturin: Option, } #[derive(Copy, Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] #[serde(rename_all = "lowercase")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] /// The target format for the include or exclude [GlobPattern]. /// /// See [Formats]. pub enum Format { /// Source distribution Sdist, /// Wheel Wheel, } #[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] #[serde(untagged)] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] /// A single [Format] or multiple [Format] values for a [GlobPattern]. pub enum Formats { /// A single [Format] value Single(Format), /// Multiple [Format] values Multiple(Vec), } impl Formats { /// Returns `true` if the inner [Format] value(s) target the given [Format] pub fn targets(&self, format: Format) -> bool { match self { Self::Single(val) if val == &format => true, Self::Multiple(formats) if formats.contains(&format) => true, _ => false, } } } #[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] #[serde(untagged)] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] /// A glob pattern for the include and exclude configuration. /// /// See [PyProjectToml::include] and [PyProject::exclude]. /// /// Based on . pub enum GlobPattern { /// A glob Path(String), /// A glob `path` with a `format` key to specify one or more [Format] values WithFormat { /// A glob path: String, /// One or more [Format] values format: Formats, }, /// A glob `path` relative to a crate's OUT_DIR WithOutDir { /// A glob pattern relative to OUT_DIR path: String, /// Source: must be "out-dir" from: IncludeFrom, /// Target path in wheel (e.g. "my_package/") to: String, /// Optional crate name (defaults to the root crate) #[serde(default)] crate_name: Option, }, } /// Supported values for the `from` field in include patterns. #[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] #[serde(rename_all = "kebab-case")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] pub enum IncludeFrom { /// Include files from the crate's OUT_DIR OutDir, } /// Information about an out-dir include pattern. pub struct OutDirInclude<'a> { /// Glob pattern relative to OUT_DIR pub path: &'a str, /// Target path prefix in wheel pub to: &'a str, /// Optional crate name (defaults to root crate) pub crate_name: Option<&'a str>, } impl GlobPattern { /// Returns the glob pattern for this pattern if it targets the given [Format], else this returns `None`. pub fn targets(&self, format: Format) -> Option<&str> { match self { // Not specified defaults to both Self::Path(glob) => Some(glob), Self::WithFormat { path, format: formats, } if formats.targets(format) => Some(path), // WithOutDir is handled separately, never matched here Self::WithOutDir { .. } => None, _ => None, } } /// Returns the out-dir include info if this is a `WithOutDir` pattern. pub fn as_out_dir_include(&self) -> Option> { match self { Self::WithOutDir { path, to, crate_name, .. } => Some(OutDirInclude { path, to, crate_name: crate_name.as_deref(), }), _ => None, } } } /// Cargo compile target #[derive(Serialize, Deserialize, Debug, Clone, Default)] #[serde(rename_all = "kebab-case")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] pub struct CargoTarget { /// Name as given in the `Cargo.toml` or generated from the file name pub name: String, /// Kind of target ("bin", "cdylib") pub kind: Option, // TODO: Add bindings option // Bridge model, which kind of bindings to use // pub bindings: Option, } /// Supported cargo crate types #[derive(Serialize, Deserialize, Debug, Clone, Copy)] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] pub enum CargoCrateType { /// Binary executable target #[serde(rename = "bin")] Bin, /// Dynamic system library target #[serde(rename = "cdylib")] CDyLib, /// Dynamic Rust library target #[serde(rename = "dylib")] DyLib, /// Rust library #[serde(rename = "lib")] Lib, /// Rust library for use as an intermediate target #[serde(rename = "rlib")] RLib, /// Static library #[serde(rename = "staticlib")] StaticLib, } impl From for cargo_metadata::CrateType { fn from(value: CargoCrateType) -> Self { match value { CargoCrateType::Bin => cargo_metadata::CrateType::Bin, CargoCrateType::CDyLib => cargo_metadata::CrateType::CDyLib, CargoCrateType::DyLib => cargo_metadata::CrateType::DyLib, CargoCrateType::Lib => cargo_metadata::CrateType::Lib, CargoCrateType::RLib => cargo_metadata::CrateType::RLib, CargoCrateType::StaticLib => cargo_metadata::CrateType::StaticLib, } } } /// Target configuration #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(rename_all = "kebab-case")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] pub struct TargetConfig { /// macOS deployment target version #[serde(alias = "macosx-deployment-target")] pub macos_deployment_target: Option, } /// Source distribution generator #[derive(Serialize, Deserialize, Debug, Clone, Copy, Default)] #[serde(rename_all = "kebab-case")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] pub enum SdistGenerator { /// Use `cargo package --list` #[default] Cargo, /// Use `git ls-files` Git, } /// SBOM configuration #[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq, Eq)] #[serde(rename_all = "kebab-case")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] pub struct SbomConfig { /// Generate an SBOM for Rust crates. Defaults to `true`. pub rust: Option, /// Generate a CycloneDX SBOM for external shared libraries grafted during /// auditwheel repair. Defaults to `true` when repair copies libraries. /// /// The SBOM is written to `/sboms/auditwheel.cdx.json` and /// records which OS packages (deb, rpm, apk) provided the grafted /// libraries, following the same convention as Python's auditwheel. pub auditwheel: Option, /// Additional SBOM files to include in the `.dist-info/sboms` directory. pub include: Option>, } /// A cargo feature specification that can be either a plain feature name /// or a conditional feature that is only enabled for certain Python versions. /// /// # Examples /// /// ```toml /// [tool.maturin] /// features = [ /// "some-feature", /// { feature = "pyo3/abi3-py311", python-version = ">=3.11" }, /// { feature = "pyo3/abi3-py38", python-version = "<3.11" }, /// { feature = "pyo3/abi3-py311", python-version = ">=3.11", python-implementation = "cpython" }, /// { feature = "pypy-compat", python-implementation = "pypy" }, /// ] /// ``` #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(untagged)] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] pub enum FeatureSpec { /// A plain feature name, always enabled Plain(String), /// A feature enabled only when the conditions match Conditional { /// The cargo feature to enable feature: String, /// PEP 440 version specifier for the target Python version, e.g. ">=3.11" #[serde( rename = "python-version", default, skip_serializing_if = "Option::is_none" )] #[cfg_attr(feature = "schemars", schemars(with = "Option"))] python_version: Option, /// Python implementation name, e.g. "cpython", "pypy", "graalpy" #[serde( rename = "python-implementation", default, skip_serializing_if = "Option::is_none" )] python_implementation: Option, }, } /// A conditional feature with its matching criteria. #[derive(Debug, Clone, PartialEq, Eq)] pub struct ConditionalFeature { /// The cargo feature to enable pub feature: String, /// PEP 440 version specifier for the target Python version pub python_version: Option, /// Python implementation name, e.g. "cpython", "pypy", "graalpy" pub python_implementation: Option, } impl FeatureSpec { /// Split a list of feature specs into plain features and conditional features. pub fn split(specs: Vec) -> (Vec, Vec) { let mut plain = Vec::new(); let mut conditional = Vec::new(); for spec in specs { match spec { FeatureSpec::Plain(f) => plain.push(f), FeatureSpec::Conditional { feature, python_version: None, python_implementation: None, } => plain.push(feature), FeatureSpec::Conditional { feature, python_version, python_implementation, } => conditional.push(ConditionalFeature { feature, python_version, python_implementation, }), } } (plain, conditional) } /// Resolve which conditional features should be enabled for the given /// build environment. pub fn resolve_conditional( conditional_features: &[ConditionalFeature], env: &FeatureConditionEnv, ) -> Vec { let python_version = Version::new([env.major as u64, env.minor as u64]); conditional_features .iter() .filter(|f| { f.python_version .as_ref() .is_none_or(|s| s.contains(&python_version)) }) .filter(|f| { f.python_implementation .as_ref() .is_none_or(|i| i.eq_ignore_ascii_case(env.implementation_name)) }) .map(|f| f.feature.clone()) .collect() } } /// The build environment used to evaluate conditional features. /// /// TODO: add fields like `target_os`, `target_arch`, etc. for /// Rust target-based conditions. pub struct FeatureConditionEnv<'a> { /// Python major version pub major: usize, /// Python minor version pub minor: usize, /// Python implementation name, e.g. "cpython", "pypy" pub implementation_name: &'a str, } /// The `[tool.maturin]` section of a pyproject.toml #[derive(Serialize, Deserialize, Debug, Clone, Default)] #[serde(rename_all = "kebab-case")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] pub struct ToolMaturin { // maturin specific options /// Module name, accepts setuptools style import name like `foo.bar` pub module_name: Option, /// Include files matching the given glob pattern(s). /// Patterns are resolved relative to the directory containing `pyproject.toml`. /// When `python-source` is configured, patterns are also tried relative to /// that directory if no matches are found. pub include: Option>, /// Exclude files matching the given glob pattern(s). /// Patterns are resolved relative to the directory containing `pyproject.toml`. pub exclude: Option>, /// Bindings type pub bindings: Option, /// Platform compatibility #[serde(alias = "manylinux")] pub compatibility: Option, /// Audit wheel mode pub auditwheel: Option, /// Skip audit wheel #[serde(default)] pub skip_auditwheel: bool, /// Strip the final binary #[serde(default)] pub strip: bool, /// Source distribution generator #[serde(default)] pub sdist_generator: SdistGenerator, /// The directory with python module, contains `/__init__.py` pub python_source: Option, /// Python packages to include pub python_packages: Option>, /// Path to the wheel directory, defaults to `.data` pub data: Option, /// Cargo compile targets pub targets: Option>, /// Target configuration #[serde(default, rename = "target")] pub target_config: HashMap, // Some customizable cargo options /// Build artifacts with the specified Cargo profile pub profile: Option, /// Same as `profile` but for "editable" builds pub editable_profile: Option, /// List of features to activate. /// Each entry can be a plain feature name string, or a conditional object /// with `feature` and `python-version` keys. pub features: Option>, /// Activate all available features pub all_features: Option, /// Do not activate the `default` feature pub no_default_features: Option, /// Path to Cargo.toml pub manifest_path: Option, /// Require Cargo.lock and cache are up to date pub frozen: Option, /// Require Cargo.lock is up to date pub locked: Option, /// Override a configuration value (unstable) pub config: Option>, /// Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details pub unstable_flags: Option>, /// Additional rustc arguments pub rustc_args: Option>, /// Use base Python executable instead of venv Python executable in PEP 517 build. // // This can help avoid unnecessary rebuilds, as the Python executable does not change // every time. It should not be set when the sdist build requires packages installed // in venv. #[serde(default)] pub use_base_python: bool, /// SBOM configuration pub sbom: Option, /// Include the import library (.dll.lib) in the wheel on Windows #[serde(default)] pub include_import_lib: bool, /// Command to run for PGO profile generation. /// Executed in a temporary virtualenv with the instrumented wheel installed. /// Example: `python -m pytest tests/benchmarks` pub pgo_command: Option, /// Dependency group to install before PGO profile generation. /// Defaults to `dev`. pub pgo_dependency_group: Option, /// CI generation configuration pub generate_ci: Option, } /// The `[tool.maturin.generate-ci]` section #[derive(Serialize, Deserialize, Debug, Clone, Default)] #[serde(rename_all = "kebab-case")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] pub struct GenerateCIConfig { /// GitHub Actions configuration pub github: Option, } /// The `[tool.maturin.generate-ci.github]` section #[derive(Serialize, Deserialize, Debug, Clone, Default)] #[serde(rename_all = "kebab-case")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] pub struct GitHubCIConfig { /// Enable pytest pub pytest: Option, /// Use zig for cross compilation pub zig: Option, /// Skip artifact attestation pub skip_attestation: Option, /// Use PyPI trusted publishing (OpenID Connect) instead of an API token pub trusted_publishing: Option, /// Name of the GitHub Actions environment to use for the release job /// (typically used together with `trusted-publishing = true`) pub publishing_environment: Option, /// Extra arguments to pass to maturin (applies to all platforms) pub args: Option, /// Linux (manylinux) platform configuration pub linux: Option, /// Musllinux platform configuration pub musllinux: Option, /// Windows platform configuration pub windows: Option, /// macOS platform configuration pub macos: Option, /// Emscripten platform configuration pub emscripten: Option, /// Android platform configuration pub android: Option, } /// Shared CI configuration overrides used by both platform-level and /// per-target CI configuration. #[derive(Serialize, Deserialize, Debug, Clone, Default)] #[serde(rename_all = "kebab-case")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] pub struct CIConfigOverrides { /// Runner override pub runner: Option, /// Manylinux version (e.g. "auto", "2_28", "musllinux_1_2") pub manylinux: Option, /// Container image to use pub container: Option, /// Docker options pub docker_options: Option, /// Rust toolchain (e.g. "nightly", "stable") pub rust_toolchain: Option, /// Rustup components to install pub rustup_components: Option, /// Script to run before build on Linux pub before_script_linux: Option, /// Extra arguments to pass to maturin pub args: Option, } /// Per-platform CI configuration #[derive(Serialize, Deserialize, Debug, Clone, Default)] #[serde(rename_all = "kebab-case")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] pub struct PlatformCIConfig { /// Simple list of target architectures (mutually exclusive with `target`) pub targets: Option>, /// Detailed per-target configuration (mutually exclusive with `targets`) pub target: Option>, /// Platform-level overrides #[serde(flatten)] pub overrides: CIConfigOverrides, } /// Per-target CI configuration within a platform #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(rename_all = "kebab-case")] #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] pub struct TargetCIConfig { /// Target architecture (e.g. "x86_64", "aarch64") pub arch: String, /// Per-target overrides #[serde(flatten)] pub overrides: CIConfigOverrides, } /// A pyproject.toml as specified in PEP 517 #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(rename_all = "kebab-case")] pub struct PyProjectToml { /// Build-related data pub build_system: BuildSystem, /// Project metadata pub project: Option, /// PEP 518: The `[tool]` table is where any tool related to your Python project, not just build /// tools, can have users specify configuration data as long as they use a sub-table within /// `[tool]`, e.g. the flit tool would store its configuration in `[tool.flit]`. /// /// We use it for `[tool.maturin]` pub tool: Option, /// PEP 735: Dependency groups pub dependency_groups: Option, } impl PyProjectToml { /// Returns the contents of a pyproject.toml with a `[build-system]` entry or an error /// /// Does no specific error handling because it's only used to check whether or not to build /// source distributions pub fn new(pyproject_file: impl AsRef) -> Result { let path = pyproject_file.as_ref(); let contents = fs::read_to_string(path)?; let pyproject = toml::from_str(&contents).with_context(|| { format!( "pyproject.toml at {} is invalid", pyproject_file.as_ref().display() ) })?; Ok(pyproject) } /// Returns the value of `[project.name]` in pyproject.toml pub fn project_name(&self) -> Option<&str> { self.project.as_ref().map(|project| project.name.as_str()) } /// Returns the values of `[tool.maturin]` in pyproject.toml #[inline] pub fn maturin(&self) -> Option<&ToolMaturin> { self.tool.as_ref()?.maturin.as_ref() } /// Returns the value of `[tool.maturin.module-name]` in pyproject.toml pub fn module_name(&self) -> Option<&str> { self.maturin()?.module_name.as_deref() } /// Returns the value of `[tool.maturin.include]` in pyproject.toml pub fn include(&self) -> Option<&[GlobPattern]> { self.maturin()?.include.as_ref().map(AsRef::as_ref) } /// Returns the value of `[tool.maturin.exclude]` in pyproject.toml pub fn exclude(&self) -> Option<&[GlobPattern]> { self.maturin()?.exclude.as_ref().map(AsRef::as_ref) } /// Returns the value of `[tool.maturin.bindings]` in pyproject.toml pub fn bindings(&self) -> Option { self.maturin()?.bindings } /// Returns the PGO training command from `[tool.maturin]` pub fn pgo_command(&self) -> Option<&str> { self.maturin().and_then(|m| m.pgo_command.as_deref()) } /// Returns the PGO dependency group from `[tool.maturin]` pub fn pgo_dependency_group(&self) -> Option<&str> { self.maturin() .and_then(|m| m.pgo_dependency_group.as_deref()) } /// Returns the value of `[tool.maturin.compatibility]` in pyproject.toml pub fn compatibility(&self) -> Option { self.maturin()?.compatibility } /// Returns the value of `[tool.maturin.auditwheel]` in pyproject.toml pub fn auditwheel(&self) -> Option { self.maturin() .map(|maturin| maturin.auditwheel) .unwrap_or_default() } /// Returns the value of `[tool.maturin.skip-auditwheel]` in pyproject.toml pub fn skip_auditwheel(&self) -> bool { self.maturin() .map(|maturin| maturin.skip_auditwheel) .unwrap_or_default() } /// Returns the value of `[tool.maturin.strip]` in pyproject.toml pub fn strip(&self) -> bool { self.maturin() .map(|maturin| maturin.strip) .unwrap_or_default() } /// Returns the value of `[tool.maturin.sdist-generator]` in pyproject.toml pub fn sdist_generator(&self) -> SdistGenerator { self.maturin() .map(|maturin| maturin.sdist_generator) .unwrap_or_default() } /// Returns the value of `[tool.maturin.python-source]` in pyproject.toml pub fn python_source(&self) -> Option<&Path> { self.maturin() .and_then(|maturin| maturin.python_source.as_deref()) } /// Returns the value of `[tool.maturin.python-packages]` in pyproject.toml pub fn python_packages(&self) -> Option<&[String]> { self.maturin() .and_then(|maturin| maturin.python_packages.as_deref()) } /// Returns the value of `[tool.maturin.data]` in pyproject.toml pub fn data(&self) -> Option<&Path> { self.maturin().and_then(|maturin| maturin.data.as_deref()) } /// Returns the value of `[tool.maturin.targets]` in pyproject.toml pub fn targets(&self) -> Option<&[CargoTarget]> { self.maturin() .and_then(|maturin| maturin.targets.as_deref()) } /// Returns the value of `[tool.maturin.target.]` in pyproject.toml pub fn target_config(&self, target: &str) -> Option<&TargetConfig> { self.maturin() .and_then(|maturin| maturin.target_config.get(target)) } /// Returns the value of `[tool.maturin.manifest-path]` in pyproject.toml pub fn manifest_path(&self) -> Option<&Path> { self.maturin()?.manifest_path.as_deref() } /// Returns the value of `[tool.maturin.include-import-lib]` in pyproject.toml pub fn include_import_lib(&self) -> bool { self.maturin() .map(|maturin| maturin.include_import_lib) .unwrap_or_default() } /// Returns the value of `[tool.maturin.generate-ci]` in pyproject.toml pub fn generate_ci(&self) -> Option<&GenerateCIConfig> { self.maturin()?.generate_ci.as_ref() } /// Warn about `build-system.requires` mismatching expectations. /// /// Having a pyproject.toml without a version constraint is a bad idea /// because at some point we'll have to do breaking changes and then source /// distributions would break. /// /// The second problem we check for is the current maturin version not matching the constraint. /// /// Returns false if a warning was emitted. pub fn warn_bad_maturin_version(&self) -> bool { let maturin = env!("CARGO_PKG_NAME"); let current_major = env!("CARGO_PKG_VERSION_MAJOR").parse::().unwrap(); let self_version = Version::from_str(env!("CARGO_PKG_VERSION")).unwrap(); let requires_maturin = self .build_system .requires .iter() .find(|x| x.name.as_ref() == maturin); if let Some(requires_maturin) = requires_maturin { match requires_maturin.version_or_url.as_ref() { Some(VersionOrUrl::VersionSpecifier(version_specifier)) => { if !version_specifier.contains(&self_version) { eprintln!( "âš ï¸� Warning: You specified {requires_maturin} in pyproject.toml under \ `build-system.requires`, but the current {maturin} version is {self_version}", ); return false; } } Some(VersionOrUrl::Url(_)) => { // We can't check this } None => { eprintln!( "âš ï¸� Warning: Please use {maturin} in pyproject.toml with a version constraint, \ e.g. `requires = [\"{maturin}>={current}.0,<{next}.0\"]`. \ This will become an error.", maturin = maturin, current = current_major, next = current_major + 1, ); return false; } } } true } /// Having a pyproject.toml without `build-backend` set to `maturin` /// may result in build errors when build from source distribution /// /// Returns true if the pyproject.toml has `build-backend` set to `maturin` pub fn warn_missing_build_backend(&self) -> bool { let maturin = env!("CARGO_PKG_NAME"); if self.build_system.build_backend.as_deref() == Some(maturin) { return true; } if std::env::var("MATURIN_NO_MISSING_BUILD_BACKEND_WARNING").is_ok() { return false; } eprintln!( "âš ï¸� Warning: `build-backend` in pyproject.toml is not set to `{maturin}`, \ packaging tools such as pip will not use maturin to build this project." ); false } /// Having a pyproject.toml project table with neither `version` nor `dynamic = ['version']` /// violates https://packaging.python.org/en/latest/specifications/pyproject-toml/#dynamic. /// /// Returns true if version information is specified correctly or no project table is present. pub fn warn_invalid_version_info(&self) -> bool { let Some(project) = &self.project else { return true; }; let has_static_version = project.version.is_some(); let has_dynamic_version = project .dynamic .as_ref() .is_some_and(|d| d.iter().any(|s| s == "version")); if has_static_version && has_dynamic_version { eprintln!( "âš ï¸� Warning: `project.dynamic` must not specify `version` when `project.version` is present in pyproject.toml" ); return false; } if !has_static_version && !has_dynamic_version { eprintln!( "âš ï¸� Warning: `project.version` field is required in pyproject.toml unless it is present in the `project.dynamic` list" ); return false; } true } } #[cfg(test)] mod tests { use crate::{ Bindings, CompatibilityTag, PyProjectToml, pyproject_toml::{ FeatureConditionEnv, FeatureSpec, Format, Formats, GlobPattern, ToolMaturin, }, test_utils::test_crate_path, }; use expect_test::expect; use fs_err as fs; use indoc::indoc; use pretty_assertions::assert_eq; use std::path::Path; use tempfile::TempDir; #[test] fn test_parse_tool_maturin() { let tmp_dir = TempDir::new().unwrap(); let pyproject_file = tmp_dir.path().join("pyproject.toml"); fs::write( &pyproject_file, r#"[build-system] requires = ["maturin"] build-backend = "maturin" [tool.maturin] manylinux = "2010" python-packages = ["foo", "bar"] manifest-path = "Cargo.toml" profile = "dev" features = ["foo", "bar"] no-default-features = true locked = true rustc-args = ["-Z", "unstable-options"] [[tool.maturin.targets]] name = "pyo3_pure" kind = "lib" bindings = "pyo3" [tool.maturin.target."x86_64-apple-darwin"] macos-deployment-target = "10.12" "#, ) .unwrap(); let pyproject = PyProjectToml::new(pyproject_file).unwrap(); assert_eq!(pyproject.manifest_path(), Some(Path::new("Cargo.toml"))); let maturin = pyproject.maturin().unwrap(); assert_eq!(maturin.profile.as_deref(), Some("dev")); assert_eq!( maturin.features, Some(vec![ FeatureSpec::Plain("foo".to_string()), FeatureSpec::Plain("bar".to_string()), ]) ); assert!(maturin.all_features.is_none()); assert_eq!(maturin.no_default_features, Some(true)); assert_eq!(maturin.locked, Some(true)); assert!(maturin.frozen.is_none()); assert_eq!( maturin.rustc_args, Some(vec!["-Z".to_string(), "unstable-options".to_string()]) ); assert_eq!( maturin.python_packages, Some(vec!["foo".to_string(), "bar".to_string()]) ); let targets = maturin.targets.as_ref().unwrap(); assert_eq!("pyo3_pure", targets[0].name); let target_config = pyproject.target_config("x86_64-apple-darwin").unwrap(); assert_eq!( target_config.macos_deployment_target.as_deref(), Some("10.12") ); } #[test] fn test_warn_missing_maturin_version() { let with_constraint = PyProjectToml::new(test_crate_path("pyo3-pure").join("pyproject.toml")).unwrap(); assert!(with_constraint.warn_bad_maturin_version()); let without_constraint_dir = TempDir::new().unwrap(); let pyproject_file = without_constraint_dir.path().join("pyproject.toml"); fs::write( &pyproject_file, r#"[build-system] requires = ["maturin"] build-backend = "maturin" [tool.maturin] manylinux = "2010" "#, ) .unwrap(); let without_constraint = PyProjectToml::new(pyproject_file).unwrap(); assert!(!without_constraint.warn_bad_maturin_version()); } #[test] fn test_warn_incorrect_maturin_version() { let without_constraint_dir = TempDir::new().unwrap(); let pyproject_file = without_constraint_dir.path().join("pyproject.toml"); fs::write( &pyproject_file, r#"[build-system] requires = ["maturin==0.0.1"] build-backend = "maturin" [tool.maturin] manylinux = "2010" "#, ) .unwrap(); let without_constraint = PyProjectToml::new(pyproject_file).unwrap(); assert!(!without_constraint.warn_bad_maturin_version()); } #[test] fn test_warn_invalid_version_info_conflict() { let conflict = toml::from_str::( r#"[build-system] requires = ["maturin==1.0.0"] [project] name = "..." version = "1.2.3" dynamic = ['version'] "#, ) .unwrap(); assert!(!conflict.warn_invalid_version_info()); } #[test] fn test_warn_invalid_version_info_missing() { let missing = toml::from_str::( r#"[build-system] requires = ["maturin==1.0.0"] [project] name = "..." "#, ) .unwrap(); assert!(!missing.warn_invalid_version_info()); } #[test] fn test_warn_invalid_version_info_ok() { let static_ver = toml::from_str::( r#"[build-system] requires = ["maturin==1.0.0"] [project] name = "..." version = "1.2.3" "#, ) .unwrap(); assert!(static_ver.warn_invalid_version_info()); let dynamic_ver = toml::from_str::( r#"[build-system] requires = ["maturin==1.0.0"] [project] name = "..." dynamic = ['version'] "#, ) .unwrap(); assert!(dynamic_ver.warn_invalid_version_info()); } #[test] fn deserialize_include_exclude() { let single = r#"include = ["single"]"#; assert_eq!( toml::from_str::(single).unwrap().include, Some(vec![GlobPattern::Path("single".to_string())]) ); let multiple = r#"include = ["one", "two"]"#; assert_eq!( toml::from_str::(multiple).unwrap().include, Some(vec![ GlobPattern::Path("one".to_string()), GlobPattern::Path("two".to_string()) ]) ); let single_format = r#"include = [{path = "path", format="sdist"}]"#; assert_eq!( toml::from_str::(single_format) .unwrap() .include, Some(vec![GlobPattern::WithFormat { path: "path".to_string(), format: Formats::Single(Format::Sdist) },]) ); let multiple_formats = r#"include = [{path = "path", format=["sdist", "wheel"]}]"#; assert_eq!( toml::from_str::(multiple_formats) .unwrap() .include, Some(vec![GlobPattern::WithFormat { path: "path".to_string(), format: Formats::Multiple(vec![Format::Sdist, Format::Wheel]) },]) ); let mixed = r#"include = ["one", {path = "two", format="sdist"}, {path = "three", format=["sdist", "wheel"]}]"#; assert_eq!( toml::from_str::(mixed).unwrap().include, Some(vec![ GlobPattern::Path("one".to_string()), GlobPattern::WithFormat { path: "two".to_string(), format: Formats::Single(Format::Sdist), }, GlobPattern::WithFormat { path: "three".to_string(), format: Formats::Multiple(vec![Format::Sdist, Format::Wheel]) } ]) ); } #[test] fn test_gh_1615() { let source = indoc!( r#"[build-system] requires = [ "maturin>=0.14", "numpy", "wheel", "patchelf",] build-backend = "maturin" [project] name = "..." license-files = [ "license.txt",] requires-python = ">=3.8" requires-dist = [ "maturin>=0.14", "...",] dependencies = [ "packaging", "...",] zip-safe = false version = "..." readme = "..." description = "..." classifiers = [ "...",] "# ); let temp_dir = TempDir::new().unwrap(); let pyproject_toml = temp_dir.path().join("pyproject.toml"); fs::write(&pyproject_toml, source).unwrap(); let outer_error = PyProjectToml::new(&pyproject_toml).unwrap_err(); let inner_error = outer_error.source().unwrap(); let expected = expect![[r#" TOML parse error at line 10, column 16 | 10 | dependencies = [ "packaging", "...",] | ^^^^^^^^^^^^^^^^^^^^^^ URL requirement must be preceded by a package name. Add the name of the package before the URL (e.g., `package_name @ /path/to/file`). ... ^^^ "#]]; expected.assert_eq(&inner_error.to_string()); } #[test] fn test_resolve_conditional_features() { let specs = vec![ FeatureSpec::Conditional { feature: "pyo3/abi3-py311".to_string(), python_version: Some(">=3.11".parse().unwrap()), python_implementation: None, }, FeatureSpec::Conditional { feature: "pyo3/abi3-py38".to_string(), python_version: Some("<3.11".parse().unwrap()), python_implementation: None, }, FeatureSpec::Conditional { feature: "fast-buffer".to_string(), python_version: Some(">=3.11".parse().unwrap()), python_implementation: None, }, ]; let (_plain, conditional) = FeatureSpec::split(specs); let cpython = |major, minor| FeatureConditionEnv { major, minor, implementation_name: "cpython", }; // Python 3.12 should match >=3.11 let resolved = FeatureSpec::resolve_conditional(&conditional, &cpython(3, 12)); assert_eq!(resolved, vec!["pyo3/abi3-py311", "fast-buffer"]); // Python 3.11 should match >=3.11 let resolved = FeatureSpec::resolve_conditional(&conditional, &cpython(3, 11)); assert_eq!(resolved, vec!["pyo3/abi3-py311", "fast-buffer"]); // Python 3.9 should match <3.11 let resolved = FeatureSpec::resolve_conditional(&conditional, &cpython(3, 9)); assert_eq!(resolved, vec!["pyo3/abi3-py38"]); // Python 3.8 should match <3.11 let resolved = FeatureSpec::resolve_conditional(&conditional, &cpython(3, 8)); assert_eq!(resolved, vec!["pyo3/abi3-py38"]); } #[test] fn test_resolve_conditional_features_with_implementation() { let specs = vec![ FeatureSpec::Conditional { feature: "pyo3/abi3-py311".to_string(), python_version: Some(">=3.11".parse().unwrap()), python_implementation: Some("cpython".to_string()), }, FeatureSpec::Conditional { feature: "pypy-compat".to_string(), python_version: None, python_implementation: Some("pypy".to_string()), }, FeatureSpec::Conditional { feature: "always-conditional".to_string(), python_version: Some(">=3.10".parse().unwrap()), python_implementation: None, }, ]; let (_plain, conditional) = FeatureSpec::split(specs); let env = |major, minor, impl_name| FeatureConditionEnv { major, minor, implementation_name: impl_name, }; // CPython 3.12 should match abi3 and always-conditional let resolved = FeatureSpec::resolve_conditional(&conditional, &env(3, 12, "cpython")); assert_eq!(resolved, vec!["pyo3/abi3-py311", "always-conditional"]); // PyPy 3.10 should match pypy-compat and always-conditional let resolved = FeatureSpec::resolve_conditional(&conditional, &env(3, 10, "pypy")); assert_eq!(resolved, vec!["pypy-compat", "always-conditional"]); // CPython 3.10 should only match always-conditional (not abi3 due to version) let resolved = FeatureSpec::resolve_conditional(&conditional, &env(3, 10, "cpython")); assert_eq!(resolved, vec!["always-conditional"]); // PyPy 3.9 should only match pypy-compat (version too low for always-conditional) let resolved = FeatureSpec::resolve_conditional(&conditional, &env(3, 9, "pypy")); assert_eq!(resolved, vec!["pypy-compat"]); } #[test] fn test_feature_spec_deserialize_mixed() { let toml_str = r#" features = [ "plain-feature", { feature = "pyo3/abi3-py311", python-version = ">=3.11" }, ] "#; let maturin: ToolMaturin = toml::from_str(toml_str).unwrap(); assert_eq!( maturin.features, Some(vec![ FeatureSpec::Plain("plain-feature".to_string()), FeatureSpec::Conditional { feature: "pyo3/abi3-py311".to_string(), python_version: Some(">=3.11".parse().unwrap()), python_implementation: None, }, ]) ); } #[test] fn test_compatibility_pypi_deserializes() { let toml_str = r#" compatibility = "pypi" "#; let maturin: ToolMaturin = toml::from_str(toml_str).unwrap(); assert_eq!(maturin.compatibility, Some(CompatibilityTag::Pypi)); } #[test] fn test_bindings_deserializes_every_spelling() { for binding in Bindings::ALL { let toml_str = format!("bindings = {:?}\n", binding.as_str()); let maturin: ToolMaturin = toml::from_str(&toml_str).unwrap(); assert_eq!(maturin.bindings, Some(binding)); } // Omitting `bindings` keeps auto-detection (None). let maturin: ToolMaturin = toml::from_str("").unwrap(); assert_eq!(maturin.bindings, None); } #[test] fn test_bindings_rejects_unknown() { let err = toml::from_str::("bindings = \"foo\"\n").unwrap_err(); // serde's default unknown-variant message names every accepted spelling. assert!( err.to_string().contains( "unknown variant `foo`, expected one of `pyo3`, `pyo3-ffi`, `cffi`, `uniffi`, `bin`" ), "unexpected error: {err}" ); } #[test] fn test_feature_spec_deserialize_with_implementation() { let toml_str = r#" features = [ { feature = "pyo3/abi3-py311", python-version = ">=3.11", python-implementation = "cpython" }, { feature = "pypy-compat", python-implementation = "pypy" }, ] "#; let maturin: ToolMaturin = toml::from_str(toml_str).unwrap(); assert_eq!( maturin.features, Some(vec![ FeatureSpec::Conditional { feature: "pyo3/abi3-py311".to_string(), python_version: Some(">=3.11".parse().unwrap()), python_implementation: Some("cpython".to_string()), }, FeatureSpec::Conditional { feature: "pypy-compat".to_string(), python_version: None, python_implementation: Some("pypy".to_string()), }, ]) ); } #[test] fn test_feature_spec_deserialize_invalid_specifier() { let toml_str = r#" features = [ { feature = "foo", python-version = "not-a-version" }, ] "#; let result: Result = toml::from_str(toml_str); assert!(result.is_err()); } #[test] fn test_generate_ci_config_deserialization() { let toml_str = r#" [generate-ci.github] pytest = true zig = true skip-attestation = false [generate-ci.github.linux] runner = "ubuntu-22.04" manylinux = "2_28" targets = ["x86_64", "aarch64"] [generate-ci.github.macos] targets = ["aarch64"] "#; let maturin: ToolMaturin = toml::from_str(toml_str).unwrap(); let ci = maturin.generate_ci.unwrap(); let gh = ci.github.unwrap(); assert_eq!(gh.pytest, Some(true)); assert_eq!(gh.zig, Some(true)); assert_eq!(gh.skip_attestation, Some(false)); let linux = gh.linux.unwrap(); assert_eq!(linux.overrides.runner, Some("ubuntu-22.04".to_string())); assert_eq!(linux.overrides.manylinux, Some("2_28".to_string())); assert_eq!( linux.targets, Some(vec!["x86_64".to_string(), "aarch64".to_string()]) ); let macos = gh.macos.unwrap(); assert_eq!(macos.targets, Some(vec!["aarch64".to_string()])); assert!(gh.windows.is_none()); } #[test] fn test_generate_ci_config_detailed_targets() { let toml_str = r#" [[generate-ci.github.linux.target]] arch = "x86_64" manylinux = "2_28" [[generate-ci.github.linux.target]] arch = "aarch64" runner = "self-hosted-arm64" manylinux = "2_17" before-script-linux = "yum install -y openssl-devel" "#; let maturin: ToolMaturin = toml::from_str(toml_str).unwrap(); let ci = maturin.generate_ci.unwrap(); let gh = ci.github.unwrap(); let linux = gh.linux.unwrap(); assert!(linux.targets.is_none()); let detailed = linux.target.unwrap(); assert_eq!(detailed.len(), 2); assert_eq!(detailed[0].arch, "x86_64"); assert_eq!(detailed[0].overrides.manylinux, Some("2_28".to_string())); assert_eq!(detailed[1].arch, "aarch64"); assert_eq!( detailed[1].overrides.runner, Some("self-hosted-arm64".to_string()) ); assert_eq!( detailed[1].overrides.before_script_linux, Some("yum install -y openssl-devel".to_string()) ); } #[test] fn test_pgo_command() { let tmp_dir = TempDir::new().unwrap(); let pyproject_file = tmp_dir.path().join("pyproject.toml"); fs::write( &pyproject_file, r#"[build-system] requires = ["maturin"] build-backend = "maturin" [tool.maturin] pgo-command = "python -m pytest tests/benchmarks" pgo-dependency-group = "testing-extra" "#, ) .unwrap(); let pyproject = PyProjectToml::new(pyproject_file).unwrap(); assert_eq!( pyproject.pgo_command(), Some("python -m pytest tests/benchmarks") ); assert_eq!(pyproject.pgo_dependency_group(), Some("testing-extra")); } #[test] fn test_pgo_command_absent() { let tmp_dir = TempDir::new().unwrap(); let pyproject_file = tmp_dir.path().join("pyproject.toml"); fs::write( &pyproject_file, r#"[build-system] requires = ["maturin"] build-backend = "maturin" [tool.maturin] manylinux = "2010" "#, ) .unwrap(); let pyproject = PyProjectToml::new(pyproject_file).unwrap(); assert_eq!(pyproject.pgo_command(), None); assert_eq!(pyproject.pgo_dependency_group(), None); } } maturin-1.16.0/src/python_interpreter/000077500000000000000000000000001527064705700200265ustar00rootroot00000000000000maturin-1.16.0/src/python_interpreter/abiflags.rs000066400000000000000000000157751527064705700221630ustar00rootroot00000000000000//! ABI flag resolution and ABI tag calculation. //! //! This module handles the platform-specific logic for determining Python ABI flags //! (e.g. `"m"`, `"t"`, `""`) and computing ABI tags from extension suffixes. use crate::{BridgeModel, Target}; use anyhow::{Result, bail, ensure}; use super::discovery::InterpreterMetadataMessage; pub(super) fn default_abiflags(minor_version: usize, gil_disabled: bool, debug: bool) -> String { let mut abiflags = String::new(); // order is [t][d][m], to match order used in `packaging` // https://github.com/pypa/packaging/blob/10590c194edb33c82f84a127883d6097c56b7840/src/packaging/tags.py#L376-L390 if gil_disabled { abiflags.push('t'); } if debug { abiflags.push('d'); } // pymalloc abi was the default until 3.8 if minor_version < 8 { abiflags.push('m'); } abiflags } pub(super) fn validate_abiflags(abiflags: &str, gil_disabled: bool, debug: bool) -> Result<()> { for (flag, enabled, name) in [ ('t', gil_disabled, "Py_GIL_DISABLED"), ('d', debug, "Py_DEBUG"), ] { ensure!( abiflags.contains(flag) == enabled, "ABI flags are inconsistent with {name}={enabled}" ); } Ok(()) } /// Returns the abiflags that are assembled through the message, with some /// additional sanity checks. /// /// The rules are as follows: /// - python 3 + Unix: Use ABIFLAGS /// - python 3 + Windows: Use ABIFLAGS when available, otherwise infer them pub(super) fn fun_with_abiflags( message: &InterpreterMetadataMessage, target: &Target, bridge: &BridgeModel, ) -> Result { if bridge != &BridgeModel::Cffi && target.get_python_os() != message.system && !target.cross_compiling() && !(target.get_python_os() == "cygwin" && message.system.to_lowercase().starts_with("cygwin")) { // Python versions <= 3.12 used to report platform.system() as "linux". Only on Python versions // >= 3.13, platform.system() reports as "android". So maintain backwards compatibility with // Python 3.12 when compiling on Android environment (for e.g. Termux) let is_android_compat = target.get_python_os() == "android" && message.system == "linux" && message.major == 3 && message.minor <= 12; if !is_android_compat { bail!( "platform.system() in python, {}, and the rust target, {:?}, don't match ಠ_ಠ", message.system, target, ) } } if message.major != 3 || message.minor < 7 { bail!( "Only python >= 3.7 is supported, while you're using python {}.{}", message.major, message.minor ); } if matches!(message.interpreter.as_str(), "pypy" | "graalvm" | "graalpy") { // pypy and graalpy do not specify abi flags Ok("".to_string()) } else if message.system == "windows" { // On Windows: // - Python < 3.8: abiflags is empty/None but we need "m" // - Python 3.8 - 3.13: abiflags is empty/None // - Python 3.13t: abiflags is empty/None but we need "t" (gil_disabled) // - Python >= 3.14: abiflags is now defined in sysconfig (upstream change) match message.abiflags.as_deref() { Some("") | None => Ok(default_abiflags( message.minor, message.gil_disabled, message.debug, )), Some(abiflags) => { validate_abiflags(abiflags, message.gil_disabled, message.debug)?; Ok(abiflags.to_string()) } } } else if let Some(abiflags) = &message.abiflags { validate_abiflags(abiflags, message.gil_disabled, message.debug)?; Ok(abiflags.to_string()) } else { bail!("A python 3 interpreter on Linux or macOS must define abiflags in its sysconfig ಠ_ಠ") } } /// Calculate the ABI tag from EXT_SUFFIX pub(super) fn calculate_abi_tag(ext_suffix: &str) -> Option { let parts = ext_suffix.split('.').collect::>(); if parts.len() < 3 { // CPython3.7 and earlier uses ".pyd" on Windows. return None; } let soabi = parts[1]; let mut soabi_split = soabi.split('-'); let abi = if soabi.starts_with("cpython") { // non-windows format!("cp{}", soabi_split.nth(1).unwrap()) } else if soabi.starts_with("cp") { // windows soabi_split.next().unwrap().to_string() } else if soabi.starts_with("pypy") { soabi_split.take(2).collect::>().join("-") } else if soabi.starts_with("graalpy") { soabi_split.take(3).collect::>().join("-") } else if !soabi.is_empty() { // pyston, ironpython, others? soabi_split.nth(1)?.to_string() } else { return None; }; let abi_tag = abi.replace(['.', '-', ' '], "_"); Some(abi_tag) } #[cfg(test)] mod tests { use super::*; #[test] fn test_default_abiflags() { for (minor_version, gil_disabled, debug, expected) in [ (7, false, false, "m"), (7, false, true, "dm"), (8, false, false, ""), (8, false, true, "d"), (13, false, false, ""), (13, true, false, "t"), (13, true, true, "td"), ] { let flags = default_abiflags(minor_version, gil_disabled, debug); assert_eq!(flags, expected); } } #[test] fn test_validate_abiflags() { for (flags, debug, gil_disabled) in [ ("", false, false), ("d", true, false), ("t", false, true), ("td", true, true), ] { assert!(validate_abiflags(flags, gil_disabled, debug,).is_ok()); assert!(validate_abiflags(flags, !gil_disabled, debug,).is_err()); assert!(validate_abiflags(flags, gil_disabled, !debug).is_err()); } } #[test] fn test_calculate_abi_tag() { let cases = vec![ (".cpython-37m-x86_64-linux-gnu.so", Some("cp37m")), (".cpython-310-x86_64-linux-gnu.so", Some("cp310")), (".cpython-310-darwin.so", Some("cp310")), (".cpython-313t-darwin.so", Some("cp313t")), (".cp310-win_amd64.pyd", Some("cp310")), (".cp39-mingw_x86_64.pyd", Some("cp39")), (".cpython-312-wasm32-wasi.so", Some("cp312")), (".cpython-38.so", Some("cp38")), (".pyd", None), (".so", None), (".pypy38-pp73-x86_64-linux-gnu.so", Some("pypy38_pp73")), ( ".graalpy-38-native-x86_64-darwin.dylib", Some("graalpy_38_native"), ), (".pyston-23-x86_64-linux-gnu.so", Some("23")), // soabi without dashes should return None, not panic (".nodashes.so", None), ]; for (ext_suffix, expected) in cases { assert_eq!(calculate_abi_tag(ext_suffix).as_deref(), expected); } } } maturin-1.16.0/src/python_interpreter/config.rs000066400000000000000000001342221527064705700216450ustar00rootroot00000000000000use super::{ FREE_THREADED_MINIMUM_PYTHON_MINOR, InterpreterKind, MAXIMUM_PYPY_MINOR, MAXIMUM_PYTHON_MINOR, MINIMUM_PYPY_MINOR, MINIMUM_PYTHON_MINOR, abiflags::validate_abiflags, }; use crate::{StableAbi, StableAbiKind, Target}; use crate::{ python_interpreter::abiflags::default_abiflags, target::{Arch, Os}, }; use anyhow::{Context, Result, ensure, format_err}; use fs_err as fs; use serde::Deserialize; use std::fmt::Write as _; use std::io::{BufRead, BufReader}; use std::path::Path; /// PyPy's ABI tag for a Python version. /// PyPy 3.12 was first released with PyPy 8.0, older versions with PyPy 7.3. fn pypy_abi_tag(minor: usize) -> &'static str { if minor >= 12 { "pp80" } else { "pp73" } } fn graalpy_version_for_python_version(major: usize, minor: usize) -> Option<(usize, usize)> { match (major, minor) { (3, 10) => Some((24, 0)), (3, 11) => Some((24, 2)), (3, 12) => Some((25, 0)), (3, 13) => Some((25, 3)), (_, _) => None, } } /// Some of the sysconfigdata of Python interpreter we care about #[derive(Debug, Clone, Deserialize, Eq, PartialEq)] pub struct InterpreterConfig { /// Python's major version pub major: usize, /// Python's minor version pub minor: usize, /// cpython, pypy, or graalpy #[serde(rename = "interpreter")] pub interpreter_kind: InterpreterKind, /// Normalized Python ABI flags, e.g. "m" for Python 3.7, "d" for debug builds, /// and "t" for free-threaded builds. Empty for PyPy and GraalPy. pub abiflags: String, /// Suffix to use for extension modules as given by sysconfig. pub ext_suffix: String, /// Pointer width pub pointer_width: Option, /// Is GIL disabled, i.e. free-threaded build pub gil_disabled: bool, } impl InterpreterConfig { /// Derive SOABI from an extension suffix. /// /// For example, `.cpython-314-x86_64-linux-gnu.so` becomes /// `cpython-314-x86_64-linux-gnu`. pub fn soabi_from_ext_suffix(ext_suffix: &str) -> Option { let s = ext_suffix.strip_prefix('.')?; let s = s .strip_suffix(".so") .or_else(|| s.strip_suffix(".pyd")) .unwrap_or(s); if s.is_empty() { None } else { Some(s.to_string()) } } /// Lookup a wellknown sysconfig for a given Python interpreter pub fn lookup_one( target: &Target, python_impl: InterpreterKind, python_version: (usize, usize), abiflags: &str, ) -> Option { use InterpreterKind::*; let (major, minor) = python_version; if major < 3 { // Python 2 is not supported return None; } let python_ext_arch = target.get_python_ext_arch(python_impl); let target_env = target.get_python_target_env(python_impl, python_version); let gil_disabled = abiflags.contains('t'); if gil_disabled && (python_impl != CPython || python_version < (3, 13)) { return None; } match (target.target_os(), python_impl) { (Os::Linux, CPython) => { let abiflags = if python_version < (3, 8) { format!("{}m", abiflags.trim_end_matches('m')) } else { abiflags.to_string() }; let ldversion = format!("{major}{minor}{abiflags}"); let ext_suffix = format!(".cpython-{ldversion}-{python_ext_arch}-linux-{target_env}.so"); Some(Self { major, minor, interpreter_kind: CPython, abiflags, ext_suffix, pointer_width: Some(target.pointer_width()), gil_disabled, }) } (Os::Linux, PyPy) => { let abi_tag = format!("pypy{major}{minor}-{}", pypy_abi_tag(minor)); let ext_suffix = format!(".{abi_tag}-{python_ext_arch}-linux-{target_env}.so"); Some(Self { major, minor, interpreter_kind: PyPy, abiflags: String::new(), ext_suffix, pointer_width: Some(target.pointer_width()), gil_disabled, }) } (Os::Linux, GraalPy) => { let (graalpy_major, graalpy_minor) = graalpy_version_for_python_version(major, minor)?; let ext_suffix = format!( ".graalpy{graalpy_major}{graalpy_minor}-{major}{minor}-native-{python_ext_arch}-linux.so" ); Some(Self { major, minor, interpreter_kind: GraalPy, abiflags: String::new(), ext_suffix, pointer_width: Some(target.pointer_width()), gil_disabled, }) } (Os::Macos, CPython) => { let abiflags = if python_version < (3, 8) { format!("{}m", abiflags.trim_end_matches('m')) } else { abiflags.to_string() }; let ldversion = format!("{major}{minor}{abiflags}"); let ext_suffix = format!(".cpython-{ldversion}-darwin.so"); Some(Self { major, minor, interpreter_kind: CPython, abiflags, ext_suffix, pointer_width: Some(target.pointer_width()), gil_disabled, }) } (Os::Macos, PyPy) => { let ext_suffix = format!(".pypy{major}{minor}-{}-darwin.so", pypy_abi_tag(minor)); Some(Self { major, minor, interpreter_kind: PyPy, abiflags: String::new(), ext_suffix, pointer_width: Some(target.pointer_width()), gil_disabled, }) } (Os::Macos, GraalPy) => { let (graalpy_major, graalpy_minor) = graalpy_version_for_python_version(major, minor)?; let ext_suffix = format!( ".graalpy{graalpy_major}{graalpy_minor}-{major}{minor}-native-{python_ext_arch}-darwin.so" ); Some(Self { major, minor, interpreter_kind: GraalPy, abiflags: String::new(), ext_suffix, pointer_width: Some(target.pointer_width()), gil_disabled, }) } (Os::Windows, CPython) => { let abiflags = if python_version < (3, 8) { format!("{}m", abiflags.trim_end_matches('m')) } else { abiflags.to_string() }; let ext_suffix = if python_version < (3, 8) { ".pyd".to_string() } else { let platform = match target.target_arch() { Arch::Aarch64 => "win_arm64", Arch::X86 => "win32", Arch::X86_64 => "win_amd64", _ => return None, }; format!(".cp{major}{minor}{abiflags}-{platform}.pyd") }; Some(Self { major, minor, interpreter_kind: CPython, abiflags, ext_suffix, pointer_width: Some(target.pointer_width()), gil_disabled, }) } (Os::Windows, PyPy) => { if target.target_arch() != Arch::X86_64 { // PyPy on Windows only supports x86_64 return None; } let ext_suffix = format!(".pypy{major}{minor}-{}-win_amd64.pyd", pypy_abi_tag(minor)); Some(Self { major, minor, interpreter_kind: PyPy, abiflags: String::new(), ext_suffix, pointer_width: Some(target.pointer_width()), gil_disabled, }) } (Os::FreeBsd, CPython) => { let (abiflags, ext_suffix) = if python_version < (3, 8) { ( format!("{}m", abiflags.trim_end_matches('m')), ".so".to_string(), ) } else { ( abiflags.to_string(), format!(".cpython-{major}{minor}{abiflags}.so"), ) }; Some(Self { major, minor, interpreter_kind: CPython, abiflags, ext_suffix, pointer_width: Some(target.pointer_width()), gil_disabled, }) } (Os::NetBsd, CPython) => { let ext_suffix = ".so".to_string(); Some(Self { major, minor, interpreter_kind: CPython, abiflags: abiflags.to_string(), ext_suffix, pointer_width: Some(target.pointer_width()), gil_disabled, }) } (Os::OpenBsd, CPython) => { let ldversion = format!("{major}{minor}"); let ext_suffix = format!(".cpython-{ldversion}{abiflags}.so"); Some(Self { major, minor, interpreter_kind: CPython, abiflags: abiflags.to_string(), ext_suffix, pointer_width: Some(target.pointer_width()), gil_disabled, }) } (Os::Emscripten, CPython) => { let ldversion = format!("{major}{minor}"); let ext_suffix = format!(".cpython-{ldversion}{abiflags}-{python_ext_arch}-emscripten.so"); Some(Self { major, minor, interpreter_kind: CPython, abiflags: abiflags.to_string(), ext_suffix, pointer_width: Some(target.pointer_width()), gil_disabled, }) } (_, _) => None, } } /// Lookup wellknown sysconfigs for a given target pub fn lookup_target(target: &Target) -> Vec { let mut configs = Vec::new(); for (python_impl, min_minor_ver, max_minor_ver) in [ ( InterpreterKind::CPython, MINIMUM_PYTHON_MINOR, MAXIMUM_PYTHON_MINOR, ), ( InterpreterKind::PyPy, MINIMUM_PYPY_MINOR, MAXIMUM_PYPY_MINOR, ), ] { for minor in min_minor_ver..=max_minor_ver { if let Some(config) = Self::lookup_one(target, python_impl, (3, minor), "") { configs.push(config); } } for minor in FREE_THREADED_MINIMUM_PYTHON_MINOR..=max_minor_ver { if let Some(config) = Self::lookup_one(target, python_impl, (3, minor), "t") { configs.push(config); } } } configs } /// Construct a new InterpreterConfig from a pyo3 config file pub fn from_pyo3_config(config_file: &Path, target: &Target) -> Result { let config_file = fs::File::open(config_file)?; let reader = BufReader::new(config_file); let lines = reader.lines(); macro_rules! parse_value { ($variable:ident, $value:ident) => { $variable = Some($value.trim().parse().context(format!( concat!( "failed to parse ", stringify!($variable), " from config value '{}'" ), $value ))?) }; } let mut implementation = None; let mut version = None; let mut abiflags: Option = None; let mut ext_suffix = None; let mut abi_tag = None; let mut pointer_width = None; let mut build_flags: Option = None; for (i, line) in lines.enumerate() { let line = line.context("failed to read line from config")?; let (key, value) = line .split_once('=') .with_context(|| format!("expected key=value pair on line {}", i + 1))?; match key { "implementation" => parse_value!(implementation, value), "version" => parse_value!(version, value), "abiflags" => parse_value!(abiflags, value), "ext_suffix" => parse_value!(ext_suffix, value), "abi_tag" => parse_value!(abi_tag, value), "pointer_width" => parse_value!(pointer_width, value), "build_flags" => parse_value!(build_flags, value), _ => continue, } } let version: String = version.context("missing value for version")?; let (ver_major, ver_minor) = version .split_once('.') .context("Invalid python interpreter version")?; let major = ver_major.parse::().with_context(|| { format!("Invalid python interpreter major version '{ver_major}', expect a digit") })?; let minor = ver_minor.parse::().with_context(|| { format!("Invalid python interpreter minor version '{ver_minor}', expect a digit") })?; let implementation = implementation.unwrap_or_else(|| "cpython".to_string()); let interpreter_kind = implementation.parse().map_err(|e| format_err!("{}", e))?; let known_flags = build_flags.map(|flags| { let gil_disabled = flags .split(',') .any(|flag| flag.trim() == "Py_GIL_DISABLED"); let debug = flags.split(',').any(|flag| flag.trim() == "Py_DEBUG"); (gil_disabled, debug) }); let abiflags = if let Some(abiflags) = abiflags { if let Some((gil_disabled, debug)) = known_flags { // `gil_disabled` and `debug` are derived from validate_abiflags(&abiflags, gil_disabled, debug)?; } abiflags } else { let (gil_disabled, debug) = known_flags.unwrap_or((false, false)); default_abiflags(minor, gil_disabled, debug) }; if interpreter_kind == InterpreterKind::CPython { ensure!( !abiflags.contains('t') || (major, minor) >= (3, 13), "Free-threaded ABI flags require Python 3.13 or later" ); ensure!( abiflags.contains('m') == ((major, minor) < (3, 8)), "ABI flag 'm' is required before Python 3.8 and unsupported thereafter" ); } else { ensure!( abiflags.is_empty(), "ABI flags are unsupported for {interpreter_kind}" ); } let gil_disabled = abiflags.contains('t'); let abi_tag = match interpreter_kind { InterpreterKind::CPython => { abi_tag.unwrap_or_else(|| format!("{major}{minor}{abiflags}")) } InterpreterKind::PyPy => abi_tag.unwrap_or_else(|| pypy_abi_tag(minor).to_string()), InterpreterKind::GraalPy => abi_tag.unwrap_or_else(|| { let (graalpy_major, graalpy_minor) = graalpy_version_for_python_version(major, minor).unwrap_or((23, 0)); format!("graalpy{graalpy_major}{graalpy_minor}_{major}{minor}_native") }), }; let file_ext = if target.is_windows() { "pyd" } else { "so" }; let ext_suffix = if target.is_linux() || target.is_android() || target.is_macos() || target.is_hurd() { let target_env = target.get_python_target_env(interpreter_kind, (major, minor)); match interpreter_kind { InterpreterKind::CPython => ext_suffix.unwrap_or_else(|| { // Eg: .cpython-38-x86_64-linux-gnu.so format!( ".cpython-{}-{}-{}-{}.{}", abi_tag, target.get_python_ext_arch(interpreter_kind), target.get_python_os(), target_env, file_ext, ) }), InterpreterKind::PyPy => ext_suffix.unwrap_or_else(|| { // Eg: .pypy38-pp73-x86_64-linux-gnu.so format!( ".pypy{}{}-{}-{}-{}-{}.{}", major, minor, abi_tag, target.get_python_ext_arch(interpreter_kind), target.get_python_os(), target_env, file_ext, ) }), InterpreterKind::GraalPy => ext_suffix.unwrap_or_else(|| { // e.g. .graalpy230-310-native-x86_64-linux.so format!( ".{}-{}-{}.{}", abi_tag.replace('_', "-"), target.get_python_ext_arch(interpreter_kind), target.get_python_os(), file_ext, ) }), } } else if target.is_emscripten() && matches!(interpreter_kind, InterpreterKind::CPython) { ext_suffix.unwrap_or_else(|| { format!( ".cpython-{}-{}-{}.{}", abi_tag, target.get_python_ext_arch(interpreter_kind), target.get_python_os(), file_ext ) }) } else { ext_suffix.context("missing value for ext_suffix")? }; Ok(Self { major, minor, interpreter_kind, abiflags, ext_suffix, pointer_width, gil_disabled, }) } /// Generate pyo3 config file content pub fn pyo3_config_file( &self, target: &Target, stable_abi: Option, use_target_abi: bool, ) -> String { let build_flags = if self.gil_disabled { "Py_GIL_DISABLED" } else { "" }; let stable_abi_min_version = stable_abi.and_then(|stable_abi| stable_abi.version.min_version()); let (config_major, config_minor) = stable_abi_min_version.unwrap_or((self.major as u8, self.minor as u8)); let mut content = if use_target_abi { let abi_kind = match stable_abi.map(|stable_abi| stable_abi.kind) { Some(StableAbiKind::Abi3) => "abi3", Some(StableAbiKind::Abi3t) => "abi3t", None if self.gil_disabled => "free_threaded", None => "gil_enabled", }; let target_abi = format!( "{}-{}-{}.{}", self.interpreter_kind, abi_kind, config_major, config_minor ); format!( r#"implementation={implementation} version={major}.{minor} target_abi={target_abi} shared=true build_flags={build_flags} suppress_build_script_link_lines=false"#, implementation = self.interpreter_kind, major = config_major, minor = config_minor, ) } else { format!( r#"implementation={implementation} version={major}.{minor} shared=true abi3={use_stable_abi} build_flags={build_flags} suppress_build_script_link_lines=false"#, implementation = self.interpreter_kind, major = config_major, minor = config_minor, use_stable_abi = stable_abi.is_some(), ) }; // On Android, pyo3 forces linking libpython. When abi3 is enabled, // pyo3's fixup_for_abi3_version downgrades the version to the abi3 // minimum (e.g. 3.7) and derives a wrong lib_name like "python3.7m". // Set lib_name explicitly so pyo3 uses the correct library. // For abi3, link against the unversioned libpython3.so (stable ABI). // For non-abi3, link against the version-specific libpython3.X.so. // See https://github.com/PyO3/pyo3/issues/5960 // See https://github.com/python/cpython/issues/148544 if target.is_android() && self.interpreter_kind == InterpreterKind::CPython { let lib_name = if stable_abi.is_some() { format!("python{}", self.major) } else { format!("python{}.{}{}", self.major, self.minor, self.abiflags) }; write!(content, "\nlib_name={lib_name}").unwrap(); } if let Some(pointer_width) = self.pointer_width { write!(content, "\npointer_width={pointer_width}").unwrap(); } if let Ok(lib_dir) = std::env::var("PYO3_CROSS_LIB_DIR") { write!(content, "\nlib_dir={}", lib_dir).unwrap(); } content } } #[cfg(test)] mod tests { use super::*; use expect_test::expect; use pretty_assertions::assert_eq; #[test] fn test_from_pyo3_config_abiflags() { let target = Target::from_resolved_target_triple("x86_64-unknown-linux-gnu").unwrap(); for (settings, flags) in [ ("", ""), ("abiflags=\n", ""), ("abiflags=d\n", "d"), ("abiflags=td\n", "td"), ("build_flags=Py_GIL_DISABLED\n", "t"), ("abiflags=t\n", "t"), ("abiflags=td\nbuild_flags=Py_DEBUG,Py_GIL_DISABLED\n", "td"), ("build_flags=Py_DEBUG,Py_GIL_DISABLED\n", "td"), ("build_flags=Py_DEBUG\n", "d"), ] { let file = tempfile::NamedTempFile::new().unwrap(); fs::write(file.path(), format!("version=3.14\n{settings}")).unwrap(); dbg!(settings, flags); let config = InterpreterConfig::from_pyo3_config(file.path(), &target).unwrap(); assert_eq!(config.abiflags, flags, "{settings}"); assert_eq!(config.gil_disabled, flags.contains('t')); assert_eq!( config.ext_suffix, format!(".cpython-314{flags}-x86_64-linux-gnu.so") ); } for settings in ["", "abiflags=dm\n"] { let file = tempfile::NamedTempFile::new().unwrap(); fs::write( file.path(), format!("version=3.7\nbuild_flags=Py_DEBUG\n{settings}"), ) .unwrap(); let config = InterpreterConfig::from_pyo3_config(file.path(), &target).unwrap(); assert_eq!(config.abiflags, "dm"); assert_eq!(config.ext_suffix, ".cpython-37dm-x86_64-linux-gnu.so"); } for settings in [ "version=3.14\nabiflags=t\nbuild_flags=\n", "version=3.14\nabiflags=\nbuild_flags=Py_GIL_DISABLED\n", "version=3.14\nabiflags=d\nbuild_flags=Py_DEBUG,Py_GIL_DISABLED\n", "version=3.14\nabiflags=t\nbuild_flags=Py_DEBUG,Py_GIL_DISABLED\n", "version=3.14\nabiflags=d\nbuild_flags=\n", "version=3.14\nabiflags=m\n", "version=3.12\nabiflags=t\n", "version=3.7\nabiflags=\n", "version=3.7\nabiflags=d\n", "version=3.14\nimplementation=PyPy\nabiflags=t\n", ] { let file = tempfile::NamedTempFile::new().unwrap(); fs::write(file.path(), settings).unwrap(); assert!( InterpreterConfig::from_pyo3_config(file.path(), &target).is_err(), "{settings}" ); } } #[test] fn test_well_known_sysconfigs_abiflags() { for triple in [ "x86_64-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-pc-windows-msvc", "x86_64-unknown-freebsd", "x86_64-unknown-netbsd", "x86_64-unknown-openbsd", "wasm32-unknown-emscripten", ] { let target = Target::from_resolved_target_triple(triple).unwrap(); for flags in ["", "d", "t", "td"] { let config = InterpreterConfig::lookup_one( &target, InterpreterKind::CPython, (3, 14), flags, ) .unwrap(); assert_eq!(config.abiflags, flags, "{triple}"); assert_eq!(config.gil_disabled, flags.contains('t'), "{triple}"); } assert!( InterpreterConfig::lookup_one(&target, InterpreterKind::PyPy, (3, 14), "t",) .is_none() ); } } #[test] fn test_well_known_sysconfigs_python_3_7_debug() { for triple in [ "x86_64-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-pc-windows-msvc", "x86_64-unknown-freebsd", ] { let target = Target::from_resolved_target_triple(triple).unwrap(); for flags in ["d", "dm"] { let config = InterpreterConfig::lookup_one(&target, InterpreterKind::CPython, (3, 7), flags) .unwrap(); assert_eq!(config.abiflags, "dm", "{triple}"); assert!(!config.gil_disabled); } } } #[test] fn test_well_known_sysconfigs_linux() { // CPython let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("x86_64-unknown-linux-gnu").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-310-x86_64-linux-gnu.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("i686-unknown-linux-gnu").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-310-i386-linux-gnu.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("aarch64-unknown-linux-gnu").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-310-aarch64-linux-gnu.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("armv7-unknown-linux-gnueabihf").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-310-arm-linux-gnueabihf.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("arm-unknown-linux-gnueabihf").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-310-arm-linux-gnueabihf.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("powerpc64le-unknown-linux-gnu").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!( sysconfig.ext_suffix, ".cpython-310-powerpc64le-linux-gnu.so" ); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("powerpc-unknown-linux-gnu").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-310-powerpc-linux-gnu.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("mips64-unknown-linux-gnu").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!( sysconfig.ext_suffix, ".cpython-310-mips64-linux-gnuabi64.so" ); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("mips-unknown-linux-gnu").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-310-mips-linux-gnu.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("s390x-unknown-linux-gnu").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-310-s390x-linux-gnu.so"); // PyPy let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("x86_64-unknown-linux-gnu").unwrap(), InterpreterKind::PyPy, (3, 9), "", ) .unwrap(); assert_eq!(sysconfig.abiflags, ""); assert_eq!(sysconfig.ext_suffix, ".pypy39-pp73-x86_64-linux-gnu.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("x86_64-unknown-linux-gnu").unwrap(), InterpreterKind::PyPy, (3, 12), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".pypy312-pp80-x86_64-linux-gnu.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("i686-unknown-linux-gnu").unwrap(), InterpreterKind::PyPy, (3, 9), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".pypy39-pp73-x86-linux-gnu.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("aarch64-unknown-linux-gnu").unwrap(), InterpreterKind::PyPy, (3, 9), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".pypy39-pp73-aarch64-linux-gnu.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("armv7-unknown-linux-gnueabihf").unwrap(), InterpreterKind::PyPy, (3, 9), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".pypy39-pp73-arm-linux-gnu.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("arm-unknown-linux-gnueabihf").unwrap(), InterpreterKind::PyPy, (3, 9), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".pypy39-pp73-arm-linux-gnu.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("powerpc64le-unknown-linux-gnu").unwrap(), InterpreterKind::PyPy, (3, 9), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".pypy39-pp73-ppc_64-linux-gnu.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("s390x-unknown-linux-gnu").unwrap(), InterpreterKind::PyPy, (3, 9), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".pypy39-pp73-s390x-linux-gnu.so"); } #[test] fn test_well_known_sysconfigs_macos() { // CPython let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("x86_64-apple-darwin").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-310-darwin.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("aarch64-apple-darwin").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-310-darwin.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("x86_64-apple-darwin").unwrap(), InterpreterKind::CPython, (3, 7), "", ) .unwrap(); assert_eq!(sysconfig.abiflags, "m"); assert_eq!(sysconfig.ext_suffix, ".cpython-37m-darwin.so"); // PyPy let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("x86_64-apple-darwin").unwrap(), InterpreterKind::PyPy, (3, 9), "", ) .unwrap(); assert_eq!(sysconfig.abiflags, ""); assert_eq!(sysconfig.ext_suffix, ".pypy39-pp73-darwin.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("aarch64-apple-darwin").unwrap(), InterpreterKind::PyPy, (3, 9), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".pypy39-pp73-darwin.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("aarch64-apple-darwin").unwrap(), InterpreterKind::PyPy, (3, 12), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".pypy312-pp80-darwin.so"); } #[test] fn test_well_known_sysconfigs_windows() { // CPython let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("x86_64-pc-windows-msvc").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cp310-win_amd64.pyd"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("i686-pc-windows-msvc").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cp310-win32.pyd"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("aarch64-pc-windows-msvc").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cp310-win_arm64.pyd"); // PyPy let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("x86_64-pc-windows-msvc").unwrap(), InterpreterKind::PyPy, (3, 9), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".pypy39-pp73-win_amd64.pyd"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("x86_64-pc-windows-msvc").unwrap(), InterpreterKind::PyPy, (3, 12), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".pypy312-pp80-win_amd64.pyd"); } #[test] fn test_well_known_sysconfigs_freebsd() { // CPython let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("x86_64-unknown-freebsd").unwrap(), InterpreterKind::CPython, (3, 7), "", ) .unwrap(); assert_eq!(sysconfig.abiflags, "m"); assert_eq!(sysconfig.ext_suffix, ".so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("x86_64-unknown-freebsd").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.abiflags, ""); assert_eq!(sysconfig.ext_suffix, ".cpython-310.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("i686-unknown-freebsd").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-310.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("aarch64-unknown-freebsd").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-310.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("armv7-unknown-freebsd").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-310.so"); } #[test] fn test_well_known_sysconfigs_netbsd() { // CPython let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("x86_64-unknown-netbsd").unwrap(), InterpreterKind::CPython, (3, 7), "", ) .unwrap(); assert_eq!(sysconfig.abiflags, ""); assert_eq!(sysconfig.ext_suffix, ".so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("x86_64-unknown-netbsd").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".so"); } #[test] fn test_well_known_sysconfigs_openbsd() { // CPython let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("x86_64-unknown-openbsd").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-310.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("i686-unknown-openbsd").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-310.so"); let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("aarch64-unknown-openbsd").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-310.so"); } #[test] fn test_well_known_sysconfigs_emscripten() { // CPython let sysconfig = InterpreterConfig::lookup_one( &Target::from_resolved_target_triple("wasm32-unknown-emscripten").unwrap(), InterpreterKind::CPython, (3, 10), "", ) .unwrap(); assert_eq!(sysconfig.abiflags, ""); assert_eq!(sysconfig.ext_suffix, ".cpython-310-wasm32-emscripten.so"); } #[test] fn test_pyo3_config_file() { let target = Target::from_resolved_target_triple("x86_64-unknown-linux-gnu").unwrap(); let sysconfig = InterpreterConfig::lookup_one(&target, InterpreterKind::CPython, (3, 10), "").unwrap(); let config_file = sysconfig.pyo3_config_file(&target, None, false); let expected = expect![[r#" implementation=CPython version=3.10 shared=true abi3=false build_flags= suppress_build_script_link_lines=false pointer_width=64"#]]; expected.assert_eq(&config_file); let config_file = sysconfig.pyo3_config_file(&target, None, true); let expected = expect![[r#" implementation=CPython version=3.10 target_abi=CPython-gil_enabled-3.10 shared=true build_flags= suppress_build_script_link_lines=false pointer_width=64"#]]; expected.assert_eq(&config_file); let sysconfig = InterpreterConfig::lookup_one(&target, InterpreterKind::CPython, (3, 15), "").unwrap(); let config_file = sysconfig.pyo3_config_file(&target, Some(StableAbi::from_abi3_version(3, 10)), true); let expected = expect![[r#" implementation=CPython version=3.10 target_abi=CPython-abi3-3.10 shared=true build_flags= suppress_build_script_link_lines=false pointer_width=64"#]]; expected.assert_eq(&config_file); let config_file = sysconfig.pyo3_config_file(&target, Some(StableAbi::from_abi3t_version(3, 15)), true); let expected = expect![[r#" implementation=CPython version=3.15 target_abi=CPython-abi3t-3.15 shared=true build_flags= suppress_build_script_link_lines=false pointer_width=64"#]]; expected.assert_eq(&config_file); } #[test] fn test_pyo3_config_file_free_threaded_python_3_13() { let target = Target::from_resolved_target_triple("x86_64-unknown-linux-gnu").unwrap(); let sysconfig = InterpreterConfig::lookup_one(&target, InterpreterKind::CPython, (3, 13), "t").unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-313t-x86_64-linux-gnu.so"); let config_file = sysconfig.pyo3_config_file(&target, None, false); let expected = expect![[r#" implementation=CPython version=3.13 shared=true abi3=false build_flags=Py_GIL_DISABLED suppress_build_script_link_lines=false pointer_width=64"#]]; expected.assert_eq(&config_file); let config_file = sysconfig.pyo3_config_file(&target, None, true); let expected = expect![[r#" implementation=CPython version=3.13 target_abi=CPython-free_threaded-3.13 shared=true build_flags=Py_GIL_DISABLED suppress_build_script_link_lines=false pointer_width=64"#]]; expected.assert_eq(&config_file); } #[test] fn test_pyo3_config_file_musl_python_3_11() { let target = Target::from_resolved_target_triple("x86_64-unknown-linux-musl").unwrap(); let sysconfig = InterpreterConfig::lookup_one(&target, InterpreterKind::CPython, (3, 11), "").unwrap(); assert_eq!(sysconfig.ext_suffix, ".cpython-311-x86_64-linux-musl.so"); let config_file = sysconfig.pyo3_config_file(&target, None, false); let expected = expect![[r#" implementation=CPython version=3.11 shared=true abi3=false build_flags= suppress_build_script_link_lines=false pointer_width=64"#]]; expected.assert_eq(&config_file); let config_file = sysconfig.pyo3_config_file(&target, None, true); let expected = expect![[r#" implementation=CPython version=3.11 target_abi=CPython-gil_enabled-3.11 shared=true build_flags= suppress_build_script_link_lines=false pointer_width=64"#]]; expected.assert_eq(&config_file); } #[test] fn test_pyo3_config_file_android() { let target = Target::from_resolved_target_triple("aarch64-linux-android").unwrap(); let config = InterpreterConfig { major: 3, minor: 14, interpreter_kind: InterpreterKind::CPython, abiflags: String::new(), ext_suffix: ".cpython-314-aarch64-linux-android.so".to_string(), pointer_width: Some(64), gil_disabled: false, }; // Non-abi3: links against version-specific libpython3.14.so let config_file = config.pyo3_config_file(&target, None, false); let expected = expect![[r#" implementation=CPython version=3.14 shared=true abi3=false build_flags= suppress_build_script_link_lines=false lib_name=python3.14 pointer_width=64"#]]; expected.assert_eq(&config_file); let config_file = config.pyo3_config_file(&target, None, true); let expected = expect![[r#" implementation=CPython version=3.14 target_abi=CPython-gil_enabled-3.14 shared=true build_flags= suppress_build_script_link_lines=false lib_name=python3.14 pointer_width=64"#]]; expected.assert_eq(&config_file); // Abi3: links against unversioned libpython3.so (stable ABI) // See https://github.com/python/cpython/issues/148544 let config_file = config.pyo3_config_file(&target, Some(StableAbi::from_abi3_version(3, 10)), false); let expected = expect![[r#" implementation=CPython version=3.10 shared=true abi3=true build_flags= suppress_build_script_link_lines=false lib_name=python3 pointer_width=64"#]]; expected.assert_eq(&config_file); let config_file = config.pyo3_config_file(&target, Some(StableAbi::from_abi3_version(3, 10)), true); let expected = expect![[r#" implementation=CPython version=3.10 target_abi=CPython-abi3-3.10 shared=true build_flags= suppress_build_script_link_lines=false lib_name=python3 pointer_width=64"#]]; expected.assert_eq(&config_file); } } maturin-1.16.0/src/python_interpreter/discovery.rs000066400000000000000000001310151527064705700224040ustar00rootroot00000000000000//! Python interpreter discovery. //! //! This module handles finding Python interpreters on the host machine, //! including platform-specific discovery for Windows (py launcher, conda) //! and Unix (pythonX.Y binaries, pyenv fallback). use super::abiflags::fun_with_abiflags; use super::{ FREE_THREADED_MINIMUM_PYTHON_MINOR, InterpreterConfig, InterpreterKind, MINIMUM_PYPY_MINOR, MINIMUM_PYTHON_MINOR, PythonInterpreter, }; use crate::target::Arch; use crate::{BridgeModel, Target}; use anyhow::{Context, Result, bail, format_err}; use once_cell::sync::Lazy; use pep440_rs::{Version, VersionSpecifiers}; use regex::Regex; use serde::Deserialize; use std::collections::HashSet; use std::env; use std::io::{self, Write}; use std::path::{Path, PathBuf}; use std::process::Command; use std::str; use tracing::{debug, instrument}; /// This snippet will give us information about the python interpreter's /// version and abi as json through stdout const GET_INTERPRETER_METADATA: &str = include_str!("get_interpreter_metadata.py"); /// The output format of [GET_INTERPRETER_METADATA] #[derive(Deserialize)] pub(super) struct InterpreterMetadataMessage { pub implementation_name: String, pub executable: Option, pub major: usize, pub minor: usize, pub abiflags: Option, pub interpreter: String, pub ext_suffix: Option, // comes from `sysconfig.get_platform()` pub platform: String, // comes from `platform.system()` pub system: String, pub soabi: Option, pub soabi_platform: Option, pub gil_disabled: bool, pub debug: bool, } /// Manages interpreter discovery on Windows. /// /// Replaces the old `maybe_add_interp!` macro with explicit state, /// deduplicating by `(major, minor, gil_disabled)` and tracking /// seen executable paths to avoid duplicate warnings (#2751). struct WindowsInterpreterFinder<'a> { target: &'a Target, bridge: &'a BridgeModel, min_python_minor: usize, requires_python: Option<&'a VersionSpecifiers>, versions_found: HashSet<(usize, usize, bool)>, seen_executables: HashSet, interpreters: Vec, } impl<'a> WindowsInterpreterFinder<'a> { fn new( target: &'a Target, bridge: &'a BridgeModel, requires_python: Option<&'a VersionSpecifiers>, ) -> Self { Self { target, bridge, min_python_minor: bridge.minimal_python_minor_version(), requires_python, versions_found: HashSet::new(), seen_executables: HashSet::new(), interpreters: Vec::new(), } } /// Try to add an interpreter from the given executable path. /// /// Checks version constraints, deduplicates by version, and tracks /// seen executables to avoid processing the same interpreter twice. fn try_add(&mut self, executable: &Path) -> Result<()> { let interp = check_executable(executable, self.target, self.bridge)?; if let Some(interp) = interp { let key = (interp.major, interp.minor, interp.gil_disabled); if interp.major == 3 && interp.minor >= self.min_python_minor && !self.versions_found.contains(&key) && self.requires_python.is_none_or(|req| { req.contains(&Version::new([interp.major as u64, interp.minor as u64])) }) { // Track the canonical path of accepted interpreters if let Ok(canonical) = interp.executable.canonicalize() { self.seen_executables.insert(canonical); } self.versions_found.insert(key); self.interpreters.push(interp); } } Ok(()) } /// Check if an executable has already been seen (accepted or rejected). /// Returns `true` if already processed; marks it as seen if not. fn mark_seen(&mut self, executable: &Path) -> bool { if let Ok(canonical) = executable.canonicalize() { !self.seen_executables.insert(canonical) } else { !self.seen_executables.insert(executable.to_path_buf()) } } fn into_interpreters(self) -> Vec { self.interpreters } } /// On windows regular Python installs are supported along with environments /// being managed by `conda`. /// /// We can't use the linux trick with trying different binary names since on /// windows the binary is always called "python.exe". However, whether dealing /// with regular Python installs or `conda` environments there are tools we can /// use to query the information regarding installed interpreters. /// /// Regular Python installs downloaded from Python.org will include the python /// launcher by default. We can use the launcher to find the information we need /// for each installed interpreter using `py -0` which produces something like /// the following output (the path can by determined using `sys.executable`): /// /// ```bash /// Installed Pythons found by py Launcher for Windows /// -3.7-64 * /// -3.6-32 /// ``` /// /// When using `conda` we can use the `conda info -e` command to retrieve information /// regarding the installed interpreters being managed by `conda`. This is an example /// of the output expected: /// /// ```bash /// # conda environments: /// # /// base C:\Users\\Anaconda3 /// foo1 * C:\Users\\Anaconda3\envs\foo1 /// foo2 * C:\Users\\Anaconda3\envs\foo2 /// ``` /// /// The information required can either by obtained by parsing this output directly or /// by invoking the interpreters to obtain the information. /// /// As well as the version numbers, etc. of the interpreters we also have to find the /// pointer width to make sure that the pointer width (32-bit or 64-bit) matches across /// platforms. fn find_all_windows( target: &Target, bridge: &BridgeModel, requires_python: Option<&VersionSpecifiers>, ) -> Result> { let mut finder = WindowsInterpreterFinder::new(target, bridge, requires_python); // If Python is installed from Python.org it should include the "python launcher" // which is used to find the installed interpreters let execution = Command::new("cmd") .arg("/c") .arg("py") .arg("--list-paths") .output(); if let Ok(output) = execution { // x86_64: ' -3.10-64 * C:\Users\xxx\AppData\Local\Programs\Python\Python310\python.exe' // x86_64: ' -3.11 * C:\Users\xxx\AppData\Local\Programs\Python\Python310\python.exe' // arm64: ' -V:3.11-arm64 * C:\Users\xxx\AppData\Local\Programs\Python\Python311-arm64\python.exe let expr = { static RE: Lazy = Lazy::new(|| Regex::new(r" -(V:)?(\d).(\d+)-?(arm)?(\d*)\s*\*?\s*(.*)?").unwrap()); &*RE }; let stdout = String::from_utf8_lossy(&output.stdout); for line in stdout.lines() { if let Some(capture) = expr.captures(line) { let major = capture .get(2) .unwrap() .as_str() .parse::() .context("Expected a digit for major version")?; let minor = capture .get(3) .unwrap() .as_str() .parse::() .context("Expected a digit for minor version")?; if !finder.versions_found.contains(&(major, minor, false)) && !finder.versions_found.contains(&(major, minor, true)) { let executable = capture.get(6).unwrap().as_str(); let executable_path = Path::new(&executable); // Skip non-existing paths if !executable_path.exists() { continue; } if finder.mark_seen(executable_path) { continue; } finder.try_add(executable_path)?; } } } } // Conda environments are also supported on windows let conda_info = Command::new("conda").arg("info").arg("-e").output(); if let Ok(output) = conda_info { let stdout = String::from_utf8_lossy(&output.stdout); let lines = stdout.lines(); // The regex has three parts: The first matches the name and skips // comments, the second skips the part in between and the third // extracts the path let re = { static RE: Lazy = Lazy::new(|| Regex::new(r"^([^#].*?)[\s*]+([\w\\:.-]+)\s*$").unwrap()); &*RE }; let mut paths = vec![]; for i in lines { if let Some(capture) = re.captures(i) { if &capture[1] == "base" { continue; } paths.push(String::from(&capture[2])); } } for path in paths { let executable_win = Path::new(&path).join("python.exe"); let executable = if executable_win.exists() { executable_win } else { Path::new(&path).join("python") }; if !finder.mark_seen(&executable) { finder.try_add(executable.as_path())?; } } } // Fallback to pythonX.Y for Microsoft Store versions for minor in finder.min_python_minor..=bridge.maximum_python_minor_version() { let key = (3, minor, false); if !finder.versions_found.contains(&key) { let executable = format!("python3.{minor}.exe"); let executable_path = Path::new(&executable); if !finder.mark_seen(executable_path) { finder.try_add(executable_path)?; } } } // Fallback to python3.{minor}t.exe for free-threaded Microsoft Store / PATH // installs (3.14+). The py launcher path above can also surface these once // installed; this matches the Unix `python3.{minor}t` discovery. if bridge.supports_free_threaded() { let min_free_threaded = finder .min_python_minor .max(FREE_THREADED_MINIMUM_PYTHON_MINOR); for minor in min_free_threaded..=bridge.maximum_python_minor_version() { let key = (3, minor, true); if !finder.versions_found.contains(&key) { let executable = format!("python3.{minor}t.exe"); let executable_path = Path::new(&executable); if !finder.mark_seen(executable_path) { finder.try_add(executable_path)?; } } } } let interpreters = finder.into_interpreters(); if interpreters.is_empty() { bail!( "Could not find any interpreters, are you sure you have python installed on your PATH?" ); }; Ok(interpreters) } /// Checks whether the given command is a python interpreter and returns a /// [`PythonInterpreter`] if that is the case. /// /// The `bridge` parameter is threaded through to [`fun_with_abiflags`] which /// skips the platform-system mismatch check for cffi bindings (cffi doesn't /// require the interpreter's platform to match the build target). #[instrument(skip_all, fields(executable = %executable.as_ref().display()))] pub(super) fn check_executable( executable: impl AsRef, target: &Target, bridge: &BridgeModel, ) -> Result> { let output = python_command(executable.as_ref()) .env("PYTHONNOUSERSITE", "1") .args(["-c", GET_INTERPRETER_METADATA]) .output(); let err_msg = format!( "Trying to get metadata from the python interpreter '{}' failed", executable.as_ref().display() ); let output = match output { Ok(output) => { if output.status.success() { output } else { let stderr = String::from_utf8_lossy(&output.stderr); if stderr.starts_with(&format!( "pyenv: {}: command not found", executable.as_ref().display() )) { // pyenv shim reports "command not found" when the actual interpreter // doesn't exist (e.g. pyenv install version was never installed) eprintln!( "âš ï¸� Warning: skipped unavailable python interpreter '{}' from pyenv", executable.as_ref().display() ); return Ok(None); } else if stderr.is_empty() { // Empty stderr typically indicates a stub/placeholder executable that // fails silently without producing any output. This happens on WSL2 // when PATH includes Windows Store Python stubs at: // /mnt/c/Users//AppData/Local/Microsoft/WindowsApps/python.exe // These stubs exist but don't function as real Python interpreters - // they just exit with an error code and no output. // Skip them gracefully instead of failing the build. eprintln!( "âš ï¸� Warning: skipped python interpreter '{}' with empty output", executable.as_ref().display() ); return Ok(None); } else { eprintln!("{stderr}"); bail!(err_msg); } } } Err(err) => { if err.kind() == io::ErrorKind::NotFound { if cfg!(windows) { if let Some(python) = executable.as_ref().to_str() { let ver = if python.starts_with("python") { python.strip_prefix("python").unwrap_or(python) } else { python }; // Try py -x.y on Windows let mut metadata_py = tempfile::NamedTempFile::new()?; write!(metadata_py, "{GET_INTERPRETER_METADATA}")?; let mut cmd = Command::new("cmd"); let suffix = match target.target_arch() { Arch::X86 => "-32", Arch::X86_64 => "-64", Arch::Aarch64 => "-arm64", _ => "", }; cmd.arg("/c") .arg("py") .arg(format!("-{ver}{suffix}")) .arg(metadata_py.path()) .env("PYTHONNOUSERSITE", "1"); let output = cmd.output(); match output { Ok(output) if output.status.success() => output, _ => return Ok(None), } } else { return Ok(None); } } else { return Ok(None); } } else { return Err(err).context(err_msg); } } }; let message: InterpreterMetadataMessage = serde_json::from_slice(&output.stdout) .context(err_msg) .context(String::from_utf8_lossy(&output.stdout).trim().to_string())?; from_metadata_message(executable, target, bridge, message) } /// Creates a `Command` that runs a Python interpreter given by path or by name. /// /// On Windows, `Command` appends `.exe` only when the program name has no /// extension, so a versioned name such as `pypy3.11` or `python3.14t` (whose /// "extension" is `.11` or `.14t`) is never found on `PATH`. Look up /// `.exe` on `PATH` for such names instead. pub(crate) fn python_command(executable: impl AsRef) -> Command { let executable = executable.as_ref(); if cfg!(windows) && executable.parent() == Some(Path::new("")) && executable .extension() .is_some_and(|ext| !ext.eq_ignore_ascii_case("exe")) { let mut name = executable.as_os_str().to_owned(); name.push(".exe"); let paths = env::var_os("PATH").unwrap_or_default(); if let Some(path) = env::split_paths(&paths) .map(|dir| dir.join(&name)) .find(|path| path.is_file()) { return Command::new(path); } } Command::new(executable) } /// Look up Python interpreters for a given target from maturin's bundled sysconfig data. /// /// This does **not** discover interpreters on disk — it returns non-runnable /// `PythonInterpreter` values constructed from bundled sysconfig metadata. pub(super) fn lookup_target( target: &Target, requires_python: Option<&VersionSpecifiers>, bridge: Option<&BridgeModel>, ) -> Vec { let min_python_minor = bridge .map(|bridge| bridge.minimal_python_minor_version()) .unwrap_or(MINIMUM_PYTHON_MINOR); let min_pypy_minor = bridge .map(|bridge| bridge.minimal_pypy_minor_version()) .unwrap_or(MINIMUM_PYPY_MINOR); let supports_free_threaded = bridge .map(|bridge| bridge.supports_free_threaded()) .unwrap_or(false); InterpreterConfig::lookup_target(target) .into_iter() .filter_map(|config| match requires_python { Some(requires_python) => { if requires_python .contains(&Version::new([config.major as u64, config.minor as u64])) { Some(PythonInterpreter::from_config(config)) } else { None } } None => Some(PythonInterpreter::from_config(config)), }) .filter_map(|config| match config.interpreter_kind { InterpreterKind::CPython => { if config.minor >= min_python_minor { Some(config) } else { None } } InterpreterKind::PyPy => { if config.minor >= min_pypy_minor { Some(config) } else { None } } InterpreterKind::GraalPy => Some(config), }) .filter_map(|config| { if config.gil_disabled && !supports_free_threaded { None } else { Some(config) } }) .collect() } /// CPython executable names to probe for `--find-interpreter`. /// /// Besides the regular `python3.{minor}` names, this also returns free-threaded /// `python3.{minor}t` names for the officially-supported free-threaded versions /// (3.14+, PEP 779) when the bindings support free-threading (PyO3 >= 0.23). The /// experimental 3.13t is intentionally not auto-discovered; build it explicitly /// with `-i python3.13t` if needed. fn cpython_candidate_names( bridge: &BridgeModel, requires_python: Option<&VersionSpecifiers>, ) -> Vec { let allowed = |minor: usize| { requires_python .map(|requires_python| requires_python.contains(&Version::new([3, minor as u64]))) .unwrap_or(true) }; let mut names: Vec = (bridge.minimal_python_minor_version() ..=bridge.maximum_python_minor_version()) .filter(|minor| allowed(*minor)) .map(|minor| format!("python3.{minor}")) .collect(); if bridge.supports_free_threaded() { names.extend( (FREE_THREADED_MINIMUM_PYTHON_MINOR.max(bridge.minimal_python_minor_version()) ..=bridge.maximum_python_minor_version()) .filter(|minor| allowed(*minor)) .map(|minor| format!("python3.{minor}t")), ); } names } /// Tries to find all installed python versions using the heuristic for the /// given platform. /// /// We have two filters: The optional requires-python from the pyproject.toml and minimum python /// minor either from the bindings (i.e. Cargo.toml `abi3-py{major}{minor}`) or the global /// default minimum minor version pub(super) fn find_all( target: &Target, bridge: &BridgeModel, requires_python: Option<&VersionSpecifiers>, ) -> Result> { if target.is_windows() { // TOFIX: add PyPy support to Windows return find_all_windows(target, bridge, requires_python); }; let mut executables: Vec = cpython_candidate_names(bridge, requires_python); // Also try to find PyPy for cffi and pyo3 bindings if *bridge == BridgeModel::Cffi || bridge.is_pyo3() { executables.extend( (bridge.minimal_pypy_minor_version()..=bridge.maximum_pypy_minor_version()) .filter(|minor| { requires_python .map(|requires_python| { requires_python.contains(&Version::new([3, *minor as u64])) }) .unwrap_or(true) }) .map(|minor| format!("pypy3.{minor}")), ); } // Deduplicate by (kind, major, minor, gil_disabled) to avoid // picking up the same interpreter via multiple names. let mut seen = HashSet::new(); let mut available_versions = Vec::new(); for executable in executables { if let Some(version) = check_executable(executable, target, bridge)? { let key = ( version.interpreter_kind, version.major, version.minor, version.gil_disabled, ); if seen.insert(key) { available_versions.push(version); } } } // Fallback: try `python3` and `python` for environments like pyenv // where only the generic name is available (fixes #2312) if available_versions.is_empty() { for name in &["python3", "python"] { if let Some(version) = check_executable(name, target, bridge)?.filter(|v| { v.major == 3 && v.minor >= bridge.minimal_python_minor_version() && requires_python.is_none_or(|req| { req.contains(&Version::new([v.major as u64, v.minor as u64])) }) }) { available_versions.push(version); break; } } } Ok(available_versions) } /// Checks that given list of executables are all valid python interpreters, /// determines the abiflags and versions of those interpreters and /// returns them as [PythonInterpreter] pub(super) fn check_executables( executables: &[PathBuf], target: &Target, bridge: &BridgeModel, ) -> Result> { let mut available_versions = Vec::new(); let mut missing = Vec::new(); for executable in executables { if let Some(version) = check_executable(executable, target, bridge).context(format!( "{} is not a valid python interpreter", executable.display() ))? { available_versions.push(version); } else { missing.push(executable); } } if !missing.is_empty() { let missing_str = missing .iter() .map(|p| format!("`{}`", p.display())) .collect::>() .join(", "); bail!( "The following Python interpreters could not be found: {}", missing_str ); } Ok(available_versions) } /// Configure a `PythonInterpreter` from the metadata message. /// /// Returns `None` if the interpreter is not suitable to use (e.g. too old or wrong architecture) fn from_metadata_message( executable: impl AsRef, target: &Target, bridge: &BridgeModel, message: InterpreterMetadataMessage, ) -> Result> { if (message.major == 2 && message.minor != 7) || (message.major == 3 && message.minor < 5) { debug!( "Skipping outdated python interpreter '{}'", executable.as_ref().display() ); return Ok(None); } let interpreter = match message.interpreter.as_str() { "cpython" => InterpreterKind::CPython, "pypy" => InterpreterKind::PyPy, "graalvm" | "graalpy" => InterpreterKind::GraalPy, other => { bail!("Unsupported interpreter {}", other); } }; let abiflags = fun_with_abiflags(&message, target, bridge).context(format_err!( "Failed to get information from the python interpreter at {}", executable.as_ref().display() ))?; let executable = message .executable .map(PathBuf::from) .unwrap_or_else(|| executable.as_ref().to_path_buf()); if target.is_windows() { 'windows_arch_check: { let python_arch = match message.platform.as_str().trim() { "win32" => Arch::X86, "win-amd64" => Arch::X86_64, "win-arm64" => Arch::Aarch64, _ => { eprintln!( "âš ï¸� Warning: '{}' reports unknown platform. This may fail to build.", executable.display() ); break 'windows_arch_check; } }; if python_arch != target.target_arch() { eprintln!( "👽 '{}' reports a platform '{platform}' (architecture '{python_arch}'), while the Rust target is '{target_arch}'. Skipping.", executable.display(), platform = message.platform, python_arch = python_arch, target_arch = target.target_arch(), ); return Ok(None); } } } let platform = if message.platform.starts_with("macosx") { None } else { Some(message.platform.to_lowercase().replace(['-', '.'], "_")) }; debug!( "Found {} interpreter at {}", interpreter, executable.display() ); Ok(Some(PythonInterpreter { config: InterpreterConfig { major: message.major, minor: message.minor, interpreter_kind: interpreter, abiflags, ext_suffix: message .ext_suffix .context("syconfig didn't define an `EXT_SUFFIX` ಠ_ಠ")?, pointer_width: None, gil_disabled: message.gil_disabled, }, executable, platform, runnable: true, implementation_name: message.implementation_name, soabi: message.soabi, soabi_platform: message.soabi_platform, })) } #[cfg(test)] mod tests { use super::*; use crate::bridge::{PyO3, PyO3Crate}; use expect_test::expect; use insta::assert_snapshot; use std::str::FromStr; #[test] fn test_lookup_target() { let target = Target::from_resolved_target_triple("x86_64-unknown-linux-gnu").unwrap(); let pythons = lookup_target(&target, None, None) .iter() .map(ToString::to_string) .collect::>(); let expected = expect![[r#" [ "CPython 3.7m", "CPython 3.8", "CPython 3.9", "CPython 3.10", "CPython 3.11", "CPython 3.12", "CPython 3.13", "CPython 3.14", "CPython 3.15", "PyPy 3.8", "PyPy 3.9", "PyPy 3.10", "PyPy 3.11", "PyPy 3.12", ] "#]]; expected.assert_debug_eq(&pythons); // pyo3 should find CPython 3.14t and newer (dropped support for 3.13t) let pythons = lookup_target( &target, None, Some(&BridgeModel::PyO3(PyO3 { crate_name: PyO3Crate::PyO3, version: semver::Version::new(0, 23, 0), stable_abi: None, metadata: None, })), ) .iter() .map(ToString::to_string) .collect::>(); let expected = expect![[r#" [ "CPython 3.7m", "CPython 3.8", "CPython 3.9", "CPython 3.10", "CPython 3.11", "CPython 3.12", "CPython 3.13", "CPython 3.14", "CPython 3.15", "CPython 3.14t", "CPython 3.15t", "PyPy 3.9", "PyPy 3.10", "PyPy 3.11", "PyPy 3.12", ] "#]]; expected.assert_debug_eq(&pythons); let pythons = lookup_target( &target, Some(&VersionSpecifiers::from_str(">=3.8").unwrap()), None, ) .iter() .map(ToString::to_string) .collect::>(); let expected = expect![[r#" [ "CPython 3.8", "CPython 3.9", "CPython 3.10", "CPython 3.11", "CPython 3.12", "CPython 3.13", "CPython 3.14", "CPython 3.15", "PyPy 3.8", "PyPy 3.9", "PyPy 3.10", "PyPy 3.11", "PyPy 3.12", ] "#]]; expected.assert_debug_eq(&pythons); let pythons = lookup_target( &target, Some(&VersionSpecifiers::from_str(">=3.10").unwrap()), None, ) .iter() .map(ToString::to_string) .collect::>(); let expected = expect![[r#" [ "CPython 3.10", "CPython 3.11", "CPython 3.12", "CPython 3.13", "CPython 3.14", "CPython 3.15", "PyPy 3.10", "PyPy 3.11", "PyPy 3.12", ] "#]]; expected.assert_debug_eq(&pythons); let pythons = lookup_target( &target, Some(&VersionSpecifiers::from_str(">=3.8").unwrap()), Some(&BridgeModel::PyO3(PyO3 { crate_name: PyO3Crate::PyO3, version: semver::Version::new(0, 23, 0), stable_abi: None, metadata: None, })), ) .iter() .map(ToString::to_string) .collect::>(); // should exclude PyPy < 3.9 let expected = expect![[r#" [ "CPython 3.8", "CPython 3.9", "CPython 3.10", "CPython 3.11", "CPython 3.12", "CPython 3.13", "CPython 3.14", "CPython 3.15", "CPython 3.14t", "CPython 3.15t", "PyPy 3.9", "PyPy 3.10", "PyPy 3.11", "PyPy 3.12", ] "#]]; expected.assert_debug_eq(&pythons); } #[test] fn test_cpython_candidate_names_free_threaded() { let pyo3_023 = BridgeModel::PyO3(PyO3 { crate_name: PyO3Crate::PyO3, version: semver::Version::new(0, 23, 0), stable_abi: None, metadata: None, }); let names = cpython_candidate_names(&pyo3_023, None); // Free-threading is discovered for the officially-supported versions (3.14+) ... assert!(names.contains(&"python3.14t".to_string())); // ... but the experimental 3.13t is never auto-discovered. assert!(!names.contains(&"python3.13t".to_string())); // Regular interpreters are still present. assert!(names.contains(&"python3.14".to_string())); // pyo3 < 0.23 does not support free-threading: no `t` names at all. let pyo3_022 = BridgeModel::PyO3(PyO3 { crate_name: PyO3Crate::PyO3, version: semver::Version::new(0, 22, 0), stable_abi: None, metadata: None, }); let names = cpython_candidate_names(&pyo3_022, None); assert!(!names.iter().any(|name| name.ends_with('t'))); // A requires-python that excludes 3.14 also excludes 3.14t. let names = cpython_candidate_names( &pyo3_023, Some(&VersionSpecifiers::from_str(">=3.15").unwrap()), ); assert!(!names.contains(&"python3.14t".to_string())); } #[test] fn test_interpreter_from_metadata_windows() { // Test cases for different scenarios let target_x64 = Target::from_resolved_target_triple("x86_64-pc-windows-msvc").unwrap(); let target_x86 = Target::from_resolved_target_triple("i686-pc-windows-msvc").unwrap(); let target_arm64 = Target::from_resolved_target_triple("aarch64-pc-windows-msvc").unwrap(); let bridge = BridgeModel::PyO3(PyO3 { crate_name: PyO3Crate::PyO3, version: semver::Version::new(0, 26, 0), stable_abi: None, metadata: None, }); let message = |major, minor, platform: &str| InterpreterMetadataMessage { major, minor, interpreter: "cpython".to_string(), implementation_name: "CPython".to_string(), abiflags: None, ext_suffix: Some(".pyd".to_string()), debug: false, platform: platform.to_string(), executable: None, soabi: None, soabi_platform: None, gil_disabled: false, system: "windows".to_string(), }; // Test Python 2.x should be rejected assert_eq!( from_metadata_message( "python2.7", &target_x64, &bridge, message(2, 7, "win-amd64"), ) .unwrap_err() .to_string(), "Failed to get information from the python interpreter at python2.7" ); // Test Python 3.x but below minimum version assert_eq!( from_metadata_message( "python3.6", &target_x64, &bridge, message(3, 6, "win-amd64"), ) .unwrap_err() .to_string(), "Failed to get information from the python interpreter at python3.6" ); // Test valid Python version with matching platform and architecture for (target, platform) in &[ (&target_x86, "win32"), (&target_x64, "win-amd64"), (&target_arm64, "win-arm64"), ] { assert_eq!( from_metadata_message("python3.10", target, &bridge, message(3, 10, platform),) .unwrap() .unwrap(), PythonInterpreter { config: InterpreterConfig { major: 3, minor: 10, interpreter_kind: InterpreterKind::CPython, abiflags: "".to_string(), ext_suffix: ".pyd".to_string(), pointer_width: None, gil_disabled: false, }, executable: PathBuf::from("python3.10"), platform: Some(platform.replace("-", "_")), runnable: true, implementation_name: "CPython".to_string(), soabi: None, soabi_platform: None, } ); } // Test mismatched architectures for (target, platform) in &[ (&target_x86, "win-amd64"), (&target_x86, "win-arm64"), (&target_x64, "win32"), (&target_x64, "win-arm64"), (&target_arm64, "win32"), (&target_arm64, "win-amd64"), ] { assert_eq!( from_metadata_message("python3.10", target, &bridge, message(3, 10, platform),) .unwrap(), None ); } // Test edge case with unknown platform (should not match any specific architecture, build anyway) assert_eq!( from_metadata_message( "python3.10", &target_x64, &bridge, message(3, 10, "unknown-platform"), ) .unwrap() .unwrap(), PythonInterpreter { config: InterpreterConfig { major: 3, minor: 10, interpreter_kind: InterpreterKind::CPython, abiflags: "".to_string(), ext_suffix: ".pyd".to_string(), pointer_width: None, gil_disabled: false, }, executable: PathBuf::from("python3.10"), platform: Some("unknown_platform".to_string()), runnable: true, implementation_name: "CPython".to_string(), soabi: None, soabi_platform: None, } ); } #[test] fn test_interpreter_from_metadata_windows_314() { // Test that Python 3.14+ on Windows with ABIFLAGS defined works (fixes #2740) let target_x64 = Target::from_resolved_target_triple("x86_64-pc-windows-msvc").unwrap(); let bridge = BridgeModel::PyO3(PyO3 { crate_name: PyO3Crate::PyO3, version: semver::Version::new(0, 26, 0), stable_abi: None, metadata: None, }); // Python 3.14 with ABIFLAGS="" (standard build) let message_314 = InterpreterMetadataMessage { major: 3, minor: 14, interpreter: "cpython".to_string(), implementation_name: "CPython".to_string(), abiflags: Some("".to_string()), ext_suffix: Some(".cp314-win_amd64.pyd".to_string()), debug: false, platform: "win-amd64".to_string(), executable: None, soabi: None, soabi_platform: None, gil_disabled: false, system: "windows".to_string(), }; let interp = from_metadata_message("python3.14", &target_x64, &bridge, message_314) .unwrap() .unwrap(); assert_eq!(interp.major, 3); assert_eq!(interp.minor, 14); assert_eq!(interp.abiflags, ""); // Python 3.14t free-threaded with ABIFLAGS="t" let message_314t = InterpreterMetadataMessage { major: 3, minor: 14, interpreter: "cpython".to_string(), implementation_name: "CPython".to_string(), abiflags: Some("t".to_string()), ext_suffix: Some(".cp314t-win_amd64.pyd".to_string()), debug: false, platform: "win-amd64".to_string(), executable: None, soabi: None, soabi_platform: None, gil_disabled: true, system: "windows".to_string(), }; let interp = from_metadata_message("python3.14t", &target_x64, &bridge, message_314t) .unwrap() .unwrap(); assert_eq!(interp.major, 3); assert_eq!(interp.minor, 14); assert_eq!(interp.abiflags, "t"); assert!(interp.gil_disabled); } #[test] fn test_discovery_infers_windows_abiflags() { let target = Target::from_resolved_target_triple("x86_64-pc-windows-msvc").unwrap(); for (gil_disabled, debug, expected) in [ (false, false, ""), (true, false, "t"), (false, true, "d"), (true, true, "td"), ] { let message = InterpreterMetadataMessage { major: 3, minor: 13, interpreter: "cpython".to_string(), implementation_name: "cpython".to_string(), abiflags: None, ext_suffix: Some("_d.pyd".to_string()), platform: "win-amd64".to_string(), executable: None, soabi: None, soabi_platform: None, gil_disabled, debug, system: "windows".to_string(), }; let interpreter = from_metadata_message("python", &target, &BridgeModel::Bin(None), message) .unwrap() .unwrap(); assert_eq!(interpreter.abiflags, expected); } } #[test] fn test_discovery_abiflags() { for (triple, system, platform, minor, flags, expected) in [ ( "x86_64-pc-windows-msvc", "windows", "win-amd64", 13, None, "t", ), ( "x86_64-unknown-linux-gnu", "linux", "linux-x86_64", 14, Some("d"), "d", ), ( "x86_64-unknown-linux-gnu", "linux", "linux-x86_64", 14, Some("td"), "td", ), ] { let target = Target::from_resolved_target_triple(triple).unwrap(); let message = InterpreterMetadataMessage { major: 3, minor, interpreter: "cpython".to_string(), implementation_name: "cpython".to_string(), abiflags: flags.map(str::to_string), ext_suffix: Some(".so".to_string()), platform: platform.to_string(), executable: None, soabi: None, soabi_platform: None, debug: expected.contains('d'), gil_disabled: expected.contains('t'), system: system.to_string(), }; let interpreter = from_metadata_message("python", &target, &BridgeModel::Bin(None), message) .unwrap() .unwrap(); assert_eq!(interpreter.abiflags, expected); } } #[test] fn test_check_executables_single_missing() { let target = Target::from_resolved_target_triple("x86_64-unknown-linux-gnu").unwrap(); let bridge = BridgeModel::Bin(None); let executables = vec![PathBuf::from("nonexistent-python-1")]; let result = check_executables(&executables, &target, &bridge); let err_msg = result.unwrap_err().to_string(); assert_snapshot!(err_msg, @"The following Python interpreters could not be found: `nonexistent-python-1`"); } #[test] fn test_check_executables_multiple_missing() { let target = Target::from_resolved_target_triple("x86_64-unknown-linux-gnu").unwrap(); let bridge = BridgeModel::Bin(None); let executables = vec![ PathBuf::from("nonexistent-python-1"), PathBuf::from("nonexistent-python-2"), ]; let result = check_executables(&executables, &target, &bridge); let err_msg = result.unwrap_err().to_string(); assert_snapshot!(err_msg, @"The following Python interpreters could not be found: `nonexistent-python-1`, `nonexistent-python-2`"); } #[test] fn test_non_utf8_command_output_is_lossily_decoded() { // Localized Windows installations (e.g. a CJK or accented username // under a legacy console codepage) can make `py --list-paths` and // `conda info -e` emit non-UTF-8 bytes. Interpreter discovery must // lossily decode that output instead of panicking: undecodable bytes // become U+FFFD, which cannot match the interpreter path regexes, so // affected lines are skipped like any other junk line. let mut raw = b" -3.11-64 * C:\\Users\\".to_vec(); raw.extend_from_slice(&[0xff, 0xfd, 0xfe]); raw.extend_from_slice(b"\\python.exe\r\n"); // The previous `str::from_utf8(&output.stdout).unwrap()` panicked here. assert!(str::from_utf8(&raw).is_err()); let stdout = String::from_utf8_lossy(&raw); let line = stdout.lines().next().unwrap(); assert!(line.starts_with(" -3.11-64 * C:\\Users\\")); assert!(line.contains(char::REPLACEMENT_CHARACTER)); assert!(line.ends_with("\\python.exe")); // Valid UTF-8 output is decoded unchanged. let stdout = String::from_utf8_lossy(b" -3.10-64 * C:\\Python\\python.exe"); assert_eq!(stdout, " -3.10-64 * C:\\Python\\python.exe"); } } maturin-1.16.0/src/python_interpreter/get_interpreter_metadata.py000066400000000000000000000032621527064705700254450ustar00rootroot00000000000000import json import platform import struct import sys import sysconfig if platform.python_implementation() == "PyPy": # Workaround for PyPy 3.6 on windows: # - sysconfig.get_config_var("EXT_SUFFIX") differs to importlib until # Python 3.8 # - PyPy does not load the plain ".pyd" suffix because it expects that's # for a CPython extension module # # This workaround can probably be removed once PyPy for Python 3.8 is the # main PyPy version. import importlib.machinery ext_suffix = importlib.machinery.EXTENSION_SUFFIXES[0] else: ext_suffix = sysconfig.get_config_var("EXT_SUFFIX") metadata = { # sys.implementation.name can differ from platform.python_implementation(), for example # Pyston has sys.implementation.name == "pyston" while platform.python_implementation() == cpython "implementation_name": sys.implementation.name, "executable": sys.executable or None, "major": sys.version_info.major, "minor": sys.version_info.minor, "abiflags": sysconfig.get_config_var("ABIFLAGS"), "interpreter": platform.python_implementation().lower(), "ext_suffix": ext_suffix, "soabi": sysconfig.get_config_var("SOABI") or None, "soabi_platform": sysconfig.get_config_var("SOABI_PLATFORM") or None, "platform": sysconfig.get_platform(), # This one isn't technically necessary, but still very useful for sanity checks "system": platform.system().lower(), # This one is for generating a config file for pyo3 "pointer_width": struct.calcsize("P") * 8, "gil_disabled": sysconfig.get_config_var("Py_GIL_DISABLED") == 1, "debug": sysconfig.get_config_var("Py_DEBUG") == 1, } print(json.dumps(metadata)) maturin-1.16.0/src/python_interpreter/mod.rs000066400000000000000000000635101527064705700211600ustar00rootroot00000000000000pub use self::config::InterpreterConfig; use crate::auditwheel::PlatformTag; use crate::bridge::{ABI3T_MINIMUM_PYTHON_MINOR, StableAbiKind}; use crate::target::WheelTag; use crate::{StableAbi, Target}; use anyhow::{Result, bail}; use std::borrow::Cow; use std::collections::BTreeSet; use std::ffi::OsStr; use std::fmt; use std::ops::Deref; use std::path::{Path, PathBuf}; use std::str::FromStr; mod abiflags; mod config; mod discovery; mod resolver; pub(crate) use self::discovery::python_command; pub(crate) use self::resolver::InterpreterResolver; /// Minimum supported CPython minor version. pub const MINIMUM_PYTHON_MINOR: usize = 7; /// Minimum supported PyPy minor version. pub const MINIMUM_PYPY_MINOR: usize = 8; /// Be liberal here to include preview versions pub const MAXIMUM_PYTHON_MINOR: usize = 15; /// Minimum supported version for free-threaded CPython pub const FREE_THREADED_MINIMUM_PYTHON_MINOR: usize = 14; /// Maximum supported PyPy minor version. pub const MAXIMUM_PYPY_MINOR: usize = 12; /// The kind of Python interpreter (CPython, PyPy, or GraalPy). #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, serde::Deserialize, clap::ValueEnum)] #[serde(rename_all = "lowercase")] #[clap(rename_all = "lower")] pub enum InterpreterKind { /// CPython — the reference Python implementation. CPython, /// PyPy — a fast, alternative Python implementation. PyPy, /// GraalPy — Python on GraalVM. GraalPy, } impl InterpreterKind { /// Is this a CPython interpreter? pub fn is_cpython(&self) -> bool { matches!(self, InterpreterKind::CPython) } /// Is this a PyPy interpreter? pub fn is_pypy(&self) -> bool { matches!(self, InterpreterKind::PyPy) } /// Is this a GraalPy interpreter? pub fn is_graalpy(&self) -> bool { matches!(self, InterpreterKind::GraalPy) } } impl fmt::Display for InterpreterKind { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { InterpreterKind::CPython => write!(f, "CPython"), InterpreterKind::PyPy => write!(f, "PyPy"), InterpreterKind::GraalPy => write!(f, "GraalVM"), } } } impl FromStr for InterpreterKind { type Err = String; fn from_str(s: &str) -> Result { match s.to_ascii_lowercase().as_str() { "cpython" => Ok(InterpreterKind::CPython), "pypy" => Ok(InterpreterKind::PyPy), "graalvm" | "graalpy" => Ok(InterpreterKind::GraalPy), unknown => Err(format!("Unknown interpreter kind '{unknown}'")), } } } /// The location and version of an interpreter #[derive(Debug, Clone, Eq, PartialEq)] pub struct PythonInterpreter { /// Python's sysconfig /// Python's major version pub config: InterpreterConfig, /// Path to the python interpreter, e.g. /usr/bin/python3.6 /// /// Just the name of the binary in PATH does also work, e.g. `python3.5` pub executable: PathBuf, /// Comes from `sysconfig.get_platform()` /// /// Note that this can be `None` when cross compiling pub platform: Option, /// Is this interpreter runnable /// /// When cross compile the target interpreter isn't runnable, /// and it's `executable` is empty pub runnable: bool, /// Comes from `sys.platform.name` pub implementation_name: String, /// Comes from sysconfig var `SOABI` pub soabi: Option, /// Comes from sysconfig var `SOABI_PLATFORM` (Python 3.15+) pub soabi_platform: Option, } impl Deref for PythonInterpreter { type Target = InterpreterConfig; fn deref(&self) -> &Self::Target { &self.config } } impl PythonInterpreter { /// Does this interpreter have PEP 384 stable api aka. abi3 support? pub fn has_abi3(&self) -> bool { if self.implementation_name.parse::().is_err() { false } else { match self.interpreter_kind { // Free-threaded python does not support abi3. All supported // CPython GIL-enabled versions do support abi3 InterpreterKind::CPython => !self.config.gil_disabled, InterpreterKind::PyPy | InterpreterKind::GraalPy => false, } } } /// Does this interpreter have PEP 803 stable api aka. abi3t support? pub fn has_abi3t(&self) -> bool { if self.implementation_name.parse::().is_err() { false } else { match self.interpreter_kind { InterpreterKind::CPython => { self.config.major == 3 && self.config.minor >= ABI3T_MINIMUM_PYTHON_MINOR as usize } InterpreterKind::PyPy | InterpreterKind::GraalPy => false, } } } /// Does this interpreter support either abi3 or abi3t? pub fn has_stable_api(&self, kind: StableAbiKind) -> bool { match kind { StableAbiKind::Abi3 => self.has_abi3(), StableAbiKind::Abi3t => self.has_abi3t(), } } /// Generate PyO3 config file content for this interpreter. /// /// When maturin supplies `PYO3_CONFIG_FILE`, PyO3 does not live-probe the /// interpreter. Use `platform` (from `sysconfig.get_platform()`) to preserve /// the `libpython3` / `libpython3t` names PyO3's native MinGW discovery /// would otherwise select. pub(crate) fn pyo3_config_file_with_platform( &self, target: &Target, stable_abi: Option, use_target_abi: bool, ) -> String { let mut content = self .config .pyo3_config_file(target, stable_abi, use_target_abi); if target.is_windows() && self.interpreter_kind == InterpreterKind::CPython && self .platform .as_deref() .is_some_and(|platform| platform.starts_with("mingw")) && let Some(stable_abi) = stable_abi { let lib_name = match stable_abi.kind { StableAbiKind::Abi3 => "libpython3", StableAbiKind::Abi3t => "libpython3t", }; content.push_str("\nlib_name="); content.push_str(lib_name); } content } /// Formats this interpreter as a value for uv's `--python` argument. /// /// A runnable interpreter is passed by path. Otherwise the interpreter /// is passed as a version request for uv to resolve (e.g. if maturin /// received `-i 3.10`, and no runnable interpreter was found, maturin /// will pass `cpython@3.10` to uv). pub fn as_uv_python_arg(&self) -> Cow<'_, OsStr> { if self.runnable && !self.executable.as_os_str().is_empty() { return self.executable.as_os_str().into(); } let implementation = match self.interpreter_kind { InterpreterKind::CPython => "cpython", InterpreterKind::PyPy => "pypy", InterpreterKind::GraalPy => "graalpy", }; let mut request = format!( "{implementation}@{major}.{minor}{abiflags}", major = self.major, minor = self.minor, abiflags = self.abiflags, ); // `3.14` might resolve to free-threaded python depending what is on the users' // path (see https://github.com/astral-sh/uv/issues/16722), explicitly request `+gil` if needed if self.interpreter_kind == InterpreterKind::CPython && !self.gil_disabled { request.push_str("+gil"); } Cow::Owned(request.into()) } /// Returns the supported python environment in the PEP 425 format used for the wheel filename: /// `{python tag}-{abi tag}-{platform tag}`. /// /// This is a **compatibility string helper** for external callers that need the tag as a /// single string. New maturin code should prefer [`Self::get_wheel_tag`] and keep the /// structured [`crate::WheelTag`] through to WHEEL metadata generation. /// /// If abi3 is true, cpython wheels use the generic abi3 with the given version as minimum. pub fn get_tag( &self, project: &crate::ProjectContext, platform_tags: &[PlatformTag], ) -> Result { Ok(self.get_wheel_tag(project, platform_tags)?.to_string()) } /// Structured PEP 425 wheel tag for this interpreter. /// /// Prefer this over [`Self::get_tag`] inside maturin so tags are not re-parsed from strings. pub(crate) fn get_wheel_tag( &self, project: &crate::ProjectContext, platform_tags: &[PlatformTag], ) -> Result { // Restrict `sysconfig.get_platform()` usage to Windows and non-portable Linux only for now // so we don't need to deal with macOS deployment target let target = &project.target; let use_sysconfig_platform = target.is_windows() || (target.is_linux() && platform_tags.iter().any(|tag| !tag.is_portable())) || target.is_illumos(); let platform = if use_sysconfig_platform { if let Some(platform) = self.platform.clone() { BTreeSet::from_iter([platform]) } else { project.get_platform_tag(platform_tags)? } } else { project.get_platform_tag(platform_tags)? }; let tag = if self.implementation_name.parse::().is_err() { // Use generic tags when `sys.implementation.name` != `platform.python_implementation()`, for example Pyston // See also https://github.com/pypa/packaging/blob/0031046f7fad649580bc3127d1cef9157da0dd79/packaging/tags.py#L234-L261 let interpreter = format!( "{interpreter}{major}{minor}", interpreter = self.implementation_name, major = self.major, minor = self.minor, ); let abi = self .soabi .as_deref() .unwrap_or("none") .replace(['-', '.'], "_"); WheelTag::new([interpreter], [abi], platform) } else { match self.interpreter_kind { InterpreterKind::CPython => { let interpreter = format!("cp{major}{minor}", major = self.major, minor = self.minor); let abi = format!( "cp{major}{minor}{abiflags}", major = self.major, minor = self.minor, abiflags = self.abiflags, ); WheelTag::new([interpreter], [abi], platform) } InterpreterKind::PyPy => { // pypy uses its version as part of the ABI, e.g. // pypy 3.11 7.3 => numpy-1.20.1-pp311-pypy311_pp73-manylinux2014_x86_64.whl let interpreter = format!("pp{major}{minor}", major = self.major, minor = self.minor); let abi = abiflags::calculate_abi_tag(&self.ext_suffix) .expect("PyPy's syconfig didn't define a valid `EXT_SUFFIX` ಠ_ಠ"); WheelTag::new([interpreter], [abi], platform) } InterpreterKind::GraalPy => { // GraalPy like PyPy uses its version as part of the ABI // graalpy 3.10 23.1 => numpy-1.23.5-graalpy310-graalpy231_310_native-manylinux2014_x86_64.whl let interpreter = format!( "graalpy{major}{minor}", major = self.major, minor = self.minor ); let abi = abiflags::calculate_abi_tag(&self.ext_suffix) .expect("GraalPy's syconfig didn't define a valid `EXT_SUFFIX` ಠ_ಠ"); WheelTag::new([interpreter], [abi], platform) } } }; Ok(tag) } /// Adds the ext_suffix we read from python or know (.pyd/.abi3.so) and adds it to the base name /// /// For CPython, generate extensions as follows: /// /// For python 3, there is PEP 3149, but /// that is only valid for 3.2 - 3.4. Since only 3.6+ is supported, the /// templates are adapted from the (also /// incorrect) release notes of CPython 3.5: /// https://docs.python.org/3/whatsnew/3.5.html#build-and-c-api-changes /// /// Examples for 64-bit on CPython 3.6m: /// Linux: foobar.cpython-36m-x86_64-linux-gnu.so /// Windows: foobar.cp36-win_amd64.pyd /// Mac: foobar.cpython-36m-darwin.so /// FreeBSD: foobar.cpython-36m.so /// /// For pypy3, we read importlib.machinery.EXTENSION_SUFFIXES[0]. pub fn get_library_name(&self, base: &str) -> String { format!( "{base}{ext_suffix}", base = base, ext_suffix = self.ext_suffix ) } /// Is this a debug build of Python for Windows? pub fn is_windows_debug(&self) -> bool { self.ext_suffix.starts_with("_d.") && self.ext_suffix.ends_with(".pyd") } /// Construct a `PythonInterpreter` from a sysconfig and target pub fn from_config(config: InterpreterConfig) -> Self { let implementation_name = config.interpreter_kind.to_string().to_ascii_lowercase(); PythonInterpreter { config, executable: PathBuf::new(), platform: None, runnable: false, implementation_name, soabi: None, soabi_platform: None, } } /// Create a non-runnable placeholder interpreter. /// /// Used for abi3 builds when no real interpreter is available. The /// placeholder carries just enough metadata (major/minor version, /// ext_suffix) for wheel tagging to work. pub(crate) fn placeholder(major: usize, minor: usize, target: &Target) -> Self { PythonInterpreter { config: InterpreterConfig { major, minor, interpreter_kind: InterpreterKind::CPython, abiflags: String::new(), ext_suffix: if target.is_windows() { ".pyd".to_string() } else { String::new() }, pointer_width: None, gil_disabled: false, }, executable: PathBuf::new(), platform: None, runnable: false, implementation_name: "cpython".to_string(), soabi: None, soabi_platform: None, } } /// Checks whether the given command is a python interpreter and returns a /// [`PythonInterpreter`] if that is the case. /// /// The `bridge` parameter is used to skip the platform-system mismatch /// check for cffi bindings. pub fn check_executable( executable: impl AsRef, target: &Target, bridge: &crate::BridgeModel, ) -> Result> { discovery::check_executable(executable, target, bridge) } /// Checks that given list of executables are all valid python interpreters, /// determines the abiflags and versions of those interpreters and /// returns them as [`PythonInterpreter`]s. pub fn check_executables( executables: &[PathBuf], target: &Target, bridge: &crate::BridgeModel, ) -> Result> { discovery::check_executables(executables, target, bridge) } /// Tries to find all installed python versions using the heuristic for the /// given platform. pub fn find_all( target: &Target, bridge: &crate::BridgeModel, requires_python: Option<&pep440_rs::VersionSpecifiers>, ) -> Result> { discovery::find_all(target, bridge, requires_python) } /// Look up Python interpreters for a given target from maturin's bundled /// sysconfig data. /// /// This does **not** discover interpreters on disk — it returns non-runnable /// `PythonInterpreter` values constructed from bundled sysconfig metadata. pub fn lookup_target( target: &Target, requires_python: Option<&pep440_rs::VersionSpecifiers>, bridge: Option<&crate::BridgeModel>, ) -> Vec { discovery::lookup_target(target, requires_python, bridge) } /// Run a python script using this Python interpreter. pub fn run_script(&self, script: &str) -> Result { use std::io::Write; use std::process::{Command, Stdio}; if !self.runnable { bail!("This {} isn't runnable", self); } let out = Command::new(&self.executable) .env("PYTHONIOENCODING", "utf-8") .stdin(Stdio::piped()) .stdout(Stdio::piped()) .stderr(Stdio::inherit()) .spawn() .and_then(|mut child| { child .stdin .as_mut() .expect("piped stdin") .write_all(script.as_bytes())?; child.wait_with_output() }); match out { Err(err) => { if err.kind() == std::io::ErrorKind::NotFound { bail!( "Could not find any interpreter at {}, \ are you sure you have Python installed on your PATH?", self.executable.display() ); } else { bail!( "Failed to run the Python interpreter at {}: {}", self.executable.display(), err ); } } Ok(ok) if !ok.status.success() => bail!("Python script failed"), Ok(ok) => Ok(String::from_utf8(ok.stdout)?), } } /// Whether this Python interpreter support portable manylinux/musllinux wheels /// /// Returns `true` if we can not decide pub fn support_portable_wheels(&self) -> bool { if !self.runnable { return true; } let out = std::process::Command::new(&self.executable) .args([ "-m", "pip", "debug", "--verbose", "--disable-pip-version-check", ]) .output(); match out { Err(_) => true, Ok(ok) if !ok.status.success() => true, Ok(ok) => { if let Ok(stdout) = String::from_utf8(ok.stdout) { stdout.contains("manylinux") || stdout.contains("musllinux") } else { true } } } } /// An opaque fingerprint of this Python interpreter's version and ABI. /// Used to trigger rebuilds for `pyo3` when the Python interpreter changes. pub fn environment_signature(&self) -> String { let pointer_width = self.pointer_width.unwrap_or(64); format!( "{}-{}.{}{}-{}bit", self.implementation_name, self.major, self.minor, self.abiflags, pointer_width ) } /// Returns the site-packages directory inside a venv e.g. /// {venv_base}/lib/python{x}.{y} on unix or {venv_base}/Lib on window pub fn get_venv_site_package(&self, venv_base: impl AsRef, target: &Target) -> PathBuf { if target.is_unix() { match self.interpreter_kind { InterpreterKind::CPython | InterpreterKind::GraalPy => { let python_dir = format!("python{}.{}", self.major, self.minor); venv_base .as_ref() .join("lib") .join(python_dir) .join("site-packages") } InterpreterKind::PyPy => venv_base.as_ref().join("site-packages"), } } else { venv_base.as_ref().join("Lib").join("site-packages") } } } impl fmt::Display for PythonInterpreter { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if self.runnable { write!( f, "{} {}.{}{} at {}", self.config.interpreter_kind, self.config.major, self.config.minor, self.config.abiflags, self.executable.display() ) } else { write!( f, "{} {}.{}{}", self.config.interpreter_kind, self.config.major, self.config.minor, self.config.abiflags, ) } } } #[cfg(test)] mod tests { use super::*; fn interpreter( kind: InterpreterKind, minor: usize, abiflags: &str, gil_disabled: bool, ) -> PythonInterpreter { PythonInterpreter { config: InterpreterConfig { major: 3, minor, interpreter_kind: kind, abiflags: abiflags.to_string(), ext_suffix: String::new(), pointer_width: None, gil_disabled, }, executable: PathBuf::new(), platform: None, runnable: false, implementation_name: kind.to_string().to_ascii_lowercase(), soabi: None, soabi_platform: None, } } fn windows_interpreter( platform: &str, minor: usize, abiflags: &str, gil_disabled: bool, ) -> PythonInterpreter { let mut interpreter = interpreter(InterpreterKind::CPython, minor, abiflags, gil_disabled); // Keep EXT_SUFFIX and SOABI identical so sysconfig.get_platform() is // the only source of MinGW identity exercised by these tests. interpreter.config.ext_suffix = ".pyd".to_string(); interpreter.platform = Some(platform.to_string()); interpreter } #[test] fn pyo3_config_file_windows_mingw_abi3_lib_name() { let target = Target::from_resolved_target_triple("x86_64-pc-windows-gnu").unwrap(); let interpreter = windows_interpreter("mingw_x86_64_msvcrt_gnu", 14, "", false); let config_file = interpreter.pyo3_config_file_with_platform( &target, Some(StableAbi::from_abi3_version(3, 10)), true, ); assert!( config_file .lines() .any(|line| line == "lib_name=libpython3"), "MinGW abi3 config did not select libpython3:\n{config_file}" ); } #[test] fn pyo3_config_file_windows_mingw_abi3t_lib_name() { let target = Target::from_resolved_target_triple("x86_64-pc-windows-gnu").unwrap(); let interpreter = windows_interpreter("mingw_x86_64_msvcrt_gnu", 15, "t", true); let config_file = interpreter.pyo3_config_file_with_platform( &target, Some(StableAbi::from_abi3t_version(3, 15)), true, ); assert!( config_file .lines() .any(|line| line == "lib_name=libpython3t"), "MinGW abi3t config did not select libpython3t:\n{config_file}" ); } #[test] fn pyo3_config_file_windows_non_mingw_control() { let target = Target::from_resolved_target_triple("x86_64-pc-windows-gnu").unwrap(); let interpreter = windows_interpreter("win_amd64", 14, "", false); let config_file = interpreter.pyo3_config_file_with_platform( &target, Some(StableAbi::from_abi3_version(3, 10)), true, ); assert!( !config_file .lines() .any(|line| line.starts_with("lib_name=")), "non-MinGW Windows config unexpectedly selected a library name:\n{config_file}" ); } #[test] fn environment_signature_includes_abiflags() { for flags in ["", "d", "t", "td"] { let interp = interpreter(InterpreterKind::CPython, 14, flags, flags.contains('t')); assert_eq!( interp.environment_signature(), format!("cpython-3.14{flags}-64bit") ); } } #[test] fn uv_python_arg_runnable_uses_executable() { let mut interp = interpreter(InterpreterKind::CPython, 10, "", false); interp.executable = PathBuf::from("/usr/bin/python3.10"); interp.runnable = true; assert_eq!( interp.as_uv_python_arg(), Cow::Borrowed(OsStr::new("/usr/bin/python3.10")) ); } #[test] fn uv_python_arg_runnable_but_empty_executable_falls_back() { let mut interp = interpreter(InterpreterKind::CPython, 10, "", false); interp.runnable = true; assert_eq!(interp.as_uv_python_arg(), OsStr::new("cpython@3.10+gil")); } #[test] fn uv_python_arg_cpython_requests_gil() { let interp = interpreter(InterpreterKind::CPython, 14, "", false); assert_eq!(interp.as_uv_python_arg(), OsStr::new("cpython@3.14+gil")); } #[test] fn uv_python_arg_free_threaded_uses_abiflags() { let interp = interpreter(InterpreterKind::CPython, 14, "t", true); assert_eq!(interp.as_uv_python_arg(), OsStr::new("cpython@3.14t")); } #[test] fn uv_python_arg_debug_keeps_abiflags_and_gil() { let interp = interpreter(InterpreterKind::CPython, 13, "d", false); assert_eq!(interp.as_uv_python_arg(), OsStr::new("cpython@3.13d+gil")); } #[test] fn uv_python_arg_pypy_omits_gil() { let interp = interpreter(InterpreterKind::PyPy, 10, "", false); assert_eq!(interp.as_uv_python_arg(), OsStr::new("pypy@3.10")); } #[test] fn uv_python_arg_graalpy_omits_gil() { let interp = interpreter(InterpreterKind::GraalPy, 11, "", false); assert_eq!(interp.as_uv_python_arg(), OsStr::new("graalpy@3.11")); } } maturin-1.16.0/src/python_interpreter/resolver.rs000066400000000000000000001305021527064705700222360ustar00rootroot00000000000000//! Centralized Python interpreter resolution. //! //! This module consolidates the various interpreter discovery, validation, //! deduplication, and filtering paths that were previously scattered across //! `build_options.rs` and `python_interpreter/mod.rs`. //! //! The resolution follows a unified pipeline: //! //! ```text //! PYO3_CONFIG_FILE check //! → Discover candidates (native, cross+lib_dir, cross+sysconfig) //! → Filter (abi3 policy) //! → Finalize (fallback to placeholder, platform-specific) //! → Convert Candidate → PythonInterpreter //! ``` use super::{InterpreterConfig, InterpreterKind, PythonInterpreter}; use crate::cross_compile::{ find_build_details, find_sysconfigdata, parse_build_details_json_file, parse_sysconfigdata, }; use crate::python_interpreter::abiflags::{default_abiflags, validate_abiflags}; use crate::{BridgeModel, StableAbiKind, Target}; use anyhow::{Context, Result, bail, format_err}; use pep440_rs::VersionSpecifiers; use std::env; use std::path::{Path, PathBuf}; use tracing::debug; use crate::bridge::{PyO3, StableAbiVersion}; /// How a candidate Python interpreter was discovered. /// /// Tracks provenance so the pipeline can make informed decisions /// (e.g. whether to set `PYO3_PYTHON`, whether the interpreter is runnable). #[derive(Debug, Clone, PartialEq, Eq)] enum CandidateSource { /// A real executable on the host machine. Executable, /// From `PYO3_CROSS_LIB_DIR` (build-details.json or sysconfigdata). CrossCompileLib, /// From maturin's bundled sysconfig data (no real interpreter available). Sysconfig, /// A non-runnable placeholder for abi3 when no real interpreter was found. Placeholder, } /// A Python interpreter candidate found during discovery. /// /// Wraps a [`PythonInterpreter`] with metadata about how it was found, /// enabling the resolution pipeline to make informed decisions about /// filtering, environment setup, and fallback strategies. #[derive(Debug, Clone)] struct Candidate { interpreter: PythonInterpreter, source: CandidateSource, } impl Candidate { /// Classify existing `PythonInterpreter`s as candidates based on `runnable`. fn from_interpreters(interps: Vec) -> Vec { interps .into_iter() .map(|interpreter| { let source = if interpreter.runnable { CandidateSource::Executable } else { CandidateSource::Sysconfig }; Candidate { interpreter, source, } }) .collect() } /// Convert this candidate into a `PythonInterpreter`, discarding source info. fn into_interpreter(self) -> PythonInterpreter { self.interpreter } } /// Discovery result: `(candidates, host_python)`. /// /// `host_python` is only set during cross-compilation (from `PYO3_CROSS_LIB_DIR`) /// and is used by the caller to set `PYO3_PYTHON` / `PYTHON_SYS_EXECUTABLE`. type DiscoveryResult = (Vec, Option); /// A parsed interpreter specification from a user-provided string. /// /// Handles formats like `"python3.14t"`, `"pypy3.11"`, `"graalpy-3.10"`, `"3.9"`. #[derive(Debug, Clone)] struct InterpreterSpec { kind: InterpreterKind, major: usize, minor: usize, abiflags: String, } impl InterpreterSpec { /// Parse a user-provided interpreter string. /// /// Accepts: /// - `pypy3.11` or `pypy-3.11` /// - `graalpy3.10` or `graalpy-3.10` /// - `python3.14t` or `python-3.14t` /// - `3.9` or `3.14t` (bare version, assumes CPython) /// /// Returns `None` for version-less names like `"pypy"` or `"python"`. /// Returns `Ok(None)` for file paths or unrecognized formats. fn parse(s: &str) -> Result> { let (kind, ver_str) = if let Some(ver) = s.strip_prefix("pypy") { (InterpreterKind::PyPy, ver.strip_prefix('-').unwrap_or(ver)) } else if let Some(ver) = s.strip_prefix("graalpy") { ( InterpreterKind::GraalPy, ver.strip_prefix('-').unwrap_or(ver), ) } else if let Some(ver) = s.strip_prefix("python") { ( InterpreterKind::CPython, ver.strip_prefix('-').unwrap_or(ver), ) } else if s.starts_with(|c: char| c.is_ascii_digit()) { (InterpreterKind::CPython, s) } else { // File paths or unrecognized names (e.g. "jython3.9") are not // interpreter specs — return None so callers can handle them. return Ok(None); }; if ver_str.is_empty() || !ver_str.starts_with(|c: char| c.is_ascii_digit()) { return Ok(None); } let (ver_str, abiflags) = if let Some(v) = ver_str.strip_suffix('t') { (v, "t") } else { (ver_str, "") }; // PyPy / GraalPy don't support free-threaded builds if !matches!(kind, InterpreterKind::CPython) && abiflags == "t" { bail!("Free-threaded builds are only supported for CPython, not {kind}"); } let (major_str, minor_str) = match ver_str.split_once('.') { Some(parts) => parts, None => return Ok(None), // e.g. "python3" — no minor version }; let major = major_str.parse::().with_context(|| { format!("Invalid python interpreter major version '{major_str}', expect a digit") })?; let minor = minor_str.parse::().with_context(|| { format!("Invalid python interpreter minor version '{minor_str}', expect a digit") })?; if (major, minor) < (3, 14) && abiflags == "t" { bail!("Free-threaded Python interpreter is only supported on 3.14 and later."); } Ok(Some(InterpreterSpec { kind, major, minor, abiflags: abiflags.to_string(), })) } /// Try to parse a filename (not a full path) for kind/abiflags detection. /// Returns `None` for unparsable names rather than erroring. fn try_parse_filename(s: &str) -> Option { // Ignore errors (file paths, unsupported formats) — just return None Self::parse(s).ok().flatten() } } /// Resolves which Python interpreters to build wheels for. /// /// Given a bridge model, target platform, and optional user-specified /// interpreters, discovers and validates the set of Python interpreters /// that should be used for the build. Handles all combinations of: /// /// - abi3 vs non-abi3 /// - cross-compile vs native /// - Windows vs Unix /// - user-specified interpreters vs auto-discovery /// /// Entry point: [`resolve()`](Self::resolve), which returns the list of /// interpreters and an optional host python path for cross-compilation. pub struct InterpreterResolver<'a> { target: &'a Target, bridge: &'a BridgeModel, requires_python: Option<&'a VersionSpecifiers>, user_interpreters: &'a [PathBuf], find_interpreter: bool, has_import_lib_support: bool, } impl<'a> InterpreterResolver<'a> { /// Create a new interpreter resolver with the given build context. pub fn new( target: &'a Target, bridge: &'a BridgeModel, requires_python: Option<&'a VersionSpecifiers>, user_interpreters: &'a [PathBuf], find_interpreter: bool, has_import_lib_support: bool, ) -> Self { Self { target, bridge, requires_python, user_interpreters, find_interpreter, has_import_lib_support, } } /// Main entry point: resolve the list of Python interpreters to build for. /// /// Returns the resolved interpreters and, for cross-compilation, the host /// Python path that should be used to set `PYO3_PYTHON`. pub fn resolve(&self) -> Result<(Vec, Option)> { match self.bridge { BridgeModel::Cffi => self.resolve_single("cffi").map(|i| (vec![i], None)), BridgeModel::Bin(None) | BridgeModel::UniFfi => { // A single interpreter is required for PGO, if the user doesn't // specify any, we don't care and can skip searching. if self.user_interpreters.is_empty() { Ok((vec![], None)) } else { let bridge_name = match self.bridge { BridgeModel::Bin(None) => "bin", BridgeModel::UniFfi => "uniffi", _ => unreachable!(), }; self.resolve_single(bridge_name).map(|i| (vec![i], None)) } } BridgeModel::PyO3(pyo3) | BridgeModel::Bin(Some(pyo3)) => self.resolve_pyo3(pyo3), } } /// Resolve interpreters for pyo3/pyo3-ffi bindings (including Bin(Some(pyo3))). /// /// Follows a unified pipeline regardless of native/cross, abi3/non-abi3: /// 1. Check `PYO3_CONFIG_FILE` (explicit override) /// 2. Discover candidates /// 3. Set `PYO3_PYTHON` if cross-compiling with a host interpreter /// 4. Filter for abi3 (if applicable) /// 5. Finalize: apply fallback policies, validate result fn resolve_pyo3(&self, pyo3: &PyO3) -> Result<(Vec, Option)> { // Step 1: PYO3_CONFIG_FILE is an explicit override that trumps everything if let Some(config_file) = env::var_os("PYO3_CONFIG_FILE") { let config = InterpreterConfig::from_pyo3_config(config_file.as_ref(), self.target) .context("Invalid PYO3_CONFIG_FILE")?; return Ok((vec![PythonInterpreter::from_config(config)], None)); } let fixed_abi3 = pyo3 .stable_abi .filter(|stable_abi| stable_abi.kind == StableAbiKind::Abi3) .and_then(|stable_abi| match stable_abi.version { StableAbiVersion::Version(major, minor) => Some((major, minor)), StableAbiVersion::CurrentPython => None, }); // Step 2: Discover candidates (unified for native/cross) let (candidates, host_python_interp) = self.discover_candidates(fixed_abi3)?; // Capture host_python for the caller to set PYO3_PYTHON let host_python = host_python_interp.as_ref().map(|h| h.executable.clone()); // Step 3-4: Filter and finalize (differs for abi3 vs non-abi3) let interpreters = if let Some((major, minor)) = fixed_abi3 { // Filter out non-abi3-capable interpreters (PyPy, free-threaded) // unless the user explicitly provided them via `-i`. // When `develop` passes a venv python, user_interpreters is non-empty // so we trust that choice (the filename is just "python" and doesn't // encode interpreter kind/flags). let filtered = if !self.find_interpreter && !self.user_interpreters.is_empty() { candidates } else { self.filter_for_abi3(candidates) }; self.finalize_abi3(filtered, major, minor)? } else { Self::print_found_candidates(&candidates); Self::candidates_to_interpreters(candidates) }; Ok((interpreters, host_python)) } /// Discover interpreter candidates based on the build context. /// /// Source priority: /// 1. `PYO3_CROSS_LIB_DIR` (build-details.json or sysconfigdata) /// 2. Cross-compile without lib dir: bundled sysconfig (non-abi3) /// 3. Native build / abi3 cross without lib dir: real host interpreters fn discover_candidates(&self, fixed_abi3: Option<(u8, u8)>) -> Result { // Cross-compilation with PYO3_CROSS_LIB_DIR if self.target.cross_compiling() && let Some(cross_lib_dir) = env::var_os("PYO3_CROSS_LIB_DIR") { // Abi3 Windows cross with PYO3_CROSS_LIB_DIR: use a placeholder if let Some((major, minor)) = fixed_abi3 && self.target.is_windows() { return Ok(( vec![Candidate { interpreter: PythonInterpreter::placeholder( major as usize, minor as usize, self.target, ), source: CandidateSource::Placeholder, }], None, )); } return self.discover_from_cross_lib_dir(cross_lib_dir.as_ref()); } // Cross-compile without lib dir, non-abi3: use bundled sysconfig if self.target.cross_compiling() && fixed_abi3.is_none() { return self.discover_cross_sysconfig(); } // Native build, or abi3 cross without PYO3_CROSS_LIB_DIR // (abi3 cross can use host interpreters since the wheel is version-independent) self.discover_native(fixed_abi3) } /// Discover from `PYO3_CROSS_LIB_DIR` (build-details.json or sysconfigdata). fn discover_from_cross_lib_dir(&self, cross_lib_path: &Path) -> Result { if let Some(build_details_path) = find_build_details(cross_lib_path)? { eprintln!("ðŸ�� Using build-details.json for cross-compiling preparation"); let config = parse_build_details_json_file(&build_details_path)?; let host_python = self.find_host_python()?; let soabi = InterpreterConfig::soabi_from_ext_suffix(&config.ext_suffix); let implementation_name = config.interpreter_kind.to_string().to_ascii_lowercase(); let interp = PythonInterpreter { config, executable: PathBuf::new(), platform: None, runnable: false, implementation_name, soabi, soabi_platform: None, }; Ok(( vec![Candidate { interpreter: interp, source: CandidateSource::CrossCompileLib, }], Some(host_python), )) } else { let host_python = self.find_host_python()?; eprintln!("ðŸ�� Using host {host_python} for cross-compiling preparation"); let sysconfig_path = find_sysconfigdata(cross_lib_path, self.target)?; let sysconfig_data = parse_sysconfigdata(&host_python, sysconfig_path)?; let interpreter = self.interpreter_from_sysconfigdata(&sysconfig_data)?; Ok(( vec![Candidate { interpreter, source: CandidateSource::CrossCompileLib, }], Some(host_python), )) } } /// Discover interpreters for cross-compilation without `PYO3_CROSS_LIB_DIR`. /// /// Uses maturin's bundled sysconfig data to construct non-runnable interpreters /// matching the target platform. fn discover_cross_sysconfig(&self) -> Result { if self.user_interpreters.is_empty() && !self.find_interpreter { bail!( "Couldn't find any python interpreters. \ Please specify at least one with -i" ); } // Check if user-specified interpreters are valid file paths for interp in self.user_interpreters { if interp.components().count() > 1 && super::discovery::check_executable(interp, self.target, self.bridge)?.is_none() { bail!("{} is not a valid python interpreter", interp.display()); } } let interpreters = self.find_in_sysconfig(self.user_interpreters)?; if interpreters.is_empty() { bail!( "Couldn't find any python interpreters from '{}'. \ Please check that both major and minor python version \ have been specified in -i/--interpreter.", self.user_interpreters .iter() .map(|p| p.display().to_string()) .collect::>() .join(", ") ); } Ok(( interpreters .into_iter() .map(|interpreter| Candidate { interpreter, source: CandidateSource::Sysconfig, }) .collect(), None, )) } /// Discover interpreters on the host machine. /// /// 1. Try to find real interpreters (auto-discover or check user-specified) /// 2. Fall back to bundled sysconfig for any that aren't found /// 3. For abi3 builds, also try a broader sysconfig fallback if nothing works fn discover_native(&self, fixed_abi3: Option<(u8, u8)>) -> Result { // --- Step 1+2: Find real interpreters with per-interpreter sysconfig fallback --- let found = if self.find_interpreter { super::discovery::find_all(self.target, self.bridge, self.requires_python) .context("Finding python interpreters failed")? } else { self.find_specified_interpreters()? }; if !found.is_empty() { return Ok((Candidate::from_interpreters(found), None)); } // --- Step 3: Nothing found — try abi3 sysconfig fallback --- if fixed_abi3.is_some() { if self.target.is_windows() && !self.has_import_lib_support { bail!( "Need a Python interpreter to compile for Windows without \ PyO3's `generate-import-lib` feature" ); } let sysconfig_result = self.find_in_sysconfig(self.user_interpreters); // Auto-discovery: swallow errors, fall through to placeholder. // User-specified interpreters: propagate parse errors. let sysconfig_interps = if self.user_interpreters.is_empty() { sysconfig_result.unwrap_or_default() } else { sysconfig_result? }; // If the user specified interpreters and sysconfig didn't find them // either, fall through to the error below rather than silently // returning an empty list. if !sysconfig_interps.is_empty() || self.user_interpreters.is_empty() { return Ok(( sysconfig_interps .into_iter() .map(|interpreter| Candidate { interpreter, source: CandidateSource::Sysconfig, }) .collect(), None, )); } } // --- Error: nothing found anywhere --- if self.find_interpreter { if let Some(requires_python) = self.requires_python { bail!( "Couldn't find any python interpreters with {requires_python}. \ Please specify at least one with -i" ); } else { bail!( "Couldn't find any python interpreters. \ Please specify at least one with -i" ); } } else { let default_python; let to_check: &[PathBuf] = if !self.user_interpreters.is_empty() { self.user_interpreters } else { default_python = self.get_default_python(); std::slice::from_ref(&default_python) }; let interps_str = to_check .iter() .map(|path| format!("'{}'", path.display())) .collect::>() .join(", "); bail!("Couldn't find any python interpreters from {interps_str}."); } } /// Check user-specified (or default) interpreters, with per-interpreter /// sysconfig fallback for any that aren't found on disk. fn find_specified_interpreters(&self) -> Result> { let default_python; let to_check: &[PathBuf] = if !self.user_interpreters.is_empty() { self.user_interpreters } else { default_python = self.get_default_python(); std::slice::from_ref(&default_python) }; let mut found = Vec::new(); let mut missing = Vec::new(); for interp in to_check { match super::discovery::check_executable(interp.clone(), self.target, self.bridge)? { Some(interp) => found.push(interp), None => missing.push(interp.clone()), } } if !missing.is_empty() { let sysconfig_interps = self.find_in_sysconfig(&missing)?; if !sysconfig_interps.is_empty() && self.target.is_windows() && !self.has_import_lib_support { let names = sysconfig_interps .iter() .map(|i| format!("{} {}.{}", i.interpreter_kind, i.major, i.minor)) .collect::>(); bail!( "Interpreters {names:?} were found in maturin's bundled sysconfig, \ but compiling for Windows without an interpreter requires \ PyO3's `generate-import-lib` feature" ); } found.extend(sysconfig_interps); } // When using the default interpreter (not user-specified), filter by // requires-python so we don't pick up an incompatible interpreter // that just happens to be first on PATH (fixes #3107). if self.user_interpreters.is_empty() && let Some(requires_python) = self.requires_python { found.retain(|interp| { requires_python.contains(&pep440_rs::Version::new([ interp.major as u64, interp.minor as u64, ])) }); } Ok(found) } /// Filter candidates for abi3 builds. /// /// When building abi3 wheels, we prefer interpreters that support the stable API. /// Non-abi3-capable interpreters (PyPy, free-threaded CPython) are only included /// if explicitly requested by the user via `-i`. Note that `--find-interpreter` /// leaves `user_interpreters` empty, so a free-threaded interpreter discovered that /// way is dropped here for abi3 builds; producing an abi3 + free-threaded 3.14t /// wheel requires an explicit `-i python3.14t`. /// /// This fixes: /// - #2772: free-threaded interpreter chosen over non-free-threaded for abi3 /// - #2852: unexpected PyPy wheel generated for abi3 cross-compile /// - #2607: PyPy from `-i` is now honored (not silently dropped) fn filter_for_abi3(&self, candidates: Vec) -> Vec { if candidates.is_empty() { return candidates; } let user_requested_pypy = self.user_requested_pypy(); let user_requested_free_threaded = self.user_requested_free_threaded(); let (abi3_capable, non_abi3): (Vec<_>, Vec<_>) = candidates .into_iter() .partition(|c| c.interpreter.has_stable_api(StableAbiKind::Abi3)); let mut result = abi3_capable; // Only include non-abi3-capable interpreters if explicitly requested for candidate in non_abi3 { let excluded = match candidate.interpreter.interpreter_kind { InterpreterKind::PyPy => !user_requested_pypy, InterpreterKind::CPython if candidate.interpreter.gil_disabled => { !user_requested_free_threaded } _ => false, }; if !excluded { result.push(candidate); } } result } /// Check if any user-specified interpreter looks like PyPy. fn user_requested_pypy(&self) -> bool { self.user_interpreters.iter().any(|p| { let name = p .file_name() .map(|f| f.to_string_lossy()) .unwrap_or_default(); // Check parsed spec first, then fall back to prefix match for // version-less names like "pypy" or "/usr/bin/pypy" InterpreterSpec::try_parse_filename(&name) .is_some_and(|s| s.kind == InterpreterKind::PyPy) || name.starts_with("pypy") }) } /// Check if any user-specified interpreter looks like free-threaded Python. fn user_requested_free_threaded(&self) -> bool { self.user_interpreters.iter().any(|p| { let name = p .file_name() .map(|f| f.to_string_lossy()) .unwrap_or_default(); InterpreterSpec::try_parse_filename(&name).is_some_and(|s| s.abiflags == "t") }) } /// Finalize abi3 resolution: apply platform-specific fallbacks. fn finalize_abi3( &self, candidates: Vec, major: u8, minor: u8, ) -> Result> { // Handle abi3 cross-compilation (PyPy → sysconfig) let candidates = if self.target.cross_compiling() { self.handle_abi3_cross(candidates)? } else { candidates }; // Windows-specific abi3 handling if self.target.is_windows() { return self.finalize_abi3_windows(candidates, major, minor); } if !candidates.is_empty() { // Check if any candidate meets the abi3 minimum version. // If none do and the user didn't explicitly request interpreters, // fall back to a placeholder so the build can proceed without a // compatible interpreter on PATH (e.g. manylinux containers where // the system Python is older than the abi3 minimum). let has_compatible = candidates.iter().any(|c| { c.interpreter.has_stable_api(StableAbiKind::Abi3) && (c.interpreter.major as u8, c.interpreter.minor as u8) >= (major, minor) }); if has_compatible || !self.user_interpreters.is_empty() { Self::print_found_candidates(&candidates); Ok(Self::candidates_to_interpreters(candidates)) } else { eprintln!("ðŸ�� Not using a specific python interpreter"); Ok(vec![PythonInterpreter::placeholder( major as usize, minor as usize, self.target, )]) } } else if self.user_interpreters.is_empty() { eprintln!("ðŸ�� Not using a specific python interpreter"); Ok(vec![PythonInterpreter::placeholder( major as usize, minor as usize, self.target, )]) } else { bail!("Failed to find any python interpreter"); } } /// Handle abi3 cross-compilation: resolve PyPy through sysconfig. fn handle_abi3_cross(&self, candidates: Vec) -> Result> { let mut interps = Vec::with_capacity(candidates.len()); let mut pypys = Vec::new(); for candidate in candidates { if candidate.interpreter.interpreter_kind.is_pypy() { // Only include PyPy in cross-compile abi3 if explicitly requested (#2852) if self.user_requested_pypy() { pypys.push(PathBuf::from(format!( "pypy{}.{}", candidate.interpreter.major, candidate.interpreter.minor ))); } } else { interps.push(candidate); } } // Cross-compiling to PyPy with abi3: can't use host pypy, use sysconfig if !pypys.is_empty() { let sysconfig_interps = self.find_in_sysconfig(&pypys)?; interps.extend(sysconfig_interps.into_iter().map(|interpreter| Candidate { interpreter, source: CandidateSource::Sysconfig, })); } Ok(interps) } /// Finalize abi3 on Windows. /// /// Note: `PYO3_CROSS_LIB_DIR` and `PYO3_CONFIG_FILE` are already handled /// earlier in the unified pipeline. fn finalize_abi3_windows( &self, candidates: Vec, major: u8, minor: u8, ) -> Result> { let interpreters = Self::candidates_to_interpreters(candidates); if self.has_import_lib_support { eprintln!( "ðŸ�� Not using a specific python interpreter \ (automatically generating windows import library)" ); let mut result = interpreters; if result.is_empty() { result.push(PythonInterpreter::placeholder( major as usize, minor as usize, self.target, )); } return Ok(result); } if interpreters.is_empty() { bail!("Failed to find any python interpreter"); } Ok(interpreters) } /// Find a host Python interpreter for cross-compilation. fn find_host_python(&self) -> Result { let interpreters = if !self.user_interpreters.is_empty() { super::discovery::check_executables(self.user_interpreters, self.target, self.bridge)? } else { super::discovery::find_all(self.target, self.bridge, self.requires_python) .context("Finding python interpreters failed")? }; if interpreters.is_empty() { if let Some(requires_python) = self.requires_python { bail!( "Couldn't find any python interpreters with {}. \ Please specify at least one with -i", requires_python ); } else { bail!( "Couldn't find any python interpreters. \ Please specify at least one with -i" ); } } Ok(interpreters .into_iter() .next() .expect("checked non-empty above")) } /// Find python interpreters in the bundled sysconfig. /// /// When `interpreters` is empty, returns all interpreters matching the target. /// Otherwise, parses each entry as an [`InterpreterSpec`] and looks up the /// corresponding sysconfig. fn find_in_sysconfig(&self, interpreters: &[PathBuf]) -> Result> { if interpreters.is_empty() { return Ok(super::discovery::lookup_target( self.target, self.requires_python, Some(self.bridge), )); } let mut result = Vec::new(); for interp in interpreters { let interp_display = interp.display().to_string(); let python_name = interp .file_name() .and_then(|s| s.to_str()) .unwrap_or(&interp_display); let spec = match InterpreterSpec::parse(python_name)? { Some(spec) => spec, None => { // version-less name like bare "pypy" — warn the user eprintln!( "âš ï¸� Warning: Skipping '{interp_display}': could not determine version \ from interpreter name '{python_name}'. \ Specify a version like '{python_name}3.11'." ); continue; } }; let sysconfig = InterpreterConfig::lookup_one( self.target, spec.kind, (spec.major, spec.minor), &spec.abiflags, ) .with_context(|| { format!( "Failed to find a {} {}.{} interpreter in known sysconfig", spec.kind, spec.major, spec.minor ) })?; debug!( "Found {} {}.{}{} in bundled sysconfig", sysconfig.interpreter_kind, sysconfig.major, sysconfig.minor, sysconfig.abiflags ); result.push(PythonInterpreter::from_config(sysconfig.clone())); } Ok(result) } /// Build a PythonInterpreter from sysconfigdata. fn interpreter_from_sysconfigdata( &self, data: &std::collections::HashMap, ) -> Result { let major = data .get("version_major") .context("version_major is not defined")? .parse::() .context("Could not parse value of version_major")?; let minor = data .get("version_minor") .context("version_minor is not defined")? .parse::() .context("Could not parse value of version_minor")?; let ext_suffix = data .get("EXT_SUFFIX") .context("sysconfig didn't define an `EXT_SUFFIX` ಠ_ಠ")?; let soabi = data.get("SOABI"); let soabi_platform = data.get("SOABI_PLATFORM").cloned(); let interpreter_kind = soabi .and_then(|tag| { if tag.starts_with("pypy") { Some(InterpreterKind::PyPy) } else if tag.starts_with("cpython") { Some(InterpreterKind::CPython) } else if tag.starts_with("graalpy") { Some(InterpreterKind::GraalPy) } else { None } }) .context("unsupported Python interpreter")?; // if sysconfig missing the Py_DEBUG or Py_GIL_DISABLED env vars, fall back to inferring from abiflags (if present) let abiflags = data.get("ABIFLAGS"); let debug = data.get("Py_DEBUG").map(|x| x == "1").unwrap_or( abiflags .map(String::as_str) .unwrap_or_default() .contains("d"), ); let gil_disabled = data.get("Py_GIL_DISABLED").map(|x| x == "1").unwrap_or( abiflags .map(String::as_str) .unwrap_or_default() .contains("t"), ); // and finally, if abiflags are missing, infer from Py_DEBUG and Py_GIL_DISABLED let abiflags = if let Some(abiflags) = abiflags { validate_abiflags(abiflags, gil_disabled, debug)?; abiflags.to_string() } else { default_abiflags(minor, gil_disabled, debug) }; Ok(PythonInterpreter { config: InterpreterConfig { major, minor, interpreter_kind, abiflags, ext_suffix: ext_suffix.to_string(), pointer_width: None, gil_disabled, }, executable: PathBuf::new(), platform: None, runnable: false, implementation_name: interpreter_kind.to_string().to_ascii_lowercase(), soabi: soabi.cloned(), soabi_platform, }) } /// Resolve a single interpreter for cffi or similar. fn resolve_single(&self, bridge_name: &str) -> Result { let executable = if self.user_interpreters.is_empty() { self.target.get_python() } else if self.user_interpreters.len() == 1 { self.user_interpreters[0].clone() } else { bail!( "You can only specify one python interpreter for `{}` bindings", bridge_name ); }; let err_message = format!( "Failed to find a python interpreter from `{}`", executable.display() ); let interp = super::discovery::check_executable(executable, self.target, self.bridge) .context(format_err!(err_message.clone()))? .ok_or_else(|| format_err!(err_message))?; eprintln!("ðŸ�� Using {interp} to generate the {bridge_name} bindings"); Ok(interp) } /// Get the default python executable to use. fn get_default_python(&self) -> PathBuf { if self.bridge.is_pyo3() { std::env::var("PYO3_PYTHON") .ok() .map(PathBuf::from) .unwrap_or_else(|| self.target.get_python()) } else { self.target.get_python() } } /// Print "Found ..." for candidates discovered from executables or sysconfig. /// /// Candidates from `CrossCompileLib` and `Placeholder` sources are skipped /// since they have their own messages printed during discovery/finalization. fn print_found_candidates(candidates: &[Candidate]) { let displayable: Vec<_> = candidates .iter() .filter(|c| { matches!( c.source, CandidateSource::Executable | CandidateSource::Sysconfig ) }) .map(|c| c.interpreter.to_string()) .collect(); if !displayable.is_empty() { eprintln!("ðŸ�� Found {}", displayable.join(", ")); } } /// Convert candidates to interpreters, discarding source info. fn candidates_to_interpreters(candidates: Vec) -> Vec { candidates .into_iter() .map(Candidate::into_interpreter) .collect() } } #[cfg(test)] mod tests { use super::*; #[test] fn sysconfigdata_normalizes_abiflags() { let target = Target::from_resolved_target_triple("x86_64-unknown-linux-gnu").unwrap(); let bridge = BridgeModel::Bin(None); let resolver = InterpreterResolver::new(&target, &bridge, None, &[], false, false); for (flags, gil_disabled, debug, expected) in [ (None, None, None, ""), (None, Some("1"), None, "t"), (Some(""), None, None, ""), (Some("d"), None, Some("1"), "d"), (Some("td"), Some("1"), Some("1"), "td"), (Some("t"), Some("1"), None, "t"), (None, Some("1"), None, "t"), (None, Some("1"), Some("1"), "td"), (Some("td"), Some("1"), Some("1"), "td"), ] { let mut data = std::collections::HashMap::from([ ("version_major".to_string(), "3".to_string()), ("version_minor".to_string(), "14".to_string()), ( "SOABI".to_string(), format!("cpython-314{expected}-x86_64-linux-gnu"), ), ( "EXT_SUFFIX".to_string(), format!(".cpython-314{expected}-x86_64-linux-gnu.so"), ), ]); if let Some(flags) = flags { data.insert("ABIFLAGS".to_string(), flags.to_string()); } if let Some(debug) = debug { data.insert("Py_DEBUG".to_string(), debug.to_string()); } if let Some(gil_disabled) = gil_disabled { data.insert("Py_GIL_DISABLED".to_string(), gil_disabled.to_string()); } let interpreter = resolver.interpreter_from_sysconfigdata(&data).unwrap(); assert_eq!(interpreter.abiflags, expected); assert_eq!(interpreter.gil_disabled, expected.contains('t')); if expected.contains('t') { data.insert("ABIFLAGS".to_string(), expected.to_string()); data.insert("Py_GIL_DISABLED".to_string(), "0".to_string()); assert!(resolver.interpreter_from_sysconfigdata(&data).is_err()); } } } #[test] fn test_interpreter_spec_cpython_versions() { let spec = InterpreterSpec::parse("python3.9").unwrap().unwrap(); assert_eq!(spec.kind, InterpreterKind::CPython); assert_eq!(spec.major, 3); assert_eq!(spec.minor, 9); assert_eq!(spec.abiflags, ""); let spec = InterpreterSpec::parse("python-3.12").unwrap().unwrap(); assert_eq!(spec.kind, InterpreterKind::CPython); assert_eq!(spec.major, 3); assert_eq!(spec.minor, 12); assert_eq!(spec.abiflags, ""); } #[test] fn test_interpreter_spec_bare_version() { let spec = InterpreterSpec::parse("3.9").unwrap().unwrap(); assert_eq!(spec.kind, InterpreterKind::CPython); assert_eq!(spec.major, 3); assert_eq!(spec.minor, 9); assert_eq!(spec.abiflags, ""); let spec = InterpreterSpec::parse("3.14").unwrap().unwrap(); assert_eq!(spec.major, 3); assert_eq!(spec.minor, 14); } #[test] fn test_interpreter_spec_free_threaded() { let spec = InterpreterSpec::parse("python3.14t").unwrap().unwrap(); assert_eq!(spec.kind, InterpreterKind::CPython); assert_eq!(spec.major, 3); assert_eq!(spec.minor, 14); assert_eq!(spec.abiflags, "t"); let spec = InterpreterSpec::parse("3.14t").unwrap().unwrap(); assert_eq!(spec.kind, InterpreterKind::CPython); assert_eq!(spec.major, 3); assert_eq!(spec.minor, 14); assert_eq!(spec.abiflags, "t"); } #[test] fn test_interpreter_spec_free_threaded_too_old() { let err = InterpreterSpec::parse("python3.12t").unwrap_err(); assert!( err.to_string().contains("3.14"), "expected version constraint in error: {err}" ); } #[test] fn test_interpreter_spec_pypy() { let spec = InterpreterSpec::parse("pypy3.11").unwrap().unwrap(); assert_eq!(spec.kind, InterpreterKind::PyPy); assert_eq!(spec.major, 3); assert_eq!(spec.minor, 11); assert_eq!(spec.abiflags, ""); let spec = InterpreterSpec::parse("pypy-3.10").unwrap().unwrap(); assert_eq!(spec.kind, InterpreterKind::PyPy); assert_eq!(spec.major, 3); assert_eq!(spec.minor, 10); } #[test] fn test_interpreter_spec_pypy_free_threaded_rejected() { let err = InterpreterSpec::parse("pypy3.11t").unwrap_err(); assert!( err.to_string().contains("Free-threaded"), "expected free-threaded error: {err}" ); } #[test] fn test_interpreter_spec_graalpy() { let spec = InterpreterSpec::parse("graalpy3.10").unwrap().unwrap(); assert_eq!(spec.kind, InterpreterKind::GraalPy); assert_eq!(spec.major, 3); assert_eq!(spec.minor, 10); let spec = InterpreterSpec::parse("graalpy-3.10").unwrap().unwrap(); assert_eq!(spec.kind, InterpreterKind::GraalPy); assert_eq!(spec.major, 3); assert_eq!(spec.minor, 10); } #[test] fn test_interpreter_spec_graalpy_free_threaded_rejected() { let err = InterpreterSpec::parse("graalpy3.10t").unwrap_err(); assert!( err.to_string().contains("Free-threaded"), "expected free-threaded error: {err}" ); } #[test] fn test_interpreter_spec_version_less_returns_none() { assert!(InterpreterSpec::parse("python").unwrap().is_none()); assert!(InterpreterSpec::parse("pypy").unwrap().is_none()); assert!(InterpreterSpec::parse("graalpy").unwrap().is_none()); } #[test] fn test_interpreter_spec_unrecognized_name() { // Unrecognized interpreter names return None, not an error assert!(InterpreterSpec::parse("jython3.9").unwrap().is_none()); assert!( InterpreterSpec::parse("/usr/bin/python3") .unwrap() .is_none() ); // Windows executable names and bare "python3" without minor version assert!(InterpreterSpec::parse("python.exe").unwrap().is_none()); assert!(InterpreterSpec::parse("python3").unwrap().is_none()); } #[test] fn test_interpreter_spec_try_parse_filename() { let spec = InterpreterSpec::try_parse_filename("python3.14t").unwrap(); assert_eq!(spec.kind, InterpreterKind::CPython); assert_eq!(spec.abiflags, "t"); let spec = InterpreterSpec::try_parse_filename("pypy3.10").unwrap(); assert_eq!(spec.kind, InterpreterKind::PyPy); // version-less names return None assert!(InterpreterSpec::try_parse_filename("python").is_none()); // unsupported names return None (not error) assert!(InterpreterSpec::try_parse_filename("jython3.9").is_none()); } } maturin-1.16.0/src/sbom.rs000066400000000000000000000200701527064705700153670ustar00rootroot00000000000000use crate::BuildContext; use crate::module_writer::ModuleWriter; #[cfg(feature = "sbom")] use anyhow::anyhow; use anyhow::{Context, Result}; use std::collections::HashSet; use std::path::{Path, PathBuf}; use tracing::instrument; #[cfg(feature = "sbom")] use cargo_cyclonedx::config::SbomConfig as CyclonedxConfig; #[cfg(feature = "sbom")] use cargo_cyclonedx::generator::SbomGenerator; /// Pre-generated SBOM data that can be reused across multiple wheel writes. /// /// Since the Rust dependency graph is the same regardless of the target Python /// interpreter, we generate the SBOM once per `BuildContext` build and reuse /// the resulting bytes for every wheel. pub struct SbomData { /// Generated Rust SBOM entries: (package_name, json_bytes). pub rust_sboms: Vec<(String, Vec)>, } impl SbomData { /// Generate Rust SBOMs from the build context. #[instrument(skip_all)] pub(crate) fn generate(context: &BuildContext) -> Result> { // Check if Rust SBOM generation is explicitly disabled let rust_sbom_enabled = context.artifact.sbom.rust.unwrap_or(true); #[cfg(feature = "sbom")] { if !rust_sbom_enabled { return Ok(Some(SbomData { rust_sboms: Vec::new(), })); } let config = CyclonedxConfig { target: Some(cargo_cyclonedx::config::Target::AllTargets), ..CyclonedxConfig::empty_config() }; // cargo-cyclonedx depends on cargo_metadata 0.18, while maturin uses // cargo_metadata 0.23. The Metadata structs are incompatible at the // type level but share the same JSON representation, so we bridge // them via a serde round-trip. let json = serde_json::to_value(context.project.cargo_metadata.as_ref())?; let metadata = serde_json::from_value(json) .context("Failed to convert cargo metadata for SBOM generation")?; let sboms = SbomGenerator::create_sboms(metadata, &config) .map_err(|e| anyhow!("Failed to generate Rust SBOM: {}", e))?; let mut rust_sboms = Vec::new(); for sbom in sboms { // Only keep the SBOM for the crate being built into a wheel. // Each member's SBOM already contains the full transitive // dependency graph, so filtering is safe. if sbom.package_name != context.project.crate_name { continue; } let mut buf = Vec::new(); sbom.bom .output_as_json_v1_5(&mut buf) .map_err(|e| anyhow!("Failed to serialize SBOM: {}", e))?; rust_sboms.push((sbom.package_name, buf)); } Ok(Some(SbomData { rust_sboms })) } #[cfg(not(feature = "sbom"))] { let _ = rust_sbom_enabled; Ok(None) } } /// Writes SBOMs into the wheel via the given writer. pub(crate) fn write( sbom_data: Option<&SbomData>, context: &BuildContext, writer: &mut impl ModuleWriter, dist_info_dir: &Path, ) -> Result<()> { // 1. Write pre-generated Rust SBOMs if let Some(data) = sbom_data { for (package_name, json_bytes) in &data.rust_sboms { let target = dist_info_dir.join(format!("sboms/{package_name}.cyclonedx.json")); writer.add_bytes(&target, None, json_bytes.clone(), false)?; } } // 2. Include additional SBOM files (only when explicitly configured) if let Some(include) = context.artifact.sbom.include.as_ref() { // Canonicalize project root once and enforce all includes stay within it. let project_root = context .project .project_layout .project_root .canonicalize() .context("Failed to canonicalize project root for SBOM includes")?; let mut seen_filenames = HashSet::new(); for path in include { let resolved_path = resolve_sbom_include(path, &project_root)?; let filename = resolved_path.file_name().context("Invalid SBOM path")?; if !seen_filenames.insert(filename.to_os_string()) { anyhow::bail!( "Duplicate SBOM filename '{}' from include path '{}'. \ Multiple includes must have unique filenames.", filename.to_string_lossy(), path.display() ); } let target = dist_info_dir.join("sboms").join(filename); writer.add_file(&target, &resolved_path, false)?; } } Ok(()) } } /// Validate and resolve an SBOM include path. /// /// Absolute paths are used as-is (after canonicalization). /// Relative paths are resolved against the project root and must stay within it. /// /// Returns the canonicalized path on success. pub(crate) fn resolve_sbom_include(path: &Path, project_root: &Path) -> Result { let is_absolute = path.is_absolute(); let resolved_path = if is_absolute { path.to_path_buf() } else { project_root.join(path) }; let resolved_path = resolved_path.canonicalize().with_context(|| { format!( "Failed to canonicalize SBOM include path '{}'", resolved_path.display() ) })?; // Only enforce the project-root constraint for relative paths // to prevent directory traversal (e.g. "../../etc/passwd"). // Absolute paths are intentionally allowed to reference files // outside the project root. if !is_absolute && !resolved_path.starts_with(project_root) { anyhow::bail!( "SBOM include path '{}' escapes the project root '{}'", resolved_path.display(), project_root.display() ); } Ok(resolved_path) } #[cfg(test)] mod tests { use super::*; use fs_err as fs; use tempfile::tempdir; #[test] fn test_reject_path_escaping_project_root() { let dir = tempdir().unwrap(); let root = dir.path().canonicalize().unwrap(); let result = resolve_sbom_include(Path::new("../../etc/passwd"), &root); assert!(result.is_err()); } #[test] fn test_accept_valid_relative_path() { let dir = tempdir().unwrap(); let root = dir.path().canonicalize().unwrap(); let sbom_file = root.join("my_sbom.json"); fs::write(&sbom_file, "{}").unwrap(); let result = resolve_sbom_include(Path::new("my_sbom.json"), &root).unwrap(); assert_eq!(result, sbom_file); } #[test] fn test_accept_nested_path() { let dir = tempdir().unwrap(); let root = dir.path().canonicalize().unwrap(); let nested = root.join("sboms/vendor"); fs::create_dir_all(&nested).unwrap(); let sbom_file = nested.join("report.json"); fs::write(&sbom_file, "{}").unwrap(); let result = resolve_sbom_include(Path::new("sboms/vendor/report.json"), &root).unwrap(); assert_eq!(result, sbom_file); } #[test] fn test_accept_absolute_path_outside_root() { let dir = tempdir().unwrap(); let root = dir.path().canonicalize().unwrap(); let outside = tempdir().unwrap(); let outside_file = outside.path().join("external.json"); fs::write(&outside_file, "{}").unwrap(); let result = resolve_sbom_include(&outside_file, &root).unwrap(); assert_eq!(result, outside_file.canonicalize().unwrap()); } #[test] fn test_reject_nonexistent_path() { let dir = tempdir().unwrap(); let root = dir.path().canonicalize().unwrap(); let result = resolve_sbom_include(Path::new("does_not_exist.json"), &root); assert!(result.is_err()); assert!( result .unwrap_err() .to_string() .contains("Failed to canonicalize") ); } } maturin-1.16.0/src/source_distribution/000077500000000000000000000000001527064705700201615ustar00rootroot00000000000000maturin-1.16.0/src/source_distribution/cargo_toml_rewrite.rs000066400000000000000000001055501527064705700244240ustar00rootroot00000000000000use super::PathDependency; use super::utils::{normalize_path, relative_path}; use anyhow::{Context, Result, bail}; use cargo_metadata::DependencyKind; use fs_err as fs; use path_slash::PathExt as _; use std::collections::{HashMap, HashSet}; use std::path::{Path, PathBuf}; use toml_edit::{DocumentMut, Table}; use tracing::debug; use url::Url; pub(super) fn parse_toml_file(path: &Path, kind: &str) -> Result { let text = fs::read_to_string(path)?; let document = text .parse::() .with_context(|| format!("Failed to parse {} at {}", kind, path.display()))?; Ok(document) } /// Rewrite Cargo.toml to only retain path dependencies that are actually used /// /// We only want to add path dependencies that are actually used /// to reduce the size of the source distribution. pub(super) fn rewrite_cargo_toml( document: &mut DocumentMut, manifest_path: &Path, known_path_deps: &HashMap, ) -> Result<()> { debug!( "Rewriting Cargo.toml `workspace.members` at {}", manifest_path.display() ); // Update workspace members if let Some(workspace) = document.get_mut("workspace").and_then(|x| x.as_table_mut()) && let Some(members) = workspace.get_mut("members").and_then(|x| x.as_array()) { if known_path_deps.is_empty() { // Remove workspace members when there isn't any path dep workspace.remove("members"); if workspace.is_empty() { // Remove workspace all together if it's empty document.remove("workspace"); } } else { // Build a set of relative directory paths (from workspace root) for // all known path dependencies. Workspace `members` entries are // directory paths, not crate names, so we must compare against the // actual directory of each dependency rather than its name. let relative_dep_dirs: HashSet = known_path_deps .values() .filter_map(|path_dep| { let manifest_rel = path_dep .manifest_path .strip_prefix(&path_dep.workspace_root) .ok()?; // Strip the trailing `Cargo.toml` to get the directory manifest_rel.parent().and_then(|p| p.to_slash()).map(|s| { if s.is_empty() { ".".into() } else { s.into_owned() } }) }) .collect(); let mut new_members = toml_edit::Array::new(); for member in members { if let toml_edit::Value::String(s) = member { let member_path = s.value(); // See https://github.com/rust-lang/cargo/blob/0de91c89e6479016d0ed8719fdc2947044335b36/src/cargo/util/restricted_names.rs#L119-L122 let is_glob_pattern = member_path.contains(['*', '?', '[', ']']); if is_glob_pattern { let pattern = glob::Pattern::new(member_path).with_context(|| { format!( "Invalid `workspace.members` glob pattern: {} in {}", member_path, manifest_path.display() ) })?; if relative_dep_dirs.iter().any(|dir| pattern.matches(dir)) { new_members.push(member_path); } } else if relative_dep_dirs.contains(member_path) { new_members.push(member_path); } } } if !new_members.is_empty() { workspace["members"] = toml_edit::value(new_members); } else { workspace.remove("members"); } } } // Remove `default-members` to avoid build failures when some entries // are not included in the sdist. Without `default-members`, Cargo // treats all `members` as defaults, which is the correct behavior // for source distributions. See https://github.com/PyO3/maturin/issues/2046 if let Some(workspace) = document.get_mut("workspace").and_then(|x| x.as_table_mut()) { workspace.remove("default-members"); } Ok(()) } /// Strip all non-workspace tables from a workspace Cargo.toml. /// /// When the workspace root's Cargo.toml is also a `[package]` (i.e. it's not a /// virtual workspace), the package's source files are typically not included in /// the sdist. This function strips everything except workspace-level tables /// (`[workspace]`, `[profile]`, `[patch]`, `[replace]`) so Cargo treats it as /// a virtual workspace. pub(super) fn strip_non_workspace_tables(document: &mut DocumentMut, manifest_path: &Path) { debug!( "Stripping [package] from workspace Cargo.toml at {} (source files not in sdist)", manifest_path.display() ); let package_level_keys: Vec = document .as_table() .iter() .filter(|(key, _)| !matches!(&**key, "workspace" | "profile" | "patch" | "replace")) .map(|(key, _)| key.to_string()) .collect(); for key in &package_level_keys { document.remove(key); } } /// Inlines workspace-inherited fields in a path dependency's `Cargo.toml` /// using resolved values from `cargo metadata`. /// /// This is needed when the dependency's workspace manifest falls outside the /// sdist root (e.g. a crate excluded from a parent workspace that depends on /// sibling workspace members). Without this, `field.workspace = true` entries /// would fail to resolve when building from the sdist. pub(super) fn resolve_workspace_inheritance( document: &mut DocumentMut, resolved: &cargo_metadata::Package, workspace_inheritance: Option<&WorkspaceManifestInheritance>, ) -> Result<()> { resolve_workspace_package_fields( document, resolved, workspace_inheritance.and_then(|inheritance| inheritance.package.as_ref()), )?; resolve_workspace_dependency_tables( document, resolved, workspace_inheritance.and_then(|inheritance| inheritance.dependencies.as_ref()), ); resolve_workspace_target_dependency_tables( document, resolved, workspace_inheritance.and_then(|inheritance| inheritance.dependencies.as_ref()), ); resolve_workspace_lints( document, workspace_inheritance.and_then(|inheritance| inheritance.lints.as_ref()), )?; Ok(()) } #[derive(Debug, Clone, Default)] pub(super) struct WorkspaceManifestInheritance { pub(super) package: Option, pub(super) dependencies: Option
, pub(super) lints: Option, } pub(super) fn parse_workspace_manifest_inheritance( workspace_manifest_path: &Path, ) -> Result { let document = parse_toml_file(workspace_manifest_path, "workspace Cargo.toml")?; let workspace = document.get("workspace").and_then(|item| item.as_table()); Ok(WorkspaceManifestInheritance { package: workspace .and_then(|workspace| workspace.get("package")) .and_then(|item| item.as_table()) .cloned(), dependencies: workspace .and_then(|workspace| workspace.get("dependencies")) .and_then(|item| item.as_table()) .cloned(), lints: workspace .and_then(|workspace| workspace.get("lints")) .cloned(), }) } fn resolve_workspace_package_fields( document: &mut DocumentMut, resolved: &cargo_metadata::Package, workspace_package: Option<&Table>, ) -> Result<()> { let Some(package) = document.get_mut("package").and_then(|p| p.as_table_mut()) else { return Ok(()); }; let version_str = resolved.version.to_string(); let edition_str = resolved.edition.to_string(); let rust_version_str = resolved.rust_version.as_ref().map(|v| v.to_string()); let string_fields: &[(&str, Option<&str>)] = &[ ("version", Some(&version_str)), ("edition", Some(&edition_str)), ("description", resolved.description.as_deref()), ("license", resolved.license.as_deref()), ("repository", resolved.repository.as_deref()), ("homepage", resolved.homepage.as_deref()), ("documentation", resolved.documentation.as_deref()), ("rust-version", rust_version_str.as_deref()), ]; for (key, value) in string_fields { if is_workspace_inherited(package, key) { if let Some(val) = value { package.insert(key, toml_edit::value(*val)); } else { package.remove(key); } } } let array_fields: &[(&str, &[String])] = &[ ("authors", &resolved.authors), ("keywords", &resolved.keywords), ("categories", &resolved.categories), ]; for (key, values) in array_fields { if is_workspace_inherited(package, key) { if values.is_empty() { package.remove(key); } else { let mut arr = toml_edit::Array::new(); for v in *values { arr.push(v.as_str()); } package.insert(key, toml_edit::value(arr)); } } } // `cargo metadata` already resolves `publish`, unlike `include`/`exclude`. if is_workspace_inherited(package, "publish") { match resolved.publish.as_ref() { None => { package.remove("publish"); } Some(registries) if registries.is_empty() => { package.insert("publish", toml_edit::value(false)); } Some(registries) => { let mut arr = toml_edit::Array::new(); for registry in registries { arr.push(registry.as_str()); } package.insert("publish", toml_edit::value(arr)); } } } for key in ["include", "exclude"] { inherit_workspace_package_item(package, key, workspace_package)?; } for key in ["readme", "license-file"] { if is_workspace_inherited(package, key) { package.remove(key); } } Ok(()) } fn resolve_workspace_dependency_tables( document: &mut DocumentMut, resolved: &cargo_metadata::Package, workspace_dependencies: Option<&Table>, ) { for dep_kind in ["dependencies", "dev-dependencies", "build-dependencies"] { resolve_workspace_deps(document, dep_kind, resolved, workspace_dependencies); } } fn resolve_workspace_target_dependency_tables( document: &mut DocumentMut, resolved: &cargo_metadata::Package, workspace_dependencies: Option<&Table>, ) { let Some(target) = document.get_mut("target").and_then(|t| t.as_table_mut()) else { return; }; let target_keys: Vec = target.iter().map(|(k, _)| k.to_string()).collect(); for target_key in target_keys { let Some(target_val) = target.get_mut(&target_key) else { continue; }; for dep_kind in ["dependencies", "dev-dependencies", "build-dependencies"] { let Some(deps) = target_val.get_mut(dep_kind).and_then(|t| t.as_table_mut()) else { continue; }; resolve_workspace_dep_entries( deps, resolved, workspace_dependencies, Some(&target_key), dep_kind_from_str(dep_kind), &format!("target.{target_key}.{dep_kind}"), ); } } } fn resolve_workspace_lints( document: &mut DocumentMut, workspace_lints: Option<&toml_edit::Item>, ) -> Result<()> { let inherits_workspace_lints = document .get("lints") .and_then(|item| item.as_table_like()) .and_then(|table| table.get("workspace")) .and_then(|value| value.as_bool()) == Some(true); if !inherits_workspace_lints { return Ok(()); } let Some(item) = workspace_lints else { bail!("Failed to resolve workspace-inherited `lints`"); }; document.as_table_mut().insert("lints", item.clone()); Ok(()) } fn inherit_workspace_package_item( package: &mut Table, key: &str, workspace_package: Option<&Table>, ) -> Result<()> { if !is_workspace_inherited(package, key) { return Ok(()); } let Some(item) = workspace_package.and_then(|workspace_package| workspace_package.get(key)) else { bail!("Failed to resolve workspace-inherited `package.{key}`"); }; package.insert(key, item.clone()); Ok(()) } /// Returns `true` if a `[package]` field has the form `field.workspace = true`. fn is_workspace_inherited(package: &toml_edit::Table, key: &str) -> bool { package .get(key) .and_then(|v| v.as_table_like()) .and_then(|t| t.get("workspace")) .and_then(|v| v.as_bool()) == Some(true) } /// Resolves `workspace = true` entries in a `[dependencies]`-style table. /// Resolve workspace-inherited dependencies in a single dependency table. /// /// This is the shared inner loop used by both top-level dependency tables /// (e.g. `[dependencies]`) and target-specific ones (e.g. `[target.*.dependencies]`). fn resolve_workspace_dep_entries( deps: &mut Table, resolved: &cargo_metadata::Package, workspace_dependencies: Option<&Table>, target: Option<&str>, dep_kind: DependencyKind, label: &str, ) { let dep_names: Vec = deps.iter().map(|(k, _)| k.to_string()).collect(); for dep_name in dep_names { let is_workspace = deps .get(&dep_name) .and_then(|d| d.as_table_like()) .and_then(|t| t.get("workspace")) .and_then(|v| v.as_bool()) == Some(true); if !is_workspace { continue; } if let Some(resolved_dep) = find_resolved_dep(resolved, &dep_name, target, dep_kind) { deps.insert( &dep_name, resolved_dep_to_toml( &resolved_dep, workspace_dependencies.and_then(|d| d.get(&dep_name)), ), ); } else { debug!("Could not resolve workspace dependency {dep_name} in {label}"); } } } fn resolve_workspace_deps( document: &mut DocumentMut, dep_kind: &str, resolved: &cargo_metadata::Package, workspace_dependencies: Option<&Table>, ) { let Some(deps_table) = document.get_mut(dep_kind).and_then(|t| t.as_table_mut()) else { return; }; resolve_workspace_dep_entries( deps_table, resolved, workspace_dependencies, None, dep_kind_from_str(dep_kind), &format!("[{dep_kind}]"), ); } /// Maps a Cargo.toml dependency table name to the corresponding `DependencyKind`. fn dep_kind_from_str(dep_kind: &str) -> DependencyKind { match dep_kind { "dev-dependencies" => DependencyKind::Development, "build-dependencies" => DependencyKind::Build, _ => DependencyKind::Normal, } } #[derive(Debug, Clone)] struct GitSource { url: String, branch: Option, tag: Option, rev: Option, } #[derive(Debug, Clone)] enum DepSource { CratesIo, Path(PathBuf), Git(GitSource), Registry(String), } /// Finds a resolved dependency by name in the package metadata. fn find_resolved_dep( resolved: &cargo_metadata::Package, name: &str, target: Option<&str>, kind: DependencyKind, ) -> Option { resolved.dependencies.iter().find_map(|d| { let matches_name = d.rename.as_deref() == Some(name) || d.name == name; if !matches_name { return None; } if d.kind != kind { return None; } if let Some(target_str) = target && d.target.as_ref().map(|t| t.to_string()).as_deref() != Some(target_str) { return None; } let package = d.rename.as_ref().map(|_| d.name.clone()); let source = if let Some(dep_path) = d.path.as_ref() { let manifest_dir = resolved.manifest_path.parent().unwrap(); DepSource::Path(relative_path( manifest_dir.as_std_path(), dep_path.as_std_path(), )) } else if let Some(git) = d.source.as_ref().and_then(parse_git_source) { DepSource::Git(git) } else if let Some(registry) = &d.registry { DepSource::Registry(registry.clone()) } else { DepSource::CratesIo }; Some(ResolvedDep { req: d.req.to_string(), optional: d.optional, default_features: d.uses_default_features, features: d.features.clone(), package, source, }) }) } fn parse_git_source(source: &cargo_metadata::Source) -> Option { let source = source.repr.strip_prefix("git+")?; let mut url = Url::parse(source).ok()?; let mut git = GitSource { url: String::new(), branch: None, tag: None, rev: None, }; for (key, value) in url.query_pairs() { match key.as_ref() { "branch" => git.branch = Some(value.into_owned()), "tag" => git.tag = Some(value.into_owned()), "rev" => git.rev = Some(value.into_owned()), _ => {} } } if git.branch.is_none() && git.tag.is_none() && git.rev.is_none() && let Some(fragment) = url.fragment() && !fragment.is_empty() { git.rev = Some(fragment.to_string()); } url.set_query(None); url.set_fragment(None); git.url = url.into(); Some(git) } struct ResolvedDep { req: String, optional: bool, default_features: bool, features: Vec, /// When the dep is renamed (aliased), the real package name. /// Emitted as `package = ""` in Cargo.toml. package: Option, source: DepSource, } fn merge_registry_workspace_dependency( original: &toml_edit::Item, dep: &ResolvedDep, ) -> toml_edit::Item { let mut item = original.clone(); let Some(table) = item.as_table_like_mut() else { // Cargo manifests use `registry = ""`, but cargo metadata only // exposes the registry index URL. If we cannot recover the original // table form from `[workspace.dependencies]`, fall back to a plain // version requirement instead of emitting the invalid // `registry-index = ...` key. return toml_edit::value(dep.req.as_str()); }; table.insert("version", toml_edit::value(dep.req.as_str())); if dep.optional { table.insert("optional", toml_edit::value(true)); } else { table.remove("optional"); } if !dep.default_features { table.insert("default-features", toml_edit::value(false)); } if !dep.features.is_empty() { let mut arr = toml_edit::Array::new(); for f in &dep.features { arr.push(f.as_str()); } table.insert("features", toml_edit::value(arr)); } else { table.remove("features"); } if let Some(package) = &dep.package { table.insert("package", toml_edit::value(package.as_str())); } item } /// Converts a resolved dependency into a TOML value for Cargo.toml. fn resolved_dep_to_toml( dep: &ResolvedDep, workspace_dependency: Option<&toml_edit::Item>, ) -> toml_edit::Item { if matches!(dep.source, DepSource::CratesIo) && dep.default_features && !dep.optional && dep.features.is_empty() && dep.package.is_none() { return toml_edit::value(&dep.req); } let mut table = toml_edit::InlineTable::new(); match &dep.source { DepSource::CratesIo => { table.insert("version", dep.req.as_str().into()); } DepSource::Path(path) => { let path_str = path.to_slash().unwrap_or_else(|| path.to_string_lossy()); table.insert("path", path_str.as_ref().into()); if dep.req != "*" { table.insert("version", dep.req.as_str().into()); } } DepSource::Git(git) => { table.insert("git", git.url.as_str().into()); if let Some(branch) = &git.branch { table.insert("branch", branch.as_str().into()); } if let Some(tag) = &git.tag { table.insert("tag", tag.as_str().into()); } if let Some(rev) = &git.rev { table.insert("rev", rev.as_str().into()); } if dep.req != "*" { table.insert("version", dep.req.as_str().into()); } } DepSource::Registry(_registry_index) => { return workspace_dependency .map(|item| merge_registry_workspace_dependency(item, dep)) .unwrap_or_else(|| toml_edit::value(dep.req.as_str())); } } if !dep.default_features { table.insert("default-features", false.into()); } if dep.optional { table.insert("optional", true.into()); } if !dep.features.is_empty() { let mut arr = toml_edit::Array::new(); for f in &dep.features { arr.push(f.as_str()); } table.insert("features", toml_edit::Value::Array(arr)); } if let Some(package) = &dep.package { table.insert("package", package.as_str().into()); } toml_edit::value(toml_edit::Value::InlineTable(table)) } // Strip targets whose source files are excluded from the sdist, matching Cargo's // behavior when `package.include`/`package.exclude` or tool.maturin excludes remove them. // // We rely on `cargo metadata` for target discovery and source paths, and only // use the packaged file set to determine which of those discovered targets // still exist in the sdist. pub(super) fn rewrite_cargo_toml_targets( document: &mut DocumentMut, manifest_path: &Path, package_metadata: &cargo_metadata::Package, packaged_files: &HashSet, ) -> Result<()> { debug!( "Rewriting Cargo.toml build targets at {}", manifest_path.display() ); let manifest_dir = manifest_path.parent().unwrap(); let normalize = |path: &Path| -> PathBuf { let path = if path.is_absolute() { path.strip_prefix(manifest_dir).unwrap_or(path) } else { path }; normalize_path(path) }; let target_src_path = |target: &cargo_metadata::Target| normalize(target.src_path.as_std_path()); let is_packaged_target = |target: &cargo_metadata::Target| packaged_files.contains(&target_src_path(target)); let matches_kind = |target: &cargo_metadata::Target, kind: &str| match kind { "lib" => target.kind.iter().any(|kind| { matches!( kind, cargo_metadata::TargetKind::Lib | cargo_metadata::TargetKind::RLib | cargo_metadata::TargetKind::DyLib | cargo_metadata::TargetKind::CDyLib | cargo_metadata::TargetKind::StaticLib | cargo_metadata::TargetKind::ProcMacro ) }), "bin" => target.is_bin(), "example" => target.is_example(), "test" => target.is_test(), "bench" => target.is_bench(), _ => false, }; let find_matching_target = |kind: &str, name: Option<&str>, path: Option<&str>| { let normalized_path = path.map(|path| normalize(Path::new(path))); package_metadata.targets.iter().find(|target| { if !matches_kind(target, kind) { return false; } if let Some(path) = normalized_path.as_ref() && &target_src_path(target) != path { return false; } if kind == "lib" { return name.is_none_or(|name| target.name == name); } name.is_some_and(|name| target.name == name) }) }; if let Some(lib) = document.get("lib").and_then(|item| item.as_table()) { let name = lib.get("name").and_then(|item| item.as_str()); let path = lib.get("path").and_then(|item| item.as_str()); if let Some(target) = find_matching_target("lib", name, path) && !is_packaged_target(target) { debug!( "Stripping [lib] target {:?} from {}", name.or(path), manifest_path.display() ); document.remove("lib"); } } for (key, kind) in [ ("bin", "bin"), ("example", "example"), ("test", "test"), ("bench", "bench"), ] { if let Some(targets) = document .get_mut(key) .and_then(|item| item.as_array_of_tables_mut()) { let mut idx = 0; while idx < targets.len() { let target = targets.get(idx).unwrap(); let name = target.get("name").and_then(|item| item.as_str()); let path = target.get("path").and_then(|item| item.as_str()); let should_remove = find_matching_target(kind, name, path) .is_some_and(|target| !is_packaged_target(target)); if should_remove { debug!( "Stripping {key} target {:?} from {}", name.or(path), manifest_path.display() ); targets.remove(idx); } else { idx += 1; } } if targets.is_empty() { document.remove(key); } } } let packaged_bin_names: HashSet<&str> = package_metadata .targets .iter() .filter(|target| target.is_bin() && is_packaged_target(target)) .map(|target| target.name.as_str()) .collect(); if let Some(package) = document .get_mut("package") .and_then(|item| item.as_table_mut()) { // Remove `build` when the explicitly-configured build script source was // excluded from the sdist. Cargo treats explicit `package.build = ...` // differently from implicit `build.rs`: if the path is configured but the // file is missing, manifest loading fails. if let Some(build_path) = package.get("build").and_then(|item| item.as_str()) { let normalized_build_path = normalize(Path::new(build_path)); let explicit_build_missing = package_metadata.targets.iter().any(|target| { target.is_custom_build() && target_src_path(target) == normalized_build_path && !is_packaged_target(target) }); if explicit_build_missing { debug!( "Stripping [package.build] target {:?} from {}", build_path, manifest_path.display() ); package.remove("build"); } } // Remove `default-run` when its target was excluded from the sdist. This // uses cargo metadata rather than hand-rolled path inference, so it also // handles implicit default bins like `src/main.rs`. if let Some(default_run) = package.get("default-run").and_then(|item| item.as_str()) && package_metadata .targets .iter() .any(|target| target.is_bin() && target.name == default_run) && !packaged_bin_names.contains(default_run) { debug!( "Stripping [package.default-run] target {:?} from {}", default_run, manifest_path.display() ); package.remove("default-run"); } } Ok(()) } /// Rewrite a `[package]` field in `Cargo.toml` to point to a file in the same directory. /// /// Fields like `readme` and `license-file` may reference files above the package. /// When we flatten the directory structure in the sdist, the path needs updating. pub(super) fn rewrite_cargo_toml_package_field( document: &mut DocumentMut, manifest_path: &Path, field: &str, value: Option<&str>, ) -> Result<()> { if let Some(value) = value { debug!( "Rewriting Cargo.toml `package.{field}` at {}", manifest_path.display() ); let project = document.get_mut("package").with_context(|| { format!( "Missing `[package]` table in Cargo.toml with {field} at {}", manifest_path.display() ) })?; project[field] = toml_edit::value(value); } Ok(()) } #[cfg(test)] mod tests { use super::*; #[test] fn test_resolved_dep_to_toml_path_dep() { let dep = ResolvedDep { req: "*".to_string(), optional: false, default_features: true, features: vec![], package: None, source: DepSource::Path(PathBuf::from("../shared_crate")), }; let item = resolved_dep_to_toml(&dep, None); let s = item.to_string(); assert!( s.contains(r#"path = "../shared_crate""#), "expected path dep, got: {s}" ); assert!( !s.contains("version"), "should not have version for path dep, got: {s}" ); } #[test] fn test_resolved_dep_to_toml_renamed() { let dep = ResolvedDep { req: "1.0".to_string(), optional: false, default_features: true, features: vec![], package: Some("real_crate".to_string()), source: DepSource::CratesIo, }; let item = resolved_dep_to_toml(&dep, None); let s = item.to_string(); assert!( s.contains(r#"package = "real_crate""#), "expected package = real_crate, got: {s}" ); } #[test] fn test_resolved_dep_to_toml_git_dep() { let dep = ResolvedDep { req: "*".to_string(), optional: false, default_features: true, features: vec![], package: None, source: DepSource::Git(GitSource { url: "https://example.com/repo.git".to_string(), branch: Some("main".to_string()), tag: None, rev: None, }), }; let item = resolved_dep_to_toml(&dep, None); let s = item.to_string(); assert!( s.contains(r#"git = "https://example.com/repo.git""#), "expected git source, got: {s}" ); assert!( s.contains(r#"branch = "main""#), "expected git branch, got: {s}" ); assert!( !s.contains("version"), "should not add version = \"*\" for plain git dep, got: {s}" ); } #[test] fn test_resolved_dep_to_toml_registry_dep_falls_back_to_version_only() { let dep = ResolvedDep { req: "1.0".to_string(), optional: false, default_features: true, features: vec![], package: None, source: DepSource::Registry("https://example.com/index".to_string()), }; let item = resolved_dep_to_toml(&dep, None); assert_eq!(item.to_string(), "\"1.0\""); } #[test] fn test_resolved_dep_to_toml_registry_dep_preserves_registry_name() { let dep = ResolvedDep { req: "1.5".to_string(), optional: true, default_features: true, features: vec!["unicode".to_string()], package: None, source: DepSource::Registry("https://example.com/index".to_string()), }; let workspace_dep: toml_edit::Item = r#"{ version = "1.0", registry = "custom", features = ["std"] }"# .parse::() .unwrap() .into(); let item = resolved_dep_to_toml(&dep, Some(&workspace_dep)); let s = item.to_string(); assert!( s.contains(r#"registry = "custom""#), "expected registry name, got: {s}" ); assert!( s.contains(r#"version = "1.5""#), "expected version, got: {s}" ); assert!( s.contains(r#"optional = true"#), "expected optional, got: {s}" ); assert!( s.contains(r#"features = ["unicode"]"#), "expected merged features, got: {s}" ); } #[test] fn test_rewrite_cargo_toml_package_field() { let manifest_path = Path::new("Cargo.toml"); // When value is Some, it should rewrite the field let toml_str = r#" [package] name = "test" version = "0.1.0" license-file = "../../LICENSE" "#; let mut document = toml_str.parse::().unwrap(); rewrite_cargo_toml_package_field( &mut document, manifest_path, "license-file", Some("LICENSE"), ) .unwrap(); let result = document.to_string(); assert!( result.contains(r#"license-file = "LICENSE""#), "expected rewritten license-file, got: {result}" ); // When value is None, it should be a no-op let mut document2 = toml_str.parse::().unwrap(); rewrite_cargo_toml_package_field(&mut document2, manifest_path, "license-file", None) .unwrap(); let result2 = document2.to_string(); assert!( result2.contains(r#"license-file = "../../LICENSE""#), "expected unchanged license-file, got: {result2}" ); } #[test] fn test_rewrite_cargo_toml_removes_default_members() { let manifest_path = Path::new("Cargo.toml"); let toml_str = r#" [workspace] members = ["crate-a", "crate-b"] default-members = ["crate-a", "crate-c"] "#; let mut document = toml_str.parse::().unwrap(); let mut known_path_deps = HashMap::new(); known_path_deps.insert( "crate-a".to_string(), PathDependency { manifest_path: PathBuf::from("crate-a/Cargo.toml"), workspace_root: PathBuf::from(""), readme: None, license_file: None, resolved_package: None, }, ); rewrite_cargo_toml(&mut document, manifest_path, &known_path_deps).unwrap(); let result = document.to_string(); assert!( result.contains(r#"members = ["crate-a"]"#), "expected filtered members, got: {result}" ); assert!( !result.contains("default-members"), "expected default-members to be removed, got: {result}" ); } } maturin-1.16.0/src/source_distribution/mod.rs000066400000000000000000001120071527064705700213070ustar00rootroot00000000000000mod cargo_toml_rewrite; mod path_deps; mod pyproject; mod unpack; mod utils; use crate::pyproject_toml::SdistGenerator; use crate::{Metadata24, ModuleWriter, PyProjectToml, SDistWriter, VirtualWriter}; use anyhow::{Context, Result, bail}; use cargo_metadata::camino::{self, Utf8Path}; use ignore::overrides::Override; use normpath::PathExt as _; use std::collections::{HashMap, HashSet}; use std::env; use std::ffi::OsStr; use std::io::Write; use std::path::{Path, PathBuf}; use std::process::Command; use std::str; use tracing::{debug, trace, warn}; use self::cargo_toml_rewrite::{ WorkspaceManifestInheritance, parse_toml_file, parse_workspace_manifest_inheritance, resolve_workspace_inheritance, rewrite_cargo_toml, rewrite_cargo_toml_package_field, rewrite_cargo_toml_targets, strip_non_workspace_tables, }; pub use self::path_deps::{PathDependency, find_path_deps}; use self::pyproject::{ add_pyproject_metadata, add_pyproject_metadata_files, add_pyproject_toml, add_python_sources, reject_parent_relative_metadata_paths, }; pub use self::unpack::{UnpackedSdist, unpack_sdist}; use self::utils::{common_path_prefix, is_compiled_artifact, normalize_path}; /// A file (readme or license) referenced by a Cargo.toml manifest field that /// has been resolved to an absolute path and is ready to be added to the sdist. #[derive(Debug)] struct ManifestAsset { /// Absolute path to the resolved file on disk. source: PathBuf, /// Just the filename, used to rewrite the Cargo.toml field so it points /// to the copy placed next to the manifest inside the sdist. filename: String, } /// Resolve a manifest-referenced file (readme or license-file) to an absolute /// path and validate it is within the allowed root (if given). /// /// The file is **not** added to the writer here — the caller adds it to the /// sdist at the appropriate target path. fn resolve_manifest_asset( manifest_dir: &Path, field_value: &Path, kind: &str, allowed_root: Option<&Path>, ) -> Result { let file = manifest_dir.join(field_value); let abs_file = file .normalize() .with_context(|| { format!( "{kind} path `{}` does not exist or is invalid", file.display() ) })? .into_path_buf(); if let Some(allowed_root) = allowed_root { let allowed_root = allowed_root .normalize() .with_context(|| { format!( "allowed root `{}` does not exist or is invalid", allowed_root.display() ) })? .into_path_buf(); if !abs_file.starts_with(&allowed_root) { bail!( "{kind} path `{}` resolves outside allowed root `{}`", file.display(), allowed_root.display() ); } } let filename = file .file_name() .and_then(OsStr::to_str) .with_context(|| format!("{kind} path `{}` has no filename", file.display()))? .to_string(); Ok(ManifestAsset { source: abs_file, filename, }) } /// Resolve a manifest asset and immediately add it to the sdist writer. fn resolve_and_add_manifest_asset( writer: &mut VirtualWriter, manifest_dir: &Path, field_value: &Path, target_dir: &Path, kind: &str, allowed_root: Option<&Path>, ) -> Result { let asset = resolve_manifest_asset(manifest_dir, field_value, kind, allowed_root)?; writer.add_file(target_dir.join(&asset.filename), &asset.source, false)?; Ok(asset) } /// Run `cargo package --list --allow-dirty` and return the list of files. fn cargo_package_file_list(manifest_path: &Path, target_dir: &Path) -> Result> { debug!( "Getting cargo package file list for {}", manifest_path.display() ); let args = ["package", "--list", "--allow-dirty", "--manifest-path"]; let output = Command::new("cargo") .args(args) .arg(manifest_path) .arg("--target-dir") .arg(target_dir) .output() .with_context(|| { format!( "Failed to run `cargo {} {}`", args.join(" "), manifest_path.display() ) })?; if !output.status.success() { bail!( "Failed to query file list from cargo: {}\n--- Manifest path: {}\n--- Stdout:\n{}\n--- Stderr:\n{}", output.status, manifest_path.display(), String::from_utf8_lossy(&output.stdout), String::from_utf8_lossy(&output.stderr), ); } if !output.stderr.is_empty() { eprintln!( "From `cargo {} {}`:", args.join(" "), manifest_path.display() ); std::io::stderr().write_all(&output.stderr)?; } let files = str::from_utf8(&output.stdout) .context("Cargo printed invalid utf-8 ಠ_ಠ")? .lines() .map(String::from) .collect(); Ok(files) } /// Options that vary between the root crate and path dependencies when /// adding crate files to the sdist. struct AddCrateOptions<'a> { /// When true, this is the root crate: rewrite workspace members in /// Cargo.toml and skip pyproject.toml (handled separately). is_root: bool, /// Path deps map — only used for the root crate's workspace.members rewrite. known_path_deps: Option<&'a HashMap>, /// Path prefixes (relative to the manifest directory) whose files should be /// skipped from `cargo package --list` because they are added separately /// (e.g. python source directories). See . skip_prefixes: Vec, /// When true, skip writing the (rewritten) Cargo.toml — the workspace /// manifest will be added separately with workspace-level rewrites. skip_cargo_toml: bool, /// Cargo metadata for this crate, used for target discovery and, when needed, /// inlining workspace-inherited values. package_metadata: &'a cargo_metadata::Package, /// Cached inheritance data from the dependency's parent workspace manifest, /// used for the pieces cargo metadata does not expose directly. workspace_inheritance: Option<&'a WorkspaceManifestInheritance>, } /// Copies the files of a single crate to the source distribution. /// /// Runs `cargo package --list --allow-dirty` to obtain a list of files, /// rewrites `Cargo.toml` as needed, and adds everything to the writer. fn add_crate_to_source_distribution( writer: &mut VirtualWriter, manifest_path: &Path, prefix: &Path, readme: Option<&ManifestAsset>, license_file: Option<&ManifestAsset>, opts: &AddCrateOptions<'_>, target_dir: &Path, ) -> Result<()> { let file_list = cargo_package_file_list(manifest_path, target_dir)?; trace!("File list: {:?}", file_list); let manifest_dir = manifest_path.parent().unwrap(); let target_source: Vec<_> = file_list .iter() .map(|relative_to_manifest| { let relative_to_cwd = manifest_dir.join(relative_to_manifest.as_str()); (relative_to_manifest.as_str(), relative_to_cwd) }) .filter(|(target, source)| { if *target == "Cargo.toml.orig" { // Skip generated files. See https://github.com/rust-lang/cargo/issues/7938#issuecomment-593280660 // and https://github.com/PyO3/maturin/issues/449 false } else if *target == "Cargo.toml" { // We rewrite Cargo.toml and add it separately false } else if opts.is_root && *target == "pyproject.toml" { // pyproject.toml is handled separately because it has to be put in the root dir // of source distribution false } else if prefix.components().count() == 1 && *target == "pyproject.toml" { // Skip pyproject.toml for cases when the root is in a workspace member and both the // member and the root have a pyproject.toml. debug!( "Skipping potentially non-main {}", prefix.join(target).display() ); false } else if opts .skip_prefixes .iter() .any(|p| Path::new(target).starts_with(p)) { // Skip files that will be added separately (e.g. python source files // that are added by the explicit python source loop). // See https://github.com/PyO3/maturin/issues/2383 debug!( "Skipping {} (will be added separately)", prefix.join(target).display() ); false } else if is_compiled_artifact(Path::new(target)) { // Technically, `cargo package --list` should handle this, // but somehow it doesn't on Alpine Linux running in GitHub Actions. // See https://github.com/PyO3/maturin/pull/1255#issuecomment-1308838786 debug!("Ignoring {}", target); false } else { // Use `is_file` instead of `exists` to work around cargo bug: // https://github.com/rust-lang/cargo/issues/16465 source.is_file() && !writer.exclude(source) && !writer.exclude(prefix.join(target)) } }) .collect(); let packaged_files: HashSet = target_source .iter() .map(|(target, _)| normalize_path(Path::new(target))) .collect(); // Filter out files that were already added by resolve_and_add_manifest_asset // (e.g. readme or license-file from Cargo.toml pointing outside the crate). // `cargo package --list` may include a local copy at the same target path, // causing a duplicate. See https://github.com/PyO3/maturin/issues/2358 let target_source: Vec<_> = target_source .into_iter() .filter(|(target, _)| !writer.contains_target(prefix.join(target))) .collect(); // Write the (potentially rewritten) Cargo.toml if !opts.skip_cargo_toml { let mut document = parse_toml_file(manifest_path, "Cargo.toml")?; rewrite_cargo_toml_package_field( &mut document, manifest_path, "readme", readme.map(|a| a.filename.as_str()), )?; rewrite_cargo_toml_package_field( &mut document, manifest_path, "license-file", license_file.map(|a| a.filename.as_str()), )?; if let Some(known_path_deps) = opts.known_path_deps { rewrite_cargo_toml(&mut document, manifest_path, known_path_deps)?; } if opts.workspace_inheritance.is_some() { resolve_workspace_inheritance( &mut document, opts.package_metadata, opts.workspace_inheritance, )?; } rewrite_cargo_toml_targets( &mut document, manifest_path, opts.package_metadata, &packaged_files, )?; let cargo_toml_path = prefix.join(manifest_path.file_name().unwrap()); writer.add_bytes( cargo_toml_path, Some(manifest_path), document.to_string().as_bytes(), false, )?; } for (target, source) in target_source { writer.add_file(prefix.join(target), source, false)?; } Ok(()) } /// Copies git-tracked files to a source distribution. /// /// Runs `git ls-files -z` to obtain a list of files to package. fn add_git_tracked_files_to_sdist( pyproject_toml_path: &Path, writer: &mut VirtualWriter, prefix: impl AsRef, ) -> Result<()> { let pyproject_dir = pyproject_toml_path.parent().unwrap(); let output = Command::new("git") .args(["ls-files", "-z"]) .current_dir(pyproject_dir) .output() .context("Failed to run `git ls-files -z`")?; if !output.status.success() { bail!( "Failed to query file list from git: {}\n--- Project Path: {}\n--- Stdout:\n{}\n--- Stderr:\n{}", output.status, pyproject_dir.display(), String::from_utf8_lossy(&output.stdout), String::from_utf8_lossy(&output.stderr), ); } let prefix = prefix.as_ref(); let file_paths = str::from_utf8(&output.stdout) .context("git printed invalid utf-8 ಠ_ಠ")? .split('\0') .filter(|s| !s.is_empty()) .map(Path::new); for source in file_paths { writer.add_file(prefix.join(source), pyproject_dir.join(source), false)?; } Ok(()) } /// Shared context for building a source distribution from cargo packages. /// /// Groups the common parameters needed when adding crates and path dependencies /// to the sdist, avoiding excessive argument counts. struct SdistContext<'a> { project: &'a crate::ProjectContext, root_dir: &'a Path, workspace_root: &'a Utf8Path, workspace_manifest_path: camino::Utf8PathBuf, known_path_deps: HashMap, sdist_root: PathBuf, abs_manifest_dir: PathBuf, relative_main_crate_manifest_dir: PathBuf, project_root: PathBuf, pyproject_dir: PathBuf, workspace_manifest_cache: HashMap, } impl<'a> SdistContext<'a> { fn new( project: &'a crate::ProjectContext, pyproject_toml_path: &Path, root_dir: &'a Path, ) -> Result { let manifest_path = &project.manifest_path; let workspace_root = &project.cargo_metadata.workspace_root; let workspace_manifest_path = workspace_root.join("Cargo.toml"); let known_path_deps = find_path_deps(&project.cargo_metadata)?; debug!( "Found path dependencies: {:?}", known_path_deps.keys().collect::>() ); let sdist_root = compute_sdist_root( workspace_root, pyproject_toml_path, &project.project_layout.python_dir, &known_path_deps, )?; debug!("Found sdist root: {}", sdist_root.display()); let abs_manifest_path = manifest_path .normalize() .with_context(|| { format!( "manifest path `{}` does not exist or is invalid", manifest_path.display() ) })? .into_path_buf(); let abs_manifest_dir = abs_manifest_path.parent().unwrap().to_path_buf(); let relative_main_crate_manifest_dir = manifest_path .parent() .unwrap() .strip_prefix(&sdist_root) .unwrap() .to_path_buf(); let project_root = compute_project_root(pyproject_toml_path, &sdist_root).to_path_buf(); let pyproject_dir = pyproject_toml_path.parent().unwrap().to_path_buf(); let workspace_manifest_cache = build_workspace_manifest_cache(&known_path_deps, workspace_root)?; Ok(Self { project, root_dir, workspace_root, workspace_manifest_path, known_path_deps, sdist_root, abs_manifest_dir, relative_main_crate_manifest_dir, project_root, pyproject_dir, workspace_manifest_cache, }) } } fn build_workspace_manifest_cache( known_path_deps: &HashMap, root_workspace: &Utf8Path, ) -> Result> { let mut cache = HashMap::new(); for path_dep in known_path_deps.values() { if path_dep.workspace_root.as_path() == root_workspace.as_std_path() { continue; } let workspace_manifest_path = path_dep.workspace_root.join("Cargo.toml"); if cache.contains_key(&workspace_manifest_path) { continue; } cache.insert( workspace_manifest_path.clone(), parse_workspace_manifest_inheritance(&workspace_manifest_path)?, ); } Ok(cache) } /// Resolve sdist_root — the common ancestor of all files that need to be in the sdist. fn compute_sdist_root( workspace_root: &Utf8Path, pyproject_toml_path: &Path, python_dir: &Path, known_path_deps: &HashMap, ) -> Result { let mut sdist_root = common_path_prefix(workspace_root.as_std_path(), pyproject_toml_path) .with_context(|| { format!( "Failed to determine common path prefix of workspace root `{}` and pyproject.toml `{}`", workspace_root, pyproject_toml_path.display() ) })?; for path_dep in known_path_deps.values() { if let Some(prefix) = common_path_prefix(&sdist_root, path_dep.manifest_path.parent().unwrap()) { sdist_root = prefix; } else { bail!("Failed to determine common path prefix of path dependencies"); } } // Expand sdist_root to also cover python_dir when python-source points // outside the workspace/pyproject directory tree (issue #2202). if !python_dir.starts_with(&sdist_root) && let Some(prefix) = common_path_prefix(&sdist_root, python_dir) { sdist_root = prefix; } Ok(sdist_root) } /// Determine the outermost project root for computing relative paths inside /// the sdist. This covers both pyproject.toml and the sdist_root. fn compute_project_root<'a>(pyproject_toml_path: &'a Path, sdist_root: &'a Path) -> &'a Path { let pyproject_root = pyproject_toml_path.parent().unwrap(); if pyproject_root == sdist_root || pyproject_root.starts_with(sdist_root) { sdist_root } else { assert!(sdist_root.starts_with(pyproject_root)); pyproject_root } } /// Add a single path dependency to the sdist. fn add_path_dep( writer: &mut VirtualWriter, ctx: &SdistContext<'_>, name: &str, path_dep: &PathDependency, ) -> Result<()> { debug!( "Adding path dependency: {} at {}", name, path_dep.manifest_path.display() ); let path_dep_manifest_dir = path_dep.manifest_path.parent().unwrap(); let relative_path_dep_manifest_dir = path_dep_manifest_dir.strip_prefix(&ctx.sdist_root).unwrap(); // we may need to rewrite workspace Cargo.toml later so don't add it to sdist yet let skip_cargo_toml = ctx.workspace_manifest_path.as_std_path() == path_dep.manifest_path.as_path(); // Handle possible relative readme / license-file fields in Cargo.toml let target_dir = ctx.root_dir.join(relative_path_dep_manifest_dir); let readme = path_dep .readme .as_ref() .map(|readme| { resolve_and_add_manifest_asset( writer, path_dep_manifest_dir, readme, &target_dir, "readme", None, ) }) .transpose()?; let license_file = path_dep .license_file .as_ref() .map(|lf| { resolve_and_add_manifest_asset( writer, path_dep_manifest_dir, lf, &target_dir, "license-file", Some(&path_dep.workspace_root), ) }) .transpose()?; // Check if the dependency's workspace manifest is outside the sdist root. // When it is, we need to inline workspace-inherited fields since we can't // include the parent workspace manifest in the sdist. let has_different_workspace = path_dep.workspace_root.as_path() != ctx.workspace_root.as_std_path(); let path_dep_workspace_manifest = has_different_workspace.then(|| path_dep.workspace_root.join("Cargo.toml")); let workspace_outside_sdist = path_dep_workspace_manifest .as_ref() .is_some_and(|m| m.strip_prefix(&ctx.sdist_root).is_err()); let package_metadata = path_dep .resolved_package .as_ref() .or_else(|| { ctx.project .cargo_metadata .packages .iter() .find(|pkg| pkg.manifest_path.as_std_path() == path_dep.manifest_path.as_path()) }) .with_context(|| { format!( "Failed to find cargo metadata for path dependency at {}", path_dep.manifest_path.display() ) })?; add_crate_to_source_distribution( writer, &path_dep.manifest_path, &ctx.root_dir.join(relative_path_dep_manifest_dir), readme.as_ref(), license_file.as_ref(), &AddCrateOptions { is_root: false, known_path_deps: None, skip_prefixes: Vec::new(), skip_cargo_toml, package_metadata, workspace_inheritance: workspace_outside_sdist.then(|| { path_dep_workspace_manifest .as_ref() .and_then(|path| ctx.workspace_manifest_cache.get(path.as_path())) .expect("workspace inheritance cache missing entry") }), }, &ctx.project.target_dir, ) .with_context(|| { format!( "Failed to add local dependency {} at {} to the source distribution", name, path_dep.manifest_path.display() ) })?; // Handle different workspace manifest if let Some(path_dep_workspace_manifest) = path_dep_workspace_manifest { if let Ok(relative_path_dep_workspace_manifest) = path_dep_workspace_manifest.strip_prefix(&ctx.sdist_root) { writer.add_file( ctx.root_dir.join(relative_path_dep_workspace_manifest), &path_dep_workspace_manifest, false, )?; } else { debug!( "Skipping workspace manifest at {} (outside sdist root), \ workspace-inherited fields have been inlined", path_dep_workspace_manifest.display() ); } } Ok(()) } /// Add the root crate's files to the sdist. fn add_main_crate(writer: &mut VirtualWriter, ctx: &SdistContext<'_>) -> Result<()> { let manifest_path = &ctx.project.manifest_path; let main_crate = ctx .project .cargo_metadata .root_package() .context("Expected cargo to return metadata with root_package")?; debug!("Adding the main crate {}", manifest_path.display()); // Resolve readme / license-file let target_dir = ctx.root_dir.join(&ctx.relative_main_crate_manifest_dir); let readme = main_crate .readme .as_ref() .map(|readme| { resolve_and_add_manifest_asset( writer, &ctx.abs_manifest_dir, readme.as_std_path(), &target_dir, "readme", None, ) }) .transpose()?; let license_file = main_crate .license_file .as_ref() .map(|lf| { resolve_and_add_manifest_asset( writer, &ctx.abs_manifest_dir, lf.as_std_path(), &target_dir, "license-file", Some(ctx.workspace_root.as_std_path()), ) }) .transpose()?; // Compute python source directories relative to the manifest directory. // When the crate is a workspace member in a subdirectory, `cargo package --list` // includes python source files that will also be added by the explicit python // source loop (relative to pyproject_dir). We skip them here to avoid duplicates. // See https://github.com/PyO3/maturin/issues/2383 let skip_prefixes: Vec = if !ctx.relative_main_crate_manifest_dir.as_os_str().is_empty() { let mut prefixes = Vec::new(); if let Some(python_module) = ctx.project.project_layout.python_module.as_ref() && let Ok(rel) = python_module.strip_prefix(&ctx.abs_manifest_dir) { prefixes.push(rel.to_path_buf()); } for package in &ctx.project.project_layout.python_packages { let package_path = ctx.project.project_layout.python_dir.join(package); if let Ok(rel) = package_path.strip_prefix(&ctx.abs_manifest_dir) && !prefixes.contains(&rel.to_path_buf()) { prefixes.push(rel.to_path_buf()); } } prefixes } else { Vec::new() }; add_crate_to_source_distribution( writer, manifest_path, &ctx.root_dir.join(&ctx.relative_main_crate_manifest_dir), readme.as_ref(), license_file.as_ref(), &AddCrateOptions { is_root: true, known_path_deps: Some(&ctx.known_path_deps), skip_prefixes, skip_cargo_toml: false, package_metadata: main_crate, workspace_inheritance: None, }, &ctx.project.target_dir, )?; Ok(()) } /// Add Cargo.lock to the sdist. fn add_cargo_lock(writer: &mut VirtualWriter, ctx: &SdistContext<'_>) -> Result<()> { // `abs_manifest_dir` is canonicalized (symlinks resolved). Use the // logical absolute manifest dir from `project.manifest_path` so the // resulting `Cargo.lock` path is consistent with `project_root` (also a // logical path) when `Cargo.toml` is a symlink pointing outside the // project root (#3177). let manifest_dir = ctx .project .manifest_path .parent() .map(Path::to_path_buf) .unwrap_or_else(|| ctx.abs_manifest_dir.clone()); let manifest_cargo_lock_path = manifest_dir.join("Cargo.lock"); let workspace_cargo_lock = ctx.workspace_root.join("Cargo.lock").into_std_path_buf(); let cargo_lock_path = if manifest_cargo_lock_path.exists() { Some(manifest_cargo_lock_path) } else if workspace_cargo_lock.exists() { Some(workspace_cargo_lock) } else { None }; let cargo_lock_required = ctx.project.cargo_options.locked || ctx.project.cargo_options.frozen; if let Some(cargo_lock_path) = cargo_lock_path { let relative_cargo_lock = cargo_lock_path.strip_prefix(&ctx.project_root).unwrap(); writer.add_file( ctx.root_dir.join(relative_cargo_lock), &cargo_lock_path, false, )?; } else if cargo_lock_required { bail!("Cargo.lock is required by `--locked`/`--frozen` but it's not found."); } else { eprintln!( "âš ï¸� Warning: Cargo.lock is not found, it is recommended \ to include it in the source distribution" ); } Ok(()) } /// Add the workspace Cargo.toml (when the crate is a workspace member). fn add_workspace_manifest( writer: &mut VirtualWriter, ctx: &SdistContext<'_>, ) -> Result<()> { // Without the workspace Cargo.toml, cargo can't resolve workspace-level deps. // Note: when a crate is `exclude`d from a workspace, `cargo metadata` reports // the crate's own directory as `workspace_root`, so this check correctly // skips adding the parent workspace Cargo.toml for excluded crates. // // `abs_manifest_dir` is canonicalized while `workspace_root` (from cargo // metadata) is not. Comparing them directly produces a false positive when // `Cargo.toml` is a symlink pointing outside the workspace, so use the // logical absolute manifest dir from `project.manifest_path` instead // (#3177). let logical_manifest_dir = ctx .project .manifest_path .parent() .map(Path::to_path_buf) .unwrap_or_else(|| ctx.abs_manifest_dir.clone()); let is_in_workspace = ctx.workspace_root.as_std_path() != logical_manifest_dir; if !is_in_workspace { return Ok(()); } let relative_workspace_cargo_toml = ctx .workspace_manifest_path .as_std_path() .strip_prefix(&ctx.project_root) .unwrap(); // Collect all crates that must remain in `workspace.members`: // the known path dependencies plus the main Python binding crate itself. let mut deps_to_keep = ctx.known_path_deps.clone(); let main_member_name = logical_manifest_dir .strip_prefix(ctx.workspace_root) .with_context(|| { format!( "Failed to strip workspace root `{}` from manifest dir `{}`", ctx.workspace_root, logical_manifest_dir.display() ) })? .to_string_lossy() .into_owned(); deps_to_keep.insert( main_member_name, PathDependency { manifest_path: ctx.project.manifest_path.to_path_buf(), workspace_root: ctx.workspace_root.as_std_path().to_path_buf(), readme: None, license_file: None, resolved_package: None, }, ); // Rewrite workspace Cargo.toml to only include relevant members. let mut document = parse_toml_file(ctx.workspace_manifest_path.as_std_path(), "Cargo.toml")?; rewrite_cargo_toml( &mut document, ctx.workspace_manifest_path.as_std_path(), &deps_to_keep, )?; // When the workspace root Cargo.toml is also a [package] (virtual // workspaces don't have one), the package's source files are typically // not included in the sdist. Strip the [package] section so cargo // treats it as a virtual workspace. let workspace_root_is_path_dep = ctx .known_path_deps .values() .any(|dep| dep.manifest_path.as_path() == ctx.workspace_manifest_path.as_std_path()); if !workspace_root_is_path_dep && document.contains_key("package") { strip_non_workspace_tables(&mut document, ctx.workspace_manifest_path.as_std_path()); } writer.add_bytes( ctx.root_dir.join(relative_workspace_cargo_toml), Some(ctx.workspace_manifest_path.as_std_path()), document.to_string().as_bytes(), false, )?; Ok(()) } /// Orchestrates adding all cargo package files to the sdist. /// /// Delegates to focused helpers for each phase: /// 1. Path dependencies /// 2. Main crate /// 3. Cargo.lock /// 4. Workspace manifest /// 5. pyproject.toml /// 6. Python sources fn add_cargo_package_files_to_sdist( project: &crate::ProjectContext, pyproject: &PyProjectToml, pyproject_toml_path: &Path, writer: &mut VirtualWriter, root_dir: &Path, ) -> Result<()> { let ctx = SdistContext::new(project, pyproject_toml_path, root_dir)?; let workspace_root = project.cargo_metadata.workspace_root.as_std_path(); let normalized_pyproject_dir = ctx.pyproject_dir.normalize()?.into_path_buf(); let normalized_workspace_root = workspace_root.normalize()?.into_path_buf(); let allowed_metadata_root = if normalized_pyproject_dir.starts_with(&normalized_workspace_root) { workspace_root } else { &ctx.pyproject_dir }; // 1. Add local path dependencies for (name, path_dep) in ctx.known_path_deps.iter() { add_path_dep(writer, &ctx, name, path_dep)?; } // 2. Add the main crate add_main_crate(writer, &ctx)?; // 3. Add Cargo.lock add_cargo_lock(writer, &ctx)?; // 4. Add workspace Cargo.toml (if applicable) add_workspace_manifest(writer, &ctx)?; // 5. Add pyproject.toml metadata files and collect path rewrites. let metadata_rewrites = add_pyproject_metadata_files(writer, pyproject, &ctx, allowed_metadata_root)?; // 6. Add pyproject.toml add_pyproject_toml(writer, &ctx, pyproject_toml_path, &metadata_rewrites)?; // 7. Add python source files add_python_sources(writer, &ctx)?; Ok(()) } /// Add every license file recorded in `PKG-INFO` at its `License-File` path. /// /// `License-File` paths are relative to the sdist root. Explicit /// `project.license-files` are already copied there by /// [`add_pyproject_metadata`], but auto-discovered license files and Cargo's /// `license-file` are only packaged next to their crate, which is not the sdist /// root when `pyproject.toml` is moved up, e.g. for a cargo workspace member. /// /// A file already present at the target path is kept, since replacing it could /// break the crate it was packaged for; we only warn if its content differs. fn add_license_files( writer: &mut VirtualWriter, metadata24: &Metadata24, pyproject_dir: &Path, root_dir: &Path, ) -> Result<()> { for path in &metadata24.license_files { let target = root_dir.join(path); let source = metadata24 .license_file_sources .get(path) .cloned() .unwrap_or_else(|| pyproject_dir.join(path)); if writer.contains_target(&target) { if let Some(existing) = writer.target_source(&target) && !matches!( (fs_err::read(existing), fs_err::read(&source)), (Ok(a), Ok(b)) if a == b ) { eprintln!( "âš ï¸� Warning: `License-File: {}` in the source distribution refers to `{}` \ instead of `{}`, because a different file was already added at that path", path.display(), existing.display(), source.display() ); } continue; } debug!("Including license file `{}`", path.display()); writer.add_file(target, source, false)?; } Ok(()) } /// Creates a source distribution, packing the root crate and all local dependencies /// /// The source distribution format is specified in /// [PEP 517 under "build_sdist"](https://www.python.org/dev/peps/pep-0517/#build-sdist) /// and in /// https://packaging.python.org/specifications/source-distribution-format/#source-distribution-file-format pub fn source_distribution( project: &crate::ProjectContext, artifact: &crate::ArtifactContext, pyproject: &PyProjectToml, excludes: Override, ) -> Result { let pyproject_toml_path = project .pyproject_toml_path .normalize() .with_context(|| { format!( "pyproject.toml path `{}` does not exist or is invalid", project.pyproject_toml_path.display() ) })? .into_path_buf(); let source_date_epoch: Option = env::var("SOURCE_DATE_EPOCH") .ok() .and_then(|var| match var.parse() { Err(_) => { warn!("SOURCE_DATE_EPOCH is malformed, ignoring"); None } Ok(val) => Some(val), }); let metadata24 = &project.metadata24; let writer = SDistWriter::new(&artifact.out, metadata24, source_date_epoch)?; let mut writer = VirtualWriter::new(writer, excludes); let root_dir = PathBuf::from(format!( "{}-{}", metadata24.get_distribution_escaped(), metadata24.get_version_escaped() )); let pyproject_dir = pyproject_toml_path.parent().unwrap(); match pyproject.sdist_generator() { SdistGenerator::Cargo => { add_cargo_package_files_to_sdist( project, pyproject, &pyproject_toml_path, &mut writer, &root_dir, )?; } SdistGenerator::Git => { reject_parent_relative_metadata_paths(pyproject)?; add_git_tracked_files_to_sdist(&pyproject_toml_path, &mut writer, &root_dir)?; } }; add_pyproject_metadata( &mut writer, pyproject, pyproject_dir, &root_dir, &project.project_layout.python_dir, )?; add_license_files(&mut writer, metadata24, pyproject_dir, &root_dir)?; let pkg_info = root_dir.join("PKG-INFO"); writer.add_bytes( &pkg_info, None, metadata24.to_file_contents()?.as_bytes(), false, )?; let source_distribution_path = writer.finish(&pkg_info)?; eprintln!( "📦 Built source distribution to {}", source_distribution_path.display() ); Ok(source_distribution_path) } #[cfg(test)] mod tests { use super::*; use fs_err as fs; use tempfile::TempDir; #[test] fn test_resolve_manifest_asset_rejects_license_outside_allowed_root() { let temp_dir = TempDir::new().unwrap(); let workspace_root = temp_dir.path().join("workspace"); let manifest_dir = workspace_root.join("crate"); fs::create_dir_all(&manifest_dir).unwrap(); fs::write(temp_dir.path().join("SECRET_LICENSE"), "secret").unwrap(); let err = resolve_manifest_asset( &manifest_dir, Path::new("../../SECRET_LICENSE"), "license-file", Some(&workspace_root), ) .unwrap_err(); assert!( err.to_string().contains("outside allowed root"), "unexpected error: {err:#}" ); } } maturin-1.16.0/src/source_distribution/path_deps.rs000066400000000000000000000320361527064705700225020ustar00rootroot00000000000000use anyhow::{Context, Result}; use cargo_metadata::{Dependency, Metadata, MetadataCommand, NodeDep, Package, PackageId}; use std::collections::{HashMap, HashSet}; use std::path::PathBuf; /// Path dependency information. /// It may be in a different workspace than the root crate. /// /// ```toml /// [dependencies] /// foo = { path = "path/to/foo" } /// ``` #[derive(Debug, Clone)] pub struct PathDependency { /// `Cargo.toml` path of the path dependency pub(super) manifest_path: PathBuf, /// workspace root of the path dependency pub(super) workspace_root: PathBuf, /// readme path of the path dependency pub(super) readme: Option, /// license-file path of the path dependency pub(super) license_file: Option, /// Resolved package metadata from `cargo metadata`, used to inline /// workspace-inherited fields when the workspace manifest is outside the sdist root. pub(super) resolved_package: Option, } /// Returns true when a declared dependency matches one of the resolved node kinds. fn dep_kind_matches_node(dependency: &Dependency, node_dep: &NodeDep) -> bool { if node_dep.dep_kinds.is_empty() { return true; } node_dep.dep_kinds.iter().any(|dep_kind| { dep_kind.kind == dependency.kind && dep_kind.target.as_ref() == dependency.target.as_ref() }) } /// Finds the declared path dependency in `package.dependencies` corresponding /// to a resolved `NodeDep`. fn find_declared_path_dependency<'a>( package: &'a Package, dep_pkg: &Package, node_dep: &NodeDep, ) -> Option<&'a Dependency> { let mut candidates: Vec<&Dependency> = package .dependencies .iter() .filter(|dependency| { dependency.path.is_some() && dep_pkg.name == dependency.name && dep_kind_matches_node(dependency, node_dep) }) .collect(); if candidates.is_empty() { return None; } // Prefer exact key/rename match (`node_dep.name` is the dependency key // used in the resolve graph), but fall back to the first kind-matching // candidate for older metadata edge cases. candidates .iter() .find(|dependency| { dependency.rename.as_deref().unwrap_or(&dependency.name) == node_dep.name.as_str() }) .copied() .or_else(|| candidates.pop()) } /// Finds all path dependencies of the crate. /// /// Walks the resolved dependency graph from `cargo metadata` and collects /// every transitively-reachable path dependency. For same-workspace deps /// the root metadata already contains all resolved data (workspace root, /// package fields, readme, license-file), so no extra subprocess is needed. /// Only cross-workspace path deps require a separate `cargo metadata` call /// to discover their workspace root. pub fn find_path_deps(cargo_metadata: &Metadata) -> Result> { let root = cargo_metadata .root_package() .context("Expected the dependency graph to have a root package")?; let workspace_root = &cargo_metadata.workspace_root; // Pre-build lookup indices to avoid repeated linear scans let packages_by_id: HashMap<&PackageId, &cargo_metadata::Package> = cargo_metadata.packages.iter().map(|p| (&p.id, p)).collect(); let resolve_nodes: HashMap<&PackageId, &[cargo_metadata::NodeDep]> = cargo_metadata .resolve .as_ref() .context("cargo metadata is missing dependency resolve information")? .nodes .iter() .map(|node| (&node.id, node.deps.as_slice())) .collect(); // Scan the dependency graph for path dependencies let mut path_deps: HashMap = HashMap::new(); let mut visited_path_packages: HashSet = HashSet::new(); let mut stack: Vec<&cargo_metadata::Package> = vec![root]; while let Some(top) = stack.pop() { let node_deps = resolve_nodes .get(&top.id) .with_context(|| format!("missing resolve node for package {}", top.id))?; for node_dep in *node_deps { let dep_pkg = packages_by_id .get(&node_dep.pkg) .with_context(|| format!("missing package metadata for {}", node_dep.pkg))?; // Match the resolved dependency back to the declared path dependency. let Some(dependency) = find_declared_path_dependency(top, dep_pkg, node_dep) else { continue; }; // Process each unique path dependency package only once. This avoids // dropping transitive dependencies when different crates reuse the // same dependency alias/key. if !visited_path_packages.insert(node_dep.pkg.clone()) { continue; } let dep_name = dependency.rename.as_ref().unwrap_or(&dependency.name); let dep_manifest_path = dependency .path .as_ref() .expect("find_declared_path_dependency only returns path deps") .join("Cargo.toml"); // For same-workspace path deps, the root cargo metadata already // contains everything we need: workspace root, resolved package // fields (including workspace-inherited ones), readme, and // license-file. Only cross-workspace deps require a separate // `cargo metadata` invocation to discover their workspace root. let is_same_workspace = dep_manifest_path.starts_with(workspace_root); let dep_workspace_root = if is_same_workspace { workspace_root.clone().into_std_path_buf() } else { let path_dep_metadata = MetadataCommand::new() .manifest_path(&dep_manifest_path) .verbose(true) // We only need the workspace root, not the dep graph .no_deps() .exec() .with_context(|| { format!( "Failed to resolve workspace root for {} at '{dep_manifest_path}'", node_dep.pkg ) })?; path_dep_metadata.workspace_root.into_std_path_buf() }; let dep_manifest_path = dep_manifest_path.into_std_path_buf(); let dep_key = match path_deps.get(dep_name) { Some(existing) if existing.manifest_path == dep_manifest_path => dep_name.clone(), Some(_) => format!("{dep_name}@{}", node_dep.pkg), None => dep_name.clone(), }; // The root cargo metadata already resolves all package fields // (including workspace-inherited ones) for every package in the // dependency graph, regardless of which workspace they belong to. // Only cross-workspace deps need the resolved package stored, as // it's used to inline workspace-inherited fields when the workspace // manifest falls outside the sdist root. path_deps.insert( dep_key, PathDependency { manifest_path: dep_manifest_path, workspace_root: dep_workspace_root, readme: dep_pkg .readme .as_ref() .map(|r| r.clone().into_std_path_buf()), license_file: dep_pkg .license_file .as_ref() .map(|l| l.clone().into_std_path_buf()), resolved_package: if is_same_workspace { None } else { Some((*dep_pkg).clone()) }, }, ); // Continue scanning the path dependency's own dependencies. if let Some(&dep_package) = packages_by_id.get(&node_dep.pkg) { stack.push(dep_package) } } } Ok(path_deps) } #[cfg(test)] mod tests { use super::*; use cargo_metadata::MetadataCommand; use fs_err as fs; use std::path::Path; #[test] fn test_find_path_deps_captures_workspace_license_file() { let temp_dir = tempfile::TempDir::new().unwrap(); let workspace_root = temp_dir.path(); let py_dir = workspace_root.join("py"); let dep_dir = workspace_root.join("dep"); fs::create_dir_all(py_dir.join("src")).unwrap(); fs::create_dir_all(dep_dir.join("src")).unwrap(); fs::write(py_dir.join("src/lib.rs"), "").unwrap(); fs::write(dep_dir.join("src/lib.rs"), "").unwrap(); fs::write(workspace_root.join("LICENSE"), "MIT").unwrap(); fs::write( workspace_root.join("Cargo.toml"), indoc::indoc!( r#" [workspace] resolver = "2" members = ["py", "dep"] [workspace.package] license-file = "LICENSE" "# ), ) .unwrap(); fs::write( dep_dir.join("Cargo.toml"), indoc::indoc!( r#" [package] name = "dep" version = "0.1.0" edition = "2021" license-file.workspace = true "# ), ) .unwrap(); fs::write( py_dir.join("Cargo.toml"), indoc::indoc!( r#" [package] name = "py" version = "0.1.0" edition = "2021" [dependencies] dep = { path = "../dep" } "# ), ) .unwrap(); let cargo_metadata = MetadataCommand::new() .manifest_path(py_dir.join("Cargo.toml")) .exec() .unwrap(); let path_deps = find_path_deps(&cargo_metadata).unwrap(); let dep = path_deps.get("dep").expect("missing path dependency"); assert_eq!(dep.license_file.as_deref(), Some(Path::new("../LICENSE"))); } #[test] fn test_find_path_deps_keeps_distinct_crates_with_same_alias() { let temp_dir = tempfile::TempDir::new().unwrap(); let root_dir = temp_dir.path(); for crate_dir in ["root", "a", "b", "dep_a", "dep_b"] { let dir = root_dir.join(crate_dir); fs::create_dir_all(dir.join("src")).unwrap(); fs::write(dir.join("src/lib.rs"), "").unwrap(); } fs::write( root_dir.join("root/Cargo.toml"), indoc::indoc!( r#" [package] name = "root" version = "0.1.0" edition = "2021" [dependencies] a = { path = "../a" } b = { path = "../b" } "# ), ) .unwrap(); fs::write( root_dir.join("a/Cargo.toml"), indoc::indoc!( r#" [package] name = "a" version = "0.1.0" edition = "2021" [dependencies] shared = { package = "dep_a", path = "../dep_a" } "# ), ) .unwrap(); fs::write( root_dir.join("b/Cargo.toml"), indoc::indoc!( r#" [package] name = "b" version = "0.1.0" edition = "2021" [dependencies] shared = { package = "dep_b", path = "../dep_b" } "# ), ) .unwrap(); fs::write( root_dir.join("dep_a/Cargo.toml"), indoc::indoc!( r#" [package] name = "dep_a" version = "0.1.0" edition = "2021" "# ), ) .unwrap(); fs::write( root_dir.join("dep_b/Cargo.toml"), indoc::indoc!( r#" [package] name = "dep_b" version = "0.1.0" edition = "2021" "# ), ) .unwrap(); let cargo_metadata = MetadataCommand::new() .manifest_path(root_dir.join("root/Cargo.toml")) .exec() .unwrap(); let path_deps = find_path_deps(&cargo_metadata).unwrap(); let manifests: Vec = path_deps .values() .map(|dep| dep.manifest_path.clone()) .collect(); assert!( manifests .iter() .any(|path| path.ends_with("dep_a/Cargo.toml")), "dep_a path dependency missing: {manifests:#?}" ); assert!( manifests .iter() .any(|path| path.ends_with("dep_b/Cargo.toml")), "dep_b path dependency missing: {manifests:#?}" ); } } maturin-1.16.0/src/source_distribution/pyproject.rs000066400000000000000000000354501527064705700225550ustar00rootroot00000000000000use crate::module_writer::skip_build_dirs; use crate::pyproject_toml::Format; use crate::{ModuleWriter, PyProjectToml, SDistWriter, VirtualWriter}; use anyhow::{Context, Result, bail}; use ignore::WalkBuilder; use normpath::PathExt as _; use path_slash::PathExt as _; use pyproject_toml::check_pep639_glob; use std::collections::HashSet; use std::path::{Component, Path, PathBuf}; use tracing::{debug, trace}; use super::SdistContext; use super::cargo_toml_rewrite::parse_toml_file; use super::utils::is_compiled_artifact; pub(super) type PyprojectPathRewrite = (&'static str, String); fn parent_relative_metadata_path(field: &str, path: &Path) -> Result { if path .components() .any(|c| matches!(c, Component::Prefix(_) | Component::RootDir)) { bail!( "`project.{field}.file` path `{}` must be relative to pyproject.toml", path.display() ); } Ok(path.components().any(|c| matches!(c, Component::ParentDir))) } fn project_metadata_paths( project: &pyproject_toml::Project, ) -> Vec<(&'static str, &'static str, &Path)> { let mut paths = Vec::new(); match project.readme.as_ref() { Some(pyproject_toml::ReadMe::RelativePath(file)) => { paths.push(("readme", "project.readme", Path::new(file.as_str()))); } Some(pyproject_toml::ReadMe::Table { file: Some(file), .. }) => { paths.push(("readme", "project.readme.file", Path::new(file.as_str()))); } _ => {} } if let Some(pyproject_toml::License::File { file }) = project.license.as_ref() { paths.push(("license", "project.license.file", file.as_path())); } paths } /// Add readme/license files referenced from `[project]` metadata. /// /// Because the generated `pyproject.toml` always lives at the sdist root, any /// parent-relative metadata path must be rewritten to the referenced file's /// archive path. The source is still constrained by `allowed_metadata_root`. pub(super) fn add_pyproject_metadata_files( writer: &mut VirtualWriter, pyproject: &PyProjectToml, ctx: &SdistContext<'_>, allowed_metadata_root: &Path, ) -> Result> { let mut rewrites = Vec::new(); let Some(project) = pyproject.project.as_ref() else { return Ok(rewrites); }; let allowed_metadata_root = allowed_metadata_root.normalize()?.into_path_buf(); let project_root = ctx.project_root.normalize()?.into_path_buf(); for (field, field_name, path) in project_metadata_paths(project) { let mut source = ctx.pyproject_dir.join(path); let mut target_relative = path.to_path_buf(); if parent_relative_metadata_path(field_name, path)? { if ctx.pyproject_dir == ctx.sdist_root { bail!( "`{field_name}` path `{}` must not contain `..` when pyproject.toml is already at the sdist root", path.display() ); } source = source.normalize()?.into_path_buf(); if !source.starts_with(allowed_metadata_root.as_path()) { bail!( "`{field_name}` path `{}` resolves outside allowed metadata root `{}`", path.display(), allowed_metadata_root.display() ); } target_relative = source .strip_prefix(&project_root) .with_context(|| { format!( "`{field_name}` path `{}` resolves outside sdist project root `{}`", path.display(), project_root.display() ) })? .to_path_buf(); let rewrite_path = target_relative .to_slash() .with_context(|| { format!( "`{field_name}` path `{}` is not valid UTF-8", path.display() ) })? .into_owned(); rewrites.push((field, rewrite_path)); } let target = ctx.root_dir.join(target_relative); if !writer.contains_target(&target) { writer.add_file(target, source, false)?; } } Ok(rewrites) } /// Reject parent-relative pyproject metadata paths for the git sdist generator. /// /// Git sdists are intentionally faithful to `git ls-files` from the /// `pyproject.toml` directory. Since `pyproject.toml` must be placed at the /// sdist root, parent-relative metadata paths cannot remain valid without /// copying and rewriting extra files outside that file list. pub(super) fn reject_parent_relative_metadata_paths(pyproject: &PyProjectToml) -> Result<()> { let Some(project) = pyproject.project.as_ref() else { return Ok(()); }; for (_, field_name, path) in project_metadata_paths(project) { if parent_relative_metadata_path(field_name, path)? { bail!( "`{field_name}` path `{}` must not contain `..` when using the git sdist generator", path.display() ); } } Ok(()) } /// Add pyproject.toml to the sdist (rewriting paths if necessary). pub(super) fn add_pyproject_toml( writer: &mut VirtualWriter, ctx: &SdistContext<'_>, pyproject_toml_path: &Path, metadata_rewrites: &[PyprojectPathRewrite], ) -> Result<()> { if ctx.pyproject_dir != ctx.sdist_root { let relative_manifest_path = ctx.relative_main_crate_manifest_dir.join("Cargo.toml"); let python_dir = &ctx.project.project_layout.python_dir; // Compute python-source relative to pyproject_dir. When python_dir is // outside pyproject_dir, compute the path relative to project_root instead. let relative_python_source = if python_dir != &ctx.pyproject_dir { python_dir .strip_prefix(&ctx.pyproject_dir) .or_else(|_| python_dir.strip_prefix(&ctx.project_root)) .ok() .map(|p| p.to_path_buf()) } else { None }; let rewritten = rewrite_pyproject_toml( pyproject_toml_path, &relative_manifest_path, relative_python_source.as_deref(), metadata_rewrites, )?; writer.add_bytes( ctx.root_dir.join("pyproject.toml"), Some(pyproject_toml_path), rewritten.as_bytes(), false, )?; } else { writer.add_file( ctx.root_dir.join("pyproject.toml"), pyproject_toml_path, false, )?; } Ok(()) } /// Add python source files to the sdist. pub(super) fn add_python_sources( writer: &mut VirtualWriter, ctx: &SdistContext<'_>, ) -> Result<()> { let project = ctx.project; let mut python_packages = Vec::new(); if let Some(python_module) = project.project_layout.python_module.as_ref() { trace!("Resolved python module: {}", python_module.display()); python_packages.push(python_module.to_path_buf()); } for package in &project.project_layout.python_packages { let package_path = project.project_layout.python_dir.join(package); if python_packages.contains(&package_path) { continue; } trace!("Resolved python package: {}", package_path.display()); python_packages.push(package_path); } for package in &python_packages { for entry in WalkBuilder::new(package) .filter_entry(skip_build_dirs(&project.target_dir, &python_packages)) .build() { let source = entry?.into_path(); if is_compiled_artifact(&source) { debug!("Ignoring {}", source.display()); continue; } // When python-source points outside pyproject_dir, strip from // project_root instead (issue #2202). let relative = source .strip_prefix(&ctx.pyproject_dir) .or_else(|_| source.strip_prefix(&ctx.project_root)) .with_context(|| { format!( "Python source file `{}` is outside both pyproject dir `{}` and project root `{}`", source.display(), ctx.pyproject_dir.display(), ctx.project_root.display(), ) })?; if !source.is_dir() { writer.add_file(ctx.root_dir.join(relative), &source, false)?; } } } Ok(()) } /// Add `license-files` globs and explicit include patterns from /// `pyproject.toml` metadata. /// /// Readme and `license.file` references are handled earlier for Cargo sdists; /// for git sdists they are expected to come from `git ls-files`. pub(super) fn add_pyproject_metadata( writer: &mut VirtualWriter, pyproject: &PyProjectToml, pyproject_dir: &Path, root_dir: &Path, python_dir: &Path, ) -> Result<()> { if let Some(project) = pyproject.project.as_ref() && let Some(license_files) = &project.license_files { let pyproject_dir_str = pyproject_dir.to_str().with_context(|| { format!( "project path is not valid UTF-8: {}", pyproject_dir.display() ) })?; let escaped_pyproject_dir = PathBuf::from(glob::Pattern::escape(pyproject_dir_str)); let mut seen = HashSet::new(); for license_glob in license_files { check_pep639_glob(license_glob)?; for license_path in glob::glob(&escaped_pyproject_dir.join(license_glob).to_string_lossy())? { let license_path = license_path?; if !license_path.is_file() { continue; } let license_path = license_path .strip_prefix(pyproject_dir) .expect("matched path starts with glob root") .to_path_buf(); if seen.insert(license_path.clone()) { debug!("Including license file `{}`", license_path.display()); writer.add_file( root_dir.join(&license_path), pyproject_dir.join(&license_path), false, )?; } } } } if let Some(glob_patterns) = pyproject.include() { for pattern in glob_patterns .iter() .filter_map(|glob_pattern| glob_pattern.targets(Format::Sdist)) { eprintln!("📦 Including files matching \"{pattern}\""); let matches = crate::module_writer::glob::resolve_include_matches( pattern, Format::Sdist, pyproject_dir, python_dir, )?; for m in matches { writer.add_file(root_dir.join(&m.target), m.source, false)?; } } } Ok(()) } /// Rewrite `pyproject.toml` paths for the sdist layout. /// /// When `pyproject.toml` lives inside the Cargo workspace root (not at the /// sdist root), we update `tool.maturin.manifest-path` and optionally /// `tool.maturin.python-source` so they resolve correctly from the new /// relative position inside the archive. /// /// `metadata` provides additional rewrites for `[project.readme]` and /// `[project.license]` `file` paths that were elevated to the sdist root. fn rewrite_pyproject_toml( pyproject_toml_path: &Path, relative_manifest_path: &Path, relative_python_source: Option<&Path>, metadata_rewrites: &[PyprojectPathRewrite], ) -> Result { let mut data = parse_toml_file(pyproject_toml_path, "pyproject.toml")?; let tool = data .entry("tool") .or_insert_with(|| toml_edit::Item::Table(toml_edit::Table::new())) .as_table_like_mut() .with_context(|| { format!( "`[tool]` must be a table in {}", pyproject_toml_path.display() ) })?; let maturin = tool .entry("maturin") .or_insert_with(|| toml_edit::Item::Table(toml_edit::Table::new())) .as_table_like_mut() .with_context(|| { format!( "`[tool.maturin]` must be a table in {}", pyproject_toml_path.display() ) })?; maturin.remove("manifest-path"); let manifest_path_str = relative_manifest_path.to_slash().with_context(|| { format!( "manifest-path `{}` is not valid UTF-8", relative_manifest_path.display() ) })?; maturin.insert( "manifest-path", toml_edit::value(manifest_path_str.as_ref()), ); if let Some(python_source) = relative_python_source { maturin.remove("python-source"); let python_source_str = python_source.to_slash().with_context(|| { format!( "python-source path `{}` is not valid UTF-8", python_source.display() ) })?; maturin.insert( "python-source", toml_edit::value(python_source_str.as_ref()), ); } if !metadata_rewrites.is_empty() { let project = data .entry("project") .or_insert_with(|| toml_edit::Item::Table(toml_edit::Table::new())) .as_table_like_mut() .with_context(|| { format!( "`[project]` must be a table in {}", pyproject_toml_path.display() ) })?; for rewrite in metadata_rewrites { rewrite_pyproject_field_path(project, rewrite.0, "file", &rewrite.1)?; } } Ok(data.to_string()) } /// Update a path field in `pyproject.toml`. The string form is replaced /// wholesale; table or inline-table forms have only their `inner_field` /// (e.g. `file`) updated so other keys like `content-type` are preserved. fn rewrite_pyproject_field_path( project: &mut dyn toml_edit::TableLike, field: &str, inner_field: &str, new_path: &str, ) -> Result<()> { let Some(item) = project.get_mut(field) else { return Ok(()); }; match item { toml_edit::Item::Value(toml_edit::Value::String(s)) => { *s = toml_edit::Formatted::new(new_path.to_string()); } toml_edit::Item::Value(toml_edit::Value::InlineTable(table)) => { table.insert( inner_field, toml_edit::Value::String(toml_edit::Formatted::new(new_path.to_string())), ); } toml_edit::Item::Table(table) => { table.insert(inner_field, toml_edit::value(new_path)); } _ => bail!("unexpected shape for `project.{field}` in pyproject.toml"), } Ok(()) } maturin-1.16.0/src/source_distribution/unpack.rs000066400000000000000000000062651527064705700220210ustar00rootroot00000000000000use crate::PyProjectToml; use anyhow::{Context, Result, bail}; use fs_err as fs; use std::path::{Path, PathBuf}; /// The result of unpacking an sdist tarball. #[derive(Debug)] pub struct UnpackedSdist { /// Must be kept alive for the duration of the build. pub tmpdir: tempfile::TempDir, /// Path to Cargo.toml inside the unpacked sdist. pub cargo_toml: PathBuf, /// Path to pyproject.toml inside the unpacked sdist. pub pyproject_toml: PathBuf, } /// Unpacks an sdist tarball into a temporary directory and returns the path /// to the Cargo.toml and pyproject.toml inside it, along with the tempdir /// handle (which must be kept alive for the duration of the build). /// /// The Cargo.toml path is resolved by checking `[tool.maturin.manifest-path]` /// in the sdist's `pyproject.toml`, falling back to `Cargo.toml` at the /// sdist root directory. pub fn unpack_sdist(sdist_path: &Path) -> Result { let tmp = tempfile::tempdir().context("Failed to create temporary directory")?; let gz = flate2::read::GzDecoder::new( fs::File::open(sdist_path) .with_context(|| format!("Failed to open sdist {}", sdist_path.display()))?, ); let mut archive = tar::Archive::new(gz); // `tar` already validates unpack destinations and rejects entries that // would escape `tmp.path()` (for example via `..` traversal or unsafe link // targets), so an additional path-safety layer is not required here. archive .unpack(tmp.path()) .context("Failed to unpack source distribution")?; // The sdist contains a single top-level directory named -. let entries: Vec<_> = fs::read_dir(tmp.path()) .context("Failed to read unpacked sdist directory")? .filter_map(|e| e.ok()) .filter(|e| e.file_type().map(|t| t.is_dir()).unwrap_or(false)) .collect(); let top_dir = match entries.len() { // Canonicalize to resolve symlinks (e.g. /var -> /private/var on macOS). // Without this, `project_root` and `python_dir` may disagree after // `normalize()` is applied to only some paths, causing python source // files to be silently excluded from wheels. 1 => dunce::canonicalize(entries[0].path()).unwrap_or_else(|_| entries[0].path()), n => bail!( "Expected exactly one top-level directory in sdist, found {}", n ), }; // Resolve the Cargo.toml path: check pyproject.toml for [tool.maturin.manifest-path], // otherwise default to Cargo.toml at the sdist root. let pyproject_file = top_dir.join("pyproject.toml"); let cargo_toml = if pyproject_file.is_file() { let pyproject = PyProjectToml::new(&pyproject_file)?; if let Some(manifest_path) = pyproject.manifest_path() { top_dir.join(manifest_path) } else { top_dir.join("Cargo.toml") } } else { top_dir.join("Cargo.toml") }; if !cargo_toml.exists() { bail!( "Cargo.toml not found in unpacked sdist at {}", cargo_toml.display() ); } Ok(UnpackedSdist { tmpdir: tmp, cargo_toml, pyproject_toml: pyproject_file, }) } maturin-1.16.0/src/source_distribution/utils.rs000066400000000000000000000117351527064705700216760ustar00rootroot00000000000000use std::path::{Component, Path, PathBuf}; /// Returns `true` if the file extension indicates a compiled artifact /// that should be excluded from the source distribution. pub(super) fn is_compiled_artifact(path: &Path) -> bool { matches!(path.extension(), Some(ext) if ext == "pyc" || ext == "pyd" || ext == "so") } /// Normalize a path by resolving `.` and `..` components without filesystem access. pub(super) fn normalize_path(path: &Path) -> PathBuf { let mut components = Vec::new(); for component in path.components() { match component { Component::CurDir => {} Component::ParentDir => { // Only pop if there's a normal component to cancel out match components.last() { Some(Component::Normal(_)) => { components.pop(); } _ => { // Keep the ParentDir if path is empty or last is also ParentDir components.push(component); } } } _ => components.push(component), } } components.iter().collect() } /// Find the common prefix, if any, between two paths. /// /// Taken from https://docs.rs/common-path/1.0.0/src/common_path/lib.rs.html#84-109 /// License: MIT/Apache 2.0 pub(super) fn common_path_prefix(one: P, two: Q) -> Option where P: AsRef, Q: AsRef, { let one = one.as_ref(); let two = two.as_ref(); let one = one.components(); let two = two.components(); let mut final_path = PathBuf::new(); let mut found = false; let paths = one.zip(two); for (l, r) in paths { if l == r { final_path.push(l.as_os_str()); found = true; } else { break; } } if found { Some(final_path) } else { None } } /// Compute a relative path from `from` directory to `to` path. /// /// Both absolute and relative inputs are supported. Returns a relative path /// that, when joined with `from`, resolves to `to`. If the paths share no /// common prefix (for example, different Windows drive letters or disjoint /// top-level components), the original `to` path is returned unchanged since /// no relative traversal is possible. pub(super) fn relative_path(from: &Path, to: &Path) -> PathBuf { let Some(common) = common_path_prefix(from, to) else { // No common prefix — fall back to the target path as-is. return to.to_path_buf(); }; let from_rest = from.strip_prefix(&common).unwrap_or(Path::new("")); let to_rest = to.strip_prefix(&common).unwrap_or(Path::new("")); let mut result = PathBuf::new(); for _ in from_rest.components() { result.push(".."); } result.push(to_rest); result } #[cfg(test)] mod tests { use super::*; #[test] fn test_normalize_path() { let test_cases = vec![ // Basic paths without normalization needed ("foo/bar", "foo/bar"), ("src/lib.rs", "src/lib.rs"), // Remove current directory components ("./foo/bar", "foo/bar"), ("foo/./bar", "foo/bar"), (".", ""), // Parent directory that cancels with a normal component ("foo/../bar", "bar"), ("foo/bar/..", "foo"), ("foo/bar/../baz", "foo/baz"), // Leading parent directories should be preserved ("../foo", "../foo"), ("../../foo", "../../foo"), ("../../../foo/bar", "../../../foo/bar"), // More parent dirs than normal components ("a/../../b", "../b"), ("a/b/../../../c", "../c"), ("foo/bar/baz/../../..", ""), // Mix of current and parent directory components ("./foo/../bar", "bar"), ("foo/./bar/../baz", "foo/baz"), ("./../foo/./bar", "../foo/bar"), // Edge cases ("", ""), ("foo", "foo"), ("..", ".."), ]; for (input, expected) in test_cases { assert_eq!( normalize_path(Path::new(input)), PathBuf::from(expected), "normalize_path({:?}) should equal {:?}", input, expected ); } } #[test] fn test_relative_path() { let test_cases = vec![ ("/a/b/c", "/a/b/d", "../d"), ("/a/b", "/a/b/c/d", "c/d"), ("/a/b/c", "/a/b", ".."), ("/a/b/c", "/a/x/y", "../../x/y"), ("/a/b", "/a/b", ""), // No common prefix — returns the absolute target as-is ("foo", "/x/y", "/x/y"), ]; for (from, to, expected) in test_cases { assert_eq!( relative_path(Path::new(from), Path::new(to)), PathBuf::from(expected), "relative_path({from:?}, {to:?}) should equal {expected:?}", ); } } } maturin-1.16.0/src/target/000077500000000000000000000000001527064705700153505ustar00rootroot00000000000000maturin-1.16.0/src/target/legacy_py.rs000066400000000000000000000046471527064705700177050ustar00rootroot00000000000000//! This module is taken mostly verbatim from PyPI's `legacy.py` validation logic. //! //! use once_cell::sync::Lazy; use regex::Regex; pub(super) static MACOS_PLATFORM_RE: Lazy = Lazy::new(|| Regex::new(r"^macosx_(?P\d+)_(?P\d+)_(?P.+)$").unwrap()); pub(super) static IOS_PLATFORM_RE: Lazy = Lazy::new(|| { Regex::new(r"^ios_(?:\d+)_(?:\d+)_(?P.+)_(?:iphoneos|iphonesimulator)$").unwrap() }); pub(super) static ANDROID_PLATFORM_RE: Lazy = Lazy::new(|| Regex::new(r"^android_(?:\d+)_(?P.+)$").unwrap()); pub(super) static LINUX_PLATFORM_RE: Lazy = Lazy::new(|| { Regex::new(r"^(?P(?:many|musl))linux_(?:\d+)_(?:\d+)_(?P.+)$").unwrap() }); pub(super) static PYEMSCRIPTEN_PLATFORM_RE: Lazy = Lazy::new(|| Regex::new(r"^pyemscripten_(?:\d+)_(?:\d+)_wasm32$").unwrap()); /// Contains also non-Rust platforms to match `legacy.py` verbatim. pub(super) static ALLOWED_PLATFORMS: &[&str] = &[ "any", "win32", "win_arm64", "win_amd64", "win_ia64", "manylinux1_x86_64", "manylinux1_i686", "manylinux2010_x86_64", "manylinux2010_i686", "manylinux2014_x86_64", "manylinux2014_i686", "manylinux2014_aarch64", "manylinux2014_armv7l", "manylinux2014_ppc64", "manylinux2014_ppc64le", "manylinux2014_s390x", "linux_armv6l", "linux_armv7l", ]; /// Windows platforms: win32 (i686), win_amd64 (x86_64), win_arm64 (aarch64). /// /// PyPI allows win_ia64 but Rust doesn't support IA64/Itanium. pub(super) static WINDOWS_ARCHES: &[&str] = &["x86_64", "i686", "aarch64"]; /// Reduced list only containing targets support by both Rust/maturin and PyPI. pub(super) static MACOS_ARCHES: &[&str] = &["x86_64", "arm64", "i686", "universal2"]; /// macOS 10 is handled separately because `macosx_10_{minor}` tags allow any minor version. pub(super) static MACOS_MAJOR_VERSIONS: &[&str] = &["11", "12", "13", "14", "15", "26"]; pub(super) static IOS_ARCHES: &[&str] = &["arm64", "x86_64"]; pub(super) static ANDROID_ARCHES: &[&str] = &["armeabi_v7a", "arm64_v8a", "x86", "x86_64"]; pub(super) static MANYLINUX_ARCHES: &[&str] = &[ "x86_64", "i686", "aarch64", "armv7l", "ppc64le", "s390x", "ppc64", "riscv64", ]; pub(super) static MUSLLINUX_ARCHES: &[&str] = &[ "x86_64", "i686", "aarch64", "armv7l", "ppc64le", "s390x", "riscv64", ]; maturin-1.16.0/src/target/mod.rs000066400000000000000000001031731527064705700165020ustar00rootroot00000000000000use crate::bridge::StableAbiKind; use crate::build_options::TargetTriple; use crate::cross_compile::is_cross_compiling; use crate::python_interpreter::InterpreterKind; use crate::python_interpreter::InterpreterKind::{CPython, GraalPy, PyPy}; use crate::python_interpreter::python_command; use crate::{PlatformTag, PythonInterpreter}; use anyhow::{Result, anyhow, bail, format_err}; use platform_info::*; use rustc_version::VersionMeta; use serde::Deserialize; use std::env; use std::fmt; use std::path::Path; use std::path::PathBuf; use std::str; use std::str::FromStr; use target_lexicon::{Architecture, Environment, Triple}; use tracing::error; mod legacy_py; mod platform_tag; mod pypi_tags; mod wheel_tag; pub use platform_tag::get_platform_tag; pub(crate) use platform_tag::rustc_macosx_target_version; pub use pypi_tags::{is_arch_supported_by_pypi, validate_wheel_filename_for_pypi}; pub use wheel_tag::WheelTag; pub(crate) const RUST_1_64_0: semver::Version = semver::Version::new(1, 64, 0); pub(crate) const RUST_1_93_0: semver::Version = semver::Version::new(1, 93, 0); /// All supported operating system #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Deserialize)] #[serde(rename_all = "lowercase")] pub enum Os { Linux, Windows, Macos, Ios, FreeBsd, NetBsd, OpenBsd, Dragonfly, Solaris, Illumos, Haiku, Emscripten, Wasi, Aix, Hurd, Cygwin, Android, } impl fmt::Display for Os { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { Os::Linux => write!(f, "Linux"), Os::Windows => write!(f, "Windows"), Os::Macos => write!(f, "macOS"), Os::Ios => write!(f, "iOS"), Os::FreeBsd => write!(f, "FreeBSD"), Os::NetBsd => write!(f, "NetBSD"), Os::OpenBsd => write!(f, "OpenBSD"), Os::Dragonfly => write!(f, "DragonFly"), Os::Solaris => write!(f, "Solaris"), Os::Illumos => write!(f, "Illumos"), Os::Haiku => write!(f, "Haiku"), Os::Emscripten => write!(f, "Emscripten"), Os::Wasi => write!(f, "Wasi"), Os::Aix => write!(f, "AIX"), Os::Hurd => write!(f, "Hurd"), Os::Cygwin => write!(f, "Cygwin"), Os::Android => write!(f, "Android"), } } } /// All supported CPU architectures #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Deserialize)] #[serde(rename_all = "lowercase")] pub enum Arch { Aarch64, Armv5teL, Armv6L, Armv7L, #[serde(alias = "ppc")] Powerpc, #[serde(alias = "ppc64le")] Powerpc64Le, #[serde(alias = "ppc64")] Powerpc64, #[serde(alias = "i686")] X86, X86_64, S390X, Wasm32, Riscv32, Riscv64, Mips64el, Mips64, Mipsel, Mips, Sparc64, Sparcv9, LoongArch64, } impl Arch { pub fn as_str(&self) -> &str { match *self { Arch::Aarch64 => "aarch64", Arch::Armv5teL => "armv5tel", Arch::Armv6L => "armv6l", Arch::Armv7L => "armv7l", Arch::Powerpc => "ppc", Arch::Powerpc64Le => "ppc64le", Arch::Powerpc64 => "ppc64", Arch::X86 => "i686", Arch::X86_64 => "x86_64", Arch::S390X => "s390x", Arch::Wasm32 => "wasm32", Arch::Riscv32 => "riscv32", Arch::Riscv64 => "riscv64", Arch::Mips64el => "mips64el", Arch::Mips64 => "mips64", Arch::Mipsel => "mipsel", Arch::Mips => "mips", Arch::Sparc64 => "sparc64", Arch::Sparcv9 => "sparcv9", Arch::LoongArch64 => "loongarch64", } } } impl fmt::Display for Arch { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.write_str(self.as_str()) } } impl Arch { /// Represents the hardware platform. /// /// This is the same as the native platform's `uname -m` output. pub fn machine(&self) -> &'static str { // See https://www.freebsd.org/cgi/man.cgi?query=arch&sektion=7&format=html // MACHINE_ARCH vs MACHINE_CPUARCH vs MACHINE section match self { Arch::Aarch64 => "arm64", Arch::Armv5teL | Arch::Armv6L | Arch::Armv7L => "arm", Arch::Powerpc | Arch::Powerpc64Le | Arch::Powerpc64 => "powerpc", Arch::X86 => "i386", Arch::X86_64 => "amd64", Arch::Riscv32 | Arch::Riscv64 => "riscv", Arch::Mips64el | Arch::Mips64 | Arch::Mipsel | Arch::Mips => "mips", // sparc64 is unsupported since FreeBSD 13.0 Arch::Sparc64 => "sparc64", Arch::Sparcv9 => "sparcv9", Arch::Wasm32 => "wasm32", Arch::S390X => "s390x", Arch::LoongArch64 => "loongarch64", } } } // Returns the set of supported architectures for each operating system fn get_supported_architectures(os: &Os) -> &'static [Arch] { match os { Os::Android => &[ Arch::Aarch64, Arch::Armv5teL, Arch::Armv6L, Arch::Armv7L, Arch::X86, Arch::X86_64, ], Os::Linux => &[ Arch::Aarch64, Arch::Armv5teL, Arch::Armv6L, Arch::Armv7L, Arch::Powerpc, Arch::Powerpc64, Arch::Powerpc64Le, Arch::S390X, Arch::X86, Arch::X86_64, Arch::Riscv32, Arch::Riscv64, Arch::Mips64el, Arch::Mips64, Arch::Mipsel, Arch::Mips, Arch::Sparc64, Arch::LoongArch64, ], Os::Windows => &[Arch::X86, Arch::X86_64, Arch::Aarch64], Os::Macos => &[Arch::Aarch64, Arch::X86_64], Os::Ios => &[Arch::Aarch64, Arch::X86_64], Os::FreeBsd | Os::NetBsd => &[ Arch::Aarch64, Arch::Armv6L, Arch::Armv7L, Arch::Powerpc, Arch::Powerpc64, Arch::Powerpc64Le, Arch::X86, Arch::X86_64, Arch::Riscv32, Arch::Riscv64, Arch::Mips64el, Arch::Mipsel, Arch::Sparc64, ], Os::OpenBsd => &[ Arch::X86, Arch::X86_64, Arch::Aarch64, Arch::Armv7L, Arch::Powerpc, Arch::Powerpc64, Arch::Powerpc64Le, Arch::Riscv32, Arch::Riscv64, Arch::Sparc64, ], Os::Dragonfly => &[Arch::X86_64], Os::Illumos => &[Arch::X86_64], Os::Haiku => &[Arch::X86_64], Os::Solaris => &[Arch::X86_64, Arch::Sparc64, Arch::Sparcv9], Os::Emscripten | Os::Wasi => &[Arch::Wasm32], Os::Aix => &[Arch::Powerpc64], Os::Hurd => &[Arch::X86, Arch::X86_64], Os::Cygwin => &[Arch::X86, Arch::X86_64], } } /// The part of the current platform that is relevant when building wheels and is supported #[derive(Debug, Clone, Eq, PartialEq)] pub struct Target { os: Os, arch: Arch, env: Environment, triple: String, cross_compiling: bool, /// rustc version information pub(crate) rustc_version: VersionMeta, /// Is user specified `--target` pub(crate) user_specified: bool, } impl fmt::Display for Target { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", self.triple) } } impl Target { /// Uses the given target triple or tries the guess the current target by using the one used /// for compilation /// /// Fails if the target triple isn't supported pub fn from_target_triple(target_triple: Option<&TargetTriple>) -> Result { let rustc_version = rustc_version_meta()?; let triple = match &target_triple { None => rustc_version.host.to_string(), Some(TargetTriple::Universal2) => "aarch64-apple-darwin".to_string(), Some(TargetTriple::Regular(target_triple)) => target_triple.clone(), }; Self::from_triple(rustc_version, &triple, target_triple.is_some()) } /// Convert a Rust target triple to a [`Target`]. pub fn from_resolved_target_triple(target_triple: &str) -> Result { let rustc_version = rustc_version_meta()?; Self::from_triple(rustc_version, target_triple, true) } fn from_triple( rustc_version: VersionMeta, target_triple: &str, user_specified: bool, ) -> Result { use target_lexicon::{ ArmArchitecture, Mips32Architecture, Mips64Architecture, OperatingSystem, }; let platform = Triple::from_str(target_triple) .map_err(|_| format_err!("Unknown target triple {}", target_triple))?; let os = match platform.operating_system { OperatingSystem::Linux => match platform.environment { Environment::Android | Environment::Androideabi => Os::Android, _ => Os::Linux, }, OperatingSystem::Windows => Os::Windows, OperatingSystem::MacOSX(_) | OperatingSystem::Darwin(_) => Os::Macos, OperatingSystem::IOS(_) => Os::Ios, OperatingSystem::Netbsd => Os::NetBsd, OperatingSystem::Freebsd => Os::FreeBsd, OperatingSystem::Openbsd => Os::OpenBsd, OperatingSystem::Dragonfly => Os::Dragonfly, OperatingSystem::Solaris => Os::Solaris, OperatingSystem::Illumos => Os::Illumos, OperatingSystem::Haiku => Os::Haiku, OperatingSystem::Emscripten => Os::Emscripten, OperatingSystem::Wasi | OperatingSystem::WasiP1 | OperatingSystem::WasiP2 => Os::Wasi, OperatingSystem::Aix => Os::Aix, OperatingSystem::Hurd => Os::Hurd, OperatingSystem::Cygwin => Os::Cygwin, unsupported => bail!("The operating system {:?} is not supported", unsupported), }; let arch = match platform.architecture { Architecture::X86_64 | Architecture::X86_64h => Arch::X86_64, Architecture::X86_32(_) => Arch::X86, Architecture::Arm(arm_arch) => match arm_arch { ArmArchitecture::Armv5te => Arch::Armv5teL, ArmArchitecture::Arm | ArmArchitecture::Armv6 => Arch::Armv6L, ArmArchitecture::Armv7 => Arch::Armv7L, _ => bail!("The architecture {} is not supported", arm_arch), }, Architecture::Aarch64(_) => Arch::Aarch64, Architecture::Powerpc => Arch::Powerpc, Architecture::Powerpc64 => Arch::Powerpc64, Architecture::Powerpc64le => Arch::Powerpc64Le, Architecture::S390x => Arch::S390X, Architecture::Wasm32 => Arch::Wasm32, Architecture::Riscv32(_) => Arch::Riscv32, Architecture::Riscv64(_) => Arch::Riscv64, Architecture::Mips64(mips64_arch) => match mips64_arch { Mips64Architecture::Mips64el => Arch::Mips64el, Mips64Architecture::Mips64 => Arch::Mips64, _ => bail!("The architecture {} is not supported", mips64_arch), }, Architecture::Mips32(mips32_arch) => match mips32_arch { Mips32Architecture::Mipsel => Arch::Mipsel, Mips32Architecture::Mips => Arch::Mips, _ => bail!("The architecture {} is not supported", mips32_arch), }, Architecture::Sparc64 => Arch::Sparc64, Architecture::Sparcv9 => Arch::Sparcv9, Architecture::LoongArch64 => Arch::LoongArch64, unsupported => bail!("The architecture {} is not supported", unsupported), }; if !get_supported_architectures(&os).contains(&arch) { bail!("{} is not supported on {}", arch, os); } let mut target = Target { os, arch, env: platform.environment, triple: target_triple.to_string(), rustc_version, user_specified, cross_compiling: false, }; target.cross_compiling = is_cross_compiling(&target)?; Ok(target) } /// Returns the platform architecture pub fn get_platform_arch(&self) -> Result { if self.cross_compiling { return Ok(self.arch.to_string()); } let machine = PlatformInfo::new().map(|info| info.machine().to_string_lossy().into_owned()); let arch = match machine { Ok(machine) => { let linux32 = (machine == "x86_64" && self.arch != Arch::X86_64) || (machine == "aarch64" && self.arch != Arch::Aarch64); if linux32 { // When running in Docker sometimes uname returns 64-bit architecture while the container is actually 32-bit, // In this case we trust the architecture of rustc target self.arch.to_string() } else { machine } } Err(err) => { error!("Failed to get machine architecture: {}", err); self.arch.to_string() } }; Ok(arch) } /// Returns the platform release pub fn get_platform_release(&self) -> Result { let os = self.os.to_string(); let os_version = env::var(format!("MATURIN_{}_VERSION", os.to_ascii_uppercase())); let release = match os_version { Ok(os_ver) => os_ver, Err(_) => { let info = PlatformInfo::new() .map_err(|e| anyhow!("Failed to fetch platform information: {e}"))?; info.release().to_string_lossy().into_owned() } }; let release = release.replace(['.', '-'], "_"); Ok(release) } /// Returns the name python uses in `platform.machine()` for this architecture. pub fn get_python_arch(&self) -> &str { match self.arch { Arch::Aarch64 => "aarch64", Arch::Armv5teL => "armv5tel", Arch::Armv6L => "armv6l", Arch::Armv7L => "armv7l", Arch::Powerpc => "ppc", Arch::Powerpc64Le => "powerpc64le", Arch::Powerpc64 => "powerpc64", Arch::X86 => "i386", Arch::X86_64 => "x86_64", Arch::S390X => "s390x", Arch::Wasm32 => "wasm32", Arch::Riscv32 => "riscv32", Arch::Riscv64 => "riscv64", // It's kinda surprising that Python doesn't include the `el` suffix Arch::Mips64el | Arch::Mips64 => "mips64", Arch::Mipsel | Arch::Mips => "mips", Arch::Sparc64 => "sparc64", Arch::Sparcv9 => "sparcv9", Arch::LoongArch64 => "loongarch64", } } /// Returns the extension architecture name python uses in `ext_suffix` for this architecture. pub fn get_python_ext_arch(&self, python_impl: InterpreterKind) -> &str { if matches!( self.target_arch(), Arch::Armv5teL | Arch::Armv6L | Arch::Armv7L ) { "arm" } else if matches!(self.target_arch(), Arch::Powerpc64Le) && python_impl == InterpreterKind::PyPy { "ppc_64" } else if matches!(self.target_arch(), Arch::X86) && python_impl == InterpreterKind::PyPy { "x86" } else if matches!(self.target_arch(), Arch::Powerpc) { "powerpc" } else { self.get_python_arch() } } /// Returns the environment python uses in `ext_suffix` for this architecture. pub fn get_python_target_env( &self, python_impl: InterpreterKind, python_version: (usize, usize), ) -> String { match python_impl { CPython => { // For musl handling see https://github.com/pypa/auditwheel/issues/349 if matches!(self.target_arch(), Arch::Mips64 | Arch::Mips64el) && self.is_linux() { "gnuabi64".to_string() } else if python_version >= (3, 11) { self.target_env().to_string() } else { self.target_env().to_string().replace("musl", "gnu") } } PyPy | GraalPy => "gnu".to_string(), } } /// Returns CPython's `SOABI_PLATFORM` for this target, if it can be derived from the /// target alone. /// /// On Linux and Android this is the multiarch triplet (e.g. `x86_64-linux-gnu`), /// on macOS it is `darwin`. pub(crate) fn get_soabi_platform(&self) -> Option { if self.is_linux() || self.is_android() { let python_ext_arch = self.get_python_ext_arch(CPython); let target_env = self.get_python_target_env(CPython, (3, 15)); Some(format!("{python_ext_arch}-linux-{target_env}")) } else if self.is_macos() { Some("darwin".to_string()) } else { None } } /// Returns the stable ABI extension suffix for unix targets, e.g. `.abi3.so`. /// /// Python 3.15+ also accepts suffixes that include `SOABI_PLATFORM`, e.g. /// `.abi3-x86_64-linux-gnu.so` (gh-122931), so the platform is only added when the /// stable ABI minimum version is 3.15 or newer; older Pythons reject such filenames. /// /// The interpreter's `SOABI_PLATFORM` is only used when it describes the target, /// i.e. when not cross compiling or when it was read from the target's sysconfig. pub(crate) fn stable_abi_extension_suffix( &self, kind: StableAbiKind, min_version: (u8, u8), interpreter: Option<&PythonInterpreter>, ) -> String { if self.is_cygwin() { return format!(".{kind}.dll"); } if min_version < (3, 15) { return format!(".{kind}.so"); } let soabi_platform = interpreter .filter(|interp| !self.cross_compiling || !interp.runnable) .and_then(|interp| interp.soabi_platform.clone()) .or_else(|| self.get_soabi_platform()); match soabi_platform { Some(platform) => format!(".{kind}-{platform}.so"), None => format!(".{kind}.so"), } } /// Returns the name python uses in `sys.platform` for this os pub fn get_python_os(&self) -> &str { match self.os { Os::Android => "android", Os::Windows => "windows", Os::Linux => "linux", Os::Macos => "darwin", Os::Ios => "ios", Os::FreeBsd => "freebsd", Os::NetBsd => "netbsd", Os::OpenBsd => "openbsd", Os::Dragonfly => "dragonfly", Os::Solaris => "sunos", Os::Illumos => "sunos", Os::Haiku => "haiku", Os::Emscripten => "emscripten", // This isn't real, there's no sys.platform here Os::Wasi => "wasi", Os::Aix => "aix", Os::Hurd => "gnu", Os::Cygwin => "cygwin", } } /// Returns the oldest possible Manylinux tag for this architecture pub fn get_minimum_manylinux_tag(&self) -> PlatformTag { match self.arch { Arch::Aarch64 | Arch::Armv7L | Arch::Powerpc64 | Arch::Powerpc64Le | Arch::S390X => { PlatformTag::manylinux2014() } Arch::X86 | Arch::X86_64 => { // rustc 1.64.0 bumps glibc requirement to 2.17 // see https://blog.rust-lang.org/2022/08/01/Increasing-glibc-kernel-requirements.html if self.rustc_version.semver >= RUST_1_64_0 { PlatformTag::manylinux2014() } else { PlatformTag::manylinux2010() } } Arch::Riscv64 => PlatformTag::Manylinux { major: 2, minor: 31, }, Arch::LoongArch64 => PlatformTag::Manylinux { major: 2, minor: 36, }, Arch::Armv5teL | Arch::Armv6L | Arch::Wasm32 | Arch::Riscv32 | Arch::Mips64el | Arch::Mips64 | Arch::Mipsel | Arch::Mips | Arch::Powerpc | Arch::Sparc64 | Arch::Sparcv9 => PlatformTag::Linux, } } /// Returns whether the platform is 64 bit or 32 bit pub fn pointer_width(&self) -> usize { match self.arch { Arch::Aarch64 | Arch::Powerpc64 | Arch::Powerpc64Le | Arch::X86_64 | Arch::S390X | Arch::Riscv64 | Arch::Mips64el | Arch::Mips64 | Arch::Sparc64 | Arch::Sparcv9 | Arch::LoongArch64 => 64, Arch::Armv5teL | Arch::Armv6L | Arch::Armv7L | Arch::X86 | Arch::Wasm32 | Arch::Mipsel | Arch::Mips | Arch::Riscv32 | Arch::Powerpc => 32, } } /// Returns target triple as string #[inline] pub fn target_triple(&self) -> &str { &self.triple } /// Returns host triple as string #[inline] pub fn host_triple(&self) -> &str { &self.rustc_version.host } /// Returns true if the current platform is not windows pub fn is_unix(&self) -> bool { match self.os { Os::Windows => false, Os::Linux | Os::Macos | Os::Ios | Os::FreeBsd | Os::NetBsd | Os::OpenBsd | Os::Dragonfly | Os::Solaris | Os::Illumos | Os::Haiku | Os::Emscripten | Os::Wasi | Os::Aix | Os::Hurd | Os::Cygwin | Os::Android => true, } } /// Returns target operating system #[inline] pub fn target_os(&self) -> Os { self.os } /// Returns target architecture #[inline] pub fn target_arch(&self) -> Arch { self.arch } /// Returns target environment #[inline] pub fn target_env(&self) -> Environment { self.env } /// Returns true if the current platform is linux #[inline] pub fn is_linux(&self) -> bool { self.os == Os::Linux } /// Returns true if the current platform is freebsd #[inline] pub fn is_freebsd(&self) -> bool { self.os == Os::FreeBsd } /// Returns true if the current platform is mac os #[inline] pub fn is_macos(&self) -> bool { self.os == Os::Macos } /// Returns true if the current platform is iOS #[inline] pub fn is_ios(&self) -> bool { self.os == Os::Ios } /// Returns true if the current platform is windows #[inline] pub fn is_windows(&self) -> bool { self.os == Os::Windows } /// Returns true if the current environment is msvc #[inline] pub fn is_msvc(&self) -> bool { self.env == Environment::Msvc } /// Returns true if the current platform is cygwin #[inline] pub fn is_cygwin(&self) -> bool { self.os == Os::Cygwin } /// Returns true if the current platform is illumos #[inline] pub fn is_illumos(&self) -> bool { self.os == Os::Illumos } /// Returns true if the current platform is haiku #[inline] pub fn is_haiku(&self) -> bool { self.os == Os::Haiku } /// Returns true if the current platform is Emscripten #[inline] pub fn is_emscripten(&self) -> bool { self.os == Os::Emscripten } /// Returns true if we're building a binary for wasm32-wasi #[inline] pub fn is_wasi(&self) -> bool { self.os == Os::Wasi } /// Returns true if we're building a binary for GNU/Hurd #[inline] pub fn is_hurd(&self) -> bool { self.os == Os::Hurd } /// Returns true if we're building a binary for AIX #[inline] pub fn is_aix(&self) -> bool { self.os == Os::Aix } /// Returns true if we're building a binary for Android pub fn is_android(&self) -> bool { self.os == Os::Android } /// Returns true if the current platform's target env is Musl #[inline] pub fn is_musl_libc(&self) -> bool { matches!( self.env, Environment::Musl | Environment::Musleabi | Environment::Musleabihf | Environment::Muslabi64 ) } /// Is cross compiling for this target #[inline] pub fn cross_compiling(&self) -> bool { self.cross_compiling } /// Returns the path to the python executable inside a venv pub fn get_venv_python(&self, venv_base: impl AsRef) -> PathBuf { let python = if self.is_windows() { "python.exe" } else { "python" }; self.get_venv_bin_dir(venv_base).join(python) } /// Returns the directory where the binaries are stored inside a venv pub fn get_venv_bin_dir(&self, venv_base: impl AsRef) -> PathBuf { let venv = venv_base.as_ref(); if self.is_windows() { let bin_dir = venv.join("Scripts"); if bin_dir.join("python.exe").exists() { return bin_dir; } // Python installed via msys2 on Windows might produce a POSIX-like venv // See https://github.com/PyO3/maturin/issues/1108 let bin_dir = venv.join("bin"); if bin_dir.join("python.exe").exists() { return bin_dir; } // for conda environment venv.to_path_buf() } else { venv.join("bin") } } /// Returns the path to the python executable /// /// Checks in order: `VIRTUAL_ENV`'s python, `pythonLocation` (GitHub Actions), /// and finally falls back to `python.exe` (Windows) or `python3` (Unix). pub fn get_python(&self) -> PathBuf { if let Some(venv) = env::var_os("VIRTUAL_ENV") { // Use the full path to the venv's python to ensure we get the // correct version, rather than relying on PATH resolution (#2198) let venv_python = self.get_venv_python(&venv); if venv_python.exists() { return venv_python; } } // GitHub Actions setup-python sets pythonLocation to the install dir if let Some(python_location) = env::var_os("pythonLocation") { let python_location = Path::new(&python_location); let python = if self.is_windows() { python_location.join("python.exe") } else { python_location.join("bin").join("python3") }; if python.exists() { return python; } } if self.is_windows() { PathBuf::from("python.exe") } else { PathBuf::from("python3") } } } fn rustc_version_meta() -> Result { let meta = rustc_version::version_meta().map_err(|err| match err { rustc_version::Error::CouldNotExecuteCommand(e) if e.kind() == std::io::ErrorKind::NotFound => { anyhow!( "rustc, the rust compiler, is not installed or not in PATH. \ This package requires Rust and Cargo to compile extensions. \ Install it through the system's package manager or via https://rustup.rs/.", ) } err => anyhow!(err).context("Failed to run rustc to get the host target"), })?; Ok(meta) } pub(crate) fn detect_arch_from_python(python: &PathBuf, target: &Target) -> Option { match python_command(python) .arg("-c") .arg("import sysconfig; print(sysconfig.get_platform(), end='')") .output() { Ok(output) if output.status.success() => { let platform = String::from_utf8_lossy(&output.stdout); if platform.contains("macos") { if platform.contains("x86_64") && target.target_arch() != Arch::X86_64 { return Some(TargetTriple::Regular("x86_64-apple-darwin".to_string())); } else if platform.contains("arm64") && target.target_arch() != Arch::Aarch64 { return Some(TargetTriple::Regular("aarch64-apple-darwin".to_string())); } } else if platform.contains("win") { // On Windows ARM with x86_64 Python (win-amd64), detect the arch mismatch if platform.contains("amd64") && target.target_arch() != Arch::X86_64 { return Some(TargetTriple::Regular("x86_64-pc-windows-msvc".to_string())); } else if platform.contains("arm64") && target.target_arch() != Arch::Aarch64 { return Some(TargetTriple::Regular("aarch64-pc-windows-msvc".to_string())); } } } _ => eprintln!("âš ï¸� Warning: Failed to determine python platform"), } None } pub(crate) fn detect_target_from_cross_python(python: &PathBuf) -> Option { match python_command(python) .arg("-c") .arg("import sys, sysconfig; print(sysconfig.get_platform(), end='') if getattr(sys, 'cross_compiling', False) else ''") .output() { Ok(output) if output.status.success() => { let platform = String::from_utf8_lossy(&output.stdout); if platform.ends_with("-arm64-iphoneos") { return Some(TargetTriple::Regular("aarch64-apple-ios".to_string())); } else if platform.ends_with("-arm64-iphonesimulator") { return Some(TargetTriple::Regular("aarch64-apple-ios-sim".to_string())); } else if platform.ends_with("-x86_64-iphonesimulator") { return Some(TargetTriple::Regular("x86_64-apple-ios".to_string())); } } _ => eprintln!("âš ï¸� Warning: Failed to determine python platform"), } None } #[cfg(test)] mod tests { use super::*; use pretty_assertions::assert_eq; fn target(triple: &str, cross_compiling: bool) -> Target { let mut target = Target::from_resolved_target_triple(triple).unwrap(); target.cross_compiling = cross_compiling; target } fn interpreter(target: &Target, soabi_platform: &str, runnable: bool) -> PythonInterpreter { let mut interpreter = PythonInterpreter::placeholder(3, 15, target); interpreter.soabi_platform = Some(soabi_platform.to_string()); interpreter.runnable = runnable; interpreter } #[test] fn test_stable_abi_extension_suffix_before_315() { let linux = target("x86_64-unknown-linux-gnu", false); let python = interpreter(&linux, "x86_64-linux-gnu", true); for kind in [StableAbiKind::Abi3, StableAbiKind::Abi3t] { for min_version in [(3, 8), (3, 14)] { assert_eq!( linux.stable_abi_extension_suffix(kind, min_version, Some(&python)), format!(".{kind}.so") ); } } let cygwin = target("x86_64-pc-cygwin", true); assert_eq!( cygwin.stable_abi_extension_suffix(StableAbiKind::Abi3, (3, 15), None), ".abi3.dll" ); } #[test] fn test_stable_abi_extension_suffix_inferred() { let cases = [ ("x86_64-unknown-linux-gnu", ".abi3-x86_64-linux-gnu.so"), ("aarch64-unknown-linux-gnu", ".abi3-aarch64-linux-gnu.so"), ("i686-unknown-linux-gnu", ".abi3-i386-linux-gnu.so"), ("x86_64-unknown-linux-musl", ".abi3-x86_64-linux-musl.so"), ( "armv7-unknown-linux-gnueabihf", ".abi3-arm-linux-gnueabihf.so", ), ("aarch64-linux-android", ".abi3-aarch64-linux-android.so"), ("x86_64-apple-darwin", ".abi3-darwin.so"), ("aarch64-apple-ios", ".abi3.so"), ]; for (triple, expected) in cases { let target = target(triple, true); assert_eq!( target.stable_abi_extension_suffix(StableAbiKind::Abi3, (3, 15), None), expected, "{triple}" ); } let linux = target("x86_64-unknown-linux-gnu", true); assert_eq!( linux.stable_abi_extension_suffix(StableAbiKind::Abi3t, (3, 15), None), ".abi3t-x86_64-linux-gnu.so" ); } #[test] fn test_stable_abi_extension_suffix_from_interpreter() { // Native build: trust the interpreter's SOABI_PLATFORM let native = target("x86_64-unknown-linux-gnu", false); let python = interpreter(&native, "x86_64-custom-linux-gnu", true); assert_eq!( native.stable_abi_extension_suffix(StableAbiKind::Abi3, (3, 15), Some(&python)), ".abi3-x86_64-custom-linux-gnu.so" ); // Cross compiling with a target sysconfig (non-runnable): trust it too let cross = target("aarch64-unknown-linux-gnu", true); let sysconfig = interpreter(&cross, "aarch64-custom-linux-gnu", false); assert_eq!( cross.stable_abi_extension_suffix(StableAbiKind::Abi3, (3, 15), Some(&sysconfig)), ".abi3-aarch64-custom-linux-gnu.so" ); // Cross compiling with a host interpreter: its platform describes the host, not the target let host = interpreter(&cross, "darwin", true); assert_eq!( cross.stable_abi_extension_suffix(StableAbiKind::Abi3, (3, 15), Some(&host)), ".abi3-aarch64-linux-gnu.so" ); assert_eq!( cross.stable_abi_extension_suffix(StableAbiKind::Abi3t, (3, 15), Some(&host)), ".abi3t-aarch64-linux-gnu.so" ); } } maturin-1.16.0/src/target/platform_tag.rs000066400000000000000000001000221527064705700203700ustar00rootroot00000000000000//! Platform tag generation for wheel filenames. //! //! This module resolves the platform portion of a Python wheel filename //! (e.g. `manylinux_2_17_x86_64`, `macosx_11_0_arm64`, `win_amd64`) from //! the build target, environment variables, and project configuration. //! //! It also contains the deployment-target / version helpers for macOS, iOS, //! Emscripten, and Android that feed into the tag generation. use crate::PyProjectToml; use crate::auditwheel::PlatformTag; use crate::target::legacy_py::ALLOWED_PLATFORMS; use crate::target::{Arch, Os, Target}; use anyhow::{Context, Result, anyhow, bail}; use once_cell::sync::Lazy; use platform_info::*; use regex::Regex; use std::collections::BTreeSet; use std::env; use std::path::Path; /// Returns the platform tags for the given target. /// /// This is a standalone function so that it can be called without a full /// `BuildContext`. The `BuildContext::get_platform_tag` method delegates /// here. pub fn get_platform_tag( target: &Target, platform_tags: &[PlatformTag], universal2: bool, pyproject_toml: Option<&PyProjectToml>, manifest_path: &Path, is_bin: bool, ) -> Result> { if let Ok(host_platform) = env::var("_PYTHON_HOST_PLATFORM") { let override_platform = host_platform.replace(['.', '-'], "_"); eprintln!( "🚉 Overriding platform tag from _PYTHON_HOST_PLATFORM environment variable as {override_platform}." ); return Ok(BTreeSet::from([override_platform])); } let tag = match (&target.target_os(), &target.target_arch()) { // Windows (Os::Windows, Arch::X86) => "win32".to_string(), (Os::Windows, Arch::X86_64) => "win_amd64".to_string(), (Os::Windows, Arch::Aarch64) => "win_arm64".to_string(), // Android (Os::Android, _) => { let arch = target.get_platform_arch()?; let android_arch = match arch.as_str() { "armv7l" => "armeabi_v7a", "aarch64" => "arm64_v8a", "i686" => "x86", "x86_64" => "x86_64", _ => bail!("Unsupported Android architecture: {}", arch), }; let api_level = find_android_api_level(target.target_triple(), manifest_path)?; format!("android_{}_{}", api_level, android_arch) } // Linux (Os::Linux, _) => { let arch = target.get_platform_arch()?; let mut tags = BTreeSet::new(); for platform_tag in platform_tags { tags.insert(format!("{platform_tag}_{arch}")); for alias in platform_tag.aliases() { let alias_tag = format!("{alias}_{arch}"); // Only add legacy aliases if they're in PyPI's static allow-list, // e.g. manylinux2014 was never defined for riscv64 if ALLOWED_PLATFORMS.contains(&alias_tag.as_str()) { tags.insert(alias_tag); } } } return Ok(tags); } // macOS (Os::Macos, Arch::X86_64) | (Os::Macos, Arch::Aarch64) => { let ((x86_64_major, x86_64_minor), (arm64_major, arm64_minor)) = macosx_deployment_target( env::var("MACOSX_DEPLOYMENT_TARGET").ok().as_deref(), universal2, )?; let x86_64_tag = if let Some(deployment_target) = pyproject_toml .and_then(|x| x.target_config("x86_64-apple-darwin")) .and_then(|config| config.macos_deployment_target.as_ref()) { deployment_target.replace('.', "_") } else { format!("{x86_64_major}_{x86_64_minor}") }; let arm64_tag = if let Some(deployment_target) = pyproject_toml .and_then(|x| x.target_config("aarch64-apple-darwin")) .and_then(|config| config.macos_deployment_target.as_ref()) { deployment_target.replace('.', "_") } else { format!("{arm64_major}_{arm64_minor}") }; if universal2 { return Ok(BTreeSet::from([ format!("macosx_{x86_64_tag}_x86_64"), format!("macosx_{arm64_tag}_arm64"), format!("macosx_{x86_64_tag}_universal2"), ])); } else if target.target_arch() == Arch::Aarch64 { format!("macosx_{arm64_tag}_arm64") } else { format!("macosx_{x86_64_tag}_x86_64") } } // iOS (simulator and device) (Os::Ios, Arch::X86_64) | (Os::Ios, Arch::Aarch64) => { let arch = if target.target_arch() == Arch::Aarch64 { "arm64" } else { "x86_64" }; let abi = if target.target_arch() == Arch::X86_64 || target.target_triple().ends_with("-sim") { "iphonesimulator" } else { "iphoneos" }; let (min_sdk_major, min_sdk_minor) = iphoneos_deployment_target( env::var("IPHONEOS_DEPLOYMENT_TARGET").ok().as_deref(), )?; format!("ios_{min_sdk_major}_{min_sdk_minor}_{arch}_{abi}") } // FreeBSD (Os::FreeBsd, _) => { format!( "{}_{}_{}", target.target_os().to_string().to_ascii_lowercase(), target.get_platform_release()?.to_ascii_lowercase(), target.target_arch().machine(), ) } // NetBSD (Os::NetBsd, _) // OpenBSD | (Os::OpenBsd, _) => { let release = target.get_platform_release()?; format!( "{}_{}_{}", target.target_os().to_string().to_ascii_lowercase(), release, target.target_arch().machine(), ) } // DragonFly (Os::Dragonfly, Arch::X86_64) // Haiku | (Os::Haiku, Arch::X86_64) => { let release = target.get_platform_release()?; format!( "{}_{}_{}", target.target_os().to_string().to_ascii_lowercase(), release.to_ascii_lowercase(), "x86_64" ) } // Emscripten (Os::Emscripten, Arch::Wasm32) => emscripten_platform_tag()?, (Os::Wasi, Arch::Wasm32) => wasi_platform_tag(is_bin), // Cygwin (Os::Cygwin, _) => { format!( "{}_{}", target.target_os().to_string().to_ascii_lowercase(), target.get_platform_arch()?, ) } // AIX (Os::Aix, _) => aix_platform_tag(target)?, // osname_release_machine fallback for any POSIX system (_, _) => { let info = PlatformInfo::new() .map_err(|e| anyhow!("Failed to fetch platform information: {e}"))?; let mut release = info.release().to_string_lossy().replace(['.', '-'], "_"); let mut machine = info.machine().to_string_lossy().replace([' ', '/'], "_"); let mut os = target.target_os().to_string().to_ascii_lowercase(); // See https://github.com/python/cpython/blob/46c8d915715aa2bd4d697482aa051fe974d440e1/Lib/sysconfig.py#L722-L730 if target.target_os() == Os::Solaris || target.target_os() == Os::Illumos { // Solaris / Illumos if let Some((major, other)) = release.split_once('_') { let major_ver: u64 = major.parse().context("illumos major version is not a number")?; if major_ver >= 5 { // SunOS 5 == Solaris 2 os = "solaris".to_string(); release = format!("{}_{}", major_ver - 3, other); machine = format!("{machine}_64bit"); } } } format!("{os}_{release}_{machine}") } }; Ok(BTreeSet::from([tag])) } /// Get the default macOS deployment target version fn macosx_deployment_target( deploy_target: Option<&str>, universal2: bool, ) -> Result<((u16, u16), (u16, u16))> { let x86_64_default_rustc = rustc_macosx_target_version("x86_64-apple-darwin"); let x86_64_default = if universal2 && x86_64_default_rustc.1 < 9 { (10, 9) } else { x86_64_default_rustc }; let arm64_default = rustc_macosx_target_version("aarch64-apple-darwin"); let mut x86_64_ver = x86_64_default; let mut arm64_ver = arm64_default; if let Some(deploy_target) = deploy_target { let err_ctx = "MACOSX_DEPLOYMENT_TARGET is invalid"; let mut parts = deploy_target.split('.'); let major = parts.next().context(err_ctx)?; let major: u16 = major.parse().context(err_ctx)?; let minor = parts.next().context(err_ctx)?; let minor: u16 = minor.parse().context(err_ctx)?; if (major, minor) > x86_64_default { x86_64_ver = (major, minor); } if (major, minor) > arm64_default { arm64_ver = (major, minor); } } Ok(( python_macosx_target_version(x86_64_ver), python_macosx_target_version(arm64_ver), )) } /// Get the iOS deployment target version fn iphoneos_deployment_target(deploy_target: Option<&str>) -> Result<(u16, u16)> { let (major, minor) = if let Some(deploy_target) = deploy_target { let err_ctx = "IPHONEOS_DEPLOYMENT_TARGET is invalid"; let mut parts = deploy_target.split('.'); let major = parts.next().context(err_ctx)?; let major: u16 = major.parse().context(err_ctx)?; let minor = parts.next().context(err_ctx)?; let minor: u16 = minor.parse().context(err_ctx)?; (major, minor) } else { (13, 0) }; Ok((major, minor)) } #[inline] fn python_macosx_target_version(version: (u16, u16)) -> (u16, u16) { let (major, minor) = version; if major >= 11 { // pip only supports (major, 0) for macOS 11+ (major, 0) } else { (major, minor) } } /// Query `rustc` for its default macOS deployment target for the given target triple. /// /// This is also used by `compile.rs` to set `MACOSX_DEPLOYMENT_TARGET` for /// the cargo build, so it has `pub(crate)` visibility. pub(crate) fn rustc_macosx_target_version(target: &str) -> (u16, u16) { use std::process::{Command, Stdio}; use target_lexicon::OperatingSystem; // On rustc 1.71.0+ we can use `rustc --print deployment-target` if let Ok(output) = Command::new("rustc") .stderr(Stdio::piped()) .stdout(Stdio::piped()) .env_remove("MACOSX_DEPLOYMENT_TARGET") .args(["--target", target]) .args(["--print", "deployment-target"]) .output() && output.status.success() { let target_version = std::str::from_utf8(&output.stdout) .unwrap() .split('=') .next_back() .and_then(|v| v.trim().split_once('.')); if let Some((major, minor)) = target_version { let major: u16 = major.parse().unwrap(); let minor: u16 = minor.parse().unwrap(); return (major, minor); } } let fallback_version = if target == "aarch64-apple-darwin" { (11, 0) } else { (10, 7) }; let rustc_target_version = || -> Result<(u16, u16)> { let cmd = Command::new("rustc") .arg("-Z") .arg("unstable-options") .arg("--print") .arg("target-spec-json") .arg("--target") .arg(target) .env("RUSTC_BOOTSTRAP", "1") .env_remove("MACOSX_DEPLOYMENT_TARGET") .output() .context("Failed to run rustc to get the target spec")?; let stdout = String::from_utf8(cmd.stdout).context("rustc output is not valid utf-8")?; let spec: serde_json::Value = serde_json::from_str(&stdout).context("rustc output is not valid json")?; let llvm_target = spec .as_object() .context("rustc output is not a json object")? .get("llvm-target") .context("rustc output does not contain llvm-target")? .as_str() .context("llvm-target is not a string")?; let triple = llvm_target.parse::(); let (major, minor) = match triple.map(|t| t.operating_system) { Ok( OperatingSystem::MacOSX(Some(deployment_target)) | OperatingSystem::Darwin(Some(deployment_target)), ) => (deployment_target.major, u16::from(deployment_target.minor)), _ => fallback_version, }; Ok((major, minor)) }; rustc_target_version().unwrap_or(fallback_version) } /// Resolve the platform tag for `wasm32-unknown-emscripten`. /// /// This implements the priority cascade required to support both /// [PEP 783](https://peps.python.org/pep-0783/) and older Pyodide config /// variable names: /// /// 1. **PEP 783 env override** — emit `pyemscripten_{YEAR}_{PATCH}_wasm32` /// from `MATURIN_PYEMSCRIPTEN_PLATFORM_VERSION` / /// `PYEMSCRIPTEN_PLATFORM_VERSION` (the sysconfig variable named by /// PEP 783). /// 2. **Historical Pyodide env override** — emit the same PEP 783 tag from /// `MATURIN_PYODIDE_ABI_VERSION` / `PYODIDE_ABI_VERSION`. Pyodide used to /// refer to the same platform version as `pyodide_{YEAR}_{PATCH}`, but PyPI /// only accepts the PEP 783 `pyemscripten_*` platform tag. /// 3. **Pyodide config auto-detection** — try `pyodide config get /// pyemscripten_platform_version`, then `pyodide config get /// pyodide_abi_version`. /// 4. **Legacy** (Pyodide <= 0.27) — emit /// `emscripten_{EMCC_VERSION}_wasm32`. Resolved from /// `MATURIN_EMSCRIPTEN_VERSION` or `emcc -dumpversion`. Emits a warning /// explaining that the tag is not PEP 783 compliant. fn emscripten_platform_tag() -> Result { if let Some(ver) = first_non_empty_env(&[ "MATURIN_PYEMSCRIPTEN_PLATFORM_VERSION", "PYEMSCRIPTEN_PLATFORM_VERSION", ]) { return Ok(pep783_emscripten_platform_tag(&ver)); } if let Some(ver) = first_non_empty_env(&["MATURIN_PYODIDE_ABI_VERSION", "PYODIDE_ABI_VERSION"]) { return Ok(pep783_emscripten_platform_tag(&ver)); } if let Some(ver) = pyodide_config_get("pyemscripten_platform_version") { return Ok(pep783_emscripten_platform_tag(&ver)); } if let Some(ver) = pyodide_config_get("pyodide_abi_version") { return Ok(pep783_emscripten_platform_tag(&ver)); } let release = emscripten_version()?.replace(['.', '-'], "_"); eprintln!( "âš ï¸� Falling back to legacy `emscripten_{release}_wasm32` platform tag. \ This wheel will not be installable on PEP 783-compliant Pyodide runtimes. \ Set `MATURIN_PYEMSCRIPTEN_PLATFORM_VERSION` (PEP 783) or \ `MATURIN_PYODIDE_ABI_VERSION` (historical Pyodide ABI version env var) \ to produce a portable tag." ); Ok(format!("emscripten_{release}_wasm32")) } fn pep783_emscripten_platform_tag(version: &str) -> String { format!("pyemscripten_{version}_wasm32") } /// Resolve the platform tag for `wasm32-wasip1` / `wasm32-wasip2`. /// /// Binary bridges (`bindings = "bin"`) package a `.wasm` binary behind a /// wasmtime launcher script, so the wheel runs on any host with wasmtime /// installed; it keeps the `any` tag it has used since WASI support was /// added in #1107. /// /// Native extension modules (PyO3/cffi/uniffi) are compiled directly to /// `.wasm` and are only loadable by a WASI-capable Python build, so `any` /// is wrong for them. There is no PEP defining a WASI wheel platform tag /// yet (unlike Emscripten's PEP 783), but CPython's `sysconfig.get_platform()` /// has no WASI special-case and falls back to `os.uname()`, which on WASI /// builds of CPython returns the fixed values `sysname=wasi`, /// `release=0.0.0`, `machine=wasm32`. That fallback is reproduced here /// directly, rather than queried from the host's `uname`, because /// cross-compiling to wasm32-wasip1/wasm32-wasip2 never runs on a WASI /// host. This matches the `wasi_0_0_0_wasm32` tag that the wasi-wheels /// project already retags built wheels to by hand. fn wasi_platform_tag(is_bin: bool) -> String { if is_bin { "any".to_string() } else { "wasi_0_0_0_wasm32".to_string() } } /// Return the first env var in `names` that is set to a non-empty (after /// trim) value. fn first_non_empty_env(names: &[&str]) -> Option { names.iter().find_map(|name| { env::var(name).ok().and_then(|v| { let t = v.trim(); (!t.is_empty()).then(|| t.to_string()) }) }) } /// Best-effort `pyodide config get ` invocation. /// /// Returns `None` if `pyodide` is not on `PATH`, the command fails, or the /// reported value is empty / `None`. fn pyodide_config_get(key: &str) -> Option { use std::process::Command; let output = Command::new(if cfg!(windows) { "pyodide.bat" } else { "pyodide" }) .arg("config") .arg("get") .arg(key) .output() .ok()?; if !output.status.success() { return None; } let value = String::from_utf8(output.stdout).ok()?; let trimmed = value.trim(); if trimmed.is_empty() || trimmed.eq_ignore_ascii_case("none") { return None; } Some(trimmed.to_string()) } /// Emscripten version fn emscripten_version() -> Result { let os_version = env::var("MATURIN_EMSCRIPTEN_VERSION"); let release = match os_version { Ok(os_ver) => os_ver, Err(_) => emcc_version()?, }; Ok(release) } fn emcc_version() -> Result { use std::process::Command; let emcc = Command::new(if cfg!(windows) { "emcc.bat" } else { "emcc" }) .arg("-dumpversion") .output() .context("Failed to run emcc to get the version")?; let ver = String::from_utf8(emcc.stdout)?; let mut trimmed = ver.trim(); trimmed = trimmed.strip_suffix("-git").unwrap_or(trimmed); Ok(trimmed.into()) } fn extract_android_api_level(value: &str) -> Option { static ANDROID_RE: Lazy = Lazy::new(|| Regex::new(r"android(\d+)").unwrap()); ANDROID_RE.captures(value).map(|caps| caps[1].to_string()) } fn clang_target_triple() -> Result { use std::process::Command; let output = Command::new(if cfg!(windows) { "clang.exe" } else { "clang" }) .arg("-dumpmachine") .output() .context("Failed to run clang to get the target triple")?; let target_triple = String::from_utf8(output.stdout)?; Ok(target_triple.trim().to_string()) } fn find_android_api_level(target_triple: &str, manifest_path: &Path) -> Result { if let Ok(val) = env::var("ANDROID_API_LEVEL") { return Ok(val); } let mut clues = Vec::new(); // 1. Linker from cargo-config2 if let Some(manifest_dir) = manifest_path.parent() && let Ok(config) = cargo_config2::Config::load_with_cwd(manifest_dir) && let Ok(Some(linker)) = config.linker(target_triple) { clues.push(linker.to_string_lossy().into_owned()); } // 2. CC env vars if let Ok(cc) = env::var(format!("CC_{}", target_triple.replace('-', "_"))) { clues.push(cc); } if let Ok(cc) = env::var("CC") { clues.push(cc); } for clue in clues { if let Some(api_level) = extract_android_api_level(&clue) { return Ok(api_level); } } // 3. Check if running on Android (e.g. Termux), then use clang's default target triple let is_android = PlatformInfo::new() .map(|info| info.release().to_string_lossy().contains("android")) .unwrap_or(false); if is_android && let Ok(target_triple) = clang_target_triple() && let Some(api_level) = extract_android_api_level(&target_triple) { return Ok(api_level); } bail!( "Failed to determine Android API level. Please set the ANDROID_API_LEVEL environment variable." ); } /// Returns the AIX platform tag, matching CPython's `_aix_support.aix_platform()`. /// /// The tag format is `aix_{ver:x}{rel}{tl:02}_{builddate:04}_{bitsize}`, e.g. /// `aix_7302_2419_64` for AIX 7.3 TL02 build-week 2419, 64-bit. /// /// The version, technology level, and build date are read from /// `/usr/bin/lslpp -Lqc bos.rte`, just like CPython does in /// [`_aix_support.py`](https://github.com/python/cpython/blob/main/Lib/_aix_support.py). /// /// The tag produced here matches what `sysconfig.get_platform()` returns on the /// same host, so wheels saved with this tag are accepted by pip. fn aix_platform_tag(target: &Target) -> Result { use std::process::Command; // When cross-compiling for AIX from another host, /usr/bin/lslpp is not // available. The caller must set _PYTHON_HOST_PLATFORM (checked before // this branch is reached) to supply the correct tag manually. if target.cross_compiling() { bail!( "Cannot determine the AIX platform tag when cross-compiling. \ Set the _PYTHON_HOST_PLATFORM environment variable to the target \ platform tag (e.g. `aix_7302_2419_64`)." ); } let output = Command::new("/usr/bin/lslpp") .args(["-Lqc", "bos.rte"]) .output() .context("Failed to run /usr/bin/lslpp")?; if !output.status.success() { bail!( "lslpp -Lqc bos.rte failed (exit {}): {}", output.status, String::from_utf8_lossy(&output.stderr).trim(), ); } let stdout = String::from_utf8(output.stdout).context("lslpp output is not valid UTF-8")?; aix_tag_from_lslpp_output(&stdout) } /// Parse `lslpp -Lqc bos.rte` output and return the AIX platform tag. /// /// Extracted from [`aix_platform_tag`] so it can be unit-tested without /// requiring a real AIX system. /// /// Output format: `filesystem:name:level:state:type:description:...:builddate` /// where `level` (field 2) is a VRMF string like `"7.3.2.0"` and `builddate` /// (last field) is a 4-digit build-week number like `"2419"`. fn aix_tag_from_lslpp_output(stdout: &str) -> Result { let line = stdout.lines().next().unwrap_or("").trim(); let fields: Vec<&str> = line.split(':').collect(); if fields.len() < 3 { bail!("Unexpected lslpp output: {line:?}"); } let vrmf = fields[2]; // e.g. "7.3.2.0" // builddate is the last colon-separated field, e.g. "2419". // Matches CPython's `int(out[-1]) if out[-1] != '' else 9988`. let builddate: u32 = fields .last() .and_then(|f| f.trim().parse().ok()) .unwrap_or(9988); // Parse V.R.M from VRMF (V=version, R=release, M=technology level) let parts: Vec<&str> = vrmf.splitn(4, '.').collect(); if parts.len() < 3 { bail!("Unexpected VRMF format from lslpp: {vrmf:?}"); } let ver: u32 = parts[0].parse().context("VRMF version is not a number")?; let rel: u32 = parts[1].parse().context("VRMF release is not a number")?; let tl: u32 = parts[2] .parse() .context("VRMF technology level is not a number")?; let bitsize = 64u32; // only 64-bit is supported // Format matching CPython's _aix_tag(): // "aix-{v:1x}{r:1d}{tl:02d}-{bd:04d}-{sz}" with '-' replaced by '_' Ok(format!("aix_{ver:x}{rel}{tl:02}_{builddate:04}_{bitsize}")) } #[cfg(test)] mod tests { use super::{ Target, aix_tag_from_lslpp_output, emscripten_platform_tag, extract_android_api_level, get_platform_tag, iphoneos_deployment_target, macosx_deployment_target, pep783_emscripten_platform_tag, wasi_platform_tag, }; use pretty_assertions::assert_eq; use std::collections::BTreeSet; use std::env; use std::ffi::OsString; use std::path::Path; struct EnvVarRestore { vars: Vec<(&'static str, Option)>, } impl EnvVarRestore { fn new(names: &[&'static str]) -> Self { let vars = names .iter() .map(|&name| (name, env::var_os(name))) .collect(); Self { vars } } } impl Drop for EnvVarRestore { fn drop(&mut self) { for (name, value) in &self.vars { unsafe { if let Some(value) = value { env::set_var(name, value); } else { env::remove_var(name); } } } } } #[test] fn test_wasi_platform_tag() { assert_eq!(wasi_platform_tag(true), "any"); assert_eq!(wasi_platform_tag(false), "wasi_0_0_0_wasm32"); } #[test] fn test_get_platform_tag_wasi() { for triple in ["wasm32-wasip1", "wasm32-wasip2"] { let target = Target::from_resolved_target_triple(triple).unwrap(); // `bindings = "bin"` ships a wasmtime launcher and stays host-portable. let bin_tag = get_platform_tag(&target, &[], false, None, Path::new("."), true) .unwrap_or_else(|e| panic!("{triple}: {e}")); assert_eq!(bin_tag, BTreeSet::from(["any".to_string()]), "{triple}"); // PyO3/cffi/uniffi extension modules need a real WASI tag. let ext_tag = get_platform_tag(&target, &[], false, None, Path::new("."), false) .unwrap_or_else(|e| panic!("{triple}: {e}")); assert_eq!( ext_tag, BTreeSet::from(["wasi_0_0_0_wasm32".to_string()]), "{triple}" ); } } #[test] fn test_pep783_emscripten_platform_tag() { assert_eq!( pep783_emscripten_platform_tag("2025_0"), "pyemscripten_2025_0_wasm32" ); } #[test] #[serial_test::serial] fn test_emscripten_platform_tag_uses_pyodide_abi_version_for_pep783() { let _guard = EnvVarRestore::new(&[ "MATURIN_PYEMSCRIPTEN_PLATFORM_VERSION", "PYEMSCRIPTEN_PLATFORM_VERSION", "MATURIN_PYODIDE_ABI_VERSION", "PYODIDE_ABI_VERSION", ]); unsafe { env::remove_var("MATURIN_PYEMSCRIPTEN_PLATFORM_VERSION"); env::remove_var("PYEMSCRIPTEN_PLATFORM_VERSION"); env::set_var("MATURIN_PYODIDE_ABI_VERSION", "2025_0"); env::remove_var("PYODIDE_ABI_VERSION"); } assert_eq!( emscripten_platform_tag().unwrap(), "pyemscripten_2025_0_wasm32" ); } #[test] fn test_macosx_deployment_target() { let rustc_ver = rustc_version::version().unwrap(); let rustc_ver = (rustc_ver.major, rustc_ver.minor); let x86_64_minor = if rustc_ver >= (1, 74) { 12 } else { 7 }; let universal2_minor = if rustc_ver >= (1, 74) { 12 } else { 9 }; assert_eq!( macosx_deployment_target(None, false).unwrap(), ((10, x86_64_minor), (11, 0)) ); assert_eq!( macosx_deployment_target(None, true).unwrap(), ((10, universal2_minor), (11, 0)) ); assert_eq!( macosx_deployment_target(Some("10.6"), false).unwrap(), ((10, x86_64_minor), (11, 0)) ); assert_eq!( macosx_deployment_target(Some("10.6"), true).unwrap(), ((10, universal2_minor), (11, 0)) ); assert_eq!( macosx_deployment_target(Some("10.9"), false).unwrap(), ((10, universal2_minor), (11, 0)) ); assert_eq!( macosx_deployment_target(Some("11.0.0"), false).unwrap(), ((11, 0), (11, 0)) ); assert_eq!( macosx_deployment_target(Some("11.1"), false).unwrap(), ((11, 0), (11, 0)) ); } #[test] fn test_iphoneos_deployment_target() { // Use default when no value is provided assert_eq!(iphoneos_deployment_target(None).unwrap(), (13, 0)); // Valid version strings assert_eq!(iphoneos_deployment_target(Some("13.0")).unwrap(), (13, 0)); assert_eq!(iphoneos_deployment_target(Some("14.5")).unwrap(), (14, 5)); assert_eq!(iphoneos_deployment_target(Some("15.0")).unwrap(), (15, 0)); // Extra parts are ignored assert_eq!(iphoneos_deployment_target(Some("14.5.1")).unwrap(), (14, 5)); // Invalid formats assert!(iphoneos_deployment_target(Some("invalid")).is_err()); assert!(iphoneos_deployment_target(Some("13")).is_err()); assert!(iphoneos_deployment_target(Some("13.")).is_err()); assert!(iphoneos_deployment_target(Some(".0")).is_err()); assert!(iphoneos_deployment_target(Some("abc.def")).is_err()); assert!(iphoneos_deployment_target(Some("13.abc")).is_err()); assert!(iphoneos_deployment_target(Some("")).is_err()); } #[test] fn test_extract_android_api_level() { assert_eq!( extract_android_api_level("aarch64-linux-android24-clang"), Some("24".to_string()) ); assert_eq!( extract_android_api_level("aarch64-unknown-linux-android30"), Some("30".to_string()) ); assert_eq!(extract_android_api_level("clang"), None); } #[test] fn test_aix_tag_from_lslpp_output_typical() { // Typical lslpp -Lqc bos.rte output on AIX 7.3 TL02 SP01, build-week 2419. // Format: filesystem:name:level:state:type:description:...:builddate let output = "/usr/lib/objrepos:bos.rte:7.3.2.1:COMMITTED:I:Base Operating System Runtime:2419\n"; assert_eq!( aix_tag_from_lslpp_output(output).unwrap(), "aix_7302_2419_64" ); } #[test] fn test_aix_tag_from_lslpp_output_aix61() { // AIX 6.1 TL07, build-week 1415, 64-bit — matches CPython docs example. let output = "/usr/lib/objrepos:bos.rte:6.1.7.2:COMMITTED:I:Base Operating System Runtime:1415\n"; assert_eq!( aix_tag_from_lslpp_output(output).unwrap(), "aix_6107_1415_64" ); } #[test] fn test_aix_tag_from_lslpp_output_tl_zero_padded() { // TL single digit must be zero-padded to two digits in the tag. let output = "/usr/lib/objrepos:bos.rte:7.3.1.0:COMMITTED:I:Base Operating System Runtime:2312\n"; assert_eq!( aix_tag_from_lslpp_output(output).unwrap(), "aix_7301_2312_64" ); } #[test] fn test_aix_tag_from_lslpp_output_missing_builddate_falls_back() { // When the builddate field is absent or non-numeric, CPython falls back to 9988. let output = "/usr/lib/objrepos:bos.rte:7.3.2.0:COMMITTED:I:Base Operating System Runtime:\n"; assert_eq!( aix_tag_from_lslpp_output(output).unwrap(), "aix_7302_9988_64" ); } #[test] fn test_aix_tag_from_lslpp_output_extra_fields_before_builddate() { // Additional colon-separated fields between description and builddate // are fine; builddate is always the last field. let output = "/usr/lib/objrepos:bos.rte:7.3.2.0:COMMITTED:I:Base OS Runtime:extra:field:2419\n"; assert_eq!( aix_tag_from_lslpp_output(output).unwrap(), "aix_7302_2419_64" ); } #[test] fn test_aix_tag_from_lslpp_output_too_few_fields_is_error() { assert!(aix_tag_from_lslpp_output("bos.rte:7.3.2.0\n").is_err()); assert!(aix_tag_from_lslpp_output("").is_err()); } #[test] fn test_aix_tag_from_lslpp_output_bad_vrmf_is_error() { // VRMF with fewer than three components. let output = "/usr/lib/objrepos:bos.rte:7.3:COMMITTED:I:Base Operating System Runtime:2419\n"; assert!(aix_tag_from_lslpp_output(output).is_err()); } #[test] fn test_aix_tag_from_lslpp_output_non_numeric_vrmf_is_error() { let output = "/usr/lib/objrepos:bos.rte:x.y.z.0:COMMITTED:I:Base Operating System Runtime:2419\n"; assert!(aix_tag_from_lslpp_output(output).is_err()); } } maturin-1.16.0/src/target/pypi_tags.rs000066400000000000000000000253061527064705700177230ustar00rootroot00000000000000//! PyPI compatibility checking for platform tags. //! //! This module implements PyPI's platform tag validation rules to ensure wheels //! are compatible with PyPI's upload requirements. The validation logic is based on //! warehouse: //! //! Differences between PyPI's support and Rust: //! - Windows: PyPI allows ia64 (win_ia64) but Rust doesn't support IA64/Itanium //! - macOS: PyPI allows legacy PPC and fat binaries but these are either unsupported by Rust //! or created post-build with lipo rather than being direct Rust targets. This is supported by //! the virtual universal2-apple-darwin target instead. //! //! Supported architectures by platform (intersection of PyPI and Rust/maturin support): //! - Linux (manylinux): x86_64, i686, aarch64, armv7l, ppc64le, s390x, ppc64 //! - Linux (musllinux): x86_64, i686, aarch64, armv7l, ppc64le, s390x //! - Windows: x86_64, i686, aarch64 //! - macOS: x86_64, arm64, i686 (Tier 3), universal2 (maturin special target) //! - iOS: arm64, x86_64 (simulator) //! - Android: armeabi_v7a (armv7l), arm64_v8a (aarch64), x86 (i686), x86_64 //! - Emscripten: wasm32 use crate::target::legacy_py::{ ALLOWED_PLATFORMS, ANDROID_ARCHES, ANDROID_PLATFORM_RE, IOS_ARCHES, IOS_PLATFORM_RE, LINUX_PLATFORM_RE, MACOS_ARCHES, MACOS_MAJOR_VERSIONS, MACOS_PLATFORM_RE, MANYLINUX_ARCHES, MUSLLINUX_ARCHES, PYEMSCRIPTEN_PLATFORM_RE, WINDOWS_ARCHES, }; use crate::target::{Arch, Os, Target}; use anyhow::{Result, anyhow, bail}; use target_lexicon::Environment; /// Check for target architectures that we know aren't supported by PyPI to error early. pub fn is_arch_supported_by_pypi(target: &Target) -> bool { let arch = target.target_arch(); match target.target_os() { Os::Windows => WINDOWS_ARCHES.contains(&arch.as_str()), Os::Macos => { // macOS uses arm64 in platform tags, but target triple uses aarch64 let normalized_arch = if arch == Arch::Aarch64 { "arm64" } else { arch.as_str() }; MACOS_ARCHES.contains(&normalized_arch) } Os::Ios => { // iOS uses arm64 in platform tags, but target triple uses aarch64 let normalized_arch = if arch == Arch::Aarch64 { "arm64" } else { arch.as_str() }; // PyPI allows iOS with arm64 and x86_64 (simulator) matches!(normalized_arch, "arm64" | "x86_64") } Os::Android => { // Android target triples map to specific platform tag architectures let android_arch = match arch.as_str() { "armv7l" => "armeabi_v7a", // armv7 little-endian "aarch64" => "arm64_v8a", "i686" => "x86", "x86_64" => "x86_64", _ => return false, }; ANDROID_ARCHES.contains(&android_arch) } Os::Emscripten => arch == Arch::Wasm32, Os::Linux => { // Old arm versions // https://github.com/pypi/warehouse/blob/556e1e3390999381c382873b003a779a1363cb4d/warehouse/forklift/legacy.py#L122-L123 if arch == Arch::Armv6L || arch == Arch::Armv7L { return true; } match target.target_env() { Environment::Gnu | Environment::Gnuabi64 | Environment::Gnueabi | Environment::Gnueabihf => MANYLINUX_ARCHES.contains(&arch.as_str()), Environment::Musl | Environment::Musleabi | Environment::Musleabihf | Environment::Muslabi64 => MUSLLINUX_ARCHES.contains(&arch.as_str()), _ => false, } } _ => false, } } /// Validates that a wheel platform tag is allowed by PyPI. /// /// Based on PyPI warehouse platform tag validation logic. /// fn is_platform_tag_allowed_by_pypi(platform_tag: &str) -> bool { // Covers old Windows and old manylinux tags. if ALLOWED_PLATFORMS.contains(&platform_tag) { return true; } // macOS if let Some(captures) = MACOS_PLATFORM_RE.captures(platform_tag) { let major = captures.name("major").unwrap().as_str(); let minor = captures.name("minor").unwrap().as_str(); let arch = captures.name("arch").unwrap().as_str(); if major == "10" && MACOS_ARCHES.contains(&arch) { return true; } return MACOS_MAJOR_VERSIONS.contains(&major) && minor == "0" && MACOS_ARCHES.contains(&arch); } // manylinux/musllinux if let Some(captures) = LINUX_PLATFORM_RE.captures(platform_tag) { let libc = captures.name("libc").unwrap().as_str(); let arch = captures.name("arch").unwrap().as_str(); return match libc { "musl" => MUSLLINUX_ARCHES.contains(&arch), "many" => MANYLINUX_ARCHES.contains(&arch), _ => false, }; } // Old arm versions // https://github.com/pypi/warehouse/blob/556e1e3390999381c382873b003a779a1363cb4d/warehouse/forklift/legacy.py#L122-L123 if platform_tag == "linux_armv6l" || platform_tag == "linux_armv7l" { return true; } // iOS if let Some(captures) = IOS_PLATFORM_RE.captures(platform_tag) { let arch = captures.name("arch").unwrap().as_str(); return IOS_ARCHES.contains(&arch); } // Android if let Some(captures) = ANDROID_PLATFORM_RE.captures(platform_tag) { let arch = captures.name("arch").unwrap().as_str(); return ANDROID_ARCHES.contains(&arch); } // Emscripten / Pyodide, PEP 783 if PYEMSCRIPTEN_PLATFORM_RE.is_match(platform_tag) { return true; } false } /// Validates a wheel filename against PyPI platform tag rules. pub fn validate_wheel_filename_for_pypi(filename: &str) -> Result<()> { // Parse wheel filename to extract platform tags let platform_tags = extract_platform_tags_from_wheel_filename(filename)?; for platform_tag in platform_tags { if !is_platform_tag_allowed_by_pypi(&platform_tag) { bail!("Platform tag '{platform_tag}' in wheel '{filename}' is not allowed by PyPI"); } } Ok(()) } /// Extracts platform tags from a wheel filename. /// /// Wheel filename format: `{name}-{version}-{python_tag}-{abi_tag}-{platform_tag}.whl`. fn extract_platform_tags_from_wheel_filename(filename: &str) -> Result> { let name_without_ext = filename .strip_suffix(".whl") .ok_or_else(|| anyhow!("Not a wheel file: {filename}"))?; let parts: Vec<&str> = name_without_ext.split('-').collect(); if parts.len() < 5 { bail!("Invalid wheel filename format: {filename}"); } // Platform tag is the last part, and can contain multiple tags separated by '.' let platform_part = parts[parts.len() - 1]; let platform_tags: Vec = platform_part.split('.').map(|s| s.to_string()).collect(); Ok(platform_tags) } #[cfg(test)] mod tests { use super::*; use crate::build_options::TargetTriple; use crate::target::Target; #[test] fn test_platform_tag_validation() { let tags = [ // Simple platforms ("win32", true), ("win_amd64", true), ("any", true), // manylinux platforms ("manylinux2014_x86_64", true), ("manylinux_2_17_aarch64", true), ("manylinux_2_17_riscv64", true), ("manylinux_2_39_riscv64", true), // musllinux platforms ("musllinux_1_1_x86_64", true), ("musllinux_1_1_riscv64", true), // Old arm versions // https://github.com/pypi/warehouse/blob/556e1e3390999381c382873b003a779a1363cb4d/warehouse/forklift/legacy.py#L122-L123 ("linux_armv6l", true), ("linux_armv7l", true), // macOS platforms ("macosx_9_0_x86_64", false), // Invalid major version ("macosx_10_9_x86_64", true), ("macosx_11_0_arm64", true), ("macosx_11_1_arm64", false), // Only macOS 10 allows arbitrary minor versions ("macosx_26_0_arm64", true), // iOS platforms ("ios_14_0_arm64_iphoneos", true), ("ios_14_0_x86_64_iphonesimulator", true), ("ios_14_0_i686_iphoneos", false), // Unsupported architecture // Android platforms ("android_21_armeabi_v7a", true), ("android_21_arm64_v8a", true), ("android_21_x86", true), ("android_21_x86_64", true), ("android_21_mips", false), // Unsupported architecture // Emscripten / Pyodide, PEP 783 ("pyemscripten_2025_0_wasm32", true), ("pyodide_2025_0_wasm32", false), ]; for (platform_tag, expected) in tags { assert_eq!( is_platform_tag_allowed_by_pypi(platform_tag), expected, "{platform_tag}" ); } } #[test] fn test_wheel_filename_parsing() { let wheel_filenames = [ ("test-1.0.0-py3-none-win_amd64.whl", true), ("test-1.0.0-py3-none-manylinux2014_x86_64.whl", true), ("test-1.0.0-py3-none-any.whl", true), ("test-1.0.0-py3-none-linux_riscv64.whl", false), ]; for (filename, expect) in wheel_filenames { let actual = validate_wheel_filename_for_pypi(filename).is_ok(); assert_eq!(actual, expect, "{filename}"); } } #[test] fn test_target_arch_validation() { let targets = [ ("x86_64-pc-windows-msvc", true), ("aarch64-apple-darwin", true), ("x86_64-unknown-linux-gnu", true), ("aarch64-linux-android", true), ("armv7-linux-androideabi", true), ("riscv64gc-unknown-linux-gnu", true), ("aarch64-apple-ios", true), ("aarch64-apple-ios-sim", true), ("x86_64-apple-ios", true), ("x86_64-unknown-freebsd", false), // Now unsupported (no lazy validation) ("powerpc64-unknown-linux-gnu", true), // PPC64 on Linux is supported ("s390x-unknown-linux-gnu", true), // s390x on Linux is supported ("wasm32-unknown-emscripten", true), // Emscripten uses PEP 783 pyemscripten tags ("i686-pc-windows-msvc", true), // i686 Windows is supported ]; for (triple, expected) in targets { let target = Target::from_target_triple(Some(&TargetTriple::Regular(triple.to_string()))) .unwrap(); assert_eq!(is_arch_supported_by_pypi(&target), expected, "{triple}"); } } } maturin-1.16.0/src/target/wheel_tag.rs000066400000000000000000000110131527064705700176510ustar00rootroot00000000000000use std::collections::BTreeSet; use std::fmt; use itertools::Itertools as _; /// A PEP 425 wheel tag with optional compressed (dot-separated) components. /// /// Compressed tags such as `py2.py3-none-any` expand to one fully qualified tag /// per combination of components via [`WheelTag::expand`]. #[derive(Clone, Debug, Eq, PartialEq)] pub struct WheelTag { python: BTreeSet, abi: BTreeSet, platform: BTreeSet, } impl WheelTag { /// Create a wheel tag from python, ABI, and platform components. /// /// Each component is a sorted set of individual tags. pub fn new( python: impl Into>, abi: impl Into>, platform: impl Into>, ) -> Self { Self { python: python.into(), abi: abi.into(), platform: platform.into(), } } /// The Python tags (e.g. `cp312`, `pp311`, `py3`). pub fn python(&self) -> &BTreeSet { &self.python } /// The ABI tags (e.g. `cp312`, `abi3`, `none`). pub fn abi(&self) -> &BTreeSet { &self.abi } /// The platform tags (e.g. `manylinux_2_17_x86_64`, `any`). pub fn platform(&self) -> &BTreeSet { &self.platform } /// Expand compressed components into fully qualified PEP 425 tags. pub fn expand(&self) -> impl Iterator + '_ { self.python .iter() .cartesian_product(&self.abi) .cartesian_product(&self.platform) .map(|((python, abi), platform)| format!("{python}-{abi}-{platform}")) } } impl fmt::Display for WheelTag { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, "{}-{}-{}", self.python.iter().format("."), self.abi.iter().format("."), self.platform.iter().format(".") ) } } #[cfg(test)] mod tests { use super::WheelTag; #[test] fn display_renders_pep425_tag() { let tag = WheelTag::new( ["cp312".to_string()], ["cp312".to_string()], ["manylinux_2_17_x86_64".to_string()], ); assert_eq!(tag.to_string(), "cp312-cp312-manylinux_2_17_x86_64"); } #[test] fn display_sorts_compressed_tag_sets() { let tag = WheelTag::new( ["cp39".to_string(), "cp310".to_string()], ["abi3t".to_string(), "abi3".to_string()], [ "manylinux_2_17_x86_64".to_string(), "manylinux2014_x86_64".to_string(), ], ); assert_eq!( tag.to_string(), "cp310.cp39-abi3.abi3t-manylinux2014_x86_64.manylinux_2_17_x86_64" ); let universal2 = WheelTag::new( ["py3".to_string()], ["none".to_string()], [ "macosx_10_12_x86_64".to_string(), "macosx_11_0_arm64".to_string(), "macosx_10_12_universal2".to_string(), ], ); assert_eq!( universal2.to_string(), "py3-none-macosx_10_12_universal2.macosx_10_12_x86_64.macosx_11_0_arm64" ); } #[test] fn expand_compressed_tags() { let expanded = WheelTag::new( ["py2".to_string(), "py3".to_string()], ["none".to_string()], ["any".to_string()], ) .expand() .collect::>(); assert_eq!(expanded, ["py2-none-any", "py3-none-any"]); } #[test] fn expand_compressed_platform_tags() { let expanded = WheelTag::new( ["cp37".to_string()], ["abi3".to_string()], [ "manylinux_2_17_x86_64".to_string(), "manylinux2014_x86_64".to_string(), ], ) .expand() .collect::>(); assert_eq!( expanded, [ "cp37-abi3-manylinux2014_x86_64", "cp37-abi3-manylinux_2_17_x86_64" ] ); } #[test] fn expand_abi3t_to_abi3_and_abi3t() { let expanded = WheelTag::new( ["cp315".to_string()], ["abi3".to_string(), "abi3t".to_string()], ["manylinux_2_17_x86_64".to_string()], ) .expand() .collect::>(); assert_eq!( expanded, [ "cp315-abi3-manylinux_2_17_x86_64", "cp315-abi3t-manylinux_2_17_x86_64" ] ); } } maturin-1.16.0/src/templates/000077500000000000000000000000001527064705700160605ustar00rootroot00000000000000maturin-1.16.0/src/templates/.gitignore.j2000066400000000000000000000012561527064705700203660ustar00rootroot00000000000000/target # Byte-compiled / optimized / DLL files __pycache__/ .pytest_cache/ *.py[cod] # C extensions *.so # Distribution / packaging .Python .venv/ env/ bin/ build/ develop-eggs/ dist/ eggs/ lib/ lib64/ parts/ sdist/ var/ include/ man/ venv/ *.egg-info/ .installed.cfg *.egg # Installer logs pip-log.txt pip-delete-this-directory.txt pip-selfcheck.json # Unit test / coverage reports htmlcov/ .tox/ .coverage .cache nosetests.xml coverage.xml # Translations *.mo # Mr Developer .mr.developer.cfg .project .pydevproject # Rope .ropeproject # Django stuff: *.log *.pot .DS_Store # Sphinx documentation docs/_build/ # PyCharm .idea/ # VSCode .vscode/ # Pyenv .python-version maturin-1.16.0/src/templates/Cargo.toml.j2000066400000000000000000000007151527064705700203250ustar00rootroot00000000000000[package] name = "{{ name }}" version = "0.1.0" edition = "2024" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html {%- if bindings != "bin" %} [lib] name = "{{ crate_name }}" crate-type = ["cdylib"] {%- endif %} [dependencies] {% if bindings == "pyo3" -%} pyo3 = "0.29.0" {% elif bindings == "uniffi" -%} uniffi = "0.28.0" [build-dependencies] uniffi = { version = "0.28.0", features = ["build"] } {% endif -%} maturin-1.16.0/src/templates/__init__.py.j2000066400000000000000000000002251527064705700205020ustar00rootroot00000000000000from .{{ crate_name }} import * __doc__ = {{ crate_name }}.__doc__ if hasattr({{ crate_name }}, "__all__"): __all__ = {{ crate_name }}.__all__ maturin-1.16.0/src/templates/build.rs.j2000066400000000000000000000001731527064705700200400ustar00rootroot00000000000000{%- if bindings == "uniffi" -%} fn main() { uniffi::generate_scaffolding("./src/example.udl").unwrap(); } {% endif -%} maturin-1.16.0/src/templates/example.udl.j2000066400000000000000000000000601527064705700205270ustar00rootroot00000000000000namespace example { u32 add(u32 a, u32 b); }; maturin-1.16.0/src/templates/lib.rs.j2000066400000000000000000000007121527064705700175060ustar00rootroot00000000000000{%- if bindings == "pyo3" -%} use pyo3::prelude::*; /// A Python module implemented in Rust. #[pymodule] mod {{crate_name}} { use pyo3::prelude::*; /// Formats the sum of two numbers as string. #[pyfunction] fn sum_as_string(a: usize, b: usize) -> PyResult { Ok((a + b).to_string()) } } {%- elif bindings == "uniffi" -%} fn add(a: u32, b: u32) -> u32 { a + b } uniffi::include_scaffolding!("example"); {%- endif %} maturin-1.16.0/src/templates/main.rs.j2000066400000000000000000000000551527064705700176640ustar00rootroot00000000000000fn main() { println!("Hello, world!"); } maturin-1.16.0/src/templates/pyproject.toml.j2000066400000000000000000000016071527064705700213120ustar00rootroot00000000000000[build-system] requires = ["maturin>={{ version_major }}.{{ version_minor }},<{{ version_major + 1 }}.0"] build-backend = "maturin" [project] name = "{{ name }}" requires-python = ">=3.8" classifiers = [ "Programming Language :: Rust", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", ] {% if bindings == "cffi" -%} dependencies = ["cffi; platform_python_implementation != 'PyPy'"] {% endif -%} dynamic = ["version"] {% if mixed_non_src -%} [project.optional-dependencies] tests = [ "pytest", ] {% endif -%} {% if bindings in ["bin", "cffi"] or mixed_non_src -%} [tool.maturin] {% if bindings == "cffi" or bindings == "bin" -%} bindings = "{{ bindings }}" {% endif -%} {% if mixed_non_src -%} python-source = "python" {% endif -%} exclude = [ "**/__pycache__", "**/*.pyc", "**/*.pyo" ] {% endif -%} maturin-1.16.0/src/templates/test_all.py.j2000066400000000000000000000001711527064705700205520ustar00rootroot00000000000000import pytest import {{ crate_name }} def test_sum_as_string(): assert {{ crate_name }}.sum_as_string(1, 1) == "2" maturin-1.16.0/src/test_utils.rs000066400000000000000000000003241527064705700166260ustar00rootroot00000000000000use std::path::{Path, PathBuf}; /// Resolve the path to a test crate. pub fn test_crate_path(name: &str) -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) .join("test-crates") .join(name) } maturin-1.16.0/src/ui.rs000066400000000000000000000006371527064705700150530ustar00rootroot00000000000000//! User-facing output facade. //! //! This is the single seam for later `--quiet` and JSON output support, introduced by //! the refactor plan item "Route user-facing output through a small facade". macro_rules! status { ($($arg:tt)*) => { eprintln!($($arg)*) }; } macro_rules! warning { ($($arg:tt)*) => { eprintln!($($arg)*) }; } pub(crate) use status; pub(crate) use warning; maturin-1.16.0/src/upload.rs000066400000000000000000000610511527064705700157170ustar00rootroot00000000000000//! The uploading logic was mostly reverse engineered; I wrote it down as //! documentation at https://warehouse.readthedocs.io/api-reference/legacy/#upload-api use crate::util::hash_file; use anyhow::{Context, Result, bail}; use base64::Engine; use base64::engine::general_purpose::STANDARD; use bytesize::ByteSize; use configparser::ini::Ini; use fs_err as fs; use once_cell::sync::Lazy; use regex::Regex; use serde::Deserialize; use std::collections::HashMap; use std::env; #[cfg(any(feature = "native-tls", feature = "rustls"))] use std::ffi::OsString; use std::io; use std::path::{Path, PathBuf}; use std::time::Duration; use thiserror::Error; use tracing::debug; /// An account with a registry, possibly incomplete #[derive(Debug, clap::Parser)] pub struct PublishOpt { /// The repository (package index) to upload the package to. Should be a section in the config file. /// /// Can also be set via MATURIN_REPOSITORY environment variable. #[arg(short = 'r', long, env = "MATURIN_REPOSITORY", default_value = "pypi")] repository: String, /// The URL of the registry where the wheels are uploaded to. This overrides --repository. /// /// Can also be set via MATURIN_REPOSITORY_URL environment variable. #[arg(long, env = "MATURIN_REPOSITORY_URL", overrides_with = "repository")] repository_url: Option, /// Username for pypi or your custom registry. /// /// Can also be set via MATURIN_USERNAME environment variable. /// /// Set MATURIN_PYPI_TOKEN variable to use token-based authentication instead #[arg(short, long, env = "MATURIN_USERNAME")] username: Option, /// Password for pypi or your custom registry. /// /// Can also be set via MATURIN_PASSWORD environment variable. #[arg(short, long, env = "MATURIN_PASSWORD", hide_env_values = true)] password: Option, /// Continue uploading files if one already exists. /// (Only valid when uploading to PyPI. Other implementations may not support this.) #[arg(long)] skip_existing: bool, /// Do not interactively prompt for username/password if the required credentials are missing. /// /// Can also be set via MATURIN_NON_INTERACTIVE environment variable. #[arg(long, env = "MATURIN_NON_INTERACTIVE")] non_interactive: bool, } impl PublishOpt { // Here we omit trailing slashes from the repository URL, which we'll add back in `complete_registry` const DEFAULT_REPOSITORY_URL: &'static str = "https://upload.pypi.org/legacy"; const TEST_REPOSITORY_URL: &'static str = "https://test.pypi.org/legacy"; /// Set to non interactive mode if we're running on CI pub fn non_interactive_on_ci(&mut self) { let msg = "âš ï¸� Warning: The maturin upload and publish commands are deprecated and will be removed in the future. For more information see: https://github.com/PyO3/maturin/issues/2334"; eprintln!("{msg}"); if env::var("GITHUB_ACTIONS") .map(|v| v == "true") .unwrap_or_default() { // Also emit a warning annotation on the GH action println!("::warning::{msg}"); } if !self.non_interactive && env::var("CI").map(|v| v == "true").unwrap_or_default() { eprintln!("🎛ï¸� Running in non-interactive mode on CI"); self.non_interactive = true; } } } /// Error type for different types of errors that can happen when uploading a /// wheel. /// /// The most interesting type is AuthenticationError because it allows asking /// the user to reenter the password #[derive(Error, Debug)] #[error("Uploading to the registry failed")] pub enum UploadError { /// Any ureq error #[error("Http error")] UreqError(#[source] Box), /// The registry returned a "403 Forbidden" #[error("Username or password are incorrect")] AuthenticationError(String), /// Reading the wheel failed #[error("IO Error")] IoError(#[source] io::Error), /// The registry returned something else than 200 #[error("Failed to upload the wheel with status {0}: {1}")] StatusCodeError(String, String), /// File already exists #[error("File already exists: {0}")] FileExistsError(String), /// Read package metadata error #[error("Could not read the metadata from the package at {0}")] PkgInfoError(PathBuf, #[source] python_pkginfo::Error), /// TLS error #[cfg(feature = "native-tls")] #[error("TLS Error")] TlsError(#[source] native_tls::Error), } impl From for UploadError { fn from(error: io::Error) -> Self { UploadError::IoError(error) } } impl From for UploadError { fn from(error: ureq::Error) -> Self { UploadError::UreqError(Box::new(error)) } } #[cfg(feature = "native-tls")] impl From for UploadError { fn from(error: native_tls::Error) -> Self { UploadError::TlsError(error) } } /// A pip registry such as pypi or testpypi with associated credentials, used /// for uploading wheels #[derive(Debug, Clone, Eq, PartialEq)] pub struct Registry { /// The username pub username: String, /// The password pub password: String, /// The url endpoint for legacy uploading pub url: String, } impl Registry { /// Creates a new registry pub fn new(username: String, password: String, url: String) -> Registry { Registry { username, password, url, } } } /// Attempts to fetch the password from the keyring (if enabled) /// and falls back to the interactive password prompt. fn get_password(_username: &str) -> String { #[cfg(feature = "keyring")] { let service = env!("CARGO_PKG_NAME"); let keyring = keyring::Entry::new(service, _username); if let Ok(password) = keyring.and_then(|keyring| keyring.get_password()) { return password; }; } dialoguer::Password::new() .with_prompt("Please enter your password") .interact() .unwrap_or_else(|_| { // So we need this fallback for pycharm on windows let mut password = String::new(); io::stdin() .read_line(&mut password) .expect("Failed to read line"); password.trim().to_string() }) } fn get_username() -> String { eprintln!("Please enter your username:"); let mut line = String::new(); io::stdin().read_line(&mut line).unwrap(); line.trim().to_string() } fn load_pypirc() -> Ini { let mut config = Ini::new(); if let Some(mut config_path) = dirs::home_dir() { config_path.push(".pypirc"); if let Ok(pypirc) = fs::read_to_string(config_path.as_path()) { let _ = config.read(pypirc); } } config } fn load_pypi_cred_from_config(config: &Ini, registry_name: &str) -> Option<(String, String)> { if let (Some(username), Some(password)) = ( config.get(registry_name, "username"), config.get(registry_name, "password"), ) { return Some((username, password)); } None } /// Gets the PyPI credentials from (in precedence order): /// /// 1. `MATURIN_PYPI_TOKEN` environment variable /// 2. `.pypirc` config file /// 3. maturin command arguments /// 4. `MATURIN_USERNAME` and `MATURIN_PASSWORD` environment variables /// 5. the password keyring /// 6. interactive prompt fn resolve_pypi_cred( opt: &PublishOpt, config: &Ini, registry_name: Option<&str>, registry_url: &str, ) -> Result<(String, String)> { // API token from environment variable takes priority if let Ok(token) = env::var("MATURIN_PYPI_TOKEN") { return Ok(("__token__".to_string(), token)); } // Try to get a token via OIDC exchange match resolve_pypi_token_via_oidc(registry_url) { Ok(Some(token)) => { eprintln!("ðŸ”� Using trusted publisher for upload"); return Ok(("__token__".to_string(), token)); } Ok(None) => {} Err(e) => eprintln!("âš ï¸� Warning: Failed to resolve PyPI token via OIDC: {e}"), } if let Some((username, password)) = registry_name.and_then(|name| load_pypi_cred_from_config(config, name)) { eprintln!("ðŸ”� Using credential in pypirc for upload"); return Ok((username, password)); } // fallback to username and password if opt.non_interactive && (opt.username.is_none() || opt.password.is_none()) { bail!("Credentials not found and non-interactive mode is enabled"); } let username = opt.username.clone().unwrap_or_else(get_username); let password = opt .password .clone() .unwrap_or_else(|| get_password(&username)); Ok((username, password)) } #[derive(Debug, Deserialize)] struct OidcAudienceResponse { audience: String, } #[derive(Debug, Deserialize)] struct OidcTokenResponse { value: String, } #[derive(Debug, Deserialize)] struct MintTokenResponse { token: String, } /// Trusted Publisher support for GitHub Actions fn resolve_pypi_token_via_oidc(registry_url: &str) -> Result> { if env::var_os("GITHUB_ACTIONS").is_none() { return Ok(None); } if let (Ok(req_token), Ok(req_url)) = ( env::var("ACTIONS_ID_TOKEN_REQUEST_TOKEN"), env::var("ACTIONS_ID_TOKEN_REQUEST_URL"), ) { let registry_url = url::Url::parse(registry_url)?; let mut audience_url = registry_url.clone(); audience_url.set_path("_/oidc/audience"); debug!("Requesting OIDC audience from {}", audience_url); // Create agent with timeout configuration. // // `http_status_as_error(false)` matches `http_agent()` so that a 404 // from the `_/oidc/audience` endpoint is returned as a normal // response (instead of an `Err` that the `?` below would propagate), // letting the graceful `Ok(None)` fallback below actually run for // registries that don't support OIDC (GitLab, Artifactory, pypiserver, // custom indexes). let mut agent_builder = ureq::Agent::config_builder() .proxy(ureq::Proxy::try_from_env()) .http_status_as_error(false) .timeout_global(Some(Duration::from_secs(30))); #[cfg(any(feature = "native-tls", feature = "rustls"))] { agent_builder = agent_builder.tls_config(tls_config()?); } let agent: ureq::Agent = agent_builder.build().into(); let mut audience_res = agent.get(audience_url.as_str()).call()?; if audience_res.status() == 404 { // OIDC is not enabled/supported on this registry return Ok(None); } let audience = audience_res .body_mut() .read_json::()? .audience; debug!("Requesting OIDC token for {} from {}", audience, req_url); let request_token_res: OidcTokenResponse = agent .get(&req_url) .query("audience", &audience) .header("Authorization", &format!("bearer {req_token}")) .call()? .body_mut() .read_json()?; let oidc_token = request_token_res.value; let mut mint_token_url = registry_url; mint_token_url.set_path("_/oidc/github/mint-token"); debug!("Requesting API token from {}", mint_token_url); let mut mint_token_req = HashMap::new(); mint_token_req.insert("token", oidc_token); let mint_token_res = agent .post(mint_token_url.as_str()) .send_json(mint_token_req)? .body_mut() .read_json::()?; return Ok(Some(mint_token_res.token)); } Ok(None) } /// Asks for username and password for a registry account where missing. fn complete_registry(opt: &PublishOpt) -> Result { // load creds from pypirc if found let pypirc = load_pypirc(); let (registry_name, registry_url) = if let Some(repository_url) = opt.repository_url.as_deref() { // to normalize URLs by removing trailing slashes match repository_url.trim_end_matches('/') { PublishOpt::DEFAULT_REPOSITORY_URL => ( Some("pypi"), // Add trailing slash back format!("{}/", PublishOpt::DEFAULT_REPOSITORY_URL), ), PublishOpt::TEST_REPOSITORY_URL => ( Some("testpypi"), // Add trailing slash back format!("{}/", PublishOpt::TEST_REPOSITORY_URL), ), _ => (None, repository_url.to_string()), } } else if let Some(url) = pypirc.get(&opt.repository, "repository") { (Some(opt.repository.as_str()), url) } else if opt.repository == "pypi" { ( Some("pypi"), // Add trailing slash back format!("{}/", PublishOpt::DEFAULT_REPOSITORY_URL), ) } else if opt.repository == "testpypi" { ( Some("testpypi"), // Add trailing slash back format!("{}/", PublishOpt::TEST_REPOSITORY_URL), ) } else { bail!( "Failed to get registry {} in .pypirc. \ Note: Your index didn't start with http:// or https://, \ which is required for non-pypirc indices.", opt.repository ); }; let (username, password) = resolve_pypi_cred(opt, &pypirc, registry_name, ®istry_url)?; let registry = Registry::new(username, password, registry_url); Ok(registry) } /// Port of pip's `canonicalize_name` /// https://github.com/pypa/pip/blob/b33e791742570215f15663410c3ed987d2253d5b/src/pip/_vendor/packaging/utils.py#L18-L25 fn canonicalize_name(name: &str) -> String { static RE: Lazy = Lazy::new(|| Regex::new("[-_.]+").unwrap()); RE.replace_all(name, "-").to_lowercase() } #[cfg(any(feature = "native-tls", feature = "rustls"))] fn tls_ca_bundle() -> Option { env::var_os("MATURIN_CA_BUNDLE") .or_else(|| env::var_os("REQUESTS_CA_BUNDLE")) .or_else(|| env::var_os("CURL_CA_BUNDLE")) } // Prefer rustls if both native-tls and rustls features are enabled /// Load certificates from a CA bundle file #[cfg(any(feature = "native-tls", feature = "rustls"))] fn load_ca_certs( ca_bundle: impl AsRef, ) -> Result>, UploadError> { use rustls_pki_types::pem::PemObject; let certs = rustls_pki_types::CertificateDer::pem_file_iter(ca_bundle) .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))? .collect::, _>>() .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?; Ok(certs .into_iter() .map(|cert| { let owned = cert.into_owned(); ureq::tls::Certificate::from_der(owned.as_ref()).to_owned() }) .collect()) } #[cfg(any(feature = "native-tls", feature = "rustls"))] fn tls_config() -> Result { let mut builder = ureq::tls::TlsConfig::builder(); #[cfg(all(feature = "native-tls", not(feature = "rustls")))] { builder = builder .provider(ureq::tls::TlsProvider::NativeTls) .root_certs(ureq::tls::RootCerts::PlatformVerifier); } if let Some(ca_bundle) = tls_ca_bundle() { let certs = load_ca_certs(ca_bundle)?; builder = builder.root_certs(ureq::tls::RootCerts::new_with_certs(&certs)); } Ok(builder.build()) } #[cfg(all(feature = "native-tls", not(feature = "rustls")))] fn http_agent() -> Result { Ok(ureq::Agent::config_builder() .proxy(ureq::Proxy::try_from_env()) .http_status_as_error(false) .tls_config(tls_config()?) .build() .into()) } #[cfg(feature = "rustls")] fn http_agent() -> Result { let mut builder = ureq::Agent::config_builder() .proxy(ureq::Proxy::try_from_env()) .http_status_as_error(false); if tls_ca_bundle().is_some() { builder = builder.tls_config(tls_config()?); } Ok(builder.build().into()) } #[cfg(not(any(feature = "native-tls", feature = "rustls")))] fn http_agent() -> Result { Ok(ureq::Agent::config_builder() .proxy(ureq::Proxy::try_from_env()) .http_status_as_error(false) .build() .into()) } /// Uploads a single wheel to the registry pub fn upload(registry: &Registry, wheel_path: &Path) -> Result<(), UploadError> { let hash_hex = hash_file(wheel_path)?; let dist = python_pkginfo::Distribution::new(wheel_path) .map_err(|err| UploadError::PkgInfoError(wheel_path.to_owned(), err))?; let metadata = dist.metadata(); let mut api_metadata = vec![ (":action", "file_upload".to_string()), ("sha256_digest", hash_hex), ("protocol_version", "1".to_string()), ("metadata_version", metadata.metadata_version.clone()), ("name", canonicalize_name(&metadata.name)), ("version", metadata.version.clone()), ("pyversion", dist.python_version().to_string()), ("filetype", dist.r#type().to_string()), ]; let mut add_option = |name, value: &Option| { if let Some(some) = value.clone() { api_metadata.push((name, some)); } }; // https://github.com/pypa/warehouse/blob/75061540e6ab5aae3f8758b569e926b6355abea8/warehouse/forklift/legacy.py#L424 add_option("summary", &metadata.summary); add_option("description", &metadata.description); add_option( "description_content_type", &metadata.description_content_type, ); add_option("author", &metadata.author); add_option("author_email", &metadata.author_email); add_option("maintainer", &metadata.maintainer); add_option("maintainer_email", &metadata.maintainer_email); add_option("license", &metadata.license); add_option("keywords", &metadata.keywords); add_option("home_page", &metadata.home_page); add_option("download_url", &metadata.download_url); add_option("requires_python", &metadata.requires_python); if metadata.requires_python.is_none() { // GitLab PyPI repository API implementation requires this metadata field // and twine always includes it in the request, even when it's empty. api_metadata.push(("requires_python", "".to_string())); } let mut add_vec = |name, values: &[String]| { for i in values { api_metadata.push((name, i.clone())); } }; add_vec("classifiers", &metadata.classifiers); add_vec("platform", &metadata.platforms); add_vec("requires_dist", &metadata.requires_dist); add_vec("provides_dist", &metadata.provides_dist); add_vec("obsoletes_dist", &metadata.obsoletes_dist); add_vec("requires_external", &metadata.requires_external); add_vec("project_urls", &metadata.project_urls); let wheel_name = wheel_path .file_name() .expect("Wheel path has a file name") .to_string_lossy(); let mut form = ureq::unversioned::multipart::Form::new(); for (key, value) in &api_metadata { form = form.text(key, value.as_str()); } form = form.part( "content", ureq::unversioned::multipart::Part::file(wheel_path)?.file_name(&wheel_name), ); let encoded = STANDARD.encode(format!("{}:{}", registry.username, registry.password)); let agent = http_agent()?; let mut response = agent .post(registry.url.as_str()) .header( "User-Agent", &format!("{}/{}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")), ) .header("Authorization", &format!("Basic {encoded}")) .send(form)?; let status = response.status(); if status.is_success() { return Ok(()); } let err_text = response.body_mut().read_to_string().unwrap_or_else(|e| { format!( "The registry should return some text, \ even in case of an error, but didn't ({e})" ) }); debug!("Upload error response: {}", err_text); handle_upload_error(status.as_u16(), err_text) } /// Classify upload error based on status code and response text fn handle_upload_error(status_code: u16, err_text: String) -> Result<(), UploadError> { // Detect FileExistsError the way twine does // https://github.com/pypa/twine/blob/87846e5777b380d4704704a69e1f9a7a1231451c/twine/commands/upload.py#L30 match status_code { 403 => { if err_text.contains("overwrite artifact") { // Artifactory (https://jfrog.com/artifactory/) Err(UploadError::FileExistsError(err_text)) } else { Err(UploadError::AuthenticationError(err_text)) } } 409 => { // conflict, pypiserver (https://pypi.org/project/pypiserver) Err(UploadError::FileExistsError(err_text)) } 400 if is_file_exists_error(&err_text) => Err(UploadError::FileExistsError(err_text)), _ => Err(UploadError::StatusCodeError( status_code.to_string(), err_text, )), } } /// Check if error text indicates file already exists fn is_file_exists_error(err_text: &str) -> bool { err_text.contains("already exists") // PyPI / TestPyPI || err_text.contains("updating asset") // Nexus Repository OSS || err_text.contains("already been taken") // GitLab Enterprise Edition } /// Handles authentication/keyring integration and retrying of the publish subcommand pub fn upload_ui(items: &[PathBuf], publish: &PublishOpt) -> Result<()> { let registry = complete_registry(publish)?; eprintln!("🚀 Uploading {} packages", items.len()); static TITLE_RE: Lazy = Lazy::new(|| Regex::new(r"(.+?)").unwrap()); for i in items { let upload_result = upload(®istry, i); match upload_result { Ok(()) => (), Err(UploadError::AuthenticationError(msg)) => { let title = TITLE_RE .captures(&msg) .and_then(|c| c.get(1)) .map(|m| m.as_str()); match title { Some(title) => { eprintln!("â›” {title}"); } None => eprintln!("â›” Username and/or password are wrong"), } #[cfg(feature = "keyring")] { // Delete the wrong password from the keyring let old_username = registry.username; match keyring::Entry::new(env!("CARGO_PKG_NAME"), &old_username) .and_then(|keyring| keyring.delete_credential()) { Ok(()) => { eprintln!("🔑 Removed wrong password from keyring") } Err(keyring::Error::NoEntry) | Err(keyring::Error::NoStorageAccess(_)) | Err(keyring::Error::PlatformFailure(_)) => {} Err(err) => { eprintln!("âš ï¸� Warning: Failed to remove password from keyring: {err}") } } } bail!("Username and/or password are possibly wrong"); } Err(err) => { let filename = i.file_name().unwrap_or(i.as_os_str()); if let UploadError::FileExistsError(_) = err && publish.skip_existing { eprintln!("âš ï¸� Note: Skipping {filename:?} because it appears to already exist"); continue; } let filesize = fs::metadata(i) .map(|x| ByteSize(x.len()).to_string()) .unwrap_or_else(|e| format!("Failed to get the filesize of {i:?}: {e}")); return Err(err).context(format!("💥 Failed to upload {filename:?} ({filesize})")); } } } eprintln!("✨ Packages uploaded successfully"); #[cfg(feature = "keyring")] { // We know the password is correct, so we can save it in the keyring let username = registry.username.clone(); let password = registry.password; match keyring::Entry::new(env!("CARGO_PKG_NAME"), &username) .and_then(|keyring| keyring.set_password(&password)) { Ok(()) | Err(keyring::Error::NoStorageAccess(_)) | Err(keyring::Error::PlatformFailure(_)) => {} Err(err) => { eprintln!("âš ï¸� Warning: Failed to store the password in the keyring: {err:?}"); } } } Ok(()) } maturin-1.16.0/src/util.rs000066400000000000000000000030321527064705700154030ustar00rootroot00000000000000use sha2::{Digest, Sha256}; use std::io; use std::path::Path; use zip::DateTime; use fs_err as fs; pub(crate) fn sha256_hex(hash: &[u8]) -> String { use std::fmt::Write; let mut hex = String::with_capacity(hash.len() * 2); for b in hash { write!(hex, "{b:02x}").unwrap(); } hex } /// Wrapper that implements [`io::Write`] for any [`Digest`] hasher, /// restoring the `io::copy` pattern removed in digest 0.11. pub(crate) struct DigestWriter(pub D); impl io::Write for DigestWriter { fn write(&mut self, buf: &[u8]) -> io::Result { self.0.update(buf); Ok(buf.len()) } fn flush(&mut self) -> io::Result<()> { Ok(()) } } /// Calculate the sha256 of a file pub(crate) fn hash_file(path: impl AsRef) -> Result { let mut file = fs::File::open(path.as_ref())?; let mut w = DigestWriter(Sha256::new()); io::copy(&mut file, &mut w)?; Ok(sha256_hex(w.0.finalize().as_slice())) } /// Returns a DateTime representing the value SOURCE_DATE_EPOCH environment variable /// Note that the earliest timestamp a zip file can represent is 1980-01-01 pub(crate) fn zip_mtime() -> DateTime { let res: anyhow::Result = (|| { let epoch: i64 = std::env::var("SOURCE_DATE_EPOCH")?.parse()?; let dt = time::OffsetDateTime::from_unix_timestamp(epoch)?; let dt = time::PrimitiveDateTime::new(dt.date(), dt.time()); let dt = DateTime::try_from(dt)?; Ok(dt) })(); res.unwrap_or_default() } maturin-1.16.0/sysconfig/000077500000000000000000000000001527064705700152775ustar00rootroot00000000000000maturin-1.16.0/sysconfig/Readme.md000066400000000000000000000003261527064705700170170ustar00rootroot00000000000000This folder contains all the sysconfigs (`python -m sysconfig`) I came across. I collected those because they differ highly across versions and operating systems, but are essential for naming wheels and libraries. maturin-1.16.0/sysconfig/cpython-aix-3.9.txt000066400000000000000000000636231527064705700206240ustar00rootroot00000000000000Platform: "aix-7205-2345-64" Python version: "3.9" Current installation scheme: "posix_prefix" Paths: data = "/opt/freeware" include = "/opt/freeware/include/python3.9" platinclude = "/opt/freeware/include/python3.9" platlib = "/opt/freeware/lib64/python3.9/site-packages" platstdlib = "/opt/freeware/lib64/python3.9" purelib = "/opt/freeware/lib/python3.9/site-packages" scripts = "/opt/freeware/bin" stdlib = "/opt/freeware/lib64/python3.9" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "2245" AIX_GENUINE_CPLUSPLUS = "1" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "/usr/bin/ar -X32_64" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/opt/freeware/bin" BINLIBDEST = "/opt/freeware/lib64/python3.9" BLDLIBRARY = "-L. -lpython3.9" BLDSHARED = "/opt/freeware/lib64/python3.9/config-3.9/ld_so_aix gcc -maix64 -fPIC -pthread -O2 -bI:/opt/freeware/lib64/python3.9/config-3.9/python.exp -L/opt/freeware/lib/pthread -L/opt/freeware/lib64 -L/opt/freeware/lib -L/usr/lib -Wl,-blibpath:/opt/freeware/lib/pthread:/opt/freeware/lib64:/opt/freeware/lib:/usr/lib -L/opt/freeware/lib/pthread -L/opt/freeware/lib64 -L/opt/freeware/lib -L/usr/lib -Wl,-blibpath:/opt/freeware/lib/pthread:/opt/freeware/lib64:/opt/freeware/lib:/usr/lib" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "powerpc-ibm-aix7.1.5.0" BYTESTR_DEPS = "\" CC = "gcc -maix64 -fPIC -pthread -O2" CCSHARED = "" CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -O2 -Wall -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT" CFLAGSFORSHARED = "" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "-I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden" CONFIGURE_CPPFLAGS = "-I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT" CONFIGURE_LDFLAGS = "-L/opt/freeware/lib/pthread -L/opt/freeware/lib64 -L/opt/freeware/lib -L/usr/lib -Wl,-blibpath:/opt/freeware/lib/pthread:/opt/freeware/lib64:/opt/freeware/lib:/usr/lib" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--prefix=/opt/freeware' '--libdir=/opt/freeware/lib64' '--with-platlibdir=lib64' '--mandir=/opt/freeware/man' '--enable-shared' '--enable-ipv6' '--with-system-ffi' '--with-system-expat' '--with-tcltk-includes=-I/opt/freeware/include' '--with-tcltk-libs=-L/opt/freeware/lib -ltcl -ltk' '--with-computed-gotos' '--without-ensurepip' 'CC=gcc -maix64 -fPIC -pthread -O2' 'CFLAGS=-I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT' 'LDFLAGS=-L/opt/freeware/lib/pthread -L/opt/freeware/lib64 -L/opt/freeware/lib -L/usr/lib -Wl,-blibpath:/opt/freeware/lib/pthread:/opt/freeware/lib64:/opt/freeware/lib:/usr/lib' 'CPPFLAGS=-I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT' 'PKG_CONFIG_PATH=/opt/freeware/lib64/pkgconfig:/opt/freeware/lib/pkgconfig'" CONFINCLUDEDIR = "/opt/freeware/include" CONFINCLUDEPY = "/opt/freeware/include/python3.9" COREPYTHONPATH = "" COVERAGE_INFO = "/home/buildusr/rpmbuild/BUILD/Python-3.9.18/64bit/coverage.info" COVERAGE_REPORT = "/home/buildusr/rpmbuild/BUILD/Python-3.9.18/64bit/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT" CXX = "g++ -maix64 -fPIC -pthread -O2" DESTDIRS = "/opt/freeware /opt/freeware/lib64 /opt/freeware/lib64/python3.9 /opt/freeware/lib64/python3.9/lib-dynload" DESTLIB = "/opt/freeware/lib64/python3.9" DESTPATH = "" DESTSHARED = "/opt/freeware/lib64/python3.9/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "1" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "0" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXPORTSFROM = "libpython3.9.a(libpython3.9.so)" EXPORTSYMS = "Modules/python.exp" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-39.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "1" FLOCK_NEEDS_LIBBSD = "1" GETPGRP_HAVE_ARG = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "no" HAVE_ACCEPT4 = "0" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "1" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "1" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "1" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "0" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "0" HAVE_CRYPT_H = "1" HAVE_CRYPT_R = "1" HAVE_CTERMID = "1" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "0" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "1" HAVE_DECL_RTLD_NODELETE = "0" HAVE_DECL_RTLD_NOLOAD = "0" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "1" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "1" HAVE_DEV_PTMX = "0" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "0" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "0" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "0" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "0" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "0" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "1" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "0" HAVE_FUTIMESAT = "0" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "0" HAVE_GCC_ASM_FOR_X87 = "0" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "0" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "0" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "0" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "0" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "0" HAVE_GETRESUID = "0" HAVE_GETSID = "1" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "0" HAVE_HTOLE64 = "0" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "0" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "0" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "0" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "0" HAVE_LIBUUID = "0" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_AUXVEC_H = "0" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_J1939_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LINUX_WAIT_H = "0" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "0" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "0" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "0" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "0" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION = "0" HAVE_OPENAT = "1" HAVE_OPENPTY = "0" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "0" HAVE_PLOCK = "1" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "1" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "0" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "0" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "0" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "0" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_CLOCKWAIT = "0" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "0" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "0" HAVE_SETRESUID = "0" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "1" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "0" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "0" HAVE_STROPTS_H = "1" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "0" HAVE_STRUCT_STAT_ST_GEN = "1" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "0" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_AUXV_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "0" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENT_H = "0" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "1" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "0" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "0" HAVE_SYS_SYSMACROS_H = "1" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "1" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "0" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "0" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "0" HAVE_TRUNCATE = "1" HAVE_TZNAME = "1" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_USABLE_WCHAR_T = "1" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "1" HAVE_UUID_ENC_BE = "0" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_H = "1" HAVE_UUID_UUID_H = "0" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "powerpc-ibm-aix7.1.5.0" INCLDIRSTOMAKE = "/opt/freeware/include /opt/freeware/include /opt/freeware/include/python3.9 /opt/freeware/include/python3.9" INCLUDEDIR = "/opt/freeware/include" INCLUDEPY = "/opt/freeware/include/python3.9" INSTALL = "/opt/freeware/bin/install -c" INSTALL_DATA = "/opt/freeware/bin/install -c -m 644" INSTALL_PROGRAM = "/opt/freeware/bin/install -c" INSTALL_SCRIPT = "/opt/freeware/bin/install -c" INSTALL_SHARED = "/opt/freeware/bin/install -c -m 755" INSTSONAME = "libpython3.9.a" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "/opt/freeware/lib64/python3.9/config-3.9/ld_so_aix gcc -maix64 -fPIC -pthread -O2 -bI:/opt/freeware/lib64/python3.9/config-3.9/python.exp" LDFLAGS = "-L/opt/freeware/lib/pthread -L/opt/freeware/lib64 -L/opt/freeware/lib -L/usr/lib -Wl,-blibpath:/opt/freeware/lib/pthread:/opt/freeware/lib64:/opt/freeware/lib:/usr/lib -L/opt/freeware/lib/pthread -L/opt/freeware/lib64 -L/opt/freeware/lib -L/usr/lib -Wl,-blibpath:/opt/freeware/lib/pthread:/opt/freeware/lib64:/opt/freeware/lib:/usr/lib" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.9.a" LDLIBRARYDIR = "" LDSHARED = "/opt/freeware/lib64/python3.9/config-3.9/ld_so_aix gcc -maix64 -fPIC -pthread -O2 -bI:/opt/freeware/lib64/python3.9/config-3.9/python.exp -L/opt/freeware/lib/pthread -L/opt/freeware/lib64 -L/opt/freeware/lib -L/usr/lib -Wl,-blibpath:/opt/freeware/lib/pthread:/opt/freeware/lib64:/opt/freeware/lib:/usr/lib -L/opt/freeware/lib/pthread -L/opt/freeware/lib64 -L/opt/freeware/lib -L/usr/lib -Wl,-blibpath:/opt/freeware/lib/pthread:/opt/freeware/lib64:/opt/freeware/lib:/usr/lib" LDVERSION = "3.9" LIBC = "" LIBDEST = "/opt/freeware/lib64/python3.9" LIBDIR = "/opt/freeware/lib64" LIBFFI_INCLUDEDIR = "/opt/freeware/include" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/opt/freeware/lib64/pkgconfig" LIBPL = "/opt/freeware/lib64/python3.9/config-3.9" LIBPYTHON = "-lpython3.9" LIBRARY = "libpython3.9-static.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "/opt/freeware/lib/libintl.a -ldl -lm" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "gcc -maix64 -fPIC -pthread -O2" LINKFORSHARED = "-Wl,-bE:Modules/python.exp -lld" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "true" LN = "ln" LOCALMODLIBS = "" MACHDEP = "aix" MACHDEP_OBJS = "" MACHDESTLIB = "/opt/freeware/lib64/python3.9" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "gcc -maix64 -fPIC -pthread -O2" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "1" MAKESETUP = "./Modules/makesetup" MANDIR = "/opt/freeware/man" MKDIR_P = "/opt/freeware/bin/mkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _peg_parser _symtable xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/_peg_parser.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "-I/usr/include" OPENSSL_LDFLAGS = "-L/usr/lib" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG -g -O2 -Wall" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "-fprofile-generate" PGO_PROF_USE_FLAG = "-fprofile-use -fprofile-correction" PLATLIBDIR = "lib64" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha256,sha512,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -O2 -Wall -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -O2 -Wall -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -O2 -Wall -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-L/opt/freeware/lib/pthread -L/opt/freeware/lib64 -L/opt/freeware/lib -L/usr/lib -Wl,-blibpath:/opt/freeware/lib/pthread:/opt/freeware/lib64:/opt/freeware/lib:/usr/lib -L/opt/freeware/lib/pthread -L/opt/freeware/lib64 -L/opt/freeware/lib -L/usr/lib -Wl,-blibpath:/opt/freeware/lib/pthread:/opt/freeware/lib64:/opt/freeware/lib:/usr/lib" PY_CPPFLAGS = "-I. -I./Include -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-L/opt/freeware/lib/pthread -L/opt/freeware/lib64 -L/opt/freeware/lib -L/usr/lib -Wl,-blibpath:/opt/freeware/lib/pthread:/opt/freeware/lib64:/opt/freeware/lib:/usr/lib -L/opt/freeware/lib/pthread -L/opt/freeware/lib64 -L/opt/freeware/lib -L/usr/lib -Wl,-blibpath:/opt/freeware/lib/pthread:/opt/freeware/lib64:/opt/freeware/lib:/usr/lib" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -O2 -Wall -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT -I/opt/freeware/include -I/usr/include -DAIX_GENUINE_CPLUSCPLUS -D_ALL_SOURCE -D_LINUX_SOURCE_COMPAT" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = ":" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LIBPATH=/home/buildusr/rpmbuild/BUILD/Python-3.9.18/64bit" SCRIPTDIR = "/opt/freeware/lib64" SETPGRP_HAVE_ARG = "0" SHELL = "/bin/sh" SHLIBS = "/opt/freeware/lib/libintl.a -ldl -lm" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "0" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "8" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "4" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".cpython-39.so" SOABI = "cpython-39" SRCDIRS = "Parser Parser/pegen Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "-I/opt/freeware/include" TCLTK_LIBS = "-L/opt/freeware/lib -ltcl -ltk" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LIBPATH=/home/buildusr/rpmbuild/BUILD/Python-3.9.18/64bit ./python" TESTPYTHONOPTS = "" TESTRUNNER = "LIBPATH=/home/buildusr/rpmbuild/BUILD/Python-3.9.18/64bit ./python ./Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3.9 ./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "1" VERSION = "3.9" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "1" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/home/buildusr/rpmbuild/BUILD/Python-3.9.18/64bit" abs_srcdir = "/home/buildusr/rpmbuild/BUILD/Python-3.9.18/64bit" base = "/opt/freeware" datarootdir = "/opt/freeware/share" exec_prefix = "/opt/freeware" installed_base = "/opt/freeware" installed_platbase = "/opt/freeware" platbase = "/opt/freeware" platlibdir = "lib64" prefix = "/opt/freeware" projectbase = "/opt/freeware/bin" py_version = "3.9.18" py_version_nodot = "39" py_version_short = "3.9" srcdir = "/opt/freeware/lib64/python3.9/config-3.9" userbase = "/home/rsdev/.local" maturin-1.16.0/sysconfig/cpython-android-3.8-aarch64.txt000066400000000000000000000673701527064705700227130ustar00rootroot00000000000000Platform: "linux-aarch64" Python version: "3.8" Current installation scheme: "posix_prefix" Paths: data = "/data/data/com.termux/files/usr" include = "/data/data/com.termux/files/usr/include/python3.8" platinclude = "/data/data/com.termux/files/usr/include/python3.8" platlib = "/data/data/com.termux/files/usr/lib/python3.8/site-packages" platstdlib = "/data/data/com.termux/files/usr/lib/python3.8" purelib = "/data/data/com.termux/files/usr/lib/python3.8/site-packages" scripts = "/data/data/com.termux/files/usr/bin" stdlib = "/data/data/com.termux/files/usr/lib/python3.8" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_GENUINE_CPLUSPLUS = "0" ALT_SOABI = "0" ANDROID_API_LEVEL = "24" AR = "aarch64-linux-android-ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code" BASECPPFLAGS = "-IObjects -IInclude -IPython" BASEMODLIBS = "" BINDIR = "/data/data/com.termux/files/usr/bin" BINLIBDEST = "/data/data/com.termux/files/usr/lib/python3.8" BLDLIBRARY = "-L. -lpython3.8" BLDSHARED = "aarch64-linux-android-clang -shared -L/data/data/com.termux/files/usr/lib -Wl,-rpath=/data/data/com.termux/files/usr/lib -Wl,--enable-new-dtags -Wl,--as-needed -Wl,-z,relro,-z,now -landroid-support -L/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/lib -L/data/data/com.termux/files/usr/lib -Wl,-rpath=/data/data/com.termux/files/usr/lib -Wl,--enable-new-dtags -Wl,--as-needed -Wl,-z,relro,-z,now -landroid-support -L/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/lib" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "x86_64-pc-linux-gnu" BYTESTR_DEPS = "\" CC = "aarch64-linux-android-clang" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fstack-protector-strong -O3 -fstack-protector-strong -O3" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "-fno-strict-aliasing" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "-fstack-protector-strong -O3" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration" CONFIGURE_CPPFLAGS = "-I/data/data/com.termux/files/usr/include -I/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/include" CONFIGURE_LDFLAGS = "-L/data/data/com.termux/files/usr/lib -Wl,-rpath=/data/data/com.termux/files/usr/lib -Wl,--enable-new-dtags -Wl,--as-needed -Wl,-z,relro,-z,now -landroid-support -L/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/lib" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--disable-dependency-tracking' '--prefix=/data/data/com.termux/files/usr' '--libdir=/data/data/com.termux/files/usr/lib' '--disable-rpath' '--disable-rpath-hack' '--host=aarch64-linux-android' 'ac_cv_file__dev_ptmx=yes' 'ac_cv_file__dev_ptc=no' 'ac_cv_func_wcsftime=no' 'ac_cv_func_ftime=no' 'ac_cv_func_faccessat=no' 'ac_cv_func_gethostbyname_r=no' '--build=x86_64-pc-linux-gnu' '--with-system-ffi' '--without-ensurepip' 'ac_cv_func_linkat=no' 'ac_cv_posix_semaphores_enabled=no' 'ac_cv_buggy_getaddrinfo=no' '--enable-loadable-sqlite-extensions' 'ac_cv_little_endian_double=yes' 'ac_cv_func_sem_open=no' 'ac_cv_func_sem_timedwait=no' 'ac_cv_func_sem_getvalue=no' 'ac_cv_func_sem_unlink=no' '--disable-nls' '--enable-shared' '--enable-static' '--libexecdir=/data/data/com.termux/files/usr/libexec' 'build_alias=x86_64-pc-linux-gnu' 'host_alias=aarch64-linux-android' 'CC=aarch64-linux-android-clang' 'CFLAGS= -fstack-protector-strong -O3' 'LDFLAGS=-L/data/data/com.termux/files/usr/lib -Wl,-rpath=/data/data/com.termux/files/usr/lib -Wl,--enable-new-dtags -Wl,--as-needed -Wl,-z,relro,-z,now -landroid-support -L/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/lib' 'CPPFLAGS=-I/data/data/com.termux/files/usr/include -I/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/include' 'CPP=aarch64-linux-android-cpp' 'PKG_CONFIG=/home/builder/.termux-build/_cache/android-r20-api-24-v3/bin/aarch64-linux-android-pkg-config' 'PKG_CONFIG_LIBDIR=/data/data/com.termux/files/usr/lib/pkgconfig'" CONFINCLUDEDIR = "/data/data/com.termux/files/usr/include" CONFINCLUDEPY = "/data/data/com.termux/files/usr/include/python3.8" COREPYTHONPATH = "" COVERAGE_INFO = "/home/builder/.termux-build/python/build/coverage.info" COVERAGE_REPORT = "/home/builder/.termux-build/python/build/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-IObjects -IInclude -IPython -I. -I/home/builder/.termux-build/python/src/Include -I/data/data/com.termux/files/usr/include -I/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/include -I/data/data/com.termux/files/usr/include -I/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/include" CXX = "aarch64-linux-android-clang++" DESTDIRS = "/data/data/com.termux/files/usr /data/data/com.termux/files/usr/lib /data/data/com.termux/files/usr/lib/python3.8 /data/data/com.termux/files/usr/lib/python3.8/lib-dynload" DESTLIB = "/data/data/com.termux/files/usr/lib/python3.8" DESTPATH = "" DESTSHARED = "/data/data/com.termux/files/usr/lib/python3.8/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-38.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GETTIMEOFDAY_NO_TZ = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "1" HAVE_ALLOCA_H = "1" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "1" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "0" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "1" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "0" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_COMPUTED_GOTOS = "0" HAVE_CONFSTR = "0" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "0" HAVE_CRYPT_H = "1" HAVE_CRYPT_R = "0" HAVE_CTERMID = "0" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "0" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "1" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "1" HAVE_EPOLL_CREATE1 = "1" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "0" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "0" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "0" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "0" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "0" HAVE_FUTIMESAT = "0" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "0" HAVE_GCC_ASM_FOR_X87 = "0" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "0" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "1" HAVE_GETHOSTBYNAME_R = "0" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "0" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "0" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "0" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "0" HAVE_GETRANDOM_SYSCALL = "1" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETSID = "1" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETTIMEOFDAY = "1" HAVE_GETWD = "0" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "0" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "0" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "0" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "0" HAVE_LINK = "0" HAVE_LINKAT = "0" HAVE_LINUX_CAN_BCM_H = "1" HAVE_LINUX_CAN_H = "1" HAVE_LINUX_CAN_RAW_FD_FRAMES = "1" HAVE_LINUX_CAN_RAW_H = "1" HAVE_LINUX_MEMFD_H = "1" HAVE_LINUX_NETLINK_H = "1" HAVE_LINUX_QRTR_H = "1" HAVE_LINUX_RANDOM_H = "1" HAVE_LINUX_TIPC_H = "1" HAVE_LINUX_VM_SOCKETS_H = "1" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "0" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "0" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "1" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "1" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "0" HAVE_POSIX_SPAWNP = "0" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "1" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "1" HAVE_PUTENV = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "1" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_GETVALUE = "0" HAVE_SEM_OPEN = "0" HAVE_SEM_TIMEDWAIT = "0" HAVE_SEM_UNLINK = "0" HAVE_SENDFILE = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SHM_OPEN = "0" HAVE_SHM_UNLINK = "0" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "0" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "1" HAVE_SOCKADDR_SA_LEN = "0" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "0" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "0" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "0" HAVE_STRUCT_STAT_ST_GEN = "0" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "1" HAVE_SYS_EPOLL_H = "1" HAVE_SYS_EVENT_H = "0" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "0" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "1" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "1" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "1" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_UNSETENV = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "0" HAVE_UUID_ENC_BE = "0" HAVE_UUID_GENERATE_TIME_SAFE = "1" HAVE_UUID_H = "0" HAVE_UUID_UUID_H = "1" HAVE_WAIT3 = "0" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "0" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "0" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "aarch64-unknown-linux-android" INCLDIRSTOMAKE = "/data/data/com.termux/files/usr/include /data/data/com.termux/files/usr/include /data/data/com.termux/files/usr/include/python3.8 /data/data/com.termux/files/usr/include/python3.8" INCLUDEDIR = "/data/data/com.termux/files/usr/include" INCLUDEPY = "/data/data/com.termux/files/usr/include/python3.8" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "/usr/bin/install -c -m 644" INSTALL_PROGRAM = "/usr/bin/install -c" INSTALL_SCRIPT = "/usr/bin/install -c" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.8.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "aarch64-linux-android-clang++ -shared" LDFLAGS = "-L/data/data/com.termux/files/usr/lib -Wl,-rpath=/data/data/com.termux/files/usr/lib -Wl,--enable-new-dtags -Wl,--as-needed -Wl,-z,relro,-z,now -landroid-support -L/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/lib -L/data/data/com.termux/files/usr/lib -Wl,-rpath=/data/data/com.termux/files/usr/lib -Wl,--enable-new-dtags -Wl,--as-needed -Wl,-z,relro,-z,now -landroid-support -L/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/lib" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.8.so" LDLIBRARYDIR = "" LDSHARED = "aarch64-linux-android-clang -shared -L/data/data/com.termux/files/usr/lib -Wl,-rpath=/data/data/com.termux/files/usr/lib -Wl,--enable-new-dtags -Wl,--as-needed -Wl,-z,relro,-z,now -landroid-support -L/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/lib -L/data/data/com.termux/files/usr/lib -Wl,-rpath=/data/data/com.termux/files/usr/lib -Wl,--enable-new-dtags -Wl,--as-needed -Wl,-z,relro,-z,now -landroid-support -L/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/lib" LDVERSION = "3.8" LIBC = "" LIBDEST = "/data/data/com.termux/files/usr/lib/python3.8" LIBDIR = "/data/data/com.termux/files/usr/lib" LIBFFI_INCLUDEDIR = "/data/data/com.termux/files/usr/include" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/data/data/com.termux/files/usr/lib/pkgconfig" LIBPL = "/data/data/com.termux/files/usr/lib/python3.8/config-3.8" LIBPYTHON = "-lpython3.8" LIBRARY = "libpython3.8.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lcrypt -ldl -lm" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "aarch64-linux-android-clang" LINKFORSHARED = "-pie -Xlinker -export-dynamic" LIPO_32BIT_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "LLVM_PROFILE_FILE="code-%p.profclangr"" LLVM_PROF_MERGER = "/home/builder/.termux-build/_cache/android-r20-api-24-v3/bin/llvm-profdata merge -output=code.profclangd *.profclangr" LN = "ln" LOCALMODLIBS = "" MACHDEP = "linux" MACHDEP_OBJS = "" MACHDESTLIB = "/data/data/com.termux/files/usr/lib/python3.8" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "aarch64-linux-android-clang" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "1" MAKESETUP = "/home/builder/.termux-build/python/src/Modules/makesetup" MANDIR = "/data/data/com.termux/files/usr/share/man" MKDIR_P = "/usr/bin/mkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _symtable xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/hashtable.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "-I/data/data/com.termux/files/usr/include" OPENSSL_LDFLAGS = "-L/data/data/com.termux/files/usr/lib" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG -g -fwrapv -O3 -Wall" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PGO_PROF_GEN_FLAG = "-fprofile-instr-generate" PGO_PROF_USE_FLAG = "-fprofile-instr-use=code.profclangd" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "1" PROFILE_TASK = "-m test --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "0" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "_PYTHON_PROJECT_BASE=/home/builder/.termux-build/python/build _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(shell test -f pybuilddir.txt && echo /home/builder/.termux-build/python/build/`cat pybuilddir.txt`:)/home/builder/.termux-build/python/src/Lib _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata__linux_ python3.8" PYTHON_FOR_REGEN = "python3.8" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fstack-protector-strong -O3 -fstack-protector-strong -O3 -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I/home/builder/.termux-build/python/src/Include/internal -IObjects -IInclude -IPython -I. -I/home/builder/.termux-build/python/src/Include -I/data/data/com.termux/files/usr/include -I/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/include -I/data/data/com.termux/files/usr/include -I/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fstack-protector-strong -O3 -fstack-protector-strong -O3" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I/home/builder/.termux-build/python/src/Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fstack-protector-strong -O3 -fstack-protector-strong -O3 -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I/home/builder/.termux-build/python/src/Include/internal -IObjects -IInclude -IPython -I. -I/home/builder/.termux-build/python/src/Include -I/data/data/com.termux/files/usr/include -I/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/include -I/data/data/com.termux/files/usr/include -I/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-L/data/data/com.termux/files/usr/lib -Wl,-rpath=/data/data/com.termux/files/usr/lib -Wl,--enable-new-dtags -Wl,--as-needed -Wl,-z,relro,-z,now -landroid-support -L/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/lib -L/data/data/com.termux/files/usr/lib -Wl,-rpath=/data/data/com.termux/files/usr/lib -Wl,--enable-new-dtags -Wl,--as-needed -Wl,-z,relro,-z,now -landroid-support -L/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/lib" PY_CPPFLAGS = "-IObjects -IInclude -IPython -I. -I/home/builder/.termux-build/python/src/Include -I/data/data/com.termux/files/usr/include -I/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/include -I/data/data/com.termux/files/usr/include -I/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/include" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-L/data/data/com.termux/files/usr/lib -Wl,-rpath=/data/data/com.termux/files/usr/lib -Wl,--enable-new-dtags -Wl,--as-needed -Wl,-z,relro,-z,now -landroid-support -L/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/lib -L/data/data/com.termux/files/usr/lib -Wl,-rpath=/data/data/com.termux/files/usr/lib -Wl,--enable-new-dtags -Wl,--as-needed -Wl,-z,relro,-z,now -landroid-support -L/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/lib" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fstack-protector-strong -O3 -fstack-protector-strong -O3 -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I/home/builder/.termux-build/python/src/Include/internal -IObjects -IInclude -IPython -I. -I/home/builder/.termux-build/python/src/Include -I/data/data/com.termux/files/usr/include -I/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/include -I/data/data/com.termux/files/usr/include -I/home/builder/.termux-build/_cache/android-r20-api-24-v3/sysroot/usr/include -fPIC" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "aarch64-linux-android-readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "" SCRIPTDIR = "/data/data/com.termux/files/usr/lib" SETPGRP_HAVE_ARG = "0" SGI_ABI = "@SGI_ABI@" SHELL = "/bin/sh" SHLIBS = "-lcrypt -ldl -lm" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "0" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".cpython-38.so" SOABI = "cpython-38" SRCDIRS = "Parser Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "/home/builder/.termux-build/python/src/Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "./python" TESTPYTHONOPTS = "" TESTRUNNER = "./python /home/builder/.termux-build/python/src/Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3.8 /home/builder/.termux-build/python/src/Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.8" VPATH = "/home/builder/.termux-build/python/src" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "0" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/home/builder/.termux-build/python/build" abs_srcdir = "/home/builder/.termux-build/python/src" base = "/data/data/com.termux/files/usr" datarootdir = "/data/data/com.termux/files/usr/share" exec_prefix = "/data/data/com.termux/files/usr" installed_base = "/data/data/com.termux/files/usr" installed_platbase = "/data/data/com.termux/files/usr" platbase = "/data/data/com.termux/files/usr" prefix = "/data/data/com.termux/files/usr" projectbase = "/data/data/com.termux/files/usr/bin" py_version = "3.8.3" py_version_nodot = "38" py_version_short = "3.8" srcdir = "/data/data/com.termux/files/usr/lib/python3.8/config-3.8" userbase = "/data/data/com.termux/files/home/.local" maturin-1.16.0/sysconfig/cpython-dragonfly-3.8.txt000066400000000000000000000526511527064705700220260ustar00rootroot00000000000000Platform: "dragonfly-6.0-RELEASE-x86_64" Python version: "3.8" Current installation scheme: "posix_prefix" Paths: data = "/usr/local" include = "/usr/local/include/python3.8" platinclude = "/usr/local/include/python3.8" platlib = "/usr/local/lib/python3.8/site-packages" platstdlib = "/usr/local/lib/python3.8" purelib = "/usr/local/lib/python3.8/site-packages" scripts = "/usr/local/bin" stdlib = "/usr/local/lib/python3.8" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_GENUINE_CPLUSPLUS = "0" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/local/bin" BINLIBDEST = "/usr/local/lib/python3.8" BLDLIBRARY = "-L. -lpython3.8" BLDSHARED = "cc -pthread -shared -L/usr/local/lib -Wl,-rpath=/usr/local/lib -L/usr/local/lib -Wl,-rpath,/usr/local/lib" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "x86_64-portbld-dragonfly6.0" BYTESTR_DEPS = "\" CC = "cc -pthread" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -pipe -I/usr/local/include -I/usr/local/include/ncurses -O2 -fno-strict-aliasing" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--enable-shared' '--without-ensurepip' '--with-system-ffi' '--without-pydebug' '--with-system-expat' '--enable-ipv6' '--with-system-libmpdec' '--with-pymalloc' '--prefix=/usr/local' '--localstatedir=/var' '--mandir=/usr/local/man' '--infodir=/usr/local/share/info/' '--build=x86_64-portbld-dragonfly6.0' 'build_alias=x86_64-portbld-dragonfly6.0' 'CC=cc' 'CFLAGS=-pipe -I/usr/local/include -I/usr/local/include/ncurses -O2 -fno-strict-aliasing ' 'LDFLAGS= -L/usr/local/lib -Wl,-rpath=/usr/local/lib -L/usr/local/lib -Wl,-rpath,/usr/local/lib ' 'LIBS=-L/usr/local/lib -lintl' 'CPPFLAGS=-I/usr/local/include -I/usr/local/include' 'CPP=cpp' 'PKG_CONFIG=pkgconf'" CONFINCLUDEDIR = "/usr/local/include" CONFINCLUDEPY = "/usr/local/include/python3.8" COREPYTHONPATH = "" COVERAGE_INFO = "/construction/lang/python38/Python-3.8.12/coverage.info" COVERAGE_REPORT = "/construction/lang/python38/Python-3.8.12/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" CXX = "c++ -pthread" DESTDIRS = "/usr/local /usr/local/lib /usr/local/lib/python3.8 /usr/local/lib/python3.8/lib-dynload" DESTLIB = "/usr/local/lib/python3.8" DESTPATH = "" DESTSHARED = "/usr/local/lib/python3.8/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-38.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GETTIMEOFDAY_NO_TZ = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "0" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "1" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_CLOSE_RANGE = "0" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "0" HAVE_CRYPT_H = "0" HAVE_CRYPT_R = "0" HAVE_CTERMID = "1" HAVE_CTERMID_R = "1" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "0" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "1" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "0" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "0" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "0" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "1" HAVE_GCC_ASM_FOR_X87 = "1" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "0" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETSID = "1" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETTIMEOFDAY = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "1" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "1" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "1" HAVE_LCHMOD = "1" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "1" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "0" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "0" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "0" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "0" HAVE_PUTENV = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "1" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "0" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "1" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "1" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "1" HAVE_STRUCT_STAT_ST_GEN = "1" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "1" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENT_H = "1" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "1" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "0" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "0" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_UNSETENV = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "1" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "1" HAVE_UUID_ENC_BE = "1" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_H = "1" HAVE_UUID_UUID_H = "0" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "x86_64-portbld-dragonfly6.0" INCLDIRSTOMAKE = "/usr/local/include /usr/local/include /usr/local/include/python3.8 /usr/local/include/python3.8" INCLUDEDIR = "/usr/local/include" INCLUDEPY = "/usr/local/include/python3.8" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "install -m 0644" INSTALL_PROGRAM = "install -s -m 555" INSTALL_SCRIPT = "install -m 555" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.8.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "c++ -pthread -shared" LDFLAGS = "-L/usr/local/lib -Wl,-rpath=/usr/local/lib -L/usr/local/lib -Wl,-rpath,/usr/local/lib" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.8.so" LDLIBRARYDIR = "" LDSHARED = "cc -pthread -shared -L/usr/local/lib -Wl,-rpath=/usr/local/lib -L/usr/local/lib -Wl,-rpath,/usr/local/lib" LDVERSION = "3.8" LIBC = "" LIBDEST = "/usr/local/lib/python3.8" LIBDIR = "/usr/local/lib" LIBFFI_INCLUDEDIR = "/usr/local/include" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/local/libdata/pkgconfig" LIBPL = "/usr/local/lib/python3.8/config-3.8" LIBPYTHON = "" LIBRARY = "libpython3.8.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lcrypt -lintl -ldl -L/usr/local/lib -lintl -lutil -lm" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "cc -pthread" LINKFORSHARED = "-Wl,--export-dynamic" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "" LN = "ln" LOCALMODLIBS = "" MACHDEP = "dragonfly6" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/local/lib/python3.8" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "cc -pthread" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/local/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _symtable xxsubtype" MODDISABLED_NAMES = "_sqlite3 _tkinter _gdbm" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/hashtable.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "-I/usr/local/include" OPENSSL_LDFLAGS = "-L/usr/local/lib" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PGO_PROF_GEN_FLAG = "" PGO_PROF_USE_FLAG = "" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_REGEN = "python3" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -pipe -I/usr/local/include -I/usr/local/include/ncurses -O2 -fno-strict-aliasing -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -pipe -I/usr/local/include -I/usr/local/include/ncurses -O2 -fno-strict-aliasing" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -pipe -I/usr/local/include -I/usr/local/include/ncurses -O2 -fno-strict-aliasing -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-L/usr/local/lib -Wl,-rpath=/usr/local/lib -L/usr/local/lib -Wl,-rpath,/usr/local/lib" PY_CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-L/usr/local/lib -Wl,-rpath=/usr/local/lib -L/usr/local/lib -Wl,-rpath,/usr/local/lib" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -pipe -I/usr/local/include -I/usr/local/include/ncurses -O2 -fno-strict-aliasing -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/construction/lang/python38/Python-3.8.12" SCRIPTDIR = "/usr/local/lib" SETPGRP_HAVE_ARG = "1" SGI_ABI = "@SGI_ABI@" SHELL = "/bin/sh" SHLIBS = "-lcrypt -lintl -ldl -L/usr/local/lib -lintl -lutil -lm" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "0" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".cpython-38.so" SOABI = "cpython-38" SRCDIRS = "Parser Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/construction/lang/python38/Python-3.8.12 ./python" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/construction/lang/python38/Python-3.8.12 ./python ./Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3 ./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.8" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "1" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/construction/lang/python38/Python-3.8.12" abs_srcdir = "/construction/lang/python38/Python-3.8.12" base = "/usr/local" datarootdir = "/usr/local/share" exec_prefix = "/usr/local" installed_base = "/usr/local" installed_platbase = "/usr/local" platbase = "/usr/local" prefix = "/usr/local" projectbase = "/usr/local/bin" py_version = "3.8.12" py_version_nodot = "38" py_version_short = "3.8" srcdir = "/usr/local/lib/python3.8/config-3.8" userbase = "/root/.local" maturin-1.16.0/sysconfig/cpython-freebsd-11.2.txt000066400000000000000000000457301527064705700215240ustar00rootroot00000000000000Platform: "freebsd-11.2-RELEASE-p9-amd64" Python version: "3.6" Current installation scheme: "posix_prefix" Paths: data = "/usr/local" include = "/usr/local/include/python3.6m" platinclude = "/usr/local/include/python3.6m" platlib = "/usr/local/lib/python3.6/site-packages" platstdlib = "/usr/local/lib/python3.6" purelib = "/usr/local/lib/python3.6/site-packages" scripts = "/usr/local/bin" stdlib = "/usr/local/lib/python3.6" Variables: ABIFLAGS = "m" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_GENUINE_CPLUSPLUS = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rc" BASECFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/local/bin" BINLIBDEST = "/usr/local/lib/python3.6" BLDLIBRARY = "-L. -lpython3.6m" BLDSHARED = "cc -shared -lpthread -L/usr/local/lib -fstack-protector" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "amd64-portbld-freebsd11.2" BYTESTR_DEPS = "\" CC = "cc" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -march=nehalem -fstack-protector -fno-strict-aliasing" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes" CONFIG_ARGS = "'--enable-shared' '--without-ensurepip' '--without-pydebug' '--disable-ipv6' '--with-system-ffi' '--with-pymalloc' '--with-threads' '--prefix=/usr/local' '--localstatedir=/var' '--mandir=/usr/local/man' '--infodir=/usr/local/share/info/' '--build=amd64-portbld-freebsd11.2' 'build_alias=amd64-portbld-freebsd11.2' 'CC=cc' 'CFLAGS=-O2 -pipe -march=nehalem -fstack-protector -fno-strict-aliasing ' 'LDFLAGS= -lpthread -L/usr/local/lib -fstack-protector ' 'LIBS=' 'CPPFLAGS=-I/usr/local/include' 'CPP=cpp' 'PKG_CONFIG=pkgconf'" CONFINCLUDEDIR = "/usr/local/include" CONFINCLUDEPY = "/usr/local/include/python3.6m" COREPYTHONPATH = ":" COVERAGE_INFO = "/wrkdirs/usr/ports/lang/python36/work/Python-3.6.7/coverage.info" COVERAGE_REPORT = "/wrkdirs/usr/ports/lang/python36/work/Python-3.6.7/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include -I/usr/local/include" CXX = "c++" DESTDIRS = "/usr/local /usr/local/lib /usr/local/lib/python3.6 /usr/local/lib/python3.6/lib-dynload" DESTLIB = "/usr/local/lib/python3.6" DESTPATH = "" DESTSHARED = "/usr/local/lib/python3.6/lib-dynload" DFLAGS = "" DIRMODE = "755" DISABLED_EXTENSIONS = "_sqlite3 _tkinter _gdbm" DIST = "README ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "0" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXTRAMACHDEPPATH = "" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".so" FILEMODE = "644" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GETTIMEOFDAY_NO_TZ = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "0" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "0" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "1" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "1" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_CRYPT_H = "0" HAVE_CTERMID = "1" HAVE_CTERMID_R = "1" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "0" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "0" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "0" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FEXECVE = "1" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "0" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "1" HAVE_GCC_ASM_FOR_X87 = "1" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "0" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETRANDOM = "0" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETSID = "1" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETTIMEOFDAY = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "1" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "1" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "1" HAVE_LCHMOD = "1" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "0" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "1" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMMOVE = "1" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "0" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_PREAD = "1" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_ATFORK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "0" HAVE_PUTENV = "1" HAVE_PWRITE = "1" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CALLBACK = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "0" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SELECT = "1" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "1" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "1" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "0" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "1" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "1" HAVE_STRUCT_STAT_ST_GEN = "1" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "1" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENT_H = "1" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "1" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "0" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "0" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_UNSETENV = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "amd64-portbld-freebsd11.2" INCLDIRSTOMAKE = "/usr/local/include /usr/local/include /usr/local/include/python3.6m /usr/local/include/python3.6m" INCLUDEDIR = "/usr/local/include" INCLUDEPY = "/usr/local/include/python3.6m" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "install -m 0644" INSTALL_PROGRAM = "install -s -m 555" INSTALL_SCRIPT = "install -m 555" INSTALL_SHARED = "/usr/bin/install -c -m 555" INSTSONAME = "libpython3.6m.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "c++ -shared" LDFLAGS = "-lpthread -L/usr/local/lib -fstack-protector" LDLAST = "" LDLIBRARY = "libpython3.6m.so" LDLIBRARYDIR = "" LDSHARED = "cc -shared -lpthread -L/usr/local/lib -fstack-protector" LDVERSION = "3.6m" LIBC = "" LIBDEST = "/usr/local/lib/python3.6" LIBDIR = "/usr/local/lib" LIBFFI_INCLUDEDIR = "/usr/local/lib/libffi-3.2.1/include" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/local/libdata/pkgconfig" LIBPL = "/usr/local/lib/python3.6/config-3.6m" LIBRARY = "libpython3.6m.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-ldl -lutil" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "cc" LINKFORSHARED = "-Wl,--export-dynamic" LIPO_32BIT_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "" LN = "ln" LOCALMODLIBS = "" LOG1P_DROPS_ZERO_SIGN = "0" MACHDEP = "freebsd11" MACHDEPPATH = ":" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/local/lib/python3.6" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "cc" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/local/man" MKDIR_P = "/bin/mkdir -p" MODLIBS = "" MODNAMES = "_thread posix errno pwd _sre _codecs _weakref _functools _operator _collections itertools atexit _signal _stat time _locale _io zipimport faulthandler _tracemalloc _symtable xxsubtype" MODOBJS = "Modules/_threadmodule.o Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/zipimport.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/hashtable.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPT = "-DNDEBUG" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PGEN = "Parser/pgen" PGENOBJS = "\ \" PGOBJS = "\" PGO_PROF_GEN_FLAG = "" PGO_PROF_USE_FLAG = "" PLATDIR = "" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test.regrtest --pgo" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = ":" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_REGEN = "python3" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -march=nehalem -fstack-protector -fno-strict-aliasing" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -march=nehalem -fstack-protector -fno-strict-aliasing -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -I. -I./Include -I/usr/local/include -fPIC -DPy_BUILD_CORE" PY_CPPFLAGS = "-I. -I./Include -I/usr/local/include" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-lpthread -L/usr/local/lib -fstack-protector" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" RANLIB = "ranlib" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python36/work/Python-3.6.7" SCRIPTDIR = "/usr/local/lib" SETPGRP_HAVE_ARG = "1" SGI_ABI = "" SHELL = "/bin/sh" SHLIBS = "-ldl -lutil" SHLIB_SUFFIX = ".so" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".so" SOABI = "cpython-36m" SRCDIRS = "Parser Objects Python Modules Programs" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TANH_PRESERVES_ZERO_SIGN = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python36/work/Python-3.6.7 ./python" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python36/work/Python-3.6.7 ./python ./Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" THREADOBJ = "Python/thread.o" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3 ./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" USE_INLINE = "1" VERSION = "3.6" WANT_SIGFPE_HANDLER = "0" WINDOW_HAS_FLAGS = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "0" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_THREAD = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "m" abs_builddir = "/wrkdirs/usr/ports/lang/python36/work/Python-3.6.7" abs_srcdir = "/wrkdirs/usr/ports/lang/python36/work/Python-3.6.7" base = "/usr/local" datarootdir = "/usr/local/share" exec_prefix = "/usr/local" installed_base = "/usr/local" installed_platbase = "/usr/local" platbase = "/usr/local" prefix = "/usr/local" projectbase = "/usr/local/bin" py_version = "3.6.7" py_version_nodot = "36" py_version_short = "3.6" srcdir = "/usr/local/lib/python3.6/config-3.6m" userbase = "/home/ashorin/.local" maturin-1.16.0/sysconfig/cpython-freebsd-13.0-aarch64.txt000066400000000000000000000625331527064705700227520ustar00rootroot00000000000000Platform: "freebsd-13.0-RELEASE-arm64" Python version: "3.7" Current installation scheme: "posix_prefix" Paths: data = "/usr/local" include = "/usr/local/include/python3.7m" platinclude = "/usr/local/include/python3.7m" platlib = "/usr/local/lib/python3.7/site-packages" platstdlib = "/usr/local/lib/python3.7" purelib = "/usr/local/lib/python3.7/site-packages" scripts = "/usr/local/bin" stdlib = "/usr/local/lib/python3.7" Variables: ABIFLAGS = "m" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_GENUINE_CPLUSPLUS = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/local/bin" BINLIBDEST = "/usr/local/lib/python3.7" BLDLIBRARY = "-L. -lpython3.7m" BLDSHARED = "cc -pthread -shared -L/usr/local/lib -fstack-protector-strong" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "aarch64-portbld-freebsd13.0" BYTESTR_DEPS = "\" CC = "cc -pthread" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--enable-shared' '--without-ensurepip' '--with-system-ffi' '--without-pydebug' '--enable-ipv6' '--with-pymalloc' '--prefix=/usr/local' '--localstatedir=/var' '--mandir=/usr/local/man' '--infodir=/usr/local/share/info/' '--build=aarch64-portbld-freebsd13.0' 'build_alias=aarch64-portbld-freebsd13.0' 'CC=cc' 'CFLAGS=-O2 -pipe -fstack-protector-strong -fno-strict-aliasing ' 'LDFLAGS= -L/usr/local/lib -fstack-protector-strong ' 'LIBS=-L/usr/local/lib -lintl' 'CPPFLAGS=-I/usr/local/include -I/usr/local/include' 'CPP=cpp' 'PKG_CONFIG=pkgconf'" CONFINCLUDEDIR = "/usr/local/include" CONFINCLUDEPY = "/usr/local/include/python3.7m" COREPYTHONPATH = "" COVERAGE_INFO = "/wrkdirs/usr/ports/lang/python37/work/Python-3.7.10/coverage.info" COVERAGE_REPORT = "/wrkdirs/usr/ports/lang/python37/work/Python-3.7.10/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" CXX = "c++ -pthread" DESTDIRS = "/usr/local /usr/local/lib /usr/local/lib/python3.7 /usr/local/lib/python3.7/lib-dynload" DESTLIB = "/usr/local/lib/python3.7" DESTPATH = "" DESTSHARED = "/usr/local/lib/python3.7/lib-dynload" DFLAGS = "" DIRMODE = "755" DISABLED_EXTENSIONS = "_sqlite3 _tkinter _gdbm" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".so" FILEMODE = "644" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GETTIMEOFDAY_NO_TZ = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "0" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "1" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "1" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_CLOSE_RANGE = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_CRYPT_H = "0" HAVE_CRYPT_R = "0" HAVE_CTERMID = "1" HAVE_CTERMID_R = "1" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "0" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "0" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "0" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "0" HAVE_GCC_ASM_FOR_X87 = "0" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETSID = "1" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETTIMEOFDAY = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "1" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "1" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "1" HAVE_LCHMOD = "1" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "1" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "0" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "0" HAVE_PUTENV = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "0" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "1" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "1" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "0" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "1" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "1" HAVE_STRUCT_STAT_ST_GEN = "1" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "1" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENT_H = "1" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "1" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "0" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "0" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_UNSETENV = "1" HAVE_USABLE_WCHAR_T = "1" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "1" HAVE_UUID_ENC_BE = "1" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_H = "1" HAVE_UUID_UUID_H = "0" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "aarch64-portbld-freebsd13.0" INCLDIRSTOMAKE = "/usr/local/include /usr/local/include /usr/local/include/python3.7m /usr/local/include/python3.7m" INCLUDEDIR = "/usr/local/include" INCLUDEPY = "/usr/local/include/python3.7m" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "install -m 0644" INSTALL_PROGRAM = "install -s -m 555" INSTALL_SCRIPT = "install -m 555" INSTALL_SHARED = "/usr/bin/install -c -m 555" INSTSONAME = "libpython3.7m.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "c++ -pthread -shared" LDFLAGS = "-L/usr/local/lib -fstack-protector-strong" LDFLAGS_NODIST = "" LDLAST = "" LDLIBRARY = "libpython3.7m.so" LDLIBRARYDIR = "" LDSHARED = "cc -pthread -shared -L/usr/local/lib -fstack-protector-strong" LDVERSION = "3.7m" LIBC = "" LIBDEST = "/usr/local/lib/python3.7" LIBDIR = "/usr/local/lib" LIBFFI_INCLUDEDIR = "/usr/local/include" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/local/libdata/pkgconfig" LIBPL = "/usr/local/lib/python3.7/config-3.7m" LIBRARY = "libpython3.7m.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lcrypt -lintl -ldl -L/usr/local/lib -lintl -lutil" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "cc -pthread" LINKFORSHARED = "-Wl,--export-dynamic" LIPO_32BIT_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "" LN = "ln" LOCALMODLIBS = "" LOG1P_DROPS_ZERO_SIGN = "0" MACHDEP = "freebsd13" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/local/lib/python3.7" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "cc -pthread" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/local/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io zipimport faulthandler _tracemalloc _symtable xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/zipimport.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/hashtable.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "-I/usr/include" OPENSSL_LDFLAGS = "-L/usr/lib" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PGEN = "Parser/pgen" PGENOBJS = "\ \" PGOBJS = "\" PGO_PROF_GEN_FLAG = "" PGO_PROF_USE_FLAG = "" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test.regrtest --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_REGEN = "python3" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-L/usr/local/lib -fstack-protector-strong" PY_CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-L/usr/local/lib -fstack-protector-strong" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python37/work/Python-3.7.10" SCRIPTDIR = "/usr/local/lib" SETPGRP_HAVE_ARG = "1" SGI_ABI = "@SGI_ABI@" SHELL = "/bin/sh" SHLIBS = "-lcrypt -lintl -ldl -L/usr/local/lib -lintl -lutil" SHLIB_SUFFIX = ".so" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".so" SOABI = "cpython-37m" SRCDIRS = "Parser Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TANH_PRESERVES_ZERO_SIGN = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python37/work/Python-3.7.10 ./python" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python37/work/Python-3.7.10 ./python ./Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3 ./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.7" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "1" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "m" abs_builddir = "/wrkdirs/usr/ports/lang/python37/work/Python-3.7.10" abs_srcdir = "/wrkdirs/usr/ports/lang/python37/work/Python-3.7.10" base = "/usr/local" datarootdir = "/usr/local/share" exec_prefix = "/usr/local" installed_base = "/usr/local" installed_platbase = "/usr/local" platbase = "/usr/local" prefix = "/usr/local" projectbase = "/usr/local/bin" py_version = "3.7.10" py_version_nodot = "37" py_version_short = "3.7" srcdir = "/usr/local/lib/python3.7/config-3.7m" userbase = "/root/.local"maturin-1.16.0/sysconfig/cpython-freebsd-13.0-powerpc64.txt000066400000000000000000000524431527064705700233520ustar00rootroot00000000000000Platform: "freebsd-13.0-RELEASE-p4-powerpc" Python version: "3.8" Current installation scheme: "posix_prefix" Paths: data = "/usr/local" include = "/usr/local/include/python3.8" platinclude = "/usr/local/include/python3.8" platlib = "/usr/local/lib/python3.8/site-packages" platstdlib = "/usr/local/lib/python3.8" purelib = "/usr/local/lib/python3.8/site-packages" scripts = "/usr/local/bin" stdlib = "/usr/local/lib/python3.8" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_GENUINE_CPLUSPLUS = "0" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/local/bin" BINLIBDEST = "/usr/local/lib/python3.8" BLDLIBRARY = "-L. -lpython3.8" BLDSHARED = "cc -pthread -shared -L/usr/local/lib -fstack-protector-strong" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "powerpc64-portbld-freebsd13.0" BYTESTR_DEPS = "\" CC = "cc -pthread" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--enable-shared' '--without-ensurepip' '--with-system-ffi' '--without-pydebug' '--enable-ipv6' '--with-system-libmpdec' '--with-pymalloc' '--prefix=/usr/local' '--localstatedir=/var' '--mandir=/usr/local/man' '--infodir=/usr/local/share/info/' '--build=powerpc64-portbld-freebsd13.0' 'build_alias=powerpc64-portbld-freebsd13.0' 'CC=cc' 'CFLAGS=-O2 -pipe -fstack-protector-strong -fno-strict-aliasing ' 'LDFLAGS= -L/usr/local/lib -fstack-protector-strong ' 'LIBS=-L/usr/local/lib -lintl' 'CPPFLAGS=-I/usr/local/include -I/usr/local/include' 'CPP=cpp' 'PKG_CONFIG=pkgconf'" CONFINCLUDEDIR = "/usr/local/include" CONFINCLUDEPY = "/usr/local/include/python3.8" COREPYTHONPATH = "" COVERAGE_INFO = "/wrkdirs/usr/ports/lang/python38/work/Python-3.8.12/coverage.info" COVERAGE_REPORT = "/wrkdirs/usr/ports/lang/python38/work/Python-3.8.12/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" CXX = "c++ -pthread" DESTDIRS = "/usr/local /usr/local/lib /usr/local/lib/python3.8 /usr/local/lib/python3.8/lib-dynload" DESTLIB = "/usr/local/lib/python3.8" DESTPATH = "" DESTSHARED = "/usr/local/lib/python3.8/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "1" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "0" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-38.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "1" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GETTIMEOFDAY_NO_TZ = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "0" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "1" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "1" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_CLOSE_RANGE = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "1" HAVE_CRYPT_H = "0" HAVE_CRYPT_R = "0" HAVE_CTERMID = "1" HAVE_CTERMID_R = "1" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "0" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "0" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "0" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "0" HAVE_GCC_ASM_FOR_X87 = "0" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETSID = "1" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETTIMEOFDAY = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "1" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "1" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "1" HAVE_LCHMOD = "1" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "1" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "1" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "0" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "0" HAVE_PUTENV = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "0" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "1" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "1" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "1" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "1" HAVE_STRUCT_STAT_ST_GEN = "1" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "1" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENT_H = "1" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "1" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "0" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "0" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_UNSETENV = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "1" HAVE_UUID_ENC_BE = "1" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_H = "1" HAVE_UUID_UUID_H = "0" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "powerpc64-portbld-freebsd13.0" INCLDIRSTOMAKE = "/usr/local/include /usr/local/include /usr/local/include/python3.8 /usr/local/include/python3.8" INCLUDEDIR = "/usr/local/include" INCLUDEPY = "/usr/local/include/python3.8" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "install -m 0644" INSTALL_PROGRAM = "install -s -m 555" INSTALL_SCRIPT = "install -m 555" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.8.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "c++ -pthread -shared" LDFLAGS = "-L/usr/local/lib -fstack-protector-strong" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.8.so" LDLIBRARYDIR = "" LDSHARED = "cc -pthread -shared -L/usr/local/lib -fstack-protector-strong" LDVERSION = "3.8" LIBC = "" LIBDEST = "/usr/local/lib/python3.8" LIBDIR = "/usr/local/lib" LIBFFI_INCLUDEDIR = "/usr/local/include" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/local/libdata/pkgconfig" LIBPL = "/usr/local/lib/python3.8/config-3.8" LIBPYTHON = "" LIBRARY = "libpython3.8.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lcrypt -lintl -ldl -L/usr/local/lib -lintl -lutil -lm" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "cc -pthread" LINKFORSHARED = "-Wl,--export-dynamic" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "" LN = "ln" LOCALMODLIBS = "" MACHDEP = "freebsd13" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/local/lib/python3.8" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "cc -pthread" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/local/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _symtable xxsubtype" MODDISABLED_NAMES = "_sqlite3 _tkinter _gdbm" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/hashtable.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "-I/usr/include" OPENSSL_LDFLAGS = "-L/usr/lib" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PGO_PROF_GEN_FLAG = "" PGO_PROF_USE_FLAG = "" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_REGEN = "python3" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-L/usr/local/lib -fstack-protector-strong" PY_CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-L/usr/local/lib -fstack-protector-strong" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python38/work/Python-3.8.12" SCRIPTDIR = "/usr/local/lib" SETPGRP_HAVE_ARG = "1" SGI_ABI = "@SGI_ABI@" SHELL = "/bin/sh" SHLIBS = "-lcrypt -lintl -ldl -L/usr/local/lib -lintl -lutil -lm" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "0" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "8" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".cpython-38.so" SOABI = "cpython-38" SRCDIRS = "Parser Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python38/work/Python-3.8.12 ./python" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python38/work/Python-3.8.12 ./python ./Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3 ./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.8" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "1" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/wrkdirs/usr/ports/lang/python38/work/Python-3.8.12" abs_srcdir = "/wrkdirs/usr/ports/lang/python38/work/Python-3.8.12" base = "/usr/local" datarootdir = "/usr/local/share" exec_prefix = "/usr/local" installed_base = "/usr/local" installed_platbase = "/usr/local" platbase = "/usr/local" prefix = "/usr/local" projectbase = "/usr/local/bin" py_version = "3.8.12" py_version_nodot = "38" py_version_short = "3.8" srcdir = "/usr/local/lib/python3.8/config-3.8" userbase = "/home/pkubaj/.local" maturin-1.16.0/sysconfig/cpython-freebsd-13.0-powerpc64le.txt000066400000000000000000000524531527064705700236740ustar00rootroot00000000000000Platform: "freebsd-13.0-RELEASE-p4-powerpc" Python version: "3.8" Current installation scheme: "posix_prefix" Paths: data = "/usr/local" include = "/usr/local/include/python3.8" platinclude = "/usr/local/include/python3.8" platlib = "/usr/local/lib/python3.8/site-packages" platstdlib = "/usr/local/lib/python3.8" purelib = "/usr/local/lib/python3.8/site-packages" scripts = "/usr/local/bin" stdlib = "/usr/local/lib/python3.8" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_GENUINE_CPLUSPLUS = "0" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/local/bin" BINLIBDEST = "/usr/local/lib/python3.8" BLDLIBRARY = "-L. -lpython3.8" BLDSHARED = "cc -pthread -shared -L/usr/local/lib -fstack-protector-strong" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "powerpc64le-portbld-freebsd13.0" BYTESTR_DEPS = "\" CC = "cc -pthread" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--enable-shared' '--without-ensurepip' '--with-system-ffi' '--without-pydebug' '--enable-ipv6' '--with-system-libmpdec' '--with-pymalloc' '--prefix=/usr/local' '--localstatedir=/var' '--mandir=/usr/local/man' '--infodir=/usr/local/share/info/' '--build=powerpc64le-portbld-freebsd13.0' 'build_alias=powerpc64le-portbld-freebsd13.0' 'CC=cc' 'CFLAGS=-O2 -pipe -fstack-protector-strong -fno-strict-aliasing ' 'LDFLAGS= -L/usr/local/lib -fstack-protector-strong ' 'LIBS=-L/usr/local/lib -lintl' 'CPPFLAGS=-I/usr/local/include -I/usr/local/include' 'CPP=cpp' 'PKG_CONFIG=pkgconf'" CONFINCLUDEDIR = "/usr/local/include" CONFINCLUDEPY = "/usr/local/include/python3.8" COREPYTHONPATH = "" COVERAGE_INFO = "/wrkdirs/usr/ports/lang/python38/work/Python-3.8.12/coverage.info" COVERAGE_REPORT = "/wrkdirs/usr/ports/lang/python38/work/Python-3.8.12/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" CXX = "c++ -pthread" DESTDIRS = "/usr/local /usr/local/lib /usr/local/lib/python3.8 /usr/local/lib/python3.8/lib-dynload" DESTLIB = "/usr/local/lib/python3.8" DESTPATH = "" DESTSHARED = "/usr/local/lib/python3.8/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-38.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GETTIMEOFDAY_NO_TZ = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "0" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "1" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "1" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_CLOSE_RANGE = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "1" HAVE_CRYPT_H = "0" HAVE_CRYPT_R = "0" HAVE_CTERMID = "1" HAVE_CTERMID_R = "1" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "0" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "0" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "0" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "0" HAVE_GCC_ASM_FOR_X87 = "0" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETSID = "1" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETTIMEOFDAY = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "1" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "1" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "1" HAVE_LCHMOD = "1" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "1" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "1" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "0" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "0" HAVE_PUTENV = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "0" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "1" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "1" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "1" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "1" HAVE_STRUCT_STAT_ST_GEN = "1" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "1" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENT_H = "1" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "1" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "0" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "0" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_UNSETENV = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "1" HAVE_UUID_ENC_BE = "1" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_H = "1" HAVE_UUID_UUID_H = "0" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "powerpc64le-portbld-freebsd13.0" INCLDIRSTOMAKE = "/usr/local/include /usr/local/include /usr/local/include/python3.8 /usr/local/include/python3.8" INCLUDEDIR = "/usr/local/include" INCLUDEPY = "/usr/local/include/python3.8" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "install -m 0644" INSTALL_PROGRAM = "install -s -m 555" INSTALL_SCRIPT = "install -m 555" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.8.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "c++ -pthread -shared" LDFLAGS = "-L/usr/local/lib -fstack-protector-strong" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.8.so" LDLIBRARYDIR = "" LDSHARED = "cc -pthread -shared -L/usr/local/lib -fstack-protector-strong" LDVERSION = "3.8" LIBC = "" LIBDEST = "/usr/local/lib/python3.8" LIBDIR = "/usr/local/lib" LIBFFI_INCLUDEDIR = "/usr/local/include" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/local/libdata/pkgconfig" LIBPL = "/usr/local/lib/python3.8/config-3.8" LIBPYTHON = "" LIBRARY = "libpython3.8.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lcrypt -lintl -ldl -L/usr/local/lib -lintl -lutil -lm" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "cc -pthread" LINKFORSHARED = "-Wl,--export-dynamic" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "" LN = "ln" LOCALMODLIBS = "" MACHDEP = "freebsd13" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/local/lib/python3.8" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "cc -pthread" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/local/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _symtable xxsubtype" MODDISABLED_NAMES = "_sqlite3 _tkinter _gdbm" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/hashtable.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "-I/usr/include" OPENSSL_LDFLAGS = "-L/usr/lib" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PGO_PROF_GEN_FLAG = "" PGO_PROF_USE_FLAG = "" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_REGEN = "python3" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-L/usr/local/lib -fstack-protector-strong" PY_CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-L/usr/local/lib -fstack-protector-strong" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python38/work/Python-3.8.12" SCRIPTDIR = "/usr/local/lib" SETPGRP_HAVE_ARG = "1" SGI_ABI = "@SGI_ABI@" SHELL = "/bin/sh" SHLIBS = "-lcrypt -lintl -ldl -L/usr/local/lib -lintl -lutil -lm" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "0" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "8" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".cpython-38.so" SOABI = "cpython-38" SRCDIRS = "Parser Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python38/work/Python-3.8.12 ./python" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python38/work/Python-3.8.12 ./python ./Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3 ./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.8" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "1" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/wrkdirs/usr/ports/lang/python38/work/Python-3.8.12" abs_srcdir = "/wrkdirs/usr/ports/lang/python38/work/Python-3.8.12" base = "/usr/local" datarootdir = "/usr/local/share" exec_prefix = "/usr/local" installed_base = "/usr/local" installed_platbase = "/usr/local" platbase = "/usr/local" prefix = "/usr/local" projectbase = "/usr/local/bin" py_version = "3.8.12" py_version_nodot = "38" py_version_short = "3.8" srcdir = "/usr/local/lib/python3.8/config-3.8" userbase = "/home/pkubaj/.local" maturin-1.16.0/sysconfig/cpython-freebsd-13.1-armv7.txt000066400000000000000000000773461527064705700225670ustar00rootroot00000000000000Platform: "freebsd-13.1-RELEASE-arm" Python version: "3.11" Current installation scheme: "posix_prefix" Paths: data = "/usr/local" include = "/usr/local/include/python3.11" platinclude = "/usr/local/include/python3.11" platlib = "/usr/local/lib/python3.11/site-packages" platstdlib = "/usr/local/lib/python3.11" purelib = "/usr/local/lib/python3.11/site-packages" scripts = "/usr/local/bin" stdlib = "/usr/local/lib/python3.11" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "0" AIX_GENUINE_CPLUSPLUS = "0" ALIGNOF_LONG = "4" ALIGNOF_SIZE_T = "4" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "/usr/bin/llvm-ar" ARFLAGS = "rcs" BASECFLAGS = "-Wsign-compare -Wunreachable-code" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/local/bin" BINLIBDEST = "/usr/local/lib/python3.11" BLDLIBRARY = "-L. -lpython3.11" BLDSHARED = "cc -pthread -shared -L/usr/local/lib -fstack-protector-strong" BOOTSTRAP_HEADERS = "\" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "armv7-portbld-freebsd13.1" BYTESTR_DEPS = "\" CC = "cc -pthread" CCSHARED = "-fPIC" CFLAGS = "-Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS_NODIST = "-flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden" CONFIGURE_LDFLAGS_NODIST = "-flto=thin -g" CONFIGURE_LDFLAGS_NOLTO = "-fno-lto" CONFIG_ARGS = "'--enable-shared' '--without-ensurepip' '--with-system-ffi' '--without-pydebug' '--enable-ipv6' '--with-system-libmpdec' '--with-lto=thin' '--with-pymalloc' '--prefix=/usr/local' '--localstatedir=/var' '--mandir=/usr/local/man' '--infodir=/usr/local/share/info/' '--build=armv7-portbld-freebsd13.1' 'build_alias=armv7-portbld-freebsd13.1' 'PKG_CONFIG=pkgconf' 'PKG_CONFIG_LIBDIR=/wrkdirs/usr/ports/lang/python311/work/.pkgconfig:/usr/local/libdata/pkgconfig:/usr/local/share/pkgconfig:/usr/libdata/pkgconfig' 'CC=cc' 'CFLAGS=-O2 -pipe -fstack-protector-strong -fno-strict-aliasing ' 'LDFLAGS= -L/usr/local/lib -fstack-protector-strong ' 'LIBS=-L/usr/local/lib -lintl' 'CPPFLAGS=-I/usr/local/include -I/usr/local/include' 'CPP=cpp'" CONFINCLUDEDIR = "/usr/local/include" CONFINCLUDEPY = "/usr/local/include/python3.11" COREPYTHONPATH = "" COVERAGE_INFO = "/wrkdirs/usr/ports/lang/python311/work/Python-3.11.0/coverage.info" COVERAGE_LCOV_OPTIONS = "--rc lcov_branch_coverage=1" COVERAGE_REPORT = "/wrkdirs/usr/ports/lang/python311/work/Python-3.11.0/lcov-report" COVERAGE_REPORT_OPTIONS = "--rc lcov_branch_coverage=1 --branch-coverage --title "CPython 3.11 LCOV report [commit $(shell )]"" CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" CXX = "c++ -pthread" DECIMAL_CFLAGS = "-DCONFIG_32=1 -DANSI=1" DECIMAL_LDFLAGS = "-lmpdec" DEEPFREEZE_DEPS = "./Tools/scripts/deepfreeze.py _bootstrap_python ./Programs/_freeze_module.py \" DEEPFREEZE_OBJS = "Python/deepfreeze/deepfreeze.o" DESTDIRS = "/usr/local /usr/local/lib /usr/local/lib/python3.11 /usr/local/lib/python3.11/lib-dynload" DESTLIB = "/usr/local/lib/python3.11" DESTPATH = "" DESTSHARED = "/usr/local/lib/python3.11/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXPAT_CFLAGS = "-I./Modules/expat" EXPAT_LDFLAGS = "-lm Modules/expat/libexpat.a" EXPORTSFROM = "" EXPORTSYMS = "" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-311.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FREEZE_MODULE = "./_bootstrap_python ./Programs/_freeze_module.py" FREEZE_MODULE_BOOTSTRAP = "./Programs/_freeze_module" FREEZE_MODULE_BOOTSTRAP_DEPS = "Programs/_freeze_module" FREEZE_MODULE_DEPS = "_bootstrap_python ./Programs/_freeze_module.py" FROZEN_FILES_IN = "\" FROZEN_FILES_OUT = "\" GETPGRP_HAVE_ARG = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT = "1" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "0" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "1" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "1" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_BZLIB_H = "1" HAVE_CHFLAGS = "1" HAVE_CHMOD = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_NANOSLEEP = "1" HAVE_CLOCK_SETTIME = "1" HAVE_CLOSE_RANGE = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_CONNECT = "1" HAVE_COPY_FILE_RANGE = "1" HAVE_CRYPT_H = "0" HAVE_CRYPT_R = "1" HAVE_CTERMID = "1" HAVE_CTERMID_R = "1" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DB_H = "1" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "0" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "0" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EVENTFD = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORK1 = "0" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "0" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "0" HAVE_GCC_ASM_FOR_X87 = "0" HAVE_GCC_UINT128_T = "0" HAVE_GDBM_DASH_NDBM_H = "0" HAVE_GDBM_H = "0" HAVE_GDBM_NDBM_H = "0" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETEGID = "1" HAVE_GETENTROPY = "1" HAVE_GETEUID = "1" HAVE_GETGID = "1" HAVE_GETGRGID = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYADDR = "1" HAVE_GETHOSTBYNAME = "1" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETHOSTNAME = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPROTOBYNAME = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETRUSAGE = "1" HAVE_GETSERVBYNAME = "1" HAVE_GETSERVBYPORT = "1" HAVE_GETSID = "1" HAVE_GETSOCKNAME = "1" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETUID = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_IEEEFP_H = "1" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_NTOA = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "1" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "1" HAVE_LCHFLAGS = "1" HAVE_LCHMOD = "1" HAVE_LCHOWN = "1" HAVE_LIBB2 = "0" HAVE_LIBDB = "0" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBGDBM_COMPAT = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBNDBM = "0" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBSQLITE3 = "0" HAVE_LIBUTIL_H = "1" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_AUXVEC_H = "0" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_J1939_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_SOUNDCARD_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LINUX_WAIT_H = "0" HAVE_LISTEN = "1" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LOGIN_TTY = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_LZMA_H = "0" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "1" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "0" HAVE_NANOSLEEP = "1" HAVE_NCURSES_H = "1" HAVE_NDBM_H = "1" HAVE_NDIR_H = "0" HAVE_NETCAN_CAN_H = "0" HAVE_NETDB_H = "1" HAVE_NETINET_IN_H = "1" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION = "0" HAVE_OPENAT = "1" HAVE_OPENDIR = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTHREAD_STUBS = "0" HAVE_PTY_H = "0" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RECVFROM = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_RPC_RPC_H = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "1" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_CLOCKWAIT = "0" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SENDTO = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETJMP_H = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETSOCKOPT = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SHUTDOWN = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "1" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKET = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SPLICE = "0" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "1" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "1" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "1" HAVE_STRUCT_STAT_ST_GEN = "1" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYSLOG_H = "1" HAVE_SYSTEM = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_AUXV_H = "1" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "1" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENTFD_H = "1" HAVE_SYS_EVENT_H = "1" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "1" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_SOUNDCARD_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "0" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "0" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TTYNAME = "1" HAVE_TZNAME = "0" HAVE_UMASK = "1" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_USABLE_WCHAR_T = "1" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UTMP_H = "0" HAVE_UUID_CREATE = "1" HAVE_UUID_ENC_BE = "1" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_H = "1" HAVE_UUID_UUID_H = "0" HAVE_VFORK = "1" HAVE_WAIT = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_ZLIB_COPY = "1" HAVE_ZLIB_H = "0" HAVE__GETPTY = "0" HOSTRUNNER = "" HOST_GNU_TYPE = "armv7-portbld-freebsd13.1" INCLDIRSTOMAKE = "/usr/local/include /usr/local/include /usr/local/include/python3.11 /usr/local/include/python3.11" INCLUDEDIR = "/usr/local/include" INCLUDEPY = "/usr/local/include/python3.11" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "install -m 0644" INSTALL_PROGRAM = "install -s -m 555" INSTALL_SCRIPT = "install -m 555" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.11.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "c++ -pthread -shared" LDFLAGS = "-L/usr/local/lib -fstack-protector-strong" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.11.so" LDLIBRARYDIR = "" LDSHARED = "cc -pthread -shared -L/usr/local/lib -fstack-protector-strong" LDVERSION = "3.11" LIBC = "" LIBDEST = "/usr/local/lib/python3.11" LIBDIR = "/usr/local/lib" LIBEXPAT_A = "Modules/expat/libexpat.a" LIBEXPAT_CFLAGS = "-I./Modules/expat -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -fPIC" LIBEXPAT_HEADERS = "\" LIBEXPAT_OBJS = "\" LIBFFI_INCLUDEDIR = "/usr/local/include" LIBM = "-lm" LIBMPDEC_A = "Modules/_decimal/libmpdec/libmpdec.a" LIBMPDEC_CFLAGS = "-DCONFIG_32=1 -DANSI=1 -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -fPIC" LIBMPDEC_HEADERS = "\" LIBMPDEC_OBJS = "\" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/local/libdata/pkgconfig" LIBPL = "/usr/local/lib/python3.11/config-3.11" LIBPYTHON = "" LIBRARY = "libpython3.11.a" LIBRARY_DEPS = "libpython3.11.a libpython3.11.so libpython3.so" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lintl -ldl -L/usr/local/lib -lintl -lutil" LIBSUBDIRS = "asyncio \" LINKCC = "cc -pthread" LINKFORSHARED = "-Wl,--export-dynamic" LINK_PYTHON_DEPS = "libpython3.11.a libpython3.11.so libpython3.so" LINK_PYTHON_OBJS = "-L. -lpython3.11" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "" LN = "ln" LOCALMODLIBS = "" MACHDEP = "freebsd13" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/local/lib/python3.11" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "cc -pthread" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/local/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "atexit faulthandler posix _signal _tracemalloc _codecs _collections errno _io itertools _sre _thread time _weakref _abc _functools _locale _operator _stat _symtable pwd xxsubtype" MODDISABLED_NAMES = "_sqlite3 _tkinter _gdbm" MODLIBS = "" MODOBJS = "Modules/atexitmodule.o Modules/faulthandler.o Modules/posixmodule.o Modules/signalmodule.o Modules/_tracemalloc.o Modules/_codecsmodule.o Modules/_collectionsmodule.o Modules/errnomodule.o Modules/_io/_iomodule.o Modules/_io/iobase.o Modules/_io/fileio.o Modules/_io/bytesio.o Modules/_io/bufferedio.o Modules/_io/textio.o Modules/_io/stringio.o Modules/itertoolsmodule.o Modules/_sre/sre.o Modules/_threadmodule.o Modules/timemodule.o Modules/_weakref.o Modules/_abc.o Modules/_functoolsmodule.o Modules/_localemodule.o Modules/_operator.o Modules/_stat.o Modules/symtablemodule.o Modules/pwdmodule.o Modules/xxsubtype.o" MODSHARED_NAMES = "" MODULE_ARRAY_STATE = "yes" MODULE_ATEXIT_LDFLAGS = "" MODULE_AUDIOOP_LDFLAGS = "-lm" MODULE_AUDIOOP_STATE = "yes" MODULE_BINASCII_CFLAGS = "-DUSE_ZLIB_CRC32" MODULE_BINASCII_LDFLAGS = "-lz" MODULE_BINASCII_STATE = "yes" MODULE_CMATH_DEPS = "./Modules/_math.h" MODULE_CMATH_LDFLAGS = "-lm" MODULE_CMATH_STATE = "yes" MODULE_ERRNO_LDFLAGS = "" MODULE_FAULTHANDLER_LDFLAGS = "" MODULE_FCNTL_LDFLAGS = "" MODULE_FCNTL_STATE = "yes" MODULE_GRP_STATE = "yes" MODULE_ITERTOOLS_LDFLAGS = "" MODULE_MATH_DEPS = "./Modules/_math.h" MODULE_MATH_LDFLAGS = "-lm" MODULE_MATH_STATE = "yes" MODULE_MMAP_STATE = "yes" MODULE_NIS_CFLAGS = "" MODULE_NIS_LDFLAGS = "" MODULE_NIS_STATE = "yes" MODULE_OBJS = "\" MODULE_OSSAUDIODEV_LDFLAGS = "" MODULE_OSSAUDIODEV_STATE = "yes" MODULE_POSIX_LDFLAGS = "" MODULE_PWD_LDFLAGS = "" MODULE_PWD_STATE = "yes" MODULE_PYEXPAT_CFLAGS = "-I./Modules/expat" MODULE_PYEXPAT_DEPS = "\ Modules/expat/libexpat.a" MODULE_PYEXPAT_LDFLAGS = "-lm Modules/expat/libexpat.a" MODULE_PYEXPAT_STATE = "yes" MODULE_RESOURCE_STATE = "yes" MODULE_SELECT_STATE = "yes" MODULE_SPWD_STATE = "n/a" MODULE_SYSLOG_STATE = "yes" MODULE_TERMIOS_STATE = "yes" MODULE_TIME_LDFLAGS = "" MODULE_TIME_STATE = "yes" MODULE_UNICODEDATA_DEPS = "./Modules/unicodedata_db.h ./Modules/unicodename_db.h" MODULE_UNICODEDATA_STATE = "yes" MODULE_XXLIMITED_35_STATE = "yes" MODULE_XXLIMITED_STATE = "yes" MODULE_XXSUBTYPE_LDFLAGS = "" MODULE_ZLIB_CFLAGS = "" MODULE_ZLIB_LDFLAGS = "-lz" MODULE_ZLIB_STATE = "yes" MODULE__ABC_LDFLAGS = "" MODULE__ASYNCIO_STATE = "yes" MODULE__BISECT_STATE = "yes" MODULE__BLAKE2_CFLAGS = "" MODULE__BLAKE2_DEPS = "./Modules/_blake2/impl/blake2-config.h ./Modules/_blake2/impl/blake2-impl.h ./Modules/_blake2/impl/blake2.h ./Modules/_blake2/impl/blake2b-load-sse2.h ./Modules/_blake2/impl/blake2b-load-sse41.h ./Modules/_blake2/impl/blake2b-ref.c ./Modules/_blake2/impl/blake2b-round.h ./Modules/_blake2/impl/blake2b.c ./Modules/_blake2/impl/blake2s-load-sse2.h ./Modules/_blake2/impl/blake2s-load-sse41.h ./Modules/_blake2/impl/blake2s-load-xop.h ./Modules/_blake2/impl/blake2s-ref.c ./Modules/_blake2/impl/blake2s-round.h ./Modules/_blake2/impl/blake2s.c ./Modules/_blake2/blake2module.h ./Modules/hashlib.h" MODULE__BLAKE2_LDFLAGS = "" MODULE__BLAKE2_STATE = "yes" MODULE__BZ2_CFLAGS = "" MODULE__BZ2_LDFLAGS = "-lbz2" MODULE__BZ2_STATE = "yes" MODULE__CODECS_CN_STATE = "yes" MODULE__CODECS_HK_STATE = "yes" MODULE__CODECS_ISO2022_STATE = "yes" MODULE__CODECS_JP_STATE = "yes" MODULE__CODECS_KR_STATE = "yes" MODULE__CODECS_LDFLAGS = "" MODULE__CODECS_TW_STATE = "yes" MODULE__COLLECTIONS_LDFLAGS = "" MODULE__CONTEXTVARS_STATE = "yes" MODULE__CRYPT_CFLAGS = "" MODULE__CRYPT_LDFLAGS = "-lcrypt" MODULE__CRYPT_STATE = "yes" MODULE__CSV_STATE = "yes" MODULE__CTYPES_DEPS = "./Modules/_ctypes/ctypes.h" MODULE__CTYPES_TEST_LDFLAGS = "-lm" MODULE__CTYPES_TEST_STATE = "yes" MODULE__DATETIME_LDFLAGS = "-lm" MODULE__DATETIME_STATE = "yes" MODULE__DECIMAL_CFLAGS = "-DCONFIG_32=1 -DANSI=1" MODULE__DECIMAL_DEPS = "./Modules/_decimal/docstrings.h \" MODULE__DECIMAL_LDFLAGS = "-lmpdec" MODULE__DECIMAL_STATE = "yes" MODULE__ELEMENTTREE_CFLAGS = "-I./Modules/expat" MODULE__ELEMENTTREE_DEPS = "./Modules/pyexpat.c \ Modules/expat/libexpat.a" MODULE__ELEMENTTREE_STATE = "yes" MODULE__FUNCTOOLS_LDFLAGS = "" MODULE__GDBM_STATE = "missing" MODULE__HASHLIB_CFLAGS = "-I/usr/include" MODULE__HASHLIB_DEPS = "./Modules/hashlib.h" MODULE__HASHLIB_LDFLAGS = "-L/usr/lib -lcrypto" MODULE__HASHLIB_STATE = "yes" MODULE__HEAPQ_STATE = "yes" MODULE__IO_CFLAGS = "-I./Modules/_io" MODULE__IO_DEPS = "./Modules/_io/_iomodule.h" MODULE__IO_LDFLAGS = "" MODULE__IO_STATE = "yes" MODULE__JSON_STATE = "yes" MODULE__LOCALE_LDFLAGS = "" MODULE__LSPROF_STATE = "yes" MODULE__LZMA_CFLAGS = "" MODULE__LZMA_LDFLAGS = "-llzma" MODULE__LZMA_STATE = "yes" MODULE__MD5_DEPS = "./Modules/hashlib.h" MODULE__MD5_STATE = "yes" MODULE__MULTIBYTECODEC_STATE = "yes" MODULE__MULTIPROCESSING_CFLAGS = "-I./Modules/_multiprocessing" MODULE__MULTIPROCESSING_STATE = "yes" MODULE__OPCODE_STATE = "yes" MODULE__OPERATOR_LDFLAGS = "" MODULE__PICKLE_STATE = "yes" MODULE__POSIXSHMEM_CFLAGS = "-I./Modules/_multiprocessing" MODULE__POSIXSHMEM_LDFLAGS = "" MODULE__POSIXSHMEM_STATE = "yes" MODULE__POSIXSUBPROCESS_STATE = "yes" MODULE__QUEUE_STATE = "yes" MODULE__RANDOM_STATE = "yes" MODULE__SCPROXY_STATE = "n/a" MODULE__SHA1_DEPS = "./Modules/hashlib.h" MODULE__SHA1_STATE = "yes" MODULE__SHA256_DEPS = "./Modules/hashlib.h" MODULE__SHA256_STATE = "yes" MODULE__SHA3_DEPS = "./Modules/_sha3/sha3.c ./Modules/_sha3/sha3.h ./Modules/hashlib.h" MODULE__SHA3_STATE = "yes" MODULE__SHA512_DEPS = "./Modules/hashlib.h" MODULE__SHA512_STATE = "yes" MODULE__SIGNAL_LDFLAGS = "" MODULE__SOCKET_DEPS = "./Modules/socketmodule.h ./Modules/addrinfo.h ./Modules/getaddrinfo.c ./Modules/getnameinfo.c" MODULE__SOCKET_STATE = "yes" MODULE__SQLITE3_DEPS = "./Modules/_sqlite/connection.h ./Modules/_sqlite/cursor.h ./Modules/_sqlite/microprotocols.h ./Modules/_sqlite/module.h ./Modules/_sqlite/prepare_protocol.h ./Modules/_sqlite/row.h ./Modules/_sqlite/util.h" MODULE__SQLITE3_STATE = "disabled" MODULE__SRE_LDFLAGS = "" MODULE__SSL_CFLAGS = "-I/usr/include" MODULE__SSL_DEPS = "./Modules/_ssl.h ./Modules/_ssl/cert.c ./Modules/_ssl/debughelpers.c ./Modules/_ssl/misc.c ./Modules/_ssl_data.h ./Modules/_ssl_data_111.h ./Modules/_ssl_data_300.h ./Modules/socketmodule.h" MODULE__SSL_LDFLAGS = "-L/usr/lib -lssl -lcrypto" MODULE__SSL_STATE = "yes" MODULE__STATISTICS_LDFLAGS = "-lm" MODULE__STATISTICS_STATE = "yes" MODULE__STAT_LDFLAGS = "" MODULE__STRUCT_STATE = "yes" MODULE__SYMTABLE_LDFLAGS = "" MODULE__TESTBUFFER_STATE = "yes" MODULE__TESTCAPI_DEPS = "./Modules/testcapi_long.h" MODULE__TESTCAPI_STATE = "yes" MODULE__TESTIMPORTMULTIPLE_STATE = "yes" MODULE__TESTINTERNALCAPI_STATE = "yes" MODULE__TESTMULTIPHASE_STATE = "yes" MODULE__THREAD_LDFLAGS = "" MODULE__TKINTER_STATE = "missing" MODULE__TRACEMALLOC_LDFLAGS = "" MODULE__TYPING_STATE = "yes" MODULE__UUID_CFLAGS = "" MODULE__UUID_LDFLAGS = "" MODULE__UUID_STATE = "yes" MODULE__WEAKREF_LDFLAGS = "" MODULE__XXSUBINTERPRETERS_STATE = "yes" MODULE__XXTESTFUZZ_STATE = "yes" MODULE__ZONEINFO_STATE = "yes" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "-I/usr/include" OPENSSL_LDFLAGS = "-L/usr/lib" OPENSSL_LIBS = "-lssl -lcrypto" OPENSSL_RPATH = "" OPT = "-DNDEBUG" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ Parser/myreadline.o Parser/tokenizer.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "" PGO_PROF_USE_FLAG = "" PLATLIBDIR = "lib" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo --timeout=1200" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_BUILD_DEPS = "python" PYTHON_FOR_FREEZE = "./_bootstrap_python" PYTHON_FOR_REGEN = "" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha256,sha512,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing" PY_CFLAGS_NODIST = "-flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-L/usr/local/lib -fstack-protector-strong -flto=thin -g" PY_CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" PY_ENABLE_SHARED = "1" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-L/usr/local/lib -fstack-protector-strong" PY_LDFLAGS_NODIST = "-flto=thin -g" PY_LDFLAGS_NOLTO = "-L/usr/local/lib -fstack-protector-strong -fno-lto" PY_SQLITE_ENABLE_LOAD_EXTENSION = "0" PY_SQLITE_HAVE_SERIALIZE = "0" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC" PY_SUPPORT_TIER = "0" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_STATS = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python311/work/Python-3.11.0" SCRIPTDIR = "/usr/local/lib" SETPGRP_HAVE_ARG = "1" SHELL = "/bin/sh" SHLIBS = "-lintl -ldl -L/usr/local/lib -lintl -lutil" SHLIB_SUFFIX = ".so" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "4" SIZEOF_LONG_DOUBLE = "8" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "4" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "4" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "4" SIZEOF_VOID_P = "4" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SOABI = "cpython-311" SRCDIRS = "Modules Modules/_blake2 Modules/_ctypes Modules/_decimal Modules/_decimal/libmpdec Modules/_io Modules/_multiprocessing Modules/_sha3 Modules/_sqlite Modules/_sre Modules/_xxtestfuzz Modules/cjkcodecs Modules/expat Objects Parser Programs Python Python/frozen_modules Python/deepfreeze" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STATIC_LIBPYTHON = "1" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python311/work/Python-3.11.0 ./python -E" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python311/work/Python-3.11.0 ./python -E ./Tools/scripts/run_tests.py" TESTSUBDIRS = "ctypes/test \" TESTTIMEOUT = "1200" TEST_MODULES = "yes" THREAD_STACK_SIZE = "0" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.11" WASM_ASSETS_DIR = "./usr/local" WASM_STDLIB = "./usr/local/lib/python3.11/os.py" WHEEL_PKG_DIR = "" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_EDITLINE = "0" WITH_FREELISTS = "1" WITH_LIBINTL = "1" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/wrkdirs/usr/ports/lang/python311/work/Python-3.11.0" abs_srcdir = "/wrkdirs/usr/ports/lang/python311/work/Python-3.11.0" base = "/usr/local" datarootdir = "/usr/local/share" exec_prefix = "/usr/local" installed_base = "/usr/local" installed_platbase = "/usr/local" platbase = "/usr/local" platlibdir = "lib" prefix = "/usr/local" projectbase = "/usr/local/bin" py_version = "3.11.0" py_version_nodot = "311" py_version_nodot_plat = "" py_version_short = "3.11" srcdir = "/usr/local/lib/python3.11/config-3.11" userbase = "/root/.local" maturin-1.16.0/sysconfig/cpython-freebsd-14.0-riscv64.txt000066400000000000000000000763761527064705700230350ustar00rootroot00000000000000Platform: "freebsd-14.0-CURRENT-riscv" Python version: "3.11" Current installation scheme: "posix_prefix" Paths: data = "/usr/local" include = "/usr/local/include/python3.11" platinclude = "/usr/local/include/python3.11" platlib = "/usr/local/lib/python3.11/site-packages" platstdlib = "/usr/local/lib/python3.11" purelib = "/usr/local/lib/python3.11/site-packages" scripts = "/usr/local/bin" stdlib = "/usr/local/lib/python3.11" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "0" AIX_GENUINE_CPLUSPLUS = "0" ALIGNOF_LONG = "8" ALIGNOF_SIZE_T = "8" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/local/bin" BINLIBDEST = "/usr/local/lib/python3.11" BLDLIBRARY = "-L. -lpython3.11" BLDSHARED = "/usr/bin/cc -pthread -shared -L/usr/local/lib -fstack-protector-strong" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "riscv64-portbld-freebsd14.0" BYTESTR_DEPS = "\" CC = "/usr/bin/cc -pthread" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -march=rv64imafdc -mabi=lp64d -fstack-protector-strong -fno-strict-aliasing" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--enable-shared' '--without-ensurepip' '--with-system-ffi' '--without-pydebug' '--enable-ipv6' '--with-system-libmpdec' '--with-pymalloc' '--prefix=/usr/local' '--localstatedir=/var' '--mandir=/usr/local/man' '--infodir=/usr/local/share/info/' '--build=riscv64-portbld-freebsd14.0' 'build_alias=riscv64-portbld-freebsd14.0' 'CC=/usr/bin/cc' 'CFLAGS=-O2 -pipe -march=rv64imafdc -mabi=lp64d -fstack-protector-strong -fno-strict-aliasing ' 'LDFLAGS= -L/usr/local/lib -fstack-protector-strong ' 'LIBS=-L/usr/local/lib -lintl' 'CPPFLAGS=-I/usr/local/include -I/usr/local/include' 'CPP=/usr/bin/cpp' 'PKG_CONFIG=pkgconf'" CONFINCLUDEDIR = "/usr/local/include" CONFINCLUDEPY = "/usr/local/include/python3.11" COREPYTHONPATH = "" COVERAGE_INFO = "/wrkdirs/usr/ports/lang/python311/work/Python-3.11.0a2/coverage.info" COVERAGE_REPORT = "/wrkdirs/usr/ports/lang/python311/work/Python-3.11.0a2/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" CXX = "/usr/bin/c++ -pthread" DESTDIRS = "/usr/local /usr/local/lib /usr/local/lib/python3.11 /usr/local/lib/python3.11/lib-dynload" DESTLIB = "/usr/local/lib/python3.11" DESTPATH = "" DESTSHARED = "/usr/local/lib/python3.11/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXPERIMENTAL_ISOLATED_SUBINTERPRETERS = "0" EXPORTSFROM = "" EXPORTSYMS = "" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-311.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FLOCK_NEEDS_LIBBSD = "0" FROZEN_FILES_IN = "\" FROZEN_FILES_OUT = "\" GETPGRP_HAVE_ARG = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "0" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "1" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_NANOSLEEP = "1" HAVE_CLOCK_SETTIME = "1" HAVE_CLOSE_RANGE = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPY_FILE_RANGE = "1" HAVE_CRYPT_H = "0" HAVE_CRYPT_R = "0" HAVE_CTERMID = "1" HAVE_CTERMID_R = "1" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "0" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "0" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EVENTFD = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "0" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "0" HAVE_GCC_ASM_FOR_X87 = "0" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETSID = "1" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_IEEEFP_H = "1" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "1" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "1" HAVE_LCHMOD = "1" HAVE_LCHOWN = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "1" HAVE_LIBUUID = "0" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_J1939_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LINUX_WAIT_H = "0" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "1" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "0" HAVE_NANOSLEEP = "1" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION = "0" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "0" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "1" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_CLOCKWAIT = "0" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "1" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SPLICE = "0" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "1" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "1" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "1" HAVE_STRUCT_STAT_ST_GEN = "1" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "1" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENTFD_H = "1" HAVE_SYS_EVENT_H = "1" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "1" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "0" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "0" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "1" HAVE_UUID_ENC_BE = "1" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_H = "1" HAVE_UUID_UUID_H = "0" HAVE_VFORK = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "riscv64-portbld-freebsd14.0" INCLDIRSTOMAKE = "/usr/local/include /usr/local/include /usr/local/include/python3.11 /usr/local/include/python3.11" INCLUDEDIR = "/usr/local/include" INCLUDEPY = "/usr/local/include/python3.11" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "install -m 0644" INSTALL_PROGRAM = "install -s -m 555" INSTALL_SCRIPT = "install -m 555" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.11.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "/usr/bin/c++ -pthread -shared" LDFLAGS = "-L/usr/local/lib -fstack-protector-strong" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.11.so" LDLIBRARYDIR = "" LDSHARED = "/usr/bin/cc -pthread -shared -L/usr/local/lib -fstack-protector-strong" LDVERSION = "3.11" LIBC = "" LIBDEST = "/usr/local/lib/python3.11" LIBDIR = "/usr/local/lib" LIBFFI_INCLUDEDIR = "/usr/local/include" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/local/libdata/pkgconfig" LIBPL = "/usr/local/lib/python3.11/config-3.11" LIBPYTHON = "" LIBRARY = "libpython3.11.a" LIBRARY_DEPS = "libpython3.11.a libpython3.11.so libpython3.so" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lintl -ldl -L/usr/local/lib -lintl -lutil" LIBSUBDIRS = "asyncio \" LINKCC = "/usr/bin/cc -pthread" LINKFORSHARED = "-Wl,--export-dynamic" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "" LN = "ln" LOCALMODLIBS = "" MACHDEP = "freebsd14" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/local/lib/python3.11" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "/usr/bin/cc -pthread" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/local/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "_collections _abc _codecs _functools _io _locale _operator _signal _sre _stat _symtable _thread _tracemalloc _weakref atexit errno faulthandler itertools posix pwd time xxsubtype" MODDISABLED_NAMES = "_sqlite3 _tkinter _gdbm" MODLIBS = "" MODOBJS = "Modules/_collectionsmodule.o Modules/_abc.o Modules/_codecsmodule.o Modules/_functoolsmodule.o Modules/_io/_iomodule.o Modules/_io/iobase.o Modules/_io/fileio.o Modules/_io/bytesio.o Modules/_io/bufferedio.o Modules/_io/textio.o Modules/_io/stringio.o Modules/_localemodule.o Modules/_operator.o Modules/signalmodule.o Modules/_sre.o Modules/_stat.o Modules/symtablemodule.o Modules/_threadmodule.o Modules/_tracemalloc.o Modules/_weakref.o Modules/atexitmodule.o Modules/errnomodule.o Modules/faulthandler.o Modules/itertoolsmodule.o Modules/posixmodule.o Modules/pwdmodule.o Modules/timemodule.o Modules/xxsubtype.o" MODSHARED_NAMES = "" MODULE_CMATH_DEPS = "./Modules/_math.h" MODULE_MATH_DEPS = "./Modules/_math.h" MODULE_OBJS = "\" MODULE_PYEXPAT_DEPS = "./Modules/expat/ascii.h ./Modules/expat/asciitab.h ./Modules/expat/expat.h ./Modules/expat/expat_config.h ./Modules/expat/expat_external.h ./Modules/expat/internal.h ./Modules/expat/latin1tab.h ./Modules/expat/utf8tab.h ./Modules/expat/xmlrole.h ./Modules/expat/xmltok.h ./Modules/expat/xmltok_impl.h" MODULE_UNICODEDATA_DEPS = "./Modules/unicodedata_db.h ./Modules/unicodename_db.h" MODULE__BLAKE2_DEPS = "./Modules/_blake2/impl/blake2-config.h ./Modules/_blake2/impl/blake2-dispatch.c ./Modules/_blake2/impl/blake2-impl.h ./Modules/_blake2/impl/blake2-kat.h ./Modules/_blake2/impl/blake2.h ./Modules/_blake2/impl/blake2b-load-sse2.h ./Modules/_blake2/impl/blake2b-load-sse41.h ./Modules/_blake2/impl/blake2b-ref.c ./Modules/_blake2/impl/blake2b-round.h ./Modules/_blake2/impl/blake2b-test.c ./Modules/_blake2/impl/blake2b.c ./Modules/_blake2/impl/blake2bp-test.c ./Modules/_blake2/impl/blake2bp.c ./Modules/_blake2/impl/blake2s-load-sse2.h ./Modules/_blake2/impl/blake2s-load-sse41.h ./Modules/_blake2/impl/blake2s-load-xop.h ./Modules/_blake2/impl/blake2s-ref.c ./Modules/_blake2/impl/blake2s-round.h ./Modules/_blake2/impl/blake2s-test.c ./Modules/_blake2/impl/blake2s.c ./Modules/_blake2/impl/blake2sp-test.c ./Modules/_blake2/impl/blake2sp.c ./Modules/hashlib.h" MODULE__CTYPES_DEPS = "./Modules/_ctypes/ctypes.h" MODULE__DECIMAL_DEPS = "./Modules/_decimal/docstrings.h ./Modules/_decimal/libmpdec/basearith.h ./Modules/_decimal/libmpdec/bits.h ./Modules/_decimal/libmpdec/constants.h ./Modules/_decimal/libmpdec/convolute.h ./Modules/_decimal/libmpdec/crt.h ./Modules/_decimal/libmpdec/difradix2.h ./Modules/_decimal/libmpdec/fnt.h ./Modules/_decimal/libmpdec/fourstep.h ./Modules/_decimal/libmpdec/io.h ./Modules/_decimal/libmpdec/mpalloc.h ./Modules/_decimal/libmpdec/mpdecimal.h ./Modules/_decimal/libmpdec/numbertheory.h ./Modules/_decimal/libmpdec/sixstep.h ./Modules/_decimal/libmpdec/transpose.h ./Modules/_decimal/libmpdec/typearith.h ./Modules/_decimal/libmpdec/umodarith.h" MODULE__ELEMENTTREE_DEPS = "./Modules/expat/ascii.h ./Modules/expat/asciitab.h ./Modules/expat/expat.h ./Modules/expat/expat_config.h ./Modules/expat/expat_external.h ./Modules/expat/internal.h ./Modules/expat/latin1tab.h ./Modules/expat/utf8tab.h ./Modules/expat/xmlparse.c ./Modules/expat/xmlrole.c ./Modules/expat/xmlrole.h ./Modules/expat/xmltok.c ./Modules/expat/xmltok.h ./Modules/expat/xmltok_impl.h ./Modules/pyexpat.c" MODULE__HASHLIB_DEPS = "./Modules/hashlib.h" MODULE__IO_DEPS = "./Modules/_io/_iomodule.h" MODULE__MD5_DEPS = "./Modules/hashlib.h" MODULE__SHA1_DEPS = "./Modules/hashlib.h" MODULE__SHA256_DEPS = "./Modules/hashlib.h" MODULE__SHA3_DEPS = "./Modules/_sha3/kcp/KeccakHash.c ./Modules/_sha3/kcp/KeccakHash.h ./Modules/_sha3/kcp/KeccakP-1600-64.macros ./Modules/_sha3/kcp/KeccakP-1600-SnP-opt32.h ./Modules/_sha3/kcp/KeccakP-1600-SnP-opt64.h ./Modules/_sha3/kcp/KeccakP-1600-SnP.h ./Modules/_sha3/kcp/KeccakP-1600-inplace32BI.c ./Modules/_sha3/kcp/KeccakP-1600-opt64-config.h ./Modules/_sha3/kcp/KeccakP-1600-opt64.c ./Modules/_sha3/kcp/KeccakP-1600-unrolling.macros ./Modules/_sha3/kcp/KeccakSponge.c ./Modules/_sha3/kcp/KeccakSponge.h ./Modules/_sha3/kcp/KeccakSponge.inc ./Modules/_sha3/kcp/PlSnP-Fallback.inc ./Modules/_sha3/kcp/SnP-Relaned.h ./Modules/_sha3/kcp/align.h ./Modules/hashlib.h" MODULE__SHA512_DEPS = "./Modules/hashlib.h" MODULE__SOCKET_DEPS = "./Modules/socketmodule.h" MODULE__SSL_DEPS = "./Modules/_ssl.h ./Modules/_ssl/cert.c ./Modules/_ssl/debughelpers.c ./Modules/_ssl/misc.c ./Modules/_ssl_data.h ./Modules/_ssl_data_111.h ./Modules/_ssl_data_300.h ./Modules/socketmodule.h" MODULE__TESTCAPI_DEPS = "./Modules/testcapi_long.h" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "-I/usr/include" OPENSSL_LDFLAGS = "-L/usr/lib" OPENSSL_LIBS = "-lssl -lcrypto" OPENSSL_RPATH = "" OPT = "-DNDEBUG" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ Parser/myreadline.o Parser/tokenizer.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "" PGO_PROF_USE_FLAG = "" PLATLIBDIR = "lib" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo --timeout=1200" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_REGEN = "" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha256,sha512,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -march=rv64imafdc -mabi=lp64d -fstack-protector-strong -fno-strict-aliasing -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -march=rv64imafdc -mabi=lp64d -fstack-protector-strong -fno-strict-aliasing" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -march=rv64imafdc -mabi=lp64d -fstack-protector-strong -fno-strict-aliasing -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-L/usr/local/lib -fstack-protector-strong" PY_CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" PY_ENABLE_SHARED = "1" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-L/usr/local/lib -fstack-protector-strong" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -march=rv64imafdc -mabi=lp64d -fstack-protector-strong -fno-strict-aliasing -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python311/work/Python-3.11.0a2" SCRIPTDIR = "/usr/local/lib" SETPGRP_HAVE_ARG = "1" SHELL = "/bin/sh" SHLIBS = "-lintl -ldl -L/usr/local/lib -lintl -lutil" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "0" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".cpython-311.so" SOABI = "cpython-311" SRCDIRS = "Modules Modules/_blake2 Modules/_ctypes Modules/_decimal Modules/_decimal/libmpdec Modules/_io Modules/_multiprocessing Modules/_sha3 Modules/_sqlite Modules/_xxtestfuzz Modules/cjkcodecs Modules/expat Objects Parser Programs Python" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STATIC_LIBPYTHON = "1" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python311/work/Python-3.11.0a2 ./python" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python311/work/Python-3.11.0a2 ./python ./Tools/scripts/run_tests.py" TESTSUBDIRS = "ctypes/test \" TESTTIMEOUT = "1200" TEST_MODULES = "yes" THREAD_STACK_SIZE = "0" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.11" WHEEL_PKG_DIR = "" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_EDITLINE = "0" WITH_FREELISTS = "1" WITH_LIBINTL = "1" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/wrkdirs/usr/ports/lang/python311/work/Python-3.11.0a2" abs_srcdir = "/wrkdirs/usr/ports/lang/python311/work/Python-3.11.0a2" base = "/usr/local" datarootdir = "/usr/local/share" exec_prefix = "/usr/local" installed_base = "/usr/local" installed_platbase = "/usr/local" platbase = "/usr/local" platlibdir = "lib" prefix = "/usr/local" projectbase = "/usr/local/bin" py_version = "3.11.0a2" py_version_nodot = "311" py_version_nodot_plat = "" py_version_short = "3.11" srcdir = "/usr/local/lib/python3.11/config-3.11" userbase = "/root/.local" maturin-1.16.0/sysconfig/cpython-freebsd-14.2-amd64.txt000066400000000000000000000773051527064705700224430ustar00rootroot00000000000000Platform: "freebsd-14.2-RELEASE-amd64" Python version: "3.11" Current installation scheme: "posix_prefix" Paths: data = "/usr/local" include = "/usr/local/include/python3.11" platinclude = "/usr/local/include/python3.11" platlib = "/usr/local/lib/python3.11/site-packages" platstdlib = "/usr/local/lib/python3.11" purelib = "/usr/local/lib/python3.11/site-packages" scripts = "/usr/local/bin" stdlib = "/usr/local/lib/python3.11" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "0" AIX_GENUINE_CPLUSPLUS = "0" ALIGNOF_LONG = "8" ALIGNOF_SIZE_T = "8" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "/usr/bin/llvm-ar" ARFLAGS = "rcs" BASECFLAGS = "-Wsign-compare -Wunreachable-code" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/local/bin" BINLIBDEST = "/usr/local/lib/python3.11" BLDLIBRARY = "-L. -lpython3.11" BLDSHARED = "cc -pthread -shared -L/usr/local/lib -fstack-protector-strong" BOOTSTRAP_HEADERS = "\" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "amd64-portbld-freebsd14.2" BYTESTR_DEPS = "\" CC = "cc -pthread" CCSHARED = "-fPIC" CFLAGS = "-Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS_NODIST = "-flto -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden" CONFIGURE_LDFLAGS_NODIST = "-flto" CONFIGURE_LDFLAGS_NOLTO = "-flto=thin" CONFIG_ARGS = "'--enable-shared' '--without-ensurepip' '--with-system-ffi' '--without-pydebug' '--enable-ipv6' '--with-system-libmpdec' '--with-lto' '--with-pymalloc' '--prefix=/usr/local' '--localstatedir=/var' '--mandir=/usr/local/share/man' '--infodir=/usr/local/share/info/' '--build=amd64-portbld-freebsd14.2' 'build_alias=amd64-portbld-freebsd14.2' 'PKG_CONFIG=pkgconf' 'PKG_CONFIG_LIBDIR=/wrkdirs/usr/ports/lang/python311/work/.pkgconfig:/usr/local/libdata/pkgconfig:/usr/local/share/pkgconfig:/usr/libdata/pkgconfig' 'CC=cc' 'CFLAGS=-O2 -pipe -fstack-protector-strong -fno-strict-aliasing ' 'LDFLAGS= -L/usr/local/lib -fstack-protector-strong ' 'LIBS=-L/usr/local/lib -lintl' 'CPPFLAGS=-I/usr/local/include -I/usr/local/include' 'CPP=cpp'" CONFINCLUDEDIR = "/usr/local/include" CONFINCLUDEPY = "/usr/local/include/python3.11" COREPYTHONPATH = "" COVERAGE_INFO = "/wrkdirs/usr/ports/lang/python311/work/Python-3.11.13/coverage.info" COVERAGE_LCOV_OPTIONS = "--rc lcov_branch_coverage=1" COVERAGE_REPORT = "/wrkdirs/usr/ports/lang/python311/work/Python-3.11.13/lcov-report" COVERAGE_REPORT_OPTIONS = "--rc lcov_branch_coverage=1 --branch-coverage --title "CPython 3.11 LCOV report [commit $(shell )]"" CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" CXX = "c++ -pthread" DECIMAL_CFLAGS = "-DCONFIG_64=1 -DANSI=1 -DHAVE_UINT128_T=1" DECIMAL_LDFLAGS = "-lmpdec" DEEPFREEZE_C = "Python/deepfreeze/deepfreeze.c" DEEPFREEZE_DEPS = "./Tools/scripts/deepfreeze.py _bootstrap_python ./Programs/_freeze_module.py \" DEEPFREEZE_OBJS = "Python/deepfreeze/deepfreeze.o" DESTDIRS = "/usr/local /usr/local/lib /usr/local/lib/python3.11 /usr/local/lib/python3.11/lib-dynload" DESTLIB = "/usr/local/lib/python3.11" DESTPATH = "" DESTSHARED = "/usr/local/lib/python3.11/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXPAT_CFLAGS = "-I./Modules/expat" EXPAT_LDFLAGS = "-lm Modules/expat/libexpat.a" EXPORTSFROM = "" EXPORTSYMS = "" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-311.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FREEZE_MODULE = "./_bootstrap_python ./Programs/_freeze_module.py" FREEZE_MODULE_BOOTSTRAP = "./Programs/_freeze_module" FREEZE_MODULE_BOOTSTRAP_DEPS = "Programs/_freeze_module" FREEZE_MODULE_DEPS = "_bootstrap_python ./Programs/_freeze_module.py" FROZEN_FILES_IN = "\" FROZEN_FILES_OUT = "\" GETPGRP_HAVE_ARG = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT = "1" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "0" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "1" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "1" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_BZLIB_H = "1" HAVE_CHFLAGS = "1" HAVE_CHMOD = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_NANOSLEEP = "1" HAVE_CLOCK_SETTIME = "1" HAVE_CLOSE_RANGE = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_CONNECT = "1" HAVE_COPY_FILE_RANGE = "1" HAVE_CRYPT_H = "0" HAVE_CRYPT_R = "1" HAVE_CTERMID = "1" HAVE_CTERMID_R = "1" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DB_H = "1" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "0" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EVENTFD = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORK1 = "0" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "0" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "1" HAVE_GCC_ASM_FOR_X87 = "1" HAVE_GCC_UINT128_T = "1" HAVE_GDBM_DASH_NDBM_H = "0" HAVE_GDBM_H = "0" HAVE_GDBM_NDBM_H = "0" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETEGID = "1" HAVE_GETENTROPY = "1" HAVE_GETEUID = "1" HAVE_GETGID = "1" HAVE_GETGRGID = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYADDR = "1" HAVE_GETHOSTBYNAME = "1" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETHOSTNAME = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPROTOBYNAME = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETRUSAGE = "1" HAVE_GETSERVBYNAME = "1" HAVE_GETSERVBYPORT = "1" HAVE_GETSID = "1" HAVE_GETSOCKNAME = "1" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETUID = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "0" HAVE_IEEEFP_H = "1" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_NTOA = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "1" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "1" HAVE_LCHMOD = "1" HAVE_LCHOWN = "1" HAVE_LIBB2 = "0" HAVE_LIBDB = "0" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBGDBM_COMPAT = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBNDBM = "0" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBSQLITE3 = "0" HAVE_LIBUTIL_H = "1" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_AUXVEC_H = "0" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_J1939_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "0" HAVE_LINUX_LIMITS_H = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_SOUNDCARD_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LINUX_WAIT_H = "0" HAVE_LISTEN = "1" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LOGIN_TTY = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_LZMA_H = "0" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "1" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "0" HAVE_NANOSLEEP = "1" HAVE_NCURSES_H = "1" HAVE_NDBM_H = "1" HAVE_NDIR_H = "0" HAVE_NETCAN_CAN_H = "0" HAVE_NETDB_H = "1" HAVE_NETINET_IN_H = "1" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION = "0" HAVE_OPENAT = "1" HAVE_OPENDIR = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTHREAD_STUBS = "0" HAVE_PTY_H = "0" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RECVFROM = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPDISP_FUNC_T = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_RPC_RPC_H = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "1" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_CLOCKWAIT = "0" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SENDTO = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETJMP_H = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETSOCKOPT = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SHUTDOWN = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "1" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKET = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SPLICE = "0" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "1" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "1" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "1" HAVE_STRUCT_STAT_ST_GEN = "1" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYSLOG_H = "1" HAVE_SYSTEM = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_AUXV_H = "1" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "1" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENTFD_H = "1" HAVE_SYS_EVENT_H = "1" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "1" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_SOUNDCARD_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "0" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "0" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TTYNAME = "1" HAVE_TZNAME = "0" HAVE_UMASK = "1" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UTMP_H = "0" HAVE_UUID_CREATE = "1" HAVE_UUID_ENC_BE = "1" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_H = "1" HAVE_UUID_UUID_H = "0" HAVE_VFORK = "1" HAVE_WAIT = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_ZLIB_COPY = "1" HAVE_ZLIB_H = "0" HAVE__GETPTY = "0" HOSTRUNNER = "" HOST_GNU_TYPE = "amd64-portbld-freebsd14.2" INCLDIRSTOMAKE = "/usr/local/include /usr/local/include /usr/local/include/python3.11 /usr/local/include/python3.11" INCLUDEDIR = "/usr/local/include" INCLUDEPY = "/usr/local/include/python3.11" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "install -m 0644" INSTALL_PROGRAM = "install -s -m 555" INSTALL_SCRIPT = "install -m 555" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.11.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "c++ -pthread -shared" LDFLAGS = "-L/usr/local/lib -fstack-protector-strong" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.11.so" LDLIBRARYDIR = "" LDSHARED = "cc -pthread -shared -L/usr/local/lib -fstack-protector-strong" LDVERSION = "3.11" LIBC = "" LIBDEST = "/usr/local/lib/python3.11" LIBDIR = "/usr/local/lib" LIBEXPAT_A = "Modules/expat/libexpat.a" LIBEXPAT_CFLAGS = "-I./Modules/expat -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -fPIC" LIBEXPAT_HEADERS = "\" LIBEXPAT_OBJS = "\" LIBFFI_INCLUDEDIR = "/usr/local/include" LIBM = "-lm" LIBMPDEC_A = "Modules/_decimal/libmpdec/libmpdec.a" LIBMPDEC_CFLAGS = "-DCONFIG_64=1 -DANSI=1 -DHAVE_UINT128_T=1 -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -fPIC" LIBMPDEC_HEADERS = "\" LIBMPDEC_OBJS = "\" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/local/libdata/pkgconfig" LIBPL = "/usr/local/lib/python3.11/config-3.11" LIBPYTHON = "" LIBRARY = "libpython3.11.a" LIBRARY_DEPS = "libpython3.11.a libpython3.11.so libpython3.so" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lintl -ldl -L/usr/local/lib -lintl -lutil" LIBSUBDIRS = "asyncio \" LINKCC = "cc -pthread" LINKFORSHARED = "-Wl,--export-dynamic" LINK_PYTHON_DEPS = "libpython3.11.a libpython3.11.so libpython3.so" LINK_PYTHON_OBJS = "-L. -lpython3.11" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "" LN = "ln" LOCALMODLIBS = "" MACHDEP = "freebsd14" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/local/lib/python3.11" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "cc -pthread" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/local/share/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "atexit faulthandler posix _signal _tracemalloc _codecs _collections errno _io itertools _sre _thread time _weakref _abc _functools _locale _operator _stat _symtable pwd xxsubtype" MODDISABLED_NAMES = "_sqlite3 _tkinter _gdbm" MODLIBS = "" MODOBJS = "Modules/atexitmodule.o Modules/faulthandler.o Modules/posixmodule.o Modules/signalmodule.o Modules/_tracemalloc.o Modules/_codecsmodule.o Modules/_collectionsmodule.o Modules/errnomodule.o Modules/_io/_iomodule.o Modules/_io/iobase.o Modules/_io/fileio.o Modules/_io/bytesio.o Modules/_io/bufferedio.o Modules/_io/textio.o Modules/_io/stringio.o Modules/itertoolsmodule.o Modules/_sre/sre.o Modules/_threadmodule.o Modules/timemodule.o Modules/_weakref.o Modules/_abc.o Modules/_functoolsmodule.o Modules/_localemodule.o Modules/_operator.o Modules/_stat.o Modules/symtablemodule.o Modules/pwdmodule.o Modules/xxsubtype.o" MODSHARED_NAMES = "" MODULE_ARRAY_STATE = "yes" MODULE_ATEXIT_LDFLAGS = "" MODULE_AUDIOOP_LDFLAGS = "-lm" MODULE_AUDIOOP_STATE = "yes" MODULE_BINASCII_CFLAGS = "-DUSE_ZLIB_CRC32" MODULE_BINASCII_LDFLAGS = "-L/lib -lz" MODULE_BINASCII_STATE = "yes" MODULE_CMATH_DEPS = "./Modules/_math.h" MODULE_CMATH_LDFLAGS = "-lm" MODULE_CMATH_STATE = "yes" MODULE_ERRNO_LDFLAGS = "" MODULE_FAULTHANDLER_LDFLAGS = "" MODULE_FCNTL_LDFLAGS = "" MODULE_FCNTL_STATE = "yes" MODULE_GRP_STATE = "yes" MODULE_ITERTOOLS_LDFLAGS = "" MODULE_MATH_DEPS = "./Modules/_math.h" MODULE_MATH_LDFLAGS = "-lm" MODULE_MATH_STATE = "yes" MODULE_MMAP_STATE = "yes" MODULE_NIS_CFLAGS = "" MODULE_NIS_LDFLAGS = "" MODULE_NIS_STATE = "yes" MODULE_OBJS = "\" MODULE_OSSAUDIODEV_LDFLAGS = "" MODULE_OSSAUDIODEV_STATE = "yes" MODULE_POSIX_LDFLAGS = "" MODULE_PWD_LDFLAGS = "" MODULE_PWD_STATE = "yes" MODULE_PYEXPAT_CFLAGS = "-I./Modules/expat" MODULE_PYEXPAT_DEPS = "\ Modules/expat/libexpat.a" MODULE_PYEXPAT_LDFLAGS = "-lm Modules/expat/libexpat.a" MODULE_PYEXPAT_STATE = "yes" MODULE_RESOURCE_STATE = "yes" MODULE_SELECT_STATE = "yes" MODULE_SPWD_STATE = "n/a" MODULE_SYSLOG_STATE = "yes" MODULE_TERMIOS_STATE = "yes" MODULE_TIME_LDFLAGS = "" MODULE_TIME_STATE = "yes" MODULE_UNICODEDATA_DEPS = "./Modules/unicodedata_db.h ./Modules/unicodename_db.h" MODULE_UNICODEDATA_STATE = "yes" MODULE_XXLIMITED_35_STATE = "yes" MODULE_XXLIMITED_STATE = "yes" MODULE_XXSUBTYPE_LDFLAGS = "" MODULE_ZLIB_CFLAGS = "" MODULE_ZLIB_LDFLAGS = "-L/lib -lz" MODULE_ZLIB_STATE = "yes" MODULE__ABC_LDFLAGS = "" MODULE__ASYNCIO_STATE = "yes" MODULE__BISECT_STATE = "yes" MODULE__BLAKE2_CFLAGS = "" MODULE__BLAKE2_DEPS = "./Modules/_blake2/impl/blake2-config.h ./Modules/_blake2/impl/blake2-impl.h ./Modules/_blake2/impl/blake2.h ./Modules/_blake2/impl/blake2b-load-sse2.h ./Modules/_blake2/impl/blake2b-load-sse41.h ./Modules/_blake2/impl/blake2b-ref.c ./Modules/_blake2/impl/blake2b-round.h ./Modules/_blake2/impl/blake2b.c ./Modules/_blake2/impl/blake2s-load-sse2.h ./Modules/_blake2/impl/blake2s-load-sse41.h ./Modules/_blake2/impl/blake2s-load-xop.h ./Modules/_blake2/impl/blake2s-ref.c ./Modules/_blake2/impl/blake2s-round.h ./Modules/_blake2/impl/blake2s.c ./Modules/_blake2/blake2module.h ./Modules/hashlib.h" MODULE__BLAKE2_LDFLAGS = "" MODULE__BLAKE2_STATE = "yes" MODULE__BZ2_CFLAGS = "" MODULE__BZ2_LDFLAGS = "-lbz2" MODULE__BZ2_STATE = "yes" MODULE__CODECS_CN_STATE = "yes" MODULE__CODECS_HK_STATE = "yes" MODULE__CODECS_ISO2022_STATE = "yes" MODULE__CODECS_JP_STATE = "yes" MODULE__CODECS_KR_STATE = "yes" MODULE__CODECS_LDFLAGS = "" MODULE__CODECS_TW_STATE = "yes" MODULE__COLLECTIONS_LDFLAGS = "" MODULE__CONTEXTVARS_STATE = "yes" MODULE__CRYPT_CFLAGS = "" MODULE__CRYPT_LDFLAGS = "-lcrypt" MODULE__CRYPT_STATE = "yes" MODULE__CSV_STATE = "yes" MODULE__CTYPES_DEPS = "./Modules/_ctypes/ctypes.h" MODULE__CTYPES_TEST_LDFLAGS = "-lm" MODULE__CTYPES_TEST_STATE = "yes" MODULE__DATETIME_LDFLAGS = "-lm" MODULE__DATETIME_STATE = "yes" MODULE__DECIMAL_CFLAGS = "-DCONFIG_64=1 -DANSI=1 -DHAVE_UINT128_T=1" MODULE__DECIMAL_DEPS = "./Modules/_decimal/docstrings.h" MODULE__DECIMAL_LDFLAGS = "-lmpdec" MODULE__DECIMAL_STATE = "yes" MODULE__ELEMENTTREE_CFLAGS = "-I./Modules/expat" MODULE__ELEMENTTREE_DEPS = "./Modules/pyexpat.c \ Modules/expat/libexpat.a" MODULE__ELEMENTTREE_STATE = "yes" MODULE__FUNCTOOLS_LDFLAGS = "" MODULE__GDBM_STATE = "missing" MODULE__HASHLIB_CFLAGS = "" MODULE__HASHLIB_DEPS = "./Modules/hashlib.h" MODULE__HASHLIB_LDFLAGS = "-lcrypto" MODULE__HASHLIB_STATE = "yes" MODULE__HEAPQ_STATE = "yes" MODULE__IO_CFLAGS = "-I./Modules/_io" MODULE__IO_DEPS = "./Modules/_io/_iomodule.h" MODULE__IO_LDFLAGS = "" MODULE__IO_STATE = "yes" MODULE__JSON_STATE = "yes" MODULE__LOCALE_LDFLAGS = "" MODULE__LSPROF_STATE = "yes" MODULE__LZMA_CFLAGS = "" MODULE__LZMA_LDFLAGS = "-llzma" MODULE__LZMA_STATE = "yes" MODULE__MD5_DEPS = "./Modules/hashlib.h" MODULE__MD5_STATE = "yes" MODULE__MULTIBYTECODEC_STATE = "yes" MODULE__MULTIPROCESSING_CFLAGS = "-I./Modules/_multiprocessing" MODULE__MULTIPROCESSING_STATE = "yes" MODULE__OPCODE_STATE = "yes" MODULE__OPERATOR_LDFLAGS = "" MODULE__PICKLE_STATE = "yes" MODULE__POSIXSHMEM_CFLAGS = "-I./Modules/_multiprocessing" MODULE__POSIXSHMEM_LDFLAGS = "" MODULE__POSIXSHMEM_STATE = "yes" MODULE__POSIXSUBPROCESS_STATE = "yes" MODULE__QUEUE_STATE = "yes" MODULE__RANDOM_STATE = "yes" MODULE__SCPROXY_STATE = "n/a" MODULE__SHA1_DEPS = "./Modules/hashlib.h" MODULE__SHA1_STATE = "yes" MODULE__SHA256_DEPS = "./Modules/hashlib.h" MODULE__SHA256_STATE = "yes" MODULE__SHA3_DEPS = "./Modules/_sha3/sha3.c ./Modules/_sha3/sha3.h ./Modules/hashlib.h" MODULE__SHA3_STATE = "yes" MODULE__SHA512_DEPS = "./Modules/hashlib.h" MODULE__SHA512_STATE = "yes" MODULE__SIGNAL_LDFLAGS = "" MODULE__SOCKET_DEPS = "./Modules/socketmodule.h ./Modules/addrinfo.h ./Modules/getaddrinfo.c ./Modules/getnameinfo.c" MODULE__SOCKET_STATE = "yes" MODULE__SQLITE3_DEPS = "./Modules/_sqlite/connection.h ./Modules/_sqlite/cursor.h ./Modules/_sqlite/microprotocols.h ./Modules/_sqlite/module.h ./Modules/_sqlite/prepare_protocol.h ./Modules/_sqlite/row.h ./Modules/_sqlite/util.h" MODULE__SQLITE3_STATE = "disabled" MODULE__SRE_LDFLAGS = "" MODULE__SSL_CFLAGS = "" MODULE__SSL_DEPS = "./Modules/_ssl.h ./Modules/_ssl/cert.c ./Modules/_ssl/debughelpers.c ./Modules/_ssl/misc.c ./Modules/_ssl_data.h ./Modules/_ssl_data_111.h ./Modules/_ssl_data_300.h ./Modules/socketmodule.h" MODULE__SSL_LDFLAGS = "-lssl -lcrypto" MODULE__SSL_STATE = "yes" MODULE__STATISTICS_LDFLAGS = "-lm" MODULE__STATISTICS_STATE = "yes" MODULE__STAT_LDFLAGS = "" MODULE__STRUCT_STATE = "yes" MODULE__SYMTABLE_LDFLAGS = "" MODULE__TESTBUFFER_STATE = "yes" MODULE__TESTCAPI_DEPS = "./Modules/testcapi_long.h" MODULE__TESTCAPI_STATE = "yes" MODULE__TESTCLINIC_STATE = "yes" MODULE__TESTIMPORTMULTIPLE_STATE = "yes" MODULE__TESTINTERNALCAPI_STATE = "yes" MODULE__TESTMULTIPHASE_STATE = "yes" MODULE__THREAD_LDFLAGS = "" MODULE__TKINTER_STATE = "missing" MODULE__TRACEMALLOC_LDFLAGS = "" MODULE__TYPING_STATE = "yes" MODULE__UUID_CFLAGS = "" MODULE__UUID_LDFLAGS = "" MODULE__UUID_STATE = "yes" MODULE__WEAKREF_LDFLAGS = "" MODULE__XXSUBINTERPRETERS_STATE = "yes" MODULE__XXTESTFUZZ_STATE = "yes" MODULE__ZONEINFO_STATE = "yes" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "" OPENSSL_LDFLAGS = "" OPENSSL_LIBS = "-lssl -lcrypto" OPENSSL_RPATH = "" OPT = "-DNDEBUG" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ Parser/myreadline.o Parser/tokenizer.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "" PGO_PROF_USE_FLAG = "" PLATLIBDIR = "lib" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo --timeout=1200" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_BUILD_DEPS = "python" PYTHON_FOR_FREEZE = "./_bootstrap_python" PYTHON_FOR_REGEN = "" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha256,sha512,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing" PY_CFLAGS_NODIST = "-flto -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-L/usr/local/lib -fstack-protector-strong -flto" PY_CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" PY_ENABLE_SHARED = "1" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-L/usr/local/lib -fstack-protector-strong" PY_LDFLAGS_NODIST = "-flto" PY_LDFLAGS_NOLTO = "-L/usr/local/lib -fstack-protector-strong -flto=thin" PY_SQLITE_ENABLE_LOAD_EXTENSION = "0" PY_SQLITE_HAVE_SERIALIZE = "0" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC" PY_SUPPORT_TIER = "0" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_STATS = "0" Py_SUNOS_VERSION = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python311/work/Python-3.11.13" SCRIPTDIR = "/usr/local/lib" SETPGRP_HAVE_ARG = "1" SHELL = "/bin/sh" SHLIBS = "-lintl -ldl -L/usr/local/lib -lintl -lutil" SHLIB_SUFFIX = ".so" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SOABI = "cpython-311" SRCDIRS = "Modules Modules/_blake2 Modules/_ctypes Modules/_decimal Modules/_decimal/libmpdec Modules/_io Modules/_multiprocessing Modules/_sha3 Modules/_sqlite Modules/_sre Modules/_xxtestfuzz Modules/cjkcodecs Modules/expat Objects Parser Programs Python Python/frozen_modules Python/deepfreeze" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STATIC_LIBPYTHON = "1" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python311/work/Python-3.11.13 ./python -E" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python311/work/Python-3.11.13 ./python -E ./Tools/scripts/run_tests.py" TESTSUBDIRS = "ctypes/test \" TESTTIMEOUT = "1200" TEST_MODULES = "yes" THREAD_STACK_SIZE = "0" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.11" WASM_ASSETS_DIR = "./usr/local" WASM_STDLIB = "./usr/local/lib/python3.11/os.py" WHEEL_PKG_DIR = "" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_EDITLINE = "0" WITH_FREELISTS = "1" WITH_LIBINTL = "1" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/wrkdirs/usr/ports/lang/python311/work/Python-3.11.13" abs_srcdir = "/wrkdirs/usr/ports/lang/python311/work/Python-3.11.13" base = "/usr/local" datarootdir = "/usr/local/share" exec_prefix = "/usr/local" installed_base = "/usr/local" installed_platbase = "/usr/local" platbase = "/usr/local" platlibdir = "lib" prefix = "/usr/local" projectbase = "/usr/local/bin" py_version = "3.11.13" py_version_nodot = "311" py_version_nodot_plat = "" py_version_short = "3.11" srcdir = "/usr/local/lib/python3.11/config-3.11" userbase = "/home/tejul/.local" maturin-1.16.0/sysconfig/cpython-freebsd-14.3-amd64.txt000066400000000000000000001157721527064705700224450ustar00rootroot00000000000000Platform: "freebsd-14.3-RELEASE-p3-amd64" Python version: "3.12" Current installation scheme: "posix_prefix" Paths: data = "/usr/local" include = "/usr/local/include/python3.12" platinclude = "/usr/local/include/python3.12" platlib = "/usr/local/lib/python3.12/site-packages" platstdlib = "/usr/local/lib/python3.12" purelib = "/usr/local/lib/python3.12/site-packages" scripts = "/usr/local/bin" stdlib = "/usr/local/lib/python3.12" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "0" AIX_GENUINE_CPLUSPLUS = "0" ALIGNOF_LONG = "8" ALIGNOF_MAX_ALIGN_T = "16" ALIGNOF_SIZE_T = "8" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "/usr/bin/llvm-ar" ARFLAGS = "rcs" BASECFLAGS = "-fno-strict-overflow -Wsign-compare -Wunreachable-code" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/local/bin" BINLIBDEST = "/usr/local/lib/python3.12" BLDLIBRARY = "-L. -lpython3.12" BLDSHARED = "cc -pthread -shared -L/usr/local/lib" BOOTSTRAP_HEADERS = "\" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "amd64-portbld-freebsd14.3" BUILD_SCRIPTS_DIR = "build/scripts-3.12" BYTESTR_DEPS = "\" CC = "cc -pthread" CCSHARED = "-fPIC" CFLAGS = "-fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CODECS_COMMON_HEADERS = "./Modules/cjkcodecs/multibytecodec.h ./Modules/cjkcodecs/cjkcodecs.h" COMPILEALL_OPTS = "-j0" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS_NODIST = "-flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden" CONFIGURE_LDFLAGS_NODIST = "-flto=thin -g" CONFIGURE_LDFLAGS_NOLTO = "-flto=thin" CONFIG_ARGS = "'--enable-shared' '--without-ensurepip' '--without-pydebug' '--enable-ipv6' '--with-system-libmpdec' '--with-lto' '--with-pymalloc' '--prefix=/usr/local' '--localstatedir=/var' '--mandir=/usr/local/share/man' '--infodir=/usr/local/share/info/' '--build=amd64-portbld-freebsd14.3' 'build_alias=amd64-portbld-freebsd14.3' 'PKG_CONFIG=pkgconf' 'PKG_CONFIG_LIBDIR=/wrkdirs/usr/ports/lang/python312/work/.pkgconfig:/usr/local/libdata/pkgconfig:/usr/local/share/pkgconfig:/usr/libdata/pkgconfig' 'CC=cc' 'CFLAGS=-O2 -pipe -fstack-protector-strong -fno-strict-aliasing ' 'LDFLAGS= -L/usr/local/lib ' 'LIBS=-L/usr/local/lib -lintl' 'CPPFLAGS=-I/usr/local/include -I/usr/local/include' 'CPP=cpp'" CONFINCLUDEDIR = "/usr/local/include" CONFINCLUDEPY = "/usr/local/include/python3.12" COREPYTHONPATH = "" COVERAGE_INFO = "/wrkdirs/usr/ports/lang/python312/work/Python-3.12.12/coverage.info" COVERAGE_LCOV_OPTIONS = "--rc lcov_branch_coverage=1" COVERAGE_REPORT = "/wrkdirs/usr/ports/lang/python312/work/Python-3.12.12/lcov-report" COVERAGE_REPORT_OPTIONS = "--rc lcov_branch_coverage=1 --branch-coverage --title "CPython 3.12 LCOV report [commit $(shell )]"" CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" CXX = "c++ -pthread" DEEPFREEZE_C = "Python/deepfreeze/deepfreeze.c" DEEPFREEZE_DEPS = "./Tools/build/deepfreeze.py _bootstrap_python ./Programs/_freeze_module.py \" DEEPFREEZE_OBJS = "Python/deepfreeze/deepfreeze.o" DESTDIRS = "/usr/local /usr/local/lib /usr/local/lib/python3.12 /usr/local/lib/python3.12/lib-dynload" DESTLIB = "/usr/local/lib/python3.12" DESTPATH = "" DESTSHARED = "/usr/local/lib/python3.12/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DSYMUTIL = "" DSYMUTIL_PATH = "" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXENAME = "/usr/local/bin/python3.12" EXPORTSFROM = "" EXPORTSYMS = "" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-312.so" FILEMODE = "644" FREEZE_MODULE = "./_bootstrap_python ./Programs/_freeze_module.py" FREEZE_MODULE_BOOTSTRAP = "./Programs/_freeze_module" FREEZE_MODULE_BOOTSTRAP_DEPS = "Programs/_freeze_module" FREEZE_MODULE_DEPS = "_bootstrap_python ./Programs/_freeze_module.py" FROZEN_FILES_IN = "\" FROZEN_FILES_OUT = "\" GETPGRP_HAVE_ARG = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT = "1" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "0" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "1" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "1" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_BZLIB_H = "1" HAVE_CHFLAGS = "1" HAVE_CHMOD = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_NANOSLEEP = "1" HAVE_CLOCK_SETTIME = "1" HAVE_CLOSE_RANGE = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_CONNECT = "1" HAVE_COPY_FILE_RANGE = "1" HAVE_CRYPT_H = "0" HAVE_CRYPT_R = "1" HAVE_CTERMID = "1" HAVE_CTERMID_R = "1" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DB_H = "1" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "0" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_EDITLINE_READLINE_H = "0" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EVENTFD = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FFI_CLOSURE_ALLOC = "1" HAVE_FFI_PREP_CIF_VAR = "1" HAVE_FFI_PREP_CLOSURE_LOC = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORK1 = "0" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "0" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "1" HAVE_GCC_ASM_FOR_X87 = "1" HAVE_GCC_UINT128_T = "1" HAVE_GDBM_DASH_NDBM_H = "0" HAVE_GDBM_H = "0" HAVE_GDBM_NDBM_H = "0" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETEGID = "1" HAVE_GETENTROPY = "1" HAVE_GETEUID = "1" HAVE_GETGID = "1" HAVE_GETGRGID = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYADDR = "1" HAVE_GETHOSTBYNAME = "1" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETHOSTNAME = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPROTOBYNAME = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETRUSAGE = "1" HAVE_GETSERVBYNAME = "1" HAVE_GETSERVBYPORT = "1" HAVE_GETSID = "1" HAVE_GETSOCKNAME = "1" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETUID = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "0" HAVE_IEEEFP_H = "1" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_NTOA = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "1" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "1" HAVE_LCHMOD = "1" HAVE_LCHOWN = "1" HAVE_LIBB2 = "0" HAVE_LIBDB = "0" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBSQLITE3 = "0" HAVE_LIBUTIL_H = "1" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_AUXVEC_H = "0" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_J1939_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "0" HAVE_LINUX_FS_H = "0" HAVE_LINUX_LIMITS_H = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_SOUNDCARD_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LINUX_WAIT_H = "0" HAVE_LISTEN = "1" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LOGIN_TTY = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_LZMA_H = "0" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "1" HAVE_MEMRCHR = "1" HAVE_MINIX_CONFIG_H = "0" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "0" HAVE_NANOSLEEP = "1" HAVE_NCURSESW = "1" HAVE_NCURSES_H = "1" HAVE_NDBM_H = "1" HAVE_NDIR_H = "0" HAVE_NETCAN_CAN_H = "0" HAVE_NETDB_H = "1" HAVE_NETINET_IN_H = "1" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_ETHERNET_H = "1" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION = "0" HAVE_OPENAT = "1" HAVE_OPENDIR = "1" HAVE_OPENPTY = "1" HAVE_PANEL_H = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTHREAD_STUBS = "0" HAVE_PTY_H = "0" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "0" HAVE_READLINE_READLINE_H = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RECVFROM = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPDISP_FUNC_T = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_RPC_RPC_H = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "1" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_CLOCKWAIT = "0" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SENDTO = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETJMP_H = "1" HAVE_SETLOCALE = "1" HAVE_SETNS = "0" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETSOCKOPT = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SHUTDOWN = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "1" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKET = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SPLICE = "0" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "1" HAVE_STDINT_H = "1" HAVE_STDIO_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "1" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "1" HAVE_STRUCT_STAT_ST_GEN = "1" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYSLOG_H = "1" HAVE_SYSTEM = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_AUXV_H = "1" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "1" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENTFD_H = "1" HAVE_SYS_EVENT_H = "1" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "1" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_PIDFD_H = "0" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_SOUNDCARD_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "0" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "0" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TTYNAME_R = "1" HAVE_TZNAME = "0" HAVE_UMASK = "1" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_UNSHARE = "0" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UTMP_H = "0" HAVE_UUID_CREATE = "1" HAVE_UUID_ENC_BE = "1" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_H = "1" HAVE_UUID_UUID_H = "0" HAVE_VFORK = "1" HAVE_WAIT = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_ZLIB_COPY = "1" HAVE_ZLIB_H = "0" HAVE__GETPTY = "0" HOSTRUNNER = "" HOST_GNU_TYPE = "amd64-portbld-freebsd14.3" INCLDIRSTOMAKE = "/usr/local/include /usr/local/include /usr/local/include/python3.12 /usr/local/include/python3.12" INCLUDEDIR = "/usr/local/include" INCLUDEPY = "/usr/local/include/python3.12" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "install -m 0644" INSTALL_PROGRAM = "install -s -m 555" INSTALL_SCRIPT = "install -m 555" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.12.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "c++ -pthread -shared -L/usr/local/lib" LDFLAGS = "-L/usr/local/lib" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.12.so" LDLIBRARYDIR = "" LDSHARED = "cc -pthread -shared -L/usr/local/lib" LDVERSION = "3.12" LIBC = "" LIBDEST = "/usr/local/lib/python3.12" LIBDIR = "/usr/local/lib" LIBEXPAT_A = "Modules/expat/libexpat.a" LIBEXPAT_CFLAGS = "-I./Modules/expat -fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -fPIC" LIBEXPAT_HEADERS = "\" LIBEXPAT_OBJS = "\" LIBHACL_CFLAGS = "-I./Modules/_hacl/include -D_BSD_SOURCE -D_DEFAULT_SOURCE -fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -fPIC" LIBHACL_HEADERS = "\" LIBHACL_SHA2_A = "Modules/_hacl/libHacl_Hash_SHA2.a" LIBHACL_SHA2_HEADERS = "\" LIBHACL_SHA2_OBJS = "\" LIBM = "-lm" LIBMPDEC_A = "Modules/_decimal/libmpdec/libmpdec.a" LIBMPDEC_CFLAGS = "-DCONFIG_64=1 -DANSI=1 -DHAVE_UINT128_T=1 -fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -fPIC" LIBMPDEC_HEADERS = "\" LIBMPDEC_OBJS = "\" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/local/libdata/pkgconfig" LIBPL = "/usr/local/lib/python3.12/config-3.12" LIBPYTHON = "" LIBRARY = "libpython3.12.a" LIBRARY_DEPS = "libpython3.12.a libpython3.12.so libpython3.so" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lintl -ldl -L/usr/local/lib -lintl -lutil" LIBSUBDIRS = "asyncio \" LINKCC = "cc -pthread" LINKFORSHARED = "-Wl,--export-dynamic" LINK_PYTHON_DEPS = "libpython3.12.a libpython3.12.so libpython3.so" LINK_PYTHON_OBJS = "-L. -lpython3.12" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "" LN = "ln" LOCALMODLIBS = "" MACHDEP = "freebsd14" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/local/lib/python3.12" MACOSX_DEPLOYMENT_TARGET = "" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/local/share/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "array _asyncio _bisect _contextvars _csv _heapq _json _lsprof _opcode _pickle _queue _random _struct _xxsubinterpreters _xxinterpchannels _zoneinfo audioop math cmath _statistics _datetime _decimal binascii _bz2 _lzma zlib _dbm readline _md5 _sha1 _sha2 _sha3 _blake2 pyexpat _elementtree _codecs_cn _codecs_hk _codecs_iso2022 _codecs_jp _codecs_kr _codecs_tw _multibytecodec unicodedata _crypt fcntl grp mmap nis ossaudiodev _posixsubprocess resource select _socket syslog termios _posixshmem _multiprocessing _ctypes _curses _curses_panel _ssl _hashlib _uuid xxsubtype _xxtestfuzz _testbuffer _testinternalcapi _testcapi _testclinic _testimportmultiple _testmultiphase _testsinglephase _ctypes_test xxlimited xxlimited_35 atexit faulthandler posix _signal _tracemalloc _codecs _collections errno _io itertools _sre _thread time _typing _weakref _abc _functools _locale _operator _stat _symtable pwd" MODDISABLED_NAMES = "_sqlite3 _tkinter _gdbm" MODLIBS = "" MODOBJS = "Modules/atexitmodule.o Modules/faulthandler.o Modules/posixmodule.o Modules/signalmodule.o Modules/_tracemalloc.o Modules/_codecsmodule.o Modules/_collectionsmodule.o Modules/errnomodule.o Modules/_io/_iomodule.o Modules/_io/iobase.o Modules/_io/fileio.o Modules/_io/bytesio.o Modules/_io/bufferedio.o Modules/_io/textio.o Modules/_io/stringio.o Modules/itertoolsmodule.o Modules/_sre/sre.o Modules/_threadmodule.o Modules/timemodule.o Modules/_typingmodule.o Modules/_weakref.o Modules/_abc.o Modules/_functoolsmodule.o Modules/_localemodule.o Modules/_operator.o Modules/_stat.o Modules/symtablemodule.o Modules/pwdmodule.o" MODSHARED_NAMES = "array _asyncio _bisect _contextvars _csv _heapq _json _lsprof _opcode _pickle _queue _random _struct _xxsubinterpreters _xxinterpchannels _zoneinfo audioop math cmath _statistics _datetime _decimal binascii _bz2 _lzma zlib _dbm readline _md5 _sha1 _sha2 _sha3 _blake2 pyexpat _elementtree _codecs_cn _codecs_hk _codecs_iso2022 _codecs_jp _codecs_kr _codecs_tw _multibytecodec unicodedata _crypt fcntl grp mmap nis ossaudiodev _posixsubprocess resource select _socket syslog termios _posixshmem _multiprocessing _ctypes _curses _curses_panel _ssl _hashlib _uuid xxsubtype _xxtestfuzz _testbuffer _testinternalcapi _testcapi _testclinic _testimportmultiple _testmultiphase _testsinglephase _ctypes_test xxlimited xxlimited_35" MODULE_ARRAY_STATE = "yes" MODULE_ATEXIT_LDFLAGS = "" MODULE_AUDIOOP_LDFLAGS = "-lm" MODULE_AUDIOOP_STATE = "yes" MODULE_BINASCII_CFLAGS = "-DUSE_ZLIB_CRC32" MODULE_BINASCII_LDFLAGS = "-L/lib -lz" MODULE_BINASCII_STATE = "yes" MODULE_CMATH_DEPS = "./Modules/_math.h" MODULE_CMATH_LDFLAGS = "-lm" MODULE_CMATH_STATE = "yes" MODULE_DEPS_SHARED = "Modules/config.c" MODULE_DEPS_STATIC = "Modules/config.c" MODULE_ERRNO_LDFLAGS = "" MODULE_FAULTHANDLER_LDFLAGS = "" MODULE_FCNTL_LDFLAGS = "" MODULE_FCNTL_STATE = "yes" MODULE_GRP_STATE = "yes" MODULE_ITERTOOLS_LDFLAGS = "" MODULE_MATH_DEPS = "./Modules/_math.h" MODULE_MATH_LDFLAGS = "-lm" MODULE_MATH_STATE = "yes" MODULE_MMAP_STATE = "yes" MODULE_NIS_CFLAGS = "" MODULE_NIS_LDFLAGS = "" MODULE_NIS_STATE = "yes" MODULE_OBJS = "\" MODULE_OSSAUDIODEV_LDFLAGS = "" MODULE_OSSAUDIODEV_STATE = "yes" MODULE_POSIX_LDFLAGS = "" MODULE_PWD_LDFLAGS = "" MODULE_PWD_STATE = "yes" MODULE_PYEXPAT_CFLAGS = "-I./Modules/expat" MODULE_PYEXPAT_DEPS = "\ Modules/expat/libexpat.a" MODULE_PYEXPAT_LDFLAGS = "-lm Modules/expat/libexpat.a" MODULE_PYEXPAT_STATE = "yes" MODULE_READLINE_CFLAGS = "-I/usr/local/include" MODULE_READLINE_LDFLAGS = "-L/usr/local/lib -lreadline" MODULE_READLINE_STATE = "yes" MODULE_RESOURCE_STATE = "yes" MODULE_SELECT_STATE = "yes" MODULE_SPWD_STATE = "n/a" MODULE_SYSLOG_STATE = "yes" MODULE_TERMIOS_STATE = "yes" MODULE_TIME_LDFLAGS = "" MODULE_TIME_STATE = "yes" MODULE_UNICODEDATA_DEPS = "./Modules/unicodedata_db.h ./Modules/unicodename_db.h" MODULE_UNICODEDATA_STATE = "yes" MODULE_XXLIMITED_35_STATE = "yes" MODULE_XXLIMITED_STATE = "yes" MODULE_XXSUBTYPE_STATE = "yes" MODULE_ZLIB_CFLAGS = "" MODULE_ZLIB_LDFLAGS = "-L/lib -lz" MODULE_ZLIB_STATE = "yes" MODULE__ABC_LDFLAGS = "" MODULE__ASYNCIO_STATE = "yes" MODULE__BISECT_STATE = "yes" MODULE__BLAKE2_CFLAGS = "" MODULE__BLAKE2_DEPS = "./Modules/_blake2/impl/blake2-config.h ./Modules/_blake2/impl/blake2-impl.h ./Modules/_blake2/impl/blake2.h ./Modules/_blake2/impl/blake2b-load-sse2.h ./Modules/_blake2/impl/blake2b-load-sse41.h ./Modules/_blake2/impl/blake2b-ref.c ./Modules/_blake2/impl/blake2b-round.h ./Modules/_blake2/impl/blake2b.c ./Modules/_blake2/impl/blake2s-load-sse2.h ./Modules/_blake2/impl/blake2s-load-sse41.h ./Modules/_blake2/impl/blake2s-load-xop.h ./Modules/_blake2/impl/blake2s-ref.c ./Modules/_blake2/impl/blake2s-round.h ./Modules/_blake2/impl/blake2s.c ./Modules/_blake2/blake2module.h ./Modules/hashlib.h" MODULE__BLAKE2_LDFLAGS = "" MODULE__BLAKE2_STATE = "yes" MODULE__BZ2_CFLAGS = "" MODULE__BZ2_LDFLAGS = "-lbz2" MODULE__BZ2_STATE = "yes" MODULE__CODECS_CN_DEPS = "./Modules/cjkcodecs/mappings_cn.h ./Modules/cjkcodecs/multibytecodec.h ./Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_CN_STATE = "yes" MODULE__CODECS_HK_DEPS = "./Modules/cjkcodecs/mappings_hk.h ./Modules/cjkcodecs/multibytecodec.h ./Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_HK_STATE = "yes" MODULE__CODECS_ISO2022_DEPS = "./Modules/cjkcodecs/mappings_jisx0213_pair.h ./Modules/cjkcodecs/alg_jisx0201.h ./Modules/cjkcodecs/emu_jisx0213_2000.h ./Modules/cjkcodecs/multibytecodec.h ./Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_ISO2022_STATE = "yes" MODULE__CODECS_JP_DEPS = "./Modules/cjkcodecs/mappings_jisx0213_pair.h ./Modules/cjkcodecs/alg_jisx0201.h ./Modules/cjkcodecs/emu_jisx0213_2000.h ./Modules/cjkcodecs/mappings_jp.h ./Modules/cjkcodecs/multibytecodec.h ./Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_JP_STATE = "yes" MODULE__CODECS_KR_DEPS = "./Modules/cjkcodecs/mappings_kr.h ./Modules/cjkcodecs/multibytecodec.h ./Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_KR_STATE = "yes" MODULE__CODECS_LDFLAGS = "" MODULE__CODECS_TW_DEPS = "./Modules/cjkcodecs/mappings_tw.h ./Modules/cjkcodecs/multibytecodec.h ./Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_TW_STATE = "yes" MODULE__COLLECTIONS_LDFLAGS = "" MODULE__CONTEXTVARS_STATE = "yes" MODULE__CRYPT_CFLAGS = "" MODULE__CRYPT_LDFLAGS = "-lcrypt" MODULE__CRYPT_STATE = "yes" MODULE__CSV_STATE = "yes" MODULE__CTYPES_CFLAGS = "-fno-strict-overflow -I/usr/local/include" MODULE__CTYPES_DEPS = "./Modules/_ctypes/ctypes.h" MODULE__CTYPES_LDFLAGS = "-L/usr/local/lib -lffi -ldl" MODULE__CTYPES_MALLOC_CLOSURE = "" MODULE__CTYPES_STATE = "yes" MODULE__CTYPES_TEST_LDFLAGS = "-lm" MODULE__CTYPES_TEST_STATE = "yes" MODULE__CURSES_CFLAGS = "" MODULE__CURSES_LDFLAGS = "-fstack-protector-strong -lncursesw -ltinfow" MODULE__CURSES_PANEL_CFLAGS = "" MODULE__CURSES_PANEL_LDFLAGS = "-fstack-protector-strong -lpanelw -fstack-protector-strong -lncursesw -ltinfow" MODULE__CURSES_PANEL_STATE = "yes" MODULE__CURSES_STATE = "yes" MODULE__DATETIME_LDFLAGS = "-lm" MODULE__DATETIME_STATE = "yes" MODULE__DBM_CFLAGS = "-DUSE_NDBM" MODULE__DBM_LDFLAGS = "" MODULE__DBM_STATE = "yes" MODULE__DECIMAL_CFLAGS = "-DCONFIG_64=1 -DANSI=1 -DHAVE_UINT128_T=1" MODULE__DECIMAL_DEPS = "./Modules/_decimal/docstrings.h" MODULE__DECIMAL_LDFLAGS = "-lmpdec" MODULE__DECIMAL_STATE = "yes" MODULE__ELEMENTTREE_CFLAGS = "-I./Modules/expat" MODULE__ELEMENTTREE_DEPS = "./Modules/pyexpat.c \ Modules/expat/libexpat.a" MODULE__ELEMENTTREE_STATE = "yes" MODULE__FUNCTOOLS_LDFLAGS = "" MODULE__GDBM_STATE = "missing" MODULE__HASHLIB_CFLAGS = "" MODULE__HASHLIB_DEPS = "./Modules/hashlib.h" MODULE__HASHLIB_LDFLAGS = "-lcrypto" MODULE__HASHLIB_STATE = "yes" MODULE__HEAPQ_STATE = "yes" MODULE__IO_CFLAGS = "-I./Modules/_io" MODULE__IO_DEPS = "./Modules/_io/_iomodule.h" MODULE__IO_LDFLAGS = "" MODULE__IO_STATE = "yes" MODULE__JSON_STATE = "yes" MODULE__LOCALE_LDFLAGS = "" MODULE__LSPROF_STATE = "yes" MODULE__LZMA_CFLAGS = "" MODULE__LZMA_LDFLAGS = "-llzma" MODULE__LZMA_STATE = "yes" MODULE__MD5_CFLAGS = "-I./Modules/_hacl/include -I./Modules/_hacl/internal -D_BSD_SOURCE -D_DEFAULT_SOURCE" MODULE__MD5_DEPS = "./Modules/hashlib.h \ Modules/_hacl/Hacl_Hash_MD5.h Modules/_hacl/Hacl_Hash_MD5.c" MODULE__MD5_STATE = "yes" MODULE__MULTIBYTECODEC_DEPS = "./Modules/cjkcodecs/multibytecodec.h" MODULE__MULTIBYTECODEC_STATE = "yes" MODULE__MULTIPROCESSING_CFLAGS = "-I./Modules/_multiprocessing" MODULE__MULTIPROCESSING_STATE = "yes" MODULE__OPCODE_STATE = "yes" MODULE__OPERATOR_LDFLAGS = "" MODULE__PICKLE_STATE = "yes" MODULE__POSIXSHMEM_CFLAGS = "-I./Modules/_multiprocessing" MODULE__POSIXSHMEM_LDFLAGS = "" MODULE__POSIXSHMEM_STATE = "yes" MODULE__POSIXSUBPROCESS_STATE = "yes" MODULE__QUEUE_STATE = "yes" MODULE__RANDOM_STATE = "yes" MODULE__SCPROXY_STATE = "n/a" MODULE__SHA1_CFLAGS = "-I./Modules/_hacl/include -I./Modules/_hacl/internal -D_BSD_SOURCE -D_DEFAULT_SOURCE" MODULE__SHA1_DEPS = "./Modules/hashlib.h \ Modules/_hacl/Hacl_Hash_SHA1.h Modules/_hacl/Hacl_Hash_SHA1.c" MODULE__SHA1_STATE = "yes" MODULE__SHA2_CFLAGS = "-I./Modules/_hacl/include -I./Modules/_hacl/internal -D_BSD_SOURCE -D_DEFAULT_SOURCE" MODULE__SHA2_DEPS = "./Modules/hashlib.h \ Modules/_hacl/libHacl_Hash_SHA2.a" MODULE__SHA2_STATE = "yes" MODULE__SHA3_DEPS = "./Modules/hashlib.h \ Modules/_hacl/Hacl_Hash_SHA3.h Modules/_hacl/Hacl_Hash_SHA3.c" MODULE__SHA3_STATE = "yes" MODULE__SIGNAL_LDFLAGS = "" MODULE__SOCKET_DEPS = "./Modules/socketmodule.h ./Modules/addrinfo.h ./Modules/getaddrinfo.c ./Modules/getnameinfo.c" MODULE__SOCKET_STATE = "yes" MODULE__SQLITE3_DEPS = "./Modules/_sqlite/connection.h ./Modules/_sqlite/cursor.h ./Modules/_sqlite/microprotocols.h ./Modules/_sqlite/module.h ./Modules/_sqlite/prepare_protocol.h ./Modules/_sqlite/row.h ./Modules/_sqlite/util.h" MODULE__SQLITE3_STATE = "disabled" MODULE__SRE_LDFLAGS = "" MODULE__SSL_CFLAGS = "" MODULE__SSL_DEPS = "./Modules/_ssl.h ./Modules/_ssl/cert.c ./Modules/_ssl/debughelpers.c ./Modules/_ssl/misc.c ./Modules/_ssl_data.h ./Modules/_ssl_data_111.h ./Modules/_ssl_data_300.h ./Modules/socketmodule.h" MODULE__SSL_LDFLAGS = "-lssl -lcrypto" MODULE__SSL_STATE = "yes" MODULE__STATISTICS_LDFLAGS = "-lm" MODULE__STATISTICS_STATE = "yes" MODULE__STAT_LDFLAGS = "" MODULE__STRUCT_STATE = "yes" MODULE__SYMTABLE_LDFLAGS = "" MODULE__TESTBUFFER_STATE = "yes" MODULE__TESTCAPI_DEPS = "./Modules/_testcapi/testcapi_long.h ./Modules/_testcapi/parts.h ./Modules/_testcapi/util.h" MODULE__TESTCAPI_STATE = "yes" MODULE__TESTCLINIC_STATE = "yes" MODULE__TESTIMPORTMULTIPLE_STATE = "yes" MODULE__TESTINTERNALCAPI_STATE = "yes" MODULE__TESTMULTIPHASE_STATE = "yes" MODULE__THREAD_LDFLAGS = "" MODULE__TKINTER_STATE = "missing" MODULE__TRACEMALLOC_LDFLAGS = "" MODULE__TYPING_LDFLAGS = "" MODULE__TYPING_STATE = "yes" MODULE__UUID_CFLAGS = "" MODULE__UUID_LDFLAGS = "" MODULE__UUID_STATE = "yes" MODULE__WEAKREF_LDFLAGS = "" MODULE__XXINTERPCHANNELS_STATE = "yes" MODULE__XXSUBINTERPRETERS_STATE = "yes" MODULE__XXTESTFUZZ_STATE = "yes" MODULE__ZONEINFO_STATE = "yes" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPT = "-DNDEBUG" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ Parser/myreadline.o Parser/tokenizer.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "" PGO_PROF_USE_FLAG = "" PLATLIBDIR = "lib" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo --timeout=1200" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_BUILD_DEPS = "python" PYTHON_FOR_FREEZE = "./_bootstrap_python" PYTHON_FOR_REGEN = "" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha2,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing" PY_CFLAGS_NODIST = "-flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-L/usr/local/lib -flto=thin -g" PY_CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" PY_ENABLE_SHARED = "1" PY_HAVE_PERF_TRAMPOLINE = "0" PY_LDFLAGS = "-L/usr/local/lib" PY_LDFLAGS_NODIST = "-flto=thin -g" PY_LDFLAGS_NOLTO = "-L/usr/local/lib -flto=thin" PY_SQLITE_ENABLE_LOAD_EXTENSION = "0" PY_SQLITE_HAVE_SERIALIZE = "0" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC" PY_SUPPORT_TIER = "0" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_STATS = "0" Py_SUNOS_VERSION = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "@READELF@" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python312/work/Python-3.12.12" SCRIPTDIR = "/usr/local/lib" SCRIPT_2TO3 = "build/scripts-3.12/2to3-3.12" SCRIPT_IDLE = "build/scripts-3.12/idle3.12" SCRIPT_PYDOC = "build/scripts-3.12/pydoc3.12" SETPGRP_HAVE_ARG = "1" SHAREDMODS = "Modules/array.cpython-312.so Modules/_asyncio.cpython-312.so Modules/_bisect.cpython-312.so Modules/_contextvars.cpython-312.so Modules/_csv.cpython-312.so Modules/_heapq.cpython-312.so Modules/_json.cpython-312.so Modules/_lsprof.cpython-312.so Modules/_opcode.cpython-312.so Modules/_pickle.cpython-312.so Modules/_queue.cpython-312.so Modules/_random.cpython-312.so Modules/_struct.cpython-312.so Modules/_xxsubinterpreters.cpython-312.so Modules/_xxinterpchannels.cpython-312.so Modules/_zoneinfo.cpython-312.so Modules/audioop.cpython-312.so Modules/math.cpython-312.so Modules/cmath.cpython-312.so Modules/_statistics.cpython-312.so Modules/_datetime.cpython-312.so Modules/_decimal.cpython-312.so Modules/binascii.cpython-312.so Modules/_bz2.cpython-312.so Modules/_lzma.cpython-312.so Modules/zlib.cpython-312.so Modules/_dbm.cpython-312.so Modules/readline.cpython-312.so Modules/_md5.cpython-312.so Modules/_sha1.cpython-312.so Modules/_sha2.cpython-312.so Modules/_sha3.cpython-312.so Modules/_blake2.cpython-312.so Modules/pyexpat.cpython-312.so Modules/_elementtree.cpython-312.so Modules/_codecs_cn.cpython-312.so Modules/_codecs_hk.cpython-312.so Modules/_codecs_iso2022.cpython-312.so Modules/_codecs_jp.cpython-312.so Modules/_codecs_kr.cpython-312.so Modules/_codecs_tw.cpython-312.so Modules/_multibytecodec.cpython-312.so Modules/unicodedata.cpython-312.so Modules/_crypt.cpython-312.so Modules/fcntl.cpython-312.so Modules/grp.cpython-312.so Modules/mmap.cpython-312.so Modules/nis.cpython-312.so Modules/ossaudiodev.cpython-312.so Modules/_posixsubprocess.cpython-312.so Modules/resource.cpython-312.so Modules/select.cpython-312.so Modules/_socket.cpython-312.so Modules/syslog.cpython-312.so Modules/termios.cpython-312.so Modules/_posixshmem.cpython-312.so Modules/_multiprocessing.cpython-312.so Modules/_ctypes.cpython-312.so Modules/_curses.cpython-312.so Modules/_curses_panel.cpython-312.so Modules/_ssl.cpython-312.so Modules/_hashlib.cpython-312.so Modules/_uuid.cpython-312.so Modules/xxsubtype.cpython-312.so Modules/_xxtestfuzz.cpython-312.so Modules/_testbuffer.cpython-312.so Modules/_testinternalcapi.cpython-312.so Modules/_testcapi.cpython-312.so Modules/_testclinic.cpython-312.so Modules/_testimportmultiple.cpython-312.so Modules/_testmultiphase.cpython-312.so Modules/_testsinglephase.cpython-312.so Modules/_ctypes_test.cpython-312.so Modules/xxlimited.cpython-312.so Modules/xxlimited_35.cpython-312.so" SHELL = "/bin/sh -e" SHLIBS = "-lintl -ldl -L/usr/local/lib -lintl -lutil" SHLIB_SUFFIX = ".so" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SOABI = "cpython-312" SRCDIRS = "Modules Modules/_blake2 Modules/_ctypes Modules/_decimal Modules/_decimal/libmpdec Modules/_hacl Modules/_io Modules/_multiprocessing Modules/_sqlite Modules/_sre Modules/_testcapi Modules/_xxtestfuzz Modules/cjkcodecs Modules/expat Objects Parser Programs Python Python/frozen_modules Python/deepfreeze" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STATIC_LIBPYTHON = "1" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python312/work/Python-3.12.12 ./python -E" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python312/work/Python-3.12.12 ./python -E ./Tools/scripts/run_tests.py" TESTSUBDIRS = "idlelib/idle_test \" TESTTIMEOUT = "1200" TEST_MODULES = "yes" THREAD_STACK_SIZE = "0" TIMEMODULE_LIB = "0" TM_IN_SYS_TIME = "0" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "./Tools/build/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.12" WASM_ASSETS_DIR = "./usr/local" WASM_STDLIB = "./usr/local/lib/python3.12/os.py" WHEEL_PKG_DIR = "" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_EDITLINE = "0" WITH_FREELISTS = "1" WITH_LIBINTL = "1" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/wrkdirs/usr/ports/lang/python312/work/Python-3.12.12" abs_srcdir = "/wrkdirs/usr/ports/lang/python312/work/Python-3.12.12" base = "/usr/local" datarootdir = "/usr/local/share" exec_prefix = "/usr/local" installed_base = "/usr/local" installed_platbase = "/usr/local" platbase = "/usr/local" platlibdir = "lib" prefix = "/usr/local" projectbase = "/usr/local/bin" py_version = "3.12.12" py_version_nodot = "312" py_version_nodot_plat = "" py_version_short = "3.12" srcdir = "/usr/local/lib/python3.12/config-3.12" userbase = "/home/fleetingbytes/.local" maturin-1.16.0/sysconfig/cpython-freebsd-15.0-amd64.txt000066400000000000000000001320101527064705700224230ustar00rootroot00000000000000Platform: "freebsd-15.0-RELEASE-p5-amd64" Python version: "3.14" Current installation scheme: "posix_prefix" Paths: data = "/usr/local" include = "/usr/local/include/python3.14" platinclude = "/usr/local/include/python3.14" platlib = "/usr/local/lib/python3.14/site-packages" platstdlib = "/usr/local/lib/python3.14" purelib = "/usr/local/lib/python3.14/site-packages" scripts = "/usr/local/bin" stdlib = "/usr/local/lib/python3.14" Variables: ABIFLAGS = "" ABI_THREAD = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "0" AIX_GENUINE_CPLUSPLUS = "0" ALIGNOF_LONG = "8" ALIGNOF_MAX_ALIGN_T = "16" ALIGNOF_SIZE_T = "8" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" APP_STORE_COMPLIANCE_PATCH = "" AR = "/usr/bin/llvm-ar" ARFLAGS = "rcs" BASECFLAGS = "-fno-strict-overflow -Wsign-compare -Wunreachable-code" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/local/bin" BINLIBDEST = "/usr/local/lib/python3.14" BLDLIBRARY = "-L. -lpython3.14" BLDSHARED = "cc -pthread -shared -L/usr/local/lib" BOOTSTRAP_HEADERS = "\" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "amd64-portbld-freebsd15.0" BUILD_SCRIPTS_DIR = "build/scripts-3.14" BYTESTR_DEPS = "\" CC = "cc -pthread" CCSHARED = "-fPIC" CFLAGS = "-fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CODECS_COMMON_HEADERS = "./Modules/cjkcodecs/multibytecodec.h ./Modules/cjkcodecs/cjkcodecs.h" COMPILEALL_OPTS = "-j0" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS_NODIST = "-flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden" CONFIGURE_LDFLAGS_NODIST = "-flto=thin -g" CONFIGURE_LDFLAGS_NOLTO = "-flto=thin" CONFIG_ARGS = "'--enable-shared' '--without-ensurepip' '--without-pydebug' '--enable-ipv6' '--with-system-libmpdec' '--with-lto' '--with-pymalloc' '--prefix=/usr/local' '--localstatedir=/var' '--mandir=/usr/local/share/man' '--infodir=/usr/local/share/info/' '--build=amd64-portbld-freebsd15.0' 'build_alias=amd64-portbld-freebsd15.0' 'PKG_CONFIG=pkgconf' 'PKG_CONFIG_LIBDIR=/wrkdirs/usr/ports/lang/python314/work/.pkgconfig:/usr/local/libdata/pkgconfig:/usr/local/share/pkgconfig:/usr/libdata/pkgconfig' 'CC=cc' 'CFLAGS=-O2 -pipe -fstack-protector-strong -fno-strict-aliasing ' 'LDFLAGS= -L/usr/local/lib ' 'LIBS=-L/usr/local/lib -lintl' 'CPPFLAGS=-I/usr/local/include -I/usr/local/include' 'CPP=cpp'" CONFINCLUDEDIR = "/usr/local/include" CONFINCLUDEPY = "/usr/local/include/python3.14" COREPYTHONPATH = "" COVERAGE_INFO = "/wrkdirs/usr/ports/lang/python314/work/Python-3.14.3/coverage.info" COVERAGE_LCOV_OPTIONS = "--rc lcov_branch_coverage=1" COVERAGE_REPORT = "/wrkdirs/usr/ports/lang/python314/work/Python-3.14.3/lcov-report" COVERAGE_REPORT_OPTIONS = "--rc lcov_branch_coverage=1 --branch-coverage --title "CPython 3.14 LCOV report [commit $(shell )]"" CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" CXX = "c++ -pthread" DESTDIRS = "/usr/local /usr/local/lib /usr/local/lib/python3.14 /usr/local/lib/python3.14/lib-dynload" DESTLIB = "/usr/local/lib/python3.14" DESTPATH = "" DESTSHARED = "/usr/local/lib/python3.14/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DSYMUTIL = "" DSYMUTIL_PATH = "" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" EMSCRIPTEN_DIR = "./Tools/wasm/emscripten" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXENAME = "/usr/local/bin/python3.14" EXPORTSFROM = "" EXPORTSYMS = "" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-314.so" FILEMODE = "644" FREEZE_MODULE = "./_bootstrap_python ./Programs/_freeze_module.py" FREEZE_MODULE_BOOTSTRAP = "./Programs/_freeze_module" FREEZE_MODULE_BOOTSTRAP_DEPS = "Programs/_freeze_module" FREEZE_MODULE_DEPS = "_bootstrap_python ./Programs/_freeze_module.py" FROZEN_FILES_IN = "\" FROZEN_FILES_OUT = "\" GETPGRP_HAVE_ARG = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT = "1" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "0" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BACKTRACE = "0" HAVE_BIND = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "1" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "1" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_BZLIB_H = "0" HAVE_CHFLAGS = "1" HAVE_CHMOD = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_NANOSLEEP = "1" HAVE_CLOCK_SETTIME = "1" HAVE_CLOCK_T = "1" HAVE_CLOSEFROM = "1" HAVE_CLOSE_RANGE = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_CONNECT = "1" HAVE_COPY_FILE_RANGE = "1" HAVE_CTERMID = "1" HAVE_CTERMID_R = "1" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DB_H = "1" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DECL_UT_NAMESIZE = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "0" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLADDR = "1" HAVE_DLADDR1 = "0" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_EDITLINE_READLINE_H = "0" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EVENTFD = "1" HAVE_EXECINFO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FFI_CLOSURE_ALLOC = "1" HAVE_FFI_PREP_CIF_VAR = "1" HAVE_FFI_PREP_CLOSURE_LOC = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORK1 = "0" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "0" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "1" HAVE_GCC_ASM_FOR_X87 = "1" HAVE_GCC_UINT128_T = "1" HAVE_GDBM_DASH_NDBM_H = "0" HAVE_GDBM_H = "0" HAVE_GDBM_NDBM_H = "0" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETEGID = "1" HAVE_GETENTROPY = "1" HAVE_GETEUID = "1" HAVE_GETGID = "1" HAVE_GETGRENT = "1" HAVE_GETGRGID = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYADDR = "1" HAVE_GETHOSTBYNAME = "1" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETHOSTNAME = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETLOGIN_R = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPROTOBYNAME = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETRUSAGE = "1" HAVE_GETSERVBYNAME = "1" HAVE_GETSERVBYPORT = "1" HAVE_GETSID = "1" HAVE_GETSOCKNAME = "1" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETUID = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRANTPT = "1" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_NTOA = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "1" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "1" HAVE_LCHMOD = "1" HAVE_LCHOWN = "1" HAVE_LIBDB = "0" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBSENDFILE = "0" HAVE_LIBSQLITE3 = "0" HAVE_LIBUTIL_H = "1" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINK_H = "1" HAVE_LINUX_AUXVEC_H = "0" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_J1939_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "0" HAVE_LINUX_FS_H = "0" HAVE_LINUX_LIMITS_H = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETFILTER_IPV4_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_SCHED_H = "0" HAVE_LINUX_SOUNDCARD_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LINUX_WAIT_H = "0" HAVE_LISTEN = "1" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LOGIN_TTY = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_LZMA_H = "0" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MAXLOGNAME = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "1" HAVE_MEMRCHR = "1" HAVE_MINIX_CONFIG_H = "0" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "0" HAVE_NANOSLEEP = "1" HAVE_NCURSES = "0" HAVE_NCURSESW = "1" HAVE_NCURSESW_CURSES_H = "0" HAVE_NCURSESW_NCURSES_H = "0" HAVE_NCURSESW_PANEL_H = "0" HAVE_NCURSES_CURSES_H = "0" HAVE_NCURSES_H = "1" HAVE_NCURSES_NCURSES_H = "0" HAVE_NCURSES_PANEL_H = "0" HAVE_NDBM_H = "1" HAVE_NDIR_H = "0" HAVE_NETCAN_CAN_H = "0" HAVE_NETDB_H = "1" HAVE_NETINET_IN_H = "1" HAVE_NETLINK_NETLINK_H = "1" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_ETHERNET_H = "1" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION = "0" HAVE_OPENAT = "1" HAVE_OPENDIR = "1" HAVE_OPENPTY = "1" HAVE_PANEL = "0" HAVE_PANELW = "1" HAVE_PANEL_H = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_OPENPT = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSEFROM_NP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROCESS_VM_READV = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE_NP = "0" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETATTR_NP = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_GETNAME_NP = "1" HAVE_PTHREAD_GET_NAME_NP = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SETNAME_NP = "1" HAVE_PTHREAD_SET_NAME_NP = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTHREAD_STUBS = "0" HAVE_PTSNAME = "1" HAVE_PTSNAME_R = "1" HAVE_PTY_H = "0" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "0" HAVE_READLINE_READLINE_H = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RECVFROM = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPDISP_FUNC_T = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "1" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_CLOCKWAIT = "0" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SENDTO = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETJMP_H = "1" HAVE_SETLOCALE = "1" HAVE_SETNS = "0" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETSOCKOPT = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SHUTDOWN = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "1" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKET = "1" HAVE_SOCKETPAIR = "1" HAVE_SOCKLEN_T = "1" HAVE_SPAWN_H = "1" HAVE_SPLICE = "0" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "1" HAVE_STDINT_H = "1" HAVE_STDIO_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "1" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "1" HAVE_STRUCT_STAT_ST_GEN = "1" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYSLOG_H = "1" HAVE_SYSTEM = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_AUXV_H = "1" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "1" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENTFD_H = "1" HAVE_SYS_EVENT_H = "1" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "1" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_PIDFD_H = "0" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_SOUNDCARD_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "0" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMERFD_H = "1" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "0" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TIMEGM = "1" HAVE_TIMERFD_CREATE = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TTYNAME_R = "1" HAVE_TZNAME = "0" HAVE_UMASK = "1" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_UNLOCKPT = "1" HAVE_UNSHARE = "0" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UTMP_H = "0" HAVE_UT_NAMESIZE = "0" HAVE_UUID_CREATE = "1" HAVE_UUID_ENC_BE = "1" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_GENERATE_TIME_SAFE_STABLE_MAC = "0" HAVE_UUID_H = "1" HAVE_UUID_UUID_H = "0" HAVE_VFORK = "1" HAVE_WAIT = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_ZDICT_H = "0" HAVE_ZLIB_COPY = "1" HAVE_ZLIB_H = "0" HAVE_ZSTD_H = "0" HAVE__GETPTY = "0" HAVE___UINT128_T = "1" HOSTRUNNER = "" HOST_GNU_TYPE = "amd64-portbld-freebsd15.0" INCLDIRSTOMAKE = "/usr/local/include /usr/local/include /usr/local/include/python3.14 /usr/local/include/python3.14" INCLUDEDIR = "/usr/local/include" INCLUDEPY = "/usr/local/include/python3.14" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "install -m 0644" INSTALL_MIMALLOC = "yes" INSTALL_PROGRAM = "install -s -m 555" INSTALL_SCRIPT = "install -m 555" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.14.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" IPHONEOS_DEPLOYMENT_TARGET = "" JIT_DEPS = "\" LDCXXSHARED = "c++ -pthread -shared -L/usr/local/lib" LDFLAGS = "-L/usr/local/lib" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.14.so" LDLIBRARYDIR = "" LDSHARED = "cc -pthread -shared -L/usr/local/lib" LDVERSION = "3.14" LIBC = "" LIBDEST = "/usr/local/lib/python3.14" LIBDIR = "/usr/local/lib" LIBEXPAT_A = "Modules/expat/libexpat.a" LIBEXPAT_CFLAGS = "-I./Modules/expat -fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I./Include/internal/mimalloc -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -fPIC" LIBEXPAT_HEADERS = "\" LIBEXPAT_OBJS = "\" LIBHACL_BLAKE2_HEADERS = "\" LIBHACL_BLAKE2_LIB_SHARED = "\" LIBHACL_BLAKE2_LIB_STATIC = "Modules/_hacl/libHacl_Hash_BLAKE2.a" LIBHACL_BLAKE2_OBJS = "\" LIBHACL_BLAKE2_SIMD128_CFLAGS = "-msse -msse2 -msse3 -msse4.1 -msse4.2 -DHACL_CAN_COMPILE_VEC128" LIBHACL_BLAKE2_SIMD128_OBJS = "Modules/_hacl/Hacl_Hash_Blake2s_Simd128.o" LIBHACL_BLAKE2_SIMD256_CFLAGS = "-mavx2 -DHACL_CAN_COMPILE_VEC256" LIBHACL_BLAKE2_SIMD256_OBJS = "Modules/_hacl/Hacl_Hash_Blake2b_Simd256.o" LIBHACL_CFLAGS = "-I./Modules/_hacl -I./Modules/_hacl/include -D_BSD_SOURCE -D_DEFAULT_SOURCE -fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I./Include/internal/mimalloc -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -fPIC" LIBHACL_HEADERS = "\" LIBHACL_HMAC_HEADERS = "\" LIBHACL_HMAC_LIB_SHARED = "\" LIBHACL_HMAC_LIB_STATIC = "Modules/_hacl/libHacl_HMAC.a" LIBHACL_HMAC_OBJS = "\" LIBHACL_LDFLAGS = "" LIBHACL_MD5_HEADERS = "\" LIBHACL_MD5_LIB_SHARED = "\" LIBHACL_MD5_LIB_STATIC = "Modules/_hacl/libHacl_Hash_MD5.a" LIBHACL_MD5_OBJS = "\" LIBHACL_SHA1_HEADERS = "\" LIBHACL_SHA1_LIB_SHARED = "\" LIBHACL_SHA1_LIB_STATIC = "Modules/_hacl/libHacl_Hash_SHA1.a" LIBHACL_SHA1_OBJS = "\" LIBHACL_SHA2_HEADERS = "\" LIBHACL_SHA2_LIB_SHARED = "\" LIBHACL_SHA2_LIB_STATIC = "Modules/_hacl/libHacl_Hash_SHA2.a" LIBHACL_SHA2_OBJS = "\" LIBHACL_SHA3_HEADERS = "\" LIBHACL_SHA3_LIB_SHARED = "\" LIBHACL_SHA3_LIB_STATIC = "Modules/_hacl/libHacl_Hash_SHA3.a" LIBHACL_SHA3_OBJS = "\" LIBM = "-lm" LIBMPDEC_A = "Modules/_decimal/libmpdec/libmpdec.a" LIBMPDEC_CFLAGS = "-I/usr/local/include -fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I./Include/internal/mimalloc -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -fPIC" LIBMPDEC_HEADERS = "\" LIBMPDEC_OBJS = "\" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/local/libdata/pkgconfig" LIBPL = "/usr/local/lib/python3.14/config-3.14" LIBPYTHON = "" LIBRARY = "libpython3.14.a" LIBRARY_DEPS = "libpython3.14.a libpython3.14.so libpython3.so" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lintl -ldl -L/usr/local/lib -lintl -lutil" LIBSUBDIRS = "asyncio \" LINKCC = "cc -pthread" LINKFORSHARED = "-Wl,--export-dynamic" LINK_PYTHON_DEPS = "libpython3.14.a libpython3.14.so libpython3.so" LINK_PYTHON_OBJS = "-L. -lpython3.14" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "LLVM_PROFILE_FILE="$(shell pwd)/code-%p.profclangr"" LLVM_PROF_MERGER = "/usr/bin/llvm-profdata merge -output="$(shell pwd)/code.profclangd" "$(shell pwd)"/*.profclangr" LN = "ln" LOCALMODLIBS = "-lm" MACHDEP = "freebsd" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/local/lib/python3.14" MACOSX_DEPLOYMENT_TARGET = "" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/local/share/man" MIMALLOC_HEADERS = "\" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "array _asyncio _bisect _csv _heapq _json _lsprof _pickle _queue _random _remote_debugging _struct _interpreters _interpchannels _interpqueues _zoneinfo math cmath _statistics _decimal binascii _bz2 _lzma _zstd zlib _dbm readline _md5 _sha1 _sha2 _sha3 _blake2 _hmac pyexpat _elementtree _codecs_cn _codecs_hk _codecs_iso2022 _codecs_jp _codecs_kr _codecs_tw _multibytecodec unicodedata fcntl grp mmap _posixsubprocess resource select _socket syslog termios _posixshmem _multiprocessing _ctypes _curses _curses_panel _ssl _hashlib _uuid xxsubtype _xxtestfuzz _testbuffer _testinternalcapi _testcapi _testlimitedcapi _testclinic _testclinic_limited _testimportmultiple _testmultiphase _testsinglephase _ctypes_test xxlimited xxlimited_35 atexit faulthandler posix _signal _tracemalloc _suggestions _datetime _codecs _collections errno _io itertools _sre _sysconfig _thread time _types _typing _weakref _abc _functools _locale _opcode _operator _stat _symtable pwd" MODDISABLED_NAMES = "_gdbm _sqlite3 _tkinter" MODLIBS = "-lm" MODOBJS = "Modules/atexitmodule.o Modules/faulthandler.o Modules/posixmodule.o Modules/signalmodule.o Modules/_tracemalloc.o Modules/_suggestions.o Modules/_datetimemodule.o Modules/_codecsmodule.o Modules/_collectionsmodule.o Modules/errnomodule.o Modules/_io/_iomodule.o Modules/_io/iobase.o Modules/_io/fileio.o Modules/_io/bytesio.o Modules/_io/bufferedio.o Modules/_io/textio.o Modules/_io/stringio.o Modules/itertoolsmodule.o Modules/_sre/sre.o Modules/_sysconfig.o Modules/_threadmodule.o Modules/timemodule.o Modules/_typesmodule.o Modules/_typingmodule.o Modules/_weakref.o Modules/_abc.o Modules/_functoolsmodule.o Modules/_localemodule.o Modules/_opcode.o Modules/_operator.o Modules/_stat.o Modules/symtablemodule.o Modules/pwdmodule.o" MODSHARED_NAMES = "array _asyncio _bisect _csv _heapq _json _lsprof _pickle _queue _random _remote_debugging _struct _interpreters _interpchannels _interpqueues _zoneinfo math cmath _statistics _decimal binascii _bz2 _lzma _zstd zlib _dbm readline _md5 _sha1 _sha2 _sha3 _blake2 _hmac pyexpat _elementtree _codecs_cn _codecs_hk _codecs_iso2022 _codecs_jp _codecs_kr _codecs_tw _multibytecodec unicodedata fcntl grp mmap _posixsubprocess resource select _socket syslog termios _posixshmem _multiprocessing _ctypes _curses _curses_panel _ssl _hashlib _uuid xxsubtype _xxtestfuzz _testbuffer _testinternalcapi _testcapi _testlimitedcapi _testclinic _testclinic_limited _testimportmultiple _testmultiphase _testsinglephase _ctypes_test xxlimited xxlimited_35" MODULE_ARRAY_STATE = "yes" MODULE_ATEXIT_LDFLAGS = "" MODULE_BINASCII_CFLAGS = "-DUSE_ZLIB_CRC32" MODULE_BINASCII_LDFLAGS = "-L/lib -lz" MODULE_BINASCII_STATE = "yes" MODULE_CMATH_DEPS = "./Modules/_math.h" MODULE_CMATH_LDFLAGS = "-lm" MODULE_CMATH_STATE = "yes" MODULE_DEPS_SHARED = "Modules/config.c" MODULE_DEPS_STATIC = "Modules/config.c" MODULE_ERRNO_LDFLAGS = "" MODULE_FAULTHANDLER_LDFLAGS = "" MODULE_FCNTL_LDFLAGS = "" MODULE_FCNTL_STATE = "yes" MODULE_GRP_STATE = "yes" MODULE_ITERTOOLS_LDFLAGS = "" MODULE_MATH_DEPS = "./Modules/_math.h" MODULE_MATH_LDFLAGS = "-lm" MODULE_MATH_STATE = "yes" MODULE_MMAP_STATE = "yes" MODULE_OBJS = "\" MODULE_POSIX_LDFLAGS = "" MODULE_PWD_LDFLAGS = "" MODULE_PWD_STATE = "yes" MODULE_PYEXPAT_CFLAGS = "-I./Modules/expat" MODULE_PYEXPAT_DEPS = "\ Modules/expat/libexpat.a" MODULE_PYEXPAT_LDFLAGS = "-lm Modules/expat/libexpat.a" MODULE_PYEXPAT_STATE = "yes" MODULE_READLINE_CFLAGS = "-I/usr/local/include" MODULE_READLINE_LDFLAGS = "-L/usr/local/lib -lreadline" MODULE_READLINE_STATE = "yes" MODULE_RESOURCE_STATE = "yes" MODULE_SELECT_STATE = "yes" MODULE_SYSLOG_STATE = "yes" MODULE_TERMIOS_STATE = "yes" MODULE_TIME_LDFLAGS = "" MODULE_TIME_STATE = "yes" MODULE_UNICODEDATA_DEPS = "./Modules/unicodedata_db.h ./Modules/unicodename_db.h" MODULE_UNICODEDATA_STATE = "yes" MODULE_XXLIMITED_35_STATE = "yes" MODULE_XXLIMITED_STATE = "yes" MODULE_XXSUBTYPE_STATE = "yes" MODULE_ZLIB_CFLAGS = "" MODULE_ZLIB_LDFLAGS = "-L/lib -lz" MODULE_ZLIB_STATE = "yes" MODULE__ABC_LDFLAGS = "" MODULE__ASYNCIO_STATE = "yes" MODULE__BISECT_STATE = "yes" MODULE__BLAKE2_CFLAGS = "-I./Modules/_hacl -I./Modules/_hacl/include -D_BSD_SOURCE -D_DEFAULT_SOURCE -fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I./Include/internal/mimalloc -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -fPIC" MODULE__BLAKE2_DEPS = "./Modules/hashlib.h \ \" MODULE__BLAKE2_LDEPS = "\" MODULE__BLAKE2_LDFLAGS = "\" MODULE__BLAKE2_STATE = "yes" MODULE__BZ2_CFLAGS = "" MODULE__BZ2_LDFLAGS = "-lbz2" MODULE__BZ2_STATE = "yes" MODULE__CODECS_CN_DEPS = "./Modules/cjkcodecs/mappings_cn.h ./Modules/cjkcodecs/multibytecodec.h ./Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_CN_STATE = "yes" MODULE__CODECS_HK_DEPS = "./Modules/cjkcodecs/mappings_hk.h ./Modules/cjkcodecs/multibytecodec.h ./Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_HK_STATE = "yes" MODULE__CODECS_ISO2022_DEPS = "./Modules/cjkcodecs/mappings_jisx0213_pair.h ./Modules/cjkcodecs/alg_jisx0201.h ./Modules/cjkcodecs/emu_jisx0213_2000.h ./Modules/cjkcodecs/multibytecodec.h ./Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_ISO2022_STATE = "yes" MODULE__CODECS_JP_DEPS = "./Modules/cjkcodecs/mappings_jisx0213_pair.h ./Modules/cjkcodecs/alg_jisx0201.h ./Modules/cjkcodecs/emu_jisx0213_2000.h ./Modules/cjkcodecs/mappings_jp.h ./Modules/cjkcodecs/multibytecodec.h ./Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_JP_STATE = "yes" MODULE__CODECS_KR_DEPS = "./Modules/cjkcodecs/mappings_kr.h ./Modules/cjkcodecs/multibytecodec.h ./Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_KR_STATE = "yes" MODULE__CODECS_LDFLAGS = "" MODULE__CODECS_TW_DEPS = "./Modules/cjkcodecs/mappings_tw.h ./Modules/cjkcodecs/multibytecodec.h ./Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_TW_STATE = "yes" MODULE__COLLECTIONS_LDFLAGS = "" MODULE__CSV_STATE = "yes" MODULE__CTYPES_CFLAGS = "-fno-strict-overflow -I/usr/local/include" MODULE__CTYPES_DEPS = "./Modules/_ctypes/ctypes.h" MODULE__CTYPES_LDFLAGS = "-L/usr/local/lib -lffi -ldl" MODULE__CTYPES_MALLOC_CLOSURE = "" MODULE__CTYPES_STATE = "yes" MODULE__CTYPES_TEST_CFLAGS = "-I/usr/local/include" MODULE__CTYPES_TEST_DEPS = "./Modules/_ctypes/_ctypes_test_generated.c.h" MODULE__CTYPES_TEST_LDFLAGS = "-L/usr/local/lib -lffi -ldl -lm" MODULE__CTYPES_TEST_STATE = "yes" MODULE__CURSES_CFLAGS = "" MODULE__CURSES_DEPS = "./Include/py_curses.h" MODULE__CURSES_LDFLAGS = "-fstack-protector-strong -lncursesw -ltinfow" MODULE__CURSES_PANEL_CFLAGS = "" MODULE__CURSES_PANEL_DEPS = "./Include/py_curses.h" MODULE__CURSES_PANEL_LDFLAGS = "-fstack-protector-strong -lpanelw -fstack-protector-strong -lncursesw -ltinfow" MODULE__CURSES_PANEL_STATE = "yes" MODULE__CURSES_STATE = "yes" MODULE__DATETIME_DEPS = "./Include/datetime.h" MODULE__DATETIME_LDFLAGS = "-lm" MODULE__DATETIME_STATE = "yes" MODULE__DBM_CFLAGS = "-DUSE_NDBM" MODULE__DBM_LDFLAGS = "" MODULE__DBM_STATE = "yes" MODULE__DECIMAL_CFLAGS = "-I/usr/local/include" MODULE__DECIMAL_DEPS = "./Modules/_decimal/docstrings.h" MODULE__DECIMAL_LDFLAGS = "-L/usr/local/lib -lmpdec -lm" MODULE__DECIMAL_STATE = "yes" MODULE__ELEMENTTREE_CFLAGS = "-I./Modules/expat" MODULE__ELEMENTTREE_DEPS = "./Modules/pyexpat.c \ Modules/expat/libexpat.a" MODULE__ELEMENTTREE_STATE = "yes" MODULE__FUNCTOOLS_LDFLAGS = "" MODULE__GDBM_STATE = "missing" MODULE__HASHLIB_CFLAGS = "" MODULE__HASHLIB_DEPS = "./Modules/hashlib.h" MODULE__HASHLIB_LDFLAGS = "-lcrypto" MODULE__HASHLIB_STATE = "yes" MODULE__HEAPQ_STATE = "yes" MODULE__HMAC_CFLAGS = "-I./Modules/_hacl -I./Modules/_hacl/include -D_BSD_SOURCE -D_DEFAULT_SOURCE -fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I./Include/internal/mimalloc -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -fPIC" MODULE__HMAC_DEPS = "./Modules/hashlib.h \ \" MODULE__HMAC_LDEPS = "\" MODULE__HMAC_LDFLAGS = "\" MODULE__HMAC_STATE = "yes" MODULE__INTERPCHANNELS_STATE = "yes" MODULE__INTERPQUEUES_STATE = "yes" MODULE__INTERPRETERS_STATE = "yes" MODULE__IO_CFLAGS = "-I./Modules/_io" MODULE__IO_DEPS = "./Modules/_io/_iomodule.h" MODULE__IO_LDFLAGS = "" MODULE__IO_STATE = "yes" MODULE__JSON_STATE = "yes" MODULE__LOCALE_LDFLAGS = "" MODULE__LSPROF_STATE = "yes" MODULE__LZMA_CFLAGS = "" MODULE__LZMA_LDFLAGS = "-llzma" MODULE__LZMA_STATE = "yes" MODULE__MD5_CFLAGS = "-I./Modules/_hacl -I./Modules/_hacl/include -D_BSD_SOURCE -D_DEFAULT_SOURCE -fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I./Include/internal/mimalloc -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -fPIC" MODULE__MD5_DEPS = "./Modules/hashlib.h \ \" MODULE__MD5_LDEPS = "\" MODULE__MD5_LDFLAGS = "\" MODULE__MD5_STATE = "yes" MODULE__MULTIBYTECODEC_DEPS = "./Modules/cjkcodecs/multibytecodec.h" MODULE__MULTIBYTECODEC_STATE = "yes" MODULE__MULTIPROCESSING_CFLAGS = "-I./Modules/_multiprocessing" MODULE__MULTIPROCESSING_STATE = "yes" MODULE__OPCODE_LDFLAGS = "" MODULE__OPERATOR_LDFLAGS = "" MODULE__PICKLE_STATE = "yes" MODULE__POSIXSHMEM_CFLAGS = "-I./Modules/_multiprocessing" MODULE__POSIXSHMEM_LDFLAGS = "" MODULE__POSIXSHMEM_STATE = "yes" MODULE__POSIXSUBPROCESS_STATE = "yes" MODULE__QUEUE_STATE = "yes" MODULE__RANDOM_STATE = "yes" MODULE__REMOTE_DEBUGGING_STATE = "yes" MODULE__SCPROXY_STATE = "n/a" MODULE__SHA1_CFLAGS = "-I./Modules/_hacl -I./Modules/_hacl/include -D_BSD_SOURCE -D_DEFAULT_SOURCE -fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I./Include/internal/mimalloc -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -fPIC" MODULE__SHA1_DEPS = "./Modules/hashlib.h \ \" MODULE__SHA1_LDEPS = "\" MODULE__SHA1_LDFLAGS = "\" MODULE__SHA1_STATE = "yes" MODULE__SHA2_CFLAGS = "-I./Modules/_hacl -I./Modules/_hacl/include -D_BSD_SOURCE -D_DEFAULT_SOURCE -fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I./Include/internal/mimalloc -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -fPIC" MODULE__SHA2_DEPS = "./Modules/hashlib.h \ \" MODULE__SHA2_LDEPS = "\" MODULE__SHA2_LDFLAGS = "\" MODULE__SHA2_STATE = "yes" MODULE__SHA3_CFLAGS = "-I./Modules/_hacl -I./Modules/_hacl/include -D_BSD_SOURCE -D_DEFAULT_SOURCE -fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I./Include/internal/mimalloc -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -fPIC" MODULE__SHA3_DEPS = "./Modules/hashlib.h \ \" MODULE__SHA3_LDEPS = "\" MODULE__SHA3_LDFLAGS = "\" MODULE__SHA3_STATE = "yes" MODULE__SIGNAL_LDFLAGS = "" MODULE__SOCKET_DEPS = "./Modules/socketmodule.h ./Modules/addrinfo.h ./Modules/getaddrinfo.c ./Modules/getnameinfo.c" MODULE__SOCKET_LDFLAGS = "" MODULE__SOCKET_STATE = "yes" MODULE__SQLITE3_DEPS = "./Modules/_sqlite/connection.h ./Modules/_sqlite/cursor.h ./Modules/_sqlite/microprotocols.h ./Modules/_sqlite/module.h ./Modules/_sqlite/prepare_protocol.h ./Modules/_sqlite/row.h ./Modules/_sqlite/util.h" MODULE__SQLITE3_STATE = "disabled" MODULE__SRE_LDFLAGS = "" MODULE__SSL_CFLAGS = "" MODULE__SSL_DEPS = "./Modules/_ssl.h ./Modules/_ssl/cert.c ./Modules/_ssl/debughelpers.c ./Modules/_ssl/misc.c ./Modules/_ssl_data_111.h ./Modules/_ssl_data_300.h ./Modules/socketmodule.h" MODULE__SSL_LDFLAGS = "-lssl -lcrypto" MODULE__SSL_STATE = "yes" MODULE__STATISTICS_LDFLAGS = "-lm" MODULE__STATISTICS_STATE = "yes" MODULE__STAT_LDFLAGS = "" MODULE__STRUCT_STATE = "yes" MODULE__SUGGESTIONS_LDFLAGS = "" MODULE__SYMTABLE_LDFLAGS = "" MODULE__SYSCONFIG_LDFLAGS = "" MODULE__TESTBUFFER_STATE = "yes" MODULE__TESTCAPI_DEPS = "./Modules/_testcapi/parts.h ./Modules/_testcapi/util.h" MODULE__TESTCAPI_LDFLAGS = "" MODULE__TESTCAPI_STATE = "yes" MODULE__TESTCLINIC_LIMITED_STATE = "yes" MODULE__TESTCLINIC_STATE = "yes" MODULE__TESTIMPORTMULTIPLE_STATE = "yes" MODULE__TESTINTERNALCAPI_DEPS = "./Modules/_testinternalcapi/parts.h" MODULE__TESTINTERNALCAPI_STATE = "yes" MODULE__TESTLIMITEDCAPI_DEPS = "./Modules/_testlimitedcapi/testcapi_long.h ./Modules/_testlimitedcapi/parts.h ./Modules/_testlimitedcapi/util.h" MODULE__TESTLIMITEDCAPI_STATE = "yes" MODULE__TESTMULTIPHASE_STATE = "yes" MODULE__TESTSINGLEPHASE_STATE = "yes" MODULE__THREAD_LDFLAGS = "" MODULE__TKINTER_STATE = "missing" MODULE__TRACEMALLOC_LDFLAGS = "" MODULE__TYPES_LDFLAGS = "" MODULE__TYPES_STATE = "yes" MODULE__TYPING_LDFLAGS = "" MODULE__TYPING_STATE = "yes" MODULE__UUID_CFLAGS = "" MODULE__UUID_LDFLAGS = "" MODULE__UUID_STATE = "yes" MODULE__WEAKREF_LDFLAGS = "" MODULE__XXTESTFUZZ_STATE = "yes" MODULE__ZONEINFO_STATE = "yes" MODULE__ZSTD_CFLAGS = "-I/usr/local/include" MODULE__ZSTD_DEPS = "./Modules/_zstd/_zstdmodule.h ./Modules/_zstd/buffer.h ./Modules/_zstd/zstddict.h" MODULE__ZSTD_LDFLAGS = "-L/usr/local/lib -lzstd" MODULE__ZSTD_STATE = "yes" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPT = "-DNDEBUG" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ \ Parser/myreadline.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "-fprofile-instr-generate" PGO_PROF_USE_FLAG = "-fprofile-instr-use="$(shell pwd)/code.profclangd"" PLATLIBDIR = "lib" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo --timeout=" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKINSTALLNAMEPREFIX = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_BUILD_DEPS = "python" PYTHON_FOR_FREEZE = "./_bootstrap_python" PYTHON_FOR_REGEN = "" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha2,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I./Include/internal/mimalloc -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing" PY_CFLAGS_NODIST = "-flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I./Include/internal/mimalloc" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I./Include/internal/mimalloc -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-L/usr/local/lib -flto=thin -g" PY_CPPFLAGS = "-I. -I./Include -I/usr/local/include -I/usr/local/include" PY_ENABLE_SHARED = "1" PY_HAVE_PERF_TRAMPOLINE = "0" PY_LDFLAGS = "-L/usr/local/lib" PY_LDFLAGS_NODIST = "-flto=thin -g" PY_LDFLAGS_NOLTO = "-L/usr/local/lib -flto=thin" PY_SQLITE_ENABLE_LOAD_EXTENSION = "0" PY_SQLITE_HAVE_SERIALIZE = "0" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-fno-strict-overflow -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -fstack-protector-strong -fno-strict-aliasing -flto=thin -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I./Include/internal/mimalloc -I. -I./Include -I/usr/local/include -I/usr/local/include -fPIC" PY_SUPPORT_TIER = "0" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_GIL_DISABLED = "0" Py_HASH_ALGORITHM = "0" Py_REMOTE_DEBUG = "1" Py_RL_STARTUP_HOOK_TAKES_ARGS = "0" Py_STATS = "0" Py_SUNOS_VERSION = "0" Py_TAIL_CALL_INTERP = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io \" READELF = "@READELF@" RESSRCDIR = "" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python314/work/Python-3.14.3" SCRIPTDIR = "/usr/local/lib" SCRIPT_IDLE = "build/scripts-3.14/idle3.14" SCRIPT_PYDOC = "build/scripts-3.14/pydoc3.14" SETPGRP_HAVE_ARG = "1" SHAREDMODS = "Modules/array.cpython-314.so Modules/_asyncio.cpython-314.so Modules/_bisect.cpython-314.so Modules/_csv.cpython-314.so Modules/_heapq.cpython-314.so Modules/_json.cpython-314.so Modules/_lsprof.cpython-314.so Modules/_pickle.cpython-314.so Modules/_queue.cpython-314.so Modules/_random.cpython-314.so Modules/_remote_debugging.cpython-314.so Modules/_struct.cpython-314.so Modules/_interpreters.cpython-314.so Modules/_interpchannels.cpython-314.so Modules/_interpqueues.cpython-314.so Modules/_zoneinfo.cpython-314.so Modules/math.cpython-314.so Modules/cmath.cpython-314.so Modules/_statistics.cpython-314.so Modules/_decimal.cpython-314.so Modules/binascii.cpython-314.so Modules/_bz2.cpython-314.so Modules/_lzma.cpython-314.so Modules/_zstd.cpython-314.so Modules/zlib.cpython-314.so Modules/_dbm.cpython-314.so Modules/readline.cpython-314.so Modules/_md5.cpython-314.so Modules/_sha1.cpython-314.so Modules/_sha2.cpython-314.so Modules/_sha3.cpython-314.so Modules/_blake2.cpython-314.so Modules/_hmac.cpython-314.so Modules/pyexpat.cpython-314.so Modules/_elementtree.cpython-314.so Modules/_codecs_cn.cpython-314.so Modules/_codecs_hk.cpython-314.so Modules/_codecs_iso2022.cpython-314.so Modules/_codecs_jp.cpython-314.so Modules/_codecs_kr.cpython-314.so Modules/_codecs_tw.cpython-314.so Modules/_multibytecodec.cpython-314.so Modules/unicodedata.cpython-314.so Modules/fcntl.cpython-314.so Modules/grp.cpython-314.so Modules/mmap.cpython-314.so Modules/_posixsubprocess.cpython-314.so Modules/resource.cpython-314.so Modules/select.cpython-314.so Modules/_socket.cpython-314.so Modules/syslog.cpython-314.so Modules/termios.cpython-314.so Modules/_posixshmem.cpython-314.so Modules/_multiprocessing.cpython-314.so Modules/_ctypes.cpython-314.so Modules/_curses.cpython-314.so Modules/_curses_panel.cpython-314.so Modules/_ssl.cpython-314.so Modules/_hashlib.cpython-314.so Modules/_uuid.cpython-314.so Modules/xxsubtype.cpython-314.so Modules/_xxtestfuzz.cpython-314.so Modules/_testbuffer.cpython-314.so Modules/_testinternalcapi.cpython-314.so Modules/_testcapi.cpython-314.so Modules/_testlimitedcapi.cpython-314.so Modules/_testclinic.cpython-314.so Modules/_testclinic_limited.cpython-314.so Modules/_testimportmultiple.cpython-314.so Modules/_testmultiphase.cpython-314.so Modules/_testsinglephase.cpython-314.so Modules/_ctypes_test.cpython-314.so Modules/xxlimited.cpython-314.so Modules/xxlimited_35.cpython-314.so" SHELL = "/bin/sh -e" SHLIBS = "-lintl -ldl -L/usr/local/lib -lintl -lutil" SHLIB_SUFFIX = ".so" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SOABI = "cpython-314" SRCDIRS = "Modules Modules/_ctypes Modules/_decimal Modules/_decimal/libmpdec Modules/_hacl Modules/_io Modules/_multiprocessing Modules/_sqlite Modules/_sre Modules/_testcapi Modules/_testinternalcapi Modules/_testlimitedcapi Modules/_xxtestfuzz Modules/_zstd Modules/cjkcodecs Modules/expat Objects Objects/mimalloc Objects/mimalloc/prim Parser Parser/tokenizer Parser/lexer Programs Python Python/frozen_modules" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STATIC_LIBPYTHON = "1" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python314/work/Python-3.14.3 ./python -E" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/wrkdirs/usr/ports/lang/python314/work/Python-3.14.3 ./python -E -m test" TESTSUBDIRS = "idlelib/idle_test \" TESTTIMEOUT = "" TEST_MODULES = "yes" THREAD_STACK_SIZE = "0" TIMEMODULE_LIB = "0" TM_IN_SYS_TIME = "0" TOKENIZER_HEADERS = "\" TOKENIZER_OBJS = "\" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "./Tools/build/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.14" WEBEX2 = "web_example_pyrepl_jspi" WEBEX2_DIR = "./Tools/wasm/emscripten/web_example_pyrepl_jspi/" WEBEX_DIR = "./Tools/wasm/emscripten/web_example/" WHEEL_PKG_DIR = "" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_EDITLINE = "0" WITH_LIBINTL = "1" WITH_MIMALLOC = "1" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" ZIP_STDLIB = "python3.14.zip" abi_thread = "" abiflags = "" abs_builddir = "/wrkdirs/usr/ports/lang/python314/work/Python-3.14.3" abs_srcdir = "/wrkdirs/usr/ports/lang/python314/work/Python-3.14.3" base = "/usr/local" datarootdir = "/usr/local/share" exec_prefix = "/usr/local" host_exec_prefix = "/usr/local" host_prefix = "/usr/local" implementation = "Python" implementation_lower = "python" installed_base = "/usr/local" installed_platbase = "/usr/local" platbase = "/usr/local" platlibdir = "lib" prefix = "/usr/local" projectbase = "/usr/local/bin" py_version = "3.14.3" py_version_nodot = "314" py_version_nodot_plat = "" py_version_short = "3.14" srcdir = "/usr/local/lib/python3.14/config-3.14" userbase = "/home/fleetingbytes/.local" maturin-1.16.0/sysconfig/cpython-gnu-3.12.txt000066400000000000000000001205601527064705700207000ustar00rootroot00000000000000Platform: "gnu-0.9-i686-AT386" Python version: "3.12" Current installation scheme: "posix_local" Paths: data = "/usr/local" include = "/usr/include/python3.12" platinclude = "/usr/include/python3.12" platlib = "/usr/local/lib/python3.12/dist-packages" platstdlib = "/usr/lib/python3.12" purelib = "/usr/local/lib/python3.12/dist-packages" scripts = "/usr/local/bin" stdlib = "/usr/lib/python3.12" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "0" AIX_GENUINE_CPLUSPLUS = "0" ALIGNOF_LONG = "4" ALIGNOF_MAX_ALIGN_T = "16" ALIGNOF_SIZE_T = "4" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "i686-gnu-ar" ARFLAGS = "rcs" BASECFLAGS = "-fno-strict-overflow -Wsign-compare" BASECPPFLAGS = "-IObjects -IInclude -IPython" BASEMODLIBS = "" BINDIR = "/usr/bin" BINLIBDEST = "/usr/lib/i386-gnu/python3.12" BLDLIBRARY = "-lpython3.12" BLDSHARED = "i686-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro" BOOTSTRAP_HEADERS = "\" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "i686-unknown-gnu0.9" BUILD_SCRIPTS_DIR = "build/scripts-3.12" BYTESTR_DEPS = "\" CC = "i686-gnu-gcc -pthread" CCSHARED = "-fPIC" CFLAGS = "-fno-strict-overflow -Wsign-compare -DNDEBUG -g -O2 -Wall" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CODECS_COMMON_HEADERS = "../Modules/cjkcodecs/multibytecodec.h ../Modules/cjkcodecs/cjkcodecs.h" COMPILEALL_OPTS = "-j0" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "" CONFIGURE_CFLAGS_NODIST = "-Wdate-time -D_FORTIFY_SOURCE=2 -g -Werror=implicit-function-declaration -fstack-protector -Wformat -Werror=format-security -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden" CONFIGURE_CPPFLAGS = "" CONFIGURE_LDFLAGS = " -Wl,-z,relro" CONFIGURE_LDFLAGS_NODIST = " -Wl,-z,relro" CONFIGURE_LDFLAGS_NOLTO = "" CONFIG_ARGS = "'--enable-shared' '--prefix=/usr' '--libdir=/usr/lib/i386-gnu' '--enable-ipv6' '--enable-loadable-sqlite-extensions' '--with-dbmliborder=bdb:gdbm' '--with-computed-gotos' '--without-ensurepip' '--with-system-expat' '--with-ssl-default-suites=openssl' '--with-wheel-pkg-dir=/usr/share/python-wheels/' 'MKDIR_P=/bin/mkdir -p' 'CC=i686-gnu-gcc'" CONFINCLUDEDIR = "/usr/include" CONFINCLUDEPY = "/usr/include/python3.12" COREPYTHONPATH = "" COVERAGE_INFO = "/build/python3.12-lLOrN4/python3.12-3.12.7/build-shared/coverage.info" COVERAGE_LCOV_OPTIONS = "--rc lcov_branch_coverage=1" COVERAGE_REPORT = "/build/python3.12-lLOrN4/python3.12-3.12.7/build-shared/lcov-report" COVERAGE_REPORT_OPTIONS = "--rc lcov_branch_coverage=1 --branch-coverage --title "CPython 3.12 LCOV report [commit $(shell )]"" CPPFLAGS = "-IObjects -IInclude -IPython -I. -I../Include" CXX = "i686-gnu-g++ -pthread" DEEPFREEZE_C = "Python/deepfreeze/deepfreeze.c" DEEPFREEZE_DEPS = "../Tools/build/deepfreeze.py _bootstrap_python ../Programs/_freeze_module.py \" DEEPFREEZE_OBJS = "Python/deepfreeze/deepfreeze.o" DESTDIRS = "/usr /usr/lib/i386-gnu /usr/lib/i386-gnu/python3.12 /usr/lib/python3.12/lib-dynload" DESTLIB = "/usr/lib/python3.12" DESTPATH = "" DESTSHARED = "/usr/lib/python3.12/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DSYMUTIL = "" DSYMUTIL_PATH = "" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXENAME = "/usr/bin/python3.12" EXPORTSFROM = "" EXPORTSYMS = "" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-312-i386-gnu.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FREEZE_MODULE = "./_bootstrap_python ../Programs/_freeze_module.py" FREEZE_MODULE_BOOTSTRAP = "./Programs/_freeze_module" FREEZE_MODULE_BOOTSTRAP_DEPS = "Programs/_freeze_module" FREEZE_MODULE_DEPS = "_bootstrap_python ../Programs/_freeze_module.py" FROZEN_FILES_IN = "\" FROZEN_FILES_OUT = "\" GETPGRP_HAVE_ARG = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT = "1" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "1" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_BZLIB_H = "0" HAVE_CHFLAGS = "1" HAVE_CHMOD = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_NANOSLEEP = "1" HAVE_CLOCK_SETTIME = "1" HAVE_CLOSE_RANGE = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_CONNECT = "1" HAVE_COPY_FILE_RANGE = "0" HAVE_CRYPT_H = "1" HAVE_CRYPT_R = "1" HAVE_CTERMID = "1" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DB_H = "1" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "0" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_EDITLINE_READLINE_H = "0" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EVENTFD = "0" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FFI_CLOSURE_ALLOC = "1" HAVE_FFI_PREP_CIF_VAR = "1" HAVE_FFI_PREP_CLOSURE_LOC = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORK1 = "0" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "1" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "0" HAVE_GCC_ASM_FOR_X87 = "1" HAVE_GCC_UINT128_T = "0" HAVE_GDBM_DASH_NDBM_H = "0" HAVE_GDBM_H = "1" HAVE_GDBM_NDBM_H = "0" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETEGID = "1" HAVE_GETENTROPY = "1" HAVE_GETEUID = "1" HAVE_GETGID = "1" HAVE_GETGRGID = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYADDR = "1" HAVE_GETHOSTBYNAME = "1" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETHOSTNAME = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPROTOBYNAME = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETRUSAGE = "1" HAVE_GETSERVBYNAME = "1" HAVE_GETSERVBYPORT = "1" HAVE_GETSID = "1" HAVE_GETSOCKNAME = "1" HAVE_GETSPENT = "1" HAVE_GETSPNAM = "1" HAVE_GETUID = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_IEEEFP_H = "0" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_NTOA = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "0" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "1" HAVE_LCHOWN = "1" HAVE_LIBB2 = "0" HAVE_LIBDB = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBSQLITE3 = "1" HAVE_LIBUTIL_H = "0" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_AUXVEC_H = "0" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_J1939_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "0" HAVE_LINUX_FS_H = "0" HAVE_LINUX_LIMITS_H = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_SOUNDCARD_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LINUX_WAIT_H = "0" HAVE_LISTEN = "1" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LOGIN_TTY = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_LZMA_H = "0" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "0" HAVE_MEMRCHR = "1" HAVE_MINIX_CONFIG_H = "0" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "1" HAVE_NANOSLEEP = "1" HAVE_NCURSESW = "1" HAVE_NCURSES_H = "1" HAVE_NDBM_H = "0" HAVE_NDIR_H = "0" HAVE_NETCAN_CAN_H = "0" HAVE_NETDB_H = "1" HAVE_NETINET_IN_H = "1" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_ETHERNET_H = "1" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION = "0" HAVE_OPENAT = "1" HAVE_OPENDIR = "1" HAVE_OPENPTY = "1" HAVE_PANEL_H = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "0" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "1" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "0" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTHREAD_STUBS = "0" HAVE_PTY_H = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "1" HAVE_READLINE_READLINE_H = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RECVFROM = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPDISP_FUNC_T = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_RPC_RPC_H = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "0" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "0" HAVE_SCHED_SETAFFINITY = "0" HAVE_SCHED_SETPARAM = "0" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_CLOCKWAIT = "1" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SENDTO = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETJMP_H = "1" HAVE_SETLOCALE = "1" HAVE_SETNS = "0" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETSOCKOPT = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "1" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SHUTDOWN = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "1" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKET = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SPLICE = "0" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "0" HAVE_STDINT_H = "1" HAVE_STDIO_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "1" HAVE_STRUCT_STAT_ST_GEN = "1" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYSLOG_H = "1" HAVE_SYSTEM = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_AUXV_H = "1" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "0" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENTFD_H = "0" HAVE_SYS_EVENT_H = "0" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "0" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "1" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_SOUNDCARD_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "1" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "1" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "1" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TTYNAME = "1" HAVE_TZNAME = "0" HAVE_UMASK = "1" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_UNSHARE = "0" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UTMP_H = "1" HAVE_UUID_CREATE = "0" HAVE_UUID_ENC_BE = "0" HAVE_UUID_GENERATE_TIME_SAFE = "1" HAVE_UUID_H = "1" HAVE_UUID_UUID_H = "0" HAVE_VFORK = "1" HAVE_WAIT = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_ZLIB_COPY = "1" HAVE_ZLIB_H = "0" HAVE__GETPTY = "0" HOSTRUNNER = "" HOST_GNU_TYPE = "i686-unknown-gnu0.9" INCLDIRSTOMAKE = "/usr/include /usr/include /usr/include/python3.12 /usr/include/python3.12" INCLUDEDIR = "/usr/include" INCLUDEPY = "/usr/include/python3.12" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "/usr/bin/install -c -m 644" INSTALL_PROGRAM = "/usr/bin/install -c" INSTALL_SCRIPT = "/usr/bin/install -c" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.12.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "i686-gnu-g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro" LDFLAGS = " -Wl,-z,relro" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.12.so" LDLIBRARYDIR = "" LDSHARED = "i686-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro" LDVERSION = "3.12" LIBC = "" LIBDEST = "/usr/lib/python3.12" LIBDIR = "/usr/lib/i386-gnu" LIBEXPAT_A = "Modules/expat/libexpat.a" LIBEXPAT_CFLAGS = "-fno-strict-overflow -Wsign-compare -DNDEBUG -g -O2 -Wall -Wdate-time -D_FORTIFY_SOURCE=2 -g -Werror=implicit-function-declaration -fstack-protector -Wformat -Werror=format-security -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I../Include/internal -IObjects -IInclude -IPython -I. -I../Include -fPIC -fPIC" LIBEXPAT_HEADERS = "\" LIBEXPAT_OBJS = "\" LIBHACL_CFLAGS = "-I../Modules/_hacl/include -D_BSD_SOURCE -D_DEFAULT_SOURCE -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O2 -Wall -Wdate-time -D_FORTIFY_SOURCE=2 -g -Werror=implicit-function-declaration -fstack-protector -Wformat -Werror=format-security -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I../Include/internal -IObjects -IInclude -IPython -I. -I../Include -fPIC -fPIC" LIBHACL_HEADERS = "\" LIBHACL_SHA2_A = "Modules/_hacl/libHacl_Hash_SHA2.a" LIBHACL_SHA2_HEADERS = "\" LIBHACL_SHA2_OBJS = "\" LIBM = "-lm" LIBMPDEC_A = "Modules/_decimal/libmpdec/libmpdec.a" LIBMPDEC_CFLAGS = "-I../Modules/_decimal/libmpdec -DCONFIG_32=1 -DANSI=1 -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O2 -Wall -Wdate-time -D_FORTIFY_SOURCE=2 -g -Werror=implicit-function-declaration -fstack-protector -Wformat -Werror=format-security -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I../Include/internal -IObjects -IInclude -IPython -I. -I../Include -fPIC -fPIC" LIBMPDEC_HEADERS = "\" LIBMPDEC_OBJS = "\" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/lib/i386-gnu/pkgconfig" LIBPL = "/usr/lib/python3.12/config-3.12-i386-gnu" LIBPYTHON = "" LIBRARY = "libpython3.12.a" LIBRARY_DEPS = "libpython3.12.a libpython3.12.so libpython3.so" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lpthread -ldl" LIBSUBDIRS = "asyncio \" LINKCC = "i686-gnu-gcc -pthread" LINKFORSHARED = "-Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions" LINK_PYTHON_DEPS = "libpython3.12.a libpython3.12.so libpython3.so" LINK_PYTHON_OBJS = "-L. -lpython3.12" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "true" LN = "ln" LOCALMODLIBS = "-lm -lm -lz -lm -lm -lexpat -lexpat Modules/_hacl/libHacl_Hash_SHA2.a -lz" MACHDEP = "gnu0" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/lib/i386-gnu/python3.12" MACOSX_DEPLOYMENT_TARGET = "" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "1" MAKESETUP = "../Modules/makesetup" MANDIR = "/usr/share/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "_bisect _csv _datetime _heapq _opcode _pickle _random _socket _statistics _struct array binascii cmath math select _elementtree pyexpat _blake2 _md5 _sha1 _sha2 _sha3 unicodedata _posixsubprocess fcntl grp spwd syslog zlib atexit faulthandler posix _signal _tracemalloc _codecs _collections errno _io itertools _sre _thread time _typing _weakref _abc _functools _locale _operator _stat _symtable pwd _asyncio _contextvars _json _lsprof _queue _xxsubinterpreters _xxinterpchannels _zoneinfo audioop _decimal _bz2 _lzma _dbm _gdbm readline _codecs_cn _codecs_hk _codecs_iso2022 _codecs_jp _codecs_kr _codecs_tw _multibytecodec _crypt mmap nis ossaudiodev resource termios _posixshmem _multiprocessing _ctypes _curses _curses_panel _sqlite3 _ssl _hashlib _uuid _tkinter xxsubtype _xxtestfuzz _testbuffer _testinternalcapi _testcapi _testclinic _testimportmultiple _testmultiphase _testsinglephase _ctypes_test xxlimited xxlimited_35" MODDISABLED_NAMES = "" MODLIBS = "-lm -lm -lz -lm -lm -lexpat -lexpat Modules/_hacl/libHacl_Hash_SHA2.a -lz" MODOBJS = "Modules/_bisectmodule.o Modules/_csv.o Modules/_datetimemodule.o Modules/_heapqmodule.o Modules/_opcode.o Modules/_pickle.o Modules/_randommodule.o Modules/socketmodule.o Modules/_statisticsmodule.o Modules/_struct.o Modules/arraymodule.o Modules/binascii.o Modules/cmathmodule.o Modules/mathmodule.o Modules/selectmodule.o Modules/_elementtree.o Modules/pyexpat.o Modules/_blake2/blake2module.o Modules/_blake2/blake2b_impl.o Modules/_blake2/blake2s_impl.o Modules/md5module.o Modules/_hacl/Hacl_Hash_MD5.o Modules/sha1module.o Modules/_hacl/Hacl_Hash_SHA1.o Modules/sha2module.o Modules/sha3module.o Modules/_hacl/Hacl_Hash_SHA3.o Modules/unicodedata.o Modules/_posixsubprocess.o Modules/fcntlmodule.o Modules/grpmodule.o Modules/spwdmodule.o Modules/syslogmodule.o Modules/zlibmodule.o Modules/atexitmodule.o Modules/faulthandler.o Modules/posixmodule.o Modules/signalmodule.o Modules/_tracemalloc.o Modules/_codecsmodule.o Modules/_collectionsmodule.o Modules/errnomodule.o Modules/_io/_iomodule.o Modules/_io/iobase.o Modules/_io/fileio.o Modules/_io/bytesio.o Modules/_io/bufferedio.o Modules/_io/textio.o Modules/_io/stringio.o Modules/itertoolsmodule.o Modules/_sre/sre.o Modules/_threadmodule.o Modules/timemodule.o Modules/_typingmodule.o Modules/_weakref.o Modules/_abc.o Modules/_functoolsmodule.o Modules/_localemodule.o Modules/_operator.o Modules/_stat.o Modules/symtablemodule.o Modules/pwdmodule.o" MODSHARED_NAMES = "_asyncio _contextvars _json _lsprof _queue _xxsubinterpreters _xxinterpchannels _zoneinfo audioop _decimal _bz2 _lzma _dbm _gdbm readline _codecs_cn _codecs_hk _codecs_iso2022 _codecs_jp _codecs_kr _codecs_tw _multibytecodec _crypt mmap nis ossaudiodev resource termios _posixshmem _multiprocessing _ctypes _curses _curses_panel _sqlite3 _ssl _hashlib _uuid _tkinter xxsubtype _xxtestfuzz _testbuffer _testinternalcapi _testcapi _testclinic _testimportmultiple _testmultiphase _testsinglephase _ctypes_test xxlimited xxlimited_35" MODULE_ARRAY_LDFLAGS = "" MODULE_ARRAY_STATE = "yes" MODULE_ATEXIT_LDFLAGS = "" MODULE_AUDIOOP_LDFLAGS = "-lm" MODULE_AUDIOOP_STATE = "yes" MODULE_BINASCII_CFLAGS = "-DUSE_ZLIB_CRC32" MODULE_BINASCII_LDFLAGS = "-lz" MODULE_BINASCII_STATE = "yes" MODULE_CMATH_DEPS = "../Modules/_math.h" MODULE_CMATH_LDFLAGS = "-lm" MODULE_CMATH_STATE = "yes" MODULE_DEPS_SHARED = "Modules/config.c" MODULE_DEPS_STATIC = "Modules/config.c" MODULE_ERRNO_LDFLAGS = "" MODULE_FAULTHANDLER_LDFLAGS = "" MODULE_FCNTL_LDFLAGS = "" MODULE_FCNTL_STATE = "yes" MODULE_GRP_LDFLAGS = "" MODULE_GRP_STATE = "yes" MODULE_ITERTOOLS_LDFLAGS = "" MODULE_MATH_DEPS = "../Modules/_math.h" MODULE_MATH_LDFLAGS = "-lm" MODULE_MATH_STATE = "yes" MODULE_MMAP_STATE = "yes" MODULE_NIS_CFLAGS = "-I/usr/include/tirpc" MODULE_NIS_LDFLAGS = "-lnsl -ltirpc" MODULE_NIS_STATE = "yes" MODULE_OBJS = "\" MODULE_OSSAUDIODEV_LDFLAGS = "" MODULE_OSSAUDIODEV_STATE = "yes" MODULE_POSIX_LDFLAGS = "" MODULE_PWD_LDFLAGS = "" MODULE_PWD_STATE = "yes" MODULE_PYEXPAT_CFLAGS = "" MODULE_PYEXPAT_DEPS = "" MODULE_PYEXPAT_LDFLAGS = "-lexpat" MODULE_PYEXPAT_STATE = "yes" MODULE_READLINE_CFLAGS = "-D_DEFAULT_SOURCE" MODULE_READLINE_LDFLAGS = "-lreadline" MODULE_READLINE_STATE = "yes" MODULE_RESOURCE_STATE = "yes" MODULE_SELECT_LDFLAGS = "" MODULE_SELECT_STATE = "yes" MODULE_SPWD_LDFLAGS = "" MODULE_SPWD_STATE = "yes" MODULE_SYSLOG_LDFLAGS = "" MODULE_SYSLOG_STATE = "yes" MODULE_TERMIOS_STATE = "yes" MODULE_TIME_LDFLAGS = "" MODULE_TIME_STATE = "yes" MODULE_UNICODEDATA_DEPS = "../Modules/unicodedata_db.h ../Modules/unicodename_db.h" MODULE_UNICODEDATA_LDFLAGS = "" MODULE_UNICODEDATA_STATE = "yes" MODULE_XXLIMITED_35_STATE = "yes" MODULE_XXLIMITED_STATE = "yes" MODULE_XXSUBTYPE_STATE = "yes" MODULE_ZLIB_CFLAGS = "" MODULE_ZLIB_LDFLAGS = "-lz" MODULE_ZLIB_STATE = "yes" MODULE__ABC_LDFLAGS = "" MODULE__ASYNCIO_STATE = "yes" MODULE__BISECT_LDFLAGS = "" MODULE__BISECT_STATE = "yes" MODULE__BLAKE2_CFLAGS = "" MODULE__BLAKE2_DEPS = "../Modules/_blake2/impl/blake2-config.h ../Modules/_blake2/impl/blake2-impl.h ../Modules/_blake2/impl/blake2.h ../Modules/_blake2/impl/blake2b-load-sse2.h ../Modules/_blake2/impl/blake2b-load-sse41.h ../Modules/_blake2/impl/blake2b-ref.c ../Modules/_blake2/impl/blake2b-round.h ../Modules/_blake2/impl/blake2b.c ../Modules/_blake2/impl/blake2s-load-sse2.h ../Modules/_blake2/impl/blake2s-load-sse41.h ../Modules/_blake2/impl/blake2s-load-xop.h ../Modules/_blake2/impl/blake2s-ref.c ../Modules/_blake2/impl/blake2s-round.h ../Modules/_blake2/impl/blake2s.c ../Modules/_blake2/blake2module.h ../Modules/hashlib.h" MODULE__BLAKE2_LDFLAGS = "" MODULE__BLAKE2_STATE = "yes" MODULE__BZ2_CFLAGS = "" MODULE__BZ2_LDFLAGS = "-lbz2" MODULE__BZ2_STATE = "yes" MODULE__CODECS_CN_DEPS = "../Modules/cjkcodecs/mappings_cn.h ../Modules/cjkcodecs/multibytecodec.h ../Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_CN_STATE = "yes" MODULE__CODECS_HK_DEPS = "../Modules/cjkcodecs/mappings_hk.h ../Modules/cjkcodecs/multibytecodec.h ../Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_HK_STATE = "yes" MODULE__CODECS_ISO2022_DEPS = "../Modules/cjkcodecs/mappings_jisx0213_pair.h ../Modules/cjkcodecs/alg_jisx0201.h ../Modules/cjkcodecs/emu_jisx0213_2000.h ../Modules/cjkcodecs/multibytecodec.h ../Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_ISO2022_STATE = "yes" MODULE__CODECS_JP_DEPS = "../Modules/cjkcodecs/mappings_jisx0213_pair.h ../Modules/cjkcodecs/alg_jisx0201.h ../Modules/cjkcodecs/emu_jisx0213_2000.h ../Modules/cjkcodecs/mappings_jp.h ../Modules/cjkcodecs/multibytecodec.h ../Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_JP_STATE = "yes" MODULE__CODECS_KR_DEPS = "../Modules/cjkcodecs/mappings_kr.h ../Modules/cjkcodecs/multibytecodec.h ../Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_KR_STATE = "yes" MODULE__CODECS_LDFLAGS = "" MODULE__CODECS_TW_DEPS = "../Modules/cjkcodecs/mappings_tw.h ../Modules/cjkcodecs/multibytecodec.h ../Modules/cjkcodecs/cjkcodecs.h" MODULE__CODECS_TW_STATE = "yes" MODULE__COLLECTIONS_LDFLAGS = "" MODULE__CONTEXTVARS_STATE = "yes" MODULE__CRYPT_CFLAGS = "" MODULE__CRYPT_LDFLAGS = "-lcrypt" MODULE__CRYPT_STATE = "yes" MODULE__CSV_LDFLAGS = "" MODULE__CSV_STATE = "yes" MODULE__CTYPES_CFLAGS = "-fno-strict-overflow" MODULE__CTYPES_DEPS = "../Modules/_ctypes/ctypes.h" MODULE__CTYPES_LDFLAGS = "-lffi -ldl" MODULE__CTYPES_MALLOC_CLOSURE = "" MODULE__CTYPES_STATE = "yes" MODULE__CTYPES_TEST_LDFLAGS = "-lm" MODULE__CTYPES_TEST_STATE = "yes" MODULE__CURSES_CFLAGS = "-D_DEFAULT_SOURCE" MODULE__CURSES_LDFLAGS = "-lncursesw -ltinfo" MODULE__CURSES_PANEL_CFLAGS = "-D_DEFAULT_SOURCE -D_DEFAULT_SOURCE" MODULE__CURSES_PANEL_LDFLAGS = "-lpanelw -lncursesw -ltinfo" MODULE__CURSES_PANEL_STATE = "yes" MODULE__CURSES_STATE = "yes" MODULE__DATETIME_LDFLAGS = "-lm" MODULE__DATETIME_STATE = "yes" MODULE__DBM_CFLAGS = "-DUSE_BERKDB" MODULE__DBM_LDFLAGS = "-ldb" MODULE__DBM_STATE = "yes" MODULE__DECIMAL_CFLAGS = "-I../Modules/_decimal/libmpdec -DCONFIG_32=1 -DANSI=1" MODULE__DECIMAL_DEPS = "../Modules/_decimal/docstrings.h \ Modules/_decimal/libmpdec/libmpdec.a" MODULE__DECIMAL_LDFLAGS = "-lm Modules/_decimal/libmpdec/libmpdec.a" MODULE__DECIMAL_STATE = "yes" MODULE__ELEMENTTREE_CFLAGS = "" MODULE__ELEMENTTREE_DEPS = "../Modules/pyexpat.c" MODULE__ELEMENTTREE_STATE = "yes" MODULE__FUNCTOOLS_LDFLAGS = "" MODULE__GDBM_CFLAGS = "" MODULE__GDBM_LDFLAGS = "-lgdbm" MODULE__GDBM_STATE = "yes" MODULE__HASHLIB_CFLAGS = "" MODULE__HASHLIB_DEPS = "../Modules/hashlib.h" MODULE__HASHLIB_LDFLAGS = "-lcrypto" MODULE__HASHLIB_STATE = "yes" MODULE__HEAPQ_LDFLAGS = "" MODULE__HEAPQ_STATE = "yes" MODULE__IO_CFLAGS = "-I../Modules/_io" MODULE__IO_DEPS = "../Modules/_io/_iomodule.h" MODULE__IO_LDFLAGS = "" MODULE__IO_STATE = "yes" MODULE__JSON_STATE = "yes" MODULE__LOCALE_LDFLAGS = "" MODULE__LSPROF_STATE = "yes" MODULE__LZMA_CFLAGS = "" MODULE__LZMA_LDFLAGS = "-llzma" MODULE__LZMA_STATE = "yes" MODULE__MD5_CFLAGS = "-I../Modules/_hacl/include -I../Modules/_hacl/internal -D_BSD_SOURCE -D_DEFAULT_SOURCE" MODULE__MD5_DEPS = "../Modules/hashlib.h \ Modules/_hacl/Hacl_Hash_MD5.h Modules/_hacl/Hacl_Hash_MD5.c" MODULE__MD5_STATE = "yes" MODULE__MULTIBYTECODEC_DEPS = "../Modules/cjkcodecs/multibytecodec.h" MODULE__MULTIBYTECODEC_STATE = "yes" MODULE__MULTIPROCESSING_CFLAGS = "-I../Modules/_multiprocessing" MODULE__MULTIPROCESSING_STATE = "yes" MODULE__OPCODE_LDFLAGS = "" MODULE__OPCODE_STATE = "yes" MODULE__OPERATOR_LDFLAGS = "" MODULE__PICKLE_LDFLAGS = "" MODULE__PICKLE_STATE = "yes" MODULE__POSIXSHMEM_CFLAGS = "-I../Modules/_multiprocessing" MODULE__POSIXSHMEM_LDFLAGS = "" MODULE__POSIXSHMEM_STATE = "yes" MODULE__POSIXSUBPROCESS_LDFLAGS = "" MODULE__POSIXSUBPROCESS_STATE = "yes" MODULE__QUEUE_STATE = "yes" MODULE__RANDOM_LDFLAGS = "" MODULE__RANDOM_STATE = "yes" MODULE__SCPROXY_STATE = "n/a" MODULE__SHA1_CFLAGS = "-I../Modules/_hacl/include -I../Modules/_hacl/internal -D_BSD_SOURCE -D_DEFAULT_SOURCE" MODULE__SHA1_DEPS = "../Modules/hashlib.h \ Modules/_hacl/Hacl_Hash_SHA1.h Modules/_hacl/Hacl_Hash_SHA1.c" MODULE__SHA1_STATE = "yes" MODULE__SHA2_CFLAGS = "-I../Modules/_hacl/include -I../Modules/_hacl/internal -D_BSD_SOURCE -D_DEFAULT_SOURCE" MODULE__SHA2_DEPS = "../Modules/hashlib.h \ Modules/_hacl/libHacl_Hash_SHA2.a" MODULE__SHA2_STATE = "yes" MODULE__SHA3_DEPS = "../Modules/hashlib.h \ Modules/_hacl/Hacl_Hash_SHA3.h Modules/_hacl/Hacl_Hash_SHA3.c" MODULE__SHA3_STATE = "yes" MODULE__SIGNAL_LDFLAGS = "" MODULE__SOCKET_DEPS = "../Modules/socketmodule.h ../Modules/addrinfo.h ../Modules/getaddrinfo.c ../Modules/getnameinfo.c" MODULE__SOCKET_LDFLAGS = "" MODULE__SOCKET_STATE = "yes" MODULE__SQLITE3_CFLAGS = "-I../Modules/_sqlite" MODULE__SQLITE3_DEPS = "../Modules/_sqlite/connection.h ../Modules/_sqlite/cursor.h ../Modules/_sqlite/microprotocols.h ../Modules/_sqlite/module.h ../Modules/_sqlite/prepare_protocol.h ../Modules/_sqlite/row.h ../Modules/_sqlite/util.h" MODULE__SQLITE3_LDFLAGS = "-lsqlite3" MODULE__SQLITE3_STATE = "yes" MODULE__SRE_LDFLAGS = "" MODULE__SSL_CFLAGS = "" MODULE__SSL_DEPS = "../Modules/_ssl.h ../Modules/_ssl/cert.c ../Modules/_ssl/debughelpers.c ../Modules/_ssl/misc.c ../Modules/_ssl_data.h ../Modules/_ssl_data_111.h ../Modules/_ssl_data_300.h ../Modules/socketmodule.h" MODULE__SSL_LDFLAGS = "-lssl -lcrypto" MODULE__SSL_STATE = "yes" MODULE__STATISTICS_LDFLAGS = "-lm" MODULE__STATISTICS_STATE = "yes" MODULE__STAT_LDFLAGS = "" MODULE__STRUCT_LDFLAGS = "" MODULE__STRUCT_STATE = "yes" MODULE__SYMTABLE_LDFLAGS = "" MODULE__TESTBUFFER_STATE = "yes" MODULE__TESTCAPI_DEPS = "../Modules/_testcapi/testcapi_long.h ../Modules/_testcapi/parts.h ../Modules/_testcapi/util.h" MODULE__TESTCAPI_STATE = "yes" MODULE__TESTCLINIC_STATE = "yes" MODULE__TESTIMPORTMULTIPLE_STATE = "yes" MODULE__TESTINTERNALCAPI_STATE = "yes" MODULE__TESTMULTIPHASE_STATE = "yes" MODULE__THREAD_LDFLAGS = "" MODULE__TKINTER_CFLAGS = "-I/usr/include/tcl8.6 -Wno-strict-prototypes -DWITH_APPINIT=1" MODULE__TKINTER_LDFLAGS = "-ltk8.6 -ltkstub8.6 -ltcl8.6 -ltclstub8.6" MODULE__TKINTER_STATE = "yes" MODULE__TRACEMALLOC_LDFLAGS = "" MODULE__TYPING_LDFLAGS = "" MODULE__TYPING_STATE = "yes" MODULE__UUID_CFLAGS = "-I/usr/include/uuid" MODULE__UUID_LDFLAGS = "-luuid" MODULE__UUID_STATE = "yes" MODULE__WEAKREF_LDFLAGS = "" MODULE__XXINTERPCHANNELS_STATE = "yes" MODULE__XXSUBINTERPRETERS_STATE = "yes" MODULE__XXTESTFUZZ_STATE = "yes" MODULE__ZONEINFO_STATE = "yes" MULTIARCH = "i386-gnu" MULTIARCH_CPPFLAGS = "-DMULTIARCH=\"i386-gnu\"" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPT = "-DNDEBUG -g -O2 -Wall" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ Parser/myreadline.o Parser/tokenizer.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "-fprofile-generate" PGO_PROF_USE_FLAG = "" PLATLIBDIR = "lib" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo --timeout=1200" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_BUILD_DEPS = "python" PYTHON_FOR_FREEZE = "./_bootstrap_python" PYTHON_FOR_REGEN = "" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha2,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-fno-strict-overflow -Wsign-compare -DNDEBUG -g -O2 -Wall -Wdate-time -D_FORTIFY_SOURCE=2 -g -Werror=implicit-function-declaration -fstack-protector -Wformat -Werror=format-security -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I../Include/internal -IObjects -IInclude -IPython -I. -I../Include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-fno-strict-overflow -Wsign-compare -DNDEBUG -g -O2 -Wall" PY_CFLAGS_NODIST = "-Wdate-time -D_FORTIFY_SOURCE=2 -g -Werror=implicit-function-declaration -fstack-protector -Wformat -Werror=format-security -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I../Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-fno-strict-overflow -Wsign-compare -DNDEBUG -g -O2 -Wall -Wdate-time -D_FORTIFY_SOURCE=2 -g -Werror=implicit-function-declaration -fstack-protector -Wformat -Werror=format-security -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I../Include/internal -IObjects -IInclude -IPython -I. -I../Include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = " -Wl,-z,relro -Wl,-z,relro" PY_CPPFLAGS = "-IObjects -IInclude -IPython -I. -I../Include" PY_ENABLE_SHARED = "1" PY_HAVE_PERF_TRAMPOLINE = "0" PY_LDFLAGS = " -Wl,-z,relro" PY_LDFLAGS_NODIST = " -Wl,-z,relro" PY_LDFLAGS_NOLTO = " -Wl,-z,relro" PY_SQLITE_ENABLE_LOAD_EXTENSION = "1" PY_SQLITE_HAVE_SERIALIZE = "1" PY_SSL_DEFAULT_CIPHERS = "2" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-fno-strict-overflow -Wsign-compare -DNDEBUG -g -O2 -Wall -Wdate-time -D_FORTIFY_SOURCE=2 -g -Werror=implicit-function-declaration -fstack-protector -Wformat -Werror=format-security -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I../Include/internal -IObjects -IInclude -IPython -I. -I../Include -fPIC" PY_SUPPORT_TIER = "0" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_STATS = "0" Py_SUNOS_VERSION = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "@READELF@" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/build/python3.12-lLOrN4/python3.12-3.12.7/build-shared" SCRIPTDIR = "/usr/lib" SCRIPT_2TO3 = "build/scripts-3.12/2to3-3.12" SCRIPT_IDLE = "build/scripts-3.12/idle3.12" SCRIPT_PYDOC = "build/scripts-3.12/pydoc3.12" SETPGRP_HAVE_ARG = "0" SHAREDMODS = "Modules/_asyncio.cpython-312-i386-gnu.so Modules/_contextvars.cpython-312-i386-gnu.so Modules/_json.cpython-312-i386-gnu.so Modules/_lsprof.cpython-312-i386-gnu.so Modules/_queue.cpython-312-i386-gnu.so Modules/_xxsubinterpreters.cpython-312-i386-gnu.so Modules/_xxinterpchannels.cpython-312-i386-gnu.so Modules/_zoneinfo.cpython-312-i386-gnu.so Modules/audioop.cpython-312-i386-gnu.so Modules/_decimal.cpython-312-i386-gnu.so Modules/_bz2.cpython-312-i386-gnu.so Modules/_lzma.cpython-312-i386-gnu.so Modules/_dbm.cpython-312-i386-gnu.so Modules/_gdbm.cpython-312-i386-gnu.so Modules/readline.cpython-312-i386-gnu.so Modules/_codecs_cn.cpython-312-i386-gnu.so Modules/_codecs_hk.cpython-312-i386-gnu.so Modules/_codecs_iso2022.cpython-312-i386-gnu.so Modules/_codecs_jp.cpython-312-i386-gnu.so Modules/_codecs_kr.cpython-312-i386-gnu.so Modules/_codecs_tw.cpython-312-i386-gnu.so Modules/_multibytecodec.cpython-312-i386-gnu.so Modules/_crypt.cpython-312-i386-gnu.so Modules/mmap.cpython-312-i386-gnu.so Modules/nis.cpython-312-i386-gnu.so Modules/ossaudiodev.cpython-312-i386-gnu.so Modules/resource.cpython-312-i386-gnu.so Modules/termios.cpython-312-i386-gnu.so Modules/_posixshmem.cpython-312-i386-gnu.so Modules/_multiprocessing.cpython-312-i386-gnu.so Modules/_ctypes.cpython-312-i386-gnu.so Modules/_curses.cpython-312-i386-gnu.so Modules/_curses_panel.cpython-312-i386-gnu.so Modules/_sqlite3.cpython-312-i386-gnu.so Modules/_ssl.cpython-312-i386-gnu.so Modules/_hashlib.cpython-312-i386-gnu.so Modules/_uuid.cpython-312-i386-gnu.so Modules/_tkinter.cpython-312-i386-gnu.so Modules/xxsubtype.cpython-312-i386-gnu.so Modules/_xxtestfuzz.cpython-312-i386-gnu.so Modules/_testbuffer.cpython-312-i386-gnu.so Modules/_testinternalcapi.cpython-312-i386-gnu.so Modules/_testcapi.cpython-312-i386-gnu.so Modules/_testclinic.cpython-312-i386-gnu.so Modules/_testimportmultiple.cpython-312-i386-gnu.so Modules/_testmultiphase.cpython-312-i386-gnu.so Modules/_testsinglephase.cpython-312-i386-gnu.so Modules/_ctypes_test.cpython-312-i386-gnu.so Modules/xxlimited.cpython-312-i386-gnu.so Modules/xxlimited_35.cpython-312-i386-gnu.so" SHELL = "/bin/sh -e" SHLIBS = "-lpthread -ldl" SHLIB_SUFFIX = ".so" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "12" SIZEOF_INT = "4" SIZEOF_LONG = "4" SIZEOF_LONG_DOUBLE = "12" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "4" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "4" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "4" SIZEOF_TIME_T = "4" SIZEOF_UINTPTR_T = "4" SIZEOF_VOID_P = "4" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SOABI = "cpython-312-i386-gnu" SRCDIRS = "Modules Modules/_blake2 Modules/_ctypes Modules/_decimal Modules/_decimal/libmpdec Modules/_hacl Modules/_io Modules/_multiprocessing Modules/_sqlite Modules/_sre Modules/_testcapi Modules/_xxtestfuzz Modules/cjkcodecs Modules/expat Objects Parser Programs Python Python/frozen_modules Python/deepfreeze" SRC_GDB_HOOKS = "../Tools/gdb/libpython.py" STATIC_LIBPYTHON = "1" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/build/python3.12-lLOrN4/python3.12-3.12.7/build-shared ./python -E" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/build/python3.12-lLOrN4/python3.12-3.12.7/build-shared ./python -E ../Tools/scripts/run_tests.py" TESTSUBDIRS = "idlelib/idle_test \" TESTTIMEOUT = "1200" TEST_MODULES = "yes" THREAD_STACK_SIZE = "0" TIMEMODULE_LIB = "0" TM_IN_SYS_TIME = "0" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "../Tools/build/update_file.py" USE_COMPUTED_GOTOS = "1" VERSION = "3.12" VPATH = ".." WASM_ASSETS_DIR = "./usr" WASM_STDLIB = "./usr/lib/python3.12/os.py" WHEEL_PKG_DIR = "/usr/share/python-wheels/" WINDOW_HAS_FLAGS = "0" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_EDITLINE = "0" WITH_FREELISTS = "1" WITH_LIBINTL = "0" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "1" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/build/python3.12-lLOrN4/python3.12-3.12.7/build-shared" abs_srcdir = "/build/python3.12-lLOrN4/python3.12-3.12.7/build-shared/.." base = "/usr" datarootdir = "/usr/share" exec_prefix = "/usr" installed_base = "/usr" installed_platbase = "/usr" multiarchsubdir = "/i386-gnu" platbase = "/usr" platlibdir = "lib" prefix = "/usr" projectbase = "/usr/bin" py_version = "3.12.7" py_version_nodot = "312" py_version_nodot_plat = "" py_version_short = "3.12" srcdir = "/usr/lib/python3.12/config-3.12-i386-gnu" userbase = "/home/samy/.local" maturin-1.16.0/sysconfig/cpython-haiku-3.9.txt000066400000000000000000000545461527064705700211500ustar00rootroot00000000000000Platform: "haiku-1-x86_64" Python version: "3.9" Current installation scheme: "posix_prefix" Paths: data = "/packages/python39-3.9.5-4/.self" include = "/packages/python39-3.9.5-4/.self/include/python3.9" platinclude = "/packages/python39-3.9.5-4/.self/include/python3.9" platlib = "/packages/python39-3.9.5-4/.self/lib/python3.9/site-packages" platstdlib = "/packages/python39-3.9.5-4/.self/lib/python3.9" purelib = "/packages/python39-3.9.5-4/.self/lib/python3.9/site-packages" scripts = "/packages/python39-3.9.5-4/.self/bin" stdlib = "/packages/python39-3.9.5-4/.self/lib/python3.9" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "0" AIX_GENUINE_CPLUSPLUS = "0" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/packages/python39-3.9.5-4/.self/bin" BINLIBDEST = "/packages/python39-3.9.5-4/.self/lib/python3.9" BLDLIBRARY = "-L. -lpython3.9" BLDSHARED = "gcc -shared" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "x86_64-unknown-haiku" BYTESTR_DEPS = "\" CC = "gcc" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -D_BSD_SOURCE -D_BSD_SOURCE" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "-D_BSD_SOURCE" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden" CONFIGURE_CPPFLAGS = "" CONFIGURE_LDFLAGS = "" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--prefix=/packages/python39-3.9.5-4/.self' '--sysconfdir=/packages/python39-3.9.5-4/.settings' '--datadir=/packages/python39-3.9.5-4/.self/data' '--datarootdir=/packages/python39-3.9.5-4/.self/data' '--sbindir=/packages/python39-3.9.5-4/.self/bin' '--libdir=/packages/python39-3.9.5-4/.self/lib' '--oldincludedir=/packages/python39-3.9.5-4/.self/develop/headers' '--docdir=/packages/python39-3.9.5-4/.self/documentation/packages/python39' '--infodir=/packages/python39-3.9.5-4/.self/documentation/info' '--mandir=/packages/python39-3.9.5-4/.self/documentation/man' '--libexecdir=/packages/python39-3.9.5-4/.self/lib' '--sharedstatedir=/packages/python39-3.9.5-4/.self/var' '--localstatedir=/packages/python39-3.9.5-4/.self/var' '--build=x86_64-unknown-haiku' '--enable-shared' '--without-ensurepip' '--with-system-ffi' '--with-system-expat' '--bindir=/packages/python39-3.9.5-4/.self/bin' '--includedir=/packages/python39-3.9.5-4/.self/develop/headers' 'build_alias=x86_64-unknown-haiku' 'CFLAGS=-D_BSD_SOURCE'" CONFINCLUDEDIR = "/packages/python39-3.9.5-4/.self/develop/headers" CONFINCLUDEPY = "/packages/python39-3.9.5-4/.self/develop/headers/python3.9" COREPYTHONPATH = "" COVERAGE_INFO = "/sources/Python-3.9.5/coverage.info" COVERAGE_REPORT = "/sources/Python-3.9.5/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include" CXX = "g++" DESTDIRS = "/packages/python39-3.9.5-4/.self /packages/python39-3.9.5-4/.self/lib /packages/python39-3.9.5-4/.self/lib/python3.9 /packages/python39-3.9.5-4/.self/lib/python3.9/lib-dynload" DESTLIB = "/packages/python39-3.9.5-4/.self/lib/python3.9" DESTPATH = "" DESTSHARED = "/packages/python39-3.9.5-4/.self/lib/python3.9/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXPORTSFROM = "" EXPORTSYMS = "" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-39.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "0" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "1" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "0" HAVE_BLUETOOTH_BLUETOOTH_H = "1" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "0" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "0" HAVE_CRYPT_H = "0" HAVE_CRYPT_R = "0" HAVE_CTERMID = "1" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "0" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "0" HAVE_DECL_RTLD_NOLOAD = "0" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "0" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "1" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "0" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "0" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "0" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "0" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "0" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "1" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "0" HAVE_FUTIMESAT = "0" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "0" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "1" HAVE_GCC_ASM_FOR_X87 = "1" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "0" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "0" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "0" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "0" HAVE_GETRESUID = "0" HAVE_GETSID = "1" HAVE_GETSPENT = "1" HAVE_GETSPNAM = "1" HAVE_GETWD = "0" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "0" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "0" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "0" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "0" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "0" HAVE_LIBREADLINE = "0" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "1" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_J1939_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LINUX_WAIT_H = "0" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "0" HAVE_MADVISE = "1" HAVE_MAKEDEV = "0" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "0" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "0" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "0" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "0" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "0" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "0" HAVE_PWRITEV2 = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "0" HAVE_RL_CATCH_SIGNAL = "0" HAVE_RL_COMPLETION_APPEND_CHARACTER = "0" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "0" HAVE_RL_COMPLETION_MATCHES = "0" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "0" HAVE_RL_PRE_INPUT_HOOK = "0" HAVE_RL_RESIZE_TERMINAL = "0" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "0" HAVE_SCHED_SETAFFINITY = "0" HAVE_SCHED_SETPARAM = "0" HAVE_SCHED_SETSCHEDULER = "0" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "0" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "0" HAVE_SETRESUID = "0" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "1" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "1" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "0" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "0" HAVE_STRUCT_STAT_ST_GEN = "0" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "0" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENT_H = "0" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "0" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "0" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "0" HAVE_SYS_SYSMACROS_H = "0" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "1" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "1" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "0" HAVE_UUID_ENC_BE = "0" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_H = "0" HAVE_UUID_UUID_H = "0" HAVE_WAIT3 = "0" HAVE_WAIT4 = "0" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "0" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "x86_64-unknown-haiku" INCLDIRSTOMAKE = "/packages/python39-3.9.5-4/.self/develop/headers /packages/python39-3.9.5-4/.self/develop/headers /packages/python39-3.9.5-4/.self/develop/headers/python3.9 /packages/python39-3.9.5-4/.self/develop/headers/python3.9" INCLUDEDIR = "/packages/python39-3.9.5-4/.self/develop/headers" INCLUDEPY = "/packages/python39-3.9.5-4/.self/develop/headers/python3.9" INSTALL = "/bin/install -c" INSTALL_DATA = "/bin/install -c -m 644" INSTALL_PROGRAM = "/bin/install -c" INSTALL_SCRIPT = "/bin/install -c" INSTALL_SHARED = "/bin/install -c -m 755" INSTSONAME = "libpython3.9.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "g++ -shared" LDFLAGS = "" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.9.so" LDLIBRARYDIR = "" LDSHARED = "gcc -shared" LDVERSION = "3.9" LIBC = "" LIBDEST = "/packages/python39-3.9.5-4/.self/lib/python3.9" LIBDIR = "/packages/python39-3.9.5-4/.self/lib" LIBFFI_INCLUDEDIR = "/packages/libffi-3.4.2-1/.self/develop/headers" LIBM = "" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/packages/python39-3.9.5-4/.self/lib/pkgconfig" LIBPL = "/packages/python39-3.9.5-4/.self/lib/python3.9/config-3.9" LIBPYTHON = "" LIBRARY = "libpython3.9.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lnetwork -lbsd" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "gcc" LINKFORSHARED = "-Xlinker -export-dynamic" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "true" LN = "ln -s" LOCALMODLIBS = "" MACHDEP = "haiku1" MACHDEP_OBJS = "" MACHDESTLIB = "/packages/python39-3.9.5-4/.self/lib/python3.9" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "gcc" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/packages/python39-3.9.5-4/.self/documentation/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _peg_parser _symtable xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/_peg_parser.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "-I/packages/openssl-1.1.1k-1/.self/develop/headers" OPENSSL_LDFLAGS = "-L/packages/openssl-1.1.1k-1/.self/develop/lib" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "-fprofile-generate" PGO_PROF_USE_FLAG = "-fprofile-use -fprofile-correction" PLATLIBDIR = "lib" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha256,sha512,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -D_BSD_SOURCE -D_BSD_SOURCE -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -D_BSD_SOURCE -D_BSD_SOURCE" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -D_BSD_SOURCE -D_BSD_SOURCE -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "" PY_CPPFLAGS = "-I. -I./Include" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -D_BSD_SOURCE -D_BSD_SOURCE -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -fPIC" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LIBRARY_PATH=/sources/Python-3.9.5:%A/lib:/boot/home/config/non-packaged/lib:/boot/home/config/lib:/boot/system/non-packaged/lib:/boot/system/lib" SCRIPTDIR = "/packages/python39-3.9.5-4/.self/lib" SETPGRP_HAVE_ARG = "0" SGI_ABI = "@SGI_ABI@" SHELL = "/bin/sh" SHLIBS = "-lnetwork -lbsd" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "0" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".cpython-39.so" SOABI = "cpython-39" SRCDIRS = "Parser Parser/pegen Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LIBRARY_PATH=/sources/Python-3.9.5:%A/lib:/boot/home/config/non-packaged/lib:/boot/home/config/lib:/boot/system/non-packaged/lib:/boot/system/lib ./python" TESTPYTHONOPTS = "" TESTRUNNER = "LIBRARY_PATH=/sources/Python-3.9.5:%A/lib:/boot/home/config/non-packaged/lib:/boot/home/config/lib:/boot/system/non-packaged/lib:/boot/system/lib ./python ./Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3 ./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.9" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "0" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/sources/Python-3.9.5" abs_srcdir = "/sources/Python-3.9.5" base = "/packages/python39-3.9.5-4/.self" datarootdir = "/packages/python39-3.9.5-4/.self/data" exec_prefix = "/packages/python39-3.9.5-4/.self" installed_base = "/packages/python39-3.9.5-4/.self" installed_platbase = "/packages/python39-3.9.5-4/.self" platbase = "/packages/python39-3.9.5-4/.self" platlibdir = "lib" prefix = "/packages/python39-3.9.5-4/.self" projectbase = "/boot/system/bin" py_version = "3.9.5" py_version_nodot = "39" py_version_short = "3.9" srcdir = "/boot/system/lib/python3.9/config-3.9" userbase = "/boot/home/.local" maturin-1.16.0/sysconfig/cpython-linux-3.7.txt000066400000000000000000000541371527064705700212000ustar00rootroot00000000000000Platform: "linux-x86_64" Python version: "3.7" Current installation scheme: "posix_prefix" Paths: data = "/home/konsti/maturin/.venv" include = "/home/konsti/.pyenv/versions/3.7.7/include/python3.7m" platinclude = "/home/konsti/.pyenv/versions/3.7.7/include/python3.7m" platlib = "/home/konsti/maturin/.venv/lib/python3.7/site-packages" platstdlib = "/home/konsti/maturin/.venv/lib/python3.7" purelib = "/home/konsti/maturin/.venv/lib/python3.7/site-packages" scripts = "/home/konsti/maturin/.venv/bin" stdlib = "/home/konsti/.pyenv/versions/3.7.7/lib/python3.7" Variables: ABIFLAGS = "m" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_GENUINE_CPLUSPLUS = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/home/konsti/.pyenv/versions/3.7.7/bin" BINLIBDEST = "/home/konsti/.pyenv/versions/3.7.7/lib/python3.7" BLDLIBRARY = "-L. -lpython3.7m" BLDSHARED = "gcc -pthread -shared -L/home/konsti/.pyenv/versions/3.7.7/lib -Wl,-rpath=/home/konsti/.pyenv/versions/3.7.7/lib -L/home/konsti/.pyenv/versions/3.7.7/lib -Wl,-rpath=/home/konsti/.pyenv/versions/3.7.7/lib" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "x86_64-pc-linux-gnu" BYTESTR_DEPS = "\" CC = "gcc -pthread" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration" CONFIGURE_CPPFLAGS = "-I/home/konsti/.pyenv/versions/3.7.7/include" CONFIGURE_LDFLAGS = "-L/home/konsti/.pyenv/versions/3.7.7/lib -Wl,-rpath=/home/konsti/.pyenv/versions/3.7.7/lib" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--prefix=/home/konsti/.pyenv/versions/3.7.7' '--enable-shared' '--libdir=/home/konsti/.pyenv/versions/3.7.7/lib' 'LDFLAGS=-L/home/konsti/.pyenv/versions/3.7.7/lib -Wl,-rpath=/home/konsti/.pyenv/versions/3.7.7/lib ' 'CPPFLAGS=-I/home/konsti/.pyenv/versions/3.7.7/include '" CONFINCLUDEDIR = "/home/konsti/.pyenv/versions/3.7.7/include" CONFINCLUDEPY = "/home/konsti/.pyenv/versions/3.7.7/include/python3.7m" COREPYTHONPATH = "" COVERAGE_INFO = "/tmp/python-build.20200705125857.15611/Python-3.7.7/coverage.info" COVERAGE_REPORT = "/tmp/python-build.20200705125857.15611/Python-3.7.7/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include -I/home/konsti/.pyenv/versions/3.7.7/include -I/home/konsti/.pyenv/versions/3.7.7/include" CXX = "g++ -pthread" DESTDIRS = "/home/konsti/.pyenv/versions/3.7.7 /home/konsti/.pyenv/versions/3.7.7/lib /home/konsti/.pyenv/versions/3.7.7/lib/python3.7 /home/konsti/.pyenv/versions/3.7.7/lib/python3.7/lib-dynload" DESTLIB = "/home/konsti/.pyenv/versions/3.7.7/lib/python3.7" DESTPATH = "" DESTSHARED = "/home/konsti/.pyenv/versions/3.7.7/lib/python3.7/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "upgrade" EXE = "" EXEMODE = "755" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-37m-x86_64-linux-gnu.so" FILEMODE = "644" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GETTIMEOFDAY_NO_TZ = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "1" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "1" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "0" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_CRYPT_H = "1" HAVE_CRYPT_R = "1" HAVE_CTERMID = "1" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "1" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "1" HAVE_EPOLL_CREATE1 = "1" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FEXECVE = "1" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "1" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "1" HAVE_GCC_ASM_FOR_X87 = "1" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "1" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETSID = "1" HAVE_GETSPENT = "1" HAVE_GETSPNAM = "1" HAVE_GETTIMEOFDAY = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "0" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "0" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "0" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "0" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "1" HAVE_LINUX_CAN_H = "1" HAVE_LINUX_CAN_RAW_FD_FRAMES = "1" HAVE_LINUX_CAN_RAW_H = "1" HAVE_LINUX_NETLINK_H = "1" HAVE_LINUX_RANDOM_H = "1" HAVE_LINUX_TIPC_H = "1" HAVE_LINUX_VM_SOCKETS_H = "1" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "1" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "1" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "1" HAVE_PRLIMIT = "1" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "1" HAVE_PUTENV = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "1" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "1" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "1" HAVE_SOCKADDR_SA_LEN = "0" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "0" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "0" HAVE_STROPTS_H = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "0" HAVE_STRUCT_STAT_ST_GEN = "0" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "0" HAVE_SYS_EPOLL_H = "1" HAVE_SYS_EVENT_H = "0" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "1" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "1" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "1" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "1" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_UNSETENV = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "0" HAVE_UUID_ENC_BE = "0" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_H = "0" HAVE_UUID_UUID_H = "0" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "x86_64-pc-linux-gnu" INCLDIRSTOMAKE = "/home/konsti/.pyenv/versions/3.7.7/include /home/konsti/.pyenv/versions/3.7.7/include /home/konsti/.pyenv/versions/3.7.7/include/python3.7m /home/konsti/.pyenv/versions/3.7.7/include/python3.7m" INCLUDEDIR = "/home/konsti/.pyenv/versions/3.7.7/include" INCLUDEPY = "/home/konsti/.pyenv/versions/3.7.7/include/python3.7m" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "/usr/bin/install -c -m 644" INSTALL_PROGRAM = "/usr/bin/install -c" INSTALL_SCRIPT = "/usr/bin/install -c" INSTALL_SHARED = "/usr/bin/install -c -m 555" INSTSONAME = "libpython3.7m.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "g++ -pthread -shared" LDFLAGS = "-L/home/konsti/.pyenv/versions/3.7.7/lib -Wl,-rpath=/home/konsti/.pyenv/versions/3.7.7/lib -L/home/konsti/.pyenv/versions/3.7.7/lib -Wl,-rpath=/home/konsti/.pyenv/versions/3.7.7/lib" LDFLAGS_NODIST = "" LDLAST = "" LDLIBRARY = "libpython3.7m.so" LDLIBRARYDIR = "" LDSHARED = "gcc -pthread -shared -L/home/konsti/.pyenv/versions/3.7.7/lib -Wl,-rpath=/home/konsti/.pyenv/versions/3.7.7/lib -L/home/konsti/.pyenv/versions/3.7.7/lib -Wl,-rpath=/home/konsti/.pyenv/versions/3.7.7/lib" LDVERSION = "3.7m" LIBC = "" LIBDEST = "/home/konsti/.pyenv/versions/3.7.7/lib/python3.7" LIBDIR = "/home/konsti/.pyenv/versions/3.7.7/lib" LIBFFI_INCLUDEDIR = "" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/home/konsti/.pyenv/versions/3.7.7/lib/pkgconfig" LIBPL = "/home/konsti/.pyenv/versions/3.7.7/lib/python3.7/config-3.7m-x86_64-linux-gnu" LIBRARY = "libpython3.7m.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lcrypt -lpthread -ldl -lutil" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "gcc -pthread" LINKFORSHARED = "-Xlinker -export-dynamic" LIPO_32BIT_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "true" LN = "ln" LOCALMODLIBS = "" LOG1P_DROPS_ZERO_SIGN = "0" MACHDEP = "linux" MACHDEP_OBJS = "" MACHDESTLIB = "/home/konsti/.pyenv/versions/3.7.7/lib/python3.7" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "gcc -pthread" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/home/konsti/.pyenv/versions/3.7.7/share/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io zipimport faulthandler _tracemalloc _symtable xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/zipimport.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/hashtable.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "x86_64-linux-gnu" MULTIARCH_CPPFLAGS = "-DMULTIARCH=\"x86_64-linux-gnu\"" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "" OPENSSL_LDFLAGS = "" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG -g -fwrapv -O3 -Wall" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PGEN = "Parser/pgen" PGENOBJS = "\ \" PGOBJS = "\" PGO_PROF_GEN_FLAG = "-fprofile-generate" PGO_PROF_USE_FLAG = "-fprofile-use -fprofile-correction" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test.regrtest --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_REGEN = "python3.7" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -I. -I./Include -I/home/konsti/.pyenv/versions/3.7.7/include -I/home/konsti/.pyenv/versions/3.7.7/include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -I. -I./Include -I/home/konsti/.pyenv/versions/3.7.7/include -I/home/konsti/.pyenv/versions/3.7.7/include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-L/home/konsti/.pyenv/versions/3.7.7/lib -Wl,-rpath=/home/konsti/.pyenv/versions/3.7.7/lib -L/home/konsti/.pyenv/versions/3.7.7/lib -Wl,-rpath=/home/konsti/.pyenv/versions/3.7.7/lib" PY_CPPFLAGS = "-I. -I./Include -I/home/konsti/.pyenv/versions/3.7.7/include -I/home/konsti/.pyenv/versions/3.7.7/include" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-L/home/konsti/.pyenv/versions/3.7.7/lib -Wl,-rpath=/home/konsti/.pyenv/versions/3.7.7/lib -L/home/konsti/.pyenv/versions/3.7.7/lib -Wl,-rpath=/home/konsti/.pyenv/versions/3.7.7/lib" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -I. -I./Include -I/home/konsti/.pyenv/versions/3.7.7/include -I/home/konsti/.pyenv/versions/3.7.7/include -fPIC" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/tmp/python-build.20200705125857.15611/Python-3.7.7" SCRIPTDIR = "/home/konsti/.pyenv/versions/3.7.7/lib" SETPGRP_HAVE_ARG = "0" SGI_ABI = "@SGI_ABI@" SHELL = "/bin/sh" SHLIBS = "-lcrypt -lpthread -ldl -lutil" SHLIB_SUFFIX = ".so" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "16" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".cpython-37m-x86_64-linux-gnu.so" SOABI = "cpython-37m-x86_64-linux-gnu" SRCDIRS = "Parser Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TANH_PRESERVES_ZERO_SIGN = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/tmp/python-build.20200705125857.15611/Python-3.7.7 ./python" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/tmp/python-build.20200705125857.15611/Python-3.7.7 ./python ./Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3.7 ./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.7" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "0" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "m" abs_builddir = "/tmp/python-build.20200705125857.15611/Python-3.7.7" abs_srcdir = "/tmp/python-build.20200705125857.15611/Python-3.7.7" base = "/home/konsti/maturin/.venv" datarootdir = "/home/konsti/.pyenv/versions/3.7.7/share" exec_prefix = "/home/konsti/.pyenv/versions/3.7.7" installed_base = "/home/konsti/.pyenv/versions/3.7.7" installed_platbase = "/home/konsti/.pyenv/versions/3.7.7" platbase = "/home/konsti/maturin/.venv" prefix = "/home/konsti/.pyenv/versions/3.7.7" projectbase = "/home/konsti/.pyenv/versions/3.7.7/bin" py_version = "3.7.7" py_version_nodot = "37" py_version_short = "3.7" srcdir = "/home/konsti/.pyenv/versions/3.7.7/lib/python3.7/config-3.7m-x86_64-linux-gnu" userbase = "/home/konsti/.local" maturin-1.16.0/sysconfig/cpython-linux-3.8-aarch64.txt000066400000000000000000000541451527064705700224260ustar00rootroot00000000000000Platform: "linux-aarch64" Python version: "3.8" Current installation scheme: "posix_prefix" Paths: data = "/usr/local" include = "/usr/local/include/python3.8" platinclude = "/usr/local/include/python3.8" platlib = "/usr/local/lib/python3.8/site-packages" platstdlib = "/usr/local/lib/python3.8" purelib = "/usr/local/lib/python3.8/site-packages" scripts = "/usr/local/bin" stdlib = "/usr/local/lib/python3.8" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_GENUINE_CPLUSPLUS = "0" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/local/bin" BINLIBDEST = "/usr/local/lib/python3.8" BLDLIBRARY = "-L. -lpython3.8" BLDSHARED = "gcc -pthread -shared" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "aarch64-unknown-linux-gnu" BYTESTR_DEPS = "\" CC = "gcc -pthread" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration" CONFIGURE_CPPFLAGS = "" CONFIGURE_LDFLAGS = "" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--build=aarch64-linux-gnu' '--enable-loadable-sqlite-extensions' '--enable-optimizations' '--enable-option-checking=fatal' '--enable-shared' '--with-system-expat' '--with-system-ffi' '--without-ensurepip' 'build_alias=aarch64-linux-gnu'" CONFINCLUDEDIR = "/usr/local/include" CONFINCLUDEPY = "/usr/local/include/python3.8" COREPYTHONPATH = "" COVERAGE_INFO = "/usr/src/python/coverage.info" COVERAGE_REPORT = "/usr/src/python/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include" CXX = "g++ -pthread" DESTDIRS = "/usr/local /usr/local/lib /usr/local/lib/python3.8 /usr/local/lib/python3.8/lib-dynload" DESTLIB = "/usr/local/lib/python3.8" DESTPATH = "" DESTSHARED = "/usr/local/lib/python3.8/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-38-aarch64-linux-gnu.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GETTIMEOFDAY_NO_TZ = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "1" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "1" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "1" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "0" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "1" HAVE_CRYPT_H = "1" HAVE_CRYPT_R = "1" HAVE_CTERMID = "1" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "1" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "1" HAVE_EPOLL_CREATE1 = "1" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "1" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "0" HAVE_GCC_ASM_FOR_X87 = "0" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "1" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETSID = "1" HAVE_GETSPENT = "1" HAVE_GETSPNAM = "1" HAVE_GETTIMEOFDAY = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "0" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "0" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "0" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "0" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "1" HAVE_LINUX_CAN_H = "1" HAVE_LINUX_CAN_RAW_FD_FRAMES = "1" HAVE_LINUX_CAN_RAW_H = "1" HAVE_LINUX_MEMFD_H = "1" HAVE_LINUX_NETLINK_H = "1" HAVE_LINUX_QRTR_H = "1" HAVE_LINUX_RANDOM_H = "1" HAVE_LINUX_TIPC_H = "1" HAVE_LINUX_VM_SOCKETS_H = "1" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "1" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "1" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "1" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "1" HAVE_PRLIMIT = "1" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "1" HAVE_PUTENV = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "1" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "1" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "1" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "1" HAVE_SOCKADDR_SA_LEN = "0" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "0" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "0" HAVE_STROPTS_H = "1" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "0" HAVE_STRUCT_STAT_ST_GEN = "0" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "0" HAVE_SYS_EPOLL_H = "1" HAVE_SYS_EVENT_H = "0" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "0" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "1" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "1" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "1" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "1" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_UNSETENV = "1" HAVE_USABLE_WCHAR_T = "1" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "0" HAVE_UUID_ENC_BE = "0" HAVE_UUID_GENERATE_TIME_SAFE = "1" HAVE_UUID_H = "0" HAVE_UUID_UUID_H = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "aarch64-unknown-linux-gnu" INCLDIRSTOMAKE = "/usr/local/include /usr/local/include /usr/local/include/python3.8 /usr/local/include/python3.8" INCLUDEDIR = "/usr/local/include" INCLUDEPY = "/usr/local/include/python3.8" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "/usr/bin/install -c -m 644" INSTALL_PROGRAM = "/usr/bin/install -c" INSTALL_SCRIPT = "/usr/bin/install -c" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.8.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "g++ -pthread -shared" LDFLAGS = "" LDLIBRARY = "libpython3.8.so" LDLIBRARYDIR = "" LDSHARED = "gcc -pthread -shared" LDVERSION = "3.8" LIBC = "" LIBDEST = "/usr/local/lib/python3.8" LIBDIR = "/usr/local/lib" LIBFFI_INCLUDEDIR = "" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/local/lib/pkgconfig" LIBPL = "/usr/local/lib/python3.8/config-3.8-aarch64-linux-gnu" LIBPYTHON = "" LIBRARY = "libpython3.8.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lcrypt -lpthread -ldl -lutil -lm" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "gcc -pthread" LINKFORSHARED = "-Xlinker -export-dynamic" LIPO_32BIT_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "true" LN = "ln" LOCALMODLIBS = "" MACHDEP = "linux" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/local/lib/python3.8" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "gcc -pthread" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "1" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/local/share/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _symtable xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/hashtable.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "aarch64-linux-gnu" MULTIARCH_CPPFLAGS = "-DMULTIARCH=\"aarch64-linux-gnu\"" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "" OPENSSL_LDFLAGS = "" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG -g -fwrapv -O3 -Wall" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PGO_PROF_GEN_FLAG = "-fprofile-generate" PGO_PROF_USE_FLAG = "-fprofile-use -fprofile-correction" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_REGEN = "python3" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fprofile-use -fprofile-correction -I./Include/internal -I. -I./Include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fprofile-use -fprofile-correction -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fprofile-use -fprofile-correction -I./Include/internal -I. -I./Include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "" PY_CPPFLAGS = "-I. -I./Include" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fprofile-use -fprofile-correction -I./Include/internal -I. -I./Include -fPIC" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/usr/src/python" SCRIPTDIR = "/usr/local/lib" SETPGRP_HAVE_ARG = "0" SGI_ABI = "@SGI_ABI@" SHELL = "/bin/sh" SHLIBS = "-lcrypt -lpthread -ldl -lutil -lm" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "1" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "16" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".cpython-38-aarch64-linux-gnu.so" SOABI = "cpython-38-aarch64-linux-gnu" SRCDIRS = "Parser Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/usr/src/python ./python" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/usr/src/python ./python ./Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3 ./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.8" WINDOW_HAS_FLAGS = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "0" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/usr/src/python" abs_srcdir = "/usr/src/python" base = "/usr/local" datarootdir = "/usr/local/share" exec_prefix = "/usr/local" installed_base = "/usr/local" installed_platbase = "/usr/local" platbase = "/usr/local" prefix = "/usr/local" projectbase = "/usr/local/bin" py_version = "3.8.2" py_version_nodot = "38" py_version_short = "3.8" srcdir = "/usr/local/lib/python3.8/config-3.8-aarch64-linux-gnu" userbase = "/root/.local" maturin-1.16.0/sysconfig/cpython-linux-3.8.txt000066400000000000000000000534411527064705700211760ustar00rootroot00000000000000Platform: "linux-x86_64" Python version: "3.8" Current installation scheme: "posix_prefix" Paths: data = "/home/konsti/.pyenv/versions/3.8.2" include = "/home/konsti/.pyenv/versions/3.8.2/include/python3.8" platinclude = "/home/konsti/.pyenv/versions/3.8.2/include/python3.8" platlib = "/home/konsti/.pyenv/versions/3.8.2/lib/python3.8/site-packages" platstdlib = "/home/konsti/.pyenv/versions/3.8.2/lib/python3.8" purelib = "/home/konsti/.pyenv/versions/3.8.2/lib/python3.8/site-packages" scripts = "/home/konsti/.pyenv/versions/3.8.2/bin" stdlib = "/home/konsti/.pyenv/versions/3.8.2/lib/python3.8" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_GENUINE_CPLUSPLUS = "0" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/home/konsti/.pyenv/versions/3.8.2/bin" BINLIBDEST = "/home/konsti/.pyenv/versions/3.8.2/lib/python3.8" BLDLIBRARY = "libpython3.8.a" BLDSHARED = "gcc -pthread -shared -L/home/konsti/.pyenv/versions/3.8.2/lib -L/home/konsti/.pyenv/versions/3.8.2/lib" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "x86_64-pc-linux-gnu" BYTESTR_DEPS = "\" CC = "gcc -pthread" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall" CFLAGSFORSHARED = "" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration" CONFIGURE_CPPFLAGS = "-I/home/konsti/.pyenv/versions/3.8.2/include" CONFIGURE_LDFLAGS = "-L/home/konsti/.pyenv/versions/3.8.2/lib" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--prefix=/home/konsti/.pyenv/versions/3.8.2' '--libdir=/home/konsti/.pyenv/versions/3.8.2/lib' 'LDFLAGS=-L/home/konsti/.pyenv/versions/3.8.2/lib ' 'CPPFLAGS=-I/home/konsti/.pyenv/versions/3.8.2/include '" CONFINCLUDEDIR = "/home/konsti/.pyenv/versions/3.8.2/include" CONFINCLUDEPY = "/home/konsti/.pyenv/versions/3.8.2/include/python3.8" COREPYTHONPATH = "" COVERAGE_INFO = "/tmp/python-build.20200506220910.17899/Python-3.8.2/coverage.info" COVERAGE_REPORT = "/tmp/python-build.20200506220910.17899/Python-3.8.2/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include -I/home/konsti/.pyenv/versions/3.8.2/include -I/home/konsti/.pyenv/versions/3.8.2/include" CXX = "g++ -pthread" DESTDIRS = "/home/konsti/.pyenv/versions/3.8.2 /home/konsti/.pyenv/versions/3.8.2/lib /home/konsti/.pyenv/versions/3.8.2/lib/python3.8 /home/konsti/.pyenv/versions/3.8.2/lib/python3.8/lib-dynload" DESTLIB = "/home/konsti/.pyenv/versions/3.8.2/lib/python3.8" DESTPATH = "" DESTSHARED = "/home/konsti/.pyenv/versions/3.8.2/lib/python3.8/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "upgrade" EXE = "" EXEMODE = "755" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-38-x86_64-linux-gnu.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GETTIMEOFDAY_NO_TZ = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "1" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "1" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "0" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "1" HAVE_CRYPT_H = "1" HAVE_CRYPT_R = "1" HAVE_CTERMID = "1" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "1" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "1" HAVE_EPOLL_CREATE1 = "1" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "1" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "1" HAVE_GCC_ASM_FOR_X87 = "1" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "1" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETSID = "1" HAVE_GETSPENT = "1" HAVE_GETSPNAM = "1" HAVE_GETTIMEOFDAY = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "0" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "0" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "0" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "0" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "1" HAVE_LINUX_CAN_H = "1" HAVE_LINUX_CAN_RAW_FD_FRAMES = "1" HAVE_LINUX_CAN_RAW_H = "1" HAVE_LINUX_MEMFD_H = "1" HAVE_LINUX_NETLINK_H = "1" HAVE_LINUX_QRTR_H = "1" HAVE_LINUX_RANDOM_H = "1" HAVE_LINUX_TIPC_H = "1" HAVE_LINUX_VM_SOCKETS_H = "1" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "1" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "1" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "1" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "1" HAVE_PRLIMIT = "1" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "1" HAVE_PUTENV = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "1" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "1" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "1" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "1" HAVE_SOCKADDR_SA_LEN = "0" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "0" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "0" HAVE_STROPTS_H = "1" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "0" HAVE_STRUCT_STAT_ST_GEN = "0" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "0" HAVE_SYS_EPOLL_H = "1" HAVE_SYS_EVENT_H = "0" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "0" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "1" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "1" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "1" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "1" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_UNSETENV = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "0" HAVE_UUID_ENC_BE = "0" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_H = "0" HAVE_UUID_UUID_H = "0" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "x86_64-pc-linux-gnu" INCLDIRSTOMAKE = "/home/konsti/.pyenv/versions/3.8.2/include /home/konsti/.pyenv/versions/3.8.2/include /home/konsti/.pyenv/versions/3.8.2/include/python3.8 /home/konsti/.pyenv/versions/3.8.2/include/python3.8" INCLUDEDIR = "/home/konsti/.pyenv/versions/3.8.2/include" INCLUDEPY = "/home/konsti/.pyenv/versions/3.8.2/include/python3.8" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "/usr/bin/install -c -m 644" INSTALL_PROGRAM = "/usr/bin/install -c" INSTALL_SCRIPT = "/usr/bin/install -c" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.8.a" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "g++ -pthread -shared" LDFLAGS = "-L/home/konsti/.pyenv/versions/3.8.2/lib -L/home/konsti/.pyenv/versions/3.8.2/lib" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.8.a" LDLIBRARYDIR = "" LDSHARED = "gcc -pthread -shared -L/home/konsti/.pyenv/versions/3.8.2/lib -L/home/konsti/.pyenv/versions/3.8.2/lib" LDVERSION = "3.8" LIBC = "" LIBDEST = "/home/konsti/.pyenv/versions/3.8.2/lib/python3.8" LIBDIR = "/home/konsti/.pyenv/versions/3.8.2/lib" LIBFFI_INCLUDEDIR = "" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/home/konsti/.pyenv/versions/3.8.2/lib/pkgconfig" LIBPL = "/home/konsti/.pyenv/versions/3.8.2/lib/python3.8/config-3.8-x86_64-linux-gnu" LIBPYTHON = "" LIBRARY = "libpython3.8.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lcrypt -lpthread -ldl -lutil -lm" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "gcc -pthread" LINKFORSHARED = "-Xlinker -export-dynamic" LIPO_32BIT_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "true" LN = "ln" LOCALMODLIBS = "" MACHDEP = "linux" MACHDEP_OBJS = "" MACHDESTLIB = "/home/konsti/.pyenv/versions/3.8.2/lib/python3.8" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "gcc -pthread" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/home/konsti/.pyenv/versions/3.8.2/share/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _symtable xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/hashtable.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "x86_64-linux-gnu" MULTIARCH_CPPFLAGS = "-DMULTIARCH=\"x86_64-linux-gnu\"" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "" OPENSSL_LDFLAGS = "" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG -g -fwrapv -O3 -Wall" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PGO_PROF_GEN_FLAG = "-fprofile-generate" PGO_PROF_USE_FLAG = "-fprofile-use -fprofile-correction" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_REGEN = "python3" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/home/konsti/.pyenv/versions/3.8.2/include -I/home/konsti/.pyenv/versions/3.8.2/include -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/home/konsti/.pyenv/versions/3.8.2/include -I/home/konsti/.pyenv/versions/3.8.2/include -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-L/home/konsti/.pyenv/versions/3.8.2/lib -L/home/konsti/.pyenv/versions/3.8.2/lib" PY_CPPFLAGS = "-I. -I./Include -I/home/konsti/.pyenv/versions/3.8.2/include -I/home/konsti/.pyenv/versions/3.8.2/include" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-L/home/konsti/.pyenv/versions/3.8.2/lib -L/home/konsti/.pyenv/versions/3.8.2/lib" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/home/konsti/.pyenv/versions/3.8.2/include -I/home/konsti/.pyenv/versions/3.8.2/include" Py_DEBUG = "0" Py_ENABLE_SHARED = "0" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "" SCRIPTDIR = "/home/konsti/.pyenv/versions/3.8.2/lib" SETPGRP_HAVE_ARG = "0" SGI_ABI = "@SGI_ABI@" SHELL = "/bin/sh" SHLIBS = "-lcrypt -lpthread -ldl -lutil -lm" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "1" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "16" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".cpython-38-x86_64-linux-gnu.so" SOABI = "cpython-38-x86_64-linux-gnu" SRCDIRS = "Parser Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "./python" TESTPYTHONOPTS = "" TESTRUNNER = "./python ./Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3 ./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.8" WINDOW_HAS_FLAGS = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "0" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/tmp/python-build.20200506220910.17899/Python-3.8.2" abs_srcdir = "/tmp/python-build.20200506220910.17899/Python-3.8.2" base = "/home/konsti/.pyenv/versions/3.8.2" datarootdir = "/home/konsti/.pyenv/versions/3.8.2/share" exec_prefix = "/home/konsti/.pyenv/versions/3.8.2" installed_base = "/home/konsti/.pyenv/versions/3.8.2" installed_platbase = "/home/konsti/.pyenv/versions/3.8.2" platbase = "/home/konsti/.pyenv/versions/3.8.2" prefix = "/home/konsti/.pyenv/versions/3.8.2" projectbase = "/home/konsti/.pyenv/versions/3.8.2/bin" py_version = "3.8.2" py_version_nodot = "38" py_version_short = "3.8" srcdir = "/home/konsti/.pyenv/versions/3.8.2/lib/python3.8/config-3.8-x86_64-linux-gnu" userbase = "/home/konsti/.local" maturin-1.16.0/sysconfig/cpython-linux-3.9.txt000066400000000000000000000672771527064705700212130ustar00rootroot00000000000000Platform: "linux-x86_64" Python version: "3.9" Current installation scheme: "posix_prefix" Paths: data = "/usr" include = "/usr/include/python3.9" platinclude = "/usr/include/python3.9" platlib = "/usr/lib/python3.9/site-packages" platstdlib = "/usr/lib/python3.9" purelib = "/usr/lib/python3.9/site-packages" scripts = "/usr/bin" stdlib = "/usr/lib/python3.9" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "0" AIX_GENUINE_CPLUSPLUS = "0" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/bin" BINLIBDEST = "/usr/lib/python3.9" BLDLIBRARY = "-L. -lpython3.9" BLDSHARED = "gcc -pthread -shared -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -fno-semantic-interposition -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "x86_64-pc-linux-gnu" BYTESTR_DEPS = "\" CC = "gcc -pthread" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fno-semantic-interposition -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -march=x86-64 -mtune=generic -O3 -pipe -fno-plt" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "-march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fno-semantic-interposition" CONFIGURE_CFLAGS_NODIST = "-flto=4 -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden" CONFIGURE_CPPFLAGS = "-D_FORTIFY_SOURCE=2" CONFIGURE_LDFLAGS = "-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -fno-semantic-interposition" CONFIGURE_LDFLAGS_NODIST = "-flto=4 -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g" CONFIG_ARGS = "'--prefix=/usr' '--enable-shared' '--with-computed-gotos' '--enable-optimizations' '--with-lto' '--enable-ipv6' '--with-system-expat' '--with-dbmliborder=gdbm:ndbm' '--with-system-ffi' '--with-system-libmpdec' '--enable-loadable-sqlite-extensions' '--without-ensurepip' '--with-tzpath=/usr/share/zoneinfo' 'CFLAGS=-march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fno-semantic-interposition' 'LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -fno-semantic-interposition' 'CPPFLAGS=-D_FORTIFY_SOURCE=2'" CONFINCLUDEDIR = "/usr/include" CONFINCLUDEPY = "/usr/include/python3.9" COREPYTHONPATH = "" COVERAGE_INFO = "/build/python/src/Python-3.9.1/coverage.info" COVERAGE_REPORT = "/build/python/src/Python-3.9.1/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include -D_FORTIFY_SOURCE=2 -D_FORTIFY_SOURCE=2" CXX = "g++ -pthread" DESTDIRS = "/usr /usr/lib /usr/lib/python3.9 /usr/lib/python3.9/lib-dynload" DESTLIB = "/usr/lib/python3.9" DESTPATH = "" DESTSHARED = "/usr/lib/python3.9/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXPORTSFROM = "" EXPORTSYMS = "" EXTRATESTOPTS = "" EXT_SUFFIX = ".cpython-39-x86_64-linux-gnu.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "1" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "1" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "1" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "0" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "1" HAVE_CRYPT_H = "1" HAVE_CRYPT_R = "1" HAVE_CTERMID = "1" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "1" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "1" HAVE_EPOLL_CREATE1 = "1" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "1" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "1" HAVE_GCC_ASM_FOR_X87 = "1" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "1" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETSID = "1" HAVE_GETSPENT = "1" HAVE_GETSPNAM = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "0" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "0" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "0" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "0" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "1" HAVE_LINUX_CAN_H = "1" HAVE_LINUX_CAN_J1939_H = "1" HAVE_LINUX_CAN_RAW_FD_FRAMES = "1" HAVE_LINUX_CAN_RAW_H = "1" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "1" HAVE_LINUX_MEMFD_H = "1" HAVE_LINUX_NETLINK_H = "1" HAVE_LINUX_QRTR_H = "1" HAVE_LINUX_RANDOM_H = "1" HAVE_LINUX_TIPC_H = "1" HAVE_LINUX_VM_SOCKETS_H = "1" HAVE_LINUX_WAIT_H = "1" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "1" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "1" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "1" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "1" HAVE_PRLIMIT = "1" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "1" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "1" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "1" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "1" HAVE_SOCKADDR_SA_LEN = "0" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "0" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "0" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "0" HAVE_STRUCT_STAT_ST_GEN = "0" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "0" HAVE_SYS_EPOLL_H = "1" HAVE_SYS_EVENT_H = "0" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "0" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "1" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "1" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "1" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "1" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "0" HAVE_UUID_ENC_BE = "0" HAVE_UUID_GENERATE_TIME_SAFE = "1" HAVE_UUID_H = "0" HAVE_UUID_UUID_H = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "x86_64-pc-linux-gnu" INCLDIRSTOMAKE = "/usr/include /usr/include /usr/include/python3.9 /usr/include/python3.9" INCLUDEDIR = "/usr/include" INCLUDEPY = "/usr/include/python3.9" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "/usr/bin/install -c -m 644" INSTALL_PROGRAM = "/usr/bin/install -c" INSTALL_SCRIPT = "/usr/bin/install -c" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.9.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "g++ -pthread -shared" LDFLAGS = "-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -fno-semantic-interposition -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.9.so" LDLIBRARYDIR = "" LDSHARED = "gcc -pthread -shared -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -fno-semantic-interposition -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now" LDVERSION = "3.9" LIBC = "" LIBDEST = "/usr/lib/python3.9" LIBDIR = "/usr/lib" LIBFFI_INCLUDEDIR = "" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/lib/pkgconfig" LIBPL = "/usr/lib/python3.9/config-3.9-x86_64-linux-gnu" LIBPYTHON = "" LIBRARY = "libpython3.9.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lcrypt -lpthread -ldl -lutil -lm" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "gcc -pthread" LINKFORSHARED = "-Xlinker -export-dynamic" LIPO_32BIT_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "true" LN = "ln" LOCALMODLIBS = "" MACHDEP = "linux" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/lib/python3.9" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "gcc -pthread" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "1" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/share/man" MKDIR_P = "/usr/bin/mkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _peg_parser _symtable xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/_peg_parser.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "x86_64-linux-gnu" MULTIARCH_CPPFLAGS = "-DMULTIARCH=\"x86_64-linux-gnu\"" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "" OPENSSL_LDFLAGS = "" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG -g -fwrapv -O3 -Wall" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "-fprofile-generate" PGO_PROF_USE_FLAG = "-fprofile-use -fprofile-correction" PLATLIBDIR = "lib" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha256,sha512,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fno-semantic-interposition -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -flto=4 -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -D_FORTIFY_SOURCE=2 -D_FORTIFY_SOURCE=2 -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fno-semantic-interposition -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -march=x86-64 -mtune=generic -O3 -pipe -fno-plt" PY_CFLAGS_NODIST = "-flto=4 -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fno-semantic-interposition -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -flto=4 -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -D_FORTIFY_SOURCE=2 -D_FORTIFY_SOURCE=2 -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -fno-semantic-interposition -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -flto=4 -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g" PY_CPPFLAGS = "-I. -I./Include -D_FORTIFY_SOURCE=2 -D_FORTIFY_SOURCE=2" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -fno-semantic-interposition -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now" PY_LDFLAGS_NODIST = "-flto=4 -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fno-semantic-interposition -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -flto=4 -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -D_FORTIFY_SOURCE=2 -D_FORTIFY_SOURCE=2 -fPIC" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/build/python/src/Python-3.9.1" SCRIPTDIR = "/usr/lib" SETPGRP_HAVE_ARG = "0" SGI_ABI = "@SGI_ABI@" SHELL = "/bin/sh" SHLIBS = "-lcrypt -lpthread -ldl -lutil -lm" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "1" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "16" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".cpython-39-x86_64-linux-gnu.so" SOABI = "cpython-39-x86_64-linux-gnu" SRCDIRS = "Parser Parser/pegen Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/build/python/src/Python-3.9.1 ./python" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/build/python/src/Python-3.9.1 ./python ./Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" TZPATH = "/usr/share/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3.9 ./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "1" VERSION = "3.9" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "0" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/build/python/src/Python-3.9.1" abs_srcdir = "/build/python/src/Python-3.9.1" base = "/usr" datarootdir = "/usr/share" exec_prefix = "/usr" installed_base = "/usr" installed_platbase = "/usr" platbase = "/usr" platlibdir = "lib" prefix = "/usr" projectbase = "/usr/bin" py_version = "3.9.1" py_version_nodot = "39" py_version_short = "3.9" srcdir = "/usr/lib/python3.9/config-3.9-x86_64-linux-gnu" userbase = "/home/kngwyu/.local" maturin-1.16.0/sysconfig/cpython-linux-armv5te-3.11.txt000066400000000000000000001124071527064705700226270ustar00rootroot00000000000000Platform: "linux-armv5tel" Python version: "3.11" Current installation scheme: "posix_local" Paths: data = "/usr/local" include = "/usr/include/python3.11" platinclude = "/usr/include/python3.11" platlib = "/usr/local/lib/python3.11/dist-packages" platstdlib = "/usr/lib/python3.11" purelib = "/usr/local/lib/python3.11/dist-packages" scripts = "/usr/local/bin" stdlib = "/usr/lib/python3.11" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "0" AIX_GENUINE_CPLUSPLUS = "0" ALIGNOF_LONG = "4" ALIGNOF_SIZE_T = "4" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "arm-linux-gnueabi-gcc-ar" ARFLAGS = "rcs" BASECFLAGS = "-Wsign-compare" BASECPPFLAGS = "-IObjects -IInclude -IPython" BASEMODLIBS = "" BINDIR = "/usr/bin" BINLIBDEST = "/usr/lib/arm-linux-gnueabi/python3.11" BLDLIBRARY = "-lpython3.11" BLDSHARED = "arm-linux-gnueabi-gcc -shared -Wl,-O1 -Wl,-Bsymbolic-functions -g -fwrapv -O2 " BOOTSTRAP_HEADERS = "\" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "armv8l-unknown-linux-gnueabi" BYTESTR_DEPS = "\" CC = "arm-linux-gnueabi-gcc" CCSHARED = "-fPIC" CFLAGS = "-Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 " CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "-g -fstack-protector-strong -Wformat -Werror=format-security" CONFIGURE_CFLAGS_NODIST = "-std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden" CONFIGURE_CPPFLAGS = "-Wdate-time -D_FORTIFY_SOURCE=2" CONFIGURE_LDFLAGS = " -g -fwrapv -O2 " CONFIGURE_LDFLAGS_NODIST = "" CONFIGURE_LDFLAGS_NOLTO = "" CONFIG_ARGS = "'--enable-shared' '--prefix=/usr' '--libdir=/usr/lib/arm-linux-gnueabi' '--enable-ipv6' '--enable-loadable-sqlite-extensions' '--with-dbmliborder=bdb:gdbm' '--with-computed-gotos' '--without-ensurepip' '--with-system-expat' '--with-dtrace' '--with-wheel-pkg-dir=/usr/share/python-wheels/' '--with-ssl-default-suites=openssl' 'MKDIR_P=/bin/mkdir -p' '--with-system-ffi' 'CC=arm-linux-gnueabi-gcc' 'CFLAGS=-g -fstack-protector-strong -Wformat -Werror=format-security ' 'LDFLAGS= -g -fwrapv -O2 ' 'CPPFLAGS=-Wdate-time -D_FORTIFY_SOURCE=2'" CONFINCLUDEDIR = "/usr/include" CONFINCLUDEPY = "/usr/include/python3.11" COREPYTHONPATH = "" COVERAGE_INFO = "/build/reproducible-path/python3.11-3.11.2/build-shared/coverage.info" COVERAGE_LCOV_OPTIONS = "--rc lcov_branch_coverage=1" COVERAGE_REPORT = "/build/reproducible-path/python3.11-3.11.2/build-shared/lcov-report" COVERAGE_REPORT_OPTIONS = "--rc lcov_branch_coverage=1 --branch-coverage --title "CPython 3.11 LCOV report [commit $(shell )]"" CPPFLAGS = "-IObjects -IInclude -IPython -I. -I../Include -Wdate-time -D_FORTIFY_SOURCE=2" CXX = "arm-linux-gnueabi-g++" DECIMAL_CFLAGS = "-I../Modules/_decimal/libmpdec -DCONFIG_32=1 -DANSI=1" DECIMAL_LDFLAGS = "-lm Modules/_decimal/libmpdec/libmpdec.a" DEEPFREEZE_DEPS = "../Tools/scripts/deepfreeze.py _bootstrap_python ../Programs/_freeze_module.py \" DEEPFREEZE_OBJS = "Python/deepfreeze/deepfreeze.o" DESTDIRS = "/usr /usr/lib/arm-linux-gnueabi /usr/lib/arm-linux-gnueabi/python3.11 /usr/lib/python3.11/lib-dynload" DESTLIB = "/usr/lib/python3.11" DESTPATH = "" DESTSHARED = "/usr/lib/python3.11/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "/usr/bin/dtrace" DTRACE_DEPS = "\" DTRACE_HEADERS = "Include/pydtrace_probes.h" DTRACE_OBJS = "Python/pydtrace.o" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXPAT_CFLAGS = "" EXPAT_LDFLAGS = "-lexpat" EXPORTSFROM = "" EXPORTSYMS = "" EXTRATESTOPTS = "" EXT_SUFFIX = ".cpython-311-arm-linux-gnueabi.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FREEZE_MODULE = "./_bootstrap_python ../Programs/_freeze_module.py" FREEZE_MODULE_BOOTSTRAP = "./Programs/_freeze_module" FREEZE_MODULE_BOOTSTRAP_DEPS = "Programs/_freeze_module" FREEZE_MODULE_DEPS = "_bootstrap_python ../Programs/_freeze_module.py" FROZEN_FILES_IN = "\" FROZEN_FILES_OUT = "\" GETPGRP_HAVE_ARG = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT = "1" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "1" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "1" HAVE_ATANH = "1" HAVE_BIND = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "1" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_BZLIB_H = "1" HAVE_CHFLAGS = "0" HAVE_CHMOD = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_NANOSLEEP = "1" HAVE_CLOCK_SETTIME = "1" HAVE_CLOSE_RANGE = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_CONNECT = "1" HAVE_COPY_FILE_RANGE = "1" HAVE_CRYPT_H = "1" HAVE_CRYPT_R = "1" HAVE_CTERMID = "1" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DB_H = "1" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "1" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "1" HAVE_EPOLL_CREATE1 = "1" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EVENTFD = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORK1 = "0" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "1" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "0" HAVE_GCC_ASM_FOR_X87 = "0" HAVE_GCC_UINT128_T = "0" HAVE_GDBM_DASH_NDBM_H = "0" HAVE_GDBM_H = "1" HAVE_GDBM_NDBM_H = "0" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETEGID = "1" HAVE_GETENTROPY = "1" HAVE_GETEUID = "1" HAVE_GETGID = "1" HAVE_GETGRGID = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYADDR = "1" HAVE_GETHOSTBYNAME = "1" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETHOSTNAME = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPROTOBYNAME = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "1" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETRUSAGE = "1" HAVE_GETSERVBYNAME = "1" HAVE_GETSERVBYPORT = "1" HAVE_GETSID = "1" HAVE_GETSOCKNAME = "1" HAVE_GETSPENT = "1" HAVE_GETSPNAM = "1" HAVE_GETUID = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_IEEEFP_H = "0" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_NTOA = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "0" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "1" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "0" HAVE_LCHOWN = "1" HAVE_LIBB2 = "0" HAVE_LIBDB = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBGDBM_COMPAT = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBNDBM = "0" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBSQLITE3 = "1" HAVE_LIBUTIL_H = "0" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_AUXVEC_H = "1" HAVE_LINUX_CAN_BCM_H = "1" HAVE_LINUX_CAN_H = "1" HAVE_LINUX_CAN_J1939_H = "1" HAVE_LINUX_CAN_RAW_FD_FRAMES = "1" HAVE_LINUX_CAN_RAW_H = "1" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "1" HAVE_LINUX_MEMFD_H = "1" HAVE_LINUX_NETLINK_H = "1" HAVE_LINUX_QRTR_H = "1" HAVE_LINUX_RANDOM_H = "1" HAVE_LINUX_SOUNDCARD_H = "1" HAVE_LINUX_TIPC_H = "1" HAVE_LINUX_VM_SOCKETS_H = "1" HAVE_LINUX_WAIT_H = "1" HAVE_LISTEN = "1" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LOGIN_TTY = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_LZMA_H = "0" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "1" HAVE_MEMORY_H = "0" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "1" HAVE_NANOSLEEP = "1" HAVE_NCURSES_H = "1" HAVE_NDBM_H = "0" HAVE_NDIR_H = "0" HAVE_NETCAN_CAN_H = "0" HAVE_NETDB_H = "1" HAVE_NETINET_IN_H = "1" HAVE_NETPACKET_PACKET_H = "1" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION = "0" HAVE_OPENAT = "1" HAVE_OPENDIR = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "1" HAVE_PRLIMIT = "1" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTHREAD_STUBS = "0" HAVE_PTY_H = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "1" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RECVFROM = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_RPC_RPC_H = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "1" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_CLOCKWAIT = "1" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SENDTO = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETJMP_H = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETSOCKOPT = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "1" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SHUTDOWN = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "1" HAVE_SOCKADDR_SA_LEN = "0" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKET = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SPLICE = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "0" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "0" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "0" HAVE_STRUCT_STAT_ST_GEN = "0" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYSLOG_H = "1" HAVE_SYSTEM = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_AUXV_H = "1" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "0" HAVE_SYS_EPOLL_H = "1" HAVE_SYS_EVENTFD_H = "1" HAVE_SYS_EVENT_H = "0" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "0" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "1" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_SOUNDCARD_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "1" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "1" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "1" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TTYNAME = "1" HAVE_TZNAME = "0" HAVE_UMASK = "1" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_USABLE_WCHAR_T = "1" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UTMP_H = "1" HAVE_UUID_CREATE = "0" HAVE_UUID_ENC_BE = "0" HAVE_UUID_GENERATE_TIME_SAFE = "1" HAVE_UUID_H = "1" HAVE_UUID_UUID_H = "0" HAVE_VFORK = "1" HAVE_WAIT = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_ZLIB_COPY = "1" HAVE_ZLIB_H = "0" HAVE__GETPTY = "0" HOSTRUNNER = "" HOST_GNU_TYPE = "armv8l-unknown-linux-gnueabi" INCLDIRSTOMAKE = "/usr/include /usr/include /usr/include/python3.11 /usr/include/python3.11" INCLUDEDIR = "/usr/include" INCLUDEPY = "/usr/include/python3.11" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "/usr/bin/install -c -m 644" INSTALL_PROGRAM = "/usr/bin/install -c" INSTALL_SCRIPT = "/usr/bin/install -c" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.11.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "arm-linux-gnueabi-g++ -shared -Wl,-O1 -Wl,-Bsymbolic-functions" LDFLAGS = " -g -fwrapv -O2 " LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.11.so" LDLIBRARYDIR = "" LDSHARED = "arm-linux-gnueabi-gcc -shared -Wl,-O1 -Wl,-Bsymbolic-functions -g -fwrapv -O2 " LDVERSION = "3.11" LIBC = "" LIBDEST = "/usr/lib/python3.11" LIBDIR = "/usr/lib/arm-linux-gnueabi" LIBEXPAT_A = "Modules/expat/libexpat.a" LIBEXPAT_CFLAGS = "-Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I../Include/internal -IObjects -IInclude -IPython -I. -I../Include -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -fPIC" LIBEXPAT_HEADERS = "\" LIBEXPAT_OBJS = "\" LIBFFI_INCLUDEDIR = "" LIBM = "-lm" LIBMPDEC_A = "Modules/_decimal/libmpdec/libmpdec.a" LIBMPDEC_CFLAGS = "-I../Modules/_decimal/libmpdec -DCONFIG_32=1 -DANSI=1 -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I../Include/internal -IObjects -IInclude -IPython -I. -I../Include -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -fPIC" LIBMPDEC_HEADERS = "\" LIBMPDEC_OBJS = "\" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/lib/arm-linux-gnueabi/pkgconfig" LIBPL = "/usr/lib/python3.11/config-3.11-arm-linux-gnueabi" LIBPYTHON = "" LIBRARY = "libpython3.11.a" LIBRARY_DEPS = "libpython3.11.a libpython3.11.so libpython3.so" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-ldl" LIBSUBDIRS = "asyncio \" LINKCC = "arm-linux-gnueabi-gcc" LINKFORSHARED = "-Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions" LINK_PYTHON_DEPS = "libpython3.11.a libpython3.11.so libpython3.so" LINK_PYTHON_OBJS = "-L. -lpython3.11" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "true" LN = "ln" LOCALMODLIBS = "-lm -lm -lz -lm -lm -lexpat -lexpat -lz" MACHDEP = "linux" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/lib/arm-linux-gnueabi/python3.11" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "arm-linux-gnueabi-gcc" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "1" MAKESETUP = "../Modules/makesetup" MANDIR = "/usr/share/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "_bisect _csv _datetime _heapq _opcode _pickle _random _socket _statistics _struct array binascii cmath math select _elementtree pyexpat _blake2 _md5 _sha1 _sha256 _sha512 _sha3 unicodedata _posixsubprocess fcntl grp spwd syslog zlib atexit faulthandler posix _signal _tracemalloc _codecs _collections errno _io itertools _sre _thread time _weakref _abc _functools _locale _operator _stat _symtable pwd _asyncio _contextvars _json _lsprof _queue _typing _xxsubinterpreters _zoneinfo audioop _decimal _bz2 _lzma _gdbm _codecs_cn _codecs_hk _codecs_iso2022 _codecs_jp _codecs_kr _codecs_tw _multibytecodec _crypt mmap nis ossaudiodev resource termios _posixshmem _multiprocessing _sqlite3 _ssl _hashlib _uuid _tkinter _xxtestfuzz _testbuffer _testinternalcapi _testcapi _testclinic _testimportmultiple _testmultiphase _ctypes_test xxlimited xxlimited_35 xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "-lm -lm -lz -lm -lm -lexpat -lexpat -lz" MODOBJS = "Modules/_bisectmodule.o Modules/_csv.o Modules/_datetimemodule.o Modules/_heapqmodule.o Modules/_opcode.o Modules/_pickle.o Modules/_randommodule.o Modules/socketmodule.o Modules/_statisticsmodule.o Modules/_struct.o Modules/arraymodule.o Modules/binascii.o Modules/cmathmodule.o Modules/mathmodule.o Modules/selectmodule.o Modules/_elementtree.o Modules/pyexpat.o Modules/_blake2/blake2module.o Modules/_blake2/blake2b_impl.o Modules/_blake2/blake2s_impl.o Modules/md5module.o Modules/sha1module.o Modules/sha256module.o Modules/sha512module.o Modules/_sha3/sha3module.o Modules/unicodedata.o Modules/_posixsubprocess.o Modules/fcntlmodule.o Modules/grpmodule.o Modules/spwdmodule.o Modules/syslogmodule.o Modules/zlibmodule.o Modules/atexitmodule.o Modules/faulthandler.o Modules/posixmodule.o Modules/signalmodule.o Modules/_tracemalloc.o Modules/_codecsmodule.o Modules/_collectionsmodule.o Modules/errnomodule.o Modules/_io/_iomodule.o Modules/_io/iobase.o Modules/_io/fileio.o Modules/_io/bytesio.o Modules/_io/bufferedio.o Modules/_io/textio.o Modules/_io/stringio.o Modules/itertoolsmodule.o Modules/_sre/sre.o Modules/_threadmodule.o Modules/timemodule.o Modules/_weakref.o Modules/_abc.o Modules/_functoolsmodule.o Modules/_localemodule.o Modules/_operator.o Modules/_stat.o Modules/symtablemodule.o Modules/pwdmodule.o Modules/xxsubtype.o" MODSHARED_NAMES = "_asyncio _contextvars _json _lsprof _queue _typing _xxsubinterpreters _zoneinfo audioop _decimal _bz2 _lzma _gdbm _codecs_cn _codecs_hk _codecs_iso2022 _codecs_jp _codecs_kr _codecs_tw _multibytecodec _crypt mmap nis ossaudiodev resource termios _posixshmem _multiprocessing _sqlite3 _ssl _hashlib _uuid _tkinter _xxtestfuzz _testbuffer _testinternalcapi _testcapi _testclinic _testimportmultiple _testmultiphase _ctypes_test xxlimited xxlimited_35" MODULE_ARRAY_LDFLAGS = "" MODULE_ARRAY_STATE = "yes" MODULE_ATEXIT_LDFLAGS = "" MODULE_AUDIOOP_LDFLAGS = "-lm" MODULE_AUDIOOP_STATE = "yes" MODULE_BINASCII_CFLAGS = "-DUSE_ZLIB_CRC32" MODULE_BINASCII_LDFLAGS = "-lz" MODULE_BINASCII_STATE = "yes" MODULE_CMATH_DEPS = "../Modules/_math.h" MODULE_CMATH_LDFLAGS = "-lm" MODULE_CMATH_STATE = "yes" MODULE_ERRNO_LDFLAGS = "" MODULE_FAULTHANDLER_LDFLAGS = "" MODULE_FCNTL_LDFLAGS = "" MODULE_FCNTL_STATE = "yes" MODULE_GRP_LDFLAGS = "" MODULE_GRP_STATE = "yes" MODULE_ITERTOOLS_LDFLAGS = "" MODULE_MATH_DEPS = "../Modules/_math.h" MODULE_MATH_LDFLAGS = "-lm" MODULE_MATH_STATE = "yes" MODULE_MMAP_STATE = "yes" MODULE_NIS_CFLAGS = "-I/usr/include/tirpc" MODULE_NIS_LDFLAGS = "-lnsl -ltirpc" MODULE_NIS_STATE = "yes" MODULE_OBJS = "\" MODULE_OSSAUDIODEV_LDFLAGS = "" MODULE_OSSAUDIODEV_STATE = "yes" MODULE_POSIX_LDFLAGS = "" MODULE_PWD_LDFLAGS = "" MODULE_PWD_STATE = "yes" MODULE_PYEXPAT_CFLAGS = "" MODULE_PYEXPAT_DEPS = "" MODULE_PYEXPAT_LDFLAGS = "-lexpat" MODULE_PYEXPAT_STATE = "yes" MODULE_RESOURCE_STATE = "yes" MODULE_SELECT_LDFLAGS = "" MODULE_SELECT_STATE = "yes" MODULE_SPWD_LDFLAGS = "" MODULE_SPWD_STATE = "yes" MODULE_SYSLOG_LDFLAGS = "" MODULE_SYSLOG_STATE = "yes" MODULE_TERMIOS_STATE = "yes" MODULE_TIME_LDFLAGS = "" MODULE_TIME_STATE = "yes" MODULE_UNICODEDATA_DEPS = "../Modules/unicodedata_db.h ../Modules/unicodename_db.h" MODULE_UNICODEDATA_LDFLAGS = "" MODULE_UNICODEDATA_STATE = "yes" MODULE_XXLIMITED_35_STATE = "yes" MODULE_XXLIMITED_STATE = "yes" MODULE_XXSUBTYPE_LDFLAGS = "" MODULE_ZLIB_CFLAGS = "" MODULE_ZLIB_LDFLAGS = "-lz" MODULE_ZLIB_STATE = "yes" MODULE__ABC_LDFLAGS = "" MODULE__ASYNCIO_STATE = "yes" MODULE__BISECT_LDFLAGS = "" MODULE__BISECT_STATE = "yes" MODULE__BLAKE2_CFLAGS = "" MODULE__BLAKE2_DEPS = "../Modules/_blake2/impl/blake2-config.h ../Modules/_blake2/impl/blake2-impl.h ../Modules/_blake2/impl/blake2.h ../Modules/_blake2/impl/blake2b-load-sse2.h ../Modules/_blake2/impl/blake2b-load-sse41.h ../Modules/_blake2/impl/blake2b-ref.c ../Modules/_blake2/impl/blake2b-round.h ../Modules/_blake2/impl/blake2b.c ../Modules/_blake2/impl/blake2s-load-sse2.h ../Modules/_blake2/impl/blake2s-load-sse41.h ../Modules/_blake2/impl/blake2s-load-xop.h ../Modules/_blake2/impl/blake2s-ref.c ../Modules/_blake2/impl/blake2s-round.h ../Modules/_blake2/impl/blake2s.c ../Modules/_blake2/blake2module.h ../Modules/hashlib.h" MODULE__BLAKE2_LDFLAGS = "" MODULE__BLAKE2_STATE = "yes" MODULE__BZ2_CFLAGS = "" MODULE__BZ2_LDFLAGS = "-lbz2" MODULE__BZ2_STATE = "yes" MODULE__CODECS_CN_STATE = "yes" MODULE__CODECS_HK_STATE = "yes" MODULE__CODECS_ISO2022_STATE = "yes" MODULE__CODECS_JP_STATE = "yes" MODULE__CODECS_KR_STATE = "yes" MODULE__CODECS_LDFLAGS = "" MODULE__CODECS_TW_STATE = "yes" MODULE__COLLECTIONS_LDFLAGS = "" MODULE__CONTEXTVARS_STATE = "yes" MODULE__CRYPT_CFLAGS = "" MODULE__CRYPT_LDFLAGS = "-lcrypt" MODULE__CRYPT_STATE = "yes" MODULE__CSV_LDFLAGS = "" MODULE__CSV_STATE = "yes" MODULE__CTYPES_DEPS = "../Modules/_ctypes/ctypes.h" MODULE__CTYPES_TEST_LDFLAGS = "-lm" MODULE__CTYPES_TEST_STATE = "yes" MODULE__DATETIME_LDFLAGS = "-lm" MODULE__DATETIME_STATE = "yes" MODULE__DECIMAL_CFLAGS = "-I../Modules/_decimal/libmpdec -DCONFIG_32=1 -DANSI=1" MODULE__DECIMAL_DEPS = "../Modules/_decimal/docstrings.h \ Modules/_decimal/libmpdec/libmpdec.a" MODULE__DECIMAL_LDFLAGS = "-lm Modules/_decimal/libmpdec/libmpdec.a" MODULE__DECIMAL_STATE = "yes" MODULE__ELEMENTTREE_CFLAGS = "" MODULE__ELEMENTTREE_DEPS = "../Modules/pyexpat.c" MODULE__ELEMENTTREE_STATE = "yes" MODULE__FUNCTOOLS_LDFLAGS = "" MODULE__GDBM_CFLAGS = "" MODULE__GDBM_LDFLAGS = "-lgdbm" MODULE__GDBM_STATE = "yes" MODULE__HASHLIB_CFLAGS = "" MODULE__HASHLIB_DEPS = "../Modules/hashlib.h" MODULE__HASHLIB_LDFLAGS = "-lcrypto" MODULE__HASHLIB_STATE = "yes" MODULE__HEAPQ_LDFLAGS = "" MODULE__HEAPQ_STATE = "yes" MODULE__IO_CFLAGS = "-I../Modules/_io" MODULE__IO_DEPS = "../Modules/_io/_iomodule.h" MODULE__IO_LDFLAGS = "" MODULE__IO_STATE = "yes" MODULE__JSON_STATE = "yes" MODULE__LOCALE_LDFLAGS = "" MODULE__LSPROF_STATE = "yes" MODULE__LZMA_CFLAGS = "" MODULE__LZMA_LDFLAGS = "-llzma" MODULE__LZMA_STATE = "yes" MODULE__MD5_DEPS = "../Modules/hashlib.h" MODULE__MD5_LDFLAGS = "" MODULE__MD5_STATE = "yes" MODULE__MULTIBYTECODEC_STATE = "yes" MODULE__MULTIPROCESSING_CFLAGS = "-I../Modules/_multiprocessing" MODULE__MULTIPROCESSING_STATE = "yes" MODULE__OPCODE_LDFLAGS = "" MODULE__OPCODE_STATE = "yes" MODULE__OPERATOR_LDFLAGS = "" MODULE__PICKLE_LDFLAGS = "" MODULE__PICKLE_STATE = "yes" MODULE__POSIXSHMEM_CFLAGS = "-I../Modules/_multiprocessing" MODULE__POSIXSHMEM_LDFLAGS = "" MODULE__POSIXSHMEM_STATE = "yes" MODULE__POSIXSUBPROCESS_LDFLAGS = "" MODULE__POSIXSUBPROCESS_STATE = "yes" MODULE__QUEUE_STATE = "yes" MODULE__RANDOM_LDFLAGS = "" MODULE__RANDOM_STATE = "yes" MODULE__SCPROXY_STATE = "n/a" MODULE__SHA1_DEPS = "../Modules/hashlib.h" MODULE__SHA1_LDFLAGS = "" MODULE__SHA1_STATE = "yes" MODULE__SHA256_DEPS = "../Modules/hashlib.h" MODULE__SHA256_LDFLAGS = "" MODULE__SHA256_STATE = "yes" MODULE__SHA3_DEPS = "../Modules/_sha3/sha3.c ../Modules/_sha3/sha3.h ../Modules/hashlib.h" MODULE__SHA3_LDFLAGS = "" MODULE__SHA3_STATE = "yes" MODULE__SHA512_DEPS = "../Modules/hashlib.h" MODULE__SHA512_LDFLAGS = "" MODULE__SHA512_STATE = "yes" MODULE__SIGNAL_LDFLAGS = "" MODULE__SOCKET_DEPS = "../Modules/socketmodule.h ../Modules/addrinfo.h ../Modules/getaddrinfo.c ../Modules/getnameinfo.c" MODULE__SOCKET_LDFLAGS = "" MODULE__SOCKET_STATE = "yes" MODULE__SQLITE3_CFLAGS = "-I../Modules/_sqlite" MODULE__SQLITE3_DEPS = "../Modules/_sqlite/connection.h ../Modules/_sqlite/cursor.h ../Modules/_sqlite/microprotocols.h ../Modules/_sqlite/module.h ../Modules/_sqlite/prepare_protocol.h ../Modules/_sqlite/row.h ../Modules/_sqlite/util.h" MODULE__SQLITE3_LDFLAGS = "-lsqlite3" MODULE__SQLITE3_STATE = "yes" MODULE__SRE_LDFLAGS = "" MODULE__SSL_CFLAGS = "" MODULE__SSL_DEPS = "../Modules/_ssl.h ../Modules/_ssl/cert.c ../Modules/_ssl/debughelpers.c ../Modules/_ssl/misc.c ../Modules/_ssl_data.h ../Modules/_ssl_data_111.h ../Modules/_ssl_data_300.h ../Modules/socketmodule.h" MODULE__SSL_LDFLAGS = "-lssl -lcrypto" MODULE__SSL_STATE = "yes" MODULE__STATISTICS_LDFLAGS = "-lm" MODULE__STATISTICS_STATE = "yes" MODULE__STAT_LDFLAGS = "" MODULE__STRUCT_LDFLAGS = "" MODULE__STRUCT_STATE = "yes" MODULE__SYMTABLE_LDFLAGS = "" MODULE__TESTBUFFER_STATE = "yes" MODULE__TESTCAPI_DEPS = "../Modules/testcapi_long.h" MODULE__TESTCAPI_STATE = "yes" MODULE__TESTCLINIC_STATE = "yes" MODULE__TESTIMPORTMULTIPLE_STATE = "yes" MODULE__TESTINTERNALCAPI_STATE = "yes" MODULE__TESTMULTIPHASE_STATE = "yes" MODULE__THREAD_LDFLAGS = "" MODULE__TKINTER_CFLAGS = "-I/usr/include/tcl8.6 -Wno-strict-prototypes -DWITH_APPINIT=1" MODULE__TKINTER_LDFLAGS = "-ltk8.6 -ltkstub8.6 -ltcl8.6 -ltclstub8.6" MODULE__TKINTER_STATE = "yes" MODULE__TRACEMALLOC_LDFLAGS = "" MODULE__TYPING_STATE = "yes" MODULE__UUID_CFLAGS = "-I/usr/include/uuid" MODULE__UUID_LDFLAGS = "-luuid" MODULE__UUID_STATE = "yes" MODULE__WEAKREF_LDFLAGS = "" MODULE__XXSUBINTERPRETERS_STATE = "yes" MODULE__XXTESTFUZZ_STATE = "yes" MODULE__ZONEINFO_STATE = "yes" MULTIARCH = "arm-linux-gnueabi" MULTIARCH_CPPFLAGS = "-DMULTIARCH=\"arm-linux-gnueabi\"" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "" OPENSSL_LDFLAGS = "" OPENSSL_LIBS = "-lssl -lcrypto" OPENSSL_RPATH = "" OPT = "-DNDEBUG -g -fwrapv -O2 -Wall" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ Parser/myreadline.o Parser/tokenizer.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "-fprofile-generate" PGO_PROF_USE_FLAG = "" PLATLIBDIR = "lib" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo --timeout=1200" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_BUILD_DEPS = "python" PYTHON_FOR_FREEZE = "./_bootstrap_python" PYTHON_FOR_REGEN = "" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha256,sha512,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I../Include/internal -IObjects -IInclude -IPython -I. -I../Include -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 " PY_CFLAGS_NODIST = "-std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I../Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I../Include/internal -IObjects -IInclude -IPython -I. -I../Include -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = " -g -fwrapv -O2 " PY_CPPFLAGS = "-IObjects -IInclude -IPython -I. -I../Include -Wdate-time -D_FORTIFY_SOURCE=2" PY_ENABLE_SHARED = "1" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = " -g -fwrapv -O2 " PY_LDFLAGS_NODIST = "" PY_LDFLAGS_NOLTO = " -g -fwrapv -O2 " PY_SQLITE_ENABLE_LOAD_EXTENSION = "1" PY_SQLITE_HAVE_SERIALIZE = "1" PY_SSL_DEFAULT_CIPHERS = "2" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I../Include/internal -IObjects -IInclude -IPython -I. -I../Include -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC" PY_SUPPORT_TIER = "0" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_STATS = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/build/reproducible-path/python3.11-3.11.2/build-shared" SCRIPTDIR = "/usr/lib" SETPGRP_HAVE_ARG = "0" SHAREDMODS = "Modules/_asyncio.cpython-311-arm-linux-gnueabi.so Modules/_contextvars.cpython-311-arm-linux-gnueabi.so Modules/_json.cpython-311-arm-linux-gnueabi.so Modules/_lsprof.cpython-311-arm-linux-gnueabi.so Modules/_queue.cpython-311-arm-linux-gnueabi.so Modules/_typing.cpython-311-arm-linux-gnueabi.so Modules/_xxsubinterpreters.cpython-311-arm-linux-gnueabi.so Modules/_zoneinfo.cpython-311-arm-linux-gnueabi.so Modules/audioop.cpython-311-arm-linux-gnueabi.so Modules/_decimal.cpython-311-arm-linux-gnueabi.so Modules/_bz2.cpython-311-arm-linux-gnueabi.so Modules/_lzma.cpython-311-arm-linux-gnueabi.so Modules/_gdbm.cpython-311-arm-linux-gnueabi.so Modules/_codecs_cn.cpython-311-arm-linux-gnueabi.so Modules/_codecs_hk.cpython-311-arm-linux-gnueabi.so Modules/_codecs_iso2022.cpython-311-arm-linux-gnueabi.so Modules/_codecs_jp.cpython-311-arm-linux-gnueabi.so Modules/_codecs_kr.cpython-311-arm-linux-gnueabi.so Modules/_codecs_tw.cpython-311-arm-linux-gnueabi.so Modules/_multibytecodec.cpython-311-arm-linux-gnueabi.so Modules/_crypt.cpython-311-arm-linux-gnueabi.so Modules/mmap.cpython-311-arm-linux-gnueabi.so Modules/nis.cpython-311-arm-linux-gnueabi.so Modules/ossaudiodev.cpython-311-arm-linux-gnueabi.so Modules/resource.cpython-311-arm-linux-gnueabi.so Modules/termios.cpython-311-arm-linux-gnueabi.so Modules/_posixshmem.cpython-311-arm-linux-gnueabi.so Modules/_multiprocessing.cpython-311-arm-linux-gnueabi.so Modules/_sqlite3.cpython-311-arm-linux-gnueabi.so Modules/_ssl.cpython-311-arm-linux-gnueabi.so Modules/_hashlib.cpython-311-arm-linux-gnueabi.so Modules/_uuid.cpython-311-arm-linux-gnueabi.so Modules/_tkinter.cpython-311-arm-linux-gnueabi.so Modules/_xxtestfuzz.cpython-311-arm-linux-gnueabi.so Modules/_testbuffer.cpython-311-arm-linux-gnueabi.so Modules/_testinternalcapi.cpython-311-arm-linux-gnueabi.so Modules/_testcapi.cpython-311-arm-linux-gnueabi.so Modules/_testclinic.cpython-311-arm-linux-gnueabi.so Modules/_testimportmultiple.cpython-311-arm-linux-gnueabi.so Modules/_testmultiphase.cpython-311-arm-linux-gnueabi.so Modules/_ctypes_test.cpython-311-arm-linux-gnueabi.so Modules/xxlimited.cpython-311-arm-linux-gnueabi.so Modules/xxlimited_35.cpython-311-arm-linux-gnueabi.so" SHELL = "/bin/sh" SHLIBS = "-ldl" SHLIB_SUFFIX = ".so" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "16" SIZEOF_INT = "4" SIZEOF_LONG = "4" SIZEOF_LONG_DOUBLE = "8" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "4" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "4" SIZEOF_TIME_T = "4" SIZEOF_UINTPTR_T = "4" SIZEOF_VOID_P = "4" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SOABI = "cpython-311-arm-linux-gnueabi" SRCDIRS = "Modules Modules/_blake2 Modules/_ctypes Modules/_decimal Modules/_decimal/libmpdec Modules/_io Modules/_multiprocessing Modules/_sha3 Modules/_sqlite Modules/_sre Modules/_xxtestfuzz Modules/cjkcodecs Modules/expat Objects Parser Programs Python Python/frozen_modules Python/deepfreeze" SRC_GDB_HOOKS = "../Tools/gdb/libpython.py" STATIC_LIBPYTHON = "1" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/build/reproducible-path/python3.11-3.11.2/build-shared ./python -E" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/build/reproducible-path/python3.11-3.11.2/build-shared ./python -E ../Tools/scripts/run_tests.py" TESTSUBDIRS = "ctypes/test \" TESTTIMEOUT = "1200" TEST_MODULES = "yes" THREAD_STACK_SIZE = "0" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "../Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "1" VERSION = "3.11" VPATH = ".." WASM_ASSETS_DIR = "./usr" WASM_STDLIB = "./usr/lib/python3.11/os.py" WHEEL_PKG_DIR = "/usr/share/python-wheels/" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "1" WITH_DYLD = "0" WITH_EDITLINE = "0" WITH_FREELISTS = "1" WITH_LIBINTL = "0" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/build/reproducible-path/python3.11-3.11.2/build-shared" abs_srcdir = "/build/reproducible-path/python3.11-3.11.2/build-shared/.." base = "/usr" datarootdir = "/usr/share" exec_prefix = "/usr" installed_base = "/usr" installed_platbase = "/usr" multiarchsubdir = "/arm-linux-gnueabi" platbase = "/usr" platlibdir = "lib" prefix = "/usr" projectbase = "/usr/bin" py_version = "3.11.2" py_version_nodot = "311" py_version_nodot_plat = "" py_version_short = "3.11" srcdir = "/usr/lib/python3.11/config-3.11-arm-linux-gnueabi" userbase = "/srv/dev-disk-by-uuid-d32e723a-8577-43a5-b538-4538bfa385d3/home/luca/.local" maturin-1.16.0/sysconfig/cpython-linux-mips64-3.11.txt000066400000000000000000001033751527064705700223720ustar00rootroot00000000000000Platform: "linux-mips64" Python version: "3.11" Current installation scheme: "posix_prefix" Paths: data = "/usr" include = "/usr/include/python3.11" platinclude = "/usr/include/python3.11" platlib = "/usr/lib/python3.11/site-packages" platstdlib = "/usr/lib/python3.11" purelib = "/usr/lib/python3.11/site-packages" scripts = "/usr/bin" stdlib = "/usr/lib/python3.11" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "0" AIX_GENUINE_CPLUSPLUS = "0" ALIGNOF_LONG = "8" ALIGNOF_SIZE_T = "8" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "mips64-unknown-linux-gnu-ar" ARFLAGS = "rcs" BASECFLAGS = "-Wsign-compare" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/bin" BINLIBDEST = "/usr/lib/python3.11" BLDLIBRARY = "-L. -lpython3.11" BLDSHARED = "mips64-unknown-linux-gnu-gcc -shared" BOOTSTRAP_HEADERS = "\" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "mips64-unknown-linux-gnu" BYTESTR_DEPS = "\" CC = "mips64-unknown-linux-gnu-gcc" CCSHARED = "-fPIC" CFLAGS = "-Wsign-compare -DNDEBUG" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "" CONFIGURE_CFLAGS_NODIST = "-O3 -pipe -march=native -mtune=native -mabi=64 -fwrapv -fno-semantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden" CONFIGURE_CPPFLAGS = "-I/usr/include/ncursesw" CONFIGURE_LDFLAGS = "" CONFIGURE_LDFLAGS_NODIST = "-Wl,-O1 -Wl,--as-needed -fno-semantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g" CONFIGURE_LDFLAGS_NOLTO = "-fno-lto" CONFIG_ARGS = "'--prefix=/usr' '--build=mips64-unknown-linux-gnu' '--host=mips64-unknown-linux-gnu' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--datadir=/usr/share' '--sysconfdir=/etc' '--localstatedir=/var/lib' '--docdir=/usr/share/doc/python-3.11.4' '--htmldir=/usr/share/doc/python-3.11.4/html' '--libdir=/usr/lib64' 'ac_cv_header_stropts_h=no' '--enable-shared' '--without-static-libpython' '--enable-ipv6' '--infodir=/usr/share/info' '--mandir=/usr/share/man' '--with-computed-gotos' '--with-dbmliborder=gdbm' '--with-libc=' '--enable-loadable-sqlite-extensions' '--without-ensurepip' '--with-system-expat' '--with-system-ffi' '--with-platlibdir=lib' '--with-pkg-config=yes' '--with-wheel-pkg-dir=/usr/lib/python/ensurepip' '--without-assertions' '--with-lto' '--enable-optimizations' '--with-readline=readline' '--without-valgrind' 'build_alias=mips64-unknown-linux-gnu' 'host_alias=mips64-unknown-linux-gnu' 'PKG_CONFIG=mips64-unknown-linux-gnu-pkg-config' 'CFLAGS=' 'LDFLAGS=' 'CPPFLAGS= -I/usr/include/ncursesw' 'PROFILE_TASK=-m test -j16 --pgo-extended -u-network --timeout 1200 -x test_gdb -x test_dtrace -x test_asyncio -x test_httpservers -x test_logging -x test_multiprocessing_fork -x test_socket -x test_xmlrpc -x test_tools'" CONFINCLUDEDIR = "/usr/include" CONFINCLUDEPY = "/usr/include/python3.11" COREPYTHONPATH = "" COVERAGE_INFO = "/var/tmp/portage/dev-lang/python-3.11.4/work/Python-3.11.4/coverage.info" COVERAGE_LCOV_OPTIONS = "--rc lcov_branch_coverage=1" COVERAGE_REPORT = "/var/tmp/portage/dev-lang/python-3.11.4/work/Python-3.11.4/lcov-report" COVERAGE_REPORT_OPTIONS = "--rc lcov_branch_coverage=1 --branch-coverage --title "CPython 3.11 LCOV report [commit $(shell )]"" CPPFLAGS = "-I. -I./Include -I/usr/include/ncursesw" CXX = "mips64-unknown-linux-gnu-g++" DECIMAL_CFLAGS = "-I./Modules/_decimal/libmpdec -DCONFIG_64=1 -DANSI=1 -DHAVE_UINT128_T=1" DECIMAL_LDFLAGS = "-lm Modules/_decimal/libmpdec/libmpdec.a" DEEPFREEZE_DEPS = "./Tools/scripts/deepfreeze.py _bootstrap_python ./Programs/_freeze_module.py \" DEEPFREEZE_OBJS = "Python/deepfreeze/deepfreeze.o" DESTDIRS = "/usr /usr/lib64 /usr/lib/python3.11 /usr/lib/python3.11/lib-dynload" DESTLIB = "/usr/lib/python3.11" DESTPATH = "" DESTSHARED = "/usr/lib/python3.11/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "1" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "0" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXPAT_CFLAGS = "" EXPAT_LDFLAGS = "-lexpat" EXPORTSFROM = "" EXPORTSYMS = "" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-311-mips64-linux-gnuabi64.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "1" FREEZE_MODULE = "./_bootstrap_python ./Programs/_freeze_module.py" FREEZE_MODULE_BOOTSTRAP = "./Programs/_freeze_module" FREEZE_MODULE_BOOTSTRAP_DEPS = "Programs/_freeze_module" FREEZE_MODULE_DEPS = "_bootstrap_python ./Programs/_freeze_module.py" FROZEN_FILES_IN = "\" FROZEN_FILES_OUT = "\" GETPGRP_HAVE_ARG = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT = "1" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "1" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "1" HAVE_ATANH = "1" HAVE_BIND = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "1" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_BZLIB_H = "1" HAVE_CHFLAGS = "0" HAVE_CHMOD = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_NANOSLEEP = "1" HAVE_CLOCK_SETTIME = "1" HAVE_CLOSE_RANGE = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_CONNECT = "1" HAVE_COPY_FILE_RANGE = "1" HAVE_CRYPT_H = "1" HAVE_CRYPT_R = "1" HAVE_CTERMID = "1" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DB_H = "0" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "1" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "1" HAVE_EPOLL_CREATE1 = "1" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EVENTFD = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORK1 = "0" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "1" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "0" HAVE_GCC_ASM_FOR_X87 = "0" HAVE_GCC_UINT128_T = "1" HAVE_GDBM_DASH_NDBM_H = "0" HAVE_GDBM_H = "1" HAVE_GDBM_NDBM_H = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETEGID = "1" HAVE_GETENTROPY = "1" HAVE_GETEUID = "1" HAVE_GETGID = "1" HAVE_GETGRGID = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYADDR = "1" HAVE_GETHOSTBYNAME = "1" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETHOSTNAME = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPROTOBYNAME = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "1" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETRUSAGE = "1" HAVE_GETSERVBYNAME = "1" HAVE_GETSERVBYPORT = "1" HAVE_GETSID = "1" HAVE_GETSOCKNAME = "1" HAVE_GETSPENT = "1" HAVE_GETSPNAM = "1" HAVE_GETUID = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_IEEEFP_H = "0" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_NTOA = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "0" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "0" HAVE_LCHOWN = "1" HAVE_LIBB2 = "1" HAVE_LIBDB = "0" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBGDBM_COMPAT = "1" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBNDBM = "0" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBSQLITE3 = "1" HAVE_LIBUTIL_H = "0" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_AUXVEC_H = "1" HAVE_LINUX_CAN_BCM_H = "1" HAVE_LINUX_CAN_H = "1" HAVE_LINUX_CAN_J1939_H = "1" HAVE_LINUX_CAN_RAW_FD_FRAMES = "1" HAVE_LINUX_CAN_RAW_H = "1" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "1" HAVE_LINUX_MEMFD_H = "1" HAVE_LINUX_NETLINK_H = "1" HAVE_LINUX_QRTR_H = "1" HAVE_LINUX_RANDOM_H = "1" HAVE_LINUX_SOUNDCARD_H = "1" HAVE_LINUX_TIPC_H = "1" HAVE_LINUX_VM_SOCKETS_H = "1" HAVE_LINUX_WAIT_H = "1" HAVE_LISTEN = "1" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LOGIN_TTY = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_LZMA_H = "0" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "1" HAVE_MEMRCHR = "1" HAVE_MINIX_CONFIG_H = "0" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "1" HAVE_NANOSLEEP = "1" HAVE_NCURSES_H = "1" HAVE_NDBM_H = "0" HAVE_NDIR_H = "0" HAVE_NETCAN_CAN_H = "0" HAVE_NETDB_H = "1" HAVE_NETINET_IN_H = "1" HAVE_NETPACKET_PACKET_H = "1" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION = "0" HAVE_OPENAT = "1" HAVE_OPENDIR = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "1" HAVE_PRLIMIT = "1" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTHREAD_STUBS = "0" HAVE_PTY_H = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "1" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RECVFROM = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_RPC_RPC_H = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "1" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_CLOCKWAIT = "1" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SENDTO = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETJMP_H = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETSOCKOPT = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "1" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SHUTDOWN = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "1" HAVE_SOCKADDR_SA_LEN = "0" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKET = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SPLICE = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "0" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDIO_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "0" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "0" HAVE_STRUCT_STAT_ST_GEN = "0" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYSLOG_H = "1" HAVE_SYSTEM = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_AUXV_H = "1" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "0" HAVE_SYS_EPOLL_H = "1" HAVE_SYS_EVENTFD_H = "1" HAVE_SYS_EVENT_H = "0" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "0" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "1" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_SOUNDCARD_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "1" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "1" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "1" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TTYNAME = "1" HAVE_TZNAME = "0" HAVE_UMASK = "1" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UTMP_H = "1" HAVE_UUID_CREATE = "0" HAVE_UUID_ENC_BE = "0" HAVE_UUID_GENERATE_TIME_SAFE = "1" HAVE_UUID_H = "1" HAVE_UUID_UUID_H = "0" HAVE_VFORK = "1" HAVE_WAIT = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_ZLIB_COPY = "1" HAVE_ZLIB_H = "0" HAVE__GETPTY = "0" HOSTRUNNER = "" HOST_GNU_TYPE = "mips64-unknown-linux-gnu" INCLDIRSTOMAKE = "/usr/include /usr/include /usr/include/python3.11 /usr/include/python3.11" INCLUDEDIR = "/usr/include" INCLUDEPY = "/usr/include/python3.11" INSTALL = "/var/tmp/portage/._portage_reinstall_.4wisvm5r/bin/ebuild-helpers/xattr/install -c" INSTALL_DATA = "/var/tmp/portage/._portage_reinstall_.4wisvm5r/bin/ebuild-helpers/xattr/install -c -m 644" INSTALL_PROGRAM = "/var/tmp/portage/._portage_reinstall_.4wisvm5r/bin/ebuild-helpers/xattr/install -c" INSTALL_SCRIPT = "/var/tmp/portage/._portage_reinstall_.4wisvm5r/bin/ebuild-helpers/xattr/install -c" INSTALL_SHARED = "/var/tmp/portage/._portage_reinstall_.4wisvm5r/bin/ebuild-helpers/xattr/install -c -m 755" INSTSONAME = "libpython3.11.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "mips64-unknown-linux-gnu-g++ -shared" LDFLAGS = "" LDLIBRARY = "libpython3.11.so" LDLIBRARYDIR = "" LDSHARED = "mips64-unknown-linux-gnu-gcc -shared" LDVERSION = "3.11" LIBC = "" LIBDEST = "/usr/lib/python3.11" LIBDIR = "/usr/lib64" LIBEXPAT_A = "Modules/expat/libexpat.a" LIBEXPAT_CFLAGS = "-Wsign-compare -DNDEBUG -O3 -pipe -march=native -mtune=native -mabi=64 -fwrapv -fno-semantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -fprofile-use -fprofile-correction -I./Include/internal -I. -I./Include -I/usr/include/ncursesw -fPIC -fPIC" LIBEXPAT_HEADERS = "\" LIBEXPAT_OBJS = "\" LIBFFI_INCLUDEDIR = "/usr/lib64/libffi/include" LIBM = "-lm" LIBMPDEC_A = "Modules/_decimal/libmpdec/libmpdec.a" LIBMPDEC_CFLAGS = "-I./Modules/_decimal/libmpdec -DCONFIG_64=1 -DANSI=1 -DHAVE_UINT128_T=1 -Wsign-compare -DNDEBUG -O3 -pipe -march=native -mtune=native -mabi=64 -fwrapv -fno-semantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -fprofile-use -fprofile-correction -I./Include/internal -I. -I./Include -I/usr/include/ncursesw -fPIC -fPIC" LIBMPDEC_HEADERS = "\" LIBMPDEC_OBJS = "\" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/lib64/pkgconfig" LIBPL = "/usr/lib/python3.11/config-3.11-mips64-linux-gnuabi64" LIBPYTHON = "" LIBRARY = "libpython3.11.a" LIBRARY_DEPS = "libpython3.11.so libpython3.so" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-ldl" LIBSUBDIRS = "asyncio \" LINKCC = "mips64-unknown-linux-gnu-gcc" LINKFORSHARED = "-Xlinker -export-dynamic" LINK_PYTHON_DEPS = "libpython3.11.so libpython3.so" LINK_PYTHON_OBJS = "-L. -lpython3.11" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "true" LN = "ln" LOCALMODLIBS = "" MACHDEP = "linux" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/lib/python3.11" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "mips64-unknown-linux-gnu-gcc" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "1" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/share/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "atexit faulthandler posix _signal _tracemalloc _codecs _collections errno _io itertools _sre _thread time _weakref _abc _functools _locale _operator _stat _symtable pwd xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "" MODOBJS = "Modules/atexitmodule.o Modules/faulthandler.o Modules/posixmodule.o Modules/signalmodule.o Modules/_tracemalloc.o Modules/_codecsmodule.o Modules/_collectionsmodule.o Modules/errnomodule.o Modules/_io/_iomodule.o Modules/_io/iobase.o Modules/_io/fileio.o Modules/_io/bytesio.o Modules/_io/bufferedio.o Modules/_io/textio.o Modules/_io/stringio.o Modules/itertoolsmodule.o Modules/_sre/sre.o Modules/_threadmodule.o Modules/timemodule.o Modules/_weakref.o Modules/_abc.o Modules/_functoolsmodule.o Modules/_localemodule.o Modules/_operator.o Modules/_stat.o Modules/symtablemodule.o Modules/pwdmodule.o Modules/xxsubtype.o" MODSHARED_NAMES = "" MODULE_ARRAY_STATE = "yes" MODULE_ATEXIT_LDFLAGS = "" MODULE_AUDIOOP_LDFLAGS = "-lm" MODULE_AUDIOOP_STATE = "yes" MODULE_BINASCII_CFLAGS = "-DUSE_ZLIB_CRC32" MODULE_BINASCII_LDFLAGS = "-lz" MODULE_BINASCII_STATE = "yes" MODULE_CMATH_DEPS = "./Modules/_math.h" MODULE_CMATH_LDFLAGS = "-lm" MODULE_CMATH_STATE = "yes" MODULE_ERRNO_LDFLAGS = "" MODULE_FAULTHANDLER_LDFLAGS = "" MODULE_FCNTL_LDFLAGS = "" MODULE_FCNTL_STATE = "yes" MODULE_GRP_STATE = "yes" MODULE_ITERTOOLS_LDFLAGS = "" MODULE_MATH_DEPS = "./Modules/_math.h" MODULE_MATH_LDFLAGS = "-lm" MODULE_MATH_STATE = "yes" MODULE_MMAP_STATE = "yes" MODULE_NIS_CFLAGS = "-I/usr/include/tirpc" MODULE_NIS_LDFLAGS = "-lnsl -ltirpc" MODULE_NIS_STATE = "disabled" MODULE_OBJS = "\" MODULE_OSSAUDIODEV_LDFLAGS = "" MODULE_OSSAUDIODEV_STATE = "yes" MODULE_POSIX_LDFLAGS = "" MODULE_PWD_LDFLAGS = "" MODULE_PWD_STATE = "yes" MODULE_PYEXPAT_CFLAGS = "" MODULE_PYEXPAT_DEPS = "" MODULE_PYEXPAT_LDFLAGS = "-lexpat" MODULE_PYEXPAT_STATE = "yes" MODULE_READLINE_STATE = "yes" MODULE_RESOURCE_STATE = "yes" MODULE_SELECT_STATE = "yes" MODULE_SPWD_STATE = "yes" MODULE_SYSLOG_STATE = "yes" MODULE_TERMIOS_STATE = "yes" MODULE_TIME_LDFLAGS = "" MODULE_TIME_STATE = "yes" MODULE_UNICODEDATA_DEPS = "./Modules/unicodedata_db.h ./Modules/unicodename_db.h" MODULE_UNICODEDATA_STATE = "yes" MODULE_XXLIMITED_35_STATE = "yes" MODULE_XXLIMITED_STATE = "yes" MODULE_XXSUBTYPE_LDFLAGS = "" MODULE_ZLIB_CFLAGS = "" MODULE_ZLIB_LDFLAGS = "-lz" MODULE_ZLIB_STATE = "yes" MODULE__ABC_LDFLAGS = "" MODULE__ASYNCIO_STATE = "yes" MODULE__BISECT_STATE = "yes" MODULE__BLAKE2_CFLAGS = "" MODULE__BLAKE2_DEPS = "./Modules/_blake2/impl/blake2-config.h ./Modules/_blake2/impl/blake2-impl.h ./Modules/_blake2/impl/blake2.h ./Modules/_blake2/impl/blake2b-load-sse2.h ./Modules/_blake2/impl/blake2b-load-sse41.h ./Modules/_blake2/impl/blake2b-ref.c ./Modules/_blake2/impl/blake2b-round.h ./Modules/_blake2/impl/blake2b.c ./Modules/_blake2/impl/blake2s-load-sse2.h ./Modules/_blake2/impl/blake2s-load-sse41.h ./Modules/_blake2/impl/blake2s-load-xop.h ./Modules/_blake2/impl/blake2s-ref.c ./Modules/_blake2/impl/blake2s-round.h ./Modules/_blake2/impl/blake2s.c ./Modules/_blake2/blake2module.h ./Modules/hashlib.h" MODULE__BLAKE2_LDFLAGS = "-lb2" MODULE__BLAKE2_STATE = "yes" MODULE__BZ2_CFLAGS = "" MODULE__BZ2_LDFLAGS = "-lbz2" MODULE__BZ2_STATE = "yes" MODULE__CODECS_CN_STATE = "yes" MODULE__CODECS_HK_STATE = "yes" MODULE__CODECS_ISO2022_STATE = "yes" MODULE__CODECS_JP_STATE = "yes" MODULE__CODECS_KR_STATE = "yes" MODULE__CODECS_LDFLAGS = "" MODULE__CODECS_TW_STATE = "yes" MODULE__COLLECTIONS_LDFLAGS = "" MODULE__CONTEXTVARS_STATE = "yes" MODULE__CRYPT_CFLAGS = "" MODULE__CRYPT_LDFLAGS = "-lcrypt" MODULE__CRYPT_STATE = "yes" MODULE__CSV_STATE = "yes" MODULE__CTYPES_DEPS = "./Modules/_ctypes/ctypes.h" MODULE__CTYPES_TEST_LDFLAGS = "-lm" MODULE__CTYPES_TEST_STATE = "yes" MODULE__CURSES_PANEL_STATE = "yes" MODULE__CURSES_STATE = "yes" MODULE__DATETIME_LDFLAGS = "-lm" MODULE__DATETIME_STATE = "yes" MODULE__DBM_STATE = "yes" MODULE__DECIMAL_CFLAGS = "-I./Modules/_decimal/libmpdec -DCONFIG_64=1 -DANSI=1 -DHAVE_UINT128_T=1" MODULE__DECIMAL_DEPS = "./Modules/_decimal/docstrings.h \ Modules/_decimal/libmpdec/libmpdec.a" MODULE__DECIMAL_LDFLAGS = "-lm Modules/_decimal/libmpdec/libmpdec.a" MODULE__DECIMAL_STATE = "yes" MODULE__ELEMENTTREE_CFLAGS = "" MODULE__ELEMENTTREE_DEPS = "./Modules/pyexpat.c" MODULE__ELEMENTTREE_STATE = "yes" MODULE__FUNCTOOLS_LDFLAGS = "" MODULE__GDBM_CFLAGS = "" MODULE__GDBM_LDFLAGS = "-lgdbm" MODULE__GDBM_STATE = "yes" MODULE__HASHLIB_CFLAGS = "" MODULE__HASHLIB_DEPS = "./Modules/hashlib.h" MODULE__HASHLIB_LDFLAGS = "-lcrypto" MODULE__HASHLIB_STATE = "yes" MODULE__HEAPQ_STATE = "yes" MODULE__IO_CFLAGS = "-I./Modules/_io" MODULE__IO_DEPS = "./Modules/_io/_iomodule.h" MODULE__IO_LDFLAGS = "" MODULE__IO_STATE = "yes" MODULE__JSON_STATE = "yes" MODULE__LOCALE_LDFLAGS = "" MODULE__LSPROF_STATE = "yes" MODULE__LZMA_CFLAGS = "" MODULE__LZMA_LDFLAGS = "-llzma" MODULE__LZMA_STATE = "yes" MODULE__MD5_DEPS = "./Modules/hashlib.h" MODULE__MD5_STATE = "yes" MODULE__MULTIBYTECODEC_STATE = "yes" MODULE__MULTIPROCESSING_CFLAGS = "-I./Modules/_multiprocessing" MODULE__MULTIPROCESSING_STATE = "yes" MODULE__OPCODE_STATE = "yes" MODULE__OPERATOR_LDFLAGS = "" MODULE__PICKLE_STATE = "yes" MODULE__POSIXSHMEM_CFLAGS = "-I./Modules/_multiprocessing" MODULE__POSIXSHMEM_LDFLAGS = "" MODULE__POSIXSHMEM_STATE = "yes" MODULE__POSIXSUBPROCESS_STATE = "yes" MODULE__QUEUE_STATE = "yes" MODULE__RANDOM_STATE = "yes" MODULE__SCPROXY_STATE = "n/a" MODULE__SHA1_DEPS = "./Modules/hashlib.h" MODULE__SHA1_STATE = "yes" MODULE__SHA256_DEPS = "./Modules/hashlib.h" MODULE__SHA256_STATE = "yes" MODULE__SHA3_DEPS = "./Modules/_sha3/sha3.c ./Modules/_sha3/sha3.h ./Modules/hashlib.h" MODULE__SHA3_STATE = "yes" MODULE__SHA512_DEPS = "./Modules/hashlib.h" MODULE__SHA512_STATE = "yes" MODULE__SIGNAL_LDFLAGS = "" MODULE__SOCKET_DEPS = "./Modules/socketmodule.h ./Modules/addrinfo.h ./Modules/getaddrinfo.c ./Modules/getnameinfo.c" MODULE__SOCKET_STATE = "yes" MODULE__SQLITE3_CFLAGS = "-I./Modules/_sqlite" MODULE__SQLITE3_DEPS = "./Modules/_sqlite/connection.h ./Modules/_sqlite/cursor.h ./Modules/_sqlite/microprotocols.h ./Modules/_sqlite/module.h ./Modules/_sqlite/prepare_protocol.h ./Modules/_sqlite/row.h ./Modules/_sqlite/util.h" MODULE__SQLITE3_LDFLAGS = "-lsqlite3" MODULE__SQLITE3_STATE = "yes" MODULE__SRE_LDFLAGS = "" MODULE__SSL_CFLAGS = "" MODULE__SSL_DEPS = "./Modules/_ssl.h ./Modules/_ssl/cert.c ./Modules/_ssl/debughelpers.c ./Modules/_ssl/misc.c ./Modules/_ssl_data.h ./Modules/_ssl_data_111.h ./Modules/_ssl_data_300.h ./Modules/socketmodule.h" MODULE__SSL_LDFLAGS = "-lssl -lcrypto" MODULE__SSL_STATE = "yes" MODULE__STATISTICS_LDFLAGS = "-lm" MODULE__STATISTICS_STATE = "yes" MODULE__STAT_LDFLAGS = "" MODULE__STRUCT_STATE = "yes" MODULE__SYMTABLE_LDFLAGS = "" MODULE__TESTBUFFER_STATE = "yes" MODULE__TESTCAPI_DEPS = "./Modules/testcapi_long.h" MODULE__TESTCAPI_STATE = "yes" MODULE__TESTCLINIC_STATE = "yes" MODULE__TESTIMPORTMULTIPLE_STATE = "yes" MODULE__TESTINTERNALCAPI_STATE = "yes" MODULE__TESTMULTIPHASE_STATE = "yes" MODULE__THREAD_LDFLAGS = "" MODULE__TKINTER_STATE = "disabled" MODULE__TRACEMALLOC_LDFLAGS = "" MODULE__TYPING_STATE = "yes" MODULE__UUID_CFLAGS = "-I/usr/include/uuid" MODULE__UUID_LDFLAGS = "-luuid" MODULE__UUID_STATE = "yes" MODULE__WEAKREF_LDFLAGS = "" MODULE__XXSUBINTERPRETERS_STATE = "yes" MODULE__XXTESTFUZZ_STATE = "yes" MODULE__ZONEINFO_STATE = "yes" MULTIARCH = "mips64-linux-gnuabi64" MULTIARCH_CPPFLAGS = "-DMULTIARCH=\"mips64-linux-gnuabi64\"" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "" OPENSSL_LDFLAGS = "" OPENSSL_LIBS = "-lssl -lcrypto" OPENSSL_RPATH = "" OPT = "-DNDEBUG" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ Parser/myreadline.o Parser/tokenizer.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "-fprofile-generate" PGO_PROF_USE_FLAG = "-fprofile-use -fprofile-correction" PLATLIBDIR = "lib" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test -j16 --pgo-extended -u-network --timeout 1200 -x test_gdb -x test_dtrace -x test_asyncio -x test_httpservers -x test_logging -x test_multiprocessing_fork -x test_socket -x test_xmlrpc -x test_tools" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_BUILD_DEPS = "python" PYTHON_FOR_FREEZE = "./_bootstrap_python" PYTHON_FOR_REGEN = "" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha256,sha512,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-Wsign-compare -DNDEBUG -O3 -pipe -march=native -mtune=native -mabi=64 -fwrapv -fno-semantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -fprofile-use -fprofile-correction -I./Include/internal -I. -I./Include -I/usr/include/ncursesw -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wsign-compare -DNDEBUG" PY_CFLAGS_NODIST = "-O3 -pipe -march=native -mtune=native -mabi=64 -fwrapv -fno-semantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -fprofile-use -fprofile-correction -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wsign-compare -DNDEBUG -O3 -pipe -march=native -mtune=native -mabi=64 -fwrapv -fno-semantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -fprofile-use -fprofile-correction -I./Include/internal -I. -I./Include -I/usr/include/ncursesw -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-Wl,-O1 -Wl,--as-needed -fno-semantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g" PY_CPPFLAGS = "-I. -I./Include -I/usr/include/ncursesw" PY_ENABLE_SHARED = "1" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "" PY_LDFLAGS_NODIST = "-Wl,-O1 -Wl,--as-needed -fno-semantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g" PY_LDFLAGS_NOLTO = "-fno-lto" PY_SQLITE_ENABLE_LOAD_EXTENSION = "1" PY_SQLITE_HAVE_SERIALIZE = "1" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wsign-compare -DNDEBUG -O3 -pipe -march=native -mtune=native -mabi=64 -fwrapv -fno-semantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -fprofile-use -fprofile-correction -I./Include/internal -I. -I./Include -I/usr/include/ncursesw -fPIC" PY_SUPPORT_TIER = "0" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_STATS = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "mips64-unknown-linux-gnu-readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/var/tmp/portage/dev-lang/python-3.11.4/work/Python-3.11.4" SCRIPTDIR = "/usr/lib" SETPGRP_HAVE_ARG = "0" SHELL = "/bin/sh" SHLIBS = "-ldl" SHLIB_SUFFIX = ".so" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "16" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SOABI = "cpython-311-mips64-linux-gnuabi64" SRCDIRS = "Modules Modules/_blake2 Modules/_ctypes Modules/_decimal Modules/_decimal/libmpdec Modules/_io Modules/_multiprocessing Modules/_sha3 Modules/_sqlite Modules/_sre Modules/_xxtestfuzz Modules/cjkcodecs Modules/expat Objects Parser Programs Python Python/frozen_modules Python/deepfreeze" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STATIC_LIBPYTHON = "0" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/var/tmp/portage/dev-lang/python-3.11.4/work/Python-3.11.4 ./python -E" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/var/tmp/portage/dev-lang/python-3.11.4/work/Python-3.11.4 ./python -E ./Tools/scripts/run_tests.py" TESTSUBDIRS = "ctypes/test \" TESTTIMEOUT = "1200" TEST_MODULES = "yes" THREAD_STACK_SIZE = "0" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "1" VERSION = "3.11" WASM_ASSETS_DIR = "./usr" WASM_STDLIB = "./usr/lib/python3.11/os.py" WHEEL_PKG_DIR = "/usr/lib/python/ensurepip" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_EDITLINE = "0" WITH_FREELISTS = "1" WITH_LIBINTL = "0" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/var/tmp/portage/dev-lang/python-3.11.4/work/Python-3.11.4" abs_srcdir = "/var/tmp/portage/dev-lang/python-3.11.4/work/Python-3.11.4" base = "/usr" datarootdir = "/usr/share" exec_prefix = "/usr" installed_base = "/usr" installed_platbase = "/usr" platbase = "/usr" platlibdir = "lib" prefix = "/usr" projectbase = "/usr/bin" py_version = "3.11.4" py_version_nodot = "311" py_version_nodot_plat = "" py_version_short = "3.11" srcdir = "/usr/lib/python3.11/config-3.11-mips64-linux-gnuabi64" userbase = "/var/lib/portage/home/.local" maturin-1.16.0/sysconfig/cpython-linux-mips64el-3.10.txt000066400000000000000000000576151527064705700227170ustar00rootroot00000000000000Platform: "linux-mips64" Python version: "3.10" Current installation scheme: "posix_local" Paths: data = "/usr/local" include = "/usr/include/python3.10" platinclude = "/usr/include/python3.10" platlib = "/usr/local/lib/python3.10/dist-packages" platstdlib = "/usr/lib/python3.10" purelib = "/usr/local/lib/python3.10/dist-packages" scripts = "/usr/local/bin" stdlib = "/usr/lib/python3.10" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "0" AIX_GENUINE_CPLUSPLUS = "0" ALIGNOF_LONG = "8" ALIGNOF_SIZE_T = "8" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "mips64el-linux-gnuabi64-ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare" BASECPPFLAGS = "-IObjects -IInclude -IPython" BASEMODLIBS = "" BINDIR = "/usr/bin" BINLIBDEST = "/usr/lib/mips64el-linux-gnuabi64/python3.10" BLDLIBRARY = "-lpython3.10" BLDSHARED = "mips64el-linux-gnuabi64-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions " BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "mips64el-unknown-linux-gnuabi64" BYTESTR_DEPS = "\" CC = "mips64el-linux-gnuabi64-gcc -pthread" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "-g -fstack-protector-strong -Wformat -Werror=format-security" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden" CONFIGURE_CPPFLAGS = "-Wdate-time -D_FORTIFY_SOURCE=2" CONFIGURE_LDFLAGS = " " CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--enable-shared' '--prefix=/usr' '--libdir=/usr/lib/mips64el-linux-gnuabi64' '--enable-ipv6' '--enable-loadable-sqlite-extensions' '--with-dbmliborder=bdb:gdbm' '--with-computed-gotos' '--without-ensurepip' '--with-system-expat' '--with-dtrace' '--with-system-libmpdec' '--with-wheel-pkg-dir=/usr/share/python-wheels/' 'MKDIR_P=/bin/mkdir -p' '--with-system-ffi' 'CC=mips64el-linux-gnuabi64-gcc' 'CFLAGS=-g -fstack-protector-strong -Wformat -Werror=format-security ' 'LDFLAGS= ' 'CPPFLAGS=-Wdate-time -D_FORTIFY_SOURCE=2'" CONFINCLUDEDIR = "/usr/include" CONFINCLUDEPY = "/usr/include/python3.10" COREPYTHONPATH = "" COVERAGE_INFO = "/build/python3.10-4eBcjM/python3.10-3.10.5/build-shared/coverage.info" COVERAGE_REPORT = "/build/python3.10-4eBcjM/python3.10-3.10.5/build-shared/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-IObjects -IInclude -IPython -I. -I../Include -Wdate-time -D_FORTIFY_SOURCE=2" CXX = "mips64el-linux-gnuabi64-g++ -pthread" DESTDIRS = "/usr /usr/lib/mips64el-linux-gnuabi64 /usr/lib/mips64el-linux-gnuabi64/python3.10 /usr/lib/python3.10/lib-dynload" DESTLIB = "/usr/lib/python3.10" DESTPATH = "" DESTSHARED = "/usr/lib/python3.10/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "/usr/bin/dtrace" DTRACE_DEPS = "\" DTRACE_HEADERS = "Include/pydtrace_probes.h" DTRACE_OBJS = "Python/pydtrace.o" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXPERIMENTAL_ISOLATED_SUBINTERPRETERS = "0" EXPORTSFROM = "" EXPORTSYMS = "" EXTRATESTOPTS = "" EXT_SUFFIX = ".cpython-310-mips64el-linux-gnuabi64.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "1" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "1" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "1" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "0" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_CLOSE_RANGE = "0" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "1" HAVE_CRYPT_H = "1" HAVE_CRYPT_R = "1" HAVE_CTERMID = "1" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "1" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "1" HAVE_EPOLL_CREATE1 = "1" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EVENTFD = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "1" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "0" HAVE_GCC_ASM_FOR_X87 = "0" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "1" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETSID = "1" HAVE_GETSPENT = "1" HAVE_GETSPNAM = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "0" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "0" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "0" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "0" HAVE_LIBUUID = "1" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_AUXVEC_H = "1" HAVE_LINUX_CAN_BCM_H = "1" HAVE_LINUX_CAN_H = "1" HAVE_LINUX_CAN_J1939_H = "1" HAVE_LINUX_CAN_RAW_FD_FRAMES = "1" HAVE_LINUX_CAN_RAW_H = "1" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "1" HAVE_LINUX_MEMFD_H = "1" HAVE_LINUX_NETLINK_H = "1" HAVE_LINUX_QRTR_H = "1" HAVE_LINUX_RANDOM_H = "1" HAVE_LINUX_TIPC_H = "1" HAVE_LINUX_VM_SOCKETS_H = "1" HAVE_LINUX_WAIT_H = "1" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "1" HAVE_MEMORY_H = "0" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "1" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "1" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION = "0" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "1" HAVE_PRLIMIT = "1" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "1" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "1" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_CLOCKWAIT = "1" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "1" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "1" HAVE_SOCKADDR_SA_LEN = "0" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SPLICE = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "0" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "0" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "0" HAVE_STRUCT_STAT_ST_GEN = "0" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_AUXV_H = "1" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "0" HAVE_SYS_EPOLL_H = "1" HAVE_SYS_EVENTFD_H = "1" HAVE_SYS_EVENT_H = "0" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "0" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "1" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "1" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "1" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "1" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "0" HAVE_UUID_ENC_BE = "0" HAVE_UUID_GENERATE_TIME_SAFE = "1" HAVE_UUID_H = "0" HAVE_UUID_UUID_H = "1" HAVE_VFORK = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "mips64el-unknown-linux-gnuabi64" INCLDIRSTOMAKE = "/usr/include /usr/include /usr/include/python3.10 /usr/include/python3.10" INCLUDEDIR = "/usr/include" INCLUDEPY = "/usr/include/python3.10" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "/usr/bin/install -c -m 644" INSTALL_PROGRAM = "/usr/bin/install -c" INSTALL_SCRIPT = "/usr/bin/install -c" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.10.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "mips64el-linux-gnuabi64-g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions" LDFLAGS = " " LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.10.so" LDLIBRARYDIR = "" LDSHARED = "mips64el-linux-gnuabi64-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions " LDVERSION = "3.10" LIBC = "" LIBDEST = "/usr/lib/python3.10" LIBDIR = "/usr/lib/mips64el-linux-gnuabi64" LIBFFI_INCLUDEDIR = "" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/lib/mips64el-linux-gnuabi64/pkgconfig" LIBPL = "/usr/lib/python3.10/config-3.10-mips64el-linux-gnuabi64" LIBPYTHON = "" LIBRARY = "libpython3.10.a" LIBRARY_DEPS = "libpython3.10.a libpython3.10.so libpython3.so" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lcrypt -lpthread -ldl -lutil -lm" LIBSUBDIRS = "asyncio \" LINKCC = "mips64el-linux-gnuabi64-gcc -pthread" LINKFORSHARED = "-Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "true" LN = "ln" LOCALMODLIBS = "-lexpat -L/usr/lib -lz -lexpat" MACHDEP = "linux" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/lib/mips64el-linux-gnuabi64/python3.10" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "mips64el-linux-gnuabi64-gcc -pthread" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "1" MAKESETUP = "../Modules/makesetup" MANDIR = "/usr/share/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "array cmath math _struct _random _elementtree _pickle _datetime _bisect _heapq _statistics unicodedata fcntl spwd grp select _csv _socket _posixsubprocess _md5 _sha1 _sha256 _sha512 _sha3 _blake2 syslog binascii zlib posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _symtable pyexpat xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "-lexpat -L/usr/lib -lz -lexpat" MODOBJS = "$(sort Modules/arraymodule.o Modules/cmathmodule.o Modules/_math.o Modules/mathmodule.o Modules/_math.o Modules/_struct.o Modules/_randommodule.o Modules/_elementtree.o Modules/_pickle.o Modules/_datetimemodule.o Modules/_bisectmodule.o Modules/_heapqmodule.o Modules/_statisticsmodule.o Modules/unicodedata.o Modules/fcntlmodule.o Modules/spwdmodule.o Modules/grpmodule.o Modules/selectmodule.o Modules/_csv.o Modules/socketmodule.o Modules/_posixsubprocess.o Modules/md5module.o Modules/sha1module.o Modules/sha256module.o Modules/sha512module.o Modules/sha3module.o Modules/blake2module.o Modules/blake2b_impl.o Modules/blake2s_impl.o Modules/syslogmodule.o Modules/binascii.o Modules/zlibmodule.o Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/symtablemodule.o Modules/pyexpat.o Modules/xxsubtype.o)" MODULE_OBJS = "\" MULTIARCH = "mips64el-linux-gnuabi64" MULTIARCH_CPPFLAGS = "-DMULTIARCH=\"mips64el-linux-gnuabi64\"" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "" OPENSSL_LDFLAGS = "" OPENSSL_LIBS = "-lssl -lcrypto" OPENSSL_RPATH = "" OPT = "-DNDEBUG -g -fwrapv -O2 -Wall" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ Parser/myreadline.o Parser/tokenizer.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "-fprofile-generate" PGO_PROF_USE_FLAG = "" PLATLIBDIR = "lib" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo --timeout=1200" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_REGEN = "" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha256,sha512,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I../Include/internal -IObjects -IInclude -IPython -I. -I../Include -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I../Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I../Include/internal -IObjects -IInclude -IPython -I. -I../Include -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = " " PY_CPPFLAGS = "-IObjects -IInclude -IPython -I. -I../Include -Wdate-time -D_FORTIFY_SOURCE=2" PY_ENABLE_SHARED = "1" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = " " PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I../Include/internal -IObjects -IInclude -IPython -I. -I../Include -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/build/python3.10-4eBcjM/python3.10-3.10.5/build-shared" SCRIPTDIR = "/usr/lib" SETPGRP_HAVE_ARG = "0" SHELL = "/bin/sh" SHLIBS = "-lcrypt -lpthread -ldl -lutil -lm" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "1" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "16" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".cpython-310-mips64el-linux-gnuabi64.so" SOABI = "cpython-310-mips64el-linux-gnuabi64" SRCDIRS = "Parser Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "../Tools/gdb/libpython.py" STATIC_LIBPYTHON = "1" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "-I/usr/include/tcl8.6" TCLTK_LIBS = "-ltk8.6 -ltkstub8.6 -ltcl8.6 -ltclstub8.6" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/build/python3.10-4eBcjM/python3.10-3.10.5/build-shared ./python" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/build/python3.10-4eBcjM/python3.10-3.10.5/build-shared ./python ../Tools/scripts/run_tests.py" TESTSUBDIRS = "ctypes/test \" TESTTIMEOUT = "1200" TEST_MODULES = "yes" THREAD_STACK_SIZE = "0" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "../Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "1" VERSION = "3.10" VPATH = ".." WHEEL_PKG_DIR = "/usr/share/python-wheels/" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "1" WITH_DYLD = "0" WITH_EDITLINE = "0" WITH_LIBINTL = "0" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/build/python3.10-4eBcjM/python3.10-3.10.5/build-shared" abs_srcdir = "/build/python3.10-4eBcjM/python3.10-3.10.5/build-shared/.." base = "/usr" datarootdir = "/usr/share" exec_prefix = "/usr" installed_base = "/usr" installed_platbase = "/usr" multiarchsubdir = "/mips64el-linux-gnuabi64" platbase = "/usr" platlibdir = "lib" prefix = "/usr" projectbase = "/usr/bin" py_version = "3.10.5" py_version_nodot = "310" py_version_nodot_plat = "" py_version_short = "3.10" srcdir = "/usr/lib/python3.10/config-3.10-mips64el-linux-gnuabi64" userbase = "/root/.local"maturin-1.16.0/sysconfig/cpython-macos-3.9-arm64.txt000066400000000000000000000672431527064705700220760ustar00rootroot00000000000000Platform: "macosx-11.2-arm64" Python version: "3.9" Current installation scheme: "posix_prefix" Paths: data = "/Users/messense/.pyenv/versions/test" include = "/Users/messense/.pyenv/versions/3.9.2/include/python3.9" platinclude = "/Users/messense/.pyenv/versions/3.9.2/include/python3.9" platlib = "/Users/messense/.pyenv/versions/test/lib/python3.9/site-packages" platstdlib = "/Users/messense/.pyenv/versions/test/lib/python3.9" purelib = "/Users/messense/.pyenv/versions/test/lib/python3.9/site-packages" scripts = "/Users/messense/.pyenv/versions/test/bin" stdlib = "/Users/messense/.pyenv/versions/3.9.2/lib/python3.9" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "0" AIX_GENUINE_CPLUSPLUS = "0" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/Users/messense/.pyenv/versions/3.9.2/bin" BINLIBDEST = "/Users/messense/.pyenv/versions/3.9.2/lib/python3.9" BLDLIBRARY = "-L. -lpython3.9" BLDSHARED = "clang -bundle -undefined dynamic_lookup -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib" BUILDEXE = ".exe" BUILDPYTHON = "python.exe" BUILD_GNU_TYPE = "arm-apple-darwin20.3.0" BYTESTR_DEPS = "\" CC = "clang" CCSHARED = "" CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include" CFLAGSFORSHARED = "" CFLAGS_ALIASING = "-fno-strict-aliasing" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden" CONFIGURE_CPPFLAGS = "-I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include" CONFIGURE_LDFLAGS = "-L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--prefix=/Users/messense/.pyenv/versions/3.9.2' '--enable-shared' '--libdir=/Users/messense/.pyenv/versions/3.9.2/lib' '--with-openssl=/opt/homebrew/opt/openssl@1.1' 'CC=clang' 'CFLAGS=-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include ' 'LDFLAGS=-L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib' 'CPPFLAGS=-I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include ' 'PKG_CONFIG_PATH=/opt/homebrew/opt/openssl@1.1/lib/pkgconfig/:'" CONFINCLUDEDIR = "/Users/messense/.pyenv/versions/3.9.2/include" CONFINCLUDEPY = "/Users/messense/.pyenv/versions/3.9.2/include/python3.9" COREPYTHONPATH = "" COVERAGE_INFO = "/var/folders/0r/4fqyt_zs2tj4zvglsb7f4zjw0000gn/T/python-build.20210320213320.90609/Python-3.9.2/coverage.info" COVERAGE_REPORT = "/var/folders/0r/4fqyt_zs2tj4zvglsb7f4zjw0000gn/T/python-build.20210320213320.90609/Python-3.9.2/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include" CXX = "clang++" DESTDIRS = "/Users/messense/.pyenv/versions/3.9.2 /Users/messense/.pyenv/versions/3.9.2/lib /Users/messense/.pyenv/versions/3.9.2/lib/python3.9 /Users/messense/.pyenv/versions/3.9.2/lib/python3.9/lib-dynload" DESTLIB = "/Users/messense/.pyenv/versions/3.9.2/lib/python3.9" DESTPATH = "" DESTSHARED = "/Users/messense/.pyenv/versions/3.9.2/lib/python3.9/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "upgrade" EXE = "" EXEMODE = "755" EXPORTSFROM = "" EXPORTSYMS = "" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-39-darwin.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "no" HAVE_ACCEPT4 = "0" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "1" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "0" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "1" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "0" HAVE_CRYPT_H = "0" HAVE_CRYPT_R = "0" HAVE_CTERMID = "1" HAVE_CTERMID_R = "1" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "0" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "0" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "1" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "0" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "1" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "0" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "0" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "0" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "0" HAVE_FINITE = "0" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "1" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "0" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "0" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "0" HAVE_GCC_ASM_FOR_X87 = "0" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "1" HAVE_GETHOSTBYNAME_R = "0" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "0" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "0" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "0" HAVE_GETRESUID = "0" HAVE_GETSID = "1" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "0" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "0" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "1" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "1" HAVE_LCHMOD = "1" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "0" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "0" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_J1939_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LINUX_WAIT_H = "0" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "0" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "0" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "0" HAVE_MKNOD = "1" HAVE_MKNODAT = "0" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "0" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "0" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "0" HAVE_POSIX_FALLOCATE = "0" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "0" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "0" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "0" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "0" HAVE_SCHED_SETAFFINITY = "0" HAVE_SCHED_SETPARAM = "0" HAVE_SCHED_SETSCHEDULER = "0" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "0" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "0" HAVE_SETRESUID = "0" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "0" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "0" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "1" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "0" HAVE_STAT_TV_NSEC2 = "1" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "1" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "1" HAVE_STRUCT_STAT_ST_GEN = "1" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "0" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENT_H = "1" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "1" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "1" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "0" HAVE_SYS_SYS_DOMAIN_H = "1" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "1" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "1" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "0" HAVE_UUID_ENC_BE = "0" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_H = "0" HAVE_UUID_UUID_H = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "arm-apple-darwin20.3.0" INCLDIRSTOMAKE = "/Users/messense/.pyenv/versions/3.9.2/include /Users/messense/.pyenv/versions/3.9.2/include /Users/messense/.pyenv/versions/3.9.2/include/python3.9 /Users/messense/.pyenv/versions/3.9.2/include/python3.9" INCLUDEDIR = "/Users/messense/.pyenv/versions/3.9.2/include" INCLUDEPY = "/Users/messense/.pyenv/versions/3.9.2/include/python3.9" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "/usr/bin/install -c -m 644" INSTALL_PROGRAM = "/usr/bin/install -c" INSTALL_SCRIPT = "/usr/bin/install -c" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.9.dylib" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "clang++ -bundle -undefined dynamic_lookup" LDFLAGS = "-L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.9.dylib" LDLIBRARYDIR = "" LDSHARED = "clang -bundle -undefined dynamic_lookup -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib" LDVERSION = "3.9" LIBC = "" LIBDEST = "/Users/messense/.pyenv/versions/3.9.2/lib/python3.9" LIBDIR = "/Users/messense/.pyenv/versions/3.9.2/lib" LIBFFI_INCLUDEDIR = "" LIBM = "" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/Users/messense/.pyenv/versions/3.9.2/lib/pkgconfig" LIBPL = "/Users/messense/.pyenv/versions/3.9.2/lib/python3.9/config-3.9-darwin" LIBPYTHON = "" LIBRARY = "libpython3.9.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-ldl -framework CoreFoundation" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "clang" LINKFORSHARED = "-Wl,-stack_size,1000000 -framework CoreFoundation" LIPO_32BIT_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "LLVM_PROFILE_FILE="code-%p.profclangr"" LLVM_PROF_MERGER = "/usr/bin/xcrun llvm-profdata merge -output=code.profclangd *.profclangr" LN = "ln" LOCALMODLIBS = "" MACHDEP = "darwin" MACHDEP_OBJS = "" MACHDESTLIB = "/Users/messense/.pyenv/versions/3.9.2/lib/python3.9" MACOSX_DEPLOYMENT_TARGET = "11.2" MAINCC = "clang" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/Users/messense/.pyenv/versions/3.9.2/share/man" MKDIR_P = "/opt/homebrew/bin/gmkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _peg_parser _symtable xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/_peg_parser.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "darwin" MULTIARCH_CPPFLAGS = "-DMULTIARCH=\"darwin\"" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "-I/opt/homebrew/opt/openssl@1.1/include" OPENSSL_LDFLAGS = "-L/opt/homebrew/opt/openssl@1.1/lib" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG -g -fwrapv -O3 -Wall" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "-fprofile-instr-generate" PGO_PROF_USE_FLAG = "-fprofile-instr-use=code.profclangd" PLATLIBDIR = "lib" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "0" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python.exe -E" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha256,sha512,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib" PY_CPPFLAGS = "-I. -I./Include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib -L/opt/homebrew/opt/readline/lib -L/opt/homebrew/opt/readline/lib -L/Users/messense/.pyenv/versions/3.9.2/lib -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include -I/opt/homebrew/opt/readline/include -I/opt/homebrew/opt/readline/include -I/Users/messense/.pyenv/versions/3.9.2/include" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = ":" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "DYLD_LIBRARY_PATH=/var/folders/0r/4fqyt_zs2tj4zvglsb7f4zjw0000gn/T/python-build.20210320213320.90609/Python-3.9.2" SCRIPTDIR = "/Users/messense/.pyenv/versions/3.9.2/lib" SETPGRP_HAVE_ARG = "0" SGI_ABI = "@SGI_ABI@" SHELL = "/bin/sh" SHLIBS = "-ldl -framework CoreFoundation" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "0" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "8" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "8" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".cpython-39-darwin.so" SOABI = "cpython-39-darwin" SRCDIRS = "Parser Parser/pegen Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "DYLD_LIBRARY_PATH=/var/folders/0r/4fqyt_zs2tj4zvglsb7f4zjw0000gn/T/python-build.20210320213320.90609/Python-3.9.2 ./python.exe" TESTPYTHONOPTS = "" TESTRUNNER = "DYLD_LIBRARY_PATH=/var/folders/0r/4fqyt_zs2tj4zvglsb7f4zjw0000gn/T/python-build.20210320213320.90609/Python-3.9.2 ./python.exe ./Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3.9 ./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.9" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "1" WITH_LIBINTL = "0" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/var/folders/0r/4fqyt_zs2tj4zvglsb7f4zjw0000gn/T/python-build.20210320213320.90609/Python-3.9.2" abs_srcdir = "/var/folders/0r/4fqyt_zs2tj4zvglsb7f4zjw0000gn/T/python-build.20210320213320.90609/Python-3.9.2" base = "/Users/messense/.pyenv/versions/test" datarootdir = "/Users/messense/.pyenv/versions/3.9.2/share" exec_prefix = "/Users/messense/.pyenv/versions/3.9.2" installed_base = "/Users/messense/.pyenv/versions/3.9.2" installed_platbase = "/Users/messense/.pyenv/versions/3.9.2" platbase = "/Users/messense/.pyenv/versions/test" platlibdir = "lib" prefix = "/Users/messense/.pyenv/versions/3.9.2" projectbase = "/Users/messense/.pyenv/versions/3.9.2/bin" py_version = "3.9.2" py_version_nodot = "39" py_version_short = "3.9" srcdir = "/Users/messense/.pyenv/versions/3.9.2/lib/python3.9/config-3.9-darwin" userbase = "/Users/messense/.local" maturin-1.16.0/sysconfig/cpython-netbsd-3.9.txt000066400000000000000000000600761527064705700213210ustar00rootroot00000000000000Platform: "netbsd-9.99.92-amd64" Python version: "3.9" Current installation scheme: "posix_prefix" Paths: data = "/usr/pkg" include = "/usr/pkg/include/python3.9" platinclude = "/usr/pkg/include/python3.9" platlib = "/usr/pkg/lib/python3.9/site-packages" platstdlib = "/usr/pkg/lib/python3.9" purelib = "/usr/pkg/lib/python3.9/site-packages" scripts = "/usr/pkg/bin" stdlib = "/usr/pkg/lib/python3.9" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "0" AIX_GENUINE_CPLUSPLUS = "0" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/pkg/bin" BINLIBDEST = "/usr/pkg/lib/python3.9" BLDLIBRARY = "-L. -lpython3.9" BLDSHARED = "gcc -pthread -shared -L. -Wl,-zrelro -Wl,-znow -L/usr/lib -Wl,-R/usr/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -L/usr/X11R7/lib -Wl,-R/usr/X11R7/lib -Wl,-zrelro -Wl,-znow -L/usr/lib -Wl,-R/usr/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -L/usr/X11R7/lib -Wl,-R/usr/X11R7/lib" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "x86_64--netbsd" BYTESTR_DEPS = "\" CC = "gcc -pthread" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include -O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include -O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "-O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include" CONFIGURE_CFLAGS_NODIST = "-std=gnu99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden" CONFIGURE_CPPFLAGS = "-g -I/usr/include -I/usr/pkg/include" CONFIGURE_LDFLAGS = "-Wl,-zrelro -Wl,-znow -L/usr/lib -Wl,-R/usr/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -L/usr/X11R7/lib -Wl,-R/usr/X11R7/lib" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--enable-shared' '--with-openssl=/usr' '--with-system-ffi' '--without-ensurepip' '--without-pymalloc' '--prefix=/usr/pkg' '--build=x86_64--netbsd' '--host=x86_64--netbsd' '--mandir=/usr/pkg/man' '--enable-option-checking=yes' 'build_alias=x86_64--netbsd' 'host_alias=x86_64--netbsd' 'CC=gcc' 'CFLAGS=-O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include' 'LDFLAGS=-Wl,-zrelro -Wl,-znow -L/usr/lib -Wl,-R/usr/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -L/usr/X11R7/lib -Wl,-R/usr/X11R7/lib' 'LIBS=' 'CPPFLAGS=-g -I/usr/include -I/usr/pkg/include' 'PKG_CONFIG=/scratch/lang/python39/work/.tools/bin/pkg-config' 'PKG_CONFIG_PATH=' 'PKG_CONFIG_LIBDIR=/scratch/lang/python39/work/.buildlink/lib/pkgconfig:/scratch/lang/python39/work/.buildlink/share/pkgconfig'" CONFINCLUDEDIR = "/usr/pkg/include" CONFINCLUDEPY = "/usr/pkg/include/python3.9" COREPYTHONPATH = "" COVERAGE_INFO = "/scratch/lang/python39/work/Python-3.9.9/coverage.info" COVERAGE_REPORT = "/scratch/lang/python39/work/Python-3.9.9/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include -g -I/usr/include -I/usr/pkg/include -g -I/usr/include -I/usr/pkg/include" CXX = "c++ -pthread" DESTDIRS = "/usr/pkg /usr/pkg/lib /usr/pkg/lib/python3.9 /usr/pkg/lib/python3.9/lib-dynload" DESTLIB = "/usr/pkg/lib/python3.9" DESTPATH = "" DESTSHARED = "/usr/pkg/lib/python3.9/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXPORTSFROM = "" EXPORTSYMS = "" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "0" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "1" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "0" HAVE_CRYPT_H = "0" HAVE_CRYPT_R = "0" HAVE_CTERMID = "1" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "0" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "1" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "0" HAVE_EXPLICIT_MEMSET = "1" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "0" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "0" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "1" HAVE_GCC_ASM_FOR_X87 = "1" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "0" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "0" HAVE_GETRESUID = "0" HAVE_GETSID = "1" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "1" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "1" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "1" HAVE_LCHMOD = "1" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "0" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "0" HAVE_LIBUUID = "1" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_J1939_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LINUX_WAIT_H = "0" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "0" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "1" HAVE_NCURSES_H = "0" HAVE_NDIR_H = "0" HAVE_NETCAN_CAN_H = "1" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION = "0" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "0" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "0" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_CLOCKWAIT = "0" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "0" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "0" HAVE_SETRESUID = "0" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "1" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "1" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "1" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "1" HAVE_STRUCT_STAT_ST_GEN = "1" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "1" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "1" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENT_H = "1" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "1" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "0" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "1" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "1" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "1" HAVE_UUID_ENC_BE = "1" HAVE_UUID_GENERATE_TIME_SAFE = "1" HAVE_UUID_H = "1" HAVE_UUID_UUID_H = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "x86_64--netbsd" INCLDIRSTOMAKE = "/usr/pkg/include /usr/pkg/include /usr/pkg/include/python3.9 /usr/pkg/include/python3.9" INCLUDEDIR = "/usr/pkg/include" INCLUDEPY = "/usr/pkg/include/python3.9" INSTALL = "/usr/bin/install -c -o pbulk -g builder" INSTALL_DATA = "/usr/bin/install -c -o pbulk -g builder -m 644" INSTALL_PROGRAM = "/usr/bin/install -c -o pbulk -g builder -m 755" INSTALL_SCRIPT = "/usr/bin/install -c -o pbulk -g builder -m 755" INSTALL_SHARED = "/usr/bin/install -c -o pbulk -g builder -m 755" INSTSONAME = "libpython3.9.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "c++ -pthread -shared" LDFLAGS = "-L. -Wl,-zrelro -Wl,-znow -L/usr/lib -Wl,-R/usr/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -L/usr/X11R7/lib -Wl,-R/usr/X11R7/lib -Wl,-zrelro -Wl,-znow -L/usr/lib -Wl,-R/usr/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -L/usr/X11R7/lib -Wl,-R/usr/X11R7/lib" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.9.so" LDLIBRARYDIR = "" LDSHARED = "gcc -pthread -shared -L. -Wl,-zrelro -Wl,-znow -L/usr/lib -Wl,-R/usr/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -L/usr/X11R7/lib -Wl,-R/usr/X11R7/lib -Wl,-zrelro -Wl,-znow -L/usr/lib -Wl,-R/usr/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -L/usr/X11R7/lib -Wl,-R/usr/X11R7/lib" LDVERSION = "3.9" LIBC = "" LIBDEST = "/usr/pkg/lib/python3.9" LIBDIR = "/usr/pkg/lib" LIBFFI_INCLUDEDIR = "/usr/pkg/include" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/pkg/lib/pkgconfig" LIBPL = "/usr/pkg/lib/python3.9/config-3.9" LIBPYTHON = "" LIBRARY = "libpython3.9.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lcrypt -lintl -lpthread -lutil -lm" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "gcc -pthread" LINKFORSHARED = "-Wl,--export-dynamic" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "true" LN = "/bin/ln" LOCALMODLIBS = "" MACHDEP = "netbsd9" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/pkg/lib/python3.9" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "gcc -pthread" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/pkg/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _peg_parser _symtable xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/_peg_parser.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "-I/usr/include" OPENSSL_LDFLAGS = "-L/usr/lib" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG -O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "-fprofile-generate" PGO_PROF_USE_FLAG = "-fprofile-use -fprofile-correction" PLATLIBDIR = "lib" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha256,sha512,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include -O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include -O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include -std=gnu99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -g -I/usr/include -I/usr/pkg/include -g -I/usr/include -I/usr/pkg/include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include -O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include -O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include" PY_CFLAGS_NODIST = "-std=gnu99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include -O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include -O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include -std=gnu99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -g -I/usr/include -I/usr/pkg/include -g -I/usr/include -I/usr/pkg/include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-L. -Wl,-zrelro -Wl,-znow -L/usr/lib -Wl,-R/usr/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -L/usr/X11R7/lib -Wl,-R/usr/X11R7/lib -Wl,-zrelro -Wl,-znow -L/usr/lib -Wl,-R/usr/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -L/usr/X11R7/lib -Wl,-R/usr/X11R7/lib" PY_CPPFLAGS = "-I. -I./Include -g -I/usr/include -I/usr/pkg/include -g -I/usr/include -I/usr/pkg/include" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-L. -Wl,-zrelro -Wl,-znow -L/usr/lib -Wl,-R/usr/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -L/usr/X11R7/lib -Wl,-R/usr/X11R7/lib -Wl,-zrelro -Wl,-znow -L/usr/lib -Wl,-R/usr/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -L/usr/X11R7/lib -Wl,-R/usr/X11R7/lib" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include -O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include -O2 -g -fPIC -D_FORTIFY_SOURCE=2 -fstack-check -I/usr/include -I/usr/pkg/include -std=gnu99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -g -I/usr/include -I/usr/pkg/include -g -I/usr/include -I/usr/pkg/include -fPIC" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/scratch/lang/python39/work/Python-3.9.9" SCRIPTDIR = "/usr/pkg/lib" SETPGRP_HAVE_ARG = "1" SHELL = "/bin/sh" SHLIBS = "-lcrypt -lintl -lpthread -lutil -lm" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "1" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "264" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".so" SOABI = "cpython-39" SRCDIRS = "Parser Parser/pegen Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/scratch/lang/python39/work/Python-3.9.9 ./python" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/scratch/lang/python39/work/Python-3.9.9 ./python ./Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3 ./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.9" WINDOW_HAS_FLAGS = "0" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "1" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "0" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/scratch/lang/python39/work/Python-3.9.9" abs_srcdir = "/scratch/lang/python39/work/Python-3.9.9" base = "/usr/pkg" datarootdir = "/usr/pkg/share" exec_prefix = "/usr/pkg" installed_base = "/usr/pkg" installed_platbase = "/usr/pkg" platbase = "/usr/pkg" platlibdir = "lib" prefix = "/usr/pkg" projectbase = "/usr/pkg/bin" py_version = "3.9.9" py_version_nodot = "39" py_version_short = "3.9" srcdir = "/usr/pkg/lib/python3.9/config-3.9" userbase = "/home/wiz/.local" maturin-1.16.0/sysconfig/cpython-omnios-3.9.txt000066400000000000000000000660351527064705700213470ustar00rootroot00000000000000Platform: "solaris-2.11-i86pc.64bit" Python version: "3.9" Current installation scheme: "posix_prefix" Paths: data = "/usr" include = "/usr/include/python3.9" platinclude = "/usr/include/python3.9" platlib = "/usr/lib/python3.9/site-packages" platstdlib = "/usr/lib/python3.9" purelib = "/usr/lib/python3.9/site-packages" scripts = "/usr/bin" stdlib = "/usr/lib/python3.9" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "0" AIX_GENUINE_CPLUSPLUS = "0" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/bin" BINLIBDEST = "/usr/lib/amd64/python3.9" BLDLIBRARY = "-Wl,-R,/usr/lib/amd64 -L. -lpython3.9" BLDSHARED = "gcc -m64 -shared -m64" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "x86_64-pc-solaris2.11" BYTESTR_DEPS = "\" CC = "gcc -m64" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -O3 -Wall -O2 -fno-aggressive-loop-optimizations -fstack-protector-strong -gdwarf-2 -gstrict-dwarf -m64 -D_REENTRANT" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "-O2 -fno-aggressive-loop-optimizations -fstack-protector-strong -gdwarf-2 -gstrict-dwarf -m64 -D_REENTRANT" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden" CONFIGURE_CPPFLAGS = "-I/usr/include/ncurses -D_LARGEFILE64_SOURCE -DSKIP_ZIP_PATH" CONFIGURE_LDFLAGS = "-m64" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--prefix=/usr' '--sysconfdir=/etc' '--includedir=/usr/include' '--bindir=/usr/bin' '--sbindir=/usr/sbin' '--libdir=/usr/lib/amd64' '--libexecdir=/usr/libexec/amd64' '--enable-shared' '--with-dtrace' '--with-system-ffi' '--with-system-expat' '--enable-ipv6' '--without-ensurepip' '--enable-optimizations' 'ac_cv_func_getentropy=no' 'CC=gcc -m64' 'CFLAGS=-O2 -fno-aggressive-loop-optimizations -fstack-protector-strong -gdwarf-2 -gstrict-dwarf -m64' 'LDFLAGS= -m64' 'CPPFLAGS= -I/usr/include/ncurses -D_LARGEFILE64_SOURCE -DSKIP_ZIP_PATH ' 'PKG_CONFIG_PATH='" CONFINCLUDEDIR = "/usr/include" CONFINCLUDEPY = "/usr/include/python3.9" COREPYTHONPATH = "" COVERAGE_INFO = "/data/omnios-build/omniosorg/r151040/_build/Python-3.9.8/Python-3.9.8/coverage.info" COVERAGE_REPORT = "/data/omnios-build/omniosorg/r151040/_build/Python-3.9.8/Python-3.9.8/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include -I/usr/include/ncurses -D_LARGEFILE64_SOURCE -DSKIP_ZIP_PATH" CXX = "g++" DESTDIRS = "/usr /usr/lib/amd64 /usr/lib/amd64/python3.9 /usr/lib/amd64/python3.9/lib-dynload" DESTLIB = "/usr/lib/python3.9" DESTPATH = "" DESTSHARED = "/usr/lib/amd64/python3.9/lib-dynload" DFLAGS = "-64" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "/usr/sbin/dtrace" DTRACE_DEPS = "\" DTRACE_HEADERS = "Include/pydtrace_probes.h" DTRACE_OBJS = "Python/pydtrace.o" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXPORTSFROM = "" EXPORTSYMS = "" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-39.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "no" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "1" HAVE_ALTZONE = "1" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "0" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "0" HAVE_CRYPT_H = "1" HAVE_CRYPT_R = "0" HAVE_CTERMID = "1" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "0" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "1" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "1" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "0" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "1" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "1" HAVE_FEXECVE = "0" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "0" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "1" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "1" HAVE_GCC_ASM_FOR_X87 = "1" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "0" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "1" HAVE_GETHOSTBYNAME_R_6_ARG = "0" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "0" HAVE_GETRESUID = "0" HAVE_GETSID = "1" HAVE_GETSPENT = "1" HAVE_GETSPNAM = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "0" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "1" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "0" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "0" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "1" HAVE_LIBUTIL_H = "0" HAVE_LIBUUID = "1" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_J1939_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LINUX_WAIT_H = "0" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "0" HAVE_MEMRCHR = "1" HAVE_MINIX_CONFIG_H = "0" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "0" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "1" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION = "0" HAVE_OPENAT = "1" HAVE_OPENPTY = "0" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "1" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "0" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "0" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "0" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_CLOCKWAIT = "0" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "0" HAVE_SETRESUID = "0" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "1" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "0" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "0" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDIO_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "1" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "0" HAVE_STRUCT_STAT_ST_GEN = "0" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "0" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "1" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "1" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "0" HAVE_SYS_EPOLL_H = "1" HAVE_SYS_EVENT_H = "0" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "1" HAVE_SYS_LOCK_H = "1" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "1" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "1" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "1" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "1" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "0" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "1" HAVE_TM_ZONE = "0" HAVE_TRUNCATE = "1" HAVE_TZNAME = "1" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "0" HAVE_UUID_ENC_BE = "0" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_H = "0" HAVE_UUID_UUID_H = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "x86_64-pc-solaris2.11" INCLDIRSTOMAKE = "/usr/include /usr/include /usr/include/python3.9 /usr/include/python3.9" INCLUDEDIR = "/usr/include" INCLUDEPY = "/usr/include/python3.9" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "/usr/bin/install -c -m 644" INSTALL_PROGRAM = "/usr/bin/install -c" INSTALL_SCRIPT = "/usr/bin/install -c" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.9.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "g++ -shared" LDFLAGS = "-m64" LDLIBRARY = "libpython3.9.so" LDLIBRARYDIR = "" LDSHARED = "gcc -m64 -shared -m64" LDVERSION = "3.9" LIBC = "" LIBDEST = "/usr/lib/python3.9" LIBDIR = "/usr/lib/amd64" LIBFFI_INCLUDEDIR = "" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/lib/amd64/pkgconfig" LIBPL = "/usr/lib/python3.9/config-3.9" LIBPYTHON = "" LIBRARY = "libpython3.9.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lsocket -lnsl -lintl -ldl -lsendfile -lm" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "gcc -m64" LINKFORSHARED = "" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "true" LN = "ln" LOCALMODLIBS = "" MACHDEP = "sunos5" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/lib/amd64/python3.9" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "gcc -m64" MAJOR_IN_MKDEV = "1" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/share/man" MKDIR_P = "/usr/gnu/bin/mkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _peg_parser _symtable xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/_peg_parser.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "-I/usr/ssl-1.1/include" OPENSSL_LDFLAGS = "-L/usr/ssl-1.1/lib/amd64" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG -g -O3 -Wall" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "-fprofile-generate" PGO_PROF_USE_FLAG = "-fprofile-use -fprofile-correction" PLATLIBDIR = "lib" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha256,sha512,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -O3 -Wall -O2 -fno-aggressive-loop-optimizations -fstack-protector-strong -gdwarf-2 -gstrict-dwarf -m64 -D_REENTRANT -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -fprofile-use -fprofile-correction -I./Include/internal -I. -I./Include -I/usr/include/ncurses -D_LARGEFILE64_SOURCE -DSKIP_ZIP_PATH -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -O3 -Wall -O2 -fno-aggressive-loop-optimizations -fstack-protector-strong -gdwarf-2 -gstrict-dwarf -m64 -D_REENTRANT" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -fprofile-use -fprofile-correction -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -O3 -Wall -O2 -fno-aggressive-loop-optimizations -fstack-protector-strong -gdwarf-2 -gstrict-dwarf -m64 -D_REENTRANT -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -fprofile-use -fprofile-correction -I./Include/internal -I. -I./Include -I/usr/include/ncurses -D_LARGEFILE64_SOURCE -DSKIP_ZIP_PATH -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-m64" PY_CPPFLAGS = "-I. -I./Include -I/usr/include/ncurses -D_LARGEFILE64_SOURCE -DSKIP_ZIP_PATH" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-m64" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -O3 -Wall -O2 -fno-aggressive-loop-optimizations -fstack-protector-strong -gdwarf-2 -gstrict-dwarf -m64 -D_REENTRANT -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -fprofile-use -fprofile-correction -I./Include/internal -I. -I./Include -I/usr/include/ncurses -D_LARGEFILE64_SOURCE -DSKIP_ZIP_PATH -fPIC" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/data/omnios-build/omniosorg/r151040/_build/Python-3.9.8/Python-3.9.8" SCRIPTDIR = "/usr/lib" SETPGRP_HAVE_ARG = "0" SHELL = "/bin/sh" SHLIBS = "-lsocket -lnsl -lintl -ldl -lsendfile -lm" SHLIB_FLAGS = "-shared -fpic" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "0" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "4" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".cpython-39.so" SOABI = "cpython-39" SRCDIRS = "Parser Parser/pegen Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/data/omnios-build/omniosorg/r151040/_build/Python-3.9.8/Python-3.9.8 ./python" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/data/omnios-build/omniosorg/r151040/_build/Python-3.9.8/Python-3.9.8 ./python ./Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3.9 ./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.9" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "1" WITH_DYLD = "0" WITH_LIBINTL = "1" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/data/omnios-build/omniosorg/r151040/_build/Python-3.9.8/Python-3.9.8" abs_srcdir = "/data/omnios-build/omniosorg/r151040/_build/Python-3.9.8/Python-3.9.8" base = "/usr" datarootdir = "/usr/share" exec_prefix = "/usr" installed_base = "/usr" installed_platbase = "/usr" platbase = "/usr" platlibdir = "lib" prefix = "/usr" projectbase = "/usr/bin" py_version = "3.9.8" py_version_nodot = "39" py_version_short = "3.9" srcdir = "/usr/lib/python3.9/config-3.9" userbase = "/root/.local"maturin-1.16.0/sysconfig/cpython-openbsd-3.8-aarch64.txt000066400000000000000000000522241527064705700227150ustar00rootroot00000000000000Platform: "openbsd-6.9-arm64" Python version: "3.8" Current installation scheme: "posix_prefix" Paths: data = "/usr/local" include = "/usr/local/include/python3.8" platinclude = "/usr/local/include/python3.8" platlib = "/usr/local/lib/python3.8/site-packages" platstdlib = "/usr/local/lib/python3.8" purelib = "/usr/local/lib/python3.8/site-packages" scripts = "/usr/local/bin" stdlib = "/usr/local/lib/python3.8" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_GENUINE_CPLUSPLUS = "0" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/local/bin" BINLIBDEST = "/usr/local/lib/python3.8" BLDLIBRARY = "-L. -lpython3.8" BLDSHARED = "cc -pthread -shared -fPIC -L/usr/local/lib/ -L/usr/obj/ports/Python-3.8.8/Python-3.8.8 -L/usr/local/lib/" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "aarch64-unknown-openbsd6.9" BYTESTR_DEPS = "\" CC = "cc -pthread" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -g -fPIC -O2 -pipe -g -O2 -pipe -g" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "-O2 -pipe -g" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration" CONFIGURE_CPPFLAGS = "-I/usr/local/include" CONFIGURE_LDFLAGS = "-L/usr/local/lib/" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--with-ensurepip=no' '--enable-loadable-sqlite-extensions' '--enable-shared' '--srcdir=/usr/obj/ports/Python-3.8.8/Python-3.8.8' '--with-fpectl' '--with-threads' '--enable-ipv6' '--with-system-expat' '--with-system-ffi' '--prefix=/usr/local' '--sysconfdir=/etc' '--mandir=/usr/local/man' '--infodir=/usr/local/info' '--localstatedir=/var' '--disable-silent-rules' '--disable-gtk-doc' 'CC=cc' 'CFLAGS=-O2 -pipe -g' 'LDFLAGS=-L/usr/local/lib/' 'CPPFLAGS=-I/usr/local/include'" CONFINCLUDEDIR = "/usr/local/include" CONFINCLUDEPY = "/usr/local/include/python3.8" COREPYTHONPATH = "" COVERAGE_INFO = "/usr/obj/ports/Python-3.8.8/Python-3.8.8/coverage.info" COVERAGE_REPORT = "/usr/obj/ports/Python-3.8.8/Python-3.8.8/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include -I/usr/local/include" CXX = "c++ -pthread" DESTDIRS = "/usr/local /usr/local/lib /usr/local/lib/python3.8 /usr/local/lib/python3.8/lib-dynload" DESTLIB = "/usr/local/lib/python3.8" DESTPATH = "" DESTSHARED = "/usr/local/lib/python3.8/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-38.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GETTIMEOFDAY_NO_TZ = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "0" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "0" HAVE_CRYPT_H = "0" HAVE_CRYPT_R = "0" HAVE_CTERMID = "1" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "0" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "0" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "0" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "0" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "0" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "0" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "0" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "0" HAVE_GCC_ASM_FOR_X87 = "0" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "1" HAVE_GETHOSTBYNAME_R = "0" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "0" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "0" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETSID = "1" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETTIMEOFDAY = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "1" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "1" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "0" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "0" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "0" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "0" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "0" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "0" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "0" HAVE_POSIX_FALLOCATE = "0" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "0" HAVE_PUTENV = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "0" HAVE_SCHED_SETAFFINITY = "0" HAVE_SCHED_SETPARAM = "0" HAVE_SCHED_SETSCHEDULER = "0" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "0" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "0" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "0" HAVE_SIGTIMEDWAIT = "0" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "0" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "1" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "1" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "1" HAVE_STRUCT_STAT_ST_GEN = "1" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "1" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "1" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENT_H = "1" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "1" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "0" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "0" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "0" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_UNSETENV = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "1" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "1" HAVE_UUID_ENC_BE = "1" HAVE_UUID_H = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "0" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "aarch64-unknown-openbsd6.9" INCLDIRSTOMAKE = "/usr/local/include /usr/local/include /usr/local/include/python3.8 /usr/local/include/python3.8" INCLUDEDIR = "/usr/local/include" INCLUDEPY = "/usr/local/include/python3.8" INSTALL = "/usr/obj/ports/Python-3.8.8/bin/install -c" INSTALL_DATA = "/usr/obj/ports/Python-3.8.8/bin/install -c -m 644" INSTALL_PROGRAM = "/usr/obj/ports/Python-3.8.8/bin/install -c -m 755" INSTALL_SCRIPT = "/usr/obj/ports/Python-3.8.8/bin/install -c -m 755" INSTALL_SHARED = "/usr/obj/ports/Python-3.8.8/bin/install -c -m 755" INSTSONAME = "libpython3.8.so.0.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "c++ -pthread -shared -fPIC" LDFLAGS = "-L/usr/local/lib/ -L/usr/obj/ports/Python-3.8.8/Python-3.8.8 -L/usr/local/lib/" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.8.so" LDLIBRARYDIR = "" LDSHARED = "cc -pthread -shared -fPIC -L/usr/local/lib/ -L/usr/obj/ports/Python-3.8.8/Python-3.8.8 -L/usr/local/lib/" LDVERSION = "3.8" LIBC = "" LIBDEST = "/usr/local/lib/python3.8" LIBDIR = "/usr/local/lib" LIBFFI_INCLUDEDIR = "/usr/local/include" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/local/lib/pkgconfig" LIBPL = "/usr/local/lib/python3.8/config-3.8" LIBPYTHON = "" LIBRARY = "libpython3.8.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lintl -lpthread -lutil -lm" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "cc -pthread" LINKFORSHARED = "-Wl,--export-dynamic" LIPO_32BIT_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "" LN = "ln" LOCALMODLIBS = "" MACHDEP = "openbsd6" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/local/lib/python3.8" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "cc -pthread" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/local/man" MKDIR_P = "mkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _symtable xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/hashtable.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "" OPENSSL_LDFLAGS = "" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG -O2 -pipe -g -fPIC" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PGO_PROF_GEN_FLAG = "" PGO_PROF_USE_FLAG = "" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_REGEN = "python3" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -g -fPIC -O2 -pipe -g -O2 -pipe -g -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/usr/local/include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -g -fPIC -O2 -pipe -g -O2 -pipe -g" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -g -fPIC -O2 -pipe -g -O2 -pipe -g -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/usr/local/include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-L/usr/local/lib/ -L/usr/obj/ports/Python-3.8.8/Python-3.8.8 -L/usr/local/lib/" PY_CPPFLAGS = "-I. -I./Include -I/usr/local/include" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-L/usr/local/lib/ -L/usr/obj/ports/Python-3.8.8/Python-3.8.8 -L/usr/local/lib/" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -g -fPIC -O2 -pipe -g -O2 -pipe -g -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/usr/local/include -fPIC" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/usr/obj/ports/Python-3.8.8/Python-3.8.8" SCRIPTDIR = "/usr/local/lib" SETPGRP_HAVE_ARG = "1" SGI_ABI = "@SGI_ABI@" SHELL = "/bin/sh" SHLIBS = "-lintl -lpthread -lutil -lm" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "0" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".cpython-38.so" SOABI = "cpython-38" SRCDIRS = "Parser Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/usr/obj/ports/Python-3.8.8/Python-3.8.8 ./python" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/usr/obj/ports/Python-3.8.8/Python-3.8.8 ./python ./Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3 ./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.8" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "1" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/usr/obj/ports/Python-3.8.8/Python-3.8.8" abs_srcdir = "/usr/obj/ports/Python-3.8.8/Python-3.8.8" base = "/usr/local" datarootdir = "/usr/local/share" exec_prefix = "/usr/local" installed_base = "/usr/local" installed_platbase = "/usr/local" platbase = "/usr/local" prefix = "/usr/local" projectbase = "/usr/local/bin" py_version = "3.8.8" py_version_nodot = "38" py_version_short = "3.8" srcdir = "/usr/local/lib/python3.8/config-3.8" userbase = "/root/.local" maturin-1.16.0/sysconfig/cpython-openbsd-3.8.txt000066400000000000000000000522261527064705700214710ustar00rootroot00000000000000Platform: "openbsd-6.8-amd64" Python version: "3.8" Current installation scheme: "posix_prefix" Paths: data = "/usr/local" include = "/usr/local/include/python3.8" platinclude = "/usr/local/include/python3.8" platlib = "/usr/local/lib/python3.8/site-packages" platstdlib = "/usr/local/lib/python3.8" purelib = "/usr/local/lib/python3.8/site-packages" scripts = "/usr/local/bin" stdlib = "/usr/local/lib/python3.8" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_GENUINE_CPLUSPLUS = "0" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/local/bin" BINLIBDEST = "/usr/local/lib/python3.8" BLDLIBRARY = "-L. -lpython3.8" BLDSHARED = "cc -pthread -shared -fPIC -L/usr/local/lib/ -L/build/tmp/pobj//Python-3.8.6/Python-3.8.6 -L/usr/local/lib/" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "x86_64-unknown-openbsd6.8" BYTESTR_DEPS = "\" CC = "cc -pthread" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -g -fPIC -O2 -pipe -g -O2 -pipe -g" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "-O2 -pipe -g" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration" CONFIGURE_CPPFLAGS = "-I/usr/local/include" CONFIGURE_LDFLAGS = "-L/usr/local/lib/" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--with-ensurepip=no' '--enable-loadable-sqlite-extensions' '--enable-shared' '--srcdir=/build/tmp/pobj//Python-3.8.6/Python-3.8.6' '--with-fpectl' '--with-threads' '--enable-ipv6' '--with-system-expat' '--with-system-ffi' '--prefix=/usr/local' '--sysconfdir=/etc' '--mandir=/usr/local/man' '--infodir=/usr/local/info' '--localstatedir=/var' '--disable-silent-rules' '--disable-gtk-doc' 'CC=cc' 'CFLAGS=-O2 -pipe -g' 'LDFLAGS=-L/usr/local/lib/' 'CPPFLAGS=-I/usr/local/include'" CONFINCLUDEDIR = "/usr/local/include" CONFINCLUDEPY = "/usr/local/include/python3.8" COREPYTHONPATH = "" COVERAGE_INFO = "/build/tmp/pobj/Python-3.8.6/Python-3.8.6/coverage.info" COVERAGE_REPORT = "/build/tmp/pobj/Python-3.8.6/Python-3.8.6/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include -I/usr/local/include" CXX = "c++ -pthread" DESTDIRS = "/usr/local /usr/local/lib /usr/local/lib/python3.8 /usr/local/lib/python3.8/lib-dynload" DESTLIB = "/usr/local/lib/python3.8" DESTPATH = "" DESTSHARED = "/usr/local/lib/python3.8/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "no" EXE = "" EXEMODE = "755" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GETTIMEOFDAY_NO_TZ = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "0" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "0" HAVE_CRYPT_H = "0" HAVE_CRYPT_R = "0" HAVE_CTERMID = "1" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "0" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "0" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "0" HAVE_DECL_RTLD_NOLOAD = "0" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "0" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "0" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "0" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "0" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "1" HAVE_GCC_ASM_FOR_X87 = "1" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "1" HAVE_GETHOSTBYNAME_R = "0" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "0" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "0" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETSID = "1" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETTIMEOFDAY = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "1" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "1" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "0" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "0" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "0" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "0" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "0" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "0" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "0" HAVE_POSIX_FALLOCATE = "0" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "0" HAVE_PUTENV = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "0" HAVE_SCHED_SETAFFINITY = "0" HAVE_SCHED_SETPARAM = "0" HAVE_SCHED_SETSCHEDULER = "0" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "0" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "0" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "0" HAVE_SIGTIMEDWAIT = "0" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "0" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "1" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "1" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "1" HAVE_STRUCT_STAT_ST_GEN = "1" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "1" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "1" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENT_H = "1" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "1" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "0" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "0" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "0" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_UNSETENV = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "1" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "1" HAVE_UUID_ENC_BE = "1" HAVE_UUID_H = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "0" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "x86_64-unknown-openbsd6.8" INCLDIRSTOMAKE = "/usr/local/include /usr/local/include /usr/local/include/python3.8 /usr/local/include/python3.8" INCLUDEDIR = "/usr/local/include" INCLUDEPY = "/usr/local/include/python3.8" INSTALL = "/build/tmp/pobj//Python-3.8.6/bin/install -c" INSTALL_DATA = "/build/tmp/pobj//Python-3.8.6/bin/install -c -m 644" INSTALL_PROGRAM = "/build/tmp/pobj//Python-3.8.6/bin/install -c -m 755" INSTALL_SCRIPT = "/build/tmp/pobj//Python-3.8.6/bin/install -c -m 755" INSTALL_SHARED = "/build/tmp/pobj//Python-3.8.6/bin/install -c -m 755" INSTSONAME = "libpython3.8.so.0.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "c++ -pthread -shared -fPIC" LDFLAGS = "-L/usr/local/lib/ -L/build/tmp/pobj//Python-3.8.6/Python-3.8.6 -L/usr/local/lib/" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.8.so" LDLIBRARYDIR = "" LDSHARED = "cc -pthread -shared -fPIC -L/usr/local/lib/ -L/build/tmp/pobj//Python-3.8.6/Python-3.8.6 -L/usr/local/lib/" LDVERSION = "3.8" LIBC = "" LIBDEST = "/usr/local/lib/python3.8" LIBDIR = "/usr/local/lib" LIBFFI_INCLUDEDIR = "/usr/local/include" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/local/lib/pkgconfig" LIBPL = "/usr/local/lib/python3.8/config-3.8" LIBPYTHON = "" LIBRARY = "libpython3.8.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lintl -lpthread -lutil -lm" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "cc -pthread" LINKFORSHARED = "-Wl,--export-dynamic" LIPO_32BIT_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "" LN = "ln" LOCALMODLIBS = "" MACHDEP = "openbsd6" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/local/lib/python3.8" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "cc -pthread" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/local/man" MKDIR_P = "mkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _symtable xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/hashtable.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "" OPENSSL_LDFLAGS = "" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG -O2 -pipe -g -fPIC" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PGO_PROF_GEN_FLAG = "" PGO_PROF_USE_FLAG = "" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_FOR_REGEN = "python3" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -g -fPIC -O2 -pipe -g -O2 -pipe -g -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/usr/local/include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -g -fPIC -O2 -pipe -g -O2 -pipe -g" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -g -fPIC -O2 -pipe -g -O2 -pipe -g -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/usr/local/include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-L/usr/local/lib/ -L/build/tmp/pobj//Python-3.8.6/Python-3.8.6 -L/usr/local/lib/" PY_CPPFLAGS = "-I. -I./Include -I/usr/local/include" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-L/usr/local/lib/ -L/build/tmp/pobj//Python-3.8.6/Python-3.8.6 -L/usr/local/lib/" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -g -fPIC -O2 -pipe -g -O2 -pipe -g -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -I./Include/internal -I. -I./Include -I/usr/local/include -fPIC" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/build/tmp/pobj/Python-3.8.6/Python-3.8.6" SCRIPTDIR = "/usr/local/lib" SETPGRP_HAVE_ARG = "1" SGI_ABI = "@SGI_ABI@" SHELL = "/bin/sh" SHLIBS = "-lintl -lpthread -lutil -lm" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "0" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".so" SOABI = "cpython-38" SRCDIRS = "Parser Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/build/tmp/pobj/Python-3.8.6/Python-3.8.6 ./python" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/build/tmp/pobj/Python-3.8.6/Python-3.8.6 ./python ./Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3 ./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.8" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "1" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/build/tmp/pobj/Python-3.8.6/Python-3.8.6" abs_srcdir = "/build/tmp/pobj/Python-3.8.6/Python-3.8.6" base = "/usr/local" datarootdir = "/usr/local/share" exec_prefix = "/usr/local" installed_base = "/usr/local" installed_platbase = "/usr/local" platbase = "/usr/local" prefix = "/usr/local" projectbase = "/usr/local/bin" py_version = "3.8.6" py_version_nodot = "38" py_version_short = "3.8" srcdir = "/usr/local/lib/python3.8/config-3.8" userbase = "/root/.local"maturin-1.16.0/sysconfig/cpython-wasi-3.12.txt000066400000000000000000001354111527064705700210530ustar00rootroot00000000000000Platform: "wasi-0.0.0-wasm32" Python version: "3.12" Current installation scheme: "posix_prefix" Paths: data = "/root/code/python-wasi/opt/wasi-python" include = "/root/code/python-wasi/opt/wasi-python/include/python3.12" platinclude = "/root/code/python-wasi/opt/wasi-python/include/python3.12" platlib = "/root/code/python-wasi/opt/wasi-python/lib/python3.12/site-packages" platstdlib = "/root/code/python-wasi/opt/wasi-python/lib/python3.12" purelib = "/root/code/python-wasi/opt/wasi-python/lib/python3.12/site-packages" scripts = "/root/code/python-wasi/opt/wasi-python/bin" stdlib = "/root/code/python-wasi/opt/wasi-python/lib/python3.12" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "0" AIX_GENUINE_CPLUSPLUS = "0" ALIGNOF_LONG = "4" ALIGNOF_SIZE_T = "4" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wsign-compare -Wunreachable-code" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/root/code/python-wasi/opt/wasi-python/bin" BINLIBDEST = "/root/code/python-wasi/opt/wasi-python/lib/python3.12" BLDLIBRARY = "libpython3.12.a" BLDSHARED = "" BOOTSTRAP_HEADERS = "\" BUILDEXE = ".wasm" BUILDPYTHON = "python.wasm" BUILD_GNU_TYPE = "x86_64-pc-linux-gnu" BUILD_SCRIPTS_DIR = "build/scripts-3.12" BYTESTR_DEPS = "\" CC = "clang --target=wasm32-wasi" CCSHARED = "" CFLAGS = "-Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot" CFLAGSFORSHARED = "" CFLAGS_ALIASING = "-fno-strict-aliasing" CFLAGS_NODIST = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "-g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot" CONFIGURE_CFLAGS_NODIST = "-std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden" CONFIGURE_CPPFLAGS = "-g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot" CONFIGURE_LDFLAGS = "" CONFIGURE_LDFLAGS_NODIST = "-z stack-size=524288 -Wl,--stack-first -Wl,--initial-memory=10485760" CONFIGURE_LDFLAGS_NOLTO = "" CONFIG_ARGS = "'--host=wasm32-wasi' '--build=x86_64-pc-linux-gnu' '--with-build-python=/root/code/python-wasi/cpython/inst/3.12/bin/python3.12' '--with-ensurepip=no' '--disable-ipv6' '--enable-big-digits=30' '--with-suffix=.wasm' '--with-freeze-module=./build/Programs/_freeze_module' '--prefix=/root/code/python-wasi/opt/wasi-python' 'build_alias=x86_64-pc-linux-gnu' 'host_alias=wasm32-wasi' 'CC=clang --target=wasm32-wasi' 'CFLAGS=-g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot' 'LIBS= -L/opt/lib -L/root/code/python-wasi/wasix -lwasix -L/opt/wasi-sdk/share/wasi-sysroot/lib/wasm32-wasi -lwasi-emulated-signal -L/root/code/python-wasi/docker/lib --sysroot=/opt/wasi-sdk/share/wasi-sysroot' 'CPPFLAGS=-g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot'" CONFINCLUDEDIR = "/root/code/python-wasi/opt/wasi-python/include" CONFINCLUDEPY = "/root/code/python-wasi/opt/wasi-python/include/python3.12" COREPYTHONPATH = "" COVERAGE_INFO = "/root/code/python-wasi/cpython/coverage.info" COVERAGE_LCOV_OPTIONS = "--rc lcov_branch_coverage=1" COVERAGE_REPORT = "/root/code/python-wasi/cpython/lcov-report" COVERAGE_REPORT_OPTIONS = "--rc lcov_branch_coverage=1 --branch-coverage --title "CPython 3.12 LCOV report [commit $(shell git --git-dir ./.git rev-parse --short HEAD)]"" CPPFLAGS = "-I. -I./Include -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot" CXX = "c++" DEEPFREEZE_DEPS = "./Tools/scripts/deepfreeze.py ./Programs/_freeze_module.py \" DEEPFREEZE_OBJS = "Python/deepfreeze/deepfreeze.o" DESTDIRS = "/root/code/python-wasi/opt/wasi-python /root/code/python-wasi/opt/wasi-python/lib /root/code/python-wasi/opt/wasi-python/lib/python3.12 /root/code/python-wasi/opt/wasi-python/lib/python3.12/lib-dynload" DESTLIB = "/root/code/python-wasi/opt/wasi-python/lib/python3.12" DESTPATH = "" DESTSHARED = "/root/code/python-wasi/opt/wasi-python/lib/python3.12/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_stub.o" ENABLE_IPV6 = "0" ENSUREPIP = "no" EXE = ".wasm" EXEMODE = "755" EXENAME = "/root/code/python-wasi/opt/wasi-python/bin/python3.12.wasm" EXPORTSFROM = "" EXPORTSYMS = "" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cpython-312-wasm32-wasi.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FREEZE_MODULE = "/root/code/python-wasi/cpython/inst/3.12/bin/python3.12 ./Programs/_freeze_module.py" FREEZE_MODULE_BOOTSTRAP = "/root/code/python-wasi/cpython/inst/3.12/bin/python3.12 ./Programs/_freeze_module.py" FREEZE_MODULE_BOOTSTRAP_DEPS = "./Programs/_freeze_module.py" FREEZE_MODULE_DEPS = "./Programs/_freeze_module.py" FROZEN_FILES_IN = "\" FROZEN_FILES_OUT = "\" GETPGRP_HAVE_ARG = "0" GITBRANCH = "git --git-dir ./.git name-rev --name-only HEAD" GITTAG = "git --git-dir ./.git describe --all --always --dirty" GITVERSION = "git --git-dir ./.git rev-parse --short HEAD" GNULD = "no" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "0" HAVE_ALARM = "0" HAVE_ALIGNED_REQUIRED = "1" HAVE_ALLOCA_H = "1" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "0" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "1" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_BZLIB_H = "1" HAVE_CHFLAGS = "0" HAVE_CHMOD = "1" HAVE_CHOWN = "1" HAVE_CHROOT = "0" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_NANOSLEEP = "1" HAVE_CLOCK_SETTIME = "0" HAVE_CLOSE_RANGE = "0" HAVE_COMPUTED_GOTOS = "0" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPY_FILE_RANGE = "0" HAVE_CRYPT_H = "1" HAVE_CRYPT_R = "1" HAVE_CTERMID = "0" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "0" HAVE_CURSES_H = "0" HAVE_CURSES_HAS_KEY = "0" HAVE_CURSES_IMMEDOK = "0" HAVE_CURSES_IS_PAD = "0" HAVE_CURSES_IS_TERM_RESIZED = "0" HAVE_CURSES_RESIZETERM = "0" HAVE_CURSES_RESIZE_TERM = "0" HAVE_CURSES_SYNCOK = "0" HAVE_CURSES_TYPEAHEAD = "0" HAVE_CURSES_USE_ENV = "0" HAVE_CURSES_WCHGAT = "0" HAVE_DB_H = "0" HAVE_DECL_RTLD_DEEPBIND = "0" HAVE_DECL_RTLD_GLOBAL = "0" HAVE_DECL_RTLD_LAZY = "0" HAVE_DECL_RTLD_LOCAL = "0" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "0" HAVE_DECL_RTLD_NOLOAD = "0" HAVE_DECL_RTLD_NOW = "0" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "0" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "0" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "0" HAVE_DLOPEN = "0" HAVE_DUP2 = "0" HAVE_DUP3 = "0" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "0" HAVE_EDITLINE_READLINE_H = "0" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EVENTFD = "0" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "0" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "0" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "0" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "0" HAVE_FFI_CLOSURE_ALLOC = "0" HAVE_FFI_PREP_CIF_VAR = "0" HAVE_FFI_PREP_CLOSURE_LOC = "0" HAVE_FLOCK = "0" HAVE_FORK = "1" HAVE_FORK1 = "0" HAVE_FORKPTY = "0" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "0" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "1" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "0" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "0" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "0" HAVE_GCC_ASM_FOR_X87 = "0" HAVE_GCC_UINT128_T = "1" HAVE_GDBM_DASH_NDBM_H = "0" HAVE_GDBM_H = "0" HAVE_GDBM_NDBM_H = "0" HAVE_GETADDRINFO = "0" HAVE_GETC_UNLOCKED = "0" HAVE_GETEGID = "1" HAVE_GETENTROPY = "1" HAVE_GETEUID = "1" HAVE_GETGID = "1" HAVE_GETGRGID = "0" HAVE_GETGRGID_R = "0" HAVE_GETGRNAM_R = "0" HAVE_GETGROUPLIST = "0" HAVE_GETGROUPS = "0" HAVE_GETHOSTBYNAME = "1" HAVE_GETHOSTBYNAME_R = "0" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "0" HAVE_GETITIMER = "0" HAVE_GETLOADAVG = "0" HAVE_GETLOGIN = "0" HAVE_GETNAMEINFO = "0" HAVE_GETPAGESIZE = "0" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "0" HAVE_GETPGRP = "0" HAVE_GETPID = "1" HAVE_GETPPID = "1" HAVE_GETPRIORITY = "0" HAVE_GETPWENT = "0" HAVE_GETPWNAM_R = "0" HAVE_GETPWUID = "1" HAVE_GETPWUID_R = "0" HAVE_GETRANDOM = "0" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "0" HAVE_GETRESUID = "0" HAVE_GETRUSAGE = "1" HAVE_GETSID = "0" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETUID = "1" HAVE_GETWD = "0" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "0" HAVE_HSTRERROR = "0" HAVE_HTOLE64 = "1" HAVE_IEEEFP_H = "0" HAVE_IF_NAMEINDEX = "0" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "0" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "0" HAVE_KQUEUE = "0" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "1" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "0" HAVE_LCHOWN = "0" HAVE_LIBB2 = "0" HAVE_LIBDB = "0" HAVE_LIBDL = "0" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "0" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBSQLITE3 = "1" HAVE_LIBUTIL_H = "0" HAVE_LINK = "1" HAVE_LINKAT = "0" HAVE_LINUX_AUXVEC_H = "0" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_J1939_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "0" HAVE_LINUX_FS_H = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_SOUNDCARD_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LINUX_WAIT_H = "0" HAVE_LOCKF = "0" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LOGIN_TTY = "0" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "0" HAVE_LZMA_H = "1" HAVE_MADVISE = "0" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "0" HAVE_MEMORY_H = "0" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "0" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "0" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "0" HAVE_MREMAP = "0" HAVE_NANOSLEEP = "1" HAVE_NCURSESW = "0" HAVE_NCURSES_H = "0" HAVE_NDBM_H = "0" HAVE_NDIR_H = "0" HAVE_NETCAN_CAN_H = "0" HAVE_NETINET_IN_H = "1" HAVE_NETPACKET_PACKET_H = "1" HAVE_NET_IF_H = "0" HAVE_NICE = "0" HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION = "0" HAVE_OPENAT = "0" HAVE_OPENDIR = "1" HAVE_OPENPTY = "0" HAVE_PANEL_H = "0" HAVE_PATHCONF = "1" HAVE_PAUSE = "0" HAVE_PIPE = "1" HAVE_PIPE2 = "0" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "0" HAVE_POSIX_SPAWNP = "0" HAVE_PREAD = "1" HAVE_PREADV = "0" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "0" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "0" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "0" HAVE_PTHREAD_SIGMASK = "0" HAVE_PTY_H = "0" HAVE_PWRITE = "1" HAVE_PWRITEV = "0" HAVE_PWRITEV2 = "0" HAVE_READLINE_READLINE_H = "0" HAVE_READLINK = "1" HAVE_READLINKAT = "0" HAVE_READV = "1" HAVE_REALPATH = "0" HAVE_RENAMEAT = "0" HAVE_RL_APPEND_HISTORY = "0" HAVE_RL_CATCH_SIGNAL = "0" HAVE_RL_COMPLETION_APPEND_CHARACTER = "0" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "0" HAVE_RL_COMPLETION_MATCHES = "0" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "0" HAVE_RL_PRE_INPUT_HOOK = "0" HAVE_RL_RESIZE_TERMINAL = "0" HAVE_RPC_RPC_H = "0" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "0" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "0" HAVE_SCHED_SETAFFINITY = "0" HAVE_SCHED_SETPARAM = "0" HAVE_SCHED_SETSCHEDULER = "0" HAVE_SEM_CLOCKWAIT = "0" HAVE_SEM_GETVALUE = "0" HAVE_SEM_OPEN = "0" HAVE_SEM_TIMEDWAIT = "0" HAVE_SEM_UNLINK = "0" HAVE_SENDFILE = "0" HAVE_SETEGID = "0" HAVE_SETEUID = "0" HAVE_SETGID = "0" HAVE_SETGROUPS = "0" HAVE_SETHOSTNAME = "0" HAVE_SETITIMER = "0" HAVE_SETJMP_H = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "0" HAVE_SETPGRP = "0" HAVE_SETPRIORITY = "0" HAVE_SETREGID = "0" HAVE_SETRESGID = "0" HAVE_SETRESUID = "0" HAVE_SETREUID = "0" HAVE_SETSID = "0" HAVE_SETUID = "0" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SHM_OPEN = "0" HAVE_SHM_UNLINK = "0" HAVE_SHUTDOWN = "0" HAVE_SIGACTION = "0" HAVE_SIGALTSTACK = "0" HAVE_SIGFILLSET = "0" HAVE_SIGINFO_T_SI_BAND = "0" HAVE_SIGINTERRUPT = "0" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "0" HAVE_SIGRELSE = "0" HAVE_SIGTIMEDWAIT = "0" HAVE_SIGWAIT = "0" HAVE_SIGWAITINFO = "0" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "0" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "0" HAVE_SPLICE = "0" HAVE_SSIZE_T = "1" HAVE_STATVFS = "0" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "0" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "1" HAVE_STROPTS_H = "1" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "0" HAVE_STRUCT_STAT_ST_GEN = "0" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "0" HAVE_SYNC = "0" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYSLOG_H = "0" HAVE_SYSTEM = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_AUXV_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "0" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENTFD_H = "0" HAVE_SYS_EVENT_H = "0" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "0" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "0" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "0" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "0" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_SOUNDCARD_H = "0" HAVE_SYS_STATVFS_H = "0" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "0" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "0" HAVE_TCGETPGRP = "0" HAVE_TCSETPGRP = "0" HAVE_TEMPNAM = "0" HAVE_TERMIOS_H = "0" HAVE_TERM_H = "0" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "0" HAVE_TMPNAM = "0" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TTYNAME = "1" HAVE_TZNAME = "0" HAVE_UMASK = "1" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "0" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UTMP_H = "0" HAVE_UUID_CREATE = "0" HAVE_UUID_ENC_BE = "0" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_H = "1" HAVE_UUID_UUID_H = "0" HAVE_VFORK = "0" HAVE_WAIT = "1" HAVE_WAIT3 = "0" HAVE_WAIT4 = "0" HAVE_WAITID = "0" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "0" HAVE_WRITEV = "1" HAVE_ZLIB_COPY = "1" HAVE_ZLIB_H = "1" HAVE__GETPTY = "0" HOSTRUNNER = "wasmtime run --env PYTHONPATH=/$(shell realpath --relative-to /root/code/python-wasi/cpython /root/code/python-wasi/cpython)/$(shell cat pybuilddir.txt):/Lib --mapdir /::. --" HOST_GNU_TYPE = "wasm32-unknown-wasi" INCLDIRSTOMAKE = "/root/code/python-wasi/opt/wasi-python/include /root/code/python-wasi/opt/wasi-python/include /root/code/python-wasi/opt/wasi-python/include/python3.12 /root/code/python-wasi/opt/wasi-python/include/python3.12" INCLUDEDIR = "/root/code/python-wasi/opt/wasi-python/include" INCLUDEPY = "/root/code/python-wasi/opt/wasi-python/include/python3.12" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "/usr/bin/install -c -m 644" INSTALL_PROGRAM = "/usr/bin/install -c" INSTALL_SCRIPT = "/usr/bin/install -c" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.12.a" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "" LDFLAGS = "" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.12.a" LDLIBRARYDIR = "" LDSHARED = "" LDVERSION = "3.12" LIBC = "" LIBDEST = "/root/code/python-wasi/opt/wasi-python/lib/python3.12" LIBDIR = "/root/code/python-wasi/opt/wasi-python/lib" LIBEXPAT_A = "Modules/expat/libexpat.a" LIBEXPAT_CFLAGS = "-I./Modules/expat -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot" LIBEXPAT_HEADERS = "\" LIBEXPAT_OBJS = "\" LIBM = "-lm" LIBMPDEC_A = "Modules/_decimal/libmpdec/libmpdec.a" LIBMPDEC_CFLAGS = "-I./Modules/_decimal/libmpdec -DCONFIG_32=1 -DANSI=1 -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot" LIBMPDEC_HEADERS = "\" LIBMPDEC_OBJS = "\" LIBOBJDIR = "Python/" LIBOBJS = "Python/dup2$U.o" LIBPC = "/root/code/python-wasi/opt/wasi-python/lib/pkgconfig" LIBPL = "/root/code/python-wasi/opt/wasi-python/lib/python3.12/config-3.12-wasm32-wasi" LIBPYTHON = "" LIBRARY = "libpython3.12.a" LIBRARY_DEPS = "libpython3.12.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-L/opt/lib -L/root/code/python-wasi/wasix -lwasix -L/opt/wasi-sdk/share/wasi-sysroot/lib/wasm32-wasi -lwasi-emulated-signal -L/root/code/python-wasi/docker/lib --sysroot=/opt/wasi-sdk/share/wasi-sysroot -lwasi-emulated-signal -lwasi-emulated-getpid -lwasi-emulated-process-clocks -lpthread" LIBSUBDIRS = "asyncio \" LINKCC = "clang --target=wasm32-wasi" LINKFORSHARED = "" LINK_PYTHON_DEPS = "libpython3.12.a" LINK_PYTHON_OBJS = "\" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "yes" LLVM_PROF_FILE = "LLVM_PROFILE_FILE="code-%p.profclangr"" LLVM_PROF_MERGER = "'' merge -output=code.profclangd *.profclangr" LN = "ln" LOCALMODLIBS = "-lm -lm -lm -lm -lm -lm Modules/_decimal/libmpdec/libmpdec.a -lz -lbz2 -llzma -lz -lm Modules/expat/libexpat.a -lsqlite3" MACHDEP = "wasi" MACHDEP_OBJS = "" MACHDESTLIB = "/root/code/python-wasi/opt/wasi-python/lib/python3.12" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "clang --target=wasm32-wasi" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "./Modules/makesetup" MANDIR = "/root/code/python-wasi/opt/wasi-python/share/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "array _asyncio _bisect _contextvars _csv _heapq _json _lsprof _opcode _pickle _queue _random _struct _typing _zoneinfo audioop math cmath _statistics _datetime _decimal binascii _bz2 _lzma zlib _md5 _sha1 _sha256 _sha512 _sha3 _blake2 pyexpat _elementtree _codecs_cn _codecs_hk _codecs_iso2022 _codecs_jp _codecs_kr _codecs_tw _multibytecodec unicodedata _crypt select _socket _sqlite3 xxsubtype _xxtestfuzz _testbuffer _testinternalcapi _testcapi atexit faulthandler posix _signal _tracemalloc _codecs _collections errno _io itertools _sre _thread time _weakref _abc _functools _locale _operator _stat _symtable" MODDISABLED_NAMES = "" MODLIBS = "-lm -lm -lm -lm -lm -lm Modules/_decimal/libmpdec/libmpdec.a -lz -lbz2 -llzma -lz -lm Modules/expat/libexpat.a -lsqlite3" MODOBJS = "Modules/arraymodule.o Modules/_asynciomodule.o Modules/_bisectmodule.o Modules/_contextvarsmodule.o Modules/_csv.o Modules/_heapqmodule.o Modules/_json.o Modules/_lsprof.o Modules/rotatingtree.o Modules/_opcode.o Modules/_pickle.o Modules/_queuemodule.o Modules/_randommodule.o Modules/_struct.o Modules/_typingmodule.o Modules/_zoneinfo.o Modules/audioop.o Modules/mathmodule.o Modules/cmathmodule.o Modules/_statisticsmodule.o Modules/_datetimemodule.o Modules/_decimal/_decimal.o Modules/binascii.o Modules/_bz2module.o Modules/_lzmamodule.o Modules/zlibmodule.o Modules/md5module.o Modules/sha1module.o Modules/sha256module.o Modules/sha512module.o Modules/_sha3/sha3module.o Modules/_blake2/blake2module.o Modules/_blake2/blake2b_impl.o Modules/_blake2/blake2s_impl.o Modules/pyexpat.o Modules/_elementtree.o Modules/cjkcodecs/_codecs_cn.o Modules/cjkcodecs/_codecs_hk.o Modules/cjkcodecs/_codecs_iso2022.o Modules/cjkcodecs/_codecs_jp.o Modules/cjkcodecs/_codecs_kr.o Modules/cjkcodecs/_codecs_tw.o Modules/cjkcodecs/multibytecodec.o Modules/unicodedata.o Modules/_cryptmodule.o Modules/selectmodule.o Modules/socketmodule.o Modules/_sqlite/blob.o Modules/_sqlite/connection.o Modules/_sqlite/cursor.o Modules/_sqlite/microprotocols.o Modules/_sqlite/module.o Modules/_sqlite/prepare_protocol.o Modules/_sqlite/row.o Modules/_sqlite/statement.o Modules/_sqlite/util.o Modules/xxsubtype.o Modules/_xxtestfuzz/_xxtestfuzz.o Modules/_xxtestfuzz/fuzzer.o Modules/_testbuffer.o Modules/_testinternalcapi.o Modules/_testcapimodule.o Modules/_testcapi/vectorcall.o Modules/atexitmodule.o Modules/faulthandler.o Modules/posixmodule.o Modules/signalmodule.o Modules/_tracemalloc.o Modules/_codecsmodule.o Modules/_collectionsmodule.o Modules/errnomodule.o Modules/_io/_iomodule.o Modules/_io/iobase.o Modules/_io/fileio.o Modules/_io/bytesio.o Modules/_io/bufferedio.o Modules/_io/textio.o Modules/_io/stringio.o Modules/itertoolsmodule.o Modules/_sre/sre.o Modules/_threadmodule.o Modules/timemodule.o Modules/_weakref.o Modules/_abc.o Modules/_functoolsmodule.o Modules/_localemodule.o Modules/_operator.o Modules/_stat.o Modules/symtablemodule.o" MODSHARED_NAMES = "" MODULE_ARRAY_LDFLAGS = "" MODULE_ARRAY_STATE = "yes" MODULE_ATEXIT_LDFLAGS = "" MODULE_AUDIOOP_LDFLAGS = "-lm" MODULE_AUDIOOP_STATE = "yes" MODULE_BINASCII_CFLAGS = "-DUSE_ZLIB_CRC32" MODULE_BINASCII_LDFLAGS = "-lz" MODULE_BINASCII_STATE = "yes" MODULE_CMATH_DEPS = "./Modules/_math.h" MODULE_CMATH_LDFLAGS = "-lm" MODULE_CMATH_STATE = "yes" MODULE_ERRNO_LDFLAGS = "" MODULE_FAULTHANDLER_LDFLAGS = "" MODULE_FCNTL_STATE = "n/a" MODULE_GRP_STATE = "n/a" MODULE_ITERTOOLS_LDFLAGS = "" MODULE_MATH_DEPS = "./Modules/_math.h" MODULE_MATH_LDFLAGS = "-lm" MODULE_MATH_STATE = "yes" MODULE_MMAP_STATE = "n/a" MODULE_NIS_STATE = "n/a" MODULE_OBJS = "\" MODULE_OSSAUDIODEV_STATE = "n/a" MODULE_POSIX_LDFLAGS = "" MODULE_PWD_STATE = "n/a" MODULE_PYEXPAT_CFLAGS = "-I./Modules/expat" MODULE_PYEXPAT_DEPS = "\ Modules/expat/libexpat.a" MODULE_PYEXPAT_LDFLAGS = "-lm Modules/expat/libexpat.a" MODULE_PYEXPAT_STATE = "yes" MODULE_READLINE_STATE = "missing" MODULE_RESOURCE_STATE = "n/a" MODULE_SELECT_LDFLAGS = "" MODULE_SELECT_STATE = "yes" MODULE_SPWD_STATE = "n/a" MODULE_SYSLOG_STATE = "n/a" MODULE_TERMIOS_STATE = "n/a" MODULE_TIME_LDFLAGS = "" MODULE_TIME_STATE = "yes" MODULE_UNICODEDATA_DEPS = "./Modules/unicodedata_db.h ./Modules/unicodename_db.h" MODULE_UNICODEDATA_LDFLAGS = "" MODULE_UNICODEDATA_STATE = "yes" MODULE_XXLIMITED_35_STATE = "missing" MODULE_XXLIMITED_STATE = "missing" MODULE_XXSUBTYPE_LDFLAGS = "" MODULE_XXSUBTYPE_STATE = "yes" MODULE_ZLIB_CFLAGS = "" MODULE_ZLIB_LDFLAGS = "-lz" MODULE_ZLIB_STATE = "yes" MODULE__ABC_LDFLAGS = "" MODULE__ASYNCIO_LDFLAGS = "" MODULE__ASYNCIO_STATE = "yes" MODULE__BISECT_LDFLAGS = "" MODULE__BISECT_STATE = "yes" MODULE__BLAKE2_CFLAGS = "" MODULE__BLAKE2_DEPS = "./Modules/_blake2/impl/blake2-config.h ./Modules/_blake2/impl/blake2-impl.h ./Modules/_blake2/impl/blake2.h ./Modules/_blake2/impl/blake2b-load-sse2.h ./Modules/_blake2/impl/blake2b-load-sse41.h ./Modules/_blake2/impl/blake2b-ref.c ./Modules/_blake2/impl/blake2b-round.h ./Modules/_blake2/impl/blake2b.c ./Modules/_blake2/impl/blake2s-load-sse2.h ./Modules/_blake2/impl/blake2s-load-sse41.h ./Modules/_blake2/impl/blake2s-load-xop.h ./Modules/_blake2/impl/blake2s-ref.c ./Modules/_blake2/impl/blake2s-round.h ./Modules/_blake2/impl/blake2s.c ./Modules/_blake2/blake2module.h ./Modules/hashlib.h" MODULE__BLAKE2_LDFLAGS = "" MODULE__BLAKE2_STATE = "yes" MODULE__BZ2_CFLAGS = "" MODULE__BZ2_LDFLAGS = "-lbz2" MODULE__BZ2_STATE = "yes" MODULE__CODECS_CN_LDFLAGS = "" MODULE__CODECS_CN_STATE = "yes" MODULE__CODECS_HK_LDFLAGS = "" MODULE__CODECS_HK_STATE = "yes" MODULE__CODECS_ISO2022_LDFLAGS = "" MODULE__CODECS_ISO2022_STATE = "yes" MODULE__CODECS_JP_LDFLAGS = "" MODULE__CODECS_JP_STATE = "yes" MODULE__CODECS_KR_LDFLAGS = "" MODULE__CODECS_KR_STATE = "yes" MODULE__CODECS_LDFLAGS = "" MODULE__CODECS_TW_LDFLAGS = "" MODULE__CODECS_TW_STATE = "yes" MODULE__COLLECTIONS_LDFLAGS = "" MODULE__CONTEXTVARS_LDFLAGS = "" MODULE__CONTEXTVARS_STATE = "yes" MODULE__CRYPT_CFLAGS = "" MODULE__CRYPT_LDFLAGS = "" MODULE__CRYPT_STATE = "yes" MODULE__CSV_LDFLAGS = "" MODULE__CSV_STATE = "yes" MODULE__CTYPES_DEPS = "./Modules/_ctypes/ctypes.h ./Modules/_ctypes/darwin/dlfcn.h" MODULE__CTYPES_MALLOC_CLOSURE = "" MODULE__CTYPES_STATE = "missing" MODULE__CTYPES_TEST_STATE = "n/a" MODULE__CURSES_PANEL_STATE = "n/a" MODULE__CURSES_STATE = "n/a" MODULE__DATETIME_LDFLAGS = "-lm" MODULE__DATETIME_STATE = "yes" MODULE__DBM_STATE = "n/a" MODULE__DECIMAL_CFLAGS = "-I./Modules/_decimal/libmpdec -DCONFIG_32=1 -DANSI=1" MODULE__DECIMAL_DEPS = "./Modules/_decimal/docstrings.h \ Modules/_decimal/libmpdec/libmpdec.a" MODULE__DECIMAL_LDFLAGS = "-lm Modules/_decimal/libmpdec/libmpdec.a" MODULE__DECIMAL_STATE = "yes" MODULE__ELEMENTTREE_CFLAGS = "-I./Modules/expat" MODULE__ELEMENTTREE_DEPS = "./Modules/pyexpat.c \ Modules/expat/libexpat.a" MODULE__ELEMENTTREE_LDFLAGS = "" MODULE__ELEMENTTREE_STATE = "yes" MODULE__FUNCTOOLS_LDFLAGS = "" MODULE__GDBM_STATE = "n/a" MODULE__HASHLIB_DEPS = "./Modules/hashlib.h" MODULE__HASHLIB_STATE = "missing" MODULE__HEAPQ_LDFLAGS = "" MODULE__HEAPQ_STATE = "yes" MODULE__IO_CFLAGS = "-I./Modules/_io" MODULE__IO_DEPS = "./Modules/_io/_iomodule.h" MODULE__IO_LDFLAGS = "" MODULE__IO_STATE = "yes" MODULE__JSON_LDFLAGS = "" MODULE__JSON_STATE = "yes" MODULE__LOCALE_LDFLAGS = "" MODULE__LSPROF_LDFLAGS = "" MODULE__LSPROF_STATE = "yes" MODULE__LZMA_CFLAGS = "" MODULE__LZMA_LDFLAGS = "-llzma" MODULE__LZMA_STATE = "yes" MODULE__MD5_DEPS = "./Modules/hashlib.h" MODULE__MD5_LDFLAGS = "" MODULE__MD5_STATE = "yes" MODULE__MULTIBYTECODEC_LDFLAGS = "" MODULE__MULTIBYTECODEC_STATE = "yes" MODULE__MULTIPROCESSING_STATE = "n/a" MODULE__OPCODE_LDFLAGS = "" MODULE__OPCODE_STATE = "yes" MODULE__OPERATOR_LDFLAGS = "" MODULE__PICKLE_LDFLAGS = "" MODULE__PICKLE_STATE = "yes" MODULE__POSIXSHMEM_STATE = "n/a" MODULE__POSIXSUBPROCESS_STATE = "n/a" MODULE__QUEUE_LDFLAGS = "" MODULE__QUEUE_STATE = "yes" MODULE__RANDOM_LDFLAGS = "" MODULE__RANDOM_STATE = "yes" MODULE__SCPROXY_STATE = "n/a" MODULE__SHA1_DEPS = "./Modules/hashlib.h" MODULE__SHA1_LDFLAGS = "" MODULE__SHA1_STATE = "yes" MODULE__SHA256_DEPS = "./Modules/hashlib.h" MODULE__SHA256_LDFLAGS = "" MODULE__SHA256_STATE = "yes" MODULE__SHA3_DEPS = "./Modules/_sha3/sha3.c ./Modules/_sha3/sha3.h ./Modules/hashlib.h" MODULE__SHA3_LDFLAGS = "" MODULE__SHA3_STATE = "yes" MODULE__SHA512_DEPS = "./Modules/hashlib.h" MODULE__SHA512_LDFLAGS = "" MODULE__SHA512_STATE = "yes" MODULE__SIGNAL_LDFLAGS = "" MODULE__SOCKET_DEPS = "./Modules/socketmodule.h" MODULE__SOCKET_LDFLAGS = "" MODULE__SOCKET_STATE = "yes" MODULE__SQLITE3_CFLAGS = "-I./Modules/_sqlite" MODULE__SQLITE3_DEPS = "./Modules/_sqlite/connection.h ./Modules/_sqlite/cursor.h ./Modules/_sqlite/microprotocols.h ./Modules/_sqlite/module.h ./Modules/_sqlite/prepare_protocol.h ./Modules/_sqlite/row.h ./Modules/_sqlite/util.h" MODULE__SQLITE3_LDFLAGS = "-lsqlite3" MODULE__SQLITE3_STATE = "yes" MODULE__SRE_LDFLAGS = "" MODULE__SSL_DEPS = "./Modules/_ssl.h ./Modules/_ssl/cert.c ./Modules/_ssl/debughelpers.c ./Modules/_ssl/misc.c ./Modules/_ssl_data.h ./Modules/_ssl_data_111.h ./Modules/_ssl_data_300.h ./Modules/socketmodule.h" MODULE__SSL_STATE = "missing" MODULE__STATISTICS_LDFLAGS = "-lm" MODULE__STATISTICS_STATE = "yes" MODULE__STAT_LDFLAGS = "" MODULE__STRUCT_LDFLAGS = "" MODULE__STRUCT_STATE = "yes" MODULE__SYMTABLE_LDFLAGS = "" MODULE__TESTBUFFER_LDFLAGS = "" MODULE__TESTBUFFER_STATE = "yes" MODULE__TESTCAPI_DEPS = "./Modules/testcapi_long.h ./Modules/_testcapi/parts.h" MODULE__TESTCAPI_LDFLAGS = "" MODULE__TESTCAPI_STATE = "yes" MODULE__TESTIMPORTMULTIPLE_STATE = "missing" MODULE__TESTINTERNALCAPI_LDFLAGS = "" MODULE__TESTINTERNALCAPI_STATE = "yes" MODULE__TESTMULTIPHASE_STATE = "missing" MODULE__THREAD_LDFLAGS = "" MODULE__TKINTER_STATE = "n/a" MODULE__TRACEMALLOC_LDFLAGS = "" MODULE__TYPING_LDFLAGS = "" MODULE__TYPING_STATE = "yes" MODULE__UUID_STATE = "missing" MODULE__WEAKREF_LDFLAGS = "" MODULE__XXSUBINTERPRETERS_STATE = "n/a" MODULE__XXTESTFUZZ_LDFLAGS = "" MODULE__XXTESTFUZZ_STATE = "yes" MODULE__ZONEINFO_LDFLAGS = "" MODULE__ZONEINFO_STATE = "yes" MULTIARCH = "wasm32-wasi" MULTIARCH_CPPFLAGS = "-DMULTIARCH=\"wasm32-wasi\"" MVWDELCH_IS_EXPRESSION = "0" NO_AS_NEEDED = "" OBJECT_OBJS = "\" OPT = "-DNDEBUG -g -fwrapv -O3 -Wall" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ Parser/myreadline.o Parser/tokenizer.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "-fprofile-instr-generate" PGO_PROF_USE_FLAG = "-fprofile-instr-use=code.profclangd" PLATLIBDIR = "lib" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo --timeout=1200" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "0" PURIFY = "" PY3LIBRARY = "" PYLONG_BITS_IN_DIGIT = "30" PYTHON = "python.wasm" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "_PYTHON_HOSTRUNNER='wasmtime run --env PYTHONPATH=/$(shell realpath --relative-to /root/code/python-wasi/cpython /root/code/python-wasi/cpython)/$(shell cat pybuilddir.txt):/Lib --mapdir /::. --' _PYTHON_PROJECT_BASE=/root/code/python-wasi/cpython _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(shell test -f pybuilddir.txt && echo /root/code/python-wasi/cpython/`cat pybuilddir.txt`:)./Lib _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata__wasi_wasm32-wasi /root/code/python-wasi/cpython/inst/3.12/bin/python3.12" PYTHON_FOR_BUILD_DEPS = "" PYTHON_FOR_FREEZE = "/root/code/python-wasi/cpython/inst/3.12/bin/python3.12" PYTHON_FOR_REGEN = "" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha256,sha512,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot" PY_CFLAGS_NODIST = "-std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-z stack-size=524288 -Wl,--stack-first -Wl,--initial-memory=10485760" PY_CPPFLAGS = "-I. -I./Include -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot" PY_ENABLE_SHARED = "0" PY_LDFLAGS = "" PY_LDFLAGS_NODIST = "-z stack-size=524288 -Wl,--stack-first -Wl,--initial-memory=10485760" PY_LDFLAGS_NOLTO = "" PY_SQLITE_ENABLE_LOAD_EXTENSION = "0" PY_SQLITE_HAVE_SERIALIZE = "1" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I. -I./Include -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot -g -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_PROCESS_CLOCKS -I/opt/include -I/root/code/python-wasi/wasix/include -isystem /root/code/python-wasi/wasix/include -I/opt/wasi-sdk/share/wasi-sysroot/include -I/root/code/python-wasi/docker/include --sysroot=/opt/wasi-sdk/share/wasi-sysroot" PY_SUPPORT_TIER = "0" Py_DEBUG = "0" Py_ENABLE_SHARED = "0" Py_HASH_ALGORITHM = "0" Py_STATS = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "wasm32-wasi-readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "" SCRIPTDIR = "/root/code/python-wasi/opt/wasi-python/lib" SCRIPT_2TO3 = "build/scripts-3.12/2to3-3.12" SCRIPT_IDLE = "build/scripts-3.12/idle3.12" SCRIPT_PYDOC = "build/scripts-3.12/pydoc3.12" SETPGRP_HAVE_ARG = "0" SHELL = "/bin/sh" SHLIBS = "-L/opt/lib -L/root/code/python-wasi/wasix -lwasix -L/opt/wasi-sdk/share/wasi-sysroot/lib/wasm32-wasi -lwasi-emulated-signal -L/root/code/python-wasi/docker/lib --sysroot=/opt/wasi-sdk/share/wasi-sysroot -lwasi-emulated-signal -lwasi-emulated-getpid -lwasi-emulated-process-clocks -lpthread" SHLIB_SUFFIX = ".so" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "16" SIZEOF_INT = "4" SIZEOF_LONG = "4" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "4" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "4" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "4" SIZEOF_VOID_P = "4" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SOABI = "cpython-312-wasm32-wasi" SRCDIRS = "Modules Modules/_blake2 Modules/_ctypes Modules/_decimal Modules/_decimal/libmpdec Modules/_io Modules/_multiprocessing Modules/_sha3 Modules/_sqlite Modules/_sre Modules/_testcapi Modules/_xxtestfuzz Modules/cjkcodecs Modules/expat Objects Parser Programs Python Python/frozen_modules Python/deepfreeze" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STATIC_LIBPYTHON = "1" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "_PYTHON_HOSTRUNNER='wasmtime run --env PYTHONPATH=/$(shell realpath --relative-to /root/code/python-wasi/cpython /root/code/python-wasi/cpython)/$(shell cat pybuilddir.txt):/Lib --mapdir /::. --' _PYTHON_PROJECT_BASE=/root/code/python-wasi/cpython _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(shell test -f pybuilddir.txt && echo /root/code/python-wasi/cpython/`cat pybuilddir.txt`:)./Lib _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata__wasi_wasm32-wasi /root/code/python-wasi/cpython/inst/3.12/bin/python3.12" TESTPYTHONOPTS = "" TESTRUNNER = "_PYTHON_HOSTRUNNER='wasmtime run --env PYTHONPATH=/$(shell realpath --relative-to /root/code/python-wasi/cpython /root/code/python-wasi/cpython)/$(shell cat pybuilddir.txt):/Lib --mapdir /::. --' _PYTHON_PROJECT_BASE=/root/code/python-wasi/cpython _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(shell test -f pybuilddir.txt && echo /root/code/python-wasi/cpython/`cat pybuilddir.txt`:)./Lib _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata__wasi_wasm32-wasi /root/code/python-wasi/cpython/inst/3.12/bin/python3.12 ./Tools/scripts/run_tests.py" TESTSUBDIRS = "distutils/tests \" TESTTIMEOUT = "1200" TEST_MODULES = "yes" THREAD_STACK_SIZE = "0" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.12" WASM_ASSETS_DIR = "./root/code/python-wasi/opt/wasi-python" WASM_STDLIB = "./root/code/python-wasi/opt/wasi-python/lib/python3.12/os.py" WHEEL_PKG_DIR = "" WINDOW_HAS_FLAGS = "0" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_EDITLINE = "0" WITH_FREELISTS = "1" WITH_LIBINTL = "0" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "0" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/root/code/python-wasi/cpython" abs_srcdir = "/root/code/python-wasi/cpython" base = "/root/code/python-wasi/opt/wasi-python" datarootdir = "/root/code/python-wasi/opt/wasi-python/share" exec_prefix = "/root/code/python-wasi/opt/wasi-python" installed_base = "/root/code/python-wasi/opt/wasi-python" installed_platbase = "/root/code/python-wasi/opt/wasi-python" platbase = "/root/code/python-wasi/opt/wasi-python" platlibdir = "lib" prefix = "/root/code/python-wasi/opt/wasi-python" projectbase = "/" py_version = "3.12.0a0" py_version_nodot = "312" py_version_nodot_plat = "" py_version_short = "3.12" srcdir = "/root/code/python-wasi/opt/wasi-python/lib/python3.12/config-3.12-wasm32-wasi"maturin-1.16.0/sysconfig/cpython-win-3.7.txt000066400000000000000000000035521527064705700206310ustar00rootroot00000000000000Platform: "win-amd64" Python version: "3.7" Current installation scheme: "nt" Paths: data = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37" include = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37\Include" platinclude = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37\Include" platlib = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37\Lib\site-packages" platstdlib = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37\Lib" purelib = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37\Lib\site-packages" scripts = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37\Scripts" stdlib = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37\Lib" Variables: BINDIR = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37" BINLIBDEST = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37\Lib" EXE = ".exe" EXT_SUFFIX = ".pyd" INCLUDEPY = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37\Include" LIBDEST = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37\Lib" SO = ".pyd" VERSION = "37" abiflags = "" base = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37" exec_prefix = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37" installed_base = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37" installed_platbase = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37" platbase = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37" prefix = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37" projectbase = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37" py_version = "3.7.0" py_version_nodot = "37" py_version_short = "3.7" srcdir = "C:\Users\Konstantin\AppData\Local\Programs\Python\Python37" userbase = "C:\Users\Konstantin\AppData\Roaming\Python" maturin-1.16.0/sysconfig/cpython-win-3.9-aarch64.txt000066400000000000000000000031601527064705700220540ustar00rootroot00000000000000Platform: "win-arm64" Python version: "3.9" Current installation scheme: "nt" Paths: data = "C:\Program Files (Arm)\Python-3.9.1" include = "C:\Program Files (Arm)\Python-3.9.1\Include" platinclude = "C:\Program Files (Arm)\Python-3.9.1\Include" platlib = "C:\Program Files (Arm)\Python-3.9.1\Lib\site-packages" platstdlib = "C:\Program Files (Arm)\Python-3.9.1\Lib" purelib = "C:\Program Files (Arm)\Python-3.9.1\Lib\site-packages" scripts = "C:\Program Files (Arm)\Python-3.9.1\Scripts" stdlib = "C:\Program Files (Arm)\Python-3.9.1\Lib" Variables: BINDIR = "C:\Program Files (Arm)\Python-3.9.1" BINLIBDEST = "C:\Program Files (Arm)\Python-3.9.1\Lib" EXE = ".exe" EXT_SUFFIX = ".pyd" INCLUDEPY = "C:\Program Files (Arm)\Python-3.9.1\Include" LIBDEST = "C:\Program Files (Arm)\Python-3.9.1\Lib" SO = ".pyd" TZPATH = "" VERSION = "39" abiflags = "" base = "C:\Program Files (Arm)\Python-3.9.1" exec_prefix = "C:\Program Files (Arm)\Python-3.9.1" installed_base = "C:\Program Files (Arm)\Python-3.9.1" installed_platbase = "C:\Program Files (Arm)\Python-3.9.1" platbase = "C:\Program Files (Arm)\Python-3.9.1" platlibdir = "lib" prefix = "C:\Program Files (Arm)\Python-3.9.1" projectbase = "C:\Program Files (Arm)\Python-3.9.1" py_version = "3.9.1" py_version_nodot = "39" py_version_short = "3.9" srcdir = "C:\Program Files (Arm)\Python-3.9.1" userbase = "C:\Users\messense\AppData\Roaming\Python" maturin-1.16.0/sysconfig/cpython-win-mingw64-3.9.txt000066400000000000000000000726271527064705700221350ustar00rootroot00000000000000Platform: "mingw_x86_64" Python version: "3.9" Current installation scheme: "posix_prefix" Paths: data = "C:/msys64/mingw64" include = "C:/msys64/mingw64/include/python3.9" platinclude = "C:/msys64/mingw64/include/python3.9" platlib = "C:/msys64/mingw64/lib/python3.9/site-packages" platstdlib = "C:/msys64/mingw64/lib/python3.9" purelib = "C:/msys64/mingw64/lib/python3.9/site-packages" scripts = "C:/msys64/mingw64/bin" stdlib = "C:/msys64/mingw64/lib/python3.9" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "0" AIX_GENUINE_CPLUSPLUS = "0" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare" BASECPPFLAGS = "-IObjects -IInclude -IPython" BASEMODLIBS = "" BINDIR = "C:/msys64/mingw64/bin" BINLIBDEST = "C:/msys64/mingw64/lib/python3.9" BLDLIBRARY = "-L. -lpython3.9" BLDSHARED = "gcc -shared -Wl,--enable-auto-image-base -pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high -pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high" BUILDEXE = ".exe" BUILDPYTHON = "python.exe" BUILDPYTHONW = "pythonw.exe" BUILDVENVLAUNCHER = "venvlauncher.exe" BUILDVENVWLAUNCHER = "venvwlauncher.exe" BUILD_GNU_TYPE = "x86_64-w64-mingw32" BYTESTR_DEPS = "\" CC = "gcc" CCSHARED = "" CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O2 -pipe -march=x86-64 -mtune=generic -O2 -pipe" CFLAGSFORSHARED = "" CFLAGS_ALIASING = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "-march=x86-64 -mtune=generic -O2 -pipe" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -D_WIN32_WINNT=0x0601 -DMS_DLL_ID='"3.9"'" CONFIGURE_CPPFLAGS = "-I../Python-3.9.7/PC -D__USE_MINGW_ANSI_STDIO=1 -I." CONFIGURE_LDFLAGS = "-pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--prefix=/mingw64' '--host=x86_64-w64-mingw32' '--build=x86_64-w64-mingw32' '--enable-shared' '--with-system-expat' '--with-system-ffi' '--with-system-libmpdec' '--without-ensurepip' '--without-c-locale-coercion' '--enable-loadable-sqlite-extensions' '--with-tzpath=/mingw64/share/zoneinfo' '--enable-optimizations' 'build_alias=x86_64-w64-mingw32' 'host_alias=x86_64-w64-mingw32' 'CC=gcc' 'CFLAGS=-march=x86-64 -mtune=generic -O2 -pipe' 'LDFLAGS=-pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high' 'CPPFLAGS=-D__USE_MINGW_ANSI_STDIO=1' 'PKG_CONFIG_PATH=/mingw64/lib/pkgconfig:/mingw64/share/pkgconfig'" CONFINCLUDEDIR = "C:/msys64/mingw64/include" CONFINCLUDEPY = "C:/msys64/mingw64/include/python3.9" COREPYTHONPATH = "" COVERAGE_INFO = "/c/M/mingw-w64-python/src/build-x86_64/coverage.info" COVERAGE_REPORT = "/c/M/mingw-w64-python/src/build-x86_64/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-IObjects -IInclude -IPython -I. -I../Python-3.9.7/Include -I../Python-3.9.7/PC -D__USE_MINGW_ANSI_STDIO=1 -I. -D__USE_MINGW_ANSI_STDIO=1" CXX = "g++" DESTDIR = "" DESTDIRFINAL = "/" DESTDIRS = "C:/msys64/mingw64 C:/msys64/mingw64/lib C:/msys64/mingw64/lib/python3.9 C:/msys64/mingw64/lib/python3.9/lib-dynload" DESTLIB = "C:/msys64/mingw64/lib/python3.9" DESTPATH = "" DESTSHARED = "C:/msys64/mingw64/lib/python3.9/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "libpython3.9.dll" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_win.o" ENABLE_IPV6 = "0" ENSUREPIP = "no" EXE = ".exe" EXEMODE = "755" EXPORTSFROM = "" EXPORTSYMS = "" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".cp39-mingw_x86_64.pyd" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "0" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "0" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "0" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "0" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "0" HAVE_BLUETOOTH_BLUETOOTH_H = "0" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "0" HAVE_CHOWN = "0" HAVE_CHROOT = "0" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "0" HAVE_CLOCK_GETTIME = "0" HAVE_CLOCK_SETTIME = "0" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "0" HAVE_CONIO_H = "1" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "0" HAVE_CRYPT_H = "0" HAVE_CRYPT_R = "0" HAVE_CTERMID = "0" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "0" HAVE_DECL_RTLD_GLOBAL = "0" HAVE_DECL_RTLD_LAZY = "0" HAVE_DECL_RTLD_LOCAL = "0" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "0" HAVE_DECL_RTLD_NOLOAD = "0" HAVE_DECL_RTLD_NOW = "0" HAVE_DECL_TZNAME = "1" HAVE_DEVICE_MACROS = "0" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "0" HAVE_DIRECT_H = "1" HAVE_DIRENT_D_TYPE = "0" HAVE_DIRENT_H = "1" HAVE_DIRFD = "0" HAVE_DLFCN_H = "0" HAVE_DLOPEN = "0" HAVE_DUP2 = "1" HAVE_DUP3 = "0" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "0" HAVE_EPOLL = "0" HAVE_EPOLL_CREATE1 = "0" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "0" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "0" HAVE_FCHDIR = "0" HAVE_FCHMOD = "0" HAVE_FCHMODAT = "0" HAVE_FCHOWN = "0" HAVE_FCHOWNAT = "0" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "0" HAVE_FDOPENDIR = "0" HAVE_FDWALK = "0" HAVE_FEXECVE = "0" HAVE_FINITE = "1" HAVE_FLOCK = "0" HAVE_FORK = "0" HAVE_FORKPTY = "0" HAVE_FPATHCONF = "0" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "0" HAVE_FSTATVFS = "0" HAVE_FSYNC = "0" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "1" HAVE_FTRUNCATE = "0" HAVE_FUTIMENS = "0" HAVE_FUTIMES = "0" HAVE_FUTIMESAT = "0" HAVE_GAI_STRERROR = "0" HAVE_GAMMA = "0" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "1" HAVE_GCC_ASM_FOR_X87 = "1" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "0" HAVE_GETC_UNLOCKED = "0" HAVE_GETENTROPY = "0" HAVE_GETGRGID_R = "0" HAVE_GETGRNAM_R = "0" HAVE_GETGROUPLIST = "0" HAVE_GETGROUPS = "0" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "0" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "0" HAVE_GETITIMER = "0" HAVE_GETLOADAVG = "0" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "0" HAVE_GETPAGESIZE = "0" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "0" HAVE_GETPGRP = "0" HAVE_GETPID = "1" HAVE_GETPRIORITY = "0" HAVE_GETPWENT = "0" HAVE_GETPWNAM_R = "0" HAVE_GETPWUID_R = "0" HAVE_GETRANDOM = "0" HAVE_GETRANDOM_SYSCALL = "0" HAVE_GETRESGID = "0" HAVE_GETRESUID = "0" HAVE_GETSID = "0" HAVE_GETSPENT = "0" HAVE_GETSPNAM = "0" HAVE_GETWD = "0" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "0" HAVE_HSTRERROR = "0" HAVE_HTOLE64 = "0" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "1" HAVE_IF_NAMEINDEX = "0" HAVE_INET_ATON = "0" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "0" HAVE_INTTYPES_H = "1" HAVE_IO_H = "1" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "0" HAVE_KILLPG = "0" HAVE_KQUEUE = "0" HAVE_LANGINFO_H = "0" HAVE_LARGEFILE_SUPPORT = "1" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "0" HAVE_LCHOWN = "0" HAVE_LGAMMA = "1" HAVE_LIBDL = "0" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "0" HAVE_LINK = "0" HAVE_LINKAT = "0" HAVE_LINUX_CAN_BCM_H = "0" HAVE_LINUX_CAN_H = "0" HAVE_LINUX_CAN_J1939_H = "0" HAVE_LINUX_CAN_RAW_FD_FRAMES = "0" HAVE_LINUX_CAN_RAW_H = "0" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "0" HAVE_LINUX_MEMFD_H = "0" HAVE_LINUX_NETLINK_H = "0" HAVE_LINUX_QRTR_H = "0" HAVE_LINUX_RANDOM_H = "0" HAVE_LINUX_TIPC_H = "0" HAVE_LINUX_VM_SOCKETS_H = "0" HAVE_LINUX_WAIT_H = "0" HAVE_LOCKF = "0" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "0" HAVE_LUTIMES = "0" HAVE_MADVISE = "0" HAVE_MAKEDEV = "0" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "0" HAVE_MEMRCHR = "0" HAVE_MINIX_CONFIG_H = "0" HAVE_MKDIRAT = "0" HAVE_MKFIFO = "0" HAVE_MKFIFOAT = "0" HAVE_MKNOD = "0" HAVE_MKNODAT = "0" HAVE_MKTIME = "1" HAVE_MMAP = "0" HAVE_MREMAP = "0" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "0" HAVE_NET_IF_H = "0" HAVE_NICE = "0" HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION = "0" HAVE_OPENAT = "0" HAVE_OPENPTY = "0" HAVE_PATHCONF = "0" HAVE_PAUSE = "0" HAVE_PIPE2 = "0" HAVE_PLOCK = "0" HAVE_POLL = "0" HAVE_POLL_H = "0" HAVE_POSIX_FADVISE = "0" HAVE_POSIX_FALLOCATE = "0" HAVE_POSIX_SPAWN = "0" HAVE_POSIX_SPAWNP = "0" HAVE_PREAD = "0" HAVE_PREADV = "0" HAVE_PREADV2 = "0" HAVE_PRLIMIT = "0" HAVE_PROCESS_H = "1" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "0" HAVE_PTHREAD_H = "0" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "0" HAVE_PTHREAD_SIGMASK = "0" HAVE_PTY_H = "0" HAVE_PWRITE = "0" HAVE_PWRITEV = "0" HAVE_PWRITEV2 = "0" HAVE_READLINK = "0" HAVE_READLINKAT = "0" HAVE_READV = "0" HAVE_REALPATH = "0" HAVE_RENAMEAT = "0" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "0" HAVE_SCHED_RR_GET_INTERVAL = "0" HAVE_SCHED_SETAFFINITY = "0" HAVE_SCHED_SETPARAM = "0" HAVE_SCHED_SETSCHEDULER = "0" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "0" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "0" HAVE_SETEGID = "0" HAVE_SETEUID = "0" HAVE_SETGID = "0" HAVE_SETGROUPS = "0" HAVE_SETHOSTNAME = "0" HAVE_SETITIMER = "0" HAVE_SETLOCALE = "1" HAVE_SETPGID = "0" HAVE_SETPGRP = "0" HAVE_SETPRIORITY = "0" HAVE_SETREGID = "0" HAVE_SETRESGID = "0" HAVE_SETRESUID = "0" HAVE_SETREUID = "0" HAVE_SETSID = "0" HAVE_SETUID = "0" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "0" HAVE_SHM_OPEN = "0" HAVE_SHM_UNLINK = "0" HAVE_SIGACTION = "0" HAVE_SIGALTSTACK = "0" HAVE_SIGFILLSET = "0" HAVE_SIGINFO_T_SI_BAND = "0" HAVE_SIGINTERRUPT = "0" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "0" HAVE_SIGRELSE = "0" HAVE_SIGTIMEDWAIT = "0" HAVE_SIGWAIT = "0" HAVE_SIGWAITINFO = "0" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "0" HAVE_SOCKADDR_SA_LEN = "0" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "0" HAVE_SPAWN_H = "0" HAVE_SSIZE_T = "1" HAVE_STATVFS = "0" HAVE_STAT_TV_NSEC = "0" HAVE_STAT_TV_NSEC2 = "0" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDIO_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "0" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "0" HAVE_STRUCT_PASSWD_PW_GECOS = "0" HAVE_STRUCT_PASSWD_PW_PASSWD = "0" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "0" HAVE_STRUCT_STAT_ST_BLOCKS = "0" HAVE_STRUCT_STAT_ST_FLAGS = "0" HAVE_STRUCT_STAT_ST_GEN = "0" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "0" HAVE_SYMLINK = "0" HAVE_SYMLINKAT = "0" HAVE_SYNC = "0" HAVE_SYSCONF = "0" HAVE_SYSEXITS_H = "0" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "0" HAVE_SYS_EPOLL_H = "0" HAVE_SYS_EVENT_H = "0" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "0" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "0" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "0" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "0" HAVE_SYS_RANDOM_H = "0" HAVE_SYS_RESOURCE_H = "0" HAVE_SYS_SELECT_H = "0" HAVE_SYS_SENDFILE_H = "0" HAVE_SYS_SOCKET_H = "0" HAVE_SYS_STATVFS_H = "0" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "0" HAVE_SYS_SYSMACROS_H = "0" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "0" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "0" HAVE_SYS_UN_H = "0" HAVE_SYS_UTSNAME_H = "0" HAVE_SYS_WAIT_H = "0" HAVE_SYS_XATTR_H = "0" HAVE_TCGETPGRP = "0" HAVE_TCSETPGRP = "0" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "0" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_THREAD_H = "0" HAVE_TIMEGM = "0" HAVE_TIMES = "0" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "0" HAVE_TM_ZONE = "0" HAVE_TRUNCATE = "0" HAVE_TZNAME = "1" HAVE_UCS4_TCL = "0" HAVE_UNAME = "0" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "0" HAVE_USABLE_WCHAR_T = "1" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "0" HAVE_UTIMES = "0" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "0" HAVE_UUID_ENC_BE = "0" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_H = "0" HAVE_UUID_UUID_H = "0" HAVE_WAIT3 = "0" HAVE_WAIT4 = "0" HAVE_WAITID = "0" HAVE_WAITPID = "0" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "0" HAVE_WRITEV = "0" HAVE_WS2TCPIP_H = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "x86_64-w64-mingw32" INCLDIRSTOMAKE = "C:/msys64/mingw64/include C:/msys64/mingw64/include C:/msys64/mingw64/include/python3.9 C:/msys64/mingw64/include/python3.9" INCLUDEDIR = "C:/msys64/mingw64/include" INCLUDEPY = "C:/msys64/mingw64/include/python3.9" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "/usr/bin/install -c -m 644" INSTALL_PROGRAM = "/usr/bin/install -c" INSTALL_SCRIPT = "/usr/bin/install -c" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.9.dll.a" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "g++ -shared -Wl,--enable-auto-image-base" LDFLAGS = "-pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high -pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.9.dll.a" LDLIBRARYDIR = "" LDSHARED = "gcc -shared -Wl,--enable-auto-image-base -pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high -pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high" LDVERSION = "3.9" LIBC = "" LIBDEST = "C:/msys64/mingw64/lib/python3.9" LIBDIR = "C:/msys64/mingw64/lib" LIBFFI_INCLUDEDIR = "C:/a/msys64/mingw64/include" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "C:/msys64/mingw64/lib/pkgconfig" LIBPL = "C:/msys64/mingw64/lib/python3.9/config-3.9" LIBPYTHON = "-lpython3.9" LIBRARY = "libpython3.9.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lm -lversion -lshlwapi" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "gcc" LINKFORSHARED = "-Wl,--stack,2000000" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "true" LN = "ln" LOCALMODLIBS = "-lws2_32" MACHDEP = "win32" MACHDEP_OBJS = "PC/dl_nt.o" MACHDESTLIB = "C:/msys64/mingw64/lib/python3.9" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "gcc" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "../Python-3.9.7/Modules/makesetup" MANDIR = "C:/msys64/mingw64/share/man" MKDIR_P = "/usr/bin/mkdir -p" MODBUILT_NAMES = "nt winreg msvcrt _winapi errno _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _peg_parser _symtable xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "-lws2_32" MODOBJS = "Modules/posixmodule.o Modules/winreg.o Modules/msvcrtmodule.o Modules/_winapi.o Modules/errnomodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/winconsoleio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/_peg_parser.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "" MULTIARCH_CPPFLAGS = "" MVWDELCH_IS_EXPRESSION = "1" NCURSESW_INCLUDEDIR = "C:/a/msys64/mingw64/include/ncursesw" NO_AS_NEEDED = "-Wl,--no-as-needed" NT_THREADS = "1" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "-IC:/a/msys64/mingw64/include" OPENSSL_LDFLAGS = "-LC:/a/msys64/mingw64/lib" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG -g -fwrapv -O3 -Wall" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "-fprofile-generate" PGO_PROF_USE_FLAG = "-fprofile-use -fprofile-correction" PLATLIBDIR = "lib" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "1" PROFILE_TASK = "-m test --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "0" PTHREAD_SYSTEM_SCHED_SUPPORTED = "0" PURIFY = "" PY3LIBRARY = "" PYD_PLATFORM_TAG = "mingw_x86_64" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python.exe" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python.exe -E" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha256,sha512,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O2 -pipe -march=x86-64 -mtune=generic -O2 -pipe -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -D_WIN32_WINNT=0x0601 -DMS_DLL_ID='"3.9"' -fprofile-use -fprofile-correction -I../Python-3.9.7/Include/internal -IObjects -IInclude -IPython -I. -I../Python-3.9.7/Include -I../Python-3.9.7/PC -D__USE_MINGW_ANSI_STDIO=1 -I. -D__USE_MINGW_ANSI_STDIO=1 -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O2 -pipe -march=x86-64 -mtune=generic -O2 -pipe" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -D_WIN32_WINNT=0x0601 -DMS_DLL_ID='"3.9"' -fprofile-use -fprofile-correction -I../Python-3.9.7/Include/internal" PY_COERCE_C_LOCALE = "0" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O2 -pipe -march=x86-64 -mtune=generic -O2 -pipe -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -D_WIN32_WINNT=0x0601 -DMS_DLL_ID='"3.9"' -fprofile-use -fprofile-correction -I../Python-3.9.7/Include/internal -IObjects -IInclude -IPython -I. -I../Python-3.9.7/Include -I../Python-3.9.7/PC -D__USE_MINGW_ANSI_STDIO=1 -I. -D__USE_MINGW_ANSI_STDIO=1 -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high -pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high" PY_CPPFLAGS = "-IObjects -IInclude -IPython -I. -I../Python-3.9.7/Include -I../Python-3.9.7/PC -D__USE_MINGW_ANSI_STDIO=1 -I. -D__USE_MINGW_ANSI_STDIO=1" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high -pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O2 -pipe -march=x86-64 -mtune=generic -O2 -pipe -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -D_WIN32_WINNT=0x0601 -DMS_DLL_ID='"3.9"' -fprofile-use -fprofile-correction -I../Python-3.9.7/Include/internal -IObjects -IInclude -IPython -I. -I../Python-3.9.7/Include -I../Python-3.9.7/PC -D__USE_MINGW_ANSI_STDIO=1 -I. -D__USE_MINGW_ANSI_STDIO=1" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" RCFLAGS = "-DFIELD3=7150 -O COFF --target=pe-x86-64" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "" SCRIPTDIR = "C:/msys64/mingw64/lib" SETPGRP_HAVE_ARG = "0" SGI_ABI = "@SGI_ABI@" SHELL = "/bin/sh" SHLIBS = "-lm -lversion -lshlwapi" SHLIB_SUFFIX = ".pyd" SHM_NEEDS_LIBRT = "0" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "8" SIZEOF_INT = "4" SIZEOF_LONG = "4" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "8" SIZEOF_PTHREAD_KEY_T = "0" SIZEOF_PTHREAD_T = "0" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "2" SIZEOF__BOOL = "1" SO = ".cp39-mingw_x86_64.pyd" SOABI = "cpython-39" SRCDIRS = "Parser Parser/pegen Objects Python Modules Modules/_io Programs PC" SRC_GDB_HOOKS = "../Python-3.9.7/Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "0" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "./python.exe" TESTPYTHONOPTS = "" TESTRUNNER = "./python.exe ../Python-3.9.7/Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" TZPATH = "C:/msys64/mingw64/share/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3.9 ../Python-3.9.7/Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VENVLAUNCHERDIR = "/mingw64/lib/python3.9/venv/scripts/nt" VERSION = "3.9" VPATH = "C:/M/mingw-w64-python/src/Python-3.9.7" VPATH_b2h = "C:/M/mingw-w64-python/src/Python-3.9.7" WINDOW_HAS_FLAGS = "1" WINDRES = "windres" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "0" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "C:/M/mingw-w64-python/src/build-x86_64" abs_builddir_b2h = "C:/M/mingw-w64-python/src/build-x86_64" abs_srcdir = "C:/M/mingw-w64-python/src/Python-3.9.7" abs_srcdir_b2h = "C:/M/mingw-w64-python/src/Python-3.9.7" base = "C:/msys64/mingw64" datarootdir = "C:/msys64/mingw64/share" exec_prefix = "C:/msys64/mingw64" installed_base = "C:/msys64/mingw64" installed_platbase = "C:/msys64/mingw64" platbase = "C:/msys64/mingw64" platlibdir = "lib" prefix = "C:/a/msys64/mingw64" prefix_b2h = "C:/a/msys64/mingw64" projectbase = "C:/msys64/mingw64/bin" py_version = "3.9.7" py_version_nodot = "39" py_version_short = "3.9" srcdir = "C:/msys64/mingw64/lib/python3.9/config-3.9" srcdir_b2h = "C:/M/mingw-w64-python/src/Python-3.9.7" userbase = "C:/Users/user/.local" maturin-1.16.0/sysconfig/graalpy-macos-3.8-arm64.txt000066400000000000000000000103131527064705700220320ustar00rootroot00000000000000Platform: "darwin-22.3.0-arm64" Python version: "3.8" Current installation scheme: "graalpy" Paths: data = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python" include = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python/include" platinclude = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python/include" platlib = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python/lib/python3.8/site-packages" platstdlib = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python/lib-python/3" purelib = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python/lib/python3.8/site-packages" scripts = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python/bin" stdlib = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python/lib-python/3" Variables: ABIFLAGS = "" AR = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/llvm/native/bin/ar" ARFLAGS = "rc" CC = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/llvm/native/bin/graalvm-native-clang" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-command-line-argument -stdlib=libc++ -DNDEBUG -DGRAALVM_PYTHON_LLVM -D_GNU_SOURCE=1" CFLAGS_DEFAULT = "-Wno-unused-command-line-argument -stdlib=libc++ -DNDEBUG -DGRAALVM_PYTHON_LLVM" CONFINCLUDEPY = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python/include" CPPFLAGS = "-I. -I/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python/include" CXX = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/llvm/native/bin/graalvm-native-clang++" EXE = "" EXT_SUFFIX = ".graalpy-38-native-aarch64-darwin.dylib" INCLUDEPY = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python/include" LD = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/llvm/native/bin/graalvm-native-ld" LDFLAGS = "-bundle -undefined dynamic_lookup" LDLIBRARY = "libpython.graalpy-38-native-aarch64-darwin.dylib" LDSHARED = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/llvm/native/bin/graalvm-native-clang -bundle -undefined dynamic_lookup" LDSHARED_LINUX = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/llvm/native/bin/graalvm-native-clang -shared -fPIC" LIBDIR = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python/lib-graalpython" MULTIARCH = "aarch64-darwin" NM = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/llvm/native/bin/nm" OPT = "-stdlib=libc++ -DNDEBUG" Py_DEBUG = "0" Py_ENABLE_SHARED = "0" Py_HASH_ALGORITHM = "0" RANLIB = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/llvm/native/bin/ranlib" SHLIB_SUFFIX = ".dylib" SO = ".graalpy-38-native-aarch64-darwin.dylib" SOABI = "graalpy-38-native-aarch64-darwin" USE_GNU_SOURCE = "-D_GNU_SOURCE=1" VERSION = "3.8" abiflags = "" base = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python" exec_prefix = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python" installed_base = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python" installed_platbase = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python" platbase = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python" prefix = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python" projectbase = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python/bin" py_version = "3.8.5" py_version_nodot = "38" py_version_short = "3.8" srcdir = "/Library/Java/JavaVirtualMachines/graalvm-ce-java19-22.3.1/Contents/Home/languages/python/lib-python/3/config-3.8-aarch64-darwin" userbase = "/Users/messense/.local"maturin-1.16.0/sysconfig/nogil-linux-3.9.txt000066400000000000000000000513231527064705700206200ustar00rootroot00000000000000Platform: "linux-x86_64" Python version: "3.9" Current installation scheme: "posix_prefix" Paths: data = "/usr/local" include = "/usr/local/include/python3.9" platinclude = "/usr/local/include/python3.9" platlib = "/usr/local/lib/python3.9/site-packages" platstdlib = "/usr/local/lib/python3.9" purelib = "/usr/local/lib/python3.9/site-packages" scripts = "/usr/local/bin" stdlib = "/usr/local/lib/python3.9" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_BUILDDATE = "0" AIX_GENUINE_CPLUSPLUS = "0" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare" BASECPPFLAGS = "" BASEMODLIBS = "" BINDIR = "/usr/local/bin" BINLIBDEST = "/usr/local/lib/python3.9" BLDLIBRARY = "-L. -lpython3.9" BLDSHARED = "gcc -pthread -shared" BUILDEXE = "" BUILDPYTHON = "python" BUILD_GNU_TYPE = "x86_64-pc-linux-gnu" BYTESTR_DEPS = "\" CC = "gcc -pthread" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "" CONFIGURE_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden" CONFIGURE_CPPFLAGS = "" CONFIGURE_LDFLAGS = "" CONFIGURE_LDFLAGS_NODIST = "" CONFIG_ARGS = "'--build=x86_64-linux-gnu' '--enable-loadable-sqlite-extensions' '--enable-optimizations' '--enable-option-checking=fatal' '--enable-shared' '--with-system-expat' '--with-system-ffi' 'build_alias=x86_64-linux-gnu'" CONFINCLUDEDIR = "/usr/local/include" CONFINCLUDEPY = "/usr/local/include/python3.9" COREPYTHONPATH = "" COVERAGE_INFO = "/usr/src/python/coverage.info" COVERAGE_REPORT = "/usr/src/python/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-I. -I./Include" CXX = "g++ -pthread" DESTDIRS = "/usr/local /usr/local/lib /usr/local/lib/python3.9 /usr/local/lib/python3.9/lib-dynload" DESTLIB = "/usr/local/lib/python3.9" DESTPATH = "" DESTSHARED = "/usr/local/lib/python3.9/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "upgrade" EXE = "" EXEMODE = "755" EXPORTSFROM = "" EXPORTSYMS = "" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".nogil-39b-x86_64-linux-gnu.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GITBRANCH = "" GITTAG = "" GITVERSION = "" GNULD = "yes" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "1" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "1" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "1" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "0" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "1" HAVE_CRYPT_H = "1" HAVE_CRYPT_R = "1" HAVE_CTERMID = "1" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "1" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "1" HAVE_EPOLL_CREATE1 = "1" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "1" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "1" HAVE_GCC_ASM_FOR_X87 = "1" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "1" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETSID = "1" HAVE_GETSPENT = "1" HAVE_GETSPNAM = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "0" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "0" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "0" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "0" HAVE_LIBUUID = "1" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "1" HAVE_LINUX_CAN_H = "1" HAVE_LINUX_CAN_J1939_H = "1" HAVE_LINUX_CAN_RAW_FD_FRAMES = "1" HAVE_LINUX_CAN_RAW_H = "1" HAVE_LINUX_CAN_RAW_JOIN_FILTERS = "1" HAVE_LINUX_MEMFD_H = "1" HAVE_LINUX_NETLINK_H = "1" HAVE_LINUX_QRTR_H = "1" HAVE_LINUX_RANDOM_H = "1" HAVE_LINUX_TIPC_H = "1" HAVE_LINUX_VM_SOCKETS_H = "1" HAVE_LINUX_WAIT_H = "1" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "1" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "1" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "1" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION = "0" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "1" HAVE_PRLIMIT = "1" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "1" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "1" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_CLOCKWAIT = "1" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "1" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "1" HAVE_SOCKADDR_SA_LEN = "0" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "0" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "0" HAVE_STROPTS_H = "0" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "0" HAVE_STRUCT_STAT_ST_GEN = "0" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "0" HAVE_SYS_EPOLL_H = "1" HAVE_SYS_EVENT_H = "0" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "0" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "1" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "1" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "1" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "1" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "0" HAVE_UUID_ENC_BE = "0" HAVE_UUID_GENERATE_TIME_SAFE = "1" HAVE_UUID_H = "0" HAVE_UUID_UUID_H = "1" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "x86_64-pc-linux-gnu" INCLDIRSTOMAKE = "/usr/local/include /usr/local/include /usr/local/include/python3.9 /usr/local/include/python3.9" INCLUDEDIR = "/usr/local/include" INCLUDEPY = "/usr/local/include/python3.9" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "/usr/bin/install -c -m 644" INSTALL_PROGRAM = "/usr/bin/install -c" INSTALL_SCRIPT = "/usr/bin/install -c" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.9.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "g++ -pthread -shared" LDFLAGS = "" LDLIBRARY = "libpython3.9.so" LDLIBRARYDIR = "" LDSHARED = "gcc -pthread -shared" LDVERSION = "3.9" LIBC = "" LIBDEST = "/usr/local/lib/python3.9" LIBDIR = "/usr/local/lib" LIBFFI_INCLUDEDIR = "" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/local/lib/pkgconfig" LIBPL = "/usr/local/lib/python3.9/config-3.9-x86_64-linux-gnu" LIBPYTHON = "" LIBRARY = "libpython3.9.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lcrypt -lpthread -ldl -lutil -lm" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "gcc -pthread" LINKFORSHARED = "-Xlinker -export-dynamic" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "true" LN = "ln" LOCALMODLIBS = "" MACHDEP = "linux" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/local/lib/python3.9" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "gcc -pthread" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "1" MAKESETUP = "./Modules/makesetup" MANDIR = "/usr/local/share/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _peg_parser _symtable xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/_peg_parser.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "x86_64-linux-gnu" MULTIARCH_CPPFLAGS = "-DMULTIARCH=\"x86_64-linux-gnu\"" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "" OPENSSL_LDFLAGS = "" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG -g -fwrapv -O3 -Wall" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ \ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PEGEN_HEADERS = "\" PEGEN_OBJS = "\" PGO_PROF_GEN_FLAG = "-fprofile-generate" PGO_PROF_USE_FLAG = "-fprofile-use -fprofile-correction" PLATLIBDIR = "lib" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "-m test --pgo" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpython3.so" PYLONG_BITS_IN_DIGIT = "0" PYTHON = "python" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./python -E" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_HASHLIB_HASHES = ""md5,sha1,sha256,sha512,sha3,blake2"" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -fprofile-use -fprofile-correction -std=gnu11 -I./Include/internal -I./Include/mimalloc -I. -I./Include -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall" PY_CFLAGS_NODIST = "-std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -fprofile-use -fprofile-correction -std=gnu11 -I./Include/internal -I./Include/mimalloc" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -fprofile-use -fprofile-correction -std=gnu11 -I./Include/internal -I./Include/mimalloc -I. -I./Include -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "" PY_CPPFLAGS = "-I. -I./Include" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "" PY_LDFLAGS_NODIST = "" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -fprofile-use -fprofile-correction -std=gnu11 -I./Include/internal -I./Include/mimalloc -I. -I./Include -fPIC" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/usr/src/python" SCRIPTDIR = "/usr/local/lib" SETPGRP_HAVE_ARG = "0" SHELL = "/bin/sh" SHLIBS = "-lcrypt -lpthread -ldl -lutil -lm" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "1" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "16" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".nogil-39b-x86_64-linux-gnu.so" SOABI = "nogil-39b-x86_64-linux-gnu" SRCDIRS = "Parser Parser/pegen Objects Objects/mimalloc Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "./Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/usr/src/python ./python" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/usr/src/python ./python ./Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3.9 ./Tools/scripts/update_file.py" USE_COMPUTED_GOTOS = "0" VERSION = "3.9" WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "0" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/usr/src/python" abs_srcdir = "/usr/src/python" base = "/usr/local" datarootdir = "/usr/local/share" exec_prefix = "/usr/local" installed_base = "/usr/local" installed_platbase = "/usr/local" platbase = "/usr/local" platlibdir = "lib" prefix = "/usr/local" projectbase = "/usr/local/bin" py_version = "3.9.10" py_version_nodot = "39" py_version_short = "3.9" srcdir = "/usr/local/lib/python3.9/config-3.9-x86_64-linux-gnu" userbase = "/root/.local" maturin-1.16.0/sysconfig/pypy-linux-3.7-7.3.txt000066400000000000000000000040621527064705700210120ustar00rootroot00000000000000Platform: "linux-x86_64" Python version: "3.7" Current installation scheme: "pypy" Paths: data = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3" include = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3/include" platinclude = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3/include" platlib = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3/site-packages" platstdlib = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3/lib-pypy" purelib = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3/site-packages" scripts = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3/bin" stdlib = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3/lib-pypy" Variables: AR = "ar" ARFLAGS = "rc" CC = "gcc -pthread" CCSHARED = "-fPIC" CFLAGS = "-DNDEBUG -O2" CXX = "g++ -pthread" EXE = "" EXT_SUFFIX = ".pypy37-pp73-x86_64-linux-gnu.so" GNULD = "yes" INCLUDEPY = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3/include" LDSHARED = "gcc -pthread -shared" LIBDIR = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3/bin" LIBRARY = "" OPT = "-DNDEBUG -O2" SHLIB_SUFFIX = ".so" SO = ".pypy37-pp73-x86_64-linux-gnu.so" SOABI = "pypy37-pp73" abiflags = "" base = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3" exec_prefix = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3" implementation = "PyPy" implementation_lower = "pypy" installed_base = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3" installed_platbase = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3" platbase = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3" prefix = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3" projectbase = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3/bin" py_version = "3.7.9" py_version_nodot = "37" py_version_short = "3.7" srcdir = "/home/konsti/.pyenv/versions/pypy3.7-7.3.3/lib-pypy/config-3.7" userbase = "/home/konsti/.local" User: data = "/home/konsti/.local" include = "/home/konsti/.local/include/pypy3.7" platlib = "/home/konsti/.local/lib/pypy3.7/site-packages" platstdlib = "/home/konsti/.local/lib/pypy3.7" purelib = "/home/konsti/.local/lib/pypy3.7/site-packages" scripts = "/home/konsti/.local/bin" stdlib = "/home/konsti/.local/lib/pypy3.7" maturin-1.16.0/sysconfig/pypy-linux-ppc64le-3.7-7.3.txt000066400000000000000000000033711527064705700222670ustar00rootroot00000000000000Platform: "linux-ppc64le" Python version: "3.7" Current installation scheme: "pypy" Paths: data = "/usr/lib64/pypy3.7" include = "/usr/lib64/pypy3.7/include" platinclude = "/usr/lib64/pypy3.7/include" platlib = "/usr/lib64/pypy3.7/site-packages" platstdlib = "/usr/lib64/pypy3.7/lib_pypy" purelib = "/usr/lib64/pypy3.7/site-packages" scripts = "/usr/lib64/pypy3.7/bin" stdlib = "/usr/lib64/pypy3.7/lib_pypy" Variables: ABIFLAGS = "" AR = "ar" ARFLAGS = "rc" CC = "cc -pthread" CCSHARED = "-fPIC" CFLAGS = "-DNDEBUG -O2" CXX = "c++ -pthread" EXE = "" EXT_SUFFIX = ".pypy37-pp73-ppc_64-linux-gnu.so" INCLUDEPY = "/usr/lib64/pypy3.7/include" LDLIBRARY = "libpypy3-c.so" LDSHARED = "cc -pthread -shared" LDVERSION = "3.7" LIBDIR = "/usr/lib64/pypy3.7/bin" LIBRARY = "" MULTIARCH = "ppc_64-linux-gnu" OPT = "-DNDEBUG -O2" Py_DEBUG = "0" Py_ENABLE_SHARED = "0" SHLIB_SUFFIX = ".so" SIZEOF_VOID_P = "8" SO = ".pypy37-pp73-ppc_64-linux-gnu.so" SOABI = "pypy37-pp73" VERSION = "3.7" abiflags = "" base = "/usr/lib64/pypy3.7" exec_prefix = "/usr/lib64/pypy3.7" implementation = "PyPy" implementation_lower = "pypy" installed_base = "/usr/lib64/pypy3.7" installed_platbase = "/usr/lib64/pypy3.7" platbase = "/usr/lib64/pypy3.7" prefix = "/usr/lib64/pypy3.7" projectbase = "/usr/lib64/pypy3.7/bin" py_version = "3.7.13" py_version_nodot = "37" py_version_short = "3.7" srcdir = "/usr/lib64/pypy3.7/lib_pypy/config-3.7-ppc_64-linux-gnu" userbase = "/root/.local" User: data = "/root/.local" include = "/root/.local/include/pypy3.7" platlib = "/root/.local/lib/pypy3.7/site-packages" platstdlib = "/root/.local/lib/pypy3.7" purelib = "/root/.local/lib/pypy3.7/site-packages" scripts = "/root/.local/bin" stdlib = "/root/.local/lib/pypy3.7" maturin-1.16.0/sysconfig/pypy-linux-ppc64le-3.8-7.3.txt000066400000000000000000000035251527064705700222710ustar00rootroot00000000000000Platform: "linux-ppc64le" Python version: "3.8" Current installation scheme: "posix_prefix" Paths: data = "/usr/lib64/pypy3.8" include = "/usr/lib64/pypy3.8/include/pypy3.8" platinclude = "/usr/lib64/pypy3.8/include/pypy3.8" platlib = "/usr/lib64/pypy3.8/lib/pypy3.8/site-packages" platstdlib = "/usr/lib64/pypy3.8/lib/pypy3.8" purelib = "/usr/lib64/pypy3.8/lib/pypy3.8/site-packages" scripts = "/usr/lib64/pypy3.8/bin" stdlib = "/usr/lib64/pypy3.8/lib/pypy3.8" Variables: ABIFLAGS = "" AR = "ar" ARFLAGS = "rc" CC = "cc -pthread" CCSHARED = "-fPIC" CFLAGS = "-DNDEBUG -O2" CXX = "c++ -pthread" EXE = "" EXT_SUFFIX = ".pypy38-pp73-ppc_64-linux-gnu.so" INCLUDEPY = "/usr/lib64/pypy3.8/include/pypy3.8" LDFLAGS = "-Wl,-Bsymbolic-functions" LDLIBRARY = "libpypy3-c.so" LDSHARED = "cc -pthread -shared -Wl,-Bsymbolic-functions" LDVERSION = "3.8" LIBDIR = "/usr/lib64/pypy3.8/bin" LIBRARY = "" MULTIARCH = "ppc_64-linux-gnu" OPT = "-DNDEBUG -O2" Py_DEBUG = "0" Py_ENABLE_SHARED = "0" SHLIB_SUFFIX = ".so" SIZEOF_VOID_P = "8" SO = ".pypy38-pp73-ppc_64-linux-gnu.so" SOABI = "pypy38-pp73" VERSION = "3.8" abiflags = "" base = "/usr/lib64/pypy3.8" exec_prefix = "/usr/lib64/pypy3.8" implementation = "PyPy" implementation_lower = "pypy" installed_base = "/usr/lib64/pypy3.8" installed_platbase = "/usr/lib64/pypy3.8" platbase = "/usr/lib64/pypy3.8" prefix = "/usr/lib64/pypy3.8" projectbase = "/usr/lib64/pypy3.8/bin" py_version = "3.8.13" py_version_nodot = "38" py_version_short = "3.8" srcdir = "/usr/lib64/pypy3.8/bin" userbase = "/root/.local" User: data = "/root/.local" include = "/root/.local/include/pypy3.8" platlib = "/root/.local/lib/pypy3.8/site-packages" platstdlib = "/root/.local/lib/pypy3.8" purelib = "/root/.local/lib/pypy3.8/site-packages" scripts = "/root/.local/bin" stdlib = "/root/.local/lib/pypy3.8" maturin-1.16.0/sysconfig/pypy-linux-ppc64le-3.9-7.3.txt000066400000000000000000000033341527064705700222700ustar00rootroot00000000000000Platform: "linux-ppc64le" Python version: "3.9" Current installation scheme: "posix_prefix" Paths: data = "/usr" include = "/usr/include/pypy3.9" platinclude = "/usr/include/pypy3.9" platlib = "/usr/lib64/pypy3.9/site-packages" platstdlib = "/usr/lib64/pypy3.9" purelib = "/usr/lib/pypy3.9/site-packages" scripts = "/usr/bin" stdlib = "/usr/lib64/pypy3.9" Variables: ABIFLAGS = "" AR = "ar" ARFLAGS = "rc" CC = "cc -pthread" CCSHARED = "-fPIC" CFLAGS = "-DNDEBUG -O2" CXX = "c++ -pthread" EXE = "" EXT_SUFFIX = ".pypy39-pp73-ppc_64-linux-gnu.so" INCLUDEPY = "/usr/include/pypy3.9" LDFLAGS = "-Wl,-Bsymbolic-functions" LDLIBRARY = "libpypy3.9-c.so" LDSHARED = "cc -pthread -shared -Wl,-Bsymbolic-functions" LDVERSION = "3.9" LIBDIR = "/usr/bin" LIBRARY = "" MULTIARCH = "ppc_64-linux-gnu" OPT = "-DNDEBUG -O2" Py_DEBUG = "0" Py_ENABLE_SHARED = "0" SHLIB_SUFFIX = ".so" SIZEOF_VOID_P = "8" SO = ".pypy39-pp73-ppc_64-linux-gnu.so" SOABI = "pypy39-pp73" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/usr/../etc/zoneinfo" VERSION = "3.9" abiflags = "" base = "/usr" exec_prefix = "/usr" implementation = "PyPy" implementation_lower = "pypy" installed_base = "/usr" installed_platbase = "/usr" platbase = "/usr" platlibdir = "lib64" prefix = "/usr" projectbase = "/usr/bin" py_version = "3.9.12" py_version_nodot = "39" py_version_short = "3.9" srcdir = "/usr/bin" userbase = "/root/.local" User: data = "/root/.local" include = "/root/.local/include/pypy3.9" platlib = "/root/.local/lib64/pypy3.9/site-packages" platstdlib = "/root/.local/lib64/pypy3.9" purelib = "/root/.local/lib/pypy3.9/site-packages" scripts = "/root/.local/bin" stdlib = "/root/.local/lib64/pypy3.9" maturin-1.16.0/sysconfig/pypy-linux-s390x-3.7-7.3.txt000066400000000000000000000033631527064705700217010ustar00rootroot00000000000000Platform: "linux-s390x" Python version: "3.7" Current installation scheme: "pypy" Paths: data = "/usr/lib64/pypy3.7" include = "/usr/lib64/pypy3.7/include" platinclude = "/usr/lib64/pypy3.7/include" platlib = "/usr/lib64/pypy3.7/site-packages" platstdlib = "/usr/lib64/pypy3.7/lib_pypy" purelib = "/usr/lib64/pypy3.7/site-packages" scripts = "/usr/lib64/pypy3.7/bin" stdlib = "/usr/lib64/pypy3.7/lib_pypy" Variables: ABIFLAGS = "" AR = "ar" ARFLAGS = "rc" CC = "cc -pthread" CCSHARED = "-fPIC" CFLAGS = "-DNDEBUG -O2" CXX = "c++ -pthread" EXE = "" EXT_SUFFIX = ".pypy37-pp73-s390x-linux-gnu.so" INCLUDEPY = "/usr/lib64/pypy3.7/include" LDLIBRARY = "libpypy3-c.so" LDSHARED = "cc -pthread -shared" LDVERSION = "3.7" LIBDIR = "/usr/lib64/pypy3.7/bin" LIBRARY = "" MULTIARCH = "s390x-linux-gnu" OPT = "-DNDEBUG -O2" Py_DEBUG = "0" Py_ENABLE_SHARED = "0" SHLIB_SUFFIX = ".so" SIZEOF_VOID_P = "8" SO = ".pypy37-pp73-s390x-linux-gnu.so" SOABI = "pypy37-pp73" VERSION = "3.7" abiflags = "" base = "/usr/lib64/pypy3.7" exec_prefix = "/usr/lib64/pypy3.7" implementation = "PyPy" implementation_lower = "pypy" installed_base = "/usr/lib64/pypy3.7" installed_platbase = "/usr/lib64/pypy3.7" platbase = "/usr/lib64/pypy3.7" prefix = "/usr/lib64/pypy3.7" projectbase = "/usr/lib64/pypy3.7/bin" py_version = "3.7.13" py_version_nodot = "37" py_version_short = "3.7" srcdir = "/usr/lib64/pypy3.7/lib_pypy/config-3.7-s390x-linux-gnu" userbase = "/root/.local" User: data = "/root/.local" include = "/root/.local/include/pypy3.7" platlib = "/root/.local/lib/pypy3.7/site-packages" platstdlib = "/root/.local/lib/pypy3.7" purelib = "/root/.local/lib/pypy3.7/site-packages" scripts = "/root/.local/bin" stdlib = "/root/.local/lib/pypy3.7" maturin-1.16.0/sysconfig/pypy-linux-s390x-3.8-7.3.txt000066400000000000000000000035201527064705700216750ustar00rootroot00000000000000Platform: "linux-s390x" Python version: "3.8" Current installation scheme: "posix_prefix" Paths: data = "/usr/lib64/pypy3.8" include = "/usr/lib64/pypy3.8/include/pypy3.8" platinclude = "/usr/lib64/pypy3.8/include/pypy3.8" platlib = "/usr/lib64/pypy3.8/lib/pypy3.8/site-packages" platstdlib = "/usr/lib64/pypy3.8/lib/pypy3.8" purelib = "/usr/lib64/pypy3.8/lib/pypy3.8/site-packages" scripts = "/usr/lib64/pypy3.8/bin" stdlib = "/usr/lib64/pypy3.8/lib/pypy3.8" Variables: ABIFLAGS = "" AR = "ar" ARFLAGS = "rc" CC = "cc -pthread" CCSHARED = "-fPIC" CFLAGS = "-DNDEBUG -O2" CXX = "c++ -pthread" EXE = "" EXT_SUFFIX = ".pypy38-pp73-s390x-linux-gnu.so" INCLUDEPY = "/usr/lib64/pypy3.8/include/pypy3.8" LDFLAGS = "-Wl,-Bsymbolic-functions" LDLIBRARY = "libpypy3-c.so" LDSHARED = "cc -pthread -shared -Wl,-Bsymbolic-functions" LDVERSION = "3.8" LIBDIR = "/usr/lib64/pypy3.8/bin" LIBRARY = "" MULTIARCH = "s390x-linux-gnu" OPT = "-DNDEBUG -O2" Py_DEBUG = "0" Py_ENABLE_SHARED = "0" SHLIB_SUFFIX = ".so" SIZEOF_VOID_P = "8" SO = ".pypy38-pp73-s390x-linux-gnu.so" SOABI = "pypy38-pp73" VERSION = "3.8" abiflags = "" base = "/usr/lib64/pypy3.8" exec_prefix = "/usr/lib64/pypy3.8" implementation = "PyPy" implementation_lower = "pypy" installed_base = "/usr/lib64/pypy3.8" installed_platbase = "/usr/lib64/pypy3.8" platbase = "/usr/lib64/pypy3.8" prefix = "/usr/lib64/pypy3.8" projectbase = "/usr/lib64/pypy3.8/bin" py_version = "3.8.13" py_version_nodot = "38" py_version_short = "3.8" srcdir = "/usr/lib64/pypy3.8/bin" userbase = "/root/.local" User: data = "/root/.local" include = "/root/.local/include/pypy3.8" platlib = "/root/.local/lib/pypy3.8/site-packages" platstdlib = "/root/.local/lib/pypy3.8" purelib = "/root/.local/lib/pypy3.8/site-packages" scripts = "/root/.local/bin" stdlib = "/root/.local/lib/pypy3.8" maturin-1.16.0/sysconfig/pypy-linux-s390x-3.9-7.3.txt000066400000000000000000000033261527064705700217020ustar00rootroot00000000000000Platform: "linux-s390" Python version: "3.9" Current installation scheme: "posix_prefix" Paths: data = "/usr" include = "/usr/include/pypy3.9" platinclude = "/usr/include/pypy3.9" platlib = "/usr/lib64/pypy3.9/site-packages" platstdlib = "/usr/lib64/pypy3.9" purelib = "/usr/lib/pypy3.9/site-packages" scripts = "/usr/bin" stdlib = "/usr/lib64/pypy3.9" Variables: ABIFLAGS = "" AR = "ar" ARFLAGS = "rc" CC = "cc -pthread" CCSHARED = "-fPIC" CFLAGS = "-DNDEBUG -O2" CXX = "c++ -pthread" EXE = "" EXT_SUFFIX = ".pypy39-pp73-s390x-linux-gnu.so" INCLUDEPY = "/usr/include/pypy3.9" LDFLAGS = "-Wl,-Bsymbolic-functions" LDLIBRARY = "libpypy3.9-c.so" LDSHARED = "cc -pthread -shared -Wl,-Bsymbolic-functions" LDVERSION = "3.9" LIBDIR = "/usr/bin" LIBRARY = "" MULTIARCH = "s390x-linux-gnu" OPT = "-DNDEBUG -O2" Py_DEBUG = "0" Py_ENABLE_SHARED = "0" SHLIB_SUFFIX = ".so" SIZEOF_VOID_P = "8" SO = ".pypy39-pp73-s390x-linux-gnu.so" SOABI = "pypy39-pp73" TZPATH = "/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/usr/../etc/zoneinfo" VERSION = "3.9" abiflags = "" base = "/usr" exec_prefix = "/usr" implementation = "PyPy" implementation_lower = "pypy" installed_base = "/usr" installed_platbase = "/usr" platbase = "/usr" platlibdir = "lib64" prefix = "/usr" projectbase = "/usr/bin" py_version = "3.9.12" py_version_nodot = "39" py_version_short = "3.9" srcdir = "/usr/bin" userbase = "/root/.local" User: data = "/root/.local" include = "/root/.local/include/pypy3.9" platlib = "/root/.local/lib64/pypy3.9/site-packages" platstdlib = "/root/.local/lib64/pypy3.9" purelib = "/root/.local/lib/pypy3.9/site-packages" scripts = "/root/.local/bin" stdlib = "/root/.local/lib64/pypy3.9" maturin-1.16.0/sysconfig/pypy-macos-3.7-7.3.txt000066400000000000000000000043601527064705700207560ustar00rootroot00000000000000Platform: "macosx-10.7-x86_64" Python version: "3.7" Current installation scheme: "pypy" Paths: data = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5" include = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5/include" platinclude = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5/include" platlib = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5/site-packages" platstdlib = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5/lib-pypy" purelib = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5/site-packages" scripts = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5/bin" stdlib = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5/lib-pypy" Variables: AR = "ar" ARFLAGS = "rc" CC = "gcc -pthread -arch x86_64" CCSHARED = "-fPIC" CFLAGS = "-DNDEBUG -O2" CXX = "g++ -pthread -arch x86_64" EXE = "" EXT_SUFFIX = ".pypy37-pp73-darwin.so" GNULD = "yes" INCLUDEPY = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5/include" LDLIBRARY = "libpypy3-c.so" LDSHARED = "gcc -pthread -arch x86_64 -shared -undefined dynamic_lookup" LIBDIR = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5/bin" LIBRARY = "" MACOSX_DEPLOYMENT_TARGET = "10.7" OPT = "-DNDEBUG -O2" SHLIB_SUFFIX = ".so" SO = ".pypy37-pp73-darwin.so" SOABI = "pypy37-pp73" abiflags = "" base = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5" exec_prefix = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5" implementation = "PyPy" implementation_lower = "pypy" installed_base = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5" installed_platbase = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5" platbase = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5" prefix = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5" projectbase = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5/bin" py_version = "3.7.10" py_version_nodot = "37" py_version_short = "3.7" srcdir = "/Users/messense/.pyenv/versions/pypy3.7-7.3.5/lib-pypy/config-3.7" userbase = "/Users/messense/.local" User: data = "/Users/messense/.local" include = "/Users/messense/.local/include/pypy3.7" platlib = "/Users/messense/.local/lib/pypy3.7/site-packages" platstdlib = "/Users/messense/.local/lib/pypy3.7" purelib = "/Users/messense/.local/lib/pypy3.7/site-packages" scripts = "/Users/messense/.local/bin" stdlib = "/Users/messense/.local/lib/pypy3.7"maturin-1.16.0/sysconfig/pypy-windows-3.7-7.3.txt000066400000000000000000000056261527064705700213540ustar00rootroot00000000000000Platform: "win-amd64" Python version: "3.7" Current installation scheme: "pypy_nt" Paths: data = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64" include = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64\include" platinclude = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64\include" platlib = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64\site-packages" platstdlib = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64\lib-pypy" purelib = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64\site-packages" scripts = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64\Scripts" stdlib = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64\lib-pypy" Variables: BINDIR = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64" BINLIBDEST = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64\lib-pypy" EXE = ".exe" EXT_SUFFIX = ".pypy37-pp73-win_amd64.pyd" INCLUDEPY = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64\include" LIBDEST = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64\lib-pypy" LIBRARY = "" SO = ".pypy37-pp73-win_amd64.pyd" SOABI = "pypy37-pp73" VERSION = "37" abiflags = "" base = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64" exec_prefix = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64" implementation = "PyPy" implementation_lower = "pypy" installed_base = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64" installed_platbase = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64" platbase = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64" prefix = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64" projectbase = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64" py_version = "3.7.10" py_version_nodot = "37" py_version_short = "3.7" srcdir = "C:\Users\messense\Downloads\pypy3.7-v7.3.5-win64\pypy3.7-v7.3.5-win64" userbase = "C:\Users\messense\AppData\Roaming\PyPy" User: data = "C:\Users\messense\AppData\Roaming\PyPy" include = "C:\Users\messense\AppData\Roaming\PyPy\PyPy37\Include" platlib = "C:\Users\messense\AppData\Roaming\PyPy\PyPy37\site-packages" platstdlib = "C:\Users\messense\AppData\Roaming\PyPy\PyPy37" purelib = "C:\Users\messense\AppData\Roaming\PyPy\PyPy37\site-packages" scripts = "C:\Users\messense\AppData\Roaming\PyPy\PyPy37\Scripts" stdlib = "C:\Users\messense\AppData\Roaming\PyPy\PyPy37" maturin-1.16.0/sysconfig/pyston-3.8.txt000066400000000000000000000640721527064705700177130ustar00rootroot00000000000000Platform: "linux-x86_64" Python version: "3.8" Current installation scheme: "posix_prefix" Paths: data = "/root/pyston_2.3.5" include = "/root/pyston_2.3.5/include/python3.8-pyston2.3" platinclude = "/root/pyston_2.3.5/include/python3.8-pyston2.3" platlib = "/root/pyston_2.3.5/lib/python3.8-pyston2.3/site-packages" platstdlib = "/root/pyston_2.3.5/lib/python3.8-pyston2.3" purelib = "/root/pyston_2.3.5/lib/python3.8-pyston2.3/site-packages" scripts = "/root/pyston_2.3.5/bin" stdlib = "/root/pyston_2.3.5/lib/python3.8-pyston2.3" Variables: ABIFLAGS = "" AC_APPLE_UNIVERSAL_BUILD = "0" AIX_GENUINE_CPLUSPLUS = "0" ALT_SOABI = "0" ANDROID_API_LEVEL = "0" AOT_DIR = "../aot_pic" AR = "ar" ARFLAGS = "rcs" BASECFLAGS = "-Wno-unused-result -Wsign-compare" BASECPPFLAGS = "-IObjects -IInclude -IPython" BASEMODLIBS = "" BINDIR = "/usr/bin" BINLIBDEST = "/usr/lib/python3.8-pyston2.3" BLDLIBRARY = "-L. -lpython3.8-pyston2.3" BLDSHARED = "gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro" BUILDEXE = "" BUILDPYTHON = "pyston" BUILD_GNU_TYPE = "x86_64-pc-linux-gnu" BYTESTR_DEPS = "\" CC = "gcc -pthread" CCSHARED = "-fPIC" CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -g -O2 -fdebug-prefix-map=/src/build/pyston=. -fstack-protector-strong -Wformat -Werror=format-security -DENABLE_AOT -g -O2 -fdebug-prefix-map=/src/build/pyston=. -fstack-protector-strong -Wformat -Werror=format-security" CFLAGSFORSHARED = "-fPIC" CFLAGS_ALIASING = "" CFLAGS_NODIST = "" CLANG_RT_PROFILE = "$(shell /src/build/build/Release/llvm/bin/clang --print-resource-dir)/lib/linux/libclang_rt.profile-$(shell uname -m).a" CONFIGFILES = "configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" CONFIGURE_CFLAGS = "-g -O2 -fdebug-prefix-map=/src/build/pyston=. -fstack-protector-strong -Wformat -Werror=format-security -DENABLE_AOT" CONFIGURE_CFLAGS_NODIST = "-fstack-protector -specs=/src/build/pyston/tools/no-pie-compile.specs -D_FORTIFY_SOURCE=2 -fno-reorder-blocks-and-partition -fno-semantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration" CONFIGURE_CPPFLAGS = "-Wdate-time -D_FORTIFY_SOURCE=2" CONFIGURE_LDFLAGS = "-Wl,-Bsymbolic-functions -Wl,-z,relro" CONFIGURE_LDFLAGS_NODIST = "-specs=/src/build/pyston/tools/no-pie-link.specs -Wl,-z,relro -Wl,--emit-relocs -fno-semantic-interposition -fsemantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g" CONFIG_ARGS = "'--prefix=/usr' '--enable-optimizations' '--with-lto' '--disable-debugging-features' '--enable-shared' '--enable-configure' 'CFLAGS=-g -O2 -fdebug-prefix-map=/src/build/pyston=. -fstack-protector-strong -Wformat -Werror=format-security' 'LDFLAGS=-Wl,-Bsymbolic-functions -Wl,-z,relro' 'CPPFLAGS=-Wdate-time -D_FORTIFY_SOURCE=2' 'PROFILE_TASK=../../Lib/test/regrtest.py -j 0 -unone,decimal -x test_posix test_asyncio test_cmd_line_script test_compiler test_concurrent_futures test_ctypes test_dbm_dumb test_dbm_ndbm test_distutils test_ensurepip test_ftplib test_gdb test_httplib test_imaplib test_ioctl test_linuxaudiodev test_multiprocessing test_nntplib test_ossaudiodev test_poplib test_pydoc test_signal test_socket test_socketserver test_ssl test_subprocess test_sundry test_thread test_threaded_import test_threadedtempfile test_threading test_threading_local test_threadsignals test_venv test_zipimport_support || true'" CONFINCLUDEDIR = "/usr/include" CONFINCLUDEPY = "/usr/include/python3.8-pyston2.3" COREPYTHONPATH = "" COVERAGE_INFO = "/src/build/build/releaseshared_build/coverage.info" COVERAGE_REPORT = "/src/build/build/releaseshared_build/lcov-report" COVERAGE_REPORT_OPTIONS = "--no-branch-coverage --title "CPython lcov report"" CPPFLAGS = "-IObjects -IInclude -IPython -I. -I../../Include -Wdate-time -D_FORTIFY_SOURCE=2 -Wdate-time -D_FORTIFY_SOURCE=2" CXX = "g++ -pthread" DESTDIRS = "/usr /usr/lib /usr/lib/python3.8-pyston2.3 /usr/lib/python3.8-pyston2.3/lib-dynload" DESTLIB = "/usr/lib/python3.8-pyston2.3" DESTPATH = "" DESTSHARED = "/usr/lib/python3.8-pyston2.3/lib-dynload" DFLAGS = "" DIRMODE = "755" DIST = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in Include Lib Misc Ext-dummy" DISTDIRS = "Include Lib Misc Ext-dummy" DISTFILES = "README.rst ChangeLog configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in" DLINCLDIR = "." DLLLIBRARY = "" DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 = "0" DOUBLE_IS_BIG_ENDIAN_IEEE754 = "0" DOUBLE_IS_LITTLE_ENDIAN_IEEE754 = "1" DTRACE = "" DTRACE_DEPS = "\" DTRACE_HEADERS = "" DTRACE_OBJS = "" DYNLOADFILE = "dynload_shlib.o" ENABLE_IPV6 = "1" ENSUREPIP = "upgrade" EXE = "" EXEMODE = "755" EXTRATESTOPTS = "" EXTRA_CFLAGS = "" EXT_SUFFIX = ".pyston-23-x86_64-linux-gnu.so" FILEMODE = "644" FLOAT_WORDS_BIGENDIAN = "0" FLOCK_NEEDS_LIBBSD = "0" GETPGRP_HAVE_ARG = "0" GETTIMEOFDAY_NO_TZ = "0" GITBRANCH = "git --git-dir ../../.git name-rev --name-only HEAD" GITTAG = "git --git-dir ../../.git describe --all --always" GITVERSION = "git --git-dir ../../.git rev-parse --short HEAD" GNULD = "yes" HAVE_ACCEPT4 = "1" HAVE_ACOSH = "1" HAVE_ADDRINFO = "1" HAVE_ALARM = "1" HAVE_ALIGNED_REQUIRED = "0" HAVE_ALLOCA_H = "1" HAVE_ALTZONE = "0" HAVE_ASINH = "1" HAVE_ASM_TYPES_H = "1" HAVE_ATANH = "1" HAVE_BIND_TEXTDOMAIN_CODESET = "1" HAVE_BLUETOOTH_BLUETOOTH_H = "1" HAVE_BLUETOOTH_H = "0" HAVE_BROKEN_MBSTOWCS = "0" HAVE_BROKEN_NICE = "0" HAVE_BROKEN_PIPE_BUF = "0" HAVE_BROKEN_POLL = "0" HAVE_BROKEN_POSIX_SEMAPHORES = "0" HAVE_BROKEN_PTHREAD_SIGMASK = "0" HAVE_BROKEN_SEM_GETVALUE = "0" HAVE_BROKEN_UNSETENV = "0" HAVE_BUILTIN_ATOMIC = "1" HAVE_CHFLAGS = "0" HAVE_CHOWN = "1" HAVE_CHROOT = "1" HAVE_CLOCK = "1" HAVE_CLOCK_GETRES = "1" HAVE_CLOCK_GETTIME = "1" HAVE_CLOCK_SETTIME = "1" HAVE_COMPUTED_GOTOS = "1" HAVE_CONFSTR = "1" HAVE_CONIO_H = "0" HAVE_COPYSIGN = "1" HAVE_COPY_FILE_RANGE = "1" HAVE_CRYPT_H = "1" HAVE_CRYPT_R = "1" HAVE_CTERMID = "1" HAVE_CTERMID_R = "0" HAVE_CURSES_FILTER = "1" HAVE_CURSES_H = "1" HAVE_CURSES_HAS_KEY = "1" HAVE_CURSES_IMMEDOK = "1" HAVE_CURSES_IS_PAD = "1" HAVE_CURSES_IS_TERM_RESIZED = "1" HAVE_CURSES_RESIZETERM = "1" HAVE_CURSES_RESIZE_TERM = "1" HAVE_CURSES_SYNCOK = "1" HAVE_CURSES_TYPEAHEAD = "1" HAVE_CURSES_USE_ENV = "1" HAVE_CURSES_WCHGAT = "1" HAVE_DECL_ISFINITE = "1" HAVE_DECL_ISINF = "1" HAVE_DECL_ISNAN = "1" HAVE_DECL_RTLD_DEEPBIND = "1" HAVE_DECL_RTLD_GLOBAL = "1" HAVE_DECL_RTLD_LAZY = "1" HAVE_DECL_RTLD_LOCAL = "1" HAVE_DECL_RTLD_MEMBER = "0" HAVE_DECL_RTLD_NODELETE = "1" HAVE_DECL_RTLD_NOLOAD = "1" HAVE_DECL_RTLD_NOW = "1" HAVE_DECL_TZNAME = "0" HAVE_DEVICE_MACROS = "1" HAVE_DEV_PTC = "0" HAVE_DEV_PTMX = "1" HAVE_DIRECT_H = "0" HAVE_DIRENT_D_TYPE = "1" HAVE_DIRENT_H = "1" HAVE_DIRFD = "1" HAVE_DLFCN_H = "1" HAVE_DLOPEN = "1" HAVE_DUP2 = "1" HAVE_DUP3 = "1" HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH = "0" HAVE_DYNAMIC_LOADING = "1" HAVE_ENDIAN_H = "1" HAVE_EPOLL = "1" HAVE_EPOLL_CREATE1 = "1" HAVE_ERF = "1" HAVE_ERFC = "1" HAVE_ERRNO_H = "1" HAVE_EXECV = "1" HAVE_EXPLICIT_BZERO = "1" HAVE_EXPLICIT_MEMSET = "0" HAVE_EXPM1 = "1" HAVE_FACCESSAT = "1" HAVE_FCHDIR = "1" HAVE_FCHMOD = "1" HAVE_FCHMODAT = "1" HAVE_FCHOWN = "1" HAVE_FCHOWNAT = "1" HAVE_FCNTL_H = "1" HAVE_FDATASYNC = "1" HAVE_FDOPENDIR = "1" HAVE_FDWALK = "0" HAVE_FEXECVE = "1" HAVE_FINITE = "1" HAVE_FLOCK = "1" HAVE_FORK = "1" HAVE_FORKPTY = "1" HAVE_FPATHCONF = "1" HAVE_FSEEK64 = "0" HAVE_FSEEKO = "1" HAVE_FSTATAT = "1" HAVE_FSTATVFS = "1" HAVE_FSYNC = "1" HAVE_FTELL64 = "0" HAVE_FTELLO = "1" HAVE_FTIME = "1" HAVE_FTRUNCATE = "1" HAVE_FUTIMENS = "1" HAVE_FUTIMES = "1" HAVE_FUTIMESAT = "1" HAVE_GAI_STRERROR = "1" HAVE_GAMMA = "1" HAVE_GCC_ASM_FOR_MC68881 = "0" HAVE_GCC_ASM_FOR_X64 = "1" HAVE_GCC_ASM_FOR_X87 = "1" HAVE_GCC_UINT128_T = "1" HAVE_GETADDRINFO = "1" HAVE_GETC_UNLOCKED = "1" HAVE_GETENTROPY = "1" HAVE_GETGRGID_R = "1" HAVE_GETGRNAM_R = "1" HAVE_GETGROUPLIST = "1" HAVE_GETGROUPS = "1" HAVE_GETHOSTBYNAME = "0" HAVE_GETHOSTBYNAME_R = "1" HAVE_GETHOSTBYNAME_R_3_ARG = "0" HAVE_GETHOSTBYNAME_R_5_ARG = "0" HAVE_GETHOSTBYNAME_R_6_ARG = "1" HAVE_GETITIMER = "1" HAVE_GETLOADAVG = "1" HAVE_GETLOGIN = "1" HAVE_GETNAMEINFO = "1" HAVE_GETPAGESIZE = "1" HAVE_GETPEERNAME = "1" HAVE_GETPGID = "1" HAVE_GETPGRP = "1" HAVE_GETPID = "1" HAVE_GETPRIORITY = "1" HAVE_GETPWENT = "1" HAVE_GETPWNAM_R = "1" HAVE_GETPWUID_R = "1" HAVE_GETRANDOM = "1" HAVE_GETRANDOM_SYSCALL = "1" HAVE_GETRESGID = "1" HAVE_GETRESUID = "1" HAVE_GETSID = "1" HAVE_GETSPENT = "1" HAVE_GETSPNAM = "1" HAVE_GETTIMEOFDAY = "1" HAVE_GETWD = "1" HAVE_GLIBC_MEMMOVE_BUG = "0" HAVE_GRP_H = "1" HAVE_HSTRERROR = "1" HAVE_HTOLE64 = "1" HAVE_HYPOT = "1" HAVE_IEEEFP_H = "0" HAVE_IF_NAMEINDEX = "1" HAVE_INET_ATON = "1" HAVE_INET_PTON = "1" HAVE_INITGROUPS = "1" HAVE_INTTYPES_H = "1" HAVE_IO_H = "0" HAVE_IPA_PURE_CONST_BUG = "0" HAVE_KILL = "1" HAVE_KILLPG = "1" HAVE_KQUEUE = "0" HAVE_LANGINFO_H = "1" HAVE_LARGEFILE_SUPPORT = "0" HAVE_LCHFLAGS = "0" HAVE_LCHMOD = "0" HAVE_LCHOWN = "1" HAVE_LGAMMA = "1" HAVE_LIBDL = "1" HAVE_LIBDLD = "0" HAVE_LIBIEEE = "0" HAVE_LIBINTL_H = "1" HAVE_LIBREADLINE = "1" HAVE_LIBRESOLV = "0" HAVE_LIBSENDFILE = "0" HAVE_LIBUTIL_H = "0" HAVE_LINK = "1" HAVE_LINKAT = "1" HAVE_LINUX_CAN_BCM_H = "1" HAVE_LINUX_CAN_H = "1" HAVE_LINUX_CAN_RAW_FD_FRAMES = "1" HAVE_LINUX_CAN_RAW_H = "1" HAVE_LINUX_MEMFD_H = "1" HAVE_LINUX_NETLINK_H = "1" HAVE_LINUX_QRTR_H = "1" HAVE_LINUX_RANDOM_H = "1" HAVE_LINUX_TIPC_H = "1" HAVE_LINUX_VM_SOCKETS_H = "1" HAVE_LOCKF = "1" HAVE_LOG1P = "1" HAVE_LOG2 = "1" HAVE_LONG_DOUBLE = "1" HAVE_LSTAT = "1" HAVE_LUTIMES = "1" HAVE_MADVISE = "1" HAVE_MAKEDEV = "1" HAVE_MBRTOWC = "1" HAVE_MEMFD_CREATE = "1" HAVE_MEMORY_H = "1" HAVE_MEMRCHR = "1" HAVE_MKDIRAT = "1" HAVE_MKFIFO = "1" HAVE_MKFIFOAT = "1" HAVE_MKNOD = "1" HAVE_MKNODAT = "1" HAVE_MKTIME = "1" HAVE_MMAP = "1" HAVE_MREMAP = "1" HAVE_NCURSES_H = "1" HAVE_NDIR_H = "0" HAVE_NETPACKET_PACKET_H = "1" HAVE_NET_IF_H = "1" HAVE_NICE = "1" HAVE_OPENAT = "1" HAVE_OPENPTY = "1" HAVE_PATHCONF = "1" HAVE_PAUSE = "1" HAVE_PIPE2 = "1" HAVE_PLOCK = "0" HAVE_POLL = "1" HAVE_POLL_H = "1" HAVE_POSIX_FADVISE = "1" HAVE_POSIX_FALLOCATE = "1" HAVE_POSIX_SPAWN = "1" HAVE_POSIX_SPAWNP = "1" HAVE_PREAD = "1" HAVE_PREADV = "1" HAVE_PREADV2 = "1" HAVE_PRLIMIT = "1" HAVE_PROCESS_H = "0" HAVE_PROTOTYPES = "1" HAVE_PTHREAD_CONDATTR_SETCLOCK = "1" HAVE_PTHREAD_DESTRUCTOR = "0" HAVE_PTHREAD_GETCPUCLOCKID = "1" HAVE_PTHREAD_H = "1" HAVE_PTHREAD_INIT = "0" HAVE_PTHREAD_KILL = "1" HAVE_PTHREAD_SIGMASK = "1" HAVE_PTY_H = "1" HAVE_PUTENV = "1" HAVE_PWRITE = "1" HAVE_PWRITEV = "1" HAVE_PWRITEV2 = "1" HAVE_READLINK = "1" HAVE_READLINKAT = "1" HAVE_READV = "1" HAVE_REALPATH = "1" HAVE_RENAMEAT = "1" HAVE_RL_APPEND_HISTORY = "1" HAVE_RL_CATCH_SIGNAL = "1" HAVE_RL_COMPLETION_APPEND_CHARACTER = "1" HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK = "1" HAVE_RL_COMPLETION_MATCHES = "1" HAVE_RL_COMPLETION_SUPPRESS_APPEND = "1" HAVE_RL_PRE_INPUT_HOOK = "1" HAVE_RL_RESIZE_TERMINAL = "1" HAVE_ROUND = "1" HAVE_RTPSPAWN = "0" HAVE_SCHED_GET_PRIORITY_MAX = "1" HAVE_SCHED_H = "1" HAVE_SCHED_RR_GET_INTERVAL = "1" HAVE_SCHED_SETAFFINITY = "1" HAVE_SCHED_SETPARAM = "1" HAVE_SCHED_SETSCHEDULER = "1" HAVE_SEM_GETVALUE = "1" HAVE_SEM_OPEN = "1" HAVE_SEM_TIMEDWAIT = "1" HAVE_SEM_UNLINK = "1" HAVE_SENDFILE = "1" HAVE_SETEGID = "1" HAVE_SETEUID = "1" HAVE_SETGID = "1" HAVE_SETGROUPS = "1" HAVE_SETHOSTNAME = "1" HAVE_SETITIMER = "1" HAVE_SETLOCALE = "1" HAVE_SETPGID = "1" HAVE_SETPGRP = "1" HAVE_SETPRIORITY = "1" HAVE_SETREGID = "1" HAVE_SETRESGID = "1" HAVE_SETRESUID = "1" HAVE_SETREUID = "1" HAVE_SETSID = "1" HAVE_SETUID = "1" HAVE_SETVBUF = "1" HAVE_SHADOW_H = "1" HAVE_SHM_OPEN = "1" HAVE_SHM_UNLINK = "1" HAVE_SIGACTION = "1" HAVE_SIGALTSTACK = "1" HAVE_SIGFILLSET = "1" HAVE_SIGINFO_T_SI_BAND = "1" HAVE_SIGINTERRUPT = "1" HAVE_SIGNAL_H = "1" HAVE_SIGPENDING = "1" HAVE_SIGRELSE = "1" HAVE_SIGTIMEDWAIT = "1" HAVE_SIGWAIT = "1" HAVE_SIGWAITINFO = "1" HAVE_SNPRINTF = "1" HAVE_SOCKADDR_ALG = "1" HAVE_SOCKADDR_SA_LEN = "0" HAVE_SOCKADDR_STORAGE = "1" HAVE_SOCKETPAIR = "1" HAVE_SPAWN_H = "1" HAVE_SSIZE_T = "1" HAVE_STATVFS = "1" HAVE_STAT_TV_NSEC = "1" HAVE_STAT_TV_NSEC2 = "0" HAVE_STDARG_PROTOTYPES = "1" HAVE_STDINT_H = "1" HAVE_STDLIB_H = "1" HAVE_STD_ATOMIC = "1" HAVE_STRDUP = "1" HAVE_STRFTIME = "1" HAVE_STRINGS_H = "1" HAVE_STRING_H = "1" HAVE_STRLCPY = "0" HAVE_STROPTS_H = "1" HAVE_STRSIGNAL = "1" HAVE_STRUCT_PASSWD_PW_GECOS = "1" HAVE_STRUCT_PASSWD_PW_PASSWD = "1" HAVE_STRUCT_STAT_ST_BIRTHTIME = "0" HAVE_STRUCT_STAT_ST_BLKSIZE = "1" HAVE_STRUCT_STAT_ST_BLOCKS = "1" HAVE_STRUCT_STAT_ST_FLAGS = "0" HAVE_STRUCT_STAT_ST_GEN = "0" HAVE_STRUCT_STAT_ST_RDEV = "1" HAVE_STRUCT_TM_TM_ZONE = "1" HAVE_SYMLINK = "1" HAVE_SYMLINKAT = "1" HAVE_SYNC = "1" HAVE_SYSCONF = "1" HAVE_SYSEXITS_H = "1" HAVE_SYS_AUDIOIO_H = "0" HAVE_SYS_BSDTTY_H = "0" HAVE_SYS_DEVPOLL_H = "0" HAVE_SYS_DIR_H = "0" HAVE_SYS_ENDIAN_H = "0" HAVE_SYS_EPOLL_H = "1" HAVE_SYS_EVENT_H = "0" HAVE_SYS_FILE_H = "1" HAVE_SYS_IOCTL_H = "1" HAVE_SYS_KERN_CONTROL_H = "0" HAVE_SYS_LOADAVG_H = "0" HAVE_SYS_LOCK_H = "0" HAVE_SYS_MEMFD_H = "0" HAVE_SYS_MKDEV_H = "0" HAVE_SYS_MMAN_H = "1" HAVE_SYS_MODEM_H = "0" HAVE_SYS_NDIR_H = "0" HAVE_SYS_PARAM_H = "1" HAVE_SYS_POLL_H = "1" HAVE_SYS_RANDOM_H = "1" HAVE_SYS_RESOURCE_H = "1" HAVE_SYS_SELECT_H = "1" HAVE_SYS_SENDFILE_H = "1" HAVE_SYS_SOCKET_H = "1" HAVE_SYS_STATVFS_H = "1" HAVE_SYS_STAT_H = "1" HAVE_SYS_SYSCALL_H = "1" HAVE_SYS_SYSMACROS_H = "1" HAVE_SYS_SYS_DOMAIN_H = "0" HAVE_SYS_TERMIO_H = "0" HAVE_SYS_TIMES_H = "1" HAVE_SYS_TIME_H = "1" HAVE_SYS_TYPES_H = "1" HAVE_SYS_UIO_H = "1" HAVE_SYS_UN_H = "1" HAVE_SYS_UTSNAME_H = "1" HAVE_SYS_WAIT_H = "1" HAVE_SYS_XATTR_H = "1" HAVE_TCGETPGRP = "1" HAVE_TCSETPGRP = "1" HAVE_TEMPNAM = "1" HAVE_TERMIOS_H = "1" HAVE_TERM_H = "1" HAVE_TGAMMA = "1" HAVE_TIMEGM = "1" HAVE_TIMES = "1" HAVE_TMPFILE = "1" HAVE_TMPNAM = "1" HAVE_TMPNAM_R = "1" HAVE_TM_ZONE = "1" HAVE_TRUNCATE = "1" HAVE_TZNAME = "0" HAVE_UCS4_TCL = "0" HAVE_UNAME = "1" HAVE_UNISTD_H = "1" HAVE_UNLINKAT = "1" HAVE_UNSETENV = "1" HAVE_USABLE_WCHAR_T = "0" HAVE_UTIL_H = "0" HAVE_UTIMENSAT = "1" HAVE_UTIMES = "1" HAVE_UTIME_H = "1" HAVE_UUID_CREATE = "0" HAVE_UUID_ENC_BE = "0" HAVE_UUID_GENERATE_TIME_SAFE = "0" HAVE_UUID_H = "0" HAVE_UUID_UUID_H = "0" HAVE_WAIT3 = "1" HAVE_WAIT4 = "1" HAVE_WAITID = "1" HAVE_WAITPID = "1" HAVE_WCHAR_H = "1" HAVE_WCSCOLL = "1" HAVE_WCSFTIME = "1" HAVE_WCSXFRM = "1" HAVE_WMEMCMP = "1" HAVE_WORKING_TZSET = "1" HAVE_WRITEV = "1" HAVE_X509_VERIFY_PARAM_SET1_HOST = "1" HAVE_ZLIB_COPY = "1" HAVE__GETPTY = "0" HOST_GNU_TYPE = "x86_64-pc-linux-gnu" IMPLEMENTATION_NAME = ""pyston"" INCLDIRSTOMAKE = "/usr/include /usr/include /usr/include/python3.8-pyston2.3 /usr/include/python3.8-pyston2.3" INCLUDEDIR = "/usr/include" INCLUDEPY = "/usr/include/python3.8-pyston2.3" INSTALL = "/usr/bin/install -c" INSTALL_DATA = "/usr/bin/install -c -m 644" INSTALL_PROGRAM = "/usr/bin/install -c" INSTALL_SCRIPT = "/usr/bin/install -c" INSTALL_SHARED = "/usr/bin/install -c -m 755" INSTSONAME = "libpython3.8-pyston2.3.so.1.0" IO_H = "Modules/_io/_iomodule.h" IO_OBJS = "\" LDCXXSHARED = "g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions" LDFLAGS = "-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro" LDFLAGS_NODIST = "" LDLIBRARY = "libpython3.8-pyston2.3.so" LDLIBRARYDIR = "" LDSHARED = "gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro" LDVERSION = "3.8-pyston2.3" LIBC = "" LIBDEST = "/usr/lib/python3.8-pyston2.3" LIBDIR = "/root/pyston_2.3.5/lib" LIBFFI_INCLUDEDIR = "" LIBM = "-lm" LIBOBJDIR = "Python/" LIBOBJS = "" LIBPC = "/usr/lib/pkgconfig" LIBPL = "/usr/lib/python3.8-pyston2.3/config-3.8-pyston2.3-x86_64-linux-gnu" LIBPYTHON = "" LIBRARY = "libpython3.8-pyston2.3.a" LIBRARY_OBJS = "\" LIBRARY_OBJS_OMIT_FROZEN = "\" LIBS = "-lcrypt -lpthread -ldl -lutil -lm" LIBSUBDIRS = "tkinter tkinter/test tkinter/test/test_tkinter \" LINKCC = "gcc -pthread" LINKFORSHARED = "-Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions" LIPO_32BIT_FLAGS = "" LIPO_INTEL64_FLAGS = "" LLVM_PROF_ERR = "no" LLVM_PROF_FILE = "" LLVM_PROF_MERGER = "true" LN = "ln" LOCALMODLIBS = "" MACHDEP = "linux" MACHDEP_OBJS = "" MACHDESTLIB = "/usr/lib/python3.8-pyston2.3" MACOSX_DEPLOYMENT_TARGET = "" MAINCC = "gcc -pthread" MAJOR_IN_MKDEV = "0" MAJOR_IN_SYSMACROS = "0" MAKESETUP = "../../Modules/makesetup" MANDIR = "/usr/share/man" MKDIR_P = "/bin/mkdir -p" MODBUILT_NAMES = "posix errno pwd _sre _codecs _weakref _functools _operator _collections _abc itertools atexit _signal _stat time _thread _locale _io faulthandler _tracemalloc _symtable xxsubtype" MODDISABLED_NAMES = "" MODLIBS = "" MODOBJS = "Modules/posixmodule.o Modules/errnomodule.o Modules/pwdmodule.o Modules/_sre.o Modules/_codecsmodule.o Modules/_weakref.o Modules/_functoolsmodule.o Modules/_operator.o Modules/_collectionsmodule.o Modules/_abc.o Modules/itertoolsmodule.o Modules/atexitmodule.o Modules/signalmodule.o Modules/_stat.o Modules/timemodule.o Modules/_threadmodule.o Modules/_localemodule.o Modules/_iomodule.o Modules/iobase.o Modules/fileio.o Modules/bytesio.o Modules/bufferedio.o Modules/textio.o Modules/stringio.o Modules/faulthandler.o Modules/_tracemalloc.o Modules/hashtable.o Modules/symtablemodule.o Modules/xxsubtype.o" MODULE_OBJS = "\" MULTIARCH = "x86_64-linux-gnu" MULTIARCH_CPPFLAGS = "-DMULTIARCH=\"x86_64-linux-gnu\"" MVWDELCH_IS_EXPRESSION = "1" NO_AS_NEEDED = "-Wl,--no-as-needed" OBJECT_OBJS = "\" OPENSSL_INCLUDES = "" OPENSSL_LDFLAGS = "" OPENSSL_LIBS = "-lssl -lcrypto" OPT = "-DNDEBUG -g -fwrapv -O3 -Wall" OTHER_LIBTOOL_OPT = "" PACKAGE_BUGREPORT = "0" PACKAGE_NAME = "0" PACKAGE_STRING = "0" PACKAGE_TARNAME = "0" PACKAGE_URL = "0" PACKAGE_VERSION = "0" PARSER_HEADERS = "\" PARSER_OBJS = "\ Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o" PGO_PROF_GEN_FLAG = "-fprofile-generate" PGO_PROF_USE_FLAG = "-fprofile-use -fprofile-correction" POBJS = "\" POSIX_SEMAPHORES_NOT_ENABLED = "0" PROFILE_TASK = "../../Lib/test/regrtest.py -j 0 -unone,decimal -x test_posix test_asyncio test_cmd_line_script test_compiler test_concurrent_futures test_ctypes test_dbm_dumb test_dbm_ndbm test_distutils test_ensurepip test_ftplib test_gdb test_httplib test_imaplib test_ioctl test_linuxaudiodev test_multiprocessing test_nntplib test_ossaudiodev test_poplib test_pydoc test_signal test_socket test_socketserver test_ssl test_subprocess test_sundry test_thread test_threaded_import test_threadedtempfile test_threading test_threading_local test_threadsignals test_venv test_zipimport_support || true" PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT = "1" PTHREAD_SYSTEM_SCHED_SUPPORTED = "1" PURIFY = "" PY3LIBRARY = "libpyston3.so" PYLONG_BITS_IN_DIGIT = "0" PYSTON_SPEEDUPS = "1" PYTHON = "pyston" PYTHONFRAMEWORK = "" PYTHONFRAMEWORKDIR = "no-framework" PYTHONFRAMEWORKINSTALLDIR = "" PYTHONFRAMEWORKPREFIX = "" PYTHONPATH = "" PYTHON_FOR_BUILD = "./pyston -E" PYTHON_FOR_REGEN = "python3" PYTHON_HEADERS = "\" PYTHON_OBJS = "\" PY_BUILTIN_MODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -g -O2 -fdebug-prefix-map=/src/build/pyston=. -fstack-protector-strong -Wformat -Werror=format-security -DENABLE_AOT -g -O2 -fdebug-prefix-map=/src/build/pyston=. -fstack-protector-strong -Wformat -Werror=format-security -fstack-protector -specs=/src/build/pyston/tools/no-pie-compile.specs -D_FORTIFY_SOURCE=2 -fno-reorder-blocks-and-partition -fno-semantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -I../../Include/internal -IObjects -IInclude -IPython -I. -I../../Include -Wdate-time -D_FORTIFY_SOURCE=2 -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPy_BUILD_CORE_BUILTIN" PY_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -g -O2 -fdebug-prefix-map=/src/build/pyston=. -fstack-protector-strong -Wformat -Werror=format-security -DENABLE_AOT -g -O2 -fdebug-prefix-map=/src/build/pyston=. -fstack-protector-strong -Wformat -Werror=format-security" PY_CFLAGS_NODIST = "-fstack-protector -specs=/src/build/pyston/tools/no-pie-compile.specs -D_FORTIFY_SOURCE=2 -fno-reorder-blocks-and-partition -fno-semantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -I../../Include/internal" PY_COERCE_C_LOCALE = "1" PY_CORE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -g -O2 -fdebug-prefix-map=/src/build/pyston=. -fstack-protector-strong -Wformat -Werror=format-security -DENABLE_AOT -g -O2 -fdebug-prefix-map=/src/build/pyston=. -fstack-protector-strong -Wformat -Werror=format-security -fstack-protector -specs=/src/build/pyston/tools/no-pie-compile.specs -D_FORTIFY_SOURCE=2 -fno-reorder-blocks-and-partition -fno-semantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -I../../Include/internal -IObjects -IInclude -IPython -I. -I../../Include -Wdate-time -D_FORTIFY_SOURCE=2 -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DPy_BUILD_CORE" PY_CORE_LDFLAGS = "-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -specs=/src/build/pyston/tools/no-pie-link.specs -Wl,-z,relro -Wl,--emit-relocs -fno-semantic-interposition -fsemantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g" PY_CPPFLAGS = "-IObjects -IInclude -IPython -I. -I../../Include -Wdate-time -D_FORTIFY_SOURCE=2 -Wdate-time -D_FORTIFY_SOURCE=2" PY_DEBUGGING_FEATURES = "0" PY_FORMAT_SIZE_T = ""z"" PY_LDFLAGS = "-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro" PY_LDFLAGS_NODIST = "-specs=/src/build/pyston/tools/no-pie-link.specs -Wl,-z,relro -Wl,--emit-relocs -fno-semantic-interposition -fsemantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g" PY_SSL_DEFAULT_CIPHERS = "1" PY_SSL_DEFAULT_CIPHER_STRING = "0" PY_STDMODULE_CFLAGS = "-Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -g -O2 -fdebug-prefix-map=/src/build/pyston=. -fstack-protector-strong -Wformat -Werror=format-security -DENABLE_AOT -g -O2 -fdebug-prefix-map=/src/build/pyston=. -fstack-protector-strong -Wformat -Werror=format-security -fstack-protector -specs=/src/build/pyston/tools/no-pie-compile.specs -D_FORTIFY_SOURCE=2 -fno-reorder-blocks-and-partition -fno-semantic-interposition -flto -fuse-linker-plugin -ffat-lto-objects -flto-partition=none -g -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -I../../Include/internal -IObjects -IInclude -IPython -I. -I../../Include -Wdate-time -D_FORTIFY_SOURCE=2 -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC" Py_DEBUG = "0" Py_ENABLE_SHARED = "1" Py_HASH_ALGORITHM = "0" Py_TRACE_REFS = "0" QUICKTESTOPTS = "-x test_subprocess test_io test_lib2to3 \" READELF = "readelf" RESSRCDIR = "Mac/Resources/framework" RETSIGTYPE = "void" RUNSHARED = "LD_LIBRARY_PATH=/src/build/build/releaseshared_build" SCRIPTDIR = "/usr/lib" SETPGRP_HAVE_ARG = "0" SGI_ABI = "@SGI_ABI@" SHELL = "/bin/sh" SHLIBS = "-lcrypt -lpthread -ldl -lutil -lm" SHLIB_SUFFIX = ".so" SHM_NEEDS_LIBRT = "1" SIGNED_RIGHT_SHIFT_ZERO_FILLS = "0" SITEPATH = "" SIZEOF_DOUBLE = "8" SIZEOF_FLOAT = "4" SIZEOF_FPOS_T = "16" SIZEOF_INT = "4" SIZEOF_LONG = "8" SIZEOF_LONG_DOUBLE = "16" SIZEOF_LONG_LONG = "8" SIZEOF_OFF_T = "8" SIZEOF_PID_T = "4" SIZEOF_PTHREAD_KEY_T = "4" SIZEOF_PTHREAD_T = "8" SIZEOF_SHORT = "2" SIZEOF_SIZE_T = "8" SIZEOF_TIME_T = "8" SIZEOF_UINTPTR_T = "8" SIZEOF_VOID_P = "8" SIZEOF_WCHAR_T = "4" SIZEOF__BOOL = "1" SO = ".pyston-23-x86_64-linux-gnu.so" SOABI = "pyston-23-x86_64-linux-gnu" SRCDIRS = "Parser Objects Python Modules Modules/_io Programs" SRC_GDB_HOOKS = "../../Tools/gdb/libpython.py" STDC_HEADERS = "1" STRICT_SYSV_CURSES = "/* Don't use ncurses extensions */" STRIPFLAG = "-s" SUBDIRS = "" SUBDIRSTOO = "Include Lib Misc" SYSLIBS = "-lm" SYS_SELECT_WITH_SYS_TIME = "1" TCLTK_INCLUDES = "" TCLTK_LIBS = "" TESTOPTS = "" TESTPATH = "" TESTPYTHON = "LD_LIBRARY_PATH=/src/build/build/releaseshared_build ./pyston" TESTPYTHONOPTS = "" TESTRUNNER = "LD_LIBRARY_PATH=/src/build/build/releaseshared_build ./pyston ../../Tools/scripts/run_tests.py" TESTTIMEOUT = "1200" TIMEMODULE_LIB = "0" TIME_WITH_SYS_TIME = "1" TM_IN_SYS_TIME = "0" UNICODE_DEPS = "\" UNIVERSALSDK = "" UPDATE_FILE = "python3 ../../Tools/scripts/update_file.py" USE_AOT = "true" USE_COMPUTED_GOTOS = "0" VERSION = "3.8-pyston2.3" VPATH = "../.." WINDOW_HAS_FLAGS = "1" WITH_DECIMAL_CONTEXTVAR = "1" WITH_DOC_STRINGS = "1" WITH_DTRACE = "0" WITH_DYLD = "0" WITH_LIBINTL = "0" WITH_NEXT_FRAMEWORK = "0" WITH_PYMALLOC = "1" WITH_VALGRIND = "0" X87_DOUBLE_ROUNDING = "0" XMLLIBSUBDIRS = "xml xml/dom xml/etree xml/parsers xml/sax" abiflags = "" abs_builddir = "/src/build/build/releaseshared_build" abs_srcdir = "/src/build/build/releaseshared_build/../.." base = "/root/pyston_2.3.5" datarootdir = "/usr/share" exec_prefix = "/usr" installed_base = "/root/pyston_2.3.5" installed_platbase = "/root/pyston_2.3.5" platbase = "/root/pyston_2.3.5" prefix = "/usr" projectbase = "/root/pyston_2.3.5/bin" py_version = "3.8.12" py_version_nodot = "38" py_version_short = "3.8" pyston_version = "3.8-pyston2.3" srcdir = "/root/pyston_2.3.5/lib/python3.8-pyston2.3/config-3.8-pyston2.3-x86_64-linux-gnu" userbase = "/root/.local" maturin-1.16.0/test-crates/000077500000000000000000000000001527064705700155315ustar00rootroot00000000000000maturin-1.16.0/test-crates/bin-with-python-module/000077500000000000000000000000001527064705700220545ustar00rootroot00000000000000maturin-1.16.0/test-crates/bin-with-python-module/Cargo.lock000066400000000000000000000002461527064705700237630ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "bin-with-python-module" version = "0.1.0" maturin-1.16.0/test-crates/bin-with-python-module/Cargo.toml000066400000000000000000000002201527064705700237760ustar00rootroot00000000000000[package] name = "bin-with-python-module" version = "0.1.0" edition = "2021" description = "Test crate with a binary and a plain Python module" maturin-1.16.0/test-crates/bin-with-python-module/bin_with_python_module/000077500000000000000000000000001527064705700266255ustar00rootroot00000000000000maturin-1.16.0/test-crates/bin-with-python-module/bin_with_python_module/__init__.py000066400000000000000000000002031527064705700307310ustar00rootroot00000000000000"""A plain Python module that ships alongside a Rust binary.""" __version__ = "0.1.0" def get_version(): return __version__ maturin-1.16.0/test-crates/bin-with-python-module/check_installed/000077500000000000000000000000001527064705700251705ustar00rootroot00000000000000maturin-1.16.0/test-crates/bin-with-python-module/check_installed/check_installed.py000066400000000000000000000026031527064705700306570ustar00rootroot00000000000000""" Test that both the binary and Python module work correctly after editable install. This tests the fix for https://github.com/PyO3/maturin/issues/2933 """ import os import shutil import subprocess import sys def main(): # Test 1: Check that the Python module works from bin_with_python_module import get_version version = get_version() if version != "0.1.0": raise RuntimeError(f"Expected version '0.1.0', got '{version}'") # Test 2: Check that the binary is installed and works # The binary should be in PATH in the venv bin dir after editable install bin = shutil.which("bin-with-python-module") if not os.path.realpath(bin).startswith(os.path.realpath(sys.prefix)): raise RuntimeError(f"Binary '{os.path.realpath(bin)}' not in venv at '{os.path.realpath(sys.prefix)}'") result = subprocess.run( ["bin-with-python-module"], capture_output=True, text=True, check=False, ) if result.returncode != 0: raise RuntimeError( f"Binary failed with code {result.returncode}: stdout={result.stdout!r}, stderr={result.stderr!r}" ) expected_output = "bin-with-python-module 0.1.0" if expected_output not in result.stdout: raise RuntimeError(f"Expected output containing '{expected_output}', got '{result.stdout}'") print("SUCCESS") if __name__ == "__main__": main() maturin-1.16.0/test-crates/bin-with-python-module/pyproject.toml000066400000000000000000000003511527064705700247670ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "bin-with-python-module" version = "0.1.0" requires-python = ">=3.8" [tool.maturin] bindings = "bin" module-name = "bin_with_python_module" maturin-1.16.0/test-crates/bin-with-python-module/src/000077500000000000000000000000001527064705700226435ustar00rootroot00000000000000maturin-1.16.0/test-crates/bin-with-python-module/src/main.rs000066400000000000000000000000741527064705700241360ustar00rootroot00000000000000fn main() { println!("bin-with-python-module 0.1.0"); } maturin-1.16.0/test-crates/bin-workspace-pyo3-feature/000077500000000000000000000000001527064705700226165ustar00rootroot00000000000000maturin-1.16.0/test-crates/bin-workspace-pyo3-feature/Cargo.lock000066400000000000000000000067651527064705700245410ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "bin-workspace-pyo3-feature" version = "0.1.0" dependencies = [ "shared", ] [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "portable-atomic" version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "proc-macro2" version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "python-workspace-member" version = "0.1.0" dependencies = [ "shared", ] [[package]] name = "quote" version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" dependencies = [ "proc-macro2", ] [[package]] name = "shared" version = "0.1.0" dependencies = [ "pyo3", ] [[package]] name = "syn" version = "2.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" maturin-1.16.0/test-crates/bin-workspace-pyo3-feature/Cargo.toml000066400000000000000000000000671527064705700245510ustar00rootroot00000000000000[workspace] members = ["bin", "python"] resolver = "2" maturin-1.16.0/test-crates/bin-workspace-pyo3-feature/bin/000077500000000000000000000000001527064705700233665ustar00rootroot00000000000000maturin-1.16.0/test-crates/bin-workspace-pyo3-feature/bin/Cargo.toml000066400000000000000000000002501527064705700253130ustar00rootroot00000000000000[package] name = "bin-workspace-pyo3-feature" version = "0.1.0" edition = "2021" [features] python = ["shared/python"] [dependencies] shared = { path = "../shared" } maturin-1.16.0/test-crates/bin-workspace-pyo3-feature/bin/pyproject.toml000066400000000000000000000002541527064705700263030ustar00rootroot00000000000000[project] name = "bin-workspace-pyo3-feature" version = "0.1.0" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [tool.maturin] bindings = "bin" maturin-1.16.0/test-crates/bin-workspace-pyo3-feature/bin/src/000077500000000000000000000000001527064705700241555ustar00rootroot00000000000000maturin-1.16.0/test-crates/bin-workspace-pyo3-feature/bin/src/main.rs000066400000000000000000000000151527064705700254430ustar00rootroot00000000000000fn main() {} maturin-1.16.0/test-crates/bin-workspace-pyo3-feature/python/000077500000000000000000000000001527064705700241375ustar00rootroot00000000000000maturin-1.16.0/test-crates/bin-workspace-pyo3-feature/python/Cargo.toml000066400000000000000000000002251527064705700260660ustar00rootroot00000000000000[package] name = "python-workspace-member" version = "0.1.0" edition = "2021" [dependencies] shared = { path = "../shared", features = ["python"] } maturin-1.16.0/test-crates/bin-workspace-pyo3-feature/python/src/000077500000000000000000000000001527064705700247265ustar00rootroot00000000000000maturin-1.16.0/test-crates/bin-workspace-pyo3-feature/python/src/lib.rs000066400000000000000000000000001527064705700260300ustar00rootroot00000000000000maturin-1.16.0/test-crates/bin-workspace-pyo3-feature/shared/000077500000000000000000000000001527064705700240645ustar00rootroot00000000000000maturin-1.16.0/test-crates/bin-workspace-pyo3-feature/shared/Cargo.toml000066400000000000000000000002361527064705700260150ustar00rootroot00000000000000[package] name = "shared" version = "0.1.0" edition = "2021" [features] python = ["dep:pyo3"] [dependencies] pyo3 = { version = "0.29.0", optional = true } maturin-1.16.0/test-crates/bin-workspace-pyo3-feature/shared/src/000077500000000000000000000000001527064705700246535ustar00rootroot00000000000000maturin-1.16.0/test-crates/bin-workspace-pyo3-feature/shared/src/lib.rs000066400000000000000000000000001527064705700257550ustar00rootroot00000000000000maturin-1.16.0/test-crates/cargo-update.sh000077500000000000000000000002741527064705700204460ustar00rootroot00000000000000#!/usr/bin/env bash for d in ./*; do if [ -d "$d" ]; then if [ -f "$d/Cargo.lock" ]; then cargo update --manifest-path "$d/Cargo.toml" echo "$d updated" fi fi done maturin-1.16.0/test-crates/cffi-mixed-implicit/000077500000000000000000000000001527064705700213545ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-implicit/.gitignore000066400000000000000000000000531527064705700233420ustar00rootroot00000000000000python/cffi_mixed_implicit/some_rust/rust/ maturin-1.16.0/test-crates/cffi-mixed-implicit/Cargo.lock000066400000000000000000000002431527064705700232600ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "cffi-mixed-implicit" version = "0.1.0" maturin-1.16.0/test-crates/cffi-mixed-implicit/Cargo.toml000066400000000000000000000003011527064705700232760ustar00rootroot00000000000000[package] name = "cffi-mixed-implicit" version = "0.1.0" authors = ["Armin Ronacher "] edition = "2021" [lib] name = "cffi_mixed_implicit" crate-type = ["cdylib"] maturin-1.16.0/test-crates/cffi-mixed-implicit/README.md000066400000000000000000000005761527064705700226430ustar00rootroot00000000000000# cffi-mixed-implicit This fixture exercises a mixed cffi/python package with an implicit namespace package and a Rust-backed submodule. ```bash pip install . ``` ```python import cffi_mixed_implicit.some_rust as some_rust point = some_rust.lib.get_origin() assert some_rust.lib.is_in_range(point, 0.0) ``` The install smoke test lives in `check_installed/check_installed.py`. maturin-1.16.0/test-crates/cffi-mixed-implicit/check_installed/000077500000000000000000000000001527064705700244705ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-implicit/check_installed/check_installed.py000077500000000000000000000002451527064705700301620ustar00rootroot00000000000000#!/usr/bin/env python3 from cffi_mixed_implicit import some_rust point = some_rust.lib.get_origin() assert some_rust.lib.is_in_range(point, 0.0) print("SUCCESS") maturin-1.16.0/test-crates/cffi-mixed-implicit/pyproject.toml000066400000000000000000000006231527064705700242710ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "cffi_mixed_implicit" classifiers = [ "Programming Language :: Python", "Programming Language :: Rust" ] dependencies = ["cffi; platform_python_implementation != 'PyPy'"] dynamic = ["version"] [tool.maturin] bindings = "cffi" module-name = "cffi_mixed_implicit.some_rust.rust" python-source = "python" maturin-1.16.0/test-crates/cffi-mixed-implicit/python/000077500000000000000000000000001527064705700226755ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-implicit/python/cffi_mixed_implicit/000077500000000000000000000000001527064705700266645ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-implicit/python/cffi_mixed_implicit/some_rust/000077500000000000000000000000001527064705700307045ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-implicit/python/cffi_mixed_implicit/some_rust/__init__.py000066400000000000000000000000651527064705700330160ustar00rootroot00000000000000from .rust import ffi, lib __all__ = ["ffi", "lib"] maturin-1.16.0/test-crates/cffi-mixed-implicit/src/000077500000000000000000000000001527064705700221435ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-implicit/src/lib.rs000066400000000000000000000013271527064705700232620ustar00rootroot00000000000000#[repr(C)] pub struct Point { pub x: f32, pub y: f32, } #[repr(u32)] pub enum Foo { A = 1, B, C, } #[no_mangle] pub unsafe extern "C" fn get_origin() -> Point { Point { x: 0.0, y: 0.0 } } #[no_mangle] pub unsafe extern "C" fn add_points(p1: Point, p2: Point) -> Point { Point { x: p1.x + p2.x, y: p1.y + p2.y, } } #[no_mangle] pub unsafe extern "C" fn is_in_range(point: Point, range: f32) -> bool { (point.x.powi(2) + point.y.powi(2)).sqrt() <= range } #[no_mangle] pub unsafe extern "C" fn print_foo(foo: *const Foo) { println!( "{}", match *foo { Foo::A => "a", Foo::B => "b", Foo::C => "c", } ); } maturin-1.16.0/test-crates/cffi-mixed-include-exclude/000077500000000000000000000000001527064705700226145ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-include-exclude/.gitignore000066400000000000000000000000671527064705700246070ustar00rootroot00000000000000cffi_mixed_include_exclude/cffi_mixed_include_exclude/ maturin-1.16.0/test-crates/cffi-mixed-include-exclude/Cargo.lock000066400000000000000000000002521527064705700245200ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "cffi-mixed-include-exclude" version = "0.1.0" maturin-1.16.0/test-crates/cffi-mixed-include-exclude/Cargo.toml000066400000000000000000000003171527064705700245450ustar00rootroot00000000000000[package] name = "cffi-mixed-include-exclude" version = "0.1.0" authors = ["Armin Ronacher "] edition = "2021" [lib] name = "cffi_mixed_include_exclude" crate-type = ["cdylib"] maturin-1.16.0/test-crates/cffi-mixed-include-exclude/README.md000066400000000000000000000005741527064705700241010ustar00rootroot00000000000000# cffi-mixed-include-exclude This fixture exercises a mixed cffi/python package with explicit include/exclude rules. ```bash pip install . ``` ```python import cffi_mixed_include_exclude point = cffi_mixed_include_exclude.lib.get_origin() assert cffi_mixed_include_exclude.lib.is_in_range(point, 0.0) ``` The install smoke test lives in `check_installed/check_installed.py`. maturin-1.16.0/test-crates/cffi-mixed-include-exclude/build.rs000066400000000000000000000003431527064705700242610ustar00rootroot00000000000000use std::env; use std::fs; use std::path::Path; fn main() { let out_dir = env::var("OUT_DIR").unwrap(); let dest = Path::new(&out_dir).join("generated_info.txt"); fs::write(dest, "hello from build.rs").unwrap(); } maturin-1.16.0/test-crates/cffi-mixed-include-exclude/cffi_mixed_include_exclude/000077500000000000000000000000001527064705700301255ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-include-exclude/cffi_mixed_include_exclude/.gitignore000066400000000000000000000000451527064705700321140ustar00rootroot00000000000000include_this_file generated_info.txt maturin-1.16.0/test-crates/cffi-mixed-include-exclude/cffi_mixed_include_exclude/__init__.py000066400000000000000000000001131527064705700322310ustar00rootroot00000000000000from .cffi_mixed_include_exclude import ffi, lib __all__ = ["ffi", "lib"] maturin-1.16.0/test-crates/cffi-mixed-include-exclude/cffi_mixed_include_exclude/exclude_this_file000066400000000000000000000000001527064705700335150ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-include-exclude/cffi_mixed_include_exclude/python_module/000077500000000000000000000000001527064705700330135ustar00rootroot00000000000000__init__.py000066400000000000000000000000001527064705700350330ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-include-exclude/cffi_mixed_include_exclude/python_moduledouble.py000066400000000000000000000001341527064705700345560ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-include-exclude/cffi_mixed_include_exclude/python_modulefrom typing import Callable def double(fn: Callable[[], int]) -> int: return 2 * fn() maturin-1.16.0/test-crates/cffi-mixed-include-exclude/check_installed/000077500000000000000000000000001527064705700257305ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-include-exclude/check_installed/check_installed.py000077500000000000000000000007471527064705700314310ustar00rootroot00000000000000#!/usr/bin/env python3 import importlib.resources import cffi_mixed_include_exclude point = cffi_mixed_include_exclude.lib.get_origin() assert cffi_mixed_include_exclude.lib.is_in_range(point, 0.0) # Verify that the file generated by build.rs and included from OUT_DIR is present ref = importlib.resources.files("cffi_mixed_include_exclude").joinpath("generated_info.txt") assert ref.read_text() == "hello from build.rs", f"Unexpected content: {ref.read_text()!r}" print("SUCCESS") maturin-1.16.0/test-crates/cffi-mixed-include-exclude/pyproject.toml000066400000000000000000000012571527064705700255350ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "cffi-mixed-include-exclude" readme = "README.md" classifiers = ["Programming Language :: Python", "Programming Language :: Rust"] requires-python = ">=3.7" dependencies = ["cffi; platform_python_implementation != 'PyPy'"] dynamic = ["version"] [tool.maturin] bindings = "cffi" include = [ "cffi_mixed_include_exclude/include_this_file", "missing", "README.md", { path = "generated_info.txt", from = "out-dir", to = "cffi_mixed_include_exclude/" }, ] exclude = [ "cffi_mixed_include_exclude/exclude_this_file", "cffi_mixed_include_exclude/.gitignore", "tests/**/*", "unused", ] maturin-1.16.0/test-crates/cffi-mixed-include-exclude/src/000077500000000000000000000000001527064705700234035ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-include-exclude/src/lib.rs000066400000000000000000000013271527064705700245220ustar00rootroot00000000000000#[repr(C)] pub struct Point { pub x: f32, pub y: f32, } #[repr(u32)] pub enum Foo { A = 1, B, C, } #[no_mangle] pub unsafe extern "C" fn get_origin() -> Point { Point { x: 0.0, y: 0.0 } } #[no_mangle] pub unsafe extern "C" fn add_points(p1: Point, p2: Point) -> Point { Point { x: p1.x + p2.x, y: p1.y + p2.y, } } #[no_mangle] pub unsafe extern "C" fn is_in_range(point: Point, range: f32) -> bool { (point.x.powi(2) + point.y.powi(2)).sqrt() <= range } #[no_mangle] pub unsafe extern "C" fn print_foo(foo: *const Foo) { println!( "{}", match *foo { Foo::A => "a", Foo::B => "b", Foo::C => "c", } ); } maturin-1.16.0/test-crates/cffi-mixed-py-subdir/000077500000000000000000000000001527064705700214605ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-py-subdir/.gitignore000066400000000000000000000000511527064705700234440ustar00rootroot00000000000000python/cffi_mixed_py_subdir/_cffi_mixed/ maturin-1.16.0/test-crates/cffi-mixed-py-subdir/Cargo.lock000066400000000000000000000002441527064705700233650ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "cffi-mixed-py-subdir" version = "0.1.0" maturin-1.16.0/test-crates/cffi-mixed-py-subdir/Cargo.toml000066400000000000000000000003031527064705700234040ustar00rootroot00000000000000[package] name = "cffi-mixed-py-subdir" version = "0.1.0" authors = ["Armin Ronacher "] edition = "2021" [lib] name = "cffi_mixed_py_subdir" crate-type = ["cdylib"] maturin-1.16.0/test-crates/cffi-mixed-py-subdir/README.md000066400000000000000000000005421527064705700227400ustar00rootroot00000000000000# cffi-mixed-py-subdir This fixture exercises a mixed cffi/python package with a Python source subdirectory. ```bash pip install . ``` ```python import cffi_mixed_py_subdir point = cffi_mixed_py_subdir.lib.get_origin() assert cffi_mixed_py_subdir.lib.is_in_range(point, 0.0) ``` The install smoke test lives in `check_installed/check_installed.py`. maturin-1.16.0/test-crates/cffi-mixed-py-subdir/assets/000077500000000000000000000000001527064705700227625ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-py-subdir/assets/extra_data.txt000066400000000000000000000000121527064705700256300ustar00rootroot00000000000000test data maturin-1.16.0/test-crates/cffi-mixed-py-subdir/check_installed/000077500000000000000000000000001527064705700245745ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-py-subdir/check_installed/check_installed.py000077500000000000000000000002471527064705700302700ustar00rootroot00000000000000#!/usr/bin/env python3 import cffi_mixed_py_subdir as cffi_mixed point = cffi_mixed.lib.get_origin() assert cffi_mixed.lib.is_in_range(point, 0.0) print("SUCCESS") maturin-1.16.0/test-crates/cffi-mixed-py-subdir/pyproject.toml000066400000000000000000000010171527064705700243730ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "cffi-mixed-py-subdir" classifiers = [ "Programming Language :: Python", "Programming Language :: Rust" ] requires-python = ">=3.6" dependencies = ["cffi; platform_python_implementation != 'PyPy'"] dynamic = ["version", "description"] # Allow description from Cargo.toml to be used [tool.maturin] bindings = "cffi" module-name = "cffi_mixed_py_subdir._cffi_mixed" python-source = "python" include = ["assets/extra_data.txt"] maturin-1.16.0/test-crates/cffi-mixed-py-subdir/python/000077500000000000000000000000001527064705700230015ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-py-subdir/python/cffi_mixed_py_subdir/000077500000000000000000000000001527064705700271565ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-py-subdir/python/cffi_mixed_py_subdir/__init__.py000066400000000000000000000000741527064705700312700ustar00rootroot00000000000000from ._cffi_mixed import ffi, lib __all__ = ["ffi", "lib"] maturin-1.16.0/test-crates/cffi-mixed-py-subdir/python/cffi_mixed_py_subdir/python_module/000077500000000000000000000000001527064705700320445ustar00rootroot00000000000000__init__.py000066400000000000000000000000001527064705700340640ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-py-subdir/python/cffi_mixed_py_subdir/python_modulematurin-1.16.0/test-crates/cffi-mixed-py-subdir/python/cffi_mixed_py_subdir/python_module/double.py000066400000000000000000000001341527064705700336660ustar00rootroot00000000000000from typing import Callable def double(fn: Callable[[], int]) -> int: return 2 * fn() maturin-1.16.0/test-crates/cffi-mixed-py-subdir/src/000077500000000000000000000000001527064705700222475ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-py-subdir/src/lib.rs000066400000000000000000000013271527064705700233660ustar00rootroot00000000000000#[repr(C)] pub struct Point { pub x: f32, pub y: f32, } #[repr(u32)] pub enum Foo { A = 1, B, C, } #[no_mangle] pub unsafe extern "C" fn get_origin() -> Point { Point { x: 0.0, y: 0.0 } } #[no_mangle] pub unsafe extern "C" fn add_points(p1: Point, p2: Point) -> Point { Point { x: p1.x + p2.x, y: p1.y + p2.y, } } #[no_mangle] pub unsafe extern "C" fn is_in_range(point: Point, range: f32) -> bool { (point.x.powi(2) + point.y.powi(2)).sqrt() <= range } #[no_mangle] pub unsafe extern "C" fn print_foo(foo: *const Foo) { println!( "{}", match *foo { Foo::A => "a", Foo::B => "b", Foo::C => "c", } ); } maturin-1.16.0/test-crates/cffi-mixed-src/000077500000000000000000000000001527064705700203315ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-src/.gitignore000066400000000000000000000000651527064705700223220ustar00rootroot00000000000000*.py[cdo] target/ src/cffi_mixed_src/cffi_mixed_src/ maturin-1.16.0/test-crates/cffi-mixed-src/README.md000066400000000000000000000004631527064705700216130ustar00rootroot00000000000000# cffi-mixed-src This fixture exercises a src-layout mixed cffi/python package. ```bash pip install . ``` ```python import cffi_mixed_src point = cffi_mixed_src.lib.get_origin() assert cffi_mixed_src.lib.is_in_range(point, 0.0) ``` The install smoke test lives in `check_installed/check_installed.py`. maturin-1.16.0/test-crates/cffi-mixed-src/check_installed/000077500000000000000000000000001527064705700234455ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-src/check_installed/check_installed.py000077500000000000000000000002411527064705700271330ustar00rootroot00000000000000#!/usr/bin/env python3 import cffi_mixed_src as cffi_mixed point = cffi_mixed.lib.get_origin() assert cffi_mixed.lib.is_in_range(point, 0.0) print("SUCCESS") maturin-1.16.0/test-crates/cffi-mixed-src/pyproject.toml000066400000000000000000000006261527064705700232510ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "cffi-mixed-src" readme = "README.md" classifiers = [ "Programming Language :: Python", "Programming Language :: Rust" ] requires-python = ">=3.7" dependencies = ["cffi; platform_python_implementation != 'PyPy'"] dynamic = ["version"] [tool.maturin] bindings = "cffi" python-packages = ["cffi_mixed_src"] maturin-1.16.0/test-crates/cffi-mixed-src/rust/000077500000000000000000000000001527064705700213265ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-src/rust/Cargo.lock000066400000000000000000000002361527064705700232340ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "cffi-mixed-src" version = "0.1.0" maturin-1.16.0/test-crates/cffi-mixed-src/rust/Cargo.toml000066400000000000000000000002671527064705700232630ustar00rootroot00000000000000[package] name = "cffi-mixed-src" version = "0.1.0" authors = ["Armin Ronacher "] edition = "2021" [lib] name = "cffi_mixed_src" crate-type = ["cdylib"] maturin-1.16.0/test-crates/cffi-mixed-src/rust/src/000077500000000000000000000000001527064705700221155ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-src/rust/src/lib.rs000066400000000000000000000013271527064705700232340ustar00rootroot00000000000000#[repr(C)] pub struct Point { pub x: f32, pub y: f32, } #[repr(u32)] pub enum Foo { A = 1, B, C, } #[no_mangle] pub unsafe extern "C" fn get_origin() -> Point { Point { x: 0.0, y: 0.0 } } #[no_mangle] pub unsafe extern "C" fn add_points(p1: Point, p2: Point) -> Point { Point { x: p1.x + p2.x, y: p1.y + p2.y, } } #[no_mangle] pub unsafe extern "C" fn is_in_range(point: Point, range: f32) -> bool { (point.x.powi(2) + point.y.powi(2)).sqrt() <= range } #[no_mangle] pub unsafe extern "C" fn print_foo(foo: *const Foo) { println!( "{}", match *foo { Foo::A => "a", Foo::B => "b", Foo::C => "c", } ); } maturin-1.16.0/test-crates/cffi-mixed-src/src/000077500000000000000000000000001527064705700211205ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-src/src/cffi_mixed_src/000077500000000000000000000000001527064705700240645ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-src/src/cffi_mixed_src/__init__.py000066400000000000000000000000771527064705700262010ustar00rootroot00000000000000from .cffi_mixed_src import ffi, lib __all__ = ["ffi", "lib"] maturin-1.16.0/test-crates/cffi-mixed-src/src/cffi_mixed_src/python_module/000077500000000000000000000000001527064705700267525ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-src/src/cffi_mixed_src/python_module/__init__.py000066400000000000000000000000001527064705700310510ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-src/src/cffi_mixed_src/python_module/double.py000066400000000000000000000001341527064705700305740ustar00rootroot00000000000000from typing import Callable def double(fn: Callable[[], int]) -> int: return 2 * fn() maturin-1.16.0/test-crates/cffi-mixed-submodule/000077500000000000000000000000001527064705700215415ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-submodule/.gitignore000066400000000000000000000000471527064705700235320ustar00rootroot00000000000000cffi_mixed_submodule/rust_module/rust/ maturin-1.16.0/test-crates/cffi-mixed-submodule/Cargo.lock000066400000000000000000000002441527064705700234460ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "cffi-mixed-submodule" version = "0.1.0" maturin-1.16.0/test-crates/cffi-mixed-submodule/Cargo.toml000066400000000000000000000003031527064705700234650ustar00rootroot00000000000000[package] name = "cffi-mixed-submodule" version = "0.1.0" authors = ["Armin Ronacher "] edition = "2021" [lib] name = "cffi_mixed_submodule" crate-type = ["cdylib"] maturin-1.16.0/test-crates/cffi-mixed-submodule/README.md000066400000000000000000000005231527064705700230200ustar00rootroot00000000000000# cffi-mixed-submodule This fixture exercises a mixed cffi/python package with a Rust-backed submodule. ```bash pip install . ``` ```python from cffi_mixed_submodule.rust_module import rust point = rust.lib.get_origin() assert rust.lib.is_in_range(point, 0.0) ``` The install smoke test lives in `check_installed/check_installed.py`. maturin-1.16.0/test-crates/cffi-mixed-submodule/cffi_mixed_submodule/000077500000000000000000000000001527064705700257155ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-submodule/cffi_mixed_submodule/__init__.py000066400000000000000000000000621527064705700300240ustar00rootroot00000000000000from .rust_module import rust __all__ = ["rust"] maturin-1.16.0/test-crates/cffi-mixed-submodule/cffi_mixed_submodule/python_module/000077500000000000000000000000001527064705700306035ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-submodule/cffi_mixed_submodule/python_module/__init__.py000066400000000000000000000000001527064705700327020ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-submodule/cffi_mixed_submodule/python_module/double.py000066400000000000000000000001341527064705700324250ustar00rootroot00000000000000from typing import Callable def double(fn: Callable[[], int]) -> int: return 2 * fn() maturin-1.16.0/test-crates/cffi-mixed-submodule/cffi_mixed_submodule/rust_module/000077500000000000000000000000001527064705700302575ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-submodule/cffi_mixed_submodule/rust_module/__init__.py000066400000000000000000000000471527064705700323710ustar00rootroot00000000000000from . import rust __all__ = ["rust"] maturin-1.16.0/test-crates/cffi-mixed-submodule/check_installed/000077500000000000000000000000001527064705700246555ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-submodule/check_installed/check_installed.py000077500000000000000000000002431527064705700303450ustar00rootroot00000000000000#!/usr/bin/env python3 from cffi_mixed_submodule.rust_module import rust point = rust.lib.get_origin() assert rust.lib.is_in_range(point, 0.0) print("SUCCESS") maturin-1.16.0/test-crates/cffi-mixed-submodule/pyproject.toml000066400000000000000000000005761527064705700244650ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "cffi-mixed-submodule" classifiers = [ "Programming Language :: Python", "Programming Language :: Rust" ] dependencies = ["cffi; platform_python_implementation != 'PyPy'"] dynamic = ["version"] [tool.maturin] bindings = "cffi" module-name = "cffi_mixed_submodule.rust_module.rust" maturin-1.16.0/test-crates/cffi-mixed-submodule/src/000077500000000000000000000000001527064705700223305ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-submodule/src/lib.rs000066400000000000000000000013271527064705700234470ustar00rootroot00000000000000#[repr(C)] pub struct Point { pub x: f32, pub y: f32, } #[repr(u32)] pub enum Foo { A = 1, B, C, } #[no_mangle] pub unsafe extern "C" fn get_origin() -> Point { Point { x: 0.0, y: 0.0 } } #[no_mangle] pub unsafe extern "C" fn add_points(p1: Point, p2: Point) -> Point { Point { x: p1.x + p2.x, y: p1.y + p2.y, } } #[no_mangle] pub unsafe extern "C" fn is_in_range(point: Point, range: f32) -> bool { (point.x.powi(2) + point.y.powi(2)).sqrt() <= range } #[no_mangle] pub unsafe extern "C" fn print_foo(foo: *const Foo) { println!( "{}", match *foo { Foo::A => "a", Foo::B => "b", Foo::C => "c", } ); } maturin-1.16.0/test-crates/cffi-mixed-with-path-dep/000077500000000000000000000000001527064705700222155ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-with-path-dep/.gitignore000066400000000000000000000000751527064705700242070ustar00rootroot00000000000000*.py[cdo] cffi_mixed_with_path_dep/cffi_mixed_with_path_dep/ maturin-1.16.0/test-crates/cffi-mixed-with-path-dep/Cargo.lock000066400000000000000000000005521527064705700241240ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "cffi-mixed-with-path-dep" version = "2.1.3" dependencies = [ "some_path_dep", ] [[package]] name = "some_path_dep" version = "0.1.0" dependencies = [ "transitive_path_dep", ] [[package]] name = "transitive_path_dep" version = "0.1.0" maturin-1.16.0/test-crates/cffi-mixed-with-path-dep/Cargo.toml000066400000000000000000000003331527064705700241440ustar00rootroot00000000000000[package] authors = [] name = "cffi-mixed-with-path-dep" version = "2.1.3" edition = "2021" [dependencies] some_path_dep = { path = "../some_path_dep" } [lib] name = "cffi_mixed_with_path_dep" crate-type = ["cdylib"] maturin-1.16.0/test-crates/cffi-mixed-with-path-dep/README.md000066400000000000000000000005461527064705700235010ustar00rootroot00000000000000# cffi-mixed-with-path-dep This fixture exercises a mixed cffi/python package with a Rust path dependency. ```bash pip install . ``` ```python import cffi_mixed_with_path_dep assert cffi_mixed_with_path_dep.lib.get_21() == 21 assert cffi_mixed_with_path_dep.lib.add_21(21) == 42 ``` The install smoke test lives in `check_installed/check_installed.py`. maturin-1.16.0/test-crates/cffi-mixed-with-path-dep/cffi_mixed_with_path_dep/000077500000000000000000000000001527064705700272115ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-with-path-dep/cffi_mixed_with_path_dep/__init__.py000066400000000000000000000001111527064705700313130ustar00rootroot00000000000000from .cffi_mixed_with_path_dep import ffi, lib __all__ = ["ffi", "lib"] maturin-1.16.0/test-crates/cffi-mixed-with-path-dep/check_installed/000077500000000000000000000000001527064705700253315ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-with-path-dep/check_installed/check_installed.py000077500000000000000000000006021527064705700310200ustar00rootroot00000000000000#!/usr/bin/env python3 import cffi_mixed_with_path_dep assert cffi_mixed_with_path_dep.lib.get_21() == 21, "get_21 did not return 21" assert cffi_mixed_with_path_dep.lib.add_21(21) == 42, "add_21 did not return 42" assert cffi_mixed_with_path_dep.lib.is_half(21, 42), "21 is not half of 42" assert not cffi_mixed_with_path_dep.lib.is_half(21, 73), "21 is half of 73" print("SUCCESS") maturin-1.16.0/test-crates/cffi-mixed-with-path-dep/pyproject.toml000066400000000000000000000005731527064705700251360ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "cffi-mixed-with-path-dep" readme = "README.md" classifiers = [ "Programming Language :: Python", "Programming Language :: Rust" ] requires-python = ">=3.7" dependencies = ["cffi; platform_python_implementation != 'PyPy'"] dynamic = ["version"] [tool.maturin] bindings = "cffi" maturin-1.16.0/test-crates/cffi-mixed-with-path-dep/src/000077500000000000000000000000001527064705700230045ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed-with-path-dep/src/lib.rs000066400000000000000000000004471527064705700241250ustar00rootroot00000000000000use some_path_dep::{add, is_sum}; #[no_mangle] pub unsafe extern "C" fn get_21() -> usize { 21 } #[no_mangle] pub unsafe extern "C" fn add_21(num: usize) -> usize { add(num, get_21()) } #[no_mangle] pub unsafe extern "C" fn is_half(a: usize, b: usize) -> bool { is_sum(a, a, b) } maturin-1.16.0/test-crates/cffi-mixed/000077500000000000000000000000001527064705700175445ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed/.gitignore000066400000000000000000000000261527064705700215320ustar00rootroot00000000000000cffi_mixed/cffi_mixed maturin-1.16.0/test-crates/cffi-mixed/Cargo.lock000066400000000000000000000002151527064705700214470ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] name = "cffi-mixed" version = "0.1.0" maturin-1.16.0/test-crates/cffi-mixed/Cargo.toml000066400000000000000000000002571527064705700215000ustar00rootroot00000000000000[package] name = "cffi-mixed" version = "0.1.0" authors = ["Armin Ronacher "] edition = "2021" [lib] name = "cffi_mixed" crate-type = ["cdylib"] maturin-1.16.0/test-crates/cffi-mixed/Readme.md000066400000000000000000000013761527064705700212720ustar00rootroot00000000000000# cffi-mixed A package for testing maturin with a cffi wrapper with a rust backend and a python wrapper. Read the [cffi guide](https://cffi.readthedocs.io/en/latest/index.html) to learn how to use the generated `ffi` and `lib` objects. The package contains a `Point` type implemented in rust and a `Line` class consisting of two points implemented in python ## Usage ```bash pip install . ``` ```python import cffi_mixed from cffi_mixed import Line point = cffi_mixed.lib.get_origin() point.x = 10 point.y = 10 assert cffi_mixed.lib.is_in_range(point, 15) assert Line(2, 5, 6, 8).length() == 5 ``` ## Testing Install tox: ```bash pip install tox ``` Run it: ```bash tox ``` The tests are in `test_cffi_mixed.py`, while the configuration is in tox.ini maturin-1.16.0/test-crates/cffi-mixed/cffi_mixed/000077500000000000000000000000001527064705700216415ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed/cffi_mixed/__init__.py000066400000000000000000000001321527064705700237460ustar00rootroot00000000000000from .cffi_mixed import ffi, lib from .line import Line __all__ = ["Line", "ffi", "lib"] maturin-1.16.0/test-crates/cffi-mixed/cffi_mixed/line.py000066400000000000000000000011351527064705700231420ustar00rootroot00000000000000import math from .cffi_mixed import ffi class Line: def __init__(self, x1: float, y1: float, x2: float, y2: float): # You can pass a tuple/list or a dict as value for a public rust struct self.start = ffi.new("Point *", {"x": x1, "y": y1}) self.end = ffi.new("Point *", (x2, y2)) def length(self) -> float: """Returns the length of the line.""" return math.sqrt((self.end.x - self.start.x) ** 2 + (self.end.y - self.start.y) ** 2) def __str__(self) -> str: return f"Line from ({self.start.x},{self.start.y}) to ({self.end.x},{self.end.y})" maturin-1.16.0/test-crates/cffi-mixed/check_installed/000077500000000000000000000000001527064705700226605ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed/check_installed/check_installed.py000077500000000000000000000003531527064705700263520ustar00rootroot00000000000000#!/usr/bin/env python3 import cffi_mixed from cffi_mixed import Line point = cffi_mixed.lib.get_origin() point.x = 10 point.y = 10 assert cffi_mixed.lib.is_in_range(point, 15) assert Line(2, 5, 6, 8).length() == 5 print("SUCCESS") maturin-1.16.0/test-crates/cffi-mixed/pyproject.toml000066400000000000000000000003431527064705700224600ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "cffi-mixed" dependencies = ["cffi; platform_python_implementation != 'PyPy'"] dynamic = ["version"] [tool.maturin] bindings = "cffi" maturin-1.16.0/test-crates/cffi-mixed/requirements_test.txt000066400000000000000000000000141527064705700240620ustar00rootroot00000000000000pytest cffi maturin-1.16.0/test-crates/cffi-mixed/src/000077500000000000000000000000001527064705700203335ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-mixed/src/lib.rs000066400000000000000000000013271527064705700214520ustar00rootroot00000000000000#[repr(C)] pub struct Point { pub x: f32, pub y: f32, } #[repr(u32)] pub enum Foo { A = 1, B, C, } #[no_mangle] pub unsafe extern "C" fn get_origin() -> Point { Point { x: 0.0, y: 0.0 } } #[no_mangle] pub unsafe extern "C" fn add_points(p1: Point, p2: Point) -> Point { Point { x: p1.x + p2.x, y: p1.y + p2.y, } } #[no_mangle] pub unsafe extern "C" fn is_in_range(point: Point, range: f32) -> bool { (point.x.powi(2) + point.y.powi(2)).sqrt() <= range } #[no_mangle] pub unsafe extern "C" fn print_foo(foo: *const Foo) { println!( "{}", match *foo { Foo::A => "a", Foo::B => "b", Foo::C => "c", } ); } maturin-1.16.0/test-crates/cffi-mixed/test_cffi_mixed.py000077500000000000000000000010161527064705700232530ustar00rootroot00000000000000#!/usr/bin/env python3 import cffi_mixed from cffi_mixed import Line def test_in_range(): point = cffi_mixed.lib.get_origin() point.x = 10 point.y = 10 assert not cffi_mixed.lib.is_in_range(point, 14) assert cffi_mixed.lib.is_in_range(point, 15) def test_ffi(): point = cffi_mixed.ffi.new("Point *", (10, 20)) assert point.x == 10 assert point.y == 20 def test_line(): line = Line(2, 5, 6, 8) assert line.length() == 5 assert str(line) == "Line from (2.0,5.0) to (6.0,8.0)" maturin-1.16.0/test-crates/cffi-mixed/tox.ini000066400000000000000000000001401527064705700210520ustar00rootroot00000000000000[tox] envlist = py36,py37,py38 isolated_build = True [testenv] deps = pytest commands = pytest maturin-1.16.0/test-crates/cffi-pure/000077500000000000000000000000001527064705700174115ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-pure/.gitignore000066400000000000000000000000241527064705700213750ustar00rootroot00000000000000cffi_pure/cffi_pure maturin-1.16.0/test-crates/cffi-pure/Cargo.lock000066400000000000000000000002141527064705700213130ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] name = "cffi-pure" version = "0.1.0" maturin-1.16.0/test-crates/cffi-pure/Cargo.toml000066400000000000000000000002551527064705700213430ustar00rootroot00000000000000[package] name = "cffi-pure" version = "0.1.0" authors = ["Armin Ronacher "] edition = "2021" [lib] name = "cffi_pure" crate-type = ["cdylib"] maturin-1.16.0/test-crates/cffi-pure/Readme.md000066400000000000000000000010351527064705700211270ustar00rootroot00000000000000# cffi-pure A package for testing a crate with cffi bindings with maturin. Read the [cffi guide](https://cffi.readthedocs.io/en/latest/index.html) to learn how to use the generated `ffi` and `lib` objects. ## Usage ```bash pip install . ``` ```python import cffi_pure point = cffi_pure.lib.get_origin() point.x = 10 point.y = 10 assert cffi_pure.lib.is_in_range(point, 15) ``` ## Testing Install tox: ```bash pip install tox ``` Run it: ```bash tox ``` The tests are in `test_cffi_pure.py`, while the configuration is in tox.ini maturin-1.16.0/test-crates/cffi-pure/check_installed/000077500000000000000000000000001527064705700225255ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-pure/check_installed/check_installed.py000077500000000000000000000002451527064705700262170ustar00rootroot00000000000000#!/usr/bin/env python3 import cffi_pure point = cffi_pure.lib.get_origin() point.x = 10 point.y = 10 assert cffi_pure.lib.is_in_range(point, 15) print("SUCCESS") maturin-1.16.0/test-crates/cffi-pure/pyproject.toml000066400000000000000000000003741527064705700223310ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "cffi-pure" dependencies = ["cffi; platform_python_implementation != 'PyPy'"] dynamic = ["version"] [tool.maturin] bindings = "cffi" include-import-lib = true maturin-1.16.0/test-crates/cffi-pure/requirements_test.txt000066400000000000000000000000141527064705700237270ustar00rootroot00000000000000pytest cffi maturin-1.16.0/test-crates/cffi-pure/src/000077500000000000000000000000001527064705700202005ustar00rootroot00000000000000maturin-1.16.0/test-crates/cffi-pure/src/lib.rs000066400000000000000000000011001527064705700213040ustar00rootroot00000000000000#[repr(C)] pub struct Point { pub x: f32, pub y: f32, } #[repr(u32)] pub enum Foo { A = 1, B, C, } #[no_mangle] pub unsafe extern "C" fn get_origin() -> Point { Point { x: 0.0, y: 0.0 } } #[no_mangle] pub unsafe extern "C" fn is_in_range(point: Point, range: f32) -> bool { (point.x.powi(2) + point.y.powi(2)).sqrt() <= range } #[no_mangle] pub unsafe extern "C" fn print_foo(foo: *const Foo) { println!( "{}", match *foo { Foo::A => "a", Foo::B => "b", Foo::C => "c", } ); } maturin-1.16.0/test-crates/cffi-pure/test_cffi_pure.py000077500000000000000000000005421527064705700227700ustar00rootroot00000000000000#!/usr/bin/env python3 import cffi_pure def test_range(): point = cffi_pure.lib.get_origin() point.x = 10 point.y = 10 assert not cffi_pure.lib.is_in_range(point, 14) assert cffi_pure.lib.is_in_range(point, 15) def test_ffi(): point = cffi_pure.ffi.new("Point *", (10, 20)) assert point.x == 10 assert point.y == 20 maturin-1.16.0/test-crates/cffi-pure/tox.ini000066400000000000000000000001401527064705700207170ustar00rootroot00000000000000[tox] envlist = py36,py37,py38 isolated_build = True [testenv] deps = pytest commands = pytest maturin-1.16.0/test-crates/external-python-source/000077500000000000000000000000001527064705700221705ustar00rootroot00000000000000maturin-1.16.0/test-crates/external-python-source/crate/000077500000000000000000000000001527064705700232665ustar00rootroot00000000000000maturin-1.16.0/test-crates/external-python-source/crate/.gitignore000066400000000000000000000000101527064705700252450ustar00rootroot00000000000000target/ maturin-1.16.0/test-crates/external-python-source/crate/Cargo.lock000066400000000000000000000002461527064705700251750ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "external-python-source" version = "0.1.0" maturin-1.16.0/test-crates/external-python-source/crate/Cargo.toml000066400000000000000000000002131527064705700252120ustar00rootroot00000000000000[package] name = "external-python-source" version = "0.1.0" edition = "2021" [[bin]] name = "external-python-source" path = "src/main.rs" maturin-1.16.0/test-crates/external-python-source/crate/pyproject.toml000066400000000000000000000003531527064705700262030ustar00rootroot00000000000000[project] name = "external-python-source" version = "0.1.0" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [tool.maturin] bindings = "bin" python-source = "../python" module-name = "external_python_source" maturin-1.16.0/test-crates/external-python-source/crate/src/000077500000000000000000000000001527064705700240555ustar00rootroot00000000000000maturin-1.16.0/test-crates/external-python-source/crate/src/main.rs000066400000000000000000000001021527064705700253400ustar00rootroot00000000000000fn main() { println!("Hello from external-python-source!"); } maturin-1.16.0/test-crates/external-python-source/python/000077500000000000000000000000001527064705700235115ustar00rootroot00000000000000maturin-1.16.0/test-crates/external-python-source/python/external_python_source/000077500000000000000000000000001527064705700303145ustar00rootroot00000000000000maturin-1.16.0/test-crates/external-python-source/python/external_python_source/__init__.py000066400000000000000000000000461527064705700324250ustar00rootroot00000000000000"""External python source package.""" maturin-1.16.0/test-crates/hello-world/000077500000000000000000000000001527064705700177615ustar00rootroot00000000000000maturin-1.16.0/test-crates/hello-world/Cargo.lock000066400000000000000000000002161527064705700216650ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] name = "hello-world" version = "0.1.0" maturin-1.16.0/test-crates/hello-world/Cargo.toml000066400000000000000000000005631527064705700217150ustar00rootroot00000000000000[package] name = "hello-world" version = "0.1.0" authors = ["konstin "] edition = "2021" # Test references to out-of-project files readme = "../../README.md" default-run = "hello-world" [dependencies] [[bench]] name = "excluded_bench" [[bench]] name = "included_bench" [[example]] name = "excluded_example" [[example]] name = "included_example" maturin-1.16.0/test-crates/hello-world/LICENSE000066400000000000000000000000151527064705700207620ustar00rootroot00000000000000Test license maturin-1.16.0/test-crates/hello-world/benches/000077500000000000000000000000001527064705700213705ustar00rootroot00000000000000maturin-1.16.0/test-crates/hello-world/benches/excluded_bench.rs000066400000000000000000000000151527064705700246660ustar00rootroot00000000000000fn main() {} maturin-1.16.0/test-crates/hello-world/benches/included_bench.rs000066400000000000000000000000151527064705700246600ustar00rootroot00000000000000fn main() {} maturin-1.16.0/test-crates/hello-world/check_installed/000077500000000000000000000000001527064705700230755ustar00rootroot00000000000000maturin-1.16.0/test-crates/hello-world/check_installed/check_installed.py000066400000000000000000000006121527064705700265620ustar00rootroot00000000000000from subprocess import check_output def main(): output = check_output(["hello-world"]).decode("utf-8").strip() if not output == "Hello, world!": raise RuntimeError(output) output = check_output(["foo"]).decode("utf-8").strip() if not output == "🦀 Hello, world! 🦀": raise RuntimeError(output) print("SUCCESS") if __name__ == "__main__": main() maturin-1.16.0/test-crates/hello-world/examples/000077500000000000000000000000001527064705700215775ustar00rootroot00000000000000maturin-1.16.0/test-crates/hello-world/examples/excluded_example.rs000066400000000000000000000000151527064705700254510ustar00rootroot00000000000000fn main() {} maturin-1.16.0/test-crates/hello-world/examples/included_example.rs000066400000000000000000000000151527064705700254430ustar00rootroot00000000000000fn main() {} maturin-1.16.0/test-crates/hello-world/licenses/000077500000000000000000000000001527064705700215665ustar00rootroot00000000000000maturin-1.16.0/test-crates/hello-world/licenses/AUTHORS.txt000066400000000000000000000001041527064705700234470ustar00rootroot00000000000000Test Author Another Author maturin-1.16.0/test-crates/hello-world/pyproject.toml000066400000000000000000000007601527064705700227000ustar00rootroot00000000000000[project] name = "hello-world" version = "0.1.0" license-files = ["LICENSE", "licenses/*"] dynamic = ["authors", "readme"] # Allow authors and readme from Cargo.toml to be used [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [tool.maturin] bindings = "bin" pgo-command = "hello-world" exclude = [ "benches/excluded_bench.rs", "examples/excluded_example.rs", ] [[tool.maturin.targets]] name = "hello-world" bindings = "bin" [[tool.maturin.targets]] name = "foo" maturin-1.16.0/test-crates/hello-world/src/000077500000000000000000000000001527064705700205505ustar00rootroot00000000000000maturin-1.16.0/test-crates/hello-world/src/bin/000077500000000000000000000000001527064705700213205ustar00rootroot00000000000000maturin-1.16.0/test-crates/hello-world/src/bin/foo.rs000066400000000000000000000000671527064705700224540ustar00rootroot00000000000000fn main() { println!("🦀 Hello, world! 🦀"); } maturin-1.16.0/test-crates/hello-world/src/main.rs000066400000000000000000000000551527064705700220420ustar00rootroot00000000000000fn main() { println!("Hello, world!"); } maturin-1.16.0/test-crates/lib_with_disallowed_lib/000077500000000000000000000000001527064705700223675ustar00rootroot00000000000000maturin-1.16.0/test-crates/lib_with_disallowed_lib/Cargo.lock000066400000000000000000000075401527064705700243020ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "cc" version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c891175c3fb232128f48de6590095e59198bbeb8620c310be349bfc3afd12c7b" [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "lib_with_disallowed_lib" version = "0.1.0" dependencies = [ "libz-sys", "pyo3", ] [[package]] name = "libc" version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libz-sys" version = "1.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" dependencies = [ "cc", "pkg-config", "vcpkg", ] [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "pkg-config" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.28.3" source = "git+https://github.com/pyo3/pyo3#504d46816eb928110c926aaf4b4ce2bb35f62c32" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.28.3" source = "git+https://github.com/pyo3/pyo3#504d46816eb928110c926aaf4b4ce2bb35f62c32" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.28.3" source = "git+https://github.com/pyo3/pyo3#504d46816eb928110c926aaf4b4ce2bb35f62c32" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.28.3" source = "git+https://github.com/pyo3/pyo3#504d46816eb928110c926aaf4b4ce2bb35f62c32" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.28.3" source = "git+https://github.com/pyo3/pyo3#504d46816eb928110c926aaf4b4ce2bb35f62c32" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "vcpkg" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" maturin-1.16.0/test-crates/lib_with_disallowed_lib/Cargo.toml000066400000000000000000000004031527064705700243140ustar00rootroot00000000000000[package] name = "lib_with_disallowed_lib" version = "0.1.0" authors = ["messense "] edition = "2021" [lib] crate-type = ["cdylib"] [dependencies] libz-sys = { version = "1.1.2", default-features = false } pyo3 = { version = "0.29.0" } maturin-1.16.0/test-crates/lib_with_disallowed_lib/pyproject.toml000066400000000000000000000001121527064705700252750ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" maturin-1.16.0/test-crates/lib_with_disallowed_lib/src/000077500000000000000000000000001527064705700231565ustar00rootroot00000000000000maturin-1.16.0/test-crates/lib_with_disallowed_lib/src/lib.rs000066400000000000000000000006611527064705700242750ustar00rootroot00000000000000use std::os::raw::c_ulong; use pyo3::prelude::*; #[link(name = "z")] extern "C" { fn gzflags() -> c_ulong; } #[pyfunction] fn add(x: usize, y: usize) -> usize { let _version = unsafe { libz_sys::zlibVersion() }; let _flags = unsafe { gzflags() }; let sum = x + y; sum } #[pymodule] fn lib_with_disallowed_lib(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(add))?; Ok(()) } maturin-1.16.0/test-crates/lib_with_path_dep/000077500000000000000000000000001527064705700211765ustar00rootroot00000000000000maturin-1.16.0/test-crates/lib_with_path_dep/Cargo.toml000066400000000000000000000003571527064705700231330ustar00rootroot00000000000000[package] name = "lib_with_path_dep" version = "0.1.0" authors = ["konstin "] edition = "2021" [lib] crate-type = ["cdylib"] [dependencies] pyo3 = { version = "0.29.0" } some_path_dep = { path = "../some_path_dep" } maturin-1.16.0/test-crates/lib_with_path_dep/pyproject.toml000066400000000000000000000001121527064705700241040ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" maturin-1.16.0/test-crates/lib_with_path_dep/src/000077500000000000000000000000001527064705700217655ustar00rootroot00000000000000maturin-1.16.0/test-crates/lib_with_path_dep/src/lib.rs000066400000000000000000000004671527064705700231100ustar00rootroot00000000000000use pyo3::prelude::*; #[pyfunction] fn add(x: usize, y: usize) -> usize { let sum = some_path_dep::add(x, y); debug_assert!(some_path_dep::is_sum(x, y, sum)); sum } #[pymodule] fn lib_with_path_dep(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(add))?; Ok(()) } maturin-1.16.0/test-crates/lib_with_path_dep/test.sh000066400000000000000000000021311527064705700225060ustar00rootroot00000000000000#!/bin/bash set -ex # The problem with testing this is that we need to go through the PEP 517 so we need a wheel of maturin, # which makes everything complex and slow cd "$(git rev-parse --show-toplevel)" # Go to project root pip uninstall -y lib_with_path_dep 2> /dev/null # Make sure it's actually removed python -c "from lib_with_path_dep import add; assert add(2,2)==4" 2> /dev/null && exit 1 || true # Build maturin wheel cargo run -- build -b bin --strip --manylinux off cargo run -- pep517 write-sdist --manifest-path test-crates/lib_with_path_dep/Cargo.toml --sdist-directory test-crates/lib_with_path_dep/target/wheels # Slower alternative: cargo run -- build -m test-crates/lib_with_path_dep/Cargo.toml -i python # See https://github.com/pypa/pip/issues/6041 # First, use the maturin wheel we just build # Then install lib_with_path_dep from the sdist we build pip install \ --find-links target/wheels/ \ --force-reinstall --no-binary lib_with_path_dep --find-links test-crates/lib_with_path_dep/target/wheels lib_with_path_dep python -c "from lib_with_path_dep import add; assert add(2,2)==4" maturin-1.16.0/test-crates/license-test/000077500000000000000000000000001527064705700201305ustar00rootroot00000000000000maturin-1.16.0/test-crates/license-test/AUTHORS.txt000066400000000000000000000000101527064705700220050ustar00rootroot00000000000000AUTHORS maturin-1.16.0/test-crates/license-test/Cargo.lock000066400000000000000000000002171527064705700220350ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] name = "license-test" version = "0.1.0" maturin-1.16.0/test-crates/license-test/Cargo.toml000066400000000000000000000002171527064705700220600ustar00rootroot00000000000000[package] name = "license-test" version = "0.1.0" authors = ["konstin "] edition = "2021" license = "MIT" [dependencies] maturin-1.16.0/test-crates/license-test/LICENCE.txt000066400000000000000000000000101527064705700217220ustar00rootroot00000000000000LICENCE maturin-1.16.0/test-crates/license-test/LICENSE000066400000000000000000000000101527064705700211240ustar00rootroot00000000000000LICENSE maturin-1.16.0/test-crates/license-test/NOTICE.md000066400000000000000000000000111527064705700214230ustar00rootroot00000000000000# NOTICE maturin-1.16.0/test-crates/license-test/_vendor/000077500000000000000000000000001527064705700215645ustar00rootroot00000000000000maturin-1.16.0/test-crates/license-test/_vendor/AUTHORS.txt000066400000000000000000000000101527064705700234410ustar00rootroot00000000000000AUTHORS maturin-1.16.0/test-crates/license-test/_vendor/COPYING.md000066400000000000000000000000121527064705700232070ustar00rootroot00000000000000# COPYING maturin-1.16.0/test-crates/license-test/_vendor/LICENCE000066400000000000000000000000101527064705700225400ustar00rootroot00000000000000LICENCE maturin-1.16.0/test-crates/license-test/_vendor/LICENSE-APACHE.txt000066400000000000000000000000171527064705700243240ustar00rootroot00000000000000LICENSE-APACHE maturin-1.16.0/test-crates/license-test/_vendor/NOTICE000066400000000000000000000000071527064705700224650ustar00rootroot00000000000000NOTICE maturin-1.16.0/test-crates/license-test/_vendor/nested/000077500000000000000000000000001527064705700230465ustar00rootroot00000000000000maturin-1.16.0/test-crates/license-test/_vendor/nested/LICENSE-BSD000066400000000000000000000000141527064705700244540ustar00rootroot00000000000000LICENSE-BSD maturin-1.16.0/test-crates/license-test/_vendor/nested/NOTICE.md000066400000000000000000000000111527064705700243410ustar00rootroot00000000000000# NOTICE maturin-1.16.0/test-crates/license-test/check_installed/000077500000000000000000000000001527064705700232445ustar00rootroot00000000000000maturin-1.16.0/test-crates/license-test/check_installed/check_installed.py000066400000000000000000000003741527064705700267360ustar00rootroot00000000000000from subprocess import check_output def main(): output = check_output(["license-test"]).decode("utf-8").strip() if not output == "Hello, world!": raise RuntimeError(output) print("SUCCESS") if __name__ == "__main__": main() maturin-1.16.0/test-crates/license-test/pyproject.toml000066400000000000000000000003741527064705700230500ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "license-test" license = { file = "LICENCE.txt" } dynamic = ["version", "license"] # Allow license from Cargo.toml to be used [tool.maturin] bindings = "bin" maturin-1.16.0/test-crates/license-test/src/000077500000000000000000000000001527064705700207175ustar00rootroot00000000000000maturin-1.16.0/test-crates/license-test/src/main.rs000066400000000000000000000000551527064705700222110ustar00rootroot00000000000000fn main() { println!("Hello, world!"); } maturin-1.16.0/test-crates/parent_workspace_sdist/000077500000000000000000000000001527064705700223065ustar00rootroot00000000000000maturin-1.16.0/test-crates/parent_workspace_sdist/Cargo.lock000066400000000000000000000005631527064705700242170ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "log" version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "shared_crate" version = "0.1.0" dependencies = [ "log", ] maturin-1.16.0/test-crates/parent_workspace_sdist/Cargo.toml000066400000000000000000000003711527064705700242370ustar00rootroot00000000000000[workspace] members = ["crates/shared_crate"] exclude = ["crates/pysof"] resolver = "2" [workspace.package] edition = "2021" readme = "README.md" publish = false include = ["src/**", "README.md", "Cargo.toml"] [workspace.dependencies] log = "0.4" maturin-1.16.0/test-crates/parent_workspace_sdist/README.md000066400000000000000000000000231527064705700235600ustar00rootroot00000000000000# Parent workspace maturin-1.16.0/test-crates/parent_workspace_sdist/crates/000077500000000000000000000000001527064705700235675ustar00rootroot00000000000000maturin-1.16.0/test-crates/parent_workspace_sdist/crates/pysof/000077500000000000000000000000001527064705700247275ustar00rootroot00000000000000maturin-1.16.0/test-crates/parent_workspace_sdist/crates/pysof/.gitignore000066400000000000000000000000111527064705700267070ustar00rootroot00000000000000/target/ maturin-1.16.0/test-crates/parent_workspace_sdist/crates/pysof/Cargo.lock000066400000000000000000000065731527064705700266470ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.182" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "proc-macro2" version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "pysof" version = "0.1.0" dependencies = [ "pyo3", "shared_crate", ] [[package]] name = "quote" version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] [[package]] name = "shared_crate" version = "0.1.0" [[package]] name = "syn" version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" maturin-1.16.0/test-crates/parent_workspace_sdist/crates/pysof/Cargo.toml000066400000000000000000000004021527064705700266530ustar00rootroot00000000000000[workspace] members = ["."] resolver = "2" [package] name = "pysof" version = "0.1.0" edition = "2021" [lib] crate-type = ["cdylib"] [dependencies] pyo3 = { version = "0.29.0", features = ["extension-module"] } shared_crate = { path = "../shared_crate" } maturin-1.16.0/test-crates/parent_workspace_sdist/crates/pysof/pyproject.toml000066400000000000000000000002201527064705700276350ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "pysof" version = "0.1.0" requires-python = ">=3.8" maturin-1.16.0/test-crates/parent_workspace_sdist/crates/pysof/src/000077500000000000000000000000001527064705700255165ustar00rootroot00000000000000maturin-1.16.0/test-crates/parent_workspace_sdist/crates/pysof/src/lib.rs000066400000000000000000000003471527064705700266360ustar00rootroot00000000000000use pyo3::prelude::*; #[pyfunction] fn get_value() -> i32 { shared_crate::shared_function() } #[pymodule] fn pysof(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_function(wrap_pyfunction!(get_value, m)?)?; Ok(()) } maturin-1.16.0/test-crates/parent_workspace_sdist/crates/shared_crate/000077500000000000000000000000001527064705700262135ustar00rootroot00000000000000maturin-1.16.0/test-crates/parent_workspace_sdist/crates/shared_crate/Cargo.toml000066400000000000000000000003131527064705700301400ustar00rootroot00000000000000[package] name = "shared_crate" version = "0.1.0" edition.workspace = true readme.workspace = true publish.workspace = true include.workspace = true [lib] [dev-dependencies] log = { workspace = true } maturin-1.16.0/test-crates/parent_workspace_sdist/crates/shared_crate/src/000077500000000000000000000000001527064705700270025ustar00rootroot00000000000000maturin-1.16.0/test-crates/parent_workspace_sdist/crates/shared_crate/src/lib.rs000066400000000000000000000000531527064705700301140ustar00rootroot00000000000000pub fn shared_function() -> i32 { 42 } maturin-1.16.0/test-crates/pyo3-abi3-and-abi3t/000077500000000000000000000000001527064705700207775ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-abi3-and-abi3t/Cargo.lock000066400000000000000000000065031527064705700227100ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "portable-atomic" version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "proc-macro2" version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-abi3-and-abi3t" version = "0.1.0" dependencies = [ "pyo3", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" maturin-1.16.0/test-crates/pyo3-abi3-and-abi3t/Cargo.toml000066400000000000000000000007001527064705700227240ustar00rootroot00000000000000[package] name = "pyo3-abi3-and-abi3t" version = "0.1.0" edition = "2021" description = "Combined abi3 and abi3t test crate for maturin" license = "MIT" [dependencies] pyo3 = { version = "0.29.0" } [features] default = ["abi3-and-abi3t-py315"] abi3-and-abi3t-py315 = [ "pyo3/abi3-py38", "pyo3/abi3t-py315", ] abi3-and-current-abi3t = [ "pyo3/abi3-py38", "pyo3/abi3t", ] [lib] name = "pyo3_abi3_and_abi3t" crate-type = ["cdylib"] maturin-1.16.0/test-crates/pyo3-abi3-and-abi3t/README.md000066400000000000000000000002501527064705700222530ustar00rootroot00000000000000# pyo3-abi3-and-abi3t Test crate for combining PyO3 `abi3` and `abi3t` feature families. The default feature set enables both `pyo3/abi3-py38` and `pyo3/abi3t-py315`. maturin-1.16.0/test-crates/pyo3-abi3-and-abi3t/pyproject.toml000066400000000000000000000004541527064705700237160ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [tool.maturin] bindings = "pyo3" editable-profile = "dev" [project] name = "pyo3_abi3_and_abi3t" version = "0.1.0" description = "Test crate combining abi3 and abi3t features" readme = "README.md" license = { text = "MIT" } maturin-1.16.0/test-crates/pyo3-abi3-and-abi3t/src/000077500000000000000000000000001527064705700215665ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-abi3-and-abi3t/src/lib.rs000066400000000000000000000003421527064705700227010ustar00rootroot00000000000000use pyo3::prelude::*; #[pyfunction] fn answer() -> PyResult { Ok(42) } #[pymodule] fn pyo3_abi3_and_abi3t(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_function(wrap_pyfunction!(answer, m)?)?; Ok(()) } maturin-1.16.0/test-crates/pyo3-abi3-without-version/000077500000000000000000000000001527064705700224235ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-abi3-without-version/Cargo.lock000066400000000000000000000065061527064705700243370ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-abi3-without-version" version = "0.1.0" dependencies = [ "pyo3", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" maturin-1.16.0/test-crates/pyo3-abi3-without-version/Cargo.toml000066400000000000000000000004011527064705700243460ustar00rootroot00000000000000[package] name = "pyo3-abi3-without-version" version = "0.1.0" authors = ["konstin "] edition = "2021" [dependencies] pyo3 = { version = "0.29.0", features = ["abi3"] } [lib] name = "pyo3_abi3_without_version" crate-type = ["cdylib"] maturin-1.16.0/test-crates/pyo3-abi3-without-version/src/000077500000000000000000000000001527064705700232125ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-abi3-without-version/src/lib.rs000066400000000000000000000000001527064705700243140ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-abi3t-without-version/000077500000000000000000000000001527064705700226075ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-abi3t-without-version/Cargo.lock000066400000000000000000000065121527064705700245200ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "portable-atomic" version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "proc-macro2" version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-abi3t-without-version" version = "0.1.0" dependencies = [ "pyo3", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" maturin-1.16.0/test-crates/pyo3-abi3t-without-version/Cargo.toml000066400000000000000000000003301527064705700245330ustar00rootroot00000000000000[package] name = "pyo3-abi3t-without-version" version = "0.1.0" edition = "2021" [dependencies] pyo3 = { version = "0.29.0", features = ["abi3t"] } [lib] name = "pyo3_abi3t_without_version" crate-type = ["cdylib"] maturin-1.16.0/test-crates/pyo3-abi3t-without-version/src/000077500000000000000000000000001527064705700233765ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-abi3t-without-version/src/lib.rs000066400000000000000000000000001527064705700245000ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-abi3t/000077500000000000000000000000001527064705700174235ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-abi3t/Cargo.lock000066400000000000000000000064721527064705700213410ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "portable-atomic" version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "proc-macro2" version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-abi3t" version = "0.1.0" dependencies = [ "pyo3", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" maturin-1.16.0/test-crates/pyo3-abi3t/Cargo.toml000066400000000000000000000004351527064705700213550ustar00rootroot00000000000000[package] name = "pyo3-abi3t" version = "0.1.0" edition = "2021" description = "Free-threaded stable ABI (abi3t) test crate for maturin" license = "MIT" [dependencies] pyo3 = { version = "0.29.0", features = [ "abi3t-py315", ] } [lib] name = "pyo3_abi3t" crate-type = ["cdylib"] maturin-1.16.0/test-crates/pyo3-abi3t/README.md000066400000000000000000000003661527064705700207070ustar00rootroot00000000000000# pyo3-abi3t Test crate for the free-threaded stable ABI (`abi3t`) support in maturin. Requires the `opaque-pyobject` branch of https://github.com/ngoldbaum/pyo3, which provides the `abi3t` and `abi3t-py3XY` features that maturin tests detect. maturin-1.16.0/test-crates/pyo3-abi3t/check_installed/000077500000000000000000000000001527064705700225375ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-abi3t/check_installed/check_installed.py000077500000000000000000000001511527064705700262250ustar00rootroot00000000000000#!/usr/bin/env python3 import pyo3_abi3t assert pyo3_abi3t.DummyClass.get_42() == 42 print("SUCCESS") maturin-1.16.0/test-crates/pyo3-abi3t/pyproject.toml000066400000000000000000000010201527064705700223300ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [tool.maturin] bindings = "pyo3" editable-profile = "dev" [tool.maturin.target."x86_64-apple-darwin"] macos-deployment-target = "10.12" [tool.maturin.target."aarch64-apple-darwin"] macos-deployment-target = "11.0" [project] name = "pyo3_abi3t" version = "0.1.0" classifiers = [ "Programming Language :: Rust" ] description = "Implements a dummy function in Rust using the free-threaded stable ABI" readme = "README.md" license = { text = "MIT" } maturin-1.16.0/test-crates/pyo3-abi3t/src/000077500000000000000000000000001527064705700202125ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-abi3t/src/lib.rs000066400000000000000000000004721527064705700213310ustar00rootroot00000000000000use pyo3::prelude::*; #[pyclass] struct DummyClass {} #[pymethods] impl DummyClass { #[staticmethod] fn get_42() -> PyResult { Ok(42) } } #[pymodule] fn pyo3_abi3t(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_class::()?; m.add("fourtytwo", 42)?; Ok(()) } maturin-1.16.0/test-crates/pyo3-abi3t/tests/000077500000000000000000000000001527064705700205655ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-abi3t/tests/test_pyo3_abi3t.py000077500000000000000000000004411527064705700241540ustar00rootroot00000000000000#!/usr/bin/env python3 import pyo3_abi3t import pytest def test_static(): assert pyo3_abi3t.fourtytwo == 42 def test_class(): assert pyo3_abi3t.DummyClass.get_42() == 42 def test_function(): with pytest.raises(AssertionError): assert pyo3_abi3t.DummyClass == 42 maturin-1.16.0/test-crates/pyo3-bin/000077500000000000000000000000001527064705700171715ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-bin/Cargo.lock000066400000000000000000000064651527064705700211110ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-bin" version = "0.1.0" dependencies = [ "pyo3", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" maturin-1.16.0/test-crates/pyo3-bin/Cargo.toml000066400000000000000000000003571527064705700211260ustar00rootroot00000000000000[package] name = "pyo3-bin" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] pyo3 = { version = "0.29.0", features = ["auto-initialize"] } maturin-1.16.0/test-crates/pyo3-bin/check_installed/000077500000000000000000000000001527064705700223055ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-bin/check_installed/check_installed.py000066400000000000000000000014741527064705700260010ustar00rootroot00000000000000import os import platform import sys import sysconfig from subprocess import check_output def main(): if platform.system().lower() == "windows": # Add sys.base_prefix which contains python3y.dll to PATH # otherwise running `pyo3-bin` might return exit code 3221225781 path = os.environ["PATH"] path = path + os.pathsep + sys.base_prefix os.environ["PATH"] = path else: # similar for non-windows platforms library_path = sysconfig.get_config_var("LIBDIR") os.environ["LD_LIBRARY_PATH"] = library_path os.environ["DYLD_LIBRARY_PATH"] = library_path output = check_output(["pyo3-bin"]).decode("utf-8").strip() if not output == "Hello, world!": raise RuntimeError(output) print("SUCCESS") if __name__ == "__main__": main() maturin-1.16.0/test-crates/pyo3-bin/pyproject.toml000066400000000000000000000003031527064705700221010ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "pyo3-bin" version = "0.1.0" [tool.maturin] pgo-command = "python check_installed/check_installed.py" maturin-1.16.0/test-crates/pyo3-bin/src/000077500000000000000000000000001527064705700177605ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-bin/src/main.rs000066400000000000000000000004541527064705700212550ustar00rootroot00000000000000use pyo3::prelude::*; fn main() -> PyResult<()> { Python::attach(|py| { let builtins = py.import("builtins")?; let total: i32 = builtins.getattr("sum")?.call1((vec![1, 2, 3],))?.extract()?; assert_eq!(total, 6); println!("Hello, world!"); Ok(()) }) } maturin-1.16.0/test-crates/pyo3-cffi-build-script/000077500000000000000000000000001527064705700217275ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-cffi-build-script/Cargo.lock000066400000000000000000000065061527064705700236430ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "portable-atomic" version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "proc-macro2" version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-cffi-build-script" version = "0.1.0" dependencies = [ "pyo3", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" maturin-1.16.0/test-crates/pyo3-cffi-build-script/Cargo.toml000066400000000000000000000003171527064705700236600ustar00rootroot00000000000000[package] name = "pyo3-cffi-build-script" version = "0.1.0" edition = "2021" [dependencies] pyo3 = { version = "0.29.0", features = ["abi3"] } [lib] name = "pyo3_cffi_build_script" crate-type = ["cdylib"] maturin-1.16.0/test-crates/pyo3-cffi-build-script/build.rs000066400000000000000000000015011527064705700233710ustar00rootroot00000000000000//! Models the `cryptography` project: a PyO3 extension whose build script shells //! out to the build interpreter to run cffi. maturin must hand us that //! interpreter via `PYO3_PYTHON`, even for abi3 builds. use std::env; use std::process::Command; fn main() { println!("cargo:rerun-if-env-changed=PYO3_PYTHON"); let python = env::var("PYO3_PYTHON") .expect("PYO3_PYTHON is not set; maturin must hand abi3 builds an interpreter"); let status = Command::new(&python) .args([ "-c", "import cffi; ffi = cffi.FFI(); ffi.cdef('int answer(void);'); \ ffi.set_source('_pyo3_cffi_demo', 'int answer(void) { return 42; }')", ]) .status() .expect("failed to run PYO3_PYTHON"); assert!(status.success(), "cffi codegen via PYO3_PYTHON failed"); } maturin-1.16.0/test-crates/pyo3-cffi-build-script/src/000077500000000000000000000000001527064705700225165ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-cffi-build-script/src/lib.rs000066400000000000000000000002171527064705700236320ustar00rootroot00000000000000use pyo3::prelude::*; #[pymodule] fn pyo3_cffi_build_script(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add("answer", 42)?; Ok(()) } maturin-1.16.0/test-crates/pyo3-feature/000077500000000000000000000000001527064705700200545ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-feature/Cargo.lock000066400000000000000000000064711527064705700217710ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-feature" version = "0.7.3" dependencies = [ "pyo3", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" maturin-1.16.0/test-crates/pyo3-feature/Cargo.toml000066400000000000000000000002561527064705700220070ustar00rootroot00000000000000[package] authors = ["konstin "] name = "pyo3-feature" version = "0.7.3" edition = "2021" [dependencies] pyo3 = { version = "0.29.0", optional = true } maturin-1.16.0/test-crates/pyo3-feature/Readme.md000066400000000000000000000000521527064705700215700ustar00rootroot00000000000000A crate where pyo3 is an optional feature maturin-1.16.0/test-crates/pyo3-feature/src/000077500000000000000000000000001527064705700206435ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-feature/src/lib.rs000066400000000000000000000000001527064705700217450ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-ffi-abi3t-py315/000077500000000000000000000000001527064705700210445ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-ffi-abi3t-py315/Cargo.lock000066400000000000000000000020541527064705700227520ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "libc" version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-ffi-abi3t-py315" version = "0.1.0" dependencies = [ "pyo3-ffi", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" maturin-1.16.0/test-crates/pyo3-ffi-abi3t-py315/Cargo.toml000066400000000000000000000003261527064705700227750ustar00rootroot00000000000000[package] name = "pyo3-ffi-abi3t-py315" version = "0.1.0" edition = "2021" [dependencies] pyo3-ffi = { version = "0.29.0", features = ["abi3t-py315"] } [lib] name = "pyo3_ffi_abi3t_py315" crate-type = ["cdylib"] maturin-1.16.0/test-crates/pyo3-ffi-abi3t-py315/src/000077500000000000000000000000001527064705700216335ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-ffi-abi3t-py315/src/lib.rs000066400000000000000000000000001527064705700227350ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-ffi-pure/000077500000000000000000000000001527064705700201365ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-ffi-pure/Cargo.lock000066400000000000000000000020731527064705700220450ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "libc" version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-ffi-pure" version = "1.0.0" dependencies = [ "pyo3-build-config", "pyo3-ffi", ] [[package]] name = "target-lexicon" version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" maturin-1.16.0/test-crates/pyo3-ffi-pure/Cargo.toml000066400000000000000000000004261527064705700220700ustar00rootroot00000000000000[package] name = "pyo3-ffi-pure" version = "1.0.0" edition = "2021" [dependencies] pyo3-ffi = { version = "0.29.0", features = ["abi3-py39", "abi3t-py315"] } [build-dependencies] pyo3-build-config = { version = "0.29.0" } [lib] name = "pyo3_ffi_pure" crate-type = ["cdylib"] maturin-1.16.0/test-crates/pyo3-ffi-pure/LICENSE000066400000000000000000000020601527064705700211410ustar00rootroot00000000000000Copyright (c) 2022-present maturin contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. maturin-1.16.0/test-crates/pyo3-ffi-pure/README.md000066400000000000000000000003601527064705700214140ustar00rootroot00000000000000# pyo3-ffi-pure A package with pyo3-ffi bindings for testing maturin. ## Usage ```python import pyo3_ffi_pure assert pyo3_ffi_pure.sum(2, 40) == 42 ``` ## Testing Install `pytest` and run: ```bash pytest -v test_pyo3_ffi_pure.py ``` maturin-1.16.0/test-crates/pyo3-ffi-pure/build.rs000066400000000000000000000000661527064705700216050ustar00rootroot00000000000000fn main() { pyo3_build_config::use_pyo3_cfgs(); } maturin-1.16.0/test-crates/pyo3-ffi-pure/check_installed/000077500000000000000000000000001527064705700232525ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-ffi-pure/check_installed/check_installed.py000077500000000000000000000001451527064705700267430ustar00rootroot00000000000000#!/usr/bin/env python3 import pyo3_ffi_pure assert pyo3_ffi_pure.sum(2, 40) == 42 print("SUCCESS") maturin-1.16.0/test-crates/pyo3-ffi-pure/pyproject.toml000066400000000000000000000005721527064705700230560ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "pyo3-ffi-pure" classifiers = [ "Programming Language :: Rust" ] description = "Tests compilation of packages using pyo3-ffi bindings" readme = "README.md" maintainers = [ {name = "messense", email = "messense@icloud.com"} ] license = { file = "LICENSE" } dynamic = ["version"] maturin-1.16.0/test-crates/pyo3-ffi-pure/src/000077500000000000000000000000001527064705700207255ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-ffi-pure/src/lib.rs000066400000000000000000000062361527064705700220500ustar00rootroot00000000000000#[cfg(Py_3_15)] use std::ffi::c_void; use pyo3_ffi::*; #[cfg(not(Py_3_15))] static mut MODULE_DEF: PyModuleDef = PyModuleDef { m_base: PyModuleDef_HEAD_INIT, m_name: c"string_sum".as_ptr(), m_doc: c"A Python module written in Rust.".as_ptr(), m_size: 0, m_methods: std::ptr::addr_of_mut!(METHODS).cast(), m_slots: std::ptr::addr_of_mut!(SLOTS).cast(), m_traverse: None, m_clear: None, m_free: None, }; static mut METHODS: [PyMethodDef; 2] = [ PyMethodDef { ml_name: c"sum".as_ptr(), ml_meth: PyMethodDefPointer { PyCFunctionWithKeywords: sum, }, ml_flags: METH_VARARGS | METH_KEYWORDS, ml_doc: c"returns the sum of two integers".as_ptr(), }, // A zeroed PyMethodDef to mark the end of the array. PyMethodDef::zeroed(), ]; #[cfg(Py_3_15)] PyABIInfo_VAR!(ABI_INFO); const SLOTS_LEN: usize = 1 + cfg!(Py_3_12) as usize + cfg!(Py_GIL_DISABLED) as usize + 4 * (cfg!(Py_3_15) as usize); #[cfg(Py_3_15)] static mut SLOTS: [PySlot; SLOTS_LEN] = [ PySlot_STATIC_DATA(Py_mod_abi, (&raw mut ABI_INFO).cast()), PySlot_STATIC_DATA(Py_mod_name, c"string_sum".as_ptr() as *mut c_void), PySlot_STATIC_DATA( Py_mod_doc, c"A Python module written in Rust.".as_ptr() as *mut c_void, ), PySlot_STATIC_DATA(Py_mod_methods, (&raw mut METHODS).cast()), PySlot_DATA( Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED, ), #[cfg(Py_GIL_DISABLED)] PySlot_DATA(Py_mod_gil, Py_MOD_GIL_NOT_USED), PySlot_END(), ]; #[cfg(not(Py_3_15))] static mut SLOTS: [PyModuleDef_Slot; SLOTS_LEN] = [ // NB: only include this slot if the module does not store any global state in `static` variables // or other data which could cross between subinterpreters #[cfg(Py_3_12)] PyModuleDef_Slot { slot: Py_mod_multiple_interpreters, value: Py_MOD_PER_INTERPRETER_GIL_SUPPORTED, }, // NB: only include this slot if the module does not depend on the GIL for thread safety #[cfg(Py_GIL_DISABLED)] PyModuleDef_Slot { slot: Py_mod_gil, value: Py_MOD_GIL_NOT_USED, }, PyModuleDef_Slot { slot: 0, value: std::ptr::null_mut(), }, ]; // The module initialization function #[cfg(not(Py_3_15))] #[allow(non_snake_case, reason = "must be named `PyInit_`")] #[no_mangle] pub unsafe extern "C" fn PyInit_pyo3_ffi_pure() -> *mut PyObject { PyModuleDef_Init(&raw mut MODULE_DEF) } #[cfg(Py_3_15)] #[allow(non_snake_case, reason = "must be named `PyModExport_`")] #[no_mangle] pub unsafe extern "C" fn PyModExport_pyo3_ffi_pure() -> *mut PyModuleDef_Slot { (&raw mut SLOTS).cast() } // The module initialization function, which must be named `PyInit_`. #[no_mangle] pub unsafe extern "C" fn sum( _self: *mut PyObject, args: *mut PyObject, _kwds: *mut PyObject, ) -> *mut PyObject { // this is a minimal test of compilation, not good example code let val_a = PyTuple_GetItem(args, 0); let val_b = PyTuple_GetItem(args, 1); let res: i64 = PyLong_AsLongLong(val_a) + PyLong_AsLongLong(val_b); PyLong_FromLongLong(res) } maturin-1.16.0/test-crates/pyo3-ffi-pure/test_pyo3_ffi_pure.py000077500000000000000000000001541527064705700243230ustar00rootroot00000000000000#!/usr/bin/env python3 import pyo3_ffi_pure def test_static(): assert pyo3_ffi_pure.sum(2, 40) == 42 maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/000077500000000000000000000000001527064705700225775ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/.gitignore000066400000000000000000000000121527064705700245600ustar00rootroot00000000000000*.py[cdo] maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/Cargo.lock000066400000000000000000000065071527064705700245140ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "pyo3-mixed-include-exclude" version = "2.1.3" dependencies = [ "pyo3", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/Cargo.toml000066400000000000000000000004251527064705700245300ustar00rootroot00000000000000[package] authors = [] name = "pyo3-mixed-include-exclude" version = "2.1.3" description = "Implements a dummy function combining rust and python" edition = "2021" [dependencies] pyo3 = { version = "0.29.0" } [lib] name = "pyo3_mixed_include_exclude" crate-type = ["cdylib"] maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/README.md000066400000000000000000000006751527064705700240660ustar00rootroot00000000000000# pyo3-mixed-include-exclude A package for testing maturin with a mixed pyo3/python project with include and exclude configurations. ## Usage ```bash pip install . ``` ```python import pyo3_mixed_include_exclude assert pyo3_mixed_include_exclude.get_42() == 42 ``` ## Testing Install tox: ```bash pip install tox ``` Run it: ```bash tox ``` The tests are in `test_pyo3_mixed_include_exclude.py`, while the configuration is in tox.ini maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/build.rs000066400000000000000000000003431527064705700242440ustar00rootroot00000000000000use std::env; use std::fs; use std::path::Path; fn main() { let out_dir = env::var("OUT_DIR").unwrap(); let dest = Path::new(&out_dir).join("generated_info.txt"); fs::write(dest, "hello from build.rs").unwrap(); } maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/check_installed/000077500000000000000000000000001527064705700257135ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/check_installed/check_installed.py000077500000000000000000000006461527064705700314120ustar00rootroot00000000000000#!/usr/bin/env python3 import importlib.resources import pyo3_mixed_include_exclude assert pyo3_mixed_include_exclude.get_42() == 42 # Verify that the file generated by build.rs and included from OUT_DIR is present ref = importlib.resources.files("pyo3_mixed_include_exclude").joinpath("generated_info.txt") assert ref.read_text() == "hello from build.rs", f"Unexpected content: {ref.read_text()!r}" print("SUCCESS") maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/pyo3_mixed_include_exclude/000077500000000000000000000000001527064705700300735ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/pyo3_mixed_include_exclude/.gitignore000066400000000000000000000000451527064705700320620ustar00rootroot00000000000000include_this_file generated_info.txt maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/pyo3_mixed_include_exclude/__init__.py000066400000000000000000000002111527064705700321760ustar00rootroot00000000000000from .pyo3_mixed_include_exclude import get_21 from .python_module.double import double def get_42() -> int: return double(get_21) maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/pyo3_mixed_include_exclude/exclude_this_file000066400000000000000000000000001527064705700334630ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/pyo3_mixed_include_exclude/include_this_file000066400000000000000000000000001527064705700334550ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/pyo3_mixed_include_exclude/python_module/000077500000000000000000000000001527064705700327615ustar00rootroot00000000000000__init__.py000066400000000000000000000000001527064705700350010ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/pyo3_mixed_include_exclude/python_moduledouble.py000066400000000000000000000001341527064705700345240ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/pyo3_mixed_include_exclude/python_modulefrom typing import Callable def double(fn: Callable[[], int]) -> int: return 2 * fn() maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/pyproject.toml000066400000000000000000000012331527064705700255120ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "pyo3-mixed-include-exclude" readme = "README.md" classifiers = ["Programming Language :: Python", "Programming Language :: Rust"] requires-python = ">=3.7" dynamic = ["version"] [project.scripts] get_42 = "pyo3_mixed_include_exclude:get_42" [tool.maturin] include = [ "pyo3_mixed_include_exclude/include_this_file", "missing", "README.md", { path = "generated_info.txt", from = "out-dir", to = "pyo3_mixed_include_exclude/" }, ] exclude = [ "pyo3_mixed_include_exclude/exclude_this_file", "pyo3_mixed_include_exclude/.gitignore", "tests/**/*", "unused", ] maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/src/000077500000000000000000000000001527064705700233665ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/src/lib.rs000066400000000000000000000003271527064705700245040ustar00rootroot00000000000000use pyo3::prelude::*; #[pyfunction] fn get_21() -> usize { 21 } #[pymodule] fn pyo3_mixed_include_exclude(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(get_21))?; Ok(()) } maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/tests/000077500000000000000000000000001527064705700237415ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/tests/test_pyo3_mixed_include_exclude.py000077500000000000000000000002041527064705700326450ustar00rootroot00000000000000#!/usr/bin/env python3 import pyo3_mixed_include_exclude def test_get_42(): assert pyo3_mixed_include_exclude.get_42() == 42 maturin-1.16.0/test-crates/pyo3-mixed-include-exclude/tox.ini000066400000000000000000000001471527064705700241140ustar00rootroot00000000000000[tox] envlist = py36,py37,py38 isolated_build = True [testenv] deps = pytest commands = pytest tests/ maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/000077500000000000000000000000001527064705700214435ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/.gitignore000066400000000000000000000000121527064705700234240ustar00rootroot00000000000000*.py[cdo] maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/Cargo.lock000066400000000000000000000065011527064705700233520ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "pyo3-mixed-py-subdir" version = "2.1.3" dependencies = [ "pyo3", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/Cargo.toml000066400000000000000000000004751527064705700234010ustar00rootroot00000000000000[package] authors = ["konstin "] name = "pyo3-mixed-py-subdir" version = "2.1.3" description = "Implements a dummy function combining rust and python" readme = "README.md" edition = "2021" [dependencies] pyo3 = { version = "0.29.0" } [lib] name = "pyo3_mixed_py_subdir" crate-type = ["cdylib"] maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/README.md000066400000000000000000000006101527064705700227170ustar00rootroot00000000000000# pyo3-mixed A package for testing maturin with a mixed pyo3/python project and a non-default package name. ## Usage ```bash pip install . ``` ```python import pyo3_mixed_py_subdir assert pyo3_mixed_py_subdir.get_42() == 42 ``` ## Testing Install tox: ```bash pip install tox ``` Run it: ```bash tox ``` The tests are in `test_pyo3_mixed.py`, while the configuration is in tox.ini maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/assets/000077500000000000000000000000001527064705700227455ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/assets/extra_data.txt000066400000000000000000000000121527064705700256130ustar00rootroot00000000000000test data maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/check_installed/000077500000000000000000000000001527064705700245575ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/check_installed/check_installed.py000077500000000000000000000001661527064705700302530ustar00rootroot00000000000000#!/usr/bin/env python3 import pyo3_mixed_py_subdir as pyo3_mixed assert pyo3_mixed.get_42() == 42 print("SUCCESS") maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/pyproject.toml000066400000000000000000000007651527064705700243670ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "pyo3-mixed-py-subdir" classifiers = [ "Programming Language :: Python", "Programming Language :: Rust" ] requires-python = ">=3.6" dynamic = ["version", "description"] # Allow description from Cargo.toml to be used [project.scripts] get_42 = "pyo3_mixed_py_subdir:get_42" [tool.maturin] module-name = "pyo3_mixed_py_subdir._pyo3_mixed" python-source = "python" include = ["assets/extra_data.txt"] maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/python/000077500000000000000000000000001527064705700227645ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/python/pyo3_mixed_py_subdir/000077500000000000000000000000001527064705700271245ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/python/pyo3_mixed_py_subdir/__init__.py000066400000000000000000000001721527064705700312350ustar00rootroot00000000000000from ._pyo3_mixed import get_21 from .python_module.double import double def get_42() -> int: return double(get_21) maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/python/pyo3_mixed_py_subdir/python_module/000077500000000000000000000000001527064705700320125ustar00rootroot00000000000000__init__.py000066400000000000000000000000001527064705700340320ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/python/pyo3_mixed_py_subdir/python_modulematurin-1.16.0/test-crates/pyo3-mixed-py-subdir/python/pyo3_mixed_py_subdir/python_module/double.py000066400000000000000000000001341527064705700336340ustar00rootroot00000000000000from typing import Callable def double(fn: Callable[[], int]) -> int: return 2 * fn() maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/src/000077500000000000000000000000001527064705700222325ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/src/lib.rs000066400000000000000000000003101527064705700233400ustar00rootroot00000000000000use pyo3::prelude::*; #[pyfunction] fn get_21() -> usize { 21 } #[pymodule] fn _pyo3_mixed(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(get_21))?; Ok(()) } maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/test_pyo3_mixed.py000077500000000000000000000001741527064705700251410ustar00rootroot00000000000000#!/usr/bin/env python3 import pyo3_mixed_py_subdir as pyo3_mixed def test_get_42(): assert pyo3_mixed.get_42() == 42 maturin-1.16.0/test-crates/pyo3-mixed-py-subdir/tox.ini000066400000000000000000000001401527064705700227510ustar00rootroot00000000000000[tox] envlist = py36,py37,py38 isolated_build = True [testenv] deps = pytest commands = pytest maturin-1.16.0/test-crates/pyo3-mixed-src/000077500000000000000000000000001527064705700203145ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-src/.gitignore000066400000000000000000000000221527064705700222760ustar00rootroot00000000000000*.py[cdo] target/ maturin-1.16.0/test-crates/pyo3-mixed-src/README.md000066400000000000000000000003241527064705700215720ustar00rootroot00000000000000# pyo3-mixed src layout A package for testing maturin with a src layout mixed pyo3/python project. ## Usage ```bash pip install . ``` ```python import pyo3_mixed_src assert pyo3_mixed_src.get_42() == 42 ``` maturin-1.16.0/test-crates/pyo3-mixed-src/check_installed/000077500000000000000000000000001527064705700234305ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-src/check_installed/check_installed.py000077500000000000000000000001601527064705700271160ustar00rootroot00000000000000#!/usr/bin/env python3 import pyo3_mixed_src as pyo3_mixed assert pyo3_mixed.get_42() == 42 print("SUCCESS") maturin-1.16.0/test-crates/pyo3-mixed-src/pyproject.toml000066400000000000000000000005771527064705700232410ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "pyo3-mixed-src" readme = "README.md" classifiers = [ "Programming Language :: Python", "Programming Language :: Rust" ] requires-python = ">=3.7" dynamic = ["version"] [project.scripts] get_42 = "pyo3_mixed_src:get_42" [tool.maturin] python-packages = ["pyo3_mixed_src", "tests"] maturin-1.16.0/test-crates/pyo3-mixed-src/rust/000077500000000000000000000000001527064705700213115ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-src/rust/Cargo.lock000066400000000000000000000064721527064705700232270ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.134" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "329c933548736bc49fd575ee68c89e8be4d260064184389a5b77517cddd99ffb" [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "pyo3-mixed-src" version = "2.1.3" dependencies = [ "pyo3", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" maturin-1.16.0/test-crates/pyo3-mixed-src/rust/Cargo.toml000066400000000000000000000004341527064705700232420ustar00rootroot00000000000000[package] authors = ["konstin "] name = "pyo3-mixed-src" version = "2.1.3" description = "Implements a dummy function combining rust and python" edition = "2021" [dependencies] pyo3 = { version = "0.29.0" } [lib] name = "pyo3_mixed_src" crate-type = ["cdylib"] maturin-1.16.0/test-crates/pyo3-mixed-src/rust/src/000077500000000000000000000000001527064705700221005ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-src/rust/src/lib.rs000066400000000000000000000003131527064705700232110ustar00rootroot00000000000000use pyo3::prelude::*; #[pyfunction] fn get_21() -> usize { 21 } #[pymodule] fn pyo3_mixed_src(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(get_21))?; Ok(()) } maturin-1.16.0/test-crates/pyo3-mixed-src/src/000077500000000000000000000000001527064705700211035ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-src/src/pyo3_mixed_src/000077500000000000000000000000001527064705700240325ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-src/src/pyo3_mixed_src/__init__.py000066400000000000000000000001751527064705700261460ustar00rootroot00000000000000from .pyo3_mixed_src import get_21 from .python_module.double import double def get_42() -> int: return double(get_21) maturin-1.16.0/test-crates/pyo3-mixed-src/src/pyo3_mixed_src/python_module/000077500000000000000000000000001527064705700267205ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-src/src/pyo3_mixed_src/python_module/__init__.py000066400000000000000000000000001527064705700310170ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-src/src/pyo3_mixed_src/python_module/double.py000066400000000000000000000001341527064705700305420ustar00rootroot00000000000000from typing import Callable def double(fn: Callable[[], int]) -> int: return 2 * fn() maturin-1.16.0/test-crates/pyo3-mixed-src/src/tests/000077500000000000000000000000001527064705700222455ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-src/src/tests/test_pyo3_mixed.py000077500000000000000000000001661527064705700257440ustar00rootroot00000000000000#!/usr/bin/env python3 import pyo3_mixed_src as pyo3_mixed def test_get_42(): assert pyo3_mixed.get_42() == 42 maturin-1.16.0/test-crates/pyo3-mixed-src/tox.ini000066400000000000000000000001531527064705700216260ustar00rootroot00000000000000[tox] envlist = py36,py37,py38 isolated_build = True [testenv] deps = pytest commands = pytest src/tests/ maturin-1.16.0/test-crates/pyo3-mixed-workspace/000077500000000000000000000000001527064705700215235ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-workspace/.gitignore000066400000000000000000000000101527064705700235020ustar00rootroot00000000000000target/ maturin-1.16.0/test-crates/pyo3-mixed-workspace/README.md000066400000000000000000000003141527064705700230000ustar00rootroot00000000000000# pyo3-mixed src layout A package for testing maturin with a nested workspace. ## Usage ```bash pip install . ``` ```python import pyo3_mixed_workspace assert pyo3_mixed_workspace.get_42() == 42 ``` maturin-1.16.0/test-crates/pyo3-mixed-workspace/check_installed/000077500000000000000000000000001527064705700246375ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-workspace/check_installed/check_installed.py000077500000000000000000000001661527064705700303330ustar00rootroot00000000000000#!/usr/bin/env python3 import pyo3_mixed_workspace as pyo3_mixed assert pyo3_mixed.get_42() == 42 print("SUCCESS") maturin-1.16.0/test-crates/pyo3-mixed-workspace/pyproject.toml000066400000000000000000000010171527064705700244360ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "pyo3-mixed-workspace" readme = "README.md" classifiers = [ "Programming Language :: Python", "Programming Language :: Rust" ] requires-python = ">=3.7" dynamic = ["version"] [project.scripts] get_42 = "pyo3_mixed_workspace:get_42" [tool.maturin] python-packages = ["pyo3_mixed_workspace", "tests"] module-name = "pyo3_mixed_workspace.pyo3_mixed_workspace_py" manifest-path = "rust/python/pyo3-mixed-workspace-py/Cargo.toml" maturin-1.16.0/test-crates/pyo3-mixed-workspace/rust/000077500000000000000000000000001527064705700225205ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-workspace/rust/Cargo.lock000066400000000000000000000066321527064705700244340ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.149" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "pyo3-mixed-workspace" version = "2.1.3" [[package]] name = "pyo3-mixed-workspace-py" version = "2.1.3" dependencies = [ "pyo3", "pyo3-mixed-workspace", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" maturin-1.16.0/test-crates/pyo3-mixed-workspace/rust/Cargo.toml000066400000000000000000000001531527064705700244470ustar00rootroot00000000000000[workspace] resolver = "2" members = [ "pyo3-mixed-workspace", "python/pyo3-mixed-workspace-py", ] maturin-1.16.0/test-crates/pyo3-mixed-workspace/rust/pyo3-mixed-workspace/000077500000000000000000000000001527064705700265125ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-workspace/rust/pyo3-mixed-workspace/Cargo.toml000066400000000000000000000002411527064705700304370ustar00rootroot00000000000000[package] name = "pyo3-mixed-workspace" version = "2.1.3" description = "Implements a dummy function combining rust and python" edition = "2021" [dependencies] maturin-1.16.0/test-crates/pyo3-mixed-workspace/rust/pyo3-mixed-workspace/src/000077500000000000000000000000001527064705700273015ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-workspace/rust/pyo3-mixed-workspace/src/lib.rs000066400000000000000000000000501527064705700304100ustar00rootroot00000000000000pub fn get_21_lib() -> usize { 21 } maturin-1.16.0/test-crates/pyo3-mixed-workspace/rust/python/000077500000000000000000000000001527064705700240415ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-workspace/rust/python/pyo3-mixed-workspace-py/000077500000000000000000000000001527064705700304615ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-workspace/rust/python/pyo3-mixed-workspace-py/Cargo.toml000066400000000000000000000005551527064705700324160ustar00rootroot00000000000000[package] authors = ["konstin "] name = "pyo3-mixed-workspace-py" version = "2.1.3" description = "Implements a dummy function combining rust and python" edition = "2021" [dependencies] pyo3-mixed-workspace = { path = "../../pyo3-mixed-workspace" } pyo3 = { version = "0.29.0" } [lib] name = "pyo3_mixed_workspace_py" crate-type = ["cdylib"] maturin-1.16.0/test-crates/pyo3-mixed-workspace/rust/python/pyo3-mixed-workspace-py/src/000077500000000000000000000000001527064705700312505ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-workspace/rust/python/pyo3-mixed-workspace-py/src/lib.rs000066400000000000000000000004121527064705700323610ustar00rootroot00000000000000use pyo3::prelude::*; use pyo3_mixed_workspace::get_21_lib; #[pyfunction] fn get_21() -> usize { get_21_lib() } #[pymodule] fn pyo3_mixed_workspace_py(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_function(wrap_pyfunction!(get_21, m)?)?; Ok(()) } maturin-1.16.0/test-crates/pyo3-mixed-workspace/src/000077500000000000000000000000001527064705700223125ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-workspace/src/pyo3_mixed_workspace/000077500000000000000000000000001527064705700264505ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-workspace/src/pyo3_mixed_workspace/__init__.py000066400000000000000000000002061527064705700305570ustar00rootroot00000000000000from .pyo3_mixed_workspace_py import get_21 from .python_module.double import double def get_42() -> int: return double(get_21) maturin-1.16.0/test-crates/pyo3-mixed-workspace/src/pyo3_mixed_workspace/python_module/000077500000000000000000000000001527064705700313365ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-workspace/src/pyo3_mixed_workspace/python_module/__init__.py000066400000000000000000000000001527064705700334350ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-workspace/src/pyo3_mixed_workspace/python_module/double.py000066400000000000000000000001341527064705700331600ustar00rootroot00000000000000from typing import Callable def double(fn: Callable[[], int]) -> int: return 2 * fn() maturin-1.16.0/test-crates/pyo3-mixed-workspace/src/tests/000077500000000000000000000000001527064705700234545ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed-workspace/src/tests/test_pyo3_mixed.py000077500000000000000000000001741527064705700271520ustar00rootroot00000000000000#!/usr/bin/env python3 import pyo3_mixed_workspace as pyo3_mixed def test_get_42(): assert pyo3_mixed.get_42() == 42 maturin-1.16.0/test-crates/pyo3-mixed-workspace/tox.ini000066400000000000000000000001531527064705700230350ustar00rootroot00000000000000[tox] envlist = py36,py37,py38 isolated_build = True [testenv] deps = pytest commands = pytest src/tests/ maturin-1.16.0/test-crates/pyo3-mixed/000077500000000000000000000000001527064705700175275ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed/.gitignore000066400000000000000000000000121527064705700215100ustar00rootroot00000000000000*.py[cdo] maturin-1.16.0/test-crates/pyo3-mixed/Cargo.lock000066400000000000000000000064671527064705700214510ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "pyo3-mixed" version = "2.1.5" dependencies = [ "pyo3", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" maturin-1.16.0/test-crates/pyo3-mixed/Cargo.toml000066400000000000000000000004241527064705700214570ustar00rootroot00000000000000[package] authors = ["konstin "] name = "pyo3-mixed" version = "2.1.5" description = "Implements a dummy function combining rust and python" edition = "2021" [dependencies] pyo3 = { version = "0.29.0" } [lib] name = "pyo3_mixed" crate-type = ["cdylib"] maturin-1.16.0/test-crates/pyo3-mixed/README.md000066400000000000000000000005251527064705700210100ustar00rootroot00000000000000# pyo3-mixed A package for testing maturin with a mixed pyo3/python project. ## Usage ```bash pip install . ``` ```python import pyo3_mixed assert pyo3_mixed.get_42() == 42 ``` ## Testing Install tox: ```bash pip install tox ``` Run it: ```bash tox ``` The tests are in `test_pyo3_mixed.py`, while the configuration is in tox.ini maturin-1.16.0/test-crates/pyo3-mixed/check_installed/000077500000000000000000000000001527064705700226435ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed/check_installed/check_installed.py000077500000000000000000000041041527064705700263330ustar00rootroot00000000000000#!/usr/bin/env python3 import json import os.path import platform import sys from pathlib import Path from subprocess import check_output import pyo3_mixed from boltons.strutils import slugify assert pyo3_mixed.get_42() == 42 assert slugify("First post! Hi!!!!~1 ") == "first_post_hi_1" script_name = "print_cli_args" args = ["a", "b", "c"] [rust_args, python_args] = check_output([script_name, *args], text=True).splitlines() # The rust vec debug format is also valid json rust_args = json.loads(rust_args) python_args = json.loads(python_args) # On alpine/musl, rust_args is empty so we skip all tests on musl if len(rust_args) > 0: # On linux we get sys.executable, windows resolve the path and mac os gives us a third # path ( # {prefix}/Python.framework/Versions/3.10/Resources/Python.app/Contents/MacOS/Python # vs # {prefix}/Python.framework/Versions/3.10/bin/python3.10 # on cirrus ci) # On windows, cpython resolves while pypy doesn't. # The script for cpython is actually a distinct file from the system interpreter for # windows and mac if platform.system() == "Linux": assert os.path.samefile(rust_args[0], sys.executable), ( rust_args, sys.executable, os.path.realpath(rust_args[0]), os.path.realpath(sys.executable), ) # Windows can't decide if it's with or without .exe, FreeBSB just doesn't work for some reason if platform.system() in ["Darwin", "Linux"]: # Unix venv layout (and hopefully also on more exotic platforms) print_cli_args = str(Path(sys.prefix).joinpath("bin").joinpath(script_name)) assert rust_args[1] == print_cli_args, (rust_args, print_cli_args) assert python_args[0] == print_cli_args, (python_args, print_cli_args) # FreeBSB just doesn't work for some reason if platform.system() in ["Darwin", "Linux", "Windows"]: # Rust contains the python executable as first argument but python does not assert rust_args[2:] == args, rust_args assert python_args[1:] == args, python_args print("SUCCESS") maturin-1.16.0/test-crates/pyo3-mixed/pgo_check.py000066400000000000000000000005621527064705700220260ustar00rootroot00000000000000import importlib import sys from pathlib import Path project_root = Path(__file__).resolve().parent sys.path = [path for path in sys.path if path and Path(path).resolve() != project_root] attrs = importlib.import_module("attrs") pyo3_mixed = importlib.import_module("pyo3_mixed") assert attrs is not None assert pyo3_mixed.get_42() == 42 pyo3_mixed.print_cli_args() maturin-1.16.0/test-crates/pyo3-mixed/pyo3-config.txt000066400000000000000000000001631527064705700224250ustar00rootroot00000000000000implementation=CPython version=3.10 shared=true abi3=false suppress_build_script_link_lines=false pointer_width=64 maturin-1.16.0/test-crates/pyo3-mixed/pyo3_mixed/000077500000000000000000000000001527064705700216075ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed/pyo3_mixed/__init__.py000066400000000000000000000002271527064705700237210ustar00rootroot00000000000000from .pyo3_mixed import get_21, print_cli_args # noqa: F401 from .python_module.double import double def get_42() -> int: return double(get_21) maturin-1.16.0/test-crates/pyo3-mixed/pyo3_mixed/assets/000077500000000000000000000000001527064705700231115ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed/pyo3_mixed/assets/asset.txt000066400000000000000000000003601527064705700247700ustar00rootroot00000000000000This file is included twice, once implicitly by in the python root and once explicitly in pyproject.toml and checks that it gets deduplicated, see https://github.com/PyO3/maturin/issues/2106 and https://github.com/PyO3/maturin/issues/2066. maturin-1.16.0/test-crates/pyo3-mixed/pyo3_mixed/python_module/000077500000000000000000000000001527064705700244755ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed/pyo3_mixed/python_module/__init__.py000066400000000000000000000000001527064705700265740ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed/pyo3_mixed/python_module/double.py000066400000000000000000000001341527064705700263170ustar00rootroot00000000000000from typing import Callable def double(fn: Callable[[], int]) -> int: return 2 * fn() maturin-1.16.0/test-crates/pyo3-mixed/pyproject.toml000066400000000000000000000010511527064705700224400ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "pyo3-mixed" classifiers = [ "Programming Language :: Python", "Programming Language :: Rust" ] requires-python = ">=3.7" dependencies = ["boltons"] license = "MIT" readme = "README.md" dynamic = ["version"] [project.scripts] get_42 = "pyo3_mixed:get_42" print_cli_args = "pyo3_mixed:print_cli_args" [dependency-groups] pgo = ["attrs"] [tool.maturin] include = ["pyo3_mixed/assets/*"] pgo-dependency-group = "pgo" pgo-command = "python pgo_check.py" maturin-1.16.0/test-crates/pyo3-mixed/src/000077500000000000000000000000001527064705700203165ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed/src/lib.rs000066400000000000000000000016651527064705700214420ustar00rootroot00000000000000use pyo3::prelude::*; use std::env; #[pyfunction] fn get_21() -> usize { 21 } /// Prints the CLI arguments, once from Rust's point of view and once from Python's point of view. #[pyfunction] fn print_cli_args(py: Python) -> PyResult<()> { // This one includes Python and the name of the wrapper script itself, e.g. // `["/home/ferris/.venv/bin/python", "/home/ferris/.venv/bin/print_cli_args", "a", "b", "c"]` println!("{:?}", env::args().collect::>()); // This one includes only the name of the wrapper script itself, e.g. // `["/home/ferris/.venv/bin/print_cli_args", "a", "b", "c"])` println!( "{:?}", py.import("sys")? .getattr("argv")? .extract::>()? ); Ok(()) } #[pymodule] fn pyo3_mixed(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(get_21))?; m.add_wrapped(wrap_pyfunction!(print_cli_args))?; Ok(()) } maturin-1.16.0/test-crates/pyo3-mixed/tests/000077500000000000000000000000001527064705700206715ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-mixed/tests/test_pyo3_mixed.py000077500000000000000000000001441527064705700243640ustar00rootroot00000000000000#!/usr/bin/env python3 import pyo3_mixed def test_get_42(): assert pyo3_mixed.get_42() == 42 maturin-1.16.0/test-crates/pyo3-mixed/tox.ini000066400000000000000000000001471527064705700210440ustar00rootroot00000000000000[tox] envlist = py36,py37,py38 isolated_build = True [testenv] deps = pytest commands = pytest tests/ maturin-1.16.0/test-crates/pyo3-no-extension-module/000077500000000000000000000000001527064705700223325ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-no-extension-module/Cargo.lock000066400000000000000000000042161527064705700242420ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "libc" version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "memoffset" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "pyo3" version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8970a78afe0628a3e3430376fc5fd76b6b45c4d43360ffd6cdd40bdde72b682a" dependencies = [ "libc", "memoffset", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", ] [[package]] name = "pyo3-build-config" version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "458eb0c55e7ece017adeba38f2248ff3ac615e53660d7c71a238d7d2a01c7598" dependencies = [ "once_cell", "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7114fe5457c61b276ab77c5055f206295b812608083644a5c5b2640c3102565c" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-no-extension-module" version = "2.1.0" dependencies = [ "pyo3", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" maturin-1.16.0/test-crates/pyo3-no-extension-module/Cargo.toml000066400000000000000000000011131527064705700242560ustar00rootroot00000000000000[package] authors = ["konstin "] name = "pyo3-no-extension-module" version = "2.1.0" description = "Does not use the extension-module feature, thus erroneously linking libpython" edition = "2021" [dependencies] # We pin pyo3 to 0.25.0 here because newer versions (0.26+) use PYO3_BUILD_EXTENSION_MODULE # environment variable which maturin sets, effectively preventing the "links libpython" error # even if extension-module feature is missing. pyo3 = { version = "0.25.0", default-features = false } [lib] name = "pyo3_no_extension_module" crate-type = ["cdylib"] maturin-1.16.0/test-crates/pyo3-no-extension-module/src/000077500000000000000000000000001527064705700231215ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-no-extension-module/src/lib.rs000066400000000000000000000003241527064705700242340ustar00rootroot00000000000000use pyo3::ffi::{PyDict_New, PyObject}; #[no_mangle] #[allow(non_snake_case)] pub unsafe extern "C" fn PyInit_pyo3_no_extension_module() -> *mut PyObject { PyDict_New() // Make sure an ffi function is used } maturin-1.16.0/test-crates/pyo3-pure/000077500000000000000000000000001527064705700173745ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-pure/Cargo.lock000066400000000000000000000065511527064705700213100ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "local-test" version = "0.1.0" [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "pyo3-pure" version = "2.1.2" dependencies = [ "pyo3", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" maturin-1.16.0/test-crates/pyo3-pure/Cargo.toml000066400000000000000000000005771527064705700213350ustar00rootroot00000000000000[package] authors = ["konstin "] name = "pyo3-pure" version = "2.1.2" edition = "2021" description = "Implements a dummy function (get_fortytwo.DummyClass.get_42()) in rust" license = "MIT" [dependencies] pyo3 = { version = "0.29.0", features = [ "abi3-py39", ] } [lib] name = "pyo3_pure" crate-type = ["cdylib"] [workspace] members = [".", "local-test"] maturin-1.16.0/test-crates/pyo3-pure/LICENSE000066400000000000000000000020431527064705700204000ustar00rootroot00000000000000Copyright (c) 2018-present konstin Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. maturin-1.16.0/test-crates/pyo3-pure/README.md000066400000000000000000000005221527064705700206520ustar00rootroot00000000000000# Get fourtytwo A package with pyo3 bindings for testing maturin. ## Usage ```bash pip install . ``` ```python import pyo3_pure assert pyo3_pure.DummyClass.get_42() == 42 ``` ## Testing Install tox: ```bash pip install tox ``` Run it: ```bash tox ``` The tests are in `test_pyo3_pure.py`, while the configuration is in tox.ini maturin-1.16.0/test-crates/pyo3-pure/check_installed/000077500000000000000000000000001527064705700225105ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-pure/check_installed/check_installed.py000077500000000000000000000006541527064705700262060ustar00rootroot00000000000000#!/usr/bin/env python3 import os import subprocess import pyo3_pure assert pyo3_pure.DummyClass.get_42() == 42 # Check type stub install_path = os.path.join(os.path.dirname(pyo3_pure.__file__)) assert os.path.exists(os.path.join(install_path, "__init__.pyi")) assert os.path.exists(os.path.join(install_path, "py.typed")) # Check entrypoints assert subprocess.run(["get_42"], check=False).returncode == 42 print("SUCCESS") maturin-1.16.0/test-crates/pyo3-pure/local-test/000077500000000000000000000000001527064705700214435ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-pure/local-test/Cargo.toml000066400000000000000000000002631527064705700233740ustar00rootroot00000000000000[package] name = "local-test" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] maturin-1.16.0/test-crates/pyo3-pure/local-test/src/000077500000000000000000000000001527064705700222325ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-pure/local-test/src/lib.rs000066400000000000000000000003301527064705700233420ustar00rootroot00000000000000pub fn add(left: usize, right: usize) -> usize { left + right } #[cfg(test)] mod tests { use super::*; #[test] fn it_works() { let result = add(2, 2); assert_eq!(result, 4); } } maturin-1.16.0/test-crates/pyo3-pure/pyo3_pure.pyi000066400000000000000000000001211527064705700220360ustar00rootroot00000000000000class DummyClass: @staticmethod def get_42() -> int: ... fourtytwo: int maturin-1.16.0/test-crates/pyo3-pure/pyproject.toml000066400000000000000000000020251527064705700223070ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [tool.maturin] bindings = "pyo3" editable-profile = "dev" [tool.maturin.target."x86_64-apple-darwin"] macos-deployment-target = "10.12" [tool.maturin.target."aarch64-apple-darwin"] macos-deployment-target = "11.0" [project] # The name pyo3_pure instead of pyo3-pure is intentional, # it's used as a crate name resolution regression test name = "pyo3_pure" version = "0.1.0+abc123de" classifiers = [ "Programming Language :: Rust" ] description = "Implements a dummy function in Rust" readme = "README.md" maintainers = [ {name = "messense", email = "messense@icloud.com"} ] license = { file = "LICENSE" } dynamic = ["license"] # Allow license from Cargo.toml to be used [project.optional-dependencies] test = [ "attrs", "boltons; sys_platform == 'win32'" ] [dependency-groups] dev = [ "attrs", ] dev2 = [ "attrs", ] [project.scripts] get_42 = "pyo3_pure:DummyClass.get_42" [project.gui-scripts] get_42_gui = "pyo3_pure:DummyClass.get_42" maturin-1.16.0/test-crates/pyo3-pure/src/000077500000000000000000000000001527064705700201635ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-pure/src/lib.rs000066400000000000000000000005251527064705700213010ustar00rootroot00000000000000use pyo3::prelude::*; #[pyclass] struct DummyClass {} #[pymethods] impl DummyClass { #[staticmethod] fn get_42() -> PyResult { Ok(42) } } /// module level doc string #[pymodule] fn pyo3_pure(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_class::()?; m.add("fourtytwo", 42)?; Ok(()) } maturin-1.16.0/test-crates/pyo3-pure/tests/000077500000000000000000000000001527064705700205365ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-pure/tests/test_pyo3_pure.py000077500000000000000000000004351527064705700241010ustar00rootroot00000000000000#!/usr/bin/env python3 import pyo3_pure import pytest def test_static(): assert pyo3_pure.fourtytwo == 42 def test_class(): assert pyo3_pure.DummyClass.get_42() == 42 def test_function(): with pytest.raises(AssertionError): assert pyo3_pure.DummyClass == 42 maturin-1.16.0/test-crates/pyo3-pure/tox.ini000066400000000000000000000001471527064705700207110ustar00rootroot00000000000000[tox] envlist = py36,py37,py38 isolated_build = True [testenv] deps = pytest commands = pytest tests/ maturin-1.16.0/test-crates/pyo3-stub-generation-mixed-py-subdir/000077500000000000000000000000001527064705700245475ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-stub-generation-mixed-py-subdir/Cargo.lock000066400000000000000000000065011527064705700264560ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "pyo3-mixed-py-subdir" version = "2.1.3" dependencies = [ "pyo3", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" maturin-1.16.0/test-crates/pyo3-stub-generation-mixed-py-subdir/Cargo.toml000066400000000000000000000005151527064705700265000ustar00rootroot00000000000000[package] authors = ["konstin "] name = "pyo3-mixed-py-subdir" version = "2.1.3" description = "Implements a dummy function combining rust and python" edition = "2024" [dependencies] pyo3 = { version = "0.29.0", features = ["experimental-inspect"] } [lib] name = "pyo3_mixed_py_subdir" crate-type = ["cdylib"] maturin-1.16.0/test-crates/pyo3-stub-generation-mixed-py-subdir/check_installed/000077500000000000000000000000001527064705700276635ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-stub-generation-mixed-py-subdir/check_installed/check_installed.py000077500000000000000000000006211527064705700333530ustar00rootroot00000000000000#!/usr/bin/env python3 import os import pyo3_stub_generation_mixed_py_subdir assert pyo3_stub_generation_mixed_py_subdir.get_42() == 42 # Check type stub install_path = os.path.join(os.path.dirname(pyo3_stub_generation_mixed_py_subdir.__file__)) assert os.path.exists(os.path.join(install_path, "__init__.py")) assert os.path.exists(os.path.join(install_path, "_pyo3_mixed.pyi")) print("SUCCESS") maturin-1.16.0/test-crates/pyo3-stub-generation-mixed-py-subdir/pyproject.toml000066400000000000000000000004031527064705700274600ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "pyo3-stub-generation-mixed-py-subdir" dynamic = ["version"] [tool.maturin] module-name = "pyo3_stub_generation_mixed_py_subdir._pyo3_mixed" python-source = "python" maturin-1.16.0/test-crates/pyo3-stub-generation-mixed-py-subdir/python/000077500000000000000000000000001527064705700260705ustar00rootroot00000000000000pyo3_stub_generation_mixed_py_subdir/000077500000000000000000000000001527064705700354215ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-stub-generation-mixed-py-subdir/python__init__.py000066400000000000000000000001171527064705700375310ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-stub-generation-mixed-py-subdir/python/pyo3_stub_generation_mixed_py_subdirfrom ._pyo3_mixed import get_21 def get_42() -> int: return get_21() * 2 maturin-1.16.0/test-crates/pyo3-stub-generation-mixed-py-subdir/src/000077500000000000000000000000001527064705700253365ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-stub-generation-mixed-py-subdir/src/lib.rs000066400000000000000000000002201527064705700264440ustar00rootroot00000000000000use pyo3::prelude::*; #[pymodule] mod _pyo3_mixed { use pyo3::prelude::*; #[pyfunction] fn get_21() -> usize { 21 } } maturin-1.16.0/test-crates/pyo3-stub-generation-mixed/000077500000000000000000000000001527064705700226335ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-stub-generation-mixed/Cargo.lock000066400000000000000000000065071527064705700245500ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "pyo3-stub-generation-mixed" version = "2.1.5" dependencies = [ "pyo3", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" maturin-1.16.0/test-crates/pyo3-stub-generation-mixed/Cargo.toml000066400000000000000000000005311527064705700245620ustar00rootroot00000000000000[package] authors = ["konstin "] name = "pyo3-stub-generation-mixed" version = "2.1.5" description = "Implements a dummy function combining rust and python" edition = "2024" [dependencies] pyo3 = { version = "0.29.0", features = ["experimental-inspect"] } [lib] name = "pyo3_stub_generation_mixed" crate-type = ["cdylib"] maturin-1.16.0/test-crates/pyo3-stub-generation-mixed/check_installed/000077500000000000000000000000001527064705700257475ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-stub-generation-mixed/check_installed/check_installed.py000077500000000000000000000007511527064705700314430ustar00rootroot00000000000000#!/usr/bin/env python3 import os import pyo3_stub_generation_mixed assert pyo3_stub_generation_mixed.get_42() == 42 # Check type stub install_path = os.path.join(os.path.dirname(pyo3_stub_generation_mixed.__file__)) assert os.path.exists(os.path.join(install_path, "__init__.py")) assert os.path.exists(os.path.join(install_path, "pyo3_stub_generation_mixed/__init__.pyi")) assert os.path.exists(os.path.join(install_path, "pyo3_stub_generation_mixed/submodule.pyi")) print("SUCCESS") maturin-1.16.0/test-crates/pyo3-stub-generation-mixed/pyo3_stub_generation_mixed/000077500000000000000000000000001527064705700301635ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-stub-generation-mixed/pyo3_stub_generation_mixed/__init__.py000066400000000000000000000001361527064705700322740ustar00rootroot00000000000000from .pyo3_stub_generation_mixed import get_21 def get_42() -> int: return get_21() * 2 maturin-1.16.0/test-crates/pyo3-stub-generation-mixed/pyproject.toml000066400000000000000000000003351527064705700255500ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "pyo3-stub-generation-mixed" description = "Tests compilation of packages loading stubs generated by PyO3" dynamic = ["version"] maturin-1.16.0/test-crates/pyo3-stub-generation-mixed/src/000077500000000000000000000000001527064705700234225ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-stub-generation-mixed/src/lib.rs000066400000000000000000000004671527064705700245450ustar00rootroot00000000000000use pyo3::prelude::*; #[pymodule] mod pyo3_stub_generation_mixed { use pyo3::prelude::*; #[pyfunction] fn get_21() -> usize { 21 } #[pymodule] mod submodule { use pyo3::prelude::*; #[pyfunction] fn get_42() -> usize { 42 } } } maturin-1.16.0/test-crates/pyo3-stub-generation-pure/000077500000000000000000000000001527064705700225005ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-stub-generation-pure/Cargo.lock000066400000000000000000000065111527064705700244100ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.183" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" [[package]] name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "portable-atomic" version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "proc-macro2" version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "pyo3-stub-generation-pure" version = "1.0.0" dependencies = [ "pyo3", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" maturin-1.16.0/test-crates/pyo3-stub-generation-pure/Cargo.toml000066400000000000000000000003451527064705700244320ustar00rootroot00000000000000[package] name = "pyo3-stub-generation-pure" version = "1.0.0" edition = "2024" [dependencies] pyo3 = { version = "0.29.0", features = ["experimental-inspect"] } [lib] name = "pyo3_stub_generation_pure" crate-type = ["cdylib"] maturin-1.16.0/test-crates/pyo3-stub-generation-pure/check_installed/000077500000000000000000000000001527064705700256145ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-stub-generation-pure/check_installed/check_installed.py000077500000000000000000000006551527064705700313130ustar00rootroot00000000000000#!/usr/bin/env python3 import os import pyo3_stub_generation_pure assert pyo3_stub_generation_pure.func(42) == 42 # Check type stub install_path = os.path.join(os.path.dirname(pyo3_stub_generation_pure.__file__)) assert os.path.exists(os.path.join(install_path, "__init__.pyi")) assert os.path.exists(os.path.join(install_path, "submodule.pyi")) assert os.path.exists(os.path.join(install_path, "py.typed")) print("SUCCESS") maturin-1.16.0/test-crates/pyo3-stub-generation-pure/pyproject.toml000066400000000000000000000003341527064705700254140ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "pyo3-stub-generation-pure" description = "Tests compilation of packages loading stubs generated by PyO3" dynamic = ["version"] maturin-1.16.0/test-crates/pyo3-stub-generation-pure/src/000077500000000000000000000000001527064705700232675ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-stub-generation-pure/src/lib.rs000066400000000000000000000004551527064705700244070ustar00rootroot00000000000000use pyo3::prelude::*; #[pymodule] mod pyo3_stub_generation_pure { use super::*; #[pyclass] struct Class {} #[pyfunction] fn func(a: usize) -> usize { a } #[pymodule] mod submodule { use super::*; #[pyclass] struct Class2 {} } } maturin-1.16.0/test-crates/pyo3-workspace-abi3-feature/000077500000000000000000000000001527064705700226645ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-workspace-abi3-feature/Cargo.lock000066400000000000000000000066311527064705700245770ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "abi3-user" version = "0.1.0" dependencies = [ "pyo3", ] [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "portable-atomic" version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" [[package]] name = "proc-macro2" version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "pyo3-workspace-abi3-feature" version = "0.1.0" dependencies = [ "pyo3", ] [[package]] name = "quote" version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" maturin-1.16.0/test-crates/pyo3-workspace-abi3-feature/Cargo.toml000066400000000000000000000001001527064705700246030ustar00rootroot00000000000000[workspace] members = ["extension", "abi3-user"] resolver = "2" maturin-1.16.0/test-crates/pyo3-workspace-abi3-feature/abi3-user/000077500000000000000000000000001527064705700244565ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-workspace-abi3-feature/abi3-user/Cargo.toml000066400000000000000000000002101527064705700263770ustar00rootroot00000000000000[package] name = "abi3-user" version = "0.1.0" edition = "2021" [dependencies] pyo3 = { version = "0.29.0", features = ["abi3-py38"] } maturin-1.16.0/test-crates/pyo3-workspace-abi3-feature/abi3-user/src/000077500000000000000000000000001527064705700252455ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-workspace-abi3-feature/abi3-user/src/lib.rs000066400000000000000000000000001527064705700263470ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-workspace-abi3-feature/extension/000077500000000000000000000000001527064705700247005ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-workspace-abi3-feature/extension/Cargo.toml000066400000000000000000000002211527064705700266230ustar00rootroot00000000000000[package] name = "pyo3-workspace-abi3-feature" version = "0.1.0" edition = "2021" [lib] crate-type = ["cdylib"] [dependencies] pyo3 = "0.29.0" maturin-1.16.0/test-crates/pyo3-workspace-abi3-feature/extension/src/000077500000000000000000000000001527064705700254675ustar00rootroot00000000000000maturin-1.16.0/test-crates/pyo3-workspace-abi3-feature/extension/src/lib.rs000066400000000000000000000000001527064705700265710ustar00rootroot00000000000000maturin-1.16.0/test-crates/readme-duplication/000077500000000000000000000000001527064705700212775ustar00rootroot00000000000000maturin-1.16.0/test-crates/readme-duplication/Cargo.lock000066400000000000000000000065711527064705700232150ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.185" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" [[package]] name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "portable-atomic" version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "proc-macro2" version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "readme-rs" version = "0.2.0" [[package]] name = "readme_py" version = "0.2.0" dependencies = [ "pyo3", "readme-rs", ] [[package]] name = "syn" version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" maturin-1.16.0/test-crates/readme-duplication/Cargo.toml000066400000000000000000000001521527064705700232250ustar00rootroot00000000000000[workspace] resolver = "2" members = ["readme-py", "readme-rs"] [workspace.package] readme = "README.md" maturin-1.16.0/test-crates/readme-duplication/README.md000066400000000000000000000000501527064705700225510ustar00rootroot00000000000000Readme duplication test case - Readme 1 maturin-1.16.0/test-crates/readme-duplication/check_installed/000077500000000000000000000000001527064705700244135ustar00rootroot00000000000000maturin-1.16.0/test-crates/readme-duplication/check_installed/check_installed.py000077500000000000000000000001211527064705700300760ustar00rootroot00000000000000#!/usr/bin/env python3 import readme assert readme.value == 1 print("SUCCESS") maturin-1.16.0/test-crates/readme-duplication/readme-py/000077500000000000000000000000001527064705700231625ustar00rootroot00000000000000maturin-1.16.0/test-crates/readme-duplication/readme-py/Cargo.toml000066400000000000000000000003501527064705700251100ustar00rootroot00000000000000[package] name = "readme_py" version = "0.2.0" edition = "2021" readme = "README.md" publish = false [lib] name = "readme" crate-type = ["cdylib"] [dependencies] readme-rs = { path = "../readme-rs" } pyo3 = { version = "0.29.0" } maturin-1.16.0/test-crates/readme-duplication/readme-py/README.md000066400000000000000000000000501527064705700244340ustar00rootroot00000000000000Readme duplication test case - Readme 2 maturin-1.16.0/test-crates/readme-duplication/readme-py/pyproject.toml000066400000000000000000000001741527064705700261000ustar00rootroot00000000000000[build-system] requires = ["maturin==1.6.0,<2.0"] build-backend = "maturin" [project] name = "readme-py" version = "0.2.0" maturin-1.16.0/test-crates/readme-duplication/readme-py/src/000077500000000000000000000000001527064705700237515ustar00rootroot00000000000000maturin-1.16.0/test-crates/readme-duplication/readme-py/src/lib.rs000066400000000000000000000002701527064705700250640ustar00rootroot00000000000000use pyo3::{pymodule, Bound, PyResult}; use pyo3::types::{PyModule, PyModuleMethods}; #[pymodule] fn readme(m: &Bound) -> PyResult<()> { m.add("value", 1)?; Ok(()) } maturin-1.16.0/test-crates/readme-duplication/readme-rs/000077500000000000000000000000001527064705700231565ustar00rootroot00000000000000maturin-1.16.0/test-crates/readme-duplication/readme-rs/Cargo.lock000066400000000000000000000242401527064705700250650ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "ahash" version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" dependencies = [ "cfg-if", "getrandom", "once_cell", "version_check", "zerocopy", ] [[package]] name = "anstream" version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "utf8parse", ] [[package]] name = "anstyle" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anstyle-parse" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ "windows-sys", ] [[package]] name = "anstyle-wincon" version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", "windows-sys", ] [[package]] name = "anyhow" version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" [[package]] name = "cc" version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "libc", ] [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80c21025abd42669a92efc996ef13cfb2c5c627858421ea58d5c3b331a6c134f" dependencies = [ "clap_builder", "clap_derive", ] [[package]] name = "clap_builder" version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "458bf1f341769dfcf849846f65dffdf9146daa56bcd2a47cb4e1de9915567c99" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim", ] [[package]] name = "clap_derive" version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "clap_lex" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "colorchoice" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "getrandom" version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", "wasi", ] [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "jemalloc-sys" version = "0.5.4+5.3.0-patched" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac6c1946e1cea1788cbfde01c993b52a10e2da07f4bac608228d1bed20bfebf2" dependencies = [ "cc", "libc", ] [[package]] name = "jemallocator" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0de374a9f8e63150e6f5e8a60cc14c668226d7a347d8aee1a45766e3c4dd3bc" dependencies = [ "jemalloc-sys", "libc", ] [[package]] name = "libc" version = "0.2.152" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" [[package]] name = "once_cell" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "poppy" version = "0.1.0" dependencies = [ "ahash", "anyhow", "clap", "jemallocator", "rand", "thiserror", ] [[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] [[package]] name = "quote" version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] [[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", "rand_core", ] [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom", ] [[package]] name = "strsim" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" [[package]] name = "syn" version = "2.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "thiserror" version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "utf8parse" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" [[package]] name = "windows_aarch64_msvc" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" [[package]] name = "windows_i686_gnu" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" [[package]] name = "windows_i686_msvc" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" [[package]] name = "windows_x86_64_gnu" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" [[package]] name = "windows_x86_64_gnullvm" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "zerocopy" version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", "syn", ] maturin-1.16.0/test-crates/readme-duplication/readme-rs/Cargo.toml000066400000000000000000000001301527064705700251000ustar00rootroot00000000000000[package] name = "readme-rs" version = "0.2.0" edition = "2021" readme.workspace = true maturin-1.16.0/test-crates/readme-duplication/readme-rs/src/000077500000000000000000000000001527064705700237455ustar00rootroot00000000000000maturin-1.16.0/test-crates/readme-duplication/readme-rs/src/lib.rs000066400000000000000000000000001527064705700250470ustar00rootroot00000000000000maturin-1.16.0/test-crates/sdist_with_path_dep/000077500000000000000000000000001527064705700215565ustar00rootroot00000000000000maturin-1.16.0/test-crates/sdist_with_path_dep/Cargo.lock000066400000000000000000000067571527064705700235020ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "proc-macro2" version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "quote" version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] [[package]] name = "sdist_with_path_dep" version = "0.1.0" dependencies = [ "pyo3", "some_path_dep", ] [[package]] name = "some_path_dep" version = "0.1.0" dependencies = [ "transitive_path_dep", ] [[package]] name = "syn" version = "2.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "transitive_path_dep" version = "0.1.0" [[package]] name = "unicode-ident" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" maturin-1.16.0/test-crates/sdist_with_path_dep/Cargo.toml000066400000000000000000000003611527064705700235060ustar00rootroot00000000000000[package] name = "sdist_with_path_dep" version = "0.1.0" authors = ["konstin "] edition = "2021" [lib] crate-type = ["cdylib"] [dependencies] pyo3 = { version = "0.29.0" } some_path_dep = { path = "../some_path_dep" } maturin-1.16.0/test-crates/sdist_with_path_dep/pyproject.toml000066400000000000000000000001121527064705700244640ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" maturin-1.16.0/test-crates/sdist_with_path_dep/src/000077500000000000000000000000001527064705700223455ustar00rootroot00000000000000maturin-1.16.0/test-crates/sdist_with_path_dep/src/lib.rs000066400000000000000000000004711527064705700234630ustar00rootroot00000000000000use pyo3::prelude::*; #[pyfunction] fn add(x: usize, y: usize) -> usize { let sum = some_path_dep::add(x, y); debug_assert!(some_path_dep::is_sum(x, y, sum)); sum } #[pymodule] fn sdist_with_path_dep(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(add))?; Ok(()) } maturin-1.16.0/test-crates/sdist_with_target_path_dep/000077500000000000000000000000001527064705700231245ustar00rootroot00000000000000maturin-1.16.0/test-crates/sdist_with_target_path_dep/Cargo.lock000066400000000000000000000067661527064705700250500ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "proc-macro2" version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "quote" version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] [[package]] name = "sdist_with_target_path_dep" version = "0.1.0" dependencies = [ "pyo3", "some_path_dep", ] [[package]] name = "some_path_dep" version = "0.1.0" dependencies = [ "transitive_path_dep", ] [[package]] name = "syn" version = "2.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "transitive_path_dep" version = "0.1.0" [[package]] name = "unicode-ident" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" maturin-1.16.0/test-crates/sdist_with_target_path_dep/Cargo.toml000066400000000000000000000005001527064705700250470ustar00rootroot00000000000000[package] name = "sdist_with_target_path_dep" version = "0.1.0" authors = ["konstin "] edition = "2021" [lib] crate-type = ["cdylib"] [dependencies] pyo3 = { version = "0.29.0" } [target.'cfg(not(target_endian = "all-over-the-place"))'.dependencies] some_path_dep = { path = "../some_path_dep" } maturin-1.16.0/test-crates/sdist_with_target_path_dep/pyproject.toml000066400000000000000000000001121527064705700260320ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" maturin-1.16.0/test-crates/sdist_with_target_path_dep/src/000077500000000000000000000000001527064705700237135ustar00rootroot00000000000000maturin-1.16.0/test-crates/sdist_with_target_path_dep/src/lib.rs000066400000000000000000000005001527064705700250220ustar00rootroot00000000000000use pyo3::prelude::*; #[pyfunction] fn add(x: usize, y: usize) -> usize { let sum = some_path_dep::add(x, y); debug_assert!(some_path_dep::is_sum(x, y, sum)); sum } #[pymodule] fn sdist_with_target_path_dep(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(add))?; Ok(()) } maturin-1.16.0/test-crates/some_path_dep/000077500000000000000000000000001527064705700203405ustar00rootroot00000000000000maturin-1.16.0/test-crates/some_path_dep/Cargo.toml000066400000000000000000000004341527064705700222710ustar00rootroot00000000000000[package] name = "some_path_dep" version = "0.1.0" authors = ["konstin "] edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] transitive_path_dep = { path = "../transitive_path_dep" } maturin-1.16.0/test-crates/some_path_dep/src/000077500000000000000000000000001527064705700211275ustar00rootroot00000000000000maturin-1.16.0/test-crates/some_path_dep/src/lib.rs000066400000000000000000000003001527064705700222340ustar00rootroot00000000000000pub use transitive_path_dep::is_sum; pub fn add(x: usize, y: usize) -> usize { x + y } #[cfg(test)] mod tests { #[test] fn it_works() { assert_eq!(add(2, 2), 4); } } maturin-1.16.0/test-crates/transitive_path_dep/000077500000000000000000000000001527064705700215655ustar00rootroot00000000000000maturin-1.16.0/test-crates/transitive_path_dep/Cargo.toml000066400000000000000000000003501527064705700235130ustar00rootroot00000000000000[package] name = "transitive_path_dep" version = "0.1.0" authors = ["konstin "] edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] maturin-1.16.0/test-crates/transitive_path_dep/src/000077500000000000000000000000001527064705700223545ustar00rootroot00000000000000maturin-1.16.0/test-crates/transitive_path_dep/src/lib.rs000066400000000000000000000002531527064705700234700ustar00rootroot00000000000000pub fn is_sum(x: usize, y: usize, sum: usize) -> bool { x + y == sum } #[cfg(test)] mod tests { #[test] fn it_works() { assert_eq!(2 + 2, 4); } } maturin-1.16.0/test-crates/uniffi-mixed/000077500000000000000000000000001527064705700201155ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-mixed/.gitignore000066400000000000000000000000321527064705700221000ustar00rootroot00000000000000uniffi_mixed/uniffi_mixed maturin-1.16.0/test-crates/uniffi-mixed/Cargo.lock000066400000000000000000000314551527064705700220320ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "anyhow" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "askama" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28" dependencies = [ "askama_derive", "askama_escape", ] [[package]] name = "askama_derive" version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83" dependencies = [ "askama_parser", "basic-toml", "mime", "mime_guess", "proc-macro2", "quote", "serde", "syn", ] [[package]] name = "askama_escape" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" [[package]] name = "askama_parser" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0" dependencies = [ "nom", ] [[package]] name = "autocfg" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "basic-toml" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "823388e228f614e9558c6804262db37960ec8821856535f5c3f59913140558f8" dependencies = [ "serde", ] [[package]] name = "bincode" version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" dependencies = [ "serde", ] [[package]] name = "bytes" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "camino" version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" dependencies = [ "serde", ] [[package]] name = "cargo-platform" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" dependencies = [ "serde", ] [[package]] name = "cargo_metadata" version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" dependencies = [ "camino", "cargo-platform", "semver", "serde", "serde_json", "thiserror", ] [[package]] name = "fs-err" version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" dependencies = [ "autocfg", ] [[package]] name = "glob" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "goblin" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47" dependencies = [ "log", "plain", "scroll", ] [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "itoa" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "log" version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" dependencies = [ "mime", "unicase", ] [[package]] name = "minimal-lexical" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "nom" version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", ] [[package]] name = "once_cell" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "plain" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "quote" version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] [[package]] name = "ryu" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "scroll" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" dependencies = [ "scroll_derive", ] [[package]] name = "scroll_derive" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f81c2fde025af7e69b1d1420531c8a8811ca898919db177141a85313b1cb932" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "semver" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" dependencies = [ "serde", ] [[package]] name = "serde" version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_json" version = "1.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" dependencies = [ "itoa", "ryu", "serde", ] [[package]] name = "siphasher" version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "smawk" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "textwrap" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" dependencies = [ "smawk", ] [[package]] name = "thiserror" version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "toml" version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] [[package]] name = "unicase" version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "uniffi" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f31bff6daf87277a9014bcdefbc2842b0553392919d1096843c5aad899ca4588" dependencies = [ "anyhow", "uniffi_build", "uniffi_core", "uniffi_macros", ] [[package]] name = "uniffi-mixed" version = "0.1.0" dependencies = [ "uniffi", ] [[package]] name = "uniffi_bindgen" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96061d7e01b185aa405f7c9b134741ab3e50cc6796a47d6fd8ab9a5364b5feed" dependencies = [ "anyhow", "askama", "camino", "cargo_metadata", "fs-err", "glob", "goblin", "heck", "once_cell", "paste", "serde", "textwrap", "toml", "uniffi_meta", "uniffi_testing", "uniffi_udl", ] [[package]] name = "uniffi_build" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d6b86f9b221046af0c533eafe09ece04e2f1ded04ccdc9bba0ec09aec1c52bd" dependencies = [ "anyhow", "camino", "uniffi_bindgen", ] [[package]] name = "uniffi_checksum_derive" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fcfa22f55829d3aaa7acfb1c5150224188fe0f27c59a8a3eddcaa24d1ffbe58" dependencies = [ "quote", "syn", ] [[package]] name = "uniffi_core" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3210d57d6ab6065ab47a2898dacdb7c606fd6a4156196831fa3bf82e34ac58a6" dependencies = [ "anyhow", "bytes", "camino", "log", "once_cell", "paste", "static_assertions", ] [[package]] name = "uniffi_macros" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58691741080935437dc862122e68d7414432a11824ac1137868de46181a0bd2" dependencies = [ "bincode", "camino", "fs-err", "once_cell", "proc-macro2", "quote", "serde", "syn", "toml", "uniffi_meta", ] [[package]] name = "uniffi_meta" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7663eacdbd9fbf4a88907ddcfe2e6fa85838eb6dc2418a7d91eebb3786f8e20b" dependencies = [ "anyhow", "bytes", "siphasher", "uniffi_checksum_derive", ] [[package]] name = "uniffi_testing" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f922465f7566f25f8fe766920205fdfa9a3fcdc209c6bfb7557f0b5bf45b04dd" dependencies = [ "anyhow", "camino", "cargo_metadata", "fs-err", "once_cell", ] [[package]] name = "uniffi_udl" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cef408229a3a407fafa4c36dc4f6ece78a6fb258ab28d2b64bddd49c8cb680f6" dependencies = [ "anyhow", "textwrap", "uniffi_meta", "uniffi_testing", "weedle2", ] [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "weedle2" version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "998d2c24ec099a87daf9467808859f9d82b61f1d9c9701251aea037f514eae0e" dependencies = [ "nom", ] maturin-1.16.0/test-crates/uniffi-mixed/Cargo.toml000066400000000000000000000005101527064705700220410ustar00rootroot00000000000000[package] name = "uniffi-mixed" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] name = "uniffi_mixed" crate-type = ["cdylib"] [dependencies] uniffi = "0.28.0" [build-dependencies] uniffi = { version = "0.28.0", features = ["build"] } maturin-1.16.0/test-crates/uniffi-mixed/build.rs000066400000000000000000000001131527064705700215550ustar00rootroot00000000000000fn main() { uniffi::generate_scaffolding("./src/math.udl").unwrap(); } maturin-1.16.0/test-crates/uniffi-mixed/check_installed/000077500000000000000000000000001527064705700232315ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-mixed/check_installed/check_installed.py000077500000000000000000000001421527064705700267170ustar00rootroot00000000000000#!/usr/bin/env python3 import uniffi_mixed assert uniffi_mixed.add(1, 2) == 3 print("SUCCESS") maturin-1.16.0/test-crates/uniffi-mixed/pyproject.toml000066400000000000000000000001121527064705700230230ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" maturin-1.16.0/test-crates/uniffi-mixed/src/000077500000000000000000000000001527064705700207045ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-mixed/src/lib.rs000066400000000000000000000001231527064705700220140ustar00rootroot00000000000000fn add(a: u32, b: u32) -> u32 { a + b } uniffi::include_scaffolding!("math"); maturin-1.16.0/test-crates/uniffi-mixed/src/math.udl000066400000000000000000000000551527064705700223430ustar00rootroot00000000000000namespace math { u32 add(u32 a, u32 b); }; maturin-1.16.0/test-crates/uniffi-mixed/test_uniffi_mixed.py000066400000000000000000000001151527064705700241710ustar00rootroot00000000000000import uniffi_mixed def test_add(): assert uniffi_mixed.add(1, 2) == 3 maturin-1.16.0/test-crates/uniffi-mixed/uniffi_mixed/000077500000000000000000000000001527064705700225635ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-mixed/uniffi_mixed/__init__.py000066400000000000000000000000341527064705700246710ustar00rootroot00000000000000from .uniffi_mixed import * maturin-1.16.0/test-crates/uniffi-multiple-binding-files/000077500000000000000000000000001527064705700233525ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-multiple-binding-files/Cargo.lock000066400000000000000000000441161527064705700252650ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "anstream" version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ "windows-sys", ] [[package]] name = "anstyle-wincon" version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", "windows-sys", ] [[package]] name = "anyhow" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "askama" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28" dependencies = [ "askama_derive", "askama_escape", ] [[package]] name = "askama_derive" version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83" dependencies = [ "askama_parser", "basic-toml", "mime", "mime_guess", "proc-macro2", "quote", "serde", "syn", ] [[package]] name = "askama_escape" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" [[package]] name = "askama_parser" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0" dependencies = [ "nom", ] [[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "basic-toml" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "823388e228f614e9558c6804262db37960ec8821856535f5c3f59913140558f8" dependencies = [ "serde", ] [[package]] name = "bincode" version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" dependencies = [ "serde", ] [[package]] name = "bytes" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "camino" version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" dependencies = [ "serde", ] [[package]] name = "cargo-platform" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" dependencies = [ "serde", ] [[package]] name = "cargo_metadata" version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" dependencies = [ "camino", "cargo-platform", "semver", "serde", "serde_json", "thiserror", ] [[package]] name = "clap" version = "4.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019" dependencies = [ "clap_builder", "clap_derive", ] [[package]] name = "clap_builder" version = "4.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim", ] [[package]] name = "clap_derive" version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "clap_lex" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "colorchoice" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "fs-err" version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" dependencies = [ "autocfg", ] [[package]] name = "glob" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "goblin" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47" dependencies = [ "log", "plain", "scroll", ] [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "is_terminal_polyfill" version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itoa" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "log" version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" dependencies = [ "mime", "unicase", ] [[package]] name = "minimal-lexical" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "mylib" version = "0.1.0" dependencies = [ "uniffi", ] [[package]] name = "nom" version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", ] [[package]] name = "once_cell" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "plain" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "quote" version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] [[package]] name = "ryu" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "scroll" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" dependencies = [ "scroll_derive", ] [[package]] name = "scroll_derive" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f81c2fde025af7e69b1d1420531c8a8811ca898919db177141a85313b1cb932" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "semver" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" dependencies = [ "serde", ] [[package]] name = "serde" version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_json" version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" dependencies = [ "itoa", "memchr", "ryu", "serde", ] [[package]] name = "siphasher" version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "smawk" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "textwrap" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" dependencies = [ "smawk", ] [[package]] name = "thiserror" version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "toml" version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] [[package]] name = "unicase" version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] [[package]] name = "unicode-ident" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "uniffi" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2db87def739fe4183947f8419d572d1849a4a09355eba4e988a2105cfd0ac6a7" dependencies = [ "anyhow", "camino", "cargo_metadata", "clap", "uniffi_bindgen", "uniffi_build", "uniffi_core", "uniffi_macros", ] [[package]] name = "uniffi-multiple-binding-files" version = "0.1.0" dependencies = [ "mylib", "uniffi", ] [[package]] name = "uniffi_bindgen" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a112599c9556d1581e4a3d72019a74c2c3e122cc27f4af12577a429c4d5e614" dependencies = [ "anyhow", "askama", "camino", "cargo_metadata", "fs-err", "glob", "goblin", "heck", "once_cell", "paste", "serde", "textwrap", "toml", "uniffi_meta", "uniffi_udl", ] [[package]] name = "uniffi_build" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2b12684401d2a8508ca9c72a95bbc45906417e42fc80942abaf033bbf01aa33" dependencies = [ "anyhow", "camino", "uniffi_bindgen", ] [[package]] name = "uniffi_checksum_derive" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a22dbe67c1c957ac6e7611bdf605a6218aa86b0eebeb8be58b70ae85ad7d73dc" dependencies = [ "quote", "syn", ] [[package]] name = "uniffi_core" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a0c35aaad30e3a9e6d4fe34e358d64dbc92ee09045b48591b05fc9f12e0905b" dependencies = [ "anyhow", "bytes", "camino", "log", "once_cell", "paste", "static_assertions", ] [[package]] name = "uniffi_macros" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db66474c5c61b0f7afc3b4995fecf9b72b340daa5ca0ef3da7778d75eb5482ea" dependencies = [ "bincode", "camino", "fs-err", "once_cell", "proc-macro2", "quote", "serde", "syn", "toml", "uniffi_meta", ] [[package]] name = "uniffi_meta" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d898893f102e0e39b8bcb7e3d2188f4156ba280db32db9e8af1f122d057e9526" dependencies = [ "anyhow", "bytes", "siphasher", "uniffi_checksum_derive", ] [[package]] name = "uniffi_testing" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c6aa4f0cf9d12172d84fc00a35a6c1f3522b526daad05ae739f709f6941b9b6" dependencies = [ "anyhow", "camino", "cargo_metadata", "fs-err", "once_cell", ] [[package]] name = "uniffi_udl" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b044e9c519e0bb51e516ab6f6d8f4f4dcf900ce30d5ad07c03f924e2824f28e" dependencies = [ "anyhow", "textwrap", "uniffi_meta", "uniffi_testing", "weedle2", ] [[package]] name = "utf8parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "weedle2" version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "998d2c24ec099a87daf9467808859f9d82b61f1d9c9701251aea037f514eae0e" dependencies = [ "nom", ] [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", "windows_i686_gnullvm", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" maturin-1.16.0/test-crates/uniffi-multiple-binding-files/Cargo.toml000066400000000000000000000006471527064705700253110ustar00rootroot00000000000000[package] name = "uniffi-multiple-binding-files" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] name = "uniffi_multiple_binding_files" crate-type = ["cdylib"] [dependencies] uniffi = { version = "0.28.0", features = ["cli"] } mylib = { path = "mylib" } [build-dependencies] uniffi = { version = "0.28.0", features = ["build"] } maturin-1.16.0/test-crates/uniffi-multiple-binding-files/check_installed/000077500000000000000000000000001527064705700264665ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-multiple-binding-files/check_installed/check_installed.py000077500000000000000000000002711527064705700321570ustar00rootroot00000000000000#!/usr/bin/env python3 import uniffi_multiple_binding_files assert uniffi_multiple_binding_files.get_status() == uniffi_multiple_binding_files.mylib.Status.COMPLETE print("SUCCESS") maturin-1.16.0/test-crates/uniffi-multiple-binding-files/mylib/000077500000000000000000000000001527064705700244665ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-multiple-binding-files/mylib/Cargo.toml000066400000000000000000000003161527064705700264160ustar00rootroot00000000000000[package] name = "mylib" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] uniffi = { version = "0.28.0" } maturin-1.16.0/test-crates/uniffi-multiple-binding-files/mylib/src/000077500000000000000000000000001527064705700252555ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-multiple-binding-files/mylib/src/lib.rs000066400000000000000000000002361527064705700263720ustar00rootroot00000000000000#[derive(uniffi::Enum)] pub enum Status { Running, Complete, } pub fn get_status() -> Status { Status::Complete } uniffi::setup_scaffolding!(); maturin-1.16.0/test-crates/uniffi-multiple-binding-files/src/000077500000000000000000000000001527064705700241415ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-multiple-binding-files/src/lib.rs000066400000000000000000000001621527064705700252540ustar00rootroot00000000000000#[uniffi::export] pub fn get_status() -> mylib::Status { mylib::get_status() } uniffi::setup_scaffolding!(); maturin-1.16.0/test-crates/uniffi-multiple-binding-files/uniffi.toml000066400000000000000000000001001527064705700255160ustar00rootroot00000000000000[bindings.python] cdylib_name = "uniffi_multiple_binding_files" maturin-1.16.0/test-crates/uniffi-multiple-crates/000077500000000000000000000000001527064705700221215ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-multiple-crates/.gitignore000066400000000000000000000000071527064705700241060ustar00rootroot00000000000000target maturin-1.16.0/test-crates/uniffi-multiple-crates/Cargo.lock000066400000000000000000000411161527064705700240310ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "a" version = "0.1.0" dependencies = [ "b", "uniffi", ] [[package]] name = "anstream" version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ "windows-sys", ] [[package]] name = "anstyle-wincon" version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", "windows-sys", ] [[package]] name = "anyhow" version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" [[package]] name = "askama" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28" dependencies = [ "askama_derive", "askama_escape", ] [[package]] name = "askama_derive" version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83" dependencies = [ "askama_parser", "basic-toml", "mime", "mime_guess", "proc-macro2", "quote", "serde", "syn", ] [[package]] name = "askama_escape" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" [[package]] name = "askama_parser" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0" dependencies = [ "nom", ] [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "b" version = "0.1.0" dependencies = [ "uniffi", ] [[package]] name = "basic-toml" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" dependencies = [ "serde", ] [[package]] name = "bincode" version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" dependencies = [ "serde", ] [[package]] name = "bytes" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "camino" version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" dependencies = [ "serde_core", ] [[package]] name = "cargo-platform" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" dependencies = [ "serde", ] [[package]] name = "cargo_metadata" version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" dependencies = [ "camino", "cargo-platform", "semver", "serde", "serde_json", "thiserror", ] [[package]] name = "clap" version = "4.5.58" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63be97961acde393029492ce0be7a1af7e323e6bae9511ebfac33751be5e6806" dependencies = [ "clap_builder", "clap_derive", ] [[package]] name = "clap_builder" version = "4.5.58" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f13174bda5dfd69d7e947827e5af4b0f2f94a4a3ee92912fba07a66150f21e2" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim", ] [[package]] name = "clap_derive" version = "4.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "clap_lex" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" [[package]] name = "colorchoice" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "fs-err" version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" dependencies = [ "autocfg", ] [[package]] name = "glob" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "goblin" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47" dependencies = [ "log", "plain", "scroll", ] [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "is_terminal_polyfill" version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itoa" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "log" version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "memchr" version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" dependencies = [ "mime", "unicase", ] [[package]] name = "minimal-lexical" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "nom" version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", ] [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "once_cell_polyfill" version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "plain" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "proc-macro2" version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "quote" version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] [[package]] name = "scroll" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" dependencies = [ "scroll_derive", ] [[package]] name = "scroll_derive" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "semver" version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", "serde_core", ] [[package]] name = "serde" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", ] [[package]] name = "serde_core" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_json" version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", "serde", "serde_core", "zmij", ] [[package]] name = "siphasher" version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "smawk" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" version = "2.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "textwrap" version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" dependencies = [ "smawk", ] [[package]] name = "thiserror" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "toml" version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] [[package]] name = "unicase" version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "uniffi" version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cb08c58c7ed7033150132febe696bef553f891b1ede57424b40d87a89e3c170" dependencies = [ "anyhow", "camino", "cargo_metadata", "clap", "uniffi_bindgen", "uniffi_build", "uniffi_core", "uniffi_macros", ] [[package]] name = "uniffi-bindgen" version = "0.1.0" dependencies = [ "uniffi", ] [[package]] name = "uniffi_bindgen" version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cade167af943e189a55020eda2c314681e223f1e42aca7c4e52614c2b627698f" dependencies = [ "anyhow", "askama", "camino", "cargo_metadata", "fs-err", "glob", "goblin", "heck", "once_cell", "paste", "serde", "textwrap", "toml", "uniffi_meta", "uniffi_udl", ] [[package]] name = "uniffi_build" version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7cf32576e08104b7dc2a6a5d815f37616e66c6866c2a639fe16e6d2286b75b" dependencies = [ "anyhow", "camino", "uniffi_bindgen", ] [[package]] name = "uniffi_checksum_derive" version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "802d2051a700e3ec894c79f80d2705b69d85844dafbbe5d1a92776f8f48b563a" dependencies = [ "quote", "syn", ] [[package]] name = "uniffi_core" version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc7687007d2546c454d8ae609b105daceb88175477dac280707ad6d95bcd6f1f" dependencies = [ "anyhow", "bytes", "log", "once_cell", "paste", "static_assertions", ] [[package]] name = "uniffi_macros" version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12c65a5b12ec544ef136693af8759fb9d11aefce740fb76916721e876639033b" dependencies = [ "bincode", "camino", "fs-err", "once_cell", "proc-macro2", "quote", "serde", "syn", "toml", "uniffi_meta", ] [[package]] name = "uniffi_meta" version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a74ed96c26882dac1ca9b93ca23c827e284bacbd7ec23c6f0b0372f747d59e4" dependencies = [ "anyhow", "bytes", "siphasher", "uniffi_checksum_derive", ] [[package]] name = "uniffi_testing" version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6f984f0781f892cc864a62c3a5c60361b1ccbd68e538e6c9fbced5d82268ac" dependencies = [ "anyhow", "camino", "cargo_metadata", "fs-err", "once_cell", ] [[package]] name = "uniffi_udl" version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "037820a4cfc4422db1eaa82f291a3863c92c7d1789dc513489c36223f9b4cdfc" dependencies = [ "anyhow", "textwrap", "uniffi_meta", "uniffi_testing", "weedle2", ] [[package]] name = "utf8parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "weedle2" version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "998d2c24ec099a87daf9467808859f9d82b61f1d9c9701251aea037f514eae0e" dependencies = [ "nom", ] [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-sys" version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ "windows-link", ] [[package]] name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" maturin-1.16.0/test-crates/uniffi-multiple-crates/Cargo.toml000066400000000000000000000001271527064705700240510ustar00rootroot00000000000000[workspace] members = ["crates/a", "crates/b", "crates/uniffi-bindgen"] resolver = "2" maturin-1.16.0/test-crates/uniffi-multiple-crates/README.md000066400000000000000000000002021527064705700233720ustar00rootroot00000000000000# Uniffi with multiple crates Reproduction of a bug where not all uniffi generated code is included when building using maturin. maturin-1.16.0/test-crates/uniffi-multiple-crates/check_installed/000077500000000000000000000000001527064705700252355ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-multiple-crates/check_installed/check_installed.py000077500000000000000000000002101527064705700307170ustar00rootroot00000000000000#!/usr/bin/env python3 import a assert a.random_enum(a.RandomEnum.A) == 0 assert a.random_enum(a.RandomEnum.B) == 1 print("SUCCESS") maturin-1.16.0/test-crates/uniffi-multiple-crates/crates/000077500000000000000000000000001527064705700234025ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-multiple-crates/crates/a/000077500000000000000000000000001527064705700236225ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-multiple-crates/crates/a/Cargo.toml000066400000000000000000000003331527064705700255510ustar00rootroot00000000000000[package] name = "a" version = "0.1.0" edition = "2021" [lib] crate-type = ["cdylib"] [dependencies] uniffi = "0.28.0" b = { path = "../b" } [build-dependencies] uniffi = { version = "0.28.0", features = ["build"] } maturin-1.16.0/test-crates/uniffi-multiple-crates/crates/a/src/000077500000000000000000000000001527064705700244115ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-multiple-crates/crates/a/src/lib.rs000066400000000000000000000002751527064705700255310ustar00rootroot00000000000000use b::RandomEnum; uniffi::setup_scaffolding!(); #[uniffi::export] pub fn random_enum(e: RandomEnum) -> u8 { match e { RandomEnum::A => 0, RandomEnum::B => 1, } } maturin-1.16.0/test-crates/uniffi-multiple-crates/crates/b/000077500000000000000000000000001527064705700236235ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-multiple-crates/crates/b/Cargo.toml000066400000000000000000000001321527064705700255470ustar00rootroot00000000000000[package] name = "b" version = "0.1.0" edition = "2021" [dependencies] uniffi = "0.28.0" maturin-1.16.0/test-crates/uniffi-multiple-crates/crates/b/src/000077500000000000000000000000001527064705700244125ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-multiple-crates/crates/b/src/lib.rs000066400000000000000000000001711527064705700255250ustar00rootroot00000000000000uniffi::setup_scaffolding!(); #[derive(Clone, Copy, Debug, uniffi::Enum)] pub enum RandomEnum { A = 0, B = 1, } maturin-1.16.0/test-crates/uniffi-multiple-crates/crates/uniffi-bindgen/000077500000000000000000000000001527064705700262665ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-multiple-crates/crates/uniffi-bindgen/Cargo.toml000066400000000000000000000003051527064705700302140ustar00rootroot00000000000000[package] name = "uniffi-bindgen" version = "0.1.0" edition = "2021" [[bin]] name = "uniffi-bindgen" path = "uniffi-bindgen.rs" [dependencies] uniffi = { version = "0.28.0", features = ["cli"] } maturin-1.16.0/test-crates/uniffi-multiple-crates/crates/uniffi-bindgen/uniffi-bindgen.rs000066400000000000000000000000601527064705700315140ustar00rootroot00000000000000fn main() { uniffi::uniffi_bindgen_main() } maturin-1.16.0/test-crates/uniffi-multiple-crates/pyproject.toml000066400000000000000000000003501527064705700250330ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "a" version = "0.1.0" requires-python = ">=3.8" [tool.maturin] module-name = "a" bindings = "uniffi" manifest-path = "crates/a/Cargo.toml" maturin-1.16.0/test-crates/uniffi-pure-proc-macro/000077500000000000000000000000001527064705700220225ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-pure-proc-macro/Cargo.lock000066400000000000000000000437431527064705700237420ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "anstream" version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys", ] [[package]] name = "anstyle-wincon" version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", "windows-sys", ] [[package]] name = "anyhow" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "askama" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28" dependencies = [ "askama_derive", "askama_escape", ] [[package]] name = "askama_derive" version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83" dependencies = [ "askama_parser", "basic-toml", "mime", "mime_guess", "proc-macro2", "quote", "serde", "syn", ] [[package]] name = "askama_escape" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" [[package]] name = "askama_parser" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0" dependencies = [ "nom", ] [[package]] name = "autocfg" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "basic-toml" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "823388e228f614e9558c6804262db37960ec8821856535f5c3f59913140558f8" dependencies = [ "serde", ] [[package]] name = "bincode" version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" dependencies = [ "serde", ] [[package]] name = "bytes" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "camino" version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" dependencies = [ "serde", ] [[package]] name = "cargo-platform" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" dependencies = [ "serde", ] [[package]] name = "cargo_metadata" version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" dependencies = [ "camino", "cargo-platform", "semver", "serde", "serde_json", "thiserror", ] [[package]] name = "clap" version = "4.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f" dependencies = [ "clap_builder", "clap_derive", ] [[package]] name = "clap_builder" version = "4.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim", ] [[package]] name = "clap_derive" version = "4.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "clap_lex" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" [[package]] name = "colorchoice" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] name = "fs-err" version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" dependencies = [ "autocfg", ] [[package]] name = "glob" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "goblin" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47" dependencies = [ "log", "plain", "scroll", ] [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "is_terminal_polyfill" version = "1.70.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" [[package]] name = "itoa" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "log" version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" dependencies = [ "mime", "unicase", ] [[package]] name = "minimal-lexical" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "nom" version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", ] [[package]] name = "once_cell" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "plain" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "quote" version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] [[package]] name = "ryu" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "scroll" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" dependencies = [ "scroll_derive", ] [[package]] name = "scroll_derive" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f81c2fde025af7e69b1d1420531c8a8811ca898919db177141a85313b1cb932" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "semver" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" dependencies = [ "serde", ] [[package]] name = "serde" version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_json" version = "1.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" dependencies = [ "itoa", "ryu", "serde", ] [[package]] name = "siphasher" version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "smawk" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "textwrap" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" dependencies = [ "smawk", ] [[package]] name = "thiserror" version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "toml" version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] [[package]] name = "unicase" version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "uniffi" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f31bff6daf87277a9014bcdefbc2842b0553392919d1096843c5aad899ca4588" dependencies = [ "anyhow", "camino", "clap", "uniffi_bindgen", "uniffi_build", "uniffi_core", "uniffi_macros", ] [[package]] name = "uniffi-pure-proc-macro" version = "0.1.0" dependencies = [ "uniffi", ] [[package]] name = "uniffi_bindgen" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96061d7e01b185aa405f7c9b134741ab3e50cc6796a47d6fd8ab9a5364b5feed" dependencies = [ "anyhow", "askama", "camino", "cargo_metadata", "fs-err", "glob", "goblin", "heck", "once_cell", "paste", "serde", "textwrap", "toml", "uniffi_meta", "uniffi_testing", "uniffi_udl", ] [[package]] name = "uniffi_build" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d6b86f9b221046af0c533eafe09ece04e2f1ded04ccdc9bba0ec09aec1c52bd" dependencies = [ "anyhow", "camino", "uniffi_bindgen", ] [[package]] name = "uniffi_checksum_derive" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fcfa22f55829d3aaa7acfb1c5150224188fe0f27c59a8a3eddcaa24d1ffbe58" dependencies = [ "quote", "syn", ] [[package]] name = "uniffi_core" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3210d57d6ab6065ab47a2898dacdb7c606fd6a4156196831fa3bf82e34ac58a6" dependencies = [ "anyhow", "bytes", "camino", "log", "once_cell", "paste", "static_assertions", ] [[package]] name = "uniffi_macros" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58691741080935437dc862122e68d7414432a11824ac1137868de46181a0bd2" dependencies = [ "bincode", "camino", "fs-err", "once_cell", "proc-macro2", "quote", "serde", "syn", "toml", "uniffi_meta", ] [[package]] name = "uniffi_meta" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7663eacdbd9fbf4a88907ddcfe2e6fa85838eb6dc2418a7d91eebb3786f8e20b" dependencies = [ "anyhow", "bytes", "siphasher", "uniffi_checksum_derive", ] [[package]] name = "uniffi_testing" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f922465f7566f25f8fe766920205fdfa9a3fcdc209c6bfb7557f0b5bf45b04dd" dependencies = [ "anyhow", "camino", "cargo_metadata", "fs-err", "once_cell", ] [[package]] name = "uniffi_udl" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cef408229a3a407fafa4c36dc4f6ece78a6fb258ab28d2b64bddd49c8cb680f6" dependencies = [ "anyhow", "textwrap", "uniffi_meta", "uniffi_testing", "weedle2", ] [[package]] name = "utf8parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "weedle2" version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "998d2c24ec099a87daf9467808859f9d82b61f1d9c9701251aea037f514eae0e" dependencies = [ "nom", ] [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", "windows_i686_gnullvm", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" [[package]] name = "windows_i686_gnullvm" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" maturin-1.16.0/test-crates/uniffi-pure-proc-macro/Cargo.toml000066400000000000000000000007351527064705700237570ustar00rootroot00000000000000[package] name = "uniffi-pure-proc-macro" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] name = "uniffi_pure_proc_macro" crate-type = ["cdylib"] [[bin]] name = "uniffi-bindgen" path = "uniffi-bindgen.rs" required-features = ["bindgen"] [features] bindgen = ["uniffi/cli"] [dependencies] uniffi = "0.28.0" [build-dependencies] uniffi = { version = "0.28.0", features = ["build"] } maturin-1.16.0/test-crates/uniffi-pure-proc-macro/check_installed/000077500000000000000000000000001527064705700251365ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-pure-proc-macro/check_installed/check_installed.py000077500000000000000000000001721527064705700306270ustar00rootroot00000000000000#!/usr/bin/env python3 import uniffi_pure_proc_macro as uniffi_pure assert uniffi_pure.add(1, 2) == 3 print("SUCCESS") maturin-1.16.0/test-crates/uniffi-pure-proc-macro/pyproject.toml000066400000000000000000000001121527064705700247300ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" maturin-1.16.0/test-crates/uniffi-pure-proc-macro/src/000077500000000000000000000000001527064705700226115ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-pure-proc-macro/src/lib.rs000066400000000000000000000001351527064705700237240ustar00rootroot00000000000000#[uniffi::export] fn add(a: u32, b: u32) -> u32 { a + b } uniffi::setup_scaffolding!(); maturin-1.16.0/test-crates/uniffi-pure-proc-macro/test_uniffi_pure.py000066400000000000000000000001451527064705700257460ustar00rootroot00000000000000import uniffi_pure_proc_macro as uniffi_pure def test_add(): assert uniffi_pure.add(1, 2) == 3 maturin-1.16.0/test-crates/uniffi-pure-proc-macro/uniffi-bindgen.rs000066400000000000000000000000601527064705700252500ustar00rootroot00000000000000fn main() { uniffi::uniffi_bindgen_main() } maturin-1.16.0/test-crates/uniffi-pure-proc-macro/uniffi.toml000066400000000000000000000000521527064705700241740ustar00rootroot00000000000000[bindings.python] cdylib_name = "example" maturin-1.16.0/test-crates/uniffi-pure/000077500000000000000000000000001527064705700177625ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-pure/Cargo.lock000066400000000000000000000314541527064705700216760ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "anyhow" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "askama" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28" dependencies = [ "askama_derive", "askama_escape", ] [[package]] name = "askama_derive" version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83" dependencies = [ "askama_parser", "basic-toml", "mime", "mime_guess", "proc-macro2", "quote", "serde", "syn", ] [[package]] name = "askama_escape" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" [[package]] name = "askama_parser" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0" dependencies = [ "nom", ] [[package]] name = "autocfg" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "basic-toml" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "823388e228f614e9558c6804262db37960ec8821856535f5c3f59913140558f8" dependencies = [ "serde", ] [[package]] name = "bincode" version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" dependencies = [ "serde", ] [[package]] name = "bytes" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "camino" version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" dependencies = [ "serde", ] [[package]] name = "cargo-platform" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" dependencies = [ "serde", ] [[package]] name = "cargo_metadata" version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" dependencies = [ "camino", "cargo-platform", "semver", "serde", "serde_json", "thiserror", ] [[package]] name = "fs-err" version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" dependencies = [ "autocfg", ] [[package]] name = "glob" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "goblin" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47" dependencies = [ "log", "plain", "scroll", ] [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "itoa" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "log" version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" dependencies = [ "mime", "unicase", ] [[package]] name = "minimal-lexical" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "nom" version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", ] [[package]] name = "once_cell" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "plain" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "quote" version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] [[package]] name = "ryu" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "scroll" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" dependencies = [ "scroll_derive", ] [[package]] name = "scroll_derive" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f81c2fde025af7e69b1d1420531c8a8811ca898919db177141a85313b1cb932" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "semver" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" dependencies = [ "serde", ] [[package]] name = "serde" version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_json" version = "1.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" dependencies = [ "itoa", "ryu", "serde", ] [[package]] name = "siphasher" version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "smawk" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "textwrap" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" dependencies = [ "smawk", ] [[package]] name = "thiserror" version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "toml" version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] [[package]] name = "unicase" version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "uniffi" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f31bff6daf87277a9014bcdefbc2842b0553392919d1096843c5aad899ca4588" dependencies = [ "anyhow", "uniffi_build", "uniffi_core", "uniffi_macros", ] [[package]] name = "uniffi-pure" version = "0.1.0" dependencies = [ "uniffi", ] [[package]] name = "uniffi_bindgen" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96061d7e01b185aa405f7c9b134741ab3e50cc6796a47d6fd8ab9a5364b5feed" dependencies = [ "anyhow", "askama", "camino", "cargo_metadata", "fs-err", "glob", "goblin", "heck", "once_cell", "paste", "serde", "textwrap", "toml", "uniffi_meta", "uniffi_testing", "uniffi_udl", ] [[package]] name = "uniffi_build" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d6b86f9b221046af0c533eafe09ece04e2f1ded04ccdc9bba0ec09aec1c52bd" dependencies = [ "anyhow", "camino", "uniffi_bindgen", ] [[package]] name = "uniffi_checksum_derive" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fcfa22f55829d3aaa7acfb1c5150224188fe0f27c59a8a3eddcaa24d1ffbe58" dependencies = [ "quote", "syn", ] [[package]] name = "uniffi_core" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3210d57d6ab6065ab47a2898dacdb7c606fd6a4156196831fa3bf82e34ac58a6" dependencies = [ "anyhow", "bytes", "camino", "log", "once_cell", "paste", "static_assertions", ] [[package]] name = "uniffi_macros" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58691741080935437dc862122e68d7414432a11824ac1137868de46181a0bd2" dependencies = [ "bincode", "camino", "fs-err", "once_cell", "proc-macro2", "quote", "serde", "syn", "toml", "uniffi_meta", ] [[package]] name = "uniffi_meta" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7663eacdbd9fbf4a88907ddcfe2e6fa85838eb6dc2418a7d91eebb3786f8e20b" dependencies = [ "anyhow", "bytes", "siphasher", "uniffi_checksum_derive", ] [[package]] name = "uniffi_testing" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f922465f7566f25f8fe766920205fdfa9a3fcdc209c6bfb7557f0b5bf45b04dd" dependencies = [ "anyhow", "camino", "cargo_metadata", "fs-err", "once_cell", ] [[package]] name = "uniffi_udl" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cef408229a3a407fafa4c36dc4f6ece78a6fb258ab28d2b64bddd49c8cb680f6" dependencies = [ "anyhow", "textwrap", "uniffi_meta", "uniffi_testing", "weedle2", ] [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "weedle2" version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "998d2c24ec099a87daf9467808859f9d82b61f1d9c9701251aea037f514eae0e" dependencies = [ "nom", ] maturin-1.16.0/test-crates/uniffi-pure/Cargo.toml000066400000000000000000000005061527064705700217130ustar00rootroot00000000000000[package] name = "uniffi-pure" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] name = "uniffi_pure" crate-type = ["cdylib"] [dependencies] uniffi = "0.28.0" [build-dependencies] uniffi = { version = "0.28.0", features = ["build"] } maturin-1.16.0/test-crates/uniffi-pure/build.rs000066400000000000000000000001131527064705700214220ustar00rootroot00000000000000fn main() { uniffi::generate_scaffolding("./src/math.udl").unwrap(); } maturin-1.16.0/test-crates/uniffi-pure/check_installed/000077500000000000000000000000001527064705700230765ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-pure/check_installed/check_installed.py000077500000000000000000000001401527064705700265620ustar00rootroot00000000000000#!/usr/bin/env python3 import uniffi_pure assert uniffi_pure.add(1, 2) == 3 print("SUCCESS") maturin-1.16.0/test-crates/uniffi-pure/pyproject.toml000066400000000000000000000001121527064705700226700ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" maturin-1.16.0/test-crates/uniffi-pure/src/000077500000000000000000000000001527064705700205515ustar00rootroot00000000000000maturin-1.16.0/test-crates/uniffi-pure/src/lib.rs000066400000000000000000000001231527064705700216610ustar00rootroot00000000000000fn add(a: u32, b: u32) -> u32 { a + b } uniffi::include_scaffolding!("math"); maturin-1.16.0/test-crates/uniffi-pure/src/math.udl000066400000000000000000000000551527064705700222100ustar00rootroot00000000000000namespace math { u32 add(u32 a, u32 b); }; maturin-1.16.0/test-crates/uniffi-pure/test_uniffi_pure.py000066400000000000000000000001131527064705700237010ustar00rootroot00000000000000import uniffi_pure def test_add(): assert uniffi_pure.add(1, 2) == 3 maturin-1.16.0/test-crates/uniffi-pure/uniffi.toml000066400000000000000000000000521527064705700221340ustar00rootroot00000000000000[bindings.python] cdylib_name = "example" maturin-1.16.0/test-crates/update_readme.py000077500000000000000000000021301527064705700207010ustar00rootroot00000000000000#!/usr/bin/env python3 import re import subprocess from pathlib import Path FILES = [ "README.md", "guide/src/local_development.md", "guide/src/tutorial.md", "guide/src/distribution.md", ] def main(): root = Path(subprocess.check_output(["git", "rev-parse", "--show-toplevel"], text=True).strip()) for path in FILES: content = root.joinpath(path).read_text() matcher = re.compile(r"Usage: maturin ([\w-]+) (.*?)```", re.MULTILINE | re.DOTALL) replaces = {} for command, old in matcher.findall(content): command_output = subprocess.check_output(["cargo", "run", "--", command.lower(), "--help"], text=True) new = "Usage:" + command_output.strip().split("Usage:")[1] + "\n" # Remove trailing whitespace new = re.sub(" +\n", "\n", new) old = "Usage: maturin " + command + " " + old replaces[old] = new for old, new in replaces.items(): content = content.replace(old, new) root.joinpath(path).write_text(content) if __name__ == "__main__": main() maturin-1.16.0/test-crates/with-data/000077500000000000000000000000001527064705700174135ustar00rootroot00000000000000maturin-1.16.0/test-crates/with-data/Cargo.lock000066400000000000000000000002311527064705700213140ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "with-data" version = "0.1.0" maturin-1.16.0/test-crates/with-data/Cargo.toml000066400000000000000000000002361527064705700213440ustar00rootroot00000000000000[package] name = "with-data" version = "0.1.0" authors = ["konstin "] edition = "2021" [lib] name = "with_data" crate-type = ["cdylib"] maturin-1.16.0/test-crates/with-data/check_installed/000077500000000000000000000000001527064705700225275ustar00rootroot00000000000000maturin-1.16.0/test-crates/with-data/check_installed/check_installed.py000066400000000000000000000014361527064705700262210ustar00rootroot00000000000000import locale import sys from pathlib import Path import with_data assert with_data.lib.one() == 1 assert with_data.ffi.string(with_data.lib.say_hello()).decode() == "hello" venv_root = Path(sys.prefix) installed_data = ( venv_root.joinpath("data_subdir") .joinpath("hello.txt") # With the default encoding, python under windows fails to read the file correctly .read_text(encoding="utf-8") .strip() ) assert installed_data == "Hi! 😊", ( installed_data, "Hi! 😊", locale.getpreferredencoding(), ) header_file = ( venv_root.joinpath("include") .joinpath("site") .joinpath(f"python{sys.version_info.major}.{sys.version_info.minor}") .joinpath("with-data") .joinpath("empty.h") ) assert header_file.is_file(), header_file print("SUCCESS") maturin-1.16.0/test-crates/with-data/pyproject.toml000066400000000000000000000003001527064705700223200ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "with-data" dependencies = ["cffi; platform_python_implementation != 'PyPy'"] dynamic = ["version"] maturin-1.16.0/test-crates/with-data/src/000077500000000000000000000000001527064705700202025ustar00rootroot00000000000000maturin-1.16.0/test-crates/with-data/src/lib.rs000066400000000000000000000003601527064705700213150ustar00rootroot00000000000000use std::ffi::CString; use std::os::raw::{c_char, c_int}; #[no_mangle] pub unsafe extern "C" fn say_hello() -> *const c_char { CString::new("hello").unwrap().into_raw() } #[no_mangle] pub unsafe extern "C" fn one() -> c_int { 1 } maturin-1.16.0/test-crates/with-data/with_data.data/000077500000000000000000000000001527064705700222675ustar00rootroot00000000000000maturin-1.16.0/test-crates/with-data/with_data.data/data/000077500000000000000000000000001527064705700232005ustar00rootroot00000000000000maturin-1.16.0/test-crates/with-data/with_data.data/data/data_subdir/000077500000000000000000000000001527064705700254615ustar00rootroot00000000000000maturin-1.16.0/test-crates/with-data/with_data.data/data/data_subdir/hello.txt000066400000000000000000000000111527064705700273150ustar00rootroot00000000000000Hi! 😊 maturin-1.16.0/test-crates/with-data/with_data.data/headers/000077500000000000000000000000001527064705700237025ustar00rootroot00000000000000maturin-1.16.0/test-crates/with-data/with_data.data/headers/empty.h000066400000000000000000000000001527064705700251770ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace-inheritance/000077500000000000000000000000001527064705700220165ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace-inheritance/Cargo.lock000066400000000000000000000125201527064705700237230ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "generic_lib" version = "0.1.0" [[package]] name = "getrandom" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", "r-efi", "wasip2", ] [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.185" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "r-efi" version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", "rand_core", ] [[package]] name = "rand_core" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom", ] [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "unicode-ident" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "wasip2" version = "1.0.2+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" dependencies = [ "wit-bindgen", ] [[package]] name = "wit-bindgen" version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" [[package]] name = "workspace-inheritance" version = "0.1.0" dependencies = [ "cfg-if", "generic_lib", "libc", "pyo3", "rand", ] maturin-1.16.0/test-crates/workspace-inheritance/Cargo.toml000066400000000000000000000003721527064705700237500ustar00rootroot00000000000000[workspace] resolver = "2" members = [ "generic_lib", "python" ] [workspace.package] version = "0.1.0" [workspace.dependencies] cfg-if = "1.0.0" libc = { version = "0.2", features = ["std"] } rand = "0.9" generic_lib = { path = "generic_lib" } maturin-1.16.0/test-crates/workspace-inheritance/generic_lib/000077500000000000000000000000001527064705700242605ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace-inheritance/generic_lib/Cargo.toml000066400000000000000000000002641527064705700262120ustar00rootroot00000000000000[package] name = "generic_lib" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] maturin-1.16.0/test-crates/workspace-inheritance/generic_lib/src/000077500000000000000000000000001527064705700250475ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace-inheritance/generic_lib/src/lib.rs000066400000000000000000000000531527064705700261610ustar00rootroot00000000000000pub fn foo() -> &'static str { "foo" } maturin-1.16.0/test-crates/workspace-inheritance/python/000077500000000000000000000000001527064705700233375ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace-inheritance/python/Cargo.toml000066400000000000000000000011401527064705700252630ustar00rootroot00000000000000[package] name = "workspace-inheritance" version.workspace = true edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] name = "workspace_inheritance" crate-type = ["cdylib"] [dependencies] pyo3 = { version = "0.29.0" } generic_lib.workspace = true [dependencies.libc] workspace = true optional = true features = ["extra_traits"] [build-dependencies] cfg-if.workspace = true [dev-dependencies] cfg-if.workspace = true [dependencies.cfg-if] workspace = true optional = true [dependencies.rand] workspace = true features = ["small_rng"] maturin-1.16.0/test-crates/workspace-inheritance/python/pyproject.toml000066400000000000000000000001141527064705700262470ustar00rootroot00000000000000[build-system] requires = ["maturin>=0.15,<0.16"] build-backend = "maturin" maturin-1.16.0/test-crates/workspace-inheritance/python/src/000077500000000000000000000000001527064705700241265ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace-inheritance/python/src/lib.rs000066400000000000000000000005571527064705700252510ustar00rootroot00000000000000use pyo3::prelude::*; /// Formats the sum of two numbers as string. #[pyfunction] fn sum_as_string(a: usize, b: usize) -> PyResult { Ok((a + b).to_string()) } /// A Python module implemented in Rust. #[pymodule] fn workspace_with_path_dep(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_function(wrap_pyfunction!(sum_as_string, m)?)?; Ok(()) } maturin-1.16.0/test-crates/workspace-inverted-order/000077500000000000000000000000001527064705700224565ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace-inverted-order/Cargo.lock000066400000000000000000000065771527064705700244020ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "path_dep_with_root" version = "0.1.0" dependencies = [ "pyo3", "top_level", ] [[package]] name = "portable-atomic" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" [[package]] name = "proc-macro2" version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "quote" version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "top_level" version = "0.1.0" [[package]] name = "unicode-ident" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" maturin-1.16.0/test-crates/workspace-inverted-order/Cargo.toml000066400000000000000000000004311527064705700244040ustar00rootroot00000000000000[workspace] members = [ ".", "path-dep-with-root", ] [workspace.package] authors = [] version = "0.10.2-dev" publish = false repository = "https://github.com/mitmproxy/mitmproxy-rs" [package] name = "top_level" version = "0.1.0" description = "root dep" edition = "2021" maturin-1.16.0/test-crates/workspace-inverted-order/README.md000066400000000000000000000001671527064705700237410ustar00rootroot00000000000000# Root readme In this workspace, the build root is in a subdirectory, while the workspace root also contains a crate. maturin-1.16.0/test-crates/workspace-inverted-order/check_installed/000077500000000000000000000000001527064705700255725ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace-inverted-order/check_installed/check_installed.py000077500000000000000000000001621527064705700312620ustar00rootroot00000000000000#!/usr/bin/env python3 import path_dep_with_root assert path_dep_with_root.add_number(2) == 44 print("SUCCESS") maturin-1.16.0/test-crates/workspace-inverted-order/path-dep-with-root/000077500000000000000000000000001527064705700261125ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace-inverted-order/path-dep-with-root/Cargo.toml000066400000000000000000000004341527064705700300430ustar00rootroot00000000000000[package] name = "path_dep_with_root" version = "0.1.0" description = "path dep" edition = "2021" [lib] name = "path_dep_with_root" crate-type = ["lib", "cdylib"] [dependencies] top_level = { path = "../" } pyo3 = { version = "0.29.0", features = [ "abi3", "abi3-py38", ] } maturin-1.16.0/test-crates/workspace-inverted-order/path-dep-with-root/README.md000066400000000000000000000000161527064705700273660ustar00rootroot00000000000000# Path readme maturin-1.16.0/test-crates/workspace-inverted-order/path-dep-with-root/pyproject.toml000066400000000000000000000002251527064705700310250ustar00rootroot00000000000000[build-system] requires = ["maturin>=1,<2"] build-backend = "maturin" [project] name = "mitmproxy_path" version = "0.1.0" requires-python = ">=3.8" maturin-1.16.0/test-crates/workspace-inverted-order/path-dep-with-root/src/000077500000000000000000000000001527064705700267015ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace-inverted-order/path-dep-with-root/src/lib.rs000066400000000000000000000003021527064705700300100ustar00rootroot00000000000000use pyo3::prelude::*; #[pymodule] mod path_dep_with_root { use pyo3::pyfunction; use top_level::NUMBER; #[pyfunction] fn add_number(x: u32) -> u32 { x + NUMBER } } maturin-1.16.0/test-crates/workspace-inverted-order/pyproject.toml000066400000000000000000000000271527064705700253710ustar00rootroot00000000000000[tool.dummy] value = 1 maturin-1.16.0/test-crates/workspace-inverted-order/src/000077500000000000000000000000001527064705700232455ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace-inverted-order/src/lib.rs000077500000000000000000000000341527064705700243610ustar00rootroot00000000000000pub const NUMBER: u32 = 42; maturin-1.16.0/test-crates/workspace/000077500000000000000000000000001527064705700175275ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace/Cargo.lock000066400000000000000000000002051527064705700214310ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] name = "py" version = "0.1.0" maturin-1.16.0/test-crates/workspace/Cargo.toml000066400000000000000000000000431527064705700214540ustar00rootroot00000000000000[workspace] members = [ "py" ] maturin-1.16.0/test-crates/workspace/Readme.md000066400000000000000000000003751527064705700212530ustar00rootroot00000000000000This tests that we ignore non-existent Cargo.lock file listed by `cargo package --list`, which seems to only occur with workspaces. See https://github.com/rust-lang/cargo/issues/7938#issuecomment-593280660 and https://github.com/PyO3/maturin/issues/449 maturin-1.16.0/test-crates/workspace/py/000077500000000000000000000000001527064705700201575ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace/py/Cargo.toml000066400000000000000000000001651527064705700221110ustar00rootroot00000000000000[package] name = "py" version = "0.1.0" authors = ["konstin "] edition = "2021" [dependencies] maturin-1.16.0/test-crates/workspace/py/pyproject.toml000066400000000000000000000001141527064705700230670ustar00rootroot00000000000000[build-system] requires = ["maturin>=0.15,<0.16"] build-backend = "maturin" maturin-1.16.0/test-crates/workspace/py/src/000077500000000000000000000000001527064705700207465ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace/py/src/main.rs000066400000000000000000000000551527064705700222400ustar00rootroot00000000000000fn main() { println!("Hello, world!"); } maturin-1.16.0/test-crates/workspace_with_path_dep/000077500000000000000000000000001527064705700224265ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace_with_path_dep/Cargo.lock000066400000000000000000000070431527064705700243370ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "dont_include_in_sdist" version = "0.1.0" [[package]] name = "generic_lib" version = "0.1.0" dependencies = [ "transitive_lib", ] [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "libc" version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" [[package]] name = "proc-macro2" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c" dependencies = [ "libc", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-build-config" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362" dependencies = [ "heck", "proc-macro2", "quote", "syn", ] [[package]] name = "quote" version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" [[package]] name = "transitive_lib" version = "0.1.0" [[package]] name = "unicode-ident" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "workspace_with_path_dep" version = "0.1.0" dependencies = [ "generic_lib", "pyo3", ] maturin-1.16.0/test-crates/workspace_with_path_dep/Cargo.toml000066400000000000000000000001641527064705700243570ustar00rootroot00000000000000[workspace] resolver = "2" members = [ "generic_lib", "transitive_lib", "dont_include_in_sdist", "python" ] maturin-1.16.0/test-crates/workspace_with_path_dep/dont_include_in_sdist/000077500000000000000000000000001527064705700267715ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace_with_path_dep/dont_include_in_sdist/Cargo.toml000066400000000000000000000002761527064705700307260ustar00rootroot00000000000000[package] name = "dont_include_in_sdist" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] maturin-1.16.0/test-crates/workspace_with_path_dep/dont_include_in_sdist/src/000077500000000000000000000000001527064705700275605ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace_with_path_dep/dont_include_in_sdist/src/main.rs000066400000000000000000000000551527064705700310520ustar00rootroot00000000000000fn main() { println!("Hello, world!"); } maturin-1.16.0/test-crates/workspace_with_path_dep/generic_lib/000077500000000000000000000000001527064705700246705ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace_with_path_dep/generic_lib/Cargo.toml000066400000000000000000000003441527064705700266210ustar00rootroot00000000000000[package] name = "generic_lib" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] transitive_lib = { path = "../transitive_lib" } maturin-1.16.0/test-crates/workspace_with_path_dep/generic_lib/src/000077500000000000000000000000001527064705700254575ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace_with_path_dep/generic_lib/src/lib.rs000066400000000000000000000000531527064705700265710ustar00rootroot00000000000000pub fn foo() -> &'static str { "foo" } maturin-1.16.0/test-crates/workspace_with_path_dep/python/000077500000000000000000000000001527064705700237475ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace_with_path_dep/python/Cargo.toml000066400000000000000000000004461527064705700257030ustar00rootroot00000000000000[package] name = "workspace_with_path_dep" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] crate-type = ["cdylib"] [dependencies] pyo3 = { version = "0.29.0" } generic_lib = { path = "../generic_lib" } maturin-1.16.0/test-crates/workspace_with_path_dep/python/pyproject.toml000066400000000000000000000001121527064705700266550ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" maturin-1.16.0/test-crates/workspace_with_path_dep/python/src/000077500000000000000000000000001527064705700245365ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace_with_path_dep/python/src/lib.rs000066400000000000000000000005571527064705700256610ustar00rootroot00000000000000use pyo3::prelude::*; /// Formats the sum of two numbers as string. #[pyfunction] fn sum_as_string(a: usize, b: usize) -> PyResult { Ok((a + b).to_string()) } /// A Python module implemented in Rust. #[pymodule] fn workspace_with_path_dep(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_function(wrap_pyfunction!(sum_as_string, m)?)?; Ok(()) } maturin-1.16.0/test-crates/workspace_with_path_dep/transitive_lib/000077500000000000000000000000001527064705700254445ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace_with_path_dep/transitive_lib/Cargo.toml000066400000000000000000000002671527064705700274010ustar00rootroot00000000000000[package] name = "transitive_lib" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] maturin-1.16.0/test-crates/workspace_with_path_dep/transitive_lib/src/000077500000000000000000000000001527064705700262335ustar00rootroot00000000000000maturin-1.16.0/test-crates/workspace_with_path_dep/transitive_lib/src/lib.rs000066400000000000000000000000531527064705700273450ustar00rootroot00000000000000pub fn bar() -> &'static str { "bar" } maturin-1.16.0/test-crates/wrong-python-source/000077500000000000000000000000001527064705700215025ustar00rootroot00000000000000maturin-1.16.0/test-crates/wrong-python-source/Cargo.lock000066400000000000000000000002431527064705700234060ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "wrong-python-source" version = "0.1.0" maturin-1.16.0/test-crates/wrong-python-source/Cargo.toml000066400000000000000000000001651527064705700234340ustar00rootroot00000000000000[package] name = "wrong-python-source" version = "0.1.0" edition = "2021" [[bin]] name = "run_this" [dependencies] maturin-1.16.0/test-crates/wrong-python-source/pyproject.toml000066400000000000000000000002041527064705700244120ustar00rootroot00000000000000[tool.maturin] bindings = "bin" python-source = "python" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" maturin-1.16.0/test-crates/wrong-python-source/python/000077500000000000000000000000001527064705700230235ustar00rootroot00000000000000maturin-1.16.0/test-crates/wrong-python-source/python/run_this/000077500000000000000000000000001527064705700246565ustar00rootroot00000000000000maturin-1.16.0/test-crates/wrong-python-source/python/run_this/__init__.py000066400000000000000000000000001527064705700267550ustar00rootroot00000000000000maturin-1.16.0/test-crates/wrong-python-source/src/000077500000000000000000000000001527064705700222715ustar00rootroot00000000000000maturin-1.16.0/test-crates/wrong-python-source/src/bin/000077500000000000000000000000001527064705700230415ustar00rootroot00000000000000maturin-1.16.0/test-crates/wrong-python-source/src/bin/run_this.rs000066400000000000000000000000151527064705700252360ustar00rootroot00000000000000fn main() {} maturin-1.16.0/test-crates/wrong-python-source/src/lib.rs000066400000000000000000000000001527064705700233730ustar00rootroot00000000000000maturin-1.16.0/test-data/000077500000000000000000000000001527064705700151615ustar00rootroot00000000000000maturin-1.16.0/test-data/Readme.md000066400000000000000000000001101527064705700166700ustar00rootroot00000000000000 * `py.exe`: Mock for the windows python launcher we can insert in path maturin-1.16.0/test-data/py.exe000077500000000000000000004250001527064705700163200ustar00rootroot00000000000000MZ�ÿÿ¸@𺴠Í!¸LÍ!This program cannot be run in DOS mode. $Õ¯Œ‘|Áß‘|Áß‘|ÁߘRß�|ÁßÃÀÞ“|ÁßÃÄÞ„|ÁßÃÅÞ˜|ÁßÃÂÞ“|ÁßþÀÞ˜|Áß‘|Àß|Áß‘|Áߘ|ÁßÃÞ�|ÁßRich‘|ÁßPEd†ËùF\ð" ˆ PŒ@p`�ü´@¬`LãT`ä(`ã p.text؆ˆ `.rdata4… †Œ@@.datah0@À.pdata¬@@@.relocL`&@BHƒì(ÿ1ÀHƒÄ(ÃÌÌÌÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌHƒìXH�“H‰D$(HÇD$0HÇD$8H�÷’H‰D$HHÇD$PH�L$(èïU�HƒÄXÃÌÌÌÌÌÌÌÌÌHƒì(I‰ÑLcÁH�ŸÿÿÿH‰D$ H�c’H�L$ è‰Ô�HƒÄ(ÃÌÌÌé ÂÌÌÌÌÌÌÌÌÌÌÌékÂÌÌÌÌÌÌÌÌÌÌÌé›ÂÌÌÌÌÌÌÌÌÌÌÌAVVWSHƒì(L‰ÆI‰ÖH‰ÏH‹QH‹YH‰ÐH)ØL9Às(HórgH�H9ÃHBØH…ÒtH‹A¸I‰Ùè¥ÿÿÿëH‹ë ºH‰ÙèqÿÿÿH‰ÁH…Àt1H‰H‰_H‹_H�3H‰GHÙL‰òI‰ðHƒÄ([_^A^él„èz ºH‰Ùè»% ÌÌÌÌÌÌÌÌÌAVVWSHƒì(H‰ÎH‹AH‹YH‰ÁH)ÙH9ÑsKHÓrmH�H9ÓHBÚ1ÿH‰ÙHÙ“ÁI‰ÞIÞrO@ˆÏHÿH…Àt'H‹A¸M‰ñèâþÿÿH…Àt!H‰H‰^HƒÄ([_^A^ÃL‰ñH‰úè¡þÿÿH…ÀußL‰ñH‰úè!% èÊ ÌÌÌÌÌÌÌÌUVWHƒì0H�l$0HÇEøþÿÿÿH‰ÎH‹9H‹GH…ÀtÆH‹WH…ÒtH‹OA¸èRþÿÿH‰}ðH�O0èu H‹EðH‹H@ºA¸è-þÿÿH‹ðH�huH‹ºPA¸HƒÄ0_^]éþÿÿ�HƒÄ0_^]Ãf.„f�H‰T$UVWHƒì H�j0H‹MðHƒÁ@è#�HƒÄ _^]ÃÌÌÌÌÌÌÌÌÌÌVWHƒì(H‰ÎH‹9H‹Oè ‚H‹Oº(A¸è—ýÿÿHƒÇ H‰ùè H‹ðH�huH‹ºPA¸HƒÄ(_^édýÿÿ�HƒÄ(_^ÃÌÌÌÌÌÌÌÌÌÌÌÌH¸6º&¹ß+tBÃÌÌÌÌÌH¸kè¸8ˆÝ¡qÃÌÌÌÌÌH¸d—°pÙ”ÃÌÌÌÌÌH¸Ë6ЃÆhÃÌÌÌÌÌVWHƒì(H‰ÖH‹9H‰Ñè \„ÀtH‰ùH‰òHƒÄ(_^ékH‰ñèÿ[H‰ùH‰ò„Àt HƒÄ(_^éšk�HƒÄ(_^énÌÌÌÌÌÌÌÌÌÌÌÌÌÌVWHƒì(H‰ÖH‹9H‰Ñè¬[„ÀtH‰ùH‰òHƒÄ(_^é—lH‰ñèŸ[H‰ùH‰ò„Àt HƒÄ(_^ém�HƒÄ(_^é®pÌÌÌÌÌÌÌÌÌÌÌÌÌÌI‰ÐH‹H‹H‹PéŽ\ÌÌÌÌÌÌÌÌÌÌÌÌÌÌAWAVVWSHƒì@H‹H‹0H‹xH�L$0èÑ[H…ÿt9L�5Å�L�|$0H�\$(f.„�H‰t$(HƒÆL‰ùH‰ÚM‰ðè™GHƒÇÿuãH�L$0è©G�HƒÄ@[_^A^A_ÃÌÌÌÌÌÌÌÌÌÌÌÌH‹ éH&ÌÌÌÌÌÌÌÌI‰ÐH‹H‹QH‰Áéî_ÌÌÌÌÌÌÌÌÌÌÌÌÌÌUVHƒìXH�l$PHÇEþÿÿÿH‰ÎÇEüƒúwˆUüA¹郉Ð�úÿwÁè$ ÀˆEü€â?€Ê€ˆUýA¹ë^�úÿÿw'Áè $ àˆEü‰ÐÁè$? €ˆEý€â?€Ê€ˆUþA¹ë/Áè ðˆEü‰ÐÁè $? €ˆEý‰ÐÁè$? €ˆEþ€â?€Ê€ˆUÿA¹H‹H�MÐL�Eüè­U€}Ðu1Àë,EÐ)Eà€~H�FH‰Eðt H‹Mðèä(EàH‹Eð°HƒÄX^]ÃH‰T$UVHƒì(H�jP(EàH‹EðHƒÄ(^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌUVHƒìXH�l$PHÇEþÿÿÿH‰ÎÇEüƒúwˆUüA¹郉Ð�úÿwÁè$ ÀˆEü€â?€Ê€ˆUýA¹ë^�úÿÿw'Áè $ àˆEü‰ÐÁè$? €ˆEý€â?€Ê€ˆUþA¹ë/Áè ðˆEü‰ÐÁè $? €ˆEý‰ÐÁè$? €ˆEþ€â?€Ê€ˆUÿA¹H‹H�MÐL�Eüè]W€}Ðu1Àë,EÐ)Eà€~H�FH‰Eðt H‹Mðè´(EàH‹Eð°HƒÄX^]ÃH‰T$UVHƒì(H�jP(EàH‹EðHƒÄ(^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌHƒìhH‰L$(JR )T$P)L$@)D$0H�&�H�L$(L�D$0èI�HƒÄhÃÌHƒìhH‰L$(JR )T$P)L$@)D$0H�F�H�L$(L�D$0èÇH�HƒÄhÃÌHƒì(H‹H‰D$ H�L$ èzv�HƒÄ(ÃÌÌÌÌH‰ÈH‹ H…ÉtH‹PH…Òt A¸éaøÿÿÃÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌH‹AHƒÃÌÌÌÌÌÌÌH‹QH‹AH)ÐDH…ÀtL�BL‰AHƒÀðHƒzL‰ÂuåH‹QH…ÒtH‹ HÁâA¸éú÷ÿÿÃÌÌÌÌÌÌÌÌÌ€yul‹eH‹%XH‹ÂHƒ¸¨u&‹÷eH‹%XH‹ÂHƒ¸°t2H‹Æ@ë)‹ÑeH‹%XH‹ÂHÇ€¨HÇ€°H‹H‹éÛÌÌÌH‹QH…ÒtH‹ A¸éY÷ÿÿÃÌÌÌÌÌÌÌÌH‹ ºA¸é=÷ÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌUHƒì0H�l$0HÇEøþÿÿÿH‰ÈH‹ H‰EðH‹@ÿH‹MðH‹AH‹PH…ÒtH‹ L‹@HƒÄ0]éìöÿÿ�HƒÄ0]ÃDH‰T$UHƒì H�j0H‹EðH‹H‹Pè’�HƒÄ ]ÃÌÌÌÌÌÌÌÌÌÌÌH‹ ºA¸é�öÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌéÛÌÌÌÌÌÌÌÌÌÌÌH‹H…ÀtðH�(uéÙ÷ÿÿÃÌÌÌÌÌÌÌÌUHƒì0H�l$0HÇEøþÿÿÿƒ9t4H‰ÈH‹IH‰EðH‹@ÿH‹MðH‹AH‹PH…ÒtH‹IL‹@HƒÄ0]éöÿÿ�HƒÄ0]Ãf.„@H‰T$UHƒì H�j0H‹EðH‹HH‹Pè±�HƒÄ ]ÃÌÌÌÌÌÌÌÌÌÌH‹H…ÀtðH�(uéù÷ÿÿÃÌÌÌÌÌÌÌÌUVHƒì8H�l$0HÇEþÿÿÿH‰ÎH‹AH;AtBH�HH‰NH‹H…Ét2H‹@H‰MøH‰EðÿH‹EðH‹PH…Òt L‹@H‹MøèXõÿÿH‹FH;Fu¾H‹VH…ÒtH‹HÁâA¸HƒÄ8^]é-õÿÿ�HƒÄ8^]ÃDH‰T$UVHƒì(H�j0H‹MøH‹UðèÔ�HƒÄ(^]ÃÌÌÌÌÌÌÌÌÌÌÌÌ€yuÃHƒÁé0Hƒ9t HƒÁé!ÃUHƒì0H�l$0HÇEøþÿÿÿH‰ÈH‹ H…Ét,H‰EðH‹@ÿH‹MðH‹AH‹PH…ÒtH‹ L‹@HƒÄ0]é‡ôÿÿ�HƒÄ0]ÃH‰T$UHƒì H�j0H‹EðH‹H‹Pè2�HƒÄ ]ÃÌÌÌÌÌÌÌÌÌÌÌH‹ éè×ÌÌÌÌÌÌÌÌH‹ðH�(uénöÿÿÃÌÌÌÌÌÌÌÌÌÌÌÌÌ€9uÃéeÌÌÌÌÌH‹QH…ÒtHÒH‹ A¸éöóÿÿÃÌÌÌÌÌH‹ éixÌÌÌÌÌÌÌÌH‹H…ÀtÆH‹QH…ÒtH‹ A¸é¾óÿÿÃÌÌÌÌÌÌÌÌÌÌÌÌÌUHƒì@H�l$@HÇEøþÿÿÿ€9wHƒÄ@]ÃH‰MèH‹AH‹H‰EðH‹@ÿH‹MðH‹AH‹PH…Òt H‹ L‹@èaóÿÿH‹EèH‹HºA¸HƒÄ@]éDóÿÿ@H‰T$UHƒì H�j@H‹EðH‹H‹PèòH‹EèH‹HèÅ�HƒÄ ]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌH‰ÈH‹IH…ÉtH‹PH…Òt A¸éàòÿÿÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌUVWHƒì0H�l$0HÇEøþÿÿÿH‰ÏH‹1H‹‡HƒøtZHƒøt1H‰}ðH� 7›ºèžÊ1ÉH…À”ÁHƒÁH‡ SH…ÀH‹}ðu#H‹6H…ötH‰ñè×vº(A¸H‰ñèOòÿÿH‹ºA¸HƒÄ0_^]é5òÿÿDH‰T$UVWHƒì H�j0H‹MðèÇúÿÿ�HƒÄ _^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ€yul‹$eH‹%XH‹ÂHƒ¸¨u&‹eH‹%XH‹ÂHƒ¸°t2H‹Æ@8ë)‹áeH‹%XH‹ÂHÇ€¨HÇ€°H‹H‹é vÌÌÌUVHƒìHH�l$@HÇEþÿÿÿI‰È€ythAŠ@„Àu`H�MàL‰EðL‰Âèœ5ŠEà<w<uAH‹EèH‹H‰EøH‹@ÿH‹uøH‹FH‹PH…Òt H‹L‹@èñÿÿºA¸H‰ñèñÿÿL‹EðI‹PH…ÒtI‹A¸HƒÄH^]éßðÿÿ�HƒÄH^]ÀH‰T$UVHƒì(H�j@H‹MðèHùÿÿ�HƒÄ(^]ÃH‰T$UVHƒì(H�j@H‹uøH‹H‹VèaH‰ñè9�HƒÄ(^]ÃÌH‹ðH�(uéÞñÿÿÃÌÌÌÌÌÌÌÌÌÌÌÌÌé{tÌÌÌÌÌÌÌÌÌÌÌH‹QH…ÒtH‹IA¸é8ðÿÿÃÌÌÌÌÌÌÌUHƒì0H�l$0HÇEøþÿÿÿH‰ÈH‹ H‰EðÿPH‹EðH‹H0HƒÄ0]é€tf.„DH‰T$UHƒì H�j0H‹MðHƒÁ0èåûÿÿ�HƒÄ ]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌHƒì(H‹H‹AL‹H‹RL‹H‹AL‹L‰Ñèì- ÌÌÌÌÌÌÌÌÌÌUAWAVAUATVWSHƒìhH�l$`HÇEþÿÿÿI‰ÏL‹"L‹r·r·Bf‰Eü‹B‰Eøf…ö„ E1íL‰ðL)àH�HHÁéHƒÁHƒÀH»@HCÙH�<ºH‰ùèïÿÿH…À„?f‰0H‰EàH‰]èHÇEðL‰eÈL‰uÐfD‰mØ‹Eø‰EÚ·Eüf‰EÞH�MàH�UÈèâH‹EðI‰GEàAL‰øHƒÄh[_^A\A]A^A_]ÃM9ôtI�L$AŠ$¶ò@„öxI‰ÌéBÿÿÿIÇWÀAGë½L9ñtA¶D$IƒÄƒà?L‰ãë1ÀI‰ÌL‰ó‰ñƒá@€þàrL9ót¶;HƒÃƒç?I‰Üë Áá Èë91ÿL‰óÁà ø€úðrL9ót¶HƒÃƒâ?I‰Üë Áá Èë1ÒƒáÁáÁà È Ð‰Æ=ÿÿ†¦þÿÿ�Æÿÿ‰ðÁè Ø�æÿ�ÎÜA‰õ‰ÆéƒþÿÿºH‰ùèA f.„DH‰T$UAWAVAUATVWSHƒì(H�j`H�Màè~ùÿÿ�HƒÄ([_^A\A]A^A_]ÃÌÌÌÌÌÌÌÌÌÌÌÌUAWAVAUATVWSHƒìXH�l$PHÇEþÿÿÿH‹:H‹BD·rfE…ö„_H‰MøE1íH‰ÆHƒÀI‰ÿH)øHÁèH�<HƒÇºH‰ùH‰ÃèýìÿÿH…À„8HƒÃfD‰0H‰EàH‰]èHÇEðH�NH‰MØA¾M‰øI‰ÙfE…í…(ëf.„f�I‰Ðé„L9Æ„¢I�PAŠD¶ëE„íy×H9òtA¶HIƒÀƒá?L‰Çë1ÉI‰ÐH‰÷D‰êƒâA€ýàrH9÷tD¶HƒÇAƒâ?I‰øë Áâë(E1ÒH‰÷ÁáD Ñ€ûðrH9÷t"¶HƒÇƒã?I‰øëÁâ ÑA‰ÍA�ýÿÿvvë'1ÛƒâÁâÁá Ñ ÙA‰Í�ù„÷A�ýÿÿvMA�ÅÿÿD‰éÁé �ÉØA�åÿA�ÍÜE‰ìA‰ÍM9Ît)€fF‰,pIƒÆL‰uðE‰åfE…í„öþÿÿE1äM9ÎuÞI‰÷H‹uØL)ÆHÁîHƒÆL΂£K� H9ÖHBò1ÿH‰ñHñ“ÁH‰óHó‚�L‰EÐ@ˆÏHÿM…Ét"A¸H‰ÁI‰ÙèQëÿÿH…Àu é^€H‰ÙH‰úèëÿÿH…À„CH‰EàH‰uèI‰ñL‹EÐL‰þéEÿÿÿH‹EðH‹MøH‰AEàH‰ÈHƒÄX[_^A\A]A^A_]ÃH9Ç„âH�wDŠE¶ñE„öH‰MøxH‰÷é€ýÿÿH9Æt¶WHƒÇƒâ?I‰øë1ÒH‰÷I‰ÀD‰öƒæA€þàrI9ÀtA¶IƒÀƒã?L‰Çë Áæë(1ÛI‰ÀÁâ ÚA€ùðrI9ÀtTA¶IƒÀƒã?L‰ÇëFÁæ òA‰ÖA�þÿÿ†ýÿÿA�ÆÿÿD‰ñÁé �ÉØA�æÿA�ÎÜE‰õH‰ÆA‰ÎéÚüÿÿ1ÛƒæÁæÁâ ò ÚA‰Ö�úuªHÇWÀAéîþÿÿè  H‰ÙH‰úèN ºH‰ùè? f.„H‰T$UAWAVAUATVWSHƒì(H�jPH�Màè~õÿÿ�HƒÄ([_^A\A]A^A_]ÃÌÌÌÌÌÌÌÌÌÌÌÌUAWAVAUATVWSHƒìhH�l$`HÇEþÿÿÿH‰ÈH‹2H‹ZD·b‹zŠJA‰ýAÁí€ùt+€ùuBf…ÿ„aH‰EðE‰çD‰}üD‰è±‰Mø1ÿE‰ìE1íë8fE…䄱‰MøH‰EðÇEüëfE…ä„.H‰EðÇEüÇEøH‰]àH‰ØI‰öH)ðH�XHÁëHƒÀH¸ÿÿÿÿÿÿÿ?HBØA‰ÿ·ÿH�;H�4HƒÆºH‰ñèyèÿÿH…À„ L�;IƒÂfD‰ H‰EÈL‰UÐHÇEØA¼L‹]àE‰ùD‹}ø‹uüA€ÿ…)é1�A·E1ÉA‰ð1ÿD‰îM9Ô…ééó@f…ötE1ÀD‰ïE1ÿM9Ô„ØéÄM9ó„èI�^EŠA¶ð@„öxI‰ÞëËL9ÛtA¶VIƒÆƒâ?L‰óë1ÒI‰ÞL‰Û‰ñƒá@€þàrE‰ÏL9ÛtD¶ HƒÃAƒá?I‰Þë Áá ÊëTE1ÉL‰ÛÁâD ÊA€øðrL9Ût)D¶HƒÃAƒà?I‰ÞëÁá ʉÖE‰ù�þÿÿ†Dÿÿÿë"E1ÀE‰ùƒáÁáÁâ ÊD ‰Ö�þÿÿ† ÿÿÿ�Æÿÿ‰ñÁé �ÉØ�æÿ�ÎÜE1ÿéºfDA·f…ö…ÄM9ó„óI�NAжó@„öxI‰Îé¤L9ÙtA¶VIƒÆƒâ?M‰ðë1ÒI‰ÎM‰Ø‰ñƒá@€þàrD‰ÎM9ØtE¶IƒÀAƒá?M‰Æë Áá ÊëBE1ÉM‰ØÁâD Ê€ûðrM9ØtA¶IƒÀƒã?M‰Æë Áá ÊA‰ñë1ÛA‰ñƒáÁáÁâ Ê Ú‰Ö�úÿÿ‡Òf.„�E1ÀD‰ïM9Ô…ñL‰ÙL)ñH�QHÁêHƒÁH¹ÿÿÿÿÿÿÿ?HBÑA·ÙHÓHƒÃ„À‰}ìLÓ‚A‰õK�H9ÓHBÚ1ÿH‰ÙHÙ“ÁH‰ÞHÞ‚ÛD‰EüD‰Mø@ˆÏHÿM…ÒtA¸H‰ÁI‰ñè»åÿÿë H‰ñH‰úèŽåÿÿH…ÀL‹]àD‹MøD‹Eü„œH‰EÈH‰]ÐD‰î‹}ìë<�Æÿÿ‰ñÁé �ÉØ�æÿ�ÎÜA‰ðD‰ï‰ÎM9Ô„ÿÿÿf.„�L‰ÓfB‰4`IƒÄL‰eØI‰ÚD‰ÆA‰ýA€ÿ„ þÿÿA€ÿ…óüÿÿfAƒù„ÈüÿÿH‹MØH‹EðH‰HEÈHƒÄh[_^A\A]A^A_]ÃH9ÞtH�NDŠE¶âE„äH‰Eðx=H‰ÎéAHÇWÀ@ë¾H9Þ„}ûÿÿH�NDŠE¶âE„äH‰EðxH‰Îé±ûÿÿH9Ùt%¶VHƒÆƒâ?I‰ñëH9ÙtD¶VHƒÆƒâ?I‰ñë<1ÒH‰ÎI‰ÙD‰áƒáA€üàrI9ÙtOE¶IƒÁAƒà?L‰ÎëDÁá Êé£1ÒH‰ÎI‰ÙD‰áƒáA€üàrI9ÙtJE¶IƒÁAƒà?L‰Îë?Áá ÊéÃE1ÀI‰ÙÁâD ÂA€úðrI9ÙtGE¶IƒÁAƒà?L‰Îë9Áá Êë@E1ÀI‰ÙÁâD ÂA€úðrI9ÙtlE¶IƒÁAƒà?L‰Îë^Áá ÊëeE1ÀƒáÁáÁâ ÊD ÂA‰Ô�úÿÿw°‰EøÇEüé¢úÿÿ°‰EøA�ÄÿÿD‰àÁè ØA�äÿA�ÌÜëGE1ÀƒáÁáÁâ ÊD ÂA‰Ô�úÿÿ†MúÿÿA�ÄÿÿD‰àÁè ØA�äÿA�ÌÜÇEøE‰çD‰}üA‰Äé%úÿÿè H‰ñH‰úèb  ºH‰ñèS  �H‰T$UAWAVAUATVWSHƒì(H�j`H�MÈèžîÿÿ�HƒÄ([_^A\A]A^A_]ÃÌÌÌÌÌÌÌÌÌÌÌÌUH�ì H�¬$€HÇEþÿÿÿH�éuH‰EøHÇE+H‰MˆUH�EøH‰EØH�¯æÿÿH‰EàH�EH‰EèH�Œ“H‰EðH�¹yH‰E¨HÇE°H�ÆxH‰E¸HÇEÀH�EØH‰EÈHÇEÐH�»yH�M¨è" H‰T$UHƒì H�ª€H�Mèæéÿÿ�HƒÄ ]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌH�ìˆH�štH‰D$(HÇD$0H�D$(H‰D$8H�óåÿÿH‰D$@H�D$ H‰D$HH�­H‰D$PH�ùxH‰D$XHÇD$`H�xH‰D$hHÇD$pH�D$8H‰D$xHÇ„$€H�ñxH�L$XèW  ÌÌÌÌÌH�ìˆH� tH‰D$(HÇD$0H�D$(H‰D$8H�SåÿÿH‰D$@H�D$ H‰D$HH�íH‰D$PH�YxH‰D$XHÇD$`H�dwH‰D$hHÇD$pH�D$8H‰D$xHÇ„$€H�QxH�L$Xè·  ÌÌÌÌÌH�ìˆH�êsH‰D$(HÇD$0+H�D$(H‰D$8H�³äÿÿH‰D$@H‰L$HH�RKH‰D$PH�¾wH‰D$XHÇD$`H�ÉvH‰D$hHÇD$pH�D$8H‰D$xHÇ„$€H�¶wH�L$Xè  ÌÌÌÌÌÌÌÌÌÌH�ìˆH�exH‰D$(HÇD$09H�D$(H‰D$8H�äÿÿH‰D$@H�D$ H‰D$HH�m H‰D$PH�wH‰D$XHÇD$`H�$vH‰D$hHÇD$pH�D$8H‰D$xHÇ„$€H�wH�L$Xèw  ÌÌÌÌÌUH�ì�H�¬$€HÇEþÿÿÿH‰MðH‰UøH�EðH‰EÐH�qãÿÿH‰EØL‰EL‰EàH�ž¶H‰EèH�{vH‰E HÇE¨H�ˆuH‰E°HÇE¸H�EÐH‰EÀHÇEÈH�}vH�M èä  f�H‰T$UHƒì H�ª€H‹MèFîÿÿ�HƒÄ ]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌH‹ é(äÿÿÌÌÌÌÌÌÌÌH‹ éèâÿÿÌÌÌÌÌÌÌÌVWSHƒì0‰×H‹1�ú€sRH‹VH;VuzH‰ÓHƒÃ‚"H�H9ÃHBØH…Ò„éH‹A¸I‰Ùè ÞÿÿH…À„åH‰H‰^H‹Vë5ÇD$,‰ø�ÿs.Áè$ ÀˆD$,@€ç?@€Ï€@ˆ|$-A¸ëyH‹@ˆ<HƒFëx�ÿÿÿw-Áè $ àˆD$,‰øÁè$? €ˆD$-@€ç?@€Ï€@ˆ|$.A¸ë6Áè ðˆD$,‰øÁè $? €ˆD$-‰øÁè$? €ˆD$.@€ç?@€Ï€@ˆ|$/A¸H�T$,H‰ñèbÝÿÿ1ÀHƒÄ0[_^úH‰ÙèÝÿÿH…À…ÿÿÿºH‰Ùè• è>ý ÌÌÌÌÌÌÌÌÌÌÌÌHƒìhH‹H‰D$(JR )T$P)L$@)D$0H�qH�L$(L�D$0èä,�HƒÄhÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌHƒìhH‹H‰D$(JR )T$P)L$@)D$0H�qH�L$(L�D$0è”,�HƒÄhÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌHƒìhH‹H‰D$(JR )T$P)L$@)D$0H�“pH�L$(L�D$0èD,�HƒÄhÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌUVHƒìXH�l$PHÇEþÿÿÿM‰ÁI‰ÐH‹1H‹H�MÐè¸9€}Ðu1Àë,EÐ)Eà€~H�FH‰Eøt H‹Møèèÿÿ(EàH‹Eø°HƒÄX^]Ãf.„�H‰T$UVHƒì(H�jP(EàH‹EøHƒÄ(^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌHƒì(H‹ è„Ûÿÿ1ÀHƒÄ(ÃÌÌÌÌÌÌÌÌÌÌÌÌÌUVHƒìXH�l$PHÇEþÿÿÿM‰ÁI‰ÐH‹1H‹H�MÐè6€}Ðu1Àë,EÐ)Eà€~H�FH‰Eøt H‹MøèOçÿÿ(EàH‹Eø°HƒÄX^]Ãf.„�H‰T$UVHƒì(H�jP(EàH‹EøHƒÄ(^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌUVWHƒì@H�l$@HÇEøþÿÿÿH‰MèH‹1H‰ñèý¼H‹~HÇFH‰ñè¾H‰}ðH‹ðH�(u H‹MðèŸÜÿÿºA¸H‹MðèKÚÿÿºA¸H‹MèHƒÄ@_^]é0ÚÿÿH‰T$UVWHƒì H�j@H‹Mèè×�HƒÄ _^]Ãf.„@H‰T$UVWHƒì H�j@H‹Mðè§�HƒÄ _^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌAVVWUSHƒì0H‰ÖH‰ÏH‹L‹r‹jPH‰Ñè®8‹NP„ÀtƒÉ‰NPHƒ>uHÇFHǃɉNPH‹H‰D$(H�L$(H‰òè�IH‰L‰v‰nPHƒÄ0[]_^A^ÃÌÌÌÌÌÌÌÌÌÌÌ̺A¸é@ÙÿÿºA¸é0ÙÿÿH‰ÐH‹RH…Òt L‹@éÙÿÿÃÌÌÌÌÌÌÌÌÌÌI‰ÐH‹H‹QH‰Áé^=ÌÌÌÌÌÌÌÌÌÌÌÌÌÌAWAVATVWUSHƒì H‰ÎL‹"L‹z·jI¾@f…í…#é,f.„f�I�L$AŠ$¶ê@„íx I‰Ì1ÿéµL9ùtA¶D$IƒÄƒà?L‰çë1ÀI‰ÌL‰ÿ‰éƒá@€ýàrL9ÿt¶/HƒÇƒå?I‰üë Áá Èë91íL‰ÿÁà è€úðrL9ÿt¶HƒÇƒâ?I‰üë Áá Èë1ÒƒáÁáÁà È Ð‰Å=ÿÿvp�Åÿÿ‰èÁè Ø�åÿ�Í܉ï‰Åf.„@H‹^H;^u"L‰øL)àH�PHÁêHƒÂHƒÀIBÖH‰ñè„ØÿÿH‹f‰,XHƒÃH‰^‰ýf…ít1ÿëºf.„M9ç…×þÿÿHƒÄ []_^A\A^A_ÃÌÌÌÌÌÌÌÌUAWAVATVWSH�ì€H�¬$€HÇ…øþÿÿÿI‰ÖÆ…÷I‹xH‹H‹Hƒ{uNE1ÿH�u¨1ÒA¸(H‰ñèO\ÇEøÐÇE¨XH‹ HÇ…ØL�…ØH‰úI‰ñÿS ƒø…µëQA‹pE1ÿL�e¨1ÒA¸(L‰áèý[ÇEøÐÇE¨XH‹ HÇ…ØL‰d$ L��ØH‰úA‰ðÿS ƒøubH‹EàH9ÇrV‹MÄH…ÉtHÈH9ÇsFH�}üH‰ùè´[Hƒøÿ„ÌH��ØH‰úI‰Àè¡L‹�èHƒ½Ø„�L‹½àëE1ÿH��ØH�•÷M‰øèÚ|Š…Ø<w<uJH‹…àH‹H‰…ÐH‹@ÿH‹µÐH‹FH‹PH…Òt H‹L‹@èÕÕÿÿºA¸H‰ñèÂÕÿÿ¶…÷H‰ÂHƒòLòH�Ä€[_^A\A^A_]ÃE1ÿégÿÿÿHÇÁÿÿÿÿ1Òè™ €H‰T$UAWAVATVWSHƒì0H�ª€H‹µÐH‹H‹Vè#üÿÿH‰ñèûûÿÿ�HƒÄ0[_^A\A^A_]ÃÌÌÌÌÌÌÌÌÌÌÌVHƒì0L�¬mH�t$ A¹ H‰ñèA4H‰ñèI�HƒÄ0^ÃÌÌUVWSHƒìXH�l$PHÇEþÿÿÿH‰Ï‹öeH‹ %XH‹ Á°€¹¡…ÿ‹ðõeH‹ %XH‹Á€¸ u-‹ÔõeH‹ %XH‹4ÁH�Ž€H�™è$ŒÆ† ‹§õeH‹ %XH‹ÁHƒ¸€„�‹†õeH‹ %XH‹Áfo€�foˆ€WÒ)��¹fHnÑf�€fH~ÈH…Àt8fH~ÁH…Ét.fpÀNfH~ÀH‰MðH‰EøÿH‹EøH‹PH…ÒH‹Mðt L‹@èÛÓÿÿH‹7H‹_HÇH‰uàH‰]è‹ïôeH‹ %XH‹ÁHƒ¸ˆ…æ‹ÎôeH‹ %XH‹ÁHÇ€ˆÿÿÿÿH�ˆˆH���H‰UÐH‰MØH‹ˆ�H…ÉtrH‰uøH‰]ð‹†ôeH‹%XH‹ÂH‹€˜ÿ‹jôeH‹ %XH‹ÁH‹€˜H‹PH…ÒH‹]ðH‹uøt#‹ ?ôeH‹<%XH‹ ÏH‹‰�L‹@èòÒÿÿ‹ôeH‹ %XH‹ÁH‰°�H‰˜˜Hƒ€ˆ1ÀHƒÄX[_^]Ãèùðÿÿ €H‰T$UVWSHƒì(H�jP‹ÉóeH‹ %XH‹4ÁH‹Ž�H‹–˜èIùÿÿH‹EøH‰†�H‹EðH‰†˜H�MÐè Úÿÿ�HƒÄ([_^]ÃH‰T$UVWSHƒì(H�jPH�MàèfÝÿÿ�HƒÄ([_^]Ãf.„f�H‰T$UVWSHƒì(H�jPH‹MðH‹UøèÒøÿÿ�HƒÄ([_^]ÃÌÌÌÌÌÌÌÌUHƒì0H�l$0HÇEøþÿÿÿÆA!Hƒ9t9H‰ÈH‹IH…Ét-H‰EðH‹@ÿH‹MðH‹AH‹PH…ÒtH‹IL‹@HƒÄ0]é›Ñÿÿ�HƒÄ0]Ã@H‰T$UHƒì H�j0H‹EðH‹HH‹PèAøÿÿ�HƒÄ ]Ãf.„H‰T$UHƒì H�j0  ÌÌÌÌÌÌÌÌÌÌÌÌÌÌUHƒì0H�l$0HÇEøþÿÿÿÆAHƒ9tH‹AH…ÀtðH�(u HƒÁèxÒÿÿ�HƒÄ0]Ã�H‰T$UHƒì H�j0  ÌÌÌÌÌÌÌÌÌÌÌÌÌÌUAWAVATVWSH�ìðH�¬$€HÇEhþÿÿÿ‹éñeH‹ %XH‹Á€¸a…;‹ÉñeH‹ %XH‹Á€¸`u-‹­ñeH‹ %XH‹4ÁH�ŽHH�"ÿÿÿèý‡Æ†`‹€ñeH‹ %XH‹ÁHƒ¸Ht(‹cñeH‹ %XH‹ÁHÇ€HWÀ€P‹;ñeH‹ %XH‹ÁH�ˆPèb�H‰ÁH‰EX1Ò¸ðH±Q(„%H‹uXH‹N0è;²‹õðeH‹ %XH‹ÁHƒ¸¨u‹ØðeH‹ %XH‹ÁH‹€°ë+‹¼ðeH‹ %XH‹ÁHÇ€¨HÇ€°1ÀH�N0‹�ðeH‹%XH‹ÓH‰‚°ŠV8„Ò…õH…ÀH‰MH•EP¹1ÀðH±N(…½E1ÿL�5“zL�%¯Äf.„DH‹MXH‹EH¶UPH‰EˆU H‹81ÀðH±yHt H9ø…NH‹Y@H‹5¼ïH…öu!ºL‰ñèʦH‰ÖH…ÀIDôH‰ðH‡–ïA¸ÿÿÿÿE1ÉH‰ÙH‰úÿÖH‹M¶A¶U „À…H‰MHˆUPH‹MX¸ðL±y(…eÿÿÿë5Hƒø…H‹EX1ÉH‡H(H‰MH�EH‰EH�´gH‰EHƒù…H‹EH€}Pui‹ NïeH‹%XH‹ ÊHƒ¹¨u#‹ 1ïeH‹%XH‹ ÊHƒ¹°t/Æ@ë)‹ ïeH‹%XH‹ ÊHÇ�¨HÇ�°H‹èS±H‹EXðH�(u H�MXè Ïÿÿ�H�Äð[_^A\A^A_]ÃH� BlL�#lº6èqžë ÆEgèÖêÿÿ HÇEH� !fº^è»ùëãH…À•Âè®êÿÿëÖÆEgH� ‘fL�rfºè žë¸H�·fH‰EHÇE HÇE(H�Œ_H‰E8HÇE@H�EH‰E H�1ÐÿÿH‰E¨H‰éH‰M°H‰E¸H�EH‰EÀH�£H‰EÈH�dH‰EÐHÇEØH�bH‰EàHÇEèH�E H‰EðHÇEøÆEgH�.fH�MÐèÕ™é ÿÿÿH‰T$UAWAVATVWSHƒì H�ª€H�MèÍÕÿÿ�HƒÄ [_^A\A^A_]Ãf.„H‰T$UAWAVATVWSHƒì H�ª€ÆEgH�MèÔÿÿÆEgHƒÄ [_^A\A^A_]ÃfDH‰T$UAWAVATVWSHƒì H�ª€H�MXèMÛÿÿ�HƒÄ [_^A\A^A_]Ãf.„H‰T$UAWAVATVWSHƒì H�ª€€}gtH�MHè—Óÿÿ�HƒÄ [_^A\A^A_]ÃHƒÄ [_^A\A^A_]ÃÌÌÌÌÌÌÌÌUAWAVVWSH�ìˆH�¬$€HÇEþÿÿÿH‹A)E H…Àt]H‰E°(E E¸H�MàH�U°èXðH‹uàL‹EðÆEÿ1ÉH‰òèò÷H…À…‡H‹EðH‰EÀEà)E°ÆEÿH�M°èÌ I‰ÇI‰ÖëE1ÿL‰}°L‰u¸H�=ëH‰ùè*­H‰}àH‹5ÿêHƒþÿ„úH�FH‰êêH� Óêè.®¹ºèoÊÿÿH…À„åH‰ÃHÇÆ@ŠEæˆEÖ·Eäf‰EÔ‹Eà‰Eйºè5ÊÿÿH…À„²H‰ÇHÇŠEÖˆEæ·EÔf‰Eä‹EЉEà¹PºèÿÉÿÿH…À„ƒHÇHÇ@L‰xL‰pH‰p HÇ@(H‰X0Æ@8ŠMæˆH?·Mäf‰H=‹Mà‰H9H‰x@HÇ@HH�Ĉ[_^A^A_]ÃH� ÄcL�¥cº7蓚 ¹ë ¹ë¹Pºèôï Eè)EÐH‰U°H‰u¸(EÐEÀH� ªcL�E°º/èêÿÿ H‰T$UAWAVVWSHƒì(H�ª€€}ÿt H�Màè©Ñÿÿ�HƒÄ([_^A^A_]Ãf.„�H‰T$UAWAVVWSHƒì(H�ª€H�Màè�Ôÿÿ�HƒÄ([_^A^A_]Ã�H‰T$UAWAVVWSHƒì(H�ª€H�M°èÏÔÿÿ�HƒÄ([_^A^A_]ÃÌVHƒì H‹¸H‡B(H…ÀtUHƒøtOHƒø…äH‹1H‹N0èÞª‹˜éeH‹ %XH‹ÁHƒ¸¨u"‹{éeH‹ %XH‹ÁH‹€°ë1HƒÄ ^ËYéeH‹ %XH‹ÁHÇ€¨HÇ€°1À‹ .éeH‹%XH‹ ÊH‰�°ŠN8„ÉugH‹N0èz«H‹v@H‹ÇèH…Àu)H� ´sºèÉŸH…ÀH�Ÿ½HEÂH‰ÁH‡ ™èH‰ñHƒÄ ^HÿàH� /bL�bºè~˜ H…À•ÂHƒÆ0H‰ñèÚäÿÿ ÌÌÌÌÌÌÌÌUAWAVAUATVWSH�ìˆH�¬$€HÇ…þÿÿÿH‰�ØE1íH�M¨1ÒA¸èTLHÇ…àWÀ…èA¿¸H‰…øE1äëMÿI�ÿrtL‰ÿL)çL‰èL)àH9øssLç‚ÎL‰êLêH9×HBú1öH‰øHø“ÀH‰ûHû‚ª@ˆÆHöM…ítJA¸H‹�øI‰Ùè–ÆÿÿH…ÀuDé£f.„f�A¾H�]¨ë:@M‰üM‰þH‹�øë'H‰ÙH‰òè6ÆÿÿH…À„dI‰ýM‰üM‰þH‰…øH‰Ã1Éè°JD‰ùH‰Úè«J‰Æ…Àu èˆJ…À…̉öI9÷uètJƒøz„ÿÿÿI9÷I‰÷†÷þÿÿH‹…øH‰…àL‰¥ðL‰­èI9ö‚óH��¨H‰ÚI‰ðèm£H‹…¸H‰…Ð…¨)…ÀH‹…ÐH‹µØH‰F(…ÀFHÇM…ítMíA¸H‹�øL‰êèPÅÿÿH‰ðH�Ĉ[_^A\A]A^A_]ÃH‹…øH‰…àL‰¥ðL‰­èè“IH‹µØÆF‰F HÇM…íu–ë¬H‹…øH‰…àL‰¥ðL‰­èè å H‰ÙH‰òèNë H‰ñL‰òèÑõëäf.„DH‰T$UAWAVAUATVWSHƒì(H�ª€H��àèxÐÿÿ�HƒÄ([_^A\A]A^A_]ÃÌÌÌÌÌÌUAWAVAUATVWSH�ìÈH�¬$€HÇ…@þÿÿÿH‰�¸H‰•¨L‰…°H�]¨H‰ÙèÙ¶Hƒ}¨„žH‹CH‰…ÐC)…À1ÀH‰…1ÒA¸H‰Ùè$IHÇ…WÀ…A¾¸H‰…0H‹…ÀH‰…E1äëDMöI�þrtL‰óL)ãH‹�H‰ÈL)àH9ØslLã‚ÓH� H9ÓHBÚ1ÿH‰ØHØ“ÀH‰ÞHÞ‚±@ˆÇHÿH…ÉtEA¸H‹�0I‰ñèQÃÿÿH…Àu?骀A¿I‰ÝëCDM‰ôM‰÷L‹­0ë+H‰ñH‰úèöÂÿÿH…À„pH‰�M‰ôM‰÷H‰…0I‰ÅH�]¨1ÉèhGH‹�L‰êE‰ðèbG‰Æ…Àu è9G…À…8‰÷I9þuè%Gƒøz„ñþÿÿI9þI‰þ†èþÿÿH‹…0H‰…L‰¥ H‹…H‰…I9ÿ‚“H��àL‰êI‰øè DŠ¥à·…áf‰…<Š…ãˆ…>‹½äL‹µèL‹½ð1ÛH‹µH…ötHöA¸H‹�0H‰òèüÁÿÿH…Ût5Š…>ˆEª·…<f‰E¨�ÿË…™E„ä…�WÀ)…ë@Dˆ¥·…<f‰…Š…>ˆ…‰½L‰µ L‰½(HÇ…1öëxH‹…0H‰…L‰¥ H‹µH‰µ»E1äèÉE‰ÇH…ö…/ÿÿÿéBÿÿÿDˆ¥·E¨f‰…ŠEªˆ…‰½L‰µ HÇ…¾H‹•ÈH…ÒtHÒA¸H‹�èåÀÿÿH…öuvH‹�(H‹…¸H‰H…H�ÄÈ[_^A\A]A^A_]ÃH‹…0H‰…L‰¥ H‰�è¿à H‰ñH‰úèç C…HÇ……)…ÀH�…¨H‰…àH�>H‰…èH�…ÀH‰…ðH�ûH‰…øH�ýZH‰E¨HÇE°H�²VH‰E¸HÇEÀH�…àH‰EÈHÇEÐH�üZH�M¨è;�éGÿÿÿH‰ùL‰úèÛðé7ÿÿÿfDH‰T$UAWAVAUATVWSHƒì(H�ª€H��èˆËÿÿH��Àè|Ëÿÿ�HƒÄ([_^A\A]A^A_]Ãf.„H‰T$UAWAVAUATVWSHƒì(H�ª€H��Àè¸Èÿÿ�HƒÄ([_^A\A]A^A_]ÃÌÌÌÌÌÌ1ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌH¸câõ‡üÃÌÌÌÌÌUAVVWSHƒì`H�l$`HÇEøþÿÿÿH‰ËH‹yH‹qH9÷u:H‰÷HƒÇ‚dH…ö„ÛH‹ A¸H‰òI‰ùèϾÿÿH…À„ÔH‰H‰{H9þuGH‰÷HƒÇ‚4L�46L9÷LC÷H…ö„¶H‹ A¸H‰òM‰ñè…¾ÿÿH…À„¯H‰L‰sëH‹H�~Æ0H‰{H‹H‰EÐH‹CH‰EØH‹sH‰uàH‹UØH9òu H‹EÐ騂ËH…ötrH‹MÐA¸I‰ñè¾ÿÿH…À„½H‰EÐH‰uØH‰òëuºH‰ùèÛ½ÿÿH…À…,ÿÿÿºH‰ùèUä ºL‰ñè¶½ÿÿH…À…QÿÿÿºL‰ñè0ä H…ÒtH‹MÐA¸èš½ÿÿHÇEÐHÇEظ1ÒHƒÄ`[_^A^]ÃH‰]ÈÆE÷è›ÝëH‰]ÈÆE÷èŒÝëH‰]ÈH� WQèŠè ºH‰ñè»ã f„H‰T$UAVVWSHƒì H�j`€}÷t H‹MÈèžÅÿÿ�HƒÄ [_^A^]Ãf�H‰T$UAVVWSHƒì H�j`H�MÐètÅÿÿÆE÷HƒÄ [_^A^]ÃÌÌÌÌÌAVVWSHƒì8I‰ÖH‰Î¹!º袼ÿÿH…À„àH‰ÃŠ9XˆC XCX¹ºèi¼ÿÿH…À„–H‰ÇH‰HÇ@!HÇ@!¹ºè;¼ÿÿH…ÀtlH‰8H� lWH‰HÆ@ ŠL$7ˆH·L$5f‰H‹L$1‰HÆŠL$0ˆN·L$.f‰N‹L$*‰NH‰FI‹VH…ÒtI‹NA¸èç»ÿÿH‰ðHƒÄ8[_^A^ùºèKâ ¹!ºè:â ÌÌÌÌÌÌÌÌUAWAVAUATVWSHƒìxH�l$pHÇEþÿÿÿH‰×I‰ÎL‹bÆEÐL�mè1ÛL�}¸L9ãré(�HóL9ãƒÆG¶G<„TH‹WH‰ÖH)Þ‚R<u H‰uèHÇEàÆGH…öu»éfDL‹IغõÿÿÿL‰ùI‰ñèÚ§Hƒ}¸u€}Àu ƒ}Ät·€E¸)EàH‹EÈH‰EðH‹EàÆGHƒøuu¶uèHƒþtzHƒþu~H‹Eð¶@<u~@€þ‚?ÿÿÿH‹EðH‹H‰E°H‹@ÿH‹u°H‹FH‹PH…Òt H‹L‹@è~ºÿÿºA¸H‰ñèkºÿÿL9ã‚þþÿÿéH‹uèH…ö…àþÿÿë-¶Eé<t�ë ‹Mì蜫<t‚AE)EÐH…Û…âé¹!ºèºÿÿH…À„@I‰ÇŠºUAˆG ŸUAGƒUA¹ºèƹÿÿH…À„åH‰ÆL‰8HÇ@!HÇ@!¹º蘹ÿÿH…À„·H‰0H� ÅTH‰HÆ@ŠM¾ˆH·M¼f‰H‹M¸‰HŠM¾ˆMþ·M¼f‰Mü‹M¸‰MøÆEЋMø‰MÑ·Müf‰MÕŠMþˆM×H‰EØH…Ût(H‹wH)ÞrdHÇGtH‹HËH‰ÚI‰ðèO>H‰w(EÐAL‰ðHƒÄx[_^A\A]A^A_]ÃH� ILè4äëH‰ÙèŠê ¹ºèYß H� �Kè äëß¹!ºè:ß „H‰T$UAWAVAUATVWSHƒì(H�jpH�MÐènÄÿÿ�HƒÄ([_^A\A]A^A_]Ãf.„f�H‰T$UAWAVAUATVWSHƒì(H�jpH‹u°H‹H‹VèßÿÿH‰ñèïÞÿÿ�HƒÄ([_^A\A]A^A_]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌAVVWSHƒì8L‰ÏM‰ÆH‰ÓH‰ÎH‹JLÉH‹BH9ÁvH�L$ H‰Úè>üÿÿ€|$ ueH‹CH9øvH‰ÙL‰òI‰øèð·ÿÿH‰~HÇëlÆCŠC<t2<tjH�L$ ºõÿÿÿM‰ðI‰ùèo¤H‹D$ Hƒøu$€|$(uƒ|$,u1ÀëD$ FHÇëH‹|$(H‹L$0ÆCH‰H‰~H‰NH‰ðHƒÄ8[_^A^ÃH� “Jè~â ÌÌÌÌÌÌÌÌÌÌÌÌUVWSH�ì˜H�¬$€HÇEþÿÿÿH‰Ö¶HƒøtHƒøuNH‹AH‹H‹@H‰òÿP8é%¶A¹HƒÀÿHƒø‡ºH�GHc‚HÐÿàH�‚S¹é�‹Q‰U H�}ðH‰ùèS›H‰} H�ˆÝÿÿH‰E¨H�E H‰E°H�…(H‰E¸H�‚SH‰EÀHÇEÈH�MH‰EÐHÇEØH�E H‰EàHÇEèH�UÀH‰ñèÿ‰ÃH‹UøH…Ò„jH‹MðA¸è!¶ÿÿéVH�éRéëH�ºR¹éÚH�™RéÎH�{R¹é½H�]R¹ é¬H�>R¹é›H�R¹éŠH�üQ¹ ë|H�ÙQ¹ënH�¶Q¹ë`H�‘Q¹ëRH�wQ¹ ëDH�`Q¹ ë6H�HQ¹ ë(H�%Q¹ëH� Q¹ë H�åP¹H‰E H‰M¨H�E H‰EðH�n¹ÿÿH‰EøH�ëQH‰EÀHÇEÈH�¸NH‰EÐHÇEØH�EðH‰EàHÇEèH�UÀH‰ñ舉ÉØH�Ę[_^]ÄH‰T$UVWSHƒì(H�ª€H�Mðè#½ÿÿ�HƒÄ([_^]Ã�Âýÿÿxþÿÿ‰þÿÿ•þÿÿ¦þÿÿ·þÿÿÈþÿÿÙþÿÿçþÿÿõþÿÿÿÿÿÿÿÿÿÿÿ-ÿÿÿ;ÿÿÿIÿÿÿWÿÿÿÌÌÌÌVHƒì H‰Îºôÿÿÿèþ H‰ðHƒÄ ^ÃÌÌÌÌÌH‰ÈÆÃÌÌÌÌÌÌÌÌÌUAVVWSHƒì`H�l$`HÇEøþÿÿÿH�5JÔH‰ñèZ–H‰uÀH‹GÔHƒø„‰H…À…„¹ºè­³ÿÿH…À„¯H‰0H�BXH‰Áè":A‰Æ¹º耳ÿÿH…À„�H‰Ç·Eôf‰EÌ‹Eð‰EÈŠEöˆEÞ·Eôf‰EÜ‹Eð‰Eع(ºèC³ÿÿH…À„aH‰ÃH‰Áèê7·EÌf‰EÔ‹EȉEЋE؉Eà·EÜf‰EäŠEÞˆEæ‹Eð‰Eè·Eôf‰EìŠEöˆEî¹Pºèê²ÿÿH…À„H‰ÆHÇHÇ@H‰XHÇ@H‰x HÇ@(HÇ@0fÇ@8·EÔf‰F>‹EЉF:ÆF@·Eäf‰FEŠEæˆFG‹Eà‰FAÆFHŠEîˆFO·Eìf‰FM‹Eè‰FIE„öt;ðH�~n¹ºèM²ÿÿH…ÀtSH‰0H‰¶Òë1öë H‹0ðH�~=H� ŒÒèÏ•H‰uÀH…ötH‰ðHƒÄ`[_^A^]ÃH� IOº$èwÞ ¹ë!  ¹ºèkØ ¹(ë¹PºèSØ �H‰T$UAVVWSHƒì H�j`H�MÀèd½ÿÿ�HƒÄ [_^A^]ÄH‰T$UAVVWSHƒì H�j`H�MÀè´»ÿÿ�HƒÄ [_^A^]ÃÌÌÌÌÌÌÌÌUAVVWSH�ì�H�¬$€HÇEþÿÿÿL‰ÇI‰ÎH‹H�sH‹Kèî5‹gÒeH‹ %XH‹ÁHƒ¸¨u‹JÒeH‹ %XH‹ÁH‹€°ë+‹.ÒeH‹ %XH‹ÁHÇ€¨HÇ€°1À‹ ÒeH‹%XH‹ ÊH‰�°H…ÀŠCHH‰uЕEØH�EÐH‰EèÆEðOW )UÀ)M°)E H�¯NH�MèL�E èš„À„Û€}ð…$¹ºèI°ÿÿH…À„´H‰ÇH‹eNH‰GH‹SNH‰¹ºè°ÿÿH…À„sH‰ÃH‰8HÇ@HÇ@¹ºèë¯ÿÿH…À„EH‰H� KH‰HÆ@ŠM¦ˆH·M¤f‰H‹M ‰HŠM¦ˆM·M¤f‰M‹M ‰MAÆŠMAˆN·MfA‰N‹MA‰NI‰Fë^AÆŠEð<w<uOH‹EøH‹H‰EàH‹@ÿH‹MàH‹AH‹PH…Òt H‹ L‹@èZ¯ÿÿH‹MøºA¸èF¯ÿÿë H�EðAH‹EЀ}Øui‹ YÐeH‹%XH‹ ÊHƒ¹¨u#‹ <ÐeH‹%XH‹ ÊHƒ¹°t/Æ@8ë)‹ ÐeH‹%XH‹ ÊHÇ�¨HÇ�°H‹èE3L‰ðH�Ä�[_^A^]ùºèÕ ¹ºè Õ f.„�H‰T$UAVVWSHƒì H�ª€H�MÐèa¼ÿÿ�HƒÄ [_^A^]ÃDH‰T$UAVVWSHƒì H�ª€H‹EàH‹H‹PèúÔÿÿH‹MøèÑÔÿÿ�HƒÄ [_^A^]ÃDH‰T$UAVVWSHƒì H�ª€H�Mèè¹ÿÿ�HƒÄ [_^A^]ÃÌÌÌÌÌUAWAVAUATVWSHƒìxH�l$pHÇEþÿÿÿH‹2Hƒ~…<M‰ÎM‰ÇI‰ÍL�fHÇFÿÿÿÿH�~H‰}¸L‰eÀ€~0t!H�MÐH‰úèÒñÿÿŠEÐ<ub€~(„ÆF0± L‰úM‰ðè€ÜH…À„–H‰ÓHƒúÿ„ØHƒÃL9ó‡ÒH�MÐH‰úM‰øI‰Ùè õÿÿHƒ}ÐuyEØAEëKŠM׈Mö·MÕf‰Mô‹MщMðH‹MØŠUöˆUþ·Uôf‰Uü‹Uð‰UøAˆEŠEþAˆE·EüfA‰E ‹EøA‰E I‰MIÇEé%L‰éH‰úM‰øM‰ñè�ôÿÿéH‹EØH‰EèÆF0H�MÐH‰úèãðÿÿŠEÐ<…—€~(„.ÆF0H‹uèH9Þ…ÅIßI)ÞH�MÐH‰úM‰øM‰ñè5ôÿÿHƒ}Ð…ÇI‰]IÇE€}Ø‚˜H‹EàH‹H‰EèH‹@ÿH‹uèH‹FH‹PH…Òt H‹L‹@è¬ÿÿºA¸H‰ñèó«ÿÿëU<H‹uèrAH‹EØH‹H‰EÈH‹@ÿH‹}ÈH‹GH‹PH…Òt H‹L‹@軫ÿÿºA¸H‰ù訫ÿÿI‰uIÇEIƒ$L‰èHƒÄx[_^A\A]A^A_]ÃH]ØI‰]ëÕè´Éÿÿ è�Ýë'H‰ÙL‰òèpÜëH� §>è’Öë H� ™>è„Ö f�H‰T$UAWAVAUATVWSHƒì(H�jpH‹uèH‹H‹VèçÑÿÿH‰ñè¿Ñÿÿ�HƒÄ([_^A\A]A^A_]Ãf.„H‰T$UAWAVAUATVWSHƒì(H�jpH‹uÈH‹H‹Vè—ÑÿÿH‰ñèoÑÿÿ�HƒÄ([_^A\A]A^A_]Ãf.„H‰T$UAWAVAUATVWSHƒì(H�jpH�M¸è.²ÿÿ�HƒÄ([_^A\A]A^A_]ÃÌÌÌÌÌÌÌÌÌÌÌÌUVH�ìøH�¬$€HÇEpþÿÿÿóoóoIóoQ fUàfMÐfEÀH�ãGH‰E HÇE¨‹AËeH‹ %XH‹Á€¸At ÆE@é ‹ËeH‹ %XH‹Á€¸@u-‹ËeH‹ %XH‹4ÁH�Ž H�Å×ÿÿèPaƆ@‹ÓÊeH‹ %XH‹ÁHƒ¸ „ƒ‹²ÊeH‹ %XH‹Áfo€0foˆ fïÒf�0¹fHnÑf� fH~ÈH…Àt8fH~ÁH…Ét.fpÀNfH~ÀH‰MhH‰EøÿH‹EøH‹PH…ÒH‹Mht L‹@è©ÿÿ‹/ÊeH‹ %XH‹ÁHƒ¸(tTèÓôÿÿH‰ÆH‰E@(EÀfoMÐfoUàfU fM)EH�M0H�U@I‰èè@÷ÿÿðH�.…­H�M@èÙªÿÿ韋¾ÉeH‹ %XH‹ÁHÇ€(ÿÿÿÿH�ˆ(H��0H‰U@H‰MHH‹�0H…Ò„°‹zÉeH‹ %XH‹ÁH‹€8(EÀfoMÐfoUàfU fM)EH�M0I‰èÿP0‹:ÉeH‹ %XH‹ÁHƒ€(óoE0fE@€}@upèÐóÿÿH‰ÆH‰E0foEÀfoMÐfoUàfU fMfEH�M°H�U0I‰èè;öÿÿðH�.u H�M0èØ©ÿÿŠE@<‡�<„•€}°uH�Äø^]ÃfoE@fE°€}°tæ(E°)E0H�E H‰E@H�®«ÿÿH‰EHH�E0H‰EPH� ðÿÿH‰EXH� DH‰EHÇEH�Å=H‰EHÇEH�E@H‰E HÇE(H�¢DH‰éèRt H‹EHH‹H‰EhH‹@ÿH‹uhH‹FH‹PH…Òt H‹L‹@è¦ÿÿºA¸H‰ñ详ÿÿ€}°„&ÿÿÿé;ÿÿÿ‹ÊÇeH‹ %XH‹ÁHÇ€(é•ýÿÿf.„H‰T$UVHƒì(H�ª€H�M@è²ÿÿ�HƒÄ(^]Ãf.„H‰T$UVHƒì(H�ª€H�M@èÕ­ÿÿ�HƒÄ(^]Ãf.„H‰T$UVHƒì(H�ª€€}@t H�M@èϱÿÿ�HƒÄ(^]ÀH‰T$UVHƒì(H�ª€H�M0è5¯ÿÿ�HƒÄ(^]Ãf.„H‰T$UVHƒì(H�ª€H‹MhH‹UøèaÌÿÿ�HƒÄ(^]Ãf„H‰T$UVHƒì(H�ª€H�M0è%±ÿÿ�HƒÄ(^]Ãf.„H‰T$UVHƒì(H�ª€H‹uhH‹H‹VèþËÿÿH‰ñèÖËÿÿ�HƒÄ(^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌUAWAVAUATVWSHƒìXH�l$PHÇEþÿÿÿI‰ÎM…É„L‰ÏL‰ÃI‰ÕL�eàL�}ØfDL‰ùL‰êI‰ØI‰ùèßöÿÿHƒ}Ø…„¶uàHƒþ„œHƒþ… H‹Eè¶@<… @€þrAH‹EèH‹H‰EÐH‹@ÿH‹uÐH‹FH‹PH…Òt H‹L‹@èX¤ÿÿºA¸H‰ñèE¤ÿÿH…ÿ…lÿÿÿëYf.„H‹MàH…Ét^H‰øH)È‚"HËH‰ÇH…ÿ…<ÿÿÿë)¶Eá<„rÿÿÿë‹MäèT•<„`ÿÿÿA$AëAÆL‰ðHƒÄX[_^A\A]A^A_]ùº誣ÿÿH…À„ÓH‰ÆyA@ bA¹ºèz£ÿÿH…À„’H‰ÇH‰0HÇ@HÇ@¹ºèL£ÿÿH…ÀthH‰8H� }>H‰HÆ@ŠM÷ˆH·Mõf‰H‹Mñ‰HŠM÷ˆMþ·Mõf‰Mü‹Mñ‰MøAÆŠMþAˆN·MüfA‰N‹MøA‰NI‰FéÿÿÿH‰úè‘Ô ¹ºè`É ¹ºèOÉ f.„H‰T$UAWAVAUATVWSHƒì(H�jPH�MØè¾­ÿÿ�HƒÄ([_^A\A]A^A_]Ãf.„f�H‰T$UAWAVAUATVWSHƒì(H�jPH‹uÐH‹H‹Vè'ÉÿÿH‰ñèÿÈÿÿ�HƒÄ([_^A\A]A^A_]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌUAWAVATVWSHƒì`H�l$`HÇEøþÿÿÿI‰ÎM…É„L‰ÏL‰ÃL�}ØL�eÐf.„�ºôÿÿÿL‰áI‰ØI‰ùè­ŽHƒ}Ð…‚¶uØHƒþ„šHƒþ…žH‹Eà¶@<…ž@€þrAH‹EàH‹H‰EÈH‹@ÿH‹uÈH‹FH‹PH…Òt H‹L‹@èv¡ÿÿºA¸H‰ñèc¡ÿÿH…ÿ…jÿÿÿëV„H‹MØH…Ét[H‰øH)È‚HËH‰ÇH…ÿ…<ÿÿÿë(¶EÙ<„tÿÿÿë‹MÜèt’<„bÿÿÿAAëAÆL‰ðHƒÄ`[_^A\A^A_]ùºèÍ ÿÿH…À„ÓH‰Æœ>@ …>¹ºè� ÿÿH…À„’H‰ÇH‰0HÇ@HÇ@¹ºèo ÿÿH…ÀthH‰8H�  ;H‰HÆ@ŠMïˆH·Míf‰H‹Mé‰HŠMïˆMö·Míf‰Mô‹Mé‰MðAÆŠMöAˆN·MôfA‰N‹MðA‰NI‰FéÿÿÿH‰úè´Ñ ¹ºèƒÆ ¹ºèrÆ H‰T$UAWAVATVWSHƒì H�j`H�MÐèðªÿÿ�HƒÄ [_^A\A^A_]ÃH‰T$UAWAVATVWSHƒì H�j`H‹uÈH‹H‹VèiÆÿÿH‰ñèAÆÿÿ�HƒÄ [_^A\A^A_]ÃÌUVWSH�ìˆH�¬$€HÇEþÿÿÿH‰ÎH‰UàÆEèAAHAP )UÀ)M°)E H�!=H�MàL�E èLï„À„×€}è…¹ºèûžÿÿH…À„1H‰ÇH‹=H‰GH‹=H‰¹ºèËžÿÿH…À„ðH‰ÃH‰8HÇ@HÇ@¹ºè�žÿÿH…À„ÂH‰H� Ê9H‰HÆ@ŠM¦ˆH·M¤f‰H‹M ‰HŠM¦ˆMþ·M¤f‰Mü‹M ‰MøÆŠMþˆN·Müf‰N‹Mø‰NH‰Fë\ÆŠEè<w<uNH‹EðH‹H‰EØH‹@ÿH‹MØH‹AH‹PH…Òt H‹ L‹@èžÿÿH‹MðºA¸èý�ÿÿë H�EèH‰ðH�Ĉ[_^]ùºèSÄ ¹ºèBÄ H‰T$UVWSHƒì(H�ª€H�Mà賨ÿÿ�HƒÄ([_^]Ãf„H‰T$UVWSHƒì(H�ª€H‹EØH‹H‹Pè<ÄÿÿH‹MðèÄÿÿ�HƒÄ([_^]ÃÌÌÌÌÌÌÌÌÌUVHƒìXH�l$PHÇEþÿÿÿM‰ÁI‰ÐH‰ÎH‹H�MÐèøÿÿ€}Ðu1Àë,EÐ)Eà€~H�FH‰Eøt H‹MøèO©ÿÿ(EàH‹Eø°HƒÄX^]Ãf.„�H‰T$UVHƒì(H�jP(EàH‹EøHƒÄ(^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌUVHƒìXH�l$PHÇEþÿÿÿM‰ÁI‰ÐH‰ÎH‹H�MÐèXúÿÿ€}Ðu1Àë,EÐ)Eà€~H�FH‰Eøt H‹Møè¯¨ÿÿ(EàH‹Eø°HƒÄX^]Ãf.„�H‰T$UVHƒì(H�jP(EàH‹EøHƒÄ(^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌAWAVAUATVWUSH�ì8M‰ÅH‰×H‰L$(L�t$AL�¼$°L�bH�¬$øë*€D$0L$@T$P\$`_0W OH‹H‹O¶W€út%I‹t$H‰´$�A$AL$)Œ$€)D$p·w8¶_:H‰D$0H‰L$8ˆT$@H‹„$�I‰F(D$p(Œ$€ANAf‰t$hˆ\$jH�L$pH�T$0è H‰éL‰êè „$øŒ$”$œ$(A_0AW AOAH‹D$pH‹Œ$°Hƒø„Hƒù„—H9ÈuiHƒøt.H…À…åþÿÿH�L$xH�”$¸è³„À…Ëþÿÿë>f„L‹„$€L;„$Àu#H‹L$xH‹”$¸H9Ñ„˜þÿÿ茅À„‹þÿÿH‹D$(ëHƒùH‹D$(uOW _0ëÆ@8ë#OW _0H‹D$(X0P HH�Ä8[]_^A\A]A^A_ÃÌÌÌÌÌÌÌÌÌÌÌVWHƒì(¶A:B…†H‰ÖH‰ÏHƒÀÿHƒøwSH� zHc�HÈÿàL‹G L;F u\H‹OH‹VH9Ñt èÊ…ÀuFL‹G0L;F0u.I9ÊtA€:.u\AŠ^€û’°€ût‰Ð<• ‰Ð4¶ÀH�@HƒÀI9Êt3„Òu/A€:.¸uë"¸H� ê-I9ÊtA· �ù..t¸M‰$I‰D$M‰T$M‰\$H‹D$@I‰D$@D$ L$0AL$0AD$ L‰àHƒÄH[]_^A\A]A^A_ÃèÎÀ Qýÿÿ›ýÿÿnýÿÿxýÿÿ•ýÿÿÌÌÌÌÌÌÌÌAWAVAUATVWUSH�ì¨I‰ÍŠB9<u IÇEé‰H‰×L�zH�l$pL�t$`L�%Úf.„@¶O:€ùtÄ8ÈwÀ<„»<tG<„xE¶A€ø„çL‰þ„é¶Hƒû‡8IcœLàÿàH‹NHƒÁéDHƒ„àL‰ñH‰úèºøÿÿH‹L$`H‹D$hEMU )D$ )L$0)T$@H‹U0H‰T$PH‹WH‰ÓH)Ë‚HH‰_HƒøtOé–f.„ÆG9€8…G¶G<r*<t&<…LH‰ùè÷ÿÿ„À…xf.„@¶G9ëZ¾…ÿÿÿÆG9°ëGH‹FH‹N H�QH…ÉHDÑH� HƒÁëH‹FH‹N H�QH…ÉHDÑH� HƒÁÆG9°H…Éu@<…ˆþÿÿéPþÿÿÆG9L‹H‹WHƒÃÿHƒûw:¹H�BHc,˜HÅÿåH‹FH‹N H�iH…ÉHDéH� (HƒÁH9ÊséÎH‹NHƒÁH9Ê‚½Hƒûw5¸H�-Hc\�HëÿãH‹FH‹n H�]H…íHDÝHØHƒÀéÐH‹FHƒÀéÃH‹GH…À„‹HƒHƒÀÿH‰GIÇEéÆG9IÇEéI‰EH‹D$PI‰E8(D$ (L$0(T$@AU(AMAEé×¹H9ʃCÿÿÿè1½ ¸ë@H‹FH‹N H�iH…ÉHDéH� (HƒÁH9ʃÿÿÿëÌH‹FH‹n H�]H…íHDÝHØHƒÀH‰ÓH)¿LÈH‰H‰_H‹G0H‰D$GO!)L$p)D$`)D$ (D$p)D$0H‹D$H‰D$?IÇEM‰MI‰MEˆEH‹D$?I‰E8(D$ (L$0AM)AEL‰èH�Ĩ[]_^A\A]A^A_ÃH‹GH…Àt:HƒHƒÀÿH‰GIÇEëÊH� ÃL�‰)º(è\ H‰Á襼 ¹1Òè—¼ �‚üÿÿzýÿÿ±ýÿÿ‚üÿÿ]ýÿÿÇýÿÿôýÿÿìýÿÿÈþÿÿ¬þÿÿþÿÿôþÿÿ$þÿÿÚþÿÿ­þÿÿÌÌÌÌÌÌÌÌAWAVATVWUSHƒì0H‰ÈIƒøs.H�|$$·L$.f‰L$(‹L$*‰L$$A´L‰ÅH‰ÖH…í…›é¥H� Ü3H9Êta· �ù\\tV€z:uµŠ „Éx¯¶É‰Íƒå߃ſƒýsŸH‹- ªDŠ| H�|$$·L$.f‰L$(‹L$*‰L$$A»A´M9Æé›L�rM�XþIƒûƒ–N�<¾E1ÉH�,2L‰ÿH)ïHƒÿ†À¶]€û/A•€û\•ÁD ѶÉIÉ€û/„΀û\„Ŷ\2€û/A•€û\•ÁD ѶÉIÉ€û/„¡€û\„˜¶\2€û/A•€û\•ÁD ѶÉIÉ€û/tx€û\ts¶\2€û/A•€û\•ÁD ѶÉIÉ€û/tSHƒÆ€û\…AÿÿÿëDf.„DHƒÆI9ð„jþÿÿL‰Í¶2€û/A•Á€û\•ÁD ÉD¶ÉIé€û/t€û\uËM9Ù‡SI�IM‰ÚI)Ê‚PLñE1ÛH‰Îf„L‰ÿH)÷Hƒÿ†Ä¶.@€ý/@•Ç@€ý\•Ã@ û¶ûIû@€ý/„Ï@€ý\„Ŷn@€ý/@•Ç@€ý\•Ã@ û¶ûIû@€ý/„Ÿ@€ý\„•¶n@€ý/@•Ç@€ý\•Ã@ û¶ûIû@€ý/ts@€ý\tm¶n@€ý/@•Ç@€ý\•Ã@ û¶ûIû@€ý/tKHƒÆ@€ý\…9ÿÿÿë;€HƒÆI9÷t7L‰ß¶.@€ý/A•Ã@€ý\•ÃD ÛD¶ÛIû@€ý/t@€ý\uÌM9Ú‚;M‰ÚM…É„þüÿÿM…Ò„õüÿÿH�|$$·l$.f‰l$(‹l$*‰l$$O�IƒÃA´M9ÆL‰ÙL‰Âèø¸ H� É0I9΄ÂA·�ù?\„²H� ç0I9ÎtA·�ù.\….ýÿÿL�rM�HüN�½1É€H�<*L‰ÓH)ûHƒû†w¶1ö€û\@•ÆHñ€û\„‰¶_1ö€û\@•ÆHñ€û\„p¶_1ö€û\@•ÆHñ€û\„W¶_1ÿ€û\@•ÇHùHƒÅ€û\u‰é9L�rM�HüIƒùrH� ë/I9΄¢A�>UNC\„•N�½1Éf.„@H�<*L‰ÓH)ûHƒû†û¶1ö€û\@•ÆHñ€û\„¶_1ö€û\@•ÆHñ€û\„¶_1ö€û\@•ÆHñ€û\„è¶_1ÿ€û\@•ÇHùHƒÅ€û\u‰éÊL�rM�XøJ�4»E1ÉH� H‰÷H)ÏHƒÿ†‰¶ 1í€ù\@•ÅIé€ù\„¬¶L1í€ù\@•ÅIé€ù\„’¶L1í€ù\@•ÅIé€ù\„x¶L1í€ù\@•ÅIéHƒÃ€ù\u†éY»H)Ëf„I9脆HƒÃÿ€<*\H�mué”Á€Á¶ÉƒáH)ÙHƒùuWIƒù‚™€z:uGAŠ„Ûx@¶ë‰ëƒã߃ÿƒûw0H‹ ž¤DŠ<)H�|$$·L$.f‰L$(‹L$*‰L$$A»A´é‘úÿÿI9É‚9I‰ÉH�|$$·L$.f‰L$(‹L$*‰L$$E1äëP»H)ËI9èt)HƒÃÿ€<*\H�muí”Á€Á¶ÉƒáH)ÙI9É‚çI‰ÉH�|$$·L$.f‰L$(‹L$*‰L$$A´M�YM9Æ4é°üÿÿH� œE1ÒI9Øt$L‰Ï¶,E1É@€ý\A•ÁIù@€ý\tHƒÃI9ØuÜM‰Ùé¾M9Ù‡PI�IM‰ÚI)Ê‚MLñE1ÛH‰ËH‰÷H)ßHƒÿve¶;1í@€ÿ\@•ÅIë@€ÿ\tn¶{1í@€ÿ\@•ÅIë@€ÿ\tW¶{1í@€ÿ\@•ÅIë@€ÿ\t@¶{HƒÃ1í@€ÿ\@•ÅIë@€ÿ\u•ë#HƒÃH9Þt&L‰ß¶+E1Û@€ý\A•ÃIû@€ý\uÝM9Ú‚µM‰ÚH�|$$·l$.f‰l$(‹l$*‰l$$I�jM…ÒIDêM�)IƒÃA´M9Ç�ûÿÿJ�4L‰ÅL)ÝH…ítŠ@¶€û/t€û\t1öH‰L‰@Dˆ`Dˆx·Wf‰P‹‰PL‰pL‰H H‰H(L‰P0@ˆp8fÇ@9HƒÄ0[]_^A\A^A_ÃL‰ÉL‰Ú脳 L‰Úè ´ L‰ÙL‰Òèm³ L‰Êèc³ H� ê+ºM‰ÈèÝ­ ÌÌÌÌÌÌÌÌÌÌÌI‰ÐH‹H‹QH‰ÁéÞ=ÌÌÌÌÌÌÌÌÌÌÌÌÌÌUAWAVAUATVWSHƒìxH�l$pHÇEþÿÿÿH‹öÆ„öA½H�5G¢€Iƒý wI�}H‰ñè.dë,f.„f�H‰ñèdL‰ïIƒý u¸¿ ë1ÀH‹¢H‰¢H‰ñèeH…Û„IH‰}°Hƒû„YL‹#H‹CH‰]èL‹{IÁçO�4L�º/èÝM HÇE¸H� ˜º^è2© H� QL�2º*è¨M fDH‰T$UAWAVAUATVWSHƒì(H�jp)uðH�M¸èú…ÿÿ(uðHƒÄ([_^A\A]A^A_]ÃDH‰T$UAWAVAUATVWSHƒì(H�jp)uðH�MÐèÚ‹ÿÿ(uðHƒÄ([_^A\A]A^A_]ÃDH‰T$UAWAVAUATVWSHƒì(H�jp)uðH�MÐèz…ÿÿ(uðHƒÄ([_^A\A]A^A_]ÃÌÌÌÌÌUVWH�ì�H�¬$€HÇEþÿÿÿ1À€y”ÀH‹ HÀHƒÀH‡‰ÁƒáH‰MÐH�UÐH‰UÈH�H‰UÀHƒùumHƒàütNH�uØ@H‹xH‹HÇH‰MØH…Ét:H‰Mر†HH‰ñ踲ÿÿH‹EØðH�(uH‰ñè²|ÿÿH‰øH…ÿuºH�Ä�_^]ÃH� xèc¦ H�EÈH‰E H�b~ÿÿH‰E¨H�MÀH‰M°H‰E¸H�sH‰EØHÇEàH��H‰EèHÇEðH�E H‰EøHÇEH��H�MØèH f.„H‰T$UVWHƒì H�ª€H�MØèŠÿÿ�HƒÄ _^]Ãf.„�H‰T$UVWHƒì H�ª€H�MØèäƒÿÿ�HƒÄ _^]ÃÌÌÌÌÌÌÌÌÌÌÌAWAVATVWSHƒì(L‰ËL‰ÆI‰ÖL‹¼$€IƒùwDèÞþ1ÒH‰ÁM‰øè×þH‰ÇH…ÿtdL9þIG÷H‰ùL‰òI‰ðèÿHƒûwMè©þ1ÒH‰ÁM‰ðëLM�$è–þ1ÿ1ÒH‰ÁM‰àè�þH…Àt4H�KÿH!ÁH‰ÚH)ÊH‰ÇH×H‰DøH…ÿuœ1ÿëè\þM‹Fø1ÒH‰ÁèZþH‰øHƒÄ([_^A\A^A_ÃÌÌÌÌÌÌUAWAVAUATVWSHƒìhH�l$`HÇEþÿÿÿI‰×I‰ÎH‰MàH‰UèÆEÿH�=º™H‰ùè²[H‰}ØH‹·™Hƒû„»H…Ûu0¹ºè yÿÿH…À„6H‰ÃHÇWÀ@H‰x™L‰uÈL‰}ÐH‹sH;suzH‰÷HƒÇ‚øH�6H9ÇHBø¹E1äH‰øH÷áI‰Å‘À€ÓAˆÄIÁäH…ö„¢HÁæH‹ A¸H‰òM‰éèœxÿÿH…À„•H‰H‰{H‹sH‹}Øë³1öë!H‹H�=Ò˜HÁæL‰40L‰|0HƒC@¶1Ûˆ]ÿH‰ùèà[„Ût'H‹EèL‰ñH‰EðÿH‹EðH‹PH…Òt H‹MàL‹@èxÿÿ‰ðHƒÄh[_^A\A]A^A_]ÃL‰éL‰âèçwÿÿH…À…kÿÿÿL‰éL‰âècž è ˜ ¹ºèKž f„H‰T$UAWAVAUATVWSHƒì(H�j`H�MÈèn€ÿÿ�HƒÄ([_^A\A]A^A_]Ãf.„f�H‰T$UAWAVAUATVWSHƒì(H�j`H‹MàH‹Uðè*žÿÿ�HƒÄ([_^A\A]A^A_]ÄH‰T$UAWAVAUATVWSHƒì(H�j`H�MØè΂ÿÿÆEÿHƒÄ([_^A\A]A^A_]Ãf„H‰T$UAWAVAUATVWSHƒì(H�j`öEÿt H�Màè¨ÿÿ�HƒÄ([_^A\A]A^A_]ÃÌÌÌÌÌÌUAWAVAUATVWS¸èzòH)ÄH�¬$€)µ€HÇ…xþÿÿÿI‰ÌH‰•0L‰…8Dˆ�sWÀ)…Ç……Ç…()…0Ç…@…HÇ…X)…`Ç…p…xÇ…ˆ)…�Ç… …¨Ç…¸)…ÀÇ…Ð…ØÇ…è)…ðÇ… … Ç… )… Ç…0 …8 Ç…H )…P Ç…` …h Ç…x )…€ Ç…� …˜ Ç…¨ )…° Ç…À …È Ç…Ø )…à Ç…ð …ø Ç… )… Ç… …( Ç…8 )…@ Ç…P …X Ç…h )…p Ç…€ …ˆ Ç…˜ )…  Ç…° …¸ Ç…È )…Ð Ç…à …è Ç…ø )… Ç… … Ç…( )…0 Ç…@ …H Ç…X )…` Ç…p …x Ç…ˆ )…� Ç…  …¨ Ç…¸ )…À Ç…Ð …Ø Ç…è )…ð Ç… … Ç… )… Ç…0 …8 Ç…H )…P Ç…` …h Ç…x )…€ Ç…� …˜ Ç…¨ )…° Ç…À …È Ç…Ø )…à Ç…ð …ø Ç… )… Ç… …( Ç…8 )…@ Ç…P …X Ç…h )…p Ç…€ …ˆ Ç…˜ )…  Ç…° …¸ Ç…È )…Ð Ç…à …è Ç…ø )…Ç……Ç…()…0Ç…@…HÇ…X)…`Ç…p…xÇ…ˆ)…�Ç… …¨Ç…¸)…ÀÇ…Ð…ØÇ…è)…ðÇ……Ç…)… Ç…0…8Ç…H)…PÇ…`…hÇ…x)…€Ç…�…˜Ç…¨)…°Ç…À…ÈÇ…Ø)…àÇ…ð…øÇ…)…Ç… …(Ç…8)…@Ç…P…XÇ…h)…pÇ…€…ˆÇ…˜)… Ç…°…¸Ç…È)…ÐÇ…à…èÇ…ø)…Ç……Ç…()…0Ç…@…HÇ…XH�ÍH‰EÐH�ÍH‰EØfÇEàÇEèÆEìH��`H�UÐè'†ÿÿH‹µ`H‰ñèQôH…ÀtH‰Ã1ÿëèòó‰ÃHÁã ¿H‹•hH…ÒtHÒA¸H‰ñèOoÿÿH…ÿt ¸I‰ÞéH‰�hÆ…wL�9H�MÐH�•hA¹ èbKL‹uØHƒ}Ðu H‹uàéÑÆ…wL�H�MÐH�•hA¹ è*KH‹}ØHƒ}Ðu H‹uàI‰þé–Æ…wL�ÝH�MÐH�•hA¹ èïJHƒ}ÐL‰¥X…®EØ…HÇ……)…@Æ…vÆ…uÆ…tL�€H�MÐH�•hA¹ è‡JHƒ}Ð…ËEØ…ˆHÇ…€L‹¥@H‹µH€½ˆ‚ÄH‹…�H‹H‰…`H‹@ÿéuH‹EØH‰…`H‰…HÇ…Æ…vÆ…uÆ…tL�^H�MÐH�•hA¹èàIH‹EÐL‹mØH‹uàH‰…`L‰­hH‰µpHƒøuzM‰ìé*H‹EØH‰…`H‰…ˆHÇ…€L�$H�MÐH�•hA¹ èwIH‹EÐL‹mØH‹uàH‰…`L‰­hH‰µpHƒøuFM‰ì€½@ssé¸L�´H�MÐH�•hA¹è"IL‹eØHƒ}Ð…£H‹uàéƒL�¥H�MÐH�•hA¹èíHL‹eØHƒ}Ð…sH‹uà€½@rJH‹…HH‹H‰…`H‹@ÿH‹½`H‹GH‹PH…Òt H‹L‹@èJlÿÿºA¸H‰ùè7lÿÿM‰æL‹¥XH‰Ùè¦ð¸H‰…ÀL‰µÈH‰µÐ(EÐ(Mà(Uð…Ø�è•øH…ÀtH‹…ÈI‰$H‹…ÐI‰D$é;L‰¥XH�…ÐH‹H0H‰��HP )•€)�p)…`Iƒþeƒ£ Š…sH��`H‰�À<„K�vH�<ÅHïH�µH�…ÀH‰EÐ1ÒH�]ÐH‰øH)ðHƒø_vIH‰ÙI‰ð蹓ÿÿH…Àu`L�FH‰Ù訓ÿÿH…ÀuOL�F0H‰Ùè—“ÿÿH…Àu>L�FHH‰Ù膓ÿÿHƒÆ`H…Àt­ë'H9þtH�]Ðf�H‰ÙI‰ðèe“ÿÿH…Àu HƒÆH9þuçL‰òL‰÷H)×L9÷skH…ÿtfH‹•0H‹…8H� 7 H‰MÐHÇEØHÇEàH� ýH‰MðHÇEøH��ÀL�EÐÿP0…À)…€€½€té”1ÿH‹•0H‹…8H� ÷ H‰MÐHÇEØHÇEàH� ¬üH‰MðHÇEøH��ÀL�}ÐM‰øÿP0…À)…€€½€…*I)þIƒþeƒL�­K�vH�<ÅHïH��€H�u$L�e$1ÀI9ýu#é6fDIƒÅH‹…`HƒÀI9ý„H‰…`H‰…pL‰­hM‹uHƒ½p…Á1ÒA¸(L‰ùè†îÇE ÐÇEÐXH‹�`HÇ…ÀL‰òL�…ÀM‰ùÿ•€ƒø…EH‹EI9Æ‚8‹MìH…Ét HÈI9ƃ$H‰ñè3îHƒøÿ„H��ÀH‰òI‰Àè ¤L‹�ÐHƒ½À„ñL‹…Èéâf.„DA‹]1ÒA¸(L‰ùèÁíÇE ÐÇEÐXH‹�`HÇ…ÀH‹…€L‰|$ L‰òA‰ØH��€L��ÀÿЃø…ÁH‹EI9Æ‚´‹MìH…Ét HÈI9ƃ L‰áè_íHƒøÿ„YH��ÀL‰âI‰ÀèL£L‹�ÐHƒ½À„%L‹…Èëaf.„@E1ÀH�…0H‰…ÀH�…pH‰…ÈH�…hH‰…ÐH�…sH‰…ØH��€H�•ÀèB ëNE1ÀH�…0H‰…ÀH�…pH‰…ÈH�…hH‰…ÐH�…sH‰…ØH��€H�•Àèò …€)…€½…ÂH‹…h)…ÀH‹@H‰…ÐHƒ½puaH‰�@H‹…ÐH‰Eà(…À)EÐH�…`H‰D$(H�…sH‰D$ H��€H�•@M‰øL��0èAë_f.„H‰�@H‹…ÐH‰Eà(…À)EÐH�…`H‰D$(H�…sH‰D$ H��€H�•@M‰øL��0èžAH‹…�H‰… …€)…€½„É€½„hüÿÿH‹•0H‹…8A¹L‰ùL�ºÿP(EÐ)…À€½À„/üÿÿéžE1ÀéõýÿÿE1Àé=þÿÿ(…€L‹¥XA$H‹�`ÿ•hH‹��èêL‰à(µ€H�Ä[_^A\A]A^A_]ÃL‹¥XAÆ$H‹�`ÿ•hë»(…ë™H‹…L‹¥XI‰$H‹… I‰D$ë…(…ÀémÿÿÿE1ÿëY€½@rJH‹…HH‹H‰…xH‹@ÿH‹µxH‹FH‹PH…Òt H‹L‹@èÛdÿÿºA¸H‰ñèÈdÿÿA¿è\éH‰ÆH‰…€H‰½ˆL‰½�H‹…`H‰…˜L‰­ L‰¥¨H‰�°1ÒA¸H‰ñAÿÖL‹¥XH��ˆƒø…]è÷èH‰ÇèïèH‰ÃE1ö1ÒA¸ÐL�mÐL‰éM…ÿ„SèbéL‰éèôèWöµhµXµHµ8µ(µµµøµèµØµÈµ¸µ¨µ˜µˆµxH‹…ÈH‰…`Ç…lH‹EhH‹MpH‰…�Ç…œH‰�€Ç…ŒL�­`t$8t$(H�EÐH‰D$ ¹d†H‰úI‰ØM‰éÿ•`ƒø…1H‹…`HƒÀÿK� vH‰„ÍH‰„ÍÇ„ÍIƒÆIƒþdrœéøIQ )Uð)Mà)EÐE1ö1Àé¿öÿÿèèL‰éè¡çH��h1ÒA¸èóçH‹…ÈH‰…`Ç…lH‹EhH‹MpH‰…�Ç…œH‰�€Ç…ŒWöL�­`t$8t$(H�EÐH‰D$ ÇD$H¹d†H‰úI‰ØM‰éÿ•`ƒøu6H‹…`HƒÀÿ‹�lK�vH‰„ÕH‰„Õ‰ŒÕIƒÆIƒþdr–H�…ˆHP )Uð)Mà)EÐ1ÀéÃõÿÿºdL‰ñèæ’ë-ºdL‰ñè×’ëHÇÁÿÿÿÿ1ÒèÇ’ëHÇÁÿÿÿÿ1Òè·’ DH‰T$UAWAVAUATVWSHƒìXH�ª€)µ€H���è�mÿÿ(µ€HƒÄX[_^A\A]A^A_]Ãf„H‰T$UAWAVAUATVWSHƒìXH�ª€)µ€H���è1mÿÿ(µ€HƒÄX[_^A\A]A^A_]Ãf„H‰T$UAWAVAUATVWSHƒìXH�ª€)µ€H��`è¡pÿÿ(µ€HƒÄX[_^A\A]A^A_]Ãf„H‰T$UAWAVAUATVWSHƒìXH�ª€)µ€H��€èQpÿÿÆ…w(µ€HƒÄX[_^A\A]A^A_]Ãf�H‰T$UAWAVAUATVWSHƒìXH�ª€)µ€€½wt H��hè8lÿÿ(µ€HƒÄX[_^A\A]A^A_]ÃH‰T$UAWAVAUATVWSHƒìXH�ª€)µ€€½rt(ö…quJÆ…w(µ€HƒÄX[_^A\A]A^A_]ÃH��èÐjÿÿÆ…w(µ€HƒÄX[_^A\A]A^A_]ÃH��èõhÿÿÆ…w(µ€HƒÄX[_^A\A]A^A_]ÃfDH‰T$UAWAVAUATVWSHƒìXH�ª€)µ€H��€èQjÿÿÆ…vÆ…uÆ…t(µ€HƒÄX[_^A\A]A^A_]Ã@H‰T$UAWAVAUATVWSHƒìXH�ª€)µ€@еuŠ�v€½tu(€ãˆ�r@ˆµq(µ€HƒÄX[_^A\A]A^A_]ÃH��@èhÿÿ€ãˆ�r@ˆµq(µ€HƒÄX[_^A\A]A^A_]Ãf.„�H‰T$UAWAVAUATVWSHƒìXH�ª€)µ€Æ…vÆ…uÆ…tH��`èŸv*éÙL9ÆI‰ÙLDÎI�YM9ÁIDÙ€ùðr H�KL9ÃHEÙL9Ãu†H‰E H‰U¨H� ôH‰…�H�ĶH‰…˜H�E H‰… H�+UÿÿH‰…¨H�…XH‰…°H�ßÃH‰…¸H�‰óH‰EPHÇEXH�æH‰E`HÇEhL‰}pHÇExH�MðL�EPL‰êÿ×Eð)Eà€}à…ê@¶ë1öH‹U8H…ÒtA¸H‹�Øè5Pÿÿ@„ö…‡H�EÐH‰EPH�}TÿÿH‰EXH�…XH‰E`H�7ÃH‰EhH�$óH‰…�HÇ…˜H�‹æH‰… HÇ…¨H�EPH‰…°HÇ…¸H�MðL�…�L‰êÿ×€}ðuL�òA¹L‰áL‰êAÿÖë EðA$L‰àH�Äh[_^A\A]A^A_]Ã(EàA$H‹U8H…Òt×A¸H‹�ØèIOÿÿëÀH‰T$UAWAVAUATVWSHƒì(H�ª€H�M0è«Wÿÿ�HƒÄ([_^A\A]A^A_]Ãf„H‰T$UAWAVAUATVWSHƒì(H�ª€H‹µØH‹H‹Vè¡uÿÿH‰ñèyuÿÿ�HƒÄ([_^A\A]A^A_]ÃÌÌÌÌÌÌÌI‰ÐH� îñºéì®ÌÌÌÌÌÌÌÌÌÌÌÌUVWHƒìPH�l$PHÇEøþÿÿÿH‹H…Àˆ¼H‰ÎH¹ÿÿÿÿÿÿÿH9È„¦H�~Hƒ~H‰ueHÇEÐH�MÐèÛ‚ÿÿH‰EèHƒ>…™HÇÿÿÿÿH‰}ðH‰}ÐH‰uØH‹FH…ÀtðH�(u H‹MðènOÿÿH‹EèH‰FH‹EØHƒH‹H‹}ðH…Àu5HÇÿÿÿÿH‰}ÐH‰uØH‹FH…Àt$ðH�~(HƒHƒÄP_^]Ãè�lÿÿ èèkÿÿ H� ïàèÚxë   èÏkÿÿ f.„H‰T$UVWHƒì H�jPH�MèèçVÿÿ�HƒÄ _^]Ãf.„@H‰T$UVWHƒì H�jPH‹EèH‹MðH‰H�MÐèÜTÿÿ�HƒÄ _^]ÃH‰T$UVWHƒì H�jPH�MÐè·Tÿÿ�HƒÄ _^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌUVHƒìXH�l$PHÇEþÿÿÿH‰ÎH‰Mè‹neH‹ %XH‹Á€¸a…ò‹àmeH‹ %XH‹Á€¸`uDÆEÿ‹ÀmeH‹ %XH‹ÁH�ˆHH�5{ÿÿ苚meH‹ %XH‹ÁÆ€`‹€meH‹ %XH‹ÁHƒ¸Hu$‹cmeH‹ %XH‹ÁH‹€PH…Ày8éF‹?meH‹ %XH‹ÁHÇ€HWÀ€P1ÀH…ÀˆH¹ÿÿÿÿÿÿÿH9È„‹ùleH‹ %XH‹ÁHƒ¸X…õH‰uà‹ÔleH‹ %XH‹Á€¸a…ï‹´leH‹ %XH‹ÁHƒ¸PH‰uð…ì‹�leH‹ %XH‹ ÁH�‘XH‹�XHÇ�PÿÿÿÿH�‰PH‰UÐH‰MØH…Àt)ðH�(u‹EleH‹ %XH‹ÁH�ˆXèlLÿÿH‹Eð‹ "leH‹%XH‹ ÊH‰�XH‹EØHƒHƒÄX^]ÃÆEÿè¦iÿÿëTÆEÿèÛjÿÿëIÆEÿH� NîL�/îº&è�ë+ðH�.u ÆEÿH�MàèôKÿÿÆEÿè›jÿÿë ÆEþè°hÿÿ f.„@H‰T$UVHƒì(H�jP€}þt ÆEÿH�Mðè¾SÿÿÆEÿHƒÄ(^]ÃH‰T$UVHƒì(H�jPH‹Eð‹ GkeH‹%XH‹ ÊH‰�XH�MÐèªQÿÿÆEþHƒÄ(^]Ãf.„DH‰T$UVHƒì(H�jP€}ÿt H�MèèBYÿÿ�HƒÄ(^]ÃÌÌÌÌÌÌÌÌÌÌUVWSHƒìhH�l$`HÇEþÿÿÿH‰ÎH�=1jH‰ùèù+H‰}øH‹H…ÛuhH‹^èI΃øÿto‰ÇH…ÛtG¹ºèIIÿÿH…À„£H‰ÁH‰HÇ@‰xH‹j„H‰AðH± juñ‰ûH‰ØH‡…ÿt/H‹Møè¬,H‰ØHƒÄh[_^]ÃH� ±óL�’óº.èèë7H�¿ìH‰EÈHÇEÐHÇEØH�TÛH‰EèHÇEðH�MÈèÿ ¹ºèo f.„f�H‰T$UVWSHƒì(H�j`H�Møè&Tÿÿ�HƒÄ([_^]ÃÌÌÌÌÌÌÌÌÌÌÌÌAWAVAUATVWSHƒì I‰ÖI‰ÏH‹ ”gH…ÉuH� ˆgèƒþÿÿH‰ÁèÍH…ÀuL¹ºèHÿÿH…À„H‰ÆHÇWÀ@H‹ FgH…ÉuH� :gè5þÿÿH‰ÁH‰òè»ÌH‹ #gH…ÉuH� gèþÿÿH‰Áè•ÌH‰ÃH‹pH;pudH‰÷HƒÇ‚™H�6H9ÇHBø¹E1äH‰øH÷áI‰Å‘ÀpxAˆÄIÁäH…ötOHÁæH‹ A¸H‰òM‰éèkGÿÿH…ÀtBH‰H‰{H‹sëH‹HÁæL‰<0L‰t0HƒCHƒÄ [_^A\A]A^A_ÃL‰éL‰âè GÿÿH…Àu¾L‰éL‰âè‰m è2g ¹ºèqm ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌUAWAVVWSHƒìXH�l$PHÇEþÿÿÿL�5fH…Éu4éfD1Ò‰ÁèˆËºA¸H‹Møè“FÿÿH‰ùH…É„ãH‹9L‹yH‰MøH‹qHÁæHþH‰}ÐL‰}ØH‰}àH‰uèH‰ùf.„@H9ñt+H�AH‹QH…Òt!H‹ H‰ÃH‰EðÿÒH‰ÙëÝf.„H‰ðH‰Eàf„H9ðtH�HH‰MàHƒxH‰ÈuéM…ÿtIÁçA¸H‰ùL‰úèßEÿÿH‹(eH…ÀuL‰ñèüÿÿ‰ÁèŸÊH‰ÇH‹ eH…À…ÿÿÿL‰ñèùûÿÿéôþÿÿHƒÄX[_^A^A_]ÀH‰T$UAWAVVWSHƒì(H�jP  €H‰T$UAWAVVWSHƒì(H�jPH‹EðH‰EàH�MÐè Mÿÿ�HƒÄ([_^A^A_]Ãf.„f�H‰T$UAWAVVWSHƒì(H�jPH‹MøèÂkÿÿ�HƒÄ([_^A^A_]ÃÌÌÌÌHƒìxIQ )T$`)L$P)D$@H�L$0H�T$(L�D$@èN¥ÿÿ€|$0t H�L$0è Qÿÿ�HƒÄxÃÌÌÌÌÌÌÌHƒìhH‰L$(H�€”H‰D$0H�œèH‰D$8HÇD$@H�GÞH‰D$HHÇD$PH�D$(H‰D$XHÇD$`H�L$8èTÿÿÿ¹Í) ÌÌÌÌÌÌÌÌÌÌÌAWAVAUATVWUSHƒìxM‰ÅI‰×H‰ÎH�˜ßA¸L‰éè²¢A´„À…ÐN�4>1ÉH‰t$0L9ù„ÐH�H‰ÍH‰Ðf„H�x¶¾„ÛxH‰øë+f.„�HƒÀ€ûßw$L9÷HDǾf.„�HõL9ðu¸é,€ûíu-L9÷H‰ÃHDß¾L9ótJH�CL9÷tѶ?·ÿ�ÿŸvÃë6L9÷H‰ÆHD÷H�FL9öHDƾ€ûðr¢H�XL9ðHEþë�L‰ðë‹¶ƒçÁçƒà?�Øf‰D$.I‰èI)È‚èL9ý‡éL‰éèõ„ÀH‹t$0…±H�D$.H‰D$8H�G²H‰D$@H�CçH‰D$HHÇD$PH�~ÜH‰D$XHÇD$`H�D$8H‰D$hHÇD$pL‰éH�T$HèH¡„ÀuMHƒÅH‰éL9ý†xþÿÿH‰éL‰úè t I‰ÖI)ÏL‰éL‰òM‰øèS„ÀuH�ÀÝA¸L‰éèÚ A‰ÄD‰àHƒÄx[]_^A\A]A^A_ÃL‰ùëºH‰êè¶s H‰éL‰úès ÌÌÌÌÌÌÌUAWAVAUATVWSHƒìxH�l$pHÇEþÿÿÿI‰ÌIÐH‰U¸L‰EÀL�mÈÇEÈL�uàÇEà¹L�=óƒùt)ëf.„f�‹MȃùtL‰éèðj=…jH‹E¸H‹MÀH9È„DH�xH‰}¸¶¶Ú„ÛyqH9ÏtH�xH‰}¸¶@ƒà?ë1ÀH‰Ï‰Þƒæ€ûàrH9ÏtH�_H‰]¸¶?ƒç?ë Áæë.1ÿH‰ËÁà ø€úðrH9Ë„¾H�KH‰M¸¶ ƒá?é­Áæ ð‰Ã¹�C÷ƒøw¾tIc‡Løÿà¾nëCƒû\u‰Þë:‰Ù蟪„Àu‰Ù蔩¹‰Þ„Àu‰ØƒÈ½ÐƒòÁêƒò¹ë¾r¶EûˆEþ·Eùf‰Eü‰MȉuÌH‰UЉ]ØÆEܶEþAˆE·EüfA‰Eƒù…ºþÿÿéÈþÿÿ1ɃæÁæÁà ð ȉÃ=…@ÿÿÿ�ƒ}àt%L‰ñè‚i=tL‰á‰ÂèA „À„iþÿÿ°ë1ÀHƒÄx[_^A\A]A^A_]Ãf�H‰T$UAWAVAUATVWSHƒì(H�jpèrGÿÿ�HƒÄ([_^A\A]A^A_]Ã4ÿÿÿêþÿÿúþÿÿúþÿÿ/ÿÿÿúþÿÿúþÿÿúþÿÿúþÿÿúþÿÿúþÿÿúþÿÿúþÿÿúþÿÿúþÿÿúþÿÿúþÿÿúþÿÿúþÿÿúþÿÿúþÿÿúþÿÿúþÿÿúþÿÿúþÿÿöþÿÿúþÿÿúþÿÿúþÿÿúþÿÿöþÿÿÌÌÌÌUVH�ì˜H�¬$€HÇEþÿÿÿH‰MøH�EøH‰EèH�d³H‰EðH�éãH‰E¨HÇE°H�¾ØH‰E¸HÇEÀH�EèH‰EÈHÇEÐH�MØH�UL�E¨èIŸÿÿŠEØ<w<uAH‹EàH‹H‰EH‹@ÿH‹uH‹FH‹PH…Òt H‹L‹@è�>ÿÿºA¸H‰ñè}>ÿÿ�H�Ę^]Ãf�H‰T$UVHƒì(H�ª€H‹uH‹H‹VèeÿÿH‰ñèödÿÿ�HƒÄ(^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌHƒì(L‹Ý^M…ÀH�ÛþÿÿIEÀÿйÍ) ÌÌÌÌÌÌÌÌÌÌÌÌVWSHƒì H‰ÏHƒúwè¢Â1ÒH‰ÁI‰øHƒÄ [_^é”ÂH‰ÖH×èƒÂ1Û1ÒH‰ÁI‰øèzÂH…ÀtH�NÿH!ÁH)ÎH‰ÃHóH‰D0øH‰ØHƒÄ [_^ÃÌÌÌÌÌÌÌÌVHƒì H‰ÎIƒøwè4Â1ÒH‰ÁI‰ðëè%ÂL‹Fø1ÒH‰ÁHƒÄ ^éÂÌÌÌÌÌÌÌÌÌÌÌVWHƒì(L‰ÎM‰ÁH‰ÏIƒøwèíÁ1ÒH‰ÁI‰øI‰ñHƒÄ(_^éÂI‰ÐH‰t$ H‰úèÀÂÿÿ�HƒÄ(_^ÃÌÌÌÌÌÌÌÌUVWSH�ìÈH�¬$€HÇE@þÿÿÿH‰Î‹ ^eH‹ %XH‹ÁHƒ¸¨u$‹ï]eH‹ %XH‹Á³Hƒ¸°v.éà‹Ë]eH‹ %XH‹ÁHÇ€¨HÇ€°H‹ ]Hƒøt^HƒøtTH…ÀuWH�]ÝH�MØA¸èÚwÿÿH‹MØH…ÉtH�MØH‰úI‰Øè…H‰}H‰]H�Mè$cÿÿ„À…ÔH‹MH…Ét(H‹EH‰M(H‰E0ÿH‹E0H‹PH…ÒH‹M(t L‹@èë7ÿÿ1ÿH…öt=ðH�.u3@ˆ}=H�Mè=9ÿÿë$ÆE?ÆE>L�ÔÜH�MØH�U èÿ@·H…öuÃ@„ÿt1H‹MøH…Ét(H‹EH‰M(H‰E0ÿH‹E0H‹PH…ÒH‹M(t L‹@èq7ÿÿ�H�ÄÈ[_^]ÃH� ­Êè˜b èqWÿÿëèŠUÿÿëècWÿÿë1ÒèJh „H‰T$UVWSHƒì(H�ª€H‹M(H‹U0èß]ÿÿ�HƒÄ([_^]ÃDH‰T$UVWSHƒì(H�ª€H‹M(H‹U0è¯]ÿÿÆE?ÆE>HƒÄ([_^]Ãf.„@H‰T$UVWSHƒì(H�ª€H‹M(H‹U0èo]ÿÿ�HƒÄ([_^]ÃDH‰T$UVWSHƒì(H�ª€H�Mèó?ÿÿ�HƒÄ([_^]Ãf„H‰T$UVWSHƒì(H�ª€H�MèsAÿÿÆE?ÆE>HƒÄ([_^]Ãf�H‰T$UVWSHƒì(H�ª€Š]?€}>t H�M èÚ>ÿÿH�Mè�?ÿÿˆ]=HƒÄ([_^]ÃDH‰T$UVWSHƒì(H�ª€Hƒ}øtöE=tH�Møè–>ÿÿë H�Møèë@ÿÿ�HƒÄ([_^]ÃÌUAWAVVWSH�ì¨H�¬$€HÇE þÿÿÿL‰ÇI‰×H‰ËH‹H‹IH‹SH‰EèH�Ò9ÿÿH‰EðH‰MøH‰EH‰UH�«9ÿÿH‰EH�ÈÚH‰E¸HÇEÀH�µÊH‰EÈHÇEÐH�EèH‰EØHÇEàI‹p0H�M¨L�E¸L‰úÿÖŠE¨<w<uAH‹E°H‹H‰EH‹@ÿL‹uI‹FH‹PH…Òt I‹L‹@è×4ÿÿºA¸L‰ñèÄ4ÿÿH‹CŠ€ûuq1ɰð° T„À„ÒH�¦ÚH‰EèHÇEðHÇEøH�ÇH‰EHÇEH�M¸L�EèL‰úÿÖŠE¸<w<…ˆH‹EÀH‹H‰EH‹@ÿëEL�5ÉTL‰ñè©H�MèL‰úI‰øA‰Ùèg½ÿÿL‰ñ迊EèH‹Uð<w<u=H‹ H‹BH‰UÿH‹uH‹FH‹PH…Òt H‹L‹@èæ3ÿÿºA¸H‰ñèÓ3ÿÿ�H�Ĩ[_^A^A_]Ãf�H‰T$UAWAVVWSHƒì(H�ª€H�Mèè?ÿÿ�HƒÄ([_^A^A_]Ã�H‰T$UAWAVVWSHƒì(H�ª€H‹uH‹H‹Vè8ZÿÿH‰ñèZÿÿ�HƒÄ([_^A^A_]Ãf�H‰T$UAWAVVWSHƒì(H�ª€H‹uH‹H‹VèøYÿÿH‰ñèÐYÿÿ�HƒÄ([_^A^A_]Ãf�H‰T$UAWAVVWSHƒì(H�ª€H‹uH‹H‹Vè¸YÿÿH‰ñè�Yÿÿ�HƒÄ([_^A^A_]ÃÌÌVHƒì H‰ÎH‹H‹H‹PèÞÿÿ‰HƒÄ ^ÃÌHƒì(èw ÌÌÌÌÌVHƒìpH‰ÎH‹L‹BD‹J‹J‰L$ H�L$XH‰ÂèÙ\H�ÅH‰D$(H�ŽÉH‰D$0H‰t$8D$XD$@H‹D$hH‰D$PH�L$(è ÌÌÌÌÌÌÌÌÌÌÌÌUAWAVATVWSHƒì`H�l$`HÇEøþÿÿÿH‰Îè]\H…ÀtH‰ÇH‰ñè=\H…ÀuH� AÅè,] H‰ÃH‰ùè\I‰ÆI‰×H‰ùèQ\A‰ÄH‰ùèV\L‰uàL‰}èD‰eð‰EôH‰]ÀHÇEÈH‰ñèã[H�´×H�MÀL�MàI‰Àè\ f.„H‰T$UAWAVATVWSHƒì H�j`H�MÀè`>ÿÿ�HƒÄ [_^A\A^A_]ÃUVWH�ì€H�¬$€HÇEøþÿÿÿH‰ÎH‹yH…ÿ…‡H‹HÇEàWÀEèH�MàH‰M¨HP )UÐ)MÀ)E°H�NÅH�M¨L�E°è�H�~H‹EðH‰EÀEà)E°H‹H…ÉtH‹VH…Òt A¸è±0ÿÿH‹EÀH‰G(E°H‹?F)E°HÇFWÀF(E°)Eà(Eà)E°¹ºèY0ÿÿH…ÀtH‰8(E°@H�’ÖH�Ä€_^]ùºè¸V fDH‰T$UVWHƒì H�ª€H�Màè¤8ÿÿ�HƒÄ _^]ÃÌÌÌÌÌÌÌÌÌÌÌUVWH�ì€H�¬$€HÇEøþÿÿÿH�qHƒy…ƒH‰ÏH‹HÇEàWÀEèH�MàH‰MØHP )UÀ)M°)E H�üÃH�MØL�E è¯H‹EðH‰E°Eà)E H‹H…ÉtH‹WH…Òt A¸èc/ÿÿH‹E°H‰F(E H��ÕH‰ðH�Ä€_^]Ãf.„DH‰T$UVWHƒì H�ª€H�Màè¤7ÿÿ�HƒÄ _^]ÃÌÌÌÌÌÌÌÌÌÌÌHƒì8M‰ÁH‰L$(H‰T$0H�HÕH�L$(E1Àè« ÌÌÌÌÌÌÌÌÌVWHƒì(H‹1H‹yHÇH…öt$¹ºè˜.ÿÿH…Àt#H‰0H‰xH�Õë ¸H�/ÕHƒÄ(_^ùºèñT ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌHƒ9H�ýÔH�ÖÔHDÐH�ÓÀHEÁÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌAWAVATVWSHƒìxL‰ÈL‰ÃI‰ÖI‰ÌI‹M‹AE‹I‹@‹ 3OeH‹<%XH‹ ÏHƒ¹¨uZ‹ OeH‹<%XH‹ ÏH‹±°HƒÆH‰±°Hƒþr]H�ºÔH‰D$0HÇD$8HÇD$@H�,ÀH‰D$Pé^‹ ¼NeH‹<%XH‹ ÏHÇ�¨HÇ�°¾‰D$ H�L$`è¶WL�=ß¿L‰|$0H�kÄH‰D$8H‰\$@D$`D$HH‹D$pH‰D$XH‹&NH…Àu)H� _ÙºèH…ÀH�Ž#HEÂH‰ÁH‡ øMH� ©MÿÐH‹=°MH…ÿuL‰áAÿV H‰D$0H‰T$8H�L$0èÀïÿÿë#H‹ML‰áAÿV H‰D$0H‰T$8H�T$0H‰ÙÿWH‹¬MH…Àu)H� 8ÙºèŽH…ÀH�¤#HEÂH‰ÁH‡ ~MH� MÿÐHƒþr:H��ÓH‰D$0HÇD$8HÇD$@L‰|$PHÇD$XH�L$0è!çÿÿ  L‰áL‰òè HƒìxH‰L$(H‰T$0H�L$(èø#‰D$$H�D$$H‰D$8H�ŸH‰D$@H�GÓH‰D$HHÇD$PH�ŠÅH‰D$XHÇD$`H�D$8H‰D$hHÇD$pH�L$Hèçæÿÿ ÌÌÌÌÌUVH�ìˆH�¬$€HÇEþÿÿÿH‰M¨H‰U°H�h1ÉèN°H…À„öÇEàPH‹52LH…öu)H� ¤ÖºèDH…ÀH�5ª HEòH‰ðH‡LH�MàÿÖ…Àu舯ƒøx…͹ºèå*ÿÿH…À„¤ÇmainH‰EàHÇEèHÇEðH�Màèi_ÿÿH‰ÁèÑÝÿÿHÇE¸HÇEÐH�E¨H‰EØH� Ò÷ÿÿH�UØL�E¸H�uÐI‰ñè"…Àt=‹´KeH‹ %XH‹ÁHƒ¸¨u*‹—KeH‹ %XH‹ÁH‹€°HƒÀÿë:‹E؉Eä1Àë_‹mKeH‹ %XH‹ÁHÇ€¨HÇ€°HÇÀÿÿÿÿ‹ =KeH‹%XH‹ ÊH‰�°H‹E¸H‹MÐH‰EèH‰Mð¸‰EàH‹ŠJHƒøt%ÆEÐH‰uØÆEÿH� qJL� ²ÈL�EØ1Òè�ªÿÿ‹EàH‹MèH‹Uð¾eƒøt‹uä…Àt$H‰MÀH‰UÈÿH‹EÈH‹PH…ÒH‹MÀt L‹@èo)ÿÿHcÆH�Ĉ^]ÃH� «ÓL�ŒÓº#èJúÿÿ ¹ºè¹O H� 0ÓL�Óº4èúÿÿ f.„H‰T$UVHƒì(H�ª€€}ÿt H�Màè�2ÿÿ�HƒÄ(^]ÀH‰T$UVHƒì(H�ª€H‹MÀH‹UÈè‘OÿÿÆEÿHƒÄ(^]ÃÌÌÌÌÌÌVWHƒìHH‰ÎL� ÐH�|$0A¹ H‰ùèý‡H‰t$(L�éÀH�T$(H‰ùèqH‰ùèlr�HƒÄH_^ÃÌÌÌÌVWHƒìHH‰ÎL�ÛÏH�|$0A¹H‰ùè­‡H‰t$(H�vL�uÀH�T$(H‰ùè°pH‰t$(L�¬ÏH�T$(H‰ùè—pH‰ùèÿq�HƒÄH_^ÃÌÌÌÌÌÌÌUAWAVAUATVWSH�ì¨H�¬$€HÇE þÿÿÿH‰×H‰ÎH�WÐH�]ÀA¸H‰Ùè^jH‰éH‰Úè3:ÿÿH‹]H9]uVH‰u¸I‰ÜIƒÄ‚;H�I9ÔL‰æHBòE1íH‰ðHð“ÀI‰öIö‚AˆÅMíH…ÛtH‹MA¸M‰ñèU'ÿÿëL‹}L�cë#L‰ñL‰êè'ÿÿI‰ÇH…À„ L‰}H‰uH‹u¸fAÇ_L‰eH�MèH‰òI‰øè MH‹uèL‹EøÆE1ÉH‰òèÖSH…À…—H‹EøH‰EÐEè)EÀÆEH�MÀè°gÿÿH‰ÃI‰ÖL‰ù襫H‰ÁH‰Úè «H‰Æ1ÿH…À@•ÇÆM…ötA¸H‰ÙL‰òè‚&ÿÿH‹UH…ÒtHÒH‹MA¸èg&ÿÿH‰øH‰òH�Ĩ[_^A\A]A^A_]ÃèxFë-Eð)E H‰UÀH‰uÈ(E EÐH� Ÿ¹L�EÀº+èÙFÿÿ L‰ñL‰êèŒL f.„H‰T$UAWAVAUATVWSHƒì(H�ª€€}t H�Mèèe.ÿÿ�HƒÄ([_^A\A]A^A_]ÃH‰T$UAWAVAUATVWSHƒì(H�ª€H‰éèŒ1ÿÿ�HƒÄ([_^A\A]A^A_]ÃÌÌÌÌÌÌÌÌÌÌAVVWSHƒìxM‰ÎH‰ÎH‹„$ÈWÀ)D$P)D$`HÇD$pÇD$P(H‹I‹ÇD$@H‹L�D$@L�L$PH‰ÂÿSƒøuJH‹|$hH‰ùè_ªHƒøÿtWL‹Œ$À‹L$`I‹M‹FAŠˆ\$0‰L$(H‰D$ H�L$@I‰ùèRÐÿÿ€|$@ufÇë D$@FÆH‰ðHƒÄx[_^A^ÃHÇÁÿÿÿÿ1Òè½U ÌÌÌÌÌÌÌÌÌÌÌAVVWSHƒìxM‰ÎH‰ÎH‹„$ÈWÀ)D$P)D$`HÇD$pÇD$P(H‹I‹E‹@ÇD$@H‹H�T$PH‰T$(H�T$@H‰T$ E1ÉH‰ÂÿSƒøuJH‹|$hH‰ùèn©HƒøÿtWL‹Œ$À‹L$`I‹M‹FAŠˆ\$0‰L$(H‰D$ H�L$@I‰ùèaÏÿÿ€|$@ufÇë D$@FÆH‰ðHƒÄx[_^A^ÃHÇÁÿÿÿÿ1ÒèÌT ÌÌÌÌÌÌÌÌÌÌUAVVWSH�ì H�¬$€HÇEþÿÿÿI‰ÖH‰ÎH�MøL‰ÂM‰ÈèŽIH‹}øL‹EÆE1ÉH‰úèXPH…ÀtH‰ÓE)Eиë%H‹EH‰EàEø)EÐÆEH�MÐè$dÿÿH‰ÃH‰×1ÀH‰E¨H‰]°H‰}¸(EÐEÀH…Àt6H‹E°H‹M¸EÀ)EàH‰EÐH‰MØH�MøH�UÐèfÿÿEøFHÇëEI‹H‰Úè˧H…ÀtH‰F1Àëè;§ÆF‰F ¸H‰ÆH…ÿtA¸H‰ÙH‰úè˜"ÿÿH‰ðH�Ä [_^A^]ÀH‰T$UAVVWSHƒì H�ª€€}t H�Møèë*ÿÿ�HƒÄ [_^A^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌUAWAVAUATVWSHƒìxH�l$pHÇEþÿÿÿM‰ÆH‰×H‰M¸M…ÀtºL‰ñè÷!ÿÿH…Àu é¸H‰EðH‰EÐL‰uØHÇEàJ�wE1ÿL‰uè1öH‰]Àf…öuEë2f.„f�H‰]àH‰MðIÏL‰ùH�UüM‰àèæI‰ßH‹]Àf…öuH9ß„qD·/HƒÇD‰è%ø=ØujA·Å=ÜsoH9߄ƷHƒÇ‰Ê�âüf¾�úÜ…®A�Å(��$·ÈA·ÅÁà ÈHÁà H¹HÈë#f.„�A·ÅHÁà ëfDHÁàHƒÈ1öE1ífƒø„Éf…Àt4HÁèf‰EúH�MúèÃŒÇEüfƒøwFˆEüA¼é¼„H‰ÁHÁé ÇEüƒù‰uÌwJˆMü¾é½f.„·È�ùÿwU‰ÁÁé€á€ÉÀˆMü$? €ˆEýA¼ë\„�ùÿ‡HÁè&$ ÀˆEü€á?€É€ˆMý¾éVfDÁé €ÉàˆMü‰ÁÁé€á?€É€ˆMý$? €ˆEþA¼H‹MðH‹EèL)øL9àsL‰ÿH÷‚ÌK�6H9ßHCßM…öt(A¸H‰ÁL‰òI‰ÙèžÿÿH…Àu%é¥@J�<>ë%ºH‰Ùè]ÿÿH…À„…H‰EÐH‰]ØI‰ÞH‹]ÀH‰}àH‰EðIÇL‰ùH�UüI‰ðèX£L‰uèI‰ÿL‰ç‹uÌf…ö…œüÿÿé†üÿÿH‹MàH‹E¸H‰HEÐHƒÄx[_^A\A]A^A_]úL‰ñèoD è>ëè> ºH‰ÙèRD H‰T$UAWAVAUATVWSHƒì(H�jpH�MÐè>&ÿÿ�HƒÄ([_^A\A]A^A_]ÃÌÌÌÌÌÌÌÌÌÌÌÌVWSHƒì H‰ÎH‹W>Hƒøt/HƒøtkH� ƺèrõÿÿ1ÉH…À”ÁHƒÁH‡ '>H…ÀtBH‹C>H…Àu)H� Öźè=õÿÿH…ÀH�cHEÂH‰ÁH‡ >H‰ñHƒÄ [_^HÿàH‹>H…ÿuI¹(ºèáÿÿH…ÀtqH‰ÇH‰Á茡1ÀðH±>t!H‰ÃH‰ùèB¡º(A¸H‰ùèºÿÿH‰ßH‰ùè`¡€~u ÆFHƒÄ [_^ÃH‰ùè5H� ÅL�çĺè}íÿÿ ¹(ºèìB ÌÌÌÌÌÌÌÌÌÌVWHƒì(H‰ÎÆAH‹$=Hƒøt/HƒøtjH� ØÄºè?ôÿÿ1ÉH…À”ÁHƒÁH‡ ô<H…ÀtAH‹ =H…Àu)H� „Ⱥè ôÿÿH…ÀH�ÐHEÂH‰ÁH‡ ò<H‰ñHƒÄ(_^HÿàH‹>H…ÿuI¹(ºè¯ÿÿH…ÀtCH‰ÇH‰ÁèZ 1ÀðH±>t!H‰ÆH‰ùè º(A¸H‰ùèˆÿÿH‰÷H‰ùHƒÄ(_^éþŸ¹(ºèèA ÌÌÌÌÌÌéâŸÌÌÌÌÌÌÌÌÌÌÌUAWAVVWS¸¸è—H)ÄH�¬$€HÇ…0þÿÿÿ‰×I‰Î‰•(1ÛL�}¸1ÒA¸L‰ùè< ¾÷Çt)H� ©ÃèáŸH…ÀtH‰Ã�÷‰½(¾ë1ÛL‰|$ HÇD$0ÇD$(A¹‰ñH‰ÚA‰øè­Ÿ…À„¹A‰À=ƒÝH��ÐH�U¸è¢<H‹…ÐH‰…¸H…À„…Ð)…ðH‹µàH‰µH‹½ðÆ…/Æ….H‰ùH‰òèÿ\H9Ör(H…ÒtH9Öt†t€<¿ŽjH9ÖHGòH‰µH‹…I‰F(…ðAéè]ž‰…ÀH�…(H‰…ÐH�Ç‹H‰…ØH��ÀH‰�àH‰…èH�œÂH‰…ðHÇ…øH�3°H‰…HÇ…H�…ÐH‰…HÇ…H�•ðL‰ñè¡9é„H�…(H‰…ÀH�7‹H‰…ÈH��ÂH‰…ðHÇ…øH�زH‰…HÇ…H�…ÀH‰…HÇ…Æ…/Æ….H�•ðL‰ñè9L‰ðH�ĸ[_^A^A_]úL‰Áè¸I Æ…/Æ….H� ±°èÌC f.„H‰T$UAWAVVWSHƒì8H�ª€Š�/€½.t H��ðèÝ ÿÿHƒ½¸töÃtH��Ðè ÿÿë H��Ðè¤ÿÿ�HƒÄ8[_^A^A_]ÃÌÌÌÌÌÌH‹H‹QÃÌÌÌÌÌÌÌÌUVWH�ì H�¬$€HÇEþÿÿÿH‹�8ýÀ…ó‹9eH‹ %XH‹Á€¸a…à‹á8eH‹ %XH‹Á€¸`u@‹Å8eH‹ %XH‹ÁH�ˆHH�:FÿÿèÏÿÿ‹Ÿ8eH‹ %XH‹ÁÆ€`‹…8eH‹ %XH‹ÁHƒ¸Ht(‹h8eH‹ %XH‹ÁHÇ€HWÀ€P‹@8eH‹ %XH‹ÁH�ˆPègÈÿÿH‰ÆH‰EHƒÀH‹NH…ÉHDÁtH‹PH�JÿH…Ò„H‹ë1ÀH…Àº HEÑH� ,¹HEÈH‰MàH‰UèH�EàH‰EðH�ùÿÿH‰EøH�ÞºH‰E HÇE¨H�C°H‰E°HÇE¸H�EðH‰EÀHÇEÈH�MÐH�UL�E èÎvÿÿŠEÐ<w<tðH�.uUH‰éè¡ÿÿëKH‹EØH‹H‰EH‹@ÿH‹}H‹GH‹PH…Òt H‹L‹@èÿÿºA¸H‰ùèîÿÿðH�.t«1ÀH�Ä _^]ÃHÇE H� ”®º^è.Bë1ÒèÅF H‰T$UVWHƒì H�ª€H�M èÿÿ�HƒÄ _^]Ãf.„�H‰T$UVWHƒì H�ª€H‹uH‹H‹Vè-<ÿÿH‰ñè<ÿÿ�HƒÄ _^]Ãf.„f�H‰T$UVWHƒì H�ª€H‰éè¥$ÿÿ�HƒÄ _^]Ãf.„f�H‰T$UVWHƒì H�ª€  ÌÌÌÌÌÌÌÌÌUVWSHƒì(H�l$ HÇEþÿÿÿƒút…Ò…eH‹=§5H…ÿ„U1Ûf.„f�‹O胙H…ÀtH‰Æ‹O1Òèw™³H‰ñÿH‹H…ÿuÖöÄH‹=V5H…ÿ„1Ûf.„�‹Oè3™H…ÀtH‰Æ‹O1Òè'™³H‰ñÿH‹H…ÿuÖöÄÄH‹=5H…ÿ„´1Ûf.„�‹Oèã˜H…ÀtH‰Æ‹O1Òèט³H‰ñÿH‹H…ÿuÖöÃtxH‹=º4H…ÿtl1Û‹O裘H…ÀtH‰Æ‹O1Òè—˜³H‰ñÿH‹H…ÿuÖöÃt8H‹=z4H…ÿu ë*H‹H…ÿt!‹Oè]˜H…ÀtêH‰Æ‹O1ÒèQ˜H‰ñÿëÖŠçHƒÄ([_^]Ãf.„H‰T$UVWSHƒì(H�j   ÌÌÌÌÌÌÌÌÌÌÌUAWAVAUATVWSH�ìÈH�¬$€HÇE@þÿÿÿL‰ËM‰ÇI‰Í‰Ñèü—I‰Æ¾H…ÀtIƒþÿu1ÿè^—ë)¸L‰÷ëÇEH�UL‰ñèÏ—1ÿ…À@”Ç1À1öH‰uÐHÁà H øH‰EØL‰uàH…ötH‹EØI‰EH‹EàI‰EIÇEé HƒøuGÇEð¸ÿÿÿÿH9ÃA¸ÿÿÿÿDBÃHÇD$ L�MðL‰ñL‰úèñ–…À„Ý‹EðH‰E1ÀéüH�û A¸ LBÃH�MÐL‰úèiMHƒ}ÐuTL�eØL‰áèFMH…À„šA$)EÀH�MÀè+MH9؇ÈH�ML‰úI‰Àè#MHƒ}„»H‹UL‹} ëH‹UØL‹}àH�]H‰ÙM‰øèWTH�MðH‰Úè+$ÿÿÇE L‹eðH‹]HÇD$ L�M L‰ñL‰âA‰Øè‚–‰Ç…Àth1öënèÝ•·Mf‰MÀŠMˆMÂÆE·MÀf‰MŠMˆM‰E¸H‰EH‹E I‰EH‹EI‰EŠEAˆE·EfA‰E ŠEAˆE ‹EA‰E 鉾èt•‰u‰}ÆE·MÐf‰MŠMÒˆM‰E…ötH�EAEIÇEë0‹E H‰E¸H‰]°H�M¸H‰M¨H�M°H‰MÀH9Ã…M‰}IÇEH‹UøH…ÒtHÒA¸L‰áèzÿÿL‰èH�ÄÈ[_^A\A]A^A_]ùºèDÿÿH…À„TH‰Çk»@ V»¹ºèÿÿH…À„ðH‰ÃH‰8HÇ@HÇ@¹ºèæÿÿH…À„ÂH‰H� «H‰HÆ@ ŠMˆH·Mf‰H‹M‰HŠMˆMö·Mf‰Mô‹M‰MðAÆEŠMöAˆM·MôfA‰M ‹MðA‰M éþüÿÿH�E¨H‰EÐH�ÓÿÿH‰EØH�MÀH‰MàH‰EèH�ä¥H‰EHÇEH�¦H‰E HÇE(H�EÐH‰E0HÇE8H�>ºH�Mè�Üÿÿ ¹ºèœ5 H‰ÁH‰Úè@ H�E)EðH�Mðèy.ÿÿ ¹ºèh5 fDH‰T$UAWAVAUATVWSHƒì(H�ª€H�Mðè«ÿÿ�HƒÄ([_^A\A]A^A_]ÃÌÌÌÌÌÌÌḬ̀�ùç~�‘ãØÿÿƒú0w@H� hHc‘HÊÿⰠÃùOƒùt ƒùtƒùu/ÃùPt ƒùmt!�ù·u° Ã1ÀÃ�ùèt �ùãu° ððð ððððððÃ�¸ÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿ¡ÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿêÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿçÿÿÿíÿÿÿðÿÿÿçÿÿÿçÿÿÿçÿÿÿóÿÿÿöÿÿÿçÿÿÿçÿÿÿùÿÿÿçÿÿÿçÿÿÿáÿÿÿüÿÿÿÌÌÌÌÌÌÌÌUAWAVAUATVWSHƒìhH�l$`HÇEþÿÿÿI‰ÏIÐH‰UÈL‰EÐfÇEØH�MàH�UÈè‚ÿÿH‹}àH‹uðH�w1ÉH‰ú�H‰ØH)ÐHƒøv)H�fƒ:t>fƒzt7fƒzt0HƒÁfƒzH�RuÍëH�6€H9Ê„fƒ<H�Iuì¹,ºè� ÿÿH…À„¯H‰Ãà·@É·@®·¹ºèR ÿÿH…À„cH‰ÆH‰HÇ@,HÇ@,¹ºè$ ÿÿH…À„5H‰0H� Q§H‰HÆ@ ŠMΈH·MÌf‰H‹MȉHŠMΈMþ·MÌf‰Mü‹MȉMøAÆGŠMþAˆO·MüfA‰O ‹MøA‰O I‰GIÇH‹UèH…ÒtHÒA¸H‰ùè° ÿÿL‰øHƒÄh[_^A\A]A^A_]ÃH9uèuRI‰õIƒÅ‚µI9ÕL‰ëHBÚE1äH‰ØHØ“ÀI‰ÞIÞ‚“AˆÄMäH…öt!A¸H‰ùM‰ñè[ ÿÿH…ÀuëwHƒÆI‰õëL‰ñL‰âè ÿÿH…Àt^H‰EàH‰]èH�pfÇL‰mðM‰oH‹EàI‰GH‹EèI‰GIÇéFÿÿÿ¹ºèg1 ¹,ºèV1 èÿ* L‰ñL‰âèB1 H‰T$UAWAVAUATVWSHƒì(H�j`H�MàèŽÿÿ�HƒÄ([_^A\A]A^A_]ÃÌÌÌÌÌÌÌÌÌÌÌÌHƒì(¹xèÿŽ1ÀHƒÄ(ÃÌÌÌÌÌÌÌÌÌÌÌUHƒì0H�l$0HÇEøþÿÿÿH� ¶L�øµº!è6Ûÿÿ @H‰T$UHƒì H�j0  ÌÌÌÌÌÌÌÌÌÌÌÌÌÌUHƒì0H�l$0HÇEøþÿÿÿH� ǵL�øµº!èæÚÿÿ @H‰T$UHƒì H�j0  ÌÌÌÌÌÌÌÌÌÌÌÌÌÌUHƒì0H�l$0HÇEøþÿÿÿH� ßµL�Àµºè–Úÿÿ @H‰T$UHƒì H�j0  ÌÌÌÌÌÌÌÌÌÌÌÌÌÌUHƒì0H�l$0HÇEøþÿÿÿH� �µL�¸µºèFÚÿÿ @H‰T$UHƒì H�j0  ÌÌÌÌÌÌÌÌÌÌÌÌÌÌUHƒì0H�l$0HÇEøþÿÿÿH� ?µL�˜µºèöÙÿÿ @H‰T$UHƒì H�j0  ÌÌÌÌÌÌÌÌÌÌÌÌÌÌUHƒì0H�l$0HÇEøþÿÿÿH� ï´L�xµºè¦Ùÿÿ @H‰T$UHƒì H�j0  ÌÌÌÌÌÌÌÌÌÌÌÌÌÌUHƒìPH�l$PHÇEðþÿÿÿL‰MÐL‰EØH‰ÈH‰ÑÿÐ1ÀHƒÄP]ÃH‹EØH‹MàH‰H‹EÐH‹MèH‰¸ëÝf„H‰T$UHƒì H�jPH‹EøH‹H‰MàH‹@H‰EèH�²ÿÿÿHƒÄ ]ÃÌÌHƒì8H‹H‹QH‰ÁÿRH‰D$(H‰T$0H�D$(H‰D$ H�8'H� ÷þÿ)ȇñ(H�.')ȇ'H�;')ȇ'H�À(H�A')ȇ'H�J')ȇ'H�L$ 賌¸ÿÿÿÿHƒÄ8ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌHƒì(L‹H‹AL‹ E1ÀL‰ÑH‰Âè”E ÌÌH�ìˆH�z´H‰D$(HÇD$0+ˆL$'H�D$(H‰D$8H�o ÿÿH‰D$@H�D$'H‰D$HH�YqH‰D$PH�mµH‰D$XHÇD$`H�xµH‰D$hHÇD$pH�D$8H‰D$xHÇ„$€H�åµH�L$XèÓ2 ÌAWAVAUATVWUSH�ìøM‰ÄI‰ÖH‰Œ$èHÇD$ L� ¿µH�L$pèµ8Hƒ¼$�L‰t$(…KL‰d$0H‹¼$ÈH‹„$ˆL�HÿL‹d$pL‹D$xL‹¬$€H‹¬$¸H�(HƒÂÿHƒÿÿ„fL9ƒ>L‹”$°L‹œ$˜H‹Œ$¨I‰ÇH‰L$hI)ÏM‰ÞI÷Þf.„A¶ I£ÊsEL9ßH‰þIBóH�.€H9Æs;L9ƒƒA¶\5HƒÆH�JA:H‰ÊtÛLñ1ÿH‰Íëa�HÅ1ÿëYf„L‰Úf.„H9׃œHƒÂÿH9ƒ‰H�4*L9ƃ…A¶LA: 4tÑHl$hL‰ÿf„I�)L9‚CÿÿÿH‰¼$Èé4DŠŒ$¨L‹¼$˜H‹D$pL‹T$xN�ë fDIÏD‰ËE„ÉA”ÁH‰D$XL‰T$`L‰¼$ðL‰T$8M…ÿtM9út†¤B€<8¿Ž™J� 8L9Át8B¶8¶ò@„öy0J� 8HƒÁL9ÁtmN�8A¶{IƒÃƒç?ë`f.„f�¾„Û…É�þ„é¹�þ€‚Vÿÿÿ¹�þ‚Eÿÿÿ�þ¹HƒÙé1ÿÿÿ1ÿM‰Ã‰ñƒá@€þàrM9ÃtA¶3IƒÃƒæ?ë Áá Ïë31öM‰ÃÁç ÷€úðrM9ÃtA¶ƒâ?ë Áá Ïë1ÒƒáÁáÁç Ï ×‰þ„Û„XÿÿÿéL9ƒØL‹”$°H‹¼$˜H‹œ$¨M�4H‰úf.„H…ÒtlHƒÂÿH9ƒ=J�4:L9ƃ9A¶LA: 4tÕIßL‰ýI�)L9‚bÿÿÿH‰¬$¸L‹t$(L‹d$0é]HèH‰„$¸HÇ„$ÈI‰ïë LøH‰„$¸L‹t$(L‹d$0L‰øL‰t$@L‰d$HL‰d$XHƒÀH‰D$8tL9àtƒü A€<¿Žñ LðK�4&H9ð„¼H�P¶¶ù@„ÿxH‰Ðé€H9òt ¶PHƒÀƒâ?ë1ÒH‰ð‰ûƒã@€ÿàrH9ðt¶8HƒÀƒç?ë Áãë#1ÿH‰ðÁâ ú€ùðrH9ðt¶HƒÀƒá?ëÁã Ú‰×ë1ÉH‰ðƒãÁãÁâ Ú Ê‰×�út(�O¿ƒù‚Tÿÿÿƒÿ0rAƒÿ:‚Fÿÿÿƒÿ@„=ÿÿÿë-L‰t$pL‰d$xL‰|$@M…ÿtM9çtƒC C€<>¿Ž8 M‰üHÇD$ L� ¤°H�L$pL‰òM‰àèŽ3Hƒ¼$�…[L‰d$0H‹„$ˆL‹¼$ÀM‰ùI)ÁHƒ¼$ÈÿL‹d$pL‹D$xH‹¬$€„~M9Áƒ–L‹¬$°L‹”$ L‹œ$¨H‹¼$ÐM‰ÖI÷Ö@C¶ I£ÍseH‰ùH÷ÑL9ñIFÎHÇÂþÿÿÿH)ÊK� f.„HƒúÿtJH9ƒp I�4L9ƃª ¶\H�rÿ:H‰òtÓM÷I÷IƒÇH‰Çëd@H‰ÇM‰ÏëX„L‰Òf.„H9úƒçH9ƒˆ I�4L9ƃŒ ¶\H�r:H‰òtÐM)ßL‰ßf.„M‰ùI)ÁM9Á‚!ÿÿÿH‰¼$ÐésDŠ”$©L‹Œ$ H‹D$pH‹l$xë „I)ÑD‰ÒE„ÒA”ÂH‰D$@H‰l$HL‰L$XM…ÉtL9Ít†© B€<¿Žž M…ÉtTB¶Lÿ„ÉxZ¶É„Ò…C�ù„Ϻ�ù€r–º�ùr‰�ùºHƒÚéuÿÿÿD¹„Òt¸éöf�J�<HƒÇÿH9øt@J�4¶~þ‰û€ãÀ€û€u2H�^þH9Øt.D¶FýD‰Ã€ãÀ€û€u#H�^ýH9Øt ¶vüƒæÁæë1ÿë#ƒçëE1ÀëAƒàë 1öAƒà?A ðAÁàƒç?D ÇÁç€á?¶É ù„Ò„*ÿÿÿéhL�õ¬E1ÿé•M9ÁƒL‹¬$°H‹¼$ H‹Œ$¨H‰Œ$àH�OÿH‰L$hI� J�H‰ù€H9ÁsmL9ƒ ¶\ HƒÁH�rA:H‰òtÜL+¼$à@M‰ùI)ÁM9Á‚AÿÿÿL‰¼$ÀL‹t$(L�Å«E1ÿL‹d$0é`L‰Œ$ÀH‰„$ÐëL‰Œ$ÀL‹t$(L‹d$0IƒÁtM9Ìt†ÒC€<¿ŽÇO�M‰çM)Ï„K�&L�]«Iº?L‰Å„H�M¶E¶ø@„ÿxH‰Í鈄H9Ñt ¶]HƒÅƒã?ë1ÛH‰Õ‰þƒæ@€ÿàrH9Õt¶}HƒÅƒç?ë Áæë#1ÿH‰ÕÁã û<ðrH9Õt¶EHƒÅƒà?ëÁæ ó‰ßë1ÀH‰ÕƒæÁæÁã ó Éß�ûtLf��G߃ør4�GЃø r,‰øƒà߃À¿ƒør�G¥ƒø#w I£ÂrDƒÇƃÿƒâH9Õ…ÿÿÿëE1ÿM‰ÃM‰ÌIƒüL‰d$0L‰œ$ØvCA€~À|FH�«I9ÆtA·5_ZA¶NƒñNf Áu$CŠD&ÿ¶È„ɈìƒùEuéwIƒü…ÀA€~ÀŒoH�ɪI9ÆtA·=ZN…TCŠD&ÿ¶È„ÉxDƒùE…?I�L$ÿL‰t$@L‰d$HHÇD$8H‰L$X<¿ŽºM�^M�L$ýé-E1ÿé*ÿÿÿK�&HƒÂÿI9Ö„£K�<&¶Wþ‰Ó€ãÀ€û€…‘H�oþI9¶oý‰ë€ãÀ€û€…ŠH�_ýI9Þ„‘¶_üƒãÁãé„K�&HƒÂÿI9ÖtNK�<&¶Wþ‰Ó€ãÀ€û€uCH�oþI9îtK¶oý‰ë€ãÀ€û€uDH�_ýI9Þ„2¶_üƒãÁãé%1Òë;ƒâë61Òé"ƒâé1íëƒåë1íéƒåéú1Ûƒå? ÝÁåƒâ? êÁâƒá? уùE„ÁþÿÿIƒü†<A€~ÀŒ1H�G©I9Æt A�>__ZN…CŠD&ÿ¶È„Éx<ƒùE…I�L$ÿL‰t$@L‰d$HHÇD$8H‰L$X<¿Ž8M�^M�L$ûé«K�&HƒÂÿI9Öt>K�<&¶Wþ‰Ó€ãÀ€û€u0H�oþI9ît,¶oý‰ë€ãÀ€û€u"H�_ýI9Þtq¶_üƒãÁãëg1Òëpƒâëk1íë_ƒåëZ1Ûƒå? ÝÁåƒâ? êÁâƒá? уùE…“ýÿÿI�L$ÿL‰t$@L‰d$HHÇD$8H‰L$X<¿ŽˆM�^M�L$üAµë)1Ûƒå? ÝÁåƒâ? êÁâƒá? уùE„ýþÿÿE1íM‰áM‰óO�$ 1ÀL‰ÙL‰ÚL‰|$hfDL‰åH)ÕHƒýv3€9ˆl€yˆb€yˆXH�QHƒÀü€yH‰ÑyÆéBH÷Øf.„@I9ÁtI� HƒÀ€9yîéE„í„E1ÿA¾ L‰Þ@1Àf.„@H‰ÁºL9æ„ÜH�FD¶E¶ÐE„ÒxH‰Æé–fDL9àt ¶FHƒÆƒà?ë1ÀL‰æD‰ÕƒåA€úàrL9æt¶>HƒÆƒç?H‰óë Áåë'1ÿL‰ãÁà øA€øðrL9ãt¶;HƒÃƒç?H‰Þë Áå èA‰Âë&1ÿƒåÁåÁà è øA‰Â=t:f.„A�BЃø ‡óH‰ÈI÷æºpD‰ÕHƒÅÐHèƒÿÿÿE1íH…É„W1À„�ú…”L9æ„»H�V¶„ÛxH‰Öé€L9ât)¶nHƒÆƒå?€ûàrkL9æt ¶HƒÆƒâ?H‰÷€ûðsëR1íL‰æ€ûàsÝëF1ÒL‰ç€ûðr<¶ÛÁå êL9çt¶/HƒÇƒå?H‰þë1íƒãÁãÁâ Ú êf„�út+HƒÀºH9Á…Fÿÿÿë@D‰ÒH…É…*ÿÿÿëf�L‰æ1ÒH9È”ÀtE1íˆÂI×AöÅ…þÿÿëE1íE1ÿA€åH‹„$èH‹L$(H‰H‹L$0H‰HL‰XL‰HH‹Œ$ØH‰H H‹L$hH‰H(Dˆh8L‰x0H�Äø[]_^A\A]A^A_Ã�ú…‰L9æt!DŠA¶Ð„ÒyyH�FL9àt¶FHƒÆƒà?ë ºë\1ÀL‰æ‰Ñƒá€úàrL9æt¶HƒÆƒâ?ë Áá Èë31ÒL‰æÁà ÐA€øðr L9æt¶ƒâ?ë Áá Èë1ÒƒáÁáÁà È Ð‰Â�úA”ÅéÿÿÿH� è¢è³  H� "£ëyH�D$XH‰D$@H�„$ðH‰D$HH�D$8H‰D$PH�L$@èÿÿ H�L$@H�T$Xèlíÿÿ H� ó¢ëCH� ¢¢ë)H� ±¢ë1LÏI�:HƒÂÿH� Í¢è8  H� ×¢I‰Àè'  H� Þ¢H‰òè  H� ꢏ  H�D$@H‰D$pH�D$8H‰D$xH�D$XH‰„$€H�L$pè{ÿÿ E1ÀL‰ñL‰âè{2 H�L$pH�T$@èºìÿÿ ÌÌÌÌÌÌÌÌAWAVAUATVWUSH�ì˜H‰Ð€y8„^H‰D$`H‰L$xH‹A0H‰„$€H…À„KH‹D$xH‹HH‰Œ$ˆH‹@H‰D$p1ÀH‰D$hH‹D$hI‰ÁL‹´$ˆH‹D$pH…À„`I�IH‰L$hM�,L�@ÿ1ÉE1äf.„f�C¶&¶Ó„Ò‰€1öL‰ïM9àtK�<&HƒÇC¶t&ƒæ?‰Õƒå€úàrL9ït¶HƒÇƒâ?ë Áåë1ÒL‰ïÁæ Ö€ûðr L9ït¶ƒâ?ë Áå î‰òë 1ÒƒåÁåÁæ î Ö‰ò�þ„±O�,&H�<ƒÂЃú sPL‰l$(H‰|$0HÇD$8H‰|$@HƒÿtH…ÿ„MC€|&¿ŽAIýIƒÄHƒÁÿL9à…ÿÿÿéR@L‰t$HH‰D$PL‰d$(L9àtM…ätL9à†:C€<&¿Ž/L‰Œ$�H�L$HL‰òM‰àè+\€|$H„L‹|$PH‹T$pL)úL‰l$(H‰|$0L‰|$8H‰|$@M…ÿ”ÁL)â”ÀÈ<u K� >ë€L9ÿ†‹K� >A€< ¿Ž|LáH‰Œ$ˆH‰T$pL‰l$HH‰|$PL‰|$(„ÀuL9ÿ†ˆK�>A€<¿ŽyH‹L$`è“PH‹L$hH;Œ$€…„À„M…ÿ„ÿO�>MàCŠ&¶Ê„Éxƒùh„›éß1ÀL‰ÅIƒÿtK�,&HƒÅC¶D&ƒà?‰Ëƒã€ùàrH‰éL)ùL)ñL9át¶MHƒÅƒá?ë Áãë)1ÉL‰ÅÁà È€úðrH‰éL)ùL)ñL9át¶Mƒá?ëÁã Ø‰Áƒùh…cë1ɃãÁãÁà Ø ȃøh…IL‰l$(L‰|$0HÇD$8L‰|$@Iƒÿ„K�&HƒÂ€:¿Ž*L‰ùH÷ÙL‰÷H÷ßf.„¶¶ë@„íxHƒÂé¬f.„f�H� HøHƒÀL9àt ¶BHƒÂƒà?ë1ÀL‰Â‰îƒæ@€ýàrH�, HýL9åt¶*HƒÂƒå?ë Áæë*1íL‰ÂÁà è€ûðrH�, HýL9åt¶*HƒÂƒå?ëÁæ ð‰Åë&1íL‰ÂƒæÁæÁà ð è‰Å=„1€�EЃø r!�]Ÿ¸©ÿÿÿƒûr �]¿¸ÉÿÿÿƒûwŃýwH� HøL9à…ÿÿÿéì f�Hƒ¼$�tA¸H‹L$`H�´žèîM„À…ž Iƒÿu`H�œžL)ðL9àtC·&=_$…ÁL‰l$(L‰|$0HÇD$8L‰|$@A€}¿Ž¢ IƒÇÿO�,&IƒÅé�f.„Iƒÿr C€|&À|rë�M…ÿ„ö A¿ë_A¸H‹L$`H�cžéžA¸H‹L$`H�Ržé A¸H‹L$`H�AžépA¸H‹L$`H�0žéå O�/AŠU¶ê‰é@„íˆjƒù.„‘„Òˆ9ƒý$…ßIƒÿ…~H�…�I9Å„ŽA�}$SP$„€Iƒÿt A€}ÀŒ`H�[�I9Å„ A�}$BP$„ò Iƒÿt A€}ÀŒ1H�1�I9Å„ê A�}$RF$„Ü Iƒÿt A€}ÀŒH��I9Å„é A�}$LT$„Û Iƒÿt A€}ÀŒÓH�ÝœI9Å„ü A�}$GT$„î Iƒÿt A€}ÀŒ¤H�³œI9Å„ø A�}$LP$„ê IƒÿtA€}À|yH��œI9Åt A�}$RP$ucA¸H‹L$`H�pœé 1ÉL‰ÀIƒÿt I�EA¶Mƒá?‰ëƒã@€ýàrL9ÀtH¶8HƒÀƒç?ëAÁãë]IƒÿrgA€}À�qþÿÿA€}ÀŒ¶1öëZA¸H‹L$`H�à›éP 1ÿL‰ÀÁá ù€úðrL9À„‘¶ƒà?éˆÁã Ùƒù.…ÿýÿÿé‹@¶Iƒÿ…r L‰l$HL‰|$PHÇD$(@„öuIƒÿ‚è A€}¿ŽÝ H�ƒ›I9Å„wA·E5$CA¶Mƒñ$f Á„\@¶IƒÿtIƒÿ‚ A€}ÀŒü 1öL‰l$HL‰|$PHÇD$(@„öu A€}¿Žo H�›I9Å„gA‹E¹$u7e1ÈA¶Mƒñ$ Á„L@·@„öu A€}ÀŒ™ 1ÿL‰l$HL‰|$PHÇD$(@„ÿu A€}¿Ž H�¼šI9Å„�A‹E¹$u201ÈA¶Mƒñ$ Á„u@¶@„ÿu A€}ÀŒ6 1öL‰l$HL‰|$PHÇD$(@„öu A€}¿Ž© H�_šI9Å„A‹E¹$u271ÈA¶Mƒñ$ Á„ë@·@„öu A€}ÀŒÓ1ÿL‰l$HL‰|$PHÇD$(@„ÿu A€}¿ŽF H�šI9Å„ÎA‹E¹$u3d1ÈA¶Mƒñ$ Á„³@¶@„ÿu A€}ÀŒp1öL‰l$HL‰|$PHÇD$(@„öu A€}¿ŽãH�¥™I9Å„‚A‹E¹$u5b1ÈA¶Mƒñ$ Á„g@·@„öu A€}ÀŒ 1ÿL‰l$HL‰|$PHÇD$(@„ÿu A€}¿Ž€H�H™I9Å„JA‹E¹$u5d1ÈA¶Mƒñ$ Á„/@¶@„ÿu A€}ÀŒª1öL‰l$HL‰|$PHÇD$(@„öu A€}¿ŽH�ë˜I9Å„rúÿÿA‹E¹$u7b1ÈA¶Mƒñ$ Á„Wúÿÿ@·@„öu A€}ÀŒG1ÿL‰l$HL‰|$PHÇD$(@„ÿu A€}¿ŽºH�Ž˜I9Å„&úÿÿA‹E¹$u7d1ÈA¶Mƒñ$ Á„ úÿÿ@¶@„ÿu A€}ÀŒä1öL‰l$HL‰|$PHÇD$(@„öu A€}¿ŽWH�1˜I9Å„ÚùÿÿA‹E¹$u3b1ÈA¶Mƒñ$ Á„¿ùÿÿ@·@„öu A€}ÀŒ�1ÿL‰l$HL‰|$PHÇD$(@„ÿu A€}¿ŽôH�Ô—I9Å„ŽùÿÿA‹E¹$u2b1ÈA¶Mƒñ$ Á„sùÿÿ@¶@„ÿu A€}ÀŒ1öL‰l$HL‰|$PHÇD$(@„öu A€}¿Ž‘H�w—I9ÅtA‹E¹$u221ÈA¶Mƒñ$ Á…ÒA¸H‹L$`H�J—ëpA¸H‹L$`H�ô–èF„À…³L‰l$(L‰|$0HÇD$8L‰|$@@„öuIƒÿ‚ØA€}¿ŽÍIƒÅIƒÇýé<A¸H‹L$`H�œ–è¥E„À…UL‰l$(L‰|$0HÇD$8L‰|$@IƒÅ@„ö…ŒA€}¿��él1ÀƒãÁãÁá Ù Áƒù.…°I�}L‰l$(L‰|$0HÇD$8L‰|$@Iƒÿt €?¿Ž)Iƒÿ„[AŠE¶Ð„Òˆ¦ƒú.…CA¸H‹L$`H�²•èìD„À…œL‰l$(IƒÅL‰|$0HÇD$8L‰|$@IƒÿtIƒÿ‚¼A€}¿ޱIƒÇþé$@‰Ñ€á1íL‰ÀIƒÿt I�EA¶mƒå?¶É€úàrL9ÀtU¶HƒÀƒã?ëNÁáëj1ÉL‰ÅIƒÿt I�mA¶Mƒá?‰Óƒã€úàrL9Å„é¶UHƒÅƒâ?éÞÁã ÙéN1ÛL‰ÀÁå Ý€úðrL9À„š¶ƒà?é‘Áá ̓ý$„!÷ÿÿ1ÀL‰éf.„f�I9È„ÉH‰ÅH�Q¶¶û@„ÿxƒÿ$ué°f.„�L9ÂtH�Q¶Aƒà?I‰Ñë1ÀM‰Á‰þƒæ@€ÿàrM9ÁtA¶9IƒÁƒç?L‰Êë Áæë'1ÿM‰ÁÁà ø€ûðrM9Át3A¶IƒÁƒã?L‰Êë%Áæ ð‰Çƒÿ$t6H‰èH)ÈHÐH‰Ñƒÿ.…Lÿÿÿë1ÛƒæÁæÁà ð Ø‰Ç=…IÿÿÿL‰ýL‰l$HL‰|$PH‰l$(H…í”ÀL‰ÿH)ï”ÃÃuI9ï†A€|-¿ŽH‹L$`L‰êI‰èèÄB„À…tL‰l$(L‰|$0H‰l$8L‰|$@„ÛuI9A€|-¿Ž“Iíé A¸H‹L$`H�D“é¯1ÀƒáÁáÁå Í Åƒý$„ˆõÿÿébþÿÿ1ÒL‰ÅÁá Ñ<ðrL9Åt]¶Eƒà?ëVÁã Ùë\A¸H‹L$`H�“èB„À…ÉL‰l$(L‰|$0HÇD$8L‰|$@IƒÅ@„ÿ„tüÿÿIƒÇûéc1ÀƒãÁãÁá Ù Á‰Êƒú.„Æüÿÿf„A¸H‹L$`H�s’è©A„À…YL‰l$(L‰|$0HÇD$8L‰|$@Iƒÿt €?¿Ž~IƒÇÿI‰ýéîA¸H‹L$`H�0’é–A¸H‹L$`H�C’é–ûÿÿA¸H‹L$`H�’ëkA¸H‹L$`H�’é÷þÿÿA¸H‹L$`H� ’éTûÿÿA¸H‹L$`H�Ê‘ë)A¸H‹L$`H�è‘éµþÿÿA¸H‹L$`H�¤‘è¼@„ÀupI�EL‰l$(L‰|$0HÇD$8L‰|$@Iƒÿt €8¿Ž‘IƒÇüI‰ÅfDL‰ÿI‰ÿH…ÿ…qóÿÿH‹D$hH;„$€‚îÿÿë6H‹L$`L‰êM‰øèL@„Àt×°H�Ę[]_^A\A]A^A_ÃH‹L‹AH‰ÁëH‹D$xH‹P L‹@(H‹L$`H�Ę[]_^A\A]A^A_éü?H�D$(H‰D$HH�D$8H‰D$PH�D$@H‰D$XH�L$Hètñþÿ H� KŽèf  H�L$HH�T$(èµÙÿÿ ŠL$IèÊÙÿÿ ÌÌÌÌÌÌÌÌH�ìˆH�z’H‰D$(HÇD$03H�D$(H‰D$8H�3åþÿH‰D$@H�D$ H‰D$HH�]VH‰D$PH�‘H‰D$XHÇD$`H�$‘H‰D$hHÇD$pH�D$8H‰D$xHÇ„$€H�‘‘H�L$Xè—  ÌÌÌÌÌHƒì(H‹ è41ÀHƒÄ(ÃÌÌÌÌÌÌÌÌÌÌÌÌÌHƒìhH‹H‰D$(JR )T$P)L$@)D$0H�ã�H�L$(L�D$0è$0�HƒÄhÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌHƒì(H‹ IÐèA1ÀHƒÄ(ÃÌÌÌÌÌÌÌÌÌÌHƒì(H� %‘è  ÌÌÌÌÌÌÌÌÌÌÌÌÌÌUAVVWSH�ì€H�¬$€HÇEøþÿÿÿH‰×I‰ÎL‹H‹JH‰ÈHÁàt#HƒÀðH‰ÃHÁë�SƒâHƒøps1ÛL‰ÀH…ÒuKëg1ÛHƒ(ueéƒH�rÿH)Þ1ÛL‰ÀHXHXHX(HX8HXHHXXHXhHXxHƒè€HƒÆuÖH…ÒtHƒÀH÷Úf.„HHƒÀHƒÂuóHƒ(t#H…É„¹Hƒûw I‹@H…ÀtHÛsH�uàë*H�uàH…Ût!ºH‰Ùè£ÞþÿH…ÀuºH‰Ùè! ¸1ÛH‰EàH‰]èHÇEðH�EàH‰EØOW )UÀ)M°)E H�2ŽH�MØL�E èu.„Àu H‹FI‰FAL‰ðH�Ä€[_^A^]Ãè,ýÿÿ H� kŽ1ÒE1Àè¹  €H‰T$UAVVWSHƒì H�ª€H�Màè�æþÿ�HƒÄ [_^A^]ÃÌÌÌÌÌUAWAVAUATVWSHƒìHH�l$@HÇEþÿÿÿL‰ÃH‰×I‰ÎM…Àt!ºH‰Ùè˜ÝþÿH…ÀuºH‰Ùè ¸H‰EèH‰]ðHÇEøL�,_1öI¿L�eèf.„�f…öuL9·HƒÇ‰Ø%ø=ØuM·Ó�úÜsKL9ïtn·HƒÇ‰Á�áüf¾�ùÜuZ�Ã(�€$·À·ÓÁâ ÂHÁâ Lúëf�·ÓHÁâ ëHÁâHƒÊ1ö1Ûfƒút-f…Òu:HÁê L‰áè¤é_ÿÿÿ1öL‰ï1ÀHÁâHƒÊ‰ÃfƒúuÓH‹EøI‰FEèAëIÇH‹UðH…ÒtH‹MèA¸èwÜþÿL‰ðHƒÄH[_^A\A]A^A_]ÃH‰T$UAWAVAUATVWSHƒì(H�j@H�MèèÎäþÿ�HƒÄ([_^A\A]A^A_]ÃÌÌÌÌÌÌÌÌÌÌÌÌVWSHƒì0‰×H‰Î�ú€sRH‹VH;VuyH‰ÓHƒÃ‚&H�H9ÃHBØH…Ò„íH‹A¸I‰ÙèàÛþÿH…À„éH‰H‰^H‹Vë4ÇD$,‰ø�ÿs-Áè$ ÀˆD$,@€ç?@€Ï€@ˆ|$-¸ëwH‹@ˆ<HƒFë~�ÿÿÿw,Áè $ àˆD$,‰øÁè$? €ˆD$-@€ç?@€Ï€@ˆ|$.¸ë5Áè ðˆD$,‰øÁè $? €ˆD$-‰øÁè$? €ˆD$.@€ç?@€Ï€@ˆ|$/¸L�IƒÀ,H�T$,H‰ñè]�HƒÄ0[_^úH‰Ùè×ÚþÿH…À…ÿÿÿºH‰ÙèQ èúúÿÿ ÌÌÌÌÌÌÌÌH‰ÈH‹JH‰HÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌAVVWSHƒì(L‰ÆI‰ÖH‰ÏH)ÖH‹QH‹YH‰ÐH)ØH9ðs(HórgH�H9ÃHBØH…ÒtH‹A¸I‰ÙèbÚþÿëH‹ë ºH‰Ùè.ÚþÿH‰ÁH…Àt1H‰H‰_H‹_H�3H‰GHÙL‰òI‰ðHƒÄ([_^A^é)_è7úÿÿ ºH‰Ùèx ÌÌÌÌÌÌAVVWSHƒì(L‰ÆI‰ÖH‰ÏM…Àt$ºH‰ñè¼ÙþÿH‰ÃH…ÀuºH‰ñè7 »H‰ÙL‰òI‰ðè¿^H‰H‰wH‰wH‰øHƒÄ([_^A^ÃÌÌÌÌÌÌÌÌÌÌHƒì(èG›ÿÿ ÌÌÌÌÌHƒìxH‰L$(HƒÁH�\EH‰D$0H‰L$8H‰D$@H‹J H‹R(H�þŒH‰D$HHÇD$PH�!‹H‰D$XHÇD$`H�D$(H‰D$hHÇD$pL�D$Hè)�HƒÄxÃÌÌÌÌÌÌÌÌH‹J H‹B(H‹@H�½ŒA¸ HÿàÌÌÌÌH‹J H‹B(H‹@H�¨ŒA¸HÿàÌÌÌÌAVVWSHƒìHA‰ÖH‰Î¸A�N÷ƒùwºtH�=gHc�HûÿãºnëcAƒþ\„H� ¢D‰òè.?„À…ŽA�þÿÿw>H�E˜H‰D$(HÇD$0<HÇD$ /H�¨–L� ñ–A¸(ëEºréÀA�þÿÿwWH�šH‰D$(HÇD$0}HÇD$ žH�™L� W™A¸!D‰ñèœ?„ÀuqD‰ðƒÈ½ÈƒñÁéƒñ¸ë`A�þïwÞA�†âýÿ=â rÐA�†ýÿ= rÂA�†^1ýÿƒør¶D‰ð%þÿ=¸t§A�†)Yýÿƒø)r›A�†ËHýÿƒø v�¸D‰ò‰‰VH‰ND‰vÆFŠD$GˆF·D$Ef‰FH‰ðHƒÄH[_^A^Ã�Ñÿÿÿ¢þÿÿ³þÿÿ³þÿÿÿÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿÎÿÿÿ³þÿÿ³þÿÿ³þÿÿ³þÿÿÎÿÿÿÌÌÌÌH‰Ê‹ Hƒùt9Hƒùt=¸Hƒùut¶JHƒÁÿHƒùwfH�ƒHc ˆHÁÿáÆB¸}ËBÇÃǸ\ÃD‹JL‹BD‰ÁÀá€áAÓéAƒáA�I0D‰ÈƒÀWA€ù BÁM…Àt'IƒÀÿL‰BÃÆB¸{ÃÆB¸uÃÆB¸\ÃÆBÆÿÿÿ¦ÿÿÿÝÿÿÿçÿÿÿñÿÿÿÌÌÌÌÌÌÌÌH‹H‹QÃÌÌÌÌÌÌÌÌH‹AÃÌÌÌÌÌÌÌÌÌÌÌH�AÃÌÌÌÌÌÌÌÌÌÌÌH‰È‹L$(H‰L‰@D‰H‰HÃÌÌÌÌÌÌÌÌÌÌ‹AÃÌÌÌÌÌÌÌÌÌÌÌÌ‹AÃÌÌÌÌÌÌÌÌÌÌÌÌH�ìˆH‰L$(H�AL�AH� eNH‰L$0H‰D$8H�dHH‰D$@L‰D$HH‰D$PH‹J H‹R(H�þ‰H‰D$XHÇD$`H�‰H‰D$hHÇD$pH�D$(H‰D$xHÇ„$€L�D$Xèó$�H�ĈÃÌÌÌÌÌÌÌÌÌÌHƒìxIH‹A D$PH�L$PH‰L$ HÇD$(HÇD$0H� y†H‰L$@HÇD$HL$`H‰D$pH�L$ H�T$`è’ H�ìˆH‰ÈH‰T$(L‰D$0H�L$0H‰L$8H� ‹HH‰L$@H�T$(H‰T$HH‰L$PH� p‰H‰L$XHÇD$`H� †H‰L$hHÇD$pH�L$8H‰L$xHÇ„$€H�L$XH‰Âè  ÌÌÌÌÌÌÌÌHƒìXH‹BH�®…H‰T$(H�rˆH‰T$0H‰L$8D$@H‰D$PH�L$(èä ÿÿ ÌÌHƒìxH‰L$(H‰T$0H�D$(H‰D$8H�‘LH‰D$@H�=‰H‰D$HHÇD$PH�È…H‰D$XHÇD$`H�D$8H‰D$hHÇD$pH�‰H�L$HèNÿÿÿ ÌÌÌÌÌÌÌÌÌÌÌÌAVVWSHƒì(‰ÐƒàE1ÒH…À„ÅA»I)ĶM9ÃMGØN�1ÀH‰ÖE1É@L‰×H)÷HƒÿvYH�4¶1ÿ8Ë@•ÇIù8Ëtp¶^1ÿ8Ë@•ÇIù8Ët]¶^1ÿ8Ë@•ÇIù8ËtJ¶^1ÿ8Ë@•ÇIùHƒÆHƒÀ8Ëu�ë-¾L)ÎI9Ãt'HƒÆÿ8 H�@uî”ÀD¶ÈAƒáI)ñ¸é3M‰ÚIƒør|M�pðM9òws¶ÙH¾H¯óI¹ÿþþþþþþþI»€€€€€€€€f.„J‹<H1÷H‰ûH÷ÓLÏH!ßJ‹\H1óH‰ØH÷ÐLËH!ÃH ûL…Ûu IƒÂM9òvÈM9‡ÂJ�4N�E1ÉL‰Ð�L‰ßH)÷HƒÿvYH�4¶1ÿ8Ë@•ÇIù8Ëtu¶^1ÿ8Ë@•ÇIù8Ëtb¶^1ÿ8Ë@•ÇIù8ËtO¶^1ÿ8Ë@•ÇIùHƒÆHƒÀ8Ëu�ë2I÷Ù„I9Àt7IƒÁÿ8 H�@uî”À¶ÀƒàL)ÈHƒÀÿI‰Á¸MÑL‰ÊHƒÄ([_^A^ÃI÷Ù1ÀëéL‰ÑL‰Âè‚ AWAVVWSHƒì ‰ÐƒàA¾I)ÆH…ÀLDðD‰ÀD)ðƒàE1ÛM9ÆMGðLFØM‰ÁM)Ù‚�N�< J�I‰ÂM)úJ�HƒÃü1öDL)øHƒøv'8L3tD8L3tG8L3tJH�3H�~ü8 3H‰þuÕIúë8 0H�vÿuòIòëIòIƒÂÿëIòIƒÂþëIòIƒÂýMʸL‰ÒHƒÄ [_^A^A_öÙH¸H¯ÃI¿ÿþþþþþþþIº€€€€€€€€„M‰ËM9ñv4M�KðJ‹\ðH1ÃH‰ÞH÷ÖLûH!óJ‹tøH1ÆH‰÷H÷×LþH!þH ÞL…ÖtÄM9Ljf.„�IƒûvJ�8Hÿt=8Hþt>8Hýt?IƒÃü8HüuÞë81Àf.„M‰ÚIÂt1H�HƒÀÿA8LÿuéIÃëIƒÃÿë IƒÃþëIƒÃý¸M‰Úé ÿÿÿ1ÀéÿÿÿL‰ÉL‰Âè¥ L‰ÙL‰Âè ÌÌÌÌÌÌH�ìˆH‰L$(H‰T$0H�D$(H‰D$8H�CH‰D$@H�L$0H‰L$HH‰D$PH�û„H‰D$XHÇD$`H�–€H‰D$hHÇD$pH�D$8H‰D$xHÇ„$€H�Û„H�L$Xè™úÿÿ ÌÌÌÌÌÌÌH�ìˆH‰L$(H‰T$0H�D$(H‰D$8H�ŽBH‰D$@H�L$0H‰L$HH‰D$PH�Ë„H‰D$XHÇD$`H�€H‰D$hHÇD$pH�D$8H‰D$xHÇ„$€H�«„H�L$Xè úÿÿ ÌÌÌÌÌÌÌHƒì(H� Õ„èùÿÿ ÌÌÌÌÌÌÌÌÌÌÌÌÌÌAWAVAUATVWUSHƒìhf)|$Pft$@M‰ÏI‰ÒH‰ÈL‹´$ÐM…ötIƒþu;1ÛM‰ôL‰ñE1íéBL‰L‰@L‰xfWÀf@HÇ@(L‰@0fÇ@8éà¿1É1Û¾1íA¼€H�+L9òƒA¶A8?sH�.HƒÂI‰ÔI)Ü1íë5fDuHƒÅL9åH‰ïHDùHEéH‰êHòH‰ýë�H�VA¼1íH‰óH�<*H‰ÖL9÷r•½E1ÉE1í¾1ÿ¹f.„@J�/L9òƒqA¶A8/vH�>HƒÂH‰ÑL)é1ÿë4fDuHƒÇH9ÏH‰ýIDéIEùH‰úHòH‰ïë�H�V¹1ÿI‰õH�,:H‰ÖL9õr–L9ëLFáLGëM9õ‡&L‰âLê‚L‰T$0L‰D$8H‰D$(L9ò‡K�'M…ätBL‰ùH‰ÚM‰èèQ…Àt0M‰ôM)ìM9ìMBåIƒþƒÉ1ÒL‰ûH‹D$(H‹t$8L‹T$0鸾E1À1ÿ¹E1É�H�9L9ðƒ‰H‰ÈH÷ÐL‰òH)úHÂL9òƒbH‰øH÷ÐLðL)ÈL9ðƒVH�iA¶A8sH�,HƒÅH‰îL)Î1ÿë/DuHƒÇH9÷H‰øIDÀIEøH‰ýHÍH‰Çë �¾1ÿI‰ÉH‰éL9æ…jÿÿÿ½E1À1ö¹E1Ò„H�1L9ðƒ‰H‰ÈH÷ÐL‰òH)òHÂL9òƒ²H‰ðH÷ÐLðL)ÐL9ðƒ¦H�yA¶A8vH�<HƒÇH‰ýL)Õ1öë/DuHƒÆH9îH‰ðIDÀIEðH‰÷HÏH‰Æë �½1öI‰ÊH‰ùL9å…jÿÿÿM9ÊMBÑM9ô‡bM‰ñM)ÑM…ätIƒüH‹t$8L‹T$0ƒe1ÒL‰ùéZ1ÿL‰ñ1ÒE1äH‹D$(H‹t$8L‹T$0é[L‰óHƒãüH�küH‰éHÁé�QƒâH…íH‹D$(H‹t$8L‹T$0„�H�jÿH)ÍfWÀ1Éfo~{fÛf{fo~{fWÉf.„A¶|fHnçA¶<fHnïflìA¶|fHnçA¶|fHn÷flôfÛêfÛòfoûfóýfpíNfoãfóåòçfVàfoÃfóÆfpöNfoëfóîòèfVéA¶|fHnÇA¶|fHnÏflÈA¶|fHnÇA¶|fHn÷fÛÊfoûfóùflðfpÉNfoÃfóÁfÛòòÇfoûfóþfVÄfpæNfoËfóÌòÏfVÍHƒÁHƒÅ…ÿÿÿH…Ò„‰A¶TfHnÒA¶TfHnÚflÚfoI‹]H÷Ó1ÉL‰÷M‰òf.„f�H�WD¶A¶ó@„öxH‰×HƒÃ…¼éÕf.„L9Êt¶GHƒÇƒà?I‰üë1ÀH‰×M‰Ì‰òƒâ@€þàrM9ÌtA¶4$IƒÄƒæ?L‰çë Áâë)1öM‰ÌÁà ðA€ûðrM9Ìt#A¶4$IƒÄƒæ?L‰çëÁâ ЉÆHƒÃu4éM1öƒâÁâÁà Ð ð‰Æ=„zf„HƒÃ„L)ÑHùI‰úI9ù…ÿÿÿéPE1ÿM…À„MM…ÿt I�GÿE‰øAƒàHƒøs1ÒL‰ñM…Àutéš1Òé“L‰ÇL)ÿ1ÒL‰ñf.„f�¶¶A€ãÀ1ö€û€@”ÆHÖ$À1Ò<€”ÂHò¶A$À1Û<€”ÃHÓ¶AHƒÁ$À1Ò<€”ÂHÚHƒÇu´M…Àt+1Àf.„¶€ãÀ1ÿ€û€@”ÇHúHƒÀI9ÀuäL‰øH)ÐM‹EL9Àƒ{M…ÿtVI�OÿE‰ùAƒáHƒùsL1ÿL‰òM…É…¢éÁ�þ„=H…ÉtL9ùtL9ùƒA€<ÀŒL‰ðé 1ÿéˆL‰ÉL)ù1ÿL‰ò@¶¶Z$À1ö<€@”ÆHþ€ãÀ1À€û€”ÀHð¶Z€ãÀ1ö€û€@”ÆHƶBHƒÂ$À1ÿ<€@”ÇH÷HƒÁu°M…Ét$1Éf„¶ $À1Û<€”ÃHßHƒÁI9ÉuçL)ÿAŠUX¹€út‰ÑLÇ„Ét €ùt E1äëI‰ü1ÿëH‰øHÑèHƒÇHÑïI‰üH‰ÇÇD$,A‹ETƒøwˆD$,»錉Á=ÿwÁé€á€ÉÀˆL$,$? €ˆD$-»ëg=ÿÿw+Áé €á€ÉàˆL$,‰ÁÁé€á?€É€ˆL$-$? €ˆD$.»ë5Áé€ÉðˆL$,‰ÁÁé €á?€É€ˆL$-‰ÁÁé€á?€É€ˆL$.$? €ˆD$/»HÇÆÿÿÿÿ€HƒÆH9þsI‹M I‹E(H�T$,I‰ØÿP„ÀtàëLI‹M I‹E(L‰òM‰øÿP„Àu7HÇÆÿÿÿÿH�|$,f.„HƒÆL9æs'I‹M I‹E(H‰úI‰ØÿP„Àtâ°HƒÄ0[_^A\A]A^A_Ã1Àëì1ÀH…ÀLEùLEðM…À…³üÿÿI‹M I‹E(H‹@L‰òM‰øHƒÄ0[_^A\A]A^A_HÿàÌÌH‹A H‹I(L‹IH‰ÁIÿáÌÌÌÌÌÌÌÌÌÌÌÌÌÌHƒìXH‹A L‹I(JR )T$@)L$0)D$ L�D$ H‰ÁL‰Êè*ñÿÿ�HƒÄXÃÌÌÌÌŠAP$ÀèÃÌÌÌÌÌÌÌŠAP$ÀèÃÌÌÌÌÌÌÌŠAP$ ÀèÃÌÌÌÌÌÌÌVWHƒì(H‰ÖH‰ÏH‹J H‹B(L‰ÂM‰ÈÿPH‰7ˆGÆG H‰øHƒÄ(_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌVWSHƒì L‰ÎH‰×H‰ËH‹J H‹B(L‰ÂM‰ÈÿPH…öH‰;ˆCHÇC”CH‰ØHƒÄ [_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌVWHƒìXH‰ÖH‰ÏH‹J H‹R(H�=]H‰D$(HÇD$0HÇD$8H�÷QH‰D$HHÇD$PL�D$(èðÿÿH‰7ˆGÆG H‰øHƒÄX_^ÃÌÌÌÌÌÌÌÌÌÌÌH‹A H‹I(L‹A H‰ÁIÿàÌÌÌÌÌÌÌÌÌÌÌÌÌÌAWAVAUATVWUSH�ì¨L‰ÆH‰ÓI‰ÎI‹H I‹@(º"ÿP „À…EH…Û„H‰t$8H‰\$0I�1ÿM‰ôE1íL‰t$(H‰\$@L‰æI�L$AŠ$¶ê@„íx I‰Ìé¤@I‰ðH9ÙtA¶D$IƒÄƒà?L‰æë1ÀI‰ÌH‰Þ‰éƒá@€ýàrH9Þt¶.HƒÆƒå?I‰ôë Ááë&1íH‰ÞÁà è€úðrH9Þt ¶HƒÆƒâ?I‰ôëÁá ȉÅL‹t$(L‰Æë&1ÒL‹t$(L‰ÆƒáÁáÁà È Ð‰Å=„ f�H�L$P‰êèÔÅÿÿD‹|$PIƒÿ„ÙIƒÿ„»H‰t$hL‰´$€H‹D$0H‰„$ˆH‰|$pL‰l$xM‰èI)ø‚MH…ÿtH9Çtƒ=A€<>¿Ž2M…ítI9Åtƒ"C€<.¿ŽL÷H‹D$8H‹H H‰ÃH‹@(H‰úÿP„À…­‹|$TH‹t$X‹D$`‰D$LDŠt$dAƒÿthº\AƒÿtMAƒÿ…ÃA€ÆÿA€þ‡µA¿A¶ÆH� àHc�HÈA¶ÿàº}E1öë+f.„@A¿ë„E1ÿ‰ú�ÿtcH‹K H‹C(ÿP „À„rÿÿÿéA¶ºuëÞ‰ñÀá€á‹D$LÓèƒà�H0‰ÂƒÂW< BÑH�FÿH…ö”ÁHEðA¶A(ÎëªA¶º{ë ¿�ý€r¿�ýr�ý¿HƒßLïL‹t$(H‹\$@H‹t$hë¶D$dHD$XHƒø…1þÿÿH‹\$@I)õMåL9ã…8ýÿÿH…ÿ„…H‹\$0H9ßH‹t$8tsA€<>¿L‰ñH‰ÚI‰øI‰Ùè¦Úÿÿ 1ÿIþH)ûH‹N H‹F(L‰òI‰ØÿP„Àt°H�Ĩ[]_^A\A]A^A_ÃH‹N H‹F(H‹@ º"H�Ĩ[]_^A\A]A^A_HÿàH‹t$8H‹\$0ëœH�„$€H‰„$�H�D$pH‰„$˜H�D$xH‰„$ H�Œ$�è×Ùÿÿ �,þÿÿƒþÿÿ·þÿÿyþÿÿaþÿÿH‰ÐH‰ÊL‰ÁI‰Àé_õÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌAWAVATVWUSHƒì@H‰ÖH‰ÏH‹J H‹B(º'ÿP „Àt°HƒÄ@[]_^A\A^A_ËH�L$(è‹Âÿÿ‹l$(‹|$,L‹d$0D‹t$8Š\$__rust_begin_short_backtraceRUST_BACKTRACE0full - DZ@0¨@ɱ@  DZ@0¨@   2³@   at .�³@@£@ ¯@\ at ̳@ ¯@PoisonError { inner: .. }src\libstd\sys_common\thread_info.rs´@$%assertion failed: c.borrow().is_none()assertion failed: key != 0v´@fatal runtime error:  ´@1³@ thread '' has overflowed its stack Ø´@ á´@\u{} µ@#µ@P@6@memory allocation of bytes failedhµ@}µ@ BoxP@p\@�\@€n@0q@thread '' panicked at '', ¶@¶@¶@1³@note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace. h¶@O°@ `ß@°à@@@p@P@àá@Pâ@P@€@P@�@thread panicked while processing panic. aborting. x·@2thread panicked while panicking. aborting. À·@+failed to initiate panic, error ¸@ StringErrorNulErrorP@€@SymFromInlineContextSymGetLineFromInlineContextSymFromAddrSymGetLineFromAddr64dbghelp.dllSymInitializeSymCleanupStackWalkExStackWalk64src\libstd\sys\windows\mutex.rsî¸@Ccannot recursively lock a mutexkernel32AcquireSRWLockExclusiveNTDLL.DLLOS Error (FormatMessageW() returned error z¹@ ƒ¹@"³­@ (FormatMessageW() returned invalid UTF-16)z¹@ ع@+\\?\UNC\src\libstd\sys\windows\path.rs0º@1*.\src\libstd\sys\windows\stack_overflow.rsjº@(failed to reserve stack space for exception handlingjº@($ failed to install exception handlersrc\libstd\sys\windows\thread_local.rs#»@&3assertion failed: key != c::TLS_OUT_OF_INDEXESsrc\libstd\sys\windows\stdio.rs–»@Ptext was not valid unicodestrings passed to WinAPI cannot contain NULsSetThreadStackGuaranteeSleepConditionVariableSRWsrc\libstd\sys\windows\c.rsF¼@ condition variables not availableWakeConditionVariableF¼@! F¼@( rwlocks not availableAcquireSRWLockSharedF¼@+ ReleaseSRWLockExclusiveF¼@. ReleaseSRWLockSharedF¼@1 called `Option::unwrap()` on a `None` valuesrc\libcore\option.rs�½@+»½@Ycalled `Result::unwrap()` on an `Err` value/rustc/ceb2512144d1fc26330e85fb9d41c22ba1866259\src\libcore\str\pattern.rs0¾@J|!0¾@Jˆ0¾@Jˆ!0¾@JÐ0¾@JÐ!0¾@JÝ0¾@JÝ!: (¿@(¿@  src\libcore\result.rsп@å.llvm.E._ZNZN__ZN::_$.$SP$@$BP$*$RF$&$LT$<$GT$>$LP$($RP$)$C$,$u7e$~$u20$ $u27$'$u3d$=$u5b$[$u5d$]$u7b${$u7d$}$u3b$;$u2b$+$u22$"P@À0@P0@p0@/rustc/ceb2512144d1fc26330e85fb9d41c22ba1866259\src\libcore\fmt\mod.rs°À@FZ: Á@Á@  src\libcore\result.rs¸Á@åsrc\liballoc\raw_vec.rscapacity overflowÿÁ@èÁ@ëa formatting trait implementation returned an error??ÿÿ`     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ.. Â@hÄ@BorrowErrorBorrowMutError   P@`@: Â@�Å@�Å@index out of bounds: the len is but the index is ÈÅ@ èÅ@called `Option::unwrap()` on a `None` valuesrc\libcore\option.rs Æ@+KÆ@Y Â@KÆ@: src\libcore\slice\mod.rsindex out of range for slice of length ÊÆ@ÐÆ@"²Æ@% slice index starts at but ends at 0Ç@FÇ@ ²Æ@+ attempted to index slice up to maximum usize�Ç@,²Æ@1 src\libcore\str\pattern.rsðÇ@ðÇ@8ðÇ@9src\libcore\str\mod.rs[...]byte index is out of bounds of `sÉ@ ~É@ Â@XÉ@% begin <= end ( <= ) when slicing `àÉ@îÉ@òÉ@ Â@    XÉ@) is not a char boundary; it is inside (bytes ) of `sÉ@ `Ë@&†Ë@ŽË@ Â@     XÉ@60xP@ÐT@]@Ð]@ , {  Â@€Í@°Æ@ } }(), , [ÂÍ@P@p†@]P@^@ ^@à^@src\libcore\fmt\mod.rs0Î@((0Î@4src\libcore\unicode\bool_trie.rs€Î@ '€Î@ ( €Î@ *€Î@ +€Î@ , €Î@ :0       +,- .012©ª«úûýþÿ ­xy‹�¢0WX‹Œ�ÝKLûü./?\]_µâ„�Ž‘’©±º»ÅÆÉÊÞäåÿ)147:;=IJ]„Ž’©±´º»ÆÊÎÏäå )14:;EFIJ^de„‘›�ÉÎÏ )EIWde�‘©´º»ÅÉßäåð EIde€�„²¼¾¿Õ×ðñƒ…†‰‹Œ˜ ¤¦¨©¬º¾¿ÅÇÎÏÚÛH˜½ÍÆÎÏINOWY^_‰Ž�±¶·¿ÁÆÇ×[\ö÷þÿ€ mqÞßno_}~®¯»¼úFGNOXZ\^~µÅÔÕÜðñõrs�tu–—Éÿ/_&./§¯·¿ÇÏ×ßš@—˜0�ÿÎÿNOZ['/îïno7=?BE�‘þÿSguÈÉÐÑØÙçþÿ _"‚ß‚D�¬€«5€à/4 PU   :V PC- :% L mj%€È‚°‚ýY    j Y+F , 1 , €¬ AL-t<<8*‚ÿ/- !€Œ‚— ˆ”/; €¯1t €Ö €ÿ€¶$ ›Æ Ò0„�7 �\€¸€º=5 8F t ZY €ƒ  F €Š«¤ 1¡�Ú& €¥�mx(*L€�€¾    $jk¼ÑÔ Õ Ö×Úàèî ðù ';>NO�žžŸ 6=>VóÐÑ67VW½5ÎÏà‡‰Žž )14:EFIJNOdeZ\¶·„… 7�‘¨ ;>fi�’o_îïZbš›'(U� ¡£¤§¨­º¼Ä :?EQ¦§ÌÍ "%ÅÆ #%&(38:HJLPSUVXZ\^`cefksx}Фª¯°ÀÐ?qr{^"{-e/.€‚1$ +D*€ª$$(4 €��7  €˜9c 0!@8K/  @ ' 6: PI73 3. �&€�(*€¦NC G ' u ?A*; Q€‹_!H €¦^"E  8 6,€Àøÿûÿÿÿþ!þ P € @†9#¾! üÐ À @ €ÀÁ=` �D0` X € „\€ò€ò? þßàÿþÿÿÿ@àýfÃd à °?@þ 8`‡€ @åøŸÿÐø<;@£ðÏ÷ÿý!ÿÿÿÿÿÿÿûÿÿÿÿ€€ÿÿÿÿü€÷?ÀD`0ÿÿ€À?€ÿÈ ~f�Á0@ !@ÿÿÿÿ  !"#$%&'()*+,-./0123455556 Ànð‡`ðÀÿÿ€x€ïÀ€Ó@€øX€Àÿ\@ù¥ €<°0ø§(¿à¼€ÿþøy€~ü¿üÿÿüm~´¿£€` Ãøç<ÿÿÿÿÿÿøÿÿÿÿÿ øþÿÿÿùÛðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøþÿÿÿÿ¿¶ÿøÿÿÀŸŸ=ÿÿÿÀÿø HÔ@J˜Ö@˜Ø@7   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHI;> ÿƒ€P@0‰@kindEmptyParseIntErrorP@@‰@UnderflowOverflowInvalidDigitSomeNoneUtf8Errorvalid_up_toerror_lenP@ˆ@00010203040506070809101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899Errorˆä@ÔŒ@ËùF\wüäüÐËùF\ tåtÑËùF\ üˆåˆÑ°0@p¢@x¢@Àè@€é@à1@À¢@`È0°äˆäÈäØäÈ0ÿÿÿÿ@°äRSDSƒ�qÉc±ÕD™æÎ¢ ¯—C:\Users\Konstantin\pyo3-pack\hello-world\target\release\deps\hello_world-b4e388f3530cd88b.pdb ðy.textð‰  .text$mn�–.text$mn$00¢–6.text$x p.idata$5p¢.00cfg€¢.CRT$XCAˆ¢.CRT$XCAA�¢.CRT$XCZ˜¢.CRT$XIA ¢.CRT$XIAA¨¢.CRT$XIAC°¢.CRT$XIZ¸¢.CRT$XLAÀ¢.CRT$XLBÈ¢.CRT$XLZТ.CRT$XPAØ¢.CRT$XPZà¢.CRT$XTAè¢.CRT$XTZð¢pA.rdata`ä(.rdata$Tˆät.rdata$rüäŒ.rdata$zzzdbgˆè.rtc$IAA�è.rtc$IZZ˜è.rtc$TAA è .rtc$TZZÀè .tlsàè .tls$€é.tls$ZZZˆét2.xdataü .idata$2œ.idata$3°p.idata$4 .idata$60È.dataÈ0(.data$rð0x.bss@¬.pdataB¢  B0p`à 5 Rp`PÓ•Ìé 2p`P"“ôéüé(ÿÿÿÿÀ ÿÿÿÿglÿÿÿÿBp`  r0p`àð U ¢`PÓ•Pê B`P"“xê€êPÿÿÿÿ00ÿÿÿÿÿÿÿÿ U ¢`PÓ•¸ê B`P"“àêèêPÿÿÿÿ``ÿÿÿÿDMÿÿÿÿ 5 RPÓ•$ë 2P"“LëTë(ÿÿÿÿЀÿÿÿÿ¡£ÿÿÿÿ 5 RPÓ•ˆë 2P"“°ë¸ë(ÿÿÿÿ°Pÿÿÿÿwyÿÿÿÿ 5 b`PÓ•ðë B`P"“ì ì0ÿÿÿÿ�ÿÿÿÿ5?ÿÿÿÿ 5 RPÓ•Tì 2P"“|ì„ì(ÿÿÿÿ0àÿÿÿÿÿÿÿÿ E rPÓ•¸ì 2P"“àìèì8ÿÿÿÿpÿÿÿÿ13ÿÿÿÿ 5 Rp`PÓ•$í 2p`P"“LíTí(ÿÿÿÿ€àÿÿÿÿ#ÿÿÿÿ E ‚`PÓ•˜í B`P B`P"“ÀíÐí@ÿÿÿÿà 0ÿÿÿÿU�ÿÿÿÿ 5 RPÓ• î 2P"“4î<î(ÿÿÿÿÀ € ÿÿÿÿ™   ÿÿÿÿ e 0 p ` ÀÐàðPÓ•Œî B0p`À Ð àðP"“´î¼î`ÿÿÿÿ# !ÿÿÿÿÒ!ß!ÿÿÿÿ U¢ 0 p ` ÀÐàðPÓ• ï B0p`À Ð àðP"“4ï<ïPÿÿÿÿ'@#ÿÿÿÿÑ&Ö&ÿÿÿÿ e 0 p ` ÀÐàðPÓ•Œï B0p`À Ð àðP"“´ï¼ï`ÿÿÿÿà-@'ÿÿÿÿ½-Â-ÿÿÿÿ…PÓ•ðï 2P"“ð ð˜ÿÿÿÿÀ. .ÿÿÿÿ¯.¿.ÿÿÿÿ…PÓ•\ð 2P"“„ðŒðˆÿÿÿÿ2p1ÿÿÿÿí1ý1ÿÿÿÿR0p` U ¢`PÓ•Ðð B`P"“øðñPÿÿÿÿ5 4ÿÿÿÿé4ò4ÿÿÿÿ U ¢`PÓ•8ñ B`P"“`ñhñPÿÿÿÿÐ5`5ÿÿÿÿ©5²5ÿÿÿÿ E rp`PÓ•°ñ 2p`P 2p`P"“Øñèñ8ÿÿÿÿ€6°66ÿÿÿÿ6I6R6ÿÿÿÿ  R0Pp`à2 0 Pp`Ààð … 0 p`ÀàðPÓ•`òR0p ` À àðP"“ˆò�òxÿÿÿÿ0;@9ÿÿÿÿº:¼:ÿÿÿÿR` U ¢0p`PÓ•øò B 0p`P B 0p`P B 0p`P"“ ó8óPÿÿÿÿ�>ÿÿÿÿ>ÿÿÿÿ`>°;ÿÿÿÿ²<o=ó=ø=ÿÿÿÿ 5 RPÓ•Œó 2P 2PÓ•Œó"“´óÌóôó(ÿÿÿÿ ?ÿÿÿÿàó@P?8À>ÿÿÿÿñ>ó>ÿÿÿÿP? 5 RPÓ•8ô 2PÓ•8ô"“`ôpô˜ô(ÿÿÿÿÿÿÿÿ„ô@°?8p?ÿÿÿÿ¤?©?ÿÿÿÿ°? … 0 p`ÀàðPÓ•(õ20p ` À àðP20p ` À àðP20p ` À àðP20p ` À àðP"“Põ põèÿÿÿÿ@DÿÿÿÿÀDE€DÐ?ÿÿÿÿá@êAùBþBÿÿÿÿ(CFCUCnCyCmemset_CxxThrowException__C_specific_handlerVCRUNTIME140.dll‹strlen@_seh_filter_exeB_set_app_type __setusermatherr_configure_narrow_argv3_initialize_narrow_environment(_get_initial_narrow_environment6_initterm7_initterm_eUexit#_exitT_set_fmode__p___argc__p___argv_cexit_c_exit=_register_thread_local_exe_atexit_callback_configthreadlocale_set_new_mode__p__commode4_initialize_onexit_table<_register_onexit_function_crt_atexitgterminatefreeapi-ms-win-crt-string-l1-1-0.dllapi-ms-win-crt-runtime-l1-1-0.dllapi-ms-win-crt-math-l1-1-0.dllapi-ms-win-crt-stdio-l1-1-0.dllapi-ms-win-crt-locale-l1-1-0.dllapi-ms-win-crt-heap-l1-1-0.dllÐÉ@ÿÿÿÿÿÿÿÿðâ@.PEA_Kðâ@.PEAXhÃ@ÿÿÿÿ/ Í] ÒfÔÿÿ2¢ß-™+ðâ@.?AVtype_info@@ ˆé g�ép�ˆéÐw˜é€˜é ´¨éÀæÀéðTê òêRê€ô ê000ê0QDê``˜ê`�¬ê�ÏëÐë,ˆé€ËëÐõëP¢lë°Ö€ë‹Ðë�´äëà08ì0ULìlœìp¢°ìà{퀢í0Ùlíà €í / Œí€ ± ðíÀ â îð !ˆé !ñ"Tî#4#tî@#ó&Ôî'4'ôî@'ß-Tïà-.tï .À.ÔïÀ.á.èïð.‹/8ð�/+08ð00Æ08ðÐ0k18ðp1þ1@ð2!2TðP2¤3¤ð°3ò3ë4B4ëP4’4ë 45°ð515Äð@5S5ˆé`5Å5ñÐ5ñ5,ñ6€6€ñ€6¢6˜ñ°6Ò6¤ñà6T7òÀ789ò@9);,ò0;u;Lò€;®;¨ò°;ù=°ò>`>Èò`>„>Øò�>¸>èòÀ>?`ó ?F?tóP?b?|óp?¯?ô°?Â?(ôÐ?@D¸ô@DsDØô€DºDìôÀDóDõEHEõPEmGÈõpG¥Gèõ°GßGüõàGHöHHIŒöPIñK”öL:L¸ö@LêP÷ðP6Q<÷@QzQT÷ QwSÌ÷€S®Sè÷°SÛSø÷àSøT`øUøWpøX4X�ø@XƒX¨ø�XtY`ø€Yø[(ù\l\Dùp\‹\Œö \ß^œùà^_¸ù_8_Èù@_%b8ú0b[bTú`b›bdú bËbtúÐbneäúpe³eûÀefûfDf4ûPf3jÄû@jcjÜûpj“jèû jÉjôûÐjójük'k ü0kSkü`k’k$ü kãmðüðm$ný0nsn(ý€nÀp˜ýÀpðp¸ýðp/qÌý0qðr8þðrsTþ sWsdþ`sÅsÌþÐsñsàþtet4ÿpt‘tHÿ tµvœÿÀvxwê€wäy´ÿðy{ˆé {0~Ìÿ0~˜�Üÿ �ø…´ÿ†uŽôÿ ŽÐ�Ð�‘(‘H‘@P‘„‘X�‘ ”ДK”ôP”‹”�”Ë”,Дö•¸–%–Ð0–U–Ü`–*—H0—ç˜\ð˜$™|0™h™”p™§™¬°™ê™Äð™ ¯L¯W¯t`¯§¯�°¯÷¯¬°N°ÈP° °ä °J±P±¬±°±E²8P²Á²Tв³p ³‹³Œ�³ô³¨´d´Äp´f·0p·¼H ¼iÁ`pÁ§Á„°ÁùÁœ Â#à 0ÃRÃ$`Ã�Ã0�òÃ<ÀÃBƸPÆ}ÆÌ€ÆÁÆØÐÆöÆäÇÈ` ÈDÈxPÈÁÉÐÐÉËä Ë9Ë @ËtË €Ë¬Ë0 °ËùËÜ ÌeÌëpÌ©Îä °Î¾Ðü ÀÐlÑ pÑ>Ò| @ÒrÒ” €Ò¤Òˆé°ÒÓè  ÓUÓŒö`Ó¨Óê°ÓxÙô €Ù«Ù °ÙâÙ ðÙÚ0  ÚGÚ@ PÚ~ÚP €Ú»Ú` ÀÚÿÚp ÛîÜP ðÜÝp  Ý^Ý„ `ݞݘ  ÝÞݬ àÝÿÝŒöÞ ÞˆéÞtÞH €Þ&ßP 0ß`ßp `ßzàÌ €à¥àä °àqá8€á¥áP°á×á¤àáAâê€â ä¬ äåÜ  å“çÀ çÉçØÐçúçäèLèHPè¹èHÀè¦êT°êíêxðê&ë�0ëììöìí)î0îaî4pîàòŒàòó¬ óFôè PôJõê`õ&ø0øšø<°øýú¸û%ûÐ0ûdûÜpû”ûè û·ûôÀûVýÈ`ýuýà€ýÊxМ`ðüð$0EˆéP||€’� Ì Ðâ4ðÄ 2Ø@lhp‚|�¼ ÀÒ à °"Ä0wT€®h°B ¤P n ˆép  8ð ˜ø ¨/°/K08ðP0c0ˆép0²0ëÀ0Ö0ˆéà0ò0ˆé1™2( 2Ë2DÐ2M4œP4„4¼�4è5¤ð6º6˜éÀ6&7˜é07;7ˆé@7¸7Ü 8 :P;æ;8ðð;P<Ü P<Ø<8ðà<=�é =”=Ü  =Ð?˜éÐ?ºA,ÀAIB8ðPBÙB8ðàBòBˆéCåK<LL\€LÂNhÐNöNˆéOZSt€SÆTè ÐTëV€ðVâX˜ðX>YŒö@Y¢Z¨°ZH[ÀP[e\Ìp\†\Œö�\ ]Œö]Ì]ˆéÐ]^ë ^ß^ˆéà^"_ë0_{`Ü�`É`�éÐ`žd dujÜÿ€jNoèpo¬o�éàopê papè ppÕpüqu´ÿ0u„v�v}wˆé€w€xˆé€xŠyè �y�z¤{»{HÀ{�|H°|Ý~à~z,€€, €»€,À€Z�,`�ú�,‚£‚�é°‚ÙƒÜàƒù„ü…K†Üp†ö‡,ˆ'‰\ð‰§Š4¨Š¸Šˆé¸ŠÑŠˆéÔŠPŒ<PŒbŒˆé€ŒÑŒ€ÔŒÿŒ4�9�ˆé<�…�4ˆ�`ް`ŽùŽˆüŽ �4 �K�4L�›�4œ�³�ˆé´�`�¸œ�·�ˆéÜ�&’Ä0’‚’ˆé”’Ì’ˆéÌ’“Ô“D“ÔL“•à –¢–ø¢–À–tÀ–Ø–¨ ¸p¢x¢ˆ¢ ¢¨¢À¢ð¢£££0£p£€£¤¤¸¤È¤à¤ø¤¥¥¥(¥0¥8¥@¥X¥`¥h¥p¥ˆ¥à¥ø¥¦(§8§H§Ø§ð§¨¨ ¨8¨H¨p¨Ð¨à¨ø¨©©0©ø©Pª`ª¸ª8«�« «È«à«ø«¬¬¬¬ ¬˜­¸­È­Ø­ ®0®X®˜®°®¸®À®Ø®ð®ø®¯ ¯X¯¨¯À¯È¯è¯°°0 x ¸ H¡p¡Ð¡à¡ð¡ˆ¢˜¢@£˜£¨£¸£Ø£è£8¤�¤¸¤È¤¥¥(¥8¥H¥`¥�¥ ¥È¥à¥è¥ð¥ø¥(¦8¦H¦X¦¸¦È¦à¦è¦ð¦§§(§0§8§P§X§p§°§ð§ ¨H¨`¨©¨©¸©È©ªªPª˜ªèªP«¸«h¬¸¬Ð¬­H­x­Ð­à­€®˜®°®È®à®ø®¯0¯@¯è¯À˜€ ˜   ¨ ø ¡(¡Ð¡¢ ¢p¤€¤p¥ˆ¥˜¥¨¥¸¥¦¦`¦p¦ˆ¦˜¦ø¦§§X§h§x§À§Ð§¨(¨@¨˜©¨©¸©È©ªª(ª8ªH«˜«¨«¸«È«Ø«(­H­`­h­p­ˆ­˜­¨­È­Ø­ð­®® ®(®H®`® ®¸®Ð®è®¯¯ÐP«`«p«à(X¡p¡�¡¨¡ø¡¢è¢ð¢¸£Ð£Ø£`¤h¤p¤x¤0 X p ˆ È maturin-1.16.0/test-dockerfile.sh000077500000000000000000000017161527064705700167230ustar00rootroot00000000000000#!/usr/bin/env bash # Builds a representative subset of test crates using the docker container, # installs the wheel and checks that the installed package is functional set -e rm -rf venv-docker python3.11 -m venv venv-docker venv-docker/bin/pip install -U pip cffi # FIXME: Can we run the tests without activate? Currently hello-world fails because then the binary is not in PATH source venv-docker/bin/activate for test_crate in hello-world cffi-pure cffi-mixed pyo3-pure pyo3-mixed do echo "Testing $test_crate" docker run -e RUST_BACKTRACE=1 --rm -v "$(pwd):/io" -w /io/test-crates/$test_crate maturin build -i python3.11 # --only-binary=:all: stops pip from picking a local already compiled sdist venv-docker/bin/pip install $test_crate --only-binary=:all: --find-links test-crates/$test_crate/target/wheels/ if [[ $(venv-docker/bin/python test-crates/$test_crate/check_installed/check_installed.py) != 'SUCCESS' ]]; then exit 1 fi done deactivate maturin-1.16.0/tests/000077500000000000000000000000001527064705700144355ustar00rootroot00000000000000maturin-1.16.0/tests/cli.rs000066400000000000000000000012311527064705700155470ustar00rootroot00000000000000#[test] fn cli_tests() { let t = trycmd::TestCases::new(); t.default_bin_name("maturin"); t.case("tests/cmd/*.toml"); #[cfg(not(feature = "upload"))] { t.skip("tests/cmd/upload.toml"); t.skip("tests/cmd/publish.toml"); } #[cfg(not(feature = "zig"))] { t.skip("tests/cmd/build.toml"); } #[cfg(not(feature = "scaffolding"))] { t.skip("tests/cmd/new.toml"); t.skip("tests/cmd/init.toml"); t.skip("tests/cmd/generate-ci.toml"); } #[cfg(not(all(feature = "upload", feature = "zig", feature = "scaffolding")))] { t.skip("tests/cmd/maturin.toml"); } } maturin-1.16.0/tests/cmd/000077500000000000000000000000001527064705700152005ustar00rootroot00000000000000maturin-1.16.0/tests/cmd/build.stderr000066400000000000000000000000001527064705700175120ustar00rootroot00000000000000maturin-1.16.0/tests/cmd/build.stdout000066400000000000000000000141511527064705700175450ustar00rootroot00000000000000Build the crate into python packages Usage: maturin[EXE] build [OPTIONS] [ARGS]... Arguments: [ARGS]... Rustc flags Options: --strip [] Strip the library for minimum file size. Can be set to `true` or `false`, or used as a flag (`--strip` implies `true`) [env: MATURIN_STRIP=] [possible values: true, false] --sdist Build a source distribution and build wheels from it. This verifies that the source distribution is complete and can be used to build the project from source. --pgo Build with Profile-Guided Optimization (PGO). Requires `pgo-command` to be set in `[tool.maturin]` in pyproject.toml. This performs a three-phase build: instrumented build, profile training, and optimized rebuild. Can also be enabled via the MATURIN_PGO environment variable. [env: MATURIN_PGO=] -i, --interpreter [...] The python versions to build wheels for, given as the executables of interpreters such as `python3.9` or `/usr/bin/python3.8` -f, --find-interpreter Find interpreters from the host machine -b, --bindings Which kind of bindings to use [possible values: pyo3, pyo3-ffi, cffi, uniffi, bin] --compatibility [...] Control the platform tag and PyPI compatibility. This options offers both fine-grained control over the linux libc tag and a more automatic PyPI-compatibility option. The `pypi` option applies on all platforms and ensure that only tags that can be uploaded to PyPI are used. The linux-specific options are `manylinux` tags (for example `manylinux2014`/`manylinux_2_24`) or `musllinux` tags (for example `musllinux_1_2`), and `linux` for the native linux tag. They are ignored on non-linux platforms. Note that `manylinux1` and `manylinux2010` are unsupported by the rust compiler. Wheels with the native `linux` tag will be rejected by pypi, unless they are separately validated by `auditwheel`. The default is the lowest compatible `manylinux` tag, or plain `linux` if nothing matched. --auditwheel Audit wheel for manylinux compliance Possible values: - repair: Audit and repair wheel for manylinux compliance - check: Check wheel for manylinux compliance, but do not repair - warn: Audit wheel and warn about external libraries, but do not fail or repair - skip: Don't check for manylinux compliance --zig For manylinux targets, use zig to ensure compliance for the chosen manylinux version Default to manylinux2014/manylinux_2_17 if you do not specify an `--compatibility` Make sure you installed zig with `pip install maturin[zig]` -o, --out The directory to store the built wheels in. Defaults to a new "wheels" directory in the project's target directory --include-debuginfo Include debug info files (.pdb on Windows, .dSYM on macOS, .dwp on Linux) in the wheel. When enabled, maturin automatically configures split-debuginfo=packed so that separate debug info files are produced --sbom-include ... Additional SBOM files to include in the `.dist-info/sboms` directory. Can be specified multiple times -q, --quiet Do not print cargo log messages --ignore-rust-version Ignore `rust-version` specification in packages -v, --verbose... Use verbose output (-vv very verbose/build.rs output) --color Coloring: auto, always, never --config Override a configuration value (unstable) -Z Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details --future-incompat-report Outputs a future incompatibility report at the end of the build (unstable) --compression-method Zip compression method. Only Stored and Deflated are currently compatible with all package managers Possible values: - deflated: Deflate compression (levels 0-9, default 6) - stored: No compression - bzip2: BZIP2 compression (levels 0-9, default 6) - zstd: Zstandard compression (supported from Python 3.14; levels -7-22, default 3) [default: deflated] --compression-level Zip compression level. Defaults to method default --compression-enable-large-file-support Whether to use large file support for ZIP files. Defaults to false --generate-stubs Auto generate Python type stubs by introspecting the binary. Requires PyO3 and its "experimental-inspect" feature -h, --help Print help (see a summary with '-h') Compilation Options: -r, --release Build artifacts in release mode, with optimizations -j, --jobs Number of parallel jobs, defaults to # of CPUs --profile Build artifacts with the specified Cargo profile --target Build for the target triple [env: CARGO_BUILD_TARGET=] --target-dir Directory for all generated artifacts --timings Output a build timing report at the end of the build Feature Selection: -F, --features Space or comma separated list of features to activate --all-features Activate all available features --no-default-features Do not activate the `default` feature Manifest Options: -m, --manifest-path Path to Cargo.toml --frozen Require Cargo.lock and cache are up to date --locked Require Cargo.lock is up to date --offline Run without accessing the network maturin-1.16.0/tests/cmd/build.toml000066400000000000000000000000531527064705700171720ustar00rootroot00000000000000bin.name = "maturin" args = "build --help" maturin-1.16.0/tests/cmd/develop.stderr000066400000000000000000000000001527064705700200510ustar00rootroot00000000000000maturin-1.16.0/tests/cmd/develop.stdout000066400000000000000000000100561527064705700201040ustar00rootroot00000000000000Install the crate as module in the current virtualenv Usage: maturin[EXE] develop [OPTIONS] [ARGS]... Arguments: [ARGS]... Rustc flags Options: -b, --bindings Which kind of bindings to use [possible values: pyo3, pyo3-ffi, cffi, uniffi, bin] --pgo Build with Profile-Guided Optimization (PGO). Requires `pgo-command` to be set in `[tool.maturin]` in pyproject.toml. This performs a three-phase build: instrumented build, profile training, and optimized rebuild. Implies `--release` unless `--profile` is specified. Can also be enabled via the MATURIN_PGO environment variable. [env: MATURIN_PGO=] --strip Strip the library for minimum file size -E, --extras Install extra requires aka. optional dependencies Use as `--extras=extra1,extra2` -G, --group Install dependency groups defined in pyproject.toml (PEP 735) Use as `--group=test,docs` --skip-install Skip installation, only build the extension module inplace Only works with mixed Rust/Python project layout --pip-path Use a specific pip installation instead of the default one. This can be used to supply the path to a pip executable when the current virtualenv does not provide one. -q, --quiet Do not print cargo log messages --ignore-rust-version Ignore `rust-version` specification in packages -v, --verbose... Use verbose output (-vv very verbose/build.rs output) --color Coloring: auto, always, never --config Override a configuration value (unstable) -Z Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details --future-incompat-report Outputs a future incompatibility report at the end of the build (unstable) --uv Use `uv` to install packages instead of `pip` --compression-method Zip compression method. Only Stored and Deflated are currently compatible with all package managers Possible values: - deflated: Deflate compression (levels 0-9, default 6) - stored: No compression - bzip2: BZIP2 compression (levels 0-9, default 6) - zstd: Zstandard compression (supported from Python 3.14; levels -7-22, default 3) [default: deflated] --compression-level Zip compression level. Defaults to method default --compression-enable-large-file-support Whether to use large file support for ZIP files. Defaults to false --generate-stubs Auto generate Python type stubs by introspecting the binary. Requires PyO3 and its "experimental-inspect" feature -h, --help Print help (see a summary with '-h') Compilation Options: -r, --release Pass --release to cargo -j, --jobs Number of parallel jobs, defaults to # of CPUs --profile Build artifacts with the specified Cargo profile --target Build for the target triple [env: CARGO_BUILD_TARGET=] --target-dir Directory for all generated artifacts --timings Output a build timing report at the end of the build Feature Selection: -F, --features Space or comma separated list of features to activate --all-features Activate all available features --no-default-features Do not activate the `default` feature Manifest Options: -m, --manifest-path Path to Cargo.toml --frozen Require Cargo.lock and cache are up to date --locked Require Cargo.lock is up to date --offline Run without accessing the network maturin-1.16.0/tests/cmd/develop.toml000066400000000000000000000000551527064705700175330ustar00rootroot00000000000000bin.name = "maturin" args = "develop --help" maturin-1.16.0/tests/cmd/generate-ci.stderr000066400000000000000000000000001527064705700205760ustar00rootroot00000000000000maturin-1.16.0/tests/cmd/generate-ci.stdout000066400000000000000000000031571527064705700206350ustar00rootroot00000000000000Generate CI configuration Usage: maturin[EXE] generate-ci [OPTIONS] Arguments: CI provider Possible values: - github: GitHub Options: -m, --manifest-path Path to Cargo.toml -v, --verbose... Use verbose output. * Default: Show build information and `cargo build` output. * `-v`: Use `cargo build -v`. * `-vv`: Show debug logging and use `cargo build -vv`. * `-vvv`: Show trace logging. You can configure fine-grained logging using the `RUST_LOG` environment variable. () -o, --output Output path [default: -] --platform ... Platform support [deprecated: use [tool.maturin.generate-ci.github."PLATFORM NAME"] in pyproject.toml] Possible values: - all: All - manylinux: Manylinux - musllinux: Musllinux - windows: Windows - macos: macOS - emscripten: Emscripten - android: Android --pytest Enable pytest [deprecated: use [tool.maturin.generate-ci.github] in pyproject.toml] --zig Use zig to do cross compilation [deprecated: use [tool.maturin.generate-ci.github] in pyproject.toml] --skip-attestation Skip artifact attestation [deprecated: use [tool.maturin.generate-ci.github] in pyproject.toml] -h, --help Print help (see a summary with '-h') maturin-1.16.0/tests/cmd/generate-ci.toml000066400000000000000000000000611527064705700202550ustar00rootroot00000000000000bin.name = "maturin" args = "generate-ci --help" maturin-1.16.0/tests/cmd/init.stderr000066400000000000000000000000001527064705700173560ustar00rootroot00000000000000maturin-1.16.0/tests/cmd/init.stdout000066400000000000000000000020351527064705700174070ustar00rootroot00000000000000Create a new cargo project in an existing directory Usage: maturin[EXE] init [OPTIONS] [PATH] Arguments: [PATH] Project path Options: --name Set the resulting package name, defaults to the directory name -v, --verbose... Use verbose output. * Default: Show build information and `cargo build` output. * `-v`: Use `cargo build -v`. * `-vv`: Show debug logging and use `cargo build -vv`. * `-vvv`: Show trace logging. You can configure fine-grained logging using the `RUST_LOG` environment variable. () --mixed Use mixed Rust/Python project layout --src Use Python first src layout for mixed Rust/Python project -b, --bindings Which kind of bindings to use [possible values: pyo3, cffi, uniffi, bin] -h, --help Print help (see a summary with '-h') maturin-1.16.0/tests/cmd/init.toml000066400000000000000000000000521527064705700170350ustar00rootroot00000000000000bin.name = "maturin" args = "init --help" maturin-1.16.0/tests/cmd/list-python.stderr000066400000000000000000000000001527064705700207050ustar00rootroot00000000000000maturin-1.16.0/tests/cmd/list-python.stdout000066400000000000000000000012421527064705700207350ustar00rootroot00000000000000Search and list the available python installations Usage: maturin[EXE] list-python [OPTIONS] Options: --target -v, --verbose... Use verbose output. * Default: Show build information and `cargo build` output. * `-v`: Use `cargo build -v`. * `-vv`: Show debug logging and use `cargo build -vv`. * `-vvv`: Show trace logging. You can configure fine-grained logging using the `RUST_LOG` environment variable. () -h, --help Print help (see a summary with '-h') maturin-1.16.0/tests/cmd/list-python.toml000066400000000000000000000000611527064705700203640ustar00rootroot00000000000000bin.name = "maturin" args = "list-python --help" maturin-1.16.0/tests/cmd/maturin.stderr000066400000000000000000000000001527064705700200720ustar00rootroot00000000000000maturin-1.16.0/tests/cmd/maturin.stdout000066400000000000000000000026751527064705700201350ustar00rootroot00000000000000Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages Usage: maturin[EXE] [OPTIONS] Commands: build Build the crate into python packages publish Build and publish the crate as python packages to pypi list-python Search and list the available python installations develop Install the crate as module in the current virtualenv sdist Build only a source distribution (sdist) without compiling init Create a new cargo project in an existing directory new Create a new cargo project generate-ci Generate CI configuration upload Upload python packages to pypi generate-stubs Autogenerate type stubs help Print this message or the help of the given subcommand(s) Options: -v, --verbose... Use verbose output. * Default: Show build information and `cargo build` output. * `-v`: Use `cargo build -v`. * `-vv`: Show debug logging and use `cargo build -vv`. * `-vvv`: Show trace logging. You can configure fine-grained logging using the `RUST_LOG` environment variable. () -h, --help Print help (see a summary with '-h') -V, --version Print version Visit https://maturin.rs to learn more about maturin. maturin-1.16.0/tests/cmd/maturin.toml000066400000000000000000000000451527064705700175530ustar00rootroot00000000000000bin.name = "maturin" args = "--help" maturin-1.16.0/tests/cmd/new.stderr000066400000000000000000000000001527064705700172040ustar00rootroot00000000000000maturin-1.16.0/tests/cmd/new.stdout000066400000000000000000000020031527064705700172300ustar00rootroot00000000000000Create a new cargo project Usage: maturin[EXE] new [OPTIONS] Arguments: Project path Options: --name Set the resulting package name, defaults to the directory name -v, --verbose... Use verbose output. * Default: Show build information and `cargo build` output. * `-v`: Use `cargo build -v`. * `-vv`: Show debug logging and use `cargo build -vv`. * `-vvv`: Show trace logging. You can configure fine-grained logging using the `RUST_LOG` environment variable. () --mixed Use mixed Rust/Python project layout --src Use Python first src layout for mixed Rust/Python project -b, --bindings Which kind of bindings to use [possible values: pyo3, cffi, uniffi, bin] -h, --help Print help (see a summary with '-h') maturin-1.16.0/tests/cmd/new.toml000066400000000000000000000000511527064705700166620ustar00rootroot00000000000000bin.name = "maturin" args = "new --help" maturin-1.16.0/tests/cmd/publish.stderr000066400000000000000000000000001527064705700200610ustar00rootroot00000000000000maturin-1.16.0/tests/cmd/publish.stdout000066400000000000000000000162601527064705700201170ustar00rootroot00000000000000Build and publish the crate as python packages to pypi Usage: maturin[EXE] publish [OPTIONS] [ARGS]... Arguments: [ARGS]... Rustc flags Options: --debug Do not pass --release to cargo --no-strip Do not strip the library for minimum file size --no-sdist Don't build a source distribution --pgo Build with Profile-Guided Optimization (PGO). Requires `pgo-command` to be set in `[tool.maturin]` in pyproject.toml. Can also be enabled via the MATURIN_PGO environment variable. [env: MATURIN_PGO=] -r, --repository The repository (package index) to upload the package to. Should be a section in the config file. Can also be set via MATURIN_REPOSITORY environment variable. [env: MATURIN_REPOSITORY=] [default: pypi] --repository-url The URL of the registry where the wheels are uploaded to. This overrides --repository. Can also be set via MATURIN_REPOSITORY_URL environment variable. [env: MATURIN_REPOSITORY_URL=] -u, --username Username for pypi or your custom registry. Can also be set via MATURIN_USERNAME environment variable. Set MATURIN_PYPI_TOKEN variable to use token-based authentication instead [env: MATURIN_USERNAME=] -p, --password Password for pypi or your custom registry. Can also be set via MATURIN_PASSWORD environment variable. [env: MATURIN_PASSWORD] --skip-existing Continue uploading files if one already exists. (Only valid when uploading to PyPI. Other implementations may not support this.) --non-interactive Do not interactively prompt for username/password if the required credentials are missing. Can also be set via MATURIN_NON_INTERACTIVE environment variable. [env: MATURIN_NON_INTERACTIVE=] -i, --interpreter [...] The python versions to build wheels for, given as the executables of interpreters such as `python3.9` or `/usr/bin/python3.8` -f, --find-interpreter Find interpreters from the host machine -b, --bindings Which kind of bindings to use [possible values: pyo3, pyo3-ffi, cffi, uniffi, bin] --compatibility [...] Control the platform tag and PyPI compatibility. This options offers both fine-grained control over the linux libc tag and a more automatic PyPI-compatibility option. The `pypi` option applies on all platforms and ensure that only tags that can be uploaded to PyPI are used. The linux-specific options are `manylinux` tags (for example `manylinux2014`/`manylinux_2_24`) or `musllinux` tags (for example `musllinux_1_2`), and `linux` for the native linux tag. They are ignored on non-linux platforms. Note that `manylinux1` and `manylinux2010` are unsupported by the rust compiler. Wheels with the native `linux` tag will be rejected by pypi, unless they are separately validated by `auditwheel`. The default is the lowest compatible `manylinux` tag, or plain `linux` if nothing matched. --auditwheel Audit wheel for manylinux compliance Possible values: - repair: Audit and repair wheel for manylinux compliance - check: Check wheel for manylinux compliance, but do not repair - warn: Audit wheel and warn about external libraries, but do not fail or repair - skip: Don't check for manylinux compliance --zig For manylinux targets, use zig to ensure compliance for the chosen manylinux version Default to manylinux2014/manylinux_2_17 if you do not specify an `--compatibility` Make sure you installed zig with `pip install maturin[zig]` -o, --out The directory to store the built wheels in. Defaults to a new "wheels" directory in the project's target directory --include-debuginfo Include debug info files (.pdb on Windows, .dSYM on macOS, .dwp on Linux) in the wheel. When enabled, maturin automatically configures split-debuginfo=packed so that separate debug info files are produced --sbom-include ... Additional SBOM files to include in the `.dist-info/sboms` directory. Can be specified multiple times -q, --quiet Do not print cargo log messages --ignore-rust-version Ignore `rust-version` specification in packages -v, --verbose... Use verbose output (-vv very verbose/build.rs output) --color Coloring: auto, always, never --config Override a configuration value (unstable) -Z Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details --future-incompat-report Outputs a future incompatibility report at the end of the build (unstable) --compression-method Zip compression method. Only Stored and Deflated are currently compatible with all package managers Possible values: - deflated: Deflate compression (levels 0-9, default 6) - stored: No compression - bzip2: BZIP2 compression (levels 0-9, default 6) - zstd: Zstandard compression (supported from Python 3.14; levels -7-22, default 3) [default: deflated] --compression-level Zip compression level. Defaults to method default --compression-enable-large-file-support Whether to use large file support for ZIP files. Defaults to false --generate-stubs Auto generate Python type stubs by introspecting the binary. Requires PyO3 and its "experimental-inspect" feature -h, --help Print help (see a summary with '-h') Compilation Options: -j, --jobs Number of parallel jobs, defaults to # of CPUs --profile Build artifacts with the specified Cargo profile --target Build for the target triple [env: CARGO_BUILD_TARGET=] --target-dir Directory for all generated artifacts --timings Output a build timing report at the end of the build Feature Selection: -F, --features Space or comma separated list of features to activate --all-features Activate all available features --no-default-features Do not activate the `default` feature Manifest Options: -m, --manifest-path Path to Cargo.toml --frozen Require Cargo.lock and cache are up to date --locked Require Cargo.lock is up to date --offline Run without accessing the network maturin-1.16.0/tests/cmd/publish.toml000066400000000000000000000000551527064705700175430ustar00rootroot00000000000000bin.name = "maturin" args = "publish --help" maturin-1.16.0/tests/cmd/sdist.stderr000066400000000000000000000000001527064705700175410ustar00rootroot00000000000000maturin-1.16.0/tests/cmd/sdist.stdout000066400000000000000000000020331527064705700175700ustar00rootroot00000000000000Build only a source distribution (sdist) without compiling. Building a source distribution requires a pyproject.toml with a `[build-system]` table. This command is a workaround for [pypa/pip#6041](https://github.com/pypa/pip/issues/6041) Usage: maturin[EXE] sdist [OPTIONS] Options: -m, --manifest-path The path to the Cargo.toml -v, --verbose... Use verbose output. * Default: Show build information and `cargo build` output. * `-v`: Use `cargo build -v`. * `-vv`: Show debug logging and use `cargo build -vv`. * `-vvv`: Show trace logging. You can configure fine-grained logging using the `RUST_LOG` environment variable. () -o, --out The directory to store the built wheels in. Defaults to a new "wheels" directory in the project's target directory -h, --help Print help (see a summary with '-h') maturin-1.16.0/tests/cmd/sdist.toml000066400000000000000000000000531527064705700172210ustar00rootroot00000000000000bin.name = "maturin" args = "sdist --help" maturin-1.16.0/tests/cmd/upload.stderr000066400000000000000000000000001527064705700176770ustar00rootroot00000000000000maturin-1.16.0/tests/cmd/upload.stdout000066400000000000000000000044161527064705700177350ustar00rootroot00000000000000Upload python packages to pypi It is mostly similar to `twine upload`, but can only upload python wheels and source distributions. Usage: maturin[EXE] upload [OPTIONS] [FILE]... Arguments: [FILE]... The python packages to upload Options: -r, --repository The repository (package index) to upload the package to. Should be a section in the config file. Can also be set via MATURIN_REPOSITORY environment variable. [env: MATURIN_REPOSITORY=] [default: pypi] -v, --verbose... Use verbose output. * Default: Show build information and `cargo build` output. * `-v`: Use `cargo build -v`. * `-vv`: Show debug logging and use `cargo build -vv`. * `-vvv`: Show trace logging. You can configure fine-grained logging using the `RUST_LOG` environment variable. () --repository-url The URL of the registry where the wheels are uploaded to. This overrides --repository. Can also be set via MATURIN_REPOSITORY_URL environment variable. [env: MATURIN_REPOSITORY_URL=] -u, --username Username for pypi or your custom registry. Can also be set via MATURIN_USERNAME environment variable. Set MATURIN_PYPI_TOKEN variable to use token-based authentication instead [env: MATURIN_USERNAME=] -p, --password Password for pypi or your custom registry. Can also be set via MATURIN_PASSWORD environment variable. [env: MATURIN_PASSWORD] --skip-existing Continue uploading files if one already exists. (Only valid when uploading to PyPI. Other implementations may not support this.) --non-interactive Do not interactively prompt for username/password if the required credentials are missing. Can also be set via MATURIN_NON_INTERACTIVE environment variable. [env: MATURIN_NON_INTERACTIVE=] -h, --help Print help (see a summary with '-h') maturin-1.16.0/tests/cmd/upload.toml000066400000000000000000000000541527064705700173600ustar00rootroot00000000000000bin.name = "maturin" args = "upload --help" maturin-1.16.0/tests/common/000077500000000000000000000000001527064705700157255ustar00rootroot00000000000000maturin-1.16.0/tests/common/develop.rs000066400000000000000000000115711527064705700177360ustar00rootroot00000000000000use crate::common::{ PreparedEnv, TestEnvKind, TestInstallBackend, TestPackageCopy, case_target_dir, check_installed, cleanup_case, has_uv, manifest_path_for_package, prepare_case_package, prepare_test_env, shared_target_dir, }; use anyhow::Result; use maturin::{CargoOptions, DevelopOptions, develop}; /// A table-driven `maturin develop` scenario. /// /// The case id is used to derive isolated virtualenv and cargo target paths, so it should stay /// stable and descriptive when possible. #[derive(Clone, Copy)] pub struct DevelopCase<'a> { /// Stable identifier used for derived test paths and failure messages. pub id: &'a str, /// Repo-relative path to the package under test. pub package: &'a str, /// Optional copied-workspace configuration for fixtures that generate files in-tree. pub package_copy: Option>, /// Optional explicit bindings override passed to `maturin develop`. pub bindings: Option<&'a str>, /// The environment kind used for installation and verification. pub env_kind: TestEnvKind, /// Whether the case installs through pip-compatible or uv-compatible flow. pub backend: TestInstallBackend, /// Extra Python packages that must be installed into the test environment first. pub prereq_packages: &'a [&'a str], /// Dependency groups passed to `maturin develop` as `--group` (e.g. `dev` or /// `:`). pub group: &'a [&'a str], } impl<'a> DevelopCase<'a> { pub fn pip(id: &'a str, package: &'a str) -> Self { Self { id, package, package_copy: None, bindings: None, env_kind: TestEnvKind::Venv, backend: TestInstallBackend::Pip, prereq_packages: &[], group: &[], } } pub fn uv(id: &'a str, package: &'a str) -> Self { Self { backend: TestInstallBackend::Uv, prereq_packages: &["uv"], ..Self::pip(id, package) } } pub fn copied(mut self, copy: TestPackageCopy<'a>) -> Self { self.package_copy = Some(copy); self } pub fn prereqs(mut self, packages: &'a [&'a str]) -> Self { self.prereq_packages = packages; self } /// Pass explicit dependency groups to `maturin develop` as `--group` arguments. pub fn with_groups(mut self, groups: &'a [&'a str]) -> Self { self.group = groups; self } pub fn conda(mut self, major: usize, minor: usize) -> Self { self.env_kind = TestEnvKind::Conda { major, minor }; self } } /// Creates a virtualenv and activates it, checks that the package isn't installed, uses /// "maturin develop" to install it and checks it is working pub fn test_develop(case: &DevelopCase<'_>) -> Result<()> { let package_path = prepare_case_package(case.id, case.package, case.package_copy)?; let package = package_path.as_path(); let uv = matches!(case.backend, TestInstallBackend::Uv); let supported_uv_platform = cfg!(any( target_os = "linux", target_os = "macos", target_os = "windows" )); let prereq_packages = if uv && !supported_uv_platform && has_uv() { &[][..] } else { case.prereq_packages }; let PreparedEnv { env_dir: venv_dir, python, } = prepare_test_env(case.id, case.env_kind, prereq_packages, None)?; // Ensure the test doesn't wrongly pass check_installed(package, &python).unwrap_err(); if uv && !supported_uv_platform { assert!(has_uv(), "uv backend requires uv binary on this platform"); } // Conda cases build against a different interpreter than everything else, which would // invalidate pyo3 build script fingerprints back and forth in a shared target dir. let (target_dir, fixture_lock) = match case.env_kind { TestEnvKind::Venv => ( shared_target_dir(case.package), Some(crate::common::lock_fixture(case.package)?), ), TestEnvKind::Conda { .. } => (case_target_dir(case.id), None), }; let develop_options = DevelopOptions { bindings: case .bindings .map(|binding| binding.parse().expect("valid bindings spelling")), release: false, pgo: false, strip: false, extras: Vec::new(), group: case.group.iter().map(|s| s.to_string()).collect(), skip_install: false, pip_path: None, cargo_options: CargoOptions { manifest_path: Some(manifest_path_for_package(package)), quiet: true, target_dir: Some(target_dir), ..Default::default() }, uv, compression: Default::default(), generate_stubs: false, }; develop(develop_options, &venv_dir)?; drop(fixture_lock); check_installed(package, &python)?; cleanup_case(case.id); Ok(()) } maturin-1.16.0/tests/common/errors.rs000066400000000000000000000166401527064705700176160ustar00rootroot00000000000000use anyhow::format_err; use anyhow::{Result, bail}; use clap::Parser; use maturin::{BuildOptions, BuildOrchestrator}; use pretty_assertions::assert_eq; use std::path::Path; use std::process::Command; use std::str; /// Check that you get a good error message if you forgot to set the extension-module feature pub fn pyo3_no_extension_module() -> Result<()> { let target_dir = crate::common::shared_target_dir("test-crates/pyo3-no-extension-module") .display() .to_string(); // The first argument is ignored by clap let cli = vec![ "build", "--manifest-path", "test-crates/pyo3-no-extension-module/Cargo.toml", "--quiet", "--target-dir", target_dir.as_str(), "--out", "test-crates/targets/pyo3_no_extension_module", "--auditwheel", "check", ]; let options = BuildOptions::try_parse_from(cli)?; let build_context = options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .build()?; let _fixture_lock = crate::common::lock_fixture("test-crates/pyo3-no-extension-module")?; let result = BuildOrchestrator::new(&build_context).build_wheels(); if let Err(err) = result { if !(err .source() .ok_or_else(|| format_err!("{}", err))? .to_string() .starts_with("Your library links libpython")) { return Err(err); } } else { bail!("Should have errored"); } Ok(()) } /// Make sure cargo metadata doesn't create a lock file when --locked was passed /// /// https://github.com/PyO3/maturin/issues/472 pub fn locked_doesnt_build_without_cargo_lock() -> Result<()> { // The first argument is ignored by clap let cli = vec![ "build", "--manifest-path", "test-crates/lib_with_path_dep/Cargo.toml", "--locked", "-itargetspython", "--target-dir", "test-crates/targets/locked_doesnt_build_without_cargo_lock", ]; let options = BuildOptions::try_parse_from(cli)?; let result = options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .build(); if let Err(err) = result { let err_string = err .source() .ok_or_else(|| format_err!("{}", err))? .to_string(); if !err_string.starts_with("`cargo metadata` exited with an error:") { bail!("{:?}", err_string); } } else { bail!("Should have errored"); } Ok(()) } /// Don't panic if the manylinux version doesn't exit /// /// https://github.com/PyO3/maturin/issues/739 pub fn invalid_manylinux_does_not_panic() -> Result<()> { let target_dir = crate::common::shared_target_dir("test-crates/pyo3-mixed") .display() .to_string(); // The first argument is ignored by clap let cli = vec![ "build", "-m", "test-crates/pyo3-mixed/Cargo.toml", "--compatibility", "manylinux_2_99", "--target-dir", target_dir.as_str(), "--out", "test-crates/targets/invalid_manylinux_does_not_panic", ]; let options: BuildOptions = BuildOptions::try_parse_from(cli)?; let build_context = options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .build()?; let _fixture_lock = crate::common::lock_fixture("test-crates/pyo3-mixed")?; let result = BuildOrchestrator::new(&build_context).build_wheels(); if let Err(err) = result { assert_eq!(err.to_string(), "Error ensuring manylinux_2_99 compliance"); let err_string = err .source() .ok_or_else(|| format_err!("{}", err))? .to_string(); assert_eq!( err_string, "manylinux_2_99 compatibility policy is not defined by auditwheel yet, pass `--auditwheel=skip` to proceed anyway" ); } else { bail!("Should have errored"); } Ok(()) } /// The user set `python-source` in pyproject.toml, but there is no python module in there pub fn error_on_missing_python_source() -> Result<()> { let output = Command::new(env!("CARGO_BIN_EXE_maturin")) .arg("build") .arg("-m") .arg( Path::new("test-crates") .join("wrong-python-source") .join("Cargo.toml"), ) .output() .unwrap(); assert!( !output.status.success(), "Expected build to fail when python-source is set but module is missing" ); let stderr = str::from_utf8(&output.stderr)?; assert!( stderr.contains("python-source is set to"), "Expected error about missing python-source, got: {stderr}" ); Ok(()) } /// Check the `--compatibility pypi` error for unsupported targets. /// /// Regression test for , /// where uv tried to upload a wheel with platform tag `manylinux_2_31_riscv64` /// but PyPI rejected it because RISC-V is not in PyPI's allowed architectures. pub fn pypi_compatibility_unsupported_target() -> Result<()> { // The first argument is ignored by clap let cli = vec![ "build", "-m", "test-crates/pyo3-mixed/Cargo.toml", "--compatibility", "pypi", "--target", "riscv32gc-unknown-linux-gnu", // Unsupported by PyPI "--target-dir", "test-crates/targets/pypi_compatibility_unsupported_target", "--out", "test-crates/targets/pypi_compatibility_unsupported_target", "-i", "python3.12", // Add interpreter to bypass interpreter detection ]; let options: BuildOptions = BuildOptions::try_parse_from(cli)?; let result = options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .build(); if let Err(err) = result { let err_string = err.to_string(); assert!( err_string.contains("Rust target riscv32gc-unknown-linux-gnu is not supported by PyPI"), "{err_string}", ); } else { bail!("Should have errored"); } Ok(()) } /// Test that `--compatibility pypi` cannot be used with the linux tag. #[cfg(target_os = "linux")] pub fn pypi_compatibility_linux_tag() -> Result<()> { let target_dir = crate::common::shared_target_dir("test-crates/hello-world") .display() .to_string(); // The first argument is ignored by clap let cli = vec![ "build", "-m", "test-crates/hello-world/Cargo.toml", "--compatibility", "pypi", "--compatibility", "linux", // Should fail when combined with pypi "--target-dir", target_dir.as_str(), "--out", "test-crates/targets/pypi_compatibility_linux_tag", ]; let options: BuildOptions = BuildOptions::try_parse_from(cli)?; let build_context = options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .build()?; let _fixture_lock = crate::common::lock_fixture("test-crates/hello-world")?; let result = BuildOrchestrator::new(&build_context).build_wheels(); if let Err(err) = result { let err_string = err.to_string(); assert!( err_string.contains("PyPI validation failed"), "{err_string}", ); } else { bail!("Should have errored"); } Ok(()) } maturin-1.16.0/tests/common/integration.rs000066400000000000000000000462711527064705700206300ustar00rootroot00000000000000use crate::common::{ PreparedEnv, TestEnvKind, TestPackageCopy, case_target_dir, case_wheel_dir, check_installed, cleanup_case, create_named_virtualenv, prepare_case_package, prepare_test_env, shared_target_dir, test_python_path, }; use anyhow::{Context, Result, bail}; #[cfg(feature = "zig")] use cargo_zigbuild::Zig; use clap::Parser; use fs_err::File; use fs4::fs_err3::FileExt; use maturin::{BuildOptions, BuildOrchestrator, BuiltArtifactTag, Target}; use normpath::PathExt; use std::collections::HashSet; use std::env; use std::path::{Path, PathBuf}; use std::process::Command; use std::str; /// A table-driven wheel build/install integration scenario. /// /// The case id is used to derive wheel output, cargo target, and virtualenv paths, so it should /// remain stable and descriptive when possible. #[derive(Clone, Copy)] pub struct IntegrationCase<'a> { /// Stable identifier used for derived test paths and failure messages. pub id: &'a str, /// Repo-relative path to the package under test. pub package: &'a str, /// Optional copied-workspace configuration for fixtures that generate files in-tree. pub package_copy: Option>, /// Optional explicit bindings override passed to `maturin build`. pub bindings: Option<&'a str>, /// Whether this case should exercise the zig-backed build path when available. pub zig: bool, /// Optional explicit compilation target for the build. pub target: Option<&'a str>, /// Do introspection to generate type stubs pub generate_stubs: bool, /// Build with `--pgo` flag pub pgo: bool, } impl<'a> IntegrationCase<'a> { pub fn new(id: &'a str, package: &'a str) -> Self { Self { id, package, package_copy: None, bindings: None, zig: false, target: None, generate_stubs: false, pgo: false, } } pub fn copied(mut self, copy: TestPackageCopy<'a>) -> Self { self.package_copy = Some(copy); self } pub fn zig(mut self) -> Self { self.zig = true; self } pub fn target(mut self, target: &'a str) -> Self { self.target = Some(target); self } pub fn generate_stubs(mut self) -> Self { self.generate_stubs = true; self } pub fn pgo(mut self) -> Self { self.pgo = true; self } } // The zig wrappers consult CARGO_BIN_EXE_cargo-zigbuild via process env, so zig builds run in a // subprocess where that override can be scoped to the command instead of mutating global state. fn build_wheels_with_subprocess( cli: &[std::ffi::OsString], wheel_dir: &Path, ) -> Result> { if wheel_dir.is_dir() { fs_err::remove_dir_all(wheel_dir)?; } fs_err::create_dir_all(wheel_dir)?; let output = Command::new(env!("CARGO_BIN_EXE_maturin")) .args(cli) .env( "CARGO_BIN_EXE_cargo-zigbuild", env!("CARGO_BIN_EXE_maturin"), ) .output() .context("failed to invoke maturin build for zig integration test")?; if !output.status.success() { bail!( "maturin build failed with {}.\n--- Stdout:\n{}\n--- Stderr:\n{}", output.status, str::from_utf8(&output.stdout)?.trim(), str::from_utf8(&output.stderr)?.trim(), ); } let mut wheels = fs_err::read_dir(wheel_dir)? .filter_map(|entry| entry.ok()) .map(|entry| entry.path()) .filter(|path| path.extension().is_some_and(|ext| ext == "whl")) .collect::>(); wheels.sort(); if wheels.is_empty() { bail!( "maturin build succeeded but produced no wheels in {}", wheel_dir.display() ); } Ok(wheels) } fn install_and_check_wheel( package: &Path, wheel: &Path, venv_dir: &Path, python: &Path, ) -> Result<()> { let command = [ "-m", "pip", "--disable-pip-version-check", "--no-cache-dir", "install", "--force-reinstall", ]; let output = Command::new(python) .args(command) .arg(dunce::simplified(wheel)) .output() .context(format!("pip install failed with {python:?}"))?; if !output.status.success() { let full_command = format!("{} {}", python.display(), command.join(" ")); bail!( "pip install in {} failed running {:?}: {}\n--- Stdout:\n{}\n--- Stderr:\n{}\n---\n", venv_dir.display(), full_command, output.status, str::from_utf8(&output.stdout)?.trim(), str::from_utf8(&output.stderr)?.trim(), ); } if !output.stderr.is_empty() { bail!( "pip raised a warning running {:?}: {}\n--- Stdout:\n{}\n--- Stderr:\n{}\n---\n", command, output.status, str::from_utf8(&output.stdout)?.trim(), str::from_utf8(&output.stderr)?.trim(), ); } check_installed(package, python) } /// For each installed python version, this builds a wheel, creates a virtualenv if it /// doesn't exist, installs the package and runs check_installed.py pub fn test_integration(case: &IntegrationCase<'_>) -> Result<()> { let package_path = prepare_case_package(case.id, case.package, case.package_copy)?; let package = package_path.as_path(); let package_string = package.join("Cargo.toml").display().to_string(); // The first argument is ignored by clap let shed = case_wheel_dir(case.id); // pgo and zig change compile flags and an explicit target changes the toolchain, so those // cases keep an isolated target dir instead of the shared per-family one. let isolated_target_dir = case.pgo || case.zig || case.target.is_some(); let target_dir = if isolated_target_dir { case_target_dir(case.id) } else { shared_target_dir(case.package) }; let python_interp = test_python_path(); let mut cli: Vec = vec![ "build".into(), "--quiet".into(), "--manifest-path".into(), package_string.into(), "--target-dir".into(), target_dir.into_os_string(), "--out".into(), shed.clone().into_os_string(), ]; if let Some(bindings) = case.bindings { cli.push("--bindings".into()); cli.push(bindings.into()); } if let Some(target) = case.target { cli.push("--target".into()); cli.push(target.into()) } #[cfg(feature = "zig")] let zig_found = Zig::find_zig().is_ok(); #[cfg(not(feature = "zig"))] let zig_found = false; let test_zig = if case.zig && (env::var("GITHUB_ACTIONS").is_ok() || zig_found) { cli.push("--zig".into()); true } else { cli.push("--compatibility".into()); cli.push("linux".into()); false }; // One scope up to extend the lifetime let venvs_dir = Path::new("test-crates") .normalize()? .into_path_buf() .join("venvs"); fs_err::create_dir_all(&venvs_dir)?; let cffi_provider = "cffi-provider"; let cffi_venv = venvs_dir.join(cffi_provider); // on PyPy, we should use the bundled cffi let build_python = if let Some(interp) = python_interp .as_ref() .filter(|interp| interp.contains("pypy")) { cli.push("--interpreter".into()); cli.push(interp.into()); Some(PathBuf::from(interp)) } else { // Install cffi in a separate environment // All tests try to use this venv at the same time, so we need to make sure only one // modifies it at a time and that during that time, no other test reads it. let file = File::create(venvs_dir.join("cffi-provider.lock"))?; file.lock_exclusive()?; let target_triple = Target::from_target_triple(None)?; let mut python = target_triple.get_venv_python(&cffi_venv); // possible arch mismatch between the python interpreter and the cffi venv if e.g. // testing in containers that on the host, clean up conservatively if so if python.exists() { let output = Command::new(&python) .args(["-c", "import cffi"]) .output() .with_context(|| format!("cffi import check failed with {python:?}"))?; if !output.status.success() { fs_err::remove_dir_all(&cffi_venv)?; } } // ... and then create if needed if !cffi_venv.is_dir() { create_named_virtualenv(cffi_provider, python_interp.clone().map(PathBuf::from))?; // re-resolve python because on windows `get_venv_python` depends on what's // actually installed python = target_triple.get_venv_python(&cffi_venv); assert!(python.is_file(), "cffi venv not created correctly"); let pip_install_cffi = [ "-m", "pip", "--disable-pip-version-check", "--no-cache-dir", "install", "cffi", ]; let output = Command::new(&python) .args(pip_install_cffi) .output() .with_context(|| format!("pip install cffi failed with {python:?}"))?; if !output.status.success() { let stderr = String::from_utf8_lossy(&output.stderr); let stdout = String::from_utf8_lossy(&output.stdout); bail!( "Installing cffi into {} failed.\nstdout: {}\nstderr: {}", cffi_venv.display(), stdout, stderr ); } }; file.unlock()?; cli.push("--interpreter".into()); cli.push(python.as_os_str().to_owned()); Some(python) }; if case.generate_stubs { cli.push("--generate-stubs".into()); } if test_zig { // Zig wrappers read CARGO_BIN_EXE_cargo-zigbuild from the process environment. Run the // build in a subprocess so the override is scoped to that command instead of mutating // the global test process environment. let wheels = build_wheels_with_subprocess(&cli, &shed)?; for filename in wheels { check_for_duplicates(&filename)?; let mut venv_name = format!("{}-py3", case.id); if let Some(target) = case.target { venv_name = format!("{venv_name}-{target}"); } let PreparedEnv { env_dir: venv_dir, python, } = prepare_test_env(&venv_name, TestEnvKind::Venv, &[], build_python.clone())?; install_and_check_wheel(package, &filename, &venv_dir, &python)?; } cleanup_case(case.id); return Ok(()); } let options: BuildOptions = BuildOptions::try_parse_from(cli)?; let build_context = options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .pgo(case.pgo) .build()?; let fixture_lock = if isolated_target_dir { None } else { Some(crate::common::lock_fixture(case.package)?) }; let wheels = BuildOrchestrator::new(&build_context).build_wheels()?; drop(fixture_lock); // For abi3 on unix, we didn't use a python interpreter, but we need one here let interpreter = if build_context.python.interpreter.is_empty() { let error_message = "python3 should be a python interpreter"; let venv_interpreter = maturin::PythonInterpreter::check_executable( python_interp.as_deref().unwrap_or("python3"), &build_context.project.target, build_context.project.bridge(), ) .context(error_message)? .context(error_message)?; vec![venv_interpreter] } else { build_context.python.interpreter }; // We can do this since we know that wheels are built and returned in the // order they are in the build context for (wheel, python_interpreter) in wheels.iter().zip(interpreter) { let filename = &wheel.path; check_for_duplicates(filename)?; let mut venv_name = if matches!(&wheel.tag, BuiltArtifactTag::Universal) { format!("{}-py3", case.id) } else { format!( "{}-py{}.{}", case.id, python_interpreter.major, python_interpreter.minor, ) }; if let Some(target) = case.target { venv_name = format!("{venv_name}-{target}"); } let PreparedEnv { env_dir: venv_dir, python, } = prepare_test_env( &venv_name, TestEnvKind::Venv, &[], Some(python_interpreter.executable.clone()), )?; install_and_check_wheel(package, filename, &venv_dir, &python)?; } cleanup_case(case.id); Ok(()) } pub fn test_integration_uv_multi_python(case: &IntegrationCase<'_>) -> Result<()> { let package_path = prepare_case_package(case.id, case.package, case.package_copy)?; let package = package_path.as_path(); let uv = which::which("uv").context("uv is required for this integration test")?; let target = Target::from_target_triple(None)?; let mut interpreters = Vec::new(); for minor in [12, 13] { let env_dir = Path::new("test-crates") .join("venvs") .join(format!("{}-py3{minor}", case.id)); if env_dir.is_dir() { fs_err::remove_dir_all(&env_dir)?; } let python_request = if cfg!(all(windows, target_arch = "aarch64")) { // see https://github.com/astral-sh/uv/issues/19015 // for now uv prefers x64 python on windows aarch64, need // to directly request aarch64 python format!("3.{minor}-aarch64") } else { format!("3.{minor}") }; let output = Command::new(&uv) .args([ "venv", "--seed", "--managed-python", "--python", &python_request, ]) .arg(&env_dir) .output() .context("failed to create uv virtualenv")?; if !output.status.success() { bail!( "uv failed to create a Python 3.{minor} environment: {}\n--- Stdout:\n{}\n--- Stderr:\n{}", output.status, str::from_utf8(&output.stdout)?.trim(), str::from_utf8(&output.stderr)?.trim(), ); } interpreters.push((env_dir.clone(), target.get_venv_python(&env_dir))); } let mut cli: Vec = vec![ "build".into(), "--quiet".into(), "--manifest-path".into(), package.join("Cargo.toml").into_os_string(), "--interpreter".into(), ]; cli.extend( interpreters .iter() .map(|(_, python)| python.as_os_str().to_owned()), ); cli.push("--target-dir".into()); cli.push(case_target_dir(case.id).into_os_string()); cli.push("--out".into()); cli.push(case_wheel_dir(case.id).into_os_string()); let options = BuildOptions::try_parse_from(cli)?; let build_context = options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .pgo(case.pgo) .build()?; let wheels = BuildOrchestrator::new(&build_context).build_wheels()?; let universal = wheels .iter() .all(|wheel| matches!(wheel.tag, BuiltArtifactTag::Universal)); if universal { assert_eq!(wheels.len(), 1); for (env_dir, python) in &interpreters { install_and_check_wheel(package, &wheels[0].path, env_dir, python)?; } } else { assert_eq!(wheels.len(), interpreters.len()); for (wheel, (env_dir, python)) in wheels.iter().zip(&interpreters) { install_and_check_wheel(package, &wheel.path, env_dir, python)?; } } cleanup_case(case.id); Ok(()) } pub fn test_integration_conda( package: impl AsRef, bindings: Option<&str>, case_id: &str, ) -> Result<()> { use crate::common::create_conda_env; use std::path::PathBuf; use std::process::Stdio; let package_string = package.as_ref().join("Cargo.toml").display().to_string(); // Create environments to build against, prepended with "A" to ensure that integration // tests are executed with these environments. Conda env creation is slow, so only cover // the oldest and newest supported versions instead of every minor release in between. let mut interpreters = Vec::new(); for minor in [10, 14] { let (_, venv_python) = create_conda_env(&format!("maturin-{case_id}-3{minor}"), 3, minor)?; interpreters.push(venv_python); } // The first argument is ignored by clap let mut cli: Vec = vec![ "build".into(), "--manifest-path".into(), package_string.into(), "--quiet".into(), "--interpreter".into(), ]; for interp in &interpreters { cli.push(interp.to_str().unwrap().into()); } if let Some(bindings) = bindings { cli.push("--bindings".into()); cli.push(bindings.into()); } cli.push("--target-dir".into()); cli.push(case_target_dir(case_id).into_os_string()); cli.push("--out".into()); cli.push(case_wheel_dir(case_id).into_os_string()); let options = BuildOptions::try_parse_from(cli)?; let build_context = options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .build()?; let wheels = BuildOrchestrator::new(&build_context).build_wheels()?; let mut conda_wheels: Vec<(PathBuf, PathBuf)> = vec![]; for (wheel, python_interpreter) in wheels.iter().zip(build_context.python.interpreter) { let executable = python_interpreter.executable; if executable.to_string_lossy().contains(case_id) { conda_wheels.push((wheel.path.clone(), executable)) } } assert_eq!( interpreters.len(), conda_wheels.len(), "Error creating or detecting conda environments." ); for (wheel_file, executable) in conda_wheels { let output = Command::new(&executable) .args([ "-m", "pip", "--disable-pip-version-check", "install", "--force-reinstall", ]) .arg(dunce::simplified(&wheel_file)) .stderr(Stdio::inherit()) .output()?; if !output.status.success() { panic!(); } check_installed(package.as_ref(), &executable)?; } cleanup_case(case_id); Ok(()) } /// See and /// . fn check_for_duplicates(wheel: &Path) -> Result<()> { let mut seen = HashSet::new(); let mut reader = File::open(wheel)?; // We have to use this API since `ZipArchive` deduplicates names. while let Some(file) = zip::read::read_zipfile_from_stream(&mut reader)? { let name = file.name()?; if !seen.insert(name.to_string()) { bail!("Duplicate file: {}", name); } } Ok(()) } maturin-1.16.0/tests/common/mod.rs000066400000000000000000000433431527064705700170610ustar00rootroot00000000000000use anyhow::{Context, Result, bail}; use fs_err as fs; use maturin::Target; use normpath::PathExt as _; use std::path::Path; use std::path::PathBuf; use std::process::{Command, Stdio}; use std::{env, str}; pub mod develop; pub mod errors; pub mod integration; pub mod other; pub mod pep517; #[derive(Clone, Copy, PartialEq, Eq)] pub enum TestInstallBackend { Pip, Uv, } #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum TestEnvKind { Venv, Conda { major: usize, minor: usize }, } pub struct PreparedEnv { pub env_dir: PathBuf, pub python: PathBuf, } /// Copy a fixture into an isolated per-case workspace before running the test. /// /// Most cases run directly from `test-crates/...`, but some mixed-layout fixtures write generated /// files back into their source tree. Those cases use a copied workspace under /// `test-crates/case-packages/` so parallel runs do not mutate the shared fixture. #[derive(Clone, Copy)] pub struct TestPackageCopy<'a> { /// Additional repo-relative fixture roots to copy alongside the primary package, such as path /// dependencies that live outside the package tree. pub extra_copy_paths: &'a [&'a str], /// Repo-relative generated files or directories to remove from the copied workspace before the /// test starts so each run begins from the checked-in fixture state. pub prune_copy_paths: &'a [&'a str], } pub const CFFI_MIXED_INCLUDE_EXCLUDE_COPY: TestPackageCopy<'static> = TestPackageCopy { extra_copy_paths: &[], prune_copy_paths: &[ "test-crates/cffi-mixed-include-exclude/cffi_mixed_include_exclude/cffi_mixed_include_exclude", "test-crates/cffi-mixed-include-exclude/cffi_mixed_include_exclude/generated_info.txt", ], }; pub const CFFI_MIXED_SUBMODULE_COPY: TestPackageCopy<'static> = TestPackageCopy { extra_copy_paths: &[], prune_copy_paths: &["test-crates/cffi-mixed-submodule/cffi_mixed_submodule/rust_module/rust"], }; pub const CFFI_MIXED_WITH_PATH_DEP_COPY: TestPackageCopy<'static> = TestPackageCopy { extra_copy_paths: &[ "test-crates/some_path_dep", "test-crates/transitive_path_dep", ], prune_copy_paths: &[ "test-crates/cffi-mixed-with-path-dep/cffi_mixed_with_path_dep/cffi_mixed_with_path_dep", ], }; pub const CFFI_MIXED_IMPLICIT_COPY: TestPackageCopy<'static> = TestPackageCopy { extra_copy_paths: &[], prune_copy_paths: &[ "test-crates/cffi-mixed-implicit/python/cffi_mixed_implicit/some_rust/rust", ], }; pub const CFFI_MIXED_PY_SUBDIR_COPY: TestPackageCopy<'static> = TestPackageCopy { extra_copy_paths: &[], prune_copy_paths: &["test-crates/cffi-mixed-py-subdir/python/cffi_mixed_py_subdir/_cffi_mixed"], }; pub const CFFI_MIXED_SRC_COPY: TestPackageCopy<'static> = TestPackageCopy { extra_copy_paths: &[], prune_copy_paths: &["test-crates/cffi-mixed-src/src/cffi_mixed_src/cffi_mixed_src"], }; /// Test builds must not strip symbols: uniffi proc-macro bindings and pyo3 /// stub generation read metadata from the compiled artifact, which /// `-C strip=symbols` would remove. pub const TEST_STRIP: Option = Some(false); pub fn repo_root() -> PathBuf { PathBuf::from(env!("CARGO_MANIFEST_DIR")) } pub fn repo_test_crates_dir() -> PathBuf { repo_root().join("test-crates") } pub fn case_target_dir(case_id: &str) -> PathBuf { repo_test_crates_dir().join("targets").join(case_id) } /// Cargo target directory shared by test cases that build the same dependency family. /// /// Isolated per-case target directories mean every case recompiles its whole dependency tree /// from scratch, which dominates test time in CI. Cases with compatible build configurations /// share a per-family directory instead: dependencies compile once, cargo's build lock /// serializes concurrent builds within a directory, and artifacts for different crates and /// feature sets coexist keyed by cargo's fingerprint. /// /// Cases must keep an isolated [`case_target_dir`] when they: /// - change compile flags per case (pgo, zig, explicit `--target`), /// - build against multiple or unusual interpreters (conda, uv multi-python), or /// - assert on target directory contents (pep517 profile checks, stable ABI selection /// which deletes the directory). pub fn shared_target_dir(package: impl AsRef) -> PathBuf { let family = ["pyo3", "cffi", "uniffi"] .into_iter() .find(|family| fixture_name(package.as_ref()).starts_with(family)) .unwrap_or("misc"); repo_test_crates_dir() .join("targets") .join(format!("shared-{family}")) } /// The fixture directory name under `test-crates/` for a package path. fn fixture_name(package: &Path) -> String { let mut components = package.components(); components .find(|c| c.as_os_str() == "test-crates") .and_then(|_| components.next()) .map(|c| c.as_os_str().to_string_lossy().into_owned()) .unwrap_or_default() } /// Serialize builds of the same fixture across concurrently running tests. /// /// Cargo's own build lock makes concurrent cargo invocations in a shared target directory safe, /// but maturin stages built artifacts under `target/maturin/` — moving them out of cargo's /// output path and back — so two concurrent maturin builds of the *same* crate race on the /// staged files. Tests that compile a fixture in a [`shared_target_dir`] must hold this lock /// from before the build starts until the wheel is packed; the lock is released when the /// returned guard is dropped. Builds of different fixtures proceed in parallel. pub struct FixtureLock { _file: fs::File, } pub fn lock_fixture(package: impl AsRef) -> Result { use fs4::fs_err3::FileExt as _; let locks_dir = repo_test_crates_dir().join("targets").join("locks"); fs::create_dir_all(&locks_dir)?; let lock_path = locks_dir.join(format!("{}.lock", fixture_name(package.as_ref()))); let file = fs::File::create(&lock_path)?; file.lock_exclusive()?; Ok(FixtureLock { _file: file }) } pub fn case_wheel_dir(case_id: &str) -> PathBuf { repo_test_crates_dir().join("wheels").join(case_id) } /// Remove the target and wheel directories for a test case to reclaim disk space. /// /// Controlled by the `MATURIN_TEST_CLEANUP` environment variable. When set to `1` or `true`, /// the cargo target directory and wheel output directory for the given case are deleted after the /// test completes. This is useful in CI where disk space is limited and many test cases can /// accumulate gigabytes of build artifacts. pub fn cleanup_case(case_id: &str) { if env::var("MATURIN_TEST_CLEANUP") .map(|v| v == "1" || v.eq_ignore_ascii_case("true")) .unwrap_or(false) { let target_dir = case_target_dir(case_id); if target_dir.is_dir() { let _ = fs::remove_dir_all(&target_dir); } let wheel_dir = case_wheel_dir(case_id); if wheel_dir.is_dir() { let _ = fs::remove_dir_all(&wheel_dir); } } } pub fn is_ci() -> bool { env::var("GITHUB_ACTIONS").is_ok() } pub fn has_conda() -> bool { which::which("conda").is_ok() || which::which("micromamba").is_ok() } pub fn has_uv() -> bool { which::which("uv").is_ok() } pub fn has_uniffi_bindgen() -> bool { which::which("uniffi-bindgen").is_ok() } /// Check that the package is either not installed or works correctly pub fn check_installed(package: &Path, python: &Path) -> Result<()> { let path = if cfg!(windows) { // on Windows, also add Scripts to PATH let python_dir = python.parent().unwrap(); env::join_paths([&python_dir.join("Scripts"), python_dir])?.into() } else { python.parent().unwrap().to_path_buf() }; let mut check_installed = Path::new(package) .join("check_installed") .join("check_installed.py"); if !check_installed.is_file() { check_installed = Path::new(package) .parent() .unwrap() .join("check_installed") .join("check_installed.py"); } let output = Command::new(python) .arg(check_installed) .env("PATH", path) .output() .unwrap(); if !output.status.success() { bail!( "Check install fail: {} \n--- Stdout:\n{}\n--- Stderr:\n{}", output.status, str::from_utf8(&output.stdout)?, str::from_utf8(&output.stderr)? ); } let stdout = str::from_utf8(&output.stdout).unwrap().trim(); // Check the last line only: some interpreters (e.g. PyPy) may emit // extra debug output to stdout before our print("SUCCESS"). let last_line = stdout.lines().last().unwrap_or(""); if last_line != "SUCCESS" { panic!("Not SUCCESS: {stdout}"); } Ok(()) } /// Better error formatting #[track_caller] pub fn handle_result(result: Result) -> T { match result { Err(e) => { for cause in e.chain().rev() { eprintln!("Cause: {cause}"); } panic!("{}", e); } Ok(result) => result, } } /// Get Python implementation pub fn get_python_implementation(python_interp: &Path) -> Result { let code = "import sys; print(sys.implementation.name, end='')"; let output = Command::new(python_interp).arg("-c").arg(code).output()?; let python_impl = String::from_utf8(output.stdout).unwrap(); Ok(python_impl) } /// Get the current tested Python implementation pub fn test_python_implementation() -> Result { let python = test_python_path().map(PathBuf::from).unwrap_or_else(|| { let target = Target::from_target_triple(None).unwrap(); target.get_python() }); get_python_implementation(&python) } /// Returns `(major, minor)` of the current tested Python interpreter. pub fn test_python_version() -> Result<(u32, u32)> { let python = test_python_path().map(PathBuf::from).unwrap_or_else(|| { let target = Target::from_target_triple(None).unwrap(); target.get_python() }); let code = "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}', end='')"; let output = Command::new(&python).arg("-c").arg(code).output()?; let version = str::from_utf8(&output.stdout)?.trim(); let (major, minor) = version .split_once('.') .with_context(|| format!("unexpected python version output: {version:?}"))?; Ok((major.parse()?, minor.parse()?)) } /// Returns true when the current tested Python supports the abi3t stable ABI /// (CPython >= 3.15). PyPy / GraalPy never support abi3t. pub fn test_python_supports_abi3t() -> bool { if test_python_implementation() .map(|impl_name| impl_name != "cpython") .unwrap_or(true) { return false; } match test_python_version() { Ok((major, minor)) => (major, minor) >= (3, 15), Err(_) => false, } } /// Create virtualenv pub fn create_virtualenv(name: &str, python_interp: Option) -> Result<(PathBuf, PathBuf)> { let interp = python_interp.or_else(|| test_python_path().map(PathBuf::from)); let venv_interp = interp.clone().unwrap_or_else(|| { let target = Target::from_target_triple(None).unwrap(); target.get_python() }); let venv_name = match get_python_implementation(&venv_interp) { Ok(python_impl) => format!("{name}-{python_impl}"), Err(_) => name.to_string(), }; let venv_dir = create_named_virtualenv(&venv_name, interp)?; let target = Target::from_target_triple(None)?; let python = target.get_venv_python(&venv_dir); Ok((venv_dir, python)) } pub fn create_named_virtualenv(venv_name: &str, interp: Option) -> Result { let venv_dir = repo_test_crates_dir() .normalize()? .into_path_buf() .join("venvs") .join(venv_name); if venv_dir.is_dir() { fs::remove_dir_all(&venv_dir)?; } let mut cmd = { if let Ok(uv) = which::which("uv") { let mut cmd = Command::new(uv); cmd.args(["venv", "--seed"]); cmd } else { Command::new("virtualenv") } }; if let Some(interp) = interp { cmd.arg("-p").arg(interp); } let output = cmd .arg(dunce::simplified(&venv_dir)) .stderr(Stdio::inherit()) .output() .expect("Failed to create a virtualenv"); if !output.status.success() { panic!( "Failed to run virtualenv: {}\n---stdout:\n{}---stderr:\n{}", output.status, str::from_utf8(&output.stdout)?, str::from_utf8(&output.stderr)? ); } Ok(venv_dir) } pub fn install_pip_packages(python: &Path, packages: &[&str]) -> Result<()> { if packages.is_empty() { return Ok(()); } let output = Command::new(python) .args(["-m", "pip", "install", "--disable-pip-version-check"]) .args(packages) .output()?; if !output.status.success() { bail!( "Failed to install {:?}: {}\n---stdout:\n{}---stderr:\n{}", packages, output.status, str::from_utf8(&output.stdout)?, str::from_utf8(&output.stderr)? ); } Ok(()) } /// Creates conda environments pub fn create_conda_env(name: &str, major: usize, minor: usize) -> Result<(PathBuf, PathBuf)> { use serde::Deserialize; #[derive(Deserialize)] struct CondaCreateResult { prefix: PathBuf, success: bool, } // conda and micromamba share the same `create` CLI and --json output fields we need // (top-level `prefix` and `success`). micromamba is preferred because it is much faster; // on Windows `conda` is a batch file and needs to go through cmd.exe. let mut cmd = if let Ok(micromamba) = which::which("micromamba") { let mut cmd = Command::new(micromamba); if env::var_os("MAMBA_ROOT_PREFIX").is_none() { // micromamba errors without a root prefix; keep envs under test-crates cmd.arg("--root-prefix") .arg(repo_test_crates_dir().join("venvs").join("mamba-root")); } cmd } else if cfg!(windows) { let mut cmd = Command::new("cmd.exe"); cmd.arg("/c").arg("conda"); cmd } else { Command::new("conda") }; let output = cmd .arg("create") .arg("-n") .arg(name) .arg(format!("python={major}.{minor}")) .arg("-q") .arg("-y") .arg("--json") .output() .expect("Conda not available."); if !output.status.success() { panic!( "Failed to create conda environment: {}\n---stdout:\n{}---stderr:\n{}", output.status, str::from_utf8(&output.stdout)?, str::from_utf8(&output.stderr)? ); } let result: CondaCreateResult = serde_json::from_slice(&output.stdout)?; if !result.success { bail!("Failed to create conda environment {}.", name); } let target = Target::from_target_triple(None)?; let python = target.get_venv_python(&result.prefix); Ok((result.prefix, python)) } pub fn prepare_test_env( case_id: &str, env_kind: TestEnvKind, prereq_packages: &[&str], python_interp: Option, ) -> Result { let (root, python) = match env_kind { TestEnvKind::Venv => create_virtualenv(case_id, python_interp)?, TestEnvKind::Conda { major, minor } => { create_conda_env(&format!("maturin-{case_id}"), major, minor)? } }; install_pip_packages(&python, prereq_packages)?; Ok(PreparedEnv { env_dir: root, python, }) } pub fn manifest_path_for_package(package: &Path) -> PathBuf { let pyproject_file = package.join("pyproject.toml"); if pyproject_file.is_file() && let Ok(pyproject) = maturin::pyproject_toml::PyProjectToml::new(&pyproject_file) && let Some(manifest_path) = pyproject.manifest_path() { return package.join(manifest_path); } package.join("Cargo.toml") } fn fixture_root_for_package(package: &Path) -> Result { let rel = package .strip_prefix("test-crates") .with_context(|| format!("package path {package:?} must be under test-crates/"))?; let fixture = rel .components() .next() .with_context(|| format!("package path {package:?} is missing a fixture name"))?; Ok(Path::new("test-crates").join(fixture.as_os_str())) } fn remove_if_exists(path: &Path) -> Result<()> { if path.is_dir() { fs::remove_dir_all(path)?; } else if path.is_file() { fs::remove_file(path)?; } Ok(()) } pub fn prepare_case_package( case_id: &str, package: &str, package_copy: Option>, ) -> Result { if let Some(package_copy) = package_copy { // Rebuild the isolated workspace from the checked-in fixture on every run so tests do not // inherit generated files from previous cases. let isolated_root = repo_test_crates_dir().join("case-packages").join(case_id); remove_if_exists(&isolated_root)?; let fixture_root = fixture_root_for_package(Path::new(package))?; let copy_roots = std::iter::once(fixture_root) .chain(package_copy.extra_copy_paths.iter().map(PathBuf::from)); for copy_root in copy_roots { let src = repo_root().join(©_root); let dst = isolated_root.join(©_root); other::copy_dir_recursive(&src, &dst)?; } for prune_path in package_copy.prune_copy_paths { remove_if_exists(&isolated_root.join(prune_path))?; } return Ok(isolated_root.join(package)); } Ok(repo_root().join(package)) } /// Path to the python interpreter for testing pub fn test_python_path() -> Option { env::var("MATURIN_TEST_PYTHON").ok() } maturin-1.16.0/tests/common/other.rs000066400000000000000000000766771527064705700174430ustar00rootroot00000000000000use anyhow::{Context, Result}; use clap::Parser; use expect_test::Expect; use flate2::read::GzDecoder; use fs_err::File; use maturin::pyproject_toml::{SdistGenerator, ToolMaturin}; use maturin::{ BuildOptions, BuildOrchestrator, CargoOptions, OutputOptions, PlatformOptions, PlatformTag, PythonOptions, unpack_sdist, }; use pretty_assertions::assert_eq; use std::collections::BTreeSet; use std::io::Read; use std::path::{Path, PathBuf}; use std::process::Command; use tar::Archive; use time::PrimitiveDateTime; use walkdir::WalkDir; use zip::ZipArchive; pub fn copy_dir_recursive(src: &Path, dst: &Path) -> std::io::Result<()> { fs_err::create_dir_all(dst)?; for entry in fs_err::read_dir(src)? { let entry = entry?; let name = entry.file_name(); let name_str = name.to_string_lossy(); // Skip build artifacts and caches if name_str == "target" || name_str == "__pycache__" || name_str.ends_with(".pyc") || name_str.ends_with(".pyd") || name_str.ends_with(".so") || name_str.ends_with(".dll") || name_str.ends_with(".dylib") || name_str.ends_with(".dSYM") { continue; } let src_path = entry.path(); let dst_path = dst.join(name); if src_path.is_dir() { copy_dir_recursive(&src_path, &dst_path)?; } else { fs_err::copy(&src_path, &dst_path)?; } } Ok(()) } /// Tries to compile a sample crate (pyo3-pure) for musl, /// given that rustup and the the musl target are installed /// /// The bool in the Ok() response says whether the test was actually run pub fn test_musl() -> Result { use anyhow::bail; use fs_err as fs; use fs_err::File; use goblin::elf::Elf; use std::io::ErrorKind; use std::process::Command; let get_target_list = Command::new("rustup") .args(["target", "list", "--installed"]) .output(); match get_target_list { Ok(output) => { if output.status.success() { let has_musl = String::from_utf8_lossy(&output.stdout) .lines() .any(|line| line.trim() == "x86_64-unknown-linux-musl"); if !has_musl { return Ok(false); } } else { bail!( "`rustup target list --installed` failed with status {}", output.status ) } } // Ignore installations without rustup Err(err) if err.kind() == ErrorKind::NotFound => return Ok(false), Err(err) => return Err(err.into()), }; // The first arg gets ignored let options: BuildOptions = BuildOptions::try_parse_from([ "build", "--manifest-path", "test-crates/hello-world/Cargo.toml", "--interpreter", "python3", "--target", "x86_64-unknown-linux-musl", "--compatibility", "linux", "--quiet", "--target-dir", "test-crates/targets/test_musl", "--out", "test-crates/wheels/test_musl", ])?; let build_context = options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .build()?; let built_lib = PathBuf::from("test-crates/targets/test_musl/x86_64-unknown-linux-musl/debug/hello-world"); if built_lib.is_file() { fs::remove_file(&built_lib)?; } let wheels = BuildOrchestrator::new(&build_context).build_wheels()?; assert_eq!(wheels.len(), 1); // Ensure that we've actually built for musl assert!(built_lib.is_file()); let mut file = File::open(built_lib)?; let mut buffer = Vec::new(); file.read_to_end(&mut buffer)?; let elf = Elf::parse(&buffer)?; assert_eq!(elf.libraries, Vec::<&str>::new()); Ok(true) } /// Test that we ignore non-existent Cargo.lock file listed by `cargo package --list`, /// which seems to only occur with workspaces. /// See https://github.com/rust-lang/cargo/issues/7938#issuecomment-593280660 and /// https://github.com/PyO3/maturin/issues/449 pub fn test_workspace_cargo_lock() -> Result<()> { // The first arg gets ignored let options: BuildOptions = BuildOptions::try_parse_from([ "build", "--manifest-path", "test-crates/workspace/py/Cargo.toml", "--compatibility", "linux", "--quiet", "--target-dir", "test-crates/targets/test_workspace_cargo_lock", "--out", "test-crates/wheels/test_workspace_cargo_lock", ])?; let build_context = options .into_build_context() .strip(Some(false)) .editable(false) .build()?; let source_distribution = BuildOrchestrator::new(&build_context).build_source_distribution()?; assert!(source_distribution.is_some()); Ok(()) } pub fn build_source_distribution( package: impl AsRef, sdist_generator: SdistGenerator, unique_name: &str, ) -> Result>> { let target_dir = crate::common::case_target_dir(unique_name); build_source_distribution_with_target_dir(package, sdist_generator, target_dir, unique_name) } fn build_source_distribution_with_target_dir( package: impl AsRef, sdist_generator: SdistGenerator, target_dir: PathBuf, unique_name: &str, ) -> Result>> { let manifest_path = package.as_ref().join("Cargo.toml"); let sdist_directory = crate::common::case_wheel_dir(unique_name); let build_options = BuildOptions { output: OutputOptions { out: Some(sdist_directory), ..Default::default() }, cargo: CargoOptions { manifest_path: Some(manifest_path), quiet: true, target_dir: Some(target_dir), ..Default::default() }, ..Default::default() }; let mut build_context = build_options .into_build_context() .strip(Some(false)) .editable(false) .sdist_only(true) .build()?; // Override the sdist generator for testing let mut pyproject_toml = build_context.project.pyproject_toml.take().unwrap(); let mut tool = pyproject_toml.tool.clone().unwrap_or_default(); if let Some(ref mut tool_maturin) = tool.maturin { tool_maturin.sdist_generator = sdist_generator; } else { tool.maturin = Some(ToolMaturin { sdist_generator, ..Default::default() }); } pyproject_toml.tool = Some(tool); build_context.project.pyproject_toml = Some(pyproject_toml); let sdist = BuildOrchestrator::new(&build_context) .build_source_distribution()? .context("Failed to build source distribution")?; let tar_gz = fs_err::File::open(sdist.path)?; let tar = GzDecoder::new(tar_gz); let archive = Archive::new(tar); Ok(archive) } pub fn test_source_distribution( package: impl AsRef, sdist_generator: SdistGenerator, expected_files: Expect, expected_cargo_toml: Option<(&Path, Expect)>, unique_name: &str, ) -> Result<()> { let mut archive = build_source_distribution(package, sdist_generator, unique_name)?; let mut files = BTreeSet::new(); let mut file_count = 0; let mut cargo_toml = None; for entry in archive.entries()? { let mut entry = entry?; files.insert(format!("{}", entry.path()?.display())); file_count += 1; if let Some(cargo_toml_path) = expected_cargo_toml.as_ref().map(|(p, _)| *p) && entry.path()? == cargo_toml_path { let mut contents = String::new(); entry.read_to_string(&mut contents)?; cargo_toml = Some(contents); } } expected_files.assert_debug_eq(&files); assert_eq!( file_count, files.len(), "duplicated files found in sdist: {:?}", files ); if let Some((cargo_toml_path, expected)) = expected_cargo_toml { let cargo_toml = cargo_toml .with_context(|| format!("{} not found in sdist", cargo_toml_path.display()))?; expected.assert_eq(&cargo_toml.replace("\r\n", "\n")); } Ok(()) } pub fn check_sdist_mtimes( package: impl AsRef, expected_mtime: u64, unique_name: &str, ) -> Result<()> { let mut archive = build_source_distribution(package, SdistGenerator::Cargo, unique_name)?; for entry in archive.entries()? { let entry = entry?; let filename = entry.header().path()?; let mtime = entry.header().mtime()?; assert_eq!( mtime, expected_mtime, "File {} has an mtime of {} instead of {}", filename.display(), mtime, expected_mtime ); } Ok(()) } fn build_wheel_files(package: impl AsRef, unique_name: &str) -> Result> { let target_dir = crate::common::shared_target_dir(&package); let _fixture_lock = crate::common::lock_fixture(&package)?; build_wheel_files_with_target_dir(package, target_dir, unique_name) } fn build_wheel_files_with_target_dir( package: impl AsRef, target_dir: PathBuf, unique_name: &str, ) -> Result> { let manifest_path = package.as_ref().join("Cargo.toml"); let wheel_directory = Path::new("test-crates").join("wheels").join(unique_name); let build_options = BuildOptions { output: OutputOptions { out: Some(wheel_directory), ..Default::default() }, cargo: CargoOptions { manifest_path: Some(manifest_path), quiet: true, target_dir: Some(target_dir), ..Default::default() }, platform: PlatformOptions { platform_tag: vec![PlatformTag::Linux.into()], ..Default::default() }, ..Default::default() }; let build_context = build_options .into_build_context() .strip(Some(false)) .editable(false) .build()?; let wheels = BuildOrchestrator::new(&build_context) .build_wheels() .context("Failed to build wheels")?; assert!(!wheels.is_empty()); let wheel_path = &wheels[0].path; let wheel = ZipArchive::new(File::open(wheel_path)?)?; Ok(wheel) } pub fn check_wheel_mtimes( package: impl AsRef, expected_mtime: Vec, unique_name: &str, ) -> Result<()> { let mut wheel = build_wheel_files(package, unique_name)?; let mut mtimes = BTreeSet::::new(); for idx in 0..wheel.len() { let mtime = wheel.by_index(idx)?.last_modified().unwrap().try_into()?; mtimes.insert(mtime); } assert_eq!(mtimes, expected_mtime.into_iter().collect::>()); Ok(()) } pub fn check_wheel_paths( package: impl AsRef, record_file: &str, unique_name: &str, ) -> Result<()> { let mut wheel = build_wheel_files(package, unique_name)?; let mut f = wheel.by_path(record_file)?; let mut s = String::new(); f.read_to_string(&mut s)?; assert!(!s.contains("\\")); Ok(()) } pub fn check_wheel_files( package: impl AsRef, expected_files: Vec<&str>, unique_name: &str, ) -> Result<()> { assert_eq!( wheel_files(package, unique_name)?, expected_files .into_iter() .map(str::to_owned) .collect::>() ); Ok(()) } pub fn wheel_files(package: impl AsRef, unique_name: &str) -> Result> { let wheel = build_wheel_files(package, unique_name)?; let drop_platform_specific_files = |file: &std::borrow::Cow<'_, str>| -> bool { !matches!(Path::new(file.as_ref()).extension(), Some(ext) if ext == "pyc" || ext == "pyd" || ext == "so" || ext == "pdb" || ext == "dwp") && !file.contains(".dSYM/") }; Ok(wheel .file_names() .collect::>>()? .into_iter() .filter(drop_platform_specific_files) .map(|name| name.into_owned()) .collect::>()) } #[cfg(feature = "sbom")] pub fn check_wheel_files_with_sbom(package: impl AsRef, unique_name: &str) -> Result<()> { let wheel = build_wheel_files(&package, unique_name)?; let sbom_files: Vec = wheel .file_names() .collect::>>()? .into_iter() .filter(|f| f.contains(".dist-info/sboms/")) .map(|f| f.to_string()) .collect(); assert!( !sbom_files.is_empty(), "Expected SBOM files in the wheel, but found none. Wheel contents: {:?}", wheel.file_names().collect::>() ); for sbom_file in &sbom_files { assert!( sbom_file.ends_with(".cyclonedx.json"), "Expected SBOM file to have .cyclonedx.json extension, got: {sbom_file}" ); } Ok(()) } pub fn abi3_python_interpreter_args() -> Result<()> { // Case 1: maturin build without `-i`, should work let options = BuildOptions::try_parse_from(vec![ "build", "--manifest-path", "test-crates/pyo3-pure/Cargo.toml", "--quiet", ])?; let result = options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .build(); assert!(result.is_ok()); // Case 2: maturin build -i python3.10, should work because python3.10 is in bundled sysconfigs let options = BuildOptions::try_parse_from(vec![ "build", "--manifest-path", "test-crates/pyo3-pure/Cargo.toml", "--quiet", "-i", "python3.10", ])?; let result = options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .build(); assert!(result.is_ok()); // Windows is a bit different so we exclude it from case 3 & 4 // Case 3: maturin build -i python2.7, errors because python2.7 is supported #[cfg(not(windows))] { let options = BuildOptions::try_parse_from(vec![ "build", "--manifest-path", "test-crates/pyo3-pure/Cargo.toml", "--quiet", "-i", "python2.7", ])?; let result = options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .build(); assert!(result.is_err()); // Case 4: maturin build -i python-does-not-exists, errors because python executable is not found let options = BuildOptions::try_parse_from(vec![ "build", "--manifest-path", "test-crates/pyo3-pure/Cargo.toml", "--quiet", "-i", "python-does-not-exists", ])?; let result = options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .build(); assert!(result.is_err()); } Ok(()) } pub fn abi3_without_version() -> Result<()> { let python = crate::common::test_python_path().unwrap_or_else(|| "python3".to_string()); // The first argument is ignored by clap let cli = vec![ "build", "--manifest-path", "test-crates/pyo3-abi3-without-version/Cargo.toml", "--quiet", "--interpreter", python.as_str(), "--target-dir", "test-targets/wheels/abi3_without_version", ]; let options = BuildOptions::try_parse_from(cli)?; let result = options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .build(); assert!(result.is_ok()); Ok(()) } pub fn pyo3_cffi_build_script() -> Result<()> { let base = crate::common::test_python_path().map(PathBuf::from); let venv_dir = crate::common::create_named_virtualenv("pyo3-cffi-build-script", base)?; let venv_python = maturin::Target::from_target_triple(None)?.get_venv_python(&venv_dir); crate::common::install_pip_packages(&venv_python, &["cffi"])?; let python = venv_python .to_str() .context("venv python path is not utf-8")?; // The first argument is ignored by clap let cli = vec![ "build", "--manifest-path", "test-crates/pyo3-cffi-build-script/Cargo.toml", "--quiet", "--interpreter", python, "--target-dir", "test-targets/wheels/pyo3_cffi_build_script", ]; let options = BuildOptions::try_parse_from(cli)?; let build_context = options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .build()?; // Actually build the wheel so the crate's build.rs runs. let wheels = BuildOrchestrator::new(&build_context).build_wheels(); assert!(wheels.is_ok()); Ok(()) } pub fn abi3t_without_version() -> Result<()> { let python = crate::common::test_python_path().unwrap_or_else(|| "python3".to_string()); // The first argument is ignored by clap let cli = vec![ "build", "--manifest-path", "test-crates/pyo3-abi3t-without-version/Cargo.toml", "--quiet", "--interpreter", python.as_str(), "--target-dir", "test-targets/wheels/abi3t_without_version", ]; let options = BuildOptions::try_parse_from(cli)?; let result = options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .build(); assert!(result.is_ok()); Ok(()) } fn expected_combined_stable_abi_tags( python_interpreter: &maturin::PythonInterpreter, ) -> Option<&'static [&'static str]> { if python_interpreter.implementation_name != "cpython" { return None; } match ( python_interpreter.major, python_interpreter.minor, python_interpreter.gil_disabled, ) { (3, 8..=14, false) => Some(&["cp38-abi3"]), (3, 14, true) => Some(&["cp314-cp314t"]), (3, 15, false) => Some(&["cp315-abi3.abi3t"]), (3, 15, true) => Some(&["cp315-abi3.abi3t"]), _ => None, } } pub fn combined_stable_abi_wheel_selection(unique_name: &str, features: &[&str]) -> Result<()> { let python = crate::common::test_python_path() .map(PathBuf::from) .unwrap_or_else(|| PathBuf::from("python3")); let target_dir = crate::common::case_target_dir(unique_name); let wheel_dir = crate::common::case_wheel_dir(unique_name); let options = BuildOptions { python: PythonOptions { interpreter: vec![python], ..Default::default() }, output: OutputOptions { out: Some(wheel_dir.clone()), ..Default::default() }, cargo: CargoOptions { manifest_path: Some(Path::new("test-crates/pyo3-abi3-and-abi3t").join("Cargo.toml")), quiet: true, target_dir: Some(target_dir.clone()), features: features.iter().map(|feature| feature.to_string()).collect(), no_default_features: !features.is_empty(), ..Default::default() }, ..Default::default() }; let build_context = options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .build()?; let python_interpreter = build_context .python .interpreter .first() .context("no Python interpreter resolved")?; let Some(expected) = expected_combined_stable_abi_tags(python_interpreter) else { eprintln!("Skipping combined stable ABI wheel-selection test for {python_interpreter}"); return Ok(()); }; for dir in [&target_dir, &wheel_dir] { if dir.is_dir() { fs_err::remove_dir_all(dir)?; } } let wheels = BuildOrchestrator::new(&build_context).build_wheels()?; let actual = wheels .iter() .map(|wheel| { let wheel_path = &wheel.path; let filename = wheel_path.file_name().unwrap().to_str().unwrap(); let mut fields = filename.strip_suffix(".whl").unwrap().rsplit('-'); let _platform = fields.next().unwrap(); let abi = fields.next().unwrap(); let python = fields.next().unwrap(); format!("{python}-{abi}") }) .collect::>(); let expected = expected.iter().copied().map(String::from).collect(); assert_eq!(actual, expected); // Stable ABI extensions only include SOABI_PLATFORM when the minimum version is 3.15+, // older Pythons don't accept such filenames. if !cfg!(windows) { for wheel in &wheels { let filename = wheel.path.file_name().unwrap().to_str().unwrap(); let expected_suffix = if filename.contains("-cp38-abi3-") { ".abi3.so".to_string() } else if filename.contains("-cp315-abi3.abi3t-") { match &python_interpreter.soabi_platform { Some(platform) => format!(".abi3t-{platform}.so"), None => ".abi3t.so".to_string(), } } else { continue; }; let archive = ZipArchive::new(File::open(&wheel.path)?)?; let extensions: Vec<_> = archive .file_names() .collect::>>()? .into_iter() .filter(|name| name.ends_with(".so")) .collect(); assert_eq!( extensions, [format!( "pyo3_abi3_and_abi3t/pyo3_abi3_and_abi3t{expected_suffix}" )] ); } } crate::common::cleanup_case(unique_name); Ok(()) } /// Test that builds succeed even when there are unreadable directories in the project root. /// /// See https://github.com/PyO3/maturin/issues/2777 #[cfg(unix)] pub fn test_unreadable_dir() -> Result<()> { use std::os::unix::fs::PermissionsExt; // Root bypasses permission checks, so we can't test this as root. if nix::unistd::getuid().is_root() { return Ok(()); } let temp_dir = tempfile::tempdir()?; let project_dir = temp_dir.path().join("pyo3-mixed"); copy_dir_recursive(Path::new("test-crates/pyo3-mixed"), &project_dir)?; // Create an unreadable dir that is not the python package. let unreadable_dir = project_dir.join("unreadable_cache"); fs_err::create_dir(&unreadable_dir)?; fs_err::write(unreadable_dir.join("cache_file"), "cached data")?; fs_err::set_permissions(&unreadable_dir, std::fs::Permissions::from_mode(0o000))?; assert!( fs_err::read_dir(&unreadable_dir).is_err(), "Directory must be unreadable" ); // Test source dist build. See also https://github.com/rust-lang/cargo/issues/16465 let sdist_options = BuildOptions::try_parse_from([ "build", "--manifest-path", project_dir.join("Cargo.toml").to_str().unwrap(), "--quiet", "--target-dir", temp_dir.path().join("target").to_str().unwrap(), "--out", temp_dir.path().join("dist").to_str().unwrap(), ])?; let sdist_context = sdist_options .into_build_context() .strip(Some(false)) .editable(false) .sdist_only(true) .build()?; BuildOrchestrator::new(&sdist_context).build_source_distribution()?; // Test wheel build let wheel_options = BuildOptions::try_parse_from([ "build", "--manifest-path", project_dir.join("Cargo.toml").to_str().unwrap(), "--quiet", "--target-dir", temp_dir.path().join("target").to_str().unwrap(), "--out", temp_dir.path().join("dist").to_str().unwrap(), ])?; let wheel_context = wheel_options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .build()?; let wheel_result = BuildOrchestrator::new(&wheel_context).build_wheels(); // Restore permissions before temp_dir cleanup fs_err::set_permissions(&unreadable_dir, std::fs::Permissions::from_mode(0o755))?; wheel_result?; Ok(()) } /// Test that target and cache directories in the python package aren't packaged outside of git. /// /// See https://github.com/PyO3/maturin/issues/3319 pub fn test_target_dir_in_python_package() -> Result<()> { let temp_dir = tempfile::tempdir()?; let project_dir = temp_dir.path().join("bin-with-python-module"); copy_dir_recursive( Path::new("test-crates/bin-with-python-module"), &project_dir, )?; // Like the default `target/wheels` output, creating it first keeps cargo from tagging it let target_dir = project_dir.join("bin_with_python_module/target"); fs_err::create_dir_all(&target_dir)?; let cache_dir = project_dir.join("bin_with_python_module/cache"); fs_err::create_dir_all(&cache_dir)?; fs_err::write( cache_dir.join("CACHEDIR.TAG"), "Signature: 8a477f597d28d172789f06886806bc55\n", )?; // With the wrong signature, it's not a cache directory let data_dir = project_dir.join("bin_with_python_module/data"); fs_err::create_dir_all(&data_dir)?; fs_err::write( data_dir.join("CACHEDIR.TAG"), "Signature: ffffffffffffffffffffffffffffffff\n", )?; // The tag must be a regular file, not a symlink #[cfg(unix)] { let symlink_dir = project_dir.join("bin_with_python_module/symlink"); fs_err::create_dir_all(&symlink_dir)?; fs_err::os::unix::fs::symlink( cache_dir.join("CACHEDIR.TAG"), symlink_dir.join("CACHEDIR.TAG"), )?; } let wheel = build_wheel_files_with_target_dir( &project_dir, target_dir, "wheel-files-bin-with-python-module-target-dir", )?; let package_files: Vec<_> = wheel .file_names() .collect::>>()? .into_iter() .filter(|name| name.starts_with("bin_with_python_module/")) .collect(); #[allow(unused_mut)] let mut expected = vec![ "bin_with_python_module/__init__.py", "bin_with_python_module/data/CACHEDIR.TAG", ]; #[cfg(unix)] expected.push("bin_with_python_module/symlink/CACHEDIR.TAG"); assert_eq!(package_files, expected); Ok(()) } /// Test that target and cache directories in the python package aren't packaged in sdists. The /// python package of pyo3-mixed-src is outside the crate, so `cargo package` doesn't list them. /// /// See https://github.com/PyO3/maturin/issues/3319 pub fn test_target_dir_in_python_package_sdist() -> Result<()> { let temp_dir = tempfile::tempdir()?; let project_dir = temp_dir.path().join("pyo3-mixed-src"); copy_dir_recursive(Path::new("test-crates/pyo3-mixed-src"), &project_dir)?; // Leftovers of an earlier build in a target directory that cargo didn't tag let target_dir = project_dir.join("src/pyo3_mixed_src/target"); fs_err::create_dir_all(target_dir.join("debug"))?; fs_err::write(target_dir.join("debug/libpyo3_mixed_src.rlib"), "")?; let cache_dir = project_dir.join("src/pyo3_mixed_src/cache"); fs_err::create_dir_all(&cache_dir)?; fs_err::write( cache_dir.join("CACHEDIR.TAG"), "Signature: 8a477f597d28d172789f06886806bc55\n", )?; let mut sdist = build_source_distribution_with_target_dir( project_dir.join("rust"), SdistGenerator::Cargo, target_dir, "sdist-pyo3-mixed-src-target-dir", )?; let mut package_files = Vec::new(); for entry in sdist.entries()? { let path = format!("{}", entry?.path()?.display()); if path.starts_with("pyo3_mixed_src-2.1.3/src/pyo3_mixed_src/") { package_files.push(path); } } assert_eq!( package_files, [ "pyo3_mixed_src-2.1.3/src/pyo3_mixed_src/__init__.py", "pyo3_mixed_src-2.1.3/src/pyo3_mixed_src/python_module/__init__.py", "pyo3_mixed_src-2.1.3/src/pyo3_mixed_src/python_module/double.py", ] ); Ok(()) } /// Test that building wheels from an sdist works correctly. /// This simulates the `maturin build --sdist` workflow: build sdist first, /// unpack it, then build wheels from the unpacked sdist. pub fn test_build_wheels_from_sdist(package: impl AsRef) -> Result<()> { let package = package.as_ref(); let temp_dir = tempfile::tempdir()?; let sdist_dir = temp_dir.path().join("sdist"); let wheel_dir = temp_dir.path().join("wheels"); // Step 1: Build the sdist let sdist_options = BuildOptions { output: OutputOptions { out: Some(sdist_dir), ..Default::default() }, cargo: CargoOptions { manifest_path: Some(package.join("Cargo.toml")), quiet: true, target_dir: Some(crate::common::shared_target_dir(package)), ..Default::default() }, ..Default::default() }; let sdist_context = sdist_options .into_build_context() .strip(Some(false)) .editable(false) .sdist_only(true) .build()?; let sdist = BuildOrchestrator::new(&sdist_context) .build_source_distribution()? .context("Failed to build source distribution")?; // Step 2: Unpack sdist and build wheels from it let maturin::UnpackedSdist { tmpdir: _tmp, cargo_toml, pyproject_toml, } = unpack_sdist(&sdist.path)?; let wheel_options = BuildOptions { output: OutputOptions { out: Some(wheel_dir), ..Default::default() }, cargo: CargoOptions { manifest_path: Some(cargo_toml), quiet: true, // The unpacked sdist lives in a fresh temp dir each run, so only the dependency // tree is reusable; share it with the package's family. target_dir: Some(crate::common::shared_target_dir(package)), ..Default::default() }, ..Default::default() }; let wheel_context = wheel_options .into_build_context() .strip(crate::common::TEST_STRIP) .editable(false) .pyproject_toml_path(Some(pyproject_toml)) .build()?; // The unpacked crate has the same name as the fixture, so builds share cargo output paths. let fixture_lock = crate::common::lock_fixture(package)?; let wheels = BuildOrchestrator::new(&wheel_context).build_wheels()?; drop(fixture_lock); assert!( !wheels.is_empty(), "Expected at least one wheel to be built" ); Ok(()) } pub fn generate_stubs(package: impl AsRef, expected_files: &[&str]) -> Result<()> { let package = package.as_ref(); let output_dir = tempfile::tempdir()?; let fixture_lock = crate::common::lock_fixture(package)?; assert!( Command::new(env!("CARGO_BIN_EXE_maturin")) .arg("generate-stubs") .arg("-m") .arg(package.join("Cargo.toml")) .arg("--target-dir") .arg(crate::common::shared_target_dir(package)) .arg("--out") .arg(output_dir.path()) .status()? .success() ); drop(fixture_lock); let found_files = WalkDir::new(output_dir.path()) .sort_by_file_name() .into_iter() .filter(|e| match e { Ok(e) => e.file_type().is_file(), Err(_) => true, }) .map(|e| { Ok(e? .path() .strip_prefix(output_dir.path())? .to_str() .unwrap() .replace('\\', "/")) }) .collect::>>()?; assert_eq!(found_files, expected_files); Ok(()) } maturin-1.16.0/tests/common/pep517.rs000066400000000000000000000104601527064705700173150ustar00rootroot00000000000000use crate::common::{PreparedEnv, TestEnvKind, case_target_dir, check_installed, prepare_test_env}; use anyhow::Result; use std::path::{Path, PathBuf}; use std::process::{Command, Output}; use std::str; pub fn target_dir(unique_name: &str) -> String { case_target_dir(unique_name).display().to_string() } /// A table-driven PEP 517 installation scenario. /// /// The case id is used to derive the cargo target directory, so it should stay stable and /// descriptive when possible. #[derive(Clone, Copy)] pub struct Pep517Case<'a> { /// Stable identifier used for derived test paths and failure messages. pub id: &'a str, /// Repo-relative path to the package under test. pub package: &'a str, /// The environment kind used for installation and verification. pub env_kind: TestEnvKind, /// Whether the package should be installed in editable mode. pub editable: bool, /// Extra Python packages that must be installed into the test environment first. pub prereq_packages: &'a [&'a str], } impl<'a> Pep517Case<'a> { pub fn new(id: &'a str, package: &'a str) -> Self { Self { id, package, env_kind: TestEnvKind::Venv, editable: false, prereq_packages: &[], } } pub fn editable(mut self) -> Self { self.editable = true; self } } /// Creates a virtualenv and activates it, checks that the package isn't installed, uses /// pip install to install it and checks it is working pub fn test_pep517(case: &Pep517Case<'_>) -> Result { let package = Path::new(case.package); let PreparedEnv { python, .. } = prepare_test_env(case.id, case.env_kind, case.prereq_packages, None)?; // Ensure the test doesn't wrongly pass check_installed(package, &python).unwrap_err(); // Install `tomli` into the virtualenv (runtime dependency of `maturin`'s pep517 builds for // Python <3.11) let mut cmd = Command::new(&python); cmd.args(["-m", "pip", "install", "tomli"]); let output = cmd.output()?; if !output.status.success() { panic!( "Failed to install tomli: {}\n---stdout:\n{}---stderr:\n{}", output.status, str::from_utf8(&output.stdout)?, str::from_utf8(&output.stderr)? ); } let mut cmd = Command::new(&python); cmd.args(["-m", "pip", "install", "-vvv", "--no-build-isolation"]); if case.editable { cmd.arg("--editable"); } cmd.arg(package.to_str().expect("package is utf8 path")); let target_dir = target_dir(case.id); cmd.env("CARGO_TARGET_DIR", target_dir); // Building with `--no-build-isolation` means that `maturin` needs to be on PATH _and_ // importable // Hack PATH to include maturin binary directory let maturin_exe = Path::new(env!("CARGO_BIN_EXE_maturin")); let bin_dir = maturin_exe.parent(); cmd.env("PATH", insert_path("PATH", bin_dir.unwrap())); // Hack PYTHONPATH to include the root of the repository let repo_root = Path::new(env!("CARGO_MANIFEST_DIR")); cmd.env("PYTHONPATH", insert_path("PYTHONPATH", repo_root)); let output = cmd.output()?; if !output.status.success() { panic!( "Failed to install {}: {}\n---stdout:\n{}---stderr:\n{}", package.display(), output.status, str::from_utf8(&output.stdout)?, str::from_utf8(&output.stderr)? ); } check_installed(package, &python)?; Ok(output) } fn insert_path(env_var: &str, new_path: &Path) -> String { let old_path = std::env::var_os(env_var).unwrap_or_default(); let mut paths = std::env::split_paths(&old_path).collect::>(); paths.insert(0, new_path.to_path_buf()); std::env::join_paths(paths) .expect("Expected to be able to re-join PATH") .into_string() .expect("PATH is not valid utf8") } /// Whether cargo built for the specified cargo profile in the test target directory. pub fn target_has_profile(unique_name: &str, profile: &str) -> bool { let profile_dir = PathBuf::from(target_dir(unique_name)).join(profile); // Check for cargo's .fingerprint directory which is always created for the // profile that was used, and is not affected by maturin's artifact staging. profile_dir.join(".fingerprint").is_dir() } maturin-1.16.0/tests/emscripten_runner.js000066400000000000000000000112011527064705700205300ustar00rootroot00000000000000const fs = require("node:fs"); const { copyFile, mkdtemp, opendir } = require("node:fs/promises"); const { tmpdir } = require("node:os"); const { join } = require("node:path"); const { loadPyodide } = require("pyodide"); async function findWheel(distDir) { // Match every Emscripten / Pyodide platform tag family in the wheel // filename's *platform tag* field. Wheel filenames are // `{name}-{ver}-{python tag}-{abi tag}-{platform tag}.whl`, so anchor to // the trailing `-{platform tag}.whl` segment to avoid false positives // from a project name that happens to contain `pyodide_` etc. // - `pyemscripten___wasm32` (PEP 783) // - `pyodide___wasm32` (legacy pre-PEP 783 naming) // - `emscripten__wasm32` (legacy, Pyodide <= 0.27) const tagRegex = /-(pyemscripten|pyodide|emscripten)_[^-]+_wasm32\.whl$/; const dir = await opendir(distDir); for await (const dirent of dir) { if (tagRegex.test(dirent.name)) { return dirent.name; } } } async function wheelPathForRuntime(distDir, wheelName, pyodide) { const pep783PlatformVersion = pyodide.runPython(` import sysconfig sysconfig.get_config_var("PYEMSCRIPTEN_PLATFORM_VERSION") `); if (pep783PlatformVersion) { return `${distDir}/${wheelName}`; } // Pyodide 0.28/0.29 runtimes still validate wheel filenames using the // pre-PEP 783 `pyodide___wasm32` spelling. Maturin should build // the PyPI-accepted `pyemscripten_*` filename, but for the runtime smoke test // we need a compatibility copy with the old platform-tag spelling. const legacyName = wheelName.replace( /-pyemscripten_(\d+_\d+)_wasm32\.whl$/, "-pyodide_$1_wasm32.whl", ); if (legacyName === wheelName) { return `${distDir}/${wheelName}`; } const runtimeDir = await mkdtemp(join(tmpdir(), "maturin-pyodide-runtime-")); const runtimePath = `${runtimeDir}/${legacyName}`; await copyFile(`${distDir}/${wheelName}`, runtimePath); return runtimePath; } function make_tty_ops(stream){ return { // get_char has 3 particular return values: // a.) the next character represented as an integer // b.) undefined to signal that no data is currently available // c.) null to signal an EOF get_char(tty) { if (!tty.input.length) { var result = null; var BUFSIZE = 256; var buf = Buffer.alloc(BUFSIZE); var bytesRead = fs.readSync(process.stdin.fd, buf, 0, BUFSIZE, -1); if (bytesRead === 0) { return null; } result = buf.slice(0, bytesRead); tty.input = Array.from(result); } return tty.input.shift(); }, put_char(tty, val) { try { if(val !== null){ tty.output.push(val); } if (val === null || val === 10) { process.stdout.write(Buffer.from(tty.output)); tty.output = []; } } catch(e){ console.warn(e); } }, fsync(tty) { if (!tty.output || tty.output.length === 0) { return; } stream.write(Buffer.from(tty.output)); tty.output = []; } }; } function setupStreams(FS, TTY){ let mytty = FS.makedev(FS.createDevice.major++, 0); let myttyerr = FS.makedev(FS.createDevice.major++, 0); TTY.register(mytty, make_tty_ops(process.stdout)) TTY.register(myttyerr, make_tty_ops(process.stderr)) FS.mkdev('/dev/mytty', mytty); FS.mkdev('/dev/myttyerr', myttyerr); FS.unlink('/dev/stdin'); FS.unlink('/dev/stdout'); FS.unlink('/dev/stderr'); FS.symlink('/dev/mytty', '/dev/stdin'); FS.symlink('/dev/mytty', '/dev/stdout'); FS.symlink('/dev/myttyerr', '/dev/stderr'); FS.closeStream(0); FS.closeStream(1); FS.closeStream(2); var stdin = FS.open('/dev/stdin', 0); var stdout = FS.open('/dev/stdout', 1); var stderr = FS.open('/dev/stderr', 1); } const pkgDir = process.argv[2]; const distDir = pkgDir + "/target/wheels"; const testDir = pkgDir + "/tests"; async function main() { const wheelName = await findWheel(distDir); try { pyodide = await loadPyodide(); const wheelPath = await wheelPathForRuntime(distDir, wheelName, pyodide); const wheelURL = `file:${wheelPath}`; const FS = pyodide.FS; setupStreams(FS, pyodide._module.TTY); const NODEFS = FS.filesystems.NODEFS; FS.mkdir("/test_dir"); FS.mount(NODEFS, { root: testDir }, "/test_dir"); await pyodide.loadPackage(["micropip", "pytest", "tomli"]); const micropip = pyodide.pyimport("micropip"); await micropip.install(wheelURL); const pytest = pyodide.pyimport("pytest"); FS.chdir("/test_dir"); errcode = pytest.main(); } catch (e) { console.error(e); process.exit(1); } } main(); maturin-1.16.0/tests/manylinux_compliant.sh000077500000000000000000000003001527064705700210570ustar00rootroot00000000000000#!/bin/bash set -e for PYBIN in /opt/python/cp3[89]*/bin; do $1 build -m test-crates/pyo3-mixed/Cargo.toml --target-dir test-crates/targets -i "${PYBIN}/python" --manylinux $2 -o dist done maturin-1.16.0/tests/manylinux_incompliant.sh000077500000000000000000000016071527064705700214210ustar00rootroot00000000000000#!/bin/bash set -e # Fail because we're running in manylinux2_28, which can't build for manylinux 2010 for PYBIN in /opt/python/cp3[9]*/bin; do if $1 build -m test-crates/pyo3-mixed/Cargo.toml --target-dir test-crates/targets -i "${PYBIN}/python" --manylinux 2010 -o dist; then echo "maturin build unexpectedly succeeded" exit 1 else echo "maturin build failed as expected" fi done # Fail because we're linking zlib with black-listed symbols(gzflags), which is not allowed in manylinux apt-get -v &> /dev/null && apt-get install -y zlib1g-dev || yum install -y zlib-devel for PYBIN in /opt/python/cp3[9]*/bin; do if $1 build -m test-crates/lib_with_disallowed_lib/Cargo.toml --target-dir test-crates/targets -i "${PYBIN}/python" --manylinux 2014 -o dist; then echo "maturin build unexpectedly succeeded" exit 1 else echo "maturin build failed as expected" fi done maturin-1.16.0/tests/run.rs000066400000000000000000000006371527064705700156150ustar00rootroot00000000000000//! To speed up the tests, they are all collected in a single integration-test crate. mod common; #[path = "run/develop.rs"] mod develop; #[path = "run/environment.rs"] mod environment; #[path = "run/errors.rs"] mod errors; #[path = "run/integration.rs"] mod integration; #[path = "run/pep517.rs"] mod pep517; #[path = "run/pgo.rs"] mod pgo; #[path = "run/sdist.rs"] mod sdist; #[path = "run/wheel.rs"] mod wheel; maturin-1.16.0/tests/run/000077500000000000000000000000001527064705700152415ustar00rootroot00000000000000maturin-1.16.0/tests/run/develop.rs000066400000000000000000000123441527064705700172510ustar00rootroot00000000000000use crate::common::develop::{self, DevelopCase}; use crate::common::{ CFFI_MIXED_IMPLICIT_COPY, CFFI_MIXED_INCLUDE_EXCLUDE_COPY, CFFI_MIXED_PY_SUBDIR_COPY, CFFI_MIXED_SRC_COPY, CFFI_MIXED_SUBMODULE_COPY, CFFI_MIXED_WITH_PATH_DEP_COPY, handle_result, has_conda, has_uniffi_bindgen, has_uv, is_ci, test_python_implementation, }; use rstest::rstest; use std::time::Duration; #[rstest] #[case::pyo3_pure(DevelopCase::pip("develop-pyo3-pure", "test-crates/pyo3-pure"))] #[case::pyo3_mixed(DevelopCase::pip("develop-pyo3-mixed", "test-crates/pyo3-mixed"))] // Keep the old mixed-layout regression coverage after moving these develop cases from pyo3 to // cffi. The fixtures generate package files in-tree, so each case runs from a copied workspace. #[case::cffi_mixed_include_exclude(DevelopCase::pip( "develop-cffi-mixed-include-exclude", "test-crates/cffi-mixed-include-exclude", ).copied(CFFI_MIXED_INCLUDE_EXCLUDE_COPY))] #[case::cffi_mixed_submodule(DevelopCase::pip( "develop-cffi-mixed-submodule", "test-crates/cffi-mixed-submodule", ).copied(CFFI_MIXED_SUBMODULE_COPY))] #[case::cffi_mixed_with_path_dep(DevelopCase::pip( "develop-cffi-mixed-with-path-dep", "test-crates/cffi-mixed-with-path-dep", ).copied(CFFI_MIXED_WITH_PATH_DEP_COPY))] #[case::cffi_mixed_implicit(DevelopCase::pip( "develop-cffi-mixed-implicit", "test-crates/cffi-mixed-implicit", ).copied(CFFI_MIXED_IMPLICIT_COPY))] #[case::cffi_mixed_py_subdir(DevelopCase::pip( "develop-cffi-mixed-py-subdir", "test-crates/cffi-mixed-py-subdir", ).copied(CFFI_MIXED_PY_SUBDIR_COPY))] #[case::cffi_mixed_src_layout(DevelopCase::pip( "develop-cffi-mixed-src", "test-crates/cffi-mixed-src/rust", ).copied(CFFI_MIXED_SRC_COPY))] #[case::uniffi_pure_proc_macro(DevelopCase::pip( "develop-uniffi-pure-proc-macro", "test-crates/uniffi-pure-proc-macro", ))] #[case::uniffi_multiple_crates(DevelopCase::pip( "develop-uniffi-multiple-crates", "test-crates/uniffi-multiple-crates", ))] /// Test editable install of a project with both a binary and a Python module. /// This is a regression test for https://github.com/PyO3/maturin/issues/2933 #[case::bin_with_python_module(DevelopCase::pip( "develop-bin-with-python-module", "test-crates/bin-with-python-module", ))] // Test that dependency groups are resolved from the project's pyproject.toml even when // `--manifest-path` points into a subdirectory, while being backward compatible // when the user explicitly provided the path already. // groups work (regression test for https://github.com/PyO3/maturin/issues/3283). #[case::pyo3_pure_with_dependency_group(DevelopCase::pip( "develop-pyo3-pure-dependency-group", "test-crates/pyo3-pure", ).with_groups(&["dev", "test-crates/pyo3-pure/pyproject.toml:dev2"]))] #[test] fn develop_pip_cases(#[case] case: DevelopCase<'_>) { handle_result(develop::test_develop(&case)); } #[test] fn develop_pyo3_pure_conda() { if has_conda() { handle_result(develop::test_develop( &DevelopCase::pip("develop-pyo3-pure-conda", "test-crates/pyo3-pure").conda(3, 10), )); } } #[rstest] #[case::cffi_pure(DevelopCase::pip( "develop-cffi-pure", "test-crates/cffi-pure", ).prereqs(&["cffi"]))] #[case::cffi_mixed(DevelopCase::pip( "develop-cffi-mixed", "test-crates/cffi-mixed", ).prereqs(&["cffi"]))] #[test] fn develop_cffi_cases(#[case] case: DevelopCase<'_>) { if is_ci() && test_python_implementation().unwrap() == "pypy" { return; } handle_result(develop::test_develop(&case)); } #[rstest] #[case::uniffi_pure(DevelopCase::pip("develop-uniffi-pure", "test-crates/uniffi-pure"))] #[case::uniffi_mixed(DevelopCase::pip("develop-uniffi-mixed", "test-crates/uniffi-mixed"))] #[case::uniffi_multiple_binding_files(DevelopCase::pip( "develop-uniffi-multiple-binding-files", "test-crates/uniffi-multiple-binding-files", ))] #[test] fn develop_uniffi_cases(#[case] case: DevelopCase<'_>) { if is_ci() || has_uniffi_bindgen() { handle_result(develop::test_develop(&case)); } } #[rstest] #[timeout(Duration::from_secs(600))] #[case::hello_world(DevelopCase::uv("develop-hello-world-uv", "test-crates/hello-world",))] #[case::pyo3_ffi_pure(DevelopCase::uv("develop-pyo3-ffi-pure-uv", "test-crates/pyo3-ffi-pure",))] // Test that dependency groups are resolved from the project's pyproject.toml even when // `--manifest-path` points into a subdirectory to it. #[case::pyo3_pure_with_dependency_group(DevelopCase::uv( "develop-pyo3-pure-dependency-group-uv", "test-crates/pyo3-pure", ))] #[test] fn develop_uv_cases(#[case] case: DevelopCase<'_>) { // Only run uv tests on platforms that have wheels on PyPI or when a uv binary is found. if !cfg!(any( target_os = "linux", target_os = "macos", target_os = "windows" )) && !has_uv() { return; } handle_result(develop::test_develop(&case)); } #[rstest] #[timeout(Duration::from_secs(600))] #[case::hello_world(DevelopCase::pip("develop-hello-world-pip", "test-crates/hello-world",))] #[case::pyo3_ffi_pure(DevelopCase::pip("develop-pyo3-ffi-pure-pip", "test-crates/pyo3-ffi-pure",))] #[test] fn develop_backend_parameterized_cases(#[case] case: DevelopCase<'_>) { handle_result(develop::test_develop(&case)); } maturin-1.16.0/tests/run/environment.rs000066400000000000000000000024321527064705700201540ustar00rootroot00000000000000use crate::common::{handle_result, other}; use serial_test::serial; use std::env; use time::macros::datetime; #[test] #[cfg_attr(not(target_os = "linux"), ignore)] fn musl() { let ran = handle_result(other::test_musl()); if !ran { eprintln!("Warning: rustup and/or musl target not installed, test didn't run"); } } #[test] #[cfg(unix)] fn unreadable_dir() { handle_result(other::test_unreadable_dir()) } #[test] #[serial(source_date_epoch_env)] fn pyo3_source_date_epoch() { unsafe { env::set_var("SOURCE_DATE_EPOCH", "0") }; handle_result(other::check_wheel_mtimes( "test-crates/pyo3-mixed-include-exclude", vec![datetime!(1980-01-01 0:00)], "pyo3_source_date_epoch", )) } #[test] #[serial(source_date_epoch_env)] fn sdist_no_source_date_epoch() { unsafe { env::remove_var("SOURCE_DATE_EPOCH") }; handle_result(other::check_sdist_mtimes( "test-crates/pyo3-mixed-include-exclude", 1153704088, "sdist_no_source_date_epoch", )) } #[test] #[serial(source_date_epoch_env)] fn sdist_source_date_epoch() { unsafe { env::set_var("SOURCE_DATE_EPOCH", "1") }; handle_result(other::check_sdist_mtimes( "test-crates/pyo3-mixed-include-exclude", 1, "sdist_source_date_epoch", )) } maturin-1.16.0/tests/run/errors.rs000066400000000000000000000024611527064705700171260ustar00rootroot00000000000000use crate::common::{errors, handle_result, test_python_implementation, test_python_version}; #[test] #[cfg_attr( not(all( target_os = "linux", target_env = "gnu", any( target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64", target_arch = "powerpc64", target_arch = "s390x", target_arch = "arm" ) )), ignore )] fn pyo3_no_extension_module() { if test_python_implementation().unwrap() == "cpython" && test_python_version().unwrap() < (3, 15) { handle_result(errors::pyo3_no_extension_module()) } } #[test] fn locked_doesnt_build_without_cargo_lock() { handle_result(errors::locked_doesnt_build_without_cargo_lock()) } #[test] #[cfg_attr(not(all(target_os = "linux", target_env = "gnu")), ignore)] fn invalid_manylinux_does_not_panic() { handle_result(errors::invalid_manylinux_does_not_panic()) } #[test] fn error_on_missing_python_source() { handle_result(errors::error_on_missing_python_source()) } #[test] fn pypi_compatibility_unsupported_target() { handle_result(errors::pypi_compatibility_unsupported_target()) } #[test] #[cfg(target_os = "linux")] fn pypi_compatibility_linux_tag() { handle_result(errors::pypi_compatibility_linux_tag()) } maturin-1.16.0/tests/run/integration.rs000066400000000000000000000203611527064705700201340ustar00rootroot00000000000000use crate::common::integration::{self, IntegrationCase}; use crate::common::other; use crate::common::{ CFFI_MIXED_IMPLICIT_COPY, CFFI_MIXED_INCLUDE_EXCLUDE_COPY, CFFI_MIXED_PY_SUBDIR_COPY, CFFI_MIXED_SRC_COPY, CFFI_MIXED_SUBMODULE_COPY, CFFI_MIXED_WITH_PATH_DEP_COPY, handle_result, has_conda, has_uniffi_bindgen, has_uv, is_ci, test_python_implementation, test_python_supports_abi3t, }; use std::path::Path; #[test] fn integration_pyo3_bin() { let python_implementation = test_python_implementation().unwrap(); if python_implementation == "pypy" || python_implementation == "graalpy" { // PyPy & GraalPy do not support the auto-initialize feature of pyo3. return; } handle_result(integration::test_integration(&IntegrationCase::new( "integration-pyo3-bin", "test-crates/pyo3-bin", ))); } #[rstest::rstest] #[case::pyo3_pure(IntegrationCase::new("integration-pyo3-pure", "test-crates/pyo3-pure"))] #[case::pyo3_mixed(IntegrationCase::new("integration-pyo3-mixed", "test-crates/pyo3-mixed"))] // Keep the old mixed-layout regression coverage after moving these integration cases from pyo3 to // cffi. The fixtures generate package files in-tree, so each case runs from a copied workspace. #[case::cffi_mixed_include_exclude(IntegrationCase::new( "integration-cffi-mixed-include-exclude", "test-crates/cffi-mixed-include-exclude", ).copied(CFFI_MIXED_INCLUDE_EXCLUDE_COPY))] #[case::cffi_mixed_submodule(IntegrationCase::new( "integration-cffi-mixed-submodule", "test-crates/cffi-mixed-submodule", ).copied(CFFI_MIXED_SUBMODULE_COPY))] #[case::cffi_mixed_with_path_dep(IntegrationCase::new( "integration-cffi-mixed-with-path-dep", "test-crates/cffi-mixed-with-path-dep", ).copied(CFFI_MIXED_WITH_PATH_DEP_COPY))] #[case::cffi_mixed_implicit(IntegrationCase::new( "integration-cffi-mixed-implicit", "test-crates/cffi-mixed-implicit", ).copied(CFFI_MIXED_IMPLICIT_COPY))] #[case::cffi_mixed_py_subdir({ let case = IntegrationCase::new( "integration-cffi-mixed-py-subdir", "test-crates/cffi-mixed-py-subdir", ).copied(CFFI_MIXED_PY_SUBDIR_COPY); if cfg!(unix) { case.zig() } else { case } })] #[case::cffi_mixed_src_layout(IntegrationCase::new( "integration-cffi-mixed-src", "test-crates/cffi-mixed-src/rust", ).copied(CFFI_MIXED_SRC_COPY))] #[case::uniffi_pure_proc_macro(IntegrationCase::new( "integration-uniffi-pure-proc-macro", "test-crates/uniffi-pure-proc-macro", ))] #[case::hello_world(IntegrationCase::new("integration-hello-world", "test-crates/hello-world"))] #[case::pyo3_ffi_pure(IntegrationCase::new( "integration-pyo3-ffi-pure", "test-crates/pyo3-ffi-pure" ))] #[case::with_data(IntegrationCase::new("integration-with-data", "test-crates/with-data"))] #[case::readme_duplication(IntegrationCase::new( "integration-readme-duplication", "test-crates/readme-duplication/readme-py", ))] #[case::workspace_inverted_order(IntegrationCase::new( "integration-workspace-inverted-order", "test-crates/workspace-inverted-order/path-dep-with-root", ))] #[case::pyo3_stub_generation_pure(IntegrationCase::new( "integration-pyo3-stub-generation-pure", "test-crates/pyo3-stub-generation-pure", ).generate_stubs())] #[cfg_attr(unix, case::pyo3_stub_generation_pure_zig(IntegrationCase::new( "integration-pyo3-stub-generation-pure-zig", "test-crates/pyo3-stub-generation-pure", ).generate_stubs().zig()))] #[case::pyo3_stub_generation_mixed(IntegrationCase::new( "integration-pyo3-stub-generation-mixed", "test-crates/pyo3-stub-generation-mixed", ).generate_stubs())] #[case::pyo3_stub_generation_mixed_py_subdir(IntegrationCase::new( "integration-pyo3-stub-generation-mixed-py-subdir", "test-crates/pyo3-stub-generation-mixed-py-subdir", ).generate_stubs())] #[test] fn integration_cases(#[case] case: IntegrationCase<'_>) { handle_result(integration::test_integration(&case)); } #[test] fn integration_pyo3_bin_uv_multi_python() { if has_uv() { handle_result(integration::test_integration_uv_multi_python( &IntegrationCase::new( "integration-pyo3-bin-uv-multi-python", "test-crates/pyo3-bin", ), )); } } #[test] #[cfg_attr(target_os = "macos", ignore)] fn integration_pyo3_mixed_conda() { // Don't run it on macOS, too slow. if has_conda() { handle_result(integration::test_integration_conda( "test-crates/pyo3-mixed", None, "integration-pyo3-mixed-conda", )); } } #[rstest::rstest] #[case::cffi_pure(IntegrationCase::new("integration-cffi-pure", "test-crates/cffi-pure"))] #[case::cffi_mixed(IntegrationCase::new("integration-cffi-mixed", "test-crates/cffi-mixed"))] #[test] fn integration_cffi_cases(#[case] case: IntegrationCase<'_>) { if is_ci() && test_python_implementation().unwrap() == "pypy" { return; } handle_result(integration::test_integration(&case)); } #[rstest::rstest] #[case::uniffi_pure(IntegrationCase::new("integration-uniffi-pure", "test-crates/uniffi-pure"))] #[case::uniffi_mixed(IntegrationCase::new("integration-uniffi-mixed", "test-crates/uniffi-mixed"))] #[test] fn integration_uniffi_cases(#[case] case: IntegrationCase<'_>) { if is_ci() || has_uniffi_bindgen() { handle_result(integration::test_integration(&case)); } } #[test] #[cfg(any( all(target_os = "windows", target_arch = "x86_64"), all( target_os = "linux", any(target_arch = "x86_64", target_arch = "aarch64"), target_env = "gnu", ), all( target_os = "macos", any(target_arch = "x86_64", target_arch = "aarch64") ), ))] fn integration_wasm_hello_world() { handle_result(integration::test_integration( &IntegrationCase::new("integration-wasm-hello-world", "test-crates/hello-world") .target("wasm32-wasip1"), )); let python_implementation = test_python_implementation().unwrap(); let venv_name = format!("integration-wasm-hello-world-py3-wasm32-wasip1-{python_implementation}"); assert!( Path::new("test-crates") .join("venvs") .join(venv_name) .join(if cfg!(target_os = "windows") { "Scripts" } else { "bin" }) .join("hello-world.wasm") .is_file() ) } #[test] fn abi3_without_version() { handle_result(other::abi3_without_version()) } #[test] fn pyo3_cffi_build_script() { handle_result(other::pyo3_cffi_build_script()) } #[test] fn abi3t_without_version() { // abi3t requires CPython >= 3.15 (PEP 803). On older runners the build // would reject the only available interpreter, so skip cleanly. if !test_python_supports_abi3t() { return; } handle_result(other::abi3t_without_version()) } #[test] fn abi3_and_abi3t_wheel_selection() { handle_result(other::combined_stable_abi_wheel_selection( "abi3-and-abi3t-wheel-selection", &[], )); } #[test] fn abi3_and_current_abi3t_wheel_selection() { handle_result(other::combined_stable_abi_wheel_selection( "abi3-and-current-abi3t-wheel-selection", &["abi3-and-current-abi3t"], )); } #[test] fn integration_pyo3_abi3t() { // abi3t requires CPython >= 3.15 (PEP 803). if !test_python_supports_abi3t() { return; } handle_result(integration::test_integration(&IntegrationCase::new( "integration-pyo3-abi3t", "test-crates/pyo3-abi3t", ))); } #[test] fn abi3_python_interpreter_args() { handle_result(other::abi3_python_interpreter_args()); } #[test] fn abi3_generate_stubs() { handle_result(other::generate_stubs( "test-crates/pyo3-stub-generation-pure", &[ "pyo3_stub_generation_pure/__init__.pyi", "pyo3_stub_generation_pure/submodule.pyi", ], )); } /// `module-name` places the extension inside a python package, and the stubs have to follow it /// there — writing `_pyo3_mixed.pyi` to the root of `--out` puts it where nothing will look for it. #[test] fn abi3_generate_stubs_mixed_py_subdir() { handle_result(other::generate_stubs( "test-crates/pyo3-stub-generation-mixed-py-subdir", &["pyo3_stub_generation_mixed_py_subdir/_pyo3_mixed.pyi"], )); } maturin-1.16.0/tests/run/pep517.rs000066400000000000000000000044571527064705700166420ustar00rootroot00000000000000use crate::common::handle_result; use crate::common::pep517::{Pep517Case, target_has_profile, test_pep517}; use std::process::Command; #[test] fn pep517_default_profile() { let case = Pep517Case::new("pep517-pyo3-pure", "test-crates/pyo3-pure"); handle_result(test_pep517(&case)); assert!(target_has_profile(case.id, "release")); assert!(!target_has_profile(case.id, "debug")); } #[test] fn pep517_editable_profile() { let case = Pep517Case::new("pep517-pyo3-pure-editable", "test-crates/pyo3-pure").editable(); handle_result(test_pep517(&case)); assert!(!target_has_profile(case.id, "release")); assert!(target_has_profile(case.id, "debug")); } /// Regression test: tracing output must go to stderr, not stdout. /// /// The PEP 517 protocol uses stdout as a structured channel — pip reads the last /// line to find the output directory/filename. If tracing leaks to stdout (which /// happens when RUST_LOG is set and the subscriber writes to stdout), pip fails. #[test] fn pep517_tracing_does_not_leak_to_stdout() { let output = Command::new(env!("CARGO_BIN_EXE_maturin")) // Any subcommand that triggers setup_logging will do; `--help` is // handled by clap before logging is initialised, so use `list-python` // which is cheap and deterministic. .args(["list-python"]) .env("RUST_LOG", "info") .output() .expect("failed to run maturin"); let stdout = String::from_utf8_lossy(&output.stdout); let stderr = String::from_utf8_lossy(&output.stderr); // Tracing output contains level markers like "INFO", "DEBUG", "TRACE" and // timestamps. None of that should appear on stdout. We match without surrounding // spaces because ANSI colour codes may be adjacent to the level name. for line in stdout.lines() { assert!( !line.contains("INFO") && !line.contains("DEBUG") && !line.contains("TRACE"), "tracing output leaked to stdout: {line:?}\n\nFull stdout:\n{stdout}\nFull stderr:\n{stderr}", ); } // Verify that tracing output did land on stderr (sanity check that RUST_LOG was effective). assert!( stderr.contains("INFO") || stderr.contains("DEBUG") || stderr.contains("TRACE"), "expected tracing output on stderr but found none.\nstderr:\n{stderr}", ); } maturin-1.16.0/tests/run/pgo.rs000066400000000000000000000037071527064705700164030ustar00rootroot00000000000000use crate::common::integration::{self, IntegrationCase}; use crate::common::{handle_result, has_uv}; #[test] #[cfg_attr( all(windows, target_arch = "aarch64"), ignore = "possible windows aarch64 pgo issue, see https://github.com/rust-lang/rust/issues/156675" )] fn pgo_pyo3_mixed() { // Allow CI jobs without llvm-tools (e.g. Alpine, which uses system rust) to opt out. if std::env::var_os("MATURIN_TEST_SKIP_PGO").is_some() { return; } handle_result(integration::test_integration( &IntegrationCase::new("pgo-pyo3-mixed", "test-crates/pyo3-mixed").pgo(), )); } #[test] #[cfg_attr( all(windows, target_arch = "aarch64"), ignore = "possible windows aarch64 pgo issue, see https://github.com/rust-lang/rust/issues/156675" )] fn pgo_bin() { if std::env::var_os("MATURIN_TEST_SKIP_PGO").is_some() || !has_uv() { return; } handle_result(integration::test_integration( &IntegrationCase::new("pgo-bin", "test-crates/hello-world").pgo(), )); } #[test] #[cfg_attr( all(windows, target_arch = "aarch64"), ignore = "possible windows aarch64 pgo issue, see https://github.com/rust-lang/rust/issues/156675" )] fn pgo_pyo3_bin_uv_multi_python() { if std::env::var_os("MATURIN_TEST_SKIP_PGO").is_some() || !has_uv() { return; } handle_result(integration::test_integration_uv_multi_python( &IntegrationCase::new("pgo-pyo3-bin-uv-multi-python", "test-crates/pyo3-bin").pgo(), )); } #[test] fn pgo_bin_uv_multi_python() { if std::env::var_os("MATURIN_TEST_SKIP_PGO").is_some() || !has_uv() { return; } let err = integration::test_integration_uv_multi_python( &IntegrationCase::new("pgo-bin-uv-multi-python", "test-crates/hello-world").pgo(), ) .expect_err("multiple interpreters is not applicable with non-pyo3 binaries"); assert_eq!( err.to_string(), "You can only specify one python interpreter for `bin` bindings" ); } maturin-1.16.0/tests/run/sdist.rs000066400000000000000000001310741527064705700167430ustar00rootroot00000000000000use crate::common::{handle_result, other}; use expect_test::{Expect, expect}; use indoc::indoc; use maturin::pyproject_toml::SdistGenerator; use maturin::{BuildOptions, BuildOrchestrator, CargoOptions, OutputOptions, unpack_sdist}; use std::collections::BTreeSet; use std::io::Read; use std::path::{Path, PathBuf}; use std::process::Command; use url::Url; use which::which; /// A table-driven source distribution scenario. /// /// The case id is used to derive isolated output paths and failure messages for helper calls. #[derive(Clone, Copy)] struct SdistCase<'a> { /// Stable identifier used for derived test paths and failure messages. id: &'a str, /// Repo-relative path to the package under test. package: &'a str, /// Which sdist generator implementation the case exercises. generator: SdistGenerator, } fn run_sdist_case( case: SdistCase<'_>, expected_files: expect_test::Expect, expected_cargo_toml: Option<(&Path, expect_test::Expect)>, ) { handle_result(other::test_source_distribution( case.package, case.generator, expected_files, expected_cargo_toml, case.id, )); } #[test] fn sdist_excludes_default_run() { let temp_dir = tempfile::tempdir().unwrap(); let project_dir = temp_dir.path().join("hello-world"); other::copy_dir_recursive(Path::new("test-crates/hello-world"), &project_dir).unwrap(); let cargo_toml_path = project_dir.join("Cargo.toml"); let mut cargo_toml = fs_err::read_to_string(&cargo_toml_path).unwrap(); fs_err::write(project_dir.join("README.md"), "Pyproject readme").unwrap(); let parent_readme = temp_dir.path().join("README.md"); fs_err::write(&parent_readme, "Cargo readme").unwrap(); cargo_toml = cargo_toml.replace("../../README.md", "../README.md"); cargo_toml.push_str("\n[[bin]]\nname = \"excluded_bin\"\npath = \"src/bin/excluded_bin.rs\"\n"); let cargo_toml = cargo_toml.replace( "default-run = \"hello-world\"", "default-run = \"excluded_bin\"", ); fs_err::write(&cargo_toml_path, cargo_toml).unwrap(); fs_err::write(project_dir.join("src/bin/excluded_bin.rs"), "fn main() {}").unwrap(); let pyproject_toml_path = project_dir.join("pyproject.toml"); let mut pyproject_toml = fs_err::read_to_string(&pyproject_toml_path).unwrap(); pyproject_toml = pyproject_toml.replace("exclude = [", "exclude = [\n \"src/bin/excluded_bin.rs\","); pyproject_toml = pyproject_toml.replace( "dynamic = [\"authors\", \"readme\"]", "readme = \"README.md\"\ndynamic = [\"authors\"]", ); fs_err::write(&pyproject_toml_path, pyproject_toml).unwrap(); let expected_cargo_toml = expect![[r#" [package] name = "hello-world" version = "0.1.0" authors = ["konstin "] edition = "2021" # Test references to out-of-project files readme = "README.md" [dependencies] [[bench]] name = "included_bench" [[example]] name = "included_example" "#]]; handle_result(other::test_source_distribution( &project_dir, SdistGenerator::Cargo, expect![[r#" { "hello_world-0.1.0/Cargo.lock", "hello_world-0.1.0/Cargo.toml", "hello_world-0.1.0/LICENSE", "hello_world-0.1.0/PKG-INFO", "hello_world-0.1.0/README.md", "hello_world-0.1.0/benches/included_bench.rs", "hello_world-0.1.0/check_installed/check_installed.py", "hello_world-0.1.0/examples/included_example.rs", "hello_world-0.1.0/licenses/AUTHORS.txt", "hello_world-0.1.0/pyproject.toml", "hello_world-0.1.0/src/bin/foo.rs", "hello_world-0.1.0/src/main.rs", } "#]], Some(( Path::new("hello_world-0.1.0/Cargo.toml"), expected_cargo_toml, )), "sdist-hello-world-default-run", )) } #[test] fn sdist_excludes_implicit_default_run() { let temp_dir = tempfile::tempdir().unwrap(); let project_dir = temp_dir.path().join("hello-world"); other::copy_dir_recursive(Path::new("test-crates/hello-world"), &project_dir).unwrap(); let cargo_toml_path = project_dir.join("Cargo.toml"); let cargo_toml = fs_err::read_to_string(&cargo_toml_path) .unwrap() .replace("../../README.md", "../README.md"); fs_err::write(&cargo_toml_path, cargo_toml).unwrap(); fs_err::write(temp_dir.path().join("README.md"), "Cargo readme").unwrap(); let pyproject_toml_path = project_dir.join("pyproject.toml"); let pyproject_toml = fs_err::read_to_string(&pyproject_toml_path) .unwrap() .replace("exclude = [", "exclude = [\n \"src/main.rs\","); fs_err::write(&pyproject_toml_path, pyproject_toml).unwrap(); let expected_cargo_toml = expect![[r#" [package] name = "hello-world" version = "0.1.0" authors = ["konstin "] edition = "2021" # Test references to out-of-project files readme = "README.md" [dependencies] [[bench]] name = "included_bench" [[example]] name = "included_example" "#]]; handle_result(other::test_source_distribution( &project_dir, SdistGenerator::Cargo, expect![[r#" { "hello_world-0.1.0/Cargo.lock", "hello_world-0.1.0/Cargo.toml", "hello_world-0.1.0/LICENSE", "hello_world-0.1.0/PKG-INFO", "hello_world-0.1.0/README.md", "hello_world-0.1.0/benches/included_bench.rs", "hello_world-0.1.0/check_installed/check_installed.py", "hello_world-0.1.0/examples/included_example.rs", "hello_world-0.1.0/licenses/AUTHORS.txt", "hello_world-0.1.0/pyproject.toml", "hello_world-0.1.0/src/bin/foo.rs", } "#]], Some(( Path::new("hello_world-0.1.0/Cargo.toml"), expected_cargo_toml, )), "sdist-hello-world-implicit-default-run", )) } #[test] fn sdist_excludes_explicit_build_script() { let temp_dir = tempfile::tempdir().unwrap(); let project_dir = temp_dir.path().join("buildrs-repro"); fs_err::create_dir_all(project_dir.join("src")).unwrap(); fs_err::write(project_dir.join("src/main.rs"), "fn main() {}\n").unwrap(); fs_err::write(project_dir.join("build.rs"), "fn main() {}\n").unwrap(); fs_err::write( project_dir.join("Cargo.toml"), indoc!( r#" [package] name = "buildrs-repro" version = "0.1.0" edition = "2021" build = "build.rs" [[bin]] name = "buildrs-repro" path = "src/main.rs" "# ), ) .unwrap(); fs_err::write( project_dir.join("pyproject.toml"), indoc!( r#" [project] name = "buildrs-repro" version = "0.1.0" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [tool.maturin] bindings = "bin" exclude = ["build.rs"] "# ), ) .unwrap(); let sdist_dir = temp_dir.path().join("dist"); let build_options = BuildOptions { output: OutputOptions { out: Some(sdist_dir), ..Default::default() }, cargo: CargoOptions { manifest_path: Some(project_dir.join("Cargo.toml")), quiet: true, target_dir: Some(temp_dir.path().join("target")), ..Default::default() }, ..Default::default() }; let build_context = build_options .into_build_context() .strip(Some(false)) .editable(false) .sdist_only(true) .build() .unwrap(); let sdist = BuildOrchestrator::new(&build_context) .build_source_distribution() .unwrap() .expect("failed to build sdist"); let maturin::UnpackedSdist { tmpdir: _tmp, cargo_toml, pyproject_toml: _pyproject_toml, } = unpack_sdist(&sdist.path).unwrap(); let sdist_root = cargo_toml.parent().unwrap(); assert!( !sdist_root.join("build.rs").exists(), "build.rs should not be packaged when excluded" ); let rewritten_manifest = fs_err::read_to_string(&cargo_toml).unwrap(); assert!( !rewritten_manifest.contains("build = \"build.rs\""), "expected explicit build script to be removed, got:\n{rewritten_manifest}" ); let output = Command::new("cargo") .args(["metadata", "--manifest-path"]) .arg(&cargo_toml) .args(["--format-version", "1"]) .output() .unwrap(); assert!( output.status.success(), "cargo metadata failed for unpacked sdist\nstdout:\n{}\nstderr:\n{}", String::from_utf8_lossy(&output.stdout), String::from_utf8_lossy(&output.stderr), ); } #[test] fn workspace_cargo_lock() { handle_result(other::test_workspace_cargo_lock()) } fn write_workspace_bin_project( workspace_dir: &Path, member: &str, project_metadata: &str, ) -> PathBuf { fs_err::write( workspace_dir.join("Cargo.toml"), format!("[workspace]\nresolver = \"2\"\nmembers = [\"{member}\"]\n"), ) .unwrap(); let project_dir = workspace_dir.join(member); fs_err::create_dir_all(project_dir.join("src")).unwrap(); fs_err::write(project_dir.join("src/main.rs"), "fn main() {}\n").unwrap(); fs_err::write( project_dir.join("Cargo.toml"), indoc!( r#" [package] name = "python-pkg" version = "0.1.0" edition = "2021" [[bin]] name = "python-pkg" path = "src/main.rs" "# ), ) .unwrap(); fs_err::write( project_dir.join("pyproject.toml"), format!( indoc!( r#" [project] name = "python-pkg" version = "0.1.0" {} [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [tool.maturin] bindings = "bin" "# ), project_metadata.trim_end() ), ) .unwrap(); project_dir } /// Regression test for https://github.com/PyO3/maturin/issues/3181 + /// follow-up: when `pyproject.toml` is in a workspace member subdirectory and /// references path metadata outside the member directory, those files must be /// included and the elevated `pyproject.toml` must be rewritten to the files' /// archive paths. #[test] fn sdist_workspace_member_readme_in_parent() { let temp_dir = tempfile::tempdir().unwrap(); let workspace_dir = temp_dir.path(); let crate_group_dir = workspace_dir.join("crates"); fs_err::create_dir_all(&crate_group_dir).unwrap(); fs_err::write(crate_group_dir.join("README.md"), "# my-pkg\n").unwrap(); fs_err::write(crate_group_dir.join("LICENSE"), "MIT\n").unwrap(); let project_dir = write_workspace_bin_project( workspace_dir, "crates/python-pkg", indoc!( r#" [project.readme] file = "../README.md" content-type = "text/markdown" [project.license] file = "../LICENSE" "# ), ); handle_result(other::test_source_distribution( &project_dir, SdistGenerator::Cargo, expect![[r#" { "python_pkg-0.1.0/Cargo.lock", "python_pkg-0.1.0/Cargo.toml", "python_pkg-0.1.0/PKG-INFO", "python_pkg-0.1.0/crates/LICENSE", "python_pkg-0.1.0/crates/README.md", "python_pkg-0.1.0/crates/python-pkg/Cargo.toml", "python_pkg-0.1.0/crates/python-pkg/src/main.rs", "python_pkg-0.1.0/pyproject.toml", } "#]], Some(( Path::new("python_pkg-0.1.0/pyproject.toml"), expect![[r#" [project] name = "python-pkg" version = "0.1.0" [project.readme] file = "crates/README.md" content-type = "text/markdown" [project.license] file = "crates/LICENSE" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [tool.maturin] bindings = "bin" manifest-path = "crates/python-pkg/Cargo.toml" "#]], )), "sdist-workspace-member-readme-in-parent", )) } /// Build an sdist and check that every `License-File` in `PKG-INFO` exists at /// that path relative to the sdist root, as PyPI requires. fn assert_sdist_license_files(project_dir: &Path, unique_name: &str, expected_files: Expect) { let mut archive = other::build_source_distribution(project_dir, SdistGenerator::Cargo, unique_name).unwrap(); let mut files = BTreeSet::new(); let mut pkg_info = String::new(); for entry in archive.entries().unwrap() { let mut entry = entry.unwrap(); let path = entry.path().unwrap().display().to_string(); if path.ends_with("/PKG-INFO") { entry.read_to_string(&mut pkg_info).unwrap(); } files.insert(path); } expected_files.assert_debug_eq(&files); let root_dir = files.first().unwrap().split('/').next().unwrap(); let license_files: Vec<_> = pkg_info .lines() .filter_map(|line| line.strip_prefix("License-File: ")) .collect(); assert!(!license_files.is_empty(), "no License-File in PKG-INFO"); for license_file in license_files { assert!( files.contains(&format!("{root_dir}/{license_file}")), "`License-File: {license_file}` is missing from the sdist: {files:?}" ); } } /// Regression test for https://github.com/PyO3/maturin/issues/3327: license /// files that are not listed in `project.license-files` must also be placed at /// the sdist root when the crate is not at the sdist root. #[test] fn sdist_auto_discovered_license_files_at_sdist_root() { // A workspace member with `license-files` in `project.dynamic`, like // `pyo3-introspection`. let temp_dir = tempfile::tempdir().unwrap(); let project_dir = write_workspace_bin_project( temp_dir.path(), "python-pkg", r#"dynamic = ["license-files"]"#, ); fs_err::write(project_dir.join("LICENSE-APACHE"), "Apache-2.0\n").unwrap(); fs_err::write(project_dir.join("LICENSE-MIT"), "MIT\n").unwrap(); assert_sdist_license_files( &project_dir, "sdist-workspace-member-auto-license-files", expect![[r#" { "python_pkg-0.1.0/Cargo.lock", "python_pkg-0.1.0/Cargo.toml", "python_pkg-0.1.0/LICENSE-APACHE", "python_pkg-0.1.0/LICENSE-MIT", "python_pkg-0.1.0/PKG-INFO", "python_pkg-0.1.0/pyproject.toml", "python_pkg-0.1.0/python-pkg/Cargo.toml", "python_pkg-0.1.0/python-pkg/LICENSE-APACHE", "python_pkg-0.1.0/python-pkg/LICENSE-MIT", "python_pkg-0.1.0/python-pkg/src/main.rs", } "#]], ); // `pyproject.toml` next to the license, with the crate in a subdirectory. let temp_dir = tempfile::tempdir().unwrap(); let project_dir = temp_dir.path(); let crate_dir = project_dir.join("rust"); fs_err::create_dir_all(crate_dir.join("src")).unwrap(); fs_err::write(crate_dir.join("src/main.rs"), "fn main() {}\n").unwrap(); fs_err::write( crate_dir.join("Cargo.toml"), indoc!( r#" [package] name = "python-pkg" version = "0.1.0" edition = "2021" "# ), ) .unwrap(); fs_err::write( project_dir.join("pyproject.toml"), indoc!( r#" [project] name = "python-pkg" version = "0.1.0" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [tool.maturin] bindings = "bin" manifest-path = "rust/Cargo.toml" "# ), ) .unwrap(); fs_err::write(project_dir.join("LICENSE"), "MIT\n").unwrap(); assert_sdist_license_files( &crate_dir, "sdist-manifest-path-auto-license-files", expect![[r#" { "python_pkg-0.1.0/LICENSE", "python_pkg-0.1.0/PKG-INFO", "python_pkg-0.1.0/pyproject.toml", "python_pkg-0.1.0/rust/Cargo.lock", "python_pkg-0.1.0/rust/Cargo.toml", "python_pkg-0.1.0/rust/src/main.rs", } "#]], ); } #[test] fn git_sdist_rejects_parent_relative_pyproject_metadata_paths() { let temp_dir = tempfile::tempdir().unwrap(); let workspace_dir = temp_dir.path(); fs_err::write(workspace_dir.join("README.md"), "# my-pkg\n").unwrap(); let project_dir = write_workspace_bin_project(workspace_dir, "python-pkg", "readme = \"../README.md\""); let err = match other::build_source_distribution( &project_dir, SdistGenerator::Git, "git-sdist-rejects-parent-relative-pyproject-metadata-paths", ) { Ok(_) => panic!("expected git sdist generator to reject parent-relative readme"), Err(err) => err, }; let err = format!("{err:#}"); assert!( err.contains("must not contain `..` when using the git sdist generator"), "unexpected error: {err}" ); } #[test] fn build_wheels_from_sdist_hello_world() { handle_result(other::test_build_wheels_from_sdist( "test-crates/hello-world", )) } #[test] fn workspace_members_beneath_pyproject_sdist() { let cargo_toml = expect![[r#" [workspace] resolver = "2" members = ["pyo3-mixed-workspace", "python/pyo3-mixed-workspace-py"] "#]]; run_sdist_case( SdistCase { id: "sdist-workspace-members-beneath_pyproject", package: "test-crates/pyo3-mixed-workspace/rust/python/pyo3-mixed-workspace-py", generator: SdistGenerator::Cargo, }, expect![[r#" { "pyo3_mixed_workspace-2.1.3/PKG-INFO", "pyo3_mixed_workspace-2.1.3/README.md", "pyo3_mixed_workspace-2.1.3/pyproject.toml", "pyo3_mixed_workspace-2.1.3/rust/Cargo.lock", "pyo3_mixed_workspace-2.1.3/rust/Cargo.toml", "pyo3_mixed_workspace-2.1.3/rust/pyo3-mixed-workspace/Cargo.toml", "pyo3_mixed_workspace-2.1.3/rust/pyo3-mixed-workspace/src/lib.rs", "pyo3_mixed_workspace-2.1.3/rust/python/pyo3-mixed-workspace-py/Cargo.toml", "pyo3_mixed_workspace-2.1.3/rust/python/pyo3-mixed-workspace-py/src/lib.rs", "pyo3_mixed_workspace-2.1.3/src/pyo3_mixed_workspace/__init__.py", "pyo3_mixed_workspace-2.1.3/src/pyo3_mixed_workspace/python_module/__init__.py", "pyo3_mixed_workspace-2.1.3/src/pyo3_mixed_workspace/python_module/double.py", "pyo3_mixed_workspace-2.1.3/src/tests/test_pyo3_mixed.py", } "#]], Some(( Path::new("pyo3_mixed_workspace-2.1.3/rust/Cargo.toml"), cargo_toml, )), ) } #[test] fn workspace_members_non_local_dep_sdist() { let cargo_toml = expect![[r#" [package] authors = ["konstin "] name = "pyo3-pure" version = "2.1.2" edition = "2021" description = "Implements a dummy function (get_fortytwo.DummyClass.get_42()) in rust" license = "MIT" readme = "README.md" [dependencies] pyo3 = { version = "0.29.0", features = [ "abi3-py39", ] } [lib] name = "pyo3_pure" crate-type = ["cdylib"] "#]]; run_sdist_case( SdistCase { id: "sdist-workspace-members-non-local-dep", package: "test-crates/pyo3-pure", generator: SdistGenerator::Cargo, }, expect![[r#" { "pyo3_pure-0.1.0+abc123de/Cargo.lock", "pyo3_pure-0.1.0+abc123de/Cargo.toml", "pyo3_pure-0.1.0+abc123de/LICENSE", "pyo3_pure-0.1.0+abc123de/PKG-INFO", "pyo3_pure-0.1.0+abc123de/README.md", "pyo3_pure-0.1.0+abc123de/check_installed/check_installed.py", "pyo3_pure-0.1.0+abc123de/pyo3_pure.pyi", "pyo3_pure-0.1.0+abc123de/pyproject.toml", "pyo3_pure-0.1.0+abc123de/src/lib.rs", "pyo3_pure-0.1.0+abc123de/tests/test_pyo3_pure.py", "pyo3_pure-0.1.0+abc123de/tox.ini", } "#]], Some((Path::new("pyo3_pure-0.1.0+abc123de/Cargo.toml"), cargo_toml)), ) } #[test] fn lib_with_path_dep_sdist() { run_sdist_case( SdistCase { id: "sdist-lib-with-path-dep", package: "test-crates/sdist_with_path_dep", generator: SdistGenerator::Cargo, }, expect![[r#" { "sdist_with_path_dep-0.1.0/PKG-INFO", "sdist_with_path_dep-0.1.0/pyproject.toml", "sdist_with_path_dep-0.1.0/sdist_with_path_dep/Cargo.lock", "sdist_with_path_dep-0.1.0/sdist_with_path_dep/Cargo.toml", "sdist_with_path_dep-0.1.0/sdist_with_path_dep/src/lib.rs", "sdist_with_path_dep-0.1.0/some_path_dep/Cargo.toml", "sdist_with_path_dep-0.1.0/some_path_dep/src/lib.rs", "sdist_with_path_dep-0.1.0/transitive_path_dep/Cargo.toml", "sdist_with_path_dep-0.1.0/transitive_path_dep/src/lib.rs", } "#]], None, ) } #[test] fn lib_with_target_path_dep_sdist() { let cargo_toml = expect![[r#" [package] name = "sdist_with_target_path_dep" version = "0.1.0" authors = ["konstin "] edition = "2021" [lib] crate-type = ["cdylib"] [dependencies] pyo3 = { version = "0.29.0" } [target.'cfg(not(target_endian = "all-over-the-place"))'.dependencies] some_path_dep = { path = "../some_path_dep" } "#]]; run_sdist_case( SdistCase { id: "sdist-lib-with-target-path-dep", package: "test-crates/sdist_with_target_path_dep", generator: SdistGenerator::Cargo, }, expect![[r#" { "sdist_with_target_path_dep-0.1.0/PKG-INFO", "sdist_with_target_path_dep-0.1.0/pyproject.toml", "sdist_with_target_path_dep-0.1.0/sdist_with_target_path_dep/Cargo.lock", "sdist_with_target_path_dep-0.1.0/sdist_with_target_path_dep/Cargo.toml", "sdist_with_target_path_dep-0.1.0/sdist_with_target_path_dep/src/lib.rs", "sdist_with_target_path_dep-0.1.0/some_path_dep/Cargo.toml", "sdist_with_target_path_dep-0.1.0/some_path_dep/src/lib.rs", "sdist_with_target_path_dep-0.1.0/transitive_path_dep/Cargo.toml", "sdist_with_target_path_dep-0.1.0/transitive_path_dep/src/lib.rs", } "#]], Some(( Path::new("sdist_with_target_path_dep-0.1.0/sdist_with_target_path_dep/Cargo.toml"), cargo_toml, )), ) } // Remaining bespoke sdist regressions stay imperative because they synthesize // custom workspaces and validate hand-written manifest rewrites. // The body of these tests is moved mechanically from the previous monolithic run.rs. #[test] fn lib_with_parent_workspace_path_dep_sdist() { let expected_shared_crate_cargo_toml = expect![[r#" [package] name = "shared_crate" version = "0.1.0" edition = "2021" readme = "README.md" publish = false include = ["src/**", "README.md", "Cargo.toml"] [lib] [dev-dependencies] log = "^0.4" "#]]; run_sdist_case( SdistCase { id: "sdist-lib-with-parent-workspace-path-dep", package: "test-crates/parent_workspace_sdist/crates/pysof", generator: SdistGenerator::Cargo, }, expect![[r#" { "pysof-0.1.0/PKG-INFO", "pysof-0.1.0/pyproject.toml", "pysof-0.1.0/pysof/.gitignore", "pysof-0.1.0/pysof/Cargo.lock", "pysof-0.1.0/pysof/Cargo.toml", "pysof-0.1.0/pysof/src/lib.rs", "pysof-0.1.0/shared_crate/Cargo.toml", "pysof-0.1.0/shared_crate/README.md", "pysof-0.1.0/shared_crate/src/lib.rs", } "#]], Some(( Path::new("pysof-0.1.0/shared_crate/Cargo.toml"), expected_shared_crate_cargo_toml, )), ) } // ---- BEGIN mechanically moved imperative regressions ---- #[test] fn lib_with_parent_workspace_git_dep_sdist() { if which("git").is_err() { eprintln!("Skipping lib_with_parent_workspace_git_dep_sdist: git not found"); return; } let temp_dir = tempfile::tempdir().unwrap(); let git_dep_dir = temp_dir.path().join("gitdep"); fs_err::create_dir_all(git_dep_dir.join("src")).unwrap(); fs_err::write( git_dep_dir.join("Cargo.toml"), indoc!( r#" [package] name = "gitdep" version = "0.1.0" edition = "2021" [lib] "# ), ) .unwrap(); fs_err::write(git_dep_dir.join("src/lib.rs"), "pub fn from_git() {}\n").unwrap(); assert!( Command::new("git") .args(["init", "--initial-branch=main", "-q"]) .current_dir(&git_dep_dir) .status() .unwrap() .success() ); assert!( Command::new("git") .args(["add", "."]) .current_dir(&git_dep_dir) .status() .unwrap() .success() ); assert!( Command::new("git") .args([ "-c", "user.name=maturin-tests", "-c", "user.email=maturin-tests@example.com", "commit", "-q", "-m", "init", ]) .current_dir(&git_dep_dir) .status() .unwrap() .success() ); let git_dep_url = Url::from_directory_path(&git_dep_dir) .expect("git dependency path should convert to file:// URL") .to_string(); let workspace_root = temp_dir.path().join("workspace"); let pysof_dir = workspace_root.join("crates/pysof"); let shared_dir = workspace_root.join("crates/shared_crate"); fs_err::create_dir_all(pysof_dir.join("src")).unwrap(); fs_err::create_dir_all(shared_dir.join("src")).unwrap(); fs_err::write(workspace_root.join("README.md"), "workspace readme\n").unwrap(); fs_err::write( workspace_root.join("Cargo.toml"), format!( indoc!( r#" [workspace] members = ["crates/shared_crate"] exclude = ["crates/pysof"] resolver = "2" [workspace.package] edition = "2021" readme = "README.md" [workspace.dependencies] gitdep = {{ git = "{}", branch = "main" }} "# ), git_dep_url ), ) .unwrap(); fs_err::write( shared_dir.join("Cargo.toml"), indoc!( r#" [package] name = "shared_crate" version = "0.1.0" edition.workspace = true readme.workspace = true [lib] [dependencies] gitdep = { workspace = true } "# ), ) .unwrap(); fs_err::write( shared_dir.join("src/lib.rs"), "pub fn use_git() { gitdep::from_git(); }\n", ) .unwrap(); fs_err::write( pysof_dir.join("Cargo.toml"), indoc!( r#" [package] name = "pysof" version = "0.1.0" edition = "2021" [lib] crate-type = ["cdylib"] [dependencies] pyo3 = { version = "0.29.0", features = ["extension-module"] } shared_crate = { path = "../shared_crate" } "# ), ) .unwrap(); fs_err::write( pysof_dir.join("src/lib.rs"), indoc!( r#" use pyo3::prelude::*; #[pymodule] fn pysof(_m: &Bound<'_, PyModule>) -> PyResult<()> { shared_crate::use_git(); Ok(()) } "# ), ) .unwrap(); fs_err::write( pysof_dir.join("pyproject.toml"), indoc!( r#" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "pysof" version = "0.1.0" "# ), ) .unwrap(); let sdist_dir = temp_dir.path().join("dist"); let build_options = BuildOptions { output: OutputOptions { out: Some(sdist_dir), ..Default::default() }, cargo: CargoOptions { manifest_path: Some(pysof_dir.join("Cargo.toml")), quiet: true, target_dir: Some(temp_dir.path().join("target")), ..Default::default() }, ..Default::default() }; let build_context = build_options .into_build_context() .strip(Some(false)) .editable(false) .sdist_only(true) .build() .unwrap(); let sdist = BuildOrchestrator::new(&build_context) .build_source_distribution() .unwrap() .expect("failed to build sdist"); let maturin::UnpackedSdist { tmpdir: _tmp, cargo_toml, pyproject_toml: _pyproject_toml, } = unpack_sdist(&sdist.path).unwrap(); let sdist_root = cargo_toml.parent().unwrap().parent().unwrap(); let shared_manifest = sdist_root.join("shared_crate/Cargo.toml"); let rewritten_shared_manifest = fs_err::read_to_string(&shared_manifest).unwrap(); assert!(rewritten_shared_manifest.contains("git = \"file://")); assert!(rewritten_shared_manifest.contains("branch = \"main\"")); let output = Command::new("cargo") .args(["metadata", "--manifest-path"]) .arg(&cargo_toml) .args(["--format-version", "1"]) .output() .unwrap(); assert!(output.status.success()); } #[test] fn lib_with_parent_workspace_lints_sdist() { let temp_dir = tempfile::tempdir().unwrap(); let workspace_root = temp_dir.path().join("workspace"); let pyapp_dir = workspace_root.join("crates/pyapp"); let shared_dir = workspace_root.join("crates/shared_crate"); fs_err::create_dir_all(pyapp_dir.join("src")).unwrap(); fs_err::create_dir_all(shared_dir.join("src")).unwrap(); fs_err::write(workspace_root.join("README.md"), "workspace readme\n").unwrap(); fs_err::write( workspace_root.join("Cargo.toml"), indoc!( r#" [workspace] members = ["crates/shared_crate"] exclude = ["crates/pyapp"] resolver = "2" [workspace.package] edition = "2021" readme = "README.md" [workspace.lints.rust] unsafe_code = "forbid" "# ), ) .unwrap(); fs_err::write( shared_dir.join("Cargo.toml"), indoc!( r#" [package] name = "shared_crate" version = "0.1.0" edition.workspace = true readme.workspace = true [lib] [lints] workspace = true "# ), ) .unwrap(); fs_err::write(shared_dir.join("src/lib.rs"), "pub fn hello() {}\n").unwrap(); fs_err::write( pyapp_dir.join("Cargo.toml"), indoc!( r#" [package] name = "pyapp" version = "0.1.0" edition = "2021" [lib] crate-type = ["cdylib"] [dependencies] pyo3 = { version = "0.29.0", features = ["extension-module"] } shared_crate = { path = "../shared_crate" } "# ), ) .unwrap(); fs_err::write( pyapp_dir.join("src/lib.rs"), indoc!( r#" use pyo3::prelude::*; #[pymodule] fn pyapp(_m: &Bound<'_, PyModule>) -> PyResult<()> { shared_crate::hello(); Ok(()) } "# ), ) .unwrap(); fs_err::write( pyapp_dir.join("pyproject.toml"), indoc!( r#" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "pyapp" version = "0.1.0" "# ), ) .unwrap(); let sdist_dir = temp_dir.path().join("dist"); let build_options = BuildOptions { output: OutputOptions { out: Some(sdist_dir), ..Default::default() }, cargo: CargoOptions { manifest_path: Some(pyapp_dir.join("Cargo.toml")), quiet: true, target_dir: Some(temp_dir.path().join("target")), ..Default::default() }, ..Default::default() }; let build_context = build_options .into_build_context() .strip(Some(false)) .editable(false) .sdist_only(true) .build() .unwrap(); let sdist = BuildOrchestrator::new(&build_context) .build_source_distribution() .unwrap() .expect("failed to build sdist"); let maturin::UnpackedSdist { tmpdir: _tmp, cargo_toml, pyproject_toml: _pyproject_toml, } = unpack_sdist(&sdist.path).unwrap(); let sdist_root = cargo_toml.parent().unwrap().parent().unwrap(); let shared_manifest = sdist_root.join("shared_crate/Cargo.toml"); let rewritten_shared_manifest = fs_err::read_to_string(&shared_manifest).unwrap(); assert!(rewritten_shared_manifest.contains("[lints.rust]")); assert!(rewritten_shared_manifest.contains("unsafe_code = \"forbid\"")); assert!(!rewritten_shared_manifest.contains("workspace = true")); let output = Command::new("cargo") .args(["metadata", "--manifest-path"]) .arg(&cargo_toml) .args(["--format-version", "1"]) .output() .unwrap(); assert!(output.status.success()); } // ---- END mechanically moved imperative regressions ---- #[test] fn external_python_source_sdist() { let pyproject_toml = expect![[r#" [project] name = "external-python-source" version = "0.1.0" [build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [tool.maturin] bindings = "bin" module-name = "external_python_source" manifest-path = "crate/Cargo.toml" python-source = "python" "#]]; run_sdist_case( SdistCase { id: "sdist-external-python-source", package: "test-crates/external-python-source/crate", generator: SdistGenerator::Cargo, }, expect![[r#" { "external_python_source-0.1.0/PKG-INFO", "external_python_source-0.1.0/crate/.gitignore", "external_python_source-0.1.0/crate/Cargo.lock", "external_python_source-0.1.0/crate/Cargo.toml", "external_python_source-0.1.0/crate/src/main.rs", "external_python_source-0.1.0/pyproject.toml", "external_python_source-0.1.0/python/external_python_source/__init__.py", } "#]], Some(( Path::new("external_python_source-0.1.0/pyproject.toml"), pyproject_toml, )), ) } #[test] fn pyo3_mixed_src_layout_sdist() { run_sdist_case( SdistCase { id: "sdist-pyo3-mixed-src-layout", package: "test-crates/pyo3-mixed-src/rust", generator: SdistGenerator::Cargo, }, expect![[r#" { "pyo3_mixed_src-2.1.3/PKG-INFO", "pyo3_mixed_src-2.1.3/README.md", "pyo3_mixed_src-2.1.3/pyproject.toml", "pyo3_mixed_src-2.1.3/rust/Cargo.lock", "pyo3_mixed_src-2.1.3/rust/Cargo.toml", "pyo3_mixed_src-2.1.3/rust/src/lib.rs", "pyo3_mixed_src-2.1.3/src/pyo3_mixed_src/__init__.py", "pyo3_mixed_src-2.1.3/src/pyo3_mixed_src/python_module/__init__.py", "pyo3_mixed_src-2.1.3/src/pyo3_mixed_src/python_module/double.py", "pyo3_mixed_src-2.1.3/src/tests/test_pyo3_mixed.py", } "#]], None, ) } #[test] fn target_dir_in_python_package_sdist() { handle_result(other::test_target_dir_in_python_package_sdist()) } #[test] fn pyo3_mixed_include_exclude_sdist() { run_sdist_case( SdistCase { id: "sdist-pyo3-mixed-include-exclude", package: "test-crates/pyo3-mixed-include-exclude", generator: SdistGenerator::Cargo, }, expect![[r#" { "pyo3_mixed_include_exclude-2.1.3/.gitignore", "pyo3_mixed_include_exclude-2.1.3/Cargo.lock", "pyo3_mixed_include_exclude-2.1.3/Cargo.toml", "pyo3_mixed_include_exclude-2.1.3/PKG-INFO", "pyo3_mixed_include_exclude-2.1.3/README.md", "pyo3_mixed_include_exclude-2.1.3/build.rs", "pyo3_mixed_include_exclude-2.1.3/check_installed/check_installed.py", "pyo3_mixed_include_exclude-2.1.3/pyo3_mixed_include_exclude/__init__.py", "pyo3_mixed_include_exclude-2.1.3/pyo3_mixed_include_exclude/include_this_file", "pyo3_mixed_include_exclude-2.1.3/pyo3_mixed_include_exclude/python_module/__init__.py", "pyo3_mixed_include_exclude-2.1.3/pyo3_mixed_include_exclude/python_module/double.py", "pyo3_mixed_include_exclude-2.1.3/pyproject.toml", "pyo3_mixed_include_exclude-2.1.3/src/lib.rs", "pyo3_mixed_include_exclude-2.1.3/tox.ini", } "#]], None, ) } #[test] fn pyo3_mixed_include_exclude_git_sdist_generator() { if !Path::new(".git").exists() { return; } run_sdist_case( SdistCase { id: "sdist-pyo3-mixed-include-exclude-git", package: "test-crates/pyo3-mixed-include-exclude", generator: SdistGenerator::Git, }, expect![[r#" { "pyo3_mixed_include_exclude-2.1.3/.gitignore", "pyo3_mixed_include_exclude-2.1.3/Cargo.lock", "pyo3_mixed_include_exclude-2.1.3/Cargo.toml", "pyo3_mixed_include_exclude-2.1.3/PKG-INFO", "pyo3_mixed_include_exclude-2.1.3/README.md", "pyo3_mixed_include_exclude-2.1.3/build.rs", "pyo3_mixed_include_exclude-2.1.3/check_installed/check_installed.py", "pyo3_mixed_include_exclude-2.1.3/pyo3_mixed_include_exclude/__init__.py", "pyo3_mixed_include_exclude-2.1.3/pyo3_mixed_include_exclude/include_this_file", "pyo3_mixed_include_exclude-2.1.3/pyo3_mixed_include_exclude/python_module/__init__.py", "pyo3_mixed_include_exclude-2.1.3/pyo3_mixed_include_exclude/python_module/double.py", "pyo3_mixed_include_exclude-2.1.3/pyproject.toml", "pyo3_mixed_include_exclude-2.1.3/src/lib.rs", "pyo3_mixed_include_exclude-2.1.3/tox.ini", } "#]], None, ) } #[test] fn workspace_sdist() { run_sdist_case( SdistCase { id: "sdist-workspace", package: "test-crates/workspace/py", generator: SdistGenerator::Cargo, }, expect![[r#" { "py-0.1.0/Cargo.lock", "py-0.1.0/Cargo.toml", "py-0.1.0/PKG-INFO", "py-0.1.0/py/Cargo.toml", "py-0.1.0/py/src/main.rs", "py-0.1.0/pyproject.toml", } "#]], None, ) } #[test] fn workspace_with_path_dep_sdist() { run_sdist_case( SdistCase { id: "sdist-workspace-with-path-dep", package: "test-crates/workspace_with_path_dep/python", generator: SdistGenerator::Cargo, }, expect![[r#" { "workspace_with_path_dep-0.1.0/Cargo.lock", "workspace_with_path_dep-0.1.0/Cargo.toml", "workspace_with_path_dep-0.1.0/PKG-INFO", "workspace_with_path_dep-0.1.0/generic_lib/Cargo.toml", "workspace_with_path_dep-0.1.0/generic_lib/src/lib.rs", "workspace_with_path_dep-0.1.0/pyproject.toml", "workspace_with_path_dep-0.1.0/python/Cargo.toml", "workspace_with_path_dep-0.1.0/python/src/lib.rs", "workspace_with_path_dep-0.1.0/transitive_lib/Cargo.toml", "workspace_with_path_dep-0.1.0/transitive_lib/src/lib.rs", } "#]], None, ) } #[test] fn workspace_with_path_dep_git_sdist_generator() { if !Path::new(".git").exists() { return; } run_sdist_case( SdistCase { id: "sdist-workspace-with-path-dep-git", package: "test-crates/workspace_with_path_dep/python", generator: SdistGenerator::Git, }, expect![[r#" { "workspace_with_path_dep-0.1.0/Cargo.toml", "workspace_with_path_dep-0.1.0/PKG-INFO", "workspace_with_path_dep-0.1.0/pyproject.toml", "workspace_with_path_dep-0.1.0/src/lib.rs", } "#]], None, ) } #[rustversion::since(1.64)] #[test] fn workspace_inheritance_sdist() { run_sdist_case( SdistCase { id: "sdist-workspace-inheritance", package: "test-crates/workspace-inheritance/python", generator: SdistGenerator::Cargo, }, expect![[r#" { "workspace_inheritance-0.1.0/Cargo.lock", "workspace_inheritance-0.1.0/Cargo.toml", "workspace_inheritance-0.1.0/PKG-INFO", "workspace_inheritance-0.1.0/generic_lib/Cargo.toml", "workspace_inheritance-0.1.0/generic_lib/src/lib.rs", "workspace_inheritance-0.1.0/pyproject.toml", "workspace_inheritance-0.1.0/python/Cargo.toml", "workspace_inheritance-0.1.0/python/src/lib.rs", } "#]], None, ) } #[test] fn workspace_license_files() { let cargo_toml = expect![[r#" [package] name = "hello-world" version = "0.1.0" authors = ["konstin "] edition = "2021" # Test references to out-of-project files readme = "README.md" default-run = "hello-world" [dependencies] [[bench]] name = "included_bench" [[example]] name = "included_example" "#]]; run_sdist_case( SdistCase { id: "sdist-hello-world", package: "test-crates/hello-world", generator: SdistGenerator::Cargo, }, expect![[r#" { "hello_world-0.1.0/Cargo.lock", "hello_world-0.1.0/Cargo.toml", "hello_world-0.1.0/LICENSE", "hello_world-0.1.0/PKG-INFO", "hello_world-0.1.0/README.md", "hello_world-0.1.0/benches/included_bench.rs", "hello_world-0.1.0/check_installed/check_installed.py", "hello_world-0.1.0/examples/included_example.rs", "hello_world-0.1.0/licenses/AUTHORS.txt", "hello_world-0.1.0/pyproject.toml", "hello_world-0.1.0/src/bin/foo.rs", "hello_world-0.1.0/src/main.rs", } "#]], Some((Path::new("hello_world-0.1.0/Cargo.toml"), cargo_toml)), ) } maturin-1.16.0/tests/run/wheel.rs000066400000000000000000000046461527064705700167250ustar00rootroot00000000000000use crate::common::{handle_result, other}; #[test] #[cfg(feature = "sbom")] fn pyo3_pure_sbom_wheel_files() { handle_result(other::check_wheel_files_with_sbom( "test-crates/pyo3-pure", "wheel-files-pyo3-pure-sbom", )) } #[test] fn pyo3_mixed_include_exclude_wheel_files() { #[allow(unused_mut)] let mut expected = vec![ "pyo3_mixed_include_exclude-2.1.3.dist-info/METADATA", "pyo3_mixed_include_exclude-2.1.3.dist-info/RECORD", "pyo3_mixed_include_exclude-2.1.3.dist-info/WHEEL", "pyo3_mixed_include_exclude-2.1.3.dist-info/entry_points.txt", "pyo3_mixed_include_exclude/__init__.py", "pyo3_mixed_include_exclude/generated_info.txt", "pyo3_mixed_include_exclude/include_this_file", "pyo3_mixed_include_exclude/python_module/__init__.py", "pyo3_mixed_include_exclude/python_module/double.py", "README.md", ]; #[cfg(feature = "sbom")] expected.push( "pyo3_mixed_include_exclude-2.1.3.dist-info/sboms/pyo3-mixed-include-exclude.cyclonedx.json", ); handle_result(other::check_wheel_files( "test-crates/pyo3-mixed-include-exclude", expected, "wheel-files-pyo3-mixed-include-exclude", )) } #[test] fn pyo3_mixed_py_subdir_include_wheel_files() { #[allow(unused_mut)] let mut expected = vec![ "pyo3_mixed_py_subdir-2.1.3.dist-info/METADATA", "pyo3_mixed_py_subdir-2.1.3.dist-info/RECORD", "pyo3_mixed_py_subdir-2.1.3.dist-info/WHEEL", "pyo3_mixed_py_subdir-2.1.3.dist-info/entry_points.txt", "pyo3_mixed_py_subdir/__init__.py", "pyo3_mixed_py_subdir/python_module/__init__.py", "pyo3_mixed_py_subdir/python_module/double.py", "assets/extra_data.txt", ]; #[cfg(feature = "sbom")] expected.push("pyo3_mixed_py_subdir-2.1.3.dist-info/sboms/pyo3-mixed-py-subdir.cyclonedx.json"); handle_result(other::check_wheel_files( "test-crates/pyo3-mixed-py-subdir", expected, "wheel-files-pyo3-mixed-py-subdir-include", )) } #[test] fn pyo3_wheel_record_has_normalized_paths() { handle_result(other::check_wheel_paths( "test-crates/pyo3-mixed-include-exclude", "pyo3_mixed_include_exclude-2.1.3.dist-info/RECORD", "wheel-record-pyo3-mixed-include-exclude", )) } #[test] fn target_dir_in_python_package() { handle_result(other::test_target_dir_in_python_package()) }