Skip to main content

build status pre-commit.ci status

setuptools-golang

A setuptools extension for building cpython extensions written in golang.

Requirements

This requires golang >= 1.5.

This requires python >= 3.7. It is currently tested against python3 and pypy3.

Platform Support

  • linux
  • macOS
  • win32 (32 bit cpython, 32 bit go 1.10+)

Usage

Add setuptools-golang to the setup_requires in your setup.py and build_golang={'root': ...}. root refers to the root go import path of your project.

By default, setuptools-golang will strip all binaries. This can be disabled by adding 'strip': False to build_golang. This will increase the size of the extension, but the binaries contain debugging information and symbols.

An extension must be a single file in the main go package (though the entire main package will be built into the extension). That package may import other code. You may have multiple extensions in your setup.py.

setup(
    ...
    build_golang={'root': 'github.com/user/project'},
    ext_modules=[Extension('example', ['example.go'])],
    setup_requires=['setuptools-golang'],
    ...
)

Writing cpython extensions in golang

Here's some examples

Common issues

undefined reference to `some_c_function'

Extension by default will bring along the go files listed, but won't bring along the related C files. Add the following to MANIFEST.in:

global-include *.c
global-include *.go

fatal: could not read Username for 'https://github.com':

You're probably trying to import from an external source which does not exist. Double check that your import is correct.

package github.com/a/b/c: /tmp/.../github.com/a/b exists but /tmp/.../github.com/a/b/.git does not - stale checkout?

You've probably mistyped an import. Double check that your import is correct.

duplicate symbol _XXX in: _cgo_export.o mod.cgo2.o

For example:

# github.com/asottile/dockerfile/pylib
duplicate symbol _PyDockerfile_GoParseError in:
    $WORK/github.com/asottile/dockerfile/pylib/_obj/_cgo_export.o
    $WORK/github.com/asottile/dockerfile/pylib/_obj/main.cgo2.o

Make sure to mark global variables defined in C as extern. Here's an example PR

repeated rebuilds can be slow

setuptools-golang attempts to make builds more repeatable by using a separate GOPATH -- if you'd like to reuse a GOPATH you can set the SETUPTOOLS_GOLANG_GOPATH environment variable:

$ SETUPTOOLS_GOLANG_GOPATH=~/go pip install .
...

Building manylinux wheels

setuptools-golang also provides a tool for building PEP 513 manylinux1 wheels so your consumers don't need to have a go compiler installed to use your library.

Simply run setuptools-golang-build-manylinux-wheels from your source directory. The resulting wheels will end up in ./dist.

$ setuptools-golang-build-manylinux-wheels

...

+ ls /dist -al
total 8092
drwxrwxr-x  2 1000 1000    4096 Feb  1 04:16 .
drwxr-xr-x 41 root root    4096 Feb  1 04:15 ..
-rw-r--r--  1 1000 1000 2063299 Feb  1 04:16 setuptools_golang_examples-0.1.1-cp34-cp34m-manylinux1_x86_64.whl
-rw-r--r--  1 1000 1000 2064862 Feb  1 04:16 setuptools_golang_examples-0.1.1-cp35-cp35m-manylinux1_x86_64.whl
-rw-r--r--  1 1000 1000 2064873 Feb  1 04:16 setuptools_golang_examples-0.1.1-cp36-cp36m-manylinux1_x86_64.whl
-rw-rw-r--  1 1000 1000    4273 Feb  1 04:14 setuptools-golang-examples-0.1.1.tar.gz
*******************************************************************************
Your wheels have been built into ./dist
*******************************************************************************

Release files for setuptools-golang 2.9.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for setuptools-golang 2.9.0
File Size Uploaded
setuptools_golang-2.9.0.tar.gz 6.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for setuptools-golang 2.9.0
File Interpreter ABI Platform
setuptools_golang-2.9.0-py2.py3-none-any.whl Python 2, Python 3 none any Details

Total release size: 14.0 kB

Release files / setuptools_golang-2.9.0.tar.gz

Download URL setuptools_golang-2.9.0.tar.gz
Size 6.8 kB
Tags Source
SHA-256 checksum
How to use checksums
0f6996488ed254bba01e678eae1ff68fe20688785d8a42f0faad4361c316552b
BLAKE2b-256 checksum
How to use checksums
8360aa914100664431d13f1480c630cf8cd8ea77d3d24022a58d45fa32de9e03
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.10.6

Release files / setuptools_golang-2.9.0-py2.py3-none-any.whl

Download URL setuptools_golang-2.9.0-py2.py3-none-any.whl
Size 7.2 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
97ccf706a7bb21d5a5b24ec4920af103df1558253243cbd8731d563d350b0f76
BLAKE2b-256 checksum
How to use checksums
1db5cec02fe020136e92344fdb34718bdf673aa5446cff94440ced5159fce6fc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.10.6

Release history Release notifications | RSS feed

This release

2.9.0 This release

2 release files

2.8.0

2 release files

2.7.0

2 release files

2.6.0

2 release files

2.5.0

2 release files

2.4.0

2 release files

2.3.0

2 release files

2.2.0

2 release files

2.1.1

2 release files

2.1.0

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.7.0

2 release files

1.6.0

2 release files

1.5.1

2 release files

1.5.0

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page