[![build status](https://github.com/asottile/setuptools-golang/actions/workflows/main.yml/badge.svg)](https://github.com/asottile/setuptools-golang/actions/workflows/main.yml)
[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/asottile/setuptools-golang/main.svg)](https://results.pre-commit.ci/latest/github/asottile/setuptools-golang/main)
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`.
```python
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](https://github.com/asottile/setuptools-golang-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](https://github.com/asottile/dockerfile/pull/8)
### 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:
```console
$ SETUPTOOLS_GOLANG_GOPATH=~/go pip install .
...
```
## Building manylinux wheels
`setuptools-golang` also provides a tool for building
[PEP 513](https://www.python.org/dev/peps/pep-0513/) 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
*******************************************************************************
```
Raw data
{
"_id": null,
"home_page": "https://github.com/asottile/setuptools-golang",
"name": "setuptools-golang",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "",
"keywords": "",
"author": "Anthony Sottile",
"author_email": "asottile@umich.edu",
"download_url": "https://files.pythonhosted.org/packages/83/60/aa914100664431d13f1480c630cf8cd8ea77d3d24022a58d45fa32de9e03/setuptools_golang-2.9.0.tar.gz",
"platform": null,
"description": "[![build status](https://github.com/asottile/setuptools-golang/actions/workflows/main.yml/badge.svg)](https://github.com/asottile/setuptools-golang/actions/workflows/main.yml)\n[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/asottile/setuptools-golang/main.svg)](https://results.pre-commit.ci/latest/github/asottile/setuptools-golang/main)\n\nsetuptools-golang\n=================\n\nA setuptools extension for building cpython extensions written in golang.\n\n## Requirements\n\nThis requires golang >= 1.5.\n\nThis requires python >= 3.7. It is currently tested against python3 and pypy3.\n\n## Platform Support\n\n- linux\n- macOS\n- win32 (32 bit cpython, 32 bit go 1.10+)\n\n## Usage\n\nAdd `setuptools-golang` to the `setup_requires` in your setup.py and\n`build_golang={'root': ...}`. `root` refers to the root go import path of\nyour project.\n\nBy default, `setuptools-golang` will strip all binaries. This can be disabled\nby adding `'strip': False` to `build_golang`. This will increase the size of\nthe extension, but the binaries contain debugging information and symbols.\n\n\nAn extension must be a single file in the `main` go package (though the entire\n`main` package will be built into the extension). That package may import\nother code.\nYou may have multiple extensions in your `setup.py`.\n\n```python\nsetup(\n ...\n build_golang={'root': 'github.com/user/project'},\n ext_modules=[Extension('example', ['example.go'])],\n setup_requires=['setuptools-golang'],\n ...\n)\n```\n\n## Writing cpython extensions in golang\n\nHere's some [examples](https://github.com/asottile/setuptools-golang-examples)\n\n## Common issues\n\n### ```undefined reference to `some_c_function'```\n\n`Extension` by default will bring along the go files listed, but won't bring\nalong the related C files. Add the following to `MANIFEST.in`:\n\n```\nglobal-include *.c\nglobal-include *.go\n```\n\n### `fatal: could not read Username for 'https://github.com':`\n\nYou're probably trying to import from an external source which does not exist.\nDouble check that your import is correct.\n\n\n### `package github.com/a/b/c: /tmp/.../github.com/a/b exists but /tmp/.../github.com/a/b/.git does not - stale checkout?`\n\nYou've probably mistyped an import. Double check that your import is correct.\n\n### `duplicate symbol _XXX in: _cgo_export.o mod.cgo2.o`\n\nFor example:\n```\n# github.com/asottile/dockerfile/pylib\nduplicate symbol _PyDockerfile_GoParseError in:\n $WORK/github.com/asottile/dockerfile/pylib/_obj/_cgo_export.o\n $WORK/github.com/asottile/dockerfile/pylib/_obj/main.cgo2.o\n```\n\nMake sure to mark global variables defined in C as `extern`.\n[Here's an example PR](https://github.com/asottile/dockerfile/pull/8)\n\n### repeated rebuilds can be slow\n\nsetuptools-golang attempts to make builds more repeatable by using a separate\n`GOPATH` -- if you'd like to reuse a GOPATH you can set the\n`SETUPTOOLS_GOLANG_GOPATH` environment variable:\n\n```console\n$ SETUPTOOLS_GOLANG_GOPATH=~/go pip install .\n...\n```\n\n## Building manylinux wheels\n\n`setuptools-golang` also provides a tool for building\n[PEP 513](https://www.python.org/dev/peps/pep-0513/) manylinux1 wheels so your\nconsumers don't need to have a go compiler installed to use your library.\n\nSimply run `setuptools-golang-build-manylinux-wheels` from your source\ndirectory. The resulting wheels will end up in `./dist`.\n\n```\n$ setuptools-golang-build-manylinux-wheels\n\n...\n\n+ ls /dist -al\ntotal 8092\ndrwxrwxr-x 2 1000 1000 4096 Feb 1 04:16 .\ndrwxr-xr-x 41 root root 4096 Feb 1 04:15 ..\n-rw-r--r-- 1 1000 1000 2063299 Feb 1 04:16 setuptools_golang_examples-0.1.1-cp34-cp34m-manylinux1_x86_64.whl\n-rw-r--r-- 1 1000 1000 2064862 Feb 1 04:16 setuptools_golang_examples-0.1.1-cp35-cp35m-manylinux1_x86_64.whl\n-rw-r--r-- 1 1000 1000 2064873 Feb 1 04:16 setuptools_golang_examples-0.1.1-cp36-cp36m-manylinux1_x86_64.whl\n-rw-rw-r-- 1 1000 1000 4273 Feb 1 04:14 setuptools-golang-examples-0.1.1.tar.gz\n*******************************************************************************\nYour wheels have been built into ./dist\n*******************************************************************************\n```\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A setuptools extension for building cpython extensions written in golang.",
"version": "2.9.0",
"project_urls": {
"Homepage": "https://github.com/asottile/setuptools-golang"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "1db5cec02fe020136e92344fdb34718bdf673aa5446cff94440ced5159fce6fc",
"md5": "da0718ad37b538348302097d3e04932b",
"sha256": "97ccf706a7bb21d5a5b24ec4920af103df1558253243cbd8731d563d350b0f76"
},
"downloads": -1,
"filename": "setuptools_golang-2.9.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "da0718ad37b538348302097d3e04932b",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=3.8",
"size": 7232,
"upload_time": "2023-07-29T20:05:30",
"upload_time_iso_8601": "2023-07-29T20:05:30.982619Z",
"url": "https://files.pythonhosted.org/packages/1d/b5/cec02fe020136e92344fdb34718bdf673aa5446cff94440ced5159fce6fc/setuptools_golang-2.9.0-py2.py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8360aa914100664431d13f1480c630cf8cd8ea77d3d24022a58d45fa32de9e03",
"md5": "23e9318392df236707fd8b155e25e0ef",
"sha256": "0f6996488ed254bba01e678eae1ff68fe20688785d8a42f0faad4361c316552b"
},
"downloads": -1,
"filename": "setuptools_golang-2.9.0.tar.gz",
"has_sig": false,
"md5_digest": "23e9318392df236707fd8b155e25e0ef",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 6772,
"upload_time": "2023-07-29T20:05:32",
"upload_time_iso_8601": "2023-07-29T20:05:32.054533Z",
"url": "https://files.pythonhosted.org/packages/83/60/aa914100664431d13f1480c630cf8cd8ea77d3d24022a58d45fa32de9e03/setuptools_golang-2.9.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-07-29 20:05:32",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "asottile",
"github_project": "setuptools-golang",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"tox": true,
"lcname": "setuptools-golang"
}