Skip to main content

Compile Go CLI programs into Python wheels

Project description

go-to-wheel

PyPI Changelog Tests License

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

  1. Cross-compiles the Go binary using GOOS and GOARCH environment variables with CGO_ENABLED=0 for static binaries
  2. Creates a Python package with a thin wrapper that execs the bundled binary
  3. 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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

go_to_wheel-0.2.tar.gz (17.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

go_to_wheel-0.2-py3-none-any.whl (12.0 kB view details)

Uploaded Python 3

File details

Details for the file go_to_wheel-0.2.tar.gz.

File metadata

  • Download URL: go_to_wheel-0.2.tar.gz
  • Upload date:
  • Size: 17.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for go_to_wheel-0.2.tar.gz
Algorithm Hash digest
SHA256 4c7d3906e1f48e759a3e297570ed9514d9948dd66feb351732e344347a0b9945
MD5 b3f5e1ad7b2ed36e3645bb45f1f984ba
BLAKE2b-256 7fc2c6e468bb65e549913094b40ad64eec4d750d8f47bb9d16184a7462c916b0

See more details on using hashes here.

Provenance

The following attestation bundles were made for go_to_wheel-0.2.tar.gz:

Publisher: publish.yml on simonw/go-to-wheel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file go_to_wheel-0.2-py3-none-any.whl.

File metadata

  • Download URL: go_to_wheel-0.2-py3-none-any.whl
  • Upload date:
  • Size: 12.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for go_to_wheel-0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 efc6c9b8b1ea6074cc2679820b5b5d47197ef9172e1169fb332caab5ebbf62c0
MD5 f66b3c90d60ca307f6c0b5b560128ed1
BLAKE2b-256 da5a0cdd968c17240c24760ffb6b2ae6ea2b960ca404eeaa509bf3e1b98b23bf

See more details on using hashes here.

Provenance

The following attestation bundles were made for go_to_wheel-0.2-py3-none-any.whl:

Publisher: publish.yml on simonw/go-to-wheel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page