go-to-wheel
Compile Go CLI programs into Python wheels.
This tool takes a Go module directory, cross-compiles it for multiple platforms, and produces properly-tagged Python wheels that can be installed via pip or pipx to get the Go binary on your PATH.
Installation
pip install go-to-wheel
# or
pipx install go-to-wheel
Requires Go to be installed and available in your PATH.
Quick start
Build wheels for all platforms from a Go module:
go-to-wheel path/to/go-module
This will create wheels in a ./dist directory for Linux (glibc and musl), macOS (Intel and Apple Silicon), and Windows (amd64 and arm64).
Usage
go-to-wheel path/to/go-folder [options]
Options
| Option | Description | Default |
|---|---|---|
--name NAME |
Python package name | Directory basename |
--version VERSION |
Package version | 0.1.0 |
--output-dir DIR |
Directory for built wheels | ./dist |
--entry-point NAME |
CLI command name | Same as package name |
--platforms PLATFORMS |
Comma-separated list of targets | All supported platforms |
--go-binary PATH |
Path to Go binary | go |
--description TEXT |
Package description | "Go binary packaged as Python wheel" |
--license LICENSE |
License identifier | None |
--author AUTHOR |
Author name | None |
--author-email EMAIL |
Author email | None |
--url URL |
Project URL | None |
--requires-python VERSION |
Python version requirement | >=3.10 |
--readme PATH |
Path to README markdown file for PyPI long description | None |
--set-version-var VAR |
Go variable to set to --version value via -X ldflag |
None |
--ldflags FLAGS |
Additional Go linker flags (appended to default -s -w) |
None |
Examples
Build wheels with a custom package name:
go-to-wheel ./mytool --name my-python-tool
Build for specific platforms only:
go-to-wheel ./mytool --platforms linux-amd64,darwin-arm64
Embed the wheel version into the Go binary at compile time (requires a var version in your Go source):
go-to-wheel ./mytool --version 2.0.0 --set-version-var main.version
This passes -X main.version=2.0.0 to the Go linker, so the compiled binary knows its own version without hardcoding it in the Go source. A typical Go pattern for this:
var version = "dev"
func main() {
if os.Args[1] == "--version" {
fmt.Println(version) // prints "2.0.0" when built with --set-version-var
}
}
Pass arbitrary Go linker flags with --ldflags:
go-to-wheel ./mytool --version 2.0.0 \
--ldflags "-X main.version=2.0.0 -X main.commit=abc123"
The flags are appended to the default -s -w, so the full linker invocation becomes -ldflags="-s -w -X main.version=2.0.0 -X main.commit=abc123".
Build with full metadata for PyPI:
go-to-wheel ./mytool \
--name mytool-bin \
--version 2.0.0 \
--description "My awesome tool" \
--license MIT \
--author "Jane Doe" \
--author-email "jane@example.com" \
--url "https://github.com/jane/mytool" \
--readme README.md
Supported platforms
| Platform | Wheel Tag |
|---|---|
linux-amd64 |
manylinux_2_17_x86_64 |
linux-arm64 |
manylinux_2_17_aarch64 |
linux-amd64-musl |
musllinux_1_2_x86_64 |
linux-arm64-musl |
musllinux_1_2_aarch64 |
darwin-amd64 |
macosx_10_9_x86_64 |
darwin-arm64 |
macosx_11_0_arm64 |
windows-amd64 |
win_amd64 |
windows-arm64 |
win_arm64 |
How it works
- Cross-compiles the Go binary using
GOOSandGOARCHenvironment variables withCGO_ENABLED=0for static binaries - Creates a Python package with a thin wrapper that
execs the bundled binary - Packages everything into a wheel with the correct platform tag
The resulting wheel can be installed with pip:
pip install ./dist/mytool-1.0.0-py3-none-manylinux_2_17_x86_64.whl
Or tested directly with uv:
uv run --with ./dist/mytool-1.0.0-py3-none-manylinux_2_17_x86_64.whl mytool --help
Development
Clone the repository:
git clone https://github.com/simonw/go-to-wheel
cd go-to-wheel
Run tests:
uv run pytest
See also
- maturin - The Rust equivalent that inspired this tool
- pip-binary-factory - Template for packaging pre-built binaries
Metadata
Release files for go-to-wheel 0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| go_to_wheel-0.2.tar.gz | 17.7 kB | With provenance | Details for go_to_wheel-0.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| go_to_wheel-0.2-py3-none-any.whl | Python 3 | none | any | Details for go_to_wheel-0.2-py3-none-any.whl |
Total release size: 29.7 kB
Release files / go_to_wheel-0.2.tar.gz
| Download URL | go_to_wheel-0.2.tar.gz |
|---|---|
| Size | 17.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4c7d3906e1f48e759a3e297570ed9514d9948dd66feb351732e344347a0b9945
|
|
BLAKE2b-256 checksum How to use checksums |
7fc2c6e468bb65e549913094b40ad64eec4d750d8f47bb9d16184a7462c916b0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 4, 2026.
Transparency logRelease files / go_to_wheel-0.2-py3-none-any.whl
| Download URL | go_to_wheel-0.2-py3-none-any.whl |
|---|---|
| Size | 12.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
efc6c9b8b1ea6074cc2679820b5b5d47197ef9172e1169fb332caab5ebbf62c0
|
|
BLAKE2b-256 checksum How to use checksums |
da5a0cdd968c17240c24760ffb6b2ae6ea2b960ca404eeaa509bf3e1b98b23bf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 4, 2026.
Transparency logSecurity for go-to-wheel 0.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for go_to_wheel-0.2.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 4, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.