# Go on OpenBSD

Go is available within the OpenBSD ports tree collection since OpenBSD 5.2.  It is marked as i386- and amd64- only.  See [`ports/lang/go`](http://ports.su/lang/go) for details.

| **OpenBSD release** | **Go in ports**     |
|:--------------------|:--------------------|
| 6.2 (Oct 9, 2017)   | go-1.9              |
| 6.1 (Apr 11, 2017)  | go-1.8              |
| 6.0 (Sep 1, 2016)   | go-1.6.3            |
| 5.9 (Mar 29, 2016)  | go-1.5.4            |
| 5.8 (Oct 18, 2015)  | go-1.4.2            |
| 5.7 (May 1, 2015)   | go-1.4.1            |
| 5.6 (Nov 1, 2014)   | go-1.3p0            |

## Building from source

| **Kernel version** | **Architectures** | **Initial support version** | **Final support version** |
|:-------------------|:------------------|:----------------------------|:--------------------------|
| 6.2                | amd64, arm, 386   | Go 1.9                      |                           |
| 6.1                | amd64, arm, 386   | Go 1.8                      |                           |
| 6.0                | amd64, 386        | Go 1.4.1 _*_                |                           |
| 6.0                | arm               | Go 1.5                      |                           |
| 5.9                | amd64, 386        | Go 1.4.1 _*_                | Go 1.8.7                  |
| 5.9                | arm               | Go 1.5                      | Go 1.8.7                  |
| 5.6 through 5.8    | amd64, 386        | Go 1.4.1 _*_                | Go 1.7.6                  |
| 5.5                | amd64, 386        | Go 1.3 _*_                  | Go 1.7.6                  |
| 5.0 through 5.4    | amd64, 386        | Go 1                        | Go 1.2.2                  |

_*_ Go 1.5 or above is recommended.

## Longterm support

Go aims to support the two most recent OpenBSD releases, because OpenBSD officially supports only the two most recent releases, and makes a best-effort attempt to maintain ABI support in consecutive releases.

## ulimits (` /etc/login.conf `)

Edit `/etc/login.conf` so that the staff class has the proper
settings. The following is a working example of the staff class:
```
staff:\
       :datasize-cur=infinity:\
       :datasize-max=infinity:\
       :datasize=infinity:\
       :openfiles-cur=4096:\
       :maxproc-max=512:\
       :maxproc-cur=512:\
       :ignorenologin:\
       :requirehome@:\
       :tc=default:
```

If the database file `/etc/login.conf.db` exists, you need to rebuild it with:
```
# cap_mkdb /etc/login.conf
```

Ensure that the user you intend to build Go with is in the `staff` login class:
```
# usermod -L staff your_username_here
```